46 void cbl::data::Data2D_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 std::vector<int> column_edges)
48 if (column_data.size()!=column_errors.size())
ErrorCBL(
"the sizes of column_data and columt_errors must be equal!",
"read",
"Data2D_extra.cpp");
51 int column_data_default = column[1]+1;
54 int column_error_default = column[1]+2;
57 int column_edges_default = column[1]+3;
59 ifstream fin(input_file.c_str());
checkIO(fin, input_file);
66 const int cl_max = (column_data.size()<2) ? 1 : column_data.size();
67 std::vector<double> dummy_edges_xx, dummy_edges_yy;
68 for (
int cl=0; cl<cl_max; ++cl) {
72 for (
int i=0; i<skip_nlines; ++i)
81 while (getline(fin, line)) {
83 stringstream ss(line);
84 vector<double> num;
double NUM;
85 while (ss>>NUM) num.emplace_back(NUM);
89 const int ind_x = max(0, column[0]-1);
90 checkDim(num, ind_x+1,
"num",
false);
91 m_x.emplace_back(num[ind_x]);
95 const int ind_y = max(0, column[1]-1);
96 checkDim(num, ind_y+1,
"num",
false);
97 m_y.emplace_back(num[ind_y]);
101 const int ind_data = (column_data.size()==0) ? column_data_default-1 : column_data[cl]-1;
102 checkDim(num, ind_data+1,
"num",
false);
103 m_data.emplace_back(num[ind_data]);
109 const size_t ind_error = (column_errors.size()==0) ? column_error_default-1 : column_errors[cl]-1;
110 if (num.size()<ind_error+1 && column_errors.size()>1)
111 WarningMsgCBL(
"the errors cannot be retrieved from the provided input file, and will be set to 1",
"read",
"Data2D_extra.cpp");
112 m_error.emplace_back((num.size()<ind_error+1) ? 1 : num[ind_error]);
116 const size_t ind_edges = (column_edges.size()==0) ? column_edges_default-1 : column_edges[cl]-1;
117 if (num.size()>ind_edges+1) {
118 dummy_edges_xx.emplace_back(num[ind_edges]);
119 last_bin_edge_xx = num[ind_edges+1];
124 const size_t ind_edges_yy = (column_edges.size()==0) ? column_edges_default-1+2 : column_edges[cl]-1+2;
125 if (num.size()>ind_edges_yy+1) {
126 dummy_edges_yy.emplace_back(num[ind_edges_yy]);
127 last_bin_edge_yy = num[ind_edges_yy+1];
132 for (
size_t ex=num.size()-m_extra_info.size(); ex<num.size(); ++ex)
133 m_extra_info[ind++].emplace_back(num[ex]);
136 std::sort( dummy_edges_xx.begin(), dummy_edges_xx.end() );
137 dummy_edges_xx.erase( std::unique( dummy_edges_xx.begin(), dummy_edges_xx.end() ), dummy_edges_xx.end() );
138 std::sort( dummy_edges_yy.begin(), dummy_edges_yy.end() );
139 dummy_edges_yy.erase( std::unique( dummy_edges_yy.begin(), dummy_edges_yy.end() ), dummy_edges_yy.end() );
141 for (
size_t i=0; i<dummy_edges_xx.size(); i++)
142 m_edges_xx.emplace_back(dummy_edges_xx[i]);
143 m_edges_xx.emplace_back(last_bin_edge_xx);
144 for (
size_t i=0; i<dummy_edges_yy.size(); i++)
145 m_edges_yy.emplace_back(dummy_edges_yy[i]);
146 m_edges_yy.emplace_back(last_bin_edge_yy);
149 fin.clear(); fin.seekg(ios::beg);
151 column_data_default += 2;
152 column_error_default += 2;
154 fin.clear(); fin.close();
162 m_xsize = m_x.size();
163 m_ysize = m_y.size();
164 m_ndata = m_data.size();
166 m_covariance.resize(m_ndata, vector<double>(m_ndata, 0));
167 for (
int i=0; i<m_ndata; i++)
168 m_covariance[i][i] = pow(m_error[i], 2);
177 for (
int i=0; i<m_xsize; ++i)
178 for (
int j=0; j<m_ysize; ++j) {
179 int index = j+m_ysize*i;
180 coutCBL << setprecision(precision) << setw(8) << right << m_x[i]
181 <<
" " << setprecision(precision) << setw(8) << right << m_y[j]
182 <<
" " << setprecision(precision) << setw(8) << right << m_data[index]
183 <<
" " << setprecision(precision) << setw(8) << right << m_error[index];
185 for (
size_t ex=0; ex<m_extra_info.size(); ++ex)
186 coutCBL <<
" " << setprecision(precision) << setw(8) << right << m_extra_info[ex][index];
195 void cbl::data::Data2D_extra::write (
const string dir,
const string file,
const string header,
const bool full,
const int prec,
const int ww,
const int rank)
const
199 string file_out = dir+file;
200 ofstream fout(file_out.c_str());
checkIO(fout, file_out);
203 fout <<
"### " << header <<
" ###" << endl;
205 const int bp = std::cout.precision();
207 for (
int i=0; i<m_xsize; ++i)
208 for (
int j=0; j<m_ysize; ++j) {
209 int index = j+m_ysize*i;
210 cbl::Print(m_x[i], prec, ww,
"",
" ",
false, fout);
211 cbl::Print(m_y[j], prec, ww,
"",
" ",
false, fout);
212 cbl::Print(m_data[index], prec, ww,
"",
" ",
false, fout);
213 cbl::Print(m_error[index], prec, ww,
"",
" ",
false, fout);
214 for (
size_t ex=0; ex<m_extra_info.size(); ++ex)
215 cbl::Print(m_extra_info[ex][index], prec, ww,
"",
" ",
false, fout);
222 for (
int i=0; i<m_xsize; ++i)
223 for (
int j=0; j<m_ysize; ++j) {
224 int index = j+m_ysize*i;
225 cbl::Print(m_x[i], prec, ww,
"",
" ",
false, fout);
226 cbl::Print(-m_y[j], prec, ww,
"",
" ",
false, fout);
227 cbl::Print(m_data[index], prec, ww,
"",
" ",
false, fout);
228 cbl::Print(m_error[index], prec, ww,
"",
" ",
false, fout);
229 for (
size_t ex=0; ex<m_extra_info.size(); ++ex)
230 cbl::Print(m_extra_info[ex][index], prec, ww,
"",
" ",
false, fout);
234 for (
int i=0; i<m_xsize; ++i)
235 for (
int j=0; j<m_ysize; ++j) {
236 int index = j+m_ysize*i;
237 cbl::Print(-m_x[i], prec, ww,
"",
" ",
false, fout);
238 cbl::Print(-m_y[j], prec, ww,
"",
" ",
false, fout);
239 cbl::Print(m_data[index], prec, ww,
"",
" ",
false, fout);
240 cbl::Print(m_error[index], prec, ww,
"",
" ",
false, fout);
241 for (
size_t ex=0; ex<m_extra_info.size(); ++ex)
242 cbl::Print(m_extra_info[ex][index], prec, ww,
"",
" ",
false, fout);
246 for (
int i=0; i<m_xsize; ++i)
247 for (
int j=0; j<m_ysize; ++j) {
248 int index = j+m_ysize*i;
249 cbl::Print(-m_x[i], prec, ww,
"",
" ",
false, fout);
250 cbl::Print(m_y[j], prec, ww,
"",
" ",
false, fout);
251 cbl::Print(m_data[index], prec, ww,
"",
" ",
false, fout);
252 cbl::Print(m_error[index], prec, ww,
"",
" ",
false, fout);
253 for (
size_t ex=0; ex<m_extra_info.size(); ++ex)
254 cbl::Print(m_extra_info[ex][index], prec, ww,
"",
" ",
false, fout);
259 std::cout.precision(bp);
260 fout.close(); cout << endl;
coutCBL <<
"I wrote the file: " << file_out << endl << endl;
269 vector<bool> mask(m_ndata,
true);
270 vector<double> xx, yy, edges_xx, edges_yy;
272 for (
int i=0; i<m_xsize; i++)
273 for (
int j=0; j<m_ysize; j++)
274 if (((m_x[i]<xmin) || (m_x[i]>xmax)) || ((m_y[j]<ymin) || (m_y[j]>ymax)))
275 mask[j+m_ysize*i] =
false;
278 for (
int i=0; i<m_xsize; i++){
279 if ( !((m_x[i] < xmin) || (m_x[i]>xmax))){
280 xx.push_back(m_x[i]);
281 if (m_edges_xx.size()>0)
282 edges_xx.push_back(m_edges_xx[i]);
286 if (m_edges_xx.size()>0)
287 edges_xx.push_back(m_edges_xx[last_index+1]);
290 for (
int i=0; i<m_ysize; i++){
291 if (!((m_y[i] < ymin) || (m_y[i]>ymax))){
292 yy.push_back(m_y[i]);
293 if (m_edges_yy.size()>0)
294 edges_yy.push_back(m_edges_yy[i]);
298 if (m_edges_yy.size()>0)
299 edges_yy.push_back(m_edges_yy[last_index+1]);
301 vector<double> data, error;
302 vector<vector<double>> covariance;
303 vector<vector<double>> extra_info;
307 for (
int i=0; i<m_ndata; i++)
312 ErrorCBL(
"no elements left!",
"cut",
"Data2D_extra.cpp");
314 data.resize(ndata_eff, 0);
315 error.resize(ndata_eff, 0);
316 covariance.resize(ndata_eff, vector<double>(ndata_eff, 0));
317 extra_info.resize(m_extra_info.size(), vector<double>(ndata_eff, 0));
320 for (
int i=0; i<m_ndata; i++) {
322 data[index1] = m_data[i];
323 error[index1] = m_error[i];
325 for (
size_t j=0; j<m_extra_info.size(); j++)
326 extra_info[j][index1] = m_extra_info[j][i];
329 for (
int j=0; j<m_ndata; j++) {
331 covariance[index1][index2] = m_covariance[i][j];
339 shared_ptr<Data> dd = make_shared<Data2D_extra>(
Data2D_extra(xx, yy, data, covariance, extra_info, edges_xx, edges_yy));
#define coutCBL
CBL print message.
static const std::string defaultString
default std::string value
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 unique_unsorted(std::vector< int > &vv)
erase all the equal elements of the input std::vector
void WarningMsgCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL)
internal CBL warning message