BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
ReadWriteINT.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Device/IO/ReadWriteINT.cpp
6 //! @brief Implements class ReadWriteINT.
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
15 #include "Device/IO/ReadWriteINT.h"
16 #include "Base/Axis/Bin.h"
17 #include "Base/Axis/IAxis.h"
18 #include "Base/Util/StringUtils.h"
19 #include "Device/Data/ArrayUtils.h"
21 #include <iostream>
22 
23 Datafield* ReadWriteINT::readDatafield(std::istream& input_stream)
24 {
25  std::string line;
26 
27  std::vector<IAxis*> axes;
28  while (std::getline(input_stream, line)) {
29  line = BaseUtils::String::trim(line);
30 
31  if (line.find("axis") != std::string::npos)
32  axes.emplace_back(DataUtils::Format::createAxis(input_stream));
33 
34  if (line.find("data") != std::string::npos)
35  break;
36  }
37  // std::cout << "Read " << axes.size() << " axes" << std::endl;
38  auto* result = new Datafield(axes);
39  DataUtils::Format::fillDatafield(result, input_stream);
40  return result;
41 }
42 
43 void ReadWriteINT::writeDatafield(const Datafield& data, std::ostream& output_stream)
44 {
45  output_stream << "# BornAgain Intensity Data\n\n";
46 
47  for (size_t i = 0; i < data.rank(); ++i) {
48  std::string axis_name = std::string("axis") + std::to_string(i);
49  std::unique_ptr<IAxis> axis(data.axis(i).clone());
50  axis->setAxisName(axis_name);
51  output_stream << std::endl;
52  output_stream << "# axis-" << i << "\n";
53  output_stream << (*axis) << "\n";
54  }
55  size_t n_columns = data.axis(data.rank() - 1).size();
56 
57  output_stream << "\n# data\n";
58  writeDatafieldDoubles(data, output_stream, n_columns);
59  output_stream << std::endl;
60 }
61 
62 void ReadWriteINT::writeDatafieldDoubles(const Datafield& data, std::ostream& output_stream,
63  size_t n_columns)
64 {
65  output_stream.imbue(std::locale::classic());
66  output_stream << std::scientific << std::setprecision(12);
67  size_t ncol = 0;
68  for (size_t i = 0; i < data.size(); ++i) {
69  ncol++;
70  output_stream << ignoreDenormalized(data[i]) << " ";
71  if (ncol == n_columns) {
72  output_stream << std::endl;
73  ncol = 0;
74  }
75  }
76 }
77 
79 {
80  return (std::fpclassify(value) == FP_SUBNORMAL) ? 0.0 : value;
81 }
Defines various functions to interact from numpy on Python side.
Defines a few helper functions.
Defines structs Bin1D, Bin1DCVector.
Defines class DatafieldIOFactory.
Defines interface IAxis.
Defines ReadWriteINT.
Stores radiation power per bin.
Definition: Datafield.h:30
const IAxis & axis(size_t k) const
Definition: Datafield.cpp:91
size_t rank() const
Definition: Datafield.cpp:75
size_t size() const
Returns total size of data buffer (product of bin number in every dimension).
Definition: Datafield.cpp:80
virtual IAxis * clone() const =0
virtual size_t size() const =0
Returns the number of bins.
Datafield * readDatafield(std::istream &input_stream)
void writeDatafield(const Datafield &data, std::ostream &output_stream)
static void writeDatafieldDoubles(const Datafield &data, std::ostream &output_stream, size_t n_columns)
static double ignoreDenormalized(double value)
std::string scientific(T value, int n=10)
Returns scientific string representing given value of any numeric type.
Definition: StringUtils.h:75
std::string trim(const std::string &str, const std::string &whitespace=" \t")
Cuts any of the chars given in whitespace from start and end of str.
Definition: StringUtils.cpp:87
void fillDatafield(Datafield *data, std::istream &input_stream)
Fills output data raw buffer from input stream.
IAxis * createAxis(std::istream &input_stream)
Creates axis of certain type from input stream.