diff --git a/Sample/Particle/IParticle.cpp b/Sample/Particle/IParticle.cpp
index ce3c343da35a4245d3b97a17a5fcf8092f0da350..8f7e2dfcedd673676703e61f1db33585ccfc3ae1 100644
--- a/Sample/Particle/IParticle.cpp
+++ b/Sample/Particle/IParticle.cpp
@@ -30,9 +30,10 @@ SlicedParticle IParticle::createSlicedParticle(const ZLimits&) const
                              "not implemented!");
 }
 
-void IParticle::translate(R3 translation)
+IParticle* IParticle::translate(R3 translation)
 {
     m_position += translation;
+    return this;
 }
 
 const IRotation* IParticle::rotation() const
@@ -45,13 +46,14 @@ void IParticle::setRotation(const IRotation& rotation)
     m_rotation.reset(rotation.clone());
 }
 
-void IParticle::rotate(const IRotation& rotation)
+IParticle* IParticle::rotate(const IRotation& rotation)
 {
     if (m_rotation)
         m_rotation.reset(createProduct(rotation, *m_rotation));
     else
         m_rotation.reset(rotation.clone());
     m_position = rotation.transformed(m_position);
+    return this;
 }
 
 std::vector<const INode*> IParticle::nodeChildren() const
diff --git a/Sample/Particle/IParticle.h b/Sample/Particle/IParticle.h
index 1d933f1eb42f130f44a16a1886c51583f5b07004..290e826cad0411ecd9a942d13c6e54bf61d25836 100644
--- a/Sample/Particle/IParticle.h
+++ b/Sample/Particle/IParticle.h
@@ -66,8 +66,8 @@ public:
     //! @param z: z-coordinate in nanometers
     void setParticlePosition(double x, double y, double z) { m_position = R3(x, y, z); }
 
-    //! Translates the particle
-    void translate(R3 translation);
+    //! Translates the particle, and returns this.
+    IParticle* translate(R3 translation);
 
     //! Returns rotation object
     const IRotation* rotation() const;
@@ -75,8 +75,8 @@ public:
     //! Sets transformation.
     void setRotation(const IRotation& rotation);
 
-    //! Rotates the particle
-    void rotate(const IRotation& rotation);
+    //! Rotates the particle, and returns this.
+    IParticle* rotate(const IRotation& rotation);
 
     std::vector<const INode*> nodeChildren() const override;
 
diff --git a/Sample/Particle/Particle.h b/Sample/Particle/Particle.h
index c5eb190b911e287e93e77eaabd627eb87741bea3..2e09cf725811b9a7ec60eec0bb6a251468d778c7 100644
--- a/Sample/Particle/Particle.h
+++ b/Sample/Particle/Particle.h
@@ -31,12 +31,12 @@ public:
     std::string className() const override { return "Particle"; }
     std::vector<const INode*> nodeChildren() const override;
 
+    SlicedParticle createSlicedParticle(const ZLimits& limits) const override;
+
     const Material* material() const override { return &m_material; }
 
     const IFormFactor* formFactor() const { return m_form_factor.get(); }
 
-    SlicedParticle createSlicedParticle(const ZLimits& limits) const override;
-
 private:
     const Material m_material;
     std::unique_ptr<const IFormFactor> m_form_factor;
diff --git a/Sample/Particle/ParticleComposition.cpp b/Sample/Particle/ParticleComposition.cpp
index fbfc1c0e5dec43794bc04f9b8e698db4be6f7d60..77ba558ee058069dbf8f850435943a14f7dc39b2 100644
--- a/Sample/Particle/ParticleComposition.cpp
+++ b/Sample/Particle/ParticleComposition.cpp
@@ -18,13 +18,6 @@
 
 ParticleComposition::ParticleComposition()
 {
-    initialize();
-}
-
-ParticleComposition::ParticleComposition(const IParticle& particle, std::vector<R3> positions)
-{
-    initialize();
-    addParticles(particle, positions);
 }
 
 ParticleComposition::~ParticleComposition() = default;
@@ -41,6 +34,40 @@ ParticleComposition* ParticleComposition::clone() const
     return result;
 }
 
+std::vector<const INode*> ParticleComposition::nodeChildren() const
+{
+    std::vector<const INode*> result = IParticle::nodeChildren();
+    for (const auto& P_particle : m_particles)
+        result.push_back(P_particle.get());
+    return result;
+}
+
+SafePointerVector<IParticle> ParticleComposition::decompose() const
+{
+    SafePointerVector<IParticle> result;
+    const auto* rot = rotation();
+    auto translation = particlePosition();
+    for (const auto& particle : m_particles) {
+        const auto sublist = particle->decompose();
+        for (auto* subparticle : sublist) {
+            if (rot)
+                subparticle->rotate(*rot);
+            subparticle->translate(translation);
+            result.push_back(subparticle->clone());
+        }
+    }
+    return result;
+}
+
+ZLimits ParticleComposition::zSpan() const
+{
+    const auto particles = decompose();
+    ZLimits result = particles[check_index(0)]->zSpan();
+    for (const auto& particle : particles)
+        result = ZLimits::enclosingInterval(result, particle->zSpan());
+    return result;
+}
+
 IFormFactor* ParticleComposition::createFormFactor() const
 {
     if (m_particles.empty())
@@ -56,15 +83,12 @@ IFormFactor* ParticleComposition::createFormFactor() const
 
 void ParticleComposition::addParticle(const IParticle& particle)
 {
-    IParticle* np = particle.clone();
-    addParticlePointer(np);
+    m_particles.emplace_back(particle.clone());
 }
 
 void ParticleComposition::addParticle(const IParticle& particle, R3 position)
 {
-    IParticle* np = particle.clone();
-    np->translate(position);
-    addParticlePointer(np);
+    m_particles.emplace_back(particle.clone()->translate(position));
 }
 
 // Please note, that positions is not const reference here. This is intentional, to
@@ -83,40 +107,6 @@ std::vector<const IParticle*> ParticleComposition::particles() const
     return result;
 }
 
-std::vector<const INode*> ParticleComposition::nodeChildren() const
-{
-    std::vector<const INode*> result = IParticle::nodeChildren();
-    for (const auto& P_particle : m_particles)
-        result.push_back(P_particle.get());
-    return result;
-}
-
-SafePointerVector<IParticle> ParticleComposition::decompose() const
-{
-    SafePointerVector<IParticle> result;
-    const auto* rot = rotation();
-    auto translation = particlePosition();
-    for (const auto& particle : m_particles) {
-        const auto sublist = particle->decompose();
-        for (auto* subparticle : sublist) {
-            if (rot)
-                subparticle->rotate(*rot);
-            subparticle->translate(translation);
-            result.push_back(subparticle->clone());
-        }
-    }
-    return result;
-}
-
-ZLimits ParticleComposition::zSpan() const
-{
-    const auto particles = decompose();
-    ZLimits result = particles[check_index(0)]->zSpan();
-    for (const auto& particle : particles)
-        result = ZLimits::enclosingInterval(result, particle->zSpan());
-    return result;
-}
-
 size_t ParticleComposition::check_index(size_t index) const
 {
     return index < m_particles.size()
@@ -124,10 +114,3 @@ size_t ParticleComposition::check_index(size_t index) const
                : throw std::runtime_error(
                    "ParticleComposition::check_index() -> Index is out of bounds");
 }
-
-void ParticleComposition::addParticlePointer(IParticle* p_particle)
-{
-    m_particles.emplace_back(p_particle);
-}
-
-void ParticleComposition::initialize() {}
diff --git a/Sample/Particle/ParticleComposition.h b/Sample/Particle/ParticleComposition.h
index 0a180d2ce30299d8789004f646d28b491927fc35..f39453179a489ccbbfc2c6417a655976322f1f48 100644
--- a/Sample/Particle/ParticleComposition.h
+++ b/Sample/Particle/ParticleComposition.h
@@ -23,14 +23,17 @@
 
 class ParticleComposition : public IParticle {
 public:
-    inline static const std::string class_name = "ParticleComposition";
-    std::string className() const final { return class_name; }
-
     ParticleComposition();
-    ParticleComposition(const IParticle& particle, std::vector<R3> positions);
 
     ~ParticleComposition() override;
+
     ParticleComposition* clone() const override;
+    std::string className() const final { return "ParticleComposition"; }
+    std::vector<const INode*> nodeChildren() const override;
+
+    SafePointerVector<IParticle> decompose() const override;
+
+    ZLimits zSpan() const override;
 
     IFormFactor* createFormFactor() const override;
 
@@ -43,20 +46,10 @@ public:
 
     std::vector<const IParticle*> particles() const;
 
-    std::vector<const INode*> nodeChildren() const override;
-
-    SafePointerVector<IParticle> decompose() const override;
-
-    ZLimits zSpan() const override;
-
 private:
     size_t check_index(size_t index) const;
 
-    //! For internal use
-    void addParticlePointer(IParticle* p_particle);
-
     std::vector<std::unique_ptr<IParticle>> m_particles;
-    void initialize();
 };
 
 #endif // BORNAGAIN_SAMPLE_PARTICLE_PARTICLECOMPOSITION_H
diff --git a/auto/Wrap/doxygenSample.i b/auto/Wrap/doxygenSample.i
index f6255eb6927e8353bb511ae77f67282e3299e146..3c852235c2f786e955bf8621fc571bd638623bd4 100644
--- a/auto/Wrap/doxygenSample.i
+++ b/auto/Wrap/doxygenSample.i
@@ -3539,9 +3539,9 @@ z:
 z-coordinate in nanometers 
 ";
 
-%feature("docstring")  IParticle::translate "void IParticle::translate(R3 translation)
+%feature("docstring")  IParticle::translate "IParticle * IParticle::translate(R3 translation)
 
-Translates the particle. 
+Translates the particle, and returns this. 
 ";
 
 %feature("docstring")  IParticle::rotation "const IRotation * IParticle::rotation() const
@@ -3554,9 +3554,9 @@ Returns rotation object.
 Sets transformation. 
 ";
 
-%feature("docstring")  IParticle::rotate "void IParticle::rotate(const IRotation &rotation)
+%feature("docstring")  IParticle::rotate "IParticle * IParticle::rotate(const IRotation &rotation)
 
-Rotates the particle. 
+Rotates the particle, and returns this. 
 ";
 
 %feature("docstring")  IParticle::nodeChildren "std::vector< const INode * > IParticle::nodeChildren() const override
@@ -4567,9 +4567,6 @@ A particle with a form factor and refractive index.
 C++ includes: Particle.h
 ";
 
-%feature("docstring")  Particle::className "std::string Particle::className() const override
-";
-
 %feature("docstring")  Particle::Particle "Particle::Particle(Material material, const IFormFactor &form_factor)
 ";
 
@@ -4584,6 +4581,12 @@ C++ includes: Particle.h
 Returns a clone of this  ISampleNode object. 
 ";
 
+%feature("docstring")  Particle::className "std::string Particle::className() const override
+";
+
+%feature("docstring")  Particle::nodeChildren "std::vector< const INode * > Particle::nodeChildren() const override
+";
+
 %feature("docstring")  Particle::createSlicedParticle "SlicedParticle Particle::createSlicedParticle(const ZLimits &limits) const override
 
 Creates a sliced form factor for this particle. 
@@ -4594,9 +4597,6 @@ Creates a sliced form factor for this particle.
 Returns nullptr, unless overwritten to return a specific material. 
 ";
 
-%feature("docstring")  Particle::nodeChildren "std::vector< const INode * > Particle::nodeChildren() const override
-";
-
 %feature("docstring")  Particle::formFactor "const IFormFactor* Particle::formFactor() const
 ";
 
@@ -4609,15 +4609,9 @@ A composition of particles at fixed positions
 C++ includes: ParticleComposition.h
 ";
 
-%feature("docstring")  ParticleComposition::className "std::string ParticleComposition::className() const final
-";
-
 %feature("docstring")  ParticleComposition::ParticleComposition "ParticleComposition::ParticleComposition()
 ";
 
-%feature("docstring")  ParticleComposition::ParticleComposition "ParticleComposition::ParticleComposition(const IParticle &particle, std::vector< R3 > positions)
-";
-
 %feature("docstring")  ParticleComposition::~ParticleComposition "ParticleComposition::~ParticleComposition() override
 ";
 
@@ -4626,6 +4620,22 @@ C++ includes: ParticleComposition.h
 Returns a clone of this  ISampleNode object. 
 ";
 
+%feature("docstring")  ParticleComposition::className "std::string ParticleComposition::className() const final
+";
+
+%feature("docstring")  ParticleComposition::nodeChildren "std::vector< const INode * > ParticleComposition::nodeChildren() const override
+";
+
+%feature("docstring")  ParticleComposition::decompose "SafePointerVector< IParticle > ParticleComposition::decompose() const override
+
+Decompose in constituent  IParticle objects. 
+";
+
+%feature("docstring")  ParticleComposition::zSpan "ZLimits ParticleComposition::zSpan() const override
+
+Top and bottom z-coordinate. 
+";
+
 %feature("docstring")  ParticleComposition::createFormFactor "IFormFactor * ParticleComposition::createFormFactor() const override
 
 Creates a form factor for this particle. 
@@ -4648,19 +4658,6 @@ Returns number of different particles.
 %feature("docstring")  ParticleComposition::particles "std::vector< const IParticle * > ParticleComposition::particles() const
 ";
 
-%feature("docstring")  ParticleComposition::nodeChildren "std::vector< const INode * > ParticleComposition::nodeChildren() const override
-";
-
-%feature("docstring")  ParticleComposition::decompose "SafePointerVector< IParticle > ParticleComposition::decompose() const override
-
-Decompose in constituent  IParticle objects. 
-";
-
-%feature("docstring")  ParticleComposition::zSpan "ZLimits ParticleComposition::zSpan() const override
-
-Top and bottom z-coordinate. 
-";
-
 
 // File: classParticleCoreShell.xml
 %feature("docstring") ParticleCoreShell "
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index 94d5c50f9cfa3e4b42a02a83cb05fa85cd5f8b18..7ae6dd180269ba88115229a2945cf7ddcc15b7af 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -4415,10 +4415,10 @@ class IParticle(ISampleNode):
 
     def translate(self, translation):
         r"""
-        translate(IParticle self, R3 translation)
-        void IParticle::translate(R3 translation)
+        translate(IParticle self, R3 translation) -> IParticle
+        IParticle * IParticle::translate(R3 translation)
 
-        Translates the particle. 
+        Translates the particle, and returns this. 
 
         """
         return _libBornAgainSample.IParticle_translate(self, translation)
@@ -4445,10 +4445,10 @@ class IParticle(ISampleNode):
 
     def rotate(self, rotation):
         r"""
-        rotate(IParticle self, IRotation rotation)
-        void IParticle::rotate(const IRotation &rotation)
+        rotate(IParticle self, IRotation rotation) -> IParticle
+        IParticle * IParticle::rotate(const IRotation &rotation)
 
-        Rotates the particle. 
+        Rotates the particle, and returns this. 
 
         """
         return _libBornAgainSample.IParticle_rotate(self, rotation)
@@ -4576,14 +4576,6 @@ class Particle(IParticle):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def className(self):
-        r"""
-        className(Particle self) -> std::string
-        std::string Particle::className() const override
-
-        """
-        return _libBornAgainSample.Particle_className(self)
-
     def __init__(self, *args):
         r"""
         __init__(Particle self, Material material, IFormFactor form_factor) -> Particle
@@ -4604,6 +4596,22 @@ class Particle(IParticle):
         """
         return _libBornAgainSample.Particle_clone(self)
 
+    def className(self):
+        r"""
+        className(Particle self) -> std::string
+        std::string Particle::className() const override
+
+        """
+        return _libBornAgainSample.Particle_className(self)
+
+    def nodeChildren(self):
+        r"""
+        nodeChildren(Particle self) -> swig_dummy_type_const_inode_vector
+        std::vector< const INode * > Particle::nodeChildren() const override
+
+        """
+        return _libBornAgainSample.Particle_nodeChildren(self)
+
     def createSlicedParticle(self, limits):
         r"""
         createSlicedParticle(Particle self, ZLimits const & limits) -> SlicedParticle
@@ -4624,14 +4632,6 @@ class Particle(IParticle):
         """
         return _libBornAgainSample.Particle_material(self)
 
-    def nodeChildren(self):
-        r"""
-        nodeChildren(Particle self) -> swig_dummy_type_const_inode_vector
-        std::vector< const INode * > Particle::nodeChildren() const override
-
-        """
-        return _libBornAgainSample.Particle_nodeChildren(self)
-
     def formFactor(self):
         r"""
         formFactor(Particle self) -> IFormFactor
@@ -4655,8 +4655,25 @@ class ParticleComposition(IParticle):
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
-    class_name = _libBornAgainSample.ParticleComposition_class_name
-    
+
+    def __init__(self):
+        r"""
+        __init__(ParticleComposition self) -> ParticleComposition
+        ParticleComposition::ParticleComposition()
+
+        """
+        _libBornAgainSample.ParticleComposition_swiginit(self, _libBornAgainSample.new_ParticleComposition())
+    __swig_destroy__ = _libBornAgainSample.delete_ParticleComposition
+
+    def clone(self):
+        r"""
+        clone(ParticleComposition self) -> ParticleComposition
+        ParticleComposition * ParticleComposition::clone() const override
+
+        Returns a clone of this  ISampleNode object. 
+
+        """
+        return _libBornAgainSample.ParticleComposition_clone(self)
 
     def className(self):
         r"""
@@ -4666,25 +4683,33 @@ class ParticleComposition(IParticle):
         """
         return _libBornAgainSample.ParticleComposition_className(self)
 
-    def __init__(self, *args):
+    def nodeChildren(self):
         r"""
-        __init__(ParticleComposition self) -> ParticleComposition
-        __init__(ParticleComposition self, IParticle particle, vector_R3 positions) -> ParticleComposition
-        ParticleComposition::ParticleComposition(const IParticle &particle, std::vector< R3 > positions)
+        nodeChildren(ParticleComposition self) -> swig_dummy_type_const_inode_vector
+        std::vector< const INode * > ParticleComposition::nodeChildren() const override
 
         """
-        _libBornAgainSample.ParticleComposition_swiginit(self, _libBornAgainSample.new_ParticleComposition(*args))
-    __swig_destroy__ = _libBornAgainSample.delete_ParticleComposition
+        return _libBornAgainSample.ParticleComposition_nodeChildren(self)
 
-    def clone(self):
+    def decompose(self):
         r"""
-        clone(ParticleComposition self) -> ParticleComposition
-        ParticleComposition * ParticleComposition::clone() const override
+        decompose(ParticleComposition self) -> SafePointerVector< IParticle >
+        SafePointerVector< IParticle > ParticleComposition::decompose() const override
 
-        Returns a clone of this  ISampleNode object. 
+        Decompose in constituent  IParticle objects. 
 
         """
-        return _libBornAgainSample.ParticleComposition_clone(self)
+        return _libBornAgainSample.ParticleComposition_decompose(self)
+
+    def zSpan(self):
+        r"""
+        zSpan(ParticleComposition self) -> ZLimits
+        ZLimits ParticleComposition::zSpan() const override
+
+        Top and bottom z-coordinate. 
+
+        """
+        return _libBornAgainSample.ParticleComposition_zSpan(self)
 
     def createFormFactor(self):
         r"""
@@ -4731,34 +4756,6 @@ class ParticleComposition(IParticle):
         """
         return _libBornAgainSample.ParticleComposition_particles(self)
 
-    def nodeChildren(self):
-        r"""
-        nodeChildren(ParticleComposition self) -> swig_dummy_type_const_inode_vector
-        std::vector< const INode * > ParticleComposition::nodeChildren() const override
-
-        """
-        return _libBornAgainSample.ParticleComposition_nodeChildren(self)
-
-    def decompose(self):
-        r"""
-        decompose(ParticleComposition self) -> SafePointerVector< IParticle >
-        SafePointerVector< IParticle > ParticleComposition::decompose() const override
-
-        Decompose in constituent  IParticle objects. 
-
-        """
-        return _libBornAgainSample.ParticleComposition_decompose(self)
-
-    def zSpan(self):
-        r"""
-        zSpan(ParticleComposition self) -> ZLimits
-        ZLimits ParticleComposition::zSpan() const override
-
-        Top and bottom z-coordinate. 
-
-        """
-        return _libBornAgainSample.ParticleComposition_zSpan(self)
-
 # Register ParticleComposition in _libBornAgainSample:
 _libBornAgainSample.ParticleComposition_swigregister(ParticleComposition)
 
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index 971d822b913c6ea6e54f88436a6a4f163949078a..a5160cbce2d2e4aef1424d261e07a752e8db1cb1 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -43584,6 +43584,7 @@ SWIGINTERN PyObject *_wrap_IParticle_translate(PyObject *SWIGUNUSEDPARM(self), P
   void *argp2 ;
   int res2 = 0 ;
   PyObject *swig_obj[2] ;
+  IParticle *result = 0 ;
   
   if (!SWIG_Python_UnpackTuple(args, "IParticle_translate", 2, 2, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
@@ -43604,8 +43605,8 @@ SWIGINTERN PyObject *_wrap_IParticle_translate(PyObject *SWIGUNUSEDPARM(self), P
       if (SWIG_IsNewObj(res2)) delete temp;
     }
   }
-  (arg1)->translate(arg2);
-  resultobj = SWIG_Py_Void();
+  result = (IParticle *)(arg1)->translate(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IParticle, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -43676,6 +43677,7 @@ SWIGINTERN PyObject *_wrap_IParticle_rotate(PyObject *SWIGUNUSEDPARM(self), PyOb
   void *argp2 = 0 ;
   int res2 = 0 ;
   PyObject *swig_obj[2] ;
+  IParticle *result = 0 ;
   
   if (!SWIG_Python_UnpackTuple(args, "IParticle_rotate", 2, 2, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
@@ -43691,8 +43693,8 @@ SWIGINTERN PyObject *_wrap_IParticle_rotate(PyObject *SWIGUNUSEDPARM(self), PyOb
     SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParticle_rotate" "', argument " "2"" of type '" "IRotation const &""'"); 
   }
   arg2 = reinterpret_cast< IRotation * >(argp2);
-  (arg1)->rotate((IRotation const &)*arg2);
-  resultobj = SWIG_Py_Void();
+  result = (IParticle *)(arg1)->rotate((IRotation const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IParticle, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -44001,29 +44003,6 @@ SWIGINTERN PyObject *MesoCrystal_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObje
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_Particle_className(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Particle *arg1 = (Particle *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  std::string result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  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_className" "', argument " "1"" of type '" "Particle const *""'"); 
-  }
-  arg1 = reinterpret_cast< Particle * >(argp1);
-  result = ((Particle const *)arg1)->className();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_new_Particle__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   SwigValueWrapper< Material > arg1 ;
@@ -44206,6 +44185,52 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_Particle_className(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  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_className" "', argument " "1"" of type '" "Particle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  result = ((Particle const *)arg1)->className();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_nodeChildren(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< INode const *,std::allocator< INode const * > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  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_nodeChildren" "', argument " "1"" of type '" "Particle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  result = ((Particle const *)arg1)->nodeChildren();
+  resultobj = swig::from(static_cast< std::vector< INode const*,std::allocator< INode const * > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_Particle_createSlicedParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Particle *arg1 = (Particle *) 0 ;
@@ -44264,29 +44289,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Particle_nodeChildren(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Particle *arg1 = (Particle *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  std::vector< INode const *,std::allocator< INode const * > > result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  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_nodeChildren" "', argument " "1"" of type '" "Particle const *""'"); 
-  }
-  arg1 = reinterpret_cast< Particle * >(argp1);
-  result = ((Particle const *)arg1)->nodeChildren();
-  resultobj = swig::from(static_cast< std::vector< INode const*,std::allocator< INode const * > > >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_Particle_formFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Particle *arg1 = (Particle *) 0 ;
@@ -44328,148 +44330,150 @@ SWIGINTERN PyObject *Particle_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_ParticleComposition_className(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_ParticleComposition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_ParticleComposition", 0, 0, 0)) SWIG_fail;
+  result = (ParticleComposition *)new ParticleComposition();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleComposition, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ParticleComposition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   ParticleComposition *arg1 = (ParticleComposition *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  std::string result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParticleComposition, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_className" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ParticleComposition" "', argument " "1"" of type '" "ParticleComposition *""'"); 
   }
   arg1 = reinterpret_cast< ParticleComposition * >(argp1);
-  result = ((ParticleComposition const *)arg1)->className();
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_new_ParticleComposition__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+SWIGINTERN PyObject *_wrap_ParticleComposition_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
   ParticleComposition *result = 0 ;
   
-  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
-  result = (ParticleComposition *)new ParticleComposition();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleComposition, SWIG_POINTER_NEW |  0 );
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_clone" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  result = (ParticleComposition *)((ParticleComposition const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleComposition, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_new_ParticleComposition__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_ParticleComposition_className(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IParticle *arg1 = 0 ;
-  std::vector< R3,std::allocator< R3 > > arg2 ;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  ParticleComposition *result = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string result;
   
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IParticle,  0  | 0);
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleComposition" "', argument " "1"" of type '" "IParticle const &""'"); 
-  }
-  if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleComposition" "', argument " "1"" of type '" "IParticle const &""'"); 
-  }
-  arg1 = reinterpret_cast< IParticle * >(argp1);
-  {
-    std::vector< Vec3< double >,std::allocator< Vec3< double > > > *ptr = (std::vector< Vec3< double >,std::allocator< Vec3< double > > > *)0;
-    int res = swig::asptr(swig_obj[1], &ptr);
-    if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_ParticleComposition" "', argument " "2"" of type '" "std::vector< R3,std::allocator< R3 > >""'"); 
-    }
-    arg2 = *ptr;
-    if (SWIG_IsNewObj(res)) delete ptr;
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_className" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
   }
-  result = (ParticleComposition *)new ParticleComposition((IParticle const &)*arg1,arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleComposition, SWIG_POINTER_NEW |  0 );
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  result = ((ParticleComposition const *)arg1)->className();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_new_ParticleComposition(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
+SWIGINTERN PyObject *_wrap_ParticleComposition_nodeChildren(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< INode const *,std::allocator< INode const * > > result;
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_ParticleComposition", 0, 2, argv))) SWIG_fail;
-  --argc;
-  if (argc == 0) {
-    return _wrap_new_ParticleComposition__SWIG_0(self, argc, argv);
-  }
-  if (argc == 2) {
-    int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IParticle, SWIG_POINTER_NO_NULL | 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = swig::asptr(argv[1], (std::vector< Vec3< double >,std::allocator< Vec3< double > > >**)(0));
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_new_ParticleComposition__SWIG_1(self, argc, argv);
-      }
-    }
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_nodeChildren" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
   }
-  
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  result = ((ParticleComposition const *)arg1)->nodeChildren();
+  resultobj = swig::from(static_cast< std::vector< INode const*,std::allocator< INode const * > > >(result));
+  return resultobj;
 fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_ParticleComposition'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    ParticleComposition::ParticleComposition()\n"
-    "    ParticleComposition::ParticleComposition(IParticle const &,std::vector< R3,std::allocator< R3 > >)\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_ParticleComposition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_ParticleComposition_decompose(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   ParticleComposition *arg1 = (ParticleComposition *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
+  SwigValueWrapper< SafePointerVector< IParticle > > result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParticleComposition, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ParticleComposition" "', argument " "1"" of type '" "ParticleComposition *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_decompose" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
   }
   arg1 = reinterpret_cast< ParticleComposition * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  result = ((ParticleComposition const *)arg1)->decompose();
+  resultobj = SWIG_NewPointerObj((new SafePointerVector< IParticle >(static_cast< const SafePointerVector< IParticle >& >(result))), SWIGTYPE_p_SafePointerVectorT_IParticle_t, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_ParticleComposition_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_ParticleComposition_zSpan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   ParticleComposition *arg1 = (ParticleComposition *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  ParticleComposition *result = 0 ;
+  ZLimits result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_clone" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_zSpan" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
   }
   arg1 = reinterpret_cast< ParticleComposition * >(argp1);
-  result = (ParticleComposition *)((ParticleComposition const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  result = ((ParticleComposition const *)arg1)->zSpan();
+  resultobj = SWIG_NewPointerObj((new ZLimits(static_cast< const ZLimits& >(result))), SWIGTYPE_p_ZLimits, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -44720,75 +44724,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_ParticleComposition_nodeChildren(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  std::vector< INode const *,std::allocator< INode const * > > result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_nodeChildren" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
-  }
-  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
-  result = ((ParticleComposition const *)arg1)->nodeChildren();
-  resultobj = swig::from(static_cast< std::vector< INode const*,std::allocator< INode const * > > >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_ParticleComposition_decompose(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  SwigValueWrapper< SafePointerVector< IParticle > > result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_decompose" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
-  }
-  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
-  result = ((ParticleComposition const *)arg1)->decompose();
-  resultobj = SWIG_NewPointerObj((new SafePointerVector< IParticle >(static_cast< const SafePointerVector< IParticle >& >(result))), SWIGTYPE_p_SafePointerVectorT_IParticle_t, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_ParticleComposition_zSpan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  ZLimits result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_zSpan" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
-  }
-  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
-  result = ((ParticleComposition const *)arg1)->zSpan();
-  resultobj = SWIG_NewPointerObj((new ZLimits(static_cast< const ZLimits& >(result))), SWIGTYPE_p_ZLimits, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *ParticleComposition_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -69273,10 +69208,10 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "IParticle_translate", _wrap_IParticle_translate, METH_VARARGS, "\n"
-		"IParticle_translate(IParticle self, R3 translation)\n"
-		"void IParticle::translate(R3 translation)\n"
+		"IParticle_translate(IParticle self, R3 translation) -> IParticle\n"
+		"IParticle * IParticle::translate(R3 translation)\n"
 		"\n"
-		"Translates the particle. \n"
+		"Translates the particle, and returns this. \n"
 		"\n"
 		""},
 	 { "IParticle_rotation", _wrap_IParticle_rotation, METH_O, "\n"
@@ -69294,10 +69229,10 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "IParticle_rotate", _wrap_IParticle_rotate, METH_VARARGS, "\n"
-		"IParticle_rotate(IParticle self, IRotation rotation)\n"
-		"void IParticle::rotate(const IRotation &rotation)\n"
+		"IParticle_rotate(IParticle self, IRotation rotation) -> IParticle\n"
+		"IParticle * IParticle::rotate(const IRotation &rotation)\n"
 		"\n"
-		"Rotates the particle. \n"
+		"Rotates the particle, and returns this. \n"
 		"\n"
 		""},
 	 { "IParticle_nodeChildren", _wrap_IParticle_nodeChildren, METH_O, "\n"
@@ -69366,11 +69301,6 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "MesoCrystal_swigregister", MesoCrystal_swigregister, METH_O, NULL},
 	 { "MesoCrystal_swiginit", MesoCrystal_swiginit, METH_VARARGS, NULL},
-	 { "Particle_className", _wrap_Particle_className, METH_O, "\n"
-		"Particle_className(Particle self) -> std::string\n"
-		"std::string Particle::className() const override\n"
-		"\n"
-		""},
 	 { "new_Particle", _wrap_new_Particle, METH_VARARGS, "\n"
 		"Particle(Material material, IFormFactor form_factor)\n"
 		"new_Particle(Material material, IFormFactor form_factor, IRotation rotation) -> Particle\n"
@@ -69389,6 +69319,16 @@ static PyMethodDef SwigMethods[] = {
 		"Returns a clone of this  ISampleNode object. \n"
 		"\n"
 		""},
+	 { "Particle_className", _wrap_Particle_className, METH_O, "\n"
+		"Particle_className(Particle self) -> std::string\n"
+		"std::string Particle::className() const override\n"
+		"\n"
+		""},
+	 { "Particle_nodeChildren", _wrap_Particle_nodeChildren, METH_O, "\n"
+		"Particle_nodeChildren(Particle self) -> swig_dummy_type_const_inode_vector\n"
+		"std::vector< const INode * > Particle::nodeChildren() const override\n"
+		"\n"
+		""},
 	 { "Particle_createSlicedParticle", _wrap_Particle_createSlicedParticle, METH_VARARGS, "\n"
 		"Particle_createSlicedParticle(Particle self, ZLimits const & limits) -> SlicedParticle\n"
 		"SlicedParticle Particle::createSlicedParticle(const ZLimits &limits) const override\n"
@@ -69403,11 +69343,6 @@ static PyMethodDef SwigMethods[] = {
 		"Returns nullptr, unless overwritten to return a specific material. \n"
 		"\n"
 		""},
-	 { "Particle_nodeChildren", _wrap_Particle_nodeChildren, METH_O, "\n"
-		"Particle_nodeChildren(Particle self) -> swig_dummy_type_const_inode_vector\n"
-		"std::vector< const INode * > Particle::nodeChildren() const override\n"
-		"\n"
-		""},
 	 { "Particle_formFactor", _wrap_Particle_formFactor, METH_O, "\n"
 		"Particle_formFactor(Particle self) -> IFormFactor\n"
 		"const IFormFactor* Particle::formFactor() const\n"
@@ -69415,15 +69350,9 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "Particle_swigregister", Particle_swigregister, METH_O, NULL},
 	 { "Particle_swiginit", Particle_swiginit, METH_VARARGS, NULL},
-	 { "ParticleComposition_className", _wrap_ParticleComposition_className, METH_O, "\n"
-		"ParticleComposition_className(ParticleComposition self) -> std::string\n"
-		"std::string ParticleComposition::className() const final\n"
-		"\n"
-		""},
-	 { "new_ParticleComposition", _wrap_new_ParticleComposition, METH_VARARGS, "\n"
-		"ParticleComposition()\n"
-		"new_ParticleComposition(IParticle particle, vector_R3 positions) -> ParticleComposition\n"
-		"ParticleComposition::ParticleComposition(const IParticle &particle, std::vector< R3 > positions)\n"
+	 { "new_ParticleComposition", _wrap_new_ParticleComposition, METH_NOARGS, "\n"
+		"new_ParticleComposition() -> ParticleComposition\n"
+		"ParticleComposition::ParticleComposition()\n"
 		"\n"
 		""},
 	 { "delete_ParticleComposition", _wrap_delete_ParticleComposition, METH_O, "\n"
@@ -69438,6 +69367,30 @@ static PyMethodDef SwigMethods[] = {
 		"Returns a clone of this  ISampleNode object. \n"
 		"\n"
 		""},
+	 { "ParticleComposition_className", _wrap_ParticleComposition_className, METH_O, "\n"
+		"ParticleComposition_className(ParticleComposition self) -> std::string\n"
+		"std::string ParticleComposition::className() const final\n"
+		"\n"
+		""},
+	 { "ParticleComposition_nodeChildren", _wrap_ParticleComposition_nodeChildren, METH_O, "\n"
+		"ParticleComposition_nodeChildren(ParticleComposition self) -> swig_dummy_type_const_inode_vector\n"
+		"std::vector< const INode * > ParticleComposition::nodeChildren() const override\n"
+		"\n"
+		""},
+	 { "ParticleComposition_decompose", _wrap_ParticleComposition_decompose, METH_O, "\n"
+		"ParticleComposition_decompose(ParticleComposition self) -> SafePointerVector< IParticle >\n"
+		"SafePointerVector< IParticle > ParticleComposition::decompose() const override\n"
+		"\n"
+		"Decompose in constituent  IParticle objects. \n"
+		"\n"
+		""},
+	 { "ParticleComposition_zSpan", _wrap_ParticleComposition_zSpan, METH_O, "\n"
+		"ParticleComposition_zSpan(ParticleComposition self) -> ZLimits\n"
+		"ZLimits ParticleComposition::zSpan() const override\n"
+		"\n"
+		"Top and bottom z-coordinate. \n"
+		"\n"
+		""},
 	 { "ParticleComposition_createFormFactor", _wrap_ParticleComposition_createFormFactor, METH_O, "\n"
 		"ParticleComposition_createFormFactor(ParticleComposition self) -> IFormFactor\n"
 		"IFormFactor * ParticleComposition::createFormFactor() const override\n"
@@ -69468,25 +69421,6 @@ static PyMethodDef SwigMethods[] = {
 		"std::vector< const IParticle * > ParticleComposition::particles() const\n"
 		"\n"
 		""},
-	 { "ParticleComposition_nodeChildren", _wrap_ParticleComposition_nodeChildren, METH_O, "\n"
-		"ParticleComposition_nodeChildren(ParticleComposition self) -> swig_dummy_type_const_inode_vector\n"
-		"std::vector< const INode * > ParticleComposition::nodeChildren() const override\n"
-		"\n"
-		""},
-	 { "ParticleComposition_decompose", _wrap_ParticleComposition_decompose, METH_O, "\n"
-		"ParticleComposition_decompose(ParticleComposition self) -> SafePointerVector< IParticle >\n"
-		"SafePointerVector< IParticle > ParticleComposition::decompose() const override\n"
-		"\n"
-		"Decompose in constituent  IParticle objects. \n"
-		"\n"
-		""},
-	 { "ParticleComposition_zSpan", _wrap_ParticleComposition_zSpan, METH_O, "\n"
-		"ParticleComposition_zSpan(ParticleComposition self) -> ZLimits\n"
-		"ZLimits ParticleComposition::zSpan() const override\n"
-		"\n"
-		"Top and bottom z-coordinate. \n"
-		"\n"
-		""},
 	 { "ParticleComposition_swigregister", ParticleComposition_swigregister, METH_O, NULL},
 	 { "ParticleComposition_swiginit", ParticleComposition_swiginit, METH_VARARGS, NULL},
 	 { "ParticleCoreShell_className", _wrap_ParticleCoreShell_className, METH_O, "\n"
@@ -76029,7 +75963,6 @@ SWIG_init(void) {
   SWIG_Python_SetConstant(d, "FormFactorWeighted_class_name",SWIG_From_std_string(static_cast< std::string >(FormFactorWeighted::class_name)));
   SWIG_Python_SetConstant(d, "Crystal_class_name",SWIG_From_std_string(static_cast< std::string >(Crystal::class_name)));
   SWIG_Python_SetConstant(d, "MesoCrystal_class_name",SWIG_From_std_string(static_cast< std::string >(MesoCrystal::class_name)));
-  SWIG_Python_SetConstant(d, "ParticleComposition_class_name",SWIG_From_std_string(static_cast< std::string >(ParticleComposition::class_name)));
   SWIG_Python_SetConstant(d, "ParticleCoreShell_class_name",SWIG_From_std_string(static_cast< std::string >(ParticleCoreShell::class_name)));
   SWIG_Python_SetConstant(d, "FTDecayFunction1DCauchy_class_name",SWIG_From_std_string(static_cast< std::string >(FTDecayFunction1DCauchy::class_name)));
   SWIG_Python_SetConstant(d, "FTDecayFunction1DGauss_class_name",SWIG_From_std_string(static_cast< std::string >(FTDecayFunction1DGauss::class_name)));