23 const int precision{12};
25 double IgnoreDenormalized(
double value)
27 if (std::fpclassify(value) == FP_SUBNORMAL)
32 void Write2DRepresentation(
const OutputData<double>& data, std::ostream& output_stream)
37 output_stream <<
"# [nrows=" << nrows <<
", ncols=" << ncols <<
"]" << std::endl;
40 output_stream.imbue(std::locale::classic());
43 for (
size_t i = 0; i < nrows; i++) {
44 for (
size_t j = 0; j < ncols; j++) {
45 double z_value = dataArray[i][j];
46 output_stream << IgnoreDenormalized(z_value) <<
" ";
48 output_stream << std::endl;
52 void WriteOutputDataDoubles(
const OutputData<double>& data, std::ostream& output_stream,
57 output_stream.imbue(std::locale::classic());
60 while (it != data.
end()) {
62 double z_value = *it++;
63 output_stream << IgnoreDenormalized(z_value) <<
" ";
64 if (ncol == n_columns) {
65 output_stream << std::endl;
71 void Write1DRepresentation(
const OutputData<double>& data, std::ostream& output_stream)
73 output_stream <<
"# coordinates intensities" << std::endl;
74 output_stream.imbue(std::locale::classic());
77 const std::vector<double> axis_values = data.
getAxis(0).getBinCenters();
80 for (
size_t i = 0, nrows = axis_values.size(); i < nrows; ++i)
81 output_stream << axis_values[i] <<
" " << IgnoreDenormalized(data[i]) << std::endl;
90 std::ostream& output_stream)
92 output_stream <<
"# BornAgain Intensity Data\n\n";
94 for (
size_t i = 0; i < data.
getRank(); ++i) {
95 std::string axis_name = std::string(
"axis") + std::to_string(i);
97 P_axis->setName(axis_name);
98 output_stream << std::endl;
99 output_stream <<
"# axis-" << i <<
"\n";
100 output_stream << (*P_axis) <<
"\n";
104 output_stream <<
"\n# data\n";
105 WriteOutputDataDoubles(data, output_stream, n_columns);
106 output_stream << std::endl;
114 std::ostream& output_stream)
116 output_stream <<
"# BornAgain Intensity Data" << std::endl;
117 output_stream <<
"# Simple array suitable for numpy, matlab etc." << std::endl;
119 const size_t dim = data.
getRank();
122 Write1DRepresentation(data, output_stream);
125 Write2DRepresentation(data, output_stream);
128 throw std::runtime_error(
"Error in OutputDataWriteNumpyTXTStrategy::writeOutputData: data "
129 "of unsupported dimensions");
137 #ifdef BORNAGAIN_TIFF_SUPPORT
139 OutputDataWriteTiffStrategy::OutputDataWriteTiffStrategy() : m_d(new TiffHandler) {}
141 OutputDataWriteTiffStrategy::~OutputDataWriteTiffStrategy()
147 std::ostream& output_stream)
149 m_d->write(data, output_stream);
Defines various functions to interact from numpy on Python side.
Defines classes IOutputDataWriteStrategy and OutputDataWriteStreamIMA.
Defines class TiffHandler.
virtual IAxis * clone() const =0
clone function
virtual size_t size() const =0
retrieve the number of bins
iterator end()
Returns read/write iterator that points to the one past last element.
size_t getRank() const
Returns number of dimensions.
const IAxis & getAxis(size_t serial_number) const
returns axis with given serial number
iterator begin()
Returns read/write iterator that points to the first element.
decltype(auto) createVector2D(const T &data)
Creates 2D vector from OutputData.
std::string scientific(const T value, int n=10)
Returns scientific string representing given value of any numeric type.