49 m_data = profile->dataset();
50 m_profile_author = profile_author;
52 m_mass_is_derived =
false;
53 m_halo_def = halo_def;
63 m_profile_author = profile_author;
65 m_mass_is_derived =
false;
66 m_halo_def = halo_def;
75 m_data_model.cosmology = make_shared<cosmology::Cosmology>(cosmology);
76 m_data_model.cosmology->set_unit(
true);
78 m_data_model.redshift = redshift;
79 m_data_model.contrast = contrast;
80 m_data_model.logM_base = logM_base;
81 m_data_model.mass_pivot = mass_pivot;
83 m_data_model.bias_author = bias_author;
84 m_data_model.method_Pk = method_Pk;
85 m_data_model.interp_type = interp_type;
91 void cbl::modelling::densityprofile::Modelling_DensityProfile::set_data_model (
const cosmology::Cosmology cosmology,
const double redshift,
const double mass_proxy,
const double redshift_pivot,
const double proxy_pivot,
const double contrast,
const double logM_base,
const double mass_pivot,
const double Nclusters,
const std::string bias_author,
const std::string method_Pk, std::string interp_type)
93 m_data_model.cosmology = make_shared<cosmology::Cosmology>(cosmology);
94 m_data_model.cosmology->set_unit(
true);
96 m_data_model.redshift = redshift;
97 m_data_model.mass_proxy = mass_proxy;
98 m_data_model.redshift_pivot = redshift_pivot;
99 m_data_model.proxy_pivot = proxy_pivot;
101 m_data_model.contrast = contrast;
102 m_data_model.logM_base = logM_base;
103 m_data_model.mass_pivot = mass_pivot;
105 m_data_model.bias_author = bias_author;
106 m_data_model.method_Pk = method_Pk;
107 m_data_model.interp_type = interp_type;
109 m_mass_is_derived =
true;
112 std::vector<double> dummy_vec = {1.};
113 std::shared_ptr<cbl::data::Data> dataset = std::make_shared<cbl::data::Data1D>(
cbl::data::Data1D(dummy_vec, dummy_vec, dummy_vec));
117 m_data_model.scaling_relation = make_shared<modelling::massobsrel::Modelling_MassObservableRelation>(
scaling_relation);
119 (m_data_model.scaling_relation)->set_data_model(cosmology, {redshift}, redshift_pivot, proxy_pivot, logM_base, {Nclusters});
127 m_data_model.Cpar = cosmo_param;
129 const size_t nParams = cosmo_param.size()+7;
131 vector<statistics::ParameterType> Par_type (nParams, statistics::ParameterType::_Base_);
132 vector<string> Par_string (nParams);
133 std::vector<statistics::PriorDistribution> param_prior (nParams);
136 for (
size_t i=0; i<cosmo_param.size(); i++){
138 param_prior[i] = cosmo_prior[i];
142 Par_string[cosmo_param.size()] =
"Rt";
143 param_prior[cosmo_param.size()] = Rt_prior;
144 Par_string[cosmo_param.size()+1] =
"concentration";
145 param_prior[cosmo_param.size()+1] = concentration_prior;
146 Par_string[cosmo_param.size()+2] =
"logM";
147 param_prior[cosmo_param.size()+2] = logM_prior;
148 Par_string[cosmo_param.size()+3] =
"f_off";
149 param_prior[cosmo_param.size()+3] = f_off_prior;
150 Par_string[cosmo_param.size()+4] =
"sigma_off";
151 param_prior[cosmo_param.size()+4] = sigma_off_prior;
153 Par_string[cosmo_param.size()+5] =
"AB_fact";
154 param_prior[cosmo_param.size()+5] = anisotropic_boost_prior;
155 Par_string[cosmo_param.size()+6] =
"OB_fact";
156 param_prior[cosmo_param.size()+6] = orientation_boost_prior;
159 m_data_model.i_Rt = cosmo_param.size();
160 m_data_model.i_conc = cosmo_param.size()+1;
161 m_data_model.i_logM = cosmo_param.size()+2;
162 m_data_model.i_foff = cosmo_param.size()+3;
163 m_data_model.i_sigmaoff = cosmo_param.size()+4;
164 m_data_model.i_AB = cosmo_param.size()+5;
165 m_data_model.i_OB = cosmo_param.size()+6;
167 m_data_model.i_Rt_func = 0;
168 m_data_model.i_foff_func = 1;
169 m_data_model.i_sigmaoff_func = 2;
170 m_data_model.i_AB_func = 3;
171 m_data_model.i_OB_func = 4;
174 m_data_model.get_parameter.resize(5);
175 m_data_model.priors_excluded.resize(5);
177 for (
size_t i=0; i<m_data_model.get_parameter.size(); i++)
178 m_data_model.get_parameter[i] = [] (std::vector<double> &par,
const int idx, std::vector<statistics::PriorDistribution> prior,
const int i_prior) {
179 (void)prior; (void)i_prior;
return par[idx];
182 m_data_model.priors_excluded[0] = Rt_prior;
183 m_data_model.priors_excluded[1] = f_off_prior;
184 m_data_model.priors_excluded[2] = sigma_off_prior;
185 m_data_model.priors_excluded[3] = anisotropic_boost_prior;
186 m_data_model.priors_excluded[4] = orientation_boost_prior;
189 cosmology::HaloProfile halo_profile (*(m_data_model.cosmology), m_data_model.redshift, 0., 0., m_Delta, m_profile_author, m_halo_def, 0.,
true,
false, 0., 0.);
190 m_data_model.halo_profile = make_shared<cosmology::HaloProfile>(halo_profile);
197 m_data_model.two_halo_func = [] (
const std::vector<double> radius,
cbl::cosmology::HaloProfile halo_profile,
const std::string bias_author,
const std::string method_Pk,
const std::string interp_type) {
198 return halo_profile.
DeltaSigma_2h(radius, bias_author, method_Pk, interp_type);};
200 m_data_model.two_halo_func = [] (
const std::vector<double> radius,
cbl::cosmology::HaloProfile halo_profile,
const std::string bias_author,
const std::string method_Pk,
const std::string interp_type) {
201 (void)halo_profile; (void)bias_author; (void)method_Pk; (void)interp_type;
202 std::vector<double> res (radius.size(), 0.);
206 auto inputs = make_shared<STR_Profile_data_model>(m_data_model);
209 m_set_prior(param_prior);
211 m_data_model.Par_type = Par_type;
212 m_data_model.Par_string = Par_string;
222 m_data_model.Cpar = cosmo_param;
224 const size_t nParams = cosmo_param.size()+7;
225 const int n_derivedPars = 1;
227 vector<statistics::ParameterType> Par_type (nParams, statistics::ParameterType::_Base_);
228 Par_type[cosmo_param.size()+1] = statistics::ParameterType::_Derived_;
230 vector<string> Par_string (nParams);
231 std::vector<statistics::PriorDistribution> param_prior (nParams-n_derivedPars);
234 for (
size_t i=0; i<cosmo_param.size(); i++){
236 param_prior[i] = cosmo_prior[i];
240 Par_string[cosmo_param.size()] =
"Rt";
241 param_prior[cosmo_param.size()] = Rt_prior;
243 Par_string[cosmo_param.size()+1] =
"concentration";
245 Par_string[cosmo_param.size()+2] =
"logM";
246 param_prior[cosmo_param.size()+1] = logM_prior;
247 Par_string[cosmo_param.size()+3] =
"f_off";
248 param_prior[cosmo_param.size()+2] = f_off_prior;
249 Par_string[cosmo_param.size()+4] =
"sigma_off";
250 param_prior[cosmo_param.size()+3] = sigma_off_prior;
252 Par_string[cosmo_param.size()+5] =
"AB_fact";
253 param_prior[cosmo_param.size()+4] = anisotropic_boost_prior;
254 Par_string[cosmo_param.size()+6] =
"OB_fact";
255 param_prior[cosmo_param.size()+5] = orientation_boost_prior;
258 m_data_model.i_Rt = cosmo_param.size();
259 m_data_model.i_conc = cosmo_param.size()+1;
260 m_data_model.i_logM = cosmo_param.size()+2;
261 m_data_model.i_foff = cosmo_param.size()+3;
262 m_data_model.i_sigmaoff = cosmo_param.size()+4;
263 m_data_model.i_AB = cosmo_param.size()+5;
264 m_data_model.i_OB = cosmo_param.size()+6;
266 m_data_model.i_Rt_func = 0;
267 m_data_model.i_foff_func = 1;
268 m_data_model.i_sigmaoff_func = 2;
269 m_data_model.i_AB_func = 3;
270 m_data_model.i_OB_func = 4;
273 m_data_model.get_parameter.resize(5);
274 m_data_model.priors_excluded.resize(5);
276 for (
size_t i=0; i<m_data_model.get_parameter.size(); i++)
277 m_data_model.get_parameter[i] = [] (std::vector<double> &par,
const int idx, std::vector<statistics::PriorDistribution> prior,
const int i_prior) {
278 (void)prior; (void)i_prior;
return par[idx];
281 m_data_model.priors_excluded[0] = Rt_prior;
282 m_data_model.priors_excluded[1] = f_off_prior;
283 m_data_model.priors_excluded[2] = sigma_off_prior;
284 m_data_model.priors_excluded[3] = anisotropic_boost_prior;
285 m_data_model.priors_excluded[4] = orientation_boost_prior;
288 cosmology::HaloProfile halo_profile (*(m_data_model.cosmology), m_data_model.redshift, cM_author, 0., m_Delta, m_profile_author, m_halo_def, 0.,
true,
false, 0., 0.);
289 m_data_model.halo_profile = make_shared<cosmology::HaloProfile>(halo_profile);
296 m_data_model.two_halo_func = [] (
const std::vector<double> radius,
cbl::cosmology::HaloProfile halo_profile,
const std::string bias_author,
const std::string method_Pk,
const std::string interp_type) {
297 return halo_profile.
DeltaSigma_2h(radius, bias_author, method_Pk, interp_type);};
299 m_data_model.two_halo_func = [] (
const std::vector<double> radius,
cbl::cosmology::HaloProfile halo_profile,
const std::string bias_author,
const std::string method_Pk,
const std::string interp_type) {
300 (void)halo_profile; (void)bias_author; (void)method_Pk; (void)interp_type;
301 std::vector<double> res (radius.size(), 0.);
305 auto inputs = make_shared<STR_Profile_data_model>(m_data_model);
308 m_set_prior(param_prior);
310 m_data_model.Par_type = Par_type;
311 m_data_model.Par_string = Par_string;
320 void cbl::modelling::densityprofile::Modelling_DensityProfile::set_model_DensityProfile_cosmology (
const std::vector<cbl::cosmology::CosmologicalParameter> cosmo_param,
const std::vector<statistics::PriorDistribution> cosmo_prior,
const std::string z_evo,
const statistics::PriorDistribution Rt_prior,
const statistics::PriorDistribution concentration_prior,
const statistics::PriorDistribution f_off_prior,
const statistics::PriorDistribution sigma_off_prior,
const statistics::PriorDistribution anisotropic_boost_prior,
const statistics::PriorDistribution orientation_boost_prior,
const statistics::PriorDistribution alpha_prior,
const statistics::PriorDistribution beta_prior,
const statistics::PriorDistribution gamma_prior,
const statistics::PriorDistribution scatter0_prior,
const statistics::PriorDistribution scatterM_prior,
const statistics::PriorDistribution scatterM_exponent_prior,
const statistics::PriorDistribution scatterz_prior,
const statistics::PriorDistribution scatterz_exponent_prior)
322 if (m_mass_is_derived ==
false)
323 ErrorCBL(
"If the mass is derived from the scaling relation, you must use the correct set_data_model!",
"set_model_DensityProfile_cosmology",
"Modelling_DensityProfile.cpp");
325 m_data_model.Cpar = cosmo_param;
327 const size_t nParams = cosmo_param.size()+14;
329 vector<statistics::ParameterType> Par_type (nParams, statistics::ParameterType::_Base_);
331 vector<string> Par_string (nParams);
332 std::vector<statistics::PriorDistribution> param_prior (nParams);
335 for (
size_t i=0; i<cosmo_param.size(); i++){
337 param_prior[i] = cosmo_prior[i];
341 Par_string[cosmo_param.size()] =
"Rt";
342 param_prior[cosmo_param.size()] = Rt_prior;
343 Par_string[cosmo_param.size()+1] =
"concentration";
344 param_prior[cosmo_param.size()+1] = concentration_prior;
346 Par_string[cosmo_param.size()+2] =
"f_off";
347 param_prior[cosmo_param.size()+2] = f_off_prior;
348 Par_string[cosmo_param.size()+3] =
"sigma_off";
349 param_prior[cosmo_param.size()+3] = sigma_off_prior;
351 Par_string[cosmo_param.size()+4] =
"AB_fact";
352 param_prior[cosmo_param.size()+4] = anisotropic_boost_prior;
353 Par_string[cosmo_param.size()+5] =
"OB_fact";
354 param_prior[cosmo_param.size()+5] = orientation_boost_prior;
356 Par_string[cosmo_param.size()+6] =
"alpha";
357 param_prior[cosmo_param.size()+6] = alpha_prior;
358 Par_string[cosmo_param.size()+7] =
"beta";
359 param_prior[cosmo_param.size()+7] = beta_prior;
360 Par_string[cosmo_param.size()+8] =
"gamma";
361 param_prior[cosmo_param.size()+8] = gamma_prior;
362 Par_string[cosmo_param.size()+9] =
"scatter0";
363 param_prior[cosmo_param.size()+9] = scatter0_prior;
364 Par_string[cosmo_param.size()+10] =
"scatterM";
365 param_prior[cosmo_param.size()+10] = scatterM_prior;
366 Par_string[cosmo_param.size()+11] =
"scatterM_exponent";
367 param_prior[cosmo_param.size()+11] = scatterM_exponent_prior;
368 Par_string[cosmo_param.size()+12] =
"scatterz";
369 param_prior[cosmo_param.size()+12] = scatterz_prior;
370 Par_string[cosmo_param.size()+13] =
"scatterz_exponent";
371 param_prior[cosmo_param.size()+13] = scatterz_exponent_prior;
374 m_data_model.i_Rt = cosmo_param.size();
375 m_data_model.i_conc = cosmo_param.size()+1;
376 m_data_model.i_foff = cosmo_param.size()+2;
377 m_data_model.i_sigmaoff = cosmo_param.size()+3;
378 m_data_model.i_AB = cosmo_param.size()+4;
379 m_data_model.i_OB = cosmo_param.size()+5;
381 m_data_model.i_Rt_func = 0;
382 m_data_model.i_foff_func = 1;
383 m_data_model.i_sigmaoff_func = 2;
384 m_data_model.i_AB_func = 3;
385 m_data_model.i_OB_func = 4;
388 m_data_model.get_parameter.resize(5);
389 m_data_model.priors_excluded.resize(5);
391 for (
size_t i=0; i<m_data_model.get_parameter.size(); i++)
392 m_data_model.get_parameter[i] = [] (std::vector<double> &par,
const int idx, std::vector<statistics::PriorDistribution> prior,
const int i_prior) {
393 (void)prior; (void)i_prior;
return par[idx];
396 m_data_model.priors_excluded[0] = Rt_prior;
397 m_data_model.priors_excluded[1] = f_off_prior;
398 m_data_model.priors_excluded[2] = sigma_off_prior;
399 m_data_model.priors_excluded[3] = anisotropic_boost_prior;
400 m_data_model.priors_excluded[4] = orientation_boost_prior;
403 cosmology::HaloProfile halo_profile (*(m_data_model.cosmology), m_data_model.redshift, 0., 0., m_Delta, m_profile_author, m_halo_def, 0.,
true,
false, 0., 0.);
404 m_data_model.halo_profile = make_shared<cosmology::HaloProfile>(halo_profile);
407 (m_data_model.scaling_relation)->set_model_MassObservableRelation_cosmology (z_evo, cosmo_param, cosmo_prior, alpha_prior, beta_prior, gamma_prior, scatter0_prior, scatterM_prior, scatterM_exponent_prior, scatterz_prior, scatterz_exponent_prior);
413 m_data_model.conc_scaling_relation_func = [] (
const double conc,
const double c0=0,
const double cM=0,
const double cz=0,
const double logM=0,
const double logz=0) {
414 (void)c0; (void)cM; (void)cz; (void)logM; (void)logz;
return conc;
419 m_data_model.two_halo_func_fast = [] (
const std::vector<double> radius,
cbl::cosmology::HaloProfile halo_profile,
const double bias,
const std::string method_Pk,
const std::string interp_type) {
422 m_data_model.two_halo_func_fast = [] (
const std::vector<double> radius,
cbl::cosmology::HaloProfile halo_profile,
const double bias,
const std::string method_Pk,
const std::string interp_type) {
423 (void)halo_profile; (void)
bias; (void)method_Pk; (void)interp_type;
424 std::vector<double> res (radius.size(), 0.);
428 auto inputs = make_shared<STR_Profile_data_model>(m_data_model);
431 m_set_prior(param_prior);
433 m_data_model.Par_type = Par_type;
434 m_data_model.Par_string = Par_string;
443 void cbl::modelling::densityprofile::Modelling_DensityProfile::set_model_DensityProfile_cosmology (
const std::vector<cbl::cosmology::CosmologicalParameter> cosmo_param,
const std::vector<statistics::PriorDistribution> cosmo_prior,
const std::string z_evo,
const statistics::PriorDistribution Rt_prior,
const statistics::PriorDistribution c0_prior,
const statistics::PriorDistribution cM_prior,
const statistics::PriorDistribution cz_prior,
const statistics::PriorDistribution f_off0_prior,
const statistics::PriorDistribution f_offM_prior,
const statistics::PriorDistribution f_offz_prior,
const statistics::PriorDistribution sigma_off0_prior,
const statistics::PriorDistribution sigma_offM_prior,
const statistics::PriorDistribution sigma_offz_prior,
const statistics::PriorDistribution anisotropic_boost_prior,
const statistics::PriorDistribution orientation_boost_prior,
const statistics::PriorDistribution alpha_prior,
const statistics::PriorDistribution beta_prior,
const statistics::PriorDistribution gamma_prior,
const statistics::PriorDistribution scatter0_prior,
const statistics::PriorDistribution scatterM_prior,
const statistics::PriorDistribution scatterM_exponent_prior,
const statistics::PriorDistribution scatterz_prior,
const statistics::PriorDistribution scatterz_exponent_prior)
445 if (m_mass_is_derived ==
false)
446 ErrorCBL(
"If the mass is derived from the scaling relation, you must use the correct set_data_model!",
"set_model_DensityProfile_cosmology",
"Modelling_DensityProfile.cpp");
448 m_data_model.Cpar = cosmo_param;
450 const size_t nParams = cosmo_param.size()+20;
452 vector<statistics::ParameterType> Par_type (nParams, statistics::ParameterType::_Base_);
454 vector<string> Par_string (nParams);
455 std::vector<statistics::PriorDistribution> param_prior (nParams);
458 for (
size_t i=0; i<cosmo_param.size(); i++){
460 param_prior[i] = cosmo_prior[i];
464 Par_string[cosmo_param.size()] =
"Rt";
465 param_prior[cosmo_param.size()] = Rt_prior;
467 Par_string[cosmo_param.size()+1] =
"c0";
468 param_prior[cosmo_param.size()+1] = c0_prior;
469 Par_string[cosmo_param.size()+2] =
"cM";
470 param_prior[cosmo_param.size()+2] = cM_prior;
471 Par_string[cosmo_param.size()+3] =
"cz";
472 param_prior[cosmo_param.size()+3] = cz_prior;
474 Par_string[cosmo_param.size()+4] =
"f_off0";
475 param_prior[cosmo_param.size()+4] = f_off0_prior;
476 Par_string[cosmo_param.size()+5] =
"f_offM";
477 param_prior[cosmo_param.size()+5] = f_offM_prior;
478 Par_string[cosmo_param.size()+6] =
"f_offz";
479 param_prior[cosmo_param.size()+6] = f_offz_prior;
480 Par_string[cosmo_param.size()+7] =
"sigma_off0";
481 param_prior[cosmo_param.size()+7] = sigma_off0_prior;
482 Par_string[cosmo_param.size()+8] =
"sigma_offM";
483 param_prior[cosmo_param.size()+8] = sigma_offM_prior;
484 Par_string[cosmo_param.size()+9] =
"sigma_offz";
485 param_prior[cosmo_param.size()+9] = sigma_offz_prior;
487 Par_string[cosmo_param.size()+10] =
"AB_fact";
488 param_prior[cosmo_param.size()+10] = anisotropic_boost_prior;
489 Par_string[cosmo_param.size()+11] =
"OB_fact";
490 param_prior[cosmo_param.size()+11] = orientation_boost_prior;
492 Par_string[cosmo_param.size()+12] =
"alpha";
493 param_prior[cosmo_param.size()+12] = alpha_prior;
494 Par_string[cosmo_param.size()+13] =
"beta";
495 param_prior[cosmo_param.size()+13] = beta_prior;
496 Par_string[cosmo_param.size()+14] =
"gamma";
497 param_prior[cosmo_param.size()+14] = gamma_prior;
498 Par_string[cosmo_param.size()+15] =
"scatter0";
499 param_prior[cosmo_param.size()+15] = scatter0_prior;
500 Par_string[cosmo_param.size()+16] =
"scatterM";
501 param_prior[cosmo_param.size()+16] = scatterM_prior;
502 Par_string[cosmo_param.size()+17] =
"scatterM_exponent";
503 param_prior[cosmo_param.size()+17] = scatterM_exponent_prior;
504 Par_string[cosmo_param.size()+18] =
"scatterz";
505 param_prior[cosmo_param.size()+18] = scatterz_prior;
506 Par_string[cosmo_param.size()+19] =
"scatterz_exponent";
507 param_prior[cosmo_param.size()+19] = scatterz_exponent_prior;
510 cosmology::HaloProfile halo_profile (*(m_data_model.cosmology), m_data_model.redshift, 0., 0., m_Delta, m_profile_author, m_halo_def, 0.,
true,
false, 0., 0.);
511 m_data_model.halo_profile = make_shared<cosmology::HaloProfile>(halo_profile);
514 (m_data_model.scaling_relation)->set_model_MassObservableRelation_cosmology (z_evo, cosmo_param, cosmo_prior, alpha_prior, beta_prior, gamma_prior, scatter0_prior, scatterM_prior, scatterM_exponent_prior, scatterz_prior, scatterz_exponent_prior);
520 m_data_model.conc_scaling_relation_func = [] (
const double conc,
const double c0,
const double cM,
const double cz,
const double logM,
const double logz) {
522 const double logc = c0 + cM*logM + cz*logz;
523 return pow(10, logc);
528 m_data_model.two_halo_func_fast = [] (
const std::vector<double> radius,
cbl::cosmology::HaloProfile halo_profile,
const double bias,
const std::string method_Pk,
const std::string interp_type) {
531 m_data_model.two_halo_func_fast = [] (
const std::vector<double> radius,
cbl::cosmology::HaloProfile halo_profile,
const double bias,
const std::string method_Pk,
const std::string interp_type) {
532 (void)halo_profile; (void)
bias; (void)method_Pk; (void)interp_type;
533 std::vector<double> res (radius.size(), 0.);
537 auto inputs = make_shared<STR_Profile_data_model>(m_data_model);
540 m_set_prior(param_prior);
542 m_data_model.Par_type = Par_type;
543 m_data_model.Par_string = Par_string;
554 for (
size_t i=0; i<m_data_model.Par_type.size(); i++) {
556 switch (m_data_model.Par_type[i])
559 case (statistics::ParameterType::_Base_):
564 ErrorCBL(
"Work in progress. It is not possible to use this function if a derived parameter is set!",
"exclude_parameter_from_MCMC",
"Modelling_DensityProfile.cpp");
572 if (m_evolving_offcentering)
573 ErrorCBL(
"Work in progress. If the offcentering parameters evolve with redshift and mass proxy, this function can not be used!",
"exclude_parameter_from_MCMC",
"Modelling_DensityProfile.cpp");
575 if (m_likelihood != NULL)
576 ErrorCBL(
"This function must be used before setting the likelihood!",
"exclude_parameter_from_MCMC",
"Modelling_DensityProfile.cpp");
579 std::vector<statistics::PriorDistribution> priors;
580 for (
size_t i=0; i<m_parameter_priors.size(); i++)
581 priors.push_back(*m_parameter_priors[i]);
583 if (parameter ==
"Rt") {
585 m_data_model.Par_type.erase(m_data_model.Par_type.begin()+m_data_model.i_Rt);
586 m_data_model.Par_string.erase(m_data_model.Par_string.begin()+m_data_model.i_Rt);
587 priors.erase(priors.begin()+m_data_model.i_Rt);
589 m_data_model.get_parameter[m_data_model.i_Rt_func] = [] (std::vector<double> &par,
const int idx, std::vector<statistics::PriorDistribution> prior,
const int i_prior) {
590 (void)par; (void)idx;
592 return prior[i_prior].sample(rand());
595 m_data_model.i_conc = m_data_model.i_conc - 1;
596 m_data_model.i_logM = m_data_model.i_logM - 1;
597 m_data_model.i_foff = m_data_model.i_foff - 1;
598 m_data_model.i_sigmaoff = m_data_model.i_sigmaoff - 1;
599 m_data_model.i_AB = m_data_model.i_AB - 1;
600 m_data_model.i_OB = m_data_model.i_OB - 1;
603 else if (parameter ==
"f_off") {
605 m_data_model.Par_type.erase(m_data_model.Par_type.begin()+m_data_model.i_foff);
606 m_data_model.Par_string.erase(m_data_model.Par_string.begin()+m_data_model.i_foff);
607 priors.erase(priors.begin()+m_data_model.i_foff);
609 m_data_model.get_parameter[m_data_model.i_foff_func] = [] (std::vector<double> &par,
const int idx, std::vector<statistics::PriorDistribution> prior,
const int i_prior) {
610 (void)par; (void)idx;
612 return prior[i_prior].sample(rand());
615 m_data_model.i_sigmaoff = m_data_model.i_sigmaoff - 1;
616 m_data_model.i_AB = m_data_model.i_AB - 1;
617 m_data_model.i_OB = m_data_model.i_OB - 1;
620 else if (parameter ==
"sigma_off") {
622 m_data_model.Par_type.erase(m_data_model.Par_type.begin()+m_data_model.i_sigmaoff);
623 m_data_model.Par_string.erase(m_data_model.Par_string.begin()+m_data_model.i_sigmaoff);
624 priors.erase(priors.begin()+m_data_model.i_sigmaoff);
626 m_data_model.get_parameter[m_data_model.i_sigmaoff_func] = [] (std::vector<double> &par,
const int idx, std::vector<statistics::PriorDistribution> prior,
const int i_prior) {
627 (void)par; (void)idx;
629 return prior[i_prior].sample(rand());
632 m_data_model.i_AB = m_data_model.i_AB - 1;
633 m_data_model.i_OB = m_data_model.i_OB - 1;
636 else if (parameter ==
"AB_fact") {
638 m_data_model.Par_type.erase(m_data_model.Par_type.begin()+m_data_model.i_AB);
639 m_data_model.Par_string.erase(m_data_model.Par_string.begin()+m_data_model.i_AB);
640 priors.erase(priors.begin()+m_data_model.i_AB);
642 m_data_model.get_parameter[m_data_model.i_AB_func] = [] (std::vector<double> &par,
const int idx, std::vector<statistics::PriorDistribution> prior,
const int i_prior) {
643 (void)par; (void)idx;
645 return prior[i_prior].sample(rand());
648 m_data_model.i_OB = m_data_model.i_OB - 1;
651 else if (parameter ==
"OB_fact") {
653 m_data_model.Par_type.erase(m_data_model.Par_type.begin()+m_data_model.i_OB);
654 m_data_model.Par_string.erase(m_data_model.Par_string.begin()+m_data_model.i_OB);
655 priors.erase(priors.begin()+m_data_model.i_OB);
657 m_data_model.get_parameter[m_data_model.i_OB_func] = [] (std::vector<double> &par,
const int idx, std::vector<statistics::PriorDistribution> prior,
const int i_prior) {
658 (void)par; (void)idx;
660 return prior[i_prior].sample(rand());
666 ErrorCBL(
"Wrong parameter declaration ("+parameter+
").",
"exclude_parameter_from_MCMC",
"Modelling_DensityProfile.cpp");
668 auto inputs = make_shared<STR_Profile_data_model>(m_data_model);
673 if (m_mass_is_derived)
676 m_model = make_shared<statistics::Model1D>(
statistics::Model1D(&
model_density, m_data_model.Par_string.size(), m_data_model.Par_type, m_data_model.Par_string, inputs));
678 WarningMsgCBL(
"New set of MCMC parameters:",
"exclude_parameter_from_MCMC",
"Modelling_DensityProfile.cpp");
679 for (
size_t i=0; i<m_data_model.Par_string.size(); i++)
680 coutCBL << m_data_model.Par_string[i] << endl;
689 shared_ptr<STR_Profile_data_model> pp = static_pointer_cast<STR_Profile_data_model>(inputs);
698 for (
size_t i=0; i<pp->Cpar.size(); ++i)
704 const double Rt = pp->get_parameter[pp->i_Rt_func](parameter, pp->i_Rt, pp->priors_excluded, pp->i_Rt_func);
705 const double f_off = pp->get_parameter[pp->i_foff_func](parameter, pp->i_foff, pp->priors_excluded, pp->i_foff_func);
706 const double sigma_off = pp->get_parameter[pp->i_sigmaoff_func](parameter, pp->i_sigmaoff, pp->priors_excluded, pp->i_sigmaoff_func);
707 const double AB_fact = pp->get_parameter[pp->i_AB_func](parameter, pp->i_AB, pp->priors_excluded, pp->i_AB_func);
708 const double OB_fact = pp->get_parameter[pp->i_OB_func](parameter, pp->i_OB, pp->priors_excluded, pp->i_OB_func);
710 const double mass = pow(pp->logM_base, parameter[pp->i_logM])*pp->mass_pivot;
713 halo_profile.
set_mass(mass * (1+OB_fact));
717 halo_profile.
set_concentration(pp->conc_func(parameter[pp->i_conc], halo_profile));
721 std::vector<double> one_halo = halo_profile.
DeltaSigma(radius);
722 std::vector<double> two_halo = pp->two_halo_func(radius, halo_profile, pp->bias_author, pp->method_Pk, pp->interp_type);
724 std::vector<double> total_profile (radius.size());
725 for (
size_t j=0; j<radius.size(); j++)
726 total_profile[j] = one_halo[j] + two_halo[j] * (1.+AB_fact);
728 return total_profile;
733 std::vector<double>
cbl::modelling::densityprofile::compute_model_density_scaling_relation (
const std::vector<double> radius,
cbl::cosmology::Cosmology cosmo,
cbl::cosmology::HaloProfile halo_profile, shared_ptr<STR_Profile_data_model> pp,
const double conc,
const double c0,
const double cM,
const double cz,
const double AB_fact,
const double OB_fact,
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)
735 auto cosmo_ptr = std::make_shared<cbl::cosmology::Cosmology>(cosmo);
738 double sqrt_Nclusters = sqrt( (pp->scaling_relation)->data_model().Nclusters[0] );
741 std::shared_ptr<void> ptr;
743 auto integrand = [&] (
const double x)
745 double mass = pow(pp->logM_base,x)*pp->mass_pivot;
748 double log_lambda = log(pp->mass_proxy/pp->proxy_pivot)/log(pp->logM_base);
749 double log_f_z = log( (pp->scaling_relation)->data_model().fz(pp->redshift, pp->redshift_pivot, cosmo_ptr) )/log(pp->logM_base);
751 double mean =
alpha + beta*log_lambda + gamma*log_f_z;
752 double scatter_intr = std::abs(scatter0 + scatterM*pow(log_lambda, scatterM_exp) + scatterz*pow(log_f_z, scatterz_exp)) / sqrt_Nclusters;
753 double P_M__lambda_z =
cbl::gaussian(x, ptr, {mean,scatter_intr});
756 double DeltaSigma = DeltaSigma_Rj_interp(mass);
758 return DeltaSigma * P_M__lambda_z;
762 double log_lambda = log(pp->mass_proxy/pp->proxy_pivot)/log(pp->logM_base);
763 double log_f_z = log( (pp->scaling_relation)->data_model().fz(pp->redshift, pp->redshift_pivot, cosmo_ptr) )/log(pp->logM_base);
765 double logM =
alpha + beta*log_lambda + gamma*log_f_z;
767 double scatter = std::abs( scatter0 + scatterM*pow(log_lambda, scatterM_exp) + scatterz*pow(log_f_z, scatterz_exp) ) / sqrt_Nclusters;
769 double min_logM = logM-3.5*scatter;
770 double max_logM = logM+3.5*scatter;
776 const std::vector<double> Mass_vector =
cbl::logarithmic_bin_vector(5, pow(pp->logM_base,min_logM)*pp->mass_pivot * (1-std::abs(OB_fact)), pow(pp->logM_base,max_logM)*pp->mass_pivot * (1+std::abs(OB_fact)));
782 double Delta = halo_profile.
Delta() / cosmo.
OmegaM(pp->redshift);
783 double DN = cosmo.
DN(pp->redshift);
785 std::vector<double> sigmaM (Mass_vector.size(), 0.);
786 for (
size_t i=0; i<sigmaM.size(); i++)
787 sigmaM[i] = sqrt( cosmo.
sigma2M(Mass_vector[i], pp->method_Pk, 0.,
false,
"test",
"Linear", 100.) );
795 std::vector<std::vector<double>> total_profile_4interp(Mass_vector.size(), std::vector<double>(radius.size()));
798 const std::vector<double> normalised_2h = pp->two_halo_func_fast(radius, halo_profile, 1., pp->method_Pk, pp->interp_type);
801 for (
size_t i=0; i<total_profile_4interp.size(); i++) {
803 double mass = Mass_vector[i] * (1+OB_fact);
805 halo_profile.
set_concentration( pp->conc_scaling_relation_func( conc, c0, cM, cz, log10(mass/pp->mass_pivot), log10((1+pp->redshift)/(1+pp->redshift_pivot)) ) );
807 double bias = cosmo.
bias_halo(mass, sigmaM_interp(mass), pp->redshift, DN, pp->bias_author,
false,
par::defaultString,
"Linear", Delta, -1, -1, 0.001, 100., 1.e-2, pp->method_Pk);
809 std::vector<double> one_halo = halo_profile.
DeltaSigma(radius);
810 std::vector<double> two_halo = normalised_2h;
812 for (
size_t j=0; j<total_profile_4interp[i].size(); j++)
813 total_profile_4interp[i][j] = one_halo[j] + two_halo[j] *
bias * (1.+AB_fact);
817 std::vector<double> total_profile(radius.size());
819 for (
size_t j=0; j<radius.size(); j++) {
822 std::vector<double> DeltaSigma_Rj_4interp(Mass_vector.size());
824 for (
size_t i=0; i<Mass_vector.size(); i++)
825 DeltaSigma_Rj_4interp[i] = total_profile_4interp[i][j];
834 return total_profile;
842 shared_ptr<STR_Profile_data_model> pp = static_pointer_cast<STR_Profile_data_model>(inputs);
851 for (
size_t i=0; i<pp->Cpar.size(); ++i)
857 const double Rt = pp->get_parameter[pp->i_Rt_func](parameter, pp->i_Rt, pp->priors_excluded, pp->i_Rt_func);
858 const double f_off = pp->get_parameter[pp->i_foff_func](parameter, pp->i_foff, pp->priors_excluded, pp->i_foff_func);
859 const double sigma_off = pp->get_parameter[pp->i_sigmaoff_func](parameter, pp->i_sigmaoff, pp->priors_excluded, pp->i_sigmaoff_func);
860 const double AB_fact = pp->get_parameter[pp->i_AB_func](parameter, pp->i_AB, pp->priors_excluded, pp->i_AB_func);
861 const double OB_fact = pp->get_parameter[pp->i_OB_func](parameter, pp->i_OB, pp->priors_excluded, pp->i_OB_func);
867 const double conc = parameter[pp->i_conc];
870 const double alpha = parameter[parameter.size()-8];
871 const double beta = parameter[parameter.size()-7];
872 const double gamma = parameter[parameter.size()-6];
873 const double scatter0 = parameter[parameter.size()-5];
874 const double scatterM = parameter[parameter.size()-4];
875 const double scatterM_exp = parameter[parameter.size()-3];
876 const double scatterz = parameter[parameter.size()-2];
877 const double scatterz_exp = parameter[parameter.size()-1];
879 return cbl::modelling::densityprofile::compute_model_density_scaling_relation(radius, cosmo, halo_profile, pp, conc, 0., 0., 0., AB_fact, OB_fact,
alpha, beta, gamma, scatter0, scatterM, scatterM_exp, scatterz, scatterz_exp);
887 shared_ptr<STR_Profile_data_model> pp = static_pointer_cast<STR_Profile_data_model>(inputs);
896 for (
size_t i=0; i<pp->Cpar.size(); ++i)
902 const double Rt = parameter[pp->Cpar.size()];
903 const double c0 = parameter[pp->Cpar.size()+1];
904 const double cM = parameter[pp->Cpar.size()+2];
905 const double cz = parameter[pp->Cpar.size()+3];
906 const double f_off = parameter[pp->Cpar.size()+4] * pow(pp->mass_proxy/pp->proxy_pivot, parameter[pp->Cpar.size()+5]) * pow((1+pp->redshift)/(1+pp->redshift_pivot), parameter[pp->Cpar.size()+6]);
907 const double sigma_off = parameter[pp->Cpar.size()+7] * pow(pp->mass_proxy/pp->proxy_pivot, parameter[pp->Cpar.size()+8]) * pow((1+pp->redshift)/(1+pp->redshift_pivot), parameter[pp->Cpar.size()+9]);
908 const double AB_fact = parameter[pp->Cpar.size()+10];
909 const double OB_fact = parameter[pp->Cpar.size()+11];
916 const double alpha = parameter[parameter.size()-8];
917 const double beta = parameter[parameter.size()-7];
918 const double gamma = parameter[parameter.size()-6];
919 const double scatter0 = parameter[parameter.size()-5];
920 const double scatterM = parameter[parameter.size()-4];
921 const double scatterM_exp = parameter[parameter.size()-3];
922 const double scatterz = parameter[parameter.size()-2];
923 const double scatterz_exp = parameter[parameter.size()-1];
925 return cbl::modelling::densityprofile::compute_model_density_scaling_relation(radius, cosmo, halo_profile, pp, 0., c0, cM, cz, AB_fact, OB_fact,
alpha, beta, gamma, scatter0, scatterM, scatterM_exp, scatterz, scatterz_exp);
#define coutCBL
CBL print message.
The class Modelling_DensityProfile.
double DN(const double redshift, const double redshift_norm=0., const double prec=1.e-4) const
the normalised amplitude of the growing mode at a given redshift,
void set_parameter(const CosmologicalParameter parameter, const double value)
set the value of one cosmological paramter
double bias_halo(const double Mass, const double redshift, const std::string author, const std::string method_SS, const bool store_output=true, const std::string output_root="test", const std::string interpType="Linear", const double Delta=200., const double kk=-1., 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)
bias of dark matter haloes
double sigma2M(const double mass, const std::string method_Pk, const double redshift, 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 bool unit1=false) const
the mass variance,
double OmegaM(const double redshift=0.) const
the matter density at a given redshift
void set_mass(const double mass=par::defaultDouble)
set the private member m_mass
void set_concentration(const double conc=par::defaultDouble)
set the private member m_concentration
std::vector< double > DeltaSigma_2h(const std::vector< double > rad, const std::string bias_author, const std::string method_Pk="EisensteinHu", const std::string interp_type="Linear", const bool NL=false)
the 2-halo contribution to the excess surface density profile of the halo, computed by assuming a hal...
std::vector< double > DeltaSigma(const std::vector< double > rad)
the total excess surface density profile of the halo.
double concentration()
get the concentration
double Delta()
get the overdensity
void set_f_off(const double f_off=par::defaultDouble)
set the private member m_f_off
void set_sigma_off(const double sigma_off=par::defaultDouble)
set the private member m_sigma_off
void set_trunc_fact(const double trunc_fact=par::defaultDouble)
set the private member m_trunc_fact
void set_cosmology(const cbl::cosmology::Cosmology cosmology)
set the cosmological model
Modelling_DensityProfile()=default
default constuctor _DensityProfile
void set_model_DensityProfile_cosmology(const std::vector< cbl::cosmology::CosmologicalParameter > cosmo_param, const std::vector< statistics::PriorDistribution > cosmo_prior, const statistics::PriorDistribution Rt_prior, const statistics::PriorDistribution concentration_prior, const statistics::PriorDistribution logM_prior, const statistics::PriorDistribution f_off_prior, const statistics::PriorDistribution sigma_off_prior, const statistics::PriorDistribution anisotropic_boost_prior, const statistics::PriorDistribution orientation_boost_prior)
Set the profile and cosmological parameters used to model the cluster density profile.
void exclude_parameter_from_MCMC(const std::string parameter)
Exclude the selected parameter from the MCMC parameter space, and randomly extract its value from the...
void set_data_model(const cbl::cosmology::Cosmology cosmology, const double redshift, const double contrast, const double logM_base, const double mass_pivot, const std::string bias_author="Tinker", const std::string method_Pk="EisensteinHu", std::string interp_type="Linear")
Set the data used to construct generic models of halo profiles.
The class Modelling_MassObservableRelation.
The class PriorDistribution.
static const std::string defaultString
default std::string value
static const double alpha
: the fine-structure constant
std::string CosmologicalParameter_name(const CosmologicalParameter parameter)
name of the cosmological parameter
std::vector< double > model_density_scaling_relation(const std::vector< double > radius, const std::shared_ptr< void > inputs, std::vector< double > ¶meter)
Compute the excess density profile model in all the radial bins. The mass is derived from the scaling...
std::vector< double > model_density(const std::vector< double > radius, const std::shared_ptr< void > inputs, std::vector< double > ¶meter)
Compute the excess density profile model in all the radial bins.
std::vector< double > model_density_scaling_relation_evolving_concentration_offcentering(const std::vector< double > radius, const std::shared_ptr< void > inputs, std::vector< double > ¶meter)
Compute the excess density profile model in all the radial bins. The mass is derived from the scaling...
std::vector< double > compute_model_density_scaling_relation(const std::vector< double > radius, cbl::cosmology::Cosmology cosmo, cbl::cosmology::HaloProfile halo_profile, std::shared_ptr< STR_Profile_data_model > pp, const double conc, const double c0, const double cM, const double cz, const double AB_fact, const double OB_fact, 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)
Compute the excess density profile model in all the radial bins when mass is derived from the scaling...
double scaling_relation(const double alpha, const double beta, const double gamma, const double div_proxy, const double f_z)
compute the mass - mass proxy scaling relation
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
@ _Gaussian_Error_
Gaussian likelihood error.
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
std::vector< T > logarithmic_bin_vector(const size_t nn, const T min, const T max)
fill a std::vector with logarithmically spaced values
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
T gaussian(T xx, std::shared_ptr< void > pp, std::vector< double > par)
the Gaussian function
void WarningMsgCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL)
internal CBL warning message