CosmoBolognaLib
Free Software C++/Python libraries for cosmological calculations
Modelling_MassObservableRelation.cpp
Go to the documentation of this file.
1 /********************************************************************
2  * Copyright (C) 2021 by Federico Marulli and Giorgio Lesci *
3  * federico.marulli3@unibo.it *
4  * *
5  * This program is free software; you can redistribute it and/or *
6  * modify it under the terms of the GNU General Public License as *
7  * published by the Free Software Foundation; either version 2 of *
8  * the License, or (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public *
16  * License along with this program; if not, write to the Free *
17  * Software Foundation, Inc., *
18  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19  ********************************************************************/
20 
39 
40 using namespace std;
41 
42 using namespace cbl;
43 
44 
45 // ===========================================================================================
46 
47 void cbl::modelling::massobsrel::Modelling_MassObservableRelation::set_data_model (const cosmology::Cosmology cosmology, const std::vector<double> redshift, const double redshift_pivot, const double proxy_pivot, const double log_base)
48 {
49  m_data_model.cosmology = make_shared<cosmology::Cosmology>(cosmology);
50  m_data_model.cosmology->set_unit(true); // Force cosmological units
51 
52  m_data_model.redshift = redshift;
53  m_data_model.redshift_pivot = redshift_pivot;
54 
55  m_data_model.proxy_pivot = proxy_pivot;
56  m_data_model.log_base = log_base;
57 }
58 
59 
60 // ===========================================================================================
61 
62 
63 void cbl::modelling::massobsrel::Modelling_MassObservableRelation::set_data_model (const cosmology::Cosmology cosmology, const std::vector<double> redshift, const double redshift_pivot, const double proxy_pivot, const double log_base, const std::vector<double> Nclusters)
64 {
65  m_data_model.cosmology = make_shared<cosmology::Cosmology>(cosmology);
66  m_data_model.cosmology->set_unit(true); // Force cosmological units
67 
68  m_data_model.redshift = redshift;
69  m_data_model.redshift_pivot = redshift_pivot;
70 
71  m_data_model.proxy_pivot = proxy_pivot;
72  m_data_model.log_base = log_base;
73 
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");
77 
78  m_isSet_Nclusters = true;
79 }
80 
81 
82 // ===========================================================================================
83 
84 
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)
86 {
87  m_data_model.Cpar = cosmo_param;
88 
89  const size_t nParams = cosmo_param.size()+8; // The total number of parameters is given by the cosmological ones + 8
90 
91  vector<statistics::ParameterType> Par_type (nParams, statistics::ParameterType::_Base_);
92  vector<string> Par_string (nParams);
93  std::vector<statistics::PriorDistribution> param_prior (nParams);
94 
95  // Set the names and priors of the cosmological parameters
96  for (size_t i=0; i<cosmo_param.size(); i++){
97  Par_string[i] = CosmologicalParameter_name(cosmo_param[i]);
98  param_prior[i] = cosmo_prior[i];
99  }
100 
101  // Set the names and priors for the mass-observable relation parameters
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;
118 
119  // set the redshift evolution function
120  if (z_evo == "E_z")
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);};
124  else
125  ErrorCBL("Wrong redshift evolution!","set_model_MassObservableRelation_cosmology","Modelling_MassObservableRelation.cpp");
126 
127  // set prior
128  m_set_prior(param_prior);
129 
130  // set the errors on z and proxy, if provided,
131  // and construct the model
132  auto inputs = make_shared<STR_MOrelation_data_model>(m_data_model);
133  if (m_isSet_Nclusters)
134  m_model = make_shared<statistics::Model1D>(statistics::Model1D(&model_scaling_relation_int, nParams, Par_type, Par_string, inputs));
135  else
136  m_model = make_shared<statistics::Model1D>(statistics::Model1D(&model_scaling_relation, nParams, Par_type, Par_string, inputs));
137 }
138 
139 
140 // ===========================================================================================
141 
142 
143 double cbl::modelling::massobsrel::scaling_relation (const double alpha, const double beta, const double gamma, const double div_proxy, const double f_z)
144 {
145  return alpha + beta * div_proxy + gamma * f_z;
146 }
147 
148 
149 // ===========================================================================================
150 
151 
152 std::vector<double> cbl::modelling::massobsrel::model_scaling_relation (const std::vector<double> proxy, const std::shared_ptr<void> inputs, std::vector<double> &parameter)
153 {
154  // structure contaning the required input data
155  shared_ptr<STR_MOrelation_data_model> pp = static_pointer_cast<STR_MOrelation_data_model>(inputs);
156 
157  // redefine the cosmology
158  cbl::cosmology::Cosmology cosmo = *pp->cosmology;
159 
160  // set the cosmological parameters
161  for (size_t i=0; i<pp->Cpar.size(); ++i)
162  cosmo.set_parameter(pp->Cpar[i], parameter[i]);
163 
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);
170  }
171 
172  return res;
173 }
174 
175 
176 // ===========================================================================================
177 
178 std::vector<double> cbl::modelling::massobsrel::model_scaling_relation_int (const std::vector<double> proxy, const std::shared_ptr<void> inputs, std::vector<double> &parameter)
179 {
180  // structure contaning the required input data
181  shared_ptr<STR_MOrelation_data_model> pp = static_pointer_cast<STR_MOrelation_data_model>(inputs);
182 
183  // redefine the cosmology
184  cbl::cosmology::Cosmology cosmo = *pp->cosmology;
185 
186  // set the cosmological parameters
187  for (size_t i=0; i<pp->Cpar.size(); ++i)
188  cosmo.set_parameter(pp->Cpar[i], parameter[i]);
189 
190  auto cosmo_ptr = std::make_shared<cbl::cosmology::Cosmology>(cosmo);
191 
192  // define the integrand
193 
194  double dummy_Nclusters, dummy_proxy_eff, dummy_z_eff;
195  std::shared_ptr<void> ptr;
196 
197  auto integrand = [&] (const std::vector<double> x)
198  {
199  // Compute P(M|lambda,z)
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);
202 
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}));
206 
207  return x[0] * P_M__lambda_z;
208  };
209 
210  // compute the model
211  std::vector<double> model(proxy.size());
212 
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];
217 
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);
220 
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];
224 
225  std::vector<std::vector<double>> integration_limits(1);
226  integration_limits[0] = {logM-3.5*sigma_intr, logM+3.5*sigma_intr};
227 
228  cbl::wrapper::cuba::CUBAwrapper CW (integrand, (int)(integration_limits.size()));
229  model[j] = CW.IntegrateVegas(integration_limits,false);
230  }
231 
232  return model;
233 }
Global functions to model number counts of any type.
The class Modelling_MassObservableRelation.
The class Cosmology.
Definition: Cosmology.h:277
void set_parameter(const CosmologicalParameter parameter, const double value)
set the value of one cosmological paramter
Definition: Cosmology.cpp:424
double HH(const double redshift=0.) const
the Hubble function
Definition: Cosmology.cpp:570
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 Model1D.
Definition: Model1D.h:60
The class PriorDistribution.
The class CUBAwrapper.
Definition: CUBAwrapper.h:187
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
Definition: Constants.h:233
std::string CosmologicalParameter_name(const CosmologicalParameter parameter)
name of the cosmological parameter
Definition: Cosmology.cpp:45
std::vector< double > model_scaling_relation(const std::vector< double > proxy, const std::shared_ptr< void > inputs, std::vector< double > &parameter)
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 > &parameter)
set the cluster scaling relation model
The global namespace of the CosmoBolognaLib
Definition: CAMB.h:38
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
Definition: Kernel.h:780
T gaussian(T xx, std::shared_ptr< void > pp, std::vector< double > par)
the Gaussian function
Definition: Func.h:1127