BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
QSpecScan.h
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Core/Scan/QSpecScan.h
6 //! @brief Declares QSpecScan class.
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_CORE_INSTRUMENT_QSPECSCAN_H
16 #define BORNAGAIN_CORE_INSTRUMENT_QSPECSCAN_H
17 
19 #include <memory>
20 
21 class ParameterSample;
22 class RangedDistribution;
23 class ScanResolution;
24 
25 //! Scan type with z-components of scattering vector as coordinate values.
26 //! Wavelength and incident angles are not accessible separately.
27 
28 class QSpecScan : public ISpecularScan
29 {
30 public:
31  //! Accepts qz-value vector (in inverse nm)
32  QSpecScan(std::vector<double> qs_nm);
33  QSpecScan(const IAxis& qs_nm);
34  //! Sets q-defined specular scan. Accepts either numpy array of q-values sorted in ascending
35  //! order or an IAxis object with q-values. Alternatively an axis can be defined in-place, then
36  //! the first passed parameter is the number of bins, second - minimum on-axis q-value,
37  //! third - maximum on-axis q_value.
38  QSpecScan(int nbins, double qz_min, double qz_max);
39 
40  ~QSpecScan() override;
41  QSpecScan* clone() const override;
42 
43 #ifndef SWIG
44  //! Generates simulation elements for specular simulations
45  std::vector<SpecularSimulationElement> generateSimulationElements() const override;
46 
47  //! Returns coordinate axis assigned to the data holder
48  virtual const IAxis* coordinateAxis() const override { return m_qs.get(); }
49 
50  //! Returns IFootprintFactor object pointer
51  virtual const IFootprintFactor* footprintFactor() const override { return nullptr; }
52 
53  //! Returns footprint correction factor for a range of simulation elements of size _n_elements_
54  //! and starting from element with index _i_.
55  std::vector<double> footprint(size_t i, size_t n_elements) const override;
56 
57  //! Returns the number of simulation elements
58  size_t numberOfSimulationElements() const override;
59 
60  //! Returns intensity vector corresponding to convolution of given simulation elements
61  std::vector<double>
62  createIntensities(const std::vector<SpecularSimulationElement>& sim_elements) const override;
63 
64  //! Print scan definition in python format
65  std::string print() const override;
66 #endif // SWIG
67 
68  //! Sets q resolution values via ScanResolution object.
69  void setQResolution(const ScanResolution& resolution);
70 
71  void setRelativeQResolution(const RangedDistribution& distr, double rel_dev);
72  //! Sets qz resolution values via RangedDistribution and values of relative deviations
73  //! (that is, _rel_dev_ equals standard deviation divided by the mean value).
74  //! _rel_dev_ can be either single-valued or a numpy array. In the latter case the length of the
75  //! array should coinside with the length of the qz-axis.
77  const std::vector<double>& rel_dev);
78 
79  void setAbsoluteQResolution(const RangedDistribution& distr, double std_dev);
80  //! Sets qz resolution values via RangedDistribution and values of standard deviations.
81  //! _std_dev_ can be either single-valued or a numpy array. In the latter case the length of the
82  //! array should coinside with the length of the qz-axis.
84  const std::vector<double>& std_dev);
85 
86 private:
87  void checkInitialization();
88  std::vector<double> generateQzVector() const;
89  std::vector<std::vector<ParameterSample>> applyQResolution() const;
90 
91  std::unique_ptr<IAxis> m_qs;
92  std::unique_ptr<ScanResolution> m_resolution;
93  mutable std::vector<std::vector<ParameterSample>> m_q_res_cache;
94 };
95 
96 #endif // BORNAGAIN_CORE_INSTRUMENT_QSPECSCAN_H
Declares and implements pure virtual class ISpecularScan.
Interface for one-dimensional axes.
Definition: IAxis.h:25
Abstract base for classes that calculate the beam footprint factor.
Pure virtual base class for all types of specular scans.
Definition: ISpecularScan.h:31
A parameter value with a weight, as obtained when sampling from a distribution.
Scan type with z-components of scattering vector as coordinate values.
Definition: QSpecScan.h:29
void setRelativeQResolution(const RangedDistribution &distr, double rel_dev)
Definition: QSpecScan.cpp:120
size_t numberOfSimulationElements() const override
Returns the number of simulation elements.
Definition: QSpecScan.cpp:74
void setAbsoluteQResolution(const RangedDistribution &distr, double std_dev)
Definition: QSpecScan.cpp:135
QSpecScan * clone() const override
Definition: QSpecScan.cpp:46
std::unique_ptr< IAxis > m_qs
Definition: QSpecScan.h:91
std::vector< double > footprint(size_t i, size_t n_elements) const override
Returns footprint correction factor for a range of simulation elements of size n_elements and startin...
Definition: QSpecScan.cpp:65
virtual const IAxis * coordinateAxis() const override
Returns coordinate axis assigned to the data holder.
Definition: QSpecScan.h:48
std::vector< std::vector< ParameterSample > > m_q_res_cache
Definition: QSpecScan.h:93
std::vector< double > createIntensities(const std::vector< SpecularSimulationElement > &sim_elements) const override
Returns intensity vector corresponding to convolution of given simulation elements.
Definition: QSpecScan.cpp:80
QSpecScan(std::vector< double > qs_nm)
Accepts qz-value vector (in inverse nm)
Definition: QSpecScan.cpp:23
virtual const IFootprintFactor * footprintFactor() const override
Returns IFootprintFactor object pointer.
Definition: QSpecScan.h:51
std::string print() const override
Print scan definition in python format.
Definition: QSpecScan.cpp:98
std::unique_ptr< ScanResolution > m_resolution
Definition: QSpecScan.h:92
std::vector< SpecularSimulationElement > generateSimulationElements() const override
Generates simulation elements for specular simulations.
Definition: QSpecScan.cpp:54
void setQResolution(const ScanResolution &resolution)
Sets q resolution values via ScanResolution object.
Definition: QSpecScan.cpp:113
void checkInitialization()
Definition: QSpecScan.cpp:150
std::vector< double > generateQzVector() const
Definition: QSpecScan.cpp:162
~QSpecScan() override
std::vector< std::vector< ParameterSample > > applyQResolution() const
Definition: QSpecScan.cpp:174
Interface for one-dimensional ranged distributions.
Container for reflectivity resolution data.