49 m_data_model.cosmology = make_shared<cosmology::Cosmology>(cosmology);
50 m_data_model.cosmology->set_unit(
true);
52 m_data_model.redshift = redshift;
53 m_data_model.redshift_pivot = redshift_pivot;
55 m_data_model.proxy_pivot = proxy_pivot;
56 m_data_model.log_base = log_base;
65 m_data_model.cosmology = make_shared<cosmology::Cosmology>(cosmology);
66 m_data_model.cosmology->set_unit(
true);
68 m_data_model.redshift = redshift;
69 m_data_model.redshift_pivot = redshift_pivot;
71 m_data_model.proxy_pivot = proxy_pivot;
72 m_data_model.log_base = log_base;
74 m_data_model.Nclusters = Nclusters;
75 if (Nclusters.size() != redshift.size())
76 ErrorCBL(
"The vectors Nclusters and redshift must have the same size!",
"set_data_model",
"Modelling_MassObservableRelation.cpp");
78 m_isSet_Nclusters =
true;
85 void cbl::modelling::massobsrel::Modelling_MassObservableRelation::set_model_MassObservableRelation_cosmology (
const std::string z_evo,
const std::vector<cbl::cosmology::CosmologicalParameter> cosmo_param,
const std::vector<statistics::PriorDistribution> cosmo_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)
87 m_data_model.Cpar = cosmo_param;
89 const size_t nParams = cosmo_param.size()+8;
91 vector<statistics::ParameterType> Par_type (nParams, statistics::ParameterType::_Base_);
92 vector<string> Par_string (nParams);
93 std::vector<statistics::PriorDistribution> param_prior (nParams);
96 for (
size_t i=0; i<cosmo_param.size(); i++){
98 param_prior[i] = cosmo_prior[i];
102 Par_string[cosmo_param.size()] =
"alpha";
103 param_prior[cosmo_param.size()] = alpha_prior;
104 Par_string[cosmo_param.size()+1] =
"beta";
105 param_prior[cosmo_param.size()+1] = beta_prior;
106 Par_string[cosmo_param.size()+2] =
"gamma";
107 param_prior[cosmo_param.size()+2] = gamma_prior;
108 Par_string[cosmo_param.size()+3] =
"scatter0";
109 param_prior[cosmo_param.size()+3] = scatter0_prior;
110 Par_string[cosmo_param.size()+4] =
"scatterM";
111 param_prior[cosmo_param.size()+4] = scatterM_prior;
112 Par_string[cosmo_param.size()+5] =
"scatterM_exponent";
113 param_prior[cosmo_param.size()+5] = scatterM_exponent_prior;
114 Par_string[cosmo_param.size()+6] =
"scatterz";
115 param_prior[cosmo_param.size()+6] = scatterz_prior;
116 Par_string[cosmo_param.size()+7] =
"scatterz_exponent";
117 param_prior[cosmo_param.size()+7] = scatterz_exponent_prior;
121 m_data_model.fz = [] (
const double z,
const double z_piv,
const std::shared_ptr<void> cosmo) {
cbl::cosmology::Cosmology cosmology = *std::static_pointer_cast<cbl::cosmology::Cosmology>(cosmo);
return cosmology.
HH(z)/cosmology.
HH(z_piv);};
122 else if (z_evo ==
"direct")
123 m_data_model.fz = [] (
const double z,
const double z_piv,
const std::shared_ptr<void> cosmo) {(void)cosmo;
return (1+z)/(1+z_piv);};
125 ErrorCBL(
"Wrong redshift evolution!",
"set_model_MassObservableRelation_cosmology",
"Modelling_MassObservableRelation.cpp");
128 m_set_prior(param_prior);
132 auto inputs = make_shared<STR_MOrelation_data_model>(m_data_model);
133 if (m_isSet_Nclusters)
145 return alpha + beta * div_proxy + gamma * f_z;
155 shared_ptr<STR_MOrelation_data_model> pp = static_pointer_cast<STR_MOrelation_data_model>(inputs);
161 for (
size_t i=0; i<pp->Cpar.size(); ++i)
164 auto cosmo_ptr = std::make_shared<cbl::cosmology::Cosmology>(cosmo);
165 std::vector<double> res(proxy.size());
166 for (
size_t j=0; j<proxy.size(); j++) {
167 double log1 = log(proxy[j]/pp->proxy_pivot)/log(pp->log_base);
168 double log2 = log(pp->fz(pp->redshift[j], pp->redshift_pivot, cosmo_ptr))/log(pp->log_base);
169 res[j] =
scaling_relation(parameter[pp->Cpar.size()], parameter[pp->Cpar.size()+1], parameter[pp->Cpar.size()+2], log1, log2);
181 shared_ptr<STR_MOrelation_data_model> pp = static_pointer_cast<STR_MOrelation_data_model>(inputs);
187 for (
size_t i=0; i<pp->Cpar.size(); ++i)
190 auto cosmo_ptr = std::make_shared<cbl::cosmology::Cosmology>(cosmo);
194 double dummy_Nclusters, dummy_proxy_eff, dummy_z_eff;
195 std::shared_ptr<void> ptr;
197 auto integrand = [&] (
const std::vector<double> x)
200 double log_lambda = log(dummy_proxy_eff/pp->proxy_pivot)/log(pp->log_base);
201 double log_f_z = log( pp->fz(dummy_z_eff, pp->redshift_pivot, cosmo_ptr) )/log(pp->log_base);
203 double mean = parameter[pp->Cpar.size()] + parameter[pp->Cpar.size()+1]*log_lambda + parameter[pp->Cpar.size()+2]*log_f_z;
204 double sigma = parameter[pp->Cpar.size()+3] + parameter[pp->Cpar.size()+4]*pow(log_lambda, parameter[pp->Cpar.size()+5]) + parameter[pp->Cpar.size()+6]*pow(log_f_z, parameter[pp->Cpar.size()+7]);
205 double P_M__lambda_z = (
cbl::gaussian(x[0], ptr, {mean,sigma/dummy_Nclusters}));
207 return x[0] * P_M__lambda_z;
211 std::vector<double> model(proxy.size());
213 for (
size_t j=0; j<proxy.size(); j++) {
214 dummy_proxy_eff = proxy[j];
215 dummy_z_eff = pp->redshift[j];
216 dummy_Nclusters = pp->Nclusters[j];
218 double logLambda = log(proxy[j]/pp->proxy_pivot)/log(pp->log_base);
219 double logFz = log(pp->fz(pp->redshift[j], pp->redshift_pivot, cosmo_ptr))/log(pp->log_base);
221 double logM = parameter[pp->Cpar.size()] + parameter[pp->Cpar.size()+1]*logLambda + parameter[pp->Cpar.size()+2]*logFz;
222 double sigma_intr = parameter[pp->Cpar.size()+3] + parameter[pp->Cpar.size()+4]*pow(logLambda, parameter[pp->Cpar.size()+5]) + parameter[pp->Cpar.size()+6]*pow(logFz, parameter[pp->Cpar.size()+7]);
223 sigma_intr = sigma_intr/pp->Nclusters[j];
225 std::vector<std::vector<double>> integration_limits(1);
226 integration_limits[0] = {logM-3.5*sigma_intr, logM+3.5*sigma_intr};
Global functions to model number counts of any type.
The class Modelling_MassObservableRelation.
void set_parameter(const CosmologicalParameter parameter, const double value)
set the value of one cosmological paramter
double HH(const double redshift=0.) const
the Hubble function
void set_data_model(const cbl::cosmology::Cosmology cosmology, const std::vector< double > redshift, const double redshift_pivot, const double proxy_pivot, const double log_base)
Set the data used to construct the scaling relation, written as:
void set_model_MassObservableRelation_cosmology(const std::string z_evo, const std::vector< cbl::cosmology::CosmologicalParameter > cosmo_param, const std::vector< statistics::PriorDistribution > cosmo_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)
Set the scaling relation and cosmological parameters, where the scaling relation is written as.
The class PriorDistribution.
double IntegrateVegas(std::vector< std::vector< double >> integration_limits, const bool parallelize=true)
integrate using the Vegas routine
static const double alpha
: the fine-structure constant
std::string CosmologicalParameter_name(const CosmologicalParameter parameter)
name of the cosmological parameter
std::vector< double > model_scaling_relation(const std::vector< double > proxy, const std::shared_ptr< void > inputs, std::vector< double > ¶meter)
set the cluster scaling relation model
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
std::vector< double > model_scaling_relation_int(const std::vector< double > proxy, const std::shared_ptr< void > inputs, std::vector< double > ¶meter)
set the cluster scaling relation model
The global namespace of the CosmoBolognaLib
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