25 inline std::string trim(
const std::string& str,
const std::string& whitespace =
" \t")
27 const auto strBegin = str.find_first_not_of(whitespace);
29 if (strBegin == std::string::npos)
32 const auto strEnd = str.find_last_not_of(whitespace);
33 const auto strRange = strEnd - strBegin + 1;
35 return str.substr(strBegin, strRange);
37 inline bool isDoubleStartChar(
char c)
39 return isdigit(c) || c ==
'-' || c ==
'+';
43 OutputData<double>* OutputDataReadINTStrategy::readOutputData(std::istream& input_stream)
48 while (std::getline(input_stream, line)) {
50 if (line.find(
"axis") != std::string::npos) {
52 result->addAxis(*axis);
55 if (line.find(
"data") != std::string::npos) {
62 OutputData<double>* OutputDataReadReflectometryStrategy::readOutputData(std::istream& fin)
66 std::vector<std::vector<double>> vecVec;
67 std::map<double, double> QvsR;
68 std::map<double, double> QvsDR;
69 std::map<double, double> QvsDQ;
72 while (std::getline(fin, line)) {
76 vecVec.push_back(rowVec);
83 size_t nrows = vecVec.size();
85 throw std::runtime_error(
"Import1dTextData: no numerical values found");
86 size_t ncols = vecVec[0].size();
88 throw std::runtime_error(
"Import1dTextData: Minimum 2 columns required");
91 for (
size_t row = 0; row < nrows; row++) {
92 if (vecVec[row].size() != ncols)
93 throw std::runtime_error(
"The number of columns varies among the rows");
94 double Q = vecVec[row][0];
99 QvsR[Q] = vecVec[row][1];
104 QvsR[Q] = vecVec[row][1];
105 QvsDR[Q] = vecVec[row][2];
109 QvsR[Q] = vecVec[row][1];
110 QvsDR[Q] = vecVec[row][2];
111 QvsDQ[Q] = vecVec[row][3];
116 std::vector<double> qVec;
117 std::vector<double> rVec;
118 for (
auto it = QvsR.begin(); it != QvsR.end(); ++it) {
121 qVec.push_back(it->first);
122 rVec.push_back(it->second);
130 OutputData<double>* OutputDataReadNumpyTXTStrategy::readOutputData(std::istream& input_stream)
133 std::vector<std::vector<double>> data;
136 while (std::getline(input_stream, line)) {
138 if (line.empty() || !isDoubleStartChar(line[0]))
143 data.push_back(dataInRow);
150 size_t nrows = data.size();
153 ncols = data[0].size();
156 throw std::runtime_error(
"OutputDataReadNumpyTXTStrategy::readOutputData() -> Error. "
159 for (
size_t row = 0; row < nrows; row++) {
160 if (data[row].size() != ncols)
161 throw std::runtime_error(
"OutputDataReadNumpyTXTStrategy::readOutputData() -> Error. "
162 "Number of elements is different from row to row.");
167 }
else if (ncols < 2) {
168 const size_t size = data.size();
169 std::vector<double> vector1d(size);
170 for (
size_t i = 0; i < size; ++i) {
171 vector1d[i] = data[i][0];
179 #ifdef BORNAGAIN_TIFF_SUPPORT
181 OutputDataReadTiffStrategy::OutputDataReadTiffStrategy() : m_d(new TiffHandler) {}
183 OutputDataReadTiffStrategy::~OutputDataReadTiffStrategy()
188 OutputData<double>* OutputDataReadTiffStrategy::readOutputData(std::istream& input_stream)
190 m_d->read(input_stream);
191 return m_d->getOutputData()->clone();
Defines various functions to interact from numpy on Python side.
Defines IOutputDataReadStrategy and related classes.
Defines class PointwiseAxis.
Defines class TiffHandler.
void setRawDataVector(const std::vector< T > &data_vector)
Sets new values to raw data vector.
Axis containing arbitrary (non-equidistant) coordinate values.
CreateDataImpl::ReturnType< T > createData(const T &vec)
Creates OutputData array from input vector.