BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
Datafield.h
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Device/Data/Datafield.h
6 //! @brief Defines and implements templated class Datafield.
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 
15 #ifndef BORNAGAIN_DEVICE_DATA_DATAFIELD_H
16 #define BORNAGAIN_DEVICE_DATA_DATAFIELD_H
17 
18 #include "Base/Py/PyObject.h"
19 #include <memory>
20 #include <vector>
21 
22 using std::size_t;
23 
24 class IAxis;
25 class Frame;
26 
27 //! Stores radiation power per bin.
28 //! @ingroup tools
29 
30 class Datafield {
31 public:
32  //! Constructor that takes ownership of supplied frame.
34  //! Constructor that takes ownership of supplied frame.
35  Datafield(Frame* frame, const std::vector<double>& vector);
36 
37  //! Constructor that takes ownership of supplied axes.
38  Datafield(const std::vector<IAxis*>& axes);
39  //! Constructor that takes ownership of supplied axes.
40  Datafield(const std::vector<IAxis*>& axes, const std::vector<double>& vector);
41 
42  Datafield(const Datafield&) = delete;
43  Datafield(Datafield&&) = default;
44 
45  ~Datafield();
46  Datafield* clone() const;
47 
48  void setAt(size_t i, double val);
49 
50  double valAt(size_t i) const;
51 
52  // retrieve basic info
53 
54  const Frame& frame() const;
55  size_t rank() const;
56  const IAxis& axis(size_t k) const;
57  const IAxis& xAxis() const;
58  const IAxis& yAxis() const;
59 
60  //! Returns total size of data buffer (product of bin number in every dimension).
61  size_t size() const;
62 
63  //! Returns copy of raw data vector
64  std::vector<double> flatVector() const;
65 
66  double maxVal() const;
67  double minVal() const;
68 
69  // modifiers
70 
71  //! Sets content of output data to specific value
72  void setAllTo(const double& value);
73 
74  //! Sets new values to raw data vector
75  void setVector(const std::vector<double>& data_vector);
76 
77  //! indexed accessor
78  double& operator[](size_t i) { return m_vec[i]; }
79 
80  //! ied accessor (const)
81  const double& operator[](size_t i) const { return m_vec[i]; }
82 
83  // helpers
84 
85  //! Returns true if object have same dimensions and number of axes bins
86  bool hasSameSizes(const Datafield& other) const;
87 
88  //! Returns true if objects a) have same dimensions b) bin boundaries of axes coincide
89  bool hasSameShape(const Datafield& other) const;
90 
91  Datafield* crop(double xmin, double ymin, double xmax, double ymax) const;
92  Datafield* crop(double xmin, double xmax) const;
93 
94 #ifdef BORNAGAIN_PYTHON
95  //! Returns data as Python numpy array
96  PyObject* npArray() const;
97 #endif
98 
100 
101  //! Project a 2D histogram into 1D histogram along X. The projection is made
102  //! from all bins along y-axis.
104 
105  //! @brief Project a 2D histogram into 1D histogram along X. The projection is made
106  //! from the y-bin closest to given ordinate yvalue.
107  //! @param yvalue the value on y-axis at which projection is taken
108  Datafield* xProjection(double yvalue);
109 
110  //! @brief Project a 2D histogram into 1D histogram along X. The projection is made from
111  //! all y-bins corresponding to ordinate between ylow and yup.
112  //! @param ylow lower edje on y-axis
113  //! @param yup upper edje on y-axis
114  Datafield* xProjection(double ylow, double yup);
115 
116  //! Project a 2D histogram into 1D histogram along Y. The projection is made
117  //! from all bins along x-axis.
119 
120  //! @brief Project a 2D histogram into 1D histogram along Y. The projection is made
121  //! from the x-bin closest to given abscissa xvalue.
122  //! @param xvalue the value on x-axis at which projection is taken
123  Datafield* yProjection(double xvalue);
124 
125  //! @brief Project a 2D histogram into 1D histogram along Y. The projection is made from
126  //! all x-bins corresponding to abscissa between xlow and xup.
127  //! @param xlow lower edje on x-axis
128  //! @param xup upper edje on x-axis
129  Datafield* yProjection(double xlow, double xup);
130 
131 private:
132  //! Creates projection along X. The projections is made by collecting the data in the range
133  //! between [ybinlow, ybinup].
134  Datafield* create_xProjection(int ybinlow, int ybinup);
135 
136  //! Creates projection along Y. The projections is made by collecting the data in the range
137  //! between [xbinlow, xbinup].
138  Datafield* create_yProjection(int xbinlow, int xbinup);
139 
140  std::unique_ptr<Frame> m_frame;
141  std::vector<double> m_vec;
142 };
143 
144 #endif // BORNAGAIN_DEVICE_DATA_DATAFIELD_H
PyObject forward declaration.
_object PyObject
Definition: PyObject.h:25
Stores radiation power per bin.
Definition: Datafield.h:30
std::vector< double > m_vec
Definition: Datafield.h:141
PyObject * npArray() const
Returns data as Python numpy array.
Definition: Datafield.cpp:181
const IAxis & axis(size_t k) const
Definition: Datafield.cpp:91
double maxVal() const
Definition: Datafield.cpp:137
double valAt(size_t i) const
Definition: Datafield.cpp:58
Datafield(Frame *frame)
Constructor that takes ownership of supplied frame.
Definition: Datafield.cpp:24
Datafield(const Datafield &)=delete
bool hasSameShape(const Datafield &other) const
Returns true if objects a) have same dimensions b) bin boundaries of axes coincide.
Definition: Datafield.cpp:114
Datafield * clone() const
Definition: Datafield.cpp:48
Datafield * crop(double xmin, double ymin, double xmax, double ymax) const
Definition: Datafield.cpp:147
std::unique_ptr< Frame > m_frame
Definition: Datafield.h:140
void setVector(const std::vector< double > &data_vector)
Sets new values to raw data vector.
Definition: Datafield.cpp:69
Datafield * xProjection()
Project a 2D histogram into 1D histogram along X. The projection is made from all bins along y-axis.
Definition: Datafield.cpp:224
bool hasSameSizes(const Datafield &other) const
Returns true if object have same dimensions and number of axes bins.
Definition: Datafield.cpp:108
std::vector< double > flatVector() const
Returns copy of raw data vector.
Definition: Datafield.cpp:119
size_t rank() const
Definition: Datafield.cpp:75
const double & operator[](size_t i) const
ied accessor (const)
Definition: Datafield.h:81
Datafield(Datafield &&)=default
Datafield * normalizedToMaximum() const
Definition: Datafield.cpp:127
double & operator[](size_t i)
indexed accessor
Definition: Datafield.h:78
Datafield * create_yProjection(int xbinlow, int xbinup)
Creates projection along Y. The projections is made by collecting the data in the range between [xbin...
Definition: Datafield.cpp:275
const IAxis & yAxis() const
Definition: Datafield.cpp:101
double minVal() const
Definition: Datafield.cpp:142
Datafield * yProjection()
Project a 2D histogram into 1D histogram along Y. The projection is made from all bins along x-axis.
Definition: Datafield.cpp:242
size_t size() const
Returns total size of data buffer (product of bin number in every dimension).
Definition: Datafield.cpp:80
Datafield * create_xProjection(int ybinlow, int ybinup)
Creates projection along X. The projections is made by collecting the data in the range between [ybin...
Definition: Datafield.cpp:260
void setAllTo(const double &value)
Sets content of output data to specific value.
Definition: Datafield.cpp:63
const IAxis & xAxis() const
Definition: Datafield.cpp:96
const Frame & frame() const
Definition: Datafield.cpp:86
void setAt(size_t i, double val)
Definition: Datafield.cpp:53
Holds one or two axes.
Definition: Frame.h:27
Abstract base class for one-dimensional axes.
Definition: IAxis.h:27