CosmoBolognaLib
Free Software C++/Python libraries for cosmological calculations
TwoPointCorrelation2D_polar.cpp
Go to the documentation of this file.
1 /********************************************************************
2  * Copyright (C) 2015 by Federico Marulli and Alfonso Veropalumbo *
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 using namespace catalogue;
44 using namespace chainmesh;
45 using namespace data;
46 using namespace pairs;
47 using namespace measure;
48 using namespace twopt;
49 
50 
51 // ============================================================================================
52 
53 
54 void cbl::measure::twopt::TwoPointCorrelation2D_polar::set_parameters (const BinType binType_rad, const double rMin, const double rMax, const int nbins_rad, const double shift_rad, const BinType binType_mu, const double muMin, const double muMax, const int nbins_mu, const double shift_mu, const CoordinateUnits angularUnits, std::function<double(double)> angularWeight, const bool compute_extra_info)
55 {
56  if (muMin<0.) ErrorCBL("mMun must be >0 !", "set_parameters", "TwoPointCorrelation2D_polar.cpp");
57  if (muMin>1.) ErrorCBL("mMun must be <1 !", "set_parameters", "TwoPointCorrelation2D_polar.cpp");
58  if (rMin<0.) ErrorCBL("rMun must be >0 !", "set_parameters", "TwoPointCorrelation2D_polar.cpp");
59 
60  if (!compute_extra_info) {
61  if (binType_rad==BinType::_logarithmic_) {
62  if (binType_mu==BinType::_logarithmic_) {
63  m_dd = move(Pair::Create(PairType::_comovingPolar_loglog_, PairInfo::_standard_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits, angularWeight));
64  }
65  else {
66  m_dd = move(Pair::Create(PairType::_comovingPolar_loglin_, PairInfo::_standard_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits, angularWeight));
67  }
68  }
69  else {
70  if (binType_mu==BinType::_logarithmic_) {
71  m_dd = move(Pair::Create(PairType::_comovingPolar_linlog_, PairInfo::_standard_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits, angularWeight));
72  }
73  else {
74  m_dd = move(Pair::Create(PairType::_comovingPolar_linlin_, PairInfo::_standard_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits, angularWeight));
75  }
76  }
77  }
78  else {
79  if (binType_rad==BinType::_logarithmic_) {
80  if (binType_mu==BinType::_logarithmic_) {
81  m_dd = move(Pair::Create(PairType::_comovingPolar_loglog_,PairInfo::_extra_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits, angularWeight));
82  }
83  else {
84  m_dd = move(Pair::Create(PairType::_comovingPolar_loglin_, PairInfo::_extra_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits, angularWeight));
85  }
86  }
87  else {
88  if (binType_mu==BinType::_logarithmic_) {
89  m_dd = move(Pair::Create(PairType::_comovingPolar_linlog_, PairInfo::_extra_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits, angularWeight));
90  }
91  else {
92  m_dd = move(Pair::Create(PairType::_comovingPolar_linlin_, PairInfo::_extra_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits, angularWeight));
93  }
94  }
95  }
96 
97 
98  if (binType_rad==BinType::_logarithmic_) {
99  if (binType_mu==BinType::_logarithmic_) {
100  m_rr = move(Pair::Create(PairType::_comovingPolar_loglog_, PairInfo::_standard_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits));
101  m_dr = move(Pair::Create(PairType::_comovingPolar_loglog_, PairInfo::_standard_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits));
102  }
103  else {
104  m_rr = move(Pair::Create(PairType::_comovingPolar_loglin_, PairInfo::_standard_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits));
105  m_dr = move(Pair::Create(PairType::_comovingPolar_loglin_, PairInfo::_standard_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits));
106  }
107  }
108  else {
109  if (binType_mu==BinType::_logarithmic_) {
110  m_rr = move(Pair::Create(PairType::_comovingPolar_linlog_, PairInfo::_standard_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits));
111  m_dr = move(Pair::Create(PairType::_comovingPolar_linlog_, PairInfo::_standard_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits));
112  }
113  else {
114  m_rr = move(Pair::Create(PairType::_comovingPolar_linlin_, PairInfo::_standard_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits));
115  m_dr = move(Pair::Create(PairType::_comovingPolar_linlin_, PairInfo::_standard_, rMin, rMax, nbins_rad, shift_rad, muMin, muMax, nbins_mu, shift_mu, angularUnits));
116  }
117  }
118 
119 }
120 
121 
122 // ============================================================================================
123 
124 
125 void cbl::measure::twopt::TwoPointCorrelation2D_polar::set_parameters (const BinType binType_rad, const double rMin, const double rMax, const double binSize_rad, const double shift_rad, const BinType binType_mu, const double muMin, const double muMax, const double binSize_mu, const double shift_mu, const CoordinateUnits angularUnits, std::function<double(double)> angularWeight, const bool compute_extra_info)
126 {
127  if (muMin<0.) ErrorCBL("mMun must be >0 !", "set_parameters", "TwoPointCorrelation2D_polar.cpp");
128  if (muMin>1.) ErrorCBL("mMun must be <1 !", "set_parameters", "TwoPointCorrelation2D_polar.cpp");
129  if (rMin<0.) ErrorCBL("rMun must be >0 !", "set_parameters", "TwoPointCorrelation2D_polar.cpp");
130 
131  if (!compute_extra_info) {
132  if (binType_rad==BinType::_logarithmic_) {
133  if (binType_mu==BinType::_logarithmic_) {
134  m_dd = move(Pair::Create(PairType::_comovingPolar_loglog_, PairInfo::_standard_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits, angularWeight));
135  }
136  else {
137  m_dd = move(Pair::Create(PairType::_comovingPolar_loglin_, PairInfo::_standard_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits, angularWeight));
138  }
139  }
140  else {
141  if (binType_mu==BinType::_logarithmic_) {
142  m_dd = move(Pair::Create(PairType::_comovingPolar_linlog_, PairInfo::_standard_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits, angularWeight));
143  }
144  else {
145  m_dd = move(Pair::Create(PairType::_comovingPolar_linlin_, PairInfo::_standard_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits, angularWeight));
146  }
147  }
148  }
149  else {
150  if (binType_rad==BinType::_logarithmic_) {
151  if (binType_mu==BinType::_logarithmic_) {
152  m_dd = move(Pair::Create(PairType::_comovingPolar_loglog_,PairInfo::_extra_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits, angularWeight));
153  }
154  else {
155  m_dd = move(Pair::Create(PairType::_comovingPolar_loglin_, PairInfo::_extra_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits, angularWeight));
156  }
157  }
158  else {
159  if (binType_mu==BinType::_logarithmic_) {
160  m_dd = move(Pair::Create(PairType::_comovingPolar_linlog_, PairInfo::_extra_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits, angularWeight));
161  }
162  else {
163  m_dd = move(Pair::Create(PairType::_comovingPolar_linlin_, PairInfo::_extra_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits, angularWeight));
164  }
165  }
166  }
167 
168 
169  if (binType_rad==BinType::_logarithmic_) {
170  if (binType_mu==BinType::_logarithmic_) {
171  m_rr = move(Pair::Create(PairType::_comovingPolar_loglog_, PairInfo::_standard_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits));
172  m_dr = move(Pair::Create(PairType::_comovingPolar_loglog_, PairInfo::_standard_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits));
173  }
174  else {
175  m_rr = move(Pair::Create(PairType::_comovingPolar_loglin_, PairInfo::_standard_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits));
176  m_dr = move(Pair::Create(PairType::_comovingPolar_loglin_, PairInfo::_standard_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits));
177  }
178  }
179  else {
180  if (binType_mu==BinType::_logarithmic_) {
181  m_rr = move(Pair::Create(PairType::_comovingPolar_linlog_, PairInfo::_standard_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits));
182  m_dr = move(Pair::Create(PairType::_comovingPolar_linlog_, PairInfo::_standard_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits));
183  }
184  else {
185  m_rr = move(Pair::Create(PairType::_comovingPolar_linlin_, PairInfo::_standard_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits));
186  m_dr = move(Pair::Create(PairType::_comovingPolar_linlin_, PairInfo::_standard_, rMin, rMax, binSize_rad, shift_rad, muMin, muMax, binSize_mu, shift_mu, angularUnits));
187  }
188  }
189 }
190 
191 
192 // ============================================================================================
193 
194 
195 void cbl::measure::twopt::TwoPointCorrelation2D_polar::read (const std::string dir, const std::string file)
196 {
197  m_dataset->read(dir+file);
198 }
199 
200 
201 // ============================================================================================
202 
203 
204 void cbl::measure::twopt::TwoPointCorrelation2D_polar::write (const std::string dir, const std::string file, const bool full, const int rank) const
205 {
206  vector<double> xx = m_dataset->xx(), yy = m_dataset->yy();
207 
208  checkDim(xx, m_dd->nbins_D1(), "rp"); checkDim(yy, m_dd->nbins_D2(), "pi");
209 
210  string header = "[1] separation at the bin centre # [2] angular separation at the bin centre # [3] 2D two-point correlation function # [4] error";
211  if (m_compute_extra_info) header += " # [5] mean separation # [6] standard deviation of the separation distribution # [7] mean angular separation # [8] standard deviation of the angular separation distribution # [9] mean redshift # [10] standard deviation of the redshift distribution";
212 
213  m_dataset->write(dir, file, header, full, 5, rank);
214 }
215 
216 
217 // ============================================================================================
218 
219 
220 void cbl::measure::twopt::TwoPointCorrelation2D_polar::measure (const ErrorType errorType, const std::string dir_output_pairs, const std::vector<std::string> dir_input_pairs, const std::string dir_output_resample, int nMocks, bool count_dd, const bool count_rr, const bool count_dr, const bool tcount, const Estimator estimator, const double fact, const int seed)
221 {
222  switch (errorType) {
223  case (ErrorType::_Poisson_) :
224  measurePoisson(dir_output_pairs, dir_input_pairs, count_dd, count_rr, count_dr, tcount, estimator, fact);
225  break;
226  case (ErrorType::_Jackknife_) :
227  measureJackknife(dir_output_pairs, dir_input_pairs, dir_output_resample, count_dd, count_rr, count_dr, tcount, estimator, fact);
228  break;
229  case (ErrorType::_Bootstrap_) :
230  measureBootstrap(nMocks, dir_output_pairs, dir_input_pairs, dir_output_resample, count_dd, count_rr, count_dr, tcount, estimator, fact, seed);
231  break;
232  default:
233  ErrorCBL("unknown type of error!", "measure", "TwoPointCorrelation2D_polar.cpp");
234  }
235 }
236 
237 
238 // ============================================================================================
239 
240 
241 void cbl::measure::twopt::TwoPointCorrelation2D_polar::measurePoisson (const std::string dir_output_pairs, const std::vector<std::string> dir_input_pairs, const bool count_dd, const bool count_rr, const bool count_dr, const bool tcount, const Estimator estimator, const double fact)
242 {
243  // ----------- count the data-data, random-random and data-random pairs, or read them from file -----------
244 
245  count_allPairs(m_twoPType, dir_output_pairs, dir_input_pairs, count_dd, count_rr, count_dr, tcount, estimator, fact);
246 
247 
248  // ----------- compute the monopole of the two-point correlation function -----------
249 
250  if (estimator==Estimator::_natural_)
251  m_dataset = correlation_NaturalEstimator(m_dd, m_rr);
252  else if (estimator==Estimator::_LandySzalay_)
253  m_dataset = correlation_LandySzalayEstimator(m_dd, m_rr, m_dr);
254  else
255  ErrorCBL("the chosen estimator is not implemented!", "measurePoisson", "TwoPointCorrelation2D_polar.cpp");
256 
257 }
258 
259 
260 // ============================================================================================
261 
262 
263 void cbl::measure::twopt::TwoPointCorrelation2D_polar::measureJackknife (const std::string dir_output_pairs, const std::vector<std::string> dir_input_pairs, const std::string dir_output_resample, const bool count_dd, const bool count_rr, const bool count_dr, const bool tcount, const Estimator estimator, const double fact)
264 {
265  if (dir_output_resample!=par::defaultString && dir_output_resample!="") {
266  string mkdir = "mkdir -p "+dir_output_resample;
267  if (system(mkdir.c_str())) {}
268  }
269 
270  vector<long> region_list = m_data->region_list();
271  size_t nRegions = region_list.size();
272 
273  vector< vector<double > > xi_SubSamples, covariance;
274 
275  vector<shared_ptr<Pair> > dd_regions, rr_regions, dr_regions;
276  count_allPairs_region(dd_regions, rr_regions, dr_regions, m_twoPType, dir_output_pairs, dir_input_pairs, count_dd, count_rr, count_dr, tcount, estimator, fact);
277 
278  vector<shared_ptr<Data> > data_SS = (estimator==Estimator::_natural_) ? XiJackknife(dd_regions, rr_regions) : XiJackknife(dd_regions, rr_regions, dr_regions);
279 
280  for (size_t i=0; i<nRegions; i++) {
281 
282  if (dir_output_resample!=par::defaultString && dir_output_resample!="") {
283  string file = "xi_Jackknife_"+conv(i, par::fINT)+".dat";
284  string header = "[1] separation at the bin centre # [2] angular separation at the bin centre # [3] 2D two-point correlation function # [4] error";
285  if (m_compute_extra_info) header += " # [5] mean separation # [6] standard deviation of the separation distribution # [7] mean angular separation # [8] standard deviation of the angular separation distribution # [9] mean redshift # [10] standard deviation of the redshift distribution";
286  data_SS[i]->write(dir_output_resample, file, header, false, 10, 0);
287  }
288 
289  xi_SubSamples.push_back(data_SS[i]->data());
290  }
291 
292  covariance_matrix(xi_SubSamples, covariance, 1);
293 
294  if (estimator==Estimator::_natural_)
295  m_dataset = correlation_NaturalEstimator(m_dd, m_rr);
296  else if (estimator==Estimator::_LandySzalay_)
297  m_dataset = correlation_LandySzalayEstimator(m_dd, m_rr, m_dr);
298  else
299  ErrorCBL("the chosen estimator is not implemented!", "measureJackknife", "TwoPointCorrelation2D_polar.cpp");
300 
301  m_dataset->set_covariance(covariance);
302 }
303 
304 
305 // ============================================================================================
306 
307 
308 void cbl::measure::twopt::TwoPointCorrelation2D_polar::measureBootstrap (const int nMocks, const std::string dir_output_pairs, const std::vector<std::string> dir_input_pairs, const std::string dir_output_resample, const bool count_dd, const bool count_rr, const bool count_dr, const bool tcount, const Estimator estimator, const double fact, const int seed)
309 {
310  if (nMocks<=0)
311  ErrorCBL("the number of mocks must be >0!", "measureBootstrap", "TwoPointCorrelation2D_polar.cpp");
312 
313  if (dir_output_resample!=par::defaultString && dir_output_resample!="") {
314  string mkdir = "mkdir -p "+dir_output_resample;
315  if (system(mkdir.c_str())) {}
316  }
317 
318  vector< vector<double > > xi_SubSamples, covariance;
319 
320  vector<shared_ptr<Pair> > dd_regions, rr_regions, dr_regions;
321  count_allPairs_region(dd_regions, rr_regions, dr_regions, m_twoPType, dir_output_pairs, dir_input_pairs, count_dd, count_rr, count_dr, tcount, estimator, fact);
322 
323  vector<shared_ptr<Data> > data_SS = (estimator==Estimator::_natural_) ? XiBootstrap(nMocks, dd_regions, rr_regions, seed) : XiBootstrap(nMocks, dd_regions, rr_regions, dr_regions, seed);
324 
325  for (int i=0; i<nMocks; i++) {
326 
327  if (dir_output_resample!=par::defaultString && dir_output_resample!="") {
328  string file = "xi_Bootstrap_"+conv(i, par::fINT)+".dat";
329  string header = "[1] separation at the bin centre # [2] angular separation at the bin centre # [3] 2D two-point correlation function # [4] error";
330  if (m_compute_extra_info) header += " # [5] mean separation # [6] standard deviation of the separation distribution # [7] mean angular separation # [8] standard deviation of the angular separation distribution # [9] mean redshift # [10] standard deviation of the redshift distribution";
331  data_SS[i]->write(dir_output_resample, file, header, false, 10, 0);
332  }
333 
334  xi_SubSamples.push_back(data_SS[i]->data());
335  }
336 
337  covariance_matrix(xi_SubSamples, covariance, 0);
338 
339 
340  if (estimator==Estimator::_natural_)
341  m_dataset = correlation_NaturalEstimator(m_dd, m_rr);
342  else if (estimator==Estimator::_LandySzalay_)
343  m_dataset = correlation_LandySzalayEstimator(m_dd, m_rr, m_dr);
344  else
345  ErrorCBL("the chosen estimator is not implemented!", "measureBootstrap", "TwoPointCorrelation2D_polar.cpp");
346 
347  m_dataset->set_covariance(covariance);
348 }
The class TwoPointCorrelation2D_polar.
void measure(const ErrorType errorType=ErrorType::_Poisson_, const std::string dir_output_pairs=par::defaultString, const std::vector< std::string > dir_input_pairs={}, const std::string dir_output_resample=par::defaultString, const int nMocks=0, const bool count_dd=true, const bool count_rr=true, const bool count_dr=true, const bool tcount=true, const Estimator estimator=Estimator::_LandySzalay_, const double fact=0.1, const int seed=3213) override
measure the 2D two-point correlation function in polar coordinates
void measurePoisson(const std::string dir_output_pairs=par::defaultString, const std::vector< std::string > dir_input_pairs={}, const bool count_dd=true, const bool count_rr=true, const bool count_dr=true, const bool tcount=true, const Estimator estimator=Estimator::_LandySzalay_, const double fact=0.1) override
measure the 2D two-point correlation function in polar coordinates, with Poisson errors
void write(const std::string dir, const std::string file, const bool full, const int rank=0) const override
write the 2D two-point correlation function
void measureJackknife(const std::string dir_output_pairs, const std::vector< std::string > dir_input_pairs={}, const std::string dir_output_resample="NULL", const bool count_dd=true, const bool count_rr=true, const bool count_dr=true, const bool tcount=true, const Estimator estimator=Estimator::_LandySzalay_, const double fact=0.1) override
measure the 2D two-point correlation function in polar coordinates, estimating the covariance with Ja...
void measureBootstrap(const int nMocks, const std::string dir_output_pairs, const std::vector< std::string > dir_input_pairs={}, const std::string dir_output_resample="NULL", const bool count_dd=true, const bool count_rr=true, const bool count_dr=true, const bool tcount=true, const Estimator estimator=Estimator::_LandySzalay_, const double fact=0.1, const int seed=3213) override
measure the 2D two-point correlation function in polar coordinates, estimating the covariance with Bo...
void set_parameters(const BinType binType_rad, const double rMin, const double rMax, const int nbins_rad, const double shift_rad, const BinType binType_mu, const double muMin, const double muMax, const int nbins_mu, const double shift_mu, const CoordinateUnits angularUnits=CoordinateUnits::_radians_, std::function< double(double)> angularWeight=nullptr, const bool compute_extra_info=false)
set the binning parameters
void read(const std::string dir, const std::string file) override
read the 2D two-point correlation function
static const char fINT[]
conversion symbol for: int -> std::string
Definition: Constants.h:121
static const std::string defaultString
default std::string value
Definition: Constants.h:336
Estimator
the two-point correlation estimator
ErrorType
the two-point correlation function error type
Definition: Measure.h:59
The global namespace of the CosmoBolognaLib
Definition: CAMB.h:38
std::string conv(const T val, const char *fact)
convert a number to a std::string
Definition: Kernel.h:903
void checkDim(const std::vector< T > vect, const int val, const std::string vector, bool equal=true)
check if the dimension of a std::vector is equal/lower than an input value
Definition: Kernel.h:1532
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
void covariance_matrix(const std::vector< std::vector< double >> mat, std::vector< std::vector< double >> &cov, const bool JK=false)
compute the covariance matrix from an input dataset
Definition: Func.cpp:761
CoordinateUnits
the coordinate units
Definition: Kernel.h:562
BinType
the binning type
Definition: Kernel.h:505