From 14f412ba36d1563083d183c75a56d8238721fb4a Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Mon, 22 Aug 2016 14:09:34 +0200
Subject: [PATCH] New file IAbstractParticle.h separated from IParticle.h. rm
 unused includes. virtual -> final or nil.

---
 Core/Aggregate/IInterferenceFunction.cpp      |  22 -
 Core/Aggregate/IInterferenceFunction.h        |  16 +-
 .../Aggregate/InterferenceFunction1DLattice.h |   1 -
 Core/Aggregate/ParticleLayout.h               |   1 -
 Core/Multilayer/Layer.h                       |  57 +-
 Core/Particle/IAbstractParticle.h             |  54 ++
 Core/Particle/IParticle.cpp                   |   2 +-
 Core/Particle/IParticle.h                     |  49 +-
 Core/Particle/ParticleDistribution.cpp        |   3 +-
 Core/Particle/ParticleDistribution.h          |   8 +-
 Core/Scattering/ICompositeSample.h            |   2 -
 Core/Scattering/ISample.h                     |   1 -
 Core/Scattering/Rotations.h                   |  10 +-
 auto/Wrap/doxygen_core.i                      | 116 ++-
 auto/Wrap/libBornAgainCore.py                 | 238 ++-----
 auto/Wrap/libBornAgainCore_wrap.cpp           | 671 ++++--------------
 16 files changed, 346 insertions(+), 905 deletions(-)
 delete mode 100644 Core/Aggregate/IInterferenceFunction.cpp
 create mode 100644 Core/Particle/IAbstractParticle.h

diff --git a/Core/Aggregate/IInterferenceFunction.cpp b/Core/Aggregate/IInterferenceFunction.cpp
deleted file mode 100644
index 510bc0dc3e7..00000000000
--- a/Core/Aggregate/IInterferenceFunction.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Core/Aggregate/IInterferenceFunction.cpp
-//! @brief     Implements interface class IInterferenceFunction.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2016
-//! @authors   Scientific Computing Group at MLZ Garching
-//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
-//
-// ************************************************************************** //
-
-#include "IInterferenceFunction.h"
-#include "ISampleVisitor.h"
-#include "RealParameter.h"
-
-IInterferenceFunction::~IInterferenceFunction() {}
-
-void IInterferenceFunction::accept(ISampleVisitor *visitor) const { visitor->visit(this); }
diff --git a/Core/Aggregate/IInterferenceFunction.h b/Core/Aggregate/IInterferenceFunction.h
index 5333b786745..b7168aa8bd8 100644
--- a/Core/Aggregate/IInterferenceFunction.h
+++ b/Core/Aggregate/IInterferenceFunction.h
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
 //! @file      Core/Aggregate/IInterferenceFunction.h
-//! @brief     Defines interface class IInterferenceFunction.
+//! @brief     Defines and implements the interface class IInterferenceFunction.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -19,25 +19,21 @@
 #include "ISample.h"
 #include "Vectors3D.h"
 
-class ISampleVisitor;
-
-//! Interface to interference functions.
+//! Pure virtual base class of interference functions.
 //! @ingroup distribution_internal
 
 class BA_CORE_API_ IInterferenceFunction : public ISample
 {
 public:
-    virtual ~IInterferenceFunction();
+    virtual ~IInterferenceFunction() {}
+
+    virtual IInterferenceFunction* clone() const=0;
+    virtual void accept(ISampleVisitor* visitor) const =0;
 
     //! Evaluates the interference function for a given wavevector transfer (only the real
     //! x and y components are relevant)
     virtual double evaluate(const kvector_t q) const=0;
 
-    virtual IInterferenceFunction* clone() const=0;
-
-    //! Calls ISampleVisitor::visit
-    virtual void accept(ISampleVisitor* visitor) const;
-
     //! Retrieves the size-distance coupling constant (default 0.0)
     virtual double getKappa() const { return 0.0; }
 
diff --git a/Core/Aggregate/InterferenceFunction1DLattice.h b/Core/Aggregate/InterferenceFunction1DLattice.h
index c67ea4f5538..67f1ffbde0d 100644
--- a/Core/Aggregate/InterferenceFunction1DLattice.h
+++ b/Core/Aggregate/InterferenceFunction1DLattice.h
@@ -19,7 +19,6 @@
 #include "IInterferenceFunction.h"
 #include "Lattice1DParameters.h"
 
-class ISampleVisitor;
 class IFTDecayFunction1D;
 
 //! Interference function of 1D lattice.
diff --git a/Core/Aggregate/ParticleLayout.h b/Core/Aggregate/ParticleLayout.h
index 73fa1034525..b2ad2dd017d 100644
--- a/Core/Aggregate/ParticleLayout.h
+++ b/Core/Aggregate/ParticleLayout.h
@@ -23,7 +23,6 @@
 class IAbstractParticle;
 class IInterferenceFunction;
 class IParticle;
-class ISampleVisitor;
 
 //! Decorator class that adds particles to ISample objects.
 //! @ingroup samples
diff --git a/Core/Multilayer/Layer.h b/Core/Multilayer/Layer.h
index cf9361279fe..7895bd5a3cf 100644
--- a/Core/Multilayer/Layer.h
+++ b/Core/Multilayer/Layer.h
@@ -22,11 +22,9 @@
 
 class ILayout;
 class IMaterial;
-class ISampleVisitor;
 
-//! @class Layer
+//! A layer, with thickness (in nanometer) and material.
 //! @ingroup samples
-//! @brief A layer with thickness and material
 
 class BA_CORE_API_ Layer : public ICompositeSample
 {
@@ -37,51 +35,31 @@ public:
     //! Constructs layer made of _material_ with _thickness_ in nanometers and decoration
     Layer(const IMaterial& material, double thickness = 0);
 
-    virtual ~Layer();
+    ~Layer() final;
 
     Layer* clone() const final { return new Layer(*this); }
+    Layer* cloneInvertB() const final;
 
-    //! Returns a clone with inverted magnetic fields
-    virtual Layer* cloneInvertB() const;
+    void accept(ISampleVisitor* visitor) const final { visitor->visit(this); }
 
-    //! Calls the ISampleVisitor's visit method
-    void accept(class ISampleVisitor* visitor) const final { visitor->visit(this); }
+    std::string to_str(int indent=0) const final;
 
-    //! Returns textual representation of *this and its descendants.
-    virtual std::string to_str(int indent=0) const;
+    void setThickness(double thickness);
+    double getThickness() const { return m_thickness; }
 
-    //! Sets layer thickness in nanometers.
-    virtual void setThickness(double thickness);
+    void setMaterial(const IMaterial& material);
+    void setMaterialAndThickness(const IMaterial& material, double thickness);
+    const IMaterial* getMaterial() const { return mp_material; }
 
-    //! Returns layer thickness in nanometers.
-    virtual double getThickness() const { return m_thickness; }
+    complex_t getRefractiveIndex() const;
+    complex_t getRefractiveIndex2() const; //!< squared refractive index
 
-    //! Sets _material_ of the layer.
-    virtual void setMaterial(const IMaterial& material);
-
-    //! Sets _material_ and _thickness_.
-    virtual void setMaterialAndThickness(const IMaterial& material, double thickness);
-
-    //! Returns layer's material.
-    const IMaterial* getMaterial() const final { return mp_material; }
-
-    //! Returns refractive index of the layer's material.
-    virtual complex_t getRefractiveIndex() const;
-
-    //! Returns squared refractive index of the layer's material.
-    complex_t getRefractiveIndex2() const;
-
-    //! sets particle layout
-    virtual void addLayout(const ILayout& decoration);
-
-    //! gets number of layouts present
+    void addLayout(const ILayout& decoration);
     size_t getNumberOfLayouts() const { return m_layouts.size(); }
-
-    //! returns particle decoration
-    virtual const ILayout* getLayout(size_t i) const;
+    const ILayout* getLayout(size_t i) const;
 
     //! Returns true if decoration is present
-    virtual bool hasDWBASimulation() const { return m_layouts.size()>0; }
+    bool hasDWBASimulation() const { return m_layouts.size()>0; }
 
     double getTotalParticleSurfaceDensity(size_t layout_index) const;
 
@@ -90,7 +68,7 @@ public:
     void setNumberOfLayers(size_t n_layers) { mn_layers = n_layers; }
     size_t getNumberOfLayers() const { return mn_layers; }
 
-protected:
+private:
     Layer(const Layer& other);
 
     void init_parameters();
@@ -98,14 +76,13 @@ protected:
     void print(std::ostream& ostr) const;
 
     //! adds particle layout (separate pointer version due to python-bindings)
-    virtual void addLayoutPtr(class ILayout* layout);
+    void addLayoutPtr(ILayout* layout);
 
     double m_thickness;       //!< layer thickness in nanometers
     IMaterial* mp_material;   //!< pointer to the material
     SafePointerVector<class ILayout> m_layouts; //!< independent layouts in this layer
     size_t mn_layers;
 
-private:
     void initialize();
 };
 
diff --git a/Core/Particle/IAbstractParticle.h b/Core/Particle/IAbstractParticle.h
new file mode 100644
index 00000000000..783017cc26d
--- /dev/null
+++ b/Core/Particle/IAbstractParticle.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/IAbstractParticle.h
+//! @brief     Defines interface IAParticle.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IABSTRACTPARTICLE_H
+#define IABSTRACTPARTICLE_H
+
+#include "ICompositeSample.h"
+#include "Vectors3D.h"
+#include <memory>
+
+class IMaterial;
+
+//! Interface for a generic particle.
+//!
+//! Inherited by IParticle and ParticleDistribution.
+
+//! @ingroup samples
+
+class BA_CORE_API_ IAbstractParticle : public ICompositeSample
+{
+public:
+    IAbstractParticle() : m_abundance(1.0) {}
+    virtual ~IAbstractParticle() {}
+
+    virtual IAbstractParticle* clone() const =0;
+    virtual IAbstractParticle* cloneInvertB() const =0;
+
+    virtual void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    //! Sets the refractive index of the ambient material (which influences its scattering power)
+    virtual void setAmbientMaterial(const IMaterial&) =0;
+
+    double getAbundance() const { return m_abundance; }
+    void setAbundance(double abundance) { m_abundance = abundance; }
+
+    virtual const IMaterial* getAmbientMaterial() const =0;
+
+protected:
+    double m_abundance;
+};
+
+#endif // IABSTRACTPARTICLE_H
diff --git a/Core/Particle/IParticle.cpp b/Core/Particle/IParticle.cpp
index 2036b8b8501..1797c7e5fe6 100644
--- a/Core/Particle/IParticle.cpp
+++ b/Core/Particle/IParticle.cpp
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
 //! @file      Core/Particle/IParticle.cpp
-//! @brief     Implements generic member functions of IParticle.
+//! @brief     Implements interface IParticle.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
diff --git a/Core/Particle/IParticle.h b/Core/Particle/IParticle.h
index 1621a4b01fe..d1752e17ab5 100644
--- a/Core/Particle/IParticle.h
+++ b/Core/Particle/IParticle.h
@@ -16,69 +16,36 @@
 #ifndef IPARTICLE_H
 #define IPARTICLE_H
 
-#include "ICompositeSample.h"
+#include "IAbstractParticle.h"
 #include "Rotations.h"
 #include "Vectors3D.h"
 #include <memory>
 
-class IMaterial;
-class ISampleVisitor;
 
-//! @class IAbstractParticle
-//! @ingroup samples
-//! @brief Interface for a generic particle
-
-class BA_CORE_API_ IAbstractParticle : public ICompositeSample
-{
-public:
-    IAbstractParticle() : m_abundance(1.0) {}
-    virtual ~IAbstractParticle() {}
-    virtual IAbstractParticle* clone() const = 0;
-
-    //! Returns a clone with inverted magnetic fields
-    virtual IAbstractParticle* cloneInvertB() const = 0;
-
-    //! calls the ISampleVisitor's visit method
-    virtual void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
-
-    //! Sets the refractive index of the ambient material (which influences its scattering power)
-    virtual void setAmbientMaterial(const IMaterial&) {}
-
-    //! Returns abundance.
-    double getAbundance() const { return m_abundance; }
-
-    //! Sets abundance.
-    void setAbundance(double abundance) { m_abundance = abundance; }
-
-    //! Returns particle's material.
-    virtual const IMaterial* getAmbientMaterial() const = 0;
-
-protected:
-    double m_abundance;
-};
+//! Interface for a real particle (one that has position/rotation and form factor).
+//!
+//! Inherited by Particle, ParticleComposition, ParticleCoreShell, MesoCrystal.
 
-//! @class IParticle
 //! @ingroup samples
-//! @brief Interface for a real particle (one that has position/rotation and form factor)
 
 class BA_CORE_API_ IParticle : public IAbstractParticle
 {
 public:
     virtual ~IParticle() {}
-    virtual IParticle* clone() const = 0;
+    virtual IParticle* clone() const =0;
 
     //! Returns a clone with inverted magnetic fields
-    virtual IParticle* cloneInvertB() const = 0;
+    virtual IParticle* cloneInvertB() const =0;
 
     //! calls the ISampleVisitor's visit method
-    virtual void accept(class ISampleVisitor* visitor) const { visitor->visit(this); }
+    virtual void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
 
     //! Create a form factor for this particle
     IFormFactor* createFormFactor() const;
 
     //! Create a form factor for this particle with an extra scattering factor
     virtual IFormFactor* createTransformedFormFactor(
-        const IRotation* p_rotation, kvector_t translation) const = 0;
+        const IRotation* p_rotation, kvector_t translation) const =0;
 
     //! Returns particle position.
     kvector_t getPosition() const { return m_position; }
diff --git a/Core/Particle/ParticleDistribution.cpp b/Core/Particle/ParticleDistribution.cpp
index cc5f586d582..fdfef3b9a19 100644
--- a/Core/Particle/ParticleDistribution.cpp
+++ b/Core/Particle/ParticleDistribution.cpp
@@ -16,9 +16,10 @@
 #include "ParticleDistribution.h"
 #include "BornAgainNamespace.h"
 #include "Exceptions.h"
-#include "RealParameter.h"
+#include "IParticle.h"
 #include "ParameterPool.h"
 #include "ParameterSample.h"
+#include "RealParameter.h"
 #include <map>
 
 ParticleDistribution::ParticleDistribution(const IParticle& prototype,
diff --git a/Core/Particle/ParticleDistribution.h b/Core/Particle/ParticleDistribution.h
index c1032a71a57..26e84387b9d 100644
--- a/Core/Particle/ParticleDistribution.h
+++ b/Core/Particle/ParticleDistribution.h
@@ -16,12 +16,14 @@
 #ifndef PARTICLEDISTRIBUTION_H
 #define PARTICLEDISTRIBUTION_H
 
-#include "IParticle.h"
+#include "IAbstractParticle.h"
 #include "ParameterDistribution.h"
 
-//! @class ParticleDistribution
-//! @ingroup samples
+class IParticle;
+
 //! @brief A particle with a form factor and refractive index
+//! ParticleDistribution
+//! @ingroup samples
 
 class BA_CORE_API_ ParticleDistribution : public IAbstractParticle
 {
diff --git a/Core/Scattering/ICompositeSample.h b/Core/Scattering/ICompositeSample.h
index 2863d9d3ec2..f48d36c131b 100644
--- a/Core/Scattering/ICompositeSample.h
+++ b/Core/Scattering/ICompositeSample.h
@@ -18,8 +18,6 @@
 
 #include "ISample.h"
 
-class ISampleVisitor;
-
 //! Pure virtual base class for tree-like composite samples.
 //!
 //! Inherited by IAbstractParticle, IClusteredParticle, ILayout, ILayer, IMultiLayer.
diff --git a/Core/Scattering/ISample.h b/Core/Scattering/ISample.h
index 5b86daf9014..4cc2a33b282 100644
--- a/Core/Scattering/ISample.h
+++ b/Core/Scattering/ISample.h
@@ -22,7 +22,6 @@
 #include <vector>
 
 class IMaterial;
-class ISampleVisitor;
 
 //! Pure virtual base class for sample components and properties related to scattering.
 //!
diff --git a/Core/Scattering/Rotations.h b/Core/Scattering/Rotations.h
index a26e2153e4b..95564abc554 100644
--- a/Core/Scattering/Rotations.h
+++ b/Core/Scattering/Rotations.h
@@ -38,7 +38,7 @@ public:
     virtual IRotation* createInverse() const=0;
 
     //! Calls the ISampleVisitor's visit method
-    void accept(class ISampleVisitor* visitor) const { visitor->visit(this); }
+    void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
 
     //! Returns transformation.
     virtual Geometry::Transform3D getTransform3D() const=0;
@@ -58,7 +58,7 @@ public:
     RotationX* cloneInvertB() const { return clone(); }
     RotationX* createInverse() const { return new RotationX(-m_angle); }
 
-    void accept(class ISampleVisitor* visitor) const { visitor->visit(this); }
+    void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
 
     double getAngle() const { return m_angle; }
 
@@ -77,7 +77,7 @@ public:
     RotationY* cloneInvertB() const { return clone(); }
     RotationY* createInverse() const { return new RotationY(-m_angle); }
 
-    void accept(class ISampleVisitor* visitor) const { visitor->visit(this); }
+    void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
 
     double getAngle() const { return m_angle; }
 
@@ -96,7 +96,7 @@ public:
     RotationZ* cloneInvertB() const { return clone(); }
     RotationZ* createInverse() const { return new RotationZ(-m_angle); }
 
-    void accept(class ISampleVisitor* visitor) const { visitor->visit(this); }
+    void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
 
     double getAngle() const { return m_angle; }
 
@@ -115,7 +115,7 @@ public:
     RotationEuler* cloneInvertB() const { return clone(); }
     IRotation* createInverse() const;
 
-    void accept(class ISampleVisitor* visitor) const { visitor->visit(this); }
+    void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
 
     double getAlpha() const { return m_alpha; }
     double getBeta() const { return m_beta; }
diff --git a/auto/Wrap/doxygen_core.i b/auto/Wrap/doxygen_core.i
index cf49217fc28..6151ca29796 100644
--- a/auto/Wrap/doxygen_core.i
+++ b/auto/Wrap/doxygen_core.i
@@ -5424,7 +5424,9 @@ Returns true if area defined by two bins is inside or on border of polygon (more
 
 Interface for a generic particle.
 
-C++ includes: IParticle.h
+Inherited by  IParticle and  ParticleDistribution.
+
+C++ includes: IAbstractParticle.h
 ";
 
 %feature("docstring")  IAbstractParticle::IAbstractParticle "IAbstractParticle::IAbstractParticle()
@@ -5445,27 +5447,23 @@ Returns a clone with inverted magnetic fields.
 
 %feature("docstring")  IAbstractParticle::accept "virtual void IAbstractParticle::accept(ISampleVisitor *visitor) const
 
-calls the  ISampleVisitor's visit method 
+Calls the  ISampleVisitor's visit method. 
 ";
 
-%feature("docstring")  IAbstractParticle::setAmbientMaterial "virtual void IAbstractParticle::setAmbientMaterial(const IMaterial &)
+%feature("docstring")  IAbstractParticle::setAmbientMaterial "virtual void IAbstractParticle::setAmbientMaterial(const IMaterial &)=0
 
 Sets the refractive index of the ambient material (which influences its scattering power) 
 ";
 
-%feature("docstring")  IAbstractParticle::getAbundance "double IAbstractParticle::getAbundance() const
-
-Returns abundance. 
+%feature("docstring")  IAbstractParticle::getAbundance "double IAbstractParticle::getAbundance() const 
 ";
 
 %feature("docstring")  IAbstractParticle::setAbundance "void IAbstractParticle::setAbundance(double abundance)
-
-Sets abundance. 
 ";
 
 %feature("docstring")  IAbstractParticle::getAmbientMaterial "virtual const IMaterial* IAbstractParticle::getAmbientMaterial() const =0
 
-Returns particle's material. 
+Returns nullptr, unless overwritten to return a specific material. 
 ";
 
 
@@ -6726,27 +6724,27 @@ C++ includes: IIntensityNormalizer.h
 // File: classIInterferenceFunction.xml
 %feature("docstring") IInterferenceFunction "
 
-Interface to interference functions.
+Pure virtual base class of interference functions.
 
 C++ includes: IInterferenceFunction.h
 ";
 
-%feature("docstring")  IInterferenceFunction::~IInterferenceFunction "IInterferenceFunction::~IInterferenceFunction()
+%feature("docstring")  IInterferenceFunction::~IInterferenceFunction "virtual IInterferenceFunction::~IInterferenceFunction()
 ";
 
-%feature("docstring")  IInterferenceFunction::evaluate "virtual double IInterferenceFunction::evaluate(const kvector_t q) const =0
+%feature("docstring")  IInterferenceFunction::clone "virtual IInterferenceFunction* IInterferenceFunction::clone() const =0
 
-Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+Returns a clone of this  ISample object. 
 ";
 
-%feature("docstring")  IInterferenceFunction::clone "virtual IInterferenceFunction* IInterferenceFunction::clone() const =0
+%feature("docstring")  IInterferenceFunction::accept "virtual void IInterferenceFunction::accept(ISampleVisitor *visitor) const =0
 
-Returns a clone of this  ISample object. 
+Calls the  ISampleVisitor's visit method. 
 ";
 
-%feature("docstring")  IInterferenceFunction::accept "void IInterferenceFunction::accept(ISampleVisitor *visitor) const
+%feature("docstring")  IInterferenceFunction::evaluate "virtual double IInterferenceFunction::evaluate(const kvector_t q) const =0
 
-Calls ISampleVisitor::visit. 
+Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
 ";
 
 %feature("docstring")  IInterferenceFunction::getKappa "virtual double IInterferenceFunction::getKappa() const
@@ -7380,7 +7378,7 @@ Returns a clone of this  ISample object.
 
 %feature("docstring")  InterferenceFunction1DLattice::accept "void InterferenceFunction1DLattice::accept(ISampleVisitor *visitor) const final
 
-Calls ISampleVisitor::visit. 
+Calls the  ISampleVisitor's visit method. 
 ";
 
 %feature("docstring")  InterferenceFunction1DLattice::setDecayFunction "void InterferenceFunction1DLattice::setDecayFunction(const IFTDecayFunction1D &pdf)
@@ -7434,7 +7432,7 @@ Returns a clone of this  ISample object.
 
 %feature("docstring")  InterferenceFunction2DLattice::accept "void InterferenceFunction2DLattice::accept(ISampleVisitor *visitor) const final
 
-Calls ISampleVisitor::visit. 
+Calls the  ISampleVisitor's visit method. 
 ";
 
 %feature("docstring")  InterferenceFunction2DLattice::setDecayFunction "void InterferenceFunction2DLattice::setDecayFunction(const IFTDecayFunction2D &pdf)
@@ -7501,7 +7499,7 @@ Returns a clone of this  ISample object.
 
 %feature("docstring")  InterferenceFunction2DParaCrystal::accept "void InterferenceFunction2DParaCrystal::accept(ISampleVisitor *visitor) const final
 
-Calls ISampleVisitor::visit. 
+Calls the  ISampleVisitor's visit method. 
 ";
 
 %feature("docstring")  InterferenceFunction2DParaCrystal::to_str "std::string InterferenceFunction2DParaCrystal::to_str(int indent=0) const final
@@ -7591,7 +7589,7 @@ Returns a clone of this  ISample object.
 
 %feature("docstring")  InterferenceFunctionNone::accept "void InterferenceFunctionNone::accept(ISampleVisitor *visitor) const final
 
-Calls ISampleVisitor::visit. 
+Calls the  ISampleVisitor's visit method. 
 ";
 
 %feature("docstring")  InterferenceFunctionNone::evaluate "double InterferenceFunctionNone::evaluate(const kvector_t) const final
@@ -7618,7 +7616,7 @@ Returns a clone of this  ISample object.
 
 %feature("docstring")  InterferenceFunctionRadialParaCrystal::accept "void InterferenceFunctionRadialParaCrystal::accept(ISampleVisitor *visitor) const final
 
-Calls ISampleVisitor::visit. 
+Calls the  ISampleVisitor's visit method. 
 ";
 
 %feature("docstring")  InterferenceFunctionRadialParaCrystal::to_str "std::string InterferenceFunctionRadialParaCrystal::to_str(int indent=0) const final
@@ -7785,7 +7783,9 @@ Copies local parameters to external_pool, under name \"path/<name>copy_number/\"
 // File: classIParticle.xml
 %feature("docstring") IParticle "
 
-Interface for a real particle (one that has position/rotation and form factor)
+Interface for a real particle (one that has position/rotation and form factor).
+
+Inherited by  Particle,  ParticleComposition,  ParticleCoreShell,  MesoCrystal.
 
 C++ includes: IParticle.h
 ";
@@ -7803,7 +7803,7 @@ Returns a clone of this  ISample object.
 Returns a clone with inverted magnetic fields. 
 ";
 
-%feature("docstring")  IParticle::accept "virtual void IParticle::accept(class ISampleVisitor *visitor) const
+%feature("docstring")  IParticle::accept "virtual void IParticle::accept(ISampleVisitor *visitor) const
 
 calls the  ISampleVisitor's visit method 
 ";
@@ -7927,7 +7927,7 @@ Returns a clone with inverted magnetic fields.
 Returns a new  IRotation object that is the current object's inverse. 
 ";
 
-%feature("docstring")  IRotation::accept "void IRotation::accept(class ISampleVisitor *visitor) const
+%feature("docstring")  IRotation::accept "void IRotation::accept(ISampleVisitor *visitor) const
 
 Calls the  ISampleVisitor's visit method. 
 ";
@@ -8759,7 +8759,7 @@ C++ includes: Lattice2DParameters.h
 // File: classLayer.xml
 %feature("docstring") Layer "
 
-A layer with thickness and material.
+A layer, with thickness (in nanometer) and material.
 
 C++ includes: Layer.h
 ";
@@ -8774,7 +8774,7 @@ Constructs empty layer.
 Constructs layer made of  material with  thickness in nanometers and decoration. 
 ";
 
-%feature("docstring")  Layer::~Layer "Layer::~Layer()
+%feature("docstring")  Layer::~Layer "Layer::~Layer() final
 ";
 
 %feature("docstring")  Layer::clone "Layer* Layer::clone() const final
@@ -8782,19 +8782,19 @@ Constructs layer made of  material with  thickness in nanometers and decoration.
 Returns a clone of this  ISample object. 
 ";
 
-%feature("docstring")  Layer::cloneInvertB "Layer * Layer::cloneInvertB() const
+%feature("docstring")  Layer::cloneInvertB "Layer * Layer::cloneInvertB() const final
 
 Returns a clone with inverted magnetic fields. 
 ";
 
-%feature("docstring")  Layer::accept "void Layer::accept(class ISampleVisitor *visitor) const final
+%feature("docstring")  Layer::accept "void Layer::accept(ISampleVisitor *visitor) const final
 
 Calls the  ISampleVisitor's visit method. 
 ";
 
-%feature("docstring")  Layer::to_str "std::string Layer::to_str(int indent=0) const
+%feature("docstring")  Layer::to_str "std::string Layer::to_str(int indent=0) const final
 
-Returns textual representation of *this and its descendants. 
+Returns textual representation of this and its descendants. 
 ";
 
 %feature("docstring")  Layer::setThickness "void Layer::setThickness(double thickness)
@@ -8802,9 +8802,7 @@ Returns textual representation of *this and its descendants.
 Sets layer thickness in nanometers. 
 ";
 
-%feature("docstring")  Layer::getThickness "virtual double Layer::getThickness() const
-
-Returns layer thickness in nanometers. 
+%feature("docstring")  Layer::getThickness "double Layer::getThickness() const 
 ";
 
 %feature("docstring")  Layer::setMaterial "void Layer::setMaterial(const IMaterial &material)
@@ -8813,41 +8811,31 @@ Sets  material of the layer.
 ";
 
 %feature("docstring")  Layer::setMaterialAndThickness "void Layer::setMaterialAndThickness(const IMaterial &material, double thickness)
-
-Sets  material and  thickness. 
 ";
 
-%feature("docstring")  Layer::getMaterial "const IMaterial* Layer::getMaterial() const final
+%feature("docstring")  Layer::getMaterial "const IMaterial* Layer::getMaterial() const
 
-Returns layer's material. 
+Returns nullptr, unless overwritten to return a specific material. 
 ";
 
-%feature("docstring")  Layer::getRefractiveIndex "complex_t Layer::getRefractiveIndex() const
-
-Returns refractive index of the layer's material. 
+%feature("docstring")  Layer::getRefractiveIndex "complex_t Layer::getRefractiveIndex() const 
 ";
 
 %feature("docstring")  Layer::getRefractiveIndex2 "complex_t Layer::getRefractiveIndex2() const
 
-Returns squared refractive index of the layer's material. 
+squared refractive index 
 ";
 
 %feature("docstring")  Layer::addLayout "void Layer::addLayout(const ILayout &decoration)
-
-sets particle layout 
 ";
 
-%feature("docstring")  Layer::getNumberOfLayouts "size_t Layer::getNumberOfLayouts() const
-
-gets number of layouts present 
+%feature("docstring")  Layer::getNumberOfLayouts "size_t Layer::getNumberOfLayouts() const 
 ";
 
-%feature("docstring")  Layer::getLayout "const ILayout * Layer::getLayout(size_t i) const
-
-returns particle decoration 
+%feature("docstring")  Layer::getLayout "const ILayout * Layer::getLayout(size_t i) const 
 ";
 
-%feature("docstring")  Layer::hasDWBASimulation "virtual bool Layer::hasDWBASimulation() const
+%feature("docstring")  Layer::hasDWBASimulation "bool Layer::hasDWBASimulation() const
 
 Returns true if decoration is present. 
 ";
@@ -9462,7 +9450,7 @@ Sets the refractive index of the ambient material (which influences its scatteri
 
 %feature("docstring")  MesoCrystal::getAmbientMaterial "const IMaterial * MesoCrystal::getAmbientMaterial() const
 
-Returns particle's material. 
+Returns nullptr, unless overwritten to return a specific material. 
 ";
 
 %feature("docstring")  MesoCrystal::createTransformedFormFactor "IFormFactor * MesoCrystal::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const
@@ -10576,7 +10564,7 @@ Sets the refractive index of the ambient material (which influences its scatteri
 
 %feature("docstring")  Particle::getAmbientMaterial "const IMaterial* Particle::getAmbientMaterial() const final
 
-Returns particle's material. 
+Returns nullptr, unless overwritten to return a specific material. 
 ";
 
 %feature("docstring")  Particle::createTransformedFormFactor "IFormFactor * Particle::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const
@@ -10656,7 +10644,7 @@ Sets the refractive index of the ambient material (which influences its scatteri
 
 %feature("docstring")  ParticleComposition::getAmbientMaterial "const IMaterial * ParticleComposition::getAmbientMaterial() const
 
-Returns particle's material. 
+Returns nullptr, unless overwritten to return a specific material. 
 ";
 
 %feature("docstring")  ParticleComposition::createTransformedFormFactor "IFormFactor * ParticleComposition::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const
@@ -10729,7 +10717,7 @@ Sets the refractive index of the ambient material (which influences its scatteri
 
 %feature("docstring")  ParticleCoreShell::getAmbientMaterial "const IMaterial * ParticleCoreShell::getAmbientMaterial() const
 
-Returns particle's material. 
+Returns nullptr, unless overwritten to return a specific material. 
 ";
 
 %feature("docstring")  ParticleCoreShell::createTransformedFormFactor "IFormFactor * ParticleCoreShell::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const
@@ -10751,7 +10739,7 @@ Returns the shell particle.
 // File: classParticleDistribution.xml
 %feature("docstring") ParticleDistribution "
 
-A particle with a form factor and refractive index.
+A particle with a form factor and refractive index  ParticleDistribution.
 
 C++ includes: ParticleDistribution.h
 ";
@@ -11571,7 +11559,7 @@ Returns a clone with inverted magnetic fields.
 Returns a new  IRotation object that is the current object's inverse. 
 ";
 
-%feature("docstring")  RotationEuler::accept "void RotationEuler::accept(class ISampleVisitor *visitor) const
+%feature("docstring")  RotationEuler::accept "void RotationEuler::accept(ISampleVisitor *visitor) const
 
 Calls the  ISampleVisitor's visit method. 
 ";
@@ -11612,7 +11600,7 @@ Returns a clone with inverted magnetic fields.
 Returns a new  IRotation object that is the current object's inverse. 
 ";
 
-%feature("docstring")  RotationX::accept "void RotationX::accept(class ISampleVisitor *visitor) const
+%feature("docstring")  RotationX::accept "void RotationX::accept(ISampleVisitor *visitor) const
 
 Calls the  ISampleVisitor's visit method. 
 ";
@@ -11647,7 +11635,7 @@ Returns a clone with inverted magnetic fields.
 Returns a new  IRotation object that is the current object's inverse. 
 ";
 
-%feature("docstring")  RotationY::accept "void RotationY::accept(class ISampleVisitor *visitor) const
+%feature("docstring")  RotationY::accept "void RotationY::accept(ISampleVisitor *visitor) const
 
 Calls the  ISampleVisitor's visit method. 
 ";
@@ -11682,7 +11670,7 @@ Returns a clone with inverted magnetic fields.
 Returns a new  IRotation object that is the current object's inverse. 
 ";
 
-%feature("docstring")  RotationZ::accept "void RotationZ::accept(class ISampleVisitor *visitor) const
+%feature("docstring")  RotationZ::accept "void RotationZ::accept(ISampleVisitor *visitor) const
 
 Calls the  ISampleVisitor's visit method. 
 ";
@@ -13138,7 +13126,7 @@ C++ includes: WavevectorInfo.h
 // File: classMathFunctions_1_1Convolve_1_1Workspace.xml
 
 
-// File: namespace_0D296.xml
+// File: namespace_0D295.xml
 
 
 // File: namespace_0D368.xml
@@ -13631,9 +13619,6 @@ enables exception throw in the case of NaN, Inf
 // File: FTDistributions2D_8h.xml
 
 
-// File: IInterferenceFunction_8cpp.xml
-
-
 // File: IInterferenceFunction_8h.xml
 
 
@@ -14641,6 +14626,9 @@ The mathematics implemented here is described in full detail in a paper by Joach
 // File: FormFactorWeighted_8h.xml
 
 
+// File: IAbstractParticle_8h.xml
+
+
 // File: IClusteredParticles_8h.xml
 
 
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index fc136f0fa6d..c4292cf5be9 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -6691,7 +6691,7 @@ class ISampleVisitor(_object):
         visit(ISampleVisitor self, Layer arg2)
         visit(ISampleVisitor self, LayerInterface const * arg2)
         visit(ISampleVisitor self, MultiLayer arg2)
-        visit(ISampleVisitor self, IAbstractParticle arg2)
+        visit(ISampleVisitor self, IAbstractParticle const * arg2)
         visit(ISampleVisitor self, IParticle arg2)
         visit(ISampleVisitor self, Particle arg2)
         visit(ISampleVisitor self, ParticleDistribution arg2)
@@ -16835,7 +16835,7 @@ class IInterferenceFunction(ISample):
     """
 
 
-    Interface to interference functions.
+    Pure virtual base class of interference functions.
 
     C++ includes: IInterferenceFunction.h
 
@@ -16855,18 +16855,6 @@ class IInterferenceFunction(ISample):
     __swig_destroy__ = _libBornAgainCore.delete_IInterferenceFunction
     __del__ = lambda self: None
 
-    def evaluate(self, q):
-        """
-        evaluate(IInterferenceFunction self, kvector_t q) -> double
-
-        virtual double IInterferenceFunction::evaluate(const kvector_t q) const =0
-
-        Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
-
-        """
-        return _libBornAgainCore.IInterferenceFunction_evaluate(self, q)
-
-
     def clone(self):
         """
         clone(IInterferenceFunction self) -> IInterferenceFunction
@@ -16883,14 +16871,26 @@ class IInterferenceFunction(ISample):
         """
         accept(IInterferenceFunction self, ISampleVisitor visitor)
 
-        void IInterferenceFunction::accept(ISampleVisitor *visitor) const
+        virtual void IInterferenceFunction::accept(ISampleVisitor *visitor) const =0
 
-        Calls ISampleVisitor::visit. 
+        Calls the  ISampleVisitor's visit method. 
 
         """
         return _libBornAgainCore.IInterferenceFunction_accept(self, visitor)
 
 
+    def evaluate(self, q):
+        """
+        evaluate(IInterferenceFunction self, kvector_t q) -> double
+
+        virtual double IInterferenceFunction::evaluate(const kvector_t q) const =0
+
+        Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+
+        """
+        return _libBornAgainCore.IInterferenceFunction_evaluate(self, q)
+
+
     def getKappa(self):
         """
         getKappa(IInterferenceFunction self) -> double
@@ -16993,7 +16993,7 @@ class ILayout(ICompositeSample):
 
     def getParticle(self, index):
         """
-        getParticle(ILayout self, size_t index) -> IAbstractParticle
+        getParticle(ILayout self, size_t index) -> IAbstractParticle const *
 
         virtual const IAbstractParticle* ILayout::getParticle(size_t index) const =0
 
@@ -17101,132 +17101,20 @@ class ILayout(ICompositeSample):
 ILayout_swigregister = _libBornAgainCore.ILayout_swigregister
 ILayout_swigregister(ILayout)
 
-class IAbstractParticle(ICompositeSample):
-    """
-
-
-    Interface for a generic particle.
-
-    C++ includes: IParticle.h
-
+class IParticle(_object):
     """
-    __swig_setmethods__ = {}
-    for _s in [ICompositeSample]:
-        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
-    __setattr__ = lambda self, name, value: _swig_setattr(self, IAbstractParticle, name, value)
-    __swig_getmethods__ = {}
-    for _s in [ICompositeSample]:
-        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
-    __getattr__ = lambda self, name: _swig_getattr(self, IAbstractParticle, name)
-
-    def __init__(self, *args, **kwargs):
-        raise AttributeError("No constructor defined - class is abstract")
-    __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainCore.delete_IAbstractParticle
-    __del__ = lambda self: None
-
-    def clone(self):
-        """
-        clone(IAbstractParticle self) -> IAbstractParticle
-
-        virtual IAbstractParticle* IAbstractParticle::clone() const =0
-
-        Returns a clone of this  ISample object. 
 
-        """
-        return _libBornAgainCore.IAbstractParticle_clone(self)
-
-
-    def cloneInvertB(self):
-        """
-        cloneInvertB(IAbstractParticle self) -> IAbstractParticle
-
-        virtual IAbstractParticle* IAbstractParticle::cloneInvertB() const =0
-
-        Returns a clone with inverted magnetic fields. 
 
-        """
-        return _libBornAgainCore.IAbstractParticle_cloneInvertB(self)
-
-
-    def accept(self, visitor):
-        """
-        accept(IAbstractParticle self, ISampleVisitor visitor)
-
-        virtual void IAbstractParticle::accept(ISampleVisitor *visitor) const
+    Interface for a real particle (one that has position/rotation and form factor).
 
-        calls the  ISampleVisitor's visit method 
-
-        """
-        return _libBornAgainCore.IAbstractParticle_accept(self, visitor)
-
-
-    def setAmbientMaterial(self, arg2):
-        """
-        setAmbientMaterial(IAbstractParticle self, IMaterial arg2)
-
-        virtual void IAbstractParticle::setAmbientMaterial(const IMaterial &)
-
-        Sets the refractive index of the ambient material (which influences its scattering power) 
-
-        """
-        return _libBornAgainCore.IAbstractParticle_setAmbientMaterial(self, arg2)
-
-
-    def getAbundance(self):
-        """
-        getAbundance(IAbstractParticle self) -> double
-
-        double IAbstractParticle::getAbundance() const
-
-        Returns abundance. 
-
-        """
-        return _libBornAgainCore.IAbstractParticle_getAbundance(self)
-
-
-    def setAbundance(self, abundance):
-        """
-        setAbundance(IAbstractParticle self, double abundance)
-
-        void IAbstractParticle::setAbundance(double abundance)
-
-        Sets abundance. 
-
-        """
-        return _libBornAgainCore.IAbstractParticle_setAbundance(self, abundance)
-
-
-    def getAmbientMaterial(self):
-        """
-        getAmbientMaterial(IAbstractParticle self) -> IMaterial
-
-        virtual const IMaterial* IAbstractParticle::getAmbientMaterial() const =0
-
-        Returns particle's material. 
-
-        """
-        return _libBornAgainCore.IAbstractParticle_getAmbientMaterial(self)
-
-IAbstractParticle_swigregister = _libBornAgainCore.IAbstractParticle_swigregister
-IAbstractParticle_swigregister(IAbstractParticle)
-
-class IParticle(IAbstractParticle):
-    """
-
-
-    Interface for a real particle (one that has position/rotation and form factor)
+    Inherited by  Particle,  ParticleComposition,  ParticleCoreShell,  MesoCrystal.
 
     C++ includes: IParticle.h
 
     """
     __swig_setmethods__ = {}
-    for _s in [IAbstractParticle]:
-        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
     __setattr__ = lambda self, name, value: _swig_setattr(self, IParticle, name, value)
     __swig_getmethods__ = {}
-    for _s in [IAbstractParticle]:
-        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
     __getattr__ = lambda self, name: _swig_getattr(self, IParticle, name)
 
     def __init__(self, *args, **kwargs):
@@ -17263,7 +17151,7 @@ class IParticle(IAbstractParticle):
         """
         accept(IParticle self, ISampleVisitor visitor)
 
-        virtual void IParticle::accept(class ISampleVisitor *visitor) const
+        virtual void IParticle::accept(ISampleVisitor *visitor) const
 
         calls the  ISampleVisitor's visit method 
 
@@ -17490,7 +17378,7 @@ class IRotation(ISample):
         """
         accept(IRotation self, ISampleVisitor visitor)
 
-        void IRotation::accept(class ISampleVisitor *visitor) const
+        void IRotation::accept(ISampleVisitor *visitor) const
 
         Calls the  ISampleVisitor's visit method. 
 
@@ -17604,7 +17492,7 @@ class RotationX(IRotation):
         """
         accept(RotationX self, ISampleVisitor visitor)
 
-        void RotationX::accept(class ISampleVisitor *visitor) const
+        void RotationX::accept(ISampleVisitor *visitor) const
 
         Calls the  ISampleVisitor's visit method. 
 
@@ -17703,7 +17591,7 @@ class RotationY(IRotation):
         """
         accept(RotationY self, ISampleVisitor visitor)
 
-        void RotationY::accept(class ISampleVisitor *visitor) const
+        void RotationY::accept(ISampleVisitor *visitor) const
 
         Calls the  ISampleVisitor's visit method. 
 
@@ -17803,7 +17691,7 @@ class RotationZ(IRotation):
         """
         accept(RotationZ self, ISampleVisitor visitor)
 
-        void RotationZ::accept(class ISampleVisitor *visitor) const
+        void RotationZ::accept(ISampleVisitor *visitor) const
 
         Calls the  ISampleVisitor's visit method. 
 
@@ -17902,7 +17790,7 @@ class RotationEuler(IRotation):
         """
         accept(RotationEuler self, ISampleVisitor visitor)
 
-        void RotationEuler::accept(class ISampleVisitor *visitor) const
+        void RotationEuler::accept(ISampleVisitor *visitor) const
 
         Calls the  ISampleVisitor's visit method. 
 
@@ -18552,7 +18440,7 @@ class InterferenceFunction1DLattice(IInterferenceFunction):
 
         void InterferenceFunction1DLattice::accept(ISampleVisitor *visitor) const final
 
-        Calls ISampleVisitor::visit. 
+        Calls the  ISampleVisitor's visit method. 
 
         """
         return _libBornAgainCore.InterferenceFunction1DLattice_accept(self, visitor)
@@ -18653,7 +18541,7 @@ class InterferenceFunctionRadialParaCrystal(IInterferenceFunction):
 
         void InterferenceFunctionRadialParaCrystal::accept(ISampleVisitor *visitor) const final
 
-        Calls ISampleVisitor::visit. 
+        Calls the  ISampleVisitor's visit method. 
 
         """
         return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_accept(self, visitor)
@@ -18848,7 +18736,7 @@ class InterferenceFunction2DLattice(IInterferenceFunction):
 
         void InterferenceFunction2DLattice::accept(ISampleVisitor *visitor) const final
 
-        Calls ISampleVisitor::visit. 
+        Calls the  ISampleVisitor's visit method. 
 
         """
         return _libBornAgainCore.InterferenceFunction2DLattice_accept(self, visitor)
@@ -19018,7 +18906,7 @@ class InterferenceFunction2DParaCrystal(IInterferenceFunction):
 
         void InterferenceFunction2DParaCrystal::accept(ISampleVisitor *visitor) const final
 
-        Calls ISampleVisitor::visit. 
+        Calls the  ISampleVisitor's visit method. 
 
         """
         return _libBornAgainCore.InterferenceFunction2DParaCrystal_accept(self, visitor)
@@ -19259,7 +19147,7 @@ class InterferenceFunctionNone(IInterferenceFunction):
 
         void InterferenceFunctionNone::accept(ISampleVisitor *visitor) const final
 
-        Calls ISampleVisitor::visit. 
+        Calls the  ISampleVisitor's visit method. 
 
         """
         return _libBornAgainCore.InterferenceFunctionNone_accept(self, visitor)
@@ -19866,7 +19754,7 @@ class Layer(ICompositeSample):
     """
 
 
-    A layer with thickness and material.
+    A layer, with thickness (in nanometer) and material.
 
     C++ includes: Layer.h
 
@@ -19916,7 +19804,7 @@ class Layer(ICompositeSample):
         """
         cloneInvertB(Layer self) -> Layer
 
-        Layer * Layer::cloneInvertB() const
+        Layer * Layer::cloneInvertB() const final
 
         Returns a clone with inverted magnetic fields. 
 
@@ -19928,7 +19816,7 @@ class Layer(ICompositeSample):
         """
         accept(Layer self, ISampleVisitor visitor)
 
-        void Layer::accept(class ISampleVisitor *visitor) const final
+        void Layer::accept(ISampleVisitor *visitor) const final
 
         Calls the  ISampleVisitor's visit method. 
 
@@ -19941,9 +19829,9 @@ class Layer(ICompositeSample):
         to_str(Layer self, int indent=0) -> std::string
         to_str(Layer self) -> std::string
 
-        std::string Layer::to_str(int indent=0) const
+        std::string Layer::to_str(int indent=0) const final
 
-        Returns textual representation of *this and its descendants. 
+        Returns textual representation of this and its descendants. 
 
         """
         return _libBornAgainCore.Layer_to_str(self, indent)
@@ -19965,9 +19853,7 @@ class Layer(ICompositeSample):
         """
         getThickness(Layer self) -> double
 
-        virtual double Layer::getThickness() const
-
-        Returns layer thickness in nanometers. 
+        double Layer::getThickness() const 
 
         """
         return _libBornAgainCore.Layer_getThickness(self)
@@ -19991,8 +19877,6 @@ class Layer(ICompositeSample):
 
         void Layer::setMaterialAndThickness(const IMaterial &material, double thickness)
 
-        Sets  material and  thickness. 
-
         """
         return _libBornAgainCore.Layer_setMaterialAndThickness(self, material, thickness)
 
@@ -20001,9 +19885,9 @@ class Layer(ICompositeSample):
         """
         getMaterial(Layer self) -> IMaterial
 
-        const IMaterial* Layer::getMaterial() const final
+        const IMaterial* Layer::getMaterial() const
 
-        Returns layer's material. 
+        Returns nullptr, unless overwritten to return a specific material. 
 
         """
         return _libBornAgainCore.Layer_getMaterial(self)
@@ -20013,9 +19897,7 @@ class Layer(ICompositeSample):
         """
         getRefractiveIndex(Layer self) -> complex_t
 
-        complex_t Layer::getRefractiveIndex() const
-
-        Returns refractive index of the layer's material. 
+        complex_t Layer::getRefractiveIndex() const 
 
         """
         return _libBornAgainCore.Layer_getRefractiveIndex(self)
@@ -20027,7 +19909,7 @@ class Layer(ICompositeSample):
 
         complex_t Layer::getRefractiveIndex2() const
 
-        Returns squared refractive index of the layer's material. 
+        squared refractive index 
 
         """
         return _libBornAgainCore.Layer_getRefractiveIndex2(self)
@@ -20039,8 +19921,6 @@ class Layer(ICompositeSample):
 
         void Layer::addLayout(const ILayout &decoration)
 
-        sets particle layout 
-
         """
         return _libBornAgainCore.Layer_addLayout(self, decoration)
 
@@ -20049,9 +19929,7 @@ class Layer(ICompositeSample):
         """
         getNumberOfLayouts(Layer self) -> size_t
 
-        size_t Layer::getNumberOfLayouts() const
-
-        gets number of layouts present 
+        size_t Layer::getNumberOfLayouts() const 
 
         """
         return _libBornAgainCore.Layer_getNumberOfLayouts(self)
@@ -20061,9 +19939,7 @@ class Layer(ICompositeSample):
         """
         getLayout(Layer self, size_t i) -> ILayout
 
-        const ILayout * Layer::getLayout(size_t i) const
-
-        returns particle decoration 
+        const ILayout * Layer::getLayout(size_t i) const 
 
         """
         return _libBornAgainCore.Layer_getLayout(self, i)
@@ -20073,7 +19949,7 @@ class Layer(ICompositeSample):
         """
         hasDWBASimulation(Layer self) -> bool
 
-        virtual bool Layer::hasDWBASimulation() const
+        bool Layer::hasDWBASimulation() const
 
         Returns true if decoration is present. 
 
@@ -20621,7 +20497,7 @@ class MesoCrystal(IParticle):
 
         const IMaterial * MesoCrystal::getAmbientMaterial() const
 
-        Returns particle's material. 
+        Returns nullptr, unless overwritten to return a specific material. 
 
         """
         return _libBornAgainCore.MesoCrystal_getAmbientMaterial(self)
@@ -22379,7 +22255,7 @@ class Particle(IParticle):
 
         const IMaterial* Particle::getAmbientMaterial() const final
 
-        Returns particle's material. 
+        Returns nullptr, unless overwritten to return a specific material. 
 
         """
         return _libBornAgainCore.Particle_getAmbientMaterial(self)
@@ -22565,7 +22441,7 @@ class ParticleComposition(IParticle):
 
         const IMaterial * ParticleComposition::getAmbientMaterial() const
 
-        Returns particle's material. 
+        Returns nullptr, unless overwritten to return a specific material. 
 
         """
         return _libBornAgainCore.ParticleComposition_getAmbientMaterial(self)
@@ -22708,7 +22584,7 @@ class ParticleCoreShell(IParticle):
 
         const IMaterial * ParticleCoreShell::getAmbientMaterial() const
 
-        Returns particle's material. 
+        Returns nullptr, unless overwritten to return a specific material. 
 
         """
         return _libBornAgainCore.ParticleCoreShell_getAmbientMaterial(self)
@@ -22752,22 +22628,18 @@ class ParticleCoreShell(IParticle):
 ParticleCoreShell_swigregister = _libBornAgainCore.ParticleCoreShell_swigregister
 ParticleCoreShell_swigregister(ParticleCoreShell)
 
-class ParticleDistribution(IAbstractParticle):
+class ParticleDistribution(_object):
     """
 
 
-    A particle with a form factor and refractive index.
+    A particle with a form factor and refractive index  ParticleDistribution.
 
     C++ includes: ParticleDistribution.h
 
     """
     __swig_setmethods__ = {}
-    for _s in [IAbstractParticle]:
-        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
     __setattr__ = lambda self, name, value: _swig_setattr(self, ParticleDistribution, name, value)
     __swig_getmethods__ = {}
-    for _s in [IAbstractParticle]:
-        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
     __getattr__ = lambda self, name: _swig_getattr(self, ParticleDistribution, name)
     __repr__ = _swig_repr
 
@@ -22931,8 +22803,8 @@ class ParticleLayout(ILayout):
     def __init__(self, *args):
         """
         __init__(ParticleLayout self) -> ParticleLayout
-        __init__(ParticleLayout self, IAbstractParticle particle) -> ParticleLayout
-        __init__(ParticleLayout self, IAbstractParticle particle, double abundance) -> ParticleLayout
+        __init__(ParticleLayout self, IAbstractParticle const & particle) -> ParticleLayout
+        __init__(ParticleLayout self, IAbstractParticle const & particle, double abundance) -> ParticleLayout
 
         ParticleLayout::ParticleLayout(const IAbstractParticle &particle, double abundance)
 
@@ -22983,8 +22855,8 @@ class ParticleLayout(ILayout):
 
     def addParticle(self, *args):
         """
-        addParticle(ParticleLayout self, IAbstractParticle particle)
-        addParticle(ParticleLayout self, IAbstractParticle particle, double abundance)
+        addParticle(ParticleLayout self, IAbstractParticle const & particle)
+        addParticle(ParticleLayout self, IAbstractParticle const & particle, double abundance)
         addParticle(ParticleLayout self, IParticle particle, double abundance, kvector_t position)
         addParticle(ParticleLayout self, IParticle particle, double abundance, kvector_t position, IRotation rotation)
 
@@ -23025,7 +22897,7 @@ class ParticleLayout(ILayout):
 
     def getParticle(self, index):
         """
-        getParticle(ParticleLayout self, size_t index) -> IAbstractParticle
+        getParticle(ParticleLayout self, size_t index) -> IAbstractParticle const *
 
         const IAbstractParticle * ParticleLayout::getParticle(size_t index) const final
 
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index 1f21377f959..e11d51eba2e 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -45640,10 +45640,10 @@ SWIGINTERN PyObject *_wrap_ISampleVisitor_visit(PyObject *self, PyObject *args)
     _v = SWIG_CheckState(res);
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Particle, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ICompositeSample, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_ISampleVisitor_visit__SWIG_11(self, args);
+        return _wrap_ISampleVisitor_visit__SWIG_1(self, args);
       }
     }
   }
@@ -45668,10 +45668,10 @@ SWIGINTERN PyObject *_wrap_ISampleVisitor_visit(PyObject *self, PyObject *args)
     _v = SWIG_CheckState(res);
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleComposition, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorAnisoPyramid, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_ISampleVisitor_visit__SWIG_13(self, args);
+        return _wrap_ISampleVisitor_visit__SWIG_19(self, args);
       }
     }
   }
@@ -45682,10 +45682,10 @@ SWIGINTERN PyObject *_wrap_ISampleVisitor_visit(PyObject *self, PyObject *args)
     _v = SWIG_CheckState(res);
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleDistribution, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Particle, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_ISampleVisitor_visit__SWIG_12(self, args);
+        return _wrap_ISampleVisitor_visit__SWIG_11(self, args);
       }
     }
   }
@@ -45696,10 +45696,10 @@ SWIGINTERN PyObject *_wrap_ISampleVisitor_visit(PyObject *self, PyObject *args)
     _v = SWIG_CheckState(res);
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_MesoCrystal, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleComposition, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_ISampleVisitor_visit__SWIG_14(self, args);
+        return _wrap_ISampleVisitor_visit__SWIG_13(self, args);
       }
     }
   }
@@ -45710,10 +45710,10 @@ SWIGINTERN PyObject *_wrap_ISampleVisitor_visit(PyObject *self, PyObject *args)
     _v = SWIG_CheckState(res);
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleCoreShell, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleDistribution, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_ISampleVisitor_visit__SWIG_15(self, args);
+        return _wrap_ISampleVisitor_visit__SWIG_12(self, args);
       }
     }
   }
@@ -45724,10 +45724,10 @@ SWIGINTERN PyObject *_wrap_ISampleVisitor_visit(PyObject *self, PyObject *args)
     _v = SWIG_CheckState(res);
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IParticle, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_MesoCrystal, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_ISampleVisitor_visit__SWIG_10(self, args);
+        return _wrap_ISampleVisitor_visit__SWIG_14(self, args);
       }
     }
   }
@@ -45738,10 +45738,10 @@ SWIGINTERN PyObject *_wrap_ISampleVisitor_visit(PyObject *self, PyObject *args)
     _v = SWIG_CheckState(res);
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IAbstractParticle, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleCoreShell, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_ISampleVisitor_visit__SWIG_9(self, args);
+        return _wrap_ISampleVisitor_visit__SWIG_15(self, args);
       }
     }
   }
@@ -45752,10 +45752,10 @@ SWIGINTERN PyObject *_wrap_ISampleVisitor_visit(PyObject *self, PyObject *args)
     _v = SWIG_CheckState(res);
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ICompositeSample, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IParticle, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_ISampleVisitor_visit__SWIG_1(self, args);
+        return _wrap_ISampleVisitor_visit__SWIG_10(self, args);
       }
     }
   }
@@ -45766,10 +45766,10 @@ SWIGINTERN PyObject *_wrap_ISampleVisitor_visit(PyObject *self, PyObject *args)
     _v = SWIG_CheckState(res);
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorAnisoPyramid, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IAbstractParticle, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_ISampleVisitor_visit__SWIG_19(self, args);
+        return _wrap_ISampleVisitor_visit__SWIG_9(self, args);
       }
     }
   }
@@ -75909,45 +75909,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate(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 * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  double result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:IInterferenceFunction_evaluate",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &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(obj1, &argp2, SWIGTYPE_p_Geometry__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;
-    }
-  }
-  result = (double)((IInterferenceFunction const *)arg1)->evaluate(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_IInterferenceFunction_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
@@ -76000,6 +75961,45 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate(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 * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IInterferenceFunction_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &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(obj1, &argp2, SWIGTYPE_p_Geometry__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;
+    }
+  }
+  result = (double)((IInterferenceFunction const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_IInterferenceFunction_getKappa(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
@@ -76407,215 +76407,6 @@ SWIGINTERN PyObject *ILayout_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObje
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_delete_IAbstractParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_IAbstractParticle",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IAbstractParticle" "', argument " "1"" of type '" "IAbstractParticle *""'"); 
-  }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IAbstractParticle_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  IAbstractParticle *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IAbstractParticle_clone",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_clone" "', argument " "1"" of type '" "IAbstractParticle const *""'"); 
-  }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
-  result = (IAbstractParticle *)((IAbstractParticle const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IAbstractParticle_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  IAbstractParticle *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IAbstractParticle_cloneInvertB",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_cloneInvertB" "', argument " "1"" of type '" "IAbstractParticle const *""'"); 
-  }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
-  result = (IAbstractParticle *)((IAbstractParticle const *)arg1)->cloneInvertB();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IAbstractParticle_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:IAbstractParticle_accept",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_accept" "', argument " "1"" of type '" "IAbstractParticle const *""'"); 
-  }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IAbstractParticle_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
-  }
-  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
-  ((IAbstractParticle const *)arg1)->accept(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IAbstractParticle_setAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  IMaterial *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:IAbstractParticle_setAmbientMaterial",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_setAmbientMaterial" "', argument " "1"" of type '" "IAbstractParticle *""'"); 
-  }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IAbstractParticle_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IAbstractParticle_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
-  }
-  arg2 = reinterpret_cast< IMaterial * >(argp2);
-  (arg1)->setAmbientMaterial((IMaterial const &)*arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IAbstractParticle_getAbundance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  double result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IAbstractParticle_getAbundance",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_getAbundance" "', argument " "1"" of type '" "IAbstractParticle const *""'"); 
-  }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
-  result = (double)((IAbstractParticle const *)arg1)->getAbundance();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IAbstractParticle_setAbundance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:IAbstractParticle_setAbundance",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_setAbundance" "', argument " "1"" of type '" "IAbstractParticle *""'"); 
-  }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAbstractParticle_setAbundance" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setAbundance(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IAbstractParticle_getAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  IMaterial *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:IAbstractParticle_getAmbientMaterial",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_getAmbientMaterial" "', argument " "1"" of type '" "IAbstractParticle const *""'"); 
-  }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
-  result = (IMaterial *)((IAbstractParticle const *)arg1)->getAmbientMaterial();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *IAbstractParticle_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IAbstractParticle, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
 SWIGINTERN PyObject *_wrap_delete_IParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IParticle *arg1 = (IParticle *) 0 ;
@@ -103408,7 +103199,7 @@ static PyMethodDef SwigMethods[] = {
 		"visit(Layer arg2)\n"
 		"visit(LayerInterface const * arg2)\n"
 		"visit(MultiLayer arg2)\n"
-		"visit(IAbstractParticle arg2)\n"
+		"visit(IAbstractParticle const * arg2)\n"
 		"visit(IParticle arg2)\n"
 		"visit(Particle arg2)\n"
 		"visit(ParticleDistribution arg2)\n"
@@ -108852,15 +108643,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"delete_IInterferenceFunction", _wrap_delete_IInterferenceFunction, METH_VARARGS, (char *)"\n"
 		"delete_IInterferenceFunction(IInterferenceFunction self)\n"
 		"\n"
-		"IInterferenceFunction::~IInterferenceFunction()\n"
-		"\n"
-		""},
-	 { (char *)"IInterferenceFunction_evaluate", _wrap_IInterferenceFunction_evaluate, METH_VARARGS, (char *)"\n"
-		"IInterferenceFunction_evaluate(IInterferenceFunction self, kvector_t q) -> double\n"
-		"\n"
-		"virtual double IInterferenceFunction::evaluate(const kvector_t q) const =0\n"
-		"\n"
-		"Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) \n"
+		"virtual IInterferenceFunction::~IInterferenceFunction()\n"
 		"\n"
 		""},
 	 { (char *)"IInterferenceFunction_clone", _wrap_IInterferenceFunction_clone, METH_VARARGS, (char *)"\n"
@@ -108874,9 +108657,17 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"IInterferenceFunction_accept", _wrap_IInterferenceFunction_accept, METH_VARARGS, (char *)"\n"
 		"IInterferenceFunction_accept(IInterferenceFunction self, ISampleVisitor visitor)\n"
 		"\n"
-		"void IInterferenceFunction::accept(ISampleVisitor *visitor) const\n"
+		"virtual void IInterferenceFunction::accept(ISampleVisitor *visitor) const =0\n"
 		"\n"
-		"Calls ISampleVisitor::visit. \n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"IInterferenceFunction_evaluate", _wrap_IInterferenceFunction_evaluate, METH_VARARGS, (char *)"\n"
+		"IInterferenceFunction_evaluate(IInterferenceFunction self, kvector_t q) -> double\n"
+		"\n"
+		"virtual double IInterferenceFunction::evaluate(const kvector_t q) const =0\n"
+		"\n"
+		"Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) \n"
 		"\n"
 		""},
 	 { (char *)"IInterferenceFunction_getKappa", _wrap_IInterferenceFunction_getKappa, METH_VARARGS, (char *)"\n"
@@ -108935,7 +108726,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { (char *)"ILayout_getParticle", _wrap_ILayout_getParticle, METH_VARARGS, (char *)"\n"
-		"ILayout_getParticle(ILayout self, size_t index) -> IAbstractParticle\n"
+		"ILayout_getParticle(ILayout self, size_t index) -> IAbstractParticle const *\n"
 		"\n"
 		"virtual const IAbstractParticle* ILayout::getParticle(size_t index) const =0\n"
 		"\n"
@@ -109007,69 +108798,6 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { (char *)"ILayout_swigregister", ILayout_swigregister, METH_VARARGS, NULL},
-	 { (char *)"delete_IAbstractParticle", _wrap_delete_IAbstractParticle, METH_VARARGS, (char *)"\n"
-		"delete_IAbstractParticle(IAbstractParticle self)\n"
-		"\n"
-		"virtual IAbstractParticle::~IAbstractParticle()\n"
-		"\n"
-		""},
-	 { (char *)"IAbstractParticle_clone", _wrap_IAbstractParticle_clone, METH_VARARGS, (char *)"\n"
-		"IAbstractParticle_clone(IAbstractParticle self) -> IAbstractParticle\n"
-		"\n"
-		"virtual IAbstractParticle* IAbstractParticle::clone() const =0\n"
-		"\n"
-		"Returns a clone of this  ISample object. \n"
-		"\n"
-		""},
-	 { (char *)"IAbstractParticle_cloneInvertB", _wrap_IAbstractParticle_cloneInvertB, METH_VARARGS, (char *)"\n"
-		"IAbstractParticle_cloneInvertB(IAbstractParticle self) -> IAbstractParticle\n"
-		"\n"
-		"virtual IAbstractParticle* IAbstractParticle::cloneInvertB() const =0\n"
-		"\n"
-		"Returns a clone with inverted magnetic fields. \n"
-		"\n"
-		""},
-	 { (char *)"IAbstractParticle_accept", _wrap_IAbstractParticle_accept, METH_VARARGS, (char *)"\n"
-		"IAbstractParticle_accept(IAbstractParticle self, ISampleVisitor visitor)\n"
-		"\n"
-		"virtual void IAbstractParticle::accept(ISampleVisitor *visitor) const\n"
-		"\n"
-		"calls the  ISampleVisitor's visit method \n"
-		"\n"
-		""},
-	 { (char *)"IAbstractParticle_setAmbientMaterial", _wrap_IAbstractParticle_setAmbientMaterial, METH_VARARGS, (char *)"\n"
-		"IAbstractParticle_setAmbientMaterial(IAbstractParticle self, IMaterial arg3)\n"
-		"\n"
-		"virtual void IAbstractParticle::setAmbientMaterial(const IMaterial &)\n"
-		"\n"
-		"Sets the refractive index of the ambient material (which influences its scattering power) \n"
-		"\n"
-		""},
-	 { (char *)"IAbstractParticle_getAbundance", _wrap_IAbstractParticle_getAbundance, METH_VARARGS, (char *)"\n"
-		"IAbstractParticle_getAbundance(IAbstractParticle self) -> double\n"
-		"\n"
-		"double IAbstractParticle::getAbundance() const\n"
-		"\n"
-		"Returns abundance. \n"
-		"\n"
-		""},
-	 { (char *)"IAbstractParticle_setAbundance", _wrap_IAbstractParticle_setAbundance, METH_VARARGS, (char *)"\n"
-		"IAbstractParticle_setAbundance(IAbstractParticle self, double abundance)\n"
-		"\n"
-		"void IAbstractParticle::setAbundance(double abundance)\n"
-		"\n"
-		"Sets abundance. \n"
-		"\n"
-		""},
-	 { (char *)"IAbstractParticle_getAmbientMaterial", _wrap_IAbstractParticle_getAmbientMaterial, METH_VARARGS, (char *)"\n"
-		"IAbstractParticle_getAmbientMaterial(IAbstractParticle self) -> IMaterial\n"
-		"\n"
-		"virtual const IMaterial* IAbstractParticle::getAmbientMaterial() const =0\n"
-		"\n"
-		"Returns particle's material. \n"
-		"\n"
-		""},
-	 { (char *)"IAbstractParticle_swigregister", IAbstractParticle_swigregister, METH_VARARGS, NULL},
 	 { (char *)"delete_IParticle", _wrap_delete_IParticle, METH_VARARGS, (char *)"\n"
 		"delete_IParticle(IParticle self)\n"
 		"\n"
@@ -109095,7 +108823,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"IParticle_accept", _wrap_IParticle_accept, METH_VARARGS, (char *)"\n"
 		"IParticle_accept(IParticle self, ISampleVisitor visitor)\n"
 		"\n"
-		"virtual void IParticle::accept(class ISampleVisitor *visitor) const\n"
+		"virtual void IParticle::accept(ISampleVisitor *visitor) const\n"
 		"\n"
 		"calls the  ISampleVisitor's visit method \n"
 		"\n"
@@ -109219,7 +108947,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"IRotation_accept", _wrap_IRotation_accept, METH_VARARGS, (char *)"\n"
 		"IRotation_accept(IRotation self, ISampleVisitor visitor)\n"
 		"\n"
-		"void IRotation::accept(class ISampleVisitor *visitor) const\n"
+		"void IRotation::accept(ISampleVisitor *visitor) const\n"
 		"\n"
 		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
@@ -109282,7 +109010,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"RotationX_accept", _wrap_RotationX_accept, METH_VARARGS, (char *)"\n"
 		"RotationX_accept(RotationX self, ISampleVisitor visitor)\n"
 		"\n"
-		"void RotationX::accept(class ISampleVisitor *visitor) const\n"
+		"void RotationX::accept(ISampleVisitor *visitor) const\n"
 		"\n"
 		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
@@ -109336,7 +109064,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"RotationY_accept", _wrap_RotationY_accept, METH_VARARGS, (char *)"\n"
 		"RotationY_accept(RotationY self, ISampleVisitor visitor)\n"
 		"\n"
-		"void RotationY::accept(class ISampleVisitor *visitor) const\n"
+		"void RotationY::accept(ISampleVisitor *visitor) const\n"
 		"\n"
 		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
@@ -109391,7 +109119,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"RotationZ_accept", _wrap_RotationZ_accept, METH_VARARGS, (char *)"\n"
 		"RotationZ_accept(RotationZ self, ISampleVisitor visitor)\n"
 		"\n"
-		"void RotationZ::accept(class ISampleVisitor *visitor) const\n"
+		"void RotationZ::accept(ISampleVisitor *visitor) const\n"
 		"\n"
 		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
@@ -109445,7 +109173,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"RotationEuler_accept", _wrap_RotationEuler_accept, METH_VARARGS, (char *)"\n"
 		"RotationEuler_accept(RotationEuler self, ISampleVisitor visitor)\n"
 		"\n"
-		"void RotationEuler::accept(class ISampleVisitor *visitor) const\n"
+		"void RotationEuler::accept(ISampleVisitor *visitor) const\n"
 		"\n"
 		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
@@ -109753,7 +109481,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		"void InterferenceFunction1DLattice::accept(ISampleVisitor *visitor) const final\n"
 		"\n"
-		"Calls ISampleVisitor::visit. \n"
+		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
 		""},
 	 { (char *)"InterferenceFunction1DLattice_setDecayFunction", _wrap_InterferenceFunction1DLattice_setDecayFunction, METH_VARARGS, (char *)"\n"
@@ -109803,7 +109531,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		"void InterferenceFunctionRadialParaCrystal::accept(ISampleVisitor *visitor) const final\n"
 		"\n"
-		"Calls ISampleVisitor::visit. \n"
+		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
 		""},
 	 { (char *)"InterferenceFunctionRadialParaCrystal_to_str", _wrap_InterferenceFunctionRadialParaCrystal_to_str, METH_VARARGS, (char *)"\n"
@@ -109922,7 +109650,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		"void InterferenceFunction2DLattice::accept(ISampleVisitor *visitor) const final\n"
 		"\n"
-		"Calls ISampleVisitor::visit. \n"
+		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
 		""},
 	 { (char *)"InterferenceFunction2DLattice_createSquare", _wrap_InterferenceFunction2DLattice_createSquare, METH_VARARGS, (char *)"\n"
@@ -110013,7 +109741,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		"void InterferenceFunction2DParaCrystal::accept(ISampleVisitor *visitor) const final\n"
 		"\n"
-		"Calls ISampleVisitor::visit. \n"
+		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
 		""},
 	 { (char *)"InterferenceFunction2DParaCrystal_to_str", _wrap_InterferenceFunction2DParaCrystal_to_str, METH_VARARGS, (char *)"\n"
@@ -110143,7 +109871,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		"void InterferenceFunctionNone::accept(ISampleVisitor *visitor) const final\n"
 		"\n"
-		"Calls ISampleVisitor::visit. \n"
+		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
 		""},
 	 { (char *)"InterferenceFunctionNone_evaluate", _wrap_InterferenceFunctionNone_evaluate, METH_VARARGS, (char *)"\n"
@@ -110464,7 +110192,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"delete_Layer", _wrap_delete_Layer, METH_VARARGS, (char *)"\n"
 		"delete_Layer(Layer self)\n"
 		"\n"
-		"Layer::~Layer()\n"
+		"Layer::~Layer() final\n"
 		"\n"
 		""},
 	 { (char *)"Layer_clone", _wrap_Layer_clone, METH_VARARGS, (char *)"\n"
@@ -110478,7 +110206,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"Layer_cloneInvertB", _wrap_Layer_cloneInvertB, METH_VARARGS, (char *)"\n"
 		"Layer_cloneInvertB(Layer self) -> Layer\n"
 		"\n"
-		"Layer * Layer::cloneInvertB() const\n"
+		"Layer * Layer::cloneInvertB() const final\n"
 		"\n"
 		"Returns a clone with inverted magnetic fields. \n"
 		"\n"
@@ -110486,7 +110214,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"Layer_accept", _wrap_Layer_accept, METH_VARARGS, (char *)"\n"
 		"Layer_accept(Layer self, ISampleVisitor visitor)\n"
 		"\n"
-		"void Layer::accept(class ISampleVisitor *visitor) const final\n"
+		"void Layer::accept(ISampleVisitor *visitor) const final\n"
 		"\n"
 		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
@@ -110495,9 +110223,9 @@ static PyMethodDef SwigMethods[] = {
 		"to_str(int indent=0) -> std::string\n"
 		"Layer_to_str(Layer self) -> std::string\n"
 		"\n"
-		"std::string Layer::to_str(int indent=0) const\n"
+		"std::string Layer::to_str(int indent=0) const final\n"
 		"\n"
-		"Returns textual representation of *this and its descendants. \n"
+		"Returns textual representation of this and its descendants. \n"
 		"\n"
 		""},
 	 { (char *)"Layer_setThickness", _wrap_Layer_setThickness, METH_VARARGS, (char *)"\n"
@@ -110511,9 +110239,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"Layer_getThickness", _wrap_Layer_getThickness, METH_VARARGS, (char *)"\n"
 		"Layer_getThickness(Layer self) -> double\n"
 		"\n"
-		"virtual double Layer::getThickness() const\n"
-		"\n"
-		"Returns layer thickness in nanometers. \n"
+		"double Layer::getThickness() const \n"
 		"\n"
 		""},
 	 { (char *)"Layer_setMaterial", _wrap_Layer_setMaterial, METH_VARARGS, (char *)"\n"
@@ -110529,23 +110255,19 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		"void Layer::setMaterialAndThickness(const IMaterial &material, double thickness)\n"
 		"\n"
-		"Sets  material and  thickness. \n"
-		"\n"
 		""},
 	 { (char *)"Layer_getMaterial", _wrap_Layer_getMaterial, METH_VARARGS, (char *)"\n"
 		"Layer_getMaterial(Layer self) -> IMaterial\n"
 		"\n"
-		"const IMaterial* Layer::getMaterial() const final\n"
+		"const IMaterial* Layer::getMaterial() const\n"
 		"\n"
-		"Returns layer's material. \n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
 		"\n"
 		""},
 	 { (char *)"Layer_getRefractiveIndex", _wrap_Layer_getRefractiveIndex, METH_VARARGS, (char *)"\n"
 		"Layer_getRefractiveIndex(Layer self) -> complex_t\n"
 		"\n"
-		"complex_t Layer::getRefractiveIndex() const\n"
-		"\n"
-		"Returns refractive index of the layer's material. \n"
+		"complex_t Layer::getRefractiveIndex() const \n"
 		"\n"
 		""},
 	 { (char *)"Layer_getRefractiveIndex2", _wrap_Layer_getRefractiveIndex2, METH_VARARGS, (char *)"\n"
@@ -110553,7 +110275,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		"complex_t Layer::getRefractiveIndex2() const\n"
 		"\n"
-		"Returns squared refractive index of the layer's material. \n"
+		"squared refractive index \n"
 		"\n"
 		""},
 	 { (char *)"Layer_addLayout", _wrap_Layer_addLayout, METH_VARARGS, (char *)"\n"
@@ -110561,29 +110283,23 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		"void Layer::addLayout(const ILayout &decoration)\n"
 		"\n"
-		"sets particle layout \n"
-		"\n"
 		""},
 	 { (char *)"Layer_getNumberOfLayouts", _wrap_Layer_getNumberOfLayouts, METH_VARARGS, (char *)"\n"
 		"Layer_getNumberOfLayouts(Layer self) -> size_t\n"
 		"\n"
-		"size_t Layer::getNumberOfLayouts() const\n"
-		"\n"
-		"gets number of layouts present \n"
+		"size_t Layer::getNumberOfLayouts() const \n"
 		"\n"
 		""},
 	 { (char *)"Layer_getLayout", _wrap_Layer_getLayout, METH_VARARGS, (char *)"\n"
 		"Layer_getLayout(Layer self, size_t i) -> ILayout\n"
 		"\n"
-		"const ILayout * Layer::getLayout(size_t i) const\n"
-		"\n"
-		"returns particle decoration \n"
+		"const ILayout * Layer::getLayout(size_t i) const \n"
 		"\n"
 		""},
 	 { (char *)"Layer_hasDWBASimulation", _wrap_Layer_hasDWBASimulation, METH_VARARGS, (char *)"\n"
 		"Layer_hasDWBASimulation(Layer self) -> bool\n"
 		"\n"
-		"virtual bool Layer::hasDWBASimulation() const\n"
+		"bool Layer::hasDWBASimulation() const\n"
 		"\n"
 		"Returns true if decoration is present. \n"
 		"\n"
@@ -110863,7 +110579,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		"const IMaterial * MesoCrystal::getAmbientMaterial() const\n"
 		"\n"
-		"Returns particle's material. \n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
 		"\n"
 		""},
 	 { (char *)"MesoCrystal_createTransformedFormFactor", _wrap_MesoCrystal_createTransformedFormFactor, METH_VARARGS, (char *)"\n"
@@ -111948,7 +111664,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		"const IMaterial* Particle::getAmbientMaterial() const final\n"
 		"\n"
-		"Returns particle's material. \n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
 		"\n"
 		""},
 	 { (char *)"Particle_createTransformedFormFactor", _wrap_Particle_createTransformedFormFactor, METH_VARARGS, (char *)"\n"
@@ -112058,7 +111774,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		"const IMaterial * ParticleComposition::getAmbientMaterial() const\n"
 		"\n"
-		"Returns particle's material. \n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
 		"\n"
 		""},
 	 { (char *)"ParticleComposition_createTransformedFormFactor", _wrap_ParticleComposition_createTransformedFormFactor, METH_VARARGS, (char *)"\n"
@@ -112142,7 +111858,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		"const IMaterial * ParticleCoreShell::getAmbientMaterial() const\n"
 		"\n"
-		"Returns particle's material. \n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
 		"\n"
 		""},
 	 { (char *)"ParticleCoreShell_createTransformedFormFactor", _wrap_ParticleCoreShell_createTransformedFormFactor, METH_VARARGS, (char *)"\n"
@@ -112261,8 +111977,8 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"ParticleDistribution_swigregister", ParticleDistribution_swigregister, METH_VARARGS, NULL},
 	 { (char *)"new_ParticleLayout", _wrap_new_ParticleLayout, METH_VARARGS, (char *)"\n"
 		"ParticleLayout()\n"
-		"ParticleLayout(IAbstractParticle particle)\n"
-		"new_ParticleLayout(IAbstractParticle particle, double abundance) -> ParticleLayout\n"
+		"ParticleLayout(IAbstractParticle const & particle)\n"
+		"new_ParticleLayout(IAbstractParticle const & particle, double abundance) -> ParticleLayout\n"
 		"\n"
 		"ParticleLayout::ParticleLayout(const IAbstractParticle &particle, double abundance)\n"
 		"\n"
@@ -112298,8 +112014,8 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { (char *)"ParticleLayout_addParticle", _wrap_ParticleLayout_addParticle, METH_VARARGS, (char *)"\n"
-		"addParticle(IAbstractParticle particle)\n"
-		"addParticle(IAbstractParticle particle, double abundance)\n"
+		"addParticle(IAbstractParticle const & particle)\n"
+		"addParticle(IAbstractParticle const & particle, double abundance)\n"
 		"addParticle(IParticle particle, double abundance, kvector_t position)\n"
 		"ParticleLayout_addParticle(ParticleLayout self, IParticle particle, double abundance, kvector_t position, IRotation rotation)\n"
 		"\n"
@@ -112332,7 +112048,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { (char *)"ParticleLayout_getParticle", _wrap_ParticleLayout_getParticle, METH_VARARGS, (char *)"\n"
-		"ParticleLayout_getParticle(ParticleLayout self, size_t index) -> IAbstractParticle\n"
+		"ParticleLayout_getParticle(ParticleLayout self, size_t index) -> IAbstractParticle const *\n"
 		"\n"
 		"const IAbstractParticle * ParticleLayout::getParticle(size_t index) const final\n"
 		"\n"
@@ -113287,9 +113003,6 @@ static void *_p_FormFactorSphereGaussianRadiusTo_p_ICloneable(void *x, int *SWIG
 static void *_p_MultiLayerTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(ICompositeSample *) ((MultiLayer *) x));
 }
-static void *_p_ParticleDistributionTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IAbstractParticle *) ((ParticleDistribution *) x));
-}
 static void *_p_InterferenceFunctionNoneTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IInterferenceFunction *) ((InterferenceFunctionNone *) x));
 }
@@ -113299,15 +113012,15 @@ static void *_p_Geometry__PolygonTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(ne
 static void *_p_Geometry__EllipseTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (Geometry::IShape2D *) ((Geometry::Ellipse *) x));
 }
+static void *_p_ParticleLayoutTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(ILayout *) ((ParticleLayout *) x));
+}
 static void *_p_ILayoutTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(ICompositeSample *) ((ILayout *) x));
 }
 static void *_p_FormFactorHemiEllipsoidTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorHemiEllipsoid *) x));
 }
-static void *_p_ParticleLayoutTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(ILayout *) ((ParticleLayout *) x));
-}
 static void *_p_ChiSquaredModuleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IChiSquaredModule *) ((ChiSquaredModule *) x));
 }
@@ -113338,21 +113051,18 @@ static void *_p_FormFactorIcosahedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPAR
 static void *_p_FormFactorPrism6To_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
 }
+static void *_p_OffSpecSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Simulation *) ((OffSpecSimulation *) x));
+}
 static void *_p_GISASSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (Simulation *) ((GISASSimulation *) x));
 }
 static void *_p_SimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((Simulation *) x));
 }
-static void *_p_OffSpecSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (Simulation *) ((OffSpecSimulation *) x));
-}
 static void *_p_SpecularSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((SpecularSimulation *) x));
 }
-static void *_p_ParticleCoreShellTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
-}
 static void *_p_FormFactorTruncatedSphereTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSphere *) x));
 }
@@ -113422,15 +113132,6 @@ static void *_p_IFormFactorBornTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newm
 static void *_p_IClusteredParticlesTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(ICompositeSample *) ((IClusteredParticles *) x));
 }
-static void *_p_IParticleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IAbstractParticle *) ((IParticle *) x));
-}
-static void *_p_IAbstractParticleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(ICompositeSample *) ((IAbstractParticle *) x));
-}
-static void *_p_ParticleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((Particle *) x));
-}
 static void *_p_FormFactorTrivialTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTrivial *) x));
 }
@@ -113461,9 +113162,6 @@ static void *_p_FormFactorCylinderTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(n
 static void *_p_FormFactorEllipsoidalCylinderTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorEllipsoidalCylinder *) x));
 }
-static void *_p_ParticleCompositionTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
-}
 static void *_p_FormFactorSphereUniformRadiusTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereUniformRadius *) x));
 }
@@ -113488,9 +113186,6 @@ static void *_p_LayerRoughnessTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newme
 static void *_p_IRoughnessTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *) ((IRoughness *) x));
 }
-static void *_p_MesoCrystalTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
-}
 static void *_p_InterferenceFunction2DParaCrystalTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IInterferenceFunction *) ((InterferenceFunction2DParaCrystal *) x));
 }
@@ -113560,9 +113255,6 @@ static void *_p_MultiLayerTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
 static void *_p_ParameterDistributionTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *) ((ParameterDistribution *) x));
 }
-static void *_p_ParticleDistributionTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *) ((ParticleDistribution *) x));
-}
 static void *_p_FTDistribution1DGaussTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(IFTDistribution1D *) ((FTDistribution1DGauss *) x));
 }
@@ -113647,9 +113339,6 @@ static void *_p_SpecularSimulationTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newme
 static void *_p_FTDistribution2DConeTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(IFTDistribution2D *) ((FTDistribution2DCone *) x));
 }
-static void *_p_ParticleCoreShellTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
-}
 static void *_p_FormFactorFullSphereTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSphere *) x));
 }
@@ -113749,15 +113438,6 @@ static void *_p_IClusteredParticlesTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newm
 static void *_p_IMultiLayerBuilderTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *) ((IMultiLayerBuilder *) x));
 }
-static void *_p_IAbstractParticleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *) ((IAbstractParticle *) x));
-}
-static void *_p_IParticleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *) ((IParticle *) x));
-}
-static void *_p_ParticleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((Particle *) x));
-}
 static void *_p_DistributionGateTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(IDistribution1D *) ((DistributionGate *) x));
 }
@@ -113818,9 +113498,6 @@ static void *_p_ResolutionFunction2DGaussianTo_p_INamed(void *x, int *SWIGUNUSED
 static void *_p_BeamTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *) ((Beam *) x));
 }
-static void *_p_ParticleCompositionTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
-}
 static void *_p_FormFactorSphereUniformRadiusTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereUniformRadius *) x));
 }
@@ -113893,9 +113570,6 @@ static void *_p_InterferenceFunctionRadialParaCrystalTo_p_INamed(void *x, int *S
 static void *_p_InterferenceFunction2DParaCrystalTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(IInterferenceFunction *) ((InterferenceFunction2DParaCrystal *) x));
 }
-static void *_p_MesoCrystalTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
-}
 static void *_p_IFTDistribution2DTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *) ((IFTDistribution2D *) x));
 }
@@ -113941,21 +113615,6 @@ static void *_p_FTDecayFunction1DTriangleTo_p_INamed(void *x, int *SWIGUNUSEDPAR
 static void *_p_RotationEulerTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(IRotation *) ((RotationEuler *) x));
 }
-static void *_p_InterferenceFunction1DLatticeTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IInterferenceFunction *)  ((InterferenceFunction1DLattice *) x));
-}
-static void *_p_InterferenceFunction2DLatticeTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IInterferenceFunction *)  ((InterferenceFunction2DLattice *) x));
-}
-static void *_p_InterferenceFunctionNoneTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IInterferenceFunction *)  ((InterferenceFunctionNone *) x));
-}
-static void *_p_InterferenceFunctionRadialParaCrystalTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IInterferenceFunction *)  ((InterferenceFunctionRadialParaCrystal *) x));
-}
-static void *_p_InterferenceFunction2DParaCrystalTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IInterferenceFunction *)  ((InterferenceFunction2DParaCrystal *) x));
-}
 static void *_p_SquaredFunctionGaussianErrorTo_p_ISquaredFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISquaredFunction *)  ((SquaredFunctionGaussianError *) x));
 }
@@ -113977,6 +113636,21 @@ static void *_p_IntensityFunctionSqrtTo_p_IIntensityFunction(void *x, int *SWIGU
 static void *_p_IntensityFunctionLogTo_p_IIntensityFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IIntensityFunction *)  ((IntensityFunctionLog *) x));
 }
+static void *_p_InterferenceFunction1DLatticeTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IInterferenceFunction *)  ((InterferenceFunction1DLattice *) x));
+}
+static void *_p_InterferenceFunction2DLatticeTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IInterferenceFunction *)  ((InterferenceFunction2DLattice *) x));
+}
+static void *_p_InterferenceFunctionNoneTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IInterferenceFunction *)  ((InterferenceFunctionNone *) x));
+}
+static void *_p_InterferenceFunctionRadialParaCrystalTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IInterferenceFunction *)  ((InterferenceFunctionRadialParaCrystal *) x));
+}
+static void *_p_InterferenceFunction2DParaCrystalTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IInterferenceFunction *)  ((InterferenceFunction2DParaCrystal *) x));
+}
 static void *_p_IntensityScaleAndShiftNormalizerTo_p_IntensityNormalizer(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IntensityNormalizer *)  ((IntensityScaleAndShiftNormalizer *) x));
 }
@@ -114001,9 +113675,6 @@ static void *_p_MultiLayerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newme
 static void *_p_ParameterDistributionTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *)  ((ParameterDistribution *) x));
 }
-static void *_p_ParticleDistributionTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IAbstractParticle *) ((ParticleDistribution *) x));
-}
 static void *_p_FTDecayFunction1DGaussTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (IFTDecayFunction1D *) ((FTDecayFunction1DGauss *) x));
 }
@@ -114079,9 +113750,6 @@ static void *_p_SpecularSimulationTo_p_IParameterized(void *x, int *SWIGUNUSEDPA
 static void *_p_FTDistribution2DConeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (IFTDistribution2D *) ((FTDistribution2DCone *) x));
 }
-static void *_p_ParticleCoreShellTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
-}
 static void *_p_FormFactorFullSphereTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSphere *) x));
 }
@@ -114169,15 +113837,6 @@ static void *_p_IClusteredParticlesTo_p_IParameterized(void *x, int *SWIGUNUSEDP
 static void *_p_IMultiLayerBuilderTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *)  ((IMultiLayerBuilder *) x));
 }
-static void *_p_IAbstractParticleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (ISample *)(ICompositeSample *) ((IAbstractParticle *) x));
-}
-static void *_p_IParticleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IAbstractParticle *) ((IParticle *) x));
-}
-static void *_p_ParticleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((Particle *) x));
-}
 static void *_p_DistributionGateTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (IDistribution1D *) ((DistributionGate *) x));
 }
@@ -114229,9 +113888,6 @@ static void *_p_ResolutionFunction2DGaussianTo_p_IParameterized(void *x, int *SW
 static void *_p_BeamTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *)  ((Beam *) x));
 }
-static void *_p_ParticleCompositionTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
-}
 static void *_p_FormFactorSphereUniformRadiusTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereUniformRadius *) x));
 }
@@ -114295,9 +113951,6 @@ static void *_p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized(void *x
 static void *_p_InterferenceFunction2DParaCrystalTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *)(IInterferenceFunction *) ((InterferenceFunction2DParaCrystal *) x));
 }
-static void *_p_MesoCrystalTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
-}
 static void *_p_IFTDecayFunction2DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *)  ((IFTDecayFunction2D *) x));
 }
@@ -114496,9 +114149,6 @@ static void *_p_FormFactorLongBoxGaussTo_p_ISample(void *x, int *SWIGUNUSEDPARM(
 static void *_p_RotationEulerTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IRotation *) ((RotationEuler *) x));
 }
-static void *_p_ParticleCoreShellTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
-}
 static void *_p_LayerTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (ICompositeSample *) ((Layer *) x));
 }
@@ -114520,9 +114170,6 @@ static void *_p_InterferenceFunctionRadialParaCrystalTo_p_ISample(void *x, int *
 static void *_p_InterferenceFunction2DParaCrystalTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IInterferenceFunction *) ((InterferenceFunction2DParaCrystal *) x));
 }
-static void *_p_MesoCrystalTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (ICompositeSample *)(IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
-}
 static void *_p_FormFactorRipple2To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple2 *) x));
 }
@@ -114544,18 +114191,6 @@ static void *_p_FormFactorLongRipple1GaussTo_p_ISample(void *x, int *SWIGUNUSEDP
 static void *_p_MultiLayerTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (ICompositeSample *) ((MultiLayer *) x));
 }
-static void *_p_ParticleDistributionTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (ICompositeSample *)(IAbstractParticle *) ((ParticleDistribution *) x));
-}
-static void *_p_IAbstractParticleTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (ICompositeSample *) ((IAbstractParticle *) x));
-}
-static void *_p_IParticleTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (ICompositeSample *)(IAbstractParticle *) ((IParticle *) x));
-}
-static void *_p_ParticleTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (ICompositeSample *)(IAbstractParticle *)(IParticle *) ((Particle *) x));
-}
 static void *_p_FormFactorEllipsoidalCylinderTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorEllipsoidalCylinder *) x));
 }
@@ -114661,9 +114296,6 @@ static void *_p_FormFactorPrism3To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmem
 static void *_p_FormFactorSphereUniformRadiusTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereUniformRadius *) x));
 }
-static void *_p_ParticleCompositionTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
-}
 static void *_p_FormFactorLongRipple2GaussTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple2Gauss *) x));
 }
@@ -114673,12 +114305,6 @@ static void *_p_FormFactorGaussTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemo
 static void *_p_IClusteredParticlesTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICompositeSample *)  ((IClusteredParticles *) x));
 }
-static void *_p_ParticleCompositionTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICompositeSample *) (IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
-}
-static void *_p_ParticleDistributionTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICompositeSample *) (IAbstractParticle *) ((ParticleDistribution *) x));
-}
 static void *_p_ILayoutTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICompositeSample *)  ((ILayout *) x));
 }
@@ -114691,36 +114317,9 @@ static void *_p_MultiLayerTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(new
 static void *_p_CrystalTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICompositeSample *) (IClusteredParticles *) ((Crystal *) x));
 }
-static void *_p_MesoCrystalTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICompositeSample *) (IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
-}
-static void *_p_IAbstractParticleTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICompositeSample *)  ((IAbstractParticle *) x));
-}
-static void *_p_IParticleTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICompositeSample *) (IAbstractParticle *) ((IParticle *) x));
-}
 static void *_p_LayerTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICompositeSample *)  ((Layer *) x));
 }
-static void *_p_ParticleTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICompositeSample *) (IAbstractParticle *)(IParticle *) ((Particle *) x));
-}
-static void *_p_ParticleCoreShellTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICompositeSample *) (IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
-}
-static void *_p_ParticleCompositionTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParticle *)  ((ParticleComposition *) x));
-}
-static void *_p_MesoCrystalTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParticle *)  ((MesoCrystal *) x));
-}
-static void *_p_ParticleTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParticle *)  ((Particle *) x));
-}
-static void *_p_ParticleCoreShellTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParticle *)  ((ParticleCoreShell *) x));
-}
 static void *_p_ParticleCompositionTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IAbstractParticle *) (IParticle *) ((ParticleComposition *) x));
 }
@@ -114739,6 +114338,18 @@ static void *_p_ParticleTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newm
 static void *_p_ParticleCoreShellTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IAbstractParticle *) (IParticle *) ((ParticleCoreShell *) x));
 }
+static void *_p_ParticleCompositionTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParticle *)  ((ParticleComposition *) x));
+}
+static void *_p_MesoCrystalTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParticle *)  ((MesoCrystal *) x));
+}
+static void *_p_ParticleTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParticle *)  ((Particle *) x));
+}
+static void *_p_ParticleCoreShellTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParticle *)  ((ParticleCoreShell *) x));
+}
 static void *_p_LayerRoughnessTo_p_IRoughness(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IRoughness *)  ((LayerRoughness *) x));
 }
@@ -115549,9 +115160,9 @@ static swig_cast_info _swigc__p_HomogeneousMaterial[] = {  {&_swigt__p_Homogeneo
 static swig_cast_info _swigc__p_IAbstractParticle[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_IAbstractParticle, 0, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IAbstractParticle, 0, 0},{0, 0, 0, 0}};
 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_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_FormFactorBox, _p_FormFactorBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Polygon, _p_Geometry__PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Ellipse, _p_Geometry__EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_IChiSquaredModule, _p_IChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__HorizontalLine, _p_Geometry__HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_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_FormFactorPrism6, _p_FormFactorPrism6To_p_ICloneable, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_ICloneable, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__IShape2D, _p_Geometry__IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Rectangle, _p_Geometry__RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__VerticalLine, _p_Geometry__VerticalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ICloneable, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Line, _p_Geometry__LineTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ICloneable, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Polygon, _p_Geometry__PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Ellipse, _p_Geometry__EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_IChiSquaredModule, _p_IChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__HorizontalLine, _p_Geometry__HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_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_FormFactorPrism6, _p_FormFactorPrism6To_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_SpecularSimulation, _p_SpecularSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_ICloneable, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__IShape2D, _p_Geometry__IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Rectangle, _p_Geometry__RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__VerticalLine, _p_Geometry__VerticalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Line, _p_Geometry__LineTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_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_ICompositeSample[] = {  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICompositeSample, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICompositeSample, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICompositeSample, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICompositeSample, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICompositeSample, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ICompositeSample, 0, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICompositeSample, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICompositeSample, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICompositeSample, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICompositeSample[] = {  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICompositeSample, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ICompositeSample, 0, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICompositeSample, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICompositeSample, 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}};
 static swig_cast_info _swigc__p_IDetectorResolution[] = {  {&_swigt__p_IDetectorResolution, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IDistribution1D[] = {  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_IDistribution1D, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_IDistribution1D, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_IDistribution1D, 0, 0},  {&_swigt__p_IDistribution1D, 0, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_IDistribution1D, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_IDistribution1D, 0, 0},{0, 0, 0, 0}};
@@ -115575,16 +115186,16 @@ static swig_cast_info _swigc__p_ILayout[] = {  {&_swigt__p_ILayout, 0, 0, 0},  {
 static swig_cast_info _swigc__p_IMaterial[] = {  {&_swigt__p_IMaterial, 0, 0, 0},  {&_swigt__p_HomogeneousMaterial, _p_HomogeneousMaterialTo_p_IMaterial, 0, 0},  {&_swigt__p_HomogeneousMagneticMaterial, _p_HomogeneousMagneticMaterialTo_p_IMaterial, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IMinimizer[] = {  {&_swigt__p_IMinimizer, 0, 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_INamed[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FitStrategyAdjustMinimizer, _p_FitStrategyAdjustMinimizerTo_p_INamed, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INamed, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_INamed, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__Polygon, _p_Geometry__PolygonTo_p_INamed, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__Ellipse, _p_Geometry__EllipseTo_p_INamed, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_INamed, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INamed, 0, 0},  {&_swigt__p_IntensityScaleAndShiftNormalizer, _p_IntensityScaleAndShiftNormalizerTo_p_INamed, 0, 0},  {&_swigt__p_IntensityNormalizer, _p_IntensityNormalizerTo_p_INamed, 0, 0},  {&_swigt__p_IIntensityNormalizer, _p_IIntensityNormalizerTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__HorizontalLine, _p_Geometry__HorizontalLineTo_p_INamed, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_INamed, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_INamed, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INamed, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INamed, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_INamed, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_INamed, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_INamed, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INamed, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INamed, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_INamed, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_INamed, 0, 0},  {&_swigt__p_FitSuiteObjects, _p_FitSuiteObjectsTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INamed, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_INamed, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INamed, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INamed, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__IShape2D, _p_Geometry__IShape2DTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INamed, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__Rectangle, _p_Geometry__RectangleTo_p_INamed, 0, 0},  {&_swigt__p_FitStrategyDefault, _p_FitStrategyDefaultTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__VerticalLine, _p_Geometry__VerticalLineTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_INamed, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_INamed, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_INamed, 0, 0},  {&_swigt__p_IMultiLayerBuilder, _p_IMultiLayerBuilderTo_p_INamed, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INamed, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INamed, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_INamed, 0, 0},  {&_swigt__p_INamed, 0, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_INamed, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_INamed, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INamed, 0, 0},  {&_swigt__p_IMaterial, _p_IMaterialTo_p_INamed, 0, 0},  {&_swigt__p_HomogeneousMaterial, _p_HomogeneousMaterialTo_p_INamed, 0, 0},  {&_swigt__p_HomogeneousMagneticMaterial, _p_HomogeneousMagneticMaterialTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_INamed, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INamed, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_INamed, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_INamed, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__Line, _p_Geometry__LineTo_p_INamed, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_INamed, 0, 0},  {&_swigt__p_FitObject, _p_FitObjectTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_INamed, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_INamed, 0, 0},  {&_swigt__p_IFitStrategy, _p_IFitStrategyTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INamed, 0, 0},  {&_swigt__p_IParameterized, _p_IParameterizedTo_p_INamed, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_INamed, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INamed, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_INamed, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INamed, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INamed, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INamed, 0, 0},  {&_swigt__p_RealParameter, _p_RealParameterTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_INamed, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INamed, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INamed, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_INamed[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FitStrategyAdjustMinimizer, _p_FitStrategyAdjustMinimizerTo_p_INamed, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INamed, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__Polygon, _p_Geometry__PolygonTo_p_INamed, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__Ellipse, _p_Geometry__EllipseTo_p_INamed, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_INamed, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INamed, 0, 0},  {&_swigt__p_IntensityScaleAndShiftNormalizer, _p_IntensityScaleAndShiftNormalizerTo_p_INamed, 0, 0},  {&_swigt__p_IntensityNormalizer, _p_IntensityNormalizerTo_p_INamed, 0, 0},  {&_swigt__p_IIntensityNormalizer, _p_IIntensityNormalizerTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__HorizontalLine, _p_Geometry__HorizontalLineTo_p_INamed, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_INamed, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_INamed, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INamed, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INamed, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_INamed, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_INamed, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_INamed, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INamed, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_INamed, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_INamed, 0, 0},  {&_swigt__p_FitSuiteObjects, _p_FitSuiteObjectsTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INamed, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_INamed, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INamed, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INamed, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__IShape2D, _p_Geometry__IShape2DTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INamed, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__Rectangle, _p_Geometry__RectangleTo_p_INamed, 0, 0},  {&_swigt__p_FitStrategyDefault, _p_FitStrategyDefaultTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__VerticalLine, _p_Geometry__VerticalLineTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_INamed, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_INamed, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_INamed, 0, 0},  {&_swigt__p_IMultiLayerBuilder, _p_IMultiLayerBuilderTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_INamed, 0, 0},  {&_swigt__p_INamed, 0, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_INamed, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INamed, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_INamed, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INamed, 0, 0},  {&_swigt__p_IMaterial, _p_IMaterialTo_p_INamed, 0, 0},  {&_swigt__p_HomogeneousMaterial, _p_HomogeneousMaterialTo_p_INamed, 0, 0},  {&_swigt__p_HomogeneousMagneticMaterial, _p_HomogeneousMagneticMaterialTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_INamed, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INamed, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_INamed, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_INamed, 0, 0},  {&_swigt__p_Geometry__Line, _p_Geometry__LineTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INamed, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_INamed, 0, 0},  {&_swigt__p_FitObject, _p_FitObjectTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_INamed, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_INamed, 0, 0},  {&_swigt__p_IFitStrategy, _p_IFitStrategyTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INamed, 0, 0},  {&_swigt__p_IParameterized, _p_IParameterizedTo_p_INamed, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_INamed, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INamed, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INamed, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INamed, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INamed, 0, 0},  {&_swigt__p_RealParameter, _p_RealParameterTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_INamed, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INamed, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INamed, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IObservable[] = {  {&_swigt__p_IObservable, 0, 0, 0},  {&_swigt__p_FitSuite, _p_FitSuiteTo_p_IObservable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IObserver[] = {  {&_swigt__p_IObserver, 0, 0, 0},  {&_swigt__p_IFitObserver, _p_IFitObserverTo_p_IObserver, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_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_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_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_IntensityScaleAndShiftNormalizer, _p_IntensityScaleAndShiftNormalizerTo_p_IParameterized, 0, 0},  {&_swigt__p_IntensityNormalizer, _p_IntensityNormalizerTo_p_IParameterized, 0, 0},  {&_swigt__p_IIntensityNormalizer, _p_IIntensityNormalizerTo_p_IParameterized, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_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_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IParameterized, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_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_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_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_IParameterized, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IParameterized, 0, 0},  {&_swigt__p_FitSuiteObjects, _p_FitSuiteObjectsTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_IParameterized, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_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_FormFactorGauss, _p_FormFactorGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_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_Particle, _p_ParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_IParameterized, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_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_ParticleComposition, _p_ParticleCompositionTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_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_FitObject, _p_FitObjectTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_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_IRoughness, _p_IRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_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_DistributionLorentz, _p_DistributionLorentzTo_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_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_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_IntensityScaleAndShiftNormalizer, _p_IntensityScaleAndShiftNormalizerTo_p_IParameterized, 0, 0},  {&_swigt__p_IntensityNormalizer, _p_IntensityNormalizerTo_p_IParameterized, 0, 0},  {&_swigt__p_IIntensityNormalizer, _p_IIntensityNormalizerTo_p_IParameterized, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_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_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_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_OffSpecSimulation, _p_OffSpecSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_IParameterized, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IParameterized, 0, 0},  {&_swigt__p_FitSuiteObjects, _p_FitSuiteObjectsTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_IParameterized, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_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_FormFactorGauss, _p_FormFactorGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_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_FormFactorTrivial, _p_FormFactorTrivialTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_IParameterized, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_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_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_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_FitObject, _p_FitObjectTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_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_IRoughness, _p_IRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_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_DistributionLorentz, _p_DistributionLorentzTo_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_IPixelMap[] = {  {&_swigt__p_IPixelMap, 0, 0, 0},  {&_swigt__p_AngularPixelMap, _p_AngularPixelMapTo_p_IPixelMap, 0, 0},  {&_swigt__p_RectPixelMap, _p_RectPixelMapTo_p_IPixelMap, 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_RotationX, _p_RotationXTo_p_IRotation, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IRoughness[] = {  {&_swigt__p_IRoughness, 0, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IRoughness, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ISample[] = {  {&_swigt__p_Layer, _p_LayerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ISample, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ISample, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ISample, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ISample, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ISample, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ISample, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_ISample, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_ISample, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ISample, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_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_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ISample, 0, 0},  {&_swigt__p_ISample, 0, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ISample, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ISample, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_ISample, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ISample, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ISample, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ISample, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_ISample, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_ISample, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ISample[] = {  {&_swigt__p_Layer, _p_LayerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ISample, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ISample, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ISample, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ISample, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_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_Crystal, _p_CrystalTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_ISample, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_ISample, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ISample, 0, 0},  {&_swigt__p_ISample, 0, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ISample, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ISample, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_ISample, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ISample, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ISample, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ISample, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_ISample, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISampleVisitor[] = {  {&_swigt__p_ISampleVisitor, 0, 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_ISquaredFunction[] = {  {&_swigt__p_SquaredFunctionGaussianError, _p_SquaredFunctionGaussianErrorTo_p_ISquaredFunction, 0, 0},  {&_swigt__p_SquaredFunctionMeanSquaredError, _p_SquaredFunctionMeanSquaredErrorTo_p_ISquaredFunction, 0, 0},  {&_swigt__p_ISquaredFunction, 0, 0, 0},  {&_swigt__p_SquaredFunctionDefault, _p_SquaredFunctionDefaultTo_p_ISquaredFunction, 0, 0},  {&_swigt__p_SquaredFunctionSimError, _p_SquaredFunctionSimErrorTo_p_ISquaredFunction, 0, 0},  {&_swigt__p_SquaredFunctionSystematicError, _p_SquaredFunctionSystematicErrorTo_p_ISquaredFunction, 0, 0},{0, 0, 0, 0}};
-- 
GitLab