From fb0e01c4aca503e13357447cab44465876b6d5d8 Mon Sep 17 00:00:00 2001 From: Walter Van Herck <w.van.herck@fz-juelich.de> Date: Wed, 4 Dec 2013 16:23:06 +0100 Subject: [PATCH] AddAdded Fourier transformed 2d Voigt and Gate --- Core/Algorithms/inc/FTDistributions.h | 37 +++++++++++++++- Core/Algorithms/src/FTDistributions.cpp | 57 ++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/Core/Algorithms/inc/FTDistributions.h b/Core/Algorithms/inc/FTDistributions.h index d45bd7a9f21..545e12b0ff9 100644 --- a/Core/Algorithms/inc/FTDistributions.h +++ b/Core/Algorithms/inc/FTDistributions.h @@ -33,7 +33,7 @@ protected: double m_omega; }; - +//! Interface for 2 dimensional distributions in Fourier space class BA_CORE_API_ IFTDistribution2D : public IParameterized { public: @@ -72,6 +72,8 @@ protected: double m_delta; }; +//! 2 dimensional Cauchy distribution in Fourier space +//! corresponds to exp(-r) in real space class BA_CORE_API_ FTDistribution2DCauchy : public IFTDistribution2D { public: @@ -83,6 +85,8 @@ public: virtual double evaluate(double qx, double qy) const; }; +//! 2 dimensional Gauss distribution in Fourier space +//! corresponds to exp(-r^2) in real space class BA_CORE_API_ FTDistribution2DGauss : public IFTDistribution2D { public: @@ -94,6 +98,37 @@ public: virtual double evaluate(double qx, double qy) const; }; +//! 2 dimensional gate distribution in Fourier space +//! corresponds to 1 if r<1 (and 0 otherwise) in real space +class BA_CORE_API_ FTDistribution2DGate : public IFTDistribution2D +{ +public: + FTDistribution2DGate(double coherence_length_x, double coherence_length_y); + virtual ~FTDistribution2DGate() {} + + virtual FTDistribution2DGate *clone() const; + + virtual double evaluate(double qx, double qy) const; +}; + +//! 2 dimensional Voigt distribution in Fourier space +//! Corresponds to eta*Gauss + (1-eta)*Cauchy +class BA_CORE_API_ FTDistribution2DVoigt : public IFTDistribution2D +{ +public: + FTDistribution2DVoigt(double coherence_length_x, double coherence_length_y, + double eta); + virtual ~FTDistribution2DVoigt() {} + + virtual FTDistribution2DVoigt *clone() const; + + virtual double evaluate(double qx, double qy) const; + +protected: + virtual void init_parameters(); + double m_eta; +}; + #endif /* FTDISTRIBUTIONS_H_ */ diff --git a/Core/Algorithms/src/FTDistributions.cpp b/Core/Algorithms/src/FTDistributions.cpp index 153502d1a19..b4789cec005 100644 --- a/Core/Algorithms/src/FTDistributions.cpp +++ b/Core/Algorithms/src/FTDistributions.cpp @@ -14,6 +14,7 @@ // ************************************************************************** // #include "FTDistributions.h" +#include "MathFunctions.h" void IFTDistribution2D::transformToStarBasis(double qX, double qY, double alpha, double a, double b, double& qa, double& qb) const @@ -68,8 +69,8 @@ FTDistribution2DGauss* FTDistribution2DGauss::clone() const m_coherence_length_x, m_coherence_length_y); p_clone->setGamma(m_gamma); return p_clone; - } + double FTDistribution2DGauss::evaluate(double qx, double qy) const { double sum_sq = qx*qx*m_coherence_length_x*m_coherence_length_x @@ -77,3 +78,57 @@ double FTDistribution2DGauss::evaluate(double qx, double qy) const return std::exp(-sum_sq/4.0)/2.0; } +FTDistribution2DGate::FTDistribution2DGate(double coherence_length_x, + double coherence_length_y) +: IFTDistribution2D(coherence_length_x, coherence_length_y) +{ + setName("2DDistributionGate"); + init_parameters(); +} + +FTDistribution2DGate* FTDistribution2DGate::clone() const +{ + FTDistribution2DGate *p_clone = new FTDistribution2DGate( + m_coherence_length_x, m_coherence_length_y); + p_clone->setGamma(m_gamma); + return p_clone; +} + +double FTDistribution2DGate::evaluate(double qx, double qy) const +{ + double scaled_q = std::sqrt(qx*qx*m_coherence_length_x*m_coherence_length_x + + qy*qy*m_coherence_length_y*m_coherence_length_y); + return MathFunctions::Bessel_C1(scaled_q); +} + +FTDistribution2DVoigt::FTDistribution2DVoigt(double coherence_length_x, + double coherence_length_y, double eta) +: IFTDistribution2D(coherence_length_x, coherence_length_y) +, m_eta(eta) +{ + setName("2DDistributionVoigt"); + init_parameters(); +} + +FTDistribution2DVoigt* FTDistribution2DVoigt::clone() const +{ + FTDistribution2DVoigt *p_clone = new FTDistribution2DVoigt( + m_coherence_length_x, m_coherence_length_y, m_eta); + p_clone->setGamma(m_gamma); + return p_clone; +} + +double FTDistribution2DVoigt::evaluate(double qx, double qy) const +{ + double sum_sq = qx*qx*m_coherence_length_x*m_coherence_length_x + + qy*qy*m_coherence_length_y*m_coherence_length_y; + return m_eta*std::exp(-sum_sq/4.0)/2.0 + + (1.0 - m_eta)*std::pow(1.0 + sum_sq, -1.5); +} + +void FTDistribution2DVoigt::init_parameters() +{ + IFTDistribution2D::init_parameters(); + registerParameter("eta", &m_eta); +} + -- GitLab