diff --git a/CHANGELOG b/CHANGELOG
index 19e8b79330cca917b38a1968752b9634a32e150d..350682568c429d2722c3399d7ccd2de2abca372e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -7,6 +7,7 @@ BornAgain-1.17.99, work in progress
        (Lorentz, Debye-Bueche, Ornstein-Zernike)
     5) Removed default argument values from node constructors
     6) Swap order of arguments gamma and eta in 2D decay and distribution Voigt functions
+    7) FormFactorSphereLogNormalRadius is now positioned at center, not at bottom
   > Changes in build configuration:
     1) Python2 no longer supported
     2) OpenGL can no longer be deselected
diff --git a/Core/Aggregate/IInterferenceFunction.cpp b/Core/Aggregate/IInterferenceFunction.cpp
index 136b3cdc039ea7004a270f7ce80082ec70da8b38..4e31f7ed11c5486a0de32a48312e8d2ef891ae65 100644
--- a/Core/Aggregate/IInterferenceFunction.cpp
+++ b/Core/Aggregate/IInterferenceFunction.cpp
@@ -17,15 +17,16 @@
 #include <algorithm>
 #include <stdexcept>
 
-IInterferenceFunction::IInterferenceFunction() : m_position_var{0.0}
+IInterferenceFunction::IInterferenceFunction(const NodeMeta& meta,
+                                             const std::vector<double>& PValues)
+    : ISample(meta, PValues)
 {
-    init_parameters();
+    registerParameter("PositionVariance", &m_position_var).setUnit("nm^2").setNonnegative();
 }
 
-IInterferenceFunction::IInterferenceFunction(const IInterferenceFunction& other)
-    : m_position_var(other.m_position_var)
+IInterferenceFunction::IInterferenceFunction(double position_var) : m_position_var(position_var)
 {
-    init_parameters();
+    registerParameter("PositionVariance", &m_position_var).setUnit("nm^2").setNonnegative();
 }
 
 IInterferenceFunction::~IInterferenceFunction() = default;
@@ -58,8 +59,3 @@ double IInterferenceFunction::iff_no_inner(const kvector_t q, double outer_iff)
 {
     return DWfactor(q) * (iff_without_dw(q) * outer_iff - 1.0) + 1.0;
 }
-
-void IInterferenceFunction::init_parameters()
-{
-    registerParameter("PositionVariance", &m_position_var).setUnit("nm^2").setNonnegative();
-}
diff --git a/Core/Aggregate/IInterferenceFunction.h b/Core/Aggregate/IInterferenceFunction.h
index d49f052148327e39fd1ab6daa2daf7a456510945..2657a08b7d88ae27f8a4354914a554f226a804d0 100644
--- a/Core/Aggregate/IInterferenceFunction.h
+++ b/Core/Aggregate/IInterferenceFunction.h
@@ -24,8 +24,8 @@
 class BA_CORE_API_ IInterferenceFunction : public ISample
 {
 public:
-    IInterferenceFunction();
-    IInterferenceFunction(const IInterferenceFunction& other);
+    IInterferenceFunction(const NodeMeta& meta, const std::vector<double>& PValues);
+    IInterferenceFunction(double position_var);
     virtual ~IInterferenceFunction();
 
     virtual IInterferenceFunction* clone() const = 0;
@@ -57,8 +57,6 @@ protected:
     //! Calculates the structure factor without Debye-Waller factor
     virtual double iff_without_dw(const kvector_t q) const = 0;
 
-private:
-    void init_parameters();
     double m_position_var;
 };
 
diff --git a/Core/Aggregate/InterferenceFunction1DLattice.cpp b/Core/Aggregate/InterferenceFunction1DLattice.cpp
index 4b4d45a1f631c5e49fd6d7f6b5ce97dd0b3a38f6..39d73cc8c3af1627b6f508c6041efb95d3412efb 100644
--- a/Core/Aggregate/InterferenceFunction1DLattice.cpp
+++ b/Core/Aggregate/InterferenceFunction1DLattice.cpp
@@ -13,11 +13,11 @@
 // ************************************************************************** //
 
 #include "Core/Aggregate/InterferenceFunction1DLattice.h"
-#include "Core/Aggregate/FTDecay1D.h"
-#include "Core/Aggregate/FTDecay2D.h"
 #include "Core/Basics/Assert.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
+#include "Core/Correlations/FTDecay1D.h"
+#include "Core/Correlations/FTDecay2D.h"
 #include "Core/Parametrization/RealParameter.h"
 #include <algorithm>
 
@@ -33,7 +33,7 @@ static const int min_points = 4;
 //! @param length: lattice constant in nanometers
 //! @param xi: rotation of lattice with respect to x-axis in radians
 InterferenceFunction1DLattice::InterferenceFunction1DLattice(double length, double xi)
-    : m_length(length), m_xi(xi), m_na{0}
+    : IInterferenceFunction(0), m_length(length), m_xi(xi), m_na{0}
 {
     setName("Interference1DLattice");
     registerParameter("Length", &m_length).setUnit("nm").setNonnegative();
@@ -45,6 +45,7 @@ InterferenceFunction1DLattice::~InterferenceFunction1DLattice() {}
 InterferenceFunction1DLattice* InterferenceFunction1DLattice::clone() const
 {
     auto* ret = new InterferenceFunction1DLattice(m_length, m_xi);
+    ret->setPositionVariance(m_position_var);
     ret->m_na = m_na;
     if (mP_decay)
         ret->setDecayFunction(*mP_decay);
diff --git a/Core/Aggregate/InterferenceFunction2DLattice.cpp b/Core/Aggregate/InterferenceFunction2DLattice.cpp
index a7bf18bbc48ffbc80464d3a450dfe45e1be5db3e..6877abaef1034e3103368caaee87e8e4c6cfd743 100644
--- a/Core/Aggregate/InterferenceFunction2DLattice.cpp
+++ b/Core/Aggregate/InterferenceFunction2DLattice.cpp
@@ -26,6 +26,13 @@ static const int nmax = 20;
 static const int min_points = 4;
 } // namespace
 
+InterferenceFunction2DLattice::InterferenceFunction2DLattice(const Lattice2D& lattice)
+    : IInterferenceFunction(0), m_integrate_xi(false)
+{
+    setName("Interference2DLattice");
+    setLattice(lattice);
+}
+
 //! Constructor of two-dimensional interference function.
 //! @param length_1: length of the first basis vector in nanometers
 //! @param length_2: length of the second basis vector  in nanometers
@@ -33,24 +40,20 @@ static const int min_points = 4;
 //! @param xi: rotation of the lattice with respect to the x-axis (beam direction) in radians
 InterferenceFunction2DLattice::InterferenceFunction2DLattice(double length_1, double length_2,
                                                              double alpha, double xi)
-    : m_integrate_xi(false), m_na(0), m_nb(0)
-{
-    setName("Interference2DLattice");
-    setLattice(BasicLattice(length_1, length_2, alpha, xi));
-}
-
-InterferenceFunction2DLattice::InterferenceFunction2DLattice(const Lattice2D& lattice)
-    : m_integrate_xi(false)
+    : InterferenceFunction2DLattice(BasicLattice(length_1, length_2, alpha, xi))
 {
-    setName("Interference2DLattice");
-    setLattice(lattice);
 }
 
-InterferenceFunction2DLattice::~InterferenceFunction2DLattice() {}
+InterferenceFunction2DLattice::~InterferenceFunction2DLattice() = default;
 
 InterferenceFunction2DLattice* InterferenceFunction2DLattice::clone() const
 {
-    return new InterferenceFunction2DLattice(*this);
+    auto* ret = new InterferenceFunction2DLattice(*m_lattice);
+    ret->setPositionVariance(m_position_var);
+    ret->setIntegrationOverXi(integrationOverXi());
+    if (m_decay)
+        ret->setDecayFunction(*m_decay);
+    return ret;
 }
 
 //! Creates square lattice.
@@ -125,18 +128,6 @@ double InterferenceFunction2DLattice::iff_without_dw(const kvector_t q) const
            / M_TWOPI;
 }
 
-InterferenceFunction2DLattice::InterferenceFunction2DLattice(
-    const InterferenceFunction2DLattice& other)
-    : IInterferenceFunction(other)
-{
-    setName(other.getName());
-    if (other.m_lattice)
-        setLattice(*other.m_lattice);
-    if (other.m_decay)
-        setDecayFunction(*other.m_decay);
-    setIntegrationOverXi(other.integrationOverXi());
-}
-
 void InterferenceFunction2DLattice::setLattice(const Lattice2D& lattice)
 {
     m_lattice.reset(lattice.clone());
diff --git a/Core/Aggregate/InterferenceFunction2DLattice.h b/Core/Aggregate/InterferenceFunction2DLattice.h
index 2f2962174278ee78580b9c5a4e223760358fc64f..a86dd8c6cdcff69b8fe54bff1120d2759d22db62 100644
--- a/Core/Aggregate/InterferenceFunction2DLattice.h
+++ b/Core/Aggregate/InterferenceFunction2DLattice.h
@@ -15,9 +15,9 @@
 #ifndef BORNAGAIN_CORE_AGGREGATE_INTERFERENCEFUNCTION2DLATTICE_H
 #define BORNAGAIN_CORE_AGGREGATE_INTERFERENCEFUNCTION2DLATTICE_H
 
-#include "Core/Aggregate/FTDecay1D.h"
-#include "Core/Aggregate/FTDecay2D.h"
 #include "Core/Aggregate/IInterferenceFunction.h"
+#include "Core/Correlations/FTDecay1D.h"
+#include "Core/Correlations/FTDecay2D.h"
 #include "Core/Lattice/Lattice2D.h"
 #include "Core/Tools/Integrator.h"
 
@@ -54,7 +54,6 @@ public:
 
 private:
     double iff_without_dw(const kvector_t q) const override final;
-    InterferenceFunction2DLattice(const InterferenceFunction2DLattice& other);
     void setLattice(const Lattice2D& lattice);
 
     double interferenceForXi(double xi) const;
diff --git a/Core/Aggregate/InterferenceFunction2DParaCrystal.cpp b/Core/Aggregate/InterferenceFunction2DParaCrystal.cpp
index f67dc2c74e32219927259f6bb579c3104ebcf451..ce1c267879abbdc0b9e6f48a99cf0f129b64bae1 100644
--- a/Core/Aggregate/InterferenceFunction2DParaCrystal.cpp
+++ b/Core/Aggregate/InterferenceFunction2DParaCrystal.cpp
@@ -23,12 +23,14 @@ InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(const Latti
                                                                      double damping_length,
                                                                      double domain_size_1,
                                                                      double domain_size_2)
-    : m_integrate_xi(false), m_damping_length(damping_length)
+    : IInterferenceFunction(0), m_integrate_xi(false), m_damping_length(damping_length)
 {
     setName("Interference2DParaCrystal");
     setLattice(lattice);
     setDomainSizes(domain_size_1, domain_size_2);
-    init_parameters();
+    registerParameter("DampingLength", &m_damping_length).setUnit("nm").setNonnegative();
+    registerParameter("DomainSize1", &m_domain_sizes[0]).setUnit("nm").setNonnegative();
+    registerParameter("DomainSize2", &m_domain_sizes[1]).setUnit("nm").setNonnegative();
 }
 
 //! Constructor of interference function of two-dimensional paracrystal.
@@ -42,26 +44,22 @@ InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(double leng
                                                                      double length_2, double alpha,
                                                                      double xi,
                                                                      double damping_length)
-    : m_integrate_xi(false), m_damping_length(damping_length)
+    : InterferenceFunction2DParaCrystal(BasicLattice(length_1, length_2, alpha, xi), damping_length,
+                                        0, 0)
 {
-    setName("Interference2DParaCrystal");
-    setLattice(BasicLattice(length_1, length_2, alpha, xi));
-    setDomainSizes(0.0, 0.0);
-    init_parameters();
 }
 
-InterferenceFunction2DParaCrystal::~InterferenceFunction2DParaCrystal() {}
+InterferenceFunction2DParaCrystal::~InterferenceFunction2DParaCrystal() = default;
 
 InterferenceFunction2DParaCrystal* InterferenceFunction2DParaCrystal::clone() const
 {
-    return new InterferenceFunction2DParaCrystal(*this);
-}
-
-void InterferenceFunction2DParaCrystal::init_parameters()
-{
-    registerParameter("DampingLength", &m_damping_length).setUnit("nm").setNonnegative();
-    registerParameter("DomainSize1", &m_domain_sizes[0]).setUnit("nm").setNonnegative();
-    registerParameter("DomainSize2", &m_domain_sizes[1]).setUnit("nm").setNonnegative();
+    auto* ret = new InterferenceFunction2DParaCrystal(*m_lattice, m_damping_length,
+                                                      m_domain_sizes[0], m_domain_sizes[1]);
+    ret->setPositionVariance(m_position_var);
+    if (m_pdf1 && m_pdf2)
+        ret->setProbabilityDistributions(*m_pdf1, *m_pdf2);
+    ret->setIntegrationOverXi(m_integrate_xi);
+    return ret;
 }
 
 //! Sets the probability distributions (Fourier transformed) for the two lattice directions.
@@ -107,21 +105,6 @@ double InterferenceFunction2DParaCrystal::iff_without_dw(const kvector_t q) cons
            / M_TWOPI;
 }
 
-InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(
-    const InterferenceFunction2DParaCrystal& other)
-    : IInterferenceFunction(other)
-{
-    setName(other.getName());
-    m_damping_length = other.m_damping_length;
-    if (other.m_lattice)
-        setLattice(*other.m_lattice);
-    if (other.m_pdf1 && other.m_pdf2)
-        setProbabilityDistributions(*other.m_pdf1, *other.m_pdf2);
-    setDomainSizes(other.m_domain_sizes[0], other.m_domain_sizes[1]);
-    setIntegrationOverXi(other.m_integrate_xi);
-    init_parameters();
-}
-
 void InterferenceFunction2DParaCrystal::setLattice(const Lattice2D& lattice)
 {
     m_lattice.reset(lattice.clone());
diff --git a/Core/Aggregate/InterferenceFunction2DParaCrystal.h b/Core/Aggregate/InterferenceFunction2DParaCrystal.h
index 9bcb85d66c0084c450f88056a3be628917ff850b..5739bb0f7b0574a1e33b41ba4cf288c00f5ae845 100644
--- a/Core/Aggregate/InterferenceFunction2DParaCrystal.h
+++ b/Core/Aggregate/InterferenceFunction2DParaCrystal.h
@@ -15,9 +15,9 @@
 #ifndef BORNAGAIN_CORE_AGGREGATE_INTERFERENCEFUNCTION2DPARACRYSTAL_H
 #define BORNAGAIN_CORE_AGGREGATE_INTERFERENCEFUNCTION2DPARACRYSTAL_H
 
-#include "Core/Aggregate/FTDistributions2D.h"
 #include "Core/Aggregate/IInterferenceFunction.h"
 #include "Core/Basics/Complex.h"
+#include "Core/Correlations/FTDistributions2D.h"
 #include "Core/Lattice/Lattice2D.h"
 #include "Core/Tools/Integrator.h"
 #include <memory>
@@ -76,10 +76,8 @@ public:
 
 private:
     double iff_without_dw(const kvector_t q) const override final;
-    InterferenceFunction2DParaCrystal(const InterferenceFunction2DParaCrystal& other);
     void setLattice(const Lattice2D& lattice);
 
-    void init_parameters();
     double interferenceForXi(double xi) const;
     double interference1D(double qx, double qy, double xi, size_t index) const;
     complex_t FTPDF(double qx, double qy, double xi, size_t index) const;
@@ -88,7 +86,7 @@ private:
 
     bool m_integrate_xi; //!< Integrate over the orientation xi
     std::unique_ptr<IFTDistribution2D> m_pdf1, m_pdf2;
-    std::unique_ptr<Lattice2D> m_lattice;
+    std::unique_ptr<Lattice2D> m_lattice; // TODO ASAP name as in other i-fcts
     double m_damping_length;  //!< Damping length for removing delta function singularity at q=0.
     double m_domain_sizes[2]; //!< Coherence domain sizes
     mutable double m_qx;
diff --git a/Core/Aggregate/InterferenceFunction2DSuperLattice.cpp b/Core/Aggregate/InterferenceFunction2DSuperLattice.cpp
index 2d31ba94f9540f34444a93a749404ee9390d24d6..8a94239dc686236ac3dd910fd681bc47f651b365 100644
--- a/Core/Aggregate/InterferenceFunction2DSuperLattice.cpp
+++ b/Core/Aggregate/InterferenceFunction2DSuperLattice.cpp
@@ -21,17 +21,15 @@
 
 #include <limits>
 
-using MathFunctions::Laue;
-
 InterferenceFunction2DSuperLattice::InterferenceFunction2DSuperLattice(const Lattice2D& lattice,
                                                                        unsigned size_1,
                                                                        unsigned size_2)
-    : m_integrate_xi(false), mP_substructure(nullptr), m_size_1(size_1), m_size_2(size_2)
+    : IInterferenceFunction(0), m_integrate_xi(false), mP_substructure(nullptr), m_size_1(size_1),
+      m_size_2(size_2)
 {
     setName("Interference2DSuperLattice");
     setLattice(lattice);
     setSubstructureIFF(InterferenceFunctionNone());
-    init_parameters();
 }
 
 //! Constructor of two-dimensional interference function.
@@ -41,19 +39,20 @@ InterferenceFunction2DSuperLattice::InterferenceFunction2DSuperLattice(const Lat
 //! @param xi: rotation of lattice with respect to x-axis (beam direction) in radians
 InterferenceFunction2DSuperLattice::InterferenceFunction2DSuperLattice(
     double length_1, double length_2, double alpha, double xi, unsigned size_1, unsigned size_2)
-    : m_integrate_xi(false), mP_substructure(nullptr), m_size_1(size_1), m_size_2(size_2)
+    : InterferenceFunction2DSuperLattice(BasicLattice(length_1, length_2, alpha, xi), size_1,
+                                         size_2)
 {
-    setName("Interference2DSuperLattice");
-    setLattice(BasicLattice(length_1, length_2, alpha, xi));
-    setSubstructureIFF(InterferenceFunctionNone());
-    init_parameters();
 }
 
 InterferenceFunction2DSuperLattice::~InterferenceFunction2DSuperLattice() = default;
 
 InterferenceFunction2DSuperLattice* InterferenceFunction2DSuperLattice::clone() const
 {
-    return new InterferenceFunction2DSuperLattice(*this);
+    auto* ret = new InterferenceFunction2DSuperLattice(*mP_lattice, m_size_1, m_size_2);
+    ret->setPositionVariance(m_position_var);
+    ret->setSubstructureIFF(*mP_substructure);
+    ret->setIntegrationOverXi(integrationOverXi());
+    return ret;
 }
 
 void InterferenceFunction2DSuperLattice::setSubstructureIFF(const IInterferenceFunction& sub_iff)
@@ -122,26 +121,16 @@ std::vector<const INode*> InterferenceFunction2DSuperLattice::getChildren() cons
 
 double InterferenceFunction2DSuperLattice::iff_without_dw(const kvector_t q) const
 {
-    double a = mP_lattice->length1();
-    double b = mP_lattice->length2();
-    double xialpha = m_xi + mP_lattice->latticeAngle();
+    using MathFunctions::Laue;
 
-    double qadiv2 = (q.x() * a * std::cos(m_xi) + q.y() * a * std::sin(m_xi)) / 2.0;
-    double qbdiv2 = (q.x() * b * std::cos(xialpha) + q.y() * b * std::sin(xialpha)) / 2.0;
-    double ampl = Laue(qadiv2, m_size_1) * Laue(qbdiv2, m_size_2);
-    return ampl * ampl / (m_size_1 * m_size_2);
-}
+    const double a = mP_lattice->length1();
+    const double b = mP_lattice->length2();
+    const double xialpha = m_xi + mP_lattice->latticeAngle();
 
-InterferenceFunction2DSuperLattice::InterferenceFunction2DSuperLattice(
-    const InterferenceFunction2DSuperLattice& other)
-    : IInterferenceFunction(other), m_size_1(other.m_size_1), m_size_2(other.m_size_2)
-{
-    setName(other.getName());
-    if (other.mP_lattice)
-        setLattice(*other.mP_lattice);
-    setSubstructureIFF(*other.mP_substructure);
-    setIntegrationOverXi(other.integrationOverXi());
-    init_parameters();
+    const double qadiv2 = (q.x() * a * std::cos(m_xi) + q.y() * a * std::sin(m_xi)) / 2.0;
+    const double qbdiv2 = (q.x() * b * std::cos(xialpha) + q.y() * b * std::sin(xialpha)) / 2.0;
+    const double ampl = Laue(qadiv2, m_size_1) * Laue(qbdiv2, m_size_2);
+    return ampl * ampl / (m_size_1 * m_size_2);
 }
 
 void InterferenceFunction2DSuperLattice::setLattice(const Lattice2D& lattice)
@@ -150,15 +139,11 @@ void InterferenceFunction2DSuperLattice::setLattice(const Lattice2D& lattice)
     registerChild(mP_lattice.get());
 }
 
-void InterferenceFunction2DSuperLattice::init_parameters() {}
-
 double InterferenceFunction2DSuperLattice::interferenceForXi(double xi) const
 {
-    m_xi = xi;
-    kvector_t q = kvector_t(m_qx, m_qy, 0.0);
-    double outer_iff = iff_no_inner(q, m_outer_iff);
-
-    double delta_xi = xi - mP_lattice->rotationAngle();
-    q = q.rotatedZ(-delta_xi);
-    return mP_substructure->evaluate(q, outer_iff);
+    m_xi = xi; // TODO ASAP don't set as collateratel effect; rm mutable
+    const kvector_t q = kvector_t(m_qx, m_qy, 0.0);
+    const double outer_iff = iff_no_inner(q, m_outer_iff);
+    const double delta_xi = xi - mP_lattice->rotationAngle();
+    return mP_substructure->evaluate(q.rotatedZ(-delta_xi), outer_iff);
 }
diff --git a/Core/Aggregate/InterferenceFunction2DSuperLattice.h b/Core/Aggregate/InterferenceFunction2DSuperLattice.h
index b128650826cad6bc0684c914c3f629e3c832dd30..85b4b102c672165007e8f6427056e124e98fa252 100644
--- a/Core/Aggregate/InterferenceFunction2DSuperLattice.h
+++ b/Core/Aggregate/InterferenceFunction2DSuperLattice.h
@@ -56,10 +56,8 @@ public:
 
 private:
     double iff_without_dw(const kvector_t q) const override final;
-    InterferenceFunction2DSuperLattice(const InterferenceFunction2DSuperLattice& other);
     void setLattice(const Lattice2D& lattice);
 
-    void init_parameters();
     double interferenceForXi(double xi) const;
 
     bool m_integrate_xi; //!< Integrate over the orientation xi
diff --git a/Core/Aggregate/InterferenceFunction3DLattice.cpp b/Core/Aggregate/InterferenceFunction3DLattice.cpp
index 7b34359480d0a53f5a8db8a26da8c5af757f1e3c..e880abb4d86ceae4a4a4a2251f09a4fee2cada19 100644
--- a/Core/Aggregate/InterferenceFunction3DLattice.cpp
+++ b/Core/Aggregate/InterferenceFunction3DLattice.cpp
@@ -13,12 +13,12 @@
 // ************************************************************************** //
 
 #include "Core/Aggregate/InterferenceFunction3DLattice.h"
-#include "Core/Aggregate/IPeakShape.h"
 #include "Core/Basics/Exceptions.h"
+#include "Core/Correlations/IPeakShape.h"
 #include <algorithm>
 
 InterferenceFunction3DLattice::InterferenceFunction3DLattice(const Lattice& lattice)
-    : m_lattice(lattice), mP_peak_shape(nullptr), m_rec_radius(0.0)
+    : IInterferenceFunction(0), m_lattice(lattice), mP_peak_shape(nullptr), m_rec_radius(0.0)
 {
     setName("Interference3DLattice");
     initRecRadius();
@@ -28,7 +28,11 @@ InterferenceFunction3DLattice::~InterferenceFunction3DLattice() = default;
 
 InterferenceFunction3DLattice* InterferenceFunction3DLattice::clone() const
 {
-    return new InterferenceFunction3DLattice(*this);
+    auto* ret = new InterferenceFunction3DLattice(m_lattice);
+    ret->setPositionVariance(m_position_var);
+    if (mP_peak_shape)
+        ret->setPeakShape(*mP_peak_shape);
+    return ret;
 }
 
 void InterferenceFunction3DLattice::setPeakShape(const IPeakShape& peak_shape)
@@ -74,17 +78,6 @@ double InterferenceFunction3DLattice::iff_without_dw(const kvector_t q) const
     return result;
 }
 
-InterferenceFunction3DLattice::InterferenceFunction3DLattice(
-    const InterferenceFunction3DLattice& other)
-    : IInterferenceFunction(other), m_lattice(other.m_lattice), mP_peak_shape(nullptr),
-      m_rec_radius(0.0)
-{
-    setName(other.getName());
-    initRecRadius();
-    if (other.mP_peak_shape)
-        setPeakShape(*other.mP_peak_shape);
-}
-
 void InterferenceFunction3DLattice::initRecRadius()
 {
     kvector_t a1 = m_lattice.getBasisVectorA();
diff --git a/Core/Aggregate/InterferenceFunction3DLattice.h b/Core/Aggregate/InterferenceFunction3DLattice.h
index 9689ac98b6a88c968e2ad09ca321bedfbd451172..a37dcfe1bf5cbd23ad8060568fcd3e8a3a4cdd48 100644
--- a/Core/Aggregate/InterferenceFunction3DLattice.h
+++ b/Core/Aggregate/InterferenceFunction3DLattice.h
@@ -45,9 +45,9 @@ public:
 
 private:
     double iff_without_dw(const kvector_t q) const override final;
-    InterferenceFunction3DLattice(const InterferenceFunction3DLattice& other);
     void initRecRadius();
-    Lattice m_lattice;
+
+    Lattice m_lattice; // TODO ASAP unique_ptr as in otehr InterferenceFunction%s
     std::unique_ptr<IPeakShape> mP_peak_shape;
     double m_rec_radius; //!< radius in reciprocal space defining the nearest q vectors to use
 };
diff --git a/Core/Aggregate/InterferenceFunctionFinite2DLattice.cpp b/Core/Aggregate/InterferenceFunctionFinite2DLattice.cpp
index 844f8249c0fbc8472833db5df8ed4b596a209b7d..095b3e3c832b0971e31ca1a841d118b04dac9243 100644
--- a/Core/Aggregate/InterferenceFunctionFinite2DLattice.cpp
+++ b/Core/Aggregate/InterferenceFunctionFinite2DLattice.cpp
@@ -28,11 +28,10 @@ using MathFunctions::Laue;
 //! @param N_2: number of lattice cells in the second lattice direction
 InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice(const Lattice2D& lattice,
                                                                          unsigned N_1, unsigned N_2)
-    : m_integrate_xi(false), m_N_1(N_1), m_N_2(N_2)
+    : IInterferenceFunction(0), m_integrate_xi(false), m_N_1(N_1), m_N_2(N_2)
 {
     setName("InterferenceFinite2DLattice");
     setLattice(lattice);
-    init_parameters();
 }
 
 //! Constructor of two-dimensional finite lattice interference function.
@@ -46,18 +45,18 @@ InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice(double
                                                                          double length_2,
                                                                          double alpha, double xi,
                                                                          unsigned N_1, unsigned N_2)
-    : m_integrate_xi(false), m_N_1(N_1), m_N_2(N_2)
+    : InterferenceFunctionFinite2DLattice(BasicLattice(length_1, length_2, alpha, xi), N_1, N_2)
 {
-    setName("InterferenceFinite2DLattice");
-    setLattice(BasicLattice(length_1, length_2, alpha, xi));
-    init_parameters();
 }
 
 InterferenceFunctionFinite2DLattice::~InterferenceFunctionFinite2DLattice() = default;
 
 InterferenceFunctionFinite2DLattice* InterferenceFunctionFinite2DLattice::clone() const
 {
-    return new InterferenceFunctionFinite2DLattice(*this);
+    auto* ret = new InterferenceFunctionFinite2DLattice(*mP_lattice, m_N_1, m_N_2);
+    ret->setPositionVariance(m_position_var);
+    ret->setIntegrationOverXi(integrationOverXi());
+    return ret;
 }
 
 //! Creates square lattice.
@@ -109,8 +108,6 @@ std::vector<const INode*> InterferenceFunctionFinite2DLattice::getChildren() con
     return std::vector<const INode*>() << mP_lattice;
 }
 
-void InterferenceFunctionFinite2DLattice::init_parameters() {}
-
 double InterferenceFunctionFinite2DLattice::iff_without_dw(const kvector_t q) const
 {
     m_qx = q.x();
@@ -122,17 +119,6 @@ double InterferenceFunctionFinite2DLattice::iff_without_dw(const kvector_t q) co
            / M_TWOPI;
 }
 
-InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice(
-    const InterferenceFunctionFinite2DLattice& other)
-    : IInterferenceFunction(other), m_N_1(other.m_N_1), m_N_2(other.m_N_2)
-{
-    setName(other.getName());
-    if (other.mP_lattice)
-        setLattice(*other.mP_lattice);
-    setIntegrationOverXi(other.integrationOverXi());
-    init_parameters();
-}
-
 void InterferenceFunctionFinite2DLattice::setLattice(const Lattice2D& lattice)
 {
     mP_lattice.reset(lattice.clone());
diff --git a/Core/Aggregate/InterferenceFunctionFinite2DLattice.h b/Core/Aggregate/InterferenceFunctionFinite2DLattice.h
index ce41800c4415a63f17817b576eea72c158f32718..2563802c67f63263bba7d41f0a3d0a6491b0788c 100644
--- a/Core/Aggregate/InterferenceFunctionFinite2DLattice.h
+++ b/Core/Aggregate/InterferenceFunctionFinite2DLattice.h
@@ -54,10 +54,8 @@ public:
 
 private:
     double iff_without_dw(const kvector_t q) const override final;
-    InterferenceFunctionFinite2DLattice(const InterferenceFunctionFinite2DLattice& other);
     void setLattice(const Lattice2D& lattice);
 
-    void init_parameters();
     double interferenceForXi(double xi) const;
 
     bool m_integrate_xi; //!< Integrate over the orientation xi
diff --git a/Core/Aggregate/InterferenceFunctionFinite3DLattice.cpp b/Core/Aggregate/InterferenceFunctionFinite3DLattice.cpp
index e6e1518ba58cecf85a5b2a599301cbd9c8cfe630..37b792fe59a6d1b8073d64c595fb861076ecdc90 100644
--- a/Core/Aggregate/InterferenceFunctionFinite3DLattice.cpp
+++ b/Core/Aggregate/InterferenceFunctionFinite3DLattice.cpp
@@ -20,8 +20,6 @@
 
 #include <limits>
 
-using MathFunctions::Laue;
-
 //! Constructor of three-dimensional finite lattice interference function.
 //! @param lattice: object specifying a 2d lattice structure
 //! @param N_1: number of lattice cells in the first lattice direction
@@ -29,7 +27,7 @@ using MathFunctions::Laue;
 InterferenceFunctionFinite3DLattice::InterferenceFunctionFinite3DLattice(const Lattice& lattice,
                                                                          unsigned N_1, unsigned N_2,
                                                                          unsigned N_3)
-    : m_N_1(N_1), m_N_2(N_2), m_N_3(N_3)
+    : IInterferenceFunction(0), m_N_1(N_1), m_N_2(N_2), m_N_3(N_3)
 {
     setName("InterferenceFinite3DLattice");
     setLattice(lattice);
@@ -39,7 +37,9 @@ InterferenceFunctionFinite3DLattice::~InterferenceFunctionFinite3DLattice() = de
 
 InterferenceFunctionFinite3DLattice* InterferenceFunctionFinite3DLattice::clone() const
 {
-    return new InterferenceFunctionFinite3DLattice(*this);
+    auto* ret = new InterferenceFunctionFinite3DLattice(*mP_lattice, m_N_1, m_N_2, m_N_3);
+    ret->setPositionVariance(m_position_var);
+    return ret;
 }
 
 const Lattice& InterferenceFunctionFinite3DLattice::lattice() const
@@ -57,22 +57,14 @@ std::vector<const INode*> InterferenceFunctionFinite3DLattice::getChildren() con
 
 double InterferenceFunctionFinite3DLattice::iff_without_dw(const kvector_t q) const
 {
-    double qadiv2 = q.dot(mP_lattice->getBasisVectorA()) / 2.0;
-    double qbdiv2 = q.dot(mP_lattice->getBasisVectorB()) / 2.0;
-    double qcdiv2 = q.dot(mP_lattice->getBasisVectorC()) / 2.0;
-    double ampl = Laue(qadiv2, m_N_1) * Laue(qbdiv2, m_N_2) * Laue(qcdiv2, m_N_3);
+    using MathFunctions::Laue;
+    const double qadiv2 = q.dot(mP_lattice->getBasisVectorA()) / 2.0;
+    const double qbdiv2 = q.dot(mP_lattice->getBasisVectorB()) / 2.0;
+    const double qcdiv2 = q.dot(mP_lattice->getBasisVectorC()) / 2.0;
+    const double ampl = Laue(qadiv2, m_N_1) * Laue(qbdiv2, m_N_2) * Laue(qcdiv2, m_N_3);
     return ampl * ampl / (m_N_1 * m_N_2 * m_N_3);
 }
 
-InterferenceFunctionFinite3DLattice::InterferenceFunctionFinite3DLattice(
-    const InterferenceFunctionFinite3DLattice& other)
-    : IInterferenceFunction(other), m_N_1(other.m_N_1), m_N_2(other.m_N_2), m_N_3(other.m_N_3)
-{
-    setName(other.getName());
-    if (other.mP_lattice)
-        setLattice(*other.mP_lattice);
-}
-
 void InterferenceFunctionFinite3DLattice::setLattice(const Lattice& lattice)
 {
     mP_lattice.reset(new Lattice(lattice));
diff --git a/Core/Aggregate/InterferenceFunctionFinite3DLattice.h b/Core/Aggregate/InterferenceFunctionFinite3DLattice.h
index 84e2564fe44a3fa2f83d01824e8a01b5b3799e5a..cb78ed80172409c0522791ff54a60cf02062c0b2 100644
--- a/Core/Aggregate/InterferenceFunctionFinite3DLattice.h
+++ b/Core/Aggregate/InterferenceFunctionFinite3DLattice.h
@@ -44,7 +44,6 @@ public:
 
 private:
     double iff_without_dw(const kvector_t q) const override final;
-    InterferenceFunctionFinite3DLattice(const InterferenceFunctionFinite3DLattice& other);
     void setLattice(const Lattice& lattice);
 
     std::unique_ptr<Lattice> mP_lattice;
diff --git a/Core/Aggregate/InterferenceFunctionHardDisk.cpp b/Core/Aggregate/InterferenceFunctionHardDisk.cpp
index 8ecc36cef4a5f88ea41d1d8ed31f2bf7396a9fc9..fc1f769dcde0ab876eeb557032453d0ac95fc475 100644
--- a/Core/Aggregate/InterferenceFunctionHardDisk.cpp
+++ b/Core/Aggregate/InterferenceFunctionHardDisk.cpp
@@ -20,24 +20,28 @@
 namespace
 {
 static const double p = 7.0 / 3.0 - 4.0 * std::sqrt(3.0) / M_PI;
-double Czero(double packing);
+double Czero(double packing); // TODO ASAP why these variables?
 double S2(double packing);
 double W2(double x);
 } // namespace
 
-InterferenceFunctionHardDisk::InterferenceFunctionHardDisk(double radius, double density)
-    : m_radius(radius), m_density(density)
+InterferenceFunctionHardDisk::InterferenceFunctionHardDisk(double radius, double density,
+                                                           double position_var)
+    : IInterferenceFunction(position_var), m_radius(radius), m_density(density)
 {
     setName("InterferenceHardDisk");
-    validateParameters();
-    init_parameters();
+    if (m_radius < 0.0 || m_density < 0.0 || packingRatio() > 0.65)
+        throw std::runtime_error("InterferenceFunctionHardDisk::validateParameters: "
+                                 "radius and density must be positive and packing ratio between "
+                                 "0 and 0.65");
+    registerParameter("Radius", &m_radius).setUnit("nm").setNonnegative();
+    registerParameter("TotalParticleDensity", &m_density).setUnit("nm").setNonnegative();
 }
 
-InterferenceFunctionHardDisk::~InterferenceFunctionHardDisk() = default;
-
 InterferenceFunctionHardDisk* InterferenceFunctionHardDisk::clone() const
 {
-    return new InterferenceFunctionHardDisk(*this);
+    auto* ret = new InterferenceFunctionHardDisk(m_radius, m_density, m_position_var);
+    return ret;
 }
 
 double InterferenceFunctionHardDisk::getParticleDensity() const
@@ -55,15 +59,6 @@ double InterferenceFunctionHardDisk::density() const
     return m_density;
 }
 
-InterferenceFunctionHardDisk::InterferenceFunctionHardDisk(
-    const InterferenceFunctionHardDisk& other)
-    : IInterferenceFunction(other), m_radius(other.m_radius), m_density(other.m_density)
-{
-    setName("InterferenceHardDisk");
-    validateParameters();
-    init_parameters();
-}
-
 double InterferenceFunctionHardDisk::iff_without_dw(const kvector_t q) const
 {
     double qx = q.x();
@@ -79,20 +74,6 @@ double InterferenceFunctionHardDisk::iff_without_dw(const kvector_t q) const
     return 1.0 / (1.0 - rho * c_q);
 }
 
-void InterferenceFunctionHardDisk::init_parameters()
-{
-    registerParameter("Radius", &m_radius).setUnit("nm").setNonnegative();
-    registerParameter("TotalParticleDensity", &m_density).setUnit("nm").setNonnegative();
-}
-
-void InterferenceFunctionHardDisk::validateParameters() const
-{
-    if (m_radius < 0.0 || m_density < 0.0 || packingRatio() > 0.65)
-        throw std::runtime_error("InterferenceFunctionHardDisk::validateParameters: "
-                                 "radius and density must be positive and packing ratio between "
-                                 "0 and 0.65");
-}
-
 double InterferenceFunctionHardDisk::packingRatio() const
 {
     return M_PI * m_radius * m_radius * m_density;
diff --git a/Core/Aggregate/InterferenceFunctionHardDisk.h b/Core/Aggregate/InterferenceFunctionHardDisk.h
index 9e0b7f1286dbe2740afb6320a823437fee7e38fb..3845affa62eaa900c23695297a2b178e177aeda0 100644
--- a/Core/Aggregate/InterferenceFunctionHardDisk.h
+++ b/Core/Aggregate/InterferenceFunctionHardDisk.h
@@ -28,8 +28,8 @@
 class BA_CORE_API_ InterferenceFunctionHardDisk : public IInterferenceFunction
 {
 public:
-    InterferenceFunctionHardDisk(double radius, double density);
-    ~InterferenceFunctionHardDisk() final;
+    InterferenceFunctionHardDisk(double radius, double density, double position_var = 0);
+    ~InterferenceFunctionHardDisk() final = default;
 
     InterferenceFunctionHardDisk* clone() const override final;
 
@@ -41,14 +41,13 @@ public:
     double density() const;
 
 private:
-    InterferenceFunctionHardDisk(const InterferenceFunctionHardDisk& other);
     double iff_without_dw(const kvector_t q) const override final;
-    void init_parameters();
-    void validateParameters() const;
     double packingRatio() const;
     double integrand(double x) const;
+
     double m_radius;
     double m_density;
+
     mutable double m_q, m_c_zero, m_s2, m_packing;
     mutable RealIntegrator m_integrator;
 };
diff --git a/Core/Aggregate/InterferenceFunctionNone.cpp b/Core/Aggregate/InterferenceFunctionNone.cpp
index 4b335f297da7cc7d50ab146a6a630f7f8f6810f2..19d982a2f3fec39bb7ed3e8162738ae52e447266 100644
--- a/Core/Aggregate/InterferenceFunctionNone.cpp
+++ b/Core/Aggregate/InterferenceFunctionNone.cpp
@@ -14,23 +14,19 @@
 
 #include "Core/Aggregate/InterferenceFunctionNone.h"
 
-InterferenceFunctionNone::InterferenceFunctionNone()
+InterferenceFunctionNone::InterferenceFunctionNone() : IInterferenceFunction(0)
 {
     setName("InterferenceNone");
 }
 
 InterferenceFunctionNone* InterferenceFunctionNone::clone() const
 {
-    return new InterferenceFunctionNone(*this);
+    auto* ret = new InterferenceFunctionNone();
+    ret->setPositionVariance(m_position_var);
+    return ret;
 }
 
 double InterferenceFunctionNone::iff_without_dw(const kvector_t) const
 {
     return 1.0;
 }
-
-InterferenceFunctionNone::InterferenceFunctionNone(const InterferenceFunctionNone& other)
-    : IInterferenceFunction(other)
-{
-    setName(other.getName());
-}
diff --git a/Core/Aggregate/InterferenceFunctionNone.h b/Core/Aggregate/InterferenceFunctionNone.h
index 06134f1ca37790d762230a3e4d5b92cdea32911d..e15409116115684965834e9c53b252b35819fcd1 100644
--- a/Core/Aggregate/InterferenceFunctionNone.h
+++ b/Core/Aggregate/InterferenceFunctionNone.h
@@ -31,7 +31,6 @@ public:
 
 private:
     double iff_without_dw(const kvector_t q) const override final;
-    InterferenceFunctionNone(const InterferenceFunctionNone& other);
 };
 
 #endif // BORNAGAIN_CORE_AGGREGATE_INTERFERENCEFUNCTIONNONE_H
diff --git a/Core/Aggregate/InterferenceFunctionRadialParaCrystal.cpp b/Core/Aggregate/InterferenceFunctionRadialParaCrystal.cpp
index 22b05a6aa012306ff147593703f2d5dc641c51f3..7477a675ea88aef023c7484d8c092fee0b6a283a 100644
--- a/Core/Aggregate/InterferenceFunctionRadialParaCrystal.cpp
+++ b/Core/Aggregate/InterferenceFunctionRadialParaCrystal.cpp
@@ -23,17 +23,12 @@
 //! @param damping_length: the damping (coherence) length of the paracrystal in nanometers
 InterferenceFunctionRadialParaCrystal::InterferenceFunctionRadialParaCrystal(double peak_distance,
                                                                              double damping_length)
-    : m_peak_distance(peak_distance), m_damping_length(damping_length), m_use_damping_length(true),
-      m_kappa(0.0), m_domain_size(0.0)
+    : IInterferenceFunction(0), m_peak_distance(peak_distance), m_damping_length(damping_length),
+      m_use_damping_length(true), m_kappa(0.0), m_domain_size(0.0)
 {
     setName("InterferenceRadialParaCrystal");
     if (m_damping_length == 0.0)
         m_use_damping_length = false;
-    init_parameters();
-}
-
-void InterferenceFunctionRadialParaCrystal::init_parameters()
-{
     registerParameter("PeakDistance", &m_peak_distance).setUnit("nm").setNonnegative();
     registerParameter("DampingLength", &m_damping_length).setUnit("nm").setNonnegative();
     registerParameter("SizeSpaceCoupling", &m_kappa).setNonnegative();
@@ -42,7 +37,13 @@ void InterferenceFunctionRadialParaCrystal::init_parameters()
 
 InterferenceFunctionRadialParaCrystal* InterferenceFunctionRadialParaCrystal::clone() const
 {
-    return new InterferenceFunctionRadialParaCrystal(*this);
+    auto* ret = new InterferenceFunctionRadialParaCrystal(m_peak_distance, m_damping_length);
+    ret->setPositionVariance(m_position_var);
+    if (mP_pdf)
+        ret->setProbabilityDistribution(*mP_pdf);
+    ret->setKappa(m_kappa);
+    ret->setDomainSize(m_domain_size);
+    return ret;
 }
 
 //! Sets size spacing coupling parameter of the Size Spacing Correlation Approximation.
@@ -133,15 +134,3 @@ double InterferenceFunctionRadialParaCrystal::iff_without_dw(const kvector_t q)
     }
     return result;
 }
-
-InterferenceFunctionRadialParaCrystal::InterferenceFunctionRadialParaCrystal(
-    const InterferenceFunctionRadialParaCrystal& other)
-    : IInterferenceFunction(other), m_peak_distance(other.m_peak_distance),
-      m_damping_length(other.m_damping_length), m_use_damping_length(other.m_use_damping_length),
-      m_kappa(other.m_kappa), m_domain_size(other.m_domain_size)
-{
-    setName(other.getName());
-    init_parameters();
-    if (other.mP_pdf)
-        setProbabilityDistribution(*other.mP_pdf);
-}
diff --git a/Core/Aggregate/InterferenceFunctionRadialParaCrystal.h b/Core/Aggregate/InterferenceFunctionRadialParaCrystal.h
index bc0dd14f22a430aac352e4e439f4d7d6cdf849fe..f39491b33f237df5039c5de53b3e7937e76d8b3e 100644
--- a/Core/Aggregate/InterferenceFunctionRadialParaCrystal.h
+++ b/Core/Aggregate/InterferenceFunctionRadialParaCrystal.h
@@ -15,9 +15,9 @@
 #ifndef BORNAGAIN_CORE_AGGREGATE_INTERFERENCEFUNCTIONRADIALPARACRYSTAL_H
 #define BORNAGAIN_CORE_AGGREGATE_INTERFERENCEFUNCTIONRADIALPARACRYSTAL_H
 
-#include "Core/Aggregate/FTDistributions1D.h"
 #include "Core/Aggregate/IInterferenceFunction.h"
 #include "Core/Basics/Complex.h"
+#include "Core/Correlations/FTDistributions1D.h"
 #include <memory>
 
 //! Interference function of radial paracrystal.
@@ -51,7 +51,6 @@ public:
 
 private:
     double iff_without_dw(const kvector_t q) const override final;
-    InterferenceFunctionRadialParaCrystal(const InterferenceFunctionRadialParaCrystal& other);
     void init_parameters();
 
     double m_peak_distance;  //!< the distance to the first neighbor peak
diff --git a/Core/Aggregate/InterferenceFunctionTwin.cpp b/Core/Aggregate/InterferenceFunctionTwin.cpp
index 78880f4526f91b99b397838d0ab4b4a52600fb34..686f0a9eb1744ede77ac702e47c9ee2315b1d593 100644
--- a/Core/Aggregate/InterferenceFunctionTwin.cpp
+++ b/Core/Aggregate/InterferenceFunctionTwin.cpp
@@ -18,16 +18,24 @@
 
 InterferenceFunctionTwin::InterferenceFunctionTwin(const kvector_t& direction, double mean_distance,
                                                    double std_dev)
-    : m_direction(direction), m_distance(mean_distance), m_std_dev(std_dev)
+    : IInterferenceFunction(0), m_direction(direction), m_distance(mean_distance),
+      m_std_dev(std_dev)
 {
     setName("InterferenceTwin");
-    validateParameters();
-    init_parameters();
+    if (m_direction.mag2() <= 0.0 || m_distance < 0.0 || m_std_dev < 0.0)
+        throw std::runtime_error(
+            "InterferenceFunctionTwin::validateParameters: mean distance, standard deviation and "
+            "length of direction vector should be positive");
+    registerVector("Direction", &m_direction, "");
+    registerParameter("Mean", &m_distance).setUnit("nm").setNonnegative();
+    registerParameter("StdDev", &m_std_dev).setUnit("nm").setNonnegative();
 }
 
 InterferenceFunctionTwin* InterferenceFunctionTwin::clone() const
 {
-    return new InterferenceFunctionTwin(*this);
+    auto* ret = new InterferenceFunctionTwin(m_direction, m_distance, m_std_dev);
+    ret->setPositionVariance(m_position_var);
+    return ret;
 }
 
 kvector_t InterferenceFunctionTwin::direction() const
@@ -45,15 +53,6 @@ double InterferenceFunctionTwin::stdDev() const
     return m_std_dev;
 }
 
-InterferenceFunctionTwin::InterferenceFunctionTwin(const InterferenceFunctionTwin& other)
-    : IInterferenceFunction(other), m_direction(other.m_direction), m_distance(other.m_distance),
-      m_std_dev(other.m_std_dev)
-{
-    setName("InterferenceTwin");
-    validateParameters();
-    init_parameters();
-}
-
 double InterferenceFunctionTwin::iff_without_dw(const kvector_t q) const
 {
     double q_proj = q.dot(m_direction.unit());
@@ -61,18 +60,3 @@ double InterferenceFunctionTwin::iff_without_dw(const kvector_t q) const
            + std::exp(-q_proj * q_proj * m_std_dev * m_std_dev / 2.0)
                  * std::cos(q_proj * m_distance);
 }
-
-void InterferenceFunctionTwin::validateParameters() const
-{
-    if (m_direction.mag2() <= 0.0 || m_distance < 0.0 || m_std_dev < 0.0)
-        throw std::runtime_error(
-            "InterferenceFunctionTwin::validateParameters: mean distance, standard deviation and "
-            "length of direction vector should be positive");
-}
-
-void InterferenceFunctionTwin::init_parameters()
-{
-    registerVector("Direction", &m_direction, "");
-    registerParameter("Mean", &m_distance).setUnit("nm").setNonnegative();
-    registerParameter("StdDev", &m_std_dev).setUnit("nm").setNonnegative();
-}
diff --git a/Core/Aggregate/InterferenceFunctionTwin.h b/Core/Aggregate/InterferenceFunctionTwin.h
index 8b1d291de5b2e400438110643a321096d348dfa5..a84be1e75c8c1bc0d219d9c28d567cb3d5b7da67 100644
--- a/Core/Aggregate/InterferenceFunctionTwin.h
+++ b/Core/Aggregate/InterferenceFunctionTwin.h
@@ -35,10 +35,8 @@ public:
     double stdDev() const;
 
 private:
-    InterferenceFunctionTwin(const InterferenceFunctionTwin& other);
     double iff_without_dw(const kvector_t q) const override final;
-    void validateParameters() const;
-    void init_parameters();
+
     kvector_t m_direction;
     double m_distance;
     double m_std_dev;
diff --git a/Core/Aggregate/ParticleLayout.cpp b/Core/Aggregate/ParticleLayout.cpp
index 6a4e9bfc3e139e5aa80a00c4b4423357ebd84194..46ecfd7ad8215400ce4f901072bc4abd40e88051 100644
--- a/Core/Aggregate/ParticleLayout.cpp
+++ b/Core/Aggregate/ParticleLayout.cpp
@@ -44,8 +44,6 @@ ParticleLayout::ParticleLayout() : mP_interference_function{nullptr}, m_total_pa
     registerWeight();
 }
 
-ParticleLayout::~ParticleLayout() {} // needs member class definitions => don't move to .h
-
 ParticleLayout::ParticleLayout(const IAbstractParticle& particle, double abundance)
     : mP_interference_function{nullptr}, m_total_particle_density{0.01}
 {
@@ -55,6 +53,8 @@ ParticleLayout::ParticleLayout(const IAbstractParticle& particle, double abundan
     registerWeight();
 }
 
+ParticleLayout::~ParticleLayout() {} // needs member class definitions => don't move to .h
+
 ParticleLayout* ParticleLayout::clone() const
 {
     ParticleLayout* p_result = new ParticleLayout();
diff --git a/Core/Aggregate/ParticleLayout.h b/Core/Aggregate/ParticleLayout.h
index b654197b73168f6426e16121be38d7ae6c8884d3..4d11e22cc05f9455d0de40391ca67f610e1b9789 100644
--- a/Core/Aggregate/ParticleLayout.h
+++ b/Core/Aggregate/ParticleLayout.h
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_CORE_AGGREGATE_PARTICLELAYOUT_H
 #define BORNAGAIN_CORE_AGGREGATE_PARTICLELAYOUT_H
 
-#include "Core/Aggregate/ILayout.h"
+#include "Core/Correlations/ILayout.h"
 #include "Core/Scattering/Rotations.h"
 #include "Core/Vector/Vectors3D.h"
 #include <memory>
diff --git a/Core/Basics/ICloneable.h b/Core/Basics/ICloneable.h
index 6d398a84f72e7fe3fa73962c220820bc7ad47837..b99104dcf44d29f087223e1b10d010eccdad261b 100644
--- a/Core/Basics/ICloneable.h
+++ b/Core/Basics/ICloneable.h
@@ -30,7 +30,7 @@ public:
     virtual ~ICloneable() = default;
 
     ICloneable(const ICloneable&) = delete;
-    ICloneable& operator=(const ICloneable&) = delete;
+    ICloneable(ICloneable&&) = default;
 
     virtual ICloneable* clone() const = 0;
     virtual void transferToCPP() {} //!< Used for Python overriding of clone (see swig/tweaks.py)
diff --git a/Core/Beam/FootprintGauss.cpp b/Core/Beam/FootprintGauss.cpp
index dd6a7a23ad737e412aca25beb12ae3cf31fc4ec6..4b68695fee88ea6d2c2733bd18ce4d8202d303f0 100644
--- a/Core/Beam/FootprintGauss.cpp
+++ b/Core/Beam/FootprintGauss.cpp
@@ -19,12 +19,12 @@
 
 FootprintGauss::FootprintGauss(double width_ratio) : IFootprintFactor(width_ratio)
 {
-    initialize();
+    setName("FootprintGauss");
 }
 
 FootprintGauss* FootprintGauss::clone() const
 {
-    return new FootprintGauss(*this);
+    return new FootprintGauss(m_width_ratio);
 }
 
 double FootprintGauss::calculate(double alpha) const
@@ -47,16 +47,6 @@ std::string FootprintGauss::print() const
     return result.str();
 }
 
-FootprintGauss::FootprintGauss(const FootprintGauss& other) : IFootprintFactor(other)
-{
-    initialize();
-}
-
-void FootprintGauss::initialize()
-{
-    setName("FootprintGauss");
-}
-
 static_assert(!std::is_copy_constructible<FootprintGauss>::value,
               "FootprintGauss should not be copy constructable");
 static_assert(!std::is_copy_assignable<FootprintGauss>::value,
diff --git a/Core/Beam/FootprintGauss.h b/Core/Beam/FootprintGauss.h
index 409526004ba0b4855888ebecf4833381182fe018..6269eb195172bbe39cb43f4b7a4814a9e65dd377 100644
--- a/Core/Beam/FootprintGauss.h
+++ b/Core/Beam/FootprintGauss.h
@@ -36,12 +36,6 @@ public:
 
     //! Print python-formatted footprint definition
     std::string print() const override;
-
-protected:
-    FootprintGauss(const FootprintGauss& other);
-
-private:
-    void initialize();
 };
 
 #endif // BORNAGAIN_CORE_BEAM_FOOTPRINTGAUSS_H
diff --git a/Core/Beam/FootprintSquare.cpp b/Core/Beam/FootprintSquare.cpp
index e5fc4cd7ad36967b3a585f7df2b694cb09d84179..d49208f24a78863173fe12b6e92b563704a32d4c 100644
--- a/Core/Beam/FootprintSquare.cpp
+++ b/Core/Beam/FootprintSquare.cpp
@@ -20,12 +20,12 @@
 
 FootprintSquare::FootprintSquare(double width_ratio) : IFootprintFactor(width_ratio)
 {
-    initialize();
+    setName("FootprintSquare");
 }
 
 FootprintSquare* FootprintSquare::clone() const
 {
-    return new FootprintSquare(*this);
+    return new FootprintSquare(m_width_ratio);
 }
 
 double FootprintSquare::calculate(double alpha) const
@@ -48,16 +48,6 @@ std::string FootprintSquare::print() const
     return result.str();
 }
 
-FootprintSquare::FootprintSquare(const FootprintSquare& other) : IFootprintFactor(other)
-{
-    initialize();
-}
-
-void FootprintSquare::initialize()
-{
-    setName("FootprintSquare");
-}
-
 static_assert(!std::is_copy_constructible<FootprintSquare>::value,
               "FootprintSquare should not be copy constructable");
 static_assert(!std::is_copy_assignable<FootprintSquare>::value,
diff --git a/Core/Beam/FootprintSquare.h b/Core/Beam/FootprintSquare.h
index 00a1146429484f2ff7ddb99c52ca603a47e35727..dfd2012de8108bae4f62ad332255934834924ae9 100644
--- a/Core/Beam/FootprintSquare.h
+++ b/Core/Beam/FootprintSquare.h
@@ -34,12 +34,6 @@ public:
 
     //! Print python-formatted footprint definition
     std::string print() const override;
-
-protected:
-    FootprintSquare(const FootprintSquare& other);
-
-private:
-    void initialize();
 };
 
 #endif // BORNAGAIN_CORE_BEAM_FOOTPRINTSQUARE_H
diff --git a/Core/Beam/IFootprintFactor.cpp b/Core/Beam/IFootprintFactor.cpp
index 44f8031da87c7d5875e6986b2b06b5eb9236d8dd..1393de32831b302f524c390d284097b181de41a1 100644
--- a/Core/Beam/IFootprintFactor.cpp
+++ b/Core/Beam/IFootprintFactor.cpp
@@ -16,12 +16,17 @@
 #include "Core/Parametrization/RealParameter.h"
 #include <stdexcept>
 
+IFootprintFactor::IFootprintFactor(const NodeMeta& meta, const std::vector<double>& PValues)
+    : INode(meta, PValues)
+{
+}
+
 IFootprintFactor::IFootprintFactor(double width_ratio) : m_width_ratio(width_ratio)
 {
     if (m_width_ratio < 0.0)
         throw std::runtime_error(
             "Error in IFootprintFactor::IFootprintFactor: width ratio is negative");
-    initialize();
+    registerParameter("BeamToSampleWidthRatio", &m_width_ratio).setNonnegative();
 }
 
 IFootprintFactor::~IFootprintFactor() = default;
@@ -33,14 +38,3 @@ void IFootprintFactor::setWidthRatio(double width_ratio)
             "Error in IFootprintFactor::setWidthRatio: width ratio is negative");
     m_width_ratio = width_ratio;
 }
-
-IFootprintFactor::IFootprintFactor(const IFootprintFactor& other)
-    : ICloneable(), m_width_ratio(other.m_width_ratio)
-{
-    initialize();
-}
-
-void IFootprintFactor::initialize()
-{
-    registerParameter("BeamToSampleWidthRatio", &m_width_ratio).setNonnegative();
-}
diff --git a/Core/Beam/IFootprintFactor.h b/Core/Beam/IFootprintFactor.h
index fbd502a778b1531813579ecfdf3bf5c59c9bc8d2..3496ba7f7bb29ad802632b6a1216db31d7a1d531 100644
--- a/Core/Beam/IFootprintFactor.h
+++ b/Core/Beam/IFootprintFactor.h
@@ -27,8 +27,9 @@ class Beam;
 class BA_CORE_API_ IFootprintFactor : public ICloneable, public INode
 {
 public:
-    IFootprintFactor() = delete;
+    IFootprintFactor(const NodeMeta& meta, const std::vector<double>& PValues);
     IFootprintFactor(double width_ratio);
+    IFootprintFactor() = delete;
     virtual ~IFootprintFactor();
 
     virtual IFootprintFactor* clone() const = 0;
@@ -43,12 +44,10 @@ public:
     virtual std::string print() const = 0;
 
 protected:
-    IFootprintFactor(const IFootprintFactor& other);
+    double m_width_ratio; //! Beam to sample width ratio
 
 private:
     void initialize();
-
-    double m_width_ratio; //! Beam to sample width ratio
 };
 
 inline std::ostream& operator<<(std::ostream& os, const IFootprintFactor& f_factor)
diff --git a/Core/Computation/DepthProbeComputationTerm.cpp b/Core/Computation/DepthProbeComputationTerm.cpp
index fb0cef22a23ec6e2c742124a65a661ad9a2fed60..3a4f0fa4dfd0e1c83427e9c14bc0a18ff16ad682 100644
--- a/Core/Computation/DepthProbeComputationTerm.cpp
+++ b/Core/Computation/DepthProbeComputationTerm.cpp
@@ -17,7 +17,7 @@
 #include "Core/Computation/DelayedProgressCounter.h"
 #include "Core/Computation/ProcessedSample.h"
 #include "Core/Multilayer/IFresnelMap.h"
-#include "Core/Multilayer/ILayerRTCoefficients.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 #include "Core/SimulationElement/DepthProbeElement.h"
 
 DepthProbeComputationTerm::DepthProbeComputationTerm(const ProcessedSample* p_sample)
diff --git a/Core/Computation/GISASSpecularComputation.cpp b/Core/Computation/GISASSpecularComputation.cpp
index e1b5050fb2cb17eaafd5b458e386e619c2c64b9b..f31c56bdf11a988ce8222de54ddcd69022a7e6a0 100644
--- a/Core/Computation/GISASSpecularComputation.cpp
+++ b/Core/Computation/GISASSpecularComputation.cpp
@@ -14,7 +14,7 @@
 
 #include "Core/Computation/GISASSpecularComputation.h"
 #include "Core/Multilayer/IFresnelMap.h"
-#include "Core/Multilayer/ILayerRTCoefficients.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 #include "Core/SimulationElement/SimulationElement.h"
 
 GISASSpecularComputation::GISASSpecularComputation(const IFresnelMap* p_fresnel_map)
diff --git a/Core/Computation/ProcessedLayout.cpp b/Core/Computation/ProcessedLayout.cpp
index 923e6664b2d85216e5838223986cb62ea642fd71..ee75fb7eeed8862654a0ae2dbdb371c3bbf3bffe 100644
--- a/Core/Computation/ProcessedLayout.cpp
+++ b/Core/Computation/ProcessedLayout.cpp
@@ -14,7 +14,7 @@
 
 #include "Core/Computation/ProcessedLayout.h"
 #include "Core/Aggregate/IInterferenceFunction.h"
-#include "Core/Aggregate/ILayout.h"
+#include "Core/Correlations/ILayout.h"
 #include "Core/Multilayer/FormFactorBAPol.h"
 #include "Core/Multilayer/FormFactorCoherentSum.h"
 #include "Core/Multilayer/FormFactorDWBA.h"
diff --git a/Core/Computation/RoughMultiLayerComputation.cpp b/Core/Computation/RoughMultiLayerComputation.cpp
index 9ca589dd1b0babbba22a5286fbfd8ebb8847e2d8..f1af55d634d6d1610fbf51e0f20ef52b71edfb29 100644
--- a/Core/Computation/RoughMultiLayerComputation.cpp
+++ b/Core/Computation/RoughMultiLayerComputation.cpp
@@ -16,12 +16,12 @@
 #include "Core/Basics/MathConstants.h"
 #include "Core/Computation/ProcessedSample.h"
 #include "Core/Multilayer/IFresnelMap.h"
-#include "Core/Multilayer/ILayerRTCoefficients.h"
 #include "Core/Multilayer/Layer.h"
 #include "Core/Multilayer/LayerInterface.h"
 #include "Core/Multilayer/LayerRoughness.h"
 #include "Core/Multilayer/MultiLayer.h"
 #include "Core/Multilayer/Slice.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 #include "Core/SimulationElement/SimulationElement.h"
 
 #include <cerf>
diff --git a/Core/Computation/SpecularComputation.cpp b/Core/Computation/SpecularComputation.cpp
index 5853c97524f0196a2ebf7d5f08486d90d518271a..51f0ab2489a8b66782c8cee5c04563c1d03e3e76 100644
--- a/Core/Computation/SpecularComputation.cpp
+++ b/Core/Computation/SpecularComputation.cpp
@@ -17,7 +17,7 @@
 #include "Core/Computation/ProgressHandler.h"
 #include "Core/Computation/SpecularStrategyBuilder.h"
 #include "Core/Multilayer/MultiLayer.h"
-#include "Core/SimulationElement/SpecularSimulationElement.h"
+#include "Core/Multilayer/SpecularSimulationElement.h"
 
 static_assert(std::is_copy_constructible<SpecularComputation>::value == false,
               "SpecularComputation should not be copy constructible");
diff --git a/Core/Computation/SpecularComputationTerm.cpp b/Core/Computation/SpecularComputationTerm.cpp
index 3929029dbf3e5061b21be76f863f084bbfe732bb..97bc5a205f9af6cce204802188316c499a93a8da 100644
--- a/Core/Computation/SpecularComputationTerm.cpp
+++ b/Core/Computation/SpecularComputationTerm.cpp
@@ -14,9 +14,9 @@
 
 #include "Core/Computation/SpecularComputationTerm.h"
 #include "Core/Computation/DelayedProgressCounter.h"
-#include "Core/Multilayer/ScalarRTCoefficients.h"
 #include "Core/Multilayer/SpecularScalarStrategy.h"
-#include "Core/SimulationElement/SpecularSimulationElement.h"
+#include "Core/Multilayer/SpecularSimulationElement.h"
+#include "Core/RT/ScalarRTCoefficients.h"
 
 SpecularComputationTerm::SpecularComputationTerm(std::unique_ptr<ISpecularStrategy> strategy)
     : m_Strategy(std::move(strategy)){};
diff --git a/Core/Aggregate/FTDecay1D.cpp b/Core/Correlations/FTDecay1D.cpp
similarity index 97%
rename from Core/Aggregate/FTDecay1D.cpp
rename to Core/Correlations/FTDecay1D.cpp
index 7a7ebcedba0e57afd21ef5b91b5b387a584df423..d09a5eab6c7aabc0c4a9ae46bfdfc8da7a8a460b 100644
--- a/Core/Aggregate/FTDecay1D.cpp
+++ b/Core/Correlations/FTDecay1D.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/FTDecay1D.cpp
+//! @file      Core/Correlations/FTDecay1D.cpp
 //! @brief     Implements class FTDistribution2DCauchy.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Core/Aggregate/FTDecay1D.h"
+#include "Core/Correlations/FTDecay1D.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/Parametrization/ParameterPool.h"
 #include "Core/Parametrization/RealParameter.h"
diff --git a/Core/Aggregate/FTDecay1D.h b/Core/Correlations/FTDecay1D.h
similarity index 98%
rename from Core/Aggregate/FTDecay1D.h
rename to Core/Correlations/FTDecay1D.h
index 4f50b54d513cfb3e5027b086ca99feaf24822794..e2bb139292b5ae880e9576b4f73d6d1d408917f1 100644
--- a/Core/Aggregate/FTDecay1D.h
+++ b/Core/Correlations/FTDecay1D.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/FTDecay1D.h
+//! @file      Core/Correlations/FTDecay1D.h
 //! @brief     Defines classes IFTDecayFunction1D, IFTDecayFunction2D,
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/Aggregate/FTDecay2D.cpp b/Core/Correlations/FTDecay2D.cpp
similarity index 98%
rename from Core/Aggregate/FTDecay2D.cpp
rename to Core/Correlations/FTDecay2D.cpp
index 14c3dc9e70ad1213e8dc81cf0ebb2103782fedf5..4582f9523b412e9856ce4c4c1b9ca9f606c371c3 100644
--- a/Core/Aggregate/FTDecay2D.cpp
+++ b/Core/Correlations/FTDecay2D.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/FTDecay2D.cpp
+//! @file      Core/Correlations/FTDecay2D.cpp
 //! @brief     Implements class FTDistribution2DCauchy.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Core/Aggregate/FTDecay2D.h"
+#include "Core/Correlations/FTDecay2D.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/Parametrization/ParameterPool.h"
 #include "Core/Parametrization/RealParameter.h"
diff --git a/Core/Aggregate/FTDecay2D.h b/Core/Correlations/FTDecay2D.h
similarity index 98%
rename from Core/Aggregate/FTDecay2D.h
rename to Core/Correlations/FTDecay2D.h
index 35582e311bbd3a431f33ad8386fb24ccd8ecf6d1..3d819af75dbbaa1a4dce46ab4067dd76269f8c0b 100644
--- a/Core/Aggregate/FTDecay2D.h
+++ b/Core/Correlations/FTDecay2D.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/FTDecay2D.h
+//! @file      Core/Correlations/FTDecay2D.h
 //! @brief     Defines classes IFTDecayFunction1D, IFTDecayFunction2D,
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/Aggregate/FTDistributions1D.cpp b/Core/Correlations/FTDistributions1D.cpp
similarity index 98%
rename from Core/Aggregate/FTDistributions1D.cpp
rename to Core/Correlations/FTDistributions1D.cpp
index 9729236120f39664088cfce823bf552057111b42..ff748bdef096ed75ed44aa8e37477072ef92af0f 100644
--- a/Core/Aggregate/FTDistributions1D.cpp
+++ b/Core/Correlations/FTDistributions1D.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/FTDistributions1D.cpp
+//! @file      Core/Correlations/FTDistributions1D.cpp
 //! @brief     Implements interface class IFTDistribution2D and children thereof.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Core/Aggregate/FTDistributions1D.h"
+#include "Core/Correlations/FTDistributions1D.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/Parametrization/ParameterPool.h"
diff --git a/Core/Aggregate/FTDistributions1D.h b/Core/Correlations/FTDistributions1D.h
similarity index 98%
rename from Core/Aggregate/FTDistributions1D.h
rename to Core/Correlations/FTDistributions1D.h
index 691685936fbdafd48c0ae6ee3721213de21996e9..479eba9cabfef339575a061fa37508408ad6d242 100644
--- a/Core/Aggregate/FTDistributions1D.h
+++ b/Core/Correlations/FTDistributions1D.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/FTDistributions1D.h
+//! @file      Core/Correlations/FTDistributions1D.h
 //! @brief     Defines interface class IFTDistribution1D, and children thereof
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -15,8 +15,8 @@
 #ifndef BORNAGAIN_CORE_AGGREGATE_FTDISTRIBUTIONS1D_H
 #define BORNAGAIN_CORE_AGGREGATE_FTDISTRIBUTIONS1D_H
 
-#include "Core/Aggregate/IDistribution1DSampler.h"
 #include "Core/Basics/ICloneable.h"
+#include "Core/Correlations/IDistribution1DSampler.h"
 #include "Core/Parametrization/INode.h"
 
 //! Interface for a one-dimensional distribution, with normalization adjusted so that
diff --git a/Core/Aggregate/FTDistributions2D.cpp b/Core/Correlations/FTDistributions2D.cpp
similarity index 98%
rename from Core/Aggregate/FTDistributions2D.cpp
rename to Core/Correlations/FTDistributions2D.cpp
index fc357b6765d838b00e22704e2a4511c20713039e..9461e81bab956c044cb8248431b359ba4138f536 100644
--- a/Core/Aggregate/FTDistributions2D.cpp
+++ b/Core/Correlations/FTDistributions2D.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/FTDistributions2D.cpp
+//! @file      Core/Correlations/FTDistributions2D.cpp
 //! @brief     Implements interface class IFTDistribution2D and children thereof.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Core/Aggregate/FTDistributions2D.h"
+#include "Core/Correlations/FTDistributions2D.h"
 #include "Core/Basics/Algorithms.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
diff --git a/Core/Aggregate/FTDistributions2D.h b/Core/Correlations/FTDistributions2D.h
similarity index 98%
rename from Core/Aggregate/FTDistributions2D.h
rename to Core/Correlations/FTDistributions2D.h
index 6be2b4698db6de779a0d8da837993e59735d6a6a..a284f2f813fcc5d4f3ef17d3b42145b928e1fdde 100644
--- a/Core/Aggregate/FTDistributions2D.h
+++ b/Core/Correlations/FTDistributions2D.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/FTDistributions2D.h
+//! @file      Core/Correlations/FTDistributions2D.h
 //! @brief     Defines interface class IFTDistribution2D, and children thereof.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -15,9 +15,9 @@
 #ifndef BORNAGAIN_CORE_AGGREGATE_FTDISTRIBUTIONS2D_H
 #define BORNAGAIN_CORE_AGGREGATE_FTDISTRIBUTIONS2D_H
 
-#include "Core/Aggregate/IDistribution2DSampler.h"
 #include "Core/Basics/ICloneable.h"
 #include "Core/Basics/MathConstants.h"
+#include "Core/Correlations/IDistribution2DSampler.h"
 #include "Core/Parametrization/INode.h"
 #include "Core/Tools/Integrator.h"
 
diff --git a/Core/Aggregate/IDistribution1DSampler.cpp b/Core/Correlations/IDistribution1DSampler.cpp
similarity index 96%
rename from Core/Aggregate/IDistribution1DSampler.cpp
rename to Core/Correlations/IDistribution1DSampler.cpp
index 07e31cf7cc13d82845ccf18c01c5e32bf9726db3..8d0fbce4faf23d67f53fdf6ec2557c8a4a0b4e59 100644
--- a/Core/Aggregate/IDistribution1DSampler.cpp
+++ b/Core/Correlations/IDistribution1DSampler.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/IDistribution1DSampler.cpp
+//! @file      Core/Correlations/IDistribution1DSampler.cpp
 //! @brief     Defines interface class IFTDistribution1D, and children thereof
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Core/Aggregate/IDistribution1DSampler.h"
+#include "Core/Correlations/IDistribution1DSampler.h"
 #include <random>
 
 IDistribution1DSampler::~IDistribution1DSampler() = default;
diff --git a/Core/Aggregate/IDistribution1DSampler.h b/Core/Correlations/IDistribution1DSampler.h
similarity index 97%
rename from Core/Aggregate/IDistribution1DSampler.h
rename to Core/Correlations/IDistribution1DSampler.h
index a7d78ef70e4421855b46f8f896722b3c3d606381..8ec301b8c18a24bab900a56407e5c1a19e713885 100644
--- a/Core/Aggregate/IDistribution1DSampler.h
+++ b/Core/Correlations/IDistribution1DSampler.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/IDistribution1DSampler.h
+//! @file      Core/Correlations/IDistribution1DSampler.h
 //! @brief     Defines interface class IFTDistribution1D, and children thereof
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/Aggregate/IDistribution2DSampler.cpp b/Core/Correlations/IDistribution2DSampler.cpp
similarity index 98%
rename from Core/Aggregate/IDistribution2DSampler.cpp
rename to Core/Correlations/IDistribution2DSampler.cpp
index 04d5ffdc60de5b1e8c2a9df828c13261c69eae6f..f1d889c3d5afe73f00ce922e709eea4e635de5a6 100644
--- a/Core/Aggregate/IDistribution2DSampler.cpp
+++ b/Core/Correlations/IDistribution2DSampler.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/IDistribution2DSampler.cpp
+//! @file      Core/Correlations/IDistribution2DSampler.cpp
 //! @brief     Defines interface class IFTDistribution1D, and children thereof
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Core/Aggregate/IDistribution2DSampler.h"
+#include "Core/Correlations/IDistribution2DSampler.h"
 #include <random>
 
 namespace
diff --git a/Core/Aggregate/IDistribution2DSampler.h b/Core/Correlations/IDistribution2DSampler.h
similarity index 97%
rename from Core/Aggregate/IDistribution2DSampler.h
rename to Core/Correlations/IDistribution2DSampler.h
index c09bb89ff87e3b87a5225c017670e6b8beaef07d..c47f538393607e7fe8c4da70533ca828622f9133 100644
--- a/Core/Aggregate/IDistribution2DSampler.h
+++ b/Core/Correlations/IDistribution2DSampler.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/IDistribution2DSampler.h
+//! @file      Core/Correlations/IDistribution2DSampler.h
 //! @brief     Defines interface class IFTDistribution1D, and children thereof
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/Aggregate/ILayout.cpp b/Core/Correlations/ILayout.cpp
similarity index 87%
rename from Core/Aggregate/ILayout.cpp
rename to Core/Correlations/ILayout.cpp
index 8a71d01ef0d07c490935181f18561118646d387c..3fb700e66f8c4eb4651e0a8c15e83b4adfbac624 100644
--- a/Core/Aggregate/ILayout.cpp
+++ b/Core/Correlations/ILayout.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/ILayout.cpp
+//! @file      Core/Correlations/ILayout.cpp
 //! @brief     Implements interface class ILayout.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Core/Aggregate/ILayout.h"
+#include "Core/Correlations/ILayout.h"
 
 ILayout::ILayout() : m_weight(1.0) {}
 
diff --git a/Core/Aggregate/ILayout.h b/Core/Correlations/ILayout.h
similarity index 98%
rename from Core/Aggregate/ILayout.h
rename to Core/Correlations/ILayout.h
index 57515f1f94e0757cf5d76142a5b04c213408f887..9f236f1a2416137ca50e9604097aa777d7293867 100644
--- a/Core/Aggregate/ILayout.h
+++ b/Core/Correlations/ILayout.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/ILayout.h
+//! @file      Core/Correlations/ILayout.h
 //! @brief     Defines and implements interface class ILayout.
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/Aggregate/IPeakShape.cpp b/Core/Correlations/IPeakShape.cpp
similarity index 86%
rename from Core/Aggregate/IPeakShape.cpp
rename to Core/Correlations/IPeakShape.cpp
index d92014cf5f9149e58bb4895c71834caa82358ad1..2104274ebd7794a5fc3992f7061326d0655b2bff 100644
--- a/Core/Aggregate/IPeakShape.cpp
+++ b/Core/Correlations/IPeakShape.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/IPeakShape.cpp
+//! @file      Core/Correlations/IPeakShape.cpp
 //! @brief     Implements the interface IPeakShape and subclasses.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Core/Aggregate/IPeakShape.h"
+#include "Core/Correlations/IPeakShape.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/Tools/MathFunctions.h"
 
@@ -48,7 +48,7 @@ double FisherPrefactor(double kappa)
     }
 }
 
-double VonMisesPrefactor(double kappa)
+double MisesPrefactor(double kappa)
 {
     if (kappa <= 0.0) {
         return 1.0 / (2.0 * M_PI);
@@ -79,6 +79,11 @@ double Cauchy3D(double q2, double domainsize)
 // class IPeakShape
 // ************************************************************************** //
 
+IPeakShape::IPeakShape(const NodeMeta& meta, const std::vector<double>& PValues)
+    : ISample(meta, PValues)
+{
+}
+
 IPeakShape::~IPeakShape() = default;
 
 // ************************************************************************** //
@@ -202,27 +207,26 @@ double LorentzFisherPeakShape::evaluate(const kvector_t q, const kvector_t q_lat
 }
 
 // ************************************************************************** //
-// class VonMisesFisherGaussPeakShape
+// class MisesFisherGaussPeakShape
 // ************************************************************************** //
 
-VonMisesFisherGaussPeakShape::VonMisesFisherGaussPeakShape(double max_intensity, double radial_size,
-                                                           kvector_t zenith, double kappa_1,
-                                                           double kappa_2)
+MisesFisherGaussPeakShape::MisesFisherGaussPeakShape(double max_intensity, double radial_size,
+                                                     kvector_t zenith, double kappa_1,
+                                                     double kappa_2)
     : m_max_intensity(max_intensity), m_radial_size(radial_size), m_zenith(zenith.unit()),
       m_kappa_1(kappa_1), m_kappa_2(kappa_2)
 {
 }
 
-VonMisesFisherGaussPeakShape::~VonMisesFisherGaussPeakShape() = default;
+MisesFisherGaussPeakShape::~MisesFisherGaussPeakShape() = default;
 
-VonMisesFisherGaussPeakShape* VonMisesFisherGaussPeakShape::clone() const
+MisesFisherGaussPeakShape* MisesFisherGaussPeakShape::clone() const
 {
-    return new VonMisesFisherGaussPeakShape(m_max_intensity, m_radial_size, m_zenith, m_kappa_1,
-                                            m_kappa_2);
+    return new MisesFisherGaussPeakShape(m_max_intensity, m_radial_size, m_zenith, m_kappa_1,
+                                         m_kappa_2);
 }
 
-double VonMisesFisherGaussPeakShape::evaluate(const kvector_t q,
-                                              const kvector_t q_lattice_point) const
+double MisesFisherGaussPeakShape::evaluate(const kvector_t q, const kvector_t q_lattice_point) const
 {
     // radial part
     double q_r = q.mag();
@@ -247,13 +251,13 @@ double VonMisesFisherGaussPeakShape::evaluate(const kvector_t q,
     m_phi = std::acos(q_ortho.unit().dot(m_ux));
     m_theta = std::acos(q.unit().dot(m_zenith));
     double pre_1 = FisherPrefactor(m_kappa_1);
-    double pre_2 = VonMisesPrefactor(m_kappa_2);
+    double pre_2 = MisesPrefactor(m_kappa_2);
     double integral =
         m_integrator.integrate([&](double phi) -> double { return integrand(phi); }, 0.0, M_TWOPI);
     return m_max_intensity * radial_part * pre_1 * pre_2 * integral;
 }
 
-double VonMisesFisherGaussPeakShape::integrand(double phi) const
+double MisesFisherGaussPeakShape::integrand(double phi) const
 {
     kvector_t u_q = std::sin(m_theta) * std::cos(phi) * m_ux
                     + std::sin(m_theta) * std::sin(phi) * m_uy + std::cos(m_theta) * m_zenith;
@@ -263,24 +267,24 @@ double VonMisesFisherGaussPeakShape::integrand(double phi) const
 }
 
 // ************************************************************************** //
-// class VonMisesGaussPeakShape
+// class MisesGaussPeakShape
 // ************************************************************************** //
 
-VonMisesGaussPeakShape::VonMisesGaussPeakShape(double max_intensity, double radial_size,
-                                               kvector_t zenith, double kappa)
+MisesGaussPeakShape::MisesGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith,
+                                         double kappa)
     : m_max_intensity(max_intensity), m_radial_size(radial_size), m_zenith(zenith.unit()),
       m_kappa(kappa)
 {
 }
 
-VonMisesGaussPeakShape::~VonMisesGaussPeakShape() = default;
+MisesGaussPeakShape::~MisesGaussPeakShape() = default;
 
-VonMisesGaussPeakShape* VonMisesGaussPeakShape::clone() const
+MisesGaussPeakShape* MisesGaussPeakShape::clone() const
 {
-    return new VonMisesGaussPeakShape(m_max_intensity, m_radial_size, m_zenith, m_kappa);
+    return new MisesGaussPeakShape(m_max_intensity, m_radial_size, m_zenith, m_kappa);
 }
 
-double VonMisesGaussPeakShape::evaluate(const kvector_t q, const kvector_t q_lattice_point) const
+double MisesGaussPeakShape::evaluate(const kvector_t q, const kvector_t q_lattice_point) const
 {
     m_uy = m_zenith.cross(q_lattice_point);
     kvector_t zxq = m_zenith.cross(q);
@@ -295,13 +299,13 @@ double VonMisesGaussPeakShape::evaluate(const kvector_t q, const kvector_t q_lat
     kvector_t q_ortho = q - q.dot(m_zenith) * m_zenith;
     m_phi = std::acos(q_ortho.unit().dot(m_ux));
     m_theta = std::acos(q.unit().dot(m_zenith));
-    double pre = VonMisesPrefactor(m_kappa);
+    double pre = MisesPrefactor(m_kappa);
     double integral =
         m_integrator.integrate([&](double phi) -> double { return integrand(phi); }, 0.0, M_TWOPI);
     return m_max_intensity * pre * integral;
 }
 
-double VonMisesGaussPeakShape::integrand(double phi) const
+double MisesGaussPeakShape::integrand(double phi) const
 {
     kvector_t q_rot = m_qr
                       * (std::sin(m_theta) * std::cos(phi) * m_ux
diff --git a/Core/Aggregate/IPeakShape.h b/Core/Correlations/IPeakShape.h
similarity index 84%
rename from Core/Aggregate/IPeakShape.h
rename to Core/Correlations/IPeakShape.h
index 4222fd1a39fe542bffa7c726750116a63aa43e69..0f369626916478b23a9257d1c6626193b9f2ab61 100644
--- a/Core/Aggregate/IPeakShape.h
+++ b/Core/Correlations/IPeakShape.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Aggregate/IPeakShape.h
+//! @file      Core/Correlations/IPeakShape.h
 //! @brief     Defines the interface IPeakShape and subclasses.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -26,6 +26,9 @@
 class BA_CORE_API_ IPeakShape : public ISample
 {
 public:
+    IPeakShape() = default;
+    IPeakShape(const NodeMeta& meta, const std::vector<double>& PValues);
+
     virtual ~IPeakShape();
 
     virtual IPeakShape* clone() const = 0;
@@ -83,7 +86,7 @@ private:
 };
 
 //! Class that implements a peak shape that is Gaussian in the radial direction and
-//! uses the von Mises-Fisher distribution in the angular direction.
+//! uses the Mises-Fisher distribution in the angular direction.
 //!
 //! @ingroup samples_internal
 
@@ -108,7 +111,7 @@ private:
 };
 
 //! Class that implements a peak shape that is Lorentzian in the radial direction and
-//! uses the von Mises-Fisher distribution in the angular direction.
+//! uses the Mises-Fisher distribution in the angular direction.
 //!
 //! @ingroup samples_internal
 
@@ -133,19 +136,19 @@ private:
 };
 
 //! Class that implements a peak shape that is Gaussian in the radial direction and a
-//! convolution of a von Mises-Fisher distribution with a von Mises distribution on the
+//! convolution of a Mises-Fisher distribution with a Mises distribution on the
 //! two-sphere
 //!
 //! @ingroup samples_internal
 
-class BA_CORE_API_ VonMisesFisherGaussPeakShape : public IPeakShape
+class BA_CORE_API_ MisesFisherGaussPeakShape : public IPeakShape
 {
 public:
-    VonMisesFisherGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith,
-                                 double kappa_1, double kappa_2);
-    ~VonMisesFisherGaussPeakShape() override;
+    MisesFisherGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith,
+                              double kappa_1, double kappa_2);
+    ~MisesFisherGaussPeakShape() override;
 
-    VonMisesFisherGaussPeakShape* clone() const override;
+    MisesFisherGaussPeakShape* clone() const override;
 
     void accept(INodeVisitor* visitor) const override { visitor->visit(this); }
 
@@ -164,19 +167,18 @@ private:
     mutable RealIntegrator m_integrator;
 };
 
-//! Class that implements a peak shape that is a convolution of a von Mises-Fisher distribution
+//! Class that implements a peak shape that is a convolution of a Mises-Fisher distribution
 //! with a 3d Gaussian
 //!
 //! @ingroup samples_internal
 
-class BA_CORE_API_ VonMisesGaussPeakShape : public IPeakShape
+class BA_CORE_API_ MisesGaussPeakShape : public IPeakShape
 {
 public:
-    VonMisesGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith,
-                           double kappa);
-    ~VonMisesGaussPeakShape() override;
+    MisesGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith, double kappa);
+    ~MisesGaussPeakShape() override;
 
-    VonMisesGaussPeakShape* clone() const override;
+    MisesGaussPeakShape* clone() const override;
 
     void accept(INodeVisitor* visitor) const override { visitor->visit(this); }
 
diff --git a/Core/Detector/ConvolutionDetectorResolution.cpp b/Core/Detector/ConvolutionDetectorResolution.cpp
index d684793139efde81e107f7f64b3889e031a0663c..23dc6c0223e34eedb7545b3a3f4f32aa2eef77a5 100644
--- a/Core/Detector/ConvolutionDetectorResolution.cpp
+++ b/Core/Detector/ConvolutionDetectorResolution.cpp
@@ -73,8 +73,6 @@ void ConvolutionDetectorResolution::applyDetectorResolution(
     }
 }
 
-void ConvolutionDetectorResolution::init_parameters() {}
-
 void ConvolutionDetectorResolution::setResolutionFunction(const IResolutionFunction2D& resFunc)
 {
     mp_res_function_2d.reset(resFunc.clone());
diff --git a/Core/Detector/ConvolutionDetectorResolution.h b/Core/Detector/ConvolutionDetectorResolution.h
index 4cafce71b500eadd918cab66616955cc4836e88c..56cd5f1cdf35516eba48e3e70476a90731a809e8 100644
--- a/Core/Detector/ConvolutionDetectorResolution.h
+++ b/Core/Detector/ConvolutionDetectorResolution.h
@@ -50,8 +50,6 @@ public:
 protected:
     ConvolutionDetectorResolution(const ConvolutionDetectorResolution& other);
 
-    virtual void init_parameters();
-
 private:
     void setResolutionFunction(const IResolutionFunction2D& resFunc);
     void apply1dConvolution(OutputData<double>* p_intensity_map) const;
diff --git a/Core/Detector/IDetector.cpp b/Core/Detector/IDetector.cpp
index ebfc2e1a5611f938f18a8dc70101737d1b6c8c05..b55d68c28739f4ca9416c32cf7ea738b530894ed 100644
--- a/Core/Detector/IDetector.cpp
+++ b/Core/Detector/IDetector.cpp
@@ -27,7 +27,7 @@ IDetector::IDetector()
 }
 
 IDetector::IDetector(const IDetector& other)
-    : ICloneable(), m_axes(other.m_axes), m_detection_properties(other.m_detection_properties)
+    : m_axes(other.m_axes), m_detection_properties(other.m_detection_properties)
 {
     if (other.mP_detector_resolution)
         setDetectorResolution(*other.mP_detector_resolution);
diff --git a/Core/Detector/RegionOfInterest.cpp b/Core/Detector/RegionOfInterest.cpp
index 4810384c41c934be5c6ce71d44b27d3bc9cfb3f8..dedd11e0bd2c5ea8e7e0693fadc593a32b9d7eef 100644
--- a/Core/Detector/RegionOfInterest.cpp
+++ b/Core/Detector/RegionOfInterest.cpp
@@ -49,7 +49,7 @@ RegionOfInterest* RegionOfInterest::clone() const
 RegionOfInterest::~RegionOfInterest() {}
 
 RegionOfInterest::RegionOfInterest(const RegionOfInterest& other)
-    : ICloneable(), m_rectangle(other.m_rectangle->clone()), m_ax1(other.m_ax1), m_ay1(other.m_ay1),
+    : m_rectangle(other.m_rectangle->clone()), m_ax1(other.m_ax1), m_ay1(other.m_ay1),
       m_ax2(other.m_ax2), m_ay2(other.m_ay2), m_glob_index0(other.m_glob_index0),
       m_detector_dims(other.m_detector_dims), m_roi_dims(other.m_roi_dims)
 {
diff --git a/Core/HardParticle/FormFactorFullSphere.cpp b/Core/HardParticle/FormFactorFullSphere.cpp
index e3856aa4646d2acfc8e225ca0bc337600c14cd9e..9d0a731646ffdb368e3c36e4d8d0d42bae81b2ad 100644
--- a/Core/HardParticle/FormFactorFullSphere.cpp
+++ b/Core/HardParticle/FormFactorFullSphere.cpp
@@ -18,6 +18,7 @@
 #include "Core/Parametrization/RealParameter.h"
 #include "Core/Particle/FormFactorWeighted.h"
 #include "Core/Scattering/Rotations.h"
+#include "Core/Vector/SomeFormFactors.h"
 
 //! Constructor of a full sphere.
 //! @param radius: radius of the sphere in nanometers
@@ -49,26 +50,10 @@ double FormFactorFullSphere::topZ(const IRotation& rotation) const
 
 complex_t FormFactorFullSphere::evaluate_for_q(cvector_t q) const
 {
-    double R = m_radius;
-    complex_t q1 =
-        sqrt(q.x() * q.x() + q.y() * q.y() + q.z() * q.z()); // NO sesquilinear dot product!
-    complex_t qR = q1 * R;
-
-    complex_t ret;
-    if (std::abs(qR) < 1e-4) { // relative error is O(qR^4) with small prefactor
-#ifdef POLYHEDRAL_DIAGNOSTIC
-        diagnosis = {0, 1};
-#endif
-        // expand sin(qR)-qR*cos(qR) up to qR^5
-        ret = 4 * M_PI / 3 * pow(R, 3) * (1. - 0.1 * pow(qR, 2));
-    } else {
-#ifdef POLYHEDRAL_DIAGNOSTIC
-        diagnosis = {0, 0};
-#endif
-        ret = 4 * M_PI * pow(q1, -3) * (sin(qR) - qR * cos(qR));
-    }
-    auto prefactor = m_position_at_center ? 1.0 : exp_I(q.z() * R);
-    return prefactor * ret;
+    complex_t ret = someff::ffSphere(q, m_radius);
+    if (!m_position_at_center)
+        ret *= exp_I(q.z() * m_radius);
+    return ret;
 }
 
 IFormFactor* FormFactorFullSphere::sliceFormFactor(ZLimits limits, const IRotation& rot,
diff --git a/Core/Instrument/AngularSpecScan.cpp b/Core/Instrument/AngularSpecScan.cpp
index b39d02b1bb99b232125485a44ceddda67403a19c..499eebb187b6e2fd93f21f4453511c9991d8d979 100644
--- a/Core/Instrument/AngularSpecScan.cpp
+++ b/Core/Instrument/AngularSpecScan.cpp
@@ -17,10 +17,10 @@
 #include "Core/Binning/FixedBinAxis.h"
 #include "Core/Binning/PointwiseAxis.h"
 #include "Core/Detector/ScanResolution.h"
+#include "Core/Multilayer/SpecularSimulationElement.h"
 #include "Core/Parametrization/ParameterSample.h"
 #include "Core/Parametrization/RangedDistributions.h"
 #include "Core/PyIO/PythonFormatting.h"
-#include "Core/SimulationElement/SpecularSimulationElement.h"
 #include "Core/Tools/PyFmt.h"
 #include "Fit/Tools/RealLimits.h"
 
diff --git a/Core/Instrument/IChiSquaredModule.cpp b/Core/Instrument/IChiSquaredModule.cpp
index bffd6b9ab1c609019b5d4a2bbdc15b8bc4f13475..5385f0d7ba08826eb6f81870402f079aa4892243 100644
--- a/Core/Instrument/IChiSquaredModule.cpp
+++ b/Core/Instrument/IChiSquaredModule.cpp
@@ -23,7 +23,7 @@ const IVarianceFunction* IChiSquaredModule::varianceFunction() const
     return m_variance_function.get();
 }
 
-IChiSquaredModule::IChiSquaredModule(const IChiSquaredModule& other) : ICloneable()
+IChiSquaredModule::IChiSquaredModule(const IChiSquaredModule& other)
 {
     if (other.m_variance_function)
         m_variance_function.reset(other.m_variance_function->clone());
diff --git a/Core/Instrument/IChiSquaredModule.h b/Core/Instrument/IChiSquaredModule.h
index 629358ba7909494abab9e0afabd0afe4592c7b33..617a0d783d306b9d1e4eb0f3a1622528318757a4 100644
--- a/Core/Instrument/IChiSquaredModule.h
+++ b/Core/Instrument/IChiSquaredModule.h
@@ -19,7 +19,6 @@
 #include <memory>
 
 class IVarianceFunction;
-class IIntensityNormalizer;
 class IIntensityFunction;
 
 //! Interface residual calculations.
diff --git a/Core/Instrument/QSpecScan.cpp b/Core/Instrument/QSpecScan.cpp
index ee7b91f001978e8caf8544c5f96d6d1e5a5d70f8..9524ee2ec196106299a3025d10e96665a8476221 100644
--- a/Core/Instrument/QSpecScan.cpp
+++ b/Core/Instrument/QSpecScan.cpp
@@ -16,10 +16,10 @@
 #include "Core/Binning/FixedBinAxis.h"
 #include "Core/Binning/PointwiseAxis.h"
 #include "Core/Detector/ScanResolution.h"
+#include "Core/Multilayer/SpecularSimulationElement.h"
 #include "Core/Parametrization/ParameterSample.h"
 #include "Core/Parametrization/RangedDistributions.h"
 #include "Core/PyIO/PythonFormatting.h"
-#include "Core/SimulationElement/SpecularSimulationElement.h"
 #include "Core/Tools/PyFmt.h"
 #include "Fit/Tools/RealLimits.h"
 
diff --git a/Core/Intensity/IIntensityNormalizer.cpp b/Core/Intensity/IIntensityNormalizer.cpp
deleted file mode 100644
index 6e92afcf3bd5fc674158cdf8990279e0296e2b6e..0000000000000000000000000000000000000000
--- a/Core/Intensity/IIntensityNormalizer.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Core/Intensity/IIntensityNormalizer.cpp
-//! @brief     Implements class IntensityNormalizer.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-// ************************************************************************** //
-
-#include "Core/Intensity/IIntensityNormalizer.h"
-
-void IntensityNormalizer::init_parameters()
-{
-    registerParameter("scale", &m_scale);
-    registerParameter("shift", &m_shift);
-}
-
-IntensityNormalizer* IntensityNormalizer::clone() const
-{
-    IntensityNormalizer* result = new IntensityNormalizer(m_scale, m_shift);
-    result->setMaximumIntensity(m_max_intensity);
-    result->setName(getName());
-    return result;
-}
-
-OutputData<double>* IntensityNormalizer::createNormalizedData(const OutputData<double>& data) const
-{
-    OutputData<double>* normalized_data = data.clone();
-    apply(*normalized_data);
-    return normalized_data;
-}
-
-void IntensityNormalizer::apply(OutputData<double>& data) const
-{
-    double factor = m_max_intensity;
-    if (factor == 0) {
-        // using self maximum amplitude for normalization
-        OutputData<double>::const_iterator it = std::max_element(data.begin(), data.end());
-        factor = *it;
-    }
-    if (factor == 0)
-        throw Exceptions::DivisionByZeroException("IntensityNormalizer::apply() -> "
-                                                  "Error! Maximum intensity is 0.");
-
-    for (auto& value : data) {
-        value = m_scale * (value / factor) + m_shift;
-    }
-}
diff --git a/Core/Intensity/IIntensityNormalizer.h b/Core/Intensity/IIntensityNormalizer.h
deleted file mode 100644
index 533ffc0695fa3fe71100496e21f09c4a87717194..0000000000000000000000000000000000000000
--- a/Core/Intensity/IIntensityNormalizer.h
+++ /dev/null
@@ -1,98 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Core/Intensity/IIntensityNormalizer.h
-//! @brief     Defines classes IOutputDataNormalizer,
-//!              OutputDataNormalizer, OutputDataSimpleNormalizer.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-// ************************************************************************** //
-
-#ifndef BORNAGAIN_CORE_INTENSITY_IINTENSITYNORMALIZER_H
-#define BORNAGAIN_CORE_INTENSITY_IINTENSITYNORMALIZER_H
-
-#include "Core/Basics/ICloneable.h"
-#include "Core/Intensity/OutputData.h"
-#include "Core/Parametrization/INode.h"
-
-//! Interface to OutputData normalizers.
-//! @ingroup algorithms_internal
-
-class BA_CORE_API_ IIntensityNormalizer : public ICloneable, public INode
-{
-public:
-    virtual ~IIntensityNormalizer() {}
-
-    virtual IIntensityNormalizer* clone() const = 0;
-
-    virtual OutputData<double>* createNormalizedData(const OutputData<double>& data) const = 0;
-
-    virtual void apply(OutputData<double>& data) const = 0;
-
-    virtual void setMaximumIntensity(double) = 0;
-};
-
-//! Standard OutputData normalizer, with configurable max_intensity.
-//! @ingroup algorithms_internal
-
-class BA_CORE_API_ IntensityNormalizer : public IIntensityNormalizer
-{
-public:
-    IntensityNormalizer(double scale = 1.0, double shift = 0.0)
-        : m_scale(scale), m_shift(shift), m_max_intensity(0.0)
-    {
-        setName("Normalizer");
-        init_parameters();
-    }
-
-    virtual ~IntensityNormalizer() {}
-
-    virtual IntensityNormalizer* clone() const;
-
-    void accept(INodeVisitor* visitor) const { visitor->visit(this); }
-
-    virtual OutputData<double>* createNormalizedData(const OutputData<double>& data) const;
-
-    void apply(OutputData<double>& data) const final;
-
-    virtual void setMaximumIntensity(double max_intensity) { m_max_intensity = max_intensity; }
-
-protected:
-    //! Registers some class members for later access via parameter pool
-    void init_parameters();
-
-    double m_scale;
-    double m_shift;
-    double m_max_intensity;
-};
-
-//! Simplified OutputData normalizer, with max_intensity=1.
-//! @ingroup algorithms_internal
-
-class BA_CORE_API_ IntensityScaleAndShiftNormalizer : public IntensityNormalizer
-{
-public:
-    IntensityScaleAndShiftNormalizer(double scale = 1.0, double shift = 0.0)
-        : IntensityNormalizer(scale, shift)
-    {
-        m_max_intensity = 1.0;
-    }
-
-    ~IntensityScaleAndShiftNormalizer() final {}
-
-    void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
-
-    void setMaximumIntensity(double) final {}
-
-    IntensityScaleAndShiftNormalizer* clone() const final
-    {
-        return new IntensityScaleAndShiftNormalizer(m_scale, m_shift);
-    }
-};
-
-#endif // BORNAGAIN_CORE_INTENSITY_IINTENSITYNORMALIZER_H
diff --git a/Core/Intensity/SimpleUnitConverters.cpp b/Core/Intensity/SimpleUnitConverters.cpp
index 770ede0fbcf49d2574c08a50bef8f6f1dbe36c13..9ed7a1f85228ae1d6a616f3db8adb21edf2bdbbb 100644
--- a/Core/Intensity/SimpleUnitConverters.cpp
+++ b/Core/Intensity/SimpleUnitConverters.cpp
@@ -12,10 +12,7 @@
 //
 // ************************************************************************** //
 
-#include <algorithm>
-#include <cmath>
-#include <stdexcept>
-
+#include "Core/Intensity/SimpleUnitConverters.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/Basics/Units.h"
 #include "Core/Beam/Beam.h"
@@ -23,7 +20,9 @@
 #include "Core/Detector/RegionOfInterest.h"
 #include "Core/Detector/SphericalDetector.h"
 #include "Core/Intensity/AxisNames.h"
-#include "Core/Intensity/SimpleUnitConverters.h"
+#include <algorithm>
+#include <cmath>
+#include <stdexcept>
 
 namespace
 {
diff --git a/Core/Lattice/Lattice2D.cpp b/Core/Lattice/Lattice2D.cpp
index c4b654b96b19901f9d9c237387482d74a0842955..d84615a126fe45b9bd3b9474b30bb3eee993af79 100644
--- a/Core/Lattice/Lattice2D.cpp
+++ b/Core/Lattice/Lattice2D.cpp
@@ -18,15 +18,23 @@
 #include "Core/Parametrization/RealParameter.h"
 #include <cmath>
 
-Lattice2D::Lattice2D(double rotation_angle) : m_xi(rotation_angle) {}
+Lattice2D::Lattice2D(const NodeMeta& meta, const std::vector<double>& PValues)
+    : INode(meta, PValues)
+{
+}
+
+Lattice2D::Lattice2D(double xi) : m_xi(xi)
+{
+    registerParameter("Xi", &m_xi).setUnit("rad");
+}
 
 Lattice2D::ReciprocalBases Lattice2D::reciprocalBases() const
 {
-    double sinalpha = std::sin(latticeAngle());
-    double ainv = M_TWOPI / length1() / sinalpha;
-    double binv = M_TWOPI / length2() / sinalpha;
-    double xi = rotationAngle();
-    double xialpha = xi + latticeAngle();
+    const double sinalpha = std::sin(latticeAngle());
+    const double ainv = M_TWOPI / length1() / sinalpha;
+    const double binv = M_TWOPI / length2() / sinalpha;
+    const double xi = rotationAngle();
+    const double xialpha = xi + latticeAngle();
 
     return {+ainv * std::sin(xialpha), -ainv * std::cos(xialpha), -binv * std::sin(xi),
             +binv * std::cos(xi)};
@@ -38,20 +46,12 @@ void Lattice2D::onChange()
         parent()->onChange();
 }
 
-Lattice2D::Lattice2D(const Lattice2D& other) : ICloneable()
-{
-    m_xi = other.m_xi;
-    setName(other.getName());
-}
-
-void Lattice2D::setRotationEnabled(bool enabled)
+void Lattice2D::setRotationEnabled(bool enabled) // TODO ASAP replace by generic mechanism
 {
     if (enabled) {
         if (parameter("Xi"))
             return;
-
         registerParameter("Xi", &m_xi).setUnit("rad");
-
     } else {
         removeParameter("Xi");
     }
@@ -59,20 +59,22 @@ void Lattice2D::setRotationEnabled(bool enabled)
 
 // --------------------------------------------------------------------------------------------- //
 
-BasicLattice::BasicLattice(double length1, double length2, double angle, double rotation_angle)
-    : Lattice2D(rotation_angle), m_length1(length1), m_length2(length2), m_angle(angle)
+BasicLattice::BasicLattice(double length1, double length2, double angle, double xi)
+    : Lattice2D(xi), m_length1(length1), m_length2(length2), m_angle(angle)
 {
     if (m_length1 <= 0.0 || m_length2 <= 0.0)
         throw std::runtime_error("BasicLattice::BasicLattice() -> Error. Lattice length can't be "
                                  "negative or zero.");
 
     setName("BasicLattice");
-    init_parameters();
+    registerParameter("LatticeLength1", &m_length1).setUnit("nm").setPositive();
+    registerParameter("LatticeLength2", &m_length2).setUnit("nm").setPositive();
+    registerParameter("Alpha", &m_angle).setUnit("rad");
 }
 
 BasicLattice* BasicLattice::clone() const
 {
-    return new BasicLattice(*this);
+    return new BasicLattice(m_length1, m_length2, m_angle, m_xi);
 }
 
 double BasicLattice::unitCellArea() const
@@ -80,37 +82,21 @@ double BasicLattice::unitCellArea() const
     return std::abs(m_length1 * m_length2 * std::sin(m_angle));
 }
 
-BasicLattice::BasicLattice(const BasicLattice& other)
-    : Lattice2D(other), m_length1(other.m_length1), m_length2(other.m_length2),
-      m_angle(other.m_angle)
-{
-    init_parameters();
-}
-
-void BasicLattice::init_parameters()
-{
-    registerParameter("LatticeLength1", &m_length1).setUnit("nm").setPositive();
-    registerParameter("LatticeLength2", &m_length2).setUnit("nm").setPositive();
-    registerParameter("Alpha", &m_angle).setUnit("rad");
-    registerParameter("Xi", &m_xi).setUnit("rad");
-}
-
 // --------------------------------------------------------------------------------------------- //
 
-SquareLattice::SquareLattice(double length, double rotation_angle)
-    : Lattice2D(rotation_angle), m_length(length)
+SquareLattice::SquareLattice(double length, double xi) : Lattice2D(xi), m_length(length)
 {
     if (m_length <= 0.0)
         throw std::runtime_error("SquareLattice::SquareLattice() -> Error. Lattice length can't be "
                                  "negative or zero.");
 
     setName("SquareLattice");
-    init_parameters();
+    registerParameter("LatticeLength", &m_length).setUnit("nm").setPositive();
 }
 
 SquareLattice* SquareLattice::clone() const
 {
-    return new SquareLattice(*this);
+    return new SquareLattice(m_length, m_xi);
 }
 
 double SquareLattice::latticeAngle() const
@@ -123,34 +109,21 @@ double SquareLattice::unitCellArea() const
     return std::abs(m_length * m_length);
 }
 
-SquareLattice::SquareLattice(const SquareLattice& other)
-    : Lattice2D(other), m_length(other.m_length)
-{
-    init_parameters();
-}
-
-void SquareLattice::init_parameters()
-{
-    registerParameter("LatticeLength", &m_length).setUnit("nm").setPositive();
-    registerParameter("Xi", &m_xi).setUnit("rad");
-}
-
 // --------------------------------------------------------------------------------------------- //
 
-HexagonalLattice::HexagonalLattice(double length, double rotation_angle)
-    : Lattice2D(rotation_angle), m_length(length)
+HexagonalLattice::HexagonalLattice(double length, double xi) : Lattice2D(xi), m_length(length)
 {
     if (m_length <= 0.0)
         throw std::runtime_error("HexagonalLattice::HexagonalLattice() -> Error. "
                                  "Lattice length can't be negative or zero.");
 
     setName("HexagonalLattice");
-    init_parameters();
+    registerParameter("LatticeLength", &m_length).setUnit("nm").setPositive();
 }
 
 HexagonalLattice* HexagonalLattice::clone() const
 {
-    return new HexagonalLattice(*this);
+    return new HexagonalLattice(m_length, m_xi);
 }
 
 double HexagonalLattice::latticeAngle() const
@@ -163,15 +136,3 @@ double HexagonalLattice::unitCellArea() const
     static const double sinval = std::sin(latticeAngle());
     return std::abs(m_length * m_length * sinval);
 }
-
-HexagonalLattice::HexagonalLattice(const HexagonalLattice& other)
-    : Lattice2D(other), m_length(other.m_length)
-{
-    init_parameters();
-}
-
-void HexagonalLattice::init_parameters()
-{
-    registerParameter("LatticeLength", &m_length).setUnit("nm").setPositive();
-    registerParameter("Xi", &m_xi).setUnit("rad");
-}
diff --git a/Core/Lattice/Lattice2D.h b/Core/Lattice/Lattice2D.h
index b78e2f6eeb77eff854fbbe7533784f2b89371fc2..0c401b245d7b0d4821d9197c8eabb2b954a7f982 100644
--- a/Core/Lattice/Lattice2D.h
+++ b/Core/Lattice/Lattice2D.h
@@ -21,8 +21,10 @@
 class BA_CORE_API_ Lattice2D : public ICloneable, public INode
 {
 public:
-    explicit Lattice2D(double rotation_angle);
-    Lattice2D* clone() const = 0;
+    Lattice2D(const NodeMeta& meta, const std::vector<double>& PValues);
+    explicit Lattice2D(double xi);
+
+    virtual Lattice2D* clone() const = 0;
 
     struct ReciprocalBases {
         double m_asx, m_asy; //!< x,y coordinates of a*
@@ -42,15 +44,16 @@ public:
 
 protected:
     virtual void onChange();
-    Lattice2D(const Lattice2D& other);
     double m_xi;
 };
 
 class BA_CORE_API_ BasicLattice : public Lattice2D
 {
 public:
-    BasicLattice(double length1, double length2, double angle, double rotation_angle);
+    BasicLattice(double length1, double length2, double angle, double xi);
+
     BasicLattice* clone() const;
+
     void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
 
     virtual double length1() const { return m_length1; }
@@ -59,9 +62,6 @@ public:
     virtual double unitCellArea() const;
 
 private:
-    BasicLattice(const BasicLattice& other);
-    void init_parameters();
-
     double m_length1, m_length2;
     double m_angle;
 };
@@ -69,8 +69,10 @@ private:
 class BA_CORE_API_ SquareLattice : public Lattice2D
 {
 public:
-    explicit SquareLattice(double length, double rotation_angle = 0.0);
+    SquareLattice(double length, double xi = 0.0);
+
     SquareLattice* clone() const;
+
     void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
 
     virtual double length1() const { return m_length; }
@@ -79,17 +81,16 @@ public:
     virtual double unitCellArea() const;
 
 private:
-    SquareLattice(const SquareLattice& other);
-    void init_parameters();
-
     double m_length;
 };
 
 class BA_CORE_API_ HexagonalLattice : public Lattice2D
 {
 public:
-    explicit HexagonalLattice(double length, double rotation_angle);
+    HexagonalLattice(double length, double xi);
+
     HexagonalLattice* clone() const;
+
     void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
 
     virtual double length1() const { return m_length; }
@@ -98,9 +99,6 @@ public:
     virtual double unitCellArea() const;
 
 private:
-    HexagonalLattice(const HexagonalLattice& other);
-    void init_parameters();
-
     double m_length;
 };
 
diff --git a/Core/Multilayer/FormFactorCoherentPart.cpp b/Core/Multilayer/FormFactorCoherentPart.cpp
index 156f0d6f2523eff21c3dc0791b3f45ea7cabfe45..f3a9ecddc2fcfd2ae9a77bc4f6102c7f0c35fbc5 100644
--- a/Core/Multilayer/FormFactorCoherentPart.cpp
+++ b/Core/Multilayer/FormFactorCoherentPart.cpp
@@ -14,7 +14,7 @@
 
 #include "Core/Multilayer/FormFactorCoherentPart.h"
 #include "Core/Multilayer/IFresnelMap.h"
-#include "Core/Multilayer/ILayerRTCoefficients.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 #include "Core/Scattering/IFormFactor.h"
 #include "Core/SimulationElement/SimulationElement.h"
 #include "Core/Vector/WavevectorInfo.h"
diff --git a/Core/Multilayer/FormFactorDWBA.cpp b/Core/Multilayer/FormFactorDWBA.cpp
index df60f4934ace8583eb0da2ed7c7e7deaa7594321..91c817e20975a909020727c188dbe7d3dbc95c2d 100644
--- a/Core/Multilayer/FormFactorDWBA.cpp
+++ b/Core/Multilayer/FormFactorDWBA.cpp
@@ -13,7 +13,7 @@
 // ************************************************************************** //
 
 #include "Core/Multilayer/FormFactorDWBA.h"
-#include "Core/Multilayer/ILayerRTCoefficients.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 #include "Core/Vector/WavevectorInfo.h"
 
 FormFactorDWBA::FormFactorDWBA(const IFormFactor& form_factor) : mP_form_factor(form_factor.clone())
diff --git a/Core/Multilayer/FormFactorDWBAPol.cpp b/Core/Multilayer/FormFactorDWBAPol.cpp
index ae8a2d305b49edd5e578a4889c6f80ea5b80b814..b0ad6cfdee67b97ef92970951ff78b876b4eb35b 100644
--- a/Core/Multilayer/FormFactorDWBAPol.cpp
+++ b/Core/Multilayer/FormFactorDWBAPol.cpp
@@ -13,7 +13,7 @@
 // ************************************************************************** //
 
 #include "Core/Multilayer/FormFactorDWBAPol.h"
-#include "Core/Multilayer/ILayerRTCoefficients.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 #include "Core/Vector/WavevectorInfo.h"
 
 namespace
diff --git a/Core/Multilayer/IFresnelMap.h b/Core/Multilayer/IFresnelMap.h
index b0f6020c03812774a4b17f83902dd721dec9fdc8..cc9d3aca2549c1330a3b675ee165e935da77f1e5 100644
--- a/Core/Multilayer/IFresnelMap.h
+++ b/Core/Multilayer/IFresnelMap.h
@@ -15,9 +15,9 @@
 #ifndef BORNAGAIN_CORE_MULTILAYER_IFRESNELMAP_H
 #define BORNAGAIN_CORE_MULTILAYER_IFRESNELMAP_H
 
-#include "Core/Multilayer/ILayerRTCoefficients.h"
 #include "Core/Multilayer/ISpecularStrategy.h"
 #include "Core/Multilayer/Slice.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 #include "Core/Vector/Vectors3D.h"
 #include "Wrap/WinDllMacros.h"
 #include <memory>
diff --git a/Core/Multilayer/ISpecularStrategy.h b/Core/Multilayer/ISpecularStrategy.h
index 7f8c2f568e99cf9ed4da57bbeae3fe6e58800aac..c7300fb50fcc76fe0c69939ce06d771b246c055d 100644
--- a/Core/Multilayer/ISpecularStrategy.h
+++ b/Core/Multilayer/ISpecularStrategy.h
@@ -15,8 +15,8 @@
 #ifndef BORNAGAIN_CORE_MULTILAYER_ISPECULARSTRATEGY_H
 #define BORNAGAIN_CORE_MULTILAYER_ISPECULARSTRATEGY_H
 
-#include "Core/Multilayer/ILayerRTCoefficients.h"
 #include "Core/Multilayer/Slice.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 
 //! Interface for the Fresnel computations, both in the scalar and magnetic case
 //!
diff --git a/Core/Multilayer/Layer.cpp b/Core/Multilayer/Layer.cpp
index 071ab7a7a69042b9048e4510bfba766d15b46be0..76e5d3097415f6ffabd9d0a178092833df652608 100644
--- a/Core/Multilayer/Layer.cpp
+++ b/Core/Multilayer/Layer.cpp
@@ -13,8 +13,8 @@
 // ************************************************************************** //
 
 #include "Core/Multilayer/Layer.h"
-#include "Core/Aggregate/ILayout.h"
 #include "Core/Basics/Exceptions.h"
+#include "Core/Correlations/ILayout.h"
 #include "Core/Parametrization/ParameterPool.h"
 #include "Core/Parametrization/RealParameter.h"
 
diff --git a/Core/Multilayer/LayerRoughness.cpp b/Core/Multilayer/LayerRoughness.cpp
index 0595c77d4688cae79910d233a0c2eee9804e714f..0e3f368640b274825076866fdb5ade1b117415a5 100644
--- a/Core/Multilayer/LayerRoughness.cpp
+++ b/Core/Multilayer/LayerRoughness.cpp
@@ -16,11 +16,6 @@
 #include "Core/Basics/MathConstants.h"
 #include "Core/Parametrization/RealParameter.h"
 
-LayerRoughness::LayerRoughness() : m_sigma(0), m_hurstParameter(0), m_lateralCorrLength(0)
-{
-    initialize();
-}
-
 //! Constructor of layer roughness.
 //! @param sigma: rms of the roughness in nanometers
 //! @param hurstParameter: hurst parameter which describes how jagged the interface,
@@ -28,11 +23,6 @@ LayerRoughness::LayerRoughness() : m_sigma(0), m_hurstParameter(0), m_lateralCor
 //! @param lateralCorrLength: lateral correlation length of the roughness in nanometers
 LayerRoughness::LayerRoughness(double sigma, double hurstParameter, double lateralCorrLength)
     : m_sigma(sigma), m_hurstParameter(hurstParameter), m_lateralCorrLength(lateralCorrLength)
-{
-    initialize();
-}
-
-void LayerRoughness::initialize()
 {
     setName("LayerBasicRoughness");
     registerParameter("Sigma", &m_sigma);
@@ -40,6 +30,8 @@ void LayerRoughness::initialize()
     registerParameter("CorrelationLength", &m_lateralCorrLength).setUnit("nm").setNonnegative();
 }
 
+LayerRoughness::LayerRoughness() : LayerRoughness(0, 0, 0) {}
+
 /* ************************************************************************* */
 //! Power spectral density of the surface roughness is a result of two-dimensional
 //! Fourier transform of the correlation function of the roughness profile.
diff --git a/Core/Multilayer/LayerRoughness.h b/Core/Multilayer/LayerRoughness.h
index bc1876a5925c873c654b200de408217fb5ec3a53..fa2d526c558bcf9581511b14c68b662a388ba987 100644
--- a/Core/Multilayer/LayerRoughness.h
+++ b/Core/Multilayer/LayerRoughness.h
@@ -29,8 +29,8 @@
 class BA_CORE_API_ LayerRoughness : public ISample
 {
 public:
-    LayerRoughness();
     LayerRoughness(double sigma, double hurstParameter, double lateralCorrLength);
+    LayerRoughness();
 
     LayerRoughness* clone() const
     {
@@ -61,13 +61,10 @@ public:
     //! Returns lateral correlation length
     double getLatteralCorrLength() const { return m_lateralCorrLength; }
 
-protected:
+private:
     double m_sigma;          //!< rms of roughness
     double m_hurstParameter; //!< Hurst parameter which describes how jagged the interface, 0<H<=1
     double m_lateralCorrLength; //!< lateral correlation length of the roughness
-
-private:
-    void initialize();
 };
 
 #endif // BORNAGAIN_CORE_MULTILAYER_LAYERROUGHNESS_H
diff --git a/Core/Multilayer/MatrixFresnelMap.h b/Core/Multilayer/MatrixFresnelMap.h
index c70eb3865ddeb8e739e4cd7ad921c60f3aecafc3..a6506d323bf955d9f74489f9074b2a7e28fa343e 100644
--- a/Core/Multilayer/MatrixFresnelMap.h
+++ b/Core/Multilayer/MatrixFresnelMap.h
@@ -16,9 +16,9 @@
 #define BORNAGAIN_CORE_MULTILAYER_MATRIXFRESNELMAP_H
 
 #include "Core/Multilayer/IFresnelMap.h"
-#include "Core/Multilayer/MatrixRTCoefficients.h"
-#include "Core/Multilayer/MatrixRTCoefficients_v2.h"
 #include "Core/Multilayer/SpecularMagneticStrategy.h"
+#include "Core/RT/MatrixRTCoefficients.h"
+#include "Core/RT/MatrixRTCoefficients_v2.h"
 #include <cstddef>
 #include <memory>
 #include <unordered_map>
diff --git a/Core/Multilayer/MultiLayer.cpp b/Core/Multilayer/MultiLayer.cpp
index e4acd6d916dd7a1172fb1089fbada701526ffe11..d101ca2680c3de7460ef2437d3b6b3dccdbcbecf 100644
--- a/Core/Multilayer/MultiLayer.cpp
+++ b/Core/Multilayer/MultiLayer.cpp
@@ -13,8 +13,8 @@
 // ************************************************************************** //
 
 #include "Core/Multilayer/MultiLayer.h"
-#include "Core/Aggregate/ILayout.h"
 #include "Core/Basics/Exceptions.h"
+#include "Core/Correlations/ILayout.h"
 #include "Core/Material/MaterialUtils.h"
 #include "Core/Multilayer/Layer.h"
 #include "Core/Multilayer/LayerFillLimits.h"
@@ -24,13 +24,14 @@
 #include "Core/Parametrization/ParameterPool.h"
 #include "Core/Parametrization/RealParameter.h"
 
-MultiLayer::MultiLayer() : m_crossCorrLength(0), m_roughness_model(RoughnessModel::DEFAULT)
+MultiLayer::MultiLayer() : m_crossCorrLength(0)
 {
     setName("MultiLayer");
-    init_parameters();
+    registerParameter("CrossCorrelationLength", &m_crossCorrLength).setUnit("nm").setNonnegative();
+    registerVector("ExternalField", &m_ext_field, "");
 }
 
-MultiLayer::~MultiLayer() {}
+MultiLayer::~MultiLayer() = default;
 
 MultiLayer* MultiLayer::clone() const
 {
@@ -126,13 +127,6 @@ std::vector<const INode*> MultiLayer::getChildren() const
     return result;
 }
 
-void MultiLayer::init_parameters()
-{
-    parameterPool()->clear(); // non-trivially needed
-    registerParameter("CrossCorrelationLength", &m_crossCorrLength).setUnit("nm").setNonnegative();
-    registerVector("ExternalField", &m_ext_field, "");
-}
-
 void MultiLayer::addAndRegisterLayer(Layer* child)
 {
     m_layers.push_back(child);
diff --git a/Core/Multilayer/MultiLayer.h b/Core/Multilayer/MultiLayer.h
index 81afc8a0c320cba79a64154ed191aa690050f104..a6d1696c26ca1cf78b5ad70720ece4f91e780e85 100644
--- a/Core/Multilayer/MultiLayer.h
+++ b/Core/Multilayer/MultiLayer.h
@@ -86,9 +86,6 @@ public:
     RoughnessModel roughnessModel() const { return m_roughness_model; }
 
 private:
-    //! Registers some class members for later access via parameter pool
-    void init_parameters();
-
     //! Adds the layer with simultaneous registration in parent class
     void addAndRegisterLayer(Layer* child);
 
@@ -113,7 +110,7 @@ private:
     //! external magnetic field (in A/m)
     kvector_t m_ext_field;
 
-    RoughnessModel m_roughness_model;
+    RoughnessModel m_roughness_model{RoughnessModel::DEFAULT};
 };
 
 #endif // BORNAGAIN_CORE_MULTILAYER_MULTILAYER_H
diff --git a/Core/Multilayer/MultiLayerUtils.cpp b/Core/Multilayer/MultiLayerUtils.cpp
index e36e3801f3619d605c861e3e17d4272401f6764a..440040433c7a24d42070c40caae41da2b90cc96f 100644
--- a/Core/Multilayer/MultiLayerUtils.cpp
+++ b/Core/Multilayer/MultiLayerUtils.cpp
@@ -13,7 +13,7 @@
 // ************************************************************************** //
 
 #include "Core/Multilayer/MultiLayerUtils.h"
-#include "Core/Aggregate/ILayout.h"
+#include "Core/Correlations/ILayout.h"
 #include "Core/Material/MaterialUtils.h"
 #include "Core/Multilayer/Layer.h"
 #include "Core/Multilayer/LayerFillLimits.h"
diff --git a/Core/Multilayer/RoughnessModels.cpp b/Core/Multilayer/RoughnessModels.cpp
index 3e32236115cd0f8763bf3d4c63c7c5f0d24eba66..d682ffacc812a7e2203d184c8d06da13b699898d 100644
--- a/Core/Multilayer/RoughnessModels.cpp
+++ b/Core/Multilayer/RoughnessModels.cpp
@@ -26,8 +26,5 @@ const std::map<RoughnessModel, std::string> roughnessModelNames = {
 
 std::string RoughnessModelWrap::roughnessModelName(RoughnessModel model)
 {
-    auto iter = roughnessModelNames.find(model);
-    if (iter != roughnessModelNames.end())
-        return iter->second;
-    return "Invalid roughness model";
+    return roughnessModelNames.at(model);
 }
diff --git a/Core/Multilayer/SampleProvider.h b/Core/Multilayer/SampleProvider.h
index e6cdb2c2bab43a698c518d9016869036c3225a4f..c797af356ac8157b8049456edd7bd72ff27988f8 100644
--- a/Core/Multilayer/SampleProvider.h
+++ b/Core/Multilayer/SampleProvider.h
@@ -28,7 +28,7 @@ class BA_CORE_API_ SampleProvider : public INode
 {
 public:
     SampleProvider();
-    SampleProvider(const SampleProvider& other);
+    SampleProvider(const SampleProvider& other); // TODO ASAP can't we clone?
     SampleProvider& operator=(const SampleProvider& other);
     ~SampleProvider();
 
diff --git a/Core/Multilayer/ScalarFresnelMap.cpp b/Core/Multilayer/ScalarFresnelMap.cpp
index 244f151f617dbf15899c127a8138bc9f8406de3e..8626644eb5113f9df69ed0c4f57575d130d6f645 100644
--- a/Core/Multilayer/ScalarFresnelMap.cpp
+++ b/Core/Multilayer/ScalarFresnelMap.cpp
@@ -13,8 +13,8 @@
 // ************************************************************************** //
 
 #include "Core/Multilayer/ScalarFresnelMap.h"
-#include "Core/Multilayer/ScalarRTCoefficients.h"
 #include "Core/Multilayer/Slice.h"
+#include "Core/RT/ScalarRTCoefficients.h"
 #include "Core/SimulationElement/SimulationElement.h"
 #include "Core/Vector/Vectors3D.h"
 #include <functional>
diff --git a/Core/Multilayer/ScalarFresnelMap.h b/Core/Multilayer/ScalarFresnelMap.h
index 8d04bd45e217b90a0aaeb061f99455c6e2ad051c..11b55d28558b4f9d230d390a8f7a6cedd225464d 100644
--- a/Core/Multilayer/ScalarFresnelMap.h
+++ b/Core/Multilayer/ScalarFresnelMap.h
@@ -17,7 +17,7 @@
 
 #include "Core/Multilayer/IFresnelMap.h"
 #include "Core/Multilayer/ISpecularStrategy.h"
-#include "Core/Multilayer/ScalarRTCoefficients.h"
+#include "Core/RT/ScalarRTCoefficients.h"
 #include <cstddef>
 #include <unordered_map>
 #include <utility>
diff --git a/Core/Multilayer/SpecularMagneticOldStrategy.h b/Core/Multilayer/SpecularMagneticOldStrategy.h
index 769397dda7338608ce97e7d7e890074c78c230c4..b4de99f94e6adc2b51d270957fc0a87c5c905d19 100644
--- a/Core/Multilayer/SpecularMagneticOldStrategy.h
+++ b/Core/Multilayer/SpecularMagneticOldStrategy.h
@@ -16,7 +16,7 @@
 #define BORNAGAIN_CORE_MULTILAYER_SPECULARMAGNETICOLDSTRATEGY_H
 
 #include "Core/Multilayer/ISpecularStrategy.h"
-#include "Core/Multilayer/MatrixRTCoefficients.h"
+#include "Core/RT/MatrixRTCoefficients.h"
 #include "Core/Vector/Vectors3D.h"
 #include <memory>
 #include <vector>
diff --git a/Core/Multilayer/SpecularMagneticStrategy.h b/Core/Multilayer/SpecularMagneticStrategy.h
index 1aad956c46dde63ea28cd4bb7529de8ed35921b3..3903b05119b1eda1a0ad624f9a947e4648e20acf 100644
--- a/Core/Multilayer/SpecularMagneticStrategy.h
+++ b/Core/Multilayer/SpecularMagneticStrategy.h
@@ -16,7 +16,7 @@
 #define BORNAGAIN_CORE_MULTILAYER_SPECULARMAGNETICSTRATEGY_H
 
 #include "Core/Multilayer/ISpecularStrategy.h"
-#include "Core/Multilayer/MatrixRTCoefficients_v2.h"
+#include "Core/RT/MatrixRTCoefficients_v2.h"
 #include "Core/Vector/Vectors3D.h"
 #include <memory>
 #include <vector>
diff --git a/Core/Multilayer/SpecularScalarStrategy.h b/Core/Multilayer/SpecularScalarStrategy.h
index 2178b99ac12937759e4790e76bd061ac143e7c0a..1ec39acd754b0d1cfcd55fa3aee31bdee1557bf6 100644
--- a/Core/Multilayer/SpecularScalarStrategy.h
+++ b/Core/Multilayer/SpecularScalarStrategy.h
@@ -16,7 +16,7 @@
 #define BORNAGAIN_CORE_MULTILAYER_SPECULARSCALARSTRATEGY_H
 
 #include "Core/Multilayer/ISpecularStrategy.h"
-#include "Core/Multilayer/ScalarRTCoefficients.h"
+#include "Core/RT/ScalarRTCoefficients.h"
 #include "Core/Vector/Vectors3D.h"
 #include <memory>
 #include <vector>
diff --git a/Core/SimulationElement/SpecularSimulationElement.cpp b/Core/Multilayer/SpecularSimulationElement.cpp
similarity index 95%
rename from Core/SimulationElement/SpecularSimulationElement.cpp
rename to Core/Multilayer/SpecularSimulationElement.cpp
index 3640d2b780ca7ac1e5afbb1b952967b680c0399f..58353f00b2b541f74f5528ac091c7d98e2190c8f 100644
--- a/Core/SimulationElement/SpecularSimulationElement.cpp
+++ b/Core/Multilayer/SpecularSimulationElement.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/SimulationElement/SpecularSimulationElement.cpp
+//! @file      Core/Multilayer/SpecularSimulationElement.cpp
 //! @brief     Implements the class SpecularSimulationElement.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Core/SimulationElement/SpecularSimulationElement.h"
+#include "Core/Multilayer/SpecularSimulationElement.h"
 #include "Core/Multilayer/KzComputation.h"
 #include "Core/Multilayer/Layer.h"
 #include "Core/Multilayer/MultiLayer.h"
diff --git a/Core/SimulationElement/SpecularSimulationElement.h b/Core/Multilayer/SpecularSimulationElement.h
similarity index 97%
rename from Core/SimulationElement/SpecularSimulationElement.h
rename to Core/Multilayer/SpecularSimulationElement.h
index 9b6ecdfce1cdc10839d5a23f5a96b5c2b3db6350..cc632d70c3318a38fc175bd1fde1fffef9e6239c 100644
--- a/Core/SimulationElement/SpecularSimulationElement.h
+++ b/Core/Multilayer/SpecularSimulationElement.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/SimulationElement/SpecularSimulationElement.h
+//! @file      Core/Multilayer/SpecularSimulationElement.h
 //! @brief     Declares the class SpecularSimulationElement.
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/Parametrization/Distributions.cpp b/Core/Parametrization/Distributions.cpp
index 5cf61955d394df0e0d9a190caa8d250bc88753e0..92127008fd52afd983bb205c31081bd35a07e6f7 100644
--- a/Core/Parametrization/Distributions.cpp
+++ b/Core/Parametrization/Distributions.cpp
@@ -32,6 +32,11 @@ bool DoubleEqual(double a, double b);
 // class IDistribution1D
 // ************************************************************************** //
 
+IDistribution1D::IDistribution1D(const NodeMeta& meta, const std::vector<double>& PValues)
+    : INode(meta, PValues)
+{
+}
+
 //! Returns equidistant samples, using intrinsic parameters, weighted with probabilityDensity().
 
 std::vector<ParameterSample> IDistribution1D::equidistantSamples(size_t nbr_samples,
@@ -80,12 +85,6 @@ void IDistribution1D::setUnits(const std::string& units)
         par->setUnit(units);
 }
 
-void IDistribution1D::SignalBadInitialization(std::string distribution_name)
-{
-    throw Exceptions::ClassInitializationException(distribution_name
-                                                   + ": not correctly initialized");
-}
-
 void IDistribution1D::adjustMinMaxForLimits(double& xmin, double& xmax,
                                             const RealLimits& limits) const
 {
@@ -128,10 +127,14 @@ IDistribution1D::generateSamplesFromValues(const std::vector<double>& sample_val
 DistributionGate::DistributionGate(double min, double max) : m_min(min), m_max(max)
 {
     setName("DistributionGate");
-    checkInitialization();
-    init_parameters();
+    if (m_max < m_min)
+        throw Exceptions::ClassInitializationException("DistributionGate: max<min");
+    registerParameter("Min", &m_min);
+    registerParameter("Max", &m_max);
 }
 
+DistributionGate::DistributionGate() : DistributionGate(0., 1.) {}
+
 double DistributionGate::probabilityDensity(double x) const
 {
     if (x < m_min || x > m_max)
@@ -151,25 +154,11 @@ std::vector<double> DistributionGate::equidistantPoints(size_t nbr_samples, doub
     return equidistantPointsInRange(nbr_samples, xmin, xmax);
 }
 
-void DistributionGate::init_parameters()
-{
-    registerParameter("Min", &m_min);
-    registerParameter("Max", &m_max);
-}
-
 bool DistributionGate::isDelta() const
 {
     return DoubleEqual(m_min, m_max);
 }
 
-bool DistributionGate::checkInitialization() const
-{
-    if (m_max < m_min) {
-        SignalBadInitialization("DistributionGate");
-    }
-    return true;
-}
-
 // ************************************************************************** //
 // class DistributionLorentz
 // ************************************************************************** //
@@ -177,10 +166,14 @@ bool DistributionGate::checkInitialization() const
 DistributionLorentz::DistributionLorentz(double mean, double hwhm) : m_mean(mean), m_hwhm(hwhm)
 {
     setName("DistributionLorentz");
-    checkInitialization();
-    init_parameters();
+    if (m_hwhm < 0.0)
+        throw Exceptions::ClassInitializationException("DistributionLorentz: hwhm<0");
+    registerParameter("Mean", &m_mean);
+    registerParameter("HWHM", &m_hwhm);
 }
 
+DistributionLorentz::DistributionLorentz() : DistributionLorentz(0., 1.) {}
+
 double DistributionLorentz::probabilityDensity(double x) const
 {
     if (m_hwhm == 0.0)
@@ -199,25 +192,11 @@ std::vector<double> DistributionLorentz::equidistantPoints(size_t nbr_samples, d
     return equidistantPointsInRange(nbr_samples, xmin, xmax);
 }
 
-void DistributionLorentz::init_parameters()
-{
-    registerParameter("Mean", &m_mean);
-    registerParameter("HWHM", &m_hwhm);
-}
-
 bool DistributionLorentz::isDelta() const
 {
     return m_hwhm == 0.0;
 }
 
-bool DistributionLorentz::checkInitialization() const
-{
-    if (m_hwhm < 0.0) {
-        SignalBadInitialization("DistributionLorentz");
-    }
-    return true;
-}
-
 // ************************************************************************** //
 // class DistributionGaussian
 // ************************************************************************** //
@@ -226,10 +205,14 @@ DistributionGaussian::DistributionGaussian(double mean, double std_dev)
     : m_mean(mean), m_std_dev(std_dev)
 {
     setName("DistributionGaussian");
-    checkInitialization();
-    init_parameters();
+    if (m_std_dev < 0.0)
+        throw Exceptions::ClassInitializationException("DistributionGaussian: std_dev < 0");
+    registerParameter("Mean", &m_mean);
+    registerParameter("StdDev", &m_std_dev);
 }
 
+DistributionGaussian::DistributionGaussian() : DistributionGaussian(0., 1.) {}
+
 double DistributionGaussian::probabilityDensity(double x) const
 {
     if (m_std_dev == 0.0)
@@ -249,25 +232,11 @@ std::vector<double> DistributionGaussian::equidistantPoints(size_t nbr_samples,
     return equidistantPointsInRange(nbr_samples, xmin, xmax);
 }
 
-void DistributionGaussian::init_parameters()
-{
-    registerParameter("Mean", &m_mean);
-    registerParameter("StdDev", &m_std_dev);
-}
-
 bool DistributionGaussian::isDelta() const
 {
     return m_std_dev == 0.0;
 }
 
-bool DistributionGaussian::checkInitialization() const
-{
-    if (m_std_dev < 0.0) {
-        SignalBadInitialization("DistributionGaussian");
-    }
-    return true;
-}
-
 // ************************************************************************** //
 // class DistributionLogNormal
 // ************************************************************************** //
@@ -276,8 +245,12 @@ DistributionLogNormal::DistributionLogNormal(double median, double scale_param)
     : m_median(median), m_scale_param(scale_param)
 {
     setName("DistributionLogNormal");
-    checkInitialization();
-    init_parameters();
+    if (m_scale_param < 0.0)
+        throw Exceptions::ClassInitializationException("DistributionLogNormal: scale_param < 0");
+    if (m_median <= 0.0)
+        throw Exceptions::ClassInitializationException("DistributionLogNormal: median < 0");
+    registerParameter("Median", &m_median);
+    registerParameter("ScaleParameter", &m_scale_param);
 }
 
 double DistributionLogNormal::probabilityDensity(double x) const
@@ -311,12 +284,6 @@ std::vector<double> DistributionLogNormal::equidistantPoints(size_t nbr_samples,
     return equidistantPointsInRange(nbr_samples, xmin, xmax);
 }
 
-void DistributionLogNormal::init_parameters()
-{
-    registerParameter("Median", &m_median);
-    registerParameter("ScaleParameter", &m_scale_param);
-}
-
 bool DistributionLogNormal::isDelta() const
 {
     return m_scale_param == 0.0;
@@ -328,14 +295,6 @@ void DistributionLogNormal::setUnits(const std::string& units)
     // scale parameter remains unitless
 }
 
-bool DistributionLogNormal::checkInitialization() const
-{
-    if (m_scale_param < 0.0 || m_median <= 0.0) {
-        SignalBadInitialization("DistributionLogNormal");
-    }
-    return true;
-}
-
 // ************************************************************************** //
 // class DistributionCosine
 // ************************************************************************** //
@@ -343,10 +302,14 @@ bool DistributionLogNormal::checkInitialization() const
 DistributionCosine::DistributionCosine(double mean, double sigma) : m_mean(mean), m_sigma(sigma)
 {
     setName("DistributionCosine");
-    checkInitialization();
-    init_parameters();
+    if (m_sigma < 0.0)
+        throw Exceptions::ClassInitializationException("DistributionCosine: sigma<0");
+    registerParameter("Mean", &m_mean);
+    registerParameter("Sigma", &m_sigma);
 }
 
+DistributionCosine::DistributionCosine() : DistributionCosine(0., 1.) {}
+
 double DistributionCosine::probabilityDensity(double x) const
 {
     if (m_sigma == 0.0)
@@ -367,38 +330,34 @@ std::vector<double> DistributionCosine::equidistantPoints(size_t nbr_samples, do
     return equidistantPointsInRange(nbr_samples, xmin, xmax);
 }
 
-void DistributionCosine::init_parameters()
-{
-    registerParameter("Mean", &m_mean);
-    registerParameter("Sigma", &m_sigma);
-}
-
 bool DistributionCosine::isDelta() const
 {
     return m_sigma == 0.0;
 }
 
-bool DistributionCosine::checkInitialization() const
-{
-    if (m_sigma < 0.0) {
-        SignalBadInitialization("DistributionCosine");
-    }
-    return true;
-}
-
 // ************************************************************************** //
 // class DistributionTrapezoidal
 // ************************************************************************** //
 
-DistributionTrapezoid::DistributionTrapezoid(double center, double left_width, double middle_width,
-                                             double right_width)
-    : m_center(center), m_left(left_width), m_middle(middle_width), m_right(right_width)
+DistributionTrapezoid::DistributionTrapezoid(double center, double left, double middle,
+                                             double right)
+    : m_center(center), m_left(left), m_middle(middle), m_right(right)
 {
     setName("DistributionTrapezoid");
-    checkInitialization();
-    init_parameters();
+    if (m_left < 0.0)
+        throw Exceptions::ClassInitializationException("DistributionTrapezoid: leftWidth < 0");
+    if (m_middle < 0.0)
+        throw Exceptions::ClassInitializationException("DistributionTrapezoid: middleWidth < 0");
+    if (m_right < 0.0)
+        throw Exceptions::ClassInitializationException("DistributionTrapezoid: rightWidth < 0");
+    registerParameter("Center", &m_center);
+    registerParameter("LeftWidth", &m_left);
+    registerParameter("MiddleWidth", &m_middle);
+    registerParameter("RightWidth", &m_right);
 }
 
+DistributionTrapezoid::DistributionTrapezoid() : DistributionTrapezoid(0., 0., 1., 0.) {}
+
 double DistributionTrapezoid::probabilityDensity(double x) const
 {
     double height = 2.0 / (m_left + 2.0 * m_middle + m_right);
@@ -430,22 +389,6 @@ bool DistributionTrapezoid::isDelta() const
     return (m_left + m_middle + m_right) == 0.0;
 }
 
-void DistributionTrapezoid::init_parameters()
-{
-    registerParameter("Center", &m_center);
-    registerParameter("LeftWidth", &m_left);
-    registerParameter("MiddleWidth", &m_middle);
-    registerParameter("RightWidth", &m_right);
-}
-
-bool DistributionTrapezoid::checkInitialization() const
-{
-    if (m_left < 0.0 || m_middle < 0.0 || m_right < 0.0) {
-        SignalBadInitialization("DistributionTrapezoid");
-    }
-    return true;
-}
-
 void DistributionTrapezoid::adjustLimitsToNonZeroSamples(double& min, double& max,
                                                          size_t nbr_samples) const
 {
diff --git a/Core/Parametrization/Distributions.h b/Core/Parametrization/Distributions.h
index a2ee117d304668f689420f13189956d78304e46e..bcc9420e9cbafae99c0b0cbf2a7c707200cb4c30 100644
--- a/Core/Parametrization/Distributions.h
+++ b/Core/Parametrization/Distributions.h
@@ -32,8 +32,8 @@ class ParameterSample;
 class BA_CORE_API_ IDistribution1D : public ICloneable, public INode
 {
 public:
-    IDistribution1D() {}
-    virtual ~IDistribution1D() {}
+    IDistribution1D() = default;
+    IDistribution1D(const NodeMeta& meta, const std::vector<double>& PValues);
 
     virtual IDistribution1D* clone() const = 0;
 
@@ -68,11 +68,6 @@ public:
     virtual void setUnits(const std::string& units);
 
 protected:
-#ifndef SWIG
-    //! this function is called during bad initialization of a subclass
-    [[noreturn]] static void SignalBadInitialization(std::string distribution_name);
-#endif
-
     //! modifies xmin and xmax if they are outside of limits
     void adjustMinMaxForLimits(double& xmin, double& xmax, const RealLimits& limits) const;
 
@@ -91,9 +86,8 @@ protected:
 class BA_CORE_API_ DistributionGate : public IDistribution1D
 {
 public:
-    DistributionGate() : DistributionGate(0., 1.) {}
+    DistributionGate();
     DistributionGate(double min, double max);
-    virtual ~DistributionGate() {}
 
     DistributionGate* clone() const final { return new DistributionGate(m_min, m_max); }
 
@@ -110,13 +104,7 @@ public:
 
     void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
 
-protected:
-    //! Registers some class members for later access via parameter pool
-    void init_parameters();
-
 private:
-    //! check initialization
-    bool checkInitialization() const;
     double m_min;
     double m_max;
 };
@@ -127,9 +115,8 @@ private:
 class BA_CORE_API_ DistributionLorentz : public IDistribution1D
 {
 public:
-    DistributionLorentz() : DistributionLorentz(0., 1.) {}
+    DistributionLorentz();
     DistributionLorentz(double mean, double hwhm);
-    virtual ~DistributionLorentz() {}
 
     DistributionLorentz* clone() const final { return new DistributionLorentz(m_mean, m_hwhm); }
 
@@ -145,13 +132,7 @@ public:
 
     void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
 
-protected:
-    //! Registers some class members for later access via parameter pool
-    void init_parameters();
-
 private:
-    //! check initialization
-    bool checkInitialization() const;
     double m_mean;
     double m_hwhm;
 };
@@ -162,9 +143,8 @@ private:
 class BA_CORE_API_ DistributionGaussian : public IDistribution1D
 {
 public:
-    DistributionGaussian() : DistributionGaussian(0., 1.) {}
+    DistributionGaussian();
     DistributionGaussian(double mean, double std_dev);
-    virtual ~DistributionGaussian() {}
 
     DistributionGaussian* clone() const final
     {
@@ -183,13 +163,7 @@ public:
 
     void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
 
-protected:
-    //! Registers some class members for later access via parameter pool
-    void init_parameters();
-
 private:
-    //! check initialization
-    bool checkInitialization() const;
     double m_mean;
     double m_std_dev;
 };
@@ -200,9 +174,8 @@ private:
 class BA_CORE_API_ DistributionLogNormal : public IDistribution1D
 {
 public:
-    DistributionLogNormal(double scale_param) : DistributionLogNormal(1., scale_param) {}
+    DistributionLogNormal() = delete;
     DistributionLogNormal(double median, double scale_param);
-    virtual ~DistributionLogNormal() {}
 
     DistributionLogNormal* clone() const final
     {
@@ -224,13 +197,7 @@ public:
 
     virtual void setUnits(const std::string& units);
 
-protected:
-    //! Registers some class members for later access via parameter pool
-    void init_parameters();
-
 private:
-    //! check initialization
-    bool checkInitialization() const;
     double m_median;
     double m_scale_param;
 };
@@ -241,9 +208,8 @@ private:
 class BA_CORE_API_ DistributionCosine : public IDistribution1D
 {
 public:
-    DistributionCosine() : DistributionCosine(0., 1.) {}
+    DistributionCosine();
     DistributionCosine(double mean, double sigma);
-    virtual ~DistributionCosine() {}
 
     DistributionCosine* clone() const final { return new DistributionCosine(m_mean, m_sigma); }
 
@@ -259,13 +225,7 @@ public:
 
     void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
 
-protected:
-    //! Registers some class members for later access via parameter pool
-    void init_parameters();
-
 private:
-    //! check initialization
-    bool checkInitialization() const;
     double m_mean;
     double m_sigma;
 };
@@ -276,10 +236,8 @@ private:
 class BA_CORE_API_ DistributionTrapezoid : public IDistribution1D
 {
 public:
-    DistributionTrapezoid() : DistributionTrapezoid(0., 0., 1., 0.) {}
-    DistributionTrapezoid(double center, double left_width, double middle_width,
-                          double right_width);
-    virtual ~DistributionTrapezoid() {}
+    DistributionTrapezoid();
+    DistributionTrapezoid(double center, double left, double middle, double right);
 
     DistributionTrapezoid* clone() const final
     {
@@ -300,13 +258,7 @@ public:
 
     void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
 
-protected:
-    //! Registers some class members for later access via parameter pool
-    void init_parameters();
-
 private:
-    //! check initialization
-    bool checkInitialization() const;
     void adjustLimitsToNonZeroSamples(double& min, double& max, size_t nbr_samples) const;
     double m_center;
     double m_left;
diff --git a/Core/Parametrization/INode.cpp b/Core/Parametrization/INode.cpp
index 9a73f9e828bf16481f1012bf5448224451b2c588..b21571913c0b0f1be316143f61d609ed2934cf48 100644
--- a/Core/Parametrization/INode.cpp
+++ b/Core/Parametrization/INode.cpp
@@ -34,6 +34,7 @@ INode::INode(const NodeMeta& meta, const std::vector<double>& PValues)
 {
     m_P.resize(m_NP);
     setName(meta.className);
+    parameterPool()->clear(); // non-trivially needed by a few children
     for (size_t i = 0; i < m_NP; ++i) {
         m_P[i] = PValues[i];
         const ParaMeta& pm = meta.paraMeta[i];
diff --git a/Core/Parametrization/INodeVisitor.h b/Core/Parametrization/INodeVisitor.h
index 777a8393c759874fd6903b846389a00c345912b1..ba328b34206ffa043052ddda09a2b121ca98be0b 100644
--- a/Core/Parametrization/INodeVisitor.h
+++ b/Core/Parametrization/INodeVisitor.h
@@ -103,8 +103,6 @@ class IInterferenceFunction;
 class ILayout;
 class INode;
 class Instrument;
-class IntensityNormalizer;
-class IntensityScaleAndShiftNormalizer;
 class InterferenceFunction1DLattice;
 class InterferenceFunction2DLattice;
 class InterferenceFunction2DParaCrystal;
@@ -241,8 +239,6 @@ public:
     virtual void visit(const ILayout*) {}
     virtual void visit(const INode*) {}
     virtual void visit(const Instrument*) {}
-    virtual void visit(const IntensityNormalizer*) {}
-    virtual void visit(const IntensityScaleAndShiftNormalizer*) {}
     virtual void visit(const InterferenceFunction1DLattice*) {}
     virtual void visit(const InterferenceFunction2DLattice*) {}
     virtual void visit(const InterferenceFunction2DParaCrystal*) {}
diff --git a/Core/Particle/IAbstractParticle.cpp b/Core/Particle/IAbstractParticle.cpp
index 7f3afc36c058719f9f38f79263bbf7788b6cb576..fac41db3e0c165c3fd6eb8acd497d2a0a16b5a3b 100644
--- a/Core/Particle/IAbstractParticle.cpp
+++ b/Core/Particle/IAbstractParticle.cpp
@@ -14,9 +14,10 @@
 
 #include "Core/Particle/IAbstractParticle.h"
 
-IAbstractParticle::IAbstractParticle() : m_abundance(1.0) {}
-
-IAbstractParticle::~IAbstractParticle() {}
+IAbstractParticle::IAbstractParticle(const NodeMeta& meta, const std::vector<double>& PValues)
+    : ISample(meta, PValues)
+{
+}
 
 void IAbstractParticle::accept(INodeVisitor* visitor) const
 {
diff --git a/Core/Particle/IAbstractParticle.h b/Core/Particle/IAbstractParticle.h
index 63d7dceb398ff5abaf1a23475570d468b3c4fd00..23fe204ec454b2eca8cebfe08cca9dc9d9a7b1db 100644
--- a/Core/Particle/IAbstractParticle.h
+++ b/Core/Particle/IAbstractParticle.h
@@ -29,8 +29,9 @@ class IRotation;
 class BA_CORE_API_ IAbstractParticle : public ISample
 {
 public:
-    IAbstractParticle();
-    virtual ~IAbstractParticle();
+    IAbstractParticle() = default;
+    IAbstractParticle(const NodeMeta& meta, const std::vector<double>& PValues);
+    virtual ~IAbstractParticle() = default;
 
     virtual IAbstractParticle* clone() const = 0;
 
@@ -50,7 +51,7 @@ public:
     virtual void rotate(const IRotation& rotation) = 0;
 
 protected:
-    double m_abundance;
+    double m_abundance{1.0}; // not a Parameter
 };
 
 #endif // BORNAGAIN_CORE_PARTICLE_IABSTRACTPARTICLE_H
diff --git a/Core/Multilayer/ILayerRTCoefficients.h b/Core/RT/ILayerRTCoefficients.h
similarity index 97%
rename from Core/Multilayer/ILayerRTCoefficients.h
rename to Core/RT/ILayerRTCoefficients.h
index 7fa8e70a9e0feb964128485d34efb4eac9f9595c..2ef9d2f726f6e90b5caad3f9abcf5382334f7652 100644
--- a/Core/Multilayer/ILayerRTCoefficients.h
+++ b/Core/RT/ILayerRTCoefficients.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Multilayer/ILayerRTCoefficients.h
+//! @file      Core/RT/ILayerRTCoefficients.h
 //! @brief     Defines and implements class ILayerRTCoefficients.
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/Multilayer/MatrixRTCoefficients.cpp b/Core/RT/MatrixRTCoefficients.cpp
similarity index 98%
rename from Core/Multilayer/MatrixRTCoefficients.cpp
rename to Core/RT/MatrixRTCoefficients.cpp
index 4377b479d9df663719d7679a6a8f9c72322f6390..cbbf071b1b049cf338dc8fcb120b03cf404d416b 100644
--- a/Core/Multilayer/MatrixRTCoefficients.cpp
+++ b/Core/RT/MatrixRTCoefficients.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Multilayer/MatrixRTCoefficients.cpp
+//! @file      Core/RT/MatrixRTCoefficients.cpp
 //! @brief     Implements class MatrixRTCoefficients.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Core/Multilayer/MatrixRTCoefficients.h"
+#include "Core/RT/MatrixRTCoefficients.h"
 
 MatrixRTCoefficients* MatrixRTCoefficients::clone() const
 {
diff --git a/Core/Multilayer/MatrixRTCoefficients.h b/Core/RT/MatrixRTCoefficients.h
similarity index 96%
rename from Core/Multilayer/MatrixRTCoefficients.h
rename to Core/RT/MatrixRTCoefficients.h
index ac924ae2e983857a7f8f2d085d1c0f0923c7e217..75335d0855d23e6e8e5318c1283fe848c249dbdf 100644
--- a/Core/Multilayer/MatrixRTCoefficients.h
+++ b/Core/RT/MatrixRTCoefficients.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Multilayer/MatrixRTCoefficients.h
+//! @file      Core/RT/MatrixRTCoefficients.h
 //! @brief    Defines class MatrixRTCoefficients.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_CORE_MULTILAYER_MATRIXRTCOEFFICIENTS_H
 #define BORNAGAIN_CORE_MULTILAYER_MATRIXRTCOEFFICIENTS_H
 
-#include "Core/Multilayer/ILayerRTCoefficients.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 
 //! Specular reflection and transmission coefficients in a layer in case
 //! of 2x2 matrix interactions between the layers and the scattered particle.
diff --git a/Core/Multilayer/MatrixRTCoefficients_v2.cpp b/Core/RT/MatrixRTCoefficients_v2.cpp
similarity index 96%
rename from Core/Multilayer/MatrixRTCoefficients_v2.cpp
rename to Core/RT/MatrixRTCoefficients_v2.cpp
index 70a3fc6b4bcb139191458aba8be711083d0fce81..02a607b60e756b58a921e8e6dc5c6a31d515eea8 100644
--- a/Core/Multilayer/MatrixRTCoefficients_v2.cpp
+++ b/Core/RT/MatrixRTCoefficients_v2.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file     Core/Multilayer/MatrixRTCoefficients_v2.cpp
+//! @file     Core/RT/MatrixRTCoefficients_v2.cpp
 //! @brief    Implements class MatrixRTCoefficients_v2.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Core/Multilayer/MatrixRTCoefficients_v2.h"
+#include "Core/RT/MatrixRTCoefficients_v2.h"
 
 namespace
 {
diff --git a/Core/Multilayer/MatrixRTCoefficients_v2.h b/Core/RT/MatrixRTCoefficients_v2.h
similarity index 96%
rename from Core/Multilayer/MatrixRTCoefficients_v2.h
rename to Core/RT/MatrixRTCoefficients_v2.h
index 804a9d984673f9f15ad2384bedbacbe697eb45f0..bd04b2044ee57560e2df92f3afffc4d6c6f0aa68 100644
--- a/Core/Multilayer/MatrixRTCoefficients_v2.h
+++ b/Core/RT/MatrixRTCoefficients_v2.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file     Core/Multilayer/MatrixRTCoefficients_v2.h
+//! @file     Core/RT/MatrixRTCoefficients_v2.h
 //! @brief    Defines class MatrixRTCoefficients_v2.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_CORE_MULTILAYER_MATRIXRTCOEFFICIENTS_V2_H
 #define BORNAGAIN_CORE_MULTILAYER_MATRIXRTCOEFFICIENTS_V2_H
 
-#include "Core/Multilayer/ILayerRTCoefficients.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 #include "Core/Vector/Vectors3D.h"
 #include <vector>
 
diff --git a/Core/Multilayer/ScalarRTCoefficients.h b/Core/RT/ScalarRTCoefficients.h
similarity index 97%
rename from Core/Multilayer/ScalarRTCoefficients.h
rename to Core/RT/ScalarRTCoefficients.h
index cfd4910fdaa4a700eaf68fd54dea5d09efe691f6..206fcabcfdbe09e80972b697fd49b57ef91338ff 100644
--- a/Core/Multilayer/ScalarRTCoefficients.h
+++ b/Core/RT/ScalarRTCoefficients.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Multilayer/ScalarRTCoefficients.h
+//! @file      Core/RT/ScalarRTCoefficients.h
 //! @brief     Defines class ScalarRTCoefficients.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -16,7 +16,7 @@
 #define BORNAGAIN_CORE_MULTILAYER_SCALARRTCOEFFICIENTS_H
 
 #include "Core/Basics/Complex.h"
-#include "Core/Multilayer/ILayerRTCoefficients.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 #include "Core/Vector/EigenCore.h"
 
 //! Specular reflection and transmission coefficients in a layer in case
diff --git a/Core/Scattering/IFormFactor.cpp b/Core/Scattering/IFormFactor.cpp
index 2e9b4cf062f61b6e7d4a2297a821cddc585fb3b8..2c7f1fb584d75ecb5102147f10aa837ee25f56be 100644
--- a/Core/Scattering/IFormFactor.cpp
+++ b/Core/Scattering/IFormFactor.cpp
@@ -14,7 +14,7 @@
 
 #include "Core/Scattering/IFormFactor.h"
 #include "Core/Basics/Exceptions.h"
-#include "Core/Multilayer/ILayerRTCoefficients.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 #include "Core/Scattering/FormFactorDecoratorPositionFactor.h"
 #include "Core/Scattering/FormFactorDecoratorRotation.h"
 #include "Core/Scattering/Rotations.h"
diff --git a/Core/Simulation/DepthProbeSimulation.h b/Core/Simulation/DepthProbeSimulation.h
index 1fd2e28865ea68ed17c3793bd656481bad1a6a14..6f59761390d64c5f31730813ee837cb09f73d5f5 100644
--- a/Core/Simulation/DepthProbeSimulation.h
+++ b/Core/Simulation/DepthProbeSimulation.h
@@ -16,7 +16,7 @@
 #define BORNAGAIN_CORE_SIMULATION_DEPTHPROBESIMULATION_H
 
 #include "Core/Intensity/OutputData.h"
-#include "Core/Multilayer/ILayerRTCoefficients.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 #include "Core/Simulation/Simulation.h"
 #include "Core/SimulationElement/DepthProbeElement.h"
 
diff --git a/Core/Simulation/Simulation.cpp b/Core/Simulation/Simulation.cpp
index aa18fe0ab5c85844fa8400263cc606982d3d48f7..66a821de1e557268aa4c46f20075ed656f78e9ef 100644
--- a/Core/Simulation/Simulation.cpp
+++ b/Core/Simulation/Simulation.cpp
@@ -55,7 +55,7 @@ Simulation::Simulation(const std::shared_ptr<IMultiLayerBuilder> p_sample_builde
 }
 
 Simulation::Simulation(const Simulation& other)
-    : ICloneable(), m_sample_provider(other.m_sample_provider), m_options(other.m_options),
+    : m_sample_provider(other.m_sample_provider), m_options(other.m_options),
       m_distribution_handler(other.m_distribution_handler), m_progress(other.m_progress),
       m_instrument(other.m_instrument)
 {
diff --git a/Core/StandardSamples/SimulationFactory.cpp b/Core/Simulation/SimulationFactory.cpp
similarity index 96%
rename from Core/StandardSamples/SimulationFactory.cpp
rename to Core/Simulation/SimulationFactory.cpp
index 05e16e79e3c2bed1458dfa0f5ab4e70d94275bc8..c22aa4b975208bfd020594807ba6e23afc67254d 100644
--- a/Core/StandardSamples/SimulationFactory.cpp
+++ b/Core/Simulation/SimulationFactory.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/StandardSamples/SimulationFactory.cpp
+//! @file      Core/Simulation/SimulationFactory.cpp
 //! @brief     Implement class SimulationFactory.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,13 +12,13 @@
 //
 // ************************************************************************** //
 
-#include "Core/StandardSamples/SimulationFactory.h"
+#include "Core/Simulation/SimulationFactory.h"
 #include "Core/Parametrization/RealParameter.h"
 #include "Core/Simulation/DepthProbeSimulation.h"
 #include "Core/Simulation/GISASSimulation.h"
 #include "Core/Simulation/OffSpecSimulation.h"
 #include "Core/Simulation/SpecularSimulation.h"
-#include "Core/StandardSamples/StandardSimulations.h"
+#include "Core/Simulation/StandardSimulations.h"
 
 SimulationFactory::SimulationFactory()
 {
diff --git a/Core/StandardSamples/SimulationFactory.h b/Core/Simulation/SimulationFactory.h
similarity index 95%
rename from Core/StandardSamples/SimulationFactory.h
rename to Core/Simulation/SimulationFactory.h
index d44f22c6231327781f9c11d6a45bcea20544e005..4af257cb2c79e6be81899463c6cdd88c1d62ee60 100644
--- a/Core/StandardSamples/SimulationFactory.h
+++ b/Core/Simulation/SimulationFactory.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/StandardSamples/SimulationFactory.h
+//! @file      Core/Simulation/SimulationFactory.h
 //! @brief     Defines class SimulationFactory.
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/Simulation/SpecularSimulation.cpp b/Core/Simulation/SpecularSimulation.cpp
index d89a5381052a8ecccd1c1b21b5b8d1e6e86017b9..1946b0408556b515f381ef01f24ce76c3576abaa 100644
--- a/Core/Simulation/SpecularSimulation.cpp
+++ b/Core/Simulation/SpecularSimulation.cpp
@@ -26,10 +26,10 @@
 #include "Core/Material/MaterialUtils.h"
 #include "Core/Multilayer/IMultiLayerBuilder.h"
 #include "Core/Multilayer/MultiLayer.h"
+#include "Core/Multilayer/SpecularSimulationElement.h"
 #include "Core/Parametrization/Distributions.h"
 #include "Core/Parametrization/ParameterPool.h"
 #include "Core/Parametrization/RealParameter.h"
-#include "Core/SimulationElement/SpecularSimulationElement.h"
 
 namespace
 {
diff --git a/Core/Simulation/SpecularSimulation.h b/Core/Simulation/SpecularSimulation.h
index 32e7fdb6606c2d11f9ee886ca23788e8df3ebdb9..11c483788b8586a189d7df49aad22deda4faedd2 100644
--- a/Core/Simulation/SpecularSimulation.h
+++ b/Core/Simulation/SpecularSimulation.h
@@ -16,7 +16,7 @@
 #define BORNAGAIN_CORE_SIMULATION_SPECULARSIMULATION_H
 
 #include "Core/Intensity/OutputData.h"
-#include "Core/Multilayer/ILayerRTCoefficients.h"
+#include "Core/RT/ILayerRTCoefficients.h"
 #include "Core/Simulation/Simulation.h"
 
 class IAxis;
diff --git a/Core/StandardSamples/StandardSimulations.cpp b/Core/Simulation/StandardSimulations.cpp
similarity index 99%
rename from Core/StandardSamples/StandardSimulations.cpp
rename to Core/Simulation/StandardSimulations.cpp
index e10c0909e36718056590311f9a3cc4ef4c011e57..3f5bf4565cb1082fe1f4f2d8092f2864ba190e07 100644
--- a/Core/StandardSamples/StandardSimulations.cpp
+++ b/Core/Simulation/StandardSimulations.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/StandardSamples/StandardSimulations.cpp
+//! @file      Core/Simulation/StandardSimulations.cpp
 //! @brief     Implements functions for standard simulations.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Core/StandardSamples/StandardSimulations.h"
+#include "Core/Simulation/StandardSimulations.h"
 #include "Core/Basics/Units.h"
 #include "Core/Beam/FootprintGauss.h"
 #include "Core/Beam/FootprintSquare.h"
diff --git a/Core/StandardSamples/StandardSimulations.h b/Core/Simulation/StandardSimulations.h
similarity index 98%
rename from Core/StandardSamples/StandardSimulations.h
rename to Core/Simulation/StandardSimulations.h
index 23b228e2066d41c1c427d9d5d01ef37e7baad48b..2af738b7c9139814c4bfbd1ae86211357bcf7894 100644
--- a/Core/StandardSamples/StandardSimulations.h
+++ b/Core/Simulation/StandardSimulations.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/StandardSamples/StandardSimulations.h
+//! @file      Core/Simulation/StandardSimulations.h
 //! @brief     Defines namespace and functions for standard simulations.
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp b/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp
index 3854a5c782996e135e07d0282daf113607017c85..1c4bfba80c5313a1a6fbe9acda3ac8b76463bf6b 100644
--- a/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp
+++ b/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp
@@ -15,6 +15,7 @@
 #include "Core/SoftParticle/FormFactorSphereGaussianRadius.h"
 #include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/TruncatedEllipsoid.h"
+#include "Core/Vector/SomeFormFactors.h"
 #include "Fit/Tools/RealLimits.h"
 
 FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(double mean, double sigma)
@@ -22,7 +23,6 @@ FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(double mean, doub
 {
     setName("FormFactorSphereGaussianRadius");
     m_mean_r3 = calculateMeanR3();
-    P_ff_sphere.reset(new FormFactorFullSphere(m_mean_r3));
     registerParameter("MeanRadius", &m_mean).setUnit("nm").setNonnegative();
     registerParameter("SigmaRadius", &m_sigma).setUnit("nm").setNonnegative();
     onChange();
@@ -32,7 +32,8 @@ complex_t FormFactorSphereGaussianRadius::evaluate_for_q(cvector_t q) const
 {
     double q2 = std::norm(q.x()) + std::norm(q.y()) + std::norm(q.z());
     double dw = std::exp(-q2 * m_sigma * m_sigma / 2.0);
-    return dw * P_ff_sphere->evaluate_for_q(q);
+    return dw * exp_I(q.z() * m_mean_r3) * someff::ffSphere(q, m_mean_r3);
+    // TODO: don't center at bottom; revise mesocrystal1.py
 }
 
 void FormFactorSphereGaussianRadius::onChange()
diff --git a/Core/SoftParticle/FormFactorSphereGaussianRadius.h b/Core/SoftParticle/FormFactorSphereGaussianRadius.h
index 962b1aa38a7251578fc952d543ff1011a6eb82bd..bf84d66c29339e0f18a51dd9abed7383c615be91 100644
--- a/Core/SoftParticle/FormFactorSphereGaussianRadius.h
+++ b/Core/SoftParticle/FormFactorSphereGaussianRadius.h
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_CORE_SOFTPARTICLE_FORMFACTORSPHEREGAUSSIANRADIUS_H
 #define BORNAGAIN_CORE_SOFTPARTICLE_FORMFACTORSPHEREGAUSSIANRADIUS_H
 
-#include "Core/HardParticle/FormFactorFullSphere.h"
+#include "Core/Scattering/IFormFactorBorn.h"
 #include <memory>
 
 //! A sphere with gaussian radius distribution.
@@ -46,7 +46,6 @@ private:
     double m_mean; //!< This is the mean radius
     double m_sigma;
     double m_mean_r3; //!< This is the radius that gives the mean volume
-    std::unique_ptr<FormFactorFullSphere> P_ff_sphere;
 };
 
 #endif // BORNAGAIN_CORE_SOFTPARTICLE_FORMFACTORSPHEREGAUSSIANRADIUS_H
diff --git a/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp b/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp
index f3098fce79447758b3467b93ade7e70dbcb361de..5414a2f7202da70764e2ba79a34a639b13ce3a17 100644
--- a/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp
+++ b/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp
@@ -17,34 +17,37 @@
 #include "Core/Parametrization/ParameterSample.h"
 #include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/TruncatedEllipsoid.h"
+#include "Core/Vector/SomeFormFactors.h"
 
 FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(double mean, double scale_param,
                                                                  size_t n_samples)
     : m_mean(mean), m_scale_param(scale_param), m_n_samples(n_samples)
 {
     setName("FormFactorSphereLogNormalRadius");
-    mP_distribution.reset(new DistributionLogNormal(m_mean, m_scale_param));
     registerParameter("MeanRadius", &m_mean).setUnit("nm").setNonnegative();
     registerParameter("ScaleParameter", &m_scale_param);
-    if (!mP_distribution)
-        return;
-    // Init vectors:
-    m_form_factors.clear();
+
+    DistributionLogNormal distri(m_mean, m_scale_param);
+    m_radii.clear();
     m_probabilities.clear();
-    for (ParameterSample& sample : mP_distribution->equidistantSamples(m_n_samples)) {
-        m_form_factors.push_back(new FormFactorFullSphere(sample.value));
+    for (ParameterSample& sample : distri.equidistantSamples(m_n_samples)) {
+        m_radii.push_back(sample.value);
         m_probabilities.push_back(sample.weight);
     }
+
     onChange();
 }
 
+FormFactorSphereLogNormalRadius* FormFactorSphereLogNormalRadius::clone() const
+{
+    return new FormFactorSphereLogNormalRadius(m_mean, m_scale_param, m_n_samples);
+}
+
 complex_t FormFactorSphereLogNormalRadius::evaluate_for_q(cvector_t q) const
 {
-    if (m_form_factors.size() < 1)
-        return 0.0;
-    complex_t result(0.0);
-    for (size_t i = 0; i < m_form_factors.size(); ++i)
-        result += m_form_factors[i]->evaluate_for_q(q) * m_probabilities[i];
+    complex_t result = 0;
+    for (size_t i = 0; i < m_radii.size(); ++i)
+        result += someff::ffSphere(q, m_radii[i]) * m_probabilities[i];
     return result;
 }
 
diff --git a/Core/SoftParticle/FormFactorSphereLogNormalRadius.h b/Core/SoftParticle/FormFactorSphereLogNormalRadius.h
index 16d4727456cb4fee3fa7196b627fddc61da7efbb..8ed805408f94ca5d9ea69d99c065547b06b0053b 100644
--- a/Core/SoftParticle/FormFactorSphereLogNormalRadius.h
+++ b/Core/SoftParticle/FormFactorSphereLogNormalRadius.h
@@ -15,8 +15,7 @@
 #ifndef BORNAGAIN_CORE_SOFTPARTICLE_FORMFACTORSPHERELOGNORMALRADIUS_H
 #define BORNAGAIN_CORE_SOFTPARTICLE_FORMFACTORSPHERELOGNORMALRADIUS_H
 
-#include "Core/HardParticle/FormFactorFullSphere.h"
-#include "Core/Parametrization/Distributions.h"
+#include "Core/Scattering/IFormFactorBorn.h"
 #include "Core/Tools/SafePointerVector.h"
 #include <memory>
 
@@ -28,10 +27,8 @@ class BA_CORE_API_ FormFactorSphereLogNormalRadius : public IFormFactorBorn
 public:
     FormFactorSphereLogNormalRadius(double mean, double scale_param, size_t n_samples);
 
-    FormFactorSphereLogNormalRadius* clone() const override final
-    {
-        return new FormFactorSphereLogNormalRadius(m_mean, m_scale_param, m_n_samples);
-    }
+    FormFactorSphereLogNormalRadius* clone() const override final;
+
     void accept(INodeVisitor* visitor) const override final { visitor->visit(this); }
 
     double radialExtension() const override final { return m_mean; }
@@ -46,9 +43,7 @@ private:
     double m_scale_param;
     size_t m_n_samples;
 
-    std::unique_ptr<DistributionLogNormal> mP_distribution;
-
-    SafePointerVector<IFormFactorBorn> m_form_factors;
+    std::vector<double> m_radii;
     std::vector<double> m_probabilities;
 };
 
diff --git a/Core/StandardSamples/LatticeBuilder.cpp b/Core/StandardSamples/LatticeBuilder.cpp
index 9d4b865f3984d17ecb7d0a2470acc1ecb6e0a353..fa0b67b0159b066859f15c2c7dd77d0993000fc7 100644
--- a/Core/StandardSamples/LatticeBuilder.cpp
+++ b/Core/StandardSamples/LatticeBuilder.cpp
@@ -13,11 +13,11 @@
 // ************************************************************************** //
 
 #include "Core/StandardSamples/LatticeBuilder.h"
-#include "Core/Aggregate/FTDecay1D.h"
-#include "Core/Aggregate/FTDecay2D.h"
 #include "Core/Aggregate/InterferenceFunction1DLattice.h"
 #include "Core/Aggregate/ParticleLayout.h"
 #include "Core/Basics/Units.h"
+#include "Core/Correlations/FTDecay1D.h"
+#include "Core/Correlations/FTDecay2D.h"
 #include "Core/HardParticle/FormFactorCylinder.h"
 #include "Core/Material/MaterialFactoryFuncs.h"
 #include "Core/Multilayer/Layer.h"
diff --git a/Core/StandardSamples/MesoCrystalBuilder.cpp b/Core/StandardSamples/MesoCrystalBuilder.cpp
index 1ac8d319c17bac211e2b194f6c60822a32005067..a3e17745ce77d02958fbaf8f3b76cfce2bda7777 100644
--- a/Core/StandardSamples/MesoCrystalBuilder.cpp
+++ b/Core/StandardSamples/MesoCrystalBuilder.cpp
@@ -17,6 +17,7 @@
 #include "Core/Basics/MathConstants.h"
 #include "Core/Basics/Units.h"
 #include "Core/HardParticle/FormFactorCylinder.h"
+#include "Core/HardParticle/FormFactorFullSphere.h"
 #include "Core/Lattice/ISelectionRule.h"
 #include "Core/Material/MaterialFactoryFuncs.h"
 #include "Core/Multilayer/Layer.h"
@@ -28,7 +29,6 @@
 #include "Core/Particle/MesoCrystal.h"
 #include "Core/Particle/Particle.h"
 #include "Core/Particle/ParticleComposition.h"
-#include "Core/SoftParticle/FormFactorSphereGaussianRadius.h"
 
 MesoCrystalBuilder::MesoCrystalBuilder() {}
 
diff --git a/Core/StandardSamples/ParaCrystalBuilder.cpp b/Core/StandardSamples/ParaCrystalBuilder.cpp
index e22d1c7db94d520a566a4e34eac13fc2dd31aa58..401f8f8369c4f5c261051a919dbb6bd64cbb2bb4 100644
--- a/Core/StandardSamples/ParaCrystalBuilder.cpp
+++ b/Core/StandardSamples/ParaCrystalBuilder.cpp
@@ -13,12 +13,12 @@
 // ************************************************************************** //
 
 #include "Core/StandardSamples/ParaCrystalBuilder.h"
-#include "Core/Aggregate/FTDistributions2D.h"
 #include "Core/Aggregate/InterferenceFunction2DParaCrystal.h"
 #include "Core/Aggregate/InterferenceFunctionRadialParaCrystal.h"
 #include "Core/Aggregate/ParticleLayout.h"
 #include "Core/Basics/Assert.h"
 #include "Core/Basics/Units.h"
+#include "Core/Correlations/FTDistributions2D.h"
 #include "Core/HardParticle/FormFactorCylinder.h"
 #include "Core/Material/MaterialFactoryFuncs.h"
 #include "Core/Multilayer/Layer.h"
diff --git a/Core/StandardSamples/ResonatorBuilder.cpp b/Core/StandardSamples/ResonatorBuilder.cpp
index fe36edd08dddcb6b8a6135d27b4297a2cf6b077e..4e35e8903d5160dab623fb70aebae587af5c1462 100644
--- a/Core/StandardSamples/ResonatorBuilder.cpp
+++ b/Core/StandardSamples/ResonatorBuilder.cpp
@@ -42,10 +42,7 @@ MultiLayer* ResonatorBuilder::buildSample() const
     Layer l_Pt(m_Pt, 32.0 * Units::nm);
     Layer l_D2O(m_D2O);
 
-    LayerRoughness roughness;
-    roughness.setSigma(2.0 * Units::nm);
-    roughness.setHurstParameter(0.8);
-    roughness.setLatteralCorrLength(10.0 * Units::micrometer);
+    LayerRoughness roughness(2.0 * Units::nm, 0.8, 10.0 * Units::micrometer);
 
     result->addLayer(l_Si);
 
diff --git a/Core/StandardSamples/RipplesBuilder.cpp b/Core/StandardSamples/RipplesBuilder.cpp
index c8c818494dca98bf0669a80fa8478fec6b52286d..3abae826112e3e230e3bef1595bf939d82c4eef2 100644
--- a/Core/StandardSamples/RipplesBuilder.cpp
+++ b/Core/StandardSamples/RipplesBuilder.cpp
@@ -59,7 +59,7 @@ MultiLayer* CosineRippleBuilder::buildSample() const
 
 TriangularRippleBuilder::TriangularRippleBuilder() : m_d(0.0 * Units::nanometer)
 {
-    init_parameters();
+    registerParameter("asymetry", &m_d);
 }
 
 MultiLayer* TriangularRippleBuilder::buildSample() const
@@ -91,11 +91,6 @@ MultiLayer* TriangularRippleBuilder::buildSample() const
     return p_multi_layer;
 }
 
-void TriangularRippleBuilder::init_parameters()
-{
-    registerParameter("asymetry", &m_d);
-}
-
 // ----------------------------------------------------------------------------
 
 MultiLayer* AsymRippleBuilder::buildSample() const
diff --git a/Core/StandardSamples/RipplesBuilder.h b/Core/StandardSamples/RipplesBuilder.h
index 7185677475a23f64c1fbe214727a1e4e9a647213..fc9266e0d693aba1c297406fc771dcb9a8e90b56 100644
--- a/Core/StandardSamples/RipplesBuilder.h
+++ b/Core/StandardSamples/RipplesBuilder.h
@@ -36,9 +36,6 @@ public:
     TriangularRippleBuilder();
     MultiLayer* buildSample() const;
 
-protected:
-    void init_parameters();
-
 private:
     double m_d;
 };
diff --git a/Core/StandardSamples/SampleComponents.h b/Core/StandardSamples/SampleComponents.h
index b7392acc790adba701aa59cc7d540b469f0bc127..f75b0ae85d21454ea11eb498efe3d2af70a1109e 100644
--- a/Core/StandardSamples/SampleComponents.h
+++ b/Core/StandardSamples/SampleComponents.h
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_CORE_STANDARDSAMPLES_SAMPLECOMPONENTS_H
 #define BORNAGAIN_CORE_STANDARDSAMPLES_SAMPLECOMPONENTS_H
 
-#include "Core/Aggregate/FTDistributions2D.h"
+#include "Core/Correlations/FTDistributions2D.h"
 #include "Core/StandardSamples/IRegistry.h"
 
 //! @class FTDistribution2DComponents
diff --git a/Core/Vector/SomeFormFactors.cpp b/Core/Vector/SomeFormFactors.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e487139e373b3185642927d49cacf885666ede15
--- /dev/null
+++ b/Core/Vector/SomeFormFactors.cpp
@@ -0,0 +1,32 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Vector/SomeFormFactors.cpp
+//! @brief     Implements namespace someff with some form factor functions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+#include "Core/Vector/SomeFormFactors.h"
+
+//! Returns the form factor of a sphere of radius R.
+//!
+//! Used by the hard sphere and by several soft sphere classes.
+
+complex_t someff::ffSphere(cvector_t q, double R)
+{
+    complex_t q1 =
+        sqrt(q.x() * q.x() + q.y() * q.y() + q.z() * q.z()); // NO sesquilinear dot product!
+    complex_t qR = q1 * R;
+
+    if (std::abs(qR) < 1e-4) { // relative error is O(qR^4) with small prefactor
+        // expand sin(qR)-qR*cos(qR) up to qR^5
+        return 4 * M_PI / 3 * pow(R, 3) * (1. - 0.1 * pow(qR, 2));
+    }
+    return 4 * M_PI * pow(q1, -3) * (sin(qR) - qR * cos(qR));
+}
diff --git a/Core/Vector/SomeFormFactors.h b/Core/Vector/SomeFormFactors.h
new file mode 100644
index 0000000000000000000000000000000000000000..1fe763143b4b134ccb18fcfb8b2159f1fceed1dc
--- /dev/null
+++ b/Core/Vector/SomeFormFactors.h
@@ -0,0 +1,30 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Vector/SomeFormFactors.h
+//! @brief     Declares namespace someff with some form factor functions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+#ifndef BORNAGAIN_CORE_VECTOR_SOMEFORMFACTORS_H
+#define BORNAGAIN_CORE_VECTOR_SOMEFORMFACTORS_H
+
+#include "Core/Basics/Complex.h"
+#include "Core/Vector/Vectors3D.h"
+
+//! Some form factor functions.
+
+namespace someff
+{
+
+complex_t ffSphere(cvector_t q, double R);
+
+} // namespace someff
+
+#endif // BORNAGAIN_CORE_VECTOR_SOMEFORMFACTORS_H
diff --git a/GUI/coregui/Models/ApplicationModels.cpp b/GUI/coregui/Models/ApplicationModels.cpp
index 512b1eb7ea80d7b6546aaf6375444832bed05aa0..f562bbf89c3c8010b274481e314d475f776d2bb5 100644
--- a/GUI/coregui/Models/ApplicationModels.cpp
+++ b/GUI/coregui/Models/ApplicationModels.cpp
@@ -17,8 +17,8 @@
 #include "Core/Multilayer/MultiLayer.h"
 #include "Core/Scattering/ISample.h"
 #include "Core/Simulation/OffSpecSimulation.h"
+#include "Core/Simulation/StandardSimulations.h"
 #include "Core/StandardSamples/SampleBuilderFactory.h"
-#include "Core/StandardSamples/StandardSimulations.h"
 #include "GUI/coregui/Models/DocumentModel.h"
 #include "GUI/coregui/Models/GUIObjectBuilder.h"
 #include "GUI/coregui/Models/InstrumentItems.h"
diff --git a/GUI/coregui/Models/FTDecayFunctionItems.h b/GUI/coregui/Models/FTDecayFunctionItems.h
index dd82cc53b8e745710ad2dbaaca60d408804624a8..5b4c7401412c49ed3854eb00f8dade4125367e5e 100644
--- a/GUI/coregui/Models/FTDecayFunctionItems.h
+++ b/GUI/coregui/Models/FTDecayFunctionItems.h
@@ -15,8 +15,8 @@
 #ifndef BORNAGAIN_GUI_COREGUI_MODELS_FTDECAYFUNCTIONITEMS_H
 #define BORNAGAIN_GUI_COREGUI_MODELS_FTDECAYFUNCTIONITEMS_H
 
-#include "Core/Aggregate/FTDecay1D.h"
-#include "Core/Aggregate/FTDecay2D.h"
+#include "Core/Correlations/FTDecay1D.h"
+#include "Core/Correlations/FTDecay2D.h"
 #include "GUI/coregui/Models/SessionItem.h"
 
 class BA_CORE_API_ FTDecayFunction1DItem : public SessionItem
diff --git a/GUI/coregui/Models/FTDistributionItems.h b/GUI/coregui/Models/FTDistributionItems.h
index 1b93d1e08b63824fc19be634fce7140899281a63..fc2a012fe6ebd35033b4436fe87ebd4cb6eea992 100644
--- a/GUI/coregui/Models/FTDistributionItems.h
+++ b/GUI/coregui/Models/FTDistributionItems.h
@@ -15,8 +15,8 @@
 #ifndef BORNAGAIN_GUI_COREGUI_MODELS_FTDISTRIBUTIONITEMS_H
 #define BORNAGAIN_GUI_COREGUI_MODELS_FTDISTRIBUTIONITEMS_H
 
-#include "Core/Aggregate/FTDistributions1D.h"
-#include "Core/Aggregate/FTDistributions2D.h"
+#include "Core/Correlations/FTDistributions1D.h"
+#include "Core/Correlations/FTDistributions2D.h"
 #include "GUI/coregui/Models/SessionItem.h"
 
 class BA_CORE_API_ FTDistribution1DItem : public SessionItem
diff --git a/GUI/coregui/Models/InterferenceFunctionItems.cpp b/GUI/coregui/Models/InterferenceFunctionItems.cpp
index bb0011c05910c3dc9d5fc79476184440bc68185a..1a567be9c542fe22e3e0cfac77f87a2cdf30ac3d 100644
--- a/GUI/coregui/Models/InterferenceFunctionItems.cpp
+++ b/GUI/coregui/Models/InterferenceFunctionItems.cpp
@@ -13,10 +13,10 @@
 // ************************************************************************** //
 
 #include "GUI/coregui/Models/InterferenceFunctionItems.h"
-#include "Core/Aggregate/FTDecay1D.h"
-#include "Core/Aggregate/FTDecay2D.h"
-#include "Core/Aggregate/FTDistributions2D.h"
 #include "Core/Basics/Units.h"
+#include "Core/Correlations/FTDecay1D.h"
+#include "Core/Correlations/FTDecay2D.h"
+#include "Core/Correlations/FTDistributions2D.h"
 #include "Core/includeIncludes/InterferenceFunctions.h"
 #include "GUI/coregui/Models/FTDecayFunctionItems.h"
 #include "GUI/coregui/Models/FTDistributionItems.h"
diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp
index 8f5a52bb710ee060f063e004443492dfa85facb0..19e26fd6fc579eb18381e7a000664a746ab63f12 100644
--- a/GUI/coregui/Models/TransformFromDomain.cpp
+++ b/GUI/coregui/Models/TransformFromDomain.cpp
@@ -13,8 +13,6 @@
 // ************************************************************************** //
 
 #include "GUI/coregui/Models/TransformFromDomain.h"
-#include "Core/Aggregate/FTDistributions1D.h"
-#include "Core/Aggregate/FTDistributions2D.h"
 #include "Core/Basics/Units.h"
 #include "Core/Beam/Beam.h"
 #include "Core/Beam/FootprintGauss.h"
@@ -22,6 +20,8 @@
 #include "Core/Binning/FixedBinAxis.h"
 #include "Core/Computation/ConstantBackground.h"
 #include "Core/Computation/PoissonNoiseBackground.h"
+#include "Core/Correlations/FTDistributions1D.h"
+#include "Core/Correlations/FTDistributions2D.h"
 #include "Core/Detector/ConvolutionDetectorResolution.h"
 #include "Core/Detector/RectangularDetector.h"
 #include "Core/Detector/RegionOfInterest.h"
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpace2DParacrystalUtils.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpace2DParacrystalUtils.cpp
index 090346e31f1403cbc6285b89e9f2fe5cb7959ff6..d069a3d69638f870a5f48cc507de6e1645737075 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpace2DParacrystalUtils.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpace2DParacrystalUtils.cpp
@@ -13,8 +13,8 @@
 // ************************************************************************** //
 
 #include "GUI/coregui/Views/RealSpaceWidgets/RealSpace2DParacrystalUtils.h"
-#include "Core/Aggregate/FTDistributions2D.h"
 #include "Core/Aggregate/InterferenceFunction2DParaCrystal.h"
+#include "Core/Correlations/FTDistributions2D.h"
 #include "Core/Lattice/Lattice2D.h"
 #include "GUI/coregui/Views/RealSpaceWidgets/RealSpaceCanvas.h"
 
diff --git a/Tests/Functional/Core/Consistence/CMakeLists.txt b/Tests/Functional/Core/Consistence/CMakeLists.txt
index 957fd6bd3bbb8570ac566a8c7da5c37f339f20d0..566b3471b6c0604719a9b805369f10c56bfba272 100644
--- a/Tests/Functional/Core/Consistence/CMakeLists.txt
+++ b/Tests/Functional/Core/Consistence/CMakeLists.txt
@@ -11,4 +11,4 @@ target_include_directories(${test} PUBLIC
     ${CMAKE_SOURCE_DIR}/ThirdParty/common/gtest/gtest-1.8.0/include)
 target_link_libraries(${test} BornAgainCore gtest)
 
-gtest_discover_tests(${test} TEST_PREFIX Core.)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX Core.)
diff --git a/Tests/Functional/Core/Consistence/compare.cpp b/Tests/Functional/Core/Consistence/compare.cpp
index f9914d27763cbc29e0c00d54f94229167d9c4abe..62a1e0f21229681a81dabcc3b9eae6aac9765126 100644
--- a/Tests/Functional/Core/Consistence/compare.cpp
+++ b/Tests/Functional/Core/Consistence/compare.cpp
@@ -20,8 +20,8 @@
 #include "Core/Multilayer/IMultiLayerBuilder.h"
 #include "Core/Multilayer/MultiLayer.h"
 #include "Core/Simulation/Simulation.h"
+#include "Core/Simulation/SimulationFactory.h"
 #include "Core/StandardSamples/SampleBuilderFactory.h"
-#include "Core/StandardSamples/SimulationFactory.h"
 #include "Core/Tools/FileSystemUtils.h"
 #include <iostream>
 
diff --git a/Tests/Functional/Core/CoreSpecial/BatchSimulation.cpp b/Tests/Functional/Core/CoreSpecial/BatchSimulation.cpp
index 0b43571dbcf039969ce8c29ec2f04b8060a812fc..4b49692afc98e0e4c27b0f61a8abf7ec60f987a9 100644
--- a/Tests/Functional/Core/CoreSpecial/BatchSimulation.cpp
+++ b/Tests/Functional/Core/CoreSpecial/BatchSimulation.cpp
@@ -13,8 +13,8 @@
 
 #include "Core/Intensity/IntensityDataFunctions.h"
 #include "Core/Simulation/Simulation.h"
+#include "Core/Simulation/SimulationFactory.h"
 #include "Core/StandardSamples/SampleBuilderFactory.h"
-#include "Core/StandardSamples/SimulationFactory.h"
 #include "Tests/GTestWrapper/google_test.h"
 #include <iostream>
 #include <memory>
diff --git a/Tests/Functional/Core/CoreSpecial/CMakeLists.txt b/Tests/Functional/Core/CoreSpecial/CMakeLists.txt
index 24b1ba170c3fa8eb3d9aa342eb37959c87e9d680..796f01068c22519924d96c3353419e66a1979ef2 100644
--- a/Tests/Functional/Core/CoreSpecial/CMakeLists.txt
+++ b/Tests/Functional/Core/CoreSpecial/CMakeLists.txt
@@ -15,4 +15,4 @@ target_include_directories(${test}
     ${CMAKE_SOURCE_DIR}/ThirdParty/common/gtest/gtest-1.8.0/include)
 target_link_libraries(${test} ${BornAgainCore_LIBRARY} gtest)
 
-gtest_discover_tests(${test} TEST_PREFIX Core:Special:)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX Core:Special:)
diff --git a/Tests/Functional/Core/Fitting/CMakeLists.txt b/Tests/Functional/Core/Fitting/CMakeLists.txt
index 5d231de46bdca49097293f762c6054afeb048c72..7858fed3875c2b571ecb0687e2bc62d6b3dba262 100644
--- a/Tests/Functional/Core/Fitting/CMakeLists.txt
+++ b/Tests/Functional/Core/Fitting/CMakeLists.txt
@@ -9,4 +9,4 @@ target_include_directories(${test}
     PUBLIC ${CMAKE_SOURCE_DIR}/ThirdParty/common/gtest/gtest-1.8.0/include)
 target_link_libraries(${test} BornAgainCore gtest)
 
-gtest_discover_tests(${test} TEST_PREFIX Core.)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX Core.)
diff --git a/Tests/Functional/Core/Fitting/Plan.cpp b/Tests/Functional/Core/Fitting/Plan.cpp
index f195e8237e6fedc25d1436d002827bcb0900dc21..0da93909c3ac62ac441a7e00fcf74198ae0020b6 100644
--- a/Tests/Functional/Core/Fitting/Plan.cpp
+++ b/Tests/Functional/Core/Fitting/Plan.cpp
@@ -15,8 +15,8 @@
 #include "Tests/Functional/Core/Fitting/Plan.h"
 #include "Core/Fitting/FitObjective.h"
 #include "Core/Multilayer/MultiLayer.h"
+#include "Core/Simulation/SimulationFactory.h"
 #include "Core/StandardSamples/SampleBuilderFactory.h"
-#include "Core/StandardSamples/SimulationFactory.h"
 #include "Fit/Kernel/KernelTypes.h"
 #include "Fit/Kernel/Minimizer.h"
 #include "Fit/Kernel/Parameters.h"
diff --git a/Tests/Functional/Core/Fitting/PlanCases.cpp b/Tests/Functional/Core/Fitting/PlanCases.cpp
index d548f47e64870d06bbb56338df3245af1be08eba..7e34279c741fd05bfd541c04ce331ae93be6981a 100644
--- a/Tests/Functional/Core/Fitting/PlanCases.cpp
+++ b/Tests/Functional/Core/Fitting/PlanCases.cpp
@@ -13,11 +13,11 @@
 // ************************************************************************** //
 
 #include "Tests/Functional/Core/Fitting/PlanCases.h"
-#include "Core/Aggregate/FTDecay1D.h"
-#include "Core/Aggregate/FTDecay2D.h"
 #include "Core/Aggregate/InterferenceFunction2DLattice.h"
 #include "Core/Aggregate/ParticleLayout.h"
 #include "Core/Basics/Units.h"
+#include "Core/Correlations/FTDecay1D.h"
+#include "Core/Correlations/FTDecay2D.h"
 #include "Core/Detector/RectangularDetector.h"
 #include "Core/Fitting/FitObjective.h"
 #include "Core/HardParticle/FormFactorCylinder.h"
diff --git a/Tests/Functional/Core/MPI/mpitest.cpp b/Tests/Functional/Core/MPI/mpitest.cpp
index 080b712f32b77cade7cd29ca83ee3d4e10655e2a..39e4b210972e12c50b936cced259ad75ecf63d2d 100644
--- a/Tests/Functional/Core/MPI/mpitest.cpp
+++ b/Tests/Functional/Core/MPI/mpitest.cpp
@@ -3,8 +3,8 @@
 #include "Core/InputOutput/IntensityDataIOFactory.h"
 #include "Core/Intensity/IntensityDataFunctions.h"
 #include "Core/Multilayer/MultiLayer.h"
+#include "Core/Simulation/SimulationFactory.h"
 #include "Core/StandardSamples/SampleBuilderFactory.h"
-#include "Core/StandardSamples/SimulationFactory.h"
 
 #include <iostream>
 
diff --git a/Tests/Functional/Core/Std/CMakeLists.txt b/Tests/Functional/Core/Std/CMakeLists.txt
index 4946afcc7152da9c6d19f8fac1aa2dfb97272ca8..40f9be1f177f6c40705514f37771cc121c81abce 100644
--- a/Tests/Functional/Core/Std/CMakeLists.txt
+++ b/Tests/Functional/Core/Std/CMakeLists.txt
@@ -10,4 +10,4 @@ target_include_directories(${test} PUBLIC
     ${CMAKE_SOURCE_DIR}/ThirdParty/common/gtest/gtest-1.8.0/include)
 target_link_libraries(${test} BornAgainCore gtest)
 
-gtest_discover_tests(${test} TEST_PREFIX Core.)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX Core.)
diff --git a/Tests/Functional/Core/Std/Check.cpp b/Tests/Functional/Core/Std/Check.cpp
index 7f306eb1bf629233d3dcdeaa8cc4c4103443b2a7..930327e22a89d91614aa743dcf53671998af01bb 100644
--- a/Tests/Functional/Core/Std/Check.cpp
+++ b/Tests/Functional/Core/Std/Check.cpp
@@ -20,8 +20,8 @@
 #include "Core/Multilayer/IMultiLayerBuilder.h"
 #include "Core/Multilayer/MultiLayer.h"
 #include "Core/Simulation/Simulation.h"
+#include "Core/Simulation/SimulationFactory.h"
 #include "Core/StandardSamples/SampleBuilderFactory.h"
-#include "Core/StandardSamples/SimulationFactory.h"
 #include "Core/Tools/FileSystemUtils.h"
 #include <iostream>
 
diff --git a/Tests/Functional/Fit/Minimizer/CMakeLists.txt b/Tests/Functional/Fit/Minimizer/CMakeLists.txt
index 50a982c4571a2e3a4cf4c55398c04afeb8a05dce..9e013d5b52807021a9779c131aa832900c82400e 100644
--- a/Tests/Functional/Fit/Minimizer/CMakeLists.txt
+++ b/Tests/Functional/Fit/Minimizer/CMakeLists.txt
@@ -9,4 +9,4 @@ target_include_directories(${test}
     PUBLIC ${CMAKE_SOURCE_DIR}/ThirdParty/common/gtest/gtest-1.8.0/include)
 target_link_libraries(${test} BornAgainFit gtest)
 
-gtest_discover_tests(${test} TEST_PREFIX Fit.)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX Fit.)
diff --git a/Tests/Functional/GUI/Other/CMakeLists.txt b/Tests/Functional/GUI/Other/CMakeLists.txt
index ef18253456d03c1cecfab73dfb23feaa699122bf..6f21ecb9f3f523b1218a074285f977d634d25331 100644
--- a/Tests/Functional/GUI/Other/CMakeLists.txt
+++ b/Tests/Functional/GUI/Other/CMakeLists.txt
@@ -9,4 +9,4 @@ target_include_directories(${test}
     PUBLIC ${CMAKE_SOURCE_DIR}/ThirdParty/common/gtest/gtest-1.8.0/include)
 target_link_libraries(${test} BornAgainGUI gtest)
 
-gtest_discover_tests(${test} TEST_PREFIX GUI.)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX GUI.)
diff --git a/Tests/Functional/GUI/Std/CMakeLists.txt b/Tests/Functional/GUI/Std/CMakeLists.txt
index bc9bd07e7627745fa29ec54671ea29dd7b262e58..ea1616a0a450c629090e929fe06cc7a4e4a514d7 100644
--- a/Tests/Functional/GUI/Std/CMakeLists.txt
+++ b/Tests/Functional/GUI/Std/CMakeLists.txt
@@ -10,4 +10,4 @@ target_include_directories(${test} PUBLIC
     ${CMAKE_SOURCE_DIR}/ThirdParty/common/gtest/gtest-1.8.0/include)
 target_link_libraries(${test} BornAgainGUI gtest)
 
-gtest_discover_tests(${test} TEST_PREFIX Gui.)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX Gui.)
diff --git a/Tests/Functional/GUI/Translate/CMakeLists.txt b/Tests/Functional/GUI/Translate/CMakeLists.txt
index 55bd9ea3e4626f88133cf775244b1db0040e6f19..4fb03fe1e3d1902a30180c57e8944d72a9b6950c 100644
--- a/Tests/Functional/GUI/Translate/CMakeLists.txt
+++ b/Tests/Functional/GUI/Translate/CMakeLists.txt
@@ -9,4 +9,4 @@ target_include_directories(${test}
     PUBLIC ${CMAKE_SOURCE_DIR}/ThirdParty/common/gtest/gtest-1.8.0/include)
 target_link_libraries(${test} BornAgainGUI gtest)
 
-gtest_discover_tests(${test} TEST_PREFIX GUI.)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX GUI.)
diff --git a/Tests/Functional/GUI/Translate/GUITranslationTest.cpp b/Tests/Functional/GUI/Translate/GUITranslationTest.cpp
index 2cd45abe790b294ac2c2b39c4a27cb0bf5da4b5d..d49f9dd7038da2ca997ca929575debe4a3e683a5 100644
--- a/Tests/Functional/GUI/Translate/GUITranslationTest.cpp
+++ b/Tests/Functional/GUI/Translate/GUITranslationTest.cpp
@@ -16,8 +16,8 @@
 #include "Core/Multilayer/MultiLayer.h"
 #include "Core/Parametrization/ParameterPool.h"
 #include "Core/Simulation/GISASSimulation.h"
+#include "Core/Simulation/SimulationFactory.h"
 #include "Core/StandardSamples/SampleBuilderFactory.h"
-#include "Core/StandardSamples/SimulationFactory.h"
 #include "Fit/Tools/StringUtils.h"
 #include "GUI/coregui/Models/ApplicationModels.h"
 #include "GUI/coregui/Models/BeamItems.h"
diff --git a/Tests/Functional/Python/Std/CMakeLists.txt b/Tests/Functional/Python/Std/CMakeLists.txt
index 31493895bb7ee7038c699e3c402967233b208ece..d769218f987144295b1a50d828d89273a1b23ba0 100644
--- a/Tests/Functional/Python/Std/CMakeLists.txt
+++ b/Tests/Functional/Python/Std/CMakeLists.txt
@@ -10,6 +10,6 @@ target_include_directories(${test} PUBLIC
     ${CMAKE_SOURCE_DIR}/ThirdParty/common/gtest/gtest-1.8.0/include)
 target_link_libraries(${test} BornAgainCore gtest)
 
-gtest_discover_tests(${test} TEST_PREFIX Py.)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX Py.)
 
 file(MAKE_DIRECTORY ${TEST_OUTPUT_DIR}/Functional/Python/Std)
diff --git a/Tests/Functional/Std/Run.cpp b/Tests/Functional/Std/Run.cpp
index fc7c3566475509150e243c806f6229f492b631f5..0716342c1aec77e93b785b18c72f8a36cc2e8326 100644
--- a/Tests/Functional/Std/Run.cpp
+++ b/Tests/Functional/Std/Run.cpp
@@ -20,8 +20,8 @@
 #include "Core/Multilayer/IMultiLayerBuilder.h"
 #include "Core/Multilayer/MultiLayer.h"
 #include "Core/Simulation/Simulation.h"
+#include "Core/Simulation/SimulationFactory.h"
 #include "Core/StandardSamples/SampleBuilderFactory.h"
-#include "Core/StandardSamples/SimulationFactory.h"
 #include "Core/Tools/FileSystemUtils.h"
 #include <iostream>
 
diff --git a/Tests/Performance/Core/Multilayer.cpp b/Tests/Performance/Core/Multilayer.cpp
index 2f5cfe3a2323e3b785bf73bea67b35d0b8a6c85d..27269fc879e53b530d379e8dd7943ba7d7029e99 100644
--- a/Tests/Performance/Core/Multilayer.cpp
+++ b/Tests/Performance/Core/Multilayer.cpp
@@ -14,8 +14,8 @@
 
 #include "Core/Multilayer/MultiLayer.h"
 #include "Core/Simulation/SpecularSimulation.h"
+#include "Core/Simulation/StandardSimulations.h"
 #include "Core/StandardSamples/PlainMultiLayerBySLDBuilder.h"
-#include "Core/StandardSamples/StandardSimulations.h"
 #include <chrono>
 
 using Results = std::vector<std::pair<int, long>>;
diff --git a/Tests/UnitTests/Core/CMakeLists.txt b/Tests/UnitTests/Core/CMakeLists.txt
index 6e312354ee6fc1717a8801e7c715444c76610e98..76a7ff3b1a7e30bd4840ed5a60e37e387aa68abb 100644
--- a/Tests/UnitTests/Core/CMakeLists.txt
+++ b/Tests/UnitTests/Core/CMakeLists.txt
@@ -12,4 +12,4 @@ if(BORNAGAIN_GUI)
     target_link_libraries(${test} ${Qt5Core_LIBRARIES})
 endif()
 
-gtest_discover_tests(${test} TEST_PREFIX Core.Unit.)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX Core.Unit.)
diff --git a/Tests/UnitTests/Core/Fresnel/MatrixRTCoefficientsTest.cpp b/Tests/UnitTests/Core/Fresnel/MatrixRTCoefficientsTest.cpp
index a31945989f402cbbc16be3c83a579c1d08c72899..5f569326af3623d95506aeee4f708be847a05c00 100644
--- a/Tests/UnitTests/Core/Fresnel/MatrixRTCoefficientsTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/MatrixRTCoefficientsTest.cpp
@@ -1,4 +1,4 @@
-#include "Core/Multilayer/MatrixRTCoefficients.h"
+#include "Core/RT/MatrixRTCoefficients.h"
 #include "Tests/GTestWrapper/google_test.h"
 
 class MatrixRTCoefficientsTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/Fresnel/ScalarRTCoefficientsTest.cpp b/Tests/UnitTests/Core/Fresnel/ScalarRTCoefficientsTest.cpp
index c712f88e2c5fb454849e3dd13a4e297c1cd02ba8..4d4dccb9f03a2b90d0624cb26a5dbce2bc4a5102 100644
--- a/Tests/UnitTests/Core/Fresnel/ScalarRTCoefficientsTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/ScalarRTCoefficientsTest.cpp
@@ -1,4 +1,4 @@
-#include "Core/Multilayer/ScalarRTCoefficients.h"
+#include "Core/RT/ScalarRTCoefficients.h"
 #include "Tests/GTestWrapper/google_test.h"
 
 class ScalarRTCoefficientsTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/Fresnel/SpecularScanTest.cpp b/Tests/UnitTests/Core/Fresnel/SpecularScanTest.cpp
index c62ac25c035bcf52ad5963c66100c7ced55d3b1b..675af54cbb1c37bdb1a30e26df730835bf06e4a4 100644
--- a/Tests/UnitTests/Core/Fresnel/SpecularScanTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/SpecularScanTest.cpp
@@ -4,8 +4,8 @@
 #include "Core/Detector/ScanResolution.h"
 #include "Core/Instrument/AngularSpecScan.h"
 #include "Core/Instrument/QSpecScan.h"
+#include "Core/Multilayer/SpecularSimulationElement.h"
 #include "Core/Parametrization/RangedDistributions.h"
-#include "Core/SimulationElement/SpecularSimulationElement.h"
 #include "Tests/GTestWrapper/google_test.h"
 
 class SpecularScanTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/Parameters/DistributionsTest.cpp b/Tests/UnitTests/Core/Parameters/DistributionsTest.cpp
index 37e027ecb17b6d3a9bc85bd592ffc559e5e5437f..c81506a333128c8e0f4644ccaa6215eede7def37 100644
--- a/Tests/UnitTests/Core/Parameters/DistributionsTest.cpp
+++ b/Tests/UnitTests/Core/Parameters/DistributionsTest.cpp
@@ -262,29 +262,6 @@ TEST_F(DistributionsTest, DistributionGaussianClone)
 
 // -------------------------------------------------------------------------- //
 
-TEST_F(DistributionsTest, DistributionLogNormalConstructorWithOneParameter)
-{
-    // When scale_par == 0.0, only one sample is generated (the mean):
-    DistributionLogNormal distr1(1.0, 0.0);
-    std::vector<double> list1 = distr1.equidistantPoints(5, 0.0);
-    EXPECT_EQ(size_t(1), list1.size());
-    EXPECT_EQ(1.0, list1[0]);
-
-    // Test distribution with scale_par > 0.0:
-    DistributionLogNormal distr2(1.0);
-    EXPECT_EQ(1.0, distr2.getMedian());
-    EXPECT_EQ(1.0, distr2.getScalePar());
-    EXPECT_EQ(std::exp(0.5), distr2.getMean());
-    EXPECT_EQ(1.0 / std::sqrt(M_TWOPI), distr2.probabilityDensity(1.0));
-
-    std::vector<double> list2 = distr2.equidistantPoints(1, 0.0);
-    EXPECT_EQ(distr2.getMedian(), list2[0]);
-
-    std::vector<double> list3 = distr2.equidistantPoints(2, 0.0);
-    EXPECT_EQ(std::exp(-2), list3[0]);
-    EXPECT_EQ(std::exp(-2) + std::exp(2) - std::exp(-2), list3[1]);
-}
-
 TEST_F(DistributionsTest, DistributionLogNormalConstructorWithTwoParameter)
 {
     std::unique_ptr<DistributionLogNormal> P_distr_lognormal{new DistributionLogNormal(1.0, 1.0)};
diff --git a/Tests/UnitTests/Core/Parameters/FTDistributionsTest.cpp b/Tests/UnitTests/Core/Parameters/FTDistributionsTest.cpp
index daedb5656d31a4b76beed6d1c83aa9e21fc51872..37d1056a0727c000191fe88fa95cadec240c5d72 100644
--- a/Tests/UnitTests/Core/Parameters/FTDistributionsTest.cpp
+++ b/Tests/UnitTests/Core/Parameters/FTDistributionsTest.cpp
@@ -1,6 +1,6 @@
-#include "Core/Aggregate/FTDistributions1D.h"
-#include "Core/Aggregate/FTDistributions2D.h"
 #include "Core/Basics/MathConstants.h"
+#include "Core/Correlations/FTDistributions1D.h"
+#include "Core/Correlations/FTDistributions2D.h"
 #include "Core/Parametrization/RealParameter.h"
 #include "Tests/GTestWrapper/google_test.h"
 #include <memory>
diff --git a/Tests/UnitTests/Core/Parameters/IParameterizedTest.cpp b/Tests/UnitTests/Core/Parameters/IParameterizedTest.cpp
index 553efdb5c199b8b288a7ef8313e927ea74a56dc1..955ecd5c09e428d7ce3932d223f33758c7af46e4 100644
--- a/Tests/UnitTests/Core/Parameters/IParameterizedTest.cpp
+++ b/Tests/UnitTests/Core/Parameters/IParameterizedTest.cpp
@@ -13,17 +13,11 @@ protected:
         ParameterizedObject() : m_real_par1(0), m_real_par2(0)
         {
             setName("Parameterized");
-            init_parameters();
-        }
-        double m_real_par1;
-        double m_real_par2;
-
-    protected:
-        virtual void init_parameters()
-        {
             registerParameter("par1", &m_real_par1);
             registerParameter("par2", &m_real_par2);
         }
+        double m_real_par1;
+        double m_real_par2;
     };
     ParameterizedObject m_parameterized;
 };
diff --git a/Tests/UnitTests/Fit/CMakeLists.txt b/Tests/UnitTests/Fit/CMakeLists.txt
index c37ab1b335d7ce91e9a9989310067ab4d697a8a4..7eb1f74e9143ba391bd69b74903ed71927cd0a97 100644
--- a/Tests/UnitTests/Fit/CMakeLists.txt
+++ b/Tests/UnitTests/Fit/CMakeLists.txt
@@ -9,4 +9,4 @@ file(GLOB source_files "*.cpp" ${CMAKE_SOURCE_DIR}/Tests/GTestWrapper/TestAll.cp
 add_executable(${test} ${source_files})
 target_link_libraries(${test} ${BornAgainFit_LIBRARY} gtest)
 
-gtest_discover_tests(${test} TEST_PREFIX Fit.Unit.)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX Fit.Unit.)
diff --git a/Tests/UnitTests/GUI/CMakeLists.txt b/Tests/UnitTests/GUI/CMakeLists.txt
index d66d19429bdf3581ab7880f4cb207cf7aeae27e0..21b1f4a51689ea6a38ab5811764d9dee6d83e17b 100644
--- a/Tests/UnitTests/GUI/CMakeLists.txt
+++ b/Tests/UnitTests/GUI/CMakeLists.txt
@@ -14,4 +14,4 @@ add_executable(${test} ${source_files})
 target_link_libraries(${test} ${BornAgainGUI_LIBRARY} gtest)
 target_link_libraries(${test} Qt5::Core Qt5::Test)
 
-gtest_discover_tests(${test} TEST_PREFIX GUI.Unit.)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX GUI.Unit.)
diff --git a/Tests/UnitTests/GUI/TestFTDistributionItems.cpp b/Tests/UnitTests/GUI/TestFTDistributionItems.cpp
index c137ca058cc7ade13eeca612a6c82855778620cd..2c0e98b56fd0de5129105871cd5ce731285e6345 100644
--- a/Tests/UnitTests/GUI/TestFTDistributionItems.cpp
+++ b/Tests/UnitTests/GUI/TestFTDistributionItems.cpp
@@ -1,4 +1,4 @@
-#include "Core/Aggregate/FTDistributions1D.h"
+#include "Core/Correlations/FTDistributions1D.h"
 #include "GUI/coregui/Models/FTDistributionItems.h"
 #include "Tests/GTestWrapper/google_test.h"
 
diff --git a/Tests/UnitTests/GUI/TestParaCrystalItems.cpp b/Tests/UnitTests/GUI/TestParaCrystalItems.cpp
index 1e2f04f8ef6095de71a18f41185303add45064ec..fcd886a9670bcbacb53d192abd399dbbcf185c53 100644
--- a/Tests/UnitTests/GUI/TestParaCrystalItems.cpp
+++ b/Tests/UnitTests/GUI/TestParaCrystalItems.cpp
@@ -1,6 +1,6 @@
-#include "Core/Aggregate/FTDistributions2D.h"
 #include "Core/Aggregate/InterferenceFunction2DParaCrystal.h"
 #include "Core/Basics/Units.h"
+#include "Core/Correlations/FTDistributions2D.h"
 #include "Core/Lattice/Lattice2D.h"
 #include "GUI/coregui/Models/FTDistributionItems.h"
 #include "GUI/coregui/Models/InterferenceFunctionItems.h"
diff --git a/Tests/UnitTests/Numeric/CMakeLists.txt b/Tests/UnitTests/Numeric/CMakeLists.txt
index 7128e30d02078759e864dc90aab0a1b57b7015bd..d86d50f7c6ea11c0d3487d853e0263a49968e2c8 100644
--- a/Tests/UnitTests/Numeric/CMakeLists.txt
+++ b/Tests/UnitTests/Numeric/CMakeLists.txt
@@ -16,4 +16,4 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
     target_compile_options(${test} PUBLIC "-Wno-deprecated-copy")
 endif()
 
-gtest_discover_tests(${test} TEST_PREFIX Numeric:)
+gtest_discover_tests(${test} DISCOVERY_TIMEOUT 300 TEST_PREFIX Numeric:)
diff --git a/Wrap/swig/libBornAgainCore.i b/Wrap/swig/libBornAgainCore.i
index 6169cda75d9eb7b459c76cafc5173f29328ec671..9ef016e94e8114cbae802339a5fcc9bf87a93cb5 100644
--- a/Wrap/swig/libBornAgainCore.i
+++ b/Wrap/swig/libBornAgainCore.i
@@ -74,13 +74,13 @@
 
 %{
 #include "BAVersion.h"
-#include "Core/Aggregate/FTDecay1D.h"
-#include "Core/Aggregate/FTDecay2D.h"
-#include "Core/Aggregate/FTDistributions1D.h"
-#include "Core/Aggregate/FTDistributions2D.h"
+#include "Core/Correlations/FTDecay1D.h"
+#include "Core/Correlations/FTDecay2D.h"
+#include "Core/Correlations/FTDistributions1D.h"
+#include "Core/Correlations/FTDistributions2D.h"
+#include "Core/Correlations/ILayout.h"
+#include "Core/Correlations/IPeakShape.h"
 #include "Core/Aggregate/IInterferenceFunction.h"
-#include "Core/Aggregate/ILayout.h"
-#include "Core/Aggregate/IPeakShape.h"
 #include "Core/Aggregate/InterferenceFunction1DLattice.h"
 #include "Core/Aggregate/InterferenceFunction2DLattice.h"
 #include "Core/Aggregate/InterferenceFunction2DParaCrystal.h"
@@ -166,7 +166,6 @@
 #include "Core/Intensity/IHistogram.h"
 #include "Core/Intensity/IIntensityFunction.h"
 #include "Core/Intensity/IIntensityFunction.h"
-#include "Core/Intensity/IIntensityNormalizer.h"
 #include "Core/Intensity/IntensityDataFunctions.h"
 #include "Core/Intensity/OutputData.h"
 #include "Core/Lattice/ILatticeOrientation.h"
@@ -222,7 +221,7 @@
 #include "Core/SoftParticle/FormFactorSphereGaussianRadius.h"
 #include "Core/SoftParticle/FormFactorSphereLogNormalRadius.h"
 #include "Core/StandardSamples/SampleBuilderFactory.h"
-#include "Core/StandardSamples/SimulationFactory.h"
+#include "Core/Simulation/SimulationFactory.h"
 #include "Core/Tools/MathFunctions.h"
 #include "Core/Vector/BasicVector3D.h"
 #include "Core/Vector/Vectors3D.h"
@@ -367,16 +366,16 @@
 %include "Core/Particle/ParticleCoreShell.h"
 %include "Core/Particle/ParticleDistribution.h"
 
-%include "Core/Aggregate/FTDecay1D.h"
-%include "Core/Aggregate/FTDecay2D.h"
-%include "Core/Aggregate/FTDistributions1D.h"
-%include "Core/Aggregate/FTDistributions2D.h"
-%include "Core/Aggregate/FTDecay1D.h"
-%include "Core/Aggregate/FTDecay2D.h"
-%include "Core/Aggregate/IInterferenceFunction.h"
-%include "Core/Aggregate/ILayout.h"
-%include "Core/Aggregate/IPeakShape.h"
+%include "Core/Correlations/FTDecay1D.h"
+%include "Core/Correlations/FTDecay2D.h"
+%include "Core/Correlations/FTDistributions1D.h"
+%include "Core/Correlations/FTDistributions2D.h"
+%include "Core/Correlations/FTDecay1D.h"
+%include "Core/Correlations/FTDecay2D.h"
+%include "Core/Correlations/ILayout.h"
+%include "Core/Correlations/IPeakShape.h"
 
+%include "Core/Aggregate/IInterferenceFunction.h"
 %include "Core/Aggregate/InterferenceFunction1DLattice.h"
 %include "Core/Aggregate/InterferenceFunction2DLattice.h"
 %include "Core/Aggregate/InterferenceFunction2DParaCrystal.h"
@@ -469,7 +468,6 @@
 %include "Core/Detector/ScanResolution.h"
 
 %include "Core/Intensity/IHistogram.h"
-%include "Core/Intensity/IIntensityNormalizer.h"
 %include "Core/Intensity/IIntensityFunction.h"
 %include "Core/Intensity/IUnitConverter.h"
 
@@ -499,6 +497,6 @@
 %include "Core/Material/MaterialFactoryFuncs.h"
 
 %include "Core/StandardSamples/SampleBuilderFactory.h"
-%include "Core/StandardSamples/SimulationFactory.h"
+%include "Core/Simulation/SimulationFactory.h"
 
 %include "extendCore.i"
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index 4eb0031ccaa5fe70f02a39be8d0110ca28bca5a6..d15774779998457cf9052881ef9b2d59354135ec 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -6379,8 +6379,6 @@ class INodeVisitor(object):
         visit(INodeVisitor self, ILayout arg2)
         visit(INodeVisitor self, INode arg2)
         visit(INodeVisitor self, Instrument arg2)
-        visit(INodeVisitor self, IntensityNormalizer arg2)
-        visit(INodeVisitor self, IntensityScaleAndShiftNormalizer arg2)
         visit(INodeVisitor self, InterferenceFunction1DLattice arg2)
         visit(INodeVisitor self, InterferenceFunction2DLattice arg2)
         visit(INodeVisitor self, InterferenceFunction2DParaCrystal arg2)
@@ -6587,7 +6585,6 @@ class IDistribution1D(ICloneable, INode):
     def __init__(self, *args, **kwargs):
         raise AttributeError("No constructor defined - class is abstract")
     __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainCore.delete_IDistribution1D
 
     def clone(self):
         r"""
@@ -6676,6 +6673,7 @@ class IDistribution1D(ICloneable, INode):
 
         """
         return _libBornAgainCore.IDistribution1D_setUnits(self, units)
+    __swig_destroy__ = _libBornAgainCore.delete_IDistribution1D
 
 # Register IDistribution1D in _libBornAgainCore:
 _libBornAgainCore.IDistribution1D_swigregister(IDistribution1D)
@@ -6701,7 +6699,6 @@ class DistributionGate(IDistribution1D):
 
         """
         _libBornAgainCore.DistributionGate_swiginit(self, _libBornAgainCore.new_DistributionGate(*args))
-    __swig_destroy__ = _libBornAgainCore.delete_DistributionGate
 
     def clone(self):
         r"""
@@ -6776,6 +6773,7 @@ class DistributionGate(IDistribution1D):
 
         """
         return _libBornAgainCore.DistributionGate_accept(self, visitor)
+    __swig_destroy__ = _libBornAgainCore.delete_DistributionGate
 
 # Register DistributionGate in _libBornAgainCore:
 _libBornAgainCore.DistributionGate_swigregister(DistributionGate)
@@ -6801,7 +6799,6 @@ class DistributionLorentz(IDistribution1D):
 
         """
         _libBornAgainCore.DistributionLorentz_swiginit(self, _libBornAgainCore.new_DistributionLorentz(*args))
-    __swig_destroy__ = _libBornAgainCore.delete_DistributionLorentz
 
     def clone(self):
         r"""
@@ -6868,6 +6865,7 @@ class DistributionLorentz(IDistribution1D):
 
         """
         return _libBornAgainCore.DistributionLorentz_accept(self, visitor)
+    __swig_destroy__ = _libBornAgainCore.delete_DistributionLorentz
 
 # Register DistributionLorentz in _libBornAgainCore:
 _libBornAgainCore.DistributionLorentz_swigregister(DistributionLorentz)
@@ -6893,7 +6891,6 @@ class DistributionGaussian(IDistribution1D):
 
         """
         _libBornAgainCore.DistributionGaussian_swiginit(self, _libBornAgainCore.new_DistributionGaussian(*args))
-    __swig_destroy__ = _libBornAgainCore.delete_DistributionGaussian
 
     def clone(self):
         r"""
@@ -6960,6 +6957,7 @@ class DistributionGaussian(IDistribution1D):
 
         """
         return _libBornAgainCore.DistributionGaussian_accept(self, visitor)
+    __swig_destroy__ = _libBornAgainCore.delete_DistributionGaussian
 
 # Register DistributionGaussian in _libBornAgainCore:
 _libBornAgainCore.DistributionGaussian_swigregister(DistributionGaussian)
@@ -6977,15 +6975,13 @@ class DistributionLogNormal(IDistribution1D):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, *args):
+    def __init__(self, median, scale_param):
         r"""
-        __init__(DistributionLogNormal self, double scale_param) -> DistributionLogNormal
         __init__(DistributionLogNormal self, double median, double scale_param) -> DistributionLogNormal
         DistributionLogNormal::DistributionLogNormal(double median, double scale_param)
 
         """
-        _libBornAgainCore.DistributionLogNormal_swiginit(self, _libBornAgainCore.new_DistributionLogNormal(*args))
-    __swig_destroy__ = _libBornAgainCore.delete_DistributionLogNormal
+        _libBornAgainCore.DistributionLogNormal_swiginit(self, _libBornAgainCore.new_DistributionLogNormal(median, scale_param))
 
     def clone(self):
         r"""
@@ -7070,6 +7066,7 @@ class DistributionLogNormal(IDistribution1D):
 
         """
         return _libBornAgainCore.DistributionLogNormal_setUnits(self, units)
+    __swig_destroy__ = _libBornAgainCore.delete_DistributionLogNormal
 
 # Register DistributionLogNormal in _libBornAgainCore:
 _libBornAgainCore.DistributionLogNormal_swigregister(DistributionLogNormal)
@@ -7095,7 +7092,6 @@ class DistributionCosine(IDistribution1D):
 
         """
         _libBornAgainCore.DistributionCosine_swiginit(self, _libBornAgainCore.new_DistributionCosine(*args))
-    __swig_destroy__ = _libBornAgainCore.delete_DistributionCosine
 
     def clone(self):
         r"""
@@ -7162,6 +7158,7 @@ class DistributionCosine(IDistribution1D):
 
         """
         return _libBornAgainCore.DistributionCosine_accept(self, visitor)
+    __swig_destroy__ = _libBornAgainCore.delete_DistributionCosine
 
 # Register DistributionCosine in _libBornAgainCore:
 _libBornAgainCore.DistributionCosine_swigregister(DistributionCosine)
@@ -7181,13 +7178,12 @@ class DistributionTrapezoid(IDistribution1D):
 
     def __init__(self, *args):
         r"""
+        __init__(DistributionTrapezoid self, double center, double left, double middle, double right) -> DistributionTrapezoid
         __init__(DistributionTrapezoid self) -> DistributionTrapezoid
-        __init__(DistributionTrapezoid self, double center, double left_width, double middle_width, double right_width) -> DistributionTrapezoid
         DistributionTrapezoid::DistributionTrapezoid(double center, double left_width, double middle_width, double right_width)
 
         """
         _libBornAgainCore.DistributionTrapezoid_swiginit(self, _libBornAgainCore.new_DistributionTrapezoid(*args))
-    __swig_destroy__ = _libBornAgainCore.delete_DistributionTrapezoid
 
     def clone(self):
         r"""
@@ -7270,6 +7266,7 @@ class DistributionTrapezoid(IDistribution1D):
 
         """
         return _libBornAgainCore.DistributionTrapezoid_accept(self, visitor)
+    __swig_destroy__ = _libBornAgainCore.delete_DistributionTrapezoid
 
 # Register DistributionTrapezoid in _libBornAgainCore:
 _libBornAgainCore.DistributionTrapezoid_swigregister(DistributionTrapezoid)
@@ -11231,7 +11228,6 @@ class IFTDistribution2D(ICloneable, INode):
     def __init__(self, *args, **kwargs):
         raise AttributeError("No constructor defined - class is abstract")
     __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainCore.delete_IFTDistribution2D
 
     def clone(self):
         r"""
@@ -11290,6 +11286,7 @@ class IFTDistribution2D(ICloneable, INode):
 
         """
         return _libBornAgainCore.IFTDistribution2D_evaluate(self, qx, qy)
+    __swig_destroy__ = _libBornAgainCore.delete_IFTDistribution2D
 
 # Register IFTDistribution2D in _libBornAgainCore:
 _libBornAgainCore.IFTDistribution2D_swigregister(IFTDistribution2D)
@@ -11584,114 +11581,6 @@ class FTDistribution2DVoigt(IFTDistribution2D):
 # Register FTDistribution2DVoigt in _libBornAgainCore:
 _libBornAgainCore.FTDistribution2DVoigt_swigregister(FTDistribution2DVoigt)
 
-class IInterferenceFunction(ISample):
-    r"""
-
-
-    Pure virtual base class of interference functions.
-
-    C++ includes: IInterferenceFunction.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-
-    def __init__(self, *args):
-        r"""
-        __init__(IInterferenceFunction self) -> IInterferenceFunction
-        __init__(IInterferenceFunction self, IInterferenceFunction other) -> IInterferenceFunction
-        IInterferenceFunction::IInterferenceFunction(const IInterferenceFunction &other)
-
-        """
-        if self.__class__ == IInterferenceFunction:
-            _self = None
-        else:
-            _self = self
-        _libBornAgainCore.IInterferenceFunction_swiginit(self, _libBornAgainCore.new_IInterferenceFunction(_self, *args))
-    __swig_destroy__ = _libBornAgainCore.delete_IInterferenceFunction
-
-    def clone(self):
-        r"""
-        clone(IInterferenceFunction self) -> IInterferenceFunction
-        virtual IInterferenceFunction* IInterferenceFunction::clone() const =0
-
-        Returns a clone of this  ISample object. 
-
-        """
-        return _libBornAgainCore.IInterferenceFunction_clone(self)
-
-    def evaluate(self, q, outer_iff=1.0):
-        r"""
-        evaluate(IInterferenceFunction self, kvector_t q, double outer_iff=1.0) -> double
-        double IInterferenceFunction::evaluate(const kvector_t q, double outer_iff=1.0) const
-
-        Evaluates the interference function for a given wavevector transfer. 
-
-        """
-        return _libBornAgainCore.IInterferenceFunction_evaluate(self, q, outer_iff)
-
-    def setPositionVariance(self, var):
-        r"""
-        setPositionVariance(IInterferenceFunction self, double var)
-        void IInterferenceFunction::setPositionVariance(double var)
-
-        Sets the variance of the position for the calculation of the DW factor It is defined as the variance in each relevant dimension 
-
-        """
-        return _libBornAgainCore.IInterferenceFunction_setPositionVariance(self, var)
-
-    def positionVariance(self):
-        r"""
-        positionVariance(IInterferenceFunction self) -> double
-        double IInterferenceFunction::positionVariance() const
-
-        Returns the position variance. 
-
-        """
-        return _libBornAgainCore.IInterferenceFunction_positionVariance(self)
-
-    def getParticleDensity(self):
-        r"""
-        getParticleDensity(IInterferenceFunction self) -> double
-        virtual double IInterferenceFunction::getParticleDensity() const
-
-        If defined by this interference function's parameters, returns the particle density (per area). Otherwise, returns zero or a user-defined value 
-
-        """
-        return _libBornAgainCore.IInterferenceFunction_getParticleDensity(self)
-
-    def supportsMultilayer(self):
-        r"""
-        supportsMultilayer(IInterferenceFunction self) -> bool
-        virtual bool IInterferenceFunction::supportsMultilayer() const
-
-        Indicates if this interference function can be used with a multilayer (DWBA mode) 
-
-        """
-        return _libBornAgainCore.IInterferenceFunction_supportsMultilayer(self)
-
-    def DWfactor(self, q):
-        r"""
-        DWfactor(IInterferenceFunction self, kvector_t q) -> double
-        double IInterferenceFunction::DWfactor(kvector_t q) const
-
-        Evaluates the Debye-Waller factor for a given wavevector transfer. 
-
-        """
-        return _libBornAgainCore.IInterferenceFunction_DWfactor(self, q)
-
-    def iff_without_dw(self, q):
-        r"""iff_without_dw(IInterferenceFunction self, kvector_t q) -> double"""
-        return _libBornAgainCore.IInterferenceFunction_iff_without_dw(self, q)
-    def __disown__(self):
-        self.this.disown()
-        _libBornAgainCore.disown_IInterferenceFunction(self)
-        return weakref.proxy(self)
-
-# Register IInterferenceFunction in _libBornAgainCore:
-_libBornAgainCore.IInterferenceFunction_swigregister(IInterferenceFunction)
-
 class ILayout(ISample):
     r"""
 
@@ -12092,135 +11981,221 @@ class LorentzFisherPeakShape(IPeakShape):
 # Register LorentzFisherPeakShape in _libBornAgainCore:
 _libBornAgainCore.LorentzFisherPeakShape_swigregister(LorentzFisherPeakShape)
 
-class VonMisesFisherGaussPeakShape(IPeakShape):
-    r"""
+class MisesFisherGaussPeakShape(IPeakShape):
+    r"""Proxy of C++ MisesFisherGaussPeakShape class."""
 
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
 
-    Class that implements a peak shape that is Gaussian in the radial direction and a convolution of a von Mises-Fisher distribution with a von Mises distribution on the two-sphere
+    def __init__(self, max_intensity, radial_size, zenith, kappa_1, kappa_2):
+        r"""__init__(MisesFisherGaussPeakShape self, double max_intensity, double radial_size, kvector_t zenith, double kappa_1, double kappa_2) -> MisesFisherGaussPeakShape"""
+        _libBornAgainCore.MisesFisherGaussPeakShape_swiginit(self, _libBornAgainCore.new_MisesFisherGaussPeakShape(max_intensity, radial_size, zenith, kappa_1, kappa_2))
+    __swig_destroy__ = _libBornAgainCore.delete_MisesFisherGaussPeakShape
 
-    C++ includes: IPeakShape.h
+    def clone(self):
+        r"""
+        clone(MisesFisherGaussPeakShape self) -> MisesFisherGaussPeakShape
+        virtual IPeakShape* IPeakShape::clone() const =0
 
-    """
+        Returns a clone of this  ISample object. 
 
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
+        """
+        return _libBornAgainCore.MisesFisherGaussPeakShape_clone(self)
 
-    def __init__(self, max_intensity, radial_size, zenith, kappa_1, kappa_2):
+    def accept(self, visitor):
+        r"""
+        accept(MisesFisherGaussPeakShape self, INodeVisitor visitor)
+        virtual void INode::accept(INodeVisitor *visitor) const =0
+
+        Calls the  INodeVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.MisesFisherGaussPeakShape_accept(self, visitor)
+
+    def evaluate(self, q, q_lattice_point):
         r"""
-        __init__(VonMisesFisherGaussPeakShape self, double max_intensity, double radial_size, kvector_t zenith, double kappa_1, double kappa_2) -> VonMisesFisherGaussPeakShape
-        VonMisesFisherGaussPeakShape::VonMisesFisherGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith, double kappa_1, double kappa_2)
+        evaluate(MisesFisherGaussPeakShape self, kvector_t q, kvector_t q_lattice_point) -> double
+        virtual double IPeakShape::evaluate(const kvector_t q, const kvector_t q_lattice_point) const =0
+
+        Evaluates the peak shape at q from a reciprocal lattice point at q_lattice_point. 
 
         """
-        _libBornAgainCore.VonMisesFisherGaussPeakShape_swiginit(self, _libBornAgainCore.new_VonMisesFisherGaussPeakShape(max_intensity, radial_size, zenith, kappa_1, kappa_2))
-    __swig_destroy__ = _libBornAgainCore.delete_VonMisesFisherGaussPeakShape
+        return _libBornAgainCore.MisesFisherGaussPeakShape_evaluate(self, q, q_lattice_point)
+
+    def angularDisorder(self):
+        r"""
+        angularDisorder(MisesFisherGaussPeakShape self) -> bool
+        virtual bool IPeakShape::angularDisorder() const
+
+        Indicates if the peak shape encodes angular disorder, in which case all peaks in a spherical shell are needed 
+
+        """
+        return _libBornAgainCore.MisesFisherGaussPeakShape_angularDisorder(self)
+
+# Register MisesFisherGaussPeakShape in _libBornAgainCore:
+_libBornAgainCore.MisesFisherGaussPeakShape_swigregister(MisesFisherGaussPeakShape)
+
+class MisesGaussPeakShape(IPeakShape):
+    r"""Proxy of C++ MisesGaussPeakShape class."""
+
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def __init__(self, max_intensity, radial_size, zenith, kappa):
+        r"""__init__(MisesGaussPeakShape self, double max_intensity, double radial_size, kvector_t zenith, double kappa) -> MisesGaussPeakShape"""
+        _libBornAgainCore.MisesGaussPeakShape_swiginit(self, _libBornAgainCore.new_MisesGaussPeakShape(max_intensity, radial_size, zenith, kappa))
+    __swig_destroy__ = _libBornAgainCore.delete_MisesGaussPeakShape
 
     def clone(self):
         r"""
-        clone(VonMisesFisherGaussPeakShape self) -> VonMisesFisherGaussPeakShape
-        VonMisesFisherGaussPeakShape * VonMisesFisherGaussPeakShape::clone() const override
+        clone(MisesGaussPeakShape self) -> MisesGaussPeakShape
+        virtual IPeakShape* IPeakShape::clone() const =0
 
         Returns a clone of this  ISample object. 
 
         """
-        return _libBornAgainCore.VonMisesFisherGaussPeakShape_clone(self)
+        return _libBornAgainCore.MisesGaussPeakShape_clone(self)
 
     def accept(self, visitor):
         r"""
-        accept(VonMisesFisherGaussPeakShape self, INodeVisitor visitor)
-        void VonMisesFisherGaussPeakShape::accept(INodeVisitor *visitor) const override
+        accept(MisesGaussPeakShape self, INodeVisitor visitor)
+        virtual void INode::accept(INodeVisitor *visitor) const =0
 
         Calls the  INodeVisitor's visit method. 
 
         """
-        return _libBornAgainCore.VonMisesFisherGaussPeakShape_accept(self, visitor)
+        return _libBornAgainCore.MisesGaussPeakShape_accept(self, visitor)
 
     def evaluate(self, q, q_lattice_point):
         r"""
-        evaluate(VonMisesFisherGaussPeakShape self, kvector_t q, kvector_t q_lattice_point) -> double
-        double VonMisesFisherGaussPeakShape::evaluate(const kvector_t q, const kvector_t q_lattice_point) const override
+        evaluate(MisesGaussPeakShape self, kvector_t q, kvector_t q_lattice_point) -> double
+        virtual double IPeakShape::evaluate(const kvector_t q, const kvector_t q_lattice_point) const =0
 
         Evaluates the peak shape at q from a reciprocal lattice point at q_lattice_point. 
 
         """
-        return _libBornAgainCore.VonMisesFisherGaussPeakShape_evaluate(self, q, q_lattice_point)
+        return _libBornAgainCore.MisesGaussPeakShape_evaluate(self, q, q_lattice_point)
 
     def angularDisorder(self):
         r"""
-        angularDisorder(VonMisesFisherGaussPeakShape self) -> bool
-        bool VonMisesFisherGaussPeakShape::angularDisorder() const override
+        angularDisorder(MisesGaussPeakShape self) -> bool
+        virtual bool IPeakShape::angularDisorder() const
 
         Indicates if the peak shape encodes angular disorder, in which case all peaks in a spherical shell are needed 
 
         """
-        return _libBornAgainCore.VonMisesFisherGaussPeakShape_angularDisorder(self)
+        return _libBornAgainCore.MisesGaussPeakShape_angularDisorder(self)
 
-# Register VonMisesFisherGaussPeakShape in _libBornAgainCore:
-_libBornAgainCore.VonMisesFisherGaussPeakShape_swigregister(VonMisesFisherGaussPeakShape)
+# Register MisesGaussPeakShape in _libBornAgainCore:
+_libBornAgainCore.MisesGaussPeakShape_swigregister(MisesGaussPeakShape)
 
-class VonMisesGaussPeakShape(IPeakShape):
+class IInterferenceFunction(ISample):
     r"""
 
 
-    Class that implements a peak shape that is a convolution of a von Mises-Fisher distribution with a 3d Gaussian
+    Pure virtual base class of interference functions.
 
-    C++ includes: IPeakShape.h
+    C++ includes: IInterferenceFunction.h
 
     """
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, max_intensity, radial_size, zenith, kappa):
+    def __init__(self, *args):
         r"""
-        __init__(VonMisesGaussPeakShape self, double max_intensity, double radial_size, kvector_t zenith, double kappa) -> VonMisesGaussPeakShape
-        VonMisesGaussPeakShape::VonMisesGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith, double kappa)
+        __init__(IInterferenceFunction self, NodeMeta meta, vdouble1d_t PValues) -> IInterferenceFunction
+        __init__(IInterferenceFunction self, double position_var) -> IInterferenceFunction
+        IInterferenceFunction::IInterferenceFunction(const IInterferenceFunction &other)
 
         """
-        _libBornAgainCore.VonMisesGaussPeakShape_swiginit(self, _libBornAgainCore.new_VonMisesGaussPeakShape(max_intensity, radial_size, zenith, kappa))
-    __swig_destroy__ = _libBornAgainCore.delete_VonMisesGaussPeakShape
+        if self.__class__ == IInterferenceFunction:
+            _self = None
+        else:
+            _self = self
+        _libBornAgainCore.IInterferenceFunction_swiginit(self, _libBornAgainCore.new_IInterferenceFunction(_self, *args))
+    __swig_destroy__ = _libBornAgainCore.delete_IInterferenceFunction
 
     def clone(self):
         r"""
-        clone(VonMisesGaussPeakShape self) -> VonMisesGaussPeakShape
-        VonMisesGaussPeakShape * VonMisesGaussPeakShape::clone() const override
+        clone(IInterferenceFunction self) -> IInterferenceFunction
+        virtual IInterferenceFunction* IInterferenceFunction::clone() const =0
 
         Returns a clone of this  ISample object. 
 
         """
-        return _libBornAgainCore.VonMisesGaussPeakShape_clone(self)
+        return _libBornAgainCore.IInterferenceFunction_clone(self)
 
-    def accept(self, visitor):
+    def evaluate(self, q, outer_iff=1.0):
         r"""
-        accept(VonMisesGaussPeakShape self, INodeVisitor visitor)
-        void VonMisesGaussPeakShape::accept(INodeVisitor *visitor) const override
+        evaluate(IInterferenceFunction self, kvector_t q, double outer_iff=1.0) -> double
+        double IInterferenceFunction::evaluate(const kvector_t q, double outer_iff=1.0) const
 
-        Calls the  INodeVisitor's visit method. 
+        Evaluates the interference function for a given wavevector transfer. 
 
         """
-        return _libBornAgainCore.VonMisesGaussPeakShape_accept(self, visitor)
+        return _libBornAgainCore.IInterferenceFunction_evaluate(self, q, outer_iff)
 
-    def evaluate(self, q, q_lattice_point):
+    def setPositionVariance(self, var):
         r"""
-        evaluate(VonMisesGaussPeakShape self, kvector_t q, kvector_t q_lattice_point) -> double
-        double VonMisesGaussPeakShape::evaluate(const kvector_t q, const kvector_t q_lattice_point) const override
+        setPositionVariance(IInterferenceFunction self, double var)
+        void IInterferenceFunction::setPositionVariance(double var)
 
-        Evaluates the peak shape at q from a reciprocal lattice point at q_lattice_point. 
+        Sets the variance of the position for the calculation of the DW factor It is defined as the variance in each relevant dimension 
 
         """
-        return _libBornAgainCore.VonMisesGaussPeakShape_evaluate(self, q, q_lattice_point)
+        return _libBornAgainCore.IInterferenceFunction_setPositionVariance(self, var)
 
-    def angularDisorder(self):
+    def positionVariance(self):
         r"""
-        angularDisorder(VonMisesGaussPeakShape self) -> bool
-        bool VonMisesGaussPeakShape::angularDisorder() const override
+        positionVariance(IInterferenceFunction self) -> double
+        double IInterferenceFunction::positionVariance() const
 
-        Indicates if the peak shape encodes angular disorder, in which case all peaks in a spherical shell are needed 
+        Returns the position variance. 
+
+        """
+        return _libBornAgainCore.IInterferenceFunction_positionVariance(self)
+
+    def getParticleDensity(self):
+        r"""
+        getParticleDensity(IInterferenceFunction self) -> double
+        virtual double IInterferenceFunction::getParticleDensity() const
+
+        If defined by this interference function's parameters, returns the particle density (per area). Otherwise, returns zero or a user-defined value 
 
         """
-        return _libBornAgainCore.VonMisesGaussPeakShape_angularDisorder(self)
+        return _libBornAgainCore.IInterferenceFunction_getParticleDensity(self)
 
-# Register VonMisesGaussPeakShape in _libBornAgainCore:
-_libBornAgainCore.VonMisesGaussPeakShape_swigregister(VonMisesGaussPeakShape)
+    def supportsMultilayer(self):
+        r"""
+        supportsMultilayer(IInterferenceFunction self) -> bool
+        virtual bool IInterferenceFunction::supportsMultilayer() const
+
+        Indicates if this interference function can be used with a multilayer (DWBA mode) 
+
+        """
+        return _libBornAgainCore.IInterferenceFunction_supportsMultilayer(self)
+
+    def DWfactor(self, q):
+        r"""
+        DWfactor(IInterferenceFunction self, kvector_t q) -> double
+        double IInterferenceFunction::DWfactor(kvector_t q) const
+
+        Evaluates the Debye-Waller factor for a given wavevector transfer. 
+
+        """
+        return _libBornAgainCore.IInterferenceFunction_DWfactor(self, q)
+
+    def iff_without_dw(self, q):
+        r"""iff_without_dw(IInterferenceFunction self, kvector_t q) -> double"""
+        return _libBornAgainCore.IInterferenceFunction_iff_without_dw(self, q)
+    def __disown__(self):
+        self.this.disown()
+        _libBornAgainCore.disown_IInterferenceFunction(self)
+        return weakref.proxy(self)
+
+# Register IInterferenceFunction in _libBornAgainCore:
+_libBornAgainCore.IInterferenceFunction_swigregister(IInterferenceFunction)
 
 class InterferenceFunction1DLattice(IInterferenceFunction):
     r"""
@@ -13206,13 +13181,13 @@ class InterferenceFunctionHardDisk(IInterferenceFunction):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, radius, density):
+    def __init__(self, radius, density, position_var=0):
         r"""
-        __init__(InterferenceFunctionHardDisk self, double radius, double density) -> InterferenceFunctionHardDisk
+        __init__(InterferenceFunctionHardDisk self, double radius, double density, double position_var=0) -> InterferenceFunctionHardDisk
         InterferenceFunctionHardDisk::InterferenceFunctionHardDisk(double radius, double density)
 
         """
-        _libBornAgainCore.InterferenceFunctionHardDisk_swiginit(self, _libBornAgainCore.new_InterferenceFunctionHardDisk(radius, density))
+        _libBornAgainCore.InterferenceFunctionHardDisk_swiginit(self, _libBornAgainCore.new_InterferenceFunctionHardDisk(radius, density, position_var))
     __swig_destroy__ = _libBornAgainCore.delete_InterferenceFunctionHardDisk
 
     def clone(self):
@@ -14324,8 +14299,8 @@ class LayerRoughness(ISample):
 
     def __init__(self, *args):
         r"""
-        __init__(LayerRoughness self) -> LayerRoughness
         __init__(LayerRoughness self, double sigma, double hurstParameter, double lateralCorrLength) -> LayerRoughness
+        __init__(LayerRoughness self) -> LayerRoughness
         LayerRoughness::LayerRoughness(double sigma, double hurstParameter, double lateralCorrLength)
 
         Constructor of layer roughness.
@@ -20619,176 +20594,6 @@ def IHistogram_createFrom(*args):
     """
     return _libBornAgainCore.IHistogram_createFrom(*args)
 
-class IIntensityNormalizer(ICloneable, INode):
-    r"""
-
-
-    Interface to  OutputData normalizers.
-
-    C++ includes: IIntensityNormalizer.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-
-    def __init__(self, *args, **kwargs):
-        raise AttributeError("No constructor defined - class is abstract")
-    __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainCore.delete_IIntensityNormalizer
-
-    def clone(self):
-        r"""
-        clone(IIntensityNormalizer self) -> IIntensityNormalizer
-        virtual IIntensityNormalizer* IIntensityNormalizer::clone() const =0
-
-        """
-        return _libBornAgainCore.IIntensityNormalizer_clone(self)
-
-    def createNormalizedData(self, data):
-        r"""
-        createNormalizedData(IIntensityNormalizer self, IntensityData data) -> IntensityData
-        virtual OutputData<double>* IIntensityNormalizer::createNormalizedData(const OutputData< double > &data) const =0
-
-        """
-        return _libBornAgainCore.IIntensityNormalizer_createNormalizedData(self, data)
-
-    def apply(self, data):
-        r"""
-        apply(IIntensityNormalizer self, IntensityData data)
-        virtual void IIntensityNormalizer::apply(OutputData< double > &data) const =0
-
-        """
-        return _libBornAgainCore.IIntensityNormalizer_apply(self, data)
-
-    def setMaximumIntensity(self, arg2):
-        r"""
-        setMaximumIntensity(IIntensityNormalizer self, double arg2)
-        virtual void IIntensityNormalizer::setMaximumIntensity(double)=0
-
-        """
-        return _libBornAgainCore.IIntensityNormalizer_setMaximumIntensity(self, arg2)
-
-# Register IIntensityNormalizer in _libBornAgainCore:
-_libBornAgainCore.IIntensityNormalizer_swigregister(IIntensityNormalizer)
-
-class IntensityNormalizer(IIntensityNormalizer):
-    r"""
-
-
-    Standard  OutputData normalizer, with configurable max_intensity.
-
-    C++ includes: IIntensityNormalizer.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-
-    def __init__(self, scale=1.0, shift=0.0):
-        r"""
-        __init__(IntensityNormalizer self, double scale=1.0, double shift=0.0) -> IntensityNormalizer
-        IntensityNormalizer::IntensityNormalizer(double scale=1.0, double shift=0.0)
-
-        """
-        _libBornAgainCore.IntensityNormalizer_swiginit(self, _libBornAgainCore.new_IntensityNormalizer(scale, shift))
-    __swig_destroy__ = _libBornAgainCore.delete_IntensityNormalizer
-
-    def clone(self):
-        r"""
-        clone(IntensityNormalizer self) -> IntensityNormalizer
-        IntensityNormalizer * IntensityNormalizer::clone() const
-
-        """
-        return _libBornAgainCore.IntensityNormalizer_clone(self)
-
-    def accept(self, visitor):
-        r"""
-        accept(IntensityNormalizer self, INodeVisitor visitor)
-        void IntensityNormalizer::accept(INodeVisitor *visitor) const
-
-        Calls the  INodeVisitor's visit method. 
-
-        """
-        return _libBornAgainCore.IntensityNormalizer_accept(self, visitor)
-
-    def createNormalizedData(self, data):
-        r"""
-        createNormalizedData(IntensityNormalizer self, IntensityData data) -> IntensityData
-        OutputData< double > * IntensityNormalizer::createNormalizedData(const OutputData< double > &data) const
-
-        """
-        return _libBornAgainCore.IntensityNormalizer_createNormalizedData(self, data)
-
-    def apply(self, data):
-        r"""
-        apply(IntensityNormalizer self, IntensityData data)
-        void IntensityNormalizer::apply(OutputData< double > &data) const final
-
-        """
-        return _libBornAgainCore.IntensityNormalizer_apply(self, data)
-
-    def setMaximumIntensity(self, max_intensity):
-        r"""
-        setMaximumIntensity(IntensityNormalizer self, double max_intensity)
-        virtual void IntensityNormalizer::setMaximumIntensity(double max_intensity)
-
-        """
-        return _libBornAgainCore.IntensityNormalizer_setMaximumIntensity(self, max_intensity)
-
-# Register IntensityNormalizer in _libBornAgainCore:
-_libBornAgainCore.IntensityNormalizer_swigregister(IntensityNormalizer)
-
-class IntensityScaleAndShiftNormalizer(IntensityNormalizer):
-    r"""
-
-
-    Simplified  OutputData normalizer, with max_intensity=1.
-
-    C++ includes: IIntensityNormalizer.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-
-    def __init__(self, scale=1.0, shift=0.0):
-        r"""
-        __init__(IntensityScaleAndShiftNormalizer self, double scale=1.0, double shift=0.0) -> IntensityScaleAndShiftNormalizer
-        IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double scale=1.0, double shift=0.0)
-
-        """
-        _libBornAgainCore.IntensityScaleAndShiftNormalizer_swiginit(self, _libBornAgainCore.new_IntensityScaleAndShiftNormalizer(scale, shift))
-    __swig_destroy__ = _libBornAgainCore.delete_IntensityScaleAndShiftNormalizer
-
-    def accept(self, visitor):
-        r"""
-        accept(IntensityScaleAndShiftNormalizer self, INodeVisitor visitor)
-        void IntensityScaleAndShiftNormalizer::accept(INodeVisitor *visitor) const final
-
-        Calls the  INodeVisitor's visit method. 
-
-        """
-        return _libBornAgainCore.IntensityScaleAndShiftNormalizer_accept(self, visitor)
-
-    def setMaximumIntensity(self, arg2):
-        r"""
-        setMaximumIntensity(IntensityScaleAndShiftNormalizer self, double arg2)
-        void IntensityScaleAndShiftNormalizer::setMaximumIntensity(double) final
-
-        """
-        return _libBornAgainCore.IntensityScaleAndShiftNormalizer_setMaximumIntensity(self, arg2)
-
-    def clone(self):
-        r"""
-        clone(IntensityScaleAndShiftNormalizer self) -> IntensityScaleAndShiftNormalizer
-        IntensityScaleAndShiftNormalizer* IntensityScaleAndShiftNormalizer::clone() const final
-
-        """
-        return _libBornAgainCore.IntensityScaleAndShiftNormalizer_clone(self)
-
-# Register IntensityScaleAndShiftNormalizer in _libBornAgainCore:
-_libBornAgainCore.IntensityScaleAndShiftNormalizer_swigregister(IntensityScaleAndShiftNormalizer)
-
 class IIntensityFunction(object):
     r"""
 
@@ -22664,13 +22469,13 @@ class BasicLattice(Lattice2D):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, length1, length2, angle, rotation_angle):
+    def __init__(self, length1, length2, angle, xi):
         r"""
-        __init__(BasicLattice self, double length1, double length2, double angle, double rotation_angle) -> BasicLattice
+        __init__(BasicLattice self, double length1, double length2, double angle, double xi) -> BasicLattice
         BasicLattice::BasicLattice(double length1, double length2, double angle, double rotation_angle=0.0)
 
         """
-        _libBornAgainCore.BasicLattice_swiginit(self, _libBornAgainCore.new_BasicLattice(length1, length2, angle, rotation_angle))
+        _libBornAgainCore.BasicLattice_swiginit(self, _libBornAgainCore.new_BasicLattice(length1, length2, angle, xi))
 
     def clone(self):
         r"""
@@ -22732,13 +22537,13 @@ class SquareLattice(Lattice2D):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, length, rotation_angle=0.0):
+    def __init__(self, length, xi=0.0):
         r"""
-        __init__(SquareLattice self, double length, double rotation_angle=0.0) -> SquareLattice
+        __init__(SquareLattice self, double length, double xi=0.0) -> SquareLattice
         SquareLattice::SquareLattice(double length, double rotation_angle=0.0)
 
         """
-        _libBornAgainCore.SquareLattice_swiginit(self, _libBornAgainCore.new_SquareLattice(length, rotation_angle))
+        _libBornAgainCore.SquareLattice_swiginit(self, _libBornAgainCore.new_SquareLattice(length, xi))
 
     def clone(self):
         r"""
@@ -22800,13 +22605,13 @@ class HexagonalLattice(Lattice2D):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, length, rotation_angle):
+    def __init__(self, length, xi):
         r"""
-        __init__(HexagonalLattice self, double length, double rotation_angle) -> HexagonalLattice
+        __init__(HexagonalLattice self, double length, double xi) -> HexagonalLattice
         HexagonalLattice::HexagonalLattice(double length, double rotation_angle=0.0)
 
         """
-        _libBornAgainCore.HexagonalLattice_swiginit(self, _libBornAgainCore.new_HexagonalLattice(length, rotation_angle))
+        _libBornAgainCore.HexagonalLattice_swiginit(self, _libBornAgainCore.new_HexagonalLattice(length, xi))
 
     def clone(self):
         r"""
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index f0ad97511eaca3c86ababed27f6357b83032c8a8..882186ae3922c4af43dc4c163d7db40cbf94b41a 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -3196,219 +3196,216 @@ namespace Swig {
 #define SWIGTYPE_p_IFormFactorDecorator swig_types[128]
 #define SWIGTYPE_p_IHistogram swig_types[129]
 #define SWIGTYPE_p_IIntensityFunction swig_types[130]
-#define SWIGTYPE_p_IIntensityNormalizer swig_types[131]
-#define SWIGTYPE_p_IInterferenceFunction swig_types[132]
-#define SWIGTYPE_p_ILatticeOrientation swig_types[133]
-#define SWIGTYPE_p_ILayout swig_types[134]
-#define SWIGTYPE_p_IMultiLayerBuilder swig_types[135]
-#define SWIGTYPE_p_INode swig_types[136]
-#define SWIGTYPE_p_INodeVisitor swig_types[137]
-#define SWIGTYPE_p_IObservable swig_types[138]
-#define SWIGTYPE_p_IObserver swig_types[139]
-#define SWIGTYPE_p_IParameterT_double_t swig_types[140]
-#define SWIGTYPE_p_IParameterized swig_types[141]
-#define SWIGTYPE_p_IParticle swig_types[142]
-#define SWIGTYPE_p_IPeakShape swig_types[143]
-#define SWIGTYPE_p_IPixel swig_types[144]
-#define SWIGTYPE_p_IResolutionFunction2D swig_types[145]
-#define SWIGTYPE_p_IRotation swig_types[146]
-#define SWIGTYPE_p_ISample swig_types[147]
-#define SWIGTYPE_p_ISelectionRule swig_types[148]
-#define SWIGTYPE_p_IShape2D swig_types[149]
-#define SWIGTYPE_p_ISpecularScan swig_types[150]
-#define SWIGTYPE_p_IUnitConverter swig_types[151]
-#define SWIGTYPE_p_IVarianceFunction swig_types[152]
-#define SWIGTYPE_p_IdentityRotation swig_types[153]
-#define SWIGTYPE_p_Instrument swig_types[154]
-#define SWIGTYPE_p_IntensityDataIOFactory swig_types[155]
-#define SWIGTYPE_p_IntensityFunctionLog swig_types[156]
-#define SWIGTYPE_p_IntensityFunctionSqrt swig_types[157]
-#define SWIGTYPE_p_IntensityNormalizer swig_types[158]
-#define SWIGTYPE_p_IntensityScaleAndShiftNormalizer swig_types[159]
-#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[160]
-#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[161]
-#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[162]
-#define SWIGTYPE_p_InterferenceFunction2DSuperLattice swig_types[163]
-#define SWIGTYPE_p_InterferenceFunction3DLattice swig_types[164]
-#define SWIGTYPE_p_InterferenceFunctionFinite2DLattice swig_types[165]
-#define SWIGTYPE_p_InterferenceFunctionFinite3DLattice swig_types[166]
-#define SWIGTYPE_p_InterferenceFunctionHardDisk swig_types[167]
-#define SWIGTYPE_p_InterferenceFunctionNone swig_types[168]
-#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[169]
-#define SWIGTYPE_p_InterferenceFunctionTwin swig_types[170]
-#define SWIGTYPE_p_IsGISAXSDetector swig_types[171]
-#define SWIGTYPE_p_IsotropicGaussPeakShape swig_types[172]
-#define SWIGTYPE_p_IsotropicLorentzPeakShape swig_types[173]
-#define SWIGTYPE_p_IterationInfo swig_types[174]
-#define SWIGTYPE_p_Lattice swig_types[175]
-#define SWIGTYPE_p_Lattice2D swig_types[176]
-#define SWIGTYPE_p_Lattice2D__ReciprocalBases swig_types[177]
-#define SWIGTYPE_p_Layer swig_types[178]
-#define SWIGTYPE_p_LayerInterface swig_types[179]
-#define SWIGTYPE_p_LayerRoughness swig_types[180]
-#define SWIGTYPE_p_Line swig_types[181]
-#define SWIGTYPE_p_LorentzFisherPeakShape swig_types[182]
-#define SWIGTYPE_p_Material swig_types[183]
-#define SWIGTYPE_p_MesoCrystal swig_types[184]
-#define SWIGTYPE_p_MillerIndex swig_types[185]
-#define SWIGTYPE_p_MillerIndexOrientation swig_types[186]
-#define SWIGTYPE_p_MultiLayer swig_types[187]
-#define SWIGTYPE_p_NodeMeta swig_types[188]
-#define SWIGTYPE_p_OffSpecSimulation swig_types[189]
-#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[190]
-#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[191]
-#define SWIGTYPE_p_OutputDataT_CumulativeValue_t swig_types[192]
-#define SWIGTYPE_p_OutputDataT_bool_t swig_types[193]
-#define SWIGTYPE_p_OutputDataT_double_t swig_types[194]
-#define SWIGTYPE_p_ParaMeta swig_types[195]
-#define SWIGTYPE_p_ParameterDistribution swig_types[196]
-#define SWIGTYPE_p_ParameterPool swig_types[197]
-#define SWIGTYPE_p_ParameterSample swig_types[198]
-#define SWIGTYPE_p_Particle swig_types[199]
-#define SWIGTYPE_p_ParticleComposition swig_types[200]
-#define SWIGTYPE_p_ParticleCoreShell swig_types[201]
-#define SWIGTYPE_p_ParticleDistribution swig_types[202]
-#define SWIGTYPE_p_ParticleLayout swig_types[203]
-#define SWIGTYPE_p_ParticleLimits swig_types[204]
-#define SWIGTYPE_p_PoissonNoiseBackground swig_types[205]
-#define SWIGTYPE_p_Polygon swig_types[206]
-#define SWIGTYPE_p_PolygonPrivate swig_types[207]
-#define SWIGTYPE_p_PolygonalTopology swig_types[208]
-#define SWIGTYPE_p_PolyhedralEdge swig_types[209]
-#define SWIGTYPE_p_PolyhedralFace swig_types[210]
-#define SWIGTYPE_p_PolyhedralTopology swig_types[211]
-#define SWIGTYPE_p_ProfileBar swig_types[212]
-#define SWIGTYPE_p_ProfileRipple1 swig_types[213]
-#define SWIGTYPE_p_ProfileRipple2 swig_types[214]
-#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[215]
-#define SWIGTYPE_p_PyBuilderCallback swig_types[216]
-#define SWIGTYPE_p_PyObserverCallback swig_types[217]
-#define SWIGTYPE_p_QSpecScan swig_types[218]
-#define SWIGTYPE_p_RangedDistribution swig_types[219]
-#define SWIGTYPE_p_RangedDistributionCosine swig_types[220]
-#define SWIGTYPE_p_RangedDistributionGate swig_types[221]
-#define SWIGTYPE_p_RangedDistributionGaussian swig_types[222]
-#define SWIGTYPE_p_RangedDistributionLogNormal swig_types[223]
-#define SWIGTYPE_p_RangedDistributionLorentz swig_types[224]
-#define SWIGTYPE_p_RealLimits swig_types[225]
-#define SWIGTYPE_p_RealParameter swig_types[226]
-#define SWIGTYPE_p_Rectangle swig_types[227]
-#define SWIGTYPE_p_RectangularDetector swig_types[228]
-#define SWIGTYPE_p_RectangularPixel swig_types[229]
-#define SWIGTYPE_p_RegionOfInterest swig_types[230]
-#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[231]
-#define SWIGTYPE_p_RotationEuler swig_types[232]
-#define SWIGTYPE_p_RotationX swig_types[233]
-#define SWIGTYPE_p_RotationY swig_types[234]
-#define SWIGTYPE_p_RotationZ swig_types[235]
-#define SWIGTYPE_p_RoughnessModelWrap swig_types[236]
-#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[237]
-#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[238]
-#define SWIGTYPE_p_SampleBuilderFactory swig_types[239]
-#define SWIGTYPE_p_ScanResolution swig_types[240]
-#define SWIGTYPE_p_SimpleSelectionRule swig_types[241]
-#define SWIGTYPE_p_Simulation swig_types[242]
-#define SWIGTYPE_p_Simulation2D swig_types[243]
-#define SWIGTYPE_p_SimulationFactory swig_types[244]
-#define SWIGTYPE_p_SimulationOptions swig_types[245]
-#define SWIGTYPE_p_SimulationResult swig_types[246]
-#define SWIGTYPE_p_SlicedParticle swig_types[247]
-#define SWIGTYPE_p_SlicingEffects swig_types[248]
-#define SWIGTYPE_p_SpecularDetector1D swig_types[249]
-#define SWIGTYPE_p_SpecularSimulation swig_types[250]
-#define SWIGTYPE_p_SphericalDetector swig_types[251]
-#define SWIGTYPE_p_SphericalPixel swig_types[252]
-#define SWIGTYPE_p_SquareLattice swig_types[253]
-#define SWIGTYPE_p_ThreadInfo swig_types[254]
-#define SWIGTYPE_p_Transform3D swig_types[255]
-#define SWIGTYPE_p_VariableBinAxis swig_types[256]
-#define SWIGTYPE_p_VarianceConstantFunction swig_types[257]
-#define SWIGTYPE_p_VarianceSimFunction swig_types[258]
-#define SWIGTYPE_p_VerticalLine swig_types[259]
-#define SWIGTYPE_p_VonMisesFisherGaussPeakShape swig_types[260]
-#define SWIGTYPE_p_VonMisesGaussPeakShape swig_types[261]
-#define SWIGTYPE_p_WavevectorInfo swig_types[262]
-#define SWIGTYPE_p_ZLimits swig_types[263]
-#define SWIGTYPE_p_allocator_type swig_types[264]
-#define SWIGTYPE_p_bool swig_types[265]
-#define SWIGTYPE_p_char swig_types[266]
-#define SWIGTYPE_p_const_iterator swig_types[267]
-#define SWIGTYPE_p_corr_matrix_t swig_types[268]
-#define SWIGTYPE_p_difference_type swig_types[269]
-#define SWIGTYPE_p_double swig_types[270]
-#define SWIGTYPE_p_first_type swig_types[271]
-#define SWIGTYPE_p_int swig_types[272]
-#define SWIGTYPE_p_iterator swig_types[273]
-#define SWIGTYPE_p_key_type swig_types[274]
-#define SWIGTYPE_p_long_long swig_types[275]
-#define SWIGTYPE_p_mapped_type swig_types[276]
-#define SWIGTYPE_p_observer_t swig_types[277]
-#define SWIGTYPE_p_p_PyObject swig_types[278]
-#define SWIGTYPE_p_parameters_t swig_types[279]
-#define SWIGTYPE_p_second_type swig_types[280]
-#define SWIGTYPE_p_short swig_types[281]
-#define SWIGTYPE_p_signed_char swig_types[282]
-#define SWIGTYPE_p_size_type swig_types[283]
-#define SWIGTYPE_p_std__allocatorT_AxisInfo_t swig_types[284]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[285]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[286]
-#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[287]
-#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[288]
-#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[289]
-#define SWIGTYPE_p_std__allocatorT_ParameterSample_t swig_types[290]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[291]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[292]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[293]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[294]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[295]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[296]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[297]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[298]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[299]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[300]
-#define SWIGTYPE_p_std__functionT_IMultiLayerBuilder_pfF_t swig_types[301]
-#define SWIGTYPE_p_std__functionT_Simulation_pfF_t swig_types[302]
-#define SWIGTYPE_p_std__functionT_void_fF_t swig_types[303]
-#define SWIGTYPE_p_std__functionT_void_fSimulationAreaIterator_const_RF_t swig_types[304]
-#define SWIGTYPE_p_std__invalid_argument swig_types[305]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[306]
-#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[307]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[308]
-#define SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t swig_types[309]
-#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[310]
-#define SWIGTYPE_p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t swig_types[311]
-#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[312]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[313]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[314]
-#define SWIGTYPE_p_std__vectorT_HomogeneousRegion_std__allocatorT_HomogeneousRegion_t_t swig_types[315]
-#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[316]
-#define SWIGTYPE_p_std__vectorT_ILayout_const_p_std__allocatorT_ILayout_const_p_t_t swig_types[317]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[318]
-#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[319]
-#define SWIGTYPE_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t swig_types[320]
-#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[321]
-#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[322]
-#define SWIGTYPE_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t swig_types[323]
-#define SWIGTYPE_p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t swig_types[324]
-#define SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t swig_types[325]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[326]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[327]
-#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[328]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[329]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[330]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[331]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[332]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[333]
-#define SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t swig_types[334]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[335]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[336]
-#define SWIGTYPE_p_unsigned_char swig_types[337]
-#define SWIGTYPE_p_unsigned_int swig_types[338]
-#define SWIGTYPE_p_unsigned_long_long swig_types[339]
-#define SWIGTYPE_p_unsigned_short swig_types[340]
-#define SWIGTYPE_p_value_type swig_types[341]
-static swig_type_info *swig_types[343];
-static swig_module_info swig_module = {swig_types, 342, 0, 0, 0, 0};
+#define SWIGTYPE_p_IInterferenceFunction swig_types[131]
+#define SWIGTYPE_p_ILatticeOrientation swig_types[132]
+#define SWIGTYPE_p_ILayout swig_types[133]
+#define SWIGTYPE_p_IMultiLayerBuilder swig_types[134]
+#define SWIGTYPE_p_INode swig_types[135]
+#define SWIGTYPE_p_INodeVisitor swig_types[136]
+#define SWIGTYPE_p_IObservable swig_types[137]
+#define SWIGTYPE_p_IObserver swig_types[138]
+#define SWIGTYPE_p_IParameterT_double_t swig_types[139]
+#define SWIGTYPE_p_IParameterized swig_types[140]
+#define SWIGTYPE_p_IParticle swig_types[141]
+#define SWIGTYPE_p_IPeakShape swig_types[142]
+#define SWIGTYPE_p_IPixel swig_types[143]
+#define SWIGTYPE_p_IResolutionFunction2D swig_types[144]
+#define SWIGTYPE_p_IRotation swig_types[145]
+#define SWIGTYPE_p_ISample swig_types[146]
+#define SWIGTYPE_p_ISelectionRule swig_types[147]
+#define SWIGTYPE_p_IShape2D swig_types[148]
+#define SWIGTYPE_p_ISpecularScan swig_types[149]
+#define SWIGTYPE_p_IUnitConverter swig_types[150]
+#define SWIGTYPE_p_IVarianceFunction swig_types[151]
+#define SWIGTYPE_p_IdentityRotation swig_types[152]
+#define SWIGTYPE_p_Instrument swig_types[153]
+#define SWIGTYPE_p_IntensityDataIOFactory swig_types[154]
+#define SWIGTYPE_p_IntensityFunctionLog swig_types[155]
+#define SWIGTYPE_p_IntensityFunctionSqrt swig_types[156]
+#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[157]
+#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[158]
+#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[159]
+#define SWIGTYPE_p_InterferenceFunction2DSuperLattice swig_types[160]
+#define SWIGTYPE_p_InterferenceFunction3DLattice swig_types[161]
+#define SWIGTYPE_p_InterferenceFunctionFinite2DLattice swig_types[162]
+#define SWIGTYPE_p_InterferenceFunctionFinite3DLattice swig_types[163]
+#define SWIGTYPE_p_InterferenceFunctionHardDisk swig_types[164]
+#define SWIGTYPE_p_InterferenceFunctionNone swig_types[165]
+#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[166]
+#define SWIGTYPE_p_InterferenceFunctionTwin swig_types[167]
+#define SWIGTYPE_p_IsGISAXSDetector swig_types[168]
+#define SWIGTYPE_p_IsotropicGaussPeakShape swig_types[169]
+#define SWIGTYPE_p_IsotropicLorentzPeakShape swig_types[170]
+#define SWIGTYPE_p_IterationInfo swig_types[171]
+#define SWIGTYPE_p_Lattice swig_types[172]
+#define SWIGTYPE_p_Lattice2D swig_types[173]
+#define SWIGTYPE_p_Lattice2D__ReciprocalBases swig_types[174]
+#define SWIGTYPE_p_Layer swig_types[175]
+#define SWIGTYPE_p_LayerInterface swig_types[176]
+#define SWIGTYPE_p_LayerRoughness swig_types[177]
+#define SWIGTYPE_p_Line swig_types[178]
+#define SWIGTYPE_p_LorentzFisherPeakShape swig_types[179]
+#define SWIGTYPE_p_Material swig_types[180]
+#define SWIGTYPE_p_MesoCrystal swig_types[181]
+#define SWIGTYPE_p_MillerIndex swig_types[182]
+#define SWIGTYPE_p_MillerIndexOrientation swig_types[183]
+#define SWIGTYPE_p_MisesFisherGaussPeakShape swig_types[184]
+#define SWIGTYPE_p_MisesGaussPeakShape swig_types[185]
+#define SWIGTYPE_p_MultiLayer swig_types[186]
+#define SWIGTYPE_p_NodeMeta swig_types[187]
+#define SWIGTYPE_p_OffSpecSimulation swig_types[188]
+#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[189]
+#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[190]
+#define SWIGTYPE_p_OutputDataT_CumulativeValue_t swig_types[191]
+#define SWIGTYPE_p_OutputDataT_bool_t swig_types[192]
+#define SWIGTYPE_p_OutputDataT_double_t swig_types[193]
+#define SWIGTYPE_p_ParaMeta swig_types[194]
+#define SWIGTYPE_p_ParameterDistribution swig_types[195]
+#define SWIGTYPE_p_ParameterPool swig_types[196]
+#define SWIGTYPE_p_ParameterSample swig_types[197]
+#define SWIGTYPE_p_Particle swig_types[198]
+#define SWIGTYPE_p_ParticleComposition swig_types[199]
+#define SWIGTYPE_p_ParticleCoreShell swig_types[200]
+#define SWIGTYPE_p_ParticleDistribution swig_types[201]
+#define SWIGTYPE_p_ParticleLayout swig_types[202]
+#define SWIGTYPE_p_ParticleLimits swig_types[203]
+#define SWIGTYPE_p_PoissonNoiseBackground swig_types[204]
+#define SWIGTYPE_p_Polygon swig_types[205]
+#define SWIGTYPE_p_PolygonPrivate swig_types[206]
+#define SWIGTYPE_p_PolygonalTopology swig_types[207]
+#define SWIGTYPE_p_PolyhedralEdge swig_types[208]
+#define SWIGTYPE_p_PolyhedralFace swig_types[209]
+#define SWIGTYPE_p_PolyhedralTopology swig_types[210]
+#define SWIGTYPE_p_ProfileBar swig_types[211]
+#define SWIGTYPE_p_ProfileRipple1 swig_types[212]
+#define SWIGTYPE_p_ProfileRipple2 swig_types[213]
+#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[214]
+#define SWIGTYPE_p_PyBuilderCallback swig_types[215]
+#define SWIGTYPE_p_PyObserverCallback swig_types[216]
+#define SWIGTYPE_p_QSpecScan swig_types[217]
+#define SWIGTYPE_p_RangedDistribution swig_types[218]
+#define SWIGTYPE_p_RangedDistributionCosine swig_types[219]
+#define SWIGTYPE_p_RangedDistributionGate swig_types[220]
+#define SWIGTYPE_p_RangedDistributionGaussian swig_types[221]
+#define SWIGTYPE_p_RangedDistributionLogNormal swig_types[222]
+#define SWIGTYPE_p_RangedDistributionLorentz swig_types[223]
+#define SWIGTYPE_p_RealLimits swig_types[224]
+#define SWIGTYPE_p_RealParameter swig_types[225]
+#define SWIGTYPE_p_Rectangle swig_types[226]
+#define SWIGTYPE_p_RectangularDetector swig_types[227]
+#define SWIGTYPE_p_RectangularPixel swig_types[228]
+#define SWIGTYPE_p_RegionOfInterest swig_types[229]
+#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[230]
+#define SWIGTYPE_p_RotationEuler swig_types[231]
+#define SWIGTYPE_p_RotationX swig_types[232]
+#define SWIGTYPE_p_RotationY swig_types[233]
+#define SWIGTYPE_p_RotationZ swig_types[234]
+#define SWIGTYPE_p_RoughnessModelWrap swig_types[235]
+#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[236]
+#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[237]
+#define SWIGTYPE_p_SampleBuilderFactory swig_types[238]
+#define SWIGTYPE_p_ScanResolution swig_types[239]
+#define SWIGTYPE_p_SimpleSelectionRule swig_types[240]
+#define SWIGTYPE_p_Simulation swig_types[241]
+#define SWIGTYPE_p_Simulation2D swig_types[242]
+#define SWIGTYPE_p_SimulationFactory swig_types[243]
+#define SWIGTYPE_p_SimulationOptions swig_types[244]
+#define SWIGTYPE_p_SimulationResult swig_types[245]
+#define SWIGTYPE_p_SlicedParticle swig_types[246]
+#define SWIGTYPE_p_SlicingEffects swig_types[247]
+#define SWIGTYPE_p_SpecularDetector1D swig_types[248]
+#define SWIGTYPE_p_SpecularSimulation swig_types[249]
+#define SWIGTYPE_p_SphericalDetector swig_types[250]
+#define SWIGTYPE_p_SphericalPixel swig_types[251]
+#define SWIGTYPE_p_SquareLattice swig_types[252]
+#define SWIGTYPE_p_ThreadInfo swig_types[253]
+#define SWIGTYPE_p_Transform3D swig_types[254]
+#define SWIGTYPE_p_VariableBinAxis swig_types[255]
+#define SWIGTYPE_p_VarianceConstantFunction swig_types[256]
+#define SWIGTYPE_p_VarianceSimFunction swig_types[257]
+#define SWIGTYPE_p_VerticalLine swig_types[258]
+#define SWIGTYPE_p_WavevectorInfo swig_types[259]
+#define SWIGTYPE_p_ZLimits swig_types[260]
+#define SWIGTYPE_p_allocator_type swig_types[261]
+#define SWIGTYPE_p_bool swig_types[262]
+#define SWIGTYPE_p_char swig_types[263]
+#define SWIGTYPE_p_const_iterator swig_types[264]
+#define SWIGTYPE_p_corr_matrix_t swig_types[265]
+#define SWIGTYPE_p_difference_type swig_types[266]
+#define SWIGTYPE_p_double swig_types[267]
+#define SWIGTYPE_p_first_type swig_types[268]
+#define SWIGTYPE_p_int swig_types[269]
+#define SWIGTYPE_p_iterator swig_types[270]
+#define SWIGTYPE_p_key_type swig_types[271]
+#define SWIGTYPE_p_long_long swig_types[272]
+#define SWIGTYPE_p_mapped_type swig_types[273]
+#define SWIGTYPE_p_observer_t swig_types[274]
+#define SWIGTYPE_p_p_PyObject swig_types[275]
+#define SWIGTYPE_p_parameters_t swig_types[276]
+#define SWIGTYPE_p_second_type swig_types[277]
+#define SWIGTYPE_p_short swig_types[278]
+#define SWIGTYPE_p_signed_char swig_types[279]
+#define SWIGTYPE_p_size_type swig_types[280]
+#define SWIGTYPE_p_std__allocatorT_AxisInfo_t swig_types[281]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[282]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[283]
+#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[284]
+#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[285]
+#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[286]
+#define SWIGTYPE_p_std__allocatorT_ParameterSample_t swig_types[287]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[288]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[289]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[290]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[291]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[292]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[293]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[294]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[295]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[296]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[297]
+#define SWIGTYPE_p_std__functionT_IMultiLayerBuilder_pfF_t swig_types[298]
+#define SWIGTYPE_p_std__functionT_Simulation_pfF_t swig_types[299]
+#define SWIGTYPE_p_std__functionT_void_fF_t swig_types[300]
+#define SWIGTYPE_p_std__functionT_void_fSimulationAreaIterator_const_RF_t swig_types[301]
+#define SWIGTYPE_p_std__invalid_argument swig_types[302]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[303]
+#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[304]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[305]
+#define SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t swig_types[306]
+#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[307]
+#define SWIGTYPE_p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t swig_types[308]
+#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[309]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[310]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[311]
+#define SWIGTYPE_p_std__vectorT_HomogeneousRegion_std__allocatorT_HomogeneousRegion_t_t swig_types[312]
+#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[313]
+#define SWIGTYPE_p_std__vectorT_ILayout_const_p_std__allocatorT_ILayout_const_p_t_t swig_types[314]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[315]
+#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[316]
+#define SWIGTYPE_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t swig_types[317]
+#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[318]
+#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[319]
+#define SWIGTYPE_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t swig_types[320]
+#define SWIGTYPE_p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t swig_types[321]
+#define SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t swig_types[322]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[323]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[324]
+#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[325]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[326]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[327]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[328]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[329]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[330]
+#define SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t swig_types[331]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[332]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[333]
+#define SWIGTYPE_p_unsigned_char swig_types[334]
+#define SWIGTYPE_p_unsigned_int swig_types[335]
+#define SWIGTYPE_p_unsigned_long_long swig_types[336]
+#define SWIGTYPE_p_unsigned_short swig_types[337]
+#define SWIGTYPE_p_value_type swig_types[338]
+static swig_type_info *swig_types[340];
+static swig_module_info swig_module = {swig_types, 339, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -6892,13 +6889,13 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 
 
 #include "BAVersion.h"
-#include "Core/Aggregate/FTDecay1D.h"
-#include "Core/Aggregate/FTDecay2D.h"
-#include "Core/Aggregate/FTDistributions1D.h"
-#include "Core/Aggregate/FTDistributions2D.h"
+#include "Core/Correlations/FTDecay1D.h"
+#include "Core/Correlations/FTDecay2D.h"
+#include "Core/Correlations/FTDistributions1D.h"
+#include "Core/Correlations/FTDistributions2D.h"
+#include "Core/Correlations/ILayout.h"
+#include "Core/Correlations/IPeakShape.h"
 #include "Core/Aggregate/IInterferenceFunction.h"
-#include "Core/Aggregate/ILayout.h"
-#include "Core/Aggregate/IPeakShape.h"
 #include "Core/Aggregate/InterferenceFunction1DLattice.h"
 #include "Core/Aggregate/InterferenceFunction2DLattice.h"
 #include "Core/Aggregate/InterferenceFunction2DParaCrystal.h"
@@ -6984,7 +6981,6 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include "Core/Intensity/IHistogram.h"
 #include "Core/Intensity/IIntensityFunction.h"
 #include "Core/Intensity/IIntensityFunction.h"
-#include "Core/Intensity/IIntensityNormalizer.h"
 #include "Core/Intensity/IntensityDataFunctions.h"
 #include "Core/Intensity/OutputData.h"
 #include "Core/Lattice/ILatticeOrientation.h"
@@ -7040,7 +7036,7 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include "Core/SoftParticle/FormFactorSphereGaussianRadius.h"
 #include "Core/SoftParticle/FormFactorSphereLogNormalRadius.h"
 #include "Core/StandardSamples/SampleBuilderFactory.h"
-#include "Core/StandardSamples/SimulationFactory.h"
+#include "Core/Simulation/SimulationFactory.h"
 #include "Core/Tools/MathFunctions.h"
 #include "Core/Vector/BasicVector3D.h"
 #include "Core/Vector/Vectors3D.h"
@@ -10051,14 +10047,14 @@ void SwigDirector_PyObserverCallback::update(FitObjective const &arg0) {
 }
 
 
-SwigDirector_IInterferenceFunction::SwigDirector_IInterferenceFunction(PyObject *self): IInterferenceFunction(), Swig::Director(self) {
+SwigDirector_IInterferenceFunction::SwigDirector_IInterferenceFunction(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues): IInterferenceFunction(meta, PValues), Swig::Director(self) {
   SWIG_DIRECTOR_RGTR((IInterferenceFunction *)this, this); 
 }
 
 
 
 
-SwigDirector_IInterferenceFunction::SwigDirector_IInterferenceFunction(PyObject *self, IInterferenceFunction const &other): IInterferenceFunction(other), Swig::Director(self) {
+SwigDirector_IInterferenceFunction::SwigDirector_IInterferenceFunction(PyObject *self, double position_var): IInterferenceFunction(position_var), Swig::Director(self) {
   SWIG_DIRECTOR_RGTR((IInterferenceFunction *)this, this); 
 }
 
@@ -57298,62 +57294,6 @@ fail:
 
 
 SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_86(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  INodeVisitor *arg1 = (INodeVisitor *) 0 ;
-  IntensityNormalizer *arg2 = (IntensityNormalizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_INodeVisitor, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "INodeVisitor_visit" "', argument " "1"" of type '" "INodeVisitor *""'"); 
-  }
-  arg1 = reinterpret_cast< INodeVisitor * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "INodeVisitor_visit" "', argument " "2"" of type '" "IntensityNormalizer const *""'"); 
-  }
-  arg2 = reinterpret_cast< IntensityNormalizer * >(argp2);
-  (arg1)->visit((IntensityNormalizer const *)arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_87(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  INodeVisitor *arg1 = (INodeVisitor *) 0 ;
-  IntensityScaleAndShiftNormalizer *arg2 = (IntensityScaleAndShiftNormalizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_INodeVisitor, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "INodeVisitor_visit" "', argument " "1"" of type '" "INodeVisitor *""'"); 
-  }
-  arg1 = reinterpret_cast< INodeVisitor * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "INodeVisitor_visit" "', argument " "2"" of type '" "IntensityScaleAndShiftNormalizer const *""'"); 
-  }
-  arg2 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp2);
-  (arg1)->visit((IntensityScaleAndShiftNormalizer const *)arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_88(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFunction1DLattice *arg2 = (InterferenceFunction1DLattice *) 0 ;
@@ -57381,7 +57321,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_89(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_87(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFunction2DLattice *arg2 = (InterferenceFunction2DLattice *) 0 ;
@@ -57409,7 +57349,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_90(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_88(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFunction2DParaCrystal *arg2 = (InterferenceFunction2DParaCrystal *) 0 ;
@@ -57437,7 +57377,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_91(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_89(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFunction2DSuperLattice *arg2 = (InterferenceFunction2DSuperLattice *) 0 ;
@@ -57465,7 +57405,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_92(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_90(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFunction3DLattice *arg2 = (InterferenceFunction3DLattice *) 0 ;
@@ -57493,7 +57433,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_93(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_91(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFunctionFinite2DLattice *arg2 = (InterferenceFunctionFinite2DLattice *) 0 ;
@@ -57521,7 +57461,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_94(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_92(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFunctionFinite3DLattice *arg2 = (InterferenceFunctionFinite3DLattice *) 0 ;
@@ -57549,7 +57489,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_95(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_93(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFunctionHardDisk *arg2 = (InterferenceFunctionHardDisk *) 0 ;
@@ -57577,7 +57517,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_96(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_94(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFunctionRadialParaCrystal *arg2 = (InterferenceFunctionRadialParaCrystal *) 0 ;
@@ -57605,7 +57545,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_97(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_95(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFunctionTwin *arg2 = (InterferenceFunctionTwin *) 0 ;
@@ -57633,7 +57573,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_98(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_96(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFunctionNone *arg2 = (InterferenceFunctionNone *) 0 ;
@@ -57661,7 +57601,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_99(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_97(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IParticle *arg2 = (IParticle *) 0 ;
@@ -57689,7 +57629,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_100(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_98(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IPeakShape *arg2 = (IPeakShape *) 0 ;
@@ -57717,7 +57657,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_101(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_99(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IRotation *arg2 = (IRotation *) 0 ;
@@ -57745,7 +57685,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_102(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_100(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   ISample *arg2 = (ISample *) 0 ;
@@ -57773,7 +57713,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_103(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_101(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IsGISAXSDetector *arg2 = (IsGISAXSDetector *) 0 ;
@@ -57801,7 +57741,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_104(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_102(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   Layer *arg2 = (Layer *) 0 ;
@@ -57829,7 +57769,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_105(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_103(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   LayerInterface *arg2 = (LayerInterface *) 0 ;
@@ -57857,7 +57797,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_106(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_104(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   LayerRoughness *arg2 = (LayerRoughness *) 0 ;
@@ -57885,7 +57825,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_107(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_105(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   MesoCrystal *arg2 = (MesoCrystal *) 0 ;
@@ -57913,7 +57853,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_108(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_106(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   MultiLayer *arg2 = (MultiLayer *) 0 ;
@@ -57941,7 +57881,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_109(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_107(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   OffSpecSimulation *arg2 = (OffSpecSimulation *) 0 ;
@@ -57969,7 +57909,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_110(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_108(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   Particle *arg2 = (Particle *) 0 ;
@@ -57997,7 +57937,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_111(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_109(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   ParticleComposition *arg2 = (ParticleComposition *) 0 ;
@@ -58025,7 +57965,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_112(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_110(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   ParticleCoreShell *arg2 = (ParticleCoreShell *) 0 ;
@@ -58053,7 +57993,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_113(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_111(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   ParticleDistribution *arg2 = (ParticleDistribution *) 0 ;
@@ -58081,7 +58021,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_114(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_112(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   ParticleLayout *arg2 = (ParticleLayout *) 0 ;
@@ -58109,7 +58049,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_115(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_113(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   PoissonNoiseBackground *arg2 = (PoissonNoiseBackground *) 0 ;
@@ -58137,7 +58077,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_116(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_114(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   RectangularDetector *arg2 = (RectangularDetector *) 0 ;
@@ -58165,7 +58105,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_117(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_115(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   ResolutionFunction2DGaussian *arg2 = (ResolutionFunction2DGaussian *) 0 ;
@@ -58193,7 +58133,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_118(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_116(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   RotationEuler *arg2 = (RotationEuler *) 0 ;
@@ -58221,7 +58161,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_119(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_117(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   RotationX *arg2 = (RotationX *) 0 ;
@@ -58249,7 +58189,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_120(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_118(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   RotationY *arg2 = (RotationY *) 0 ;
@@ -58277,7 +58217,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_121(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_119(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   RotationZ *arg2 = (RotationZ *) 0 ;
@@ -58305,7 +58245,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_122(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_120(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   SpecularDetector1D *arg2 = (SpecularDetector1D *) 0 ;
@@ -58333,7 +58273,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_123(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_121(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   SpecularSimulation *arg2 = (SpecularSimulation *) 0 ;
@@ -58361,7 +58301,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_124(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_122(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   SphericalDetector *arg2 = (SphericalDetector *) 0 ;
@@ -58389,7 +58329,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_125(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_123(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   SquareLattice *arg2 = (SquareLattice *) 0 ;
@@ -59499,7 +59439,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_MesoCrystal, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_107(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_105(self, argc, argv);
       }
     }
   }
@@ -59583,7 +59523,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunction1DLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_88(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_86(self, argc, argv);
       }
     }
   }
@@ -59597,7 +59537,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleLayout, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_114(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_112(self, argc, argv);
       }
     }
   }
@@ -59615,34 +59555,6 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       }
     }
   }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_INodeVisitor, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_87(self, argc, argv);
-      }
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_INodeVisitor, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IntensityNormalizer, 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_86(self, argc, argv);
-      }
-    }
-  }
   if (argc == 2) {
     int _v;
     void *vptr = 0;
@@ -59653,7 +59565,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunction2DLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_89(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_87(self, argc, argv);
       }
     }
   }
@@ -59667,7 +59579,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_90(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_88(self, argc, argv);
       }
     }
   }
@@ -59681,7 +59593,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunction2DSuperLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_91(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_89(self, argc, argv);
       }
     }
   }
@@ -59695,7 +59607,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunction3DLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_92(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_90(self, argc, argv);
       }
     }
   }
@@ -59709,7 +59621,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunctionFinite2DLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_93(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_91(self, argc, argv);
       }
     }
   }
@@ -59723,7 +59635,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunctionFinite3DLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_94(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_92(self, argc, argv);
       }
     }
   }
@@ -59737,7 +59649,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunctionHardDisk, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_95(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_93(self, argc, argv);
       }
     }
   }
@@ -59751,7 +59663,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_96(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_94(self, argc, argv);
       }
     }
   }
@@ -59765,7 +59677,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunctionTwin, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_97(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_95(self, argc, argv);
       }
     }
   }
@@ -59779,7 +59691,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunctionNone, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_98(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_96(self, argc, argv);
       }
     }
   }
@@ -59807,7 +59719,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Particle, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_110(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_108(self, argc, argv);
       }
     }
   }
@@ -59821,7 +59733,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IPeakShape, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_100(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_98(self, argc, argv);
       }
     }
   }
@@ -59835,7 +59747,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RotationEuler, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_118(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_116(self, argc, argv);
       }
     }
   }
@@ -59849,7 +59761,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Layer, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_104(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_102(self, argc, argv);
       }
     }
   }
@@ -59863,7 +59775,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IsGISAXSDetector, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_103(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_101(self, argc, argv);
       }
     }
   }
@@ -59877,7 +59789,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_LayerRoughness, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_106(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_104(self, argc, argv);
       }
     }
   }
@@ -59891,7 +59803,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleComposition, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_111(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_109(self, argc, argv);
       }
     }
   }
@@ -59905,7 +59817,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_LayerInterface, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_105(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_103(self, argc, argv);
       }
     }
   }
@@ -59919,7 +59831,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_MultiLayer, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_108(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_106(self, argc, argv);
       }
     }
   }
@@ -59933,7 +59845,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleCoreShell, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_112(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_110(self, argc, argv);
       }
     }
   }
@@ -59947,7 +59859,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OffSpecSimulation, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_109(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_107(self, argc, argv);
       }
     }
   }
@@ -59961,7 +59873,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IParticle, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_99(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_97(self, argc, argv);
       }
     }
   }
@@ -59975,7 +59887,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleDistribution, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_113(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_111(self, argc, argv);
       }
     }
   }
@@ -60017,7 +59929,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ISample, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_102(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_100(self, argc, argv);
       }
     }
   }
@@ -60031,7 +59943,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_PoissonNoiseBackground, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_115(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_113(self, argc, argv);
       }
     }
   }
@@ -60045,7 +59957,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RectangularDetector, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_116(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_114(self, argc, argv);
       }
     }
   }
@@ -60059,7 +59971,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ResolutionFunction2DGaussian, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_117(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_115(self, argc, argv);
       }
     }
   }
@@ -60073,7 +59985,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RotationX, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_119(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_117(self, argc, argv);
       }
     }
   }
@@ -60087,7 +59999,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RotationY, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_120(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_118(self, argc, argv);
       }
     }
   }
@@ -60101,7 +60013,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RotationZ, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_121(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_119(self, argc, argv);
       }
     }
   }
@@ -60115,7 +60027,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IRotation, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_101(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_99(self, argc, argv);
       }
     }
   }
@@ -60129,7 +60041,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_SpecularSimulation, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_123(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_121(self, argc, argv);
       }
     }
   }
@@ -60143,7 +60055,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_SpecularDetector1D, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_122(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_120(self, argc, argv);
       }
     }
   }
@@ -60157,7 +60069,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_SphericalDetector, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_124(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_122(self, argc, argv);
       }
     }
   }
@@ -60171,7 +60083,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_SquareLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_125(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_123(self, argc, argv);
       }
     }
   }
@@ -60279,8 +60191,6 @@ fail:
     "    INodeVisitor::visit(ILayout const *)\n"
     "    INodeVisitor::visit(INode const *)\n"
     "    INodeVisitor::visit(Instrument const *)\n"
-    "    INodeVisitor::visit(IntensityNormalizer const *)\n"
-    "    INodeVisitor::visit(IntensityScaleAndShiftNormalizer const *)\n"
     "    INodeVisitor::visit(InterferenceFunction1DLattice const *)\n"
     "    INodeVisitor::visit(InterferenceFunction2DLattice const *)\n"
     "    INodeVisitor::visit(InterferenceFunction2DParaCrystal const *)\n"
@@ -61270,28 +61180,6 @@ SWIGINTERN PyObject *RealParameter_swiginit(PyObject *SWIGUNUSEDPARM(self), PyOb
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_delete_IDistribution1D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IDistribution1D, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IDistribution1D" "', argument " "1"" of type '" "IDistribution1D *""'"); 
-  }
-  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_IDistribution1D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IDistribution1D *arg1 = (IDistribution1D *) 0 ;
@@ -61862,6 +61750,28 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_delete_IDistribution1D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IDistribution1D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IDistribution1D" "', argument " "1"" of type '" "IDistribution1D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *IDistribution1D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -61948,28 +61858,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_DistributionGate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  DistributionGate *arg1 = (DistributionGate *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_DistributionGate, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionGate" "', argument " "1"" of type '" "DistributionGate *""'"); 
-  }
-  arg1 = reinterpret_cast< DistributionGate * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_DistributionGate_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   DistributionGate *arg1 = (DistributionGate *) 0 ;
@@ -62293,6 +62181,28 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_delete_DistributionGate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGate *arg1 = (DistributionGate *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_DistributionGate, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionGate" "', argument " "1"" of type '" "DistributionGate *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGate * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *DistributionGate_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -62383,28 +62293,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_DistributionLorentz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  DistributionLorentz *arg1 = (DistributionLorentz *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_DistributionLorentz, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionLorentz" "', argument " "1"" of type '" "DistributionLorentz *""'"); 
-  }
-  arg1 = reinterpret_cast< DistributionLorentz * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_DistributionLorentz_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   DistributionLorentz *arg1 = (DistributionLorentz *) 0 ;
@@ -62705,6 +62593,28 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_delete_DistributionLorentz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLorentz *arg1 = (DistributionLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_DistributionLorentz, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionLorentz" "', argument " "1"" of type '" "DistributionLorentz *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLorentz * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *DistributionLorentz_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -62795,28 +62705,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_DistributionGaussian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  DistributionGaussian *arg1 = (DistributionGaussian *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_DistributionGaussian, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionGaussian" "', argument " "1"" of type '" "DistributionGaussian *""'"); 
-  }
-  arg1 = reinterpret_cast< DistributionGaussian * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_DistributionGaussian_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   DistributionGaussian *arg1 = (DistributionGaussian *) 0 ;
@@ -63117,6 +63005,28 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_delete_DistributionGaussian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGaussian *arg1 = (DistributionGaussian *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_DistributionGaussian, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionGaussian" "', argument " "1"" of type '" "DistributionGaussian *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGaussian * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *DistributionGaussian_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -63128,28 +63038,7 @@ SWIGINTERN PyObject *DistributionGaussian_swiginit(PyObject *SWIGUNUSEDPARM(self
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_DistributionLogNormal__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  DistributionLogNormal *result = 0 ;
-  
-  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_DistributionLogNormal" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  result = (DistributionLogNormal *)new DistributionLogNormal(arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionLogNormal, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_DistributionLogNormal__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_DistributionLogNormal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -63157,9 +63046,10 @@ SWIGINTERN PyObject *_wrap_new_DistributionLogNormal__SWIG_1(PyObject *SWIGUNUSE
   int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
   DistributionLogNormal *result = 0 ;
   
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "new_DistributionLogNormal", 2, 2, swig_obj)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DistributionLogNormal" "', argument " "1"" of type '" "double""'");
@@ -63178,72 +63068,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_DistributionLogNormal(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_DistributionLogNormal", 0, 2, 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_DistributionLogNormal__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_DistributionLogNormal__SWIG_1(self, argc, argv);
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DistributionLogNormal'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    DistributionLogNormal::DistributionLogNormal(double)\n"
-    "    DistributionLogNormal::DistributionLogNormal(double,double)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_DistributionLogNormal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  DistributionLogNormal *arg1 = (DistributionLogNormal *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_DistributionLogNormal, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionLogNormal" "', argument " "1"" of type '" "DistributionLogNormal *""'"); 
-  }
-  arg1 = reinterpret_cast< DistributionLogNormal * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_DistributionLogNormal_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   DistributionLogNormal *arg1 = (DistributionLogNormal *) 0 ;
@@ -63603,6 +63427,28 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_delete_DistributionLogNormal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLogNormal *arg1 = (DistributionLogNormal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_DistributionLogNormal, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionLogNormal" "', argument " "1"" of type '" "DistributionLogNormal *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLogNormal * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *DistributionLogNormal_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -63693,28 +63539,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_DistributionCosine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  DistributionCosine *arg1 = (DistributionCosine *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_DistributionCosine, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionCosine" "', argument " "1"" of type '" "DistributionCosine *""'"); 
-  }
-  arg1 = reinterpret_cast< DistributionCosine * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_DistributionCosine_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   DistributionCosine *arg1 = (DistributionCosine *) 0 ;
@@ -64015,6 +63839,28 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_delete_DistributionCosine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionCosine *arg1 = (DistributionCosine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_DistributionCosine, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionCosine" "', argument " "1"" of type '" "DistributionCosine *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionCosine * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *DistributionCosine_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -64026,20 +63872,7 @@ SWIGINTERN PyObject *DistributionCosine_swiginit(PyObject *SWIGUNUSEDPARM(self),
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
-  PyObject *resultobj = 0;
-  DistributionTrapezoid *result = 0 ;
-  
-  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
-  result = (DistributionTrapezoid *)new DistributionTrapezoid();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionTrapezoid, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -64084,6 +63917,19 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  DistributionTrapezoid *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (DistributionTrapezoid *)new DistributionTrapezoid();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionTrapezoid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[5] = {
@@ -64093,7 +63939,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid(PyObject *self, PyObject *a
   if (!(argc = SWIG_Python_UnpackTuple(args, "new_DistributionTrapezoid", 0, 4, argv))) SWIG_fail;
   --argc;
   if (argc == 0) {
-    return _wrap_new_DistributionTrapezoid__SWIG_0(self, argc, argv);
+    return _wrap_new_DistributionTrapezoid__SWIG_1(self, argc, argv);
   }
   if (argc == 4) {
     int _v;
@@ -64117,7 +63963,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid(PyObject *self, PyObject *a
             _v = SWIG_CheckState(res);
           }
           if (_v) {
-            return _wrap_new_DistributionTrapezoid__SWIG_1(self, argc, argv);
+            return _wrap_new_DistributionTrapezoid__SWIG_0(self, argc, argv);
           }
         }
       }
@@ -64127,34 +63973,12 @@ SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid(PyObject *self, PyObject *a
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DistributionTrapezoid'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    DistributionTrapezoid::DistributionTrapezoid()\n"
-    "    DistributionTrapezoid::DistributionTrapezoid(double,double,double,double)\n");
+    "    DistributionTrapezoid::DistributionTrapezoid(double,double,double,double)\n"
+    "    DistributionTrapezoid::DistributionTrapezoid()\n");
   return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_DistributionTrapezoid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  DistributionTrapezoid *arg1 = (DistributionTrapezoid *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_DistributionTrapezoid, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionTrapezoid" "', argument " "1"" of type '" "DistributionTrapezoid *""'"); 
-  }
-  arg1 = reinterpret_cast< DistributionTrapezoid * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_DistributionTrapezoid_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   DistributionTrapezoid *arg1 = (DistributionTrapezoid *) 0 ;
@@ -64501,6 +64325,28 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_delete_DistributionTrapezoid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionTrapezoid *arg1 = (DistributionTrapezoid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_DistributionTrapezoid, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionTrapezoid" "', argument " "1"" of type '" "DistributionTrapezoid *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionTrapezoid * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *DistributionTrapezoid_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -78339,28 +78185,6 @@ SWIGINTERN PyObject *FTDistribution1DVoigt_swiginit(PyObject *SWIGUNUSEDPARM(sel
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_delete_IFTDistribution2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IFTDistribution2D *arg1 = (IFTDistribution2D *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFTDistribution2D, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFTDistribution2D" "', argument " "1"" of type '" "IFTDistribution2D *""'"); 
-  }
-  arg1 = reinterpret_cast< IFTDistribution2D * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_IFTDistribution2D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IFTDistribution2D *arg1 = (IFTDistribution2D *) 0 ;
@@ -78543,6 +78367,28 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_delete_IFTDistribution2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution2D *arg1 = (IFTDistribution2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFTDistribution2D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFTDistribution2D" "', argument " "1"" of type '" "IFTDistribution2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution2D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *IFTDistribution2D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -79386,572 +79232,6 @@ SWIGINTERN PyObject *FTDistribution2DVoigt_swiginit(PyObject *SWIGUNUSEDPARM(sel
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_IInterferenceFunction__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  IInterferenceFunction *result = 0 ;
-  
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  arg1 = swig_obj[0];
-  if ( arg1 != Py_None ) {
-    /* subclassed */
-    result = (IInterferenceFunction *)new SwigDirector_IInterferenceFunction(arg1); 
-  } else {
-    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
-    SWIG_fail;
-  }
-  
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IInterferenceFunction__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  IInterferenceFunction *arg2 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  IInterferenceFunction *result = 0 ;
-  
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  arg1 = swig_obj[0];
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IInterferenceFunction,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_IInterferenceFunction" "', argument " "2"" of type '" "IInterferenceFunction const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IInterferenceFunction" "', argument " "2"" of type '" "IInterferenceFunction const &""'"); 
-  }
-  arg2 = reinterpret_cast< IInterferenceFunction * >(argp2);
-  if ( arg1 != Py_None ) {
-    /* subclassed */
-    result = (IInterferenceFunction *)new SwigDirector_IInterferenceFunction(arg1,(IInterferenceFunction const &)*arg2); 
-  } else {
-    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
-    SWIG_fail;
-  }
-  
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IInterferenceFunction(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_IInterferenceFunction", 0, 2, argv))) SWIG_fail;
-  --argc;
-  if (argc == 1) {
-    int _v;
-    _v = (argv[0] != 0);
-    if (_v) {
-      return _wrap_new_IInterferenceFunction__SWIG_0(self, argc, argv);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    _v = (argv[0] != 0);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IInterferenceFunction, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_new_IInterferenceFunction__SWIG_1(self, argc, argv);
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_IInterferenceFunction'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IInterferenceFunction::IInterferenceFunction()\n"
-    "    IInterferenceFunction::IInterferenceFunction(PyObject *,IInterferenceFunction const &)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_IInterferenceFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IInterferenceFunction" "', argument " "1"" of type '" "IInterferenceFunction *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IInterferenceFunction_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  IInterferenceFunction *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_clone" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    if (upcall) {
-      Swig::DirectorPureVirtualException::raise("IInterferenceFunction::clone");
-    } else {
-      result = (IInterferenceFunction *)((IInterferenceFunction const *)arg1)->clone();
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  director = SWIG_DIRECTOR_CAST(result);
-  if (director) {
-    resultobj = director->swig_get_self();
-    Py_INCREF(resultobj);
-  } else {
-    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  }
-  if (director) {
-    SWIG_AcquirePtr(resultobj, director->swig_release_ownership(SWIG_as_voidptr(result)));
-  }
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  kvector_t arg2 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  double result;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_evaluate" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IInterferenceFunction_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IInterferenceFunction_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
-    } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IInterferenceFunction_evaluate" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    if (upcall) {
-      result = (double)((IInterferenceFunction const *)arg1)->IInterferenceFunction::evaluate(arg2,arg3);
-    } else {
-      result = (double)((IInterferenceFunction const *)arg1)->evaluate(arg2,arg3);
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  kvector_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  double result;
-  
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_evaluate" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IInterferenceFunction_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IInterferenceFunction_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
-    } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    if (upcall) {
-      result = (double)((IInterferenceFunction const *)arg1)->IInterferenceFunction::evaluate(arg2);
-    } else {
-      result = (double)((IInterferenceFunction const *)arg1)->evaluate(arg2);
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "IInterferenceFunction_evaluate", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IInterferenceFunction, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_IInterferenceFunction_evaluate__SWIG_1(self, argc, argv);
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IInterferenceFunction, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_IInterferenceFunction_evaluate__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IInterferenceFunction_evaluate'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IInterferenceFunction::evaluate(kvector_t const,double) const\n"
-    "    IInterferenceFunction::evaluate(kvector_t const) const\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_IInterferenceFunction_setPositionVariance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IInterferenceFunction_setPositionVariance", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_setPositionVariance" "', argument " "1"" of type '" "IInterferenceFunction *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IInterferenceFunction_setPositionVariance" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setPositionVariance(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IInterferenceFunction_positionVariance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_positionVariance" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  result = (double)((IInterferenceFunction const *)arg1)->positionVariance();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IInterferenceFunction_getParticleDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_getParticleDensity" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    if (upcall) {
-      result = (double)((IInterferenceFunction const *)arg1)->IInterferenceFunction::getParticleDensity();
-    } else {
-      result = (double)((IInterferenceFunction const *)arg1)->getParticleDensity();
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IInterferenceFunction_supportsMultilayer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  bool result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_supportsMultilayer" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    if (upcall) {
-      result = (bool)((IInterferenceFunction const *)arg1)->IInterferenceFunction::supportsMultilayer();
-    } else {
-      result = (bool)((IInterferenceFunction const *)arg1)->supportsMultilayer();
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IInterferenceFunction_DWfactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  kvector_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IInterferenceFunction_DWfactor", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_DWfactor" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IInterferenceFunction_DWfactor" "', argument " "2"" of type '" "kvector_t""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IInterferenceFunction_DWfactor" "', argument " "2"" of type '" "kvector_t""'");
-    } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  result = (double)((IInterferenceFunction const *)arg1)->DWfactor(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IInterferenceFunction_iff_without_dw(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  kvector_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  SwigDirector_IInterferenceFunction *darg = 0;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IInterferenceFunction_iff_without_dw", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_iff_without_dw" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IInterferenceFunction_iff_without_dw" "', argument " "2"" of type '" "kvector_t const""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IInterferenceFunction_iff_without_dw" "', argument " "2"" of type '" "kvector_t const""'");
-    } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  director = SWIG_DIRECTOR_CAST(arg1);
-  if (!director || !(director->swig_get_inner("iff_without_dw"))) {
-    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member iff_without_dw");
-    SWIG_fail;
-  }
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    darg = dynamic_cast<SwigDirector_IInterferenceFunction *>(arg1);
-    if (upcall) {
-      Swig::DirectorPureVirtualException::raise("IInterferenceFunction::iff_without_dw");
-    } else {
-      result = (double)((SwigDirector_IInterferenceFunction const *)darg)->iff_without_dw(arg2);
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_disown_IInterferenceFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_IInterferenceFunction" "', argument " "1"" of type '" "IInterferenceFunction *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  {
-    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
-    if (director) director->swig_disown();
-  }
-  
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *IInterferenceFunction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IInterferenceFunction, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *IInterferenceFunction_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
 SWIGINTERN PyObject *_wrap_delete_ILayout(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   ILayout *arg1 = (ILayout *) 0 ;
@@ -80055,7 +79335,6 @@ SWIGINTERN PyObject *_wrap_ILayout_interferenceFunction(PyObject *SWIGUNUSEDPARM
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Swig::Director *director = 0;
   IInterferenceFunction *result = 0 ;
   
   if (!args) SWIG_fail;
@@ -80066,13 +79345,7 @@ SWIGINTERN PyObject *_wrap_ILayout_interferenceFunction(PyObject *SWIGUNUSEDPARM
   }
   arg1 = reinterpret_cast< ILayout * >(argp1);
   result = (IInterferenceFunction *)((ILayout const *)arg1)->interferenceFunction();
-  director = SWIG_DIRECTOR_CAST(result);
-  if (director) {
-    resultobj = director->swig_get_self();
-    Py_INCREF(resultobj);
-  } else {
-    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -81080,7 +80353,7 @@ SWIGINTERN PyObject *LorentzFisherPeakShape_swiginit(PyObject *SWIGUNUSEDPARM(se
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_VonMisesFisherGaussPeakShape(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_MisesFisherGaussPeakShape(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -81098,26 +80371,26 @@ SWIGINTERN PyObject *_wrap_new_VonMisesFisherGaussPeakShape(PyObject *SWIGUNUSED
   double val5 ;
   int ecode5 = 0 ;
   PyObject *swig_obj[5] ;
-  VonMisesFisherGaussPeakShape *result = 0 ;
+  MisesFisherGaussPeakShape *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_VonMisesFisherGaussPeakShape", 5, 5, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "new_MisesFisherGaussPeakShape", 5, 5, swig_obj)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_VonMisesFisherGaussPeakShape" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_MisesFisherGaussPeakShape" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_VonMisesFisherGaussPeakShape" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_MisesFisherGaussPeakShape" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   {
     res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
     if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_VonMisesFisherGaussPeakShape" "', argument " "3"" of type '" "kvector_t""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_MisesFisherGaussPeakShape" "', argument " "3"" of type '" "kvector_t""'"); 
     }  
     if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VonMisesFisherGaussPeakShape" "', argument " "3"" of type '" "kvector_t""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_MisesFisherGaussPeakShape" "', argument " "3"" of type '" "kvector_t""'");
     } else {
       kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
       arg3 = *temp;
@@ -81126,36 +80399,252 @@ SWIGINTERN PyObject *_wrap_new_VonMisesFisherGaussPeakShape(PyObject *SWIGUNUSED
   }
   ecode4 = SWIG_AsVal_double(swig_obj[3], &val4);
   if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_VonMisesFisherGaussPeakShape" "', argument " "4"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_MisesFisherGaussPeakShape" "', argument " "4"" of type '" "double""'");
   } 
   arg4 = static_cast< double >(val4);
   ecode5 = SWIG_AsVal_double(swig_obj[4], &val5);
   if (!SWIG_IsOK(ecode5)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_VonMisesFisherGaussPeakShape" "', argument " "5"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_MisesFisherGaussPeakShape" "', argument " "5"" of type '" "double""'");
   } 
   arg5 = static_cast< double >(val5);
-  result = (VonMisesFisherGaussPeakShape *)new VonMisesFisherGaussPeakShape(arg1,arg2,arg3,arg4,arg5);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_VonMisesFisherGaussPeakShape, SWIG_POINTER_NEW |  0 );
+  result = (MisesFisherGaussPeakShape *)new MisesFisherGaussPeakShape(arg1,arg2,arg3,arg4,arg5);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MisesFisherGaussPeakShape, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_MisesFisherGaussPeakShape(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MisesFisherGaussPeakShape *arg1 = (MisesFisherGaussPeakShape *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MisesFisherGaussPeakShape, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MisesFisherGaussPeakShape" "', argument " "1"" of type '" "MisesFisherGaussPeakShape *""'"); 
+  }
+  arg1 = reinterpret_cast< MisesFisherGaussPeakShape * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MisesFisherGaussPeakShape_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MisesFisherGaussPeakShape *arg1 = (MisesFisherGaussPeakShape *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  MisesFisherGaussPeakShape *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MisesFisherGaussPeakShape, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MisesFisherGaussPeakShape_clone" "', argument " "1"" of type '" "MisesFisherGaussPeakShape const *""'"); 
+  }
+  arg1 = reinterpret_cast< MisesFisherGaussPeakShape * >(argp1);
+  result = (MisesFisherGaussPeakShape *)((MisesFisherGaussPeakShape const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MisesFisherGaussPeakShape, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MisesFisherGaussPeakShape_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MisesFisherGaussPeakShape *arg1 = (MisesFisherGaussPeakShape *) 0 ;
+  INodeVisitor *arg2 = (INodeVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "MisesFisherGaussPeakShape_accept", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MisesFisherGaussPeakShape, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MisesFisherGaussPeakShape_accept" "', argument " "1"" of type '" "MisesFisherGaussPeakShape const *""'"); 
+  }
+  arg1 = reinterpret_cast< MisesFisherGaussPeakShape * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MisesFisherGaussPeakShape_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< INodeVisitor * >(argp2);
+  ((MisesFisherGaussPeakShape const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MisesFisherGaussPeakShape_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MisesFisherGaussPeakShape *arg1 = (MisesFisherGaussPeakShape *) 0 ;
+  kvector_t arg2 ;
+  kvector_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  double result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "MisesFisherGaussPeakShape_evaluate", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MisesFisherGaussPeakShape, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MisesFisherGaussPeakShape_evaluate" "', argument " "1"" of type '" "MisesFisherGaussPeakShape const *""'"); 
+  }
+  arg1 = reinterpret_cast< MisesFisherGaussPeakShape * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MisesFisherGaussPeakShape_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MisesFisherGaussPeakShape_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MisesFisherGaussPeakShape_evaluate" "', argument " "3"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MisesFisherGaussPeakShape_evaluate" "', argument " "3"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (double)((MisesFisherGaussPeakShape const *)arg1)->evaluate(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MisesFisherGaussPeakShape_angularDisorder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MisesFisherGaussPeakShape *arg1 = (MisesFisherGaussPeakShape *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MisesFisherGaussPeakShape, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MisesFisherGaussPeakShape_angularDisorder" "', argument " "1"" of type '" "MisesFisherGaussPeakShape const *""'"); 
+  }
+  arg1 = reinterpret_cast< MisesFisherGaussPeakShape * >(argp1);
+  result = (bool)((MisesFisherGaussPeakShape const *)arg1)->angularDisorder();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *MisesFisherGaussPeakShape_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_MisesFisherGaussPeakShape, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *MisesFisherGaussPeakShape_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_MisesGaussPeakShape(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  kvector_t arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject *swig_obj[4] ;
+  MisesGaussPeakShape *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_MisesGaussPeakShape", 4, 4, swig_obj)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_MisesGaussPeakShape" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_MisesGaussPeakShape" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  {
+    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_MisesGaussPeakShape" "', argument " "3"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_MisesGaussPeakShape" "', argument " "3"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  ecode4 = SWIG_AsVal_double(swig_obj[3], &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_MisesGaussPeakShape" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (MisesGaussPeakShape *)new MisesGaussPeakShape(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MisesGaussPeakShape, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_VonMisesFisherGaussPeakShape(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_MisesGaussPeakShape(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  VonMisesFisherGaussPeakShape *arg1 = (VonMisesFisherGaussPeakShape *) 0 ;
+  MisesGaussPeakShape *arg1 = (MisesGaussPeakShape *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_VonMisesFisherGaussPeakShape, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MisesGaussPeakShape, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_VonMisesFisherGaussPeakShape" "', argument " "1"" of type '" "VonMisesFisherGaussPeakShape *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MisesGaussPeakShape" "', argument " "1"" of type '" "MisesGaussPeakShape *""'"); 
   }
-  arg1 = reinterpret_cast< VonMisesFisherGaussPeakShape * >(argp1);
+  arg1 = reinterpret_cast< MisesGaussPeakShape * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -81164,32 +80653,32 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_VonMisesFisherGaussPeakShape_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MisesGaussPeakShape_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  VonMisesFisherGaussPeakShape *arg1 = (VonMisesFisherGaussPeakShape *) 0 ;
+  MisesGaussPeakShape *arg1 = (MisesGaussPeakShape *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  VonMisesFisherGaussPeakShape *result = 0 ;
+  MisesGaussPeakShape *result = 0 ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_VonMisesFisherGaussPeakShape, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MisesGaussPeakShape, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VonMisesFisherGaussPeakShape_clone" "', argument " "1"" of type '" "VonMisesFisherGaussPeakShape const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MisesGaussPeakShape_clone" "', argument " "1"" of type '" "MisesGaussPeakShape const *""'"); 
   }
-  arg1 = reinterpret_cast< VonMisesFisherGaussPeakShape * >(argp1);
-  result = (VonMisesFisherGaussPeakShape *)((VonMisesFisherGaussPeakShape const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_VonMisesFisherGaussPeakShape, 0 |  0 );
+  arg1 = reinterpret_cast< MisesGaussPeakShape * >(argp1);
+  result = (MisesGaussPeakShape *)((MisesGaussPeakShape const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MisesGaussPeakShape, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_VonMisesFisherGaussPeakShape_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MisesGaussPeakShape_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  VonMisesFisherGaussPeakShape *arg1 = (VonMisesFisherGaussPeakShape *) 0 ;
+  MisesGaussPeakShape *arg1 = (MisesGaussPeakShape *) 0 ;
   INodeVisitor *arg2 = (INodeVisitor *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -81197,18 +80686,18 @@ SWIGINTERN PyObject *_wrap_VonMisesFisherGaussPeakShape_accept(PyObject *SWIGUNU
   int res2 = 0 ;
   PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "VonMisesFisherGaussPeakShape_accept", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_VonMisesFisherGaussPeakShape, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MisesGaussPeakShape_accept", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MisesGaussPeakShape, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VonMisesFisherGaussPeakShape_accept" "', argument " "1"" of type '" "VonMisesFisherGaussPeakShape const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MisesGaussPeakShape_accept" "', argument " "1"" of type '" "MisesGaussPeakShape const *""'"); 
   }
-  arg1 = reinterpret_cast< VonMisesFisherGaussPeakShape * >(argp1);
+  arg1 = reinterpret_cast< MisesGaussPeakShape * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VonMisesFisherGaussPeakShape_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MisesGaussPeakShape_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
   }
   arg2 = reinterpret_cast< INodeVisitor * >(argp2);
-  ((VonMisesFisherGaussPeakShape const *)arg1)->accept(arg2);
+  ((MisesGaussPeakShape const *)arg1)->accept(arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -81216,9 +80705,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_VonMisesFisherGaussPeakShape_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MisesGaussPeakShape_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  VonMisesFisherGaussPeakShape *arg1 = (VonMisesFisherGaussPeakShape *) 0 ;
+  MisesGaussPeakShape *arg1 = (MisesGaussPeakShape *) 0 ;
   kvector_t arg2 ;
   kvector_t arg3 ;
   void *argp1 = 0 ;
@@ -81230,19 +80719,19 @@ SWIGINTERN PyObject *_wrap_VonMisesFisherGaussPeakShape_evaluate(PyObject *SWIGU
   PyObject *swig_obj[3] ;
   double result;
   
-  if (!SWIG_Python_UnpackTuple(args, "VonMisesFisherGaussPeakShape_evaluate", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_VonMisesFisherGaussPeakShape, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "MisesGaussPeakShape_evaluate", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MisesGaussPeakShape, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VonMisesFisherGaussPeakShape_evaluate" "', argument " "1"" of type '" "VonMisesFisherGaussPeakShape const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MisesGaussPeakShape_evaluate" "', argument " "1"" of type '" "MisesGaussPeakShape const *""'"); 
   }
-  arg1 = reinterpret_cast< VonMisesFisherGaussPeakShape * >(argp1);
+  arg1 = reinterpret_cast< MisesGaussPeakShape * >(argp1);
   {
     res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VonMisesFisherGaussPeakShape_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MisesGaussPeakShape_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
     }  
     if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VonMisesFisherGaussPeakShape_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MisesGaussPeakShape_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
     } else {
       kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
       arg2 = *temp;
@@ -81252,17 +80741,17 @@ SWIGINTERN PyObject *_wrap_VonMisesFisherGaussPeakShape_evaluate(PyObject *SWIGU
   {
     res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
     if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VonMisesFisherGaussPeakShape_evaluate" "', argument " "3"" of type '" "kvector_t const""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MisesGaussPeakShape_evaluate" "', argument " "3"" of type '" "kvector_t const""'"); 
     }  
     if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VonMisesFisherGaussPeakShape_evaluate" "', argument " "3"" of type '" "kvector_t const""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MisesGaussPeakShape_evaluate" "', argument " "3"" of type '" "kvector_t const""'");
     } else {
       kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
       arg3 = *temp;
       if (SWIG_IsNewObj(res3)) delete temp;
     }
   }
-  result = (double)((VonMisesFisherGaussPeakShape const *)arg1)->evaluate(arg2,arg3);
+  result = (double)((MisesGaussPeakShape const *)arg1)->evaluate(arg2,arg3);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -81270,9 +80759,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_VonMisesFisherGaussPeakShape_angularDisorder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_MisesGaussPeakShape_angularDisorder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  VonMisesFisherGaussPeakShape *arg1 = (VonMisesFisherGaussPeakShape *) 0 ;
+  MisesGaussPeakShape *arg1 = (MisesGaussPeakShape *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -81280,12 +80769,12 @@ SWIGINTERN PyObject *_wrap_VonMisesFisherGaussPeakShape_angularDisorder(PyObject
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_VonMisesFisherGaussPeakShape, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MisesGaussPeakShape, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VonMisesFisherGaussPeakShape_angularDisorder" "', argument " "1"" of type '" "VonMisesFisherGaussPeakShape const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MisesGaussPeakShape_angularDisorder" "', argument " "1"" of type '" "MisesGaussPeakShape const *""'"); 
   }
-  arg1 = reinterpret_cast< VonMisesFisherGaussPeakShape * >(argp1);
-  result = (bool)((VonMisesFisherGaussPeakShape const *)arg1)->angularDisorder();
+  arg1 = reinterpret_cast< MisesGaussPeakShape * >(argp1);
+  result = (bool)((MisesGaussPeakShape const *)arg1)->angularDisorder();
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
@@ -81293,192 +80782,572 @@ fail:
 }
 
 
-SWIGINTERN PyObject *VonMisesFisherGaussPeakShape_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *MisesGaussPeakShape_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_VonMisesFisherGaussPeakShape, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_MisesGaussPeakShape, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *VonMisesFisherGaussPeakShape_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *MisesGaussPeakShape_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_VonMisesGaussPeakShape(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_IInterferenceFunction__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  double arg1 ;
+  PyObject *arg1 = (PyObject *) 0 ;
+  NodeMeta *arg2 = 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  IInterferenceFunction *result = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  arg1 = swig_obj[0];
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_NodeMeta,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_IInterferenceFunction" "', argument " "2"" of type '" "NodeMeta const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IInterferenceFunction" "', argument " "2"" of type '" "NodeMeta const &""'"); 
+  }
+  arg2 = reinterpret_cast< NodeMeta * >(argp2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_IInterferenceFunction" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IInterferenceFunction" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (IInterferenceFunction *)new SwigDirector_IInterferenceFunction(arg1,(NodeMeta const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3); 
+  } else {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
+    SWIG_fail;
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IInterferenceFunction__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  PyObject *arg1 = (PyObject *) 0 ;
   double arg2 ;
-  kvector_t arg3 ;
-  double arg4 ;
-  double val1 ;
-  int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
-  double val4 ;
-  int ecode4 = 0 ;
-  PyObject *swig_obj[4] ;
-  VonMisesGaussPeakShape *result = 0 ;
+  IInterferenceFunction *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_VonMisesGaussPeakShape", 4, 4, swig_obj)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_VonMisesGaussPeakShape" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  arg1 = swig_obj[0];
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_VonMisesGaussPeakShape" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IInterferenceFunction" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (IInterferenceFunction *)new SwigDirector_IInterferenceFunction(arg1,arg2); 
+  } else {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
+    SWIG_fail;
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IInterferenceFunction(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_IInterferenceFunction", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    _v = (argv[0] != 0);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_IInterferenceFunction__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    _v = (argv[0] != 0);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_NodeMeta, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new_IInterferenceFunction__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_IInterferenceFunction'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IInterferenceFunction::IInterferenceFunction(NodeMeta const &,std::vector< double,std::allocator< double > > const &)\n"
+    "    IInterferenceFunction::IInterferenceFunction(PyObject *,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IInterferenceFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IInterferenceFunction" "', argument " "1"" of type '" "IInterferenceFunction *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  IInterferenceFunction *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_clone" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==swig_obj[0]));
+  try {
+    if (upcall) {
+      Swig::DirectorPureVirtualException::raise("IInterferenceFunction::clone");
+    } else {
+      result = (IInterferenceFunction *)((IInterferenceFunction const *)arg1)->clone();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  }
+  if (director) {
+    SWIG_AcquirePtr(resultobj, director->swig_release_ownership(SWIG_as_voidptr(result)));
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
+  kvector_t arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  double result;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_evaluate" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
   {
-    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_VonMisesGaussPeakShape" "', argument " "3"" of type '" "kvector_t""'"); 
+    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IInterferenceFunction_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
     }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VonMisesGaussPeakShape" "', argument " "3"" of type '" "kvector_t""'");
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IInterferenceFunction_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
     } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
     }
   }
-  ecode4 = SWIG_AsVal_double(swig_obj[3], &val4);
-  if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_VonMisesGaussPeakShape" "', argument " "4"" of type '" "double""'");
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IInterferenceFunction_evaluate" "', argument " "3"" of type '" "double""'");
   } 
-  arg4 = static_cast< double >(val4);
-  result = (VonMisesGaussPeakShape *)new VonMisesGaussPeakShape(arg1,arg2,arg3,arg4);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_VonMisesGaussPeakShape, SWIG_POINTER_NEW |  0 );
+  arg3 = static_cast< double >(val3);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==swig_obj[0]));
+  try {
+    if (upcall) {
+      result = (double)((IInterferenceFunction const *)arg1)->IInterferenceFunction::evaluate(arg2,arg3);
+    } else {
+      result = (double)((IInterferenceFunction const *)arg1)->evaluate(arg2,arg3);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  double result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_evaluate" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IInterferenceFunction_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IInterferenceFunction_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==swig_obj[0]));
+  try {
+    if (upcall) {
+      result = (double)((IInterferenceFunction const *)arg1)->IInterferenceFunction::evaluate(arg2);
+    } else {
+      result = (double)((IInterferenceFunction const *)arg1)->evaluate(arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "IInterferenceFunction_evaluate", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IInterferenceFunction, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_IInterferenceFunction_evaluate__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IInterferenceFunction, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IInterferenceFunction_evaluate__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IInterferenceFunction_evaluate'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IInterferenceFunction::evaluate(kvector_t const,double) const\n"
+    "    IInterferenceFunction::evaluate(kvector_t const) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_setPositionVariance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "IInterferenceFunction_setPositionVariance", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_setPositionVariance" "', argument " "1"" of type '" "IInterferenceFunction *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IInterferenceFunction_setPositionVariance" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setPositionVariance(arg2);
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_VonMisesGaussPeakShape(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_positionVariance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  VonMisesGaussPeakShape *arg1 = (VonMisesGaussPeakShape *) 0 ;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
+  double result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_VonMisesGaussPeakShape, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_VonMisesGaussPeakShape" "', argument " "1"" of type '" "VonMisesGaussPeakShape *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_positionVariance" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
   }
-  arg1 = reinterpret_cast< VonMisesGaussPeakShape * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  result = (double)((IInterferenceFunction const *)arg1)->positionVariance();
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_VonMisesGaussPeakShape_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_getParticleDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  VonMisesGaussPeakShape *arg1 = (VonMisesGaussPeakShape *) 0 ;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  VonMisesGaussPeakShape *result = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  double result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_VonMisesGaussPeakShape, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VonMisesGaussPeakShape_clone" "', argument " "1"" of type '" "VonMisesGaussPeakShape const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_getParticleDensity" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==swig_obj[0]));
+  try {
+    if (upcall) {
+      result = (double)((IInterferenceFunction const *)arg1)->IInterferenceFunction::getParticleDensity();
+    } else {
+      result = (double)((IInterferenceFunction const *)arg1)->getParticleDensity();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
   }
-  arg1 = reinterpret_cast< VonMisesGaussPeakShape * >(argp1);
-  result = (VonMisesGaussPeakShape *)((VonMisesGaussPeakShape const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_VonMisesGaussPeakShape, 0 |  0 );
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_VonMisesGaussPeakShape_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_supportsMultilayer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  VonMisesGaussPeakShape *arg1 = (VonMisesGaussPeakShape *) 0 ;
-  INodeVisitor *arg2 = (INodeVisitor *) 0 ;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
+  PyObject *swig_obj[1] ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  bool result;
   
-  if (!SWIG_Python_UnpackTuple(args, "VonMisesGaussPeakShape_accept", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_VonMisesGaussPeakShape, 0 |  0 );
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VonMisesGaussPeakShape_accept" "', argument " "1"" of type '" "VonMisesGaussPeakShape const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_supportsMultilayer" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
   }
-  arg1 = reinterpret_cast< VonMisesGaussPeakShape * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VonMisesGaussPeakShape_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==swig_obj[0]));
+  try {
+    if (upcall) {
+      result = (bool)((IInterferenceFunction const *)arg1)->IInterferenceFunction::supportsMultilayer();
+    } else {
+      result = (bool)((IInterferenceFunction const *)arg1)->supportsMultilayer();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
   }
-  arg2 = reinterpret_cast< INodeVisitor * >(argp2);
-  ((VonMisesGaussPeakShape const *)arg1)->accept(arg2);
-  resultobj = SWIG_Py_Void();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_VonMisesGaussPeakShape_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_DWfactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  VonMisesGaussPeakShape *arg1 = (VonMisesGaussPeakShape *) 0 ;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
   kvector_t arg2 ;
-  kvector_t arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 ;
   int res2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
+  PyObject *swig_obj[2] ;
   double result;
   
-  if (!SWIG_Python_UnpackTuple(args, "VonMisesGaussPeakShape_evaluate", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_VonMisesGaussPeakShape, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "IInterferenceFunction_DWfactor", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VonMisesGaussPeakShape_evaluate" "', argument " "1"" of type '" "VonMisesGaussPeakShape const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_DWfactor" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
   }
-  arg1 = reinterpret_cast< VonMisesGaussPeakShape * >(argp1);
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
   {
     res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VonMisesGaussPeakShape_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IInterferenceFunction_DWfactor" "', argument " "2"" of type '" "kvector_t""'"); 
     }  
     if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VonMisesGaussPeakShape_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IInterferenceFunction_DWfactor" "', argument " "2"" of type '" "kvector_t""'");
     } else {
       kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
       arg2 = *temp;
       if (SWIG_IsNewObj(res2)) delete temp;
     }
   }
+  result = (double)((IInterferenceFunction const *)arg1)->DWfactor(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_iff_without_dw(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  SwigDirector_IInterferenceFunction *darg = 0;
+  double result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "IInterferenceFunction_iff_without_dw", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_iff_without_dw" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
   {
-    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VonMisesGaussPeakShape_evaluate" "', argument " "3"" of type '" "kvector_t const""'"); 
+    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IInterferenceFunction_iff_without_dw" "', argument " "2"" of type '" "kvector_t const""'"); 
     }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VonMisesGaussPeakShape_evaluate" "', argument " "3"" of type '" "kvector_t const""'");
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IInterferenceFunction_iff_without_dw" "', argument " "2"" of type '" "kvector_t const""'");
     } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
     }
   }
-  result = (double)((VonMisesGaussPeakShape const *)arg1)->evaluate(arg2,arg3);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  if (!director || !(director->swig_get_inner("iff_without_dw"))) {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member iff_without_dw");
+    SWIG_fail;
+  }
+  upcall = (director && (director->swig_get_self()==swig_obj[0]));
+  try {
+    darg = dynamic_cast<SwigDirector_IInterferenceFunction *>(arg1);
+    if (upcall) {
+      Swig::DirectorPureVirtualException::raise("IInterferenceFunction::iff_without_dw");
+    } else {
+      result = (double)((SwigDirector_IInterferenceFunction const *)darg)->iff_without_dw(arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -81486,37 +81355,40 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_VonMisesGaussPeakShape_angularDisorder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_disown_IInterferenceFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  VonMisesGaussPeakShape *arg1 = (VonMisesGaussPeakShape *) 0 ;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  bool result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_VonMisesGaussPeakShape, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VonMisesGaussPeakShape_angularDisorder" "', argument " "1"" of type '" "VonMisesGaussPeakShape const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_IInterferenceFunction" "', argument " "1"" of type '" "IInterferenceFunction *""'"); 
   }
-  arg1 = reinterpret_cast< VonMisesGaussPeakShape * >(argp1);
-  result = (bool)((VonMisesGaussPeakShape const *)arg1)->angularDisorder();
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  {
+    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
+    if (director) director->swig_disown();
+  }
+  
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *VonMisesGaussPeakShape_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IInterferenceFunction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_VonMisesGaussPeakShape, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_IInterferenceFunction, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *VonMisesGaussPeakShape_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IInterferenceFunction_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
@@ -84580,18 +84452,54 @@ SWIGINTERN PyObject *InterferenceFunctionFinite3DLattice_swiginit(PyObject *SWIG
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_InterferenceFunctionHardDisk(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_InterferenceFunctionHardDisk__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
+  double arg3 ;
   double val1 ;
   int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
+  double val3 ;
+  int ecode3 = 0 ;
   InterferenceFunctionHardDisk *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_InterferenceFunctionHardDisk", 2, 2, 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_InterferenceFunctionHardDisk" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_InterferenceFunctionHardDisk" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_InterferenceFunctionHardDisk" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (InterferenceFunctionHardDisk *)new InterferenceFunctionHardDisk(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunctionHardDisk, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunctionHardDisk__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  InterferenceFunctionHardDisk *result = 0 ;
+  
+  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_InterferenceFunctionHardDisk" "', argument " "1"" of type '" "double""'");
@@ -84610,6 +84518,62 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_InterferenceFunctionHardDisk(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_InterferenceFunctionHardDisk", 0, 3, argv))) SWIG_fail;
+  --argc;
+  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_InterferenceFunctionHardDisk__SWIG_1(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_InterferenceFunctionHardDisk__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_InterferenceFunctionHardDisk'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    InterferenceFunctionHardDisk::InterferenceFunctionHardDisk(double,double,double)\n"
+    "    InterferenceFunctionHardDisk::InterferenceFunctionHardDisk(double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_delete_InterferenceFunctionHardDisk(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   InterferenceFunctionHardDisk *arg1 = (InterferenceFunctionHardDisk *) 0 ;
@@ -88286,20 +88250,7 @@ SWIGINTERN PyObject *Layer_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *ar
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
-  PyObject *resultobj = 0;
-  LayerRoughness *result = 0 ;
-  
-  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
-  result = (LayerRoughness *)new LayerRoughness();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerRoughness, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -88336,6 +88287,19 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  LayerRoughness *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (LayerRoughness *)new LayerRoughness();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerRoughness, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_new_LayerRoughness(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[4] = {
@@ -88345,7 +88309,7 @@ SWIGINTERN PyObject *_wrap_new_LayerRoughness(PyObject *self, PyObject *args) {
   if (!(argc = SWIG_Python_UnpackTuple(args, "new_LayerRoughness", 0, 3, argv))) SWIG_fail;
   --argc;
   if (argc == 0) {
-    return _wrap_new_LayerRoughness__SWIG_0(self, argc, argv);
+    return _wrap_new_LayerRoughness__SWIG_1(self, argc, argv);
   }
   if (argc == 3) {
     int _v;
@@ -88364,7 +88328,7 @@ SWIGINTERN PyObject *_wrap_new_LayerRoughness(PyObject *self, PyObject *args) {
           _v = SWIG_CheckState(res);
         }
         if (_v) {
-          return _wrap_new_LayerRoughness__SWIG_1(self, argc, argv);
+          return _wrap_new_LayerRoughness__SWIG_0(self, argc, argv);
         }
       }
     }
@@ -88373,8 +88337,8 @@ SWIGINTERN PyObject *_wrap_new_LayerRoughness(PyObject *self, PyObject *args) {
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_LayerRoughness'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    LayerRoughness::LayerRoughness()\n"
-    "    LayerRoughness::LayerRoughness(double,double,double)\n");
+    "    LayerRoughness::LayerRoughness(double,double,double)\n"
+    "    LayerRoughness::LayerRoughness()\n");
   return 0;
 }
 
@@ -108146,667 +108110,6 @@ SWIGINTERN PyObject *IHistogram_swigregister(PyObject *SWIGUNUSEDPARM(self), PyO
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_delete_IIntensityNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IIntensityNormalizer, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IIntensityNormalizer" "', argument " "1"" of type '" "IIntensityNormalizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IIntensityNormalizer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  IIntensityNormalizer *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_clone" "', argument " "1"" of type '" "IIntensityNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
-  result = (IIntensityNormalizer *)((IIntensityNormalizer const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IIntensityNormalizer_createNormalizedData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
-  OutputData< double > *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  OutputData< double > *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IIntensityNormalizer_createNormalizedData", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_createNormalizedData" "', argument " "1"" of type '" "IIntensityNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IIntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IIntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
-  }
-  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
-  result = (OutputData< double > *)((IIntensityNormalizer const *)arg1)->createNormalizedData((OutputData< double > const &)*arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IIntensityNormalizer_apply(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
-  OutputData< double > *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IIntensityNormalizer_apply", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_apply" "', argument " "1"" of type '" "IIntensityNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_OutputDataT_double_t,  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IIntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IIntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
-  }
-  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
-  ((IIntensityNormalizer const *)arg1)->apply(*arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IIntensityNormalizer_setMaximumIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IIntensityNormalizer_setMaximumIntensity", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_setMaximumIntensity" "', argument " "1"" of type '" "IIntensityNormalizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IIntensityNormalizer_setMaximumIntensity" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setMaximumIntensity(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *IIntensityNormalizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IIntensityNormalizer, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *_wrap_new_IntensityNormalizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  IntensityNormalizer *result = 0 ;
-  
-  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_IntensityNormalizer" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IntensityNormalizer" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (IntensityNormalizer *)new IntensityNormalizer(arg1,arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IntensityNormalizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  IntensityNormalizer *result = 0 ;
-  
-  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_IntensityNormalizer" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  result = (IntensityNormalizer *)new IntensityNormalizer(arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IntensityNormalizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
-  PyObject *resultobj = 0;
-  IntensityNormalizer *result = 0 ;
-  
-  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
-  result = (IntensityNormalizer *)new IntensityNormalizer();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IntensityNormalizer(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_IntensityNormalizer", 0, 2, argv))) SWIG_fail;
-  --argc;
-  if (argc == 0) {
-    return _wrap_new_IntensityNormalizer__SWIG_2(self, argc, argv);
-  }
-  if (argc == 1) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      return _wrap_new_IntensityNormalizer__SWIG_1(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_IntensityNormalizer__SWIG_0(self, argc, argv);
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_IntensityNormalizer'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IntensityNormalizer::IntensityNormalizer(double,double)\n"
-    "    IntensityNormalizer::IntensityNormalizer(double)\n"
-    "    IntensityNormalizer::IntensityNormalizer()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_IntensityNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityNormalizer" "', argument " "1"" of type '" "IntensityNormalizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IntensityNormalizer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  IntensityNormalizer *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_clone" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
-  result = (IntensityNormalizer *)((IntensityNormalizer const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IntensityNormalizer_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
-  INodeVisitor *arg2 = (INodeVisitor *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IntensityNormalizer_accept", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_accept" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityNormalizer_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
-  }
-  arg2 = reinterpret_cast< INodeVisitor * >(argp2);
-  ((IntensityNormalizer const *)arg1)->accept(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IntensityNormalizer_createNormalizedData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
-  OutputData< double > *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  OutputData< double > *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IntensityNormalizer_createNormalizedData", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_createNormalizedData" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
-  }
-  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
-  result = (OutputData< double > *)((IntensityNormalizer const *)arg1)->createNormalizedData((OutputData< double > const &)*arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IntensityNormalizer_apply(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
-  OutputData< double > *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IntensityNormalizer_apply", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_apply" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_OutputDataT_double_t,  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
-  }
-  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
-  ((IntensityNormalizer const *)arg1)->apply(*arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IntensityNormalizer_setMaximumIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IntensityNormalizer_setMaximumIntensity", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_setMaximumIntensity" "', argument " "1"" of type '" "IntensityNormalizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityNormalizer_setMaximumIntensity" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setMaximumIntensity(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *IntensityNormalizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityNormalizer, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *IntensityNormalizer_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
-SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  IntensityScaleAndShiftNormalizer *result = 0 ;
-  
-  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_IntensityScaleAndShiftNormalizer" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IntensityScaleAndShiftNormalizer" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (IntensityScaleAndShiftNormalizer *)new IntensityScaleAndShiftNormalizer(arg1,arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  IntensityScaleAndShiftNormalizer *result = 0 ;
-  
-  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_IntensityScaleAndShiftNormalizer" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  result = (IntensityScaleAndShiftNormalizer *)new IntensityScaleAndShiftNormalizer(arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
-  PyObject *resultobj = 0;
-  IntensityScaleAndShiftNormalizer *result = 0 ;
-  
-  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
-  result = (IntensityScaleAndShiftNormalizer *)new IntensityScaleAndShiftNormalizer();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_IntensityScaleAndShiftNormalizer", 0, 2, argv))) SWIG_fail;
-  --argc;
-  if (argc == 0) {
-    return _wrap_new_IntensityScaleAndShiftNormalizer__SWIG_2(self, argc, argv);
-  }
-  if (argc == 1) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      return _wrap_new_IntensityScaleAndShiftNormalizer__SWIG_1(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_IntensityScaleAndShiftNormalizer__SWIG_0(self, argc, argv);
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_IntensityScaleAndShiftNormalizer'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double,double)\n"
-    "    IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double)\n"
-    "    IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_IntensityScaleAndShiftNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityScaleAndShiftNormalizer" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IntensityScaleAndShiftNormalizer_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
-  INodeVisitor *arg2 = (INodeVisitor *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IntensityScaleAndShiftNormalizer_accept", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityScaleAndShiftNormalizer_accept" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityScaleAndShiftNormalizer_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
-  }
-  arg2 = reinterpret_cast< INodeVisitor * >(argp2);
-  ((IntensityScaleAndShiftNormalizer const *)arg1)->accept(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IntensityScaleAndShiftNormalizer_setMaximumIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IntensityScaleAndShiftNormalizer_setMaximumIntensity", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityScaleAndShiftNormalizer_setMaximumIntensity" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityScaleAndShiftNormalizer_setMaximumIntensity" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setMaximumIntensity(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IntensityScaleAndShiftNormalizer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  IntensityScaleAndShiftNormalizer *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityScaleAndShiftNormalizer_clone" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer const *""'"); 
-  }
-  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
-  result = (IntensityScaleAndShiftNormalizer *)((IntensityScaleAndShiftNormalizer const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *IntensityScaleAndShiftNormalizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *IntensityScaleAndShiftNormalizer_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
 SWIGINTERN PyObject *_wrap_delete_IIntensityFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IIntensityFunction *arg1 = (IIntensityFunction *) 0 ;
@@ -122571,8 +121874,6 @@ static PyMethodDef SwigMethods[] = {
 		"INodeVisitor_visit(INodeVisitor self, ILayout arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, INode arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, Instrument arg2)\n"
-		"INodeVisitor_visit(INodeVisitor self, IntensityNormalizer arg2)\n"
-		"INodeVisitor_visit(INodeVisitor self, IntensityScaleAndShiftNormalizer arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, InterferenceFunction1DLattice arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, InterferenceFunction2DLattice arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, InterferenceFunction2DParaCrystal arg2)\n"
@@ -122706,11 +122007,6 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "RealParameter_swigregister", RealParameter_swigregister, METH_O, NULL},
 	 { "RealParameter_swiginit", RealParameter_swiginit, METH_VARARGS, NULL},
-	 { "delete_IDistribution1D", _wrap_delete_IDistribution1D, METH_O, "\n"
-		"delete_IDistribution1D(IDistribution1D self)\n"
-		"virtual IDistribution1D::~IDistribution1D()\n"
-		"\n"
-		""},
 	 { "IDistribution1D_clone", _wrap_IDistribution1D_clone, METH_O, "\n"
 		"IDistribution1D_clone(IDistribution1D self) -> IDistribution1D\n"
 		"virtual IDistribution1D* IDistribution1D::clone() const =0\n"
@@ -122772,6 +122068,11 @@ static PyMethodDef SwigMethods[] = {
 		"Sets distribution units. \n"
 		"\n"
 		""},
+	 { "delete_IDistribution1D", _wrap_delete_IDistribution1D, METH_O, "\n"
+		"delete_IDistribution1D(IDistribution1D self)\n"
+		"virtual IDistribution1D::~IDistribution1D()\n"
+		"\n"
+		""},
 	 { "IDistribution1D_swigregister", IDistribution1D_swigregister, METH_O, NULL},
 	 { "new_DistributionGate", _wrap_new_DistributionGate, METH_VARARGS, "\n"
 		"DistributionGate()\n"
@@ -122779,11 +122080,6 @@ static PyMethodDef SwigMethods[] = {
 		"DistributionGate::DistributionGate(double min, double max)\n"
 		"\n"
 		""},
-	 { "delete_DistributionGate", _wrap_delete_DistributionGate, METH_O, "\n"
-		"delete_DistributionGate(DistributionGate self)\n"
-		"virtual DistributionGate::~DistributionGate()\n"
-		"\n"
-		""},
 	 { "DistributionGate_clone", _wrap_DistributionGate_clone, METH_O, "\n"
 		"DistributionGate_clone(DistributionGate self) -> DistributionGate\n"
 		"DistributionGate* DistributionGate::clone() const final\n"
@@ -122834,6 +122130,11 @@ static PyMethodDef SwigMethods[] = {
 		"Calls the  INodeVisitor's visit method. \n"
 		"\n"
 		""},
+	 { "delete_DistributionGate", _wrap_delete_DistributionGate, METH_O, "\n"
+		"delete_DistributionGate(DistributionGate self)\n"
+		"virtual DistributionGate::~DistributionGate()\n"
+		"\n"
+		""},
 	 { "DistributionGate_swigregister", DistributionGate_swigregister, METH_O, NULL},
 	 { "DistributionGate_swiginit", DistributionGate_swiginit, METH_VARARGS, NULL},
 	 { "new_DistributionLorentz", _wrap_new_DistributionLorentz, METH_VARARGS, "\n"
@@ -122842,11 +122143,6 @@ static PyMethodDef SwigMethods[] = {
 		"DistributionLorentz::DistributionLorentz(double mean, double hwhm)\n"
 		"\n"
 		""},
-	 { "delete_DistributionLorentz", _wrap_delete_DistributionLorentz, METH_O, "\n"
-		"delete_DistributionLorentz(DistributionLorentz self)\n"
-		"virtual DistributionLorentz::~DistributionLorentz()\n"
-		"\n"
-		""},
 	 { "DistributionLorentz_clone", _wrap_DistributionLorentz_clone, METH_O, "\n"
 		"DistributionLorentz_clone(DistributionLorentz self) -> DistributionLorentz\n"
 		"DistributionLorentz* DistributionLorentz::clone() const final\n"
@@ -122892,6 +122188,11 @@ static PyMethodDef SwigMethods[] = {
 		"Calls the  INodeVisitor's visit method. \n"
 		"\n"
 		""},
+	 { "delete_DistributionLorentz", _wrap_delete_DistributionLorentz, METH_O, "\n"
+		"delete_DistributionLorentz(DistributionLorentz self)\n"
+		"virtual DistributionLorentz::~DistributionLorentz()\n"
+		"\n"
+		""},
 	 { "DistributionLorentz_swigregister", DistributionLorentz_swigregister, METH_O, NULL},
 	 { "DistributionLorentz_swiginit", DistributionLorentz_swiginit, METH_VARARGS, NULL},
 	 { "new_DistributionGaussian", _wrap_new_DistributionGaussian, METH_VARARGS, "\n"
@@ -122900,11 +122201,6 @@ static PyMethodDef SwigMethods[] = {
 		"DistributionGaussian::DistributionGaussian(double mean, double std_dev)\n"
 		"\n"
 		""},
-	 { "delete_DistributionGaussian", _wrap_delete_DistributionGaussian, METH_O, "\n"
-		"delete_DistributionGaussian(DistributionGaussian self)\n"
-		"virtual DistributionGaussian::~DistributionGaussian()\n"
-		"\n"
-		""},
 	 { "DistributionGaussian_clone", _wrap_DistributionGaussian_clone, METH_O, "\n"
 		"DistributionGaussian_clone(DistributionGaussian self) -> DistributionGaussian\n"
 		"DistributionGaussian* DistributionGaussian::clone() const final\n"
@@ -122950,19 +122246,18 @@ static PyMethodDef SwigMethods[] = {
 		"Calls the  INodeVisitor's visit method. \n"
 		"\n"
 		""},
+	 { "delete_DistributionGaussian", _wrap_delete_DistributionGaussian, METH_O, "\n"
+		"delete_DistributionGaussian(DistributionGaussian self)\n"
+		"virtual DistributionGaussian::~DistributionGaussian()\n"
+		"\n"
+		""},
 	 { "DistributionGaussian_swigregister", DistributionGaussian_swigregister, METH_O, NULL},
 	 { "DistributionGaussian_swiginit", DistributionGaussian_swiginit, METH_VARARGS, NULL},
 	 { "new_DistributionLogNormal", _wrap_new_DistributionLogNormal, METH_VARARGS, "\n"
-		"DistributionLogNormal(double scale_param)\n"
 		"new_DistributionLogNormal(double median, double scale_param) -> DistributionLogNormal\n"
 		"DistributionLogNormal::DistributionLogNormal(double median, double scale_param)\n"
 		"\n"
 		""},
-	 { "delete_DistributionLogNormal", _wrap_delete_DistributionLogNormal, METH_O, "\n"
-		"delete_DistributionLogNormal(DistributionLogNormal self)\n"
-		"virtual DistributionLogNormal::~DistributionLogNormal()\n"
-		"\n"
-		""},
 	 { "DistributionLogNormal_clone", _wrap_DistributionLogNormal_clone, METH_O, "\n"
 		"DistributionLogNormal_clone(DistributionLogNormal self) -> DistributionLogNormal\n"
 		"DistributionLogNormal* DistributionLogNormal::clone() const final\n"
@@ -123020,6 +122315,11 @@ static PyMethodDef SwigMethods[] = {
 		"Sets distribution units. \n"
 		"\n"
 		""},
+	 { "delete_DistributionLogNormal", _wrap_delete_DistributionLogNormal, METH_O, "\n"
+		"delete_DistributionLogNormal(DistributionLogNormal self)\n"
+		"virtual DistributionLogNormal::~DistributionLogNormal()\n"
+		"\n"
+		""},
 	 { "DistributionLogNormal_swigregister", DistributionLogNormal_swigregister, METH_O, NULL},
 	 { "DistributionLogNormal_swiginit", DistributionLogNormal_swiginit, METH_VARARGS, NULL},
 	 { "new_DistributionCosine", _wrap_new_DistributionCosine, METH_VARARGS, "\n"
@@ -123028,11 +122328,6 @@ static PyMethodDef SwigMethods[] = {
 		"DistributionCosine::DistributionCosine(double mean, double sigma)\n"
 		"\n"
 		""},
-	 { "delete_DistributionCosine", _wrap_delete_DistributionCosine, METH_O, "\n"
-		"delete_DistributionCosine(DistributionCosine self)\n"
-		"virtual DistributionCosine::~DistributionCosine()\n"
-		"\n"
-		""},
 	 { "DistributionCosine_clone", _wrap_DistributionCosine_clone, METH_O, "\n"
 		"DistributionCosine_clone(DistributionCosine self) -> DistributionCosine\n"
 		"DistributionCosine* DistributionCosine::clone() const final\n"
@@ -123078,19 +122373,19 @@ static PyMethodDef SwigMethods[] = {
 		"Calls the  INodeVisitor's visit method. \n"
 		"\n"
 		""},
+	 { "delete_DistributionCosine", _wrap_delete_DistributionCosine, METH_O, "\n"
+		"delete_DistributionCosine(DistributionCosine self)\n"
+		"virtual DistributionCosine::~DistributionCosine()\n"
+		"\n"
+		""},
 	 { "DistributionCosine_swigregister", DistributionCosine_swigregister, METH_O, NULL},
 	 { "DistributionCosine_swiginit", DistributionCosine_swiginit, METH_VARARGS, NULL},
 	 { "new_DistributionTrapezoid", _wrap_new_DistributionTrapezoid, METH_VARARGS, "\n"
-		"DistributionTrapezoid()\n"
-		"new_DistributionTrapezoid(double center, double left_width, double middle_width, double right_width) -> DistributionTrapezoid\n"
+		"DistributionTrapezoid(double center, double left, double middle, double right)\n"
+		"new_DistributionTrapezoid() -> DistributionTrapezoid\n"
 		"DistributionTrapezoid::DistributionTrapezoid(double center, double left_width, double middle_width, double right_width)\n"
 		"\n"
 		""},
-	 { "delete_DistributionTrapezoid", _wrap_delete_DistributionTrapezoid, METH_O, "\n"
-		"delete_DistributionTrapezoid(DistributionTrapezoid self)\n"
-		"virtual DistributionTrapezoid::~DistributionTrapezoid()\n"
-		"\n"
-		""},
 	 { "DistributionTrapezoid_clone", _wrap_DistributionTrapezoid_clone, METH_O, "\n"
 		"DistributionTrapezoid_clone(DistributionTrapezoid self) -> DistributionTrapezoid\n"
 		"DistributionTrapezoid* DistributionTrapezoid::clone() const final\n"
@@ -123146,6 +122441,11 @@ static PyMethodDef SwigMethods[] = {
 		"Calls the  INodeVisitor's visit method. \n"
 		"\n"
 		""},
+	 { "delete_DistributionTrapezoid", _wrap_delete_DistributionTrapezoid, METH_O, "\n"
+		"delete_DistributionTrapezoid(DistributionTrapezoid self)\n"
+		"virtual DistributionTrapezoid::~DistributionTrapezoid()\n"
+		"\n"
+		""},
 	 { "DistributionTrapezoid_swigregister", DistributionTrapezoid_swigregister, METH_O, NULL},
 	 { "DistributionTrapezoid_swiginit", DistributionTrapezoid_swiginit, METH_VARARGS, NULL},
 	 { "new_ParameterDistribution", _wrap_new_ParameterDistribution, METH_VARARGS, "\n"
@@ -125421,7 +124721,6 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_FTDistribution1DVoigt", _wrap_delete_FTDistribution1DVoigt, METH_O, "delete_FTDistribution1DVoigt(FTDistribution1DVoigt self)"},
 	 { "FTDistribution1DVoigt_swigregister", FTDistribution1DVoigt_swigregister, METH_O, NULL},
 	 { "FTDistribution1DVoigt_swiginit", FTDistribution1DVoigt_swiginit, METH_VARARGS, NULL},
-	 { "delete_IFTDistribution2D", _wrap_delete_IFTDistribution2D, METH_O, "delete_IFTDistribution2D(IFTDistribution2D self)"},
 	 { "IFTDistribution2D_clone", _wrap_IFTDistribution2D_clone, METH_O, "\n"
 		"IFTDistribution2D_clone(IFTDistribution2D self) -> IFTDistribution2D\n"
 		"IFTDistribution2D* IFTDistribution2D::clone() const =0\n"
@@ -125459,6 +124758,7 @@ static PyMethodDef SwigMethods[] = {
 		"evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 \n"
 		"\n"
 		""},
+	 { "delete_IFTDistribution2D", _wrap_delete_IFTDistribution2D, METH_O, "delete_IFTDistribution2D(IFTDistribution2D self)"},
 	 { "IFTDistribution2D_swigregister", IFTDistribution2D_swigregister, METH_O, NULL},
 	 { "new_FTDistribution2DCauchy", _wrap_new_FTDistribution2DCauchy, METH_VARARGS, "\n"
 		"new_FTDistribution2DCauchy(double omega_x, double omega_y, double gamma) -> FTDistribution2DCauchy\n"
@@ -125617,70 +124917,6 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_FTDistribution2DVoigt", _wrap_delete_FTDistribution2DVoigt, METH_O, "delete_FTDistribution2DVoigt(FTDistribution2DVoigt self)"},
 	 { "FTDistribution2DVoigt_swigregister", FTDistribution2DVoigt_swigregister, METH_O, NULL},
 	 { "FTDistribution2DVoigt_swiginit", FTDistribution2DVoigt_swiginit, METH_VARARGS, NULL},
-	 { "new_IInterferenceFunction", _wrap_new_IInterferenceFunction, METH_VARARGS, "\n"
-		"IInterferenceFunction()\n"
-		"new_IInterferenceFunction(PyObject * _self, IInterferenceFunction other) -> IInterferenceFunction\n"
-		"IInterferenceFunction::IInterferenceFunction(const IInterferenceFunction &other)\n"
-		"\n"
-		""},
-	 { "delete_IInterferenceFunction", _wrap_delete_IInterferenceFunction, METH_O, "\n"
-		"delete_IInterferenceFunction(IInterferenceFunction self)\n"
-		"IInterferenceFunction::~IInterferenceFunction()\n"
-		"\n"
-		""},
-	 { "IInterferenceFunction_clone", _wrap_IInterferenceFunction_clone, METH_O, "\n"
-		"IInterferenceFunction_clone(IInterferenceFunction self) -> IInterferenceFunction\n"
-		"virtual IInterferenceFunction* IInterferenceFunction::clone() const =0\n"
-		"\n"
-		"Returns a clone of this  ISample object. \n"
-		"\n"
-		""},
-	 { "IInterferenceFunction_evaluate", _wrap_IInterferenceFunction_evaluate, METH_VARARGS, "\n"
-		"IInterferenceFunction_evaluate(IInterferenceFunction self, kvector_t q, double outer_iff=1.0) -> double\n"
-		"double IInterferenceFunction::evaluate(const kvector_t q, double outer_iff=1.0) const\n"
-		"\n"
-		"Evaluates the interference function for a given wavevector transfer. \n"
-		"\n"
-		""},
-	 { "IInterferenceFunction_setPositionVariance", _wrap_IInterferenceFunction_setPositionVariance, METH_VARARGS, "\n"
-		"IInterferenceFunction_setPositionVariance(IInterferenceFunction self, double var)\n"
-		"void IInterferenceFunction::setPositionVariance(double var)\n"
-		"\n"
-		"Sets the variance of the position for the calculation of the DW factor It is defined as the variance in each relevant dimension \n"
-		"\n"
-		""},
-	 { "IInterferenceFunction_positionVariance", _wrap_IInterferenceFunction_positionVariance, METH_O, "\n"
-		"IInterferenceFunction_positionVariance(IInterferenceFunction self) -> double\n"
-		"double IInterferenceFunction::positionVariance() const\n"
-		"\n"
-		"Returns the position variance. \n"
-		"\n"
-		""},
-	 { "IInterferenceFunction_getParticleDensity", _wrap_IInterferenceFunction_getParticleDensity, METH_O, "\n"
-		"IInterferenceFunction_getParticleDensity(IInterferenceFunction self) -> double\n"
-		"virtual double IInterferenceFunction::getParticleDensity() const\n"
-		"\n"
-		"If defined by this interference function's parameters, returns the particle density (per area). Otherwise, returns zero or a user-defined value \n"
-		"\n"
-		""},
-	 { "IInterferenceFunction_supportsMultilayer", _wrap_IInterferenceFunction_supportsMultilayer, METH_O, "\n"
-		"IInterferenceFunction_supportsMultilayer(IInterferenceFunction self) -> bool\n"
-		"virtual bool IInterferenceFunction::supportsMultilayer() const\n"
-		"\n"
-		"Indicates if this interference function can be used with a multilayer (DWBA mode) \n"
-		"\n"
-		""},
-	 { "IInterferenceFunction_DWfactor", _wrap_IInterferenceFunction_DWfactor, METH_VARARGS, "\n"
-		"IInterferenceFunction_DWfactor(IInterferenceFunction self, kvector_t q) -> double\n"
-		"double IInterferenceFunction::DWfactor(kvector_t q) const\n"
-		"\n"
-		"Evaluates the Debye-Waller factor for a given wavevector transfer. \n"
-		"\n"
-		""},
-	 { "IInterferenceFunction_iff_without_dw", _wrap_IInterferenceFunction_iff_without_dw, METH_VARARGS, "IInterferenceFunction_iff_without_dw(IInterferenceFunction self, kvector_t q) -> double"},
-	 { "disown_IInterferenceFunction", _wrap_disown_IInterferenceFunction, METH_O, NULL},
-	 { "IInterferenceFunction_swigregister", IInterferenceFunction_swigregister, METH_O, NULL},
-	 { "IInterferenceFunction_swiginit", IInterferenceFunction_swiginit, METH_VARARGS, NULL},
 	 { "delete_ILayout", _wrap_delete_ILayout, METH_O, "\n"
 		"delete_ILayout(ILayout self)\n"
 		"ILayout::~ILayout()\n"
@@ -125923,86 +125159,134 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "LorentzFisherPeakShape_swigregister", LorentzFisherPeakShape_swigregister, METH_O, NULL},
 	 { "LorentzFisherPeakShape_swiginit", LorentzFisherPeakShape_swiginit, METH_VARARGS, NULL},
-	 { "new_VonMisesFisherGaussPeakShape", _wrap_new_VonMisesFisherGaussPeakShape, METH_VARARGS, "\n"
-		"new_VonMisesFisherGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith, double kappa_1, double kappa_2) -> VonMisesFisherGaussPeakShape\n"
-		"VonMisesFisherGaussPeakShape::VonMisesFisherGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith, double kappa_1, double kappa_2)\n"
+	 { "new_MisesFisherGaussPeakShape", _wrap_new_MisesFisherGaussPeakShape, METH_VARARGS, "new_MisesFisherGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith, double kappa_1, double kappa_2) -> MisesFisherGaussPeakShape"},
+	 { "delete_MisesFisherGaussPeakShape", _wrap_delete_MisesFisherGaussPeakShape, METH_O, "delete_MisesFisherGaussPeakShape(MisesFisherGaussPeakShape self)"},
+	 { "MisesFisherGaussPeakShape_clone", _wrap_MisesFisherGaussPeakShape_clone, METH_O, "\n"
+		"MisesFisherGaussPeakShape_clone(MisesFisherGaussPeakShape self) -> MisesFisherGaussPeakShape\n"
+		"virtual IPeakShape* IPeakShape::clone() const =0\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
 		"\n"
 		""},
-	 { "delete_VonMisesFisherGaussPeakShape", _wrap_delete_VonMisesFisherGaussPeakShape, METH_O, "\n"
-		"delete_VonMisesFisherGaussPeakShape(VonMisesFisherGaussPeakShape self)\n"
-		"VonMisesFisherGaussPeakShape::~VonMisesFisherGaussPeakShape() override\n"
+	 { "MisesFisherGaussPeakShape_accept", _wrap_MisesFisherGaussPeakShape_accept, METH_VARARGS, "\n"
+		"MisesFisherGaussPeakShape_accept(MisesFisherGaussPeakShape self, INodeVisitor visitor)\n"
+		"virtual void INode::accept(INodeVisitor *visitor) const =0\n"
+		"\n"
+		"Calls the  INodeVisitor's visit method. \n"
 		"\n"
 		""},
-	 { "VonMisesFisherGaussPeakShape_clone", _wrap_VonMisesFisherGaussPeakShape_clone, METH_O, "\n"
-		"VonMisesFisherGaussPeakShape_clone(VonMisesFisherGaussPeakShape self) -> VonMisesFisherGaussPeakShape\n"
-		"VonMisesFisherGaussPeakShape * VonMisesFisherGaussPeakShape::clone() const override\n"
+	 { "MisesFisherGaussPeakShape_evaluate", _wrap_MisesFisherGaussPeakShape_evaluate, METH_VARARGS, "\n"
+		"MisesFisherGaussPeakShape_evaluate(MisesFisherGaussPeakShape self, kvector_t q, kvector_t q_lattice_point) -> double\n"
+		"virtual double IPeakShape::evaluate(const kvector_t q, const kvector_t q_lattice_point) const =0\n"
+		"\n"
+		"Evaluates the peak shape at q from a reciprocal lattice point at q_lattice_point. \n"
+		"\n"
+		""},
+	 { "MisesFisherGaussPeakShape_angularDisorder", _wrap_MisesFisherGaussPeakShape_angularDisorder, METH_O, "\n"
+		"MisesFisherGaussPeakShape_angularDisorder(MisesFisherGaussPeakShape self) -> bool\n"
+		"virtual bool IPeakShape::angularDisorder() const\n"
+		"\n"
+		"Indicates if the peak shape encodes angular disorder, in which case all peaks in a spherical shell are needed \n"
+		"\n"
+		""},
+	 { "MisesFisherGaussPeakShape_swigregister", MisesFisherGaussPeakShape_swigregister, METH_O, NULL},
+	 { "MisesFisherGaussPeakShape_swiginit", MisesFisherGaussPeakShape_swiginit, METH_VARARGS, NULL},
+	 { "new_MisesGaussPeakShape", _wrap_new_MisesGaussPeakShape, METH_VARARGS, "new_MisesGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith, double kappa) -> MisesGaussPeakShape"},
+	 { "delete_MisesGaussPeakShape", _wrap_delete_MisesGaussPeakShape, METH_O, "delete_MisesGaussPeakShape(MisesGaussPeakShape self)"},
+	 { "MisesGaussPeakShape_clone", _wrap_MisesGaussPeakShape_clone, METH_O, "\n"
+		"MisesGaussPeakShape_clone(MisesGaussPeakShape self) -> MisesGaussPeakShape\n"
+		"virtual IPeakShape* IPeakShape::clone() const =0\n"
 		"\n"
 		"Returns a clone of this  ISample object. \n"
 		"\n"
 		""},
-	 { "VonMisesFisherGaussPeakShape_accept", _wrap_VonMisesFisherGaussPeakShape_accept, METH_VARARGS, "\n"
-		"VonMisesFisherGaussPeakShape_accept(VonMisesFisherGaussPeakShape self, INodeVisitor visitor)\n"
-		"void VonMisesFisherGaussPeakShape::accept(INodeVisitor *visitor) const override\n"
+	 { "MisesGaussPeakShape_accept", _wrap_MisesGaussPeakShape_accept, METH_VARARGS, "\n"
+		"MisesGaussPeakShape_accept(MisesGaussPeakShape self, INodeVisitor visitor)\n"
+		"virtual void INode::accept(INodeVisitor *visitor) const =0\n"
 		"\n"
 		"Calls the  INodeVisitor's visit method. \n"
 		"\n"
 		""},
-	 { "VonMisesFisherGaussPeakShape_evaluate", _wrap_VonMisesFisherGaussPeakShape_evaluate, METH_VARARGS, "\n"
-		"VonMisesFisherGaussPeakShape_evaluate(VonMisesFisherGaussPeakShape self, kvector_t q, kvector_t q_lattice_point) -> double\n"
-		"double VonMisesFisherGaussPeakShape::evaluate(const kvector_t q, const kvector_t q_lattice_point) const override\n"
+	 { "MisesGaussPeakShape_evaluate", _wrap_MisesGaussPeakShape_evaluate, METH_VARARGS, "\n"
+		"MisesGaussPeakShape_evaluate(MisesGaussPeakShape self, kvector_t q, kvector_t q_lattice_point) -> double\n"
+		"virtual double IPeakShape::evaluate(const kvector_t q, const kvector_t q_lattice_point) const =0\n"
 		"\n"
 		"Evaluates the peak shape at q from a reciprocal lattice point at q_lattice_point. \n"
 		"\n"
 		""},
-	 { "VonMisesFisherGaussPeakShape_angularDisorder", _wrap_VonMisesFisherGaussPeakShape_angularDisorder, METH_O, "\n"
-		"VonMisesFisherGaussPeakShape_angularDisorder(VonMisesFisherGaussPeakShape self) -> bool\n"
-		"bool VonMisesFisherGaussPeakShape::angularDisorder() const override\n"
+	 { "MisesGaussPeakShape_angularDisorder", _wrap_MisesGaussPeakShape_angularDisorder, METH_O, "\n"
+		"MisesGaussPeakShape_angularDisorder(MisesGaussPeakShape self) -> bool\n"
+		"virtual bool IPeakShape::angularDisorder() const\n"
 		"\n"
 		"Indicates if the peak shape encodes angular disorder, in which case all peaks in a spherical shell are needed \n"
 		"\n"
 		""},
-	 { "VonMisesFisherGaussPeakShape_swigregister", VonMisesFisherGaussPeakShape_swigregister, METH_O, NULL},
-	 { "VonMisesFisherGaussPeakShape_swiginit", VonMisesFisherGaussPeakShape_swiginit, METH_VARARGS, NULL},
-	 { "new_VonMisesGaussPeakShape", _wrap_new_VonMisesGaussPeakShape, METH_VARARGS, "\n"
-		"new_VonMisesGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith, double kappa) -> VonMisesGaussPeakShape\n"
-		"VonMisesGaussPeakShape::VonMisesGaussPeakShape(double max_intensity, double radial_size, kvector_t zenith, double kappa)\n"
+	 { "MisesGaussPeakShape_swigregister", MisesGaussPeakShape_swigregister, METH_O, NULL},
+	 { "MisesGaussPeakShape_swiginit", MisesGaussPeakShape_swiginit, METH_VARARGS, NULL},
+	 { "new_IInterferenceFunction", _wrap_new_IInterferenceFunction, METH_VARARGS, "\n"
+		"IInterferenceFunction(NodeMeta meta, vdouble1d_t PValues)\n"
+		"new_IInterferenceFunction(PyObject * _self, double position_var) -> IInterferenceFunction\n"
+		"IInterferenceFunction::IInterferenceFunction(const IInterferenceFunction &other)\n"
 		"\n"
 		""},
-	 { "delete_VonMisesGaussPeakShape", _wrap_delete_VonMisesGaussPeakShape, METH_O, "\n"
-		"delete_VonMisesGaussPeakShape(VonMisesGaussPeakShape self)\n"
-		"VonMisesGaussPeakShape::~VonMisesGaussPeakShape() override\n"
+	 { "delete_IInterferenceFunction", _wrap_delete_IInterferenceFunction, METH_O, "\n"
+		"delete_IInterferenceFunction(IInterferenceFunction self)\n"
+		"IInterferenceFunction::~IInterferenceFunction()\n"
 		"\n"
 		""},
-	 { "VonMisesGaussPeakShape_clone", _wrap_VonMisesGaussPeakShape_clone, METH_O, "\n"
-		"VonMisesGaussPeakShape_clone(VonMisesGaussPeakShape self) -> VonMisesGaussPeakShape\n"
-		"VonMisesGaussPeakShape * VonMisesGaussPeakShape::clone() const override\n"
+	 { "IInterferenceFunction_clone", _wrap_IInterferenceFunction_clone, METH_O, "\n"
+		"IInterferenceFunction_clone(IInterferenceFunction self) -> IInterferenceFunction\n"
+		"virtual IInterferenceFunction* IInterferenceFunction::clone() const =0\n"
 		"\n"
 		"Returns a clone of this  ISample object. \n"
 		"\n"
 		""},
-	 { "VonMisesGaussPeakShape_accept", _wrap_VonMisesGaussPeakShape_accept, METH_VARARGS, "\n"
-		"VonMisesGaussPeakShape_accept(VonMisesGaussPeakShape self, INodeVisitor visitor)\n"
-		"void VonMisesGaussPeakShape::accept(INodeVisitor *visitor) const override\n"
+	 { "IInterferenceFunction_evaluate", _wrap_IInterferenceFunction_evaluate, METH_VARARGS, "\n"
+		"IInterferenceFunction_evaluate(IInterferenceFunction self, kvector_t q, double outer_iff=1.0) -> double\n"
+		"double IInterferenceFunction::evaluate(const kvector_t q, double outer_iff=1.0) const\n"
 		"\n"
-		"Calls the  INodeVisitor's visit method. \n"
+		"Evaluates the interference function for a given wavevector transfer. \n"
 		"\n"
 		""},
-	 { "VonMisesGaussPeakShape_evaluate", _wrap_VonMisesGaussPeakShape_evaluate, METH_VARARGS, "\n"
-		"VonMisesGaussPeakShape_evaluate(VonMisesGaussPeakShape self, kvector_t q, kvector_t q_lattice_point) -> double\n"
-		"double VonMisesGaussPeakShape::evaluate(const kvector_t q, const kvector_t q_lattice_point) const override\n"
+	 { "IInterferenceFunction_setPositionVariance", _wrap_IInterferenceFunction_setPositionVariance, METH_VARARGS, "\n"
+		"IInterferenceFunction_setPositionVariance(IInterferenceFunction self, double var)\n"
+		"void IInterferenceFunction::setPositionVariance(double var)\n"
 		"\n"
-		"Evaluates the peak shape at q from a reciprocal lattice point at q_lattice_point. \n"
+		"Sets the variance of the position for the calculation of the DW factor It is defined as the variance in each relevant dimension \n"
 		"\n"
 		""},
-	 { "VonMisesGaussPeakShape_angularDisorder", _wrap_VonMisesGaussPeakShape_angularDisorder, METH_O, "\n"
-		"VonMisesGaussPeakShape_angularDisorder(VonMisesGaussPeakShape self) -> bool\n"
-		"bool VonMisesGaussPeakShape::angularDisorder() const override\n"
+	 { "IInterferenceFunction_positionVariance", _wrap_IInterferenceFunction_positionVariance, METH_O, "\n"
+		"IInterferenceFunction_positionVariance(IInterferenceFunction self) -> double\n"
+		"double IInterferenceFunction::positionVariance() const\n"
 		"\n"
-		"Indicates if the peak shape encodes angular disorder, in which case all peaks in a spherical shell are needed \n"
+		"Returns the position variance. \n"
 		"\n"
 		""},
-	 { "VonMisesGaussPeakShape_swigregister", VonMisesGaussPeakShape_swigregister, METH_O, NULL},
-	 { "VonMisesGaussPeakShape_swiginit", VonMisesGaussPeakShape_swiginit, METH_VARARGS, NULL},
+	 { "IInterferenceFunction_getParticleDensity", _wrap_IInterferenceFunction_getParticleDensity, METH_O, "\n"
+		"IInterferenceFunction_getParticleDensity(IInterferenceFunction self) -> double\n"
+		"virtual double IInterferenceFunction::getParticleDensity() const\n"
+		"\n"
+		"If defined by this interference function's parameters, returns the particle density (per area). Otherwise, returns zero or a user-defined value \n"
+		"\n"
+		""},
+	 { "IInterferenceFunction_supportsMultilayer", _wrap_IInterferenceFunction_supportsMultilayer, METH_O, "\n"
+		"IInterferenceFunction_supportsMultilayer(IInterferenceFunction self) -> bool\n"
+		"virtual bool IInterferenceFunction::supportsMultilayer() const\n"
+		"\n"
+		"Indicates if this interference function can be used with a multilayer (DWBA mode) \n"
+		"\n"
+		""},
+	 { "IInterferenceFunction_DWfactor", _wrap_IInterferenceFunction_DWfactor, METH_VARARGS, "\n"
+		"IInterferenceFunction_DWfactor(IInterferenceFunction self, kvector_t q) -> double\n"
+		"double IInterferenceFunction::DWfactor(kvector_t q) const\n"
+		"\n"
+		"Evaluates the Debye-Waller factor for a given wavevector transfer. \n"
+		"\n"
+		""},
+	 { "IInterferenceFunction_iff_without_dw", _wrap_IInterferenceFunction_iff_without_dw, METH_VARARGS, "IInterferenceFunction_iff_without_dw(IInterferenceFunction self, kvector_t q) -> double"},
+	 { "disown_IInterferenceFunction", _wrap_disown_IInterferenceFunction, METH_O, NULL},
+	 { "IInterferenceFunction_swigregister", IInterferenceFunction_swigregister, METH_O, NULL},
+	 { "IInterferenceFunction_swiginit", IInterferenceFunction_swiginit, METH_VARARGS, NULL},
 	 { "new_InterferenceFunction1DLattice", _wrap_new_InterferenceFunction1DLattice, METH_VARARGS, "\n"
 		"new_InterferenceFunction1DLattice(double length, double xi) -> InterferenceFunction1DLattice\n"
 		"InterferenceFunction1DLattice::InterferenceFunction1DLattice(double length, double xi)\n"
@@ -126626,7 +125910,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "InterferenceFunctionFinite3DLattice_swigregister", InterferenceFunctionFinite3DLattice_swigregister, METH_O, NULL},
 	 { "InterferenceFunctionFinite3DLattice_swiginit", InterferenceFunctionFinite3DLattice_swiginit, METH_VARARGS, NULL},
 	 { "new_InterferenceFunctionHardDisk", _wrap_new_InterferenceFunctionHardDisk, METH_VARARGS, "\n"
-		"new_InterferenceFunctionHardDisk(double radius, double density) -> InterferenceFunctionHardDisk\n"
+		"InterferenceFunctionHardDisk(double radius, double density, double position_var=0)\n"
 		"InterferenceFunctionHardDisk::InterferenceFunctionHardDisk(double radius, double density)\n"
 		"\n"
 		""},
@@ -127312,8 +126596,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "Layer_swigregister", Layer_swigregister, METH_O, NULL},
 	 { "Layer_swiginit", Layer_swiginit, METH_VARARGS, NULL},
 	 { "new_LayerRoughness", _wrap_new_LayerRoughness, METH_VARARGS, "\n"
-		"LayerRoughness()\n"
-		"new_LayerRoughness(double sigma, double hurstParameter, double lateralCorrLength) -> LayerRoughness\n"
+		"LayerRoughness(double sigma, double hurstParameter, double lateralCorrLength)\n"
+		"new_LayerRoughness() -> LayerRoughness\n"
 		"LayerRoughness::LayerRoughness(double sigma, double hurstParameter, double lateralCorrLength)\n"
 		"\n"
 		"Constructor of layer roughness.\n"
@@ -131073,100 +130357,6 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "IHistogram_swigregister", IHistogram_swigregister, METH_O, NULL},
-	 { "delete_IIntensityNormalizer", _wrap_delete_IIntensityNormalizer, METH_O, "\n"
-		"delete_IIntensityNormalizer(IIntensityNormalizer self)\n"
-		"virtual IIntensityNormalizer::~IIntensityNormalizer()\n"
-		"\n"
-		""},
-	 { "IIntensityNormalizer_clone", _wrap_IIntensityNormalizer_clone, METH_O, "\n"
-		"IIntensityNormalizer_clone(IIntensityNormalizer self) -> IIntensityNormalizer\n"
-		"virtual IIntensityNormalizer* IIntensityNormalizer::clone() const =0\n"
-		"\n"
-		""},
-	 { "IIntensityNormalizer_createNormalizedData", _wrap_IIntensityNormalizer_createNormalizedData, METH_VARARGS, "\n"
-		"IIntensityNormalizer_createNormalizedData(IIntensityNormalizer self, IntensityData data) -> IntensityData\n"
-		"virtual OutputData<double>* IIntensityNormalizer::createNormalizedData(const OutputData< double > &data) const =0\n"
-		"\n"
-		""},
-	 { "IIntensityNormalizer_apply", _wrap_IIntensityNormalizer_apply, METH_VARARGS, "\n"
-		"IIntensityNormalizer_apply(IIntensityNormalizer self, IntensityData data)\n"
-		"virtual void IIntensityNormalizer::apply(OutputData< double > &data) const =0\n"
-		"\n"
-		""},
-	 { "IIntensityNormalizer_setMaximumIntensity", _wrap_IIntensityNormalizer_setMaximumIntensity, METH_VARARGS, "\n"
-		"IIntensityNormalizer_setMaximumIntensity(IIntensityNormalizer self, double arg2)\n"
-		"virtual void IIntensityNormalizer::setMaximumIntensity(double)=0\n"
-		"\n"
-		""},
-	 { "IIntensityNormalizer_swigregister", IIntensityNormalizer_swigregister, METH_O, NULL},
-	 { "new_IntensityNormalizer", _wrap_new_IntensityNormalizer, METH_VARARGS, "\n"
-		"IntensityNormalizer(double scale=1.0, double shift=0.0)\n"
-		"IntensityNormalizer::IntensityNormalizer(double scale=1.0, double shift=0.0)\n"
-		"\n"
-		""},
-	 { "delete_IntensityNormalizer", _wrap_delete_IntensityNormalizer, METH_O, "\n"
-		"delete_IntensityNormalizer(IntensityNormalizer self)\n"
-		"virtual IntensityNormalizer::~IntensityNormalizer()\n"
-		"\n"
-		""},
-	 { "IntensityNormalizer_clone", _wrap_IntensityNormalizer_clone, METH_O, "\n"
-		"IntensityNormalizer_clone(IntensityNormalizer self) -> IntensityNormalizer\n"
-		"IntensityNormalizer * IntensityNormalizer::clone() const\n"
-		"\n"
-		""},
-	 { "IntensityNormalizer_accept", _wrap_IntensityNormalizer_accept, METH_VARARGS, "\n"
-		"IntensityNormalizer_accept(IntensityNormalizer self, INodeVisitor visitor)\n"
-		"void IntensityNormalizer::accept(INodeVisitor *visitor) const\n"
-		"\n"
-		"Calls the  INodeVisitor's visit method. \n"
-		"\n"
-		""},
-	 { "IntensityNormalizer_createNormalizedData", _wrap_IntensityNormalizer_createNormalizedData, METH_VARARGS, "\n"
-		"IntensityNormalizer_createNormalizedData(IntensityNormalizer self, IntensityData data) -> IntensityData\n"
-		"OutputData< double > * IntensityNormalizer::createNormalizedData(const OutputData< double > &data) const\n"
-		"\n"
-		""},
-	 { "IntensityNormalizer_apply", _wrap_IntensityNormalizer_apply, METH_VARARGS, "\n"
-		"IntensityNormalizer_apply(IntensityNormalizer self, IntensityData data)\n"
-		"void IntensityNormalizer::apply(OutputData< double > &data) const final\n"
-		"\n"
-		""},
-	 { "IntensityNormalizer_setMaximumIntensity", _wrap_IntensityNormalizer_setMaximumIntensity, METH_VARARGS, "\n"
-		"IntensityNormalizer_setMaximumIntensity(IntensityNormalizer self, double max_intensity)\n"
-		"virtual void IntensityNormalizer::setMaximumIntensity(double max_intensity)\n"
-		"\n"
-		""},
-	 { "IntensityNormalizer_swigregister", IntensityNormalizer_swigregister, METH_O, NULL},
-	 { "IntensityNormalizer_swiginit", IntensityNormalizer_swiginit, METH_VARARGS, NULL},
-	 { "new_IntensityScaleAndShiftNormalizer", _wrap_new_IntensityScaleAndShiftNormalizer, METH_VARARGS, "\n"
-		"IntensityScaleAndShiftNormalizer(double scale=1.0, double shift=0.0)\n"
-		"IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double scale=1.0, double shift=0.0)\n"
-		"\n"
-		""},
-	 { "delete_IntensityScaleAndShiftNormalizer", _wrap_delete_IntensityScaleAndShiftNormalizer, METH_O, "\n"
-		"delete_IntensityScaleAndShiftNormalizer(IntensityScaleAndShiftNormalizer self)\n"
-		"IntensityScaleAndShiftNormalizer::~IntensityScaleAndShiftNormalizer() final\n"
-		"\n"
-		""},
-	 { "IntensityScaleAndShiftNormalizer_accept", _wrap_IntensityScaleAndShiftNormalizer_accept, METH_VARARGS, "\n"
-		"IntensityScaleAndShiftNormalizer_accept(IntensityScaleAndShiftNormalizer self, INodeVisitor visitor)\n"
-		"void IntensityScaleAndShiftNormalizer::accept(INodeVisitor *visitor) const final\n"
-		"\n"
-		"Calls the  INodeVisitor's visit method. \n"
-		"\n"
-		""},
-	 { "IntensityScaleAndShiftNormalizer_setMaximumIntensity", _wrap_IntensityScaleAndShiftNormalizer_setMaximumIntensity, METH_VARARGS, "\n"
-		"IntensityScaleAndShiftNormalizer_setMaximumIntensity(IntensityScaleAndShiftNormalizer self, double arg2)\n"
-		"void IntensityScaleAndShiftNormalizer::setMaximumIntensity(double) final\n"
-		"\n"
-		""},
-	 { "IntensityScaleAndShiftNormalizer_clone", _wrap_IntensityScaleAndShiftNormalizer_clone, METH_O, "\n"
-		"IntensityScaleAndShiftNormalizer_clone(IntensityScaleAndShiftNormalizer self) -> IntensityScaleAndShiftNormalizer\n"
-		"IntensityScaleAndShiftNormalizer* IntensityScaleAndShiftNormalizer::clone() const final\n"
-		"\n"
-		""},
-	 { "IntensityScaleAndShiftNormalizer_swigregister", IntensityScaleAndShiftNormalizer_swigregister, METH_O, NULL},
-	 { "IntensityScaleAndShiftNormalizer_swiginit", IntensityScaleAndShiftNormalizer_swiginit, METH_VARARGS, NULL},
 	 { "delete_IIntensityFunction", _wrap_delete_IIntensityFunction, METH_O, "\n"
 		"delete_IIntensityFunction(IIntensityFunction self)\n"
 		"IIntensityFunction::~IIntensityFunction()\n"
@@ -132239,7 +131429,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_Lattice2D", _wrap_delete_Lattice2D, METH_O, "delete_Lattice2D(Lattice2D self)"},
 	 { "Lattice2D_swigregister", Lattice2D_swigregister, METH_O, NULL},
 	 { "new_BasicLattice", _wrap_new_BasicLattice, METH_VARARGS, "\n"
-		"new_BasicLattice(double length1, double length2, double angle, double rotation_angle) -> BasicLattice\n"
+		"new_BasicLattice(double length1, double length2, double angle, double xi) -> BasicLattice\n"
 		"BasicLattice::BasicLattice(double length1, double length2, double angle, double rotation_angle=0.0)\n"
 		"\n"
 		""},
@@ -132279,7 +131469,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "BasicLattice_swigregister", BasicLattice_swigregister, METH_O, NULL},
 	 { "BasicLattice_swiginit", BasicLattice_swiginit, METH_VARARGS, NULL},
 	 { "new_SquareLattice", _wrap_new_SquareLattice, METH_VARARGS, "\n"
-		"SquareLattice(double length, double rotation_angle=0.0)\n"
+		"SquareLattice(double length, double xi=0.0)\n"
 		"SquareLattice::SquareLattice(double length, double rotation_angle=0.0)\n"
 		"\n"
 		""},
@@ -132319,7 +131509,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "SquareLattice_swigregister", SquareLattice_swigregister, METH_O, NULL},
 	 { "SquareLattice_swiginit", SquareLattice_swiginit, METH_VARARGS, NULL},
 	 { "new_HexagonalLattice", _wrap_new_HexagonalLattice, METH_VARARGS, "\n"
-		"new_HexagonalLattice(double length, double rotation_angle) -> HexagonalLattice\n"
+		"new_HexagonalLattice(double length, double xi) -> HexagonalLattice\n"
 		"HexagonalLattice::HexagonalLattice(double length, double rotation_angle=0.0)\n"
 		"\n"
 		""},
@@ -132921,11 +132111,11 @@ static void *_p_GaussFisherPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM
 static void *_p_LorentzFisherPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IPeakShape *) ((LorentzFisherPeakShape *) x));
 }
-static void *_p_VonMisesFisherGaussPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IPeakShape *) ((VonMisesFisherGaussPeakShape *) x));
+static void *_p_MisesFisherGaussPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IPeakShape *) ((MisesFisherGaussPeakShape *) x));
 }
-static void *_p_VonMisesGaussPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IPeakShape *) ((VonMisesGaussPeakShape *) x));
+static void *_p_MisesGaussPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IPeakShape *) ((MisesGaussPeakShape *) x));
 }
 static void *_p_FormFactorWeightedTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IFormFactor *) ((FormFactorWeighted *) x));
@@ -133080,15 +132270,6 @@ static void *_p_FormFactorHollowSphereTo_p_ICloneable(void *x, int *SWIGUNUSEDPA
 static void *_p_VerticalLineTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IShape2D *) ((VerticalLine *) x));
 }
-static void *_p_IntensityScaleAndShiftNormalizerTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (IIntensityNormalizer *)(IntensityNormalizer *) ((IntensityScaleAndShiftNormalizer *) x));
-}
-static void *_p_IntensityNormalizerTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (IIntensityNormalizer *) ((IntensityNormalizer *) x));
-}
-static void *_p_IIntensityNormalizerTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *)  ((IIntensityNormalizer *) x));
-}
 static void *_p_FTDecayFunction2DGaussTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IFTDecayFunction2D *) ((FTDecayFunction2DGauss *) x));
 }
@@ -133119,6 +132300,15 @@ static void *_p_FormFactorFullSpheroidTo_p_ICloneable(void *x, int *SWIGUNUSEDPA
 static void *_p_ISpecularScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((ISpecularScan *) x));
 }
+static void *_p_HexagonalLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Lattice2D *) ((HexagonalLattice *) x));
+}
+static void *_p_SquareLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Lattice2D *) ((SquareLattice *) x));
+}
+static void *_p_BasicLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Lattice2D *) ((BasicLattice *) x));
+}
 static void *_p_InterferenceFunctionFinite3DLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IInterferenceFunction *) ((InterferenceFunctionFinite3DLattice *) x));
 }
@@ -133140,15 +132330,6 @@ static void *_p_InterferenceFunction1DLatticeTo_p_ICloneable(void *x, int *SWIGU
 static void *_p_IShape2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((IShape2D *) x));
 }
-static void *_p_BasicLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (Lattice2D *) ((BasicLattice *) x));
-}
-static void *_p_SquareLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (Lattice2D *) ((SquareLattice *) x));
-}
-static void *_p_HexagonalLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (Lattice2D *) ((HexagonalLattice *) x));
-}
 static void *_p_FootprintSquareTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IFootprintFactor *) ((FootprintSquare *) x));
 }
@@ -133335,15 +132516,6 @@ static void *_p_InterferenceFunctionRadialParaCrystalTo_p_IInterferenceFunction(
 static void *_p_InterferenceFunctionTwinTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IInterferenceFunction *)  ((InterferenceFunctionTwin *) x));
 }
-static void *_p_IntensityScaleAndShiftNormalizerTo_p_IntensityNormalizer(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IntensityNormalizer *)  ((IntensityScaleAndShiftNormalizer *) x));
-}
-static void *_p_IntensityNormalizerTo_p_IIntensityNormalizer(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IIntensityNormalizer *)  ((IntensityNormalizer *) x));
-}
-static void *_p_IntensityScaleAndShiftNormalizerTo_p_IIntensityNormalizer(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IIntensityNormalizer *) (IntensityNormalizer *) ((IntensityScaleAndShiftNormalizer *) x));
-}
 static void *_p_FormFactorBoxTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorBox *) x));
 }
@@ -133392,15 +132564,6 @@ static void *_p_ILayoutTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemor
 static void *_p_FormFactorHemiEllipsoidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorHemiEllipsoid *) x));
 }
-static void *_p_IIntensityNormalizerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *) ((IIntensityNormalizer *) x));
-}
-static void *_p_IntensityNormalizerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(IIntensityNormalizer *) ((IntensityNormalizer *) x));
-}
-static void *_p_IntensityScaleAndShiftNormalizerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(IIntensityNormalizer *)(IntensityNormalizer *) ((IntensityScaleAndShiftNormalizer *) x));
-}
 static void *_p_INodeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *)  ((INode *) x));
 }
@@ -133419,11 +132582,11 @@ static void *_p_RectangularDetectorTo_p_IParameterized(void *x, int *SWIGUNUSEDP
 static void *_p_FormFactorRipple2BoxTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(ProfileRipple2 *) ((FormFactorRipple2Box *) x));
 }
-static void *_p_VonMisesGaussPeakShapeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IPeakShape *) ((VonMisesGaussPeakShape *) x));
+static void *_p_MisesGaussPeakShapeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (INode *)(ISample *)(IPeakShape *) ((MisesGaussPeakShape *) x));
 }
-static void *_p_VonMisesFisherGaussPeakShapeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IPeakShape *) ((VonMisesFisherGaussPeakShape *) x));
+static void *_p_MisesFisherGaussPeakShapeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (INode *)(ISample *)(IPeakShape *) ((MisesFisherGaussPeakShape *) x));
 }
 static void *_p_LorentzFisherPeakShapeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *)(ISample *)(IPeakShape *) ((LorentzFisherPeakShape *) x));
@@ -133965,11 +133128,11 @@ static void *_p_GaussFisherPeakShapeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(ne
 static void *_p_LorentzFisherPeakShapeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IPeakShape *) ((LorentzFisherPeakShape *) x));
 }
-static void *_p_VonMisesFisherGaussPeakShapeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IPeakShape *) ((VonMisesFisherGaussPeakShape *) x));
+static void *_p_MisesFisherGaussPeakShapeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IPeakShape *) ((MisesFisherGaussPeakShape *) x));
 }
-static void *_p_VonMisesGaussPeakShapeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IPeakShape *) ((VonMisesGaussPeakShape *) x));
+static void *_p_MisesGaussPeakShapeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IPeakShape *) ((MisesGaussPeakShape *) x));
 }
 static void *_p_FormFactorPrism3To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
@@ -134196,15 +133359,6 @@ static void *_p_ILayoutTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
 static void *_p_FormFactorHemiEllipsoidTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorHemiEllipsoid *) x));
 }
-static void *_p_IIntensityNormalizerTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *)  ((IIntensityNormalizer *) x));
-}
-static void *_p_IntensityNormalizerTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (IIntensityNormalizer *) ((IntensityNormalizer *) x));
-}
-static void *_p_IntensityScaleAndShiftNormalizerTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (IIntensityNormalizer *)(IntensityNormalizer *) ((IntensityScaleAndShiftNormalizer *) x));
-}
 static void *_p_IDetectorTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *)  ((IDetector *) x));
 }
@@ -134220,11 +133374,11 @@ static void *_p_RectangularDetectorTo_p_INode(void *x, int *SWIGUNUSEDPARM(newme
 static void *_p_FormFactorRipple2BoxTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(ProfileRipple2 *) ((FormFactorRipple2Box *) x));
 }
-static void *_p_VonMisesGaussPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IPeakShape *) ((VonMisesGaussPeakShape *) x));
+static void *_p_MisesGaussPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INode *) (ISample *)(IPeakShape *) ((MisesGaussPeakShape *) x));
 }
-static void *_p_VonMisesFisherGaussPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IPeakShape *) ((VonMisesFisherGaussPeakShape *) x));
+static void *_p_MisesFisherGaussPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INode *) (ISample *)(IPeakShape *) ((MisesFisherGaussPeakShape *) x));
 }
 static void *_p_LorentzFisherPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISample *)(IPeakShape *) ((LorentzFisherPeakShape *) x));
@@ -134625,11 +133779,11 @@ static void *_p_GaussFisherPeakShapeTo_p_IPeakShape(void *x, int *SWIGUNUSEDPARM
 static void *_p_LorentzFisherPeakShapeTo_p_IPeakShape(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IPeakShape *)  ((LorentzFisherPeakShape *) x));
 }
-static void *_p_VonMisesFisherGaussPeakShapeTo_p_IPeakShape(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IPeakShape *)  ((VonMisesFisherGaussPeakShape *) x));
+static void *_p_MisesFisherGaussPeakShapeTo_p_IPeakShape(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IPeakShape *)  ((MisesFisherGaussPeakShape *) x));
 }
-static void *_p_VonMisesGaussPeakShapeTo_p_IPeakShape(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IPeakShape *)  ((VonMisesGaussPeakShape *) x));
+static void *_p_MisesGaussPeakShapeTo_p_IPeakShape(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IPeakShape *)  ((MisesGaussPeakShape *) x));
 }
 static void *_p_ConstantBackgroundTo_p_IBackground(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IBackground *)  ((ConstantBackground *) x));
@@ -134888,7 +134042,6 @@ static swig_type_info _swigt__p_IFormFactorBorn = {"_p_IFormFactorBorn", "IFormF
 static swig_type_info _swigt__p_IFormFactorDecorator = {"_p_IFormFactorDecorator", "IFormFactorDecorator *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IHistogram = {"_p_IHistogram", "IHistogram *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IIntensityFunction = {"_p_IIntensityFunction", "IIntensityFunction *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_IIntensityNormalizer = {"_p_IIntensityNormalizer", "IIntensityNormalizer *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IInterferenceFunction = {"_p_IInterferenceFunction", "IInterferenceFunction *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ILatticeOrientation = {"_p_ILatticeOrientation", "ILatticeOrientation *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ILayout = {"_p_ILayout", "ILayout *", 0, 0, (void*)0, 0};
@@ -134915,8 +134068,6 @@ static swig_type_info _swigt__p_Instrument = {"_p_Instrument", "Instrument *", 0
 static swig_type_info _swigt__p_IntensityDataIOFactory = {"_p_IntensityDataIOFactory", "IntensityDataIOFactory *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IntensityFunctionLog = {"_p_IntensityFunctionLog", "IntensityFunctionLog *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IntensityFunctionSqrt = {"_p_IntensityFunctionSqrt", "IntensityFunctionSqrt *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_IntensityNormalizer = {"_p_IntensityNormalizer", "IntensityNormalizer *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_IntensityScaleAndShiftNormalizer = {"_p_IntensityScaleAndShiftNormalizer", "IntensityScaleAndShiftNormalizer *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_InterferenceFunction1DLattice = {"_p_InterferenceFunction1DLattice", "InterferenceFunction1DLattice *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_InterferenceFunction2DLattice = {"_p_InterferenceFunction2DLattice", "InterferenceFunction2DLattice *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_InterferenceFunction2DParaCrystal = {"_p_InterferenceFunction2DParaCrystal", "InterferenceFunction2DParaCrystal *", 0, 0, (void*)0, 0};
@@ -134944,6 +134095,8 @@ static swig_type_info _swigt__p_Material = {"_p_Material", "Material *", 0, 0, (
 static swig_type_info _swigt__p_MesoCrystal = {"_p_MesoCrystal", "MesoCrystal *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_MillerIndex = {"_p_MillerIndex", "MillerIndex *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_MillerIndexOrientation = {"_p_MillerIndexOrientation", "MillerIndexOrientation *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_MisesFisherGaussPeakShape = {"_p_MisesFisherGaussPeakShape", "MisesFisherGaussPeakShape *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_MisesGaussPeakShape = {"_p_MisesGaussPeakShape", "MisesGaussPeakShape *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_MultiLayer = {"_p_MultiLayer", "MultiLayer *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_NodeMeta = {"_p_NodeMeta", "NodeMeta *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_OffSpecSimulation = {"_p_OffSpecSimulation", "OffSpecSimulation *", 0, 0, (void*)0, 0};
@@ -135017,8 +134170,6 @@ static swig_type_info _swigt__p_VariableBinAxis = {"_p_VariableBinAxis", "Variab
 static swig_type_info _swigt__p_VarianceConstantFunction = {"_p_VarianceConstantFunction", "VarianceConstantFunction *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_VarianceSimFunction = {"_p_VarianceSimFunction", "VarianceSimFunction *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_VerticalLine = {"_p_VerticalLine", "VerticalLine *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_VonMisesFisherGaussPeakShape = {"_p_VonMisesFisherGaussPeakShape", "VonMisesFisherGaussPeakShape *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_VonMisesGaussPeakShape = {"_p_VonMisesGaussPeakShape", "VonMisesGaussPeakShape *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_WavevectorInfo = {"_p_WavevectorInfo", "WavevectorInfo *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ZLimits = {"_p_ZLimits", "ZLimits *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_allocator_type = {"_p_allocator_type", "allocator_type *", 0, 0, (void*)0, 0};
@@ -135232,7 +134383,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_IFormFactorDecorator,
   &_swigt__p_IHistogram,
   &_swigt__p_IIntensityFunction,
-  &_swigt__p_IIntensityNormalizer,
   &_swigt__p_IInterferenceFunction,
   &_swigt__p_ILatticeOrientation,
   &_swigt__p_ILayout,
@@ -135259,8 +134409,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_IntensityDataIOFactory,
   &_swigt__p_IntensityFunctionLog,
   &_swigt__p_IntensityFunctionSqrt,
-  &_swigt__p_IntensityNormalizer,
-  &_swigt__p_IntensityScaleAndShiftNormalizer,
   &_swigt__p_InterferenceFunction1DLattice,
   &_swigt__p_InterferenceFunction2DLattice,
   &_swigt__p_InterferenceFunction2DParaCrystal,
@@ -135288,6 +134436,8 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_MesoCrystal,
   &_swigt__p_MillerIndex,
   &_swigt__p_MillerIndexOrientation,
+  &_swigt__p_MisesFisherGaussPeakShape,
+  &_swigt__p_MisesGaussPeakShape,
   &_swigt__p_MultiLayer,
   &_swigt__p_NodeMeta,
   &_swigt__p_OffSpecSimulation,
@@ -135361,8 +134511,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_VarianceConstantFunction,
   &_swigt__p_VarianceSimFunction,
   &_swigt__p_VerticalLine,
-  &_swigt__p_VonMisesFisherGaussPeakShape,
-  &_swigt__p_VonMisesGaussPeakShape,
   &_swigt__p_WavevectorInfo,
   &_swigt__p_ZLimits,
   &_swigt__p_allocator_type,
@@ -135558,7 +134706,7 @@ static swig_cast_info _swigc__p_IAbstractParticle[] = {  {&_swigt__p_ParticleCom
 static swig_cast_info _swigc__p_IAxis[] = {  {&_swigt__p_IAxis, 0, 0, 0},  {&_swigt__p_VariableBinAxis, _p_VariableBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_ConstKBinAxis, _p_ConstKBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_CustomBinAxis, _p_CustomBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_FixedBinAxis, _p_FixedBinAxisTo_p_IAxis, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IBackground[] = {  {&_swigt__p_IBackground, 0, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_IBackground, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_IBackground, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IChiSquaredModule[] = {  {&_swigt__p_IChiSquaredModule, 0, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_IChiSquaredModule, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_Line, _p_LineTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionGate, _p_RangedDistributionGateTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_ICloneable, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_ICloneable, 0, 0},  {&_swigt__p_IUnitConverter, _p_IUnitConverterTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_VonMisesGaussPeakShape, _p_VonMisesGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_VonMisesFisherGaussPeakShape, _p_VonMisesFisherGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_IChiSquaredModule, _p_IChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistribution, _p_RangedDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_ProfileBar, _p_ProfileBarTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple2Gauss, _p_FormFactorRipple2GaussTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionGaussian, _p_RangedDistributionGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_ScanResolution, _p_ScanResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionCosine, _p_RangedDistributionCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_Polygon, _p_PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_ICloneable, 0, 0},  {&_swigt__p_QSpecScan, _p_QSpecScanTo_p_ICloneable, 0, 0},  {&_swigt__p_AngularSpecScan, _p_AngularSpecScanTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_VerticalLine, _p_VerticalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_IntensityScaleAndShiftNormalizer, _p_IntensityScaleAndShiftNormalizerTo_p_ICloneable, 0, 0},  {&_swigt__p_IntensityNormalizer, _p_IntensityNormalizerTo_p_ICloneable, 0, 0},  {&_swigt__p_IIntensityNormalizer, _p_IIntensityNormalizerTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ICloneable, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_ISpecularScan, _p_ISpecularScanTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_IShape2D, _p_IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_ICloneable, 0, 0},  {&_swigt__p_Rectangle, _p_RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_HorizontalLine, _p_HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ICloneable, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionLogNormal, _p_RangedDistributionLogNormalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_ProfileRipple1, _p_ProfileRipple1To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_ProfileRipple2, _p_ProfileRipple2To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionLorentz, _p_RangedDistributionLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple1Lorentz, _p_FormFactorRipple1LorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple2Lorentz, _p_FormFactorRipple2LorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple1Box, _p_FormFactorRipple1BoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple2Box, _p_FormFactorRipple2BoxTo_p_ICloneable, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple1Gauss, _p_FormFactorRipple1GaussTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Ellipse, _p_EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_Line, _p_LineTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionGate, _p_RangedDistributionGateTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_ICloneable, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_ICloneable, 0, 0},  {&_swigt__p_IUnitConverter, _p_IUnitConverterTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_IChiSquaredModule, _p_IChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistribution, _p_RangedDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_ProfileBar, _p_ProfileBarTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple2Gauss, _p_FormFactorRipple2GaussTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionGaussian, _p_RangedDistributionGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_ScanResolution, _p_ScanResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionCosine, _p_RangedDistributionCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_Polygon, _p_PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_ICloneable, 0, 0},  {&_swigt__p_QSpecScan, _p_QSpecScanTo_p_ICloneable, 0, 0},  {&_swigt__p_AngularSpecScan, _p_AngularSpecScanTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_VerticalLine, _p_VerticalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ICloneable, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_ISpecularScan, _p_ISpecularScanTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_IShape2D, _p_IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_ICloneable, 0, 0},  {&_swigt__p_Rectangle, _p_RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_HorizontalLine, _p_HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ICloneable, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionLogNormal, _p_RangedDistributionLogNormalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_ProfileRipple1, _p_ProfileRipple1To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_ProfileRipple2, _p_ProfileRipple2To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionLorentz, _p_RangedDistributionLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple1Lorentz, _p_FormFactorRipple1LorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple2Lorentz, _p_FormFactorRipple2LorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple1Box, _p_FormFactorRipple1BoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple2Box, _p_FormFactorRipple2BoxTo_p_ICloneable, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple1Gauss, _p_FormFactorRipple1GaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Ellipse, _p_EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IClusteredParticles[] = {  {&_swigt__p_IClusteredParticles, 0, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IClusteredParticles, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IDetector[] = {  {&_swigt__p_IDetector, 0, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IDetector, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IDetector, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IDetector, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IDetector, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IDetector2D[] = {  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IDetector2D, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IDetector2D, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IDetector2D, 0, 0},  {&_swigt__p_IDetector2D, 0, 0, 0},{0, 0, 0, 0}};
@@ -135576,23 +134724,22 @@ static swig_cast_info _swigc__p_IFormFactorBorn[] = {  {&_swigt__p_FormFactorPri
 static swig_cast_info _swigc__p_IFormFactorDecorator[] = {  {&_swigt__p_IFormFactorDecorator, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IHistogram[] = {  {&_swigt__p_IHistogram, 0, 0, 0},  {&_swigt__p_Histogram2D, _p_Histogram2DTo_p_IHistogram, 0, 0},  {&_swigt__p_Histogram1D, _p_Histogram1DTo_p_IHistogram, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IIntensityFunction[] = {  {&_swigt__p_IntensityFunctionSqrt, _p_IntensityFunctionSqrtTo_p_IIntensityFunction, 0, 0},  {&_swigt__p_IIntensityFunction, 0, 0, 0},  {&_swigt__p_IntensityFunctionLog, _p_IntensityFunctionLogTo_p_IIntensityFunction, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IIntensityNormalizer[] = {  {&_swigt__p_IIntensityNormalizer, 0, 0, 0},  {&_swigt__p_IntensityNormalizer, _p_IntensityNormalizerTo_p_IIntensityNormalizer, 0, 0},  {&_swigt__p_IntensityScaleAndShiftNormalizer, _p_IntensityScaleAndShiftNormalizerTo_p_IIntensityNormalizer, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IInterferenceFunction[] = {  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_IInterferenceFunction, 0, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_IInterferenceFunction, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ILatticeOrientation[] = {  {&_swigt__p_ILatticeOrientation, 0, 0, 0},  {&_swigt__p_MillerIndexOrientation, _p_MillerIndexOrientationTo_p_ILatticeOrientation, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ILayout[] = {  {&_swigt__p_ILayout, 0, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ILayout, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IMultiLayerBuilder[] = {  {&_swigt__p_IMultiLayerBuilder, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_INode[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INode, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_INode, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_INode, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INode, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_INode, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_INode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INode, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INode, 0, 0},  {&_swigt__p_IIntensityNormalizer, _p_IIntensityNormalizerTo_p_INode, 0, 0},  {&_swigt__p_IntensityNormalizer, _p_IntensityNormalizerTo_p_INode, 0, 0},  {&_swigt__p_IntensityScaleAndShiftNormalizer, _p_IntensityScaleAndShiftNormalizerTo_p_INode, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_INode, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_INode, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_INode, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_INode, 0, 0},  {&_swigt__p_INode, 0, 0, 0},  {&_swigt__p_FormFactorRipple2Box, _p_FormFactorRipple2BoxTo_p_INode, 0, 0},  {&_swigt__p_VonMisesGaussPeakShape, _p_VonMisesGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_VonMisesFisherGaussPeakShape, _p_VonMisesFisherGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INode, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INode, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_INode, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_INode, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_INode, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_INode, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INode, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INode, 0, 0},  {&_swigt__p_ProfileBar, _p_ProfileBarTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INode, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_INode, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INode, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_INode, 0, 0},  {&_swigt__p_FormFactorRipple1Box, _p_FormFactorRipple1BoxTo_p_INode, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INode, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INode, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INode, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_INode, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INode, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INode, 0, 0},  {&_swigt__p_FormFactorRipple2Gauss, _p_FormFactorRipple2GaussTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_INode, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_INode, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_INode, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_INode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INode, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_INode, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INode, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_INode, 0, 0},  {&_swigt__p_ProfileRipple1, _p_ProfileRipple1To_p_INode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INode, 0, 0},  {&_swigt__p_ProfileRipple2, _p_ProfileRipple2To_p_INode, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INode, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_INode, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_INode, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_INode, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INode, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_INode, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INode, 0, 0},  {&_swigt__p_FormFactorRipple1Gauss, _p_FormFactorRipple1GaussTo_p_INode, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_INode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INode, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INode, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INode, 0, 0},  {&_swigt__p_FormFactorRipple2Lorentz, _p_FormFactorRipple2LorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorRipple1Lorentz, _p_FormFactorRipple1LorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_INode, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_INode, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_INode, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_INode, 0, 0},  {&_swigt__p_Lattice, _p_LatticeTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INode, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_INode[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INode, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_INode, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_INode, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INode, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_INode, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_INode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INode, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INode, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_INode, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_INode, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_INode, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_INode, 0, 0},  {&_swigt__p_INode, 0, 0, 0},  {&_swigt__p_FormFactorRipple2Box, _p_FormFactorRipple2BoxTo_p_INode, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INode, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INode, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_INode, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_INode, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_INode, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_INode, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INode, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INode, 0, 0},  {&_swigt__p_ProfileBar, _p_ProfileBarTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INode, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_INode, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INode, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_INode, 0, 0},  {&_swigt__p_FormFactorRipple1Box, _p_FormFactorRipple1BoxTo_p_INode, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INode, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INode, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INode, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_INode, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INode, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INode, 0, 0},  {&_swigt__p_FormFactorRipple2Gauss, _p_FormFactorRipple2GaussTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_INode, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_INode, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_INode, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_INode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INode, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_INode, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INode, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_INode, 0, 0},  {&_swigt__p_ProfileRipple1, _p_ProfileRipple1To_p_INode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INode, 0, 0},  {&_swigt__p_ProfileRipple2, _p_ProfileRipple2To_p_INode, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INode, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_INode, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_INode, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_INode, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INode, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_INode, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INode, 0, 0},  {&_swigt__p_FormFactorRipple1Gauss, _p_FormFactorRipple1GaussTo_p_INode, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_INode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INode, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INode, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INode, 0, 0},  {&_swigt__p_FormFactorRipple2Lorentz, _p_FormFactorRipple2LorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorRipple1Lorentz, _p_FormFactorRipple1LorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_INode, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_INode, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_INode, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_INode, 0, 0},  {&_swigt__p_Lattice, _p_LatticeTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INode, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_INodeVisitor[] = {  {&_swigt__p_INodeVisitor, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IObservable[] = {  {&_swigt__p_IObservable, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IObserver[] = {  {&_swigt__p_IObserver, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IParameterT_double_t[] = {  {&_swigt__p_IParameterT_double_t, 0, 0, 0},  {&_swigt__p_RealParameter, _p_RealParameterTo_p_IParameterT_double_t, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IParameterized, 0, 0},  {&_swigt__p_IIntensityNormalizer, _p_IIntensityNormalizerTo_p_IParameterized, 0, 0},  {&_swigt__p_IntensityNormalizer, _p_IntensityNormalizerTo_p_IParameterized, 0, 0},  {&_swigt__p_IntensityScaleAndShiftNormalizer, _p_IntensityScaleAndShiftNormalizerTo_p_IParameterized, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_INode, _p_INodeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple2Box, _p_FormFactorRipple2BoxTo_p_IParameterized, 0, 0},  {&_swigt__p_VonMisesGaussPeakShape, _p_VonMisesGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_VonMisesFisherGaussPeakShape, _p_VonMisesFisherGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IParameterized, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IParameterized, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParameterized, 0, 0},  {&_swigt__p_ProfileBar, _p_ProfileBarTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_IParameterized, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple1Box, _p_FormFactorRipple1BoxTo_p_IParameterized, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IParameterized, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple2Gauss, _p_FormFactorRipple2GaussTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_IParameterized, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_IParameterized, 0, 0},  {&_swigt__p_IMultiLayerBuilder, _p_IMultiLayerBuilderTo_p_IParameterized, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_IParameterized, 0, 0},  {&_swigt__p_ProfileRipple1, _p_ProfileRipple1To_p_IParameterized, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_ProfileRipple2, _p_ProfileRipple2To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_IParameterized, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple1Gauss, _p_FormFactorRipple1GaussTo_p_IParameterized, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IParameterized, 0, 0},  {&_swigt__p_IParameterized, 0, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_IParameterized, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple2Lorentz, _p_FormFactorRipple2LorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple1Lorentz, _p_FormFactorRipple1LorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_Lattice, _p_LatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IParameterized, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IParameterized, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_INode, _p_INodeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple2Box, _p_FormFactorRipple2BoxTo_p_IParameterized, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IParameterized, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IParameterized, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParameterized, 0, 0},  {&_swigt__p_ProfileBar, _p_ProfileBarTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_IParameterized, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple1Box, _p_FormFactorRipple1BoxTo_p_IParameterized, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IParameterized, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple2Gauss, _p_FormFactorRipple2GaussTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_IParameterized, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_IParameterized, 0, 0},  {&_swigt__p_IMultiLayerBuilder, _p_IMultiLayerBuilderTo_p_IParameterized, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_IParameterized, 0, 0},  {&_swigt__p_ProfileRipple1, _p_ProfileRipple1To_p_IParameterized, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_ProfileRipple2, _p_ProfileRipple2To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_IParameterized, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple1Gauss, _p_FormFactorRipple1GaussTo_p_IParameterized, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IParameterized, 0, 0},  {&_swigt__p_IParameterized, 0, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_IParameterized, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple2Lorentz, _p_FormFactorRipple2LorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple1Lorentz, _p_FormFactorRipple1LorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_Lattice, _p_LatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IParameterized, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IParticle[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParticle, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParticle, 0, 0},  {&_swigt__p_IParticle, 0, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParticle, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParticle, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IPeakShape[] = {  {&_swigt__p_IPeakShape, 0, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_VonMisesFisherGaussPeakShape, _p_VonMisesFisherGaussPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_VonMisesGaussPeakShape, _p_VonMisesGaussPeakShapeTo_p_IPeakShape, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IPeakShape[] = {  {&_swigt__p_IPeakShape, 0, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_IPeakShape, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IPixel[] = {  {&_swigt__p_RectangularPixel, _p_RectangularPixelTo_p_IPixel, 0, 0},  {&_swigt__p_SphericalPixel, _p_SphericalPixelTo_p_IPixel, 0, 0},  {&_swigt__p_IPixel, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IResolutionFunction2D[] = {  {&_swigt__p_IResolutionFunction2D, 0, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IResolutionFunction2D, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IRotation[] = {  {&_swigt__p_RotationY, _p_RotationYTo_p_IRotation, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IRotation, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IRotation, 0, 0},  {&_swigt__p_IRotation, 0, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_IRotation, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IRotation, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ISample[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ISample, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ISample, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ISample, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ISample, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple2Box, _p_FormFactorRipple2BoxTo_p_ISample, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_VonMisesFisherGaussPeakShape, _p_VonMisesFisherGaussPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_VonMisesGaussPeakShape, _p_VonMisesGaussPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ISample, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ISample, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ISample, 0, 0},  {&_swigt__p_ProfileBar, _p_ProfileBarTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ISample, 0, 0},  {&_swigt__p_ISample, 0, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple1Box, _p_FormFactorRipple1BoxTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple2Gauss, _p_FormFactorRipple2GaussTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ISample, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ISample, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ISample, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ISample, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_ISample, 0, 0},  {&_swigt__p_ProfileRipple1, _p_ProfileRipple1To_p_ISample, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ISample, 0, 0},  {&_swigt__p_ProfileRipple2, _p_ProfileRipple2To_p_ISample, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ISample, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ISample, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple1Gauss, _p_FormFactorRipple1GaussTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_ISample, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ISample, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ISample, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple2Lorentz, _p_FormFactorRipple2LorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple1Lorentz, _p_FormFactorRipple1LorentzTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_ISample, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ISample[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ISample, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ISample, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ISample, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ISample, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple2Box, _p_FormFactorRipple2BoxTo_p_ISample, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ISample, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ISample, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ISample, 0, 0},  {&_swigt__p_ProfileBar, _p_ProfileBarTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ISample, 0, 0},  {&_swigt__p_ISample, 0, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple1Box, _p_FormFactorRipple1BoxTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple2Gauss, _p_FormFactorRipple2GaussTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ISample, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ISample, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ISample, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ISample, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_ISample, 0, 0},  {&_swigt__p_ProfileRipple1, _p_ProfileRipple1To_p_ISample, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ISample, 0, 0},  {&_swigt__p_ProfileRipple2, _p_ProfileRipple2To_p_ISample, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ISample, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ISample, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple1Gauss, _p_FormFactorRipple1GaussTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_ISample, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ISample, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ISample, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple2Lorentz, _p_FormFactorRipple2LorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple1Lorentz, _p_FormFactorRipple1LorentzTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_ISample, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISelectionRule[] = {  {&_swigt__p_ISelectionRule, 0, 0, 0},  {&_swigt__p_SimpleSelectionRule, _p_SimpleSelectionRuleTo_p_ISelectionRule, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IShape2D[] = {  {&_swigt__p_Polygon, _p_PolygonTo_p_IShape2D, 0, 0},  {&_swigt__p_Line, _p_LineTo_p_IShape2D, 0, 0},  {&_swigt__p_VerticalLine, _p_VerticalLineTo_p_IShape2D, 0, 0},  {&_swigt__p_Ellipse, _p_EllipseTo_p_IShape2D, 0, 0},  {&_swigt__p_HorizontalLine, _p_HorizontalLineTo_p_IShape2D, 0, 0},  {&_swigt__p_Rectangle, _p_RectangleTo_p_IShape2D, 0, 0},  {&_swigt__p_IShape2D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISpecularScan[] = {  {&_swigt__p_AngularSpecScan, _p_AngularSpecScanTo_p_ISpecularScan, 0, 0},  {&_swigt__p_QSpecScan, _p_QSpecScanTo_p_ISpecularScan, 0, 0},  {&_swigt__p_ISpecularScan, 0, 0, 0},{0, 0, 0, 0}};
@@ -135603,8 +134750,6 @@ static swig_cast_info _swigc__p_Instrument[] = {  {&_swigt__p_Instrument, 0, 0,
 static swig_cast_info _swigc__p_IntensityDataIOFactory[] = {  {&_swigt__p_IntensityDataIOFactory, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IntensityFunctionLog[] = {  {&_swigt__p_IntensityFunctionLog, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IntensityFunctionSqrt[] = {  {&_swigt__p_IntensityFunctionSqrt, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IntensityNormalizer[] = {  {&_swigt__p_IntensityNormalizer, 0, 0, 0},  {&_swigt__p_IntensityScaleAndShiftNormalizer, _p_IntensityScaleAndShiftNormalizerTo_p_IntensityNormalizer, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IntensityScaleAndShiftNormalizer[] = {  {&_swigt__p_IntensityScaleAndShiftNormalizer, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_InterferenceFunction1DLattice[] = {  {&_swigt__p_InterferenceFunction1DLattice, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_InterferenceFunction2DLattice[] = {  {&_swigt__p_InterferenceFunction2DLattice, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_InterferenceFunction2DParaCrystal[] = {  {&_swigt__p_InterferenceFunction2DParaCrystal, 0, 0, 0},{0, 0, 0, 0}};
@@ -135632,6 +134777,8 @@ static swig_cast_info _swigc__p_Material[] = {  {&_swigt__p_Material, 0, 0, 0},{
 static swig_cast_info _swigc__p_MesoCrystal[] = {  {&_swigt__p_MesoCrystal, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_MillerIndex[] = {  {&_swigt__p_MillerIndex, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_MillerIndexOrientation[] = {  {&_swigt__p_MillerIndexOrientation, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_MisesFisherGaussPeakShape[] = {  {&_swigt__p_MisesFisherGaussPeakShape, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_MisesGaussPeakShape[] = {  {&_swigt__p_MisesGaussPeakShape, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_MultiLayer[] = {  {&_swigt__p_MultiLayer, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_NodeMeta[] = {  {&_swigt__p_NodeMeta, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_OffSpecSimulation[] = {  {&_swigt__p_OffSpecSimulation, 0, 0, 0},{0, 0, 0, 0}};
@@ -135705,8 +134852,6 @@ static swig_cast_info _swigc__p_VariableBinAxis[] = {  {&_swigt__p_VariableBinAx
 static swig_cast_info _swigc__p_VarianceConstantFunction[] = {  {&_swigt__p_VarianceConstantFunction, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_VarianceSimFunction[] = {  {&_swigt__p_VarianceSimFunction, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_VerticalLine[] = {  {&_swigt__p_VerticalLine, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_VonMisesFisherGaussPeakShape[] = {  {&_swigt__p_VonMisesFisherGaussPeakShape, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_VonMisesGaussPeakShape[] = {  {&_swigt__p_VonMisesGaussPeakShape, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_WavevectorInfo[] = {  {&_swigt__p_WavevectorInfo, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ZLimits[] = {  {&_swigt__p_ZLimits, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_allocator_type[] = {  {&_swigt__p_allocator_type, 0, 0, 0},{0, 0, 0, 0}};
@@ -135920,7 +135065,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_IFormFactorDecorator,
   _swigc__p_IHistogram,
   _swigc__p_IIntensityFunction,
-  _swigc__p_IIntensityNormalizer,
   _swigc__p_IInterferenceFunction,
   _swigc__p_ILatticeOrientation,
   _swigc__p_ILayout,
@@ -135947,8 +135091,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_IntensityDataIOFactory,
   _swigc__p_IntensityFunctionLog,
   _swigc__p_IntensityFunctionSqrt,
-  _swigc__p_IntensityNormalizer,
-  _swigc__p_IntensityScaleAndShiftNormalizer,
   _swigc__p_InterferenceFunction1DLattice,
   _swigc__p_InterferenceFunction2DLattice,
   _swigc__p_InterferenceFunction2DParaCrystal,
@@ -135976,6 +135118,8 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_MesoCrystal,
   _swigc__p_MillerIndex,
   _swigc__p_MillerIndexOrientation,
+  _swigc__p_MisesFisherGaussPeakShape,
+  _swigc__p_MisesGaussPeakShape,
   _swigc__p_MultiLayer,
   _swigc__p_NodeMeta,
   _swigc__p_OffSpecSimulation,
@@ -136049,8 +135193,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_VarianceConstantFunction,
   _swigc__p_VarianceSimFunction,
   _swigc__p_VerticalLine,
-  _swigc__p_VonMisesFisherGaussPeakShape,
-  _swigc__p_VonMisesGaussPeakShape,
   _swigc__p_WavevectorInfo,
   _swigc__p_ZLimits,
   _swigc__p_allocator_type,
diff --git a/auto/Wrap/libBornAgainCore_wrap.h b/auto/Wrap/libBornAgainCore_wrap.h
index 6be650fb65d92d5109bfe24b902e52e3000f5d9f..8fbe15520695e753a7dce723eac7ac3bdd8a19b2 100644
--- a/auto/Wrap/libBornAgainCore_wrap.h
+++ b/auto/Wrap/libBornAgainCore_wrap.h
@@ -419,8 +419,8 @@ private:
 class SwigDirector_IInterferenceFunction : public IInterferenceFunction, public Swig::Director {
 
 public:
-    SwigDirector_IInterferenceFunction(PyObject *self);
-    SwigDirector_IInterferenceFunction(PyObject *self, IInterferenceFunction const &other);
+    SwigDirector_IInterferenceFunction(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues);
+    SwigDirector_IInterferenceFunction(PyObject *self, double position_var);
     virtual ~SwigDirector_IInterferenceFunction();
     virtual IInterferenceFunction *clone() const;
     virtual void transferToCPP();