BornAgain  1.19.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 reflection and scattering
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  : m_data(data.clone()), m_unit_converter(unit_converter.clone())
21 {
23 }
24 
26 {
27  if (!other.m_data || !other.m_unit_converter)
28  throw std::runtime_error("Error in SimulationResult(const SimulationResult& other): "
29  "not initialized");
30  m_data.reset(other.m_data->clone());
31  m_unit_converter.reset(other.m_unit_converter->clone());
32 }
33 
35  : m_data(std::move(other.m_data)), m_unit_converter(std::move(other.m_unit_converter))
36 {
37 }
38 
40 {
41  if (!other.m_data || !other.m_unit_converter)
42  throw std::runtime_error("Error in SimulationResult(const SimulationResult& other): "
43  "not initialized");
44 
45  m_data.reset(other.m_data->clone());
46  m_unit_converter.reset(other.m_unit_converter->clone());
47  return *this;
48 }
49 
51 {
52  m_data.reset(other.m_data.release());
53  m_unit_converter.reset(other.m_unit_converter.release());
54  return *this;
55 }
56 
57 std::unique_ptr<OutputData<double>> SimulationResult::data(Axes::Units units) const
58 {
59  if (!m_data)
60  throw std::runtime_error(
61  "Error in SimulationResult::data:Attempt to access non-initialized data");
62  return m_unit_converter->createConvertedData(*m_data, units);
63 }
64 
66 {
67  if (m_data->rank() != 2 || m_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 (!m_unit_converter)
78  return {};
79  std::vector<AxisInfo> result;
80  auto dim = m_unit_converter->dimension();
81  for (size_t i = 0; i < dim; ++i) {
82  AxisInfo info = {m_unit_converter->axisName(i, units),
83  m_unit_converter->calculateMin(i, units),
84  m_unit_converter->calculateMax(i, units)};
85  result.push_back(info);
86  }
87  return result;
88 }
89 
91 {
93  return *m_unit_converter;
94 }
95 
97 {
98  ASSERT(m_data);
99  return (*m_data)[i];
100 }
101 
102 const double& SimulationResult::operator[](size_t i) const
103 {
104  ASSERT(m_data);
105  return (*m_data)[i];
106 }
107 
109 {
110  return m_data ? m_data->getAllocatedSize() : 0;
111 }
112 
113 double SimulationResult::max() const
114 {
115  ASSERT(m_data);
116  double result = 0;
117  for (size_t i = 0; i < size(); ++i)
118  if ((*m_data)[i] > result)
119  result = (*m_data)[i];
120  return result;
121 }
122 
123 #ifdef BORNAGAIN_PYTHON
125 {
126  if (!m_data || !m_unit_converter)
127  throw std::runtime_error(
128  "Error in SimulationResult::array: attempt to access non-initialized data");
129  return m_unit_converter->createConvertedData(*m_data, units)->getArray();
130 }
131 #endif
132 
133 std::vector<double> SimulationResult::axis(Axes::Units units) const
134 {
135  return axis(0, units);
136 }
137 
138 std::vector<double> SimulationResult::axis(size_t i_axis, Axes::Units units) const
139 {
140  if (i_axis >= m_unit_converter->dimension())
141  throw std::runtime_error(
142  "Error in SimulationResult::axis: no axis corresponds to passed index.");
143  auto axis = m_unit_converter->createConvertedAxis(i_axis, units);
144  return axis->binCenters();
145 }
146 
148 {
149  if (m_data->rank() != m_unit_converter->dimension())
150  throw std::runtime_error("Error in SimulationResults::checkDimensions(): "
151  "dimensions of data and unit converter don't match");
152 }
#define ASSERT(condition)
Definition: Assert.h:31
Defines class Histogram2D.
_object PyObject
Definition: PyObject.h:25
Defines class SimulationResult.
Two dimensional histogram.
Definition: Histogram2D.h:24
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< IUnitConverter > m_unit_converter
size_t size() const
void checkDimensions() const
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.
std::unique_ptr< OutputData< double > > m_data
double max() const
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
Definition: filesystem.h:81
Information about an axis in specific units.