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