66 double norm = 1./(2.*pow(
par::pi, 2));
67 double dRdM_fact = pow(3./(4.*
par::pi*rho), 1./3.);
69 double RR =
Radius(mass, rho);
70 double dRdM = dRdM_fact*pow(mass, -2./3.)/3.;
72 auto integrand_sigmaR = [&] (
const double kk)
79 auto integrand_dsigmaR = [&] (
const double kk)
85 sigmaM = sqrt(sigmaM);
92 void cbl::modelling::numbercounts::sigmaM_dlnsigmaM (std::vector<double> &sigmaM, std::vector<double> &dlnsigmaM,
const std::vector<double> mass,
const std::vector<double> kk,
const std::vector<double> Pk,
const std::string interpType,
const double kmax,
const double rho)
94 double norm = 1./(2.*pow(
par::pi, 2));
95 double dRdM_fact = pow(3./(4.*
par::pi*rho), 1./3.);
97 sigmaM.resize(mass.size(), 0);
98 dlnsigmaM.resize(mass.size(), 0);
100 for (
size_t i=0; i<mass.size(); i++) {
102 double RR =
Radius(mass[i], rho);
103 double dRdM = dRdM_fact*pow(mass[i], -2./3.)/3.;
105 auto integrand_sigmaR = [&] (
const double kk)
112 auto integrand_dsigmaR = [&] (
const double kk)
118 sigmaM[i] = sqrt(sigmaM[i]);
128 const double rho = cosmology.
rho_m(0.,
true);
130 vector<double> sigmaM, dlnsigmaM;
134 vector<cbl::glob::FuncGrid> interp(2);
147 const double rho = cosmology.
rho_m(0.,
true);
149 double sigmaM, dlnsigmaM;
151 sigmaM_dlnsigmaM (sigmaM, dlnsigmaM, ((cosmology.
unit()) ? mass : mass*cosmology.
hh()), interp_Pk, kmax, rho);
152 double _Delta = (isDelta_critical) ? Delta/cosmology.
OmegaM(redshift) : Delta;
161 std::vector<double>
cbl::modelling::numbercounts::mass_function (
const std::vector<double> mass,
cbl::cosmology::Cosmology cosmology,
const double redshift,
const std::string model_MF,
const bool store_output,
const double Delta,
const bool isDelta_critical,
const std::vector<double> kk,
const std::vector<double> Pk,
const std::string interpType,
const double kmax)
165 const double rho = cosmology.
rho_m(0.,
true);
167 vector<double> _mass = mass;
169 if (!cosmology.
unit())
170 for(
size_t i=0; i<mass.size(); i++)
171 _mass[i] = mass[i]*cosmology.
hh();
173 vector<double> sigmaM, dlnsigmaM;
176 double _Delta = (isDelta_critical) ? Delta/cosmology.
OmegaM(redshift) : Delta;
178 for (
size_t i=0; i<mass.size(); i++)
188 std::vector<std::vector<double>>
cbl::modelling::numbercounts::mass_function (
const std::vector<double> redshift,
const std::vector<double> mass,
cbl::cosmology::Cosmology cosmology,
const std::string model_MF,
const bool store_output,
const double Delta,
const bool isDelta_critical,
const std::vector<double> kk,
const std::vector<double> Pk,
const std::string interpType,
const double kmax)
190 vector<vector<double>>
mass_function(redshift.size(), vector<double>(mass.size()));
192 const double rho = cosmology.
rho_m(0.,
true);
194 vector<double> _mass = mass;
196 if (!cosmology.
unit())
197 for(
size_t i=0; i<mass.size(); i++)
198 _mass[i] = mass[i]*cosmology.
hh();
200 vector<double> sigmaM, dlnsigmaM;
203 for (
size_t j=0; j<redshift.size(); j++)
204 for (
size_t i=0; i<mass.size(); i++)
214 double cbl::modelling::numbercounts::number_counts (
const double redshift_min,
const double redshift_max,
const double Mass_min,
const double Mass_max,
cbl::cosmology::Cosmology cosmology,
const double Area,
const std::string model_MF,
const bool store_output,
const double Delta,
const bool isDelta_critical,
const cbl::glob::FuncGrid interp_sigmaM,
const cbl::glob::FuncGrid interp_DlnsigmaM)
216 double fact = (cosmology.
unit()) ? 1 : cosmology.
hh();
219 auto integrand = [&cosmology,&fact,&model_MF,&isDelta_critical,&Delta,&Area,&interp_sigmaM,&interp_DlnsigmaM,&store_output] (
const std::vector<double> x)
221 double Mass = pow(10,x[0])*pow(10,14);
224 std::vector<std::vector<double>> integration_limits(2);
225 integration_limits[0] = {log10(Mass_min/pow(10,14)), log10(Mass_max/pow(10,14))};
226 integration_limits[1] = {redshift_min, redshift_max};
231 return nc * pow(10,14) * log(10);
238 double cbl::modelling::numbercounts::counts_proxy (
const double alpha,
const double beta,
const double gamma,
const double scatter0,
const double scatterM,
const double scatterM_exp,
const double scatterz,
const double scatterz_exp,
const double z_bias,
const double proxy_bias,
const double z_err,
const double proxy_err,
const double Plambda_a,
const double Plambda_b,
const double Plambda_c, std::function<
double(
const double,
const double,
const std::shared_ptr<void>)> fz, std::function<
double(
const double,
const double)> z_error, std::function<
double(
const double,
const double)> proxy_error,
double (*response_fact)(
const double,
const double,
const double,
const double,
const std::string,
const double,
const std::string, std::shared_ptr<void>),
const double redshift_min,
const double redshift_max,
const double proxy_min,
const double proxy_max,
cbl::cosmology::Cosmology cosmology,
const double Area,
const std::string model_MF,
const std::string model_bias,
const bool store_output,
const double Delta,
const bool isDelta_critical,
const cbl::glob::FuncGrid interp_sigmaM,
const cbl::glob::FuncGrid interp_DlnsigmaM,
const cbl::glob::FuncGrid interp_DN,
const double proxy_pivot,
const double z_pivot,
const double mass_pivot,
const double log_base,
const double weight)
240 double fact = (cosmology.
unit()) ? 1 : cosmology.
hh();
241 std::shared_ptr<void> pp;
242 auto cosmology_ptr = std::make_shared<cbl::cosmology::Cosmology>(cosmology);
245 double normM=0;
double the_redsh=0;
248 auto integrand_P_M__z = [&] (
const double x)
250 double log_lambda = x - log(proxy_pivot)/log(log_base);
251 double log_f_z = log( fz(the_redsh, z_pivot, cosmology_ptr) )/log(log_base);
253 double mean =
alpha + beta*log_lambda + gamma*log_f_z;
254 double sigma = std::abs(scatter0 + scatterM*pow(log_lambda, scatterM_exp) + scatterz*pow(log_f_z, scatterz_exp));
255 double P_M__lambda_z =
cbl::gaussian(normM, pp, {mean,sigma});
256 double P_lambda__z = Plambda_a * pow(pow(log_base,x),-Plambda_b) * exp(-Plambda_c*pow(log_base,x));
258 return P_M__lambda_z * P_lambda__z * pow(log_base,x);
262 auto integrand = [&] (
const std::vector<double> x)
264 double Delta_ = (isDelta_critical) ? Delta/cosmology.
OmegaM(x[1]) : Delta;
265 double Mass = pow(log_base,x[0])*mass_pivot;
270 double log_lambda = log(x[2]/proxy_pivot)/log(log_base);
271 double log_f_z = log( fz(x[1], z_pivot, cosmology_ptr) )/log(log_base);
273 double mean =
alpha + beta*log_lambda + gamma*log_f_z;
274 double sigma = std::abs(scatter0 + scatterM*pow(log_lambda, scatterM_exp) + scatterz*pow(log_f_z, scatterz_exp));
275 double P_M__lambda_z =
cbl::gaussian(normM, pp, {mean,sigma});
278 double P_lambda__z = Plambda_a * pow(x[2],-Plambda_b) * exp(-Plambda_c*x[2]);
282 if (P_M__lambda_z*P_lambda__z > 0)
288 double mean_Pz = x[1] + z_bias * (1+x[1]);
289 double int_P_z = 0.5 * ( erf( (redshift_max - mean_Pz) / (sqrt(2)*z_error(z_err, redshift_max)) ) - erf( (redshift_min - mean_Pz) / (sqrt(2)*z_error(z_err, redshift_min)) ) );
290 double mean_Plambda = x[2] + proxy_bias * (x[2]);
291 double int_P_lambda = 0.5 * ( erf( (proxy_max - mean_Plambda) / (sqrt(2)*proxy_error(proxy_err, proxy_max)) ) - erf( (proxy_min - mean_Plambda) / (sqrt(2)*proxy_error(proxy_err, proxy_min)) ) );
293 return response_fact(
Mass, interp_sigmaM(
Mass*fact), x[1], interp_DN(x[1]), model_bias, Delta_,
"EisensteinHu", cosmology_ptr) * cosmology.
mass_function(
Mass, interp_sigmaM(
Mass*fact), interp_DlnsigmaM(
Mass*fact), x[1], interp_DN(x[1]), model_MF, store_output,
cbl::par::defaultString, Delta_)*Area*cosmology.
dV_dZdOmega(x[1],
true) * pow(log_base,normM) * (P_M__lambda_z*P_lambda__z/P_M__z) * int_P_z * int_P_lambda;
299 double log_lambda_min = log((std::max(proxy_min - 3.5*proxy_error(proxy_err, proxy_min), 1.))/proxy_pivot)/log(log_base);
300 double log_lambda_max = log((proxy_max + 3.5*proxy_error(proxy_err, proxy_max))/proxy_pivot)/log(log_base);
301 double log_f_z_min = log( fz((std::max(redshift_min - 3.5*z_error(z_err, redshift_min), 0.)), z_pivot, cosmology_ptr) )/log(log_base);
302 double log_f_z_max = log( fz((redshift_max + 3.5*z_error(z_err, redshift_min)), z_pivot, cosmology_ptr) )/log(log_base);
304 double M1 =
alpha + beta*log_lambda_min + gamma*log_f_z_min;
305 double M2 =
alpha + beta*log_lambda_max + gamma*log_f_z_min;
306 double M3 =
alpha + beta*log_lambda_min + gamma*log_f_z_max;
307 double M4 =
alpha + beta*log_lambda_max + gamma*log_f_z_max;
309 double min1 = std::min(M1, M2);
310 double min2 = std::min(min1, M3);
311 double minM = std::min(min2, M4);
312 double max1 = std::max(M1, M2);
313 double max2 = std::max(max1, M3);
314 double maxM = std::max(max2, M4);
317 double s1 = std::abs( scatter0 + scatterM*pow(log_lambda_min, scatterM_exp) + scatterz*pow(log_f_z_min, scatterz_exp) );
318 double s2 = std::abs( scatter0 + scatterM*pow(log_lambda_max, scatterM_exp) + scatterz*pow(log_f_z_min, scatterz_exp) );
319 double s3 = std::abs( scatter0 + scatterM*pow(log_lambda_min, scatterM_exp) + scatterz*pow(log_f_z_max, scatterz_exp) );
320 double s4 = std::abs( scatter0 + scatterM*pow(log_lambda_max, scatterM_exp) + scatterz*pow(log_f_z_max, scatterz_exp) );
322 double maxs1 = std::max(s1, s2);
323 double maxs2 = std::max(maxs1, s3);
324 double max_intrinsic_scatter = std::max(maxs2, s4);
327 int integral_dimension=3;
328 std::vector<std::vector<double>> integration_limits(integral_dimension);
329 integration_limits[0] = {std::max(minM-3.5*max_intrinsic_scatter,log(1.e10/mass_pivot)/log(log_base)), std::min(maxM+3.5*max_intrinsic_scatter,log(1.e16/mass_pivot)/log(log_base))};
330 integration_limits[1] = {std::max(redshift_min - 3.5*z_error(z_err, redshift_min), 0.), redshift_max + 3.5*z_error(z_err, redshift_max)};
331 integration_limits[2] = {std::max(proxy_min - 3.5*proxy_error(proxy_err, proxy_min), 0.00001), proxy_max + 3.5*proxy_error(proxy_err, proxy_max)};
337 if (integration_limits[0][0] < integration_limits[0][1])
338 nc = CW.IntegrateVegas(integration_limits,
false);
342 return nc * mass_pivot * log(log_base) * weight;
349 std::vector<double>
cbl::modelling::numbercounts::size_function (
cbl::cosmology::Cosmology cosmology,
const std::vector<double> radii,
const double redshift,
const std::string model,
const double b_eff,
double slope,
double offset,
const double deltav_NL,
const double del_c,
const std::string method_Pk,
const bool store_output,
const std::string output_root,
const std::string interpType,
const double k_max,
const std::string input_file,
const bool is_parameter_file)
352 vector<double>
size_function = cosmology.
size_function(radii, redshift, model, b_eff, slope, offset, deltav_NL, del_c, method_Pk, store_output, output_root, interpType, k_max, input_file, is_parameter_file);
Global functions to model number counts of any type.
double rho_m(const double redshift=0., const bool unit1=false, const bool nu=false) const
the mean cosmic background density
double size_function(const double RV, const double redshift, const std::string model, const double b_eff, double slope=0.854, double offset=0.420, const double deltav_NL=-0.795, const double del_c=1.69, const std::string method_Pk="EisensteinHu", const bool store_output=true, const std::string output_root="test", const std::string interpType="Linear", const double k_max=100., const std::string input_file=par::defaultString, const bool is_parameter_file=true) const
the void size function
bool unit() const
get the private member Cosmology::m_unit
double hh() const
get the private member Cosmology::m_hh
double dV_dZdOmega(const double redshift, const bool angle_rad) const
the derivative of the comoving volume, d2V/(dz*dΩ) at a given redshift
double mass_function(const double Mass, const double redshift, const std::string model_MF, const std::string method_SS, const bool store_output=true, const std::string output_root="test", const double Delta=200., const std::string interpType="Linear", const int norm=-1, const double k_min=0.001, const double k_max=100., const double prec=1.e-2, const std::string input_file=par::defaultString, const bool is_parameter_file=true, const bool default_delta=true, const double delta_t=1.686)
the mass function of dark matter haloes (filaments and sheets)
double OmegaM(const double redshift=0.) const
the matter density at a given redshift
double IntegrateVegas(std::vector< std::vector< double >> integration_limits, const bool parallelize=true)
integrate using the Vegas routine
static const std::string defaultString
default std::string value
static const double pi
: the ratio of a circle's circumference to its diameter
static const double alpha
: the fine-structure constant
void sigmaM_dlnsigmaM(double &sigmaM, double &dlnsigmaM, const double mass, const cbl::glob::FuncGrid interp_Pk, const double kmax, const double rho)
compute
double counts_proxy(const double alpha, const double beta, const double gamma, const double scatter0, const double scatterM, const double scatterM_exp, const double scatterz, const double scatterz_exp, const double z_bias, const double proxy_bias, const double z_err, const double proxy_err, const double Plambda_a, const double Plambda_b, const double Plambda_c, std::function< double(const double, const double, const std::shared_ptr< void >)> fz, std::function< double(const double, const double)> z_error, std::function< double(const double, const double)> proxy_error, double(*response_fact)(const double, const double, const double, const double, const std::string, const double, const std::string, std::shared_ptr< void >), const double redshift_min, const double redshift_max, const double proxy_min, const double proxy_max, cbl::cosmology::Cosmology cosmology, const double Area, const std::string model_MF, const std::string model_bias, const bool store_output, const double Delta, const bool isDelta_critical, const cbl::glob::FuncGrid interp_sigmaM, const cbl::glob::FuncGrid interp_DlnsigmaM, const cbl::glob::FuncGrid interp_DN, const double proxy_pivot, const double z_pivot, const double mass_pivot, const double log_base, const double weight)
compute the number counts as function of mass proxy and redshift
double mass_function(const double mass, cosmology::Cosmology cosmology, const double redshift, const std::string model_MF, const bool store_output, const double Delta, const bool isDelta_critical, const cbl::glob::FuncGrid interp_Pk, const double kmax)
compute the mass function
std::vector< double > size_function(cosmology::Cosmology cosmology, const std::vector< double > radii, const double redshift, const std::string model, const double b_eff, double slope=0.854, double offset=0.420, const double deltav_NL=-0.795, const double del_c=1.69, const std::string method_Pk="Eisensteinhu", const bool store_output=true, const std::string output_root="test", const std::string interpType="Linear", const double k_max=100., const std::string input_file=par::defaultString, const bool is_parameter_file=true)
the void size function
double number_counts(const double redshift_min, const double redshift_max, const double Mass_min, const double Mass_max, cosmology::Cosmology cosmology, const double Area, const std::string model_MF, const bool store_output, const double Delta, const bool isDelta_critical, const glob::FuncGrid interp_sigmaM, const glob::FuncGrid interp_DlnsigmaM)
compute the number counts as function of mass and redshift
double Filter_sigmaR(const double kk, const double radius)
the filter to compute
double Filter_dsigmaR(const double kk, const double radius)
the filter to compute
double GSL_integrate_cquad(gsl_function func, const double a, const double b, const double rel_err=1.e-3, const double abs_err=0, const int nevals=100)
integral, using the gsl cquad method
The global namespace of the CosmoBolognaLib
T Mass(const T RR, const T Rho)
the mass of a sphere of a given radius and density
T Radius(const T Mass, const T Rho)
the radius of a sphere of a given mass and density
T TopHat_WF(const T kR)
the top-hat window function
T gaussian(T xx, std::shared_ptr< void > pp, std::vector< double > par)
the Gaussian function
T TopHat_WF_D1(const T kR)
the derivative of the top-hat window function