BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
FTDistributions2D.h
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/Correlations/FTDistributions2D.h
6 //! @brief Defines interface class IFTDistribution2D, and children thereof.
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_SAMPLE_CORRELATIONS_FTDISTRIBUTIONS2D_H
16 #define BORNAGAIN_SAMPLE_CORRELATIONS_FTDISTRIBUTIONS2D_H
17 
18 #include "Base/Math/Constants.h"
19 #include "Base/Types/ICloneable.h"
20 #include "Param/Node/INode.h"
22 
23 #ifndef USER_API
24 
25 //! Interface for two-dimensional distributions in Fourier space.
26 //! @ingroup distribution_internal
27 
28 class IFTDistribution2D : public ICloneable, public INode {
29 public:
30  IFTDistribution2D(const NodeMeta& meta, const std::vector<double>& PValues);
31 
32  IFTDistribution2D* clone() const = 0;
33 
34  double omegaX() const { return m_omega_x; }
35  double omegaY() const { return m_omega_y; }
36  double gamma() const { return m_gamma; }
37 
38  //! Angle in direct space between X- and Y-axis of distribution.
39  double delta() const { return M_PI_2; }
40 
41  //! evaluate Fourier transformed distribution for q in X,Y coordinates
42  //! the original distribution (in real space) is assumed to be normalized:
43  //! total integral is equal to 1
44  virtual double evaluate(double qx, double qy) const = 0;
45 
46 #ifndef SWIG
47  virtual std::unique_ptr<IDistribution2DSampler> createSampler() const = 0;
48 #endif
49 
50 protected:
51  double sumsq(double qx, double qy) const;
52 
53  const double& m_omega_x;
54  const double& m_omega_y;
55  const double& m_gamma;
56 };
57 
58 #endif // USER_API
59 
60 //! Two-dimensional Cauchy distribution in Fourier space;
61 //! corresponds to a normalized exp(-r) in real space,
62 //! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
63 //! @ingroup distributionFT
64 
66 public:
67  FTDistribution2DCauchy(const std::vector<double> P);
68  FTDistribution2DCauchy(double omega_x, double omega_y, double gamma);
69 
70  FTDistribution2DCauchy* clone() const final;
71  void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
72  double evaluate(double qx, double qy) const final;
73 #ifndef SWIG
74  std::unique_ptr<IDistribution2DSampler> createSampler() const final;
75 #endif
76 };
77 
78 //! Two-dimensional Gauss distribution in Fourier space;
79 //! corresponds to normalized exp(-r^2/2) in real space
80 //! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
81 //! @ingroup distributionFT
82 
84 public:
85  FTDistribution2DGauss(const std::vector<double> P);
86  FTDistribution2DGauss(double omega_x, double omega_y, double gamma);
87 
88  FTDistribution2DGauss* clone() const final;
89  void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
90  double evaluate(double qx, double qy) const final;
91 #ifndef SWIG
92  std::unique_ptr<IDistribution2DSampler> createSampler() const final;
93 #endif
94 };
95 
96 //! Two-dimensional gate distribution in Fourier space;
97 //! corresponds to normalized constant if r<1 (and 0 otherwise) in real space,
98 //! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
99 //! @ingroup distributionFT
100 
102 public:
103  FTDistribution2DGate(const std::vector<double> P);
104  FTDistribution2DGate(double omega_x, double omega_y, double gamma);
105 
106  FTDistribution2DGate* clone() const final;
107  void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
108  double evaluate(double qx, double qy) const final;
109 #ifndef SWIG
110  std::unique_ptr<IDistribution2DSampler> createSampler() const final;
111 #endif
112 };
113 
114 //! Two-dimensional cone distribution in Fourier space;
115 //! corresponds to 1-r if r<1 (and 0 otherwise) in real space
116 //! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
117 //! @ingroup distributionFT
118 
120 public:
121  FTDistribution2DCone(const std::vector<double> P);
122  FTDistribution2DCone(double omega_x, double omega_y, double gamma);
123 
124  FTDistribution2DCone* clone() const final;
125  void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
126  double evaluate(double qx, double qy) const final;
127 #ifndef SWIG
128  std::unique_ptr<IDistribution2DSampler> createSampler() const final;
129 #endif
130 };
131 
132 //! Two-dimensional Voigt distribution in Fourier space;
133 //! corresponds to eta*Gauss + (1-eta)*Cauchy
134 //! @ingroup distributionFT
135 
137 public:
138  FTDistribution2DVoigt(const std::vector<double> P);
139  FTDistribution2DVoigt(double omega_x, double omega_y, double gamma, double eta);
140 
141  FTDistribution2DVoigt* clone() const final;
142  void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
143  double evaluate(double qx, double qy) const final;
144  double eta() const { return m_eta; }
145 #ifndef SWIG
146  std::unique_ptr<IDistribution2DSampler> createSampler() const final;
147 #endif
148 
149 protected:
150  const double& m_eta;
151 };
152 
153 #endif // BORNAGAIN_SAMPLE_CORRELATIONS_FTDISTRIBUTIONS2D_H
Defines M_PI and some more mathematical constants.
#define M_PI_2
Definition: Constants.h:45
Defines and implements the standard mix-in ICloneable.
Defines interface class IFTDistribution1D, and children thereof.
Defines interface INode.
Two-dimensional Cauchy distribution in Fourier space; corresponds to a normalized exp(-r) in real spa...
FTDistribution2DCauchy(const std::vector< double > P)
double evaluate(double qx, double qy) const final
evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real...
void accept(INodeVisitor *visitor) const final
Calls the INodeVisitor's visit method.
FTDistribution2DCauchy * clone() const final
std::unique_ptr< IDistribution2DSampler > createSampler() const final
Two-dimensional cone distribution in Fourier space; corresponds to 1-r if r<1 (and 0 otherwise) in re...
std::unique_ptr< IDistribution2DSampler > createSampler() const final
void accept(INodeVisitor *visitor) const final
Calls the INodeVisitor's visit method.
FTDistribution2DCone(const std::vector< double > P)
FTDistribution2DCone * clone() const final
double evaluate(double qx, double qy) const final
evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real...
Two-dimensional gate distribution in Fourier space; corresponds to normalized constant if r<1 (and 0 ...
FTDistribution2DGate(const std::vector< double > P)
FTDistribution2DGate * clone() const final
double evaluate(double qx, double qy) const final
evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real...
void accept(INodeVisitor *visitor) const final
Calls the INodeVisitor's visit method.
std::unique_ptr< IDistribution2DSampler > createSampler() const final
Two-dimensional Gauss distribution in Fourier space; corresponds to normalized exp(-r^2/2) in real sp...
FTDistribution2DGauss(const std::vector< double > P)
std::unique_ptr< IDistribution2DSampler > createSampler() const final
FTDistribution2DGauss * clone() const final
double evaluate(double qx, double qy) const final
evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real...
void accept(INodeVisitor *visitor) const final
Calls the INodeVisitor's visit method.
Two-dimensional Voigt distribution in Fourier space; corresponds to eta*Gauss + (1-eta)*Cauchy.
FTDistribution2DVoigt(const std::vector< double > P)
void accept(INodeVisitor *visitor) const final
Calls the INodeVisitor's visit method.
double evaluate(double qx, double qy) const final
evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real...
FTDistribution2DVoigt * clone() const final
std::unique_ptr< IDistribution2DSampler > createSampler() const final
Interface for polymorphic classes that should not be copied, except by explicit cloning.
Definition: ICloneable.h:25
Interface for two-dimensional distributions in Fourier space.
const double & m_gamma
double omegaY() const
virtual std::unique_ptr< IDistribution2DSampler > createSampler() const =0
double omegaX() const
IFTDistribution2D * clone() const =0
const double & m_omega_y
double delta() const
Angle in direct space between X- and Y-axis of distribution.
const double & m_omega_x
IFTDistribution2D(const NodeMeta &meta, const std::vector< double > &PValues)
double sumsq(double qx, double qy) const
virtual double evaluate(double qx, double qy) const =0
evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real...
double gamma() const
Visitor interface to visit ISampleNode objects.
Definition: INodeVisitor.h:146
Base class for tree-like structures containing parameterized objects.
Definition: INode.h:49
Metadata of one model node.
Definition: INode.h:38