diff --git a/Core/Beam/IFootprintFactor.cpp b/Core/Beam/IFootprintFactor.cpp
index 4696d84b1aec726580ca5636eab04e58adc1c73e..8236e7a0002bce9f8a8e117aa6f6d6e1b0dbff45 100644
--- a/Core/Beam/IFootprintFactor.cpp
+++ b/Core/Beam/IFootprintFactor.cpp
@@ -16,8 +16,10 @@
 #include <stdexcept>
 
 IFootprintFactor::IFootprintFactor(const NodeMeta& meta, const std::vector<double>& PValues)
-    : INode(nodeMetaUnion({{"BeamToSampleWidthRatio", "", "ratio of beam width to sample width",
-                            0, INF, 1.}}, meta), PValues),
+    : INode(nodeMetaUnion(
+                {{"BeamToSampleWidthRatio", "", "ratio of beam width to sample width", 0, INF, 1.}},
+                meta),
+            PValues),
       m_width_ratio(m_P[0])
 {
     if (m_P[0] < 0.0)
diff --git a/Core/Correlations/FTDecay1D.cpp b/Core/Correlations/FTDecay1D.cpp
index d09a5eab6c7aabc0c4a9ae46bfdfc8da7a8a460b..5ee54fe5d10888c5f389e8e170d39bbc2b44a101 100644
--- a/Core/Correlations/FTDecay1D.cpp
+++ b/Core/Correlations/FTDecay1D.cpp
@@ -14,30 +14,31 @@
 
 #include "Core/Correlations/FTDecay1D.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/ParameterPool.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Tools/MathFunctions.h"
 #include <algorithm>
 
-IFTDecayFunction1D::IFTDecayFunction1D(double decay_length) : m_decay_length(decay_length)
+// ************************************************************************** //
+// interface IIFTDecayFunction1D
+// ************************************************************************** //
+
+IFTDecayFunction1D::IFTDecayFunction1D(const NodeMeta& meta, const std::vector<double>& PValues)
+    : INode(nodeMetaUnion({{"DecayLength", "nm", "half width", 0, INF, 1.}}, meta), PValues),
+      m_decay_length(m_P[0])
 {
-    registerParameter("DecayLength", &m_decay_length);
 }
 
-IFTDecayFunction1D::IFTDecayFunction1D(const NodeMeta& meta, const std::vector<double>& PValues)
-    : INode(nodeMetaUnion(
-                {
-                    {"DecayLength", "nm", "Half-width", 0, INF, 1.},
-                },
-                meta),
-            PValues)
+// ************************************************************************** //
+// class FTDecayFunction1DCauchy
+// ************************************************************************** //
+
+FTDecayFunction1DCauchy::FTDecayFunction1DCauchy(const std::vector<double> P)
+    : IFTDecayFunction1D({"FTDecayFunction1DCauchy", "class_tooltip", {}}, P)
 {
 }
 
 FTDecayFunction1DCauchy::FTDecayFunction1DCauchy(double decay_length)
-    : IFTDecayFunction1D(decay_length)
+    : FTDecayFunction1DCauchy(std::vector<double>{decay_length})
 {
-    setName("FTDecayFunction1DCauchy");
 }
 
 FTDecayFunction1DCauchy* FTDecayFunction1DCauchy::clone() const
@@ -51,10 +52,18 @@ double FTDecayFunction1DCauchy::evaluate(double q) const
     return m_decay_length * 2.0 / (1.0 + sum_sq);
 }
 
+// ************************************************************************** //
+// class FTDecayFunction1DGauss
+// ************************************************************************** //
+
+FTDecayFunction1DGauss::FTDecayFunction1DGauss(const std::vector<double> P)
+    : IFTDecayFunction1D({"FTDecayFunction1DGauss", "class_tooltip", {}}, P)
+{
+}
+
 FTDecayFunction1DGauss::FTDecayFunction1DGauss(double decay_length)
-    : IFTDecayFunction1D(decay_length)
+    : FTDecayFunction1DGauss(std::vector<double>{decay_length})
 {
-    setName("FTDecayFunction1DGauss");
 }
 
 FTDecayFunction1DGauss* FTDecayFunction1DGauss::clone() const
@@ -68,10 +77,18 @@ double FTDecayFunction1DGauss::evaluate(double q) const
     return m_decay_length * std::sqrt(M_TWOPI) * std::exp(-sum_sq / 2.0);
 }
 
+// ************************************************************************** //
+// class FTDecayFunction1DTriangle
+// ************************************************************************** //
+
+FTDecayFunction1DTriangle::FTDecayFunction1DTriangle(const std::vector<double> P)
+    : IFTDecayFunction1D({"FTDecayFunction1DTriangle", "class_tooltip", {}}, P)
+{
+}
+
 FTDecayFunction1DTriangle::FTDecayFunction1DTriangle(double decay_length)
-    : IFTDecayFunction1D(decay_length)
+    : FTDecayFunction1DTriangle(std::vector<double>{decay_length})
 {
-    setName("FTDecayFunction1DTriangle");
 }
 
 FTDecayFunction1DTriangle* FTDecayFunction1DTriangle::clone() const
@@ -85,11 +102,21 @@ double FTDecayFunction1DTriangle::evaluate(double q) const
     return m_decay_length * sincqw2 * sincqw2;
 }
 
+// ************************************************************************** //
+// class FTDecayFunction1DVoigt
+// ************************************************************************** //
+
+FTDecayFunction1DVoigt::FTDecayFunction1DVoigt(const std::vector<double> P)
+    : IFTDecayFunction1D(
+        {"FTDecayFunction1DVoigt", "class_tooltip", {{"Eta", "", "para_tooltip", -INF, +INF, 0}}},
+        P),
+      m_eta(m_P[0])
+{
+}
+
 FTDecayFunction1DVoigt::FTDecayFunction1DVoigt(double decay_length, double eta)
-    : IFTDecayFunction1D(decay_length), m_eta(eta)
+    : FTDecayFunction1DVoigt(std::vector<double>{decay_length, eta})
 {
-    setName("FTDecayFunction1DVoigt");
-    registerParameter("Eta", &m_eta);
 }
 
 FTDecayFunction1DVoigt* FTDecayFunction1DVoigt::clone() const
diff --git a/Core/Correlations/FTDecay1D.h b/Core/Correlations/FTDecay1D.h
index e2bb139292b5ae880e9576b4f73d6d1d408917f1..1a6de9bd76b346a7205a79c232e16341156f97ba 100644
--- a/Core/Correlations/FTDecay1D.h
+++ b/Core/Correlations/FTDecay1D.h
@@ -27,9 +27,6 @@
 class BA_CORE_API_ IFTDecayFunction1D : public ICloneable, public INode
 {
 public:
-    //! Constructor of one-dimensional decay function.
-    //! @param decay_length: half-width of the distribution in nanometers
-    IFTDecayFunction1D(double decay_length);
     IFTDecayFunction1D(const NodeMeta& meta, const std::vector<double>& PValues);
 
     virtual IFTDecayFunction1D* clone() const = 0;
@@ -37,7 +34,7 @@ public:
     double decayLength() const { return m_decay_length; }
 
 protected:
-    double m_decay_length;
+    const double& m_decay_length;
 };
 
 //! One-dimensional Cauchy decay function in reciprocal space;
@@ -46,6 +43,7 @@ protected:
 class BA_CORE_API_ FTDecayFunction1DCauchy : public IFTDecayFunction1D
 {
 public:
+    FTDecayFunction1DCauchy(const std::vector<double> P);
     FTDecayFunction1DCauchy(double decay_length);
 
     FTDecayFunction1DCauchy* clone() const;
@@ -59,6 +57,7 @@ public:
 class BA_CORE_API_ FTDecayFunction1DGauss : public IFTDecayFunction1D
 {
 public:
+    FTDecayFunction1DGauss(const std::vector<double> P);
     FTDecayFunction1DGauss(double decay_length);
 
     FTDecayFunction1DGauss* clone() const;
@@ -72,6 +71,7 @@ public:
 class BA_CORE_API_ FTDecayFunction1DTriangle : public IFTDecayFunction1D
 {
 public:
+    FTDecayFunction1DTriangle(const std::vector<double> P);
     FTDecayFunction1DTriangle(double decay_length);
 
     FTDecayFunction1DTriangle* clone() const;
@@ -88,6 +88,7 @@ public:
     //! Constructor of pseudo-Voigt decay function.
     //! @param decay_length: half-width of the distribution in nanometers
     //! @param eta: parameter [0,1] to balance between Cauchy (eta=0.0) and Gauss (eta=1.0)
+    FTDecayFunction1DVoigt(const std::vector<double> P);
     FTDecayFunction1DVoigt(double decay_length, double eta);
 
     FTDecayFunction1DVoigt* clone() const;
@@ -96,7 +97,7 @@ public:
     double eEta() const { return m_eta; }
 
 private:
-    double m_eta;
+    const double& m_eta;
 };
 
 #endif // BORNAGAIN_CORE_AGGREGATE_FTDECAY1D_H
diff --git a/Core/Correlations/FTDecay2D.cpp b/Core/Correlations/FTDecay2D.cpp
index 4582f9523b412e9856ce4c4c1b9ca9f606c371c3..912746b825b52a54c8591ad316d50b8d05979ad3 100644
--- a/Core/Correlations/FTDecay2D.cpp
+++ b/Core/Correlations/FTDecay2D.cpp
@@ -14,23 +14,12 @@
 
 #include "Core/Correlations/FTDecay2D.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/ParameterPool.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Tools/MathFunctions.h"
 #include <algorithm>
 
-//! Constructor of two-dimensional decay function in reciprocal space.
-//! @param decay_length_x: the decay length in nanometers along x-axis of the distribution
-//! @param decay_length_y: the decay length in nanometers along y-axis of the distribution
-//! @param gamma: distribution orientation with respect to the corresponding lattice vector
-//! in radians
-IFTDecayFunction2D::IFTDecayFunction2D(double decay_length_x, double decay_length_y, double gamma)
-    : m_decay_length_x(decay_length_x), m_decay_length_y(decay_length_y), m_gamma(gamma)
-{
-    registerParameter("DecayLengthX", &m_decay_length_x).setUnit("nm").setNonnegative();
-    registerParameter("DecayLengthY", &m_decay_length_y).setUnit("nm").setNonnegative();
-    registerParameter("Gamma", &m_gamma).setUnit("rad").setLimited(-M_PI_2, M_PI_2);
-}
+// ************************************************************************** //
+// interface IIFTDecayFunction1D
+// ************************************************************************** //
 
 IFTDecayFunction2D::IFTDecayFunction2D(const NodeMeta& meta, const std::vector<double>& PValues)
     : INode(nodeMetaUnion({{"DecayLengthX", "nm", "Half-width along x axis", 0, INF, 1.},
@@ -38,7 +27,8 @@ IFTDecayFunction2D::IFTDecayFunction2D(const NodeMeta& meta, const std::vector<d
                            {"Gamma", "rad", "orientation with respect to the first lattice vector",
                             -M_PI_2, +M_PI_2, 0}},
                           meta),
-            PValues)
+            PValues),
+      m_decay_length_x(m_P[0]), m_decay_length_y(m_P[1]), m_gamma(m_P[2])
 {
 }
 
@@ -64,11 +54,19 @@ std::pair<double, double> IFTDecayFunction2D::transformToRecLatticeCoordinates(d
     return {qa, qb};
 }
 
+// ************************************************************************** //
+// class FTDecayFunction2DCauchy
+// ************************************************************************** //
+
+FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(const std::vector<double> P)
+    : IFTDecayFunction2D({"FTDecayFunction2DCauchy", "class_tooltip", {}}, P)
+{
+}
+
 FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(double decay_length_x, double decay_length_y,
                                                  double gamma)
-    : IFTDecayFunction2D(decay_length_x, decay_length_y, gamma)
+    : FTDecayFunction2DCauchy(std::vector<double>{decay_length_x, decay_length_y, gamma})
 {
-    setName("FTDecayFunction2DCauchy");
 }
 
 FTDecayFunction2DCauchy* FTDecayFunction2DCauchy::clone() const
@@ -83,11 +81,19 @@ double FTDecayFunction2DCauchy::evaluate(double qx, double qy) const
     return M_TWOPI * m_decay_length_x * m_decay_length_y * std::pow(1.0 + sum_sq, -1.5);
 }
 
+// ************************************************************************** //
+// class FTDecayFunction2DGauss
+// ************************************************************************** //
+
+FTDecayFunction2DGauss::FTDecayFunction2DGauss(const std::vector<double> P)
+    : IFTDecayFunction2D({"FTDecayFunction2DGauss", "class_tooltip", {}}, P)
+{
+}
+
 FTDecayFunction2DGauss::FTDecayFunction2DGauss(double decay_length_x, double decay_length_y,
                                                double gamma)
-    : IFTDecayFunction2D(decay_length_x, decay_length_y, gamma)
+    : FTDecayFunction2DGauss(std::vector<double>{decay_length_x, decay_length_y, gamma})
 {
-    setName("FTDecayFunction2DGauss");
 }
 
 FTDecayFunction2DGauss* FTDecayFunction2DGauss::clone() const
@@ -102,18 +108,28 @@ double FTDecayFunction2DGauss::evaluate(double qx, double qy) const
     return M_TWOPI * m_decay_length_x * m_decay_length_y * std::exp(-sum_sq / 2.0);
 }
 
+// ************************************************************************** //
+// class FTDecayFunction2DVoigt
+// ************************************************************************** //
+
 //! Constructor of two-dimensional pseudo-Voigt decay function in reciprocal space.
 //! @param decay_length_x: the decay length in nanometers along x-axis of the distribution
 //! @param decay_length_y: the decay length in nanometers along y-axis of the distribution
 //! @param eta: parameter [0,1] to balance between Cauchy (eta=0.0) and Gauss (eta=1.0)
 //! @param gamma: distribution orientation with respect to the first lattice vector in radians
 
+FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(const std::vector<double> P)
+    : IFTDecayFunction2D(
+        {"FTDecayFunction2DVoigt", "class_tooltip", {{"Eta", "", "para_tooltip", -INF, +INF, 0}}},
+        P),
+      m_eta(m_P[0])
+{
+}
+
 FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(double decay_length_x, double decay_length_y,
                                                double gamma, double eta)
-    : IFTDecayFunction2D(decay_length_x, decay_length_y, gamma), m_eta(eta)
+    : FTDecayFunction2DVoigt(std::vector<double>{decay_length_x, decay_length_y, gamma, eta})
 {
-    setName("FTDecayFunction2DVoigt");
-    registerParameter("Eta", &m_eta);
 }
 
 FTDecayFunction2DVoigt* FTDecayFunction2DVoigt::clone() const
diff --git a/Core/Correlations/FTDecay2D.h b/Core/Correlations/FTDecay2D.h
index 3d819af75dbbaa1a4dce46ab4067dd76269f8c0b..61cf7582d10e022fa89e3d6076dace1100ea2ad8 100644
--- a/Core/Correlations/FTDecay2D.h
+++ b/Core/Correlations/FTDecay2D.h
@@ -25,13 +25,12 @@
 class BA_CORE_API_ IFTDecayFunction2D : public ICloneable, public INode
 {
 public:
-    IFTDecayFunction2D(double decay_length_x, double decay_length_y, double gamma);
     IFTDecayFunction2D(const NodeMeta& meta, const std::vector<double>& PValues);
 
     virtual IFTDecayFunction2D* clone() const = 0;
 
     //! set angle between first lattice vector and X-axis of distribution (both in direct space)
-    void setGamma(double gamma) { m_gamma = gamma; }
+    void setGamma(double gamma) { m_P[2] = gamma; }
 
     //! get angle between first lattice vector and X-axis of distribution (both in direct space)
     double gamma() const { return m_gamma; }
@@ -50,9 +49,9 @@ public:
                                                                    double b, double alpha) const;
 
 protected:
-    double m_decay_length_x;
-    double m_decay_length_y;
-    double m_gamma;
+    const double& m_decay_length_x;
+    const double& m_decay_length_y;
+    const double& m_gamma;
 
 private:
     //! transform reciprocal coordinate system of this decay function to the reciprocal
@@ -68,6 +67,7 @@ private:
 class BA_CORE_API_ FTDecayFunction2DCauchy : public IFTDecayFunction2D
 {
 public:
+    FTDecayFunction2DCauchy(const std::vector<double> P);
     FTDecayFunction2DCauchy(double decay_length_x, double decay_length_y, double gamma);
 
     FTDecayFunction2DCauchy* clone() const;
@@ -82,6 +82,7 @@ public:
 class BA_CORE_API_ FTDecayFunction2DGauss : public IFTDecayFunction2D
 {
 public:
+    FTDecayFunction2DGauss(const std::vector<double> P);
     FTDecayFunction2DGauss(double decay_length_x, double decay_length_y, double gamma);
 
     FTDecayFunction2DGauss* clone() const;
@@ -95,6 +96,7 @@ public:
 class BA_CORE_API_ FTDecayFunction2DVoigt : public IFTDecayFunction2D
 {
 public:
+    FTDecayFunction2DVoigt(const std::vector<double> P);
     FTDecayFunction2DVoigt(double decay_length_x, double decay_length_y, double gamma, double eta);
 
     FTDecayFunction2DVoigt* clone() const;
@@ -103,7 +105,7 @@ public:
     double eta() const { return m_eta; }
 
 protected:
-    double m_eta;
+    const double& m_eta;
 };
 
 #endif // BORNAGAIN_CORE_AGGREGATE_FTDECAY2D_H
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index f0ff2f1e019c1d1d0fb29302b72adcfcbbb8d66a..2fb5a99c63cef65d3293672085aec958aadb88e5 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -10268,13 +10268,14 @@ class FTDecayFunction1DCauchy(IFTDecayFunction1D):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, decay_length):
+    def __init__(self, *args):
         r"""
+        __init__(FTDecayFunction1DCauchy self, vdouble1d_t P) -> FTDecayFunction1DCauchy
         __init__(FTDecayFunction1DCauchy self, double decay_length) -> FTDecayFunction1DCauchy
         FTDecayFunction1DCauchy::FTDecayFunction1DCauchy(double decay_length)
 
         """
-        _libBornAgainCore.FTDecayFunction1DCauchy_swiginit(self, _libBornAgainCore.new_FTDecayFunction1DCauchy(decay_length))
+        _libBornAgainCore.FTDecayFunction1DCauchy_swiginit(self, _libBornAgainCore.new_FTDecayFunction1DCauchy(*args))
 
     def clone(self):
         r"""
@@ -10319,13 +10320,14 @@ class FTDecayFunction1DGauss(IFTDecayFunction1D):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, decay_length):
+    def __init__(self, *args):
         r"""
+        __init__(FTDecayFunction1DGauss self, vdouble1d_t P) -> FTDecayFunction1DGauss
         __init__(FTDecayFunction1DGauss self, double decay_length) -> FTDecayFunction1DGauss
         FTDecayFunction1DGauss::FTDecayFunction1DGauss(double decay_length)
 
         """
-        _libBornAgainCore.FTDecayFunction1DGauss_swiginit(self, _libBornAgainCore.new_FTDecayFunction1DGauss(decay_length))
+        _libBornAgainCore.FTDecayFunction1DGauss_swiginit(self, _libBornAgainCore.new_FTDecayFunction1DGauss(*args))
 
     def clone(self):
         r"""
@@ -10370,13 +10372,14 @@ class FTDecayFunction1DTriangle(IFTDecayFunction1D):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, decay_length):
+    def __init__(self, *args):
         r"""
+        __init__(FTDecayFunction1DTriangle self, vdouble1d_t P) -> FTDecayFunction1DTriangle
         __init__(FTDecayFunction1DTriangle self, double decay_length) -> FTDecayFunction1DTriangle
         FTDecayFunction1DTriangle::FTDecayFunction1DTriangle(double decay_length)
 
         """
-        _libBornAgainCore.FTDecayFunction1DTriangle_swiginit(self, _libBornAgainCore.new_FTDecayFunction1DTriangle(decay_length))
+        _libBornAgainCore.FTDecayFunction1DTriangle_swiginit(self, _libBornAgainCore.new_FTDecayFunction1DTriangle(*args))
 
     def clone(self):
         r"""
@@ -10421,8 +10424,9 @@ class FTDecayFunction1DVoigt(IFTDecayFunction1D):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, decay_length, eta):
+    def __init__(self, *args):
         r"""
+        __init__(FTDecayFunction1DVoigt self, vdouble1d_t P) -> FTDecayFunction1DVoigt
         __init__(FTDecayFunction1DVoigt self, double decay_length, double eta) -> FTDecayFunction1DVoigt
         FTDecayFunction1DVoigt::FTDecayFunction1DVoigt(double decay_length, double eta)
 
@@ -10438,7 +10442,7 @@ class FTDecayFunction1DVoigt(IFTDecayFunction1D):
         parameter [0,1] to balance between Cauchy (eta=0.0) and Gauss (eta=1.0) 
 
         """
-        _libBornAgainCore.FTDecayFunction1DVoigt_swiginit(self, _libBornAgainCore.new_FTDecayFunction1DVoigt(decay_length, eta))
+        _libBornAgainCore.FTDecayFunction1DVoigt_swiginit(self, _libBornAgainCore.new_FTDecayFunction1DVoigt(*args))
 
     def clone(self):
         r"""
@@ -10581,13 +10585,14 @@ class FTDecayFunction2DCauchy(IFTDecayFunction2D):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, decay_length_x, decay_length_y, gamma):
+    def __init__(self, *args):
         r"""
+        __init__(FTDecayFunction2DCauchy self, vdouble1d_t P) -> FTDecayFunction2DCauchy
         __init__(FTDecayFunction2DCauchy self, double decay_length_x, double decay_length_y, double gamma) -> FTDecayFunction2DCauchy
         FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(double decay_length_x, double decay_length_y, double gamma=0)
 
         """
-        _libBornAgainCore.FTDecayFunction2DCauchy_swiginit(self, _libBornAgainCore.new_FTDecayFunction2DCauchy(decay_length_x, decay_length_y, gamma))
+        _libBornAgainCore.FTDecayFunction2DCauchy_swiginit(self, _libBornAgainCore.new_FTDecayFunction2DCauchy(*args))
 
     def clone(self):
         r"""
@@ -10634,13 +10639,14 @@ class FTDecayFunction2DGauss(IFTDecayFunction2D):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, decay_length_x, decay_length_y, gamma):
+    def __init__(self, *args):
         r"""
+        __init__(FTDecayFunction2DGauss self, vdouble1d_t P) -> FTDecayFunction2DGauss
         __init__(FTDecayFunction2DGauss self, double decay_length_x, double decay_length_y, double gamma) -> FTDecayFunction2DGauss
         FTDecayFunction2DGauss::FTDecayFunction2DGauss(double decay_length_x, double decay_length_y, double gamma=0)
 
         """
-        _libBornAgainCore.FTDecayFunction2DGauss_swiginit(self, _libBornAgainCore.new_FTDecayFunction2DGauss(decay_length_x, decay_length_y, gamma))
+        _libBornAgainCore.FTDecayFunction2DGauss_swiginit(self, _libBornAgainCore.new_FTDecayFunction2DGauss(*args))
 
     def clone(self):
         r"""
@@ -10687,8 +10693,9 @@ class FTDecayFunction2DVoigt(IFTDecayFunction2D):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, decay_length_x, decay_length_y, gamma, eta):
+    def __init__(self, *args):
         r"""
+        __init__(FTDecayFunction2DVoigt self, vdouble1d_t P) -> FTDecayFunction2DVoigt
         __init__(FTDecayFunction2DVoigt self, double decay_length_x, double decay_length_y, double gamma, double eta) -> FTDecayFunction2DVoigt
         FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(double decay_length_x, double decay_length_y, double eta, double gamma=0)
 
@@ -10710,7 +10717,7 @@ class FTDecayFunction2DVoigt(IFTDecayFunction2D):
         distribution orientation with respect to the first lattice vector in radians 
 
         """
-        _libBornAgainCore.FTDecayFunction2DVoigt_swiginit(self, _libBornAgainCore.new_FTDecayFunction2DVoigt(decay_length_x, decay_length_y, gamma, eta))
+        _libBornAgainCore.FTDecayFunction2DVoigt_swiginit(self, _libBornAgainCore.new_FTDecayFunction2DVoigt(*args))
 
     def clone(self):
         r"""
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index 7f97debda405ee17829737656cb337ef46355bd1..0cf6893d320c0973064ef97c09b64988bf5ef870 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -75686,16 +75686,37 @@ SWIGINTERN PyObject *IFTDecayFunction1D_swigregister(PyObject *SWIGUNUSEDPARM(se
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DCauchy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DCauchy__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FTDecayFunction1DCauchy *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FTDecayFunction1DCauchy" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FTDecayFunction1DCauchy *)new FTDecayFunction1DCauchy(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction1DCauchy, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DCauchy__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
   int ecode1 = 0 ;
-  PyObject *swig_obj[1] ;
   FTDecayFunction1DCauchy *result = 0 ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction1DCauchy" "', argument " "1"" of type '" "double""'");
@@ -75709,6 +75730,42 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DCauchy(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FTDecayFunction1DCauchy", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_FTDecayFunction1DCauchy__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FTDecayFunction1DCauchy__SWIG_0(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FTDecayFunction1DCauchy'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDecayFunction1DCauchy::FTDecayFunction1DCauchy(std::vector< double,std::allocator< double > > const)\n"
+    "    FTDecayFunction1DCauchy::FTDecayFunction1DCauchy(double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FTDecayFunction1DCauchy_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FTDecayFunction1DCauchy *arg1 = (FTDecayFunction1DCauchy *) 0 ;
@@ -75824,16 +75881,37 @@ SWIGINTERN PyObject *FTDecayFunction1DCauchy_swiginit(PyObject *SWIGUNUSEDPARM(s
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DGauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DGauss__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FTDecayFunction1DGauss *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FTDecayFunction1DGauss" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FTDecayFunction1DGauss *)new FTDecayFunction1DGauss(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction1DGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DGauss__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
   int ecode1 = 0 ;
-  PyObject *swig_obj[1] ;
   FTDecayFunction1DGauss *result = 0 ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction1DGauss" "', argument " "1"" of type '" "double""'");
@@ -75847,6 +75925,42 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DGauss(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FTDecayFunction1DGauss", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_FTDecayFunction1DGauss__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FTDecayFunction1DGauss__SWIG_0(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FTDecayFunction1DGauss'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDecayFunction1DGauss::FTDecayFunction1DGauss(std::vector< double,std::allocator< double > > const)\n"
+    "    FTDecayFunction1DGauss::FTDecayFunction1DGauss(double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FTDecayFunction1DGauss_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FTDecayFunction1DGauss *arg1 = (FTDecayFunction1DGauss *) 0 ;
@@ -75962,16 +76076,37 @@ SWIGINTERN PyObject *FTDecayFunction1DGauss_swiginit(PyObject *SWIGUNUSEDPARM(se
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DTriangle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DTriangle__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FTDecayFunction1DTriangle *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FTDecayFunction1DTriangle" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FTDecayFunction1DTriangle *)new FTDecayFunction1DTriangle(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction1DTriangle, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DTriangle__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
   int ecode1 = 0 ;
-  PyObject *swig_obj[1] ;
   FTDecayFunction1DTriangle *result = 0 ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction1DTriangle" "', argument " "1"" of type '" "double""'");
@@ -75985,6 +76120,42 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DTriangle(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FTDecayFunction1DTriangle", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_FTDecayFunction1DTriangle__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FTDecayFunction1DTriangle__SWIG_0(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FTDecayFunction1DTriangle'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDecayFunction1DTriangle::FTDecayFunction1DTriangle(std::vector< double,std::allocator< double > > const)\n"
+    "    FTDecayFunction1DTriangle::FTDecayFunction1DTriangle(double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FTDecayFunction1DTriangle_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FTDecayFunction1DTriangle *arg1 = (FTDecayFunction1DTriangle *) 0 ;
@@ -76100,7 +76271,30 @@ SWIGINTERN PyObject *FTDecayFunction1DTriangle_swiginit(PyObject *SWIGUNUSEDPARM
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DVoigt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DVoigt__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FTDecayFunction1DVoigt *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FTDecayFunction1DVoigt" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FTDecayFunction1DVoigt *)new FTDecayFunction1DVoigt(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction1DVoigt, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DVoigt__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -76108,10 +76302,9 @@ SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DVoigt(PyObject *SWIGUNUSEDPARM(s
   int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
   FTDecayFunction1DVoigt *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FTDecayFunction1DVoigt", 2, 2, swig_obj)) SWIG_fail;
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction1DVoigt" "', argument " "1"" of type '" "double""'");
@@ -76130,6 +76323,48 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DVoigt(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FTDecayFunction1DVoigt", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FTDecayFunction1DVoigt__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FTDecayFunction1DVoigt__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FTDecayFunction1DVoigt'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDecayFunction1DVoigt::FTDecayFunction1DVoigt(std::vector< double,std::allocator< double > > const)\n"
+    "    FTDecayFunction1DVoigt::FTDecayFunction1DVoigt(double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FTDecayFunction1DVoigt_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FTDecayFunction1DVoigt *arg1 = (FTDecayFunction1DVoigt *) 0 ;
@@ -76518,7 +76753,30 @@ SWIGINTERN PyObject *IFTDecayFunction2D_swigregister(PyObject *SWIGUNUSEDPARM(se
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DCauchy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DCauchy__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FTDecayFunction2DCauchy *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FTDecayFunction2DCauchy" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FTDecayFunction2DCauchy *)new FTDecayFunction2DCauchy(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DCauchy, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DCauchy__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -76529,10 +76787,9 @@ SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DCauchy(PyObject *SWIGUNUSEDPARM(
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FTDecayFunction2DCauchy *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FTDecayFunction2DCauchy", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction2DCauchy" "', argument " "1"" of type '" "double""'");
@@ -76556,6 +76813,54 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DCauchy(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FTDecayFunction2DCauchy", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FTDecayFunction2DCauchy__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FTDecayFunction2DCauchy__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FTDecayFunction2DCauchy'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(std::vector< double,std::allocator< double > > const)\n"
+    "    FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FTDecayFunction2DCauchy_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FTDecayFunction2DCauchy *arg1 = (FTDecayFunction2DCauchy *) 0 ;
@@ -76679,7 +76984,30 @@ SWIGINTERN PyObject *FTDecayFunction2DCauchy_swiginit(PyObject *SWIGUNUSEDPARM(s
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DGauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DGauss__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FTDecayFunction2DGauss *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FTDecayFunction2DGauss" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FTDecayFunction2DGauss *)new FTDecayFunction2DGauss(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DGauss__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -76690,10 +77018,9 @@ SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DGauss(PyObject *SWIGUNUSEDPARM(s
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FTDecayFunction2DGauss *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FTDecayFunction2DGauss", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction2DGauss" "', argument " "1"" of type '" "double""'");
@@ -76717,6 +77044,54 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DGauss(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FTDecayFunction2DGauss", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FTDecayFunction2DGauss__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FTDecayFunction2DGauss__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FTDecayFunction2DGauss'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDecayFunction2DGauss::FTDecayFunction2DGauss(std::vector< double,std::allocator< double > > const)\n"
+    "    FTDecayFunction2DGauss::FTDecayFunction2DGauss(double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FTDecayFunction2DGauss_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FTDecayFunction2DGauss *arg1 = (FTDecayFunction2DGauss *) 0 ;
@@ -76840,7 +77215,30 @@ SWIGINTERN PyObject *FTDecayFunction2DGauss_swiginit(PyObject *SWIGUNUSEDPARM(se
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DVoigt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DVoigt__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FTDecayFunction2DVoigt *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FTDecayFunction2DVoigt *)new FTDecayFunction2DVoigt(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DVoigt, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DVoigt__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -76854,10 +77252,9 @@ SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DVoigt(PyObject *SWIGUNUSEDPARM(s
   int ecode3 = 0 ;
   double val4 ;
   int ecode4 = 0 ;
-  PyObject *swig_obj[4] ;
   FTDecayFunction2DVoigt *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FTDecayFunction2DVoigt", 4, 4, swig_obj)) SWIG_fail;
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "1"" of type '" "double""'");
@@ -76886,6 +77283,60 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DVoigt(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FTDecayFunction2DVoigt", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FTDecayFunction2DVoigt__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FTDecayFunction2DVoigt__SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FTDecayFunction2DVoigt'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(std::vector< double,std::allocator< double > > const)\n"
+    "    FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(double,double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FTDecayFunction2DVoigt_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FTDecayFunction2DVoigt *arg1 = (FTDecayFunction2DVoigt *) 0 ;
@@ -126172,7 +126623,8 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "delete_IFTDecayFunction1D", _wrap_delete_IFTDecayFunction1D, METH_O, "delete_IFTDecayFunction1D(IFTDecayFunction1D self)"},
 	 { "IFTDecayFunction1D_swigregister", IFTDecayFunction1D_swigregister, METH_O, NULL},
-	 { "new_FTDecayFunction1DCauchy", _wrap_new_FTDecayFunction1DCauchy, METH_O, "\n"
+	 { "new_FTDecayFunction1DCauchy", _wrap_new_FTDecayFunction1DCauchy, METH_VARARGS, "\n"
+		"FTDecayFunction1DCauchy(vdouble1d_t P)\n"
 		"new_FTDecayFunction1DCauchy(double decay_length) -> FTDecayFunction1DCauchy\n"
 		"FTDecayFunction1DCauchy::FTDecayFunction1DCauchy(double decay_length)\n"
 		"\n"
@@ -126197,7 +126649,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_FTDecayFunction1DCauchy", _wrap_delete_FTDecayFunction1DCauchy, METH_O, "delete_FTDecayFunction1DCauchy(FTDecayFunction1DCauchy self)"},
 	 { "FTDecayFunction1DCauchy_swigregister", FTDecayFunction1DCauchy_swigregister, METH_O, NULL},
 	 { "FTDecayFunction1DCauchy_swiginit", FTDecayFunction1DCauchy_swiginit, METH_VARARGS, NULL},
-	 { "new_FTDecayFunction1DGauss", _wrap_new_FTDecayFunction1DGauss, METH_O, "\n"
+	 { "new_FTDecayFunction1DGauss", _wrap_new_FTDecayFunction1DGauss, METH_VARARGS, "\n"
+		"FTDecayFunction1DGauss(vdouble1d_t P)\n"
 		"new_FTDecayFunction1DGauss(double decay_length) -> FTDecayFunction1DGauss\n"
 		"FTDecayFunction1DGauss::FTDecayFunction1DGauss(double decay_length)\n"
 		"\n"
@@ -126222,7 +126675,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_FTDecayFunction1DGauss", _wrap_delete_FTDecayFunction1DGauss, METH_O, "delete_FTDecayFunction1DGauss(FTDecayFunction1DGauss self)"},
 	 { "FTDecayFunction1DGauss_swigregister", FTDecayFunction1DGauss_swigregister, METH_O, NULL},
 	 { "FTDecayFunction1DGauss_swiginit", FTDecayFunction1DGauss_swiginit, METH_VARARGS, NULL},
-	 { "new_FTDecayFunction1DTriangle", _wrap_new_FTDecayFunction1DTriangle, METH_O, "\n"
+	 { "new_FTDecayFunction1DTriangle", _wrap_new_FTDecayFunction1DTriangle, METH_VARARGS, "\n"
+		"FTDecayFunction1DTriangle(vdouble1d_t P)\n"
 		"new_FTDecayFunction1DTriangle(double decay_length) -> FTDecayFunction1DTriangle\n"
 		"FTDecayFunction1DTriangle::FTDecayFunction1DTriangle(double decay_length)\n"
 		"\n"
@@ -126248,6 +126702,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FTDecayFunction1DTriangle_swigregister", FTDecayFunction1DTriangle_swigregister, METH_O, NULL},
 	 { "FTDecayFunction1DTriangle_swiginit", FTDecayFunction1DTriangle_swiginit, METH_VARARGS, NULL},
 	 { "new_FTDecayFunction1DVoigt", _wrap_new_FTDecayFunction1DVoigt, METH_VARARGS, "\n"
+		"FTDecayFunction1DVoigt(vdouble1d_t P)\n"
 		"new_FTDecayFunction1DVoigt(double decay_length, double eta) -> FTDecayFunction1DVoigt\n"
 		"FTDecayFunction1DVoigt::FTDecayFunction1DVoigt(double decay_length, double eta)\n"
 		"\n"
@@ -126340,6 +126795,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_IFTDecayFunction2D", _wrap_delete_IFTDecayFunction2D, METH_O, "delete_IFTDecayFunction2D(IFTDecayFunction2D self)"},
 	 { "IFTDecayFunction2D_swigregister", IFTDecayFunction2D_swigregister, METH_O, NULL},
 	 { "new_FTDecayFunction2DCauchy", _wrap_new_FTDecayFunction2DCauchy, METH_VARARGS, "\n"
+		"FTDecayFunction2DCauchy(vdouble1d_t P)\n"
 		"new_FTDecayFunction2DCauchy(double decay_length_x, double decay_length_y, double gamma) -> FTDecayFunction2DCauchy\n"
 		"FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(double decay_length_x, double decay_length_y, double gamma=0)\n"
 		"\n"
@@ -126367,6 +126823,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FTDecayFunction2DCauchy_swigregister", FTDecayFunction2DCauchy_swigregister, METH_O, NULL},
 	 { "FTDecayFunction2DCauchy_swiginit", FTDecayFunction2DCauchy_swiginit, METH_VARARGS, NULL},
 	 { "new_FTDecayFunction2DGauss", _wrap_new_FTDecayFunction2DGauss, METH_VARARGS, "\n"
+		"FTDecayFunction2DGauss(vdouble1d_t P)\n"
 		"new_FTDecayFunction2DGauss(double decay_length_x, double decay_length_y, double gamma) -> FTDecayFunction2DGauss\n"
 		"FTDecayFunction2DGauss::FTDecayFunction2DGauss(double decay_length_x, double decay_length_y, double gamma=0)\n"
 		"\n"
@@ -126394,6 +126851,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FTDecayFunction2DGauss_swigregister", FTDecayFunction2DGauss_swigregister, METH_O, NULL},
 	 { "FTDecayFunction2DGauss_swiginit", FTDecayFunction2DGauss_swiginit, METH_VARARGS, NULL},
 	 { "new_FTDecayFunction2DVoigt", _wrap_new_FTDecayFunction2DVoigt, METH_VARARGS, "\n"
+		"FTDecayFunction2DVoigt(vdouble1d_t P)\n"
 		"new_FTDecayFunction2DVoigt(double decay_length_x, double decay_length_y, double gamma, double eta) -> FTDecayFunction2DVoigt\n"
 		"FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(double decay_length_x, double decay_length_y, double eta, double gamma=0)\n"
 		"\n"