BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
SimulationResult.cpp
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Device/Histo/SimulationResult.cpp
6 //! @brief Implements class SimulationResult.
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 
17 
19  const IUnitConverter& unit_converter)
20  : mP_data(data.clone()), mP_unit_converter(unit_converter.clone())
21 {
23 }
24 
26 {
27  if (!other.mP_data || !other.mP_unit_converter)
28  throw std::runtime_error("Error in SimulationResult(const SimulationResult& other): "
29  "not initialized");
30  mP_data.reset(other.mP_data->clone());
31  mP_unit_converter.reset(other.mP_unit_converter->clone());
32 }
33 
35  : mP_data(std::move(other.mP_data)), mP_unit_converter(std::move(other.mP_unit_converter))
36 {
37 }
38 
40 {
41  if (!other.mP_data || !other.mP_unit_converter)
42  throw std::runtime_error("Error in SimulationResult(const SimulationResult& other): "
43  "not initialized");
44 
45  mP_data.reset(other.mP_data->clone());
46  mP_unit_converter.reset(other.mP_unit_converter->clone());
47  return *this;
48 }
49 
51 {
52  mP_data.reset(other.mP_data.release());
53  mP_unit_converter.reset(other.mP_unit_converter.release());
54  return *this;
55 }
56 
57 std::unique_ptr<OutputData<double>> SimulationResult::data(Axes::Units units) const
58 {
59  if (!mP_data)
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);
63 }
64 
66 {
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);
72  return new Histogram2D(*P_data);
73 }
74 
75 std::vector<AxisInfo> SimulationResult::axisInfo(Axes::Units units) const
76 {
77  if (!mP_unit_converter)
78  return {};
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);
86  }
87  return result;
88 }
89 
91 {
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;
96 }
97 
99 {
100  if (mP_data)
101  return (*mP_data)[i];
102  throw std::runtime_error("Error in SimulationResult::operator[]: "
103  "no data initialized");
104 }
105 
106 const double& SimulationResult::operator[](size_t i) const
107 {
108  if (mP_data)
109  return (*mP_data)[i];
110  throw std::runtime_error("Error in SimulationResult::operator[]: "
111  "no data initialized");
112 }
113 
115 {
116  return mP_data ? mP_data->getAllocatedSize() : 0;
117 }
118 
119 #ifdef BORNAGAIN_PYTHON
121 {
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();
126 }
127 #endif
128 
129 std::vector<double> SimulationResult::axis(Axes::Units units) const
130 {
131  return axis(0, units);
132 }
133 
134 std::vector<double> SimulationResult::axis(size_t i_axis, Axes::Units units) const
135 {
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();
141 }
142 
144 {
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");
148 }
Defines class Histogram2D.
_object PyObject
Definition: PyObject.h:20
Defines class SimulationResult.
Two dimensional histogram.
Definition: Histogram2D.h:25
Interface to provide axis translations to different units for simulation output.
Wrapper around OutputData<double> that also provides unit conversions.
SimulationResult & operator=(const SimulationResult &other)
std::vector< double > axis(Axes::Units units=Axes::Units::DEFAULT) const
std::unique_ptr< OutputData< double > > mP_data
size_t size() const
void checkDimensions() const
const IUnitConverter & converter() const
Returns underlying unit converter.
std::unique_ptr< IUnitConverter > mP_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.
SimulationResult()=default
Histogram2D * histogram2d(Axes::Units units=Axes::Units::DEFAULT) const
PyObject * array(Axes::Units units=Axes::Units::DEFAULT) const
returns intensity data as Python numpy array
std::unique_ptr< OutputData< double > > data(Axes::Units units=Axes::Units::DEFAULT) const
Information about an axis in specific units.