45 double cbl::multipole_xi0 (
const int indexR,
const std::vector<double> mu,
const std::vector<std::vector<double>> xi)
47 double bin = mu[1]-mu[0];
50 for (
unsigned int j=0; j<xi[indexR].size(); j++)
51 xi0 += xi[indexR][j]*bin;
60 double cbl::multipole_xi2 (
const int indexR,
const std::vector<double> mu,
const std::vector<std::vector<double>> xi)
62 double bin = mu[1]-mu[0];
65 for (
unsigned int j=0; j<xi[indexR].size(); j++)
66 xi2 += xi[indexR][j]*
P_2(mu[j])*bin;
75 double cbl::multipole_xi4 (
const int indexR,
const std::vector<double> mu,
const std::vector<std::vector<double>> xi)
77 double bin = mu[1]-mu[0];
80 for (
unsigned int j=0; j<xi[indexR].size(); j++)
81 xi4 += xi[indexR][j]*
P_4(mu[j])*bin;
92 double bin = mu[1]-mu[0];
95 for (
unsigned int j=0; j<error[indexR].size(); j++)
96 err += pow(error[indexR][j],2.);
107 double bin = mu[1]-mu[0];
110 for (
unsigned int j=0; j<error[indexR].size(); j++)
111 err += pow(error[indexR][j]*
P_2(mu[j]),2.);
113 return 5.*sqrt(err)*bin;
122 double bin = mu[1]-mu[0];
125 for (
unsigned int j=0; j<error[indexR].size(); j++)
126 err += pow(error[indexR][j]*
P_4(mu[j]),2.);
128 return 9.*sqrt(err)*bin;
135 double cbl::multipole_xi0 (
const double ss,
const std::vector<double> rp,
const std::vector<double>
pi,
const std::vector<std::vector<double>> xi,
const double delta_s)
140 for (
unsigned int i=0; i<rp.size(); i++)
141 for (
unsigned int j=0; j<
pi.size(); j++) {
143 double sss = sqrt(rp[i]*rp[i]+
pi[j]*
pi[j]);
144 double mu =
pi[j]/sss;
146 if (ss-delta_s*0.5<sss && sss<ss+delta_s*0.5) {
148 xi0 += xi[i][j]*sqrt(1.-mu*mu);
152 return (Nbin>0) ? 0.5*
par::pi*xi0/Nbin : -1000.;
159 double cbl::multipole_xi2 (
const double ss,
const std::vector<double> rp,
const std::vector<double>
pi,
const std::vector<std::vector<double>> xi,
const double delta_s)
164 for (
unsigned int i=0; i<rp.size(); i++)
165 for (
unsigned int j=0; j<
pi.size(); j++) {
167 double sss = sqrt(rp[i]*rp[i]+
pi[j]*
pi[j]);
168 double mu =
pi[j]/sss;
170 if (ss-delta_s*0.5<sss && sss<ss+delta_s*0.5) {
172 xi2 += xi[i][j]*
P_2(mu)*sqrt(1.-mu*mu);
176 return (Nbin>0) ? 0.5*
par::pi*5.*xi2/Nbin : -1000.;
183 double cbl::multipole_xi4 (
const double ss,
const std::vector<double> rp,
const std::vector<double>
pi,
const std::vector<std::vector<double>> xi,
const double delta_s)
188 for (
unsigned int i=0; i<rp.size(); i++)
189 for (
unsigned int j=0; j<
pi.size(); j++) {
191 double sss = sqrt(rp[i]*rp[i]+
pi[j]*
pi[j]);
192 double mu =
pi[j]/sss;
194 if (ss-delta_s*0.5<sss && sss<ss+delta_s*0.5) {
196 xi4 += xi[i][j]*
P_4(mu)*sqrt(1.-mu*mu);
200 return (Nbin>0) ? 0.5*
par::pi*9.*xi4/Nbin : -1000.;
207 double cbl::error_multipole_xi0 (
const double ss,
const std::vector<double> rp,
const std::vector<double>
pi,
const std::vector<std::vector<double>> error,
const double delta_s)
212 for (
unsigned int i=0; i<rp.size(); i++)
213 for (
unsigned int j=0; j<
pi.size(); j++) {
215 double sss = sqrt(rp[i]*rp[i]+
pi[j]*
pi[j]);
216 double mu =
pi[j]/sss;
218 if (ss-delta_s*0.5<sss && sss<ss+delta_s*0.5) {
220 err += pow(error[i][j]*sqrt(1.-mu*mu),2.);
224 return (Nbin>0) ? 0.5*
par::pi*sqrt(err)/Nbin : -1000.;
231 double cbl::error_multipole_xi2 (
const double ss,
const std::vector<double> rp,
const std::vector<double>
pi,
const std::vector<std::vector<double>> error,
const double delta_s)
236 for (
unsigned int i=0; i<rp.size(); i++)
237 for (
unsigned int j=0; j<
pi.size(); j++) {
239 double sss = sqrt(rp[i]*rp[i]+
pi[j]*
pi[j]);
240 double mu =
pi[j]/sss;
242 if (ss-delta_s*0.5<sss && sss<ss+delta_s*0.5) {
244 err += pow(error[i][j]*
P_2(mu)*sqrt(1.-mu*mu),2.);
248 return (Nbin>0) ? 0.5*
par::pi*5.*sqrt(err)/Nbin : -1000.;
255 double cbl::error_multipole_xi4 (
const double ss,
const std::vector<double> rp,
const std::vector<double>
pi,
const std::vector<std::vector<double>> error,
const double delta_s)
260 for (
unsigned int i=0; i<rp.size(); i++)
261 for (
unsigned int j=0; j<
pi.size(); j++) {
263 double sss = sqrt(rp[i]*rp[i]+
pi[j]*
pi[j]);
264 double mu =
pi[j]/sss;
266 if (ss-delta_s*0.5<sss && sss<ss+delta_s*0.5) {
268 err += pow(error[i][j]*
P_4(mu)*sqrt(1.-mu*mu),2.);
272 return (Nbin>0) ? 0.5*
par::pi*9.*sqrt(err)/Nbin : -1000.;
280 double cbl::multipoles (
double rr, shared_ptr<void> pp, std::vector<double> par)
283 int index = par[par.size()-1];
290 shared_ptr<cbl::glob::STR_xi2D_model> vec = static_pointer_cast<cbl::glob::STR_xi2D_model >(pp);
292 vector<vector<double>> Xi (vec->dim, vector<double> (vec->dim,-1.e30));
296 for (
int i=0; i<vec->dim; i++)
297 for (
int j=0; j<vec->dim; j++) {
298 par[par.size()-1] = index2++;
299 Xi[i][j] =
xi2D_model(vec->rp[i],vec->pi[j],pp,par);
329 vector<vector<double>> xi_cos(1);
331 for (
unsigned int i=0; i<cos_lin.size(); i++) {
332 rp = rr*sqrt(1.-cos_lin[i]*cos_lin[i]);
342 if (vec->type[index]==1)
return multipole_xi0(0,cos_lin,xi_cos);
343 else if (vec->type[index]==2)
return multipole_xi2(0,cos_lin,xi_cos);
344 else return ErrorCBL(
"vec->type[index]!=1 and !=2",
"multipoles",
"FuncMultipoles.cpp");
364 return xi_ratio(f_sigma8, bias_sigma8)*xi_matter*pow(bias_sigma8/sigma8z, 2);
376 shared_ptr<cbl::glob::STR_xi0_model> vec = static_pointer_cast<cbl::glob::STR_xi0_model>(pp);
378 if (par.size()==2)
return multipole_xi0_model(par[0], vec->bias_sigma8, vec->sigma8z, vec->xi_matter[par[par.size()-1]]);
380 else return ErrorCBL(
"par.size()!=2",
"multipole_xi0_model",
"FuncMultipoles.cpp");
390 return (4./3.*beta+4./7.*beta*beta)*(xi_real-xi_);
399 return (8./35.*beta*beta)*(xi_real+2.5*xi_-3.5*xi__);
411 struct cbl::glob::STR_Pkl_Kaiser_integrand *pp = (
struct cbl::glob::STR_Pkl_Kaiser_integrand *) parameters;
413 return pow(pp->bias+pp->f*mu*mu,2)*gsl_sf_legendre_Pl(pp->l,mu);
422 struct cbl::glob::STR_XiMultipoles_integrand *pp = (
struct cbl::glob::STR_XiMultipoles_integrand *) parameters;
423 double pkl = pp->Pkl->operator()(kk);
424 double xx = kk*pp->r;
425 double k_cut = pp->k_cut;
426 double cut_pow = pp->cut_pow;
428 return kk*kk*
jl(xx,pp->l)*pkl*exp(-pow(kk/k_cut,cut_pow));
437 struct cbl::glob::STR_xi2D_smu_integrand *pp = (
struct cbl::glob::STR_xi2D_smu_integrand *) parameters;
449 struct cbl::glob::STR_sigma2_integrand *pp = (
struct cbl::glob::STR_sigma2_integrand *) parameters;
452 vector<int> orders = pp->orders;
453 double density_inv = pp->density_inv;
457 for(
size_t i =0;i<orders.size();i++)
458 val += pp->Pk_multipoles_interp[i].operator()(kk)*gsl_sf_legendre_Pl(orders[i],mu);
459 return pow(val+density_inv,2)*gsl_sf_legendre_Pl(l1,mu)*gsl_sf_legendre_Pl(l2,mu);
468 struct cbl::glob::STR_covariance_XiMultipoles_integrand *pp = (
struct cbl::glob::STR_covariance_XiMultipoles_integrand *) parameters;
469 double s2 = pp->s2->operator()(kk);
470 double jl1k = pp->jl1r1->operator()(kk);
471 double jl2k = pp->jl2r2->operator()(kk);
473 return kk*kk*s2*jl1k*jl2k;
482 int limit_size = 1000;
485 cbl::glob::STR_Pkl_Kaiser_integrand params;
492 Func.params = ¶ms;
501 std::vector<double>
cbl::Pk0_Kaiser(
const std::vector<double> kk,
const std::vector<double> Pk,
const double bias,
const double f)
503 vector<double> Pk0(kk.size(),0);
506 for(
size_t i = 0;i<kk.size();i++)
516 std::vector<double>
cbl::Pk2_Kaiser(
const std::vector<double> kk,
const std::vector<double> Pk,
const double bias,
const double f)
518 vector<double> Pk2(kk.size(),0);
521 for(
size_t i = 0;i<kk.size();i++)
531 std::vector<double>
cbl::Pk4_Kaiser(
const std::vector<double> kk,
const std::vector<double> Pk,
const double bias,
const double f)
533 vector<double> Pk4(kk.size(),0);
536 for(
size_t i = 0;i<kk.size();i++)
546 std::vector< std::vector<double>>
cbl::Pkl_Kaiser(
const std::vector<int> orders,
const std::vector<double> kk,
const std::vector<double> Pk,
const double bias,
const double f)
548 vector<vector<double>> Pk_multipoles(orders.size(),vector<double>(kk.size(),0));
549 size_t nbin_k = kk.size();
551 for(
size_t ll=0;ll<orders.size();ll++)
555 for(
size_t i=0;i<nbin_k;i++)
557 Pk_multipoles[ll][i] = Pk[i]*integral;;
562 return Pk_multipoles;
569 std::vector<double>
cbl::Xi0 (
const std::vector<double> r,
const std::vector<double> kk,
const std::vector<double> Pk0,
const double k_cut,
const double cut_pow,
const int IntegrationMethod)
572 int nbins = r.size();
573 int nbins_k = kk.size();
575 vector<double> xi0(nbins, 0);
577 if (IntegrationMethod==0) {
579 for (
int i=0; i<nbins; i++) {
581 vector<double> i0(kk.size(), 0);
583 for (
int j=0; j<nbins_k; j++)
584 i0[j] = kk[j]*kk[j]*Pk0[j]*
j0(kk[j]*r[i]);
590 else if (IntegrationMethod==1) {
592 cbl::glob::STR_XiMultipoles_integrand params;
593 int limit_size = 1000;
597 Func.params = ¶ms;
599 double k_min =
Min(kk);
600 double k_max =
Max(kk);
604 params.Pkl = &Pk0_interp;
606 params.k_cut = k_cut;
607 params.cut_pow = cut_pow;
609 for (
int i=0; i<nbins; i++) {
624 std::vector<double>
cbl::Xi2 (
const std::vector<double> rr,
const std::vector<double> kk,
const std::vector<double> Pk2,
const double k_cut,
const double cut_pow,
const int IntegrationMethod)
627 int nbins = rr.size();
628 int nbins_k = kk.size();
630 vector<double> xi2(nbins, 0);
632 if (IntegrationMethod==0)
634 for (
int i=0; i<nbins; i++) {
636 vector<double> i2(kk.size(),0);
638 for (
int j=0; j<nbins_k; j++)
639 i2[j] = kk[j]*kk[j]*Pk2[j]*
j2(kk[j]*rr[i]);
646 else if (IntegrationMethod==1)
648 cbl::glob::STR_XiMultipoles_integrand params;
649 int limit_size = 1000;
653 Func.params = ¶ms;
655 double k_min =
Min(kk);
656 double k_max =
Max(kk);
660 params.Pkl = &Pk2_interp;
662 params.k_cut = k_cut;
663 params.cut_pow = cut_pow;
665 for (
int i=0; i<nbins; i++) {
680 std::vector<double>
cbl::Xi4(
const std::vector<double> rr,
const std::vector<double> kk,
const std::vector<double> Pk4,
const double k_cut,
const double cut_pow,
const int IntegrationMethod)
683 int nbins = rr.size();
684 int nbins_k = kk.size();
686 vector<double> xi4(nbins, 0);
688 if (IntegrationMethod==0)
691 for (
int i=0; i<nbins; i++) {
693 vector<double> i4(kk.size(), 0);
695 for (
int j=0; j<nbins_k; j++)
696 i4[j] = kk[j]*kk[j]*Pk4[j]*
j4(kk[j]*rr[i]);
702 else if (IntegrationMethod==1)
704 cbl::glob::STR_XiMultipoles_integrand params;
705 int limit_size = 1000;
709 Func.params = ¶ms;
711 double k_min =
Min(kk);
712 double k_max =
Max(kk);
716 params.Pkl = &Pk4_interp;
718 params.k_cut = k_cut;
719 params.cut_pow = cut_pow;
721 for (
int i=0; i<nbins; i++) {
736 std::vector<std::vector<double>>
cbl::Xi02_AP (
const double alpha_perpendicular,
const double alpha_parallel,
const std::vector<double> rr,
const std::shared_ptr<glob::FuncGrid> xi0_interp,
const std::shared_ptr<glob::FuncGrid> xi2_interp)
738 vector<double> xi0_new, xi2_new;
740 if ((alpha_perpendicular-1)<1.e-30 && (alpha_parallel-1.)<1.e-30)
741 for (
size_t i=0; i<rr.size(); i++) {
742 xi0_new.push_back(xi0_interp->operator()(rr[i]));
743 xi2_new.push_back(xi2_interp->operator()(rr[i]));
748 double nbin_mu = 50.;
750 vector<double> xismu_0(nbin_mu, 0), xismu_2(nbin_mu, 0);
752 for (
size_t j=0; j<rr.size(); j++) {
753 for (
size_t i=0; i<nbin_mu; i++) {
754 double alpha = sqrt(pow(alpha_parallel*mu[i], 2)+pow(alpha_perpendicular, 2)*(1.-mu[i]*mu[i]));
755 double mu_new = mu[i]*alpha_parallel/
alpha;
756 double s_new =
alpha*rr[i];
757 xismu_0[i] = xi0_interp->operator()(s_new)+xi2_interp->operator()(s_new)*
legendre_polynomial(mu_new, 2);
765 return {xi0_new, xi2_new};
772 std::vector<std::vector<double>>
cbl::Xi024_AP (
const double alpha_perpendicular,
const double alpha_parallel,
const std::vector<double> rr,
const std::shared_ptr<glob::FuncGrid> xi0_interp,
const std::shared_ptr<glob::FuncGrid> xi2_interp,
const std::shared_ptr<glob::FuncGrid> xi4_interp)
774 vector<double> xi0_new, xi2_new, xi4_new;
776 if ((alpha_perpendicular)==1 && (alpha_parallel)==1)
777 for (
size_t i=0; i<rr.size(); i++) {
778 xi0_new.push_back(xi0_interp->operator()(rr[i]));
779 xi2_new.push_back(xi2_interp->operator()(rr[i]));
780 xi4_new.push_back(xi4_interp->operator()(rr[i]));
785 double nbin_mu = 50.;
787 vector<double> xismu_0(nbin_mu, 0), xismu_2(nbin_mu, 0), xismu_4(nbin_mu, 0);
789 for (
size_t j=0; j<rr.size(); j++) {
790 for (
size_t i=0; i<nbin_mu; i++) {
791 double alpha = sqrt(pow(alpha_parallel*mu[i], 2)+pow(alpha_perpendicular, 2)*(1.-mu[i]*mu[i]));
792 double mu_new = mu[i]*alpha_parallel/
alpha;
793 double s_new =
alpha*rr[j];
805 return {xi0_new, xi2_new, xi4_new};
811 std::vector<std::vector<double>>
cbl::Xi02_AP (
const double alpha_perpendicular,
const double alpha_parallel,
const std::vector<double> rr,
const std::vector<double> rl,
const std::vector<double>
Xi0,
const std::vector<double>
Xi2)
816 vector<double> xi0_new, xi2_new;
818 if (alpha_perpendicular == 1 && alpha_parallel == 1)
819 for (
size_t i=0; i<rr.size(); i++) {
820 xi0_new.push_back(xi0_interp(rr[i]));
821 xi2_new.push_back(xi2_interp(rr[i]));
826 double nbin_mu = 50.;
828 vector<double> xismu_0(nbin_mu, 0), xismu_2(nbin_mu, 0);
830 for (
size_t j=0; j<rr.size(); j++) {
831 for (
size_t i=0; i<nbin_mu; i++) {
832 double alpha = sqrt(pow(alpha_parallel*mu[i], 2)+pow(alpha_perpendicular, 2)*(1.-mu[i]*mu[i]));
833 double mu_new = mu[i]*alpha_parallel/
alpha;
834 double s_new =
alpha*rr[i];
846 return {xi0_new, xi2_new};
853 std::vector<std::vector<double>>
cbl::Xi024_AP (
const double alpha_perpendicular,
const double alpha_parallel,
const std::vector<double> rr,
const std::vector<double> rl,
const std::vector<double>
Xi0,
const std::vector<double>
Xi2,
const std::vector<double>
Xi4)
859 vector<double> xi0_new, xi2_new, xi4_new;
861 if ((alpha_perpendicular)==1 && (alpha_parallel)==1)
862 for (
size_t i=0; i<rr.size(); i++) {
863 xi0_new.push_back(xi0_interp(rr[i]));
864 xi2_new.push_back(xi2_interp(rr[i]));
865 xi4_new.push_back(xi4_interp(rr[i]));
870 double nbin_mu = 50.;
872 vector<double> xismu_0(nbin_mu, 0), xismu_2(nbin_mu, 0), xismu_4(nbin_mu, 0);
874 for (
size_t j=0; j<rr.size(); j++) {
875 for (
size_t i=0; i<nbin_mu; i++) {
876 double alpha = sqrt(pow(alpha_parallel*mu[i], 2)+pow(alpha_perpendicular, 2)*(1.-mu[i]*mu[i]));
877 double mu_new = mu[i]*alpha_parallel/
alpha;
878 double s_new =
alpha*rr[j];
894 return {xi0_new, xi2_new, xi4_new};
901 std::vector<std::vector<double>>
cbl::XiWedges_AP (
const std::vector<double> mu_min,
const std::vector<double> delta_mu,
const double alpha_perpendicular,
const double alpha_parallel,
const std::vector<double> rr,
const std::shared_ptr<glob::FuncGrid> xi0_interp,
const std::shared_ptr<glob::FuncGrid> xi2_interp,
const std::shared_ptr<glob::FuncGrid> xi4_interp)
903 vector<vector<double>> xi_multipoles =
cbl::Xi024_AP(alpha_perpendicular, alpha_parallel, rr, xi0_interp, xi2_interp, xi4_interp);
904 vector<vector<double>> xi_wedges(mu_min.size(), vector<double>(rr.size(), 0));
906 vector<vector<double>> legendre_integral(mu_min.size(), vector<double>(3, 0));
908 for(
size_t j=0; j<mu_min.size(); j++) {
912 for (
size_t i=0; i<rr.size(); i++)
913 xi_wedges[j][i] = xi_multipoles[0][i]*leg_int_0+xi_multipoles[1][i]*leg_int_2+xi_multipoles[2][i]*leg_int_4;
923 std::vector<std::vector<double>>
cbl::XiWedges_AP (
const std::vector<double> mu_min,
const std::vector<double> delta_mu,
const double alpha_perpendicular,
const double alpha_parallel,
const std::vector<double> rr,
const std::vector<double> rl,
const std::vector<double>
Xi0,
const std::vector<double>
Xi2,
const std::vector<double>
Xi4)
925 vector<vector<double>> xi_multipoles =
cbl::Xi024_AP(alpha_perpendicular, alpha_parallel, rr, rl,
Xi0,
Xi2,
Xi4);
926 vector<vector<double>> xi_wedges(mu_min.size(), vector<double>(rr.size(), 0));
928 vector<vector<double>> legendre_integral(mu_min.size(), vector<double>(3, 0));
930 for(
size_t j=0; j<mu_min.size(); j++) {
934 for (
size_t i=0; i<rr.size(); i++)
935 xi_wedges[j][i] = xi_multipoles[0][i]*leg_int_0+xi_multipoles[1][i]*leg_int_2+xi_multipoles[2][i]*leg_int_4;
944 std::vector< std::vector<double>>
cbl::sigma2_k (
const double nObjects,
const double Volume,
const std::vector<double> kk,
const std::vector<std::vector<double>> Pk_multipoles,
const std::vector<int> orders)
947 size_t n_orders = orders.size();
948 size_t nbin_k = kk.size();
950 vector<vector<double>> sigma2(n_orders*n_orders, vector<double>(nbin_k,0));
951 double density_inv = Volume/nObjects;
953 int limit_size = 100;
955 cbl::glob::STR_sigma2_integrand params;
957 params.orders = orders;
959 vector<glob::FuncGrid> Pk_multipoles_interp;
960 for(
size_t i=0;i<n_orders;i++){
961 Pk_multipoles_interp.push_back(
glob::FuncGrid(kk,Pk_multipoles[i],
"Spline"));
964 params.Pk_multipoles_interp = Pk_multipoles_interp;
965 params.density_inv = density_inv;
969 Func.params = ¶ms;
971 for (
size_t i=0;i<n_orders;i++){
972 params.l1 = orders[i];
973 for (
size_t j=0;j<n_orders;j++){
974 params.l2 = orders[j];
975 int index = j+n_orders*i;
976 for(
size_t k=0;k<kk.size();k++){
979 sigma2[index][k] = (2*orders[i]+1)*(2*orders[j]+1)*Int/Volume;
984 for(
size_t i=0;i<n_orders;i++)
985 Pk_multipoles_interp[i].free();
994 void cbl::Covariance_XiMultipoles (std::vector<double> &rr, std::vector<std::vector<double>> &covariance,
const int nbins,
const double rMin,
const double rMax,
const double nObjects,
const double Volume,
const std::vector<double> kk,
const std::vector<std::vector<double>> Pk_multipoles,
const std::vector<int> orders,
const cbl::BinType bin_type)
996 int n_orders = orders.size();
997 int nbins_k = kk.size();
999 const double binSize = (bin_type==
cbl::BinType::_linear_) ? (rMax-rMin)/nbins : (log10(rMax)-log10(rMin))/nbins;
1001 vector<double> rad(nbins, 0), edges(nbins+1,0);
1002 for(
int i=0; i<nbins; i++){
1003 rad[i] = (bin_type==
cbl::BinType::_linear_) ? (i+0.5)*binSize+rMin : pow(10.,(i+0.5)*binSize+log10(rMin));
1006 edges[nbins] = (bin_type==
cbl::BinType::_linear_) ? nbins*binSize+rMin : pow(10., nbins*binSize+log10(rMin));
1008 covariance.erase(covariance.begin(), covariance.end());
1009 covariance.resize(n_orders*nbins,vector<double>(n_orders*nbins, 0));
1011 vector<vector<double>> sigma2 =
sigma2_k(nObjects, Volume, kk, Pk_multipoles, orders);
1013 vector<vector<vector<double>>> jr(n_orders,vector<vector<double>>(nbins,vector<double>(nbins_k, 0)));
1015 for (
int l=0; l<n_orders; l++)
1016 for (
int i=0; i<nbins; i++)
1017 for (
int j=0; j<nbins_k; j++)
1020 cbl::glob::STR_covariance_XiMultipoles_integrand params;
1021 int limit_size = 1000;
1025 Func.params = ¶ms;
1027 double k_min= max(1.e-4,
cbl::Min(kk));
1028 double k_max = min(
Max(kk),1.);
1029 double prec = 1.e-2;
1030 complex<double> ii = complex<double>(0., 1.);
1033 for (
int l=0; l<n_orders; l++) {
1034 int index = l+n_orders*l;
1038 for (
int i=0; i<nbins; i++) {
1040 for (
int j=i; j<nbins; j++) {
1042 params.jl1r1 = &jl1r1;
1043 params.jl2r2 = &jl2r2;
1047 covariance[i+nbins*l][j+nbins*l] = Int;
1048 covariance[j+nbins*l][i+nbins*l] = Int;
1058 for (
int l1=0; l1<n_orders; l1++) {
1059 for (
int l2=l1+1; l2<n_orders; l2++) {
1060 int index = l2+n_orders*l1;
1061 int sign = pow(ii,orders[l1]+orders[l2]).real();
1066 for (
int i=0; i<nbins; i++) {
1068 for (
int j=0; j<nbins; j++) {
1070 params.jl1r1 = &jl1r1;
1071 params.jl2r2 = &jl2r2;
1075 covariance[i+nbins*l1][j+nbins*l2] = Int;
1076 covariance[j+nbins*l2][i+nbins*l1] = Int;
1085 rr.erase(rr.begin(), rr.end());
1087 for (
int i=0; i<n_orders; i++)
1088 for (
int j=0; j<nbins; j++)
1089 rr.push_back(rad[j]);
1096 void cbl::Covariance_XiWedges (std::vector<double> &rr, std::vector<std::vector<double>> &covariance,
const std::vector<double> mu,
const std::vector<double> delta_mu,
const int nbins,
const double rMin,
const double rMax,
const double nObjects,
const double Volume,
const std::vector<double> kk,
const std::vector<std::vector<double>> Pk_multipoles,
const std::vector<int> orders,
const cbl::BinType bin_type)
1098 int n_wedges = mu.size();
1099 vector<int> ord = orders;
1100 vector<vector<double>> Pkl = Pk_multipoles;
1102 if (n_wedges>2 && ord.size()==3) {
1103 vector<double> Pk6(kk.size(), 0);
1108 int n_orders = ord.size();
1110 vector<vector<double>> covariance_multipoles;
1112 covariance.erase(covariance.begin(), covariance.end());
1113 covariance.resize(n_wedges*nbins, vector<double>(n_wedges*nbins, 0));
1115 vector<double> r_multipoles;
1116 cbl::Covariance_XiMultipoles(r_multipoles, covariance_multipoles, nbins, rMin, rMax, nObjects, Volume, kk, Pkl, ord, bin_type);
1118 for (
int w1=0; w1<n_wedges; w1++) {
1119 for (
int w2=0; w2<n_wedges; w2++) {
1121 for (
int r1 =0; r1<nbins; r1++) {
1122 for (
int r2 =0; r2<nbins; r2++) {
1125 for (
int l1=0; l1<n_orders; l1++) {
1127 for (
int l2=0; l2<n_orders; l2++) {
1129 VV += covariance_multipoles[r1+nbins*l1][r2+nbins*l2]*leg_integral1*leg_integral2;
1132 covariance[r1+nbins*w1][r2+nbins*w2] = VV;
1140 rr.erase(rr.begin(), rr.end());
1142 for (
int i=0; i<n_wedges; i++)
1143 for (
int j=0; j<nbins; j++)
Useful generic functions.
void free()
free the GSL objects
static const double pi
: the ratio of a circle's circumference to its diameter
static const double alpha
: the fine-structure constant
double bias(const double Mmin, const double sigmalgM, const double M0, const double M1, const double alpha, const std::shared_ptr< void > inputs)
the mean galaxy bias
double GSL_integrate_qag(gsl_function Func, const double a, const double b, const double rel_err=1.e-3, const double abs_err=0, const int limit_size=1000, const int rule=6)
integral, computed using the GSL qag method
The global namespace of the CosmoBolognaLib
T Min(const std::vector< T > vect)
minimum element of a std::vector
double sigma2_integrand(const double mu, void *parameters)
integrand of the 2d power spectrum to obtain sigma^2(k)
std::vector< double > Pk0_Kaiser(const std::vector< double > kk, const std::vector< double > Pk, const double bias, const double f)
function to obtain the linear RSD power spectrum monopole
double error_multipole_xi2(const int indexR, const std::vector< double > mu, const std::vector< std::vector< double >> error)
error on xi2(s) from ξ(r,μ)
double Legendre_polynomial_mu_average(const int ll, const double mu, const double delta_mu)
the average of the Legendre polynomial of the l-th order over the mu range
std::vector< std::vector< double > > XiWedges_AP(const std::vector< double > mu_min, const std::vector< double > delta_mu, const double alpha_perpendicular, const double alpha_parallel, const std::vector< double > rr, const std::vector< double > rl, const std::vector< double > Xi0, const std::vector< double > Xi2, const std::vector< double > Xi4)
function to obtain the 2pcf wedges
double error_multipole_xi4(const int indexR, const std::vector< double > mu, const std::vector< std::vector< double >> error)
error on xi4(s) from ξ(r,μ)
double Pkl_Kaiser_integral(const int order, const double bias, const double f)
function to obtain the Kaiser factor
double j2(const double xx)
the l=2 spherical Bessel function
std::vector< std::vector< double > > Xi02_AP(const double alpha_perpendicular, const double alpha_parallel, const std::vector< double > rr, const std::vector< double > rl, const std::vector< double > Xi0, const std::vector< double > Xi2)
function to obtain the monopole and quadrupole of the two point correlation function
double multipole_xi0(const int indexR, const std::vector< double > mu, const std::vector< std::vector< double >> xi)
xi0(s) from ξ(r,μ)
std::vector< double > Xi2(const std::vector< double > rr, const std::vector< double > kk, const std::vector< double > Pk2, const double k_cut=0.58, const double cut_pow=4, const int IntegrationMethod=1)
function to obtain the two point correlation function quadrupole
std::vector< T > linear_bin_vector(const size_t nn, const T min, const T max)
fill a std::vector with linearly spaced values
double multipole_xi0_model(const double beta, const double xi_real)
the model multipole ξ0 of the two-point correlation function
double XiMultipoles_integrand(const double kk, void *parameters)
integrand to obtain covariance for the 2PCF multipoles
double interpolated_2D(const double _x1, const double _x2, const std::vector< double > x1, const std::vector< double > x2, const std::vector< std::vector< double >> yy, const std::string type)
2D interpolation
int ErrorCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL, const cbl::glob::ExitCode exitCode=cbl::glob::ExitCode::_error_)
throw an exception: it is used for handling exceptions inside the CosmoBolognaLib
double multipole_xi2(const int indexR, const std::vector< double > mu, const std::vector< std::vector< double >> xi)
xi2(s) from ξ(r,μ)
double multipole_xi4(const int indexR, const std::vector< double > mu, const std::vector< std::vector< double >> xi)
xi4(s) from ξ(r,μ)
double multipole_xi4_model(const double beta, const double xi_real, const double xi_, const double xi__)
the model multipole ξ4 of the two-point correlation function
std::vector< std::vector< double > > Pkl_Kaiser(const std::vector< int > orders, const std::vector< double > kk, const std::vector< double > Pk, const double bias, const double f)
function to obtain Pk multipoles from linear RSD (Kaiser)
T P_4(const T x)
the Legendre polynomial P4
std::vector< std::vector< double > > sigma2_k(const double nObjects, const double Volume, const std::vector< double > kk, const std::vector< std::vector< double >> Pk_multipoles, const std::vector< int > orders)
multipole expansion of the per-mode covariance sigma2_k (see Grieb et al. 2016, eq....
T Max(const std::vector< T > vect)
maximum element of a std::vector
std::vector< double > Pk4_Kaiser(const std::vector< double > kk, const std::vector< double > Pk, const double bias, const double f)
function to obtain the linear RSD power spectrum hexadecapole
double j0(const double xx)
the l=0 spherical Bessel function
double trapezoid_integration(const std::vector< double > xx, const std::vector< double > yy)
integral, computed with the trapezoid rule, using ordered data
double xi2D_model(const double rp, const double pi, const double beta, const double bias, const double sigmav, const std::vector< double > rad_real, const std::vector< double > xi_real, const std::vector< double > xi_, const std::vector< double > xi__, const double var, const int FV, int index=-1, const bool bias_nl=0, const double bA=0., const double v_min=-3000., const double v_max=3000., const int step_v=500)
the non-linear dispersion model for ξ(rp,π)
double xi_ratio(const double beta)
the ratio between the redshift-space and real-space correlation functions
std::vector< std::vector< double > > Xi024_AP(const double alpha_perpendicular, const double alpha_parallel, const std::vector< double > rr, const std::vector< double > rl, const std::vector< double > Xi0, const std::vector< double > Xi2, const std::vector< double > Xi4)
function to obtain the monopole, quadrupole and hexadecapole of the two-point correlation function
double multipole_xi2_model(const double beta, const double xi_real, const double xi_)
the model multipole ξ2 of the two-point correlation function
double Pkl_Kaiser_integrand(const double mu, void *parameters)
integrand of the 2d power spectrum to obtain power spectrum multipole
std::vector< double > Pk2_Kaiser(const std::vector< double > kk, const std::vector< double > Pk, const double bias, const double f)
function to obtain the linear RSD power spectrum quadrupole
void Covariance_XiMultipoles(std::vector< double > &rr, std::vector< std::vector< double >> &covariance, const int nbins, const double rMin, const double rMax, const double nObjects, const double Volume, const std::vector< double > kk, const std::vector< std::vector< double >> Pk_multipoles, const std::vector< int > orders, const cbl::BinType bin_type=cbl::BinType::_linear_)
Covariance matrix for two-point correlation multipoles (see Grieb et al. 2016, Eq....
void Covariance_XiWedges(std::vector< double > &rr, std::vector< std::vector< double >> &covariance, const std::vector< double > mu, const std::vector< double > delta_mu, const int nbins, const double rMin, const double rMax, const double nObjects, const double Volume, const std::vector< double > kk, const std::vector< std::vector< double >> Pk_multipoles, const std::vector< int > orders, const cbl::BinType bin_type=cbl::BinType::_linear_)
Covariance matrix for two-point correlation wedges (see Grieb et al. 2016, Eq. 19 https://arxiv....
T P_2(const T x)
the Legendre polynomial P2
double error_multipole_xi0(const int indexR, const std::vector< double > mu, const std::vector< std::vector< double >> error)
error on xi0(s) from ξ(r,μ)
std::vector< double > Xi4(const std::vector< double > rr, const std::vector< double > kk, const std::vector< double > Pk4, const double k_cut=0.6, const double cut_pow=2, const int IntegrationMethod=1)
function to obtain the two point correlation function hexadecapole
double j4(const double xx)
the l=4 spherical Bessel function
double jl_distance_average(const double kk, const int order, const double r_down, const double r_up)
the distance average for the order l-th spherical Bessel function
double covariance_XiMultipoles_integrand(const double kk, void *parameters)
integrand to obtain the 2PCF multipoles
double XiMultipoles_from_Xi2D_integrand(const double mu, void *parameters)
integrand to obtain the 2PCF multipoles from 2D 2pcf in polar coordinates
double legendre_polynomial(const double mu, const int l)
the order l Legendre polynomial
std::vector< double > Xi0(const std::vector< double > r, const std::vector< double > kk, const std::vector< double > Pk0, const double k_cut=0.7, const double cut_pow=2, const int IntegrationMethod=1)
function to obtain the two point correlation funciton monopole
double jl(const double xx, const int order)
the order l spherical Bessel function