20 : mP_data(data.clone()), mP_unit_converter(unit_converter.clone())
27 if (!other.mP_data || !other.mP_unit_converter)
28 throw std::runtime_error(
"Error in SimulationResult(const SimulationResult& other): "
30 mP_data.reset(other.mP_data->clone());
31 mP_unit_converter.reset(other.mP_unit_converter->clone());
35 : mP_data(std::move(other.mP_data)), mP_unit_converter(std::move(other.mP_unit_converter))
41 if (!other.mP_data || !other.mP_unit_converter)
42 throw std::runtime_error(
"Error in SimulationResult(const SimulationResult& other): "
45 mP_data.reset(other.mP_data->clone());
46 mP_unit_converter.reset(other.mP_unit_converter->clone());
52 mP_data.reset(other.mP_data.release());
53 mP_unit_converter.reset(other.mP_unit_converter.release());
57 std::unique_ptr<OutputData<double>> SimulationResult::data(Axes::Units units)
const
60 throw std::runtime_error(
61 "Error in SimulationResult::data:Attempt to access non-initialized data");
62 return mP_unit_converter->createConvertedData(*mP_data, units);
65 Histogram2D* SimulationResult::histogram2d(Axes::Units units)
const
67 if (mP_data->getRank() != 2 || mP_unit_converter->dimension() != 2)
68 throw std::runtime_error(
"Error in SimulationResult::histogram2d: "
69 "dimension of data is not 2. Please use axis(), array() and "
70 "data() functions for 1D data.");
71 auto P_data = data(units);
77 if (!mP_unit_converter)
79 std::vector<AxisInfo> result;
80 auto dim = mP_unit_converter->dimension();
81 for (
size_t i = 0; i < dim; ++i) {
82 AxisInfo info = {mP_unit_converter->axisName(i, units),
83 mP_unit_converter->calculateMin(i, units),
84 mP_unit_converter->calculateMax(i, units)};
85 result.push_back(info);
92 if (!mP_unit_converter)
93 throw std::runtime_error(
94 "Error in SimulationResult::converter: unit converter was not initialized");
95 return *mP_unit_converter;
101 return (*mP_data)[i];
102 throw std::runtime_error(
"Error in SimulationResult::operator[]: "
103 "no data initialized");
109 return (*mP_data)[i];
110 throw std::runtime_error(
"Error in SimulationResult::operator[]: "
111 "no data initialized");
114 size_t SimulationResult::size()
const
116 return mP_data ? mP_data->getAllocatedSize() : 0;
119 #ifdef BORNAGAIN_PYTHON
122 if (!mP_data || !mP_unit_converter)
123 throw std::runtime_error(
124 "Error in SimulationResult::array: attempt to access non-initialized data");
125 return mP_unit_converter->createConvertedData(*mP_data, units)->getArray();
129 std::vector<double> SimulationResult::axis(Axes::Units units)
const
131 return axis(0, units);
134 std::vector<double> SimulationResult::axis(
size_t i_axis, Axes::Units units)
const
136 if (i_axis >= mP_unit_converter->dimension())
137 throw std::runtime_error(
138 "Error in SimulationResult::axis: no axis corresponds to passed index.");
139 auto axis = mP_unit_converter->createConvertedAxis(i_axis, units);
140 return axis->getBinCenters();
143 void SimulationResult::checkDimensions()
const
145 if (mP_data->getRank() != mP_unit_converter->dimension())
146 throw std::runtime_error(
"Error in SimulationResults::checkDimensions(): "
147 "dimensions of data and unit converter don't match");
Defines class Histogram2D.
Defines class SimulationResult.
Two dimensional histogram.
Interface to provide axis translations to different units for simulation output.
Wrapper around OutputData<double> that also provides unit conversions.
const IUnitConverter & converter() const
Returns underlying unit converter.
double & operator[](size_t i)
Data element access.
std::vector< AxisInfo > axisInfo(Axes::Units units=Axes::Units::DEFAULT) const
Provide AxisInfo for each axis and the given units.
PyObject * array(Axes::Units units=Axes::Units::DEFAULT) const
returns intensity data as Python numpy array
Information about an axis in specific units.