45 cbl::data::Data2D::Data2D (
const std::vector<double> x,
const std::vector<double> y,
const std::vector<std::vector<double>> data,
const std::vector<double> bin_edges_x,
const std::vector<double> bin_edges_y) :
Data(
DataType::
_2D_)
49 if (bin_edges_x.size()>0)
51 if (bin_edges_y.size()>0)
75 cbl::data::Data2D::Data2D (
const std::vector<double> x,
const std::vector<double> y,
const std::vector<std::vector<double>> data,
const std::vector<std::vector<double>> error,
const std::vector<double> bin_edges_x,
const std::vector<double> bin_edges_y) :
Data(
DataType::
_2D_)
79 if (bin_edges_x.size()>0)
81 if (bin_edges_y.size()>0)
111 cbl::data::Data2D::Data2D (
const std::vector<double> x,
const std::vector<double> y,
const std::vector<double> data,
const std::vector<double> error,
const std::vector<double> bin_edges_x,
const std::vector<double> bin_edges_y) :
Data(
DataType::
_2D_)
115 if (bin_edges_x.size()>0)
117 if (bin_edges_y.size()>0)
144 if (bin_edges_x.size()>0)
146 if (bin_edges_y.size()>0)
175 data.erase(data.begin(), data.end());
176 data.resize(m_xsize, vector<double>(m_ysize,0));
178 for (
int i=0; i<m_xsize; i++)
179 for (
int j=0; j< m_ysize; j++)
180 data[i][j] = this->data(i,j);
189 error.erase(error.begin(), error.end());
190 error.resize(m_xsize, vector<double>(m_ysize,0));
192 for (
int i=0; i<m_xsize; i++)
193 for (
int j=0; j< m_ysize; j++)
194 error[i][j] = this->error(i,j);
201 void cbl::data::Data2D::read (
const string input_file,
const int skip_nlines,
const vector<int> column,
const vector<int> column_data,
const vector<int> column_errors,
const vector<int> column_edges)
203 if (column_data.size()!=column_errors.size())
ErrorCBL(
"the sizes of column_data and columt_errors must be equal!",
"read",
"Data2D.cpp");
206 int column_data_default = column[1]+1;
209 int column_error_default = column[1]+2;
212 int column_edges_default = column[1]+3;
214 ifstream fin(input_file.c_str());
checkIO(fin, input_file);
221 const int cl_max = (column_data.size()<2) ? 1 : column_data.size();
222 std::vector<double> dummy_edges_xx, dummy_edges_yy;
223 for (
int cl=0; cl<cl_max; ++cl) {
227 for (
int i=0; i<skip_nlines; ++i)
236 while (getline(fin, line)) {
238 stringstream ss(line);
239 vector<double> num;
double NUM;
240 while (ss>>NUM) num.emplace_back(NUM);
242 if (num.size()<3)
ErrorCBL(
"there are less than 3 columns in the input file!",
"read",
"Data2D.cpp");
246 size_t ind_x = max(0, column[0]-1);
247 checkDim(num, ind_x+1,
"num",
false);
248 m_x.emplace_back(num[ind_x]);
252 size_t ind_y = max(0, column[1]-1);
253 checkDim(num, ind_y+1,
"num",
false);
254 m_y.emplace_back(num[ind_y]);
258 const size_t ind_data = (column_data.size()==0) ? column_data_default-1 : column_data[cl]-1;
259 checkDim(num, ind_data+1,
"num",
false);
260 m_data.emplace_back(num[ind_data]);
266 const size_t ind_error = (column_errors.size()==0) ? column_error_default-1 : column_errors[cl]-1;
267 if (num.size()<ind_error+1 && column_errors.size()>1)
268 WarningMsgCBL(
"the errors cannot be retrieved from the provided input file, and will be set to 1",
"read",
"Data1D.cpp");
269 m_error.emplace_back((num.size()<ind_error+1) ? 1 : num[ind_error]);
273 const size_t ind_edges = (column_edges.size()==0) ? column_edges_default-1 : column_edges[cl]-1;
274 if (num.size()>ind_edges+1) {
275 dummy_edges_xx.emplace_back(num[ind_edges]);
276 last_bin_edge_xx = num[ind_edges+1];
281 const size_t ind_edges_yy = (column_edges.size()==0) ? column_edges_default-1+2 : column_edges[cl]-1+2;
282 if (num.size()>ind_edges_yy+1) {
283 dummy_edges_yy.emplace_back(num[ind_edges_yy]);
284 last_bin_edge_yy = num[ind_edges_yy+1];
289 std::sort( dummy_edges_xx.begin(), dummy_edges_xx.end() );
290 dummy_edges_xx.erase( std::unique( dummy_edges_xx.begin(), dummy_edges_xx.end() ), dummy_edges_xx.end() );
291 std::sort( dummy_edges_yy.begin(), dummy_edges_yy.end() );
292 dummy_edges_yy.erase( std::unique( dummy_edges_yy.begin(), dummy_edges_yy.end() ), dummy_edges_yy.end() );
294 for (
size_t i=0; i<dummy_edges_xx.size(); i++)
295 m_edges_xx.emplace_back(dummy_edges_xx[i]);
296 m_edges_xx.emplace_back(last_bin_edge_xx);
297 for (
size_t i=0; i<dummy_edges_yy.size(); i++)
298 m_edges_yy.emplace_back(dummy_edges_yy[i]);
299 m_edges_yy.emplace_back(last_bin_edge_yy);
302 fin.clear(); fin.seekg(ios::beg);
304 column_data_default += 2;
305 column_error_default += 2;
308 fin.clear(); fin.close();
316 m_xsize = m_x.size();
317 m_ysize = m_y.size();
318 m_ndata = m_data.size();
320 m_covariance.resize(m_ndata, vector<double>(m_ndata, 0));
321 for (
int i=0; i<m_ndata; i++)
322 m_covariance[i][i] = pow(m_error[i], 2);
331 for (
int i=0; i<m_xsize; ++i)
332 for (
int j=0; j<m_ysize; ++j) {
333 int index = j+m_ysize*i;
334 coutCBL << setprecision(precision) << setw(8) << right << m_x[i]
335 <<
" " << setprecision(precision) << setw(8) << right << m_y[j]
336 <<
" " << setprecision(precision) << setw(8) << right << m_data[index]
337 <<
" " << setprecision(precision) << setw(8) << right << m_error[index] << endl;
345 void cbl::data::Data2D::write (
const string dir,
const string file,
const string header,
const bool full,
const int prec,
const int ww,
const int rank)
const
349 string file_out = dir+file;
350 ofstream fout(file_out.c_str());
checkIO(fout, file_out);
353 fout <<
"### " << header <<
" ###" << endl;
355 const int bp = cout.precision();
357 for (
int i=0; i<m_xsize; ++i)
358 for (
int j=0; j<m_ysize; ++j) {
359 int index = j+m_ysize*i;
360 cbl::Print(m_x[i], prec, ww,
"",
" ",
false, fout);
361 cbl::Print(m_y[j], prec, ww,
"",
" ",
false, fout);
362 cbl::Print(m_data[index], prec, ww,
"",
" ",
false, fout);
363 cbl::Print(m_error[index], prec, ww,
"",
"\n",
false, fout);
369 for (
int i=0; i<m_xsize; ++i)
370 for (
int j=0; j<m_ysize; ++j) {
371 int index = j+m_ysize*i;
372 cbl::Print(m_x[i], prec, ww,
"",
" ",
false, fout);
373 cbl::Print(-m_y[j], prec, ww,
"",
" ",
false, fout);
374 cbl::Print(m_data[index], prec, ww,
"",
" ",
false, fout);
375 cbl::Print(m_error[index], prec, ww,
"",
"\n",
false, fout);
378 for (
int i=0; i<m_xsize; ++i)
379 for (
int j=0; j<m_ysize; ++j) {
380 int index = j+m_ysize*i;
381 cbl::Print(-m_x[i], prec, ww,
"",
" ",
false, fout);
382 cbl::Print(-m_y[j], prec, ww,
"",
" ",
false, fout);
383 cbl::Print(m_data[index], prec, ww,
"",
" ",
false, fout);
384 cbl::Print(m_error[index], prec, ww,
"",
"\n",
false, fout);
387 for (
int i=0; i<m_xsize; ++i)
388 for (
int j=0; j<m_ysize; ++j) {
389 int index = j+m_ysize*i;
390 cbl::Print(-m_x[i], prec, ww,
"",
" ",
false, fout);
391 cbl::Print(m_y[j], prec, ww,
"",
" ",
false, fout);
392 cbl::Print(m_data[index], prec, ww,
"",
" ",
false, fout);
393 cbl::Print(m_error[index], prec, ww,
"",
"\n",
false, fout);
399 fout.close(); cout << endl;
coutCBL <<
"I wrote the file: " << file_out << endl << endl;
408 checkDim(m_covariance, m_ndata, m_ndata,
"covariance",
false);
410 string file_out = dir+file;
411 ofstream fout(file_out.c_str());
checkIO(fout, file_out);
413 fout <<
"### [1] r1 # [2] r2 # [3] r1 # [4] r2 # [5] covariance # [6] correlation # [7] index1 # [8] index2 ### " << endl;
415 for (
int i=0; i<m_xsize; ++i) {
416 for (
int j=0; j<m_ysize; ++j) {
417 for (
int k=0; k<m_xsize; ++k) {
418 for (
int l=0; l<m_ysize; ++l) {
419 int index1 = j+m_ysize*i;
420 int index2 = l+m_ysize*k;
421 fout << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << m_x[i]
422 <<
" " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << m_y[j]
423 <<
" " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << m_x[k]
424 <<
" " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << m_y[l]
425 <<
" " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << m_covariance[index1][index2]
426 <<
" " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << m_covariance[index1][index2]/sqrt(m_covariance[index1][index1]*m_covariance[index2][index2])
427 <<
" " << setiosflags(ios::fixed) << setprecision(precision) << setw(5) << right << index1
428 <<
" " << setiosflags(ios::fixed) << setprecision(precision) << setw(5) << right << index2 << endl;
434 fout.close(); cout << endl;
coutCBL <<
"I wrote the file: " << file_out << endl;
442 shared_ptr<Data>
cbl::data::Data2D::cut (
const double xmin,
const double xmax,
const double ymin,
const double ymax)
const
444 vector<bool> mask(m_ndata,
true);
445 vector<double> xx, yy, edges_xx, edges_yy;
447 for (
int i=0; i<m_xsize; i++) {
448 for (
int j=0; j<m_ysize; j++) {
449 if ( ((m_x[i] < xmin) || (m_x[i]>xmax)) || ((m_y[j] < ymin) || (m_y[j]>ymax)))
450 mask[j+m_ysize*i] =
false;
455 for (
int i=0; i<m_xsize; i++){
456 if ( !((m_x[i] < xmin) || (m_x[i]>xmax))){
457 xx.push_back(m_x[i]);
458 if (m_edges_xx.size()>0)
459 edges_xx.push_back(m_edges_xx[i]);
463 if (m_edges_xx.size()>0)
464 edges_xx.push_back(m_edges_xx[last_index+1]);
467 for (
int i=0; i<m_ysize; i++){
468 if (!((m_y[i] < ymin) || (m_y[i]>ymax))){
469 yy.push_back(m_y[i]);
470 if (m_edges_yy.size()>0)
471 edges_yy.push_back(m_edges_yy[i]);
475 if (m_edges_yy.size()>0)
476 edges_yy.push_back(m_edges_yy[last_index+1]);
478 vector<double> data, error;
479 vector<vector<double>> covariance;
480 Data::cut(mask, data, error, covariance);
482 shared_ptr<Data> dd = make_shared<Data2D>(
Data2D(xx, yy, data, covariance, edges_xx, edges_yy));
493 shared_ptr<Data> dd = make_shared<Data2D>(
Data2D(m_x, m_data, m_covariance));
#define coutCBL
CBL print message.
int m_xsize
number of points along x
void write_covariance(const std::string dir, const std::string file, const int precision=10) const override
write the covariance
std::vector< double > m_y
ordered y axis points
void write(const std::string dir, const std::string file, const std::string header, const bool full, const int prec=4, const int ww=8, const int rank=0) const
write the data
std::vector< double > m_x
ordered x axis points
Data2D()
default constructor
std::shared_ptr< Data > cut(const double xmin, const double xmax, const double ymin, const double ymax) const
cut the data
virtual void Print(const int precision=4) const override
print the data on screen
void get_error(std::vector< std::vector< double >> &error) const override
get error
int m_ysize
number of points along y
virtual void read(const std::string input_file, const int skip_nlines=0, const std::vector< int > column={1, 2}, const std::vector< int > column_data={}, const std::vector< int > column_errors={}, const std::vector< int > column_edges={}) override
read the data
std::shared_ptr< Data > as_factory()
static factory used to construct objects of class Data2D
void get_data(std::vector< std::vector< double >> &data) const override
get data
std::vector< std::vector< double > > m_covariance
covariance matrix
int m_ndata
number of data
std::vector< double > m_edges_yy
bin edges for the y variable
void cut(const std::vector< bool > mask, std::vector< double > &data, std::vector< double > &error, std::vector< std::vector< double >> &covariance_matrix) const
cut the dataset using a mask
virtual std::vector< double > data() const
get data
std::vector< double > m_error
standard deviations
std::vector< double > m_data
data values
std::vector< double > m_edges_xx
bin edges for the x variable
virtual std::vector< double > error() const
get standard deviation
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
The global namespace of the CosmoBolognaLib
std::string conv(const T val, const char *fact)
convert a number to a std::string
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
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
void checkIO(const std::ifstream &fin, const std::string file="NULL")
check if an input file can be opened
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 unique_unsorted(std::vector< int > &vv)
erase all the equal elements of the input std::vector
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
void WarningMsgCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL)
internal CBL warning message