40 using namespace catalogue;
41 using namespace measure::numbercounts;
50 cbl::WarningMsgCBL(
"This constructor allows only a linear or logarithmic binning",
"NumberCounts1D",
"NumberCounts1D.cpp");
54 m_HistogramType = hist_type;
59 m_histogram = make_shared<glob::Histogram1D> (glob::Histogram1D ());
64 m_histogram->set(nbins, _minVar, _maxVar, shift, bin_type);
76 m_HistogramType = hist_type;
81 m_histogram = make_shared<glob::Histogram1D> (glob::Histogram1D ());
83 double _minVar = (vec_edges[0]>
par::defaultDouble) ? vec_edges[0] : m_data->Min(m_Var)*0.999;
84 double _maxVar = (vec_edges[vec_edges.size()-1]>
par::defaultDouble) ? vec_edges[vec_edges.size()-1] : m_data->Max(m_Var)*1.001;
86 const size_t nbins = vec_edges.size()-1;
87 const double shift = 0.5;
98 auto histogram = make_shared<glob::Histogram1D> (glob::Histogram1D ());
99 histogram->set(m_histogram->nbins(), m_histogram->minVar(), m_histogram->maxVar(), m_histogram->shift(), m_histogram->bin_type(), m_histogram->edges());
101 histogram->put(m_data->var(m_Var), m_data->var(catalogue::Var::_Weight_));
103 m_histogram = histogram;
105 vector<double> bins = m_histogram->bins();
106 vector<double> edges = m_histogram->edges();
107 vector<double> hist = m_histogram->operator()(m_HistogramType, m_fact);
108 vector<double> error = m_histogram->error(m_HistogramType, m_fact);
109 vector<double> counts;
110 vector<double> counts_error;
111 vector<double> normalization;
113 for (
size_t i=0; i<m_histogram->nbins(); i++) {
114 counts.push_back(m_histogram->unweighted_counts(i));
115 counts_error.push_back(sqrt(
static_cast<double>(counts[i])));
116 normalization.push_back(m_histogram->normalization(i, m_HistogramType, m_fact));
119 vector<vector<double>> extra_info (7);
120 extra_info[0] =
slice(edges, 0, m_histogram->nbins());
121 extra_info[1] =
slice(edges, 1, m_histogram->nbins()+1);
122 extra_info[2] = counts;
123 extra_info[3] = counts_error;
124 extra_info[4] = normalization;
125 extra_info[5] = m_histogram->averaged_bins();
126 extra_info[6] = m_histogram->error_bins();
128 std::vector<double> edges_in_mem_ = extra_info[0]; edges_in_mem_.emplace_back(extra_info[1][extra_info[1].size()-1]);
129 const std::vector<double> edges_in_mem = edges_in_mem_;
130 auto dataset = make_shared<data::Data1D_extra> (
data::Data1D_extra(bins, hist, error, extra_info, edges_in_mem));
141 m_dataset = m_measurePoisson();
143 const int nRegions = m_data->nRegions();
144 vector<shared_ptr<glob::Histogram>> histo_JK(nRegions);
146 for (
int i=0; i<nRegions; i++){
147 histo_JK[i] = make_shared<glob::Histogram1D>(glob::Histogram1D());
148 histo_JK[i]->set(m_histogram->nbins(), m_histogram->minVar(), m_histogram->maxVar(), m_histogram->shift(), m_histogram->bin_type(), m_histogram->edges());
151 vector<double> regions = m_data->var(catalogue::Var::_Region_);
152 vector<double> var = m_data->var(m_Var);
153 vector<double> weight = m_data->var(catalogue::Var::_Weight_);
155 for (
size_t i=0; i<var.size(); i++) {
156 int bin = m_histogram->digitize(var[i]);
157 for (
int j=0; j<nRegions; j++)
158 if (j!=regions[i] and bin>-1)
159 histo_JK[j]->put(bin, weight[i], var[i]);
165 for (
int i=0; i<nRegions; i++)
166 histo_JK[i]->write(dir_output_resample,
"Jackknife_"+
conv(i+1,
par::fINT)+
".dat", m_HistogramType, m_fact);
168 vector<vector<double>> measures(histo_JK.size(), vector<double>(histo_JK[0]->nbins()));
169 vector<vector<double>> covariance;
171 for (
size_t i=0; i<histo_JK.size(); i++)
172 for (
size_t j=0; j<histo_JK[i]->nbins(); j++)
173 measures[i][j] = histo_JK[i]->
operator()(j, m_HistogramType, m_fact);
177 m_dataset->set_covariance(covariance);
189 m_dataset = m_measurePoisson();
191 const int nRegions = m_data->nRegions();
192 vector<shared_ptr<glob::Histogram>> histo_BS(nResamplings);
195 vector<vector<int>> region_weights (nResamplings, vector<int> (nRegions, 0));
197 for (
int i=0; i<nResamplings; i++) {
198 histo_BS[i] = make_shared<glob::Histogram1D>(glob::Histogram1D());
199 histo_BS[i]->set(m_histogram->nbins(), m_histogram->minVar(), m_histogram->maxVar(), m_histogram->shift(), m_histogram->bin_type(), m_histogram->edges());
200 for (
int n=0; n<nRegions; n++)
201 region_weights[i][ran()] ++;
204 vector<double> regions = m_data->var(catalogue::Var::_Region_);
205 vector<double> var = m_data->var(m_Var);
206 vector<double> weight = m_data->var(catalogue::Var::_Weight_);
208 for (
size_t i=0; i<m_data->nObjects(); i++) {
209 int bin = m_histogram->digitize(var[i]);
211 for (
int j=0; j<nResamplings; j++)
212 histo_BS[j]->put(bin, weight[i]*region_weights[j][regions[i]], var[i]);
215 vector<vector<double>> measures(histo_BS.size(), vector<double>(histo_BS[0]->nbins()));
216 vector<vector<double>> covariance;
218 for (
size_t i=0; i<histo_BS.size(); i++)
219 for (
size_t j=0; j<histo_BS[i]->nbins(); j++)
220 measures[i][j] = histo_BS[i]->
operator()(j, m_HistogramType, m_fact);
224 m_dataset->set_covariance(covariance);
229 for (
int i=0; i<nResamplings; i++)
230 histo_BS[i]->write(dir_output_resample,
"Bootstrap_"+
conv(i+1,
par::fINT)+
".dat", m_HistogramType, m_fact);
242 case (ErrorType::_Poisson_) :
243 m_dataset = m_measurePoisson();
245 case (ErrorType::_Jackknife_) :
246 m_dataset = m_measureJackknife(dir_output_resample);
248 case (ErrorType::_Bootstrap_) :
249 m_dataset = m_measureBootstrap(dir_output_resample, nResamplings, seed);
252 ErrorCBL(
"The input ErrorType is not allowed!",
"measure",
"NumberCounts1D.cpp");
255 if (
conv) m_dataset = Gaussian_smoothing(sigma);
263 vector<vector<double>> measures(histo.size(), vector<double>(histo[0]->nbins()));
264 vector<vector<double>> cov;
266 for (
size_t i=0; i<histo.size(); i++)
267 for (
size_t j=0; j<histo[i]->nbins(); j++)
268 measures[i][j] = histo[i]->
operator()(j, m_HistogramType, m_fact);
271 m_dataset->set_covariance(cov);
282 string mkdir =
"mkdir -p "+dir;
283 if (system(mkdir.c_str())) {}
285 string header =
"bin_center histogram error lower_edge upper_edge unweighted_counts unweighted_counts_error hist_normalization ave_bin err_bin";
286 m_dataset->write(dir, file, header, 4, 8, rank);
295 string mkdir =
"mkdir -p "+dir;
296 if (system(mkdir.c_str())) {}
298 m_dataset->write_covariance(dir, file, 8);
307 coutCBL <<
"The distribution is smoothed with a Gaussian filter" << endl;
309 fftw_complex *func_tr;
311 if (m_histogram->bin_type()!=BinType::_linear_)
ErrorCBL(
"",
"Gaussian_smoothing",
"NumberCounts1D.cpp", glob::ExitCode::_workInProgress_);
313 auto histogram = make_shared<glob::Histogram1D> (glob::Histogram1D ());
314 histogram->set(m_histogram->nbins(), m_histogram->minVar(), m_histogram->maxVar(), m_histogram->shift(), m_histogram->bin_type());
316 int nbin = m_histogram->nbins();
318 int i1 = nbin*0.5, i2 = 1.5*nbin;
320 int nbinK = 0.5*nbinN+1;
322 func = fftw_alloc_real(nbinN);
323 func_tr = fftw_alloc_complex(nbinK);
325 for (
int i=0; i<nbinN; i++)
328 for (
int i=i1; i<i2; i++)
329 func[i] = m_histogram->operator()(m_HistogramType, m_fact)[i-i1];
331 for (
int i=0; i<nbinK; i++) {
336 fftw_plan real2complex;
337 real2complex = fftw_plan_dft_r2c_1d(nbinN, func, func_tr, FFTW_ESTIMATE);
338 fftw_execute(real2complex);
339 fftw_destroy_plan(real2complex);
341 double delta = (m_histogram->maxVar()-m_histogram->minVar())/nbin;
342 double SS = pow(sigma,2);
344 double fact = 2*
par::pi/(nbinN*delta);
345 for (
int i=0; i<nbinK; i++) {
347 func_tr[i][0] = func_tr[i][0]*exp(-0.5*kk*kk*SS);
348 func_tr[i][1] = func_tr[i][1]*exp(-0.5*kk*kk*SS);
351 fftw_plan complex2real;
352 complex2real = fftw_plan_dft_c2r_1d(nbinN, func_tr, func, FFTW_ESTIMATE);
353 fftw_execute(complex2real);
354 fftw_destroy_plan(complex2real);
356 vector<double> new_hist;
358 for (
int i=0; i<i2-i1; i++) new_hist.push_back(func[i+i1]/nbinN);
360 auto dataset = make_shared<data::Data1D_extra> (
data::Data1D_extra(m_histogram->bins(), new_hist, m_dataset->error(), m_dataset->extra_info()));
#define coutCBL
CBL print message.
The class NumberCounts1D.
void write(const std::string dir=par::defaultString, const std::string file=par::defaultString, const int rank=0) const override
write the measured number counts
std::shared_ptr< data::Data > m_measureJackknife(const std::string dir_output_resample=par::defaultString) override
measure the number counts with Jackknife covariance matrix
std::shared_ptr< data::Data > Gaussian_smoothing(const double sigma) override
apply a Gaussian filter to the distribution
void measure(const ErrorType errorType=ErrorType::_Poisson_, const std::string dir_output_resample=par::defaultString, const int nResamplings=0, const int seed=3213, const bool conv=false, const double sigma=0.) override
measure the number counts
void write_covariance(const std::string dir, const std::string file) const override
write the measured covariance matrix
void compute_covariance(const std::vector< std::shared_ptr< glob::Histogram >> hist, const bool JK) override
compute the covariance matrix
std::shared_ptr< data::Data > m_measureBootstrap(const std::string dir_output_resample=par::defaultString, const int nResamplings=0, const int seed=3213) override
measure the number counts with Bootstrap covariance matrix
NumberCounts1D()
default constructor
std::shared_ptr< data::Data > m_measurePoisson() override
measure the number counts with Poisson errors
static const char fINT[]
conversion symbol for: int -> std::string
static const std::string defaultString
default std::string value
static const double defaultDouble
default double value
static const double pi
: the ratio of a circle's circumference to its diameter
Var
the catalogue variables
HistogramType
the histogram type
ErrorType
the two-point correlation function error type
The global namespace of the CosmoBolognaLib
std::string conv(const T val, const char *fact)
convert a number to a std::string
std::vector< T > slice(const std::vector< T > v, const int start=0, const int end=-1)
slice a std::vector from start to stop
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
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
@ _logarithmic_
logarithmic binning
void WarningMsgCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL)
internal CBL warning message