27 std::istringstream getAxisStringRepresentation(std::istream& input_stream);
29 template <
class Axis> std::unique_ptr<IAxis> createFixedBinLikeAxis(std::istringstream iss);
30 std::unique_ptr<IAxis> createVariableBinAxis(std::istringstream iss);
31 std::unique_ptr<IAxis> createPointwiseAxis(std::istringstream iss);
33 using createAxisFun = std::function<std::unique_ptr<IAxis>(std::istringstream iss)>;
34 const std::vector<std::pair<std::string, createAxisFun>> type_map = {
35 {
"ConstKBinAxis", createFixedBinLikeAxis<ConstKBinAxis>},
36 {
"CustomBinAxis", createFixedBinLikeAxis<CustomBinAxis>},
37 {
"FixedBinAxis", createFixedBinLikeAxis<FixedBinAxis>},
38 {
"PointwiseAxis", createPointwiseAxis},
39 {
"VariableBinAxis", createVariableBinAxis}};
41 const std::string GzipExtension =
".gz";
42 const std::string BzipExtension =
".bz2";
43 const std::string IntExtension =
".int";
44 const std::string TiffExtension =
".tif";
45 const std::string TiffExtension2 =
".tiff";
69 std::string stripped_name(name);
71 stripped_name = name.substr(0, name.size() - GzipExtension.size());
73 stripped_name = name.substr(0, name.size() - BzipExtension.size());
92 auto iss = getAxisStringRepresentation(input_stream);
96 "Error in DataFormatUtils::createAxis:: couldn't read axis type from input");
98 for (
auto iter = type_map.cbegin(); iter != type_map.end(); ++iter)
99 if (iter->first == type)
100 return iter->second(std::move(iss));
102 "Unknown axis type '"
112 while (std::getline(input_stream, line)) {
113 if (line.empty() || line[0] ==
'#')
116 std::istringstream iss(line);
117 std::vector<double> buffer;
118 readLineOfDoubles(buffer, iss);
119 for (
auto value : buffer) {
124 if (it != data->
end())
126 "DataFormatUtils::fillOutputData() -> Error while parsing data.");
133 std::vector<double> result;
134 std::istringstream iss(str);
135 DataFormatUtils::readLineOfDoubles(result, iss);
136 if (result.empty()) {
137 std::string out = str;
138 const size_t max_string_length(10);
139 if (out.size() > max_string_length)
140 out.resize(max_string_length,
' ');
142 throw std::runtime_error(
"DataFormatUtils::parse_doubles -> Error! Can't parse double "
143 "values from a string '"
149 void DataFormatUtils::readLineOfDoubles(std::vector<double>& buffer, std::istringstream& iss)
151 iss.imbue(std::locale::classic());
152 std::copy(std::istream_iterator<double>(iss), std::istream_iterator<double>(),
153 back_inserter(buffer));
158 std::istringstream getAxisStringRepresentation(std::istream& input_stream)
161 std::getline(input_stream, line);
162 const std::vector<std::string> to_replace = {
",",
"\"",
"(",
")",
"[",
"]"};
164 return std::istringstream(line);
171 template <
class Axis> std::unique_ptr<IAxis> createFixedBinLikeAxis(std::istringstream iss)
175 if (!(iss >> name >> nbins))
177 "createFixedBinLikeAxis() -> Error. Can't parse the string.");
179 std::vector<double> boundaries;
180 DataFormatUtils::readLineOfDoubles(boundaries, iss);
181 if (boundaries.size() != 2)
183 "Error in createFixedBinLikeAxis: Can't parse the string while "
184 "reading boundaries.");
186 return std::make_unique<Axis>(name, nbins, boundaries[0], boundaries[1]);
191 std::unique_ptr<IAxis> createVariableBinAxis(std::istringstream iss)
195 if (!(iss >> name >> nbins))
197 "Error in createVariableBinAxis: Can't parse the string.");
199 std::vector<double> boundaries;
200 DataFormatUtils::readLineOfDoubles(boundaries, iss);
201 if (boundaries.size() != nbins + 1)
203 "Error in createVariableBinAxis: wrong number of boundaries read.");
205 return std::make_unique<VariableBinAxis>(name, nbins, boundaries);
210 std::unique_ptr<IAxis> createPointwiseAxis(std::istringstream iss)
215 "Error in createPointwiseAxis:Can't parse the string.");
217 std::vector<double> coordinates;
218 DataFormatUtils::readLineOfDoubles(coordinates, iss);
220 return std::make_unique<PointwiseAxis>(name, coordinates);
Defines class ConstKBinAxis.
Defines class CustomBinAxis.
Defines namespace FileSystemUtils.
Defines and implements template class OutputData.
Defines class PointwiseAxis.
Defines a few helper functions.
iterator end()
Returns read/write iterator that points to the one past last element.
void setAllTo(const T &value)
Sets content of output data to specific value.
iterator begin()
Returns read/write iterator that points to the first element.
std::string extension(const std::string &path)
Returns extension of given filename.
void replaceItemsFromString(std::string &text, const std::vector< std::string > &items, const std::string &replacement="")
Replaces all occurences of items from string text with delimiter.