CosmoBolognaLib
Free Software C++/Python libraries for cosmological calculations
Data1D_collection.cpp
Go to the documentation of this file.
1 /********************************************************************
2  * Copyright (C) 2014 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 
34 #include "Data1D_collection.h"
35 
36 using namespace std;
37 
38 using namespace cbl;
39 using namespace data;
40 
41 
42 // ======================================================================================
43 
44 
45 cbl::data::Data1D_collection::Data1D_collection (const std::string input_file, const int skip_header)
46 {
47  set_dataType(DataType::_1D_collection_);
48  read(input_file, skip_header);
49 }
50 
51 
52 // ======================================================================================
53 
54 
55 cbl::data::Data1D_collection::Data1D_collection (const std::vector<std::string> input_files, const int skip_header)
56 {
57  set_dataType(DataType::_1D_collection_);
58  read(input_files, skip_header);
59 }
60 
61 
62 // ======================================================================================
63 
64 
65 cbl::data::Data1D_collection::Data1D_collection (const std::vector<std::vector<double>> xx, const std::vector<std::vector<double>> data)
66 {
67  set_dataType(DataType::_1D_collection_);
68 
69  m_x = xx;
70  m_ndataset = m_x.size();
71  m_xsize.resize(m_ndataset,0);
72 
73  checkDim(data, m_ndataset, "data");
74 
75  for (int i=0; i<m_ndataset; i++) {
76  m_xsize[i] = m_x[i].size();
77  checkDim(data[i], m_xsize[i], "data["+conv(i,par::fINT)+"]");
78  for (int j=0; j<m_xsize[i]; j++)
79  m_data.push_back(data[i][j]);
80  }
81 
82  m_ndata = m_data.size();
83  m_error.resize(m_ndata,0);
84 
85  int index = 0;
86  for (int i=0; i<m_ndataset; i++) {
87  vector<int> vv;
88  for (int j=0; j<m_xsize[i]; j++) {
89  vv.push_back(index);
90  index++;
91  }
92  m_index.push_back(vv);
93  }
94 }
95 
96 
97 // ======================================================================================
98 
99 
100 cbl::data::Data1D_collection::Data1D_collection (const std::vector<std::vector<double>> xx, const std::vector<std::vector<double>> data, const std::vector<std::vector<double>> covariance_matrix)
101 {
102  set_dataType(DataType::_1D_collection_);
103 
104  m_x = xx;
105  m_ndataset = m_x.size();
106  m_xsize.resize(m_ndataset,0);
107 
108  checkDim(data, m_ndataset, "data");
109 
110  for (int i=0; i<m_ndataset; i++) {
111  m_xsize[i] = m_x[i].size();
112  checkDim(data[i], m_xsize[i], "data["+conv(i, par::fINT)+"]");
113  for (int j=0; j<m_xsize[i]; j++)
114  m_data.push_back(data[i][j]);
115  }
116 
117  m_ndata = m_data.size();
118  m_error.resize(m_ndata,0);
119 
120  checkDim (covariance_matrix, m_ndata, "covariance");
121  for (int i=0; i<m_ndata; i++)
122  checkDim(covariance_matrix[i], m_ndata, "covariance["+conv(i,par::fINT)+"]");
123 
124  m_covariance = covariance_matrix;
125 
126  for (int i=0; i<m_ndata; i++)
127  m_error[i] = sqrt(m_covariance[i][i]);
128 
129  int index = 0;
130  for (int i=0; i<m_ndataset; i++) {
131  vector<int> vv;
132  for (int j=0; j<m_xsize[i]; j++) {
133  vv.push_back(index);
134  index++;
135  }
136  m_index.push_back(vv);
137  }
138 }
139 
140 
141 // ======================================================================================
142 
143 
144 cbl::data::Data1D_collection::Data1D_collection (const std::vector<std::vector<double>> xx, const std::vector<double> data, const std::vector<double> error)
145 {
146  set_dataType(DataType::_1D_collection_);
147 
148  m_x = xx;
149  m_ndataset = m_x.size();
150  m_xsize.resize(m_ndataset,0);
151 
152  int nn = 0;
153 
154  for (int i=0; i<m_ndataset; i++) {
155  m_xsize[i] = m_x[i].size();
156  nn += m_x[i].size();
157  }
158 
159  checkDim(data, nn, "data");
160 
161  m_data = data;
162  m_error = error;
163  m_ndata = m_data.size();
164 
165  m_covariance.resize(m_ndata, vector<double>(m_ndata, 0));
166  for (int i=0; i<m_ndata; i++)
167  m_covariance[i][i] = pow(m_error[i],2);
168 }
169 
170 
171 // ======================================================================================
172 
173 
174 cbl::data::Data1D_collection::Data1D_collection (const std::vector<std::vector<double>> xx, const std::vector<double> data, const std::vector<std::vector<double>> covariance_matrix)
175 {
176  set_dataType(DataType::_1D_collection_);
177 
178  m_x = xx;
179  m_ndataset = m_x.size();
180  m_xsize.resize(m_ndataset,0);
181 
182  int nn = 0;
183 
184  for (int i=0; i<m_ndataset; i++) {
185  m_xsize[i] = m_x[i].size();
186  nn += m_x[i].size();
187  }
188 
189  checkDim(data, nn, "data");
190 
191  m_data = data;
192  m_covariance = covariance_matrix;
193 
194  m_ndata = m_data.size();
195 
196 
197  m_error.resize(m_ndata, 0);
198  for (int i=0; i<m_ndata; i++)
199  m_error[i] = sqrt(m_covariance[i][i]);
200 
201 }
202 
203 
204 // ======================================================================================
205 
206 
207 void cbl::data::Data1D_collection::data (std::vector<std::vector<double>> &data) const
208 {
209  data.erase(data.begin(), data.end());
210 
211  for (int i=0; i<m_ndataset; i++) {
212  vector<double> vv(m_xsize[i], 0);
213  for (int j=0; j< m_xsize[i]; j++) {
214  vv[j] = this->data(i,j);
215  }
216  data.push_back(vv);
217  }
218 }
219 
220 
221 // ======================================================================================
222 
223 
224 void cbl::data::Data1D_collection::error (std::vector<std::vector<double>> &error) const
225 {
226  error.erase(error.begin(), error.end());
227 
228  for (int i=0; i<m_ndataset; i++) {
229  vector<double> vv(m_xsize[i], 0);
230  for (int j=0; j< m_xsize[i]; j++) {
231  vv[j] = this->error(i, j);
232  }
233  error.push_back(vv);
234  }
235 }
236 
237 
238 // ======================================================================================
239 
240 
241 void cbl::data::Data1D_collection::read (const std::string input_file, const int skip_nlines, const std::vector<int> column, const std::vector<int> column_data, const std::vector<int> column_errors, const std::vector<int> column_edges)
242 {
243  (void)column; (void)column_data; (void)column_errors; (void)column_edges;
244  WarningMsgCBL("column, column_data, column_errors, column_edges are not used in the current implementation", "read", "Data1D_collection.cpp");
245 
246  ifstream fin(input_file.c_str()); checkIO(fin, input_file);
247  string line;
248 
249  if (skip_nlines>0)
250  for (int i=0; i<skip_nlines; ++i)
251  getline(fin, line);
252 
253  vector<vector<double>> table, tr_table;
254  while (getline(fin, line)) {
255  stringstream ss(line); double NUM=par::defaultDouble;
256  vector<double> vv;
257  while(NUM>par::defaultDouble)
258  vv.push_back(NUM);
259  table.push_back(vv);
260  }
261 
262  fin.clear(); fin.close();
263 
264  tr_table = table;
265 
266  for (size_t i=0; i<table.size(); i++)
267  for (size_t j=0; j<table[i].size(); j++)
268  tr_table[i][j] = table[j][i];
269 
270  m_ndataset = (tr_table.size()-1)/2;
271  m_xsize.resize(m_ndataset,0);
272 
273  for (int i=0; i<m_ndataset; i++) {
274  m_x.push_back(tr_table[0]);
275  m_xsize[i]=m_x[i].size();
276 
277  for (int j=0; j<m_xsize[i]; j++) {
278  m_data.push_back(tr_table[2*i+1][j]);
279  m_error.push_back(tr_table[2*i+2][j]);
280  }
281  }
282 
283  m_ndata = m_data.size();
284 
285  m_covariance.resize(m_ndata, vector<double>(m_ndata,0));
286  for (int i=0; i<m_ndata; i++)
287  m_covariance[i][i] = pow(m_error[i],2);
288 
289  int index = 0;
290  for (int i=0; i<m_ndataset; i++) {
291  vector<int> vv;
292  for (int j=0; j<m_xsize[i]; j++) {
293  vv.push_back(index);
294  index++;
295  }
296  m_index.push_back(vv);
297  }
298 }
299 
300 
301 // ======================================================================================
302 
303 
304 void cbl::data::Data1D_collection::read (const std::vector<std::string> input_file, const int skip_nlines, const std::vector<int> column, const std::vector<int> column_data, const std::vector<int> column_errors, const std::vector<int> column_edges)
305 {
306  (void)column; (void)column_data; (void)column_errors; (void)column_edges;
307  WarningMsgCBL("column, column_data, column_errors, column_edges are not used in the current implementation", "read", "Data1D_collection.cpp");
308 
309  m_ndataset = input_file.size();
310  m_xsize.resize(m_ndataset,0);
311 
312  for (int i=0; i<m_ndataset; i++) {
313  ifstream fin(input_file[i].c_str()); checkIO(fin, input_file[i]);
314  string line;
315 
316  if (skip_nlines>0)
317  for (int j=0; j<skip_nlines; ++j)
318  getline(fin, line);
319 
320  vector<double> xx, data, error;
321 
322  while (getline(fin, line)) {
323  stringstream ss(line); double NUM;
324  ss>>NUM; xx.push_back(NUM);
325  ss>>NUM; data.push_back(NUM);
326  ss>>NUM; error.push_back(NUM);
327  }
328 
329  m_x.push_back(xx);
330  for (size_t j=0; j<data.size(); j++) {
331  m_data.push_back(data[j]);
332  m_error.push_back(error[j]);
333  }
334  fin.clear(); fin.close();
335 
336  m_xsize[i]=m_x.size();
337  }
338 
339  m_ndata = m_data.size();
340 
341  m_covariance.resize(m_ndata, vector<double>(m_ndata,0));
342  for (int i=0; i<m_ndata; i++)
343  m_covariance[i][i] = pow(m_error[i],2);
344 
345  int index = 0;
346  for (int i=0; i<m_ndataset; i++) {
347  vector<int> vv;
348  for (int j=0; j<m_xsize[i]; j++) {
349  vv.push_back(index);
350  index++;
351  }
352  m_index.push_back(vv);
353  }
354 }
355 
356 
357 // ======================================================================================
358 
359 
360 void cbl::data::Data1D_collection::Print (const int precision) const
361 {
362  const int ndata = m_xsize[0];
363 
364  for (int i=1; i<m_ndataset; i++)
365  checkEqual(m_x[0], m_x[i]);
366 
367  for (int i=0; i<ndata; i++) {
368  coutCBL << setprecision(precision) << setw(8) << right << m_x[0][i] << " ";
369  for (int j=0; j<m_ndataset; j++)
370  coutCBL << setprecision(precision) << setw(8) << right << m_data[m_index[j][i]]
371  << " " << setprecision(precision) << setw(8) << right << m_error[m_index[j][i]] << " ";
372  cout << endl;
373  }
374 }
375 
376 
377 // ======================================================================================
378 
379 
380 void cbl::data::Data1D_collection::write (const std::string dir, const std::string file, const std::string header, const int prec, const int ww, const int rank) const
381 {
382  (void)rank;
383 
384  const int ndata = m_xsize[0];
385 
386  for (int i=1; i<m_ndataset; i++)
387  checkEqual(m_x[0], m_x[i]);
388 
389  string file_out = dir+file;
390 
391  ofstream fout(file_out.c_str()); checkIO(fout, file_out);
392  if (header!=par::defaultString)
393  fout << "### "<< header <<" ###" << endl;
394 
395  const int bp = cout.precision();
396 
397  for (int i=0; i<ndata; i++) {
398  cbl::Print(m_x[0][i], prec, ww, "", " ", false, fout);
399  for (int j=0; j<m_ndataset; j++) {
400  cbl::Print(m_data[m_index[j][i]], prec, ww, "", " ", false, fout);
401  cbl::Print(m_error[m_index[j][i]], prec, ww, "", "\n", false, fout);
402  }
403  }
404 
405  cout.precision(bp);
406  fout.close(); cout << endl; coutCBL << "I wrote the file: " << file_out << endl;
407 }
408 
409 
410 // ======================================================================================
411 
412 
413 void cbl::data::Data1D_collection::write (const std::string dir, const std::vector<std::string> files, const std::string header, const int prec, const int ww, const int rank) const
414 {
415  (void)rank;
416 
417  checkDim(files, m_ndataset, "files");
418 
419  for (int i=0; i<m_ndataset; i++) {
420  string file_out =dir+files[i];
421  ofstream fout(file_out.c_str()); checkIO(fout, file_out);
422 
423  if (header!=par::defaultString)
424  fout << "### "<< header <<" ###" << endl;
425 
426  const int bp = cout.precision();
427 
428  for (int j=0; j<m_xsize[i]; j++){
429  cbl::Print(m_x[i][j], prec, ww, "", " ", false, fout);
430  cbl::Print(m_data[m_index[i][j]], prec, ww, "", " ", false, fout);
431  cbl::Print(m_error[m_index[i][j]], prec, ww, "", "\n", false, fout);
432  }
433 
434  cout.precision(bp);
435  fout.close(); cout << endl; coutCBL << "I wrote the file: " << file_out << endl;
436  }
437 
438 }
439 
440 
441 // ======================================================================================
442 
443 
444 shared_ptr<Data> cbl::data::Data1D_collection::cut (const int dataset, const double xmin, const double xmax) const
445 {
446  vector<double> vxmin(m_ndataset, -1), vxmax(m_ndataset, -1);
447 
448  vxmin[dataset] = xmin; vxmax[dataset] = xmax;
449 
450  vector<bool> mask(m_ndata, true);
451  vector<vector<double>> xx;
452 
453  for (int i=0; i<m_ndataset; i++) {
454  vector<double> vv;
455  for (int j=0; j<m_xsize[i]; j++) {
456  if ( (m_x[i][j] < vxmin[i]) || (m_x[i][j]>vxmax[i]))
457  mask[m_index[i][j]] = false;
458  else
459  vv.push_back(m_x[i][j]);
460  }
461  if (vv.size()>0)
462  xx.push_back(vv);
463  }
464 
465  checkDim(xx, 1, "x");
466 
467  vector<double> data, error;
468  vector<vector<double>> covariance;
469  Data::cut(mask, data, error, covariance);
470 
471  checkDim(xx[0], data.size(), "x");
472 
473  shared_ptr<Data> dd = make_shared<Data1D>(Data1D(xx[0], data, covariance));
474 
475  return dd;
476 }
477 
478 
479 // ======================================================================================
480 
481 
482 shared_ptr<Data> cbl::data::Data1D_collection::cut (const std::vector<double> xmin, const std::vector<double> xmax) const
483 {
484  checkDim(xmin, m_ndataset, "xmin");
485  checkDim(xmax, m_ndataset, "xmax");
486 
487  vector<bool> mask(m_ndata, true);
488  vector<vector<double>> xx;
489 
490  for (int i=0; i<m_ndataset; i++) {
491  vector<double> vv;
492  for (int j=0; j<m_xsize[i]; j++) {
493  if ( (m_x[i][j] < xmin[i]) || (m_x[i][j]>xmax[i]))
494  mask[m_index[i][j]] = false;
495  else
496  vv.push_back(m_x[i][j]);
497  }
498  if (vv.size()>0)
499  xx.push_back(vv);
500  }
501 
502  vector<double> data, error;
503  vector<vector<double>> covariance;
504  Data::cut(mask, data, error, covariance);
505 
506  vector<vector<double>> data2;
507 
508  int index = 0;
509  for (size_t i=0; i<xx.size(); i++) {
510  vector<double> vv(xx[i].size(),0);
511  for (size_t j=0; j<xx[i].size(); j++) {
512  vv[j] = data[index];
513  index++;
514  }
515  data2.push_back(vv);
516  }
517 
518  shared_ptr<Data> dd = make_shared<Data1D_collection>(Data1D_collection(xx, data2, covariance));
519 
520  return dd;
521 }
522 
523 
524 // ======================================================================================
525 
526 
527 void cbl::data::Data1D_collection::write_covariance (const string dir, const string file, const int precision) const
528 {
529  checkDim(m_covariance, m_ndata, m_ndata, "covariance", false);
530 
531  string file_out = dir+file;
532  ofstream fout(file_out.c_str()); checkIO(fout, file_out);
533 
534  fout << "### # [1] dataset1 # [2] dataset2 # [3] r1 # [4] r2 # [5] covariance # [6] correlation # [7] index1 # [8] index2 ### " << endl;
535 
536  int index1 = 0, index2= 0;
537 
538  for (int i=0; i<m_ndataset; i++)
539  for (int j=0; j<m_ndataset; j++)
540  for (int m=0; m<m_xsize[i]; m++)
541  for (int n=0; n<m_xsize[j]; n++) {
542  index1 = m_index[i][m];
543  index2 = m_index[j][n];
544  fout << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << i
545  << " " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << j
546  << " " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << m_x[i][m]
547  << " " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << m_x[j][n]
548  << " " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << m_covariance[index1][index2]
549  << " " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << m_covariance[index1][index2]/sqrt(m_covariance[index1][index1]*m_covariance[index2][index2])
550  << " " << setiosflags(ios::fixed) << setprecision(precision) << setw(5) << right << index1
551  << " " << setiosflags(ios::fixed) << setprecision(precision) << setw(5) << right << index2 << endl;
552  }
553 
554  fout.close(); cout << endl; coutCBL << "I wrote the file: " << file_out << endl;
555 }
The class Data1D_collection.
#define coutCBL
CBL print message.
Definition: Kernel.h:734
The class Data1D_collection.
virtual void Print(const int precision=4) const override
print the data on screen
std::shared_ptr< Data > cut(const int dataset, const double xmin, const double xmax) const override
cut the data, for Data1D_collection
void write(const std::string dir, const std::string file, const std::string header, const int prec=4, const int ww=8, const int rank=0) const override
write the data
Data1D_collection()
default constructor
void write_covariance(const std::string dir, const std::string file, const int precision=10) const override
write the interval variable m_covariance on a file,
void read(const std::string input_file, const int skip_nlines=0, const std::vector< int > column={1}, const std::vector< int > column_data={}, const std::vector< int > column_errors={}, const std::vector< int > column_edges={}) override
read the data
The class Data1D.
Definition: Data1D.h:51
virtual std::vector< double > data() const
get data
Definition: Data.h:376
virtual std::vector< double > error() const
get standard deviation
Definition: Data.h:389
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
static const double defaultDouble
default double value
Definition: Constants.h:348
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 Print(const T value, const int prec, const int ww, const std::string header="", const std::string end="\n", const bool use_coutCBL=true, std::ostream &stream=std::cout, const std::string colour=cbl::par::col_default)
function to print values with a proper homegenised format
Definition: Kernel.h:1142
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
void checkIO(const std::ifstream &fin, const std::string file="NULL")
check if an input file can be opened
Definition: Kernel.cpp:160
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
void checkEqual(const std::vector< T > vect1, const std::vector< T > vect2)
check if two std::vectors are equal
Definition: Kernel.h:1587
void WarningMsgCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL)
internal CBL warning message
Definition: Kernel.h:747