diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0c054a8404c163a1c51291d0af67209a8f0f68dc..947ee53f4e2c33a0396e0682201fd6685ed0bbea 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -33,8 +33,6 @@ windows:
       - build/
   script:
     - $OPT_DIR = "C:/opt/x64"
-    - $FFTW3_INCLUDE_DIR = "$OPT_DIR/include"
-    - $FFTW3_LIB = "$OPT_DIR/lib/libfftw3-3.lib"
     - $BOOST_DIR = "$OPT_DIR/boost_current"
     - $BOOST_INCLUDE_DIR = "$BOOST_DIR/include"
     - $BOOST_LIB_DIR = "$BOOST_DIR/lib"
@@ -53,10 +51,11 @@ windows:
     - if($CI_PIPELINE_SOURCE -eq "schedule") { mkdir -Force $BUILD_DIR; echo "scheduled build" }
     - if(!(Test-Path -path $BUILD_DIR)) { mkdir -Force $BUILD_DIR; echo "build from scratch" }
     - cd $BUILD_DIR
+    - Remove-Item CM* -Recurse
     - pwd
     - echo "#--- CONFIGURE ---"
     - cmake --version
-    - cmake -G "Visual Studio 16 2019" -A x64 -T host=x64 -DLIB_MAN=OFF -DQTDIR="$QT_MSVC_DIR" -DQt5_DIR="$QTCMake_DIR/Qt5" -DQt5Test_DIR="$QTCMake_DIR/Qt5Test" -DFFTW3_INCLUDE_DIR="$FFTW3_INCLUDE_DIR" -DFFTW3_LIBRARY="$FFTW3_LIB" -DCMAKE_INCLUDE_PATH="$OPT_DIR/include;$BOOST_INCLUDE_DIR" -DCMAKE_LIBRARY_PATH="$OPT_DIR/lib;$BOOST_LIB_DIR" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_CXX_COMPILER="cl.exe" -B. ..
+    - cmake -G "Visual Studio 16 2019" -A x64 -T host=x64 -DLIB_MAN=OFF -DQTDIR="$QT_MSVC_DIR" -DQt5_DIR="$QTCMake_DIR/Qt5" -DQt5Test_DIR="$QTCMake_DIR/Qt5Test" -DCMAKE_INCLUDE_PATH="$OPT_DIR/include;$BOOST_INCLUDE_DIR" -DCMAKE_LIBRARY_PATH="$OPT_DIR/lib;$BOOST_LIB_DIR" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_CXX_COMPILER="cl.exe" -B. ..
     - echo "#--- BUILD ---"
     - pwd
     - if($CI_PIPELINE_SOURCE -eq "schedule") { cmake --build . --target clean }
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 89606bb2f135cdc2a39d6c0d66c6eafecbd95eea..0d2d9bc3d6518bdc652d7a88ca4a2c4f85a2d04a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -150,9 +150,6 @@ add_subdirectory(Fit)
 add_subdirectory(Fit/Test/Unit)
 add_subdirectory(Fit/Test/Functional)
 
-# TEMPORARY formfactor
-add_subdirectory(ff)
-
 ## recurse into the given subdirectories
 
 # BornAgain components are built as separate shared libraries
@@ -178,6 +175,9 @@ if(BORNAGAIN_TIDY)
     set(CMAKE_CXX_CLANG_TIDY "clang-tidy") # has effect only if compiler is clang; uses .clang-tidy
 endif()
 
+################################## TEMPORARY formfactor ####################################
+add_subdirectory(ff)
+
 # core components
 foreach(lib ${CoreComponents})
     add_subdirectory(${lib})
diff --git a/Core/Export/SampleToPython.cpp b/Core/Export/SampleToPython.cpp
index ea7d48ef82618255f50baec263e077f5e6e0d0a2..57a3a7465a6ba76de7f780a29c5f116a8fe91db8 100644
--- a/Core/Export/SampleToPython.cpp
+++ b/Core/Export/SampleToPython.cpp
@@ -357,7 +357,7 @@ std::string SampleToPython::defineParticleLayouts() const
     for (const auto* s : v) {
         const std::string& key = m_objs->obj2key(s);
         result << indent() << key << " = ba.ParticleLayout()\n";
-        const auto particles = NodeUtils::ChildNodesOfType<IAbstractParticle>(*s);
+        const auto particles = NodeUtils::ChildNodesOfType<IParticle>(*s);
         for (const auto* particle : particles) {
             double abundance = particle->abundance();
             result << indent() << key << ".addParticle(" << m_objs->obj2key(particle) << ", "
diff --git a/Param/Node/INodeVisitor.h b/Param/Node/INodeVisitor.h
index 1cfe134136c3607c1770e6aa897a4528f8aa445b..9093e15ade631fc84e4db35f9302127c57600585 100644
--- a/Param/Node/INodeVisitor.h
+++ b/Param/Node/INodeVisitor.h
@@ -89,7 +89,6 @@ class FormFactorTruncatedSpheroid;
 class FormFactorWeighted;
 class GISASSimulation;
 class HexagonalLattice2D;
-class IAbstractParticle;
 class IBornFF;
 class IClusteredParticles;
 class IFormFactor;
@@ -217,7 +216,6 @@ public:
     virtual void visit(const FormFactorWeighted*) {}
     virtual void visit(const GISASSimulation*) {}
     virtual void visit(const HexagonalLattice2D*) {}
-    virtual void visit(const IAbstractParticle*) {}
     virtual void visit(const IBornFF*) {}
     virtual void visit(const IClusteredParticles*) {}
     virtual void visit(const IFormFactor*) {}
diff --git a/Sample/Aggregate/ParticleLayout.cpp b/Sample/Aggregate/ParticleLayout.cpp
index 71da246bf87ff7cb320ce069d7ef52cbd954ef1a..6ab69bc39f7db363dcd59a5a344581639c603a37 100644
--- a/Sample/Aggregate/ParticleLayout.cpp
+++ b/Sample/Aggregate/ParticleLayout.cpp
@@ -21,7 +21,7 @@ ParticleLayout::ParticleLayout()
 {
 }
 
-ParticleLayout::ParticleLayout(const IAbstractParticle& particle, double abundance)
+ParticleLayout::ParticleLayout(const IParticle& particle, double abundance)
     : m_weight(1.0), m_total_particle_density(0.01), m_interparticle(nullptr)
 {
     addParticle(particle, abundance);
@@ -50,10 +50,10 @@ ParticleLayout* ParticleLayout::clone() const
 //! @param abundance Particle abundance
 //! @param position Particle position
 //! @param rotation Particle rotation
-void ParticleLayout::addParticle(const IAbstractParticle& particle, double abundance,
+void ParticleLayout::addParticle(const IParticle& particle, double abundance,
                                  const R3 position, const IRotation& rotation)
 {
-    IAbstractParticle* particle_clone = particle.clone();
+    IParticle* particle_clone = particle.clone();
     if (abundance >= 0.0)
         particle_clone->setAbundance(abundance);
     if (!rotation.isIdentity())
@@ -64,7 +64,7 @@ void ParticleLayout::addParticle(const IAbstractParticle& particle, double abund
 }
 
 //! Returns information on all particles (type and abundance)
-//! and generates new particles if an IAbstractParticle denotes a collection
+//! and generates new particles if an IParticle denotes a collection
 SafePointerVector<IParticle> ParticleLayout::particles() const
 {
     SafePointerVector<IParticle> particle_vector;
@@ -122,7 +122,7 @@ std::vector<const INode*> ParticleLayout::getChildren() const
 }
 
 //! Adds particle information with simultaneous registration in parent class.
-void ParticleLayout::addAndRegisterAbstractParticle(IAbstractParticle* child)
+void ParticleLayout::addAndRegisterAbstractParticle(IParticle* child)
 {
     m_particles.push_back(child);
 }
diff --git a/Sample/Aggregate/ParticleLayout.h b/Sample/Aggregate/ParticleLayout.h
index 499527d8c888d249b55c70147f35a476c82a41fc..dae277e9036b982720e1dcc697e59c90b9c5496f 100644
--- a/Sample/Aggregate/ParticleLayout.h
+++ b/Sample/Aggregate/ParticleLayout.h
@@ -20,7 +20,7 @@
 #include "Sample/Scattering/Rotations.h"
 #include <memory>
 
-class IAbstractParticle;
+class IParticle;
 class IInterference;
 class IParticle;
 
@@ -33,14 +33,14 @@ public:
     std::string className() const final { return class_name; }
 
     ParticleLayout();
-    ParticleLayout(const IAbstractParticle& particle, double abundance = -1.0);
+    ParticleLayout(const IParticle& particle, double abundance = -1.0);
     ~ParticleLayout() override;
 
     ParticleLayout* clone() const override;
 
     void accept(INodeVisitor* visitor) const override { visitor->visit(this); }
 
-    void addParticle(const IAbstractParticle& particle, double abundance = -1.0, R3 position = {},
+    void addParticle(const IParticle& particle, double abundance = -1.0, R3 position = {},
                      const IRotation& rotation = IdentityRotation());
 
     SafePointerVector<IParticle> particles() const;
@@ -65,12 +65,12 @@ public:
     double weightedParticleSurfaceDensity() const;
 
 private:
-    void addAndRegisterAbstractParticle(IAbstractParticle* child);
+    void addAndRegisterAbstractParticle(IParticle* child);
     void setAndRegisterInterference(IInterference* child);
 
     double m_weight;
     double m_total_particle_density;
-    SafePointerVector<IAbstractParticle> m_particles; //!< Vector of particle types
+    SafePointerVector<IParticle> m_particles; //!< Vector of particle types
     std::unique_ptr<IInterference> m_interparticle;
 };
 
diff --git a/Sample/Particle/IAbstractParticle.cpp b/Sample/Particle/IAbstractParticle.cpp
deleted file mode 100644
index 9a09f04b02dbf06b747060197bf447ddd1955659..0000000000000000000000000000000000000000
--- a/Sample/Particle/IAbstractParticle.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Sample/Particle/IAbstractParticle.cpp
-//! @brief     Defines interface IAParticle.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "Sample/Particle/IAbstractParticle.h"
-
-IAbstractParticle::IAbstractParticle(const NodeMeta& meta, const std::vector<double>& PValues)
-    : ISampleNode(meta, PValues)
-{
-}
-
-void IAbstractParticle::accept(INodeVisitor* visitor) const
-{
-    visitor->visit(this);
-}
diff --git a/Sample/Particle/IAbstractParticle.h b/Sample/Particle/IAbstractParticle.h
deleted file mode 100644
index 7f9b537a6575e0244dad42abe687c100d7ceb9ac..0000000000000000000000000000000000000000
--- a/Sample/Particle/IAbstractParticle.h
+++ /dev/null
@@ -1,58 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Sample/Particle/IAbstractParticle.h
-//! @brief     Defines interface IAbstractParticle.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifndef USER_API
-#ifndef BORNAGAIN_SAMPLE_PARTICLE_IABSTRACTPARTICLE_H
-#define BORNAGAIN_SAMPLE_PARTICLE_IABSTRACTPARTICLE_H
-
-#include "Sample/Scattering/ISampleNode.h"
-#include <heinz/Vectors3D.h>
-
-class IRotation;
-
-//! Interface for a generic particle.
-//!
-//! Inherited by IParticle.
-
-//! @ingroup samples
-
-class IAbstractParticle : public ISampleNode {
-public:
-    IAbstractParticle() = default;
-    IAbstractParticle(const NodeMeta& meta, const std::vector<double>& PValues);
-    ~IAbstractParticle() override = default;
-
-    IAbstractParticle* clone() const override = 0;
-
-    void accept(INodeVisitor* visitor) const override;
-
-    double abundance() const { return m_abundance; }
-
-    //! Sets particle abundance.
-    //! @param abundance: proportion of this type of particles normalized to the
-    //! total number of particles in the layout.
-    void setAbundance(double abundance) { m_abundance = abundance; }
-
-    //! Translates the particle with the given vector
-    virtual void translate(R3 translation) = 0;
-
-    //! Applies the given rotation to the particle
-    virtual void rotate(const IRotation& rotation) = 0;
-
-protected:
-    double m_abundance{1.0}; // not a Parameter
-};
-
-#endif // BORNAGAIN_SAMPLE_PARTICLE_IABSTRACTPARTICLE_H
-#endif // USER_API
diff --git a/Sample/Particle/IParticle.h b/Sample/Particle/IParticle.h
index 8f70cbab0e7242d3b4e975a3981e3acbd6345d7b..8630f769c2079764832bf9725c431b9f330ec740 100644
--- a/Sample/Particle/IParticle.h
+++ b/Sample/Particle/IParticle.h
@@ -16,8 +16,8 @@
 #ifndef BORNAGAIN_SAMPLE_PARTICLE_IPARTICLE_H
 #define BORNAGAIN_SAMPLE_PARTICLE_IPARTICLE_H
 
+#include "Sample/Scattering/ISampleNode.h"
 #include "Base/Types/SafePointerVector.h"
-#include "Sample/Particle/IAbstractParticle.h"
 #include <heinz/Vectors3D.h>
 #include <memory>
 
@@ -26,11 +26,11 @@ class Rotations;
 class ZLimits;
 
 //! Abstract base class for Particle, ParticleComposition, ParticleCoreShell, MesoCrystal.
-//! Provides position/rotation and form factor. Abundance is inherited from IAbstractParticle.
+//! Provides position/rotation and form factor. Abundance is inherited from IParticle.
 //!
 //! @ingroup samples
 
-class IParticle : public IAbstractParticle {
+class IParticle : public ISampleNode {
 public:
     ~IParticle() override;
     IParticle* clone() const override = 0;
@@ -41,6 +41,13 @@ public:
     //! Creates a sliced form factor for this particle
     virtual SlicedParticle createSlicedParticle(const ZLimits& limits) const;
 
+    double abundance() const { return m_abundance; }
+
+    //! Sets particle abundance.
+    //! @param abundance: proportion of this type of particles normalized to the
+    //! total number of particles in the layout.
+    void setAbundance(double abundance) { m_abundance = abundance; }
+
     //! Returns particle position.
     R3 position() const { return m_position; }
 
@@ -57,7 +64,7 @@ public:
     void setPosition(double x, double y, double z) { m_position = R3(x, y, z); }
 
     //! Translates the particle
-    void translate(R3 translation) override;
+    void translate(R3 translation);
 
     //! Returns rotation object
     const IRotation* rotation() const;
@@ -66,7 +73,7 @@ public:
     void setRotation(const IRotation& rotation);
 
     //! Rotates the particle
-    void rotate(const IRotation& rotation) override;
+    void rotate(const IRotation& rotation);
 
     std::vector<const INode*> getChildren() const override;
 
@@ -77,6 +84,7 @@ public:
     virtual ZLimits zSpan() const;
 
 protected:
+    double m_abundance{1.0}; // not a Parameter
     R3 m_position;
     std::unique_ptr<IRotation> m_rotation;
 };
diff --git a/Sample/Particle/Particle.cpp b/Sample/Particle/Particle.cpp
index 889c5abb47ecc1fdb3430ae4cc0fa2df4a5ee576..b0cc8d5c06930857ca03e5207366fec83b961fbb 100644
--- a/Sample/Particle/Particle.cpp
+++ b/Sample/Particle/Particle.cpp
@@ -23,30 +23,22 @@
 
 Particle::~Particle() = default;
 
-Particle::Particle(Material material) : m_material(std::move(material))
-{
-    initialize();
-}
-
 Particle::Particle(Material material, const IFormFactor& form_factor)
     : m_material(std::move(material)), m_form_factor(form_factor.clone())
 {
-    initialize();
 }
 
 Particle::Particle(Material material, const IFormFactor& form_factor, const IRotation& rotation)
-    : m_material(std::move(material)), m_form_factor(form_factor.clone())
+    : Particle(material, form_factor)
 {
-    initialize();
     setRotation(rotation);
 }
 
 Particle* Particle::clone() const
 {
-    auto* p_result = new Particle(m_material);
+    ASSERT(m_form_factor);
+    auto* p_result = new Particle(m_material, *m_form_factor);
     p_result->setAbundance(m_abundance);
-    if (m_form_factor)
-        p_result->setFormFactor(*m_form_factor);
     if (m_rotation)
         p_result->setRotation(*m_rotation);
     p_result->setPosition(m_position);
@@ -71,20 +63,7 @@ SlicedParticle Particle::createSlicedParticle(const ZLimits& limits) const
     return {std::move(sliced_ff), {{{volume, transformed_material}}}};
 }
 
-void Particle::setMaterial(Material material)
-{
-    m_material = std::move(material);
-}
-
-void Particle::setFormFactor(const IFormFactor& form_factor)
-{
-    if (&form_factor != m_form_factor.get())
-        m_form_factor.reset(form_factor.clone());
-}
-
 std::vector<const INode*> Particle::getChildren() const
 {
     return std::vector<const INode*>() << IParticle::getChildren() << m_form_factor;
 }
-
-void Particle::initialize() {}
diff --git a/Sample/Particle/Particle.h b/Sample/Particle/Particle.h
index 9eed5376e81b57cca6efd4171af09e3ffdad829a..09be81a0bc1dd2eed75e65dcaa294d95c8c8e2fc 100644
--- a/Sample/Particle/Particle.h
+++ b/Sample/Particle/Particle.h
@@ -25,7 +25,6 @@ class Particle : public IParticle {
 public:
     std::string className() const override { return "Particle"; }
 
-    Particle(Material material);
     Particle(Material material, const IFormFactor& form_factor);
     Particle(Material material, const IFormFactor& form_factor, const IRotation& rotation);
     ~Particle() override;
@@ -36,7 +35,6 @@ public:
 
     SlicedParticle createSlicedParticle(const ZLimits& limits) const override;
 
-    void setMaterial(Material material);
     const Material* material() const override { return &m_material; }
 
     std::vector<const INode*> getChildren() const override;
@@ -44,10 +42,6 @@ public:
 protected:
     Material m_material;
     std::unique_ptr<IFormFactor> m_form_factor;
-
-private:
-    void initialize();
-    void setFormFactor(const IFormFactor& form_factor);
 };
 
 #endif // BORNAGAIN_SAMPLE_PARTICLE_PARTICLE_H
diff --git a/Tests/Unit/Core/ParticleLayoutTest.cpp b/Tests/Unit/Core/ParticleLayoutTest.cpp
index cf2f70ec5f30d8af7c9305f42caf875979d937aa..07162753f17d14177ab130d22e215b67bb7ebb26 100644
--- a/Tests/Unit/Core/ParticleLayoutTest.cpp
+++ b/Tests/Unit/Core/ParticleLayoutTest.cpp
@@ -3,6 +3,7 @@
 #include "Param/Node/NodeUtils.h"
 #include "Sample/Aggregate/Interference1DLattice.h"
 #include "Sample/Aggregate/InterferenceNone.h"
+#include "Sample/HardParticle/FormFactorFullSphere.h"
 #include "Sample/Material/MaterialFactoryFuncs.h"
 #include "Sample/Particle/Particle.h"
 #include "Tests/GTestWrapper/google_test.h"
@@ -16,22 +17,24 @@ TEST_F(ParticleLayoutTest, ParticleLayoutInitial)
 {
     ParticleLayout particleDecoration;
     const auto* p_iff = NodeUtils::OnlyChildOfType<IInterference>(particleDecoration);
-    auto particles = NodeUtils::ChildNodesOfType<IAbstractParticle>(particleDecoration);
+    auto particles = NodeUtils::ChildNodesOfType<IParticle>(particleDecoration);
     EXPECT_EQ(size_t(0), particles.size());
     EXPECT_EQ(nullptr, p_iff);
 }
 
 TEST_F(ParticleLayoutTest, ParticleLayoutInitByValue)
 {
-    Particle particle(HomogeneousMaterial());
+    FormFactorFullSphere ff(5.);
+
+    Particle particle(HomogeneousMaterial(), ff);
 
     ParticleLayout particleDecoration(particle, 2.0);
     const auto* p_iff = NodeUtils::OnlyChildOfType<IInterference>(particleDecoration);
-    auto particles = NodeUtils::ChildNodesOfType<IAbstractParticle>(particleDecoration);
+    auto particles = NodeUtils::ChildNodesOfType<IParticle>(particleDecoration);
     EXPECT_EQ(size_t(1), particles.size());
     EXPECT_EQ(nullptr, p_iff);
 
-    const IAbstractParticle* p_particle = particles[0];
+    const IParticle* p_particle = particles[0];
     EXPECT_TRUE(nullptr != p_particle);
     EXPECT_EQ(2.0, particleDecoration.getTotalAbundance());
 }
@@ -40,10 +43,12 @@ TEST_F(ParticleLayoutTest, ParticleLayoutAddParticle)
 {
     ParticleLayout particleDecoration;
 
-    Particle particle1(HomogeneousMaterial());
-    Particle particle2(HomogeneousMaterial());
-    Particle particle3(HomogeneousMaterial());
-    Particle particle4(HomogeneousMaterial());
+    FormFactorFullSphere ff(5.);
+
+    Particle particle1(HomogeneousMaterial(), ff);
+    Particle particle2(HomogeneousMaterial(), ff);
+    Particle particle3(HomogeneousMaterial(), ff);
+    Particle particle4(HomogeneousMaterial(), ff);
 
     RotationZ transform3(45. * Units::deg);
     RotationZ transform4(45. * Units::deg);
@@ -52,23 +57,23 @@ TEST_F(ParticleLayoutTest, ParticleLayoutAddParticle)
     particleDecoration.addParticle(particle2, 2.2);
     particleDecoration.addParticle(particle3, 1.0, R3(0, 0, 0), transform3);
     particleDecoration.addParticle(particle4, 4.2, R3(0, 0, 0), transform4);
-    auto particles = NodeUtils::ChildNodesOfType<IAbstractParticle>(particleDecoration);
+    auto particles = NodeUtils::ChildNodesOfType<IParticle>(particleDecoration);
 
     EXPECT_EQ(size_t(4), particles.size());
 
-    const IAbstractParticle* p_particle1 = particles[0];
+    const IParticle* p_particle1 = particles[0];
     EXPECT_TRUE(nullptr != p_particle1);
     EXPECT_EQ(1.0, p_particle1->abundance());
 
-    const IAbstractParticle* p_particle2 = particles[1];
+    const IParticle* p_particle2 = particles[1];
     EXPECT_TRUE(nullptr != p_particle2);
     EXPECT_EQ(2.2, p_particle2->abundance());
 
-    const IAbstractParticle* p_particle3 = particles[2];
+    const IParticle* p_particle3 = particles[2];
     EXPECT_TRUE(nullptr != p_particle3);
     EXPECT_EQ(1.0, p_particle3->abundance());
 
-    const IAbstractParticle* p_particle4 = particles[3];
+    const IParticle* p_particle4 = particles[3];
     EXPECT_TRUE(nullptr != p_particle4);
     EXPECT_EQ(4.2, p_particle4->abundance());
 }
@@ -77,10 +82,12 @@ TEST_F(ParticleLayoutTest, ParticleLayoutAbundanceFraction)
 {
     ParticleLayout particleDecoration;
 
-    Particle particle1(HomogeneousMaterial());
-    Particle particle2(HomogeneousMaterial());
-    Particle particle3(HomogeneousMaterial());
-    Particle particle4(HomogeneousMaterial());
+    FormFactorFullSphere ff(5.);
+
+    Particle particle1(HomogeneousMaterial(), ff);
+    Particle particle2(HomogeneousMaterial(), ff);
+    Particle particle3(HomogeneousMaterial(), ff);
+    Particle particle4(HomogeneousMaterial(), ff);
 
     RotationY transform3(45. * Units::deg);
     RotationZ transform4(45. * Units::deg);
@@ -96,10 +103,12 @@ TEST_F(ParticleLayoutTest, ParticleLayoutClone)
 {
     ParticleLayout particleDecoration;
 
-    Particle particle1(HomogeneousMaterial());
-    Particle particle2(HomogeneousMaterial());
-    Particle particle3(HomogeneousMaterial());
-    Particle particle4(HomogeneousMaterial());
+    FormFactorFullSphere ff(5.);
+
+    Particle particle1(HomogeneousMaterial(), ff);
+    Particle particle2(HomogeneousMaterial(), ff);
+    Particle particle3(HomogeneousMaterial(), ff);
+    Particle particle4(HomogeneousMaterial(), ff);
 
     RotationY transform3(45. * Units::deg);
     RotationZ transform4(45. * Units::deg);
@@ -110,7 +119,7 @@ TEST_F(ParticleLayoutTest, ParticleLayoutClone)
     particleDecoration.addParticle(particle4, 4.0, R3(0, 0, 0), transform4);
 
     Material mat5 = HomogeneousMaterial("core", 0, 0);
-    Particle particle5(mat5);
+    Particle particle5(mat5, ff);
     particleDecoration.addParticle(particle5, 0.0);
 
     InterferenceNone iff_none;
@@ -119,25 +128,25 @@ TEST_F(ParticleLayoutTest, ParticleLayoutClone)
     particleDecoration.setInterference(iff_none);
 
     ParticleLayout* clone = particleDecoration.clone();
-    auto particles = NodeUtils::ChildNodesOfType<IAbstractParticle>(*clone);
+    auto particles = NodeUtils::ChildNodesOfType<IParticle>(*clone);
 
-    const IAbstractParticle* p_particle1 = particles[0];
+    const IParticle* p_particle1 = particles[0];
     EXPECT_TRUE(nullptr != p_particle1);
     EXPECT_EQ(1.0, p_particle1->abundance());
 
-    const IAbstractParticle* p_particle2 = particles[1];
+    const IParticle* p_particle2 = particles[1];
     EXPECT_TRUE(nullptr != p_particle2);
     EXPECT_EQ(2.0, p_particle2->abundance());
 
-    const IAbstractParticle* p_particle3 = particles[2];
+    const IParticle* p_particle3 = particles[2];
     EXPECT_TRUE(nullptr != p_particle3);
     EXPECT_EQ(1.0, p_particle3->abundance());
 
-    const IAbstractParticle* p_particle4 = particles[3];
+    const IParticle* p_particle4 = particles[3];
     EXPECT_TRUE(nullptr != p_particle4);
     EXPECT_EQ(4.0, p_particle4->abundance());
 
-    const IAbstractParticle* p_particle5 = particles[4];
+    const IParticle* p_particle5 = particles[4];
     EXPECT_TRUE(nullptr != p_particle5);
     EXPECT_EQ(0.0, p_particle5->abundance());
 
@@ -164,7 +173,9 @@ TEST_F(ParticleLayoutTest, getChildren)
     std::vector<const INode*> children = layout.getChildren();
     EXPECT_EQ(children.size(), 0u);
 
-    layout.addParticle(Particle(HomogeneousMaterial()));
+    FormFactorFullSphere ff(5.);
+
+    layout.addParticle(Particle(HomogeneousMaterial(), ff));
     layout.setInterference(Interference1DLattice(1.0, 2.0));
     children = layout.getChildren();
     EXPECT_EQ(children.size(), 2u);
diff --git a/Tests/Unit/Sample/ParticleCompositionTest.cpp b/Tests/Unit/Sample/ParticleCompositionTest.cpp
index 5eee24e7f11f6d0842493ebd4ca58e257c128066..1edc5085e335962508071314998db68a7682dc3f 100644
--- a/Tests/Unit/Sample/ParticleCompositionTest.cpp
+++ b/Tests/Unit/Sample/ParticleCompositionTest.cpp
@@ -22,7 +22,8 @@ TEST_F(ParticleCompositionTest, ParticleCompositionClone)
     ParticleComposition composition;
     R3 position = R3(1.0, 1.0, 1.0);
     Material material = HomogeneousMaterial("Vacuum", 0.0, 0.0);
-    Particle particle(material);
+    FormFactorFullSphere ff(5.);
+    Particle particle(material, ff);
     composition.addParticle(particle, position);
 
     std::unique_ptr<ParticleComposition> clone(composition.clone());
diff --git a/Tests/Unit/Sample/ParticleCoreShellTest.cpp b/Tests/Unit/Sample/ParticleCoreShellTest.cpp
index f1168a4e97879084a440307f6c4e21063c97675d..7cacedcddc35199d30cc4b6a92ba9b85eb757d0e 100644
--- a/Tests/Unit/Sample/ParticleCoreShellTest.cpp
+++ b/Tests/Unit/Sample/ParticleCoreShellTest.cpp
@@ -7,32 +7,7 @@
 #include "Sample/Scattering/Rotations.h"
 #include "Tests/GTestWrapper/google_test.h"
 
-class ParticleCoreShellTest : public ::testing::Test {
-protected:
-    ParticleCoreShellTest();
-    ~ParticleCoreShellTest() override;
-
-    ParticleCoreShell* m_coreshell{nullptr};
-};
-
-ParticleCoreShellTest::ParticleCoreShellTest() : m_coreshell(nullptr)
-{
-    Material mat = HomogeneousMaterial("Ag", 1.245e-5, 5.419e-7);
-    Particle core(mat);
-    Particle shell(mat);
-    R3 position;
-    m_coreshell = new ParticleCoreShell(shell, core, position);
-}
-
-ParticleCoreShellTest::~ParticleCoreShellTest()
-{
-    delete m_coreshell;
-}
-
-TEST_F(ParticleCoreShellTest, InitialState)
-{
-    EXPECT_EQ(nullptr, m_coreshell->rotation());
-}
+class ParticleCoreShellTest : public ::testing::Test {};
 
 TEST_F(ParticleCoreShellTest, ComplexCoreShellClone)
 {
diff --git a/Wrap/Swig/libBornAgainSample.i b/Wrap/Swig/libBornAgainSample.i
index 17d191ab0aeac75e9effc1aeccaf4febf35baa3f..ba44b5857886a24a93a185c7dbd843540427d99d 100644
--- a/Wrap/Swig/libBornAgainSample.i
+++ b/Wrap/Swig/libBornAgainSample.i
@@ -130,7 +130,6 @@
 
 %include "Sample/Particle/FormFactorCrystal.h"
 %include "Sample/Particle/FormFactorWeighted.h"
-%include "Sample/Particle/IAbstractParticle.h"
 %include "Sample/Particle/Crystal.h"
 %include "Sample/Particle/IParticle.h"
 %include "Sample/Particle/MesoCrystal.h"
diff --git a/auto/Doc/man/bornagain.1 b/auto/Doc/man/bornagain.1
index 1abbe2bfc4582f0cc481eb032118e34b8b5eff1e..3a43708bef531db48ce991af8c1a9a5bb66b0865 100644
--- a/auto/Doc/man/bornagain.1
+++ b/auto/Doc/man/bornagain.1
@@ -133,7 +133,7 @@
 .\" ========================================================================
 .\"
 .IX Title "BORNAGAIN 1"
-.TH BORNAGAIN 1 "2020-11-23" "perl v5.32.1" "BornAgain manual"
+.TH BORNAGAIN 1 "2021-03-09" "perl v5.32.1" "BornAgain manual"
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
diff --git a/auto/Wrap/doxygenParam.i b/auto/Wrap/doxygenParam.i
index d1b50863ef6f804d30e6bac7dd708f9b5d967476..0bb00b3e70f4b4d7bc9997252726106535374e61 100644
--- a/auto/Wrap/doxygenParam.i
+++ b/auto/Wrap/doxygenParam.i
@@ -727,9 +727,6 @@ C++ includes: INodeVisitor.h
 %feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const HexagonalLattice2D *)
 ";
 
-%feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const IAbstractParticle *)
-";
-
 %feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const IBornFF *)
 ";
 
diff --git a/auto/Wrap/doxygenSample.i b/auto/Wrap/doxygenSample.i
index a604e8a6599d30573fd008ddbf94d784ef8015f9..a0b9d4145340eeb7f5b2954a58fde128083ef636 100644
--- a/auto/Wrap/doxygenSample.i
+++ b/auto/Wrap/doxygenSample.i
@@ -2526,58 +2526,6 @@ C++ includes: Lattice2D.h
 ";
 
 
-// File: classIAbstractParticle.xml
-%feature("docstring") IAbstractParticle "
-
-Interface for a generic particle.
-
-Inherited by  IParticle.
-
-C++ includes: IAbstractParticle.h
-";
-
-%feature("docstring")  IAbstractParticle::IAbstractParticle "IAbstractParticle::IAbstractParticle()=default
-";
-
-%feature("docstring")  IAbstractParticle::IAbstractParticle "IAbstractParticle::IAbstractParticle(const NodeMeta &meta, const std::vector< double > &PValues)
-";
-
-%feature("docstring")  IAbstractParticle::~IAbstractParticle "IAbstractParticle::~IAbstractParticle() override=default
-";
-
-%feature("docstring")  IAbstractParticle::clone "IAbstractParticle* IAbstractParticle::clone() const override=0
-
-Returns a clone of this  ISampleNode object. 
-";
-
-%feature("docstring")  IAbstractParticle::accept "void IAbstractParticle::accept(INodeVisitor *visitor) const override
-";
-
-%feature("docstring")  IAbstractParticle::abundance "double IAbstractParticle::abundance() const
-";
-
-%feature("docstring")  IAbstractParticle::setAbundance "void IAbstractParticle::setAbundance(double abundance)
-
-Sets particle abundance.
-
-Parameters:
------------
-
-abundance: 
-proportion of this type of particles normalized to the total number of particles in the layout. 
-";
-
-%feature("docstring")  IAbstractParticle::translate "virtual void IAbstractParticle::translate(R3 translation)=0
-
-Translates the particle with the given vector. 
-";
-
-%feature("docstring")  IAbstractParticle::rotate "virtual void IAbstractParticle::rotate(const IRotation &rotation)=0
-
-Applies the given rotation to the particle. 
-";
-
-
 // File: classIBornFF.xml
 %feature("docstring") IBornFF "
 
@@ -2855,9 +2803,6 @@ Returns the z-coordinate of the lowest point in this shape after a given rotatio
 Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
 ";
 
-%feature("docstring")  IFormFactorPolyhedron::evaluate_centered "complex_t IFormFactorPolyhedron::evaluate_centered(C3 q) const
-";
-
 %feature("docstring")  IFormFactorPolyhedron::volume "double IFormFactorPolyhedron::volume() const override
 
 Returns the total volume of the particle of this form factor's shape. 
@@ -3746,7 +3691,7 @@ Returns a clone of this  ISampleNode object.
 // File: classIParticle.xml
 %feature("docstring") IParticle "
 
-Abstract base class for  Particle,  ParticleComposition,  ParticleCoreShell,  MesoCrystal. Provides position/rotation and form factor. Abundance is inherited from  IAbstractParticle.
+Abstract base class for  Particle,  ParticleComposition,  ParticleCoreShell,  MesoCrystal. Provides position/rotation and form factor. Abundance is inherited from  IParticle.
 
 C++ includes: IParticle.h
 ";
@@ -3769,6 +3714,20 @@ Creates a form factor for this particle.
 Creates a sliced form factor for this particle. 
 ";
 
+%feature("docstring")  IParticle::abundance "double IParticle::abundance() const
+";
+
+%feature("docstring")  IParticle::setAbundance "void IParticle::setAbundance(double abundance)
+
+Sets particle abundance.
+
+Parameters:
+-----------
+
+abundance: 
+proportion of this type of particles normalized to the total number of particles in the layout. 
+";
+
 %feature("docstring")  IParticle::position "R3 IParticle::position() const
 
 Returns particle position. 
@@ -3802,7 +3761,7 @@ z:
 z-coordinate in nanometers 
 ";
 
-%feature("docstring")  IParticle::translate "void IParticle::translate(R3 translation) override
+%feature("docstring")  IParticle::translate "void IParticle::translate(R3 translation)
 
 Translates the particle. 
 ";
@@ -3817,7 +3776,7 @@ Returns rotation object.
 Sets transformation. 
 ";
 
-%feature("docstring")  IParticle::rotate "void IParticle::rotate(const IRotation &rotation) override
+%feature("docstring")  IParticle::rotate "void IParticle::rotate(const IRotation &rotation)
 
 Rotates the particle. 
 ";
@@ -4860,9 +4819,6 @@ C++ includes: Particle.h
 %feature("docstring")  Particle::className "std::string Particle::className() const override
 ";
 
-%feature("docstring")  Particle::Particle "Particle::Particle(Material material)
-";
-
 %feature("docstring")  Particle::Particle "Particle::Particle(Material material, const IFormFactor &form_factor)
 ";
 
@@ -4885,9 +4841,6 @@ Returns a clone of this  ISampleNode object.
 Creates a sliced form factor for this particle. 
 ";
 
-%feature("docstring")  Particle::setMaterial "void Particle::setMaterial(Material material)
-";
-
 %feature("docstring")  Particle::material "const Material* Particle::material() const override
 
 Returns nullptr, unless overwritten to return a specific material. 
@@ -5012,7 +4965,7 @@ C++ includes: ParticleLayout.h
 %feature("docstring")  ParticleLayout::ParticleLayout "ParticleLayout::ParticleLayout()
 ";
 
-%feature("docstring")  ParticleLayout::ParticleLayout "ParticleLayout::ParticleLayout(const IAbstractParticle &particle, double abundance=-1.0)
+%feature("docstring")  ParticleLayout::ParticleLayout "ParticleLayout::ParticleLayout(const IParticle &particle, double abundance=-1.0)
 ";
 
 %feature("docstring")  ParticleLayout::~ParticleLayout "ParticleLayout::~ParticleLayout() override
@@ -5026,7 +4979,7 @@ Returns a clone of this  ISampleNode object.
 %feature("docstring")  ParticleLayout::accept "void ParticleLayout::accept(INodeVisitor *visitor) const override
 ";
 
-%feature("docstring")  ParticleLayout::addParticle "void ParticleLayout::addParticle(const IAbstractParticle &particle, double abundance=-1.0, R3 position={}, const IRotation &rotation=IdentityRotation())
+%feature("docstring")  ParticleLayout::addParticle "void ParticleLayout::addParticle(const IParticle &particle, double abundance=-1.0, R3 position={}, const IRotation &rotation=IdentityRotation())
 
 Adds particle to the layout with abundance, position and the rotation defined.
 
@@ -5048,7 +5001,7 @@ rotation:
 
 %feature("docstring")  ParticleLayout::particles "SafePointerVector< IParticle > ParticleLayout::particles() const
 
-Returns information on all particles (type and abundance) and generates new particles if an  IAbstractParticle denotes a collection 
+Returns information on all particles (type and abundance) and generates new particles if an  IParticle denotes a collection 
 ";
 
 %feature("docstring")  ParticleLayout::interferenceFunction "const IInterference * ParticleLayout::interferenceFunction() const
@@ -5484,25 +5437,25 @@ C++ includes: ZLimits.h
 // File: namespace_0d16.xml
 
 
-// File: namespace_0d175.xml
+// File: namespace_0d173.xml
 
 
 // File: namespace_0d2.xml
 
 
-// File: namespace_0d203.xml
+// File: namespace_0d201.xml
 
 
-// File: namespace_0d216.xml
+// File: namespace_0d214.xml
 
 
-// File: namespace_0d226.xml
+// File: namespace_0d224.xml
 
 
-// File: namespace_0d248.xml
+// File: namespace_0d246.xml
 
 
-// File: namespace_0d261.xml
+// File: namespace_0d259.xml
 
 
 // File: namespace_0d36.xml
@@ -6417,12 +6370,6 @@ magnetization (in A/m)
 // File: FormFactorWeighted_8h.xml
 
 
-// File: IAbstractParticle_8cpp.xml
-
-
-// File: IAbstractParticle_8h.xml
-
-
 // File: IParticle_8cpp.xml
 
 
diff --git a/auto/Wrap/libBornAgainParam.py b/auto/Wrap/libBornAgainParam.py
index 9b9f9935ac6389bbca517d624457d134e466d0ee..f9d0d218f2afa1b081a44c3e860f6c92cc5c2bf0 100644
--- a/auto/Wrap/libBornAgainParam.py
+++ b/auto/Wrap/libBornAgainParam.py
@@ -2490,7 +2490,6 @@ class INodeVisitor(object):
         visit(INodeVisitor self, FormFactorWeighted const * arg2)
         visit(INodeVisitor self, GISASSimulation const * arg2)
         visit(INodeVisitor self, HexagonalLattice2D const * arg2)
-        visit(INodeVisitor self, IAbstractParticle const * arg2)
         visit(INodeVisitor self, IBornFF const * arg2)
         visit(INodeVisitor self, IClusteredParticles const * arg2)
         visit(INodeVisitor self, IFormFactor const * arg2)
diff --git a/auto/Wrap/libBornAgainParam_wrap.cpp b/auto/Wrap/libBornAgainParam_wrap.cpp
index 922e83caceabe3c80b72f59df6fb532fc0cba50f..10d67b388f2f6082562c45c3fe883df695488d05 100644
--- a/auto/Wrap/libBornAgainParam_wrap.cpp
+++ b/auto/Wrap/libBornAgainParam_wrap.cpp
@@ -3170,117 +3170,116 @@ namespace Swig {
 #define SWIGTYPE_p_FormFactorWeighted swig_types[70]
 #define SWIGTYPE_p_GISASSimulation swig_types[71]
 #define SWIGTYPE_p_HexagonalLattice2D swig_types[72]
-#define SWIGTYPE_p_IAbstractParticle swig_types[73]
-#define SWIGTYPE_p_IBornFF swig_types[74]
-#define SWIGTYPE_p_ICloneable swig_types[75]
-#define SWIGTYPE_p_IClusteredParticles swig_types[76]
-#define SWIGTYPE_p_IDistribution1D swig_types[77]
-#define SWIGTYPE_p_IFormFactor swig_types[78]
-#define SWIGTYPE_p_IFormFactorDecorator swig_types[79]
-#define SWIGTYPE_p_IInterference swig_types[80]
-#define SWIGTYPE_p_INode swig_types[81]
-#define SWIGTYPE_p_INodeVisitor swig_types[82]
-#define SWIGTYPE_p_IParticle swig_types[83]
-#define SWIGTYPE_p_IPeakShape swig_types[84]
-#define SWIGTYPE_p_IRangedDistribution swig_types[85]
-#define SWIGTYPE_p_IRotation swig_types[86]
-#define SWIGTYPE_p_ISampleNode swig_types[87]
-#define SWIGTYPE_p_IdentityRotation swig_types[88]
-#define SWIGTYPE_p_Instrument swig_types[89]
-#define SWIGTYPE_p_Interference1DLattice swig_types[90]
-#define SWIGTYPE_p_Interference2DLattice swig_types[91]
-#define SWIGTYPE_p_Interference2DParaCrystal swig_types[92]
-#define SWIGTYPE_p_Interference2DSuperLattice swig_types[93]
-#define SWIGTYPE_p_Interference3DLattice swig_types[94]
-#define SWIGTYPE_p_InterferenceFinite2DLattice swig_types[95]
-#define SWIGTYPE_p_InterferenceFinite3DLattice swig_types[96]
-#define SWIGTYPE_p_InterferenceHardDisk swig_types[97]
-#define SWIGTYPE_p_InterferenceNone swig_types[98]
-#define SWIGTYPE_p_InterferenceRadialParaCrystal swig_types[99]
-#define SWIGTYPE_p_InterferenceTwin swig_types[100]
-#define SWIGTYPE_p_Layer swig_types[101]
-#define SWIGTYPE_p_LayerInterface swig_types[102]
-#define SWIGTYPE_p_LayerRoughness swig_types[103]
-#define SWIGTYPE_p_MesoCrystal swig_types[104]
-#define SWIGTYPE_p_MultiLayer swig_types[105]
-#define SWIGTYPE_p_NodeMeta swig_types[106]
-#define SWIGTYPE_p_OffSpecularSimulation swig_types[107]
-#define SWIGTYPE_p_ParaMeta swig_types[108]
-#define SWIGTYPE_p_ParameterDistribution swig_types[109]
-#define SWIGTYPE_p_ParameterSample swig_types[110]
-#define SWIGTYPE_p_Particle swig_types[111]
-#define SWIGTYPE_p_ParticleComposition swig_types[112]
-#define SWIGTYPE_p_ParticleCoreShell swig_types[113]
-#define SWIGTYPE_p_ParticleLayout swig_types[114]
-#define SWIGTYPE_p_PoissonNoiseBackground swig_types[115]
-#define SWIGTYPE_p_RangedDistributionCosine swig_types[116]
-#define SWIGTYPE_p_RangedDistributionGate swig_types[117]
-#define SWIGTYPE_p_RangedDistributionGaussian swig_types[118]
-#define SWIGTYPE_p_RangedDistributionLogNormal swig_types[119]
-#define SWIGTYPE_p_RangedDistributionLorentz swig_types[120]
-#define SWIGTYPE_p_RealLimits swig_types[121]
-#define SWIGTYPE_p_RectangularDetector swig_types[122]
-#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[123]
-#define SWIGTYPE_p_RotationEuler swig_types[124]
-#define SWIGTYPE_p_RotationX swig_types[125]
-#define SWIGTYPE_p_RotationY swig_types[126]
-#define SWIGTYPE_p_RotationZ swig_types[127]
-#define SWIGTYPE_p_SpecularDetector1D swig_types[128]
-#define SWIGTYPE_p_SpecularSimulation swig_types[129]
-#define SWIGTYPE_p_SphericalDetector swig_types[130]
-#define SWIGTYPE_p_SquareLattice2D swig_types[131]
-#define SWIGTYPE_p_allocator_type swig_types[132]
-#define SWIGTYPE_p_char swig_types[133]
-#define SWIGTYPE_p_difference_type swig_types[134]
-#define SWIGTYPE_p_first_type swig_types[135]
-#define SWIGTYPE_p_int swig_types[136]
-#define SWIGTYPE_p_key_type swig_types[137]
-#define SWIGTYPE_p_long_long swig_types[138]
-#define SWIGTYPE_p_mapped_type swig_types[139]
-#define SWIGTYPE_p_p_PyObject swig_types[140]
-#define SWIGTYPE_p_second_type swig_types[141]
-#define SWIGTYPE_p_short swig_types[142]
-#define SWIGTYPE_p_signed_char swig_types[143]
-#define SWIGTYPE_p_size_type swig_types[144]
-#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[145]
-#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[146]
-#define SWIGTYPE_p_std__allocatorT_ParameterSample_t swig_types[147]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[148]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[149]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[150]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[151]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[152]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[153]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[154]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[155]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[156]
-#define SWIGTYPE_p_std__arrayT_double_3_t swig_types[157]
-#define SWIGTYPE_p_std__arrayT_std__complexT_double_t_3_t swig_types[158]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[159]
-#define SWIGTYPE_p_std__invalid_argument swig_types[160]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[161]
-#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[162]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[163]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[164]
-#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[165]
-#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[166]
-#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[167]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[168]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[169]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[170]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[171]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[172]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[173]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[174]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[175]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[176]
-#define SWIGTYPE_p_unsigned_char swig_types[177]
-#define SWIGTYPE_p_unsigned_int swig_types[178]
-#define SWIGTYPE_p_unsigned_long_long swig_types[179]
-#define SWIGTYPE_p_unsigned_short swig_types[180]
-#define SWIGTYPE_p_value_type swig_types[181]
-static swig_type_info *swig_types[183];
-static swig_module_info swig_module = {swig_types, 182, 0, 0, 0, 0};
+#define SWIGTYPE_p_IBornFF swig_types[73]
+#define SWIGTYPE_p_ICloneable swig_types[74]
+#define SWIGTYPE_p_IClusteredParticles swig_types[75]
+#define SWIGTYPE_p_IDistribution1D swig_types[76]
+#define SWIGTYPE_p_IFormFactor swig_types[77]
+#define SWIGTYPE_p_IFormFactorDecorator swig_types[78]
+#define SWIGTYPE_p_IInterference swig_types[79]
+#define SWIGTYPE_p_INode swig_types[80]
+#define SWIGTYPE_p_INodeVisitor swig_types[81]
+#define SWIGTYPE_p_IParticle swig_types[82]
+#define SWIGTYPE_p_IPeakShape swig_types[83]
+#define SWIGTYPE_p_IRangedDistribution swig_types[84]
+#define SWIGTYPE_p_IRotation swig_types[85]
+#define SWIGTYPE_p_ISampleNode swig_types[86]
+#define SWIGTYPE_p_IdentityRotation swig_types[87]
+#define SWIGTYPE_p_Instrument swig_types[88]
+#define SWIGTYPE_p_Interference1DLattice swig_types[89]
+#define SWIGTYPE_p_Interference2DLattice swig_types[90]
+#define SWIGTYPE_p_Interference2DParaCrystal swig_types[91]
+#define SWIGTYPE_p_Interference2DSuperLattice swig_types[92]
+#define SWIGTYPE_p_Interference3DLattice swig_types[93]
+#define SWIGTYPE_p_InterferenceFinite2DLattice swig_types[94]
+#define SWIGTYPE_p_InterferenceFinite3DLattice swig_types[95]
+#define SWIGTYPE_p_InterferenceHardDisk swig_types[96]
+#define SWIGTYPE_p_InterferenceNone swig_types[97]
+#define SWIGTYPE_p_InterferenceRadialParaCrystal swig_types[98]
+#define SWIGTYPE_p_InterferenceTwin swig_types[99]
+#define SWIGTYPE_p_Layer swig_types[100]
+#define SWIGTYPE_p_LayerInterface swig_types[101]
+#define SWIGTYPE_p_LayerRoughness swig_types[102]
+#define SWIGTYPE_p_MesoCrystal swig_types[103]
+#define SWIGTYPE_p_MultiLayer swig_types[104]
+#define SWIGTYPE_p_NodeMeta swig_types[105]
+#define SWIGTYPE_p_OffSpecularSimulation swig_types[106]
+#define SWIGTYPE_p_ParaMeta swig_types[107]
+#define SWIGTYPE_p_ParameterDistribution swig_types[108]
+#define SWIGTYPE_p_ParameterSample swig_types[109]
+#define SWIGTYPE_p_Particle swig_types[110]
+#define SWIGTYPE_p_ParticleComposition swig_types[111]
+#define SWIGTYPE_p_ParticleCoreShell swig_types[112]
+#define SWIGTYPE_p_ParticleLayout swig_types[113]
+#define SWIGTYPE_p_PoissonNoiseBackground swig_types[114]
+#define SWIGTYPE_p_RangedDistributionCosine swig_types[115]
+#define SWIGTYPE_p_RangedDistributionGate swig_types[116]
+#define SWIGTYPE_p_RangedDistributionGaussian swig_types[117]
+#define SWIGTYPE_p_RangedDistributionLogNormal swig_types[118]
+#define SWIGTYPE_p_RangedDistributionLorentz swig_types[119]
+#define SWIGTYPE_p_RealLimits swig_types[120]
+#define SWIGTYPE_p_RectangularDetector swig_types[121]
+#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[122]
+#define SWIGTYPE_p_RotationEuler swig_types[123]
+#define SWIGTYPE_p_RotationX swig_types[124]
+#define SWIGTYPE_p_RotationY swig_types[125]
+#define SWIGTYPE_p_RotationZ swig_types[126]
+#define SWIGTYPE_p_SpecularDetector1D swig_types[127]
+#define SWIGTYPE_p_SpecularSimulation swig_types[128]
+#define SWIGTYPE_p_SphericalDetector swig_types[129]
+#define SWIGTYPE_p_SquareLattice2D swig_types[130]
+#define SWIGTYPE_p_allocator_type swig_types[131]
+#define SWIGTYPE_p_char swig_types[132]
+#define SWIGTYPE_p_difference_type swig_types[133]
+#define SWIGTYPE_p_first_type swig_types[134]
+#define SWIGTYPE_p_int swig_types[135]
+#define SWIGTYPE_p_key_type swig_types[136]
+#define SWIGTYPE_p_long_long swig_types[137]
+#define SWIGTYPE_p_mapped_type swig_types[138]
+#define SWIGTYPE_p_p_PyObject swig_types[139]
+#define SWIGTYPE_p_second_type swig_types[140]
+#define SWIGTYPE_p_short swig_types[141]
+#define SWIGTYPE_p_signed_char swig_types[142]
+#define SWIGTYPE_p_size_type swig_types[143]
+#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[144]
+#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[145]
+#define SWIGTYPE_p_std__allocatorT_ParameterSample_t swig_types[146]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[147]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[148]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[149]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[150]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[151]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[152]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[153]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[154]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[155]
+#define SWIGTYPE_p_std__arrayT_double_3_t swig_types[156]
+#define SWIGTYPE_p_std__arrayT_std__complexT_double_t_3_t swig_types[157]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[158]
+#define SWIGTYPE_p_std__invalid_argument swig_types[159]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[160]
+#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[161]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[162]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[163]
+#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[164]
+#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[165]
+#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[166]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[167]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[168]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[169]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[170]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[171]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[172]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[173]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[174]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[175]
+#define SWIGTYPE_p_unsigned_char swig_types[176]
+#define SWIGTYPE_p_unsigned_int swig_types[177]
+#define SWIGTYPE_p_unsigned_long_long swig_types[178]
+#define SWIGTYPE_p_unsigned_short swig_types[179]
+#define SWIGTYPE_p_value_type swig_types[180]
+static swig_type_info *swig_types[182];
+static swig_module_info swig_module = {swig_types, 181, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -33337,34 +33336,6 @@ fail:
 
 
 SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_73(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  INodeVisitor *arg1 = (INodeVisitor *) 0 ;
-  IAbstractParticle *arg2 = (IAbstractParticle *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_INodeVisitor, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "INodeVisitor_visit" "', argument " "1"" of type '" "INodeVisitor *""'"); 
-  }
-  arg1 = reinterpret_cast< INodeVisitor * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "INodeVisitor_visit" "', argument " "2"" of type '" "IAbstractParticle const *""'"); 
-  }
-  arg2 = reinterpret_cast< IAbstractParticle * >(argp2);
-  (arg1)->visit((IAbstractParticle const *)arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_74(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IBornFF *arg2 = (IBornFF *) 0 ;
@@ -33392,7 +33363,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_75(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_74(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IClusteredParticles *arg2 = (IClusteredParticles *) 0 ;
@@ -33420,7 +33391,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_76(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_75(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IFormFactor *arg2 = (IFormFactor *) 0 ;
@@ -33448,7 +33419,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_77(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_76(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IFormFactorDecorator *arg2 = (IFormFactorDecorator *) 0 ;
@@ -33476,7 +33447,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_78(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_77(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IInterference *arg2 = (IInterference *) 0 ;
@@ -33504,7 +33475,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_79(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_78(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   INode *arg2 = (INode *) 0 ;
@@ -33532,7 +33503,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_80(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_79(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IParticle *arg2 = (IParticle *) 0 ;
@@ -33560,7 +33531,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_81(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_80(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IPeakShape *arg2 = (IPeakShape *) 0 ;
@@ -33588,7 +33559,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_82(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_81(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IRotation *arg2 = (IRotation *) 0 ;
@@ -33616,7 +33587,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_83(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_82(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   ISampleNode *arg2 = (ISampleNode *) 0 ;
@@ -33644,7 +33615,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_84(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_83(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   IdentityRotation *arg2 = (IdentityRotation *) 0 ;
@@ -33672,7 +33643,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_85(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_84(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   Instrument *arg2 = (Instrument *) 0 ;
@@ -33700,7 +33671,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_86(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_85(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   Interference1DLattice *arg2 = (Interference1DLattice *) 0 ;
@@ -33728,7 +33699,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_87(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_86(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   Interference2DLattice *arg2 = (Interference2DLattice *) 0 ;
@@ -33756,7 +33727,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_88(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_87(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   Interference2DParaCrystal *arg2 = (Interference2DParaCrystal *) 0 ;
@@ -33784,7 +33755,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_89(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_88(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   Interference2DSuperLattice *arg2 = (Interference2DSuperLattice *) 0 ;
@@ -33812,7 +33783,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_90(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_89(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   Interference3DLattice *arg2 = (Interference3DLattice *) 0 ;
@@ -33840,7 +33811,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_91(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_90(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFinite2DLattice *arg2 = (InterferenceFinite2DLattice *) 0 ;
@@ -33868,7 +33839,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_92(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_91(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceFinite3DLattice *arg2 = (InterferenceFinite3DLattice *) 0 ;
@@ -33896,7 +33867,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_93(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_92(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceHardDisk *arg2 = (InterferenceHardDisk *) 0 ;
@@ -33924,7 +33895,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_94(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_93(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceNone *arg2 = (InterferenceNone *) 0 ;
@@ -33952,7 +33923,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_95(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_94(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceRadialParaCrystal *arg2 = (InterferenceRadialParaCrystal *) 0 ;
@@ -33980,7 +33951,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_96(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_95(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   InterferenceTwin *arg2 = (InterferenceTwin *) 0 ;
@@ -34008,7 +33979,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_97(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_96(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   Layer *arg2 = (Layer *) 0 ;
@@ -34036,7 +34007,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_98(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_97(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   LayerInterface *arg2 = (LayerInterface *) 0 ;
@@ -34064,7 +34035,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_99(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_98(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   LayerRoughness *arg2 = (LayerRoughness *) 0 ;
@@ -34092,7 +34063,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_100(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_99(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   MesoCrystal *arg2 = (MesoCrystal *) 0 ;
@@ -34120,7 +34091,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_101(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_100(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   MultiLayer *arg2 = (MultiLayer *) 0 ;
@@ -34148,7 +34119,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_102(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_101(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   OffSpecularSimulation *arg2 = (OffSpecularSimulation *) 0 ;
@@ -34176,7 +34147,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_103(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_102(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   Particle *arg2 = (Particle *) 0 ;
@@ -34204,7 +34175,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_104(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_103(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   ParticleComposition *arg2 = (ParticleComposition *) 0 ;
@@ -34232,7 +34203,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_105(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_104(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   ParticleCoreShell *arg2 = (ParticleCoreShell *) 0 ;
@@ -34260,7 +34231,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_106(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_105(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   ParticleLayout *arg2 = (ParticleLayout *) 0 ;
@@ -34288,7 +34259,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_107(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_106(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   PoissonNoiseBackground *arg2 = (PoissonNoiseBackground *) 0 ;
@@ -34316,7 +34287,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_108(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_107(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   RectangularDetector *arg2 = (RectangularDetector *) 0 ;
@@ -34344,7 +34315,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_109(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_108(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   ResolutionFunction2DGaussian *arg2 = (ResolutionFunction2DGaussian *) 0 ;
@@ -34372,7 +34343,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_110(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_109(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   RotationEuler *arg2 = (RotationEuler *) 0 ;
@@ -34400,7 +34371,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_111(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_110(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   RotationX *arg2 = (RotationX *) 0 ;
@@ -34428,7 +34399,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_112(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_111(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   RotationY *arg2 = (RotationY *) 0 ;
@@ -34456,7 +34427,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_113(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_112(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   RotationZ *arg2 = (RotationZ *) 0 ;
@@ -34484,7 +34455,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_114(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_113(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   SpecularDetector1D *arg2 = (SpecularDetector1D *) 0 ;
@@ -34512,7 +34483,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_115(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_114(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   SpecularSimulation *arg2 = (SpecularSimulation *) 0 ;
@@ -34540,7 +34511,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_116(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_115(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   SphericalDetector *arg2 = (SphericalDetector *) 0 ;
@@ -34568,7 +34539,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_117(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_116(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
   SquareLattice2D *arg2 = (SquareLattice2D *) 0 ;
@@ -35626,20 +35597,6 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       }
     }
   }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_INodeVisitor, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IAbstractParticle, 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_73(self, argc, argv);
-      }
-    }
-  }
   if (argc == 2) {
     int _v;
     void *vptr = 0;
@@ -35650,7 +35607,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IBornFF, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_74(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_73(self, argc, argv);
       }
     }
   }
@@ -35664,7 +35621,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IClusteredParticles, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_75(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_74(self, argc, argv);
       }
     }
   }
@@ -35678,7 +35635,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IFormFactor, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_76(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_75(self, argc, argv);
       }
     }
   }
@@ -35692,7 +35649,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IFormFactorDecorator, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_77(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_76(self, argc, argv);
       }
     }
   }
@@ -35706,7 +35663,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IInterference, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_78(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_77(self, argc, argv);
       }
     }
   }
@@ -35720,7 +35677,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_INode, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_79(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_78(self, argc, argv);
       }
     }
   }
@@ -35734,7 +35691,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IParticle, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_80(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_79(self, argc, argv);
       }
     }
   }
@@ -35748,7 +35705,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IPeakShape, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_81(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_80(self, argc, argv);
       }
     }
   }
@@ -35762,7 +35719,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IRotation, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_82(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_81(self, argc, argv);
       }
     }
   }
@@ -35776,7 +35733,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ISampleNode, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_83(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_82(self, argc, argv);
       }
     }
   }
@@ -35790,7 +35747,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IdentityRotation, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_84(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_83(self, argc, argv);
       }
     }
   }
@@ -35804,7 +35761,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Instrument, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_85(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_84(self, argc, argv);
       }
     }
   }
@@ -35818,7 +35775,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Interference1DLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_86(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_85(self, argc, argv);
       }
     }
   }
@@ -35832,7 +35789,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Interference2DLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_87(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_86(self, argc, argv);
       }
     }
   }
@@ -35846,7 +35803,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Interference2DParaCrystal, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_88(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_87(self, argc, argv);
       }
     }
   }
@@ -35860,7 +35817,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Interference2DSuperLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_89(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_88(self, argc, argv);
       }
     }
   }
@@ -35874,7 +35831,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Interference3DLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_90(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_89(self, argc, argv);
       }
     }
   }
@@ -35888,7 +35845,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFinite2DLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_91(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_90(self, argc, argv);
       }
     }
   }
@@ -35902,7 +35859,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFinite3DLattice, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_92(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_91(self, argc, argv);
       }
     }
   }
@@ -35916,7 +35873,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceHardDisk, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_93(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_92(self, argc, argv);
       }
     }
   }
@@ -35930,7 +35887,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceNone, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_94(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_93(self, argc, argv);
       }
     }
   }
@@ -35944,7 +35901,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceRadialParaCrystal, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_95(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_94(self, argc, argv);
       }
     }
   }
@@ -35958,7 +35915,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceTwin, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_96(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_95(self, argc, argv);
       }
     }
   }
@@ -35972,7 +35929,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Layer, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_97(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_96(self, argc, argv);
       }
     }
   }
@@ -35986,7 +35943,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_LayerInterface, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_98(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_97(self, argc, argv);
       }
     }
   }
@@ -36000,7 +35957,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_LayerRoughness, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_99(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_98(self, argc, argv);
       }
     }
   }
@@ -36014,7 +35971,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_MesoCrystal, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_100(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_99(self, argc, argv);
       }
     }
   }
@@ -36028,7 +35985,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_MultiLayer, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_101(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_100(self, argc, argv);
       }
     }
   }
@@ -36042,7 +35999,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OffSpecularSimulation, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_102(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_101(self, argc, argv);
       }
     }
   }
@@ -36056,7 +36013,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Particle, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_103(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_102(self, argc, argv);
       }
     }
   }
@@ -36070,7 +36027,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleComposition, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_104(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_103(self, argc, argv);
       }
     }
   }
@@ -36084,7 +36041,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleCoreShell, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_105(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_104(self, argc, argv);
       }
     }
   }
@@ -36098,7 +36055,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleLayout, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_106(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_105(self, argc, argv);
       }
     }
   }
@@ -36112,7 +36069,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_PoissonNoiseBackground, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_107(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_106(self, argc, argv);
       }
     }
   }
@@ -36126,7 +36083,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RectangularDetector, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_108(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_107(self, argc, argv);
       }
     }
   }
@@ -36140,7 +36097,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ResolutionFunction2DGaussian, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_109(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_108(self, argc, argv);
       }
     }
   }
@@ -36154,7 +36111,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RotationEuler, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_110(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_109(self, argc, argv);
       }
     }
   }
@@ -36168,7 +36125,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RotationX, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_111(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_110(self, argc, argv);
       }
     }
   }
@@ -36182,7 +36139,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RotationY, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_112(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_111(self, argc, argv);
       }
     }
   }
@@ -36196,7 +36153,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RotationZ, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_113(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_112(self, argc, argv);
       }
     }
   }
@@ -36210,7 +36167,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_SpecularDetector1D, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_114(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_113(self, argc, argv);
       }
     }
   }
@@ -36224,7 +36181,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_SpecularSimulation, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_115(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_114(self, argc, argv);
       }
     }
   }
@@ -36238,7 +36195,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_SphericalDetector, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_116(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_115(self, argc, argv);
       }
     }
   }
@@ -36252,7 +36209,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_SquareLattice2D, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_INodeVisitor_visit__SWIG_117(self, argc, argv);
+        return _wrap_INodeVisitor_visit__SWIG_116(self, argc, argv);
       }
     }
   }
@@ -36333,7 +36290,6 @@ fail:
     "    INodeVisitor::visit(FormFactorWeighted const *)\n"
     "    INodeVisitor::visit(GISASSimulation const *)\n"
     "    INodeVisitor::visit(HexagonalLattice2D const *)\n"
-    "    INodeVisitor::visit(IAbstractParticle const *)\n"
     "    INodeVisitor::visit(IBornFF const *)\n"
     "    INodeVisitor::visit(IClusteredParticles const *)\n"
     "    INodeVisitor::visit(IFormFactor const *)\n"
@@ -45094,7 +45050,6 @@ static PyMethodDef SwigMethods[] = {
 		"INodeVisitor_visit(INodeVisitor self, FormFactorWeighted const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, GISASSimulation const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, HexagonalLattice2D const * arg2)\n"
-		"INodeVisitor_visit(INodeVisitor self, IAbstractParticle const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, IBornFF const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, IClusteredParticles const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, IFormFactor const * arg2)\n"
@@ -46056,7 +46011,6 @@ static swig_type_info _swigt__p_FormFactorTruncatedSpheroid = {"_p_FormFactorTru
 static swig_type_info _swigt__p_FormFactorWeighted = {"_p_FormFactorWeighted", "FormFactorWeighted *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_GISASSimulation = {"_p_GISASSimulation", "GISASSimulation *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_HexagonalLattice2D = {"_p_HexagonalLattice2D", "HexagonalLattice2D *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_IAbstractParticle = {"_p_IAbstractParticle", "IAbstractParticle *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IBornFF = {"_p_IBornFF", "IBornFF *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ICloneable = {"_p_ICloneable", "ICloneable *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IClusteredParticles = {"_p_IClusteredParticles", "IClusteredParticles *", 0, 0, (void*)0, 0};
@@ -46240,7 +46194,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_FormFactorWeighted,
   &_swigt__p_GISASSimulation,
   &_swigt__p_HexagonalLattice2D,
-  &_swigt__p_IAbstractParticle,
   &_swigt__p_IBornFF,
   &_swigt__p_ICloneable,
   &_swigt__p_IClusteredParticles,
@@ -46424,7 +46377,6 @@ static swig_cast_info _swigc__p_FormFactorTruncatedSpheroid[] = {  {&_swigt__p_F
 static swig_cast_info _swigc__p_FormFactorWeighted[] = {  {&_swigt__p_FormFactorWeighted, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_GISASSimulation[] = {  {&_swigt__p_GISASSimulation, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_HexagonalLattice2D[] = {  {&_swigt__p_HexagonalLattice2D, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IAbstractParticle[] = {  {&_swigt__p_IAbstractParticle, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IBornFF[] = {  {&_swigt__p_IBornFF, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionGate, _p_RangedDistributionGateTo_p_ICloneable, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_RangedDistributionGaussian, _p_RangedDistributionGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionCosine, _p_RangedDistributionCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionLorentz, _p_RangedDistributionLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionLogNormal, _p_RangedDistributionLogNormalTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_ICloneable, 0, 0},  {&_swigt__p_IRangedDistribution, _p_IRangedDistributionTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IClusteredParticles[] = {  {&_swigt__p_IClusteredParticles, 0, 0, 0},{0, 0, 0, 0}};
@@ -46608,7 +46560,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_FormFactorWeighted,
   _swigc__p_GISASSimulation,
   _swigc__p_HexagonalLattice2D,
-  _swigc__p_IAbstractParticle,
   _swigc__p_IBornFF,
   _swigc__p_ICloneable,
   _swigc__p_IClusteredParticles,
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index b9564596f64089cff4061b1dddc8d396640b2c79..e00d5737128586124c59ae05a404593428b70e08 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -4300,90 +4300,6 @@ class FormFactorWeighted(IFormFactor):
 # Register FormFactorWeighted in _libBornAgainSample:
 _libBornAgainSample.FormFactorWeighted_swigregister(FormFactorWeighted)
 
-class IAbstractParticle(ISampleNode):
-    r"""
-
-
-    Interface for a generic particle.
-
-    Inherited by  IParticle.
-
-    C++ includes: IAbstractParticle.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-
-    def __init__(self, *args, **kwargs):
-        raise AttributeError("No constructor defined - class is abstract")
-    __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainSample.delete_IAbstractParticle
-
-    def clone(self):
-        r"""
-        clone(IAbstractParticle self) -> IAbstractParticle
-        IAbstractParticle* IAbstractParticle::clone() const override=0
-
-        Returns a clone of this  ISampleNode object. 
-
-        """
-        return _libBornAgainSample.IAbstractParticle_clone(self)
-
-    def accept(self, visitor):
-        r"""
-        accept(IAbstractParticle self, INodeVisitor * visitor)
-        void IAbstractParticle::accept(INodeVisitor *visitor) const override
-
-        """
-        return _libBornAgainSample.IAbstractParticle_accept(self, visitor)
-
-    def abundance(self):
-        r"""
-        abundance(IAbstractParticle self) -> double
-        double IAbstractParticle::abundance() const
-
-        """
-        return _libBornAgainSample.IAbstractParticle_abundance(self)
-
-    def setAbundance(self, abundance):
-        r"""
-        setAbundance(IAbstractParticle self, double abundance)
-        void IAbstractParticle::setAbundance(double abundance)
-
-        Sets particle abundance.
-
-        Parameters:
-        -----------
-
-        abundance: 
-        proportion of this type of particles normalized to the total number of particles in the layout. 
-
-        """
-        return _libBornAgainSample.IAbstractParticle_setAbundance(self, abundance)
-
-    def translate(self, translation):
-        r"""
-        translate(IAbstractParticle self, R3 translation)
-        virtual void IAbstractParticle::translate(R3 translation)=0
-
-        Translates the particle with the given vector. 
-
-        """
-        return _libBornAgainSample.IAbstractParticle_translate(self, translation)
-
-    def rotate(self, rotation):
-        r"""
-        rotate(IAbstractParticle self, IRotation rotation)
-        virtual void IAbstractParticle::rotate(const IRotation &rotation)=0
-
-        Applies the given rotation to the particle. 
-
-        """
-        return _libBornAgainSample.IAbstractParticle_rotate(self, rotation)
-
-# Register IAbstractParticle in _libBornAgainSample:
-_libBornAgainSample.IAbstractParticle_swigregister(IAbstractParticle)
-
 class Crystal(ISampleNode):
     r"""
 
@@ -4475,11 +4391,11 @@ class Crystal(ISampleNode):
 # Register Crystal in _libBornAgainSample:
 _libBornAgainSample.Crystal_swigregister(Crystal)
 
-class IParticle(IAbstractParticle):
+class IParticle(ISampleNode):
     r"""
 
 
-    Abstract base class for  Particle,  ParticleComposition,  ParticleCoreShell,  MesoCrystal. Provides position/rotation and form factor. Abundance is inherited from  IAbstractParticle.
+    Abstract base class for  Particle,  ParticleComposition,  ParticleCoreShell,  MesoCrystal. Provides position/rotation and form factor. Abundance is inherited from  IParticle.
 
     C++ includes: IParticle.h
 
@@ -4522,6 +4438,30 @@ class IParticle(IAbstractParticle):
         """
         return _libBornAgainSample.IParticle_createSlicedParticle(self, limits)
 
+    def abundance(self):
+        r"""
+        abundance(IParticle self) -> double
+        double IParticle::abundance() const
+
+        """
+        return _libBornAgainSample.IParticle_abundance(self)
+
+    def setAbundance(self, abundance):
+        r"""
+        setAbundance(IParticle self, double abundance)
+        void IParticle::setAbundance(double abundance)
+
+        Sets particle abundance.
+
+        Parameters:
+        -----------
+
+        abundance: 
+        proportion of this type of particles normalized to the total number of particles in the layout. 
+
+        """
+        return _libBornAgainSample.IParticle_setAbundance(self, abundance)
+
     def position(self):
         r"""
         position(IParticle self) -> R3
@@ -4558,7 +4498,7 @@ class IParticle(IAbstractParticle):
     def translate(self, translation):
         r"""
         translate(IParticle self, R3 translation)
-        void IParticle::translate(R3 translation) override
+        void IParticle::translate(R3 translation)
 
         Translates the particle. 
 
@@ -4588,7 +4528,7 @@ class IParticle(IAbstractParticle):
     def rotate(self, rotation):
         r"""
         rotate(IParticle self, IRotation rotation)
-        void IParticle::rotate(const IRotation &rotation) override
+        void IParticle::rotate(const IRotation &rotation)
 
         Rotates the particle. 
 
@@ -4720,7 +4660,6 @@ class Particle(IParticle):
 
     def __init__(self, *args):
         r"""
-        __init__(Particle self, Material material) -> Particle
         __init__(Particle self, Material material, IFormFactor form_factor) -> Particle
         __init__(Particle self, Material material, IFormFactor form_factor, IRotation rotation) -> Particle
         Particle::Particle(Material material, const IFormFactor &form_factor, const IRotation &rotation)
@@ -4757,14 +4696,6 @@ class Particle(IParticle):
         """
         return _libBornAgainSample.Particle_createSlicedParticle(self, limits)
 
-    def setMaterial(self, material):
-        r"""
-        setMaterial(Particle self, Material material)
-        void Particle::setMaterial(Material material)
-
-        """
-        return _libBornAgainSample.Particle_setMaterial(self, material)
-
     def material(self):
         r"""
         material(Particle self) -> Material
@@ -8287,8 +8218,8 @@ class ParticleLayout(ISampleNode):
     def __init__(self, *args):
         r"""
         __init__(ParticleLayout self) -> ParticleLayout
-        __init__(ParticleLayout self, IAbstractParticle particle, double abundance=-1.0) -> ParticleLayout
-        ParticleLayout::ParticleLayout(const IAbstractParticle &particle, double abundance=-1.0)
+        __init__(ParticleLayout self, IParticle particle, double abundance=-1.0) -> ParticleLayout
+        ParticleLayout::ParticleLayout(const IParticle &particle, double abundance=-1.0)
 
         """
         _libBornAgainSample.ParticleLayout_swiginit(self, _libBornAgainSample.new_ParticleLayout(*args))
@@ -8314,8 +8245,8 @@ class ParticleLayout(ISampleNode):
 
     def addParticle(self, *args):
         r"""
-        addParticle(ParticleLayout self, IAbstractParticle particle, double abundance=-1.0, R3 position={}, IRotation rotation=IdentityRotation())
-        void ParticleLayout::addParticle(const IAbstractParticle &particle, double abundance=-1.0, R3 position={}, const IRotation &rotation=IdentityRotation())
+        addParticle(ParticleLayout self, IParticle particle, double abundance=-1.0, R3 position={}, IRotation rotation=IdentityRotation())
+        void ParticleLayout::addParticle(const IParticle &particle, double abundance=-1.0, R3 position={}, const IRotation &rotation=IdentityRotation())
 
         Adds particle to the layout with abundance, position and the rotation defined.
 
@@ -8342,7 +8273,7 @@ class ParticleLayout(ISampleNode):
         particles(ParticleLayout self) -> SafePointerVector< IParticle >
         SafePointerVector< IParticle > ParticleLayout::particles() const
 
-        Returns information on all particles (type and abundance) and generates new particles if an  IAbstractParticle denotes a collection 
+        Returns information on all particles (type and abundance) and generates new particles if an  IParticle denotes a collection 
 
         """
         return _libBornAgainSample.ParticleLayout_particles(self)
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index dc2da358797d3c723e1402c51acc2672300bc354..a5e5ef68faaac32b3e48e92adaf56bfe3ba8cbc7 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -3154,134 +3154,133 @@ namespace Swig {
 #define SWIGTYPE_p_FormFactorWeighted swig_types[54]
 #define SWIGTYPE_p_GaussFisherPeakShape swig_types[55]
 #define SWIGTYPE_p_HexagonalLattice2D swig_types[56]
-#define SWIGTYPE_p_IAbstractParticle swig_types[57]
-#define SWIGTYPE_p_IBornFF swig_types[58]
-#define SWIGTYPE_p_ICloneable swig_types[59]
-#define SWIGTYPE_p_ICosineRipple swig_types[60]
-#define SWIGTYPE_p_IFTDecayFunction1D swig_types[61]
-#define SWIGTYPE_p_IFTDecayFunction2D swig_types[62]
-#define SWIGTYPE_p_IFTDistribution1D swig_types[63]
-#define SWIGTYPE_p_IFTDistribution2D swig_types[64]
-#define SWIGTYPE_p_IFormFactor swig_types[65]
-#define SWIGTYPE_p_IFormFactorDecorator swig_types[66]
-#define SWIGTYPE_p_IFormFactorPolyhedron swig_types[67]
-#define SWIGTYPE_p_IFormFactorPrism swig_types[68]
-#define SWIGTYPE_p_IInterference swig_types[69]
-#define SWIGTYPE_p_INode swig_types[70]
-#define SWIGTYPE_p_INodeVisitor swig_types[71]
-#define SWIGTYPE_p_IParticle swig_types[72]
-#define SWIGTYPE_p_IPeakShape swig_types[73]
-#define SWIGTYPE_p_IProfileRectangularRipple swig_types[74]
-#define SWIGTYPE_p_IProfileRipple swig_types[75]
-#define SWIGTYPE_p_IRotation swig_types[76]
-#define SWIGTYPE_p_ISampleNode swig_types[77]
-#define SWIGTYPE_p_ISawtoothRipple swig_types[78]
-#define SWIGTYPE_p_ISelectionRule swig_types[79]
-#define SWIGTYPE_p_IdentityRotation swig_types[80]
-#define SWIGTYPE_p_Interference1DLattice swig_types[81]
-#define SWIGTYPE_p_Interference2DLattice swig_types[82]
-#define SWIGTYPE_p_Interference2DParaCrystal swig_types[83]
-#define SWIGTYPE_p_Interference2DSuperLattice swig_types[84]
-#define SWIGTYPE_p_Interference3DLattice swig_types[85]
-#define SWIGTYPE_p_InterferenceFinite2DLattice swig_types[86]
-#define SWIGTYPE_p_InterferenceFinite3DLattice swig_types[87]
-#define SWIGTYPE_p_InterferenceHardDisk swig_types[88]
-#define SWIGTYPE_p_InterferenceNone swig_types[89]
-#define SWIGTYPE_p_InterferenceRadialParaCrystal swig_types[90]
-#define SWIGTYPE_p_InterferenceTwin swig_types[91]
-#define SWIGTYPE_p_IsotropicGaussPeakShape swig_types[92]
-#define SWIGTYPE_p_IsotropicLorentzPeakShape swig_types[93]
-#define SWIGTYPE_p_Lattice2D swig_types[94]
-#define SWIGTYPE_p_Lattice2D__ReciprocalBases swig_types[95]
-#define SWIGTYPE_p_Lattice3D swig_types[96]
-#define SWIGTYPE_p_Layer swig_types[97]
-#define SWIGTYPE_p_LayerInterface swig_types[98]
-#define SWIGTYPE_p_LayerRoughness swig_types[99]
-#define SWIGTYPE_p_LorentzFisherPeakShape swig_types[100]
-#define SWIGTYPE_p_Material swig_types[101]
-#define SWIGTYPE_p_MesoCrystal swig_types[102]
-#define SWIGTYPE_p_MisesFisherGaussPeakShape swig_types[103]
-#define SWIGTYPE_p_MisesGaussPeakShape swig_types[104]
-#define SWIGTYPE_p_MultiLayer swig_types[105]
-#define SWIGTYPE_p_NodeMeta swig_types[106]
-#define SWIGTYPE_p_Particle swig_types[107]
-#define SWIGTYPE_p_ParticleComposition swig_types[108]
-#define SWIGTYPE_p_ParticleCoreShell swig_types[109]
-#define SWIGTYPE_p_ParticleLayout swig_types[110]
-#define SWIGTYPE_p_RotationEuler swig_types[111]
-#define SWIGTYPE_p_RotationX swig_types[112]
-#define SWIGTYPE_p_RotationY swig_types[113]
-#define SWIGTYPE_p_RotationZ swig_types[114]
-#define SWIGTYPE_p_RoughnessModelWrap swig_types[115]
-#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[116]
-#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[117]
-#define SWIGTYPE_p_SimpleSelectionRule swig_types[118]
-#define SWIGTYPE_p_SlicedParticle swig_types[119]
-#define SWIGTYPE_p_SlicingEffects swig_types[120]
-#define SWIGTYPE_p_SquareLattice2D swig_types[121]
-#define SWIGTYPE_p_Transform3D swig_types[122]
-#define SWIGTYPE_p_Vec3T_double_t swig_types[123]
-#define SWIGTYPE_p_Vec3T_int_t swig_types[124]
-#define SWIGTYPE_p_Vec3T_std__complexT_double_t_t swig_types[125]
-#define SWIGTYPE_p_WavevectorInfo swig_types[126]
-#define SWIGTYPE_p_ZLimits swig_types[127]
-#define SWIGTYPE_p_allocator_type swig_types[128]
-#define SWIGTYPE_p_char swig_types[129]
-#define SWIGTYPE_p_difference_type swig_types[130]
-#define SWIGTYPE_p_first_type swig_types[131]
-#define SWIGTYPE_p_int swig_types[132]
-#define SWIGTYPE_p_key_type swig_types[133]
-#define SWIGTYPE_p_long_long swig_types[134]
-#define SWIGTYPE_p_mapped_type swig_types[135]
-#define SWIGTYPE_p_p_PyObject swig_types[136]
-#define SWIGTYPE_p_second_type swig_types[137]
-#define SWIGTYPE_p_short swig_types[138]
-#define SWIGTYPE_p_signed_char swig_types[139]
-#define SWIGTYPE_p_size_type swig_types[140]
-#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[141]
-#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[142]
-#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[143]
-#define SWIGTYPE_p_std__allocatorT_Vec3T_double_t_t swig_types[144]
-#define SWIGTYPE_p_std__allocatorT_Vec3T_std__complexT_double_t_t_t swig_types[145]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[146]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[147]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[148]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[149]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[150]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[151]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[152]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[153]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[154]
-#define SWIGTYPE_p_std__arrayT_double_3_t swig_types[155]
-#define SWIGTYPE_p_std__arrayT_std__complexT_double_t_3_t swig_types[156]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[157]
-#define SWIGTYPE_p_std__invalid_argument swig_types[158]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[159]
-#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[160]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[161]
-#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[162]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[163]
-#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[164]
-#define SWIGTYPE_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t swig_types[165]
-#define SWIGTYPE_p_std__vectorT_ParticleLayout_const_p_std__allocatorT_ParticleLayout_const_p_t_t swig_types[166]
-#define SWIGTYPE_p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t swig_types[167]
-#define SWIGTYPE_p_std__vectorT_Vec3T_std__complexT_double_t_t_std__allocatorT_Vec3T_std__complexT_double_t_t_t_t swig_types[168]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[169]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[170]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[171]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[172]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[173]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[174]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[175]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[176]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[177]
-#define SWIGTYPE_p_unsigned_char swig_types[178]
-#define SWIGTYPE_p_unsigned_int swig_types[179]
-#define SWIGTYPE_p_unsigned_long_long swig_types[180]
-#define SWIGTYPE_p_unsigned_short swig_types[181]
-#define SWIGTYPE_p_value_type swig_types[182]
-static swig_type_info *swig_types[184];
-static swig_module_info swig_module = {swig_types, 183, 0, 0, 0, 0};
+#define SWIGTYPE_p_IBornFF swig_types[57]
+#define SWIGTYPE_p_ICloneable swig_types[58]
+#define SWIGTYPE_p_ICosineRipple swig_types[59]
+#define SWIGTYPE_p_IFTDecayFunction1D swig_types[60]
+#define SWIGTYPE_p_IFTDecayFunction2D swig_types[61]
+#define SWIGTYPE_p_IFTDistribution1D swig_types[62]
+#define SWIGTYPE_p_IFTDistribution2D swig_types[63]
+#define SWIGTYPE_p_IFormFactor swig_types[64]
+#define SWIGTYPE_p_IFormFactorDecorator swig_types[65]
+#define SWIGTYPE_p_IFormFactorPolyhedron swig_types[66]
+#define SWIGTYPE_p_IFormFactorPrism swig_types[67]
+#define SWIGTYPE_p_IInterference swig_types[68]
+#define SWIGTYPE_p_INode swig_types[69]
+#define SWIGTYPE_p_INodeVisitor swig_types[70]
+#define SWIGTYPE_p_IParticle swig_types[71]
+#define SWIGTYPE_p_IPeakShape swig_types[72]
+#define SWIGTYPE_p_IProfileRectangularRipple swig_types[73]
+#define SWIGTYPE_p_IProfileRipple swig_types[74]
+#define SWIGTYPE_p_IRotation swig_types[75]
+#define SWIGTYPE_p_ISampleNode swig_types[76]
+#define SWIGTYPE_p_ISawtoothRipple swig_types[77]
+#define SWIGTYPE_p_ISelectionRule swig_types[78]
+#define SWIGTYPE_p_IdentityRotation swig_types[79]
+#define SWIGTYPE_p_Interference1DLattice swig_types[80]
+#define SWIGTYPE_p_Interference2DLattice swig_types[81]
+#define SWIGTYPE_p_Interference2DParaCrystal swig_types[82]
+#define SWIGTYPE_p_Interference2DSuperLattice swig_types[83]
+#define SWIGTYPE_p_Interference3DLattice swig_types[84]
+#define SWIGTYPE_p_InterferenceFinite2DLattice swig_types[85]
+#define SWIGTYPE_p_InterferenceFinite3DLattice swig_types[86]
+#define SWIGTYPE_p_InterferenceHardDisk swig_types[87]
+#define SWIGTYPE_p_InterferenceNone swig_types[88]
+#define SWIGTYPE_p_InterferenceRadialParaCrystal swig_types[89]
+#define SWIGTYPE_p_InterferenceTwin swig_types[90]
+#define SWIGTYPE_p_IsotropicGaussPeakShape swig_types[91]
+#define SWIGTYPE_p_IsotropicLorentzPeakShape swig_types[92]
+#define SWIGTYPE_p_Lattice2D swig_types[93]
+#define SWIGTYPE_p_Lattice2D__ReciprocalBases swig_types[94]
+#define SWIGTYPE_p_Lattice3D swig_types[95]
+#define SWIGTYPE_p_Layer swig_types[96]
+#define SWIGTYPE_p_LayerInterface swig_types[97]
+#define SWIGTYPE_p_LayerRoughness swig_types[98]
+#define SWIGTYPE_p_LorentzFisherPeakShape swig_types[99]
+#define SWIGTYPE_p_Material swig_types[100]
+#define SWIGTYPE_p_MesoCrystal swig_types[101]
+#define SWIGTYPE_p_MisesFisherGaussPeakShape swig_types[102]
+#define SWIGTYPE_p_MisesGaussPeakShape swig_types[103]
+#define SWIGTYPE_p_MultiLayer swig_types[104]
+#define SWIGTYPE_p_NodeMeta swig_types[105]
+#define SWIGTYPE_p_Particle swig_types[106]
+#define SWIGTYPE_p_ParticleComposition swig_types[107]
+#define SWIGTYPE_p_ParticleCoreShell swig_types[108]
+#define SWIGTYPE_p_ParticleLayout swig_types[109]
+#define SWIGTYPE_p_RotationEuler swig_types[110]
+#define SWIGTYPE_p_RotationX swig_types[111]
+#define SWIGTYPE_p_RotationY swig_types[112]
+#define SWIGTYPE_p_RotationZ swig_types[113]
+#define SWIGTYPE_p_RoughnessModelWrap swig_types[114]
+#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[115]
+#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[116]
+#define SWIGTYPE_p_SimpleSelectionRule swig_types[117]
+#define SWIGTYPE_p_SlicedParticle swig_types[118]
+#define SWIGTYPE_p_SlicingEffects swig_types[119]
+#define SWIGTYPE_p_SquareLattice2D swig_types[120]
+#define SWIGTYPE_p_Transform3D swig_types[121]
+#define SWIGTYPE_p_Vec3T_double_t swig_types[122]
+#define SWIGTYPE_p_Vec3T_int_t swig_types[123]
+#define SWIGTYPE_p_Vec3T_std__complexT_double_t_t swig_types[124]
+#define SWIGTYPE_p_WavevectorInfo swig_types[125]
+#define SWIGTYPE_p_ZLimits swig_types[126]
+#define SWIGTYPE_p_allocator_type swig_types[127]
+#define SWIGTYPE_p_char swig_types[128]
+#define SWIGTYPE_p_difference_type swig_types[129]
+#define SWIGTYPE_p_first_type swig_types[130]
+#define SWIGTYPE_p_int swig_types[131]
+#define SWIGTYPE_p_key_type swig_types[132]
+#define SWIGTYPE_p_long_long swig_types[133]
+#define SWIGTYPE_p_mapped_type swig_types[134]
+#define SWIGTYPE_p_p_PyObject swig_types[135]
+#define SWIGTYPE_p_second_type swig_types[136]
+#define SWIGTYPE_p_short swig_types[137]
+#define SWIGTYPE_p_signed_char swig_types[138]
+#define SWIGTYPE_p_size_type swig_types[139]
+#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[140]
+#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[141]
+#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[142]
+#define SWIGTYPE_p_std__allocatorT_Vec3T_double_t_t swig_types[143]
+#define SWIGTYPE_p_std__allocatorT_Vec3T_std__complexT_double_t_t_t swig_types[144]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[145]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[146]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[147]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[148]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[149]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[150]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[151]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[152]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[153]
+#define SWIGTYPE_p_std__arrayT_double_3_t swig_types[154]
+#define SWIGTYPE_p_std__arrayT_std__complexT_double_t_3_t swig_types[155]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[156]
+#define SWIGTYPE_p_std__invalid_argument swig_types[157]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[158]
+#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[159]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[160]
+#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[161]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[162]
+#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[163]
+#define SWIGTYPE_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t swig_types[164]
+#define SWIGTYPE_p_std__vectorT_ParticleLayout_const_p_std__allocatorT_ParticleLayout_const_p_t_t swig_types[165]
+#define SWIGTYPE_p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t swig_types[166]
+#define SWIGTYPE_p_std__vectorT_Vec3T_std__complexT_double_t_t_std__allocatorT_Vec3T_std__complexT_double_t_t_t_t swig_types[167]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[168]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[169]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[170]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[171]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[172]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[173]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[174]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[175]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[176]
+#define SWIGTYPE_p_unsigned_char swig_types[177]
+#define SWIGTYPE_p_unsigned_int swig_types[178]
+#define SWIGTYPE_p_unsigned_long_long swig_types[179]
+#define SWIGTYPE_p_unsigned_short swig_types[180]
+#define SWIGTYPE_p_value_type swig_types[181]
+static swig_type_info *swig_types[183];
+static swig_module_info swig_module = {swig_types, 182, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -43830,208 +43829,6 @@ SWIGINTERN PyObject *FormFactorWeighted_swiginit(PyObject *SWIGUNUSEDPARM(self),
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_delete_IAbstractParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_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 *swig_obj[1] ;
-  IAbstractParticle *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &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_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  INodeVisitor *arg2 = (INodeVisitor *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IAbstractParticle_accept", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &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(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IAbstractParticle_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
-  }
-  arg2 = reinterpret_cast< INodeVisitor * >(argp2);
-  ((IAbstractParticle const *)arg1)->accept(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IAbstractParticle_abundance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_abundance" "', argument " "1"" of type '" "IAbstractParticle const *""'"); 
-  }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
-  result = (double)((IAbstractParticle const *)arg1)->abundance();
-  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 *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IAbstractParticle_setAbundance", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &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(swig_obj[1], &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_translate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  R3 arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IAbstractParticle_translate", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_translate" "', argument " "1"" of type '" "IAbstractParticle *""'"); 
-  }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IAbstractParticle_translate" "', argument " "2"" of type '" "R3""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IAbstractParticle_translate" "', argument " "2"" of type '" "R3""'");
-    } else {
-      R3 * temp = reinterpret_cast< R3 * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  (arg1)->translate(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IAbstractParticle_rotate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
-  IRotation *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IAbstractParticle_rotate", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_rotate" "', argument " "1"" of type '" "IAbstractParticle *""'"); 
-  }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IRotation,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IAbstractParticle_rotate" "', argument " "2"" of type '" "IRotation const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IAbstractParticle_rotate" "', argument " "2"" of type '" "IRotation const &""'"); 
-  }
-  arg2 = reinterpret_cast< IRotation * >(argp2);
-  (arg1)->rotate((IRotation const &)*arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *IAbstractParticle_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IAbstractParticle, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
 SWIGINTERN PyObject *_wrap_Crystal_className(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Crystal *arg1 = (Crystal *) 0 ;
@@ -44572,6 +44369,58 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_IParticle_abundance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_abundance" "', argument " "1"" of type '" "IParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  result = (double)((IParticle const *)arg1)->abundance();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_setAbundance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "IParticle_setAbundance", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_setAbundance" "', argument " "1"" of type '" "IParticle *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IParticle_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_IParticle_position(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IParticle *arg1 = (IParticle *) 0 ;
@@ -45159,35 +45008,6 @@ fail:
 
 
 SWIGINTERN PyObject *_wrap_new_Particle__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  SwigValueWrapper< Material > arg1 ;
-  void *argp1 ;
-  int res1 = 0 ;
-  Particle *result = 0 ;
-  
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  {
-    res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Material,  0  | 0);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Particle" "', argument " "1"" of type '" "Material""'"); 
-    }  
-    if (!argp1) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Particle" "', argument " "1"" of type '" "Material""'");
-    } else {
-      Material * temp = reinterpret_cast< Material * >(argp1);
-      arg1 = *temp;
-      if (SWIG_IsNewObj(res1)) delete temp;
-    }
-  }
-  result = (Particle *)new Particle(arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Particle, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_Particle__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   SwigValueWrapper< Material > arg1 ;
   IFormFactor *arg2 = 0 ;
@@ -45227,7 +45047,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_Particle__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_Particle__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   SwigValueWrapper< Material > arg1 ;
   IFormFactor *arg2 = 0 ;
@@ -45286,14 +45106,6 @@ SWIGINTERN PyObject *_wrap_new_Particle(PyObject *self, PyObject *args) {
   
   if (!(argc = SWIG_Python_UnpackTuple(args, "new_Particle", 0, 3, argv))) SWIG_fail;
   --argc;
-  if (argc == 1) {
-    int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Material, SWIG_POINTER_NO_NULL | 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_new_Particle__SWIG_0(self, argc, argv);
-    }
-  }
   if (argc == 2) {
     int _v;
     int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Material, SWIG_POINTER_NO_NULL | 0);
@@ -45302,7 +45114,7 @@ SWIGINTERN PyObject *_wrap_new_Particle(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IFormFactor, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_new_Particle__SWIG_1(self, argc, argv);
+        return _wrap_new_Particle__SWIG_0(self, argc, argv);
       }
     }
   }
@@ -45317,7 +45129,7 @@ SWIGINTERN PyObject *_wrap_new_Particle(PyObject *self, PyObject *args) {
         int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_IRotation, SWIG_POINTER_NO_NULL | 0);
         _v = SWIG_CheckState(res);
         if (_v) {
-          return _wrap_new_Particle__SWIG_2(self, argc, argv);
+          return _wrap_new_Particle__SWIG_1(self, argc, argv);
         }
       }
     }
@@ -45326,7 +45138,6 @@ SWIGINTERN PyObject *_wrap_new_Particle(PyObject *self, PyObject *args) {
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_Particle'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    Particle::Particle(Material)\n"
     "    Particle::Particle(Material,IFormFactor const &)\n"
     "    Particle::Particle(Material,IFormFactor const &,IRotation const &)\n");
   return 0;
@@ -45442,43 +45253,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Particle_setMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Particle *arg1 = (Particle *) 0 ;
-  SwigValueWrapper< Material > arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "Particle_setMaterial", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Particle, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_setMaterial" "', argument " "1"" of type '" "Particle *""'"); 
-  }
-  arg1 = reinterpret_cast< Particle * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Material,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Particle_setMaterial" "', argument " "2"" of type '" "Material""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Particle_setMaterial" "', argument " "2"" of type '" "Material""'");
-    } else {
-      Material * temp = reinterpret_cast< Material * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  (arg1)->setMaterial(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_Particle_material(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Particle *arg1 = (Particle *) 0 ;
@@ -56842,7 +56616,7 @@ fail:
 
 SWIGINTERN PyObject *_wrap_new_ParticleLayout__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = 0 ;
+  IParticle *arg1 = 0 ;
   double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -56851,20 +56625,20 @@ SWIGINTERN PyObject *_wrap_new_ParticleLayout__SWIG_1(PyObject *SWIGUNUSEDPARM(s
   ParticleLayout *result = 0 ;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IAbstractParticle,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IParticle,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleLayout" "', argument " "1"" of type '" "IAbstractParticle const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleLayout" "', argument " "1"" of type '" "IParticle const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleLayout" "', argument " "1"" of type '" "IAbstractParticle const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleLayout" "', argument " "1"" of type '" "IParticle const &""'"); 
   }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
+  arg1 = reinterpret_cast< IParticle * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
     SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_ParticleLayout" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  result = (ParticleLayout *)new ParticleLayout((IAbstractParticle const &)*arg1,arg2);
+  result = (ParticleLayout *)new ParticleLayout((IParticle const &)*arg1,arg2);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleLayout, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
@@ -56874,21 +56648,21 @@ fail:
 
 SWIGINTERN PyObject *_wrap_new_ParticleLayout__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IAbstractParticle *arg1 = 0 ;
+  IParticle *arg1 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   ParticleLayout *result = 0 ;
   
   if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IAbstractParticle,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IParticle,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleLayout" "', argument " "1"" of type '" "IAbstractParticle const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleLayout" "', argument " "1"" of type '" "IParticle const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleLayout" "', argument " "1"" of type '" "IAbstractParticle const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleLayout" "', argument " "1"" of type '" "IParticle const &""'"); 
   }
-  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
-  result = (ParticleLayout *)new ParticleLayout((IAbstractParticle const &)*arg1);
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  result = (ParticleLayout *)new ParticleLayout((IParticle const &)*arg1);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleLayout, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
@@ -56909,7 +56683,7 @@ SWIGINTERN PyObject *_wrap_new_ParticleLayout(PyObject *self, PyObject *args) {
   }
   if (argc == 1) {
     int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IAbstractParticle, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IParticle, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       return _wrap_new_ParticleLayout__SWIG_2(self, argc, argv);
@@ -56917,7 +56691,7 @@ SWIGINTERN PyObject *_wrap_new_ParticleLayout(PyObject *self, PyObject *args) {
   }
   if (argc == 2) {
     int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IAbstractParticle, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IParticle, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       {
@@ -56934,8 +56708,8 @@ fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_ParticleLayout'.\n"
     "  Possible C/C++ prototypes are:\n"
     "    ParticleLayout::ParticleLayout()\n"
-    "    ParticleLayout::ParticleLayout(IAbstractParticle const &,double)\n"
-    "    ParticleLayout::ParticleLayout(IAbstractParticle const &)\n");
+    "    ParticleLayout::ParticleLayout(IParticle const &,double)\n"
+    "    ParticleLayout::ParticleLayout(IParticle const &)\n");
   return 0;
 }
 
@@ -57017,7 +56791,7 @@ fail:
 SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   ParticleLayout *arg1 = (ParticleLayout *) 0 ;
-  IAbstractParticle *arg2 = 0 ;
+  IParticle *arg2 = 0 ;
   double arg3 ;
   R3 arg4 ;
   IRotation *arg5 = 0 ;
@@ -57038,14 +56812,14 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_0(PyObject *SWIGUNUS
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_addParticle" "', argument " "1"" of type '" "ParticleLayout *""'"); 
   }
   arg1 = reinterpret_cast< ParticleLayout * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IAbstractParticle,  0  | 0);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IParticle,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IAbstractParticle const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IAbstractParticle const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
   }
-  arg2 = reinterpret_cast< IAbstractParticle * >(argp2);
+  arg2 = reinterpret_cast< IParticle * >(argp2);
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
     SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ParticleLayout_addParticle" "', argument " "3"" of type '" "double""'");
@@ -57072,7 +56846,7 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_0(PyObject *SWIGUNUS
     SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "5"" of type '" "IRotation const &""'"); 
   }
   arg5 = reinterpret_cast< IRotation * >(argp5);
-  (arg1)->addParticle((IAbstractParticle const &)*arg2,arg3,arg4,(IRotation const &)*arg5);
+  (arg1)->addParticle((IParticle const &)*arg2,arg3,arg4,(IRotation const &)*arg5);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -57083,7 +56857,7 @@ fail:
 SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   ParticleLayout *arg1 = (ParticleLayout *) 0 ;
-  IAbstractParticle *arg2 = 0 ;
+  IParticle *arg2 = 0 ;
   double arg3 ;
   R3 arg4 ;
   void *argp1 = 0 ;
@@ -57101,14 +56875,14 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_1(PyObject *SWIGUNUS
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_addParticle" "', argument " "1"" of type '" "ParticleLayout *""'"); 
   }
   arg1 = reinterpret_cast< ParticleLayout * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IAbstractParticle,  0  | 0);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IParticle,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IAbstractParticle const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IAbstractParticle const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
   }
-  arg2 = reinterpret_cast< IAbstractParticle * >(argp2);
+  arg2 = reinterpret_cast< IParticle * >(argp2);
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
     SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ParticleLayout_addParticle" "', argument " "3"" of type '" "double""'");
@@ -57127,7 +56901,7 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_1(PyObject *SWIGUNUS
       if (SWIG_IsNewObj(res4)) delete temp;
     }
   }
-  (arg1)->addParticle((IAbstractParticle const &)*arg2,arg3,arg4);
+  (arg1)->addParticle((IParticle const &)*arg2,arg3,arg4);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -57138,7 +56912,7 @@ fail:
 SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   ParticleLayout *arg1 = (ParticleLayout *) 0 ;
-  IAbstractParticle *arg2 = 0 ;
+  IParticle *arg2 = 0 ;
   double arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -57153,20 +56927,20 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_2(PyObject *SWIGUNUS
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_addParticle" "', argument " "1"" of type '" "ParticleLayout *""'"); 
   }
   arg1 = reinterpret_cast< ParticleLayout * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IAbstractParticle,  0  | 0);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IParticle,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IAbstractParticle const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IAbstractParticle const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
   }
-  arg2 = reinterpret_cast< IAbstractParticle * >(argp2);
+  arg2 = reinterpret_cast< IParticle * >(argp2);
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
     SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ParticleLayout_addParticle" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
-  (arg1)->addParticle((IAbstractParticle const &)*arg2,arg3);
+  (arg1)->addParticle((IParticle const &)*arg2,arg3);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -57177,7 +56951,7 @@ fail:
 SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   ParticleLayout *arg1 = (ParticleLayout *) 0 ;
-  IAbstractParticle *arg2 = 0 ;
+  IParticle *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
@@ -57189,15 +56963,15 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_3(PyObject *SWIGUNUS
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_addParticle" "', argument " "1"" of type '" "ParticleLayout *""'"); 
   }
   arg1 = reinterpret_cast< ParticleLayout * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IAbstractParticle,  0  | 0);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IParticle,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IAbstractParticle const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IAbstractParticle const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
   }
-  arg2 = reinterpret_cast< IAbstractParticle * >(argp2);
-  (arg1)->addParticle((IAbstractParticle const &)*arg2);
+  arg2 = reinterpret_cast< IParticle * >(argp2);
+  (arg1)->addParticle((IParticle const &)*arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -57219,7 +56993,7 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle(PyObject *self, PyObject *
     int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParticleLayout, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAbstractParticle, SWIG_POINTER_NO_NULL | 0);
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IParticle, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
         return _wrap_ParticleLayout_addParticle__SWIG_3(self, argc, argv);
@@ -57232,7 +57006,7 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle(PyObject *self, PyObject *
     int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParticleLayout, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAbstractParticle, SWIG_POINTER_NO_NULL | 0);
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IParticle, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
         {
@@ -57251,7 +57025,7 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle(PyObject *self, PyObject *
     int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParticleLayout, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAbstractParticle, SWIG_POINTER_NO_NULL | 0);
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IParticle, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
         {
@@ -57274,7 +57048,7 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle(PyObject *self, PyObject *
     int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParticleLayout, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAbstractParticle, SWIG_POINTER_NO_NULL | 0);
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IParticle, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
         {
@@ -57299,10 +57073,10 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle(PyObject *self, PyObject *
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'ParticleLayout_addParticle'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    ParticleLayout::addParticle(IAbstractParticle const &,double,R3,IRotation const &)\n"
-    "    ParticleLayout::addParticle(IAbstractParticle const &,double,R3)\n"
-    "    ParticleLayout::addParticle(IAbstractParticle const &,double)\n"
-    "    ParticleLayout::addParticle(IAbstractParticle const &)\n");
+    "    ParticleLayout::addParticle(IParticle const &,double,R3,IRotation const &)\n"
+    "    ParticleLayout::addParticle(IParticle const &,double,R3)\n"
+    "    ParticleLayout::addParticle(IParticle const &,double)\n"
+    "    ParticleLayout::addParticle(IParticle const &)\n");
   return 0;
 }
 
@@ -72678,56 +72452,6 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "FormFactorWeighted_swigregister", FormFactorWeighted_swigregister, METH_O, NULL},
 	 { "FormFactorWeighted_swiginit", FormFactorWeighted_swiginit, METH_VARARGS, NULL},
-	 { "delete_IAbstractParticle", _wrap_delete_IAbstractParticle, METH_O, "\n"
-		"delete_IAbstractParticle(IAbstractParticle self)\n"
-		"IAbstractParticle::~IAbstractParticle() override=default\n"
-		"\n"
-		""},
-	 { "IAbstractParticle_clone", _wrap_IAbstractParticle_clone, METH_O, "\n"
-		"IAbstractParticle_clone(IAbstractParticle self) -> IAbstractParticle\n"
-		"IAbstractParticle* IAbstractParticle::clone() const override=0\n"
-		"\n"
-		"Returns a clone of this  ISampleNode object. \n"
-		"\n"
-		""},
-	 { "IAbstractParticle_accept", _wrap_IAbstractParticle_accept, METH_VARARGS, "\n"
-		"IAbstractParticle_accept(IAbstractParticle self, INodeVisitor * visitor)\n"
-		"void IAbstractParticle::accept(INodeVisitor *visitor) const override\n"
-		"\n"
-		""},
-	 { "IAbstractParticle_abundance", _wrap_IAbstractParticle_abundance, METH_O, "\n"
-		"IAbstractParticle_abundance(IAbstractParticle self) -> double\n"
-		"double IAbstractParticle::abundance() const\n"
-		"\n"
-		""},
-	 { "IAbstractParticle_setAbundance", _wrap_IAbstractParticle_setAbundance, METH_VARARGS, "\n"
-		"IAbstractParticle_setAbundance(IAbstractParticle self, double abundance)\n"
-		"void IAbstractParticle::setAbundance(double abundance)\n"
-		"\n"
-		"Sets particle abundance.\n"
-		"\n"
-		"Parameters:\n"
-		"-----------\n"
-		"\n"
-		"abundance: \n"
-		"proportion of this type of particles normalized to the total number of particles in the layout. \n"
-		"\n"
-		""},
-	 { "IAbstractParticle_translate", _wrap_IAbstractParticle_translate, METH_VARARGS, "\n"
-		"IAbstractParticle_translate(IAbstractParticle self, R3 translation)\n"
-		"virtual void IAbstractParticle::translate(R3 translation)=0\n"
-		"\n"
-		"Translates the particle with the given vector. \n"
-		"\n"
-		""},
-	 { "IAbstractParticle_rotate", _wrap_IAbstractParticle_rotate, METH_VARARGS, "\n"
-		"IAbstractParticle_rotate(IAbstractParticle self, IRotation rotation)\n"
-		"virtual void IAbstractParticle::rotate(const IRotation &rotation)=0\n"
-		"\n"
-		"Applies the given rotation to the particle. \n"
-		"\n"
-		""},
-	 { "IAbstractParticle_swigregister", IAbstractParticle_swigregister, METH_O, NULL},
 	 { "Crystal_className", _wrap_Crystal_className, METH_O, "\n"
 		"Crystal_className(Crystal self) -> std::string\n"
 		"std::string Crystal::className() const final\n"
@@ -72803,6 +72527,24 @@ static PyMethodDef SwigMethods[] = {
 		"Creates a sliced form factor for this particle. \n"
 		"\n"
 		""},
+	 { "IParticle_abundance", _wrap_IParticle_abundance, METH_O, "\n"
+		"IParticle_abundance(IParticle self) -> double\n"
+		"double IParticle::abundance() const\n"
+		"\n"
+		""},
+	 { "IParticle_setAbundance", _wrap_IParticle_setAbundance, METH_VARARGS, "\n"
+		"IParticle_setAbundance(IParticle self, double abundance)\n"
+		"void IParticle::setAbundance(double abundance)\n"
+		"\n"
+		"Sets particle abundance.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"abundance: \n"
+		"proportion of this type of particles normalized to the total number of particles in the layout. \n"
+		"\n"
+		""},
 	 { "IParticle_position", _wrap_IParticle_position, METH_O, "\n"
 		"IParticle_position(IParticle self) -> R3\n"
 		"R3 IParticle::position() const\n"
@@ -72832,7 +72574,7 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "IParticle_translate", _wrap_IParticle_translate, METH_VARARGS, "\n"
 		"IParticle_translate(IParticle self, R3 translation)\n"
-		"void IParticle::translate(R3 translation) override\n"
+		"void IParticle::translate(R3 translation)\n"
 		"\n"
 		"Translates the particle. \n"
 		"\n"
@@ -72853,7 +72595,7 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "IParticle_rotate", _wrap_IParticle_rotate, METH_VARARGS, "\n"
 		"IParticle_rotate(IParticle self, IRotation rotation)\n"
-		"void IParticle::rotate(const IRotation &rotation) override\n"
+		"void IParticle::rotate(const IRotation &rotation)\n"
 		"\n"
 		"Rotates the particle. \n"
 		"\n"
@@ -72925,7 +72667,6 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "new_Particle", _wrap_new_Particle, METH_VARARGS, "\n"
-		"Particle(Material material)\n"
 		"Particle(Material material, IFormFactor form_factor)\n"
 		"new_Particle(Material material, IFormFactor form_factor, IRotation rotation) -> Particle\n"
 		"Particle::Particle(Material material, const IFormFactor &form_factor, const IRotation &rotation)\n"
@@ -72955,11 +72696,6 @@ static PyMethodDef SwigMethods[] = {
 		"Creates a sliced form factor for this particle. \n"
 		"\n"
 		""},
-	 { "Particle_setMaterial", _wrap_Particle_setMaterial, METH_VARARGS, "\n"
-		"Particle_setMaterial(Particle self, Material material)\n"
-		"void Particle::setMaterial(Material material)\n"
-		"\n"
-		""},
 	 { "Particle_material", _wrap_Particle_material, METH_O, "\n"
 		"Particle_material(Particle self) -> Material\n"
 		"const Material* Particle::material() const override\n"
@@ -74946,8 +74682,8 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "new_ParticleLayout", _wrap_new_ParticleLayout, METH_VARARGS, "\n"
 		"ParticleLayout()\n"
-		"ParticleLayout(IAbstractParticle particle, double abundance=-1.0)\n"
-		"ParticleLayout::ParticleLayout(const IAbstractParticle &particle, double abundance=-1.0)\n"
+		"ParticleLayout(IParticle particle, double abundance=-1.0)\n"
+		"ParticleLayout::ParticleLayout(const IParticle &particle, double abundance=-1.0)\n"
 		"\n"
 		""},
 	 { "delete_ParticleLayout", _wrap_delete_ParticleLayout, METH_O, "\n"
@@ -74968,8 +74704,8 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "ParticleLayout_addParticle", _wrap_ParticleLayout_addParticle, METH_VARARGS, "\n"
-		"ParticleLayout_addParticle(ParticleLayout self, IAbstractParticle particle, double abundance=-1.0, R3 position={}, IRotation rotation=IdentityRotation())\n"
-		"void ParticleLayout::addParticle(const IAbstractParticle &particle, double abundance=-1.0, R3 position={}, const IRotation &rotation=IdentityRotation())\n"
+		"ParticleLayout_addParticle(ParticleLayout self, IParticle particle, double abundance=-1.0, R3 position={}, IRotation rotation=IdentityRotation())\n"
+		"void ParticleLayout::addParticle(const IParticle &particle, double abundance=-1.0, R3 position={}, const IRotation &rotation=IdentityRotation())\n"
 		"\n"
 		"Adds particle to the layout with abundance, position and the rotation defined.\n"
 		"\n"
@@ -74993,7 +74729,7 @@ static PyMethodDef SwigMethods[] = {
 		"ParticleLayout_particles(ParticleLayout self) -> SafePointerVector< IParticle >\n"
 		"SafePointerVector< IParticle > ParticleLayout::particles() const\n"
 		"\n"
-		"Returns information on all particles (type and abundance) and generates new particles if an  IAbstractParticle denotes a collection \n"
+		"Returns information on all particles (type and abundance) and generates new particles if an  IParticle denotes a collection \n"
 		"\n"
 		""},
 	 { "ParticleLayout_interferenceFunction", _wrap_ParticleLayout_interferenceFunction, METH_O, "\n"
@@ -77395,7 +77131,7 @@ static void *_p_FormFactorLongBoxGaussTo_p_ISampleNode(void *x, int *SWIGUNUSEDP
     return (void *)((ISampleNode *) (IFormFactor *)(IBornFF *) ((FormFactorLongBoxGauss *) x));
 }
 static void *_p_ParticleCoreShellTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
+    return (void *)((ISampleNode *) (IParticle *) ((ParticleCoreShell *) x));
 }
 static void *_p_FormFactorCosineRippleGaussTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISampleNode *) (IFormFactor *)(IBornFF *)(IProfileRipple *)(ICosineRipple *) ((FormFactorCosineRippleGauss *) x));
@@ -77422,7 +77158,7 @@ static void *_p_CrystalTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory))
     return (void *)((ISampleNode *)  ((Crystal *) x));
 }
 static void *_p_MesoCrystalTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
+    return (void *)((ISampleNode *) (IParticle *) ((MesoCrystal *) x));
 }
 static void *_p_InterferenceNoneTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISampleNode *) (IInterference *) ((InterferenceNone *) x));
@@ -77448,14 +77184,11 @@ static void *_p_MultiLayerTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemor
 static void *_p_InterferenceHardDiskTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISampleNode *) (IInterference *) ((InterferenceHardDisk *) x));
 }
-static void *_p_IAbstractParticleTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *)  ((IAbstractParticle *) x));
-}
 static void *_p_IParticleTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IAbstractParticle *) ((IParticle *) x));
+    return (void *)((ISampleNode *)  ((IParticle *) x));
 }
 static void *_p_ParticleTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IAbstractParticle *)(IParticle *) ((Particle *) x));
+    return (void *)((ISampleNode *) (IParticle *) ((Particle *) x));
 }
 static void *_p_FormFactorBoxTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISampleNode *) (IFormFactor *)(IBornFF *)(IFormFactorPrism *) ((FormFactorBox *) x));
@@ -77535,15 +77268,15 @@ static void *_p_LorentzFisherPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDP
 static void *_p_GaussFisherPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISampleNode *) (IPeakShape *) ((GaussFisherPeakShape *) x));
 }
-static void *_p_IsotropicLorentzPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IPeakShape *) ((IsotropicLorentzPeakShape *) x));
-}
 static void *_p_IPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISampleNode *)  ((IPeakShape *) x));
 }
 static void *_p_IsotropicGaussPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISampleNode *) (IPeakShape *) ((IsotropicGaussPeakShape *) x));
 }
+static void *_p_IsotropicLorentzPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISampleNode *) (IPeakShape *) ((IsotropicLorentzPeakShape *) x));
+}
 static void *_p_FormFactorWeightedTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISampleNode *) (IFormFactor *) ((FormFactorWeighted *) x));
 }
@@ -77572,7 +77305,7 @@ static void *_p_FormFactorSawtoothRippleBoxTo_p_ISampleNode(void *x, int *SWIGUN
     return (void *)((ISampleNode *) (IFormFactor *)(IBornFF *)(IProfileRipple *)(ISawtoothRipple *) ((FormFactorSawtoothRippleBox *) x));
 }
 static void *_p_ParticleCompositionTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
+    return (void *)((ISampleNode *) (IParticle *) ((ParticleComposition *) x));
 }
 static void *_p_FormFactorAnisoPyramidTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISampleNode *) (IFormFactor *)(IBornFF *)(IFormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
@@ -77604,21 +77337,6 @@ static void *_p_ParticleTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory))
 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));
-}
-static void *_p_MesoCrystalTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IAbstractParticle *) (IParticle *) ((MesoCrystal *) x));
-}
-static void *_p_IParticleTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IAbstractParticle *)  ((IParticle *) x));
-}
-static void *_p_ParticleTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IAbstractParticle *) (IParticle *) ((Particle *) x));
-}
-static void *_p_ParticleCoreShellTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IAbstractParticle *) (IParticle *) ((ParticleCoreShell *) x));
-}
 static void *_p_FormFactorPrism3To_p_IFormFactorPrism(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorPrism *)  ((FormFactorPrism3 *) x));
 }
@@ -77746,7 +77464,7 @@ static void *_p_FTDistribution2DConeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM
     return (void *)((ICloneable *) (IFTDistribution2D *) ((FTDistribution2DCone *) x));
 }
 static void *_p_ParticleCoreShellTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *)(IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
+    return (void *)((ICloneable *) (ISampleNode *)(IParticle *) ((ParticleCoreShell *) x));
 }
 static void *_p_ISawtoothRippleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISampleNode *)(IFormFactor *)(IBornFF *)(IProfileRipple *) ((ISawtoothRipple *) x));
@@ -77775,12 +77493,12 @@ static void *_p_FTDistribution2DGateTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM
 static void *_p_IInterferenceTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISampleNode *) ((IInterference *) x));
 }
-static void *_p_FTDistribution1DVoigtTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (IFTDistribution1D *) ((FTDistribution1DVoigt *) x));
-}
 static void *_p_FTDecayFunction1DVoigtTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IFTDecayFunction1D *) ((FTDecayFunction1DVoigt *) x));
 }
+static void *_p_FTDistribution1DVoigtTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (IFTDistribution1D *) ((FTDistribution1DVoigt *) x));
+}
 static void *_p_IdentityRotationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IRotation *) ((IdentityRotation *) x));
 }
@@ -77817,14 +77535,11 @@ static void *_p_RotationZTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)
 static void *_p_InterferenceTwinTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISampleNode *)(IInterference *) ((InterferenceTwin *) x));
 }
-static void *_p_IAbstractParticleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *) ((IAbstractParticle *) x));
-}
 static void *_p_IParticleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *)(IAbstractParticle *) ((IParticle *) x));
+    return (void *)((ICloneable *) (ISampleNode *) ((IParticle *) x));
 }
 static void *_p_ParticleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *)(IAbstractParticle *)(IParticle *) ((Particle *) x));
+    return (void *)((ICloneable *) (ISampleNode *)(IParticle *) ((Particle *) x));
 }
 static void *_p_Lattice2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((Lattice2D *) x));
@@ -77869,7 +77584,7 @@ static void *_p_FormFactorEllipsoidalCylinderTo_p_ICloneable(void *x, int *SWIGU
     return (void *)((ICloneable *) (ISampleNode *)(IFormFactor *)(IBornFF *) ((FormFactorEllipsoidalCylinder *) x));
 }
 static void *_p_ParticleCompositionTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *)(IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
+    return (void *)((ICloneable *) (ISampleNode *)(IParticle *) ((ParticleComposition *) x));
 }
 static void *_p_FTDistribution1DCosineTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IFTDistribution1D *) ((FTDistribution1DCosine *) x));
@@ -77926,7 +77641,7 @@ static void *_p_FormFactorCrystalTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(ne
     return (void *)((ICloneable *) (ISampleNode *)(IFormFactor *) ((FormFactorCrystal *) x));
 }
 static void *_p_MesoCrystalTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *)(IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
+    return (void *)((ICloneable *) (ISampleNode *)(IParticle *) ((MesoCrystal *) x));
 }
 static void *_p_ICosineRippleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISampleNode *)(IFormFactor *)(IBornFF *)(IProfileRipple *) ((ICosineRipple *) x));
@@ -78103,7 +77818,7 @@ static void *_p_FTDistribution2DConeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newm
     return (void *)((INode *) (IFTDistribution2D *) ((FTDistribution2DCone *) x));
 }
 static void *_p_ParticleCoreShellTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *)(IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
+    return (void *)((INode *) (ISampleNode *)(IParticle *) ((ParticleCoreShell *) x));
 }
 static void *_p_ISawtoothRippleTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISampleNode *)(IFormFactor *)(IBornFF *)(IProfileRipple *) ((ISawtoothRipple *) x));
@@ -78132,12 +77847,12 @@ static void *_p_FTDistribution2DGateTo_p_INode(void *x, int *SWIGUNUSEDPARM(newm
 static void *_p_IInterferenceTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISampleNode *) ((IInterference *) x));
 }
-static void *_p_FTDistribution1DVoigtTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (IFTDistribution1D *) ((FTDistribution1DVoigt *) x));
-}
 static void *_p_FTDecayFunction1DVoigtTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IFTDecayFunction1D *) ((FTDecayFunction1DVoigt *) x));
 }
+static void *_p_FTDistribution1DVoigtTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INode *) (IFTDistribution1D *) ((FTDistribution1DVoigt *) x));
+}
 static void *_p_IdentityRotationTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IRotation *) ((IdentityRotation *) x));
 }
@@ -78174,14 +77889,11 @@ static void *_p_RotationZTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
 static void *_p_InterferenceTwinTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISampleNode *)(IInterference *) ((InterferenceTwin *) x));
 }
-static void *_p_IAbstractParticleTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *) ((IAbstractParticle *) x));
-}
 static void *_p_IParticleTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *)(IAbstractParticle *) ((IParticle *) x));
+    return (void *)((INode *) (ISampleNode *) ((IParticle *) x));
 }
 static void *_p_ParticleTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *)(IAbstractParticle *)(IParticle *) ((Particle *) x));
+    return (void *)((INode *) (ISampleNode *)(IParticle *) ((Particle *) x));
 }
 static void *_p_Lattice2DTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *)  ((Lattice2D *) x));
@@ -78226,7 +77938,7 @@ static void *_p_FormFactorEllipsoidalCylinderTo_p_INode(void *x, int *SWIGUNUSED
     return (void *)((INode *) (ISampleNode *)(IFormFactor *)(IBornFF *) ((FormFactorEllipsoidalCylinder *) x));
 }
 static void *_p_ParticleCompositionTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *)(IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
+    return (void *)((INode *) (ISampleNode *)(IParticle *) ((ParticleComposition *) x));
 }
 static void *_p_FTDistribution1DCosineTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IFTDistribution1D *) ((FTDistribution1DCosine *) x));
@@ -78283,7 +77995,7 @@ static void *_p_FormFactorCrystalTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemo
     return (void *)((INode *) (ISampleNode *)(IFormFactor *) ((FormFactorCrystal *) x));
 }
 static void *_p_MesoCrystalTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *)(IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
+    return (void *)((INode *) (ISampleNode *)(IParticle *) ((MesoCrystal *) x));
 }
 static void *_p_ICosineRippleTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISampleNode *)(IFormFactor *)(IBornFF *)(IProfileRipple *) ((ICosineRipple *) x));
@@ -78573,7 +78285,6 @@ static swig_type_info _swigt__p_FormFactorTruncatedSpheroid = {"_p_FormFactorTru
 static swig_type_info _swigt__p_FormFactorWeighted = {"_p_FormFactorWeighted", "FormFactorWeighted *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_GaussFisherPeakShape = {"_p_GaussFisherPeakShape", "GaussFisherPeakShape *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_HexagonalLattice2D = {"_p_HexagonalLattice2D", "HexagonalLattice2D *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_IAbstractParticle = {"_p_IAbstractParticle", "IAbstractParticle *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IBornFF = {"_p_IBornFF", "IBornFF *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ICloneable = {"_p_ICloneable", "ICloneable *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ICosineRipple = {"_p_ICosineRipple", "ICosineRipple *", 0, 0, (void*)0, 0};
@@ -78758,7 +78469,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_FormFactorWeighted,
   &_swigt__p_GaussFisherPeakShape,
   &_swigt__p_HexagonalLattice2D,
-  &_swigt__p_IAbstractParticle,
   &_swigt__p_IBornFF,
   &_swigt__p_ICloneable,
   &_swigt__p_ICosineRipple,
@@ -78943,9 +78653,8 @@ static swig_cast_info _swigc__p_FormFactorTruncatedSpheroid[] = {  {&_swigt__p_F
 static swig_cast_info _swigc__p_FormFactorWeighted[] = {  {&_swigt__p_FormFactorWeighted, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_GaussFisherPeakShape[] = {  {&_swigt__p_GaussFisherPeakShape, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_HexagonalLattice2D[] = {  {&_swigt__p_HexagonalLattice2D, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IAbstractParticle[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_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_IBornFF[] = {  {&_swigt__p_IBornFF, 0, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IBornFF, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_IBornFF, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_IBornFF, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IBornFF, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_IBornFF, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IBornFF, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IBornFF, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IBornFF, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_IBornFF, _p_IBornFFTo_p_ICloneable, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceHardDisk, _p_InterferenceHardDiskTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterference, _p_IInterferenceTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceTwin, _p_InterferenceTwinTo_p_ICloneable, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_ISampleNode, _p_ISampleNodeTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceRadialParaCrystal, _p_InterferenceRadialParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference2DParaCrystal, _p_Interference2DParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceNone, _p_InterferenceNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFinite3DLattice, _p_InterferenceFinite3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFinite2DLattice, _p_InterferenceFinite2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference3DLattice, _p_Interference3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference2DSuperLattice, _p_Interference2DSuperLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference2DLattice, _p_Interference2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference1DLattice, _p_Interference1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_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_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_IBornFF, _p_IBornFFTo_p_ICloneable, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceHardDisk, _p_InterferenceHardDiskTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterference, _p_IInterferenceTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceTwin, _p_InterferenceTwinTo_p_ICloneable, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_ISampleNode, _p_ISampleNodeTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceRadialParaCrystal, _p_InterferenceRadialParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference2DParaCrystal, _p_Interference2DParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceNone, _p_InterferenceNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFinite3DLattice, _p_InterferenceFinite3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFinite2DLattice, _p_InterferenceFinite2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference3DLattice, _p_Interference3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference2DSuperLattice, _p_Interference2DSuperLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference2DLattice, _p_Interference2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference1DLattice, _p_Interference1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_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_ICosineRipple[] = {  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ICosineRipple, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ICosineRipple, 0, 0},  {&_swigt__p_ICosineRipple, 0, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ICosineRipple, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFTDecayFunction1D[] = {  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IFTDecayFunction1D, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IFTDecayFunction1D, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IFTDecayFunction1D, 0, 0},  {&_swigt__p_IFTDecayFunction1D, 0, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IFTDecayFunction1D, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFTDecayFunction2D[] = {  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IFTDecayFunction2D, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IFTDecayFunction2D, 0, 0},  {&_swigt__p_IFTDecayFunction2D, 0, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IFTDecayFunction2D, 0, 0},{0, 0, 0, 0}};
@@ -78956,14 +78665,14 @@ static swig_cast_info _swigc__p_IFormFactorDecorator[] = {  {&_swigt__p_IFormFac
 static swig_cast_info _swigc__p_IFormFactorPolyhedron[] = {  {&_swigt__p_IFormFactorPolyhedron, 0, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IFormFactorPolyhedron, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFormFactorPrism[] = {  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IFormFactorPrism, 0, 0},  {&_swigt__p_IFormFactorPrism, 0, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactorPrism, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IFormFactorPrism, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IInterference[] = {  {&_swigt__p_InterferenceHardDisk, _p_InterferenceHardDiskTo_p_IInterference, 0, 0},  {&_swigt__p_Interference1DLattice, _p_Interference1DLatticeTo_p_IInterference, 0, 0},  {&_swigt__p_Interference2DLattice, _p_Interference2DLatticeTo_p_IInterference, 0, 0},  {&_swigt__p_Interference2DSuperLattice, _p_Interference2DSuperLatticeTo_p_IInterference, 0, 0},  {&_swigt__p_Interference3DLattice, _p_Interference3DLatticeTo_p_IInterference, 0, 0},  {&_swigt__p_InterferenceFinite2DLattice, _p_InterferenceFinite2DLatticeTo_p_IInterference, 0, 0},  {&_swigt__p_InterferenceFinite3DLattice, _p_InterferenceFinite3DLatticeTo_p_IInterference, 0, 0},  {&_swigt__p_InterferenceTwin, _p_InterferenceTwinTo_p_IInterference, 0, 0},  {&_swigt__p_IInterference, 0, 0, 0},  {&_swigt__p_Interference2DParaCrystal, _p_Interference2DParaCrystalTo_p_IInterference, 0, 0},  {&_swigt__p_InterferenceRadialParaCrystal, _p_InterferenceRadialParaCrystalTo_p_IInterference, 0, 0},  {&_swigt__p_InterferenceNone, _p_InterferenceNoneTo_p_IInterference, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_INode[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INode, 0, 0},  {&_swigt__p_INode, 0, 0, 0},  {&_swigt__p_IBornFF, _p_IBornFFTo_p_INode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INode, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INode, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INode, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_INode, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INode, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INode, 0, 0},  {&_swigt__p_InterferenceHardDisk, _p_InterferenceHardDiskTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INode, 0, 0},  {&_swigt__p_IInterference, _p_IInterferenceTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INode, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INode, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_INode, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INode, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INode, 0, 0},  {&_swigt__p_InterferenceTwin, _p_InterferenceTwinTo_p_INode, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_INode, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_INode, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_INode, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_INode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INode, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INode, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INode, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_ISampleNode, _p_ISampleNodeTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INode, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INode, 0, 0},  {&_swigt__p_InterferenceRadialParaCrystal, _p_InterferenceRadialParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_Interference2DParaCrystal, _p_Interference2DParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INode, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_INode, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_INode, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INode, 0, 0},  {&_swigt__p_Lattice3D, _p_Lattice3DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INode, 0, 0},  {&_swigt__p_InterferenceNone, _p_InterferenceNoneTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFinite3DLattice, _p_InterferenceFinite3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFinite2DLattice, _p_InterferenceFinite2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_Interference3DLattice, _p_Interference3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_Interference2DSuperLattice, _p_Interference2DSuperLatticeTo_p_INode, 0, 0},  {&_swigt__p_Interference2DLattice, _p_Interference2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_Interference1DLattice, _p_Interference1DLatticeTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INode, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_INode[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INode, 0, 0},  {&_swigt__p_INode, 0, 0, 0},  {&_swigt__p_IBornFF, _p_IBornFFTo_p_INode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INode, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INode, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INode, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_INode, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INode, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INode, 0, 0},  {&_swigt__p_InterferenceHardDisk, _p_InterferenceHardDiskTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INode, 0, 0},  {&_swigt__p_IInterference, _p_IInterferenceTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INode, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INode, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_INode, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INode, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INode, 0, 0},  {&_swigt__p_InterferenceTwin, _p_InterferenceTwinTo_p_INode, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_INode, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_INode, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_INode, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_INode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INode, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INode, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_ISampleNode, _p_ISampleNodeTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INode, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INode, 0, 0},  {&_swigt__p_InterferenceRadialParaCrystal, _p_InterferenceRadialParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_Interference2DParaCrystal, _p_Interference2DParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INode, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_INode, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_INode, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INode, 0, 0},  {&_swigt__p_Lattice3D, _p_Lattice3DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INode, 0, 0},  {&_swigt__p_InterferenceNone, _p_InterferenceNoneTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFinite3DLattice, _p_InterferenceFinite3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFinite2DLattice, _p_InterferenceFinite2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_Interference3DLattice, _p_Interference3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_Interference2DSuperLattice, _p_Interference2DSuperLatticeTo_p_INode, 0, 0},  {&_swigt__p_Interference2DLattice, _p_Interference2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_Interference1DLattice, _p_Interference1DLatticeTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INode, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_INodeVisitor[] = {  {&_swigt__p_INodeVisitor, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IParticle[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParticle, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParticle, 0, 0},  {&_swigt__p_IParticle, 0, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParticle, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParticle, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IPeakShape[] = {  {&_swigt__p_IPeakShape, 0, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_IPeakShape, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IProfileRectangularRipple[] = {  {&_swigt__p_IProfileRectangularRipple, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IProfileRipple[] = {  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_IProfileRipple, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IProfileRipple, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_IProfileRipple, 0, 0},  {&_swigt__p_IProfileRipple, 0, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_IProfileRipple, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IRotation[] = {  {&_swigt__p_RotationY, _p_RotationYTo_p_IRotation, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IRotation, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IRotation, 0, 0},  {&_swigt__p_IRotation, 0, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_IRotation, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IRotation, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ISampleNode[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ISampleNode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ISampleNode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ISampleNode, 0, 0},  {&_swigt__p_IBornFF, _p_IBornFFTo_p_ISampleNode, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ISampleNode, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ISampleNode, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ISampleNode, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ISampleNode, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_ISampleNode, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ISampleNode, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ISampleNode, 0, 0},  {&_swigt__p_InterferenceHardDisk, _p_InterferenceHardDiskTo_p_ISampleNode, 0, 0},  {&_swigt__p_IInterference, _p_IInterferenceTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ISampleNode, 0, 0},  {&_swigt__p_InterferenceTwin, _p_InterferenceTwinTo_p_ISampleNode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ISampleNode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ISampleNode, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ISampleNode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ISampleNode, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ISampleNode, 0, 0},  {&_swigt__p_ISampleNode, 0, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ISampleNode, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ISampleNode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ISampleNode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_InterferenceRadialParaCrystal, _p_InterferenceRadialParaCrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_Interference2DParaCrystal, _p_Interference2DParaCrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_ISampleNode, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ISampleNode, 0, 0},  {&_swigt__p_InterferenceNone, _p_InterferenceNoneTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ISampleNode, 0, 0},  {&_swigt__p_InterferenceFinite3DLattice, _p_InterferenceFinite3DLatticeTo_p_ISampleNode, 0, 0},  {&_swigt__p_InterferenceFinite2DLattice, _p_InterferenceFinite2DLatticeTo_p_ISampleNode, 0, 0},  {&_swigt__p_Interference3DLattice, _p_Interference3DLatticeTo_p_ISampleNode, 0, 0},  {&_swigt__p_Interference2DSuperLattice, _p_Interference2DSuperLatticeTo_p_ISampleNode, 0, 0},  {&_swigt__p_Interference2DLattice, _p_Interference2DLatticeTo_p_ISampleNode, 0, 0},  {&_swigt__p_Interference1DLattice, _p_Interference1DLatticeTo_p_ISampleNode, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ISampleNode[] = {  {&_swigt__p_IBornFF, _p_IBornFFTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ISampleNode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ISampleNode, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ISampleNode, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_ISampleNode, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_ISampleNode, 0, 0},  {&_swigt__p_IInterference, _p_IInterferenceTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ISampleNode, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ISampleNode, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_Interference2DParaCrystal, _p_Interference2DParaCrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_InterferenceRadialParaCrystal, _p_InterferenceRadialParaCrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_InterferenceNone, _p_InterferenceNoneTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ISampleNode, 0, 0},  {&_swigt__p_InterferenceTwin, _p_InterferenceTwinTo_p_ISampleNode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ISampleNode, 0, 0},  {&_swigt__p_InterferenceHardDisk, _p_InterferenceHardDiskTo_p_ISampleNode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ISampleNode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ISampleNode, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ISampleNode, 0, 0},  {&_swigt__p_ISampleNode, 0, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ISampleNode, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ISampleNode, 0, 0},  {&_swigt__p_Interference1DLattice, _p_Interference1DLatticeTo_p_ISampleNode, 0, 0},  {&_swigt__p_Interference2DLattice, _p_Interference2DLatticeTo_p_ISampleNode, 0, 0},  {&_swigt__p_Interference2DSuperLattice, _p_Interference2DSuperLatticeTo_p_ISampleNode, 0, 0},  {&_swigt__p_Interference3DLattice, _p_Interference3DLatticeTo_p_ISampleNode, 0, 0},  {&_swigt__p_InterferenceFinite2DLattice, _p_InterferenceFinite2DLatticeTo_p_ISampleNode, 0, 0},  {&_swigt__p_InterferenceFinite3DLattice, _p_InterferenceFinite3DLatticeTo_p_ISampleNode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ISampleNode, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_ISampleNode, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ISampleNode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ISampleNode, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ISampleNode, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ISampleNode, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISawtoothRipple[] = {  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ISawtoothRipple, 0, 0},  {&_swigt__p_ISawtoothRipple, 0, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ISawtoothRipple, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ISawtoothRipple, 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_IdentityRotation[] = {  {&_swigt__p_IdentityRotation, 0, 0, 0},{0, 0, 0, 0}};
@@ -79128,7 +78837,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_FormFactorWeighted,
   _swigc__p_GaussFisherPeakShape,
   _swigc__p_HexagonalLattice2D,
-  _swigc__p_IAbstractParticle,
   _swigc__p_IBornFF,
   _swigc__p_ICloneable,
   _swigc__p_ICosineRipple,