BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
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 
16 #include "Base/Axis/IAxis.h"
17 #include "Base/Util/Assert.h"
18 #include "Device/Data/Datafield.h"
19 
20 #include <stdexcept>
21 
23  : m_data(data.clone())
24  , m_coordsys(coords.clone())
25 {
26  checkRank();
27 }
28 
30  : m_data(data.clone())
31  , m_coordsys(coords)
32 {
33  checkRank();
34 }
35 
37 
39 {
40  m_data.reset(other.m_data->clone());
41  m_coordsys.reset(other.m_coordsys->clone());
42 }
43 
45  : m_data(std::move(other.m_data))
46  , m_coordsys(std::move(other.m_coordsys))
47 {
48 }
49 
51 {
52  if (&other == this)
53  return *this;
54  m_data.reset(other.m_data->clone());
55  m_coordsys.reset(other.m_coordsys->clone());
56  return *this;
57 }
58 
60 {
61  m_data = std::move(other.m_data);
62  m_coordsys = std::move(other.m_coordsys);
63  return *this;
64 }
65 
66 size_t SimulationResult::rank() const
67 {
68  return m_data->rank();
69 }
70 
71 size_t SimulationResult::size() const
72 {
73  return m_data ? m_data->size() : 0;
74 }
75 
76 std::vector<double> SimulationResult::flatVector(Coords units) const
77 {
78  std::unique_ptr<Datafield> f(datafield(units));
79  return f->flatVector();
80 }
81 
83 {
84  return m_coordsys->createConvertedData(*m_data, units);
85 }
86 
87 std::pair<double, double> SimulationResult::axisMinMax(size_t i, Coords units) const
88 {
89  return {m_coordsys->calculateMin(i, units), m_coordsys->calculateMax(i, units)};
90 }
91 
92 std::string SimulationResult::axisName(size_t i, Coords units) const
93 {
94  return m_coordsys->axisName(i, units);
95 }
96 
98 {
99  return *m_coordsys;
100 }
101 
103 {
104  return (*m_data)[i];
105 }
106 
107 const double& SimulationResult::operator[](size_t i) const
108 {
109  return (*m_data)[i];
110 }
111 
113 {
114  std::unique_ptr<Datafield> data2(m_data->normalizedToMaximum());
115  return {*data2, m_coordsys->clone()};
116 }
117 
118 #ifdef BORNAGAIN_PYTHON
120 {
121  std::unique_ptr<Datafield> data(m_coordsys->createConvertedData(*m_data, units));
122  return data->npArray();
123 }
124 #endif
125 
126 std::vector<double> SimulationResult::convertedBinCenters(Coords units) const
127 {
128  return convertedBinCenters(0, units);
129 }
130 
131 std::vector<double> SimulationResult::convertedBinCenters(size_t i_axis, Coords units) const
132 {
133  if (i_axis >= m_coordsys->rank())
134  throw std::runtime_error(
135  "Error in SimulationResult::axis: no axis corresponds to passed index.");
136  auto axis = m_coordsys->createConvertedAxis(i_axis, units);
137  return axis->binCenters();
138 }
139 
141 {
142  ASSERT(m_data);
144  ASSERT(m_data->rank() == m_coordsys->rank());
145 }
Defines the macro ASSERT.
#define ASSERT(condition)
Definition: Assert.h:45
Defines and implements templated class Datafield.
Defines interface IAxis.
_object PyObject
Definition: PyObject.h:25
Defines class SimulationResult.
Stores radiation power per bin.
Definition: Datafield.h:30
Interface to provide axis translations to different units for simulation output.
Definition: ICoordSystem.h:40
Wrapper around Datafield that also provides unit conversions.
std::vector< double > flatVector(Coords units=Coords::UNDEFINED) const
SimulationResult & operator=(const SimulationResult &other)
const ICoordSystem & converter() const
Returns underlying unit converter.
SimulationResult relativeToMaximum() const
Returns modified SimulationResult: all intensities dvided by maximum intensity.
size_t size() const
void checkRank() const
std::unique_ptr< const ICoordSystem > m_coordsys
PyObject * array(Coords units=Coords::UNDEFINED) const
Returns intensity data as Python numpy array.
std::pair< double, double > axisMinMax(size_t i, Coords units=Coords::UNDEFINED) const
std::string axisName(size_t i, Coords units=Coords::UNDEFINED) const
std::unique_ptr< Datafield > m_data
double & operator[](size_t i)
size_t rank() const
Data element access.
Datafield * datafield(Coords units=Coords::UNDEFINED) const
SimulationResult()=default
std::vector< double > convertedBinCenters(Coords units=Coords::UNDEFINED) const
Coords
Definition: Tags.h:20