BornAgain  1.18.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 scattering at grazing incidence
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_CORE_CORRELATIONS_FTDISTRIBUTIONS2D_H
16 #define BORNAGAIN_CORE_CORRELATIONS_FTDISTRIBUTIONS2D_H
17 
19 #include "Base/Types/ICloneable.h"
20 #include "Param/Node/INode.h"
22 
23 //! Interface for two-dimensional distributions in Fourier space.
24 //! @ingroup distribution_internal
25 
26 class IFTDistribution2D : public ICloneable, public INode
27 {
28 public:
29  IFTDistribution2D(const NodeMeta& meta, const std::vector<double>& PValues);
30 
31  IFTDistribution2D* clone() const = 0;
32 
33  double omegaX() const { return m_omega_x; }
34  double omegaY() const { return m_omega_y; }
35  double gamma() const { return m_gamma; }
36 
37  //! Angle in direct space between X- and Y-axis of distribution.
38  double delta() const { return M_PI_2; }
39 
40  //! evaluate Fourier transformed distribution for q in X,Y coordinates
41  //! the original distribution (in real space) is assumed to be normalized:
42  //! total integral is equal to 1
43  virtual double evaluate(double qx, double qy) const = 0;
44 
45 #ifndef SWIG
46  virtual std::unique_ptr<IDistribution2DSampler> createSampler() const = 0;
47 #endif
48 
49 protected:
50  double sumsq(double qx, double qy) const;
51 
52  const double& m_omega_x;
53  const double& m_omega_y;
54  const double& m_gamma;
55 };
56 
57 //! Two-dimensional Cauchy distribution in Fourier space;
58 //! corresponds to a normalized exp(-r) in real space,
59 //! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
60 //! @ingroup distributionFT
61 
63 {
64 public:
65  FTDistribution2DCauchy(const std::vector<double> P);
66  FTDistribution2DCauchy(double omega_x, double omega_y, double gamma);
67 
68  FTDistribution2DCauchy* clone() const final;
69  void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
70  double evaluate(double qx, double qy) const final;
71 #ifndef SWIG
72  std::unique_ptr<IDistribution2DSampler> createSampler() const final;
73 #endif
74 };
75 
76 //! Two-dimensional Gauss distribution in Fourier space;
77 //! corresponds to normalized exp(-r^2/2) in real space
78 //! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
79 //! @ingroup distributionFT
80 
82 {
83 public:
84  FTDistribution2DGauss(const std::vector<double> P);
85  FTDistribution2DGauss(double omega_x, double omega_y, double gamma);
86 
87  FTDistribution2DGauss* clone() const final;
88  void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
89  double evaluate(double qx, double qy) const final;
90 #ifndef SWIG
91  std::unique_ptr<IDistribution2DSampler> createSampler() const final;
92 #endif
93 };
94 
95 //! Two-dimensional gate distribution in Fourier space;
96 //! corresponds to normalized constant if r<1 (and 0 otherwise) in real space,
97 //! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
98 //! @ingroup distributionFT
99 
101 {
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 {
121 public:
122  FTDistribution2DCone(const std::vector<double> P);
123  FTDistribution2DCone(double omega_x, double omega_y, double gamma);
124 
125  FTDistribution2DCone* clone() const final;
126  void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
127  double evaluate(double qx, double qy) const final;
128 #ifndef SWIG
129  std::unique_ptr<IDistribution2DSampler> createSampler() const final;
130 #endif
131 };
132 
133 //! Two-dimensional Voigt distribution in Fourier space;
134 //! corresponds to eta*Gauss + (1-eta)*Cauchy
135 //! @ingroup distributionFT
136 
138 {
139 public:
140  FTDistribution2DVoigt(const std::vector<double> P);
141  FTDistribution2DVoigt(double omega_x, double omega_y, double gamma, double eta);
142 
143  FTDistribution2DVoigt* clone() const final;
144  void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
145  double evaluate(double qx, double qy) const final;
146  double eta() const { return m_eta; }
147 #ifndef SWIG
148  std::unique_ptr<IDistribution2DSampler> createSampler() const final;
149 #endif
150 
151 protected:
152  const double& m_eta;
153 };
154 
155 #endif // BORNAGAIN_CORE_CORRELATIONS_FTDISTRIBUTIONS2D_H
Defines and implements the standard mix-in ICloneable.
Defines interface class IFTDistribution1D, and children thereof.
Defines class INode.
Defines M_PI and some more mathematical constants.
#define M_PI_2
Definition: MathConstants.h:40
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 ISample objects.
Definition: INodeVisitor.h:149
Base class for tree-like structures containing parameterized objects.
Definition: INode.h:49
Metadata of one model node.
Definition: INode.h:37