29 using createAxisFun = std::function<
IAxis*(std::istringstream iss)>;
31 const std::string GzipExtension =
".gz";
32 const std::string BzipExtension =
".bz2";
33 const std::string IntExtension =
".int";
34 const std::string NicosExtension =
".001";
35 const std::string TiffExtension =
".tif";
36 const std::string TiffExtension2 =
".tiff";
38 std::istringstream getAxisStringRepresentation(std::istream& input_stream)
41 std::getline(input_stream, line);
42 const std::vector<std::string> to_replace = {
",",
"\"",
"(",
")",
"[",
"]"};
44 return std::istringstream(line);
47 std::string uncompressedFilename(
const std::string& name)
50 return name.substr(0, name.size() - GzipExtension.size());
52 return name.substr(0, name.size() - BzipExtension.size());
62 IAxis* createFixedBinLikeAxis(std::istringstream iss)
66 if (!(iss >> name >> nbins))
67 throw std::runtime_error(
"createFixedBinLikeAxis() -> Error. Can't parse the string.");
69 std::vector<double> boundaries;
71 if (boundaries.size() != 2)
72 throw std::runtime_error(
"Error in createFixedBinLikeAxis: Can't parse the string while "
73 "reading boundaries.");
75 return new Axis(name, nbins, boundaries[0], boundaries[1]);
80 IAxis* createVariableBinAxis(std::istringstream iss)
84 if (!(iss >> name >> nbins))
85 throw std::runtime_error(
"Error in createVariableBinAxis: Can't parse the string.");
87 std::vector<double> boundaries;
89 if (boundaries.size() != nbins + 1)
90 throw std::runtime_error(
91 "Error in createVariableBinAxis: wrong number of boundaries read.");
98 IAxis* createPointwiseAxis(std::istringstream iss)
102 throw std::runtime_error(
"Error in createPointwiseAxis:Can't parse the string.");
104 std::vector<double> coordinates;
110 const std::vector<std::pair<std::string, createAxisFun>> type_map = {
111 {
"ConstKBinAxis", createFixedBinLikeAxis<ConstKBinAxis>},
112 {
"CustomBinAxis", createFixedBinLikeAxis<CustomBinAxis>},
113 {
"FixedBinAxis", createFixedBinLikeAxis<FixedBinAxis>},
114 {
"PointwiseAxis", createPointwiseAxis},
115 {
"VariableBinAxis", createVariableBinAxis}};
156 auto iss = getAxisStringRepresentation(input_stream);
159 throw std::runtime_error(
160 "Error in DataUtils::Format::createAxis:: couldn't read axis type from input");
162 for (
auto iter = type_map.cbegin(); iter != type_map.end(); ++iter)
163 if (iter->first == type)
164 return iter->second(std::move(iss));
165 throw std::runtime_error(
"Error in DataUtils::Format::createAxis:"
166 "Unknown axis type '"
175 while (std::getline(input_stream, line)) {
176 if (line.empty() || line[0] ==
'#')
178 std::istringstream iss(line);
179 std::vector<double> buffer;
181 for (
auto value : buffer)
182 (*data)[iout++] = value;
184 if (iout != data->
size())
185 throw std::runtime_error(
"Error while parsing data, did not reach expected end");
194 std::vector<double> result;
195 std::istringstream iss(str);
197 if (result.empty()) {
198 std::string out = str;
199 const size_t max_string_length(10);
200 if (out.size() > max_string_length)
201 out.resize(max_string_length,
' ');
203 throw std::runtime_error(
"DataUtils::Format::parse_doubles -> Error! Can't parse double "
204 "values from a string '"
214 iss.imbue(std::locale::classic());
215 std::copy(std::istream_iterator<double>(iss), std::istream_iterator<double>(),
216 back_inserter(buffer));
Defines a few helper functions.
Defines class ConstKBinAxis.
Defines class CustomBinAxis.
Defines and implements templated class Datafield.
Defines namespace FileSystemUtils.
Defines class FixedBinAxis.
Defines class PointwiseAxis.
Stores radiation power per bin.
size_t size() const
Returns total size of data buffer (product of bin number in every dimension).
Abstract base class for one-dimensional axes.
Axis containing arbitrary (non-equidistant) coordinate values. Lower boundary of the first bin and up...
Axis with variable bin size.
bool hasExtension(const std::string &path, const std::string &ref_extension)
Returns true if extension of path, converted to lower case, matches given reference extension.
void replaceItemsFromString(std::string &text, const std::vector< std::string > &items, const std::string &replacement="")
Replaces all occurrences of items from string text with delimiter.