45 void cbl::data::Data1D_extra::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)
47 if (column_data.size()!=column_errors.size())
ErrorCBL(
"the sizes of column_data and column_errors must be equal!",
"read",
"Data1D_extra.cpp");
50 int column_data_default = column[0]+1;
53 int column_error_default = column[0]+2;
56 int column_edges_default = column[0]+3;
58 ifstream fin(input_file.c_str());
checkIO(fin, input_file);
65 const int cl_max = (column_data.size()<2) ? 1 : column_data.size();
66 for (
int cl=0; cl<cl_max; ++cl) {
70 for (
int i=0; i<skip_nlines; ++i)
75 while (getline(fin, line)) {
77 stringstream ss(line);
78 vector<double> num;
double NUM;
79 while (ss>>NUM) num.emplace_back(NUM);
83 const int ind_x = max(0, column[0]-1);
84 checkDim(num, ind_x+1,
"num",
false);
85 m_x.emplace_back(num[ind_x]);
89 const int ind_data = (column_data.size()==0) ? column_data_default : column_data[cl]-1;
90 checkDim(num, ind_data+1,
"num",
false);
91 m_data.emplace_back(num[ind_data]);
97 const size_t ind_error = (column_errors.size()==0) ? column_error_default : column_errors[cl]-1;
98 if (num.size()<ind_error+1 && column_errors.size()>1)
99 WarningMsgCBL(
"the errors cannot be retrieved from the provided input file, and will be set to 1",
"read",
"Data1D_extra.cpp");
100 m_error.emplace_back((num.size()<ind_error+1) ? 1 : num[ind_error]);
104 const size_t ind_edges = (column_edges.size()==0) ? column_edges_default-1 : column_edges[cl]-1;
105 if (num.size()>ind_edges+1) {
106 m_edges_xx.emplace_back(num[ind_edges]);
107 last_bin_edge = num[ind_edges+1];
112 for (
size_t ex=num.size()-m_extra_info.size(); ex<num.size(); ++ex)
113 m_extra_info[ind++].emplace_back(num[ex]);
118 m_edges_xx.emplace_back(last_bin_edge);
121 fin.clear(); fin.seekg(ios::beg);
123 column_data_default += 2;
124 column_error_default += 2;
127 fin.clear(); fin.close();
132 m_ndata = m_data.size();
134 m_covariance.resize(m_ndata, vector<double>(m_ndata, 0));
135 for (
int i=0; i<m_ndata; i++)
136 m_covariance[i][i] = pow(m_error[i], 2);
146 for (
size_t i=0; i<m_x.size(); ++i) {
147 coutCBL << setprecision(precision) << setw(8) << right << m_x[i]
148 <<
" " << setprecision(precision) << setw(8) << right << m_data[i]
149 <<
" " << setprecision(precision) << setw(8) << right << m_error[i];
151 for (
size_t ex=0; ex<m_extra_info.size(); ++ex)
152 coutCBL <<
" " << setprecision(precision) << setw(8) << m_extra_info[ex][i];
165 string file_out = dir+file;
166 ofstream fout(file_out.c_str());
checkIO(fout, file_out);
168 fout <<
"### "<< header <<
" ###" << endl;
170 for (
size_t i=0; i<m_x.size(); ++i) {
171 cbl::Print(m_x[i], prec, ww,
"",
" ",
false, fout);
172 cbl::Print(m_data[i], prec, ww,
"",
" ",
false, fout);
173 cbl::Print(m_error[i], prec, ww,
"",
" ",
false, fout);
174 for (
size_t ex=0; ex<m_extra_info.size(); ++ex)
175 cbl::Print(m_extra_info[ex][i], prec, ww,
"",
" ",
false, fout);
179 fout.close(); cout << endl ;
coutCBL <<
"I wrote the file: " << file_out << endl;
190 vector<double> xx, edges_xx;
191 vector<double> data, error;
192 vector<vector<double>> covariance;
193 vector<vector<double>> extra_info;
197 for (
int i=0; i<m_ndata; i++)
202 ErrorCBL(
"no elements left!",
"cut",
"Data1D_extra.cpp");
204 xx.resize(ndata_eff, 0);
205 if (m_edges_xx.size() > 0)
206 edges_xx.resize(ndata_eff, 0);
207 data.resize(ndata_eff, 0);
208 error.resize(ndata_eff, 0);
209 covariance.resize(ndata_eff, vector<double>(ndata_eff, 0));
210 extra_info.resize(m_extra_info.size(), vector<double>(ndata_eff, 0));
214 for (
int i=0; i<m_ndata; i++) {
217 if (m_edges_xx.size() > 0)
218 edges_xx[index1] = m_edges_xx[i];
219 data[index1] = m_data[i];
220 error[index1] = m_error[i];
222 for (
size_t j=0; j<m_extra_info.size(); j++)
223 extra_info[j][index1] = m_extra_info[j][i];
226 for (
int j=0; j<m_ndata; j++) {
228 covariance[index1][index2] = m_covariance[i][j];
236 if (m_edges_xx.size() > 0)
237 edges_xx.push_back(m_edges_xx[last_index1+1]);
239 shared_ptr<Data> dd = make_shared<Data1D_extra>(
Data1D_extra(xx, data, covariance, extra_info, edges_xx));
250 vector<bool> mask(m_ndata,
true);
251 for (
int i=0; i<m_ndata; i++)
252 if ((m_x[i] < xmin) || (m_x[i]>xmax))
#define coutCBL
CBL print message.
static const double defaultDouble
default double value
The global namespace of the CosmoBolognaLib
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 WarningMsgCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL)
internal CBL warning message