diff --git a/App/src/TestMesoCrystal1.cpp b/App/src/TestMesoCrystal1.cpp
index dbad4d10ddfe14b992cfb1029784c6e2236491d5..d73652ad635e0aa168661f2b1c63a2e7d1e067ad 100644
--- a/App/src/TestMesoCrystal1.cpp
+++ b/App/src/TestMesoCrystal1.cpp
@@ -68,15 +68,15 @@ void TestMesoCrystal1::initializeSample()
 {
     delete mp_sample;
     // create mesocrystal
-    double meso_width = 1000*Units::nanometer;
+    double meso_radius = 1000*Units::nanometer;
     double surface_filling_ratio = 0.25;
-    double surface_density = surface_filling_ratio/M_PI/meso_width/meso_width;
+    double surface_density = surface_filling_ratio/M_PI/meso_radius/meso_radius;
 //    complex_t n_particle(1.0-1.55e-5, 1.37e-6); // data from Artur
     complex_t n_particle(1.0-2.84e-5, 4.7e-7); // data from http://henke.lbl.gov/optical_constants/getdb2.html
     complex_t avg_n_squared_meso = 0.7886*n_particle*n_particle + 0.2114;
     complex_t n_avg = std::sqrt(surface_filling_ratio*avg_n_squared_meso + 1.0 - surface_filling_ratio);
     complex_t n_particle_adapted = std::sqrt(n_avg*n_avg + n_particle*n_particle - 1.0);
-    FormFactorCylinder ff_cyl(0.5*Units::micrometer, meso_width);
+    FormFactorCylinder ff_cyl(0.5*Units::micrometer, meso_radius);
     double sigma_h = 4*Units::nanometer;
     double sigma_r = 50*Units::nanometer;
     FormFactorDecoratorDebyeWaller ff_meso(ff_cyl.clone(), sigma_h*sigma_h/2.0, sigma_r*sigma_r/2.0);
@@ -135,7 +135,7 @@ void TestMesoCrystal1::initializeSample()
     particle_decoration.addInterferenceFunction(p_interference_funtion);
     LayerDecorator avg_layer_decorator(avg_layer, particle_decoration);
 
-    LayerRoughness roughness(2.0*Units::nanometer, 0.3, 500.0*Units::nanometer);
+    LayerRoughness roughness(1.0*Units::nanometer, 0.3, 500.0*Units::nanometer);
 
     p_multi_layer->addLayer(air_layer);
     p_multi_layer->addLayer(avg_layer_decorator);
diff --git a/Core/Algorithms/inc/DiffuseDWBASimulation.h b/Core/Algorithms/inc/DiffuseDWBASimulation.h
index 07452bcc5e2258fe7a8d5b3b16a0d336a5ee751a..b557cd7f5eb428c07ef0295324f6b004df77ff68 100644
--- a/Core/Algorithms/inc/DiffuseDWBASimulation.h
+++ b/Core/Algorithms/inc/DiffuseDWBASimulation.h
@@ -34,6 +34,14 @@ protected:
     complex_t m_refractive_index;
     double m_surface_density;
     std::vector<DiffuseParticleInfo *> m_np_infos;
+    struct DiffuseFormFactorTerm {
+        ~DiffuseFormFactorTerm();
+        std::vector<IFormFactor *> m_form_factors;
+        std::vector<double> m_probabilities;
+        double m_factor;
+    };
+    void initDiffuseFormFactorTerms(std::vector<DiffuseFormFactorTerm *> &terms,
+            size_t nbr_heights, size_t samples_per_particle);
 };
 
 #endif /* DIFFUSEDWBASIMULATION_H_ */
diff --git a/Core/Algorithms/src/DiffuseDWBASimulation.cpp b/Core/Algorithms/src/DiffuseDWBASimulation.cpp
index 364e5cb890bf10c5a023219e3b433658af2cc343..fcef776c6e740b8aca477c49695274305e09f18f 100644
--- a/Core/Algorithms/src/DiffuseDWBASimulation.cpp
+++ b/Core/Algorithms/src/DiffuseDWBASimulation.cpp
@@ -16,35 +16,12 @@ DiffuseDWBASimulation::~DiffuseDWBASimulation()
 
 void DiffuseDWBASimulation::run()
 {
-//    complex_t k_iz = -mp_kz_function->evaluate(-m_alpha_i);
-    size_t number_of_nps = m_np_infos.size();
-    std::vector<IFormFactor *> form_factors;
-    // collect all particle formfactors and create dwba formfactors for these
-    for (size_t np_index=0; np_index<number_of_nps; ++np_index) {
-        ParticleInfo *p_np_info = m_np_infos[np_index];
-        Particle *p_np = p_np_info->getParticle()->clone();
-        double depth = p_np_info->getDepth();
-
-        p_np->setAmbientRefractiveIndex(m_refractive_index);
-        IFormFactor *ff_particle = p_np->createFormFactor();
-        delete p_np;
-        // TODO: include geometric transformation?
-//        IFormFactor  *ff_transformed(0);
-//        if(transform) {
-//            ff_transformed = new FormFactorDecoratorTransformation(ff_particle, new Geometry::Transform3D(*transform));
-//        } else{
-//            ff_transformed = ff_particle;
-//        }
-
-        FormFactorDWBAConstZ *p_dwba_z = new FormFactorDWBAConstZ(ff_particle, depth);
-        p_dwba_z->setReflectionFunction(*mp_R_function);
-        p_dwba_z->setTransmissionFunction(*mp_T_function);
-
-        form_factors.push_back(p_dwba_z);
-    }
-
+    std::vector<DiffuseFormFactorTerm *> diffuse_terms;
+    size_t nbr_heights = 50;
+    size_t samples_per_particle = 9;
+    initDiffuseFormFactorTerms(diffuse_terms, nbr_heights, samples_per_particle);
     double wavevector_scattering_factor = M_PI/getWaveLength()/getWaveLength();
-//    m_dwba_intensity.resetIndex();
+
     resetIndex();
     while ( hasNext() ) {
         if( (int)m_output_data_mask.currentValue() !=1 ) {
@@ -63,21 +40,22 @@ void DiffuseDWBASimulation::run()
         k_f.setLambdaAlphaPhi(getWaveLength(), alpha_f, phi_f);
         k_f.setZ(mp_kz_function->evaluate(alpha_f));
 
-        complex_t amplitude(0.0, 0.0);
-        double intensity = 0.0;
-        for (size_t i=0; i<form_factors.size(); ++i) {
-            double weight = m_np_infos[i]->getAbundance();
-            complex_t amp = form_factors[i]->evaluate(m_ki, k_f, -m_alpha_i, alpha_f);
-            amplitude += weight*amp;
-            intensity += weight*std::norm(amp);
+        double total_intensity = 0.0;
+        for (size_t i=0; i<diffuse_terms.size(); ++i) {
+            DiffuseFormFactorTerm *p_diffuse_term = diffuse_terms[i];
+            complex_t amplitude(0.0, 0.0);
+            double intensity = 0.0;
+            for (size_t j=0; j<p_diffuse_term->m_form_factors.size(); ++j) {
+                complex_t amp = p_diffuse_term->m_form_factors[j]->evaluate(m_ki, k_f, -m_alpha_i, alpha_f);
+                amplitude += p_diffuse_term->m_probabilities[j]*amp;
+                intensity += p_diffuse_term->m_probabilities[j]*std::norm(amp);
+            }
+            total_intensity += p_diffuse_term->m_factor*(intensity - std::norm(amplitude));
         }
-//        m_dwba_intensity.next() = m_surface_density*wavevector_scattering_factor*wavevector_scattering_factor
-//                *(intensity - std::norm(amplitude));
-        next() = m_surface_density*wavevector_scattering_factor*wavevector_scattering_factor*(intensity - std::norm(amplitude));
+        next() = total_intensity*wavevector_scattering_factor*wavevector_scattering_factor;
     }
 
-    for (size_t i=0; i<form_factors.size(); ++i) delete form_factors[i];
-
+    for (size_t i=0; i<diffuse_terms.size(); ++i) delete diffuse_terms[i];
 }
 
 void DiffuseDWBASimulation::addParticleInfo(DiffuseParticleInfo *p_info)
@@ -92,3 +70,41 @@ void DiffuseDWBASimulation::rescaleAbundances(double factor)
         m_np_infos[np_index]->scaleAbundance(factor);
     }
 }
+
+void DiffuseDWBASimulation::initDiffuseFormFactorTerms(
+        std::vector<DiffuseFormFactorTerm*>& terms, size_t nbr_heights,
+        size_t samples_per_particle)
+{
+    size_t number_of_nps = m_np_infos.size();
+    for (size_t i=0; i<number_of_nps; ++i) {
+        DiffuseParticleInfo *p_diff_info = m_np_infos[i];
+        Particle *p_particle = p_diff_info->getParticle()->clone();
+        double total_particle_density = p_diff_info->getNumberPerMeso();
+        double density_per_height_per_particle = total_particle_density/nbr_heights;
+        for (size_t j=0; j<nbr_heights; ++j) {
+            DiffuseFormFactorTerm *p_diffuse_term = new DiffuseFormFactorTerm;
+            p_diffuse_term->m_factor = density_per_height_per_particle;
+            double depth = p_diff_info->getDepth() - (double)j*p_diff_info->getHeightRange()/(nbr_heights-1.0);
+            std::vector<IFormFactor *> form_factors;
+            p_diff_info->getParticle()->getSimpleFormFactor()->createDistributedFormFactors(
+                    form_factors, p_diffuse_term->m_probabilities, samples_per_particle);
+            for (size_t ff_index=0; ff_index<form_factors.size(); ++ff_index) {
+                p_particle->setSimpleFormFactor(form_factors[ff_index]);
+                IFormFactor *ff_particle = p_particle->createFormFactor();
+                FormFactorDWBAConstZ *p_dwba_z = new FormFactorDWBAConstZ(ff_particle, depth);
+                p_dwba_z->setReflectionFunction(*mp_R_function);
+                p_dwba_z->setTransmissionFunction(*mp_T_function);
+                p_diffuse_term->m_form_factors.push_back(p_dwba_z);
+            }
+            terms.push_back(p_diffuse_term);
+        }
+        delete p_particle;
+    }
+}
+
+DiffuseDWBASimulation::DiffuseFormFactorTerm::~DiffuseFormFactorTerm()
+{
+    for (size_t i=0; i<m_form_factors.size(); ++i) {
+        delete m_form_factors[i];
+    }
+}
diff --git a/Core/FormFactors/inc/FormFactorCylinder.h b/Core/FormFactors/inc/FormFactorCylinder.h
index f35b39a83d5b6e3702aedd267b7d0795570ea7df..a3e294af331c5b0f178b906d0c1da7cdeb78d457 100644
--- a/Core/FormFactors/inc/FormFactorCylinder.h
+++ b/Core/FormFactors/inc/FormFactorCylinder.h
@@ -28,6 +28,8 @@ public:
 
     virtual int getNumberOfStochasticParameters() const { return 2; }
 
+    virtual double getHeight() const { return m_height; }
+
 protected:
     virtual complex_t evaluate_for_q(const cvector_t &q) const;
 
diff --git a/Core/FormFactors/inc/FormFactorFullSphere.h b/Core/FormFactors/inc/FormFactorFullSphere.h
index bfa24d1b1ecba61ffa8ab0184ea0e54b5d1727de..728077a7aba1c66915ac2708cc5eb46d22d06a53 100644
--- a/Core/FormFactors/inc/FormFactorFullSphere.h
+++ b/Core/FormFactors/inc/FormFactorFullSphere.h
@@ -30,6 +30,8 @@ public:
     //! return radius of sphere
     double getRadius() const { return m_radius; }
 
+    virtual double getHeight() const { return 2.0*m_radius; }
+
 protected:
     virtual complex_t evaluate_for_q(const cvector_t &q) const;
 
diff --git a/Core/FormFactors/inc/FormFactorParallelepiped.h b/Core/FormFactors/inc/FormFactorParallelepiped.h
index 83c190db942aec83597882e762c78485cfaad45a..02a83f0b421fdbe597390d6dd0aa9a8b12f47165 100644
--- a/Core/FormFactors/inc/FormFactorParallelepiped.h
+++ b/Core/FormFactors/inc/FormFactorParallelepiped.h
@@ -29,13 +29,12 @@ public:
     //! return radius of parallelepiped
     double getRadius() const { return m_radius; }
 
-    //! return height of parallelepiped
-    double getHeight() const { return m_height; }
-
     virtual double getVolume() const {
         return 4.0*m_height*m_radius*m_radius;
     }
 
+    virtual double getHeight() const { return m_height; }
+
 
 protected:
     virtual complex_t evaluate_for_q(const cvector_t &q) const;
diff --git a/Core/FormFactors/inc/FormFactorPrism3.h b/Core/FormFactors/inc/FormFactorPrism3.h
index 00dbeb1334160a27c2046b81e0c402aa9c5ac801..a6c215cc9e91013df408d9e2719ff077c86a7eb5 100644
--- a/Core/FormFactors/inc/FormFactorPrism3.h
+++ b/Core/FormFactors/inc/FormFactorPrism3.h
@@ -28,6 +28,9 @@ public:
 
     virtual int getNumberOfStochasticParameters() const { return 2; }
 
+    virtual double getHeight() const { return m_height; }
+
+
 protected:
     virtual complex_t evaluate_for_q(const cvector_t &q) const;
 
diff --git a/Core/FormFactors/inc/FormFactorPyramid.h b/Core/FormFactors/inc/FormFactorPyramid.h
index b9777e74af5cbd087903a48b952e250171da1ed5..039f52f38d4e2e9bf33f70a1b4fa683e029ea73b 100644
--- a/Core/FormFactors/inc/FormFactorPyramid.h
+++ b/Core/FormFactors/inc/FormFactorPyramid.h
@@ -36,6 +36,8 @@ public:
 
     virtual int getNumberOfStochasticParameters() const { return 3; }
 
+    virtual double getHeight() const { return m_height; }
+
 protected:
     virtual complex_t evaluate_for_q(const cvector_t &q) const;
 
diff --git a/Core/FormFactors/inc/FormFactorSphereGaussianRadius.h b/Core/FormFactors/inc/FormFactorSphereGaussianRadius.h
index 97f1d5bdb2d208c06ca8f1d7e44d1f34d84640c6..a034d00b61e8110da20fddbea5cfd35f16fd0224 100644
--- a/Core/FormFactors/inc/FormFactorSphereGaussianRadius.h
+++ b/Core/FormFactors/inc/FormFactorSphereGaussianRadius.h
@@ -1,5 +1,6 @@
 #ifndef FORMFACTORSPHEREGAUSSIANRADIUS_H_
 #define FORMFACTORSPHEREGAUSSIANRADIUS_H_
+#include "MathFunctions.h"
 // ********************************************************************
 // * The BornAgain project                                            *
 // * Simulation of neutron and x-ray scattering at grazing incidence  *
@@ -22,6 +23,12 @@ public:
     virtual ~FormFactorSphereGaussianRadius();
 
     virtual int getNumberOfStochasticParameters() const;
+    virtual bool isDistributedFormFactor() const { return true; }
+    virtual void createDistributedFormFactors(std::vector<IFormFactor *> &form_factors,
+             std::vector<double> &probabilities, size_t nbr_samples) const;
+
+    virtual double getHeight() const { return p_ff_sphere->getHeight(); }
+
 protected:
     virtual complex_t evaluate_for_q(const cvector_t &q) const;
 private:
@@ -71,4 +78,24 @@ inline double FormFactorSphereGaussianRadius::calculateMeanR3() const
     return std::pow(m_mean*(m_mean*m_mean+3.0*m_sigma*m_sigma),1.0/3.0);
 }
 
+inline void FormFactorSphereGaussianRadius::createDistributedFormFactors(
+        std::vector<IFormFactor*>& form_factors,
+        std::vector<double>& probabilities, size_t nbr_samples) const
+{
+    double sigma_range = 2.0*m_sigma;
+    double step = 2.0*sigma_range/(nbr_samples-1.0);
+    double radius_start = m_mean-step*(nbr_samples/2);
+    double total_prob = 0.0;
+    for (size_t i=0; i<nbr_samples; ++i) {
+        double radius = radius_start + (double)i*step;
+        double probability = MathFunctions::Gaussian(radius, m_mean, m_sigma);
+        form_factors.push_back(new FormFactorFullSphere(radius));
+        probabilities.push_back(probability);
+        total_prob += probability;
+    }
+    for (size_t i=0; i<probabilities.size(); ++i) {
+        probabilities[i] /= total_prob;
+    }
+}
+
 #endif /* FORMFACTORSPHEREGAUSSIANRADIUS_H_ */
diff --git a/Core/FormFactors/inc/IFormFactor.h b/Core/FormFactors/inc/IFormFactor.h
index ac21c1b09458bb870696d3d657973fca8cdea6af..6a20d1027b3d6415b2aac00bb17ddac086dc987c 100644
--- a/Core/FormFactors/inc/IFormFactor.h
+++ b/Core/FormFactors/inc/IFormFactor.h
@@ -41,6 +41,17 @@ public:
 
     virtual double getVolume() const;
 
+    virtual double getHeight() const;
+
+    virtual bool isDistributedFormFactor() const { return false; }
+
+    virtual void createDistributedFormFactors(std::vector<IFormFactor *> &form_factors,
+            std::vector<double> &probabilities, size_t nbr_samples) const {
+        (void)form_factors;
+        (void)probabilities;
+        (void)nbr_samples;
+    }
+
 };
 
 inline double IFormFactor::getVolume() const
@@ -49,6 +60,12 @@ inline double IFormFactor::getVolume() const
     return std::abs(evaluate(zero, zero, 0.0, 0.0));
 }
 
+inline double IFormFactor::getHeight() const
+{
+    double result = std::pow(getVolume(), 1.0/3.0);
+    return result;
+}
+
 class IFormFactorDecorator : public IFormFactor
 {
 public:
@@ -57,6 +74,9 @@ public:
     virtual IFormFactorDecorator *clone() const=0;
 
     virtual void setAmbientRefractiveIndex(complex_t refractive_index) { if (mp_form_factor) mp_form_factor->setAmbientRefractiveIndex(refractive_index); }
+
+    virtual double getHeight() const { return mp_form_factor->getHeight(); }
+
 protected:
     IFormFactor *mp_form_factor;
 };
diff --git a/Core/PythonAPI/src/PythonInterface_classes_1.cpp b/Core/PythonAPI/src/PythonInterface_classes_1.cpp
index 90c71f278be5b71c469dd3f7bedcd52841151bd3..d50442d622a56326e2d927042677f9d47f10a214 100644
--- a/Core/PythonAPI/src/PythonInterface_classes_1.cpp
+++ b/Core/PythonAPI/src/PythonInterface_classes_1.cpp
@@ -72,7 +72,7 @@ struct ISample_wrapper : ISample, bp::wrapper< ISample > {
         return ISample::clone( );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -80,7 +80,7 @@ struct ISample_wrapper : ISample, bp::wrapper< ISample > {
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -119,7 +119,7 @@ struct ICompositeSample_wrapper : ICompositeSample, bp::wrapper< ICompositeSampl
         return ISample::clone( );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -127,7 +127,7 @@ struct ICompositeSample_wrapper : ICompositeSample, bp::wrapper< ICompositeSampl
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -188,7 +188,7 @@ struct IClusteredParticles_wrapper : IClusteredParticles, bp::wrapper< IClustere
         func_setAmbientRefractiveIndex( refractive_index );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -196,7 +196,7 @@ struct IClusteredParticles_wrapper : IClusteredParticles, bp::wrapper< IClustere
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -278,7 +278,7 @@ struct Crystal_wrapper : Crystal, bp::wrapper< Crystal > {
         Crystal::setAmbientRefractiveIndex( refractive_index );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -286,7 +286,7 @@ struct Crystal_wrapper : Crystal, bp::wrapper< Crystal > {
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -353,11 +353,35 @@ struct IFormFactor_wrapper : IFormFactor, bp::wrapper< IFormFactor > {
         return func_clone(  );
     }
 
+    virtual void createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        if( bp::override func_createDistributedFormFactors = this->get_override( "createDistributedFormFactors" ) )
+            func_createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        else{
+            this->IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        }
+    }
+    
+    void default_createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+    }
+
     virtual ::complex_t evaluate( ::cvector_t const & k_i, ::cvector_t const & k_f, double alpha_i, double alpha_f ) const {
         bp::override func_evaluate = this->get_override( "evaluate" );
         return func_evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
     }
 
+    virtual double getHeight(  ) const  {
+        if( bp::override func_getHeight = this->get_override( "getHeight" ) )
+            return func_getHeight(  );
+        else{
+            return this->IFormFactor::getHeight(  );
+        }
+    }
+    
+    double default_getHeight(  ) const  {
+        return IFormFactor::getHeight( );
+    }
+
     virtual int getNumberOfStochasticParameters(  ) const  {
         if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
             return func_getNumberOfStochasticParameters(  );
@@ -382,6 +406,18 @@ struct IFormFactor_wrapper : IFormFactor, bp::wrapper< IFormFactor > {
         return IFormFactor::getVolume( );
     }
 
+    virtual bool isDistributedFormFactor(  ) const  {
+        if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
+            return func_isDistributedFormFactor(  );
+        else{
+            return this->IFormFactor::isDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_isDistributedFormFactor(  ) const  {
+        return IFormFactor::isDistributedFormFactor( );
+    }
+
     virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
             func_setAmbientRefractiveIndex( refractive_index );
@@ -394,7 +430,7 @@ struct IFormFactor_wrapper : IFormFactor, bp::wrapper< IFormFactor > {
         IFormFactor::setAmbientRefractiveIndex( refractive_index );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -402,7 +438,7 @@ struct IFormFactor_wrapper : IFormFactor, bp::wrapper< IFormFactor > {
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -451,7 +487,19 @@ struct IFormFactorBorn_wrapper : IFormFactorBorn, bp::wrapper< IFormFactorBorn >
         return func_evaluate_for_q( boost::ref(q) );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual void createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        if( bp::override func_createDistributedFormFactors = this->get_override( "createDistributedFormFactors" ) )
+            func_createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        else{
+            this->IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        }
+    }
+    
+    void default_createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+    }
+
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -459,10 +507,22 @@ struct IFormFactorBorn_wrapper : IFormFactorBorn, bp::wrapper< IFormFactorBorn >
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
+    virtual double getHeight(  ) const  {
+        if( bp::override func_getHeight = this->get_override( "getHeight" ) )
+            return func_getHeight(  );
+        else{
+            return this->IFormFactor::getHeight(  );
+        }
+    }
+    
+    double default_getHeight(  ) const  {
+        return IFormFactor::getHeight( );
+    }
+
     virtual int getNumberOfStochasticParameters(  ) const  {
         if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
             return func_getNumberOfStochasticParameters(  );
@@ -487,6 +547,18 @@ struct IFormFactorBorn_wrapper : IFormFactorBorn, bp::wrapper< IFormFactorBorn >
         return IFormFactor::getVolume( );
     }
 
+    virtual bool isDistributedFormFactor(  ) const  {
+        if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
+            return func_isDistributedFormFactor(  );
+        else{
+            return this->IFormFactor::isDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_isDistributedFormFactor(  ) const  {
+        return IFormFactor::isDistributedFormFactor( );
+    }
+
     virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
             func_setAmbientRefractiveIndex( refractive_index );
@@ -546,7 +618,19 @@ struct FormFactorCrystal_wrapper : FormFactorCrystal, bp::wrapper< FormFactorCry
         FormFactorCrystal::setAmbientRefractiveIndex( refractive_index );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual void createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        if( bp::override func_createDistributedFormFactors = this->get_override( "createDistributedFormFactors" ) )
+            func_createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        else{
+            this->IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        }
+    }
+    
+    void default_createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+    }
+
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -554,7 +638,7 @@ struct FormFactorCrystal_wrapper : FormFactorCrystal, bp::wrapper< FormFactorCry
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -570,6 +654,18 @@ struct FormFactorCrystal_wrapper : FormFactorCrystal, bp::wrapper< FormFactorCry
         return IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
     }
 
+    virtual double getHeight(  ) const  {
+        if( bp::override func_getHeight = this->get_override( "getHeight" ) )
+            return func_getHeight(  );
+        else{
+            return this->IFormFactor::getHeight(  );
+        }
+    }
+    
+    double default_getHeight(  ) const  {
+        return IFormFactor::getHeight( );
+    }
+
     virtual int getNumberOfStochasticParameters(  ) const  {
         if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
             return func_getNumberOfStochasticParameters(  );
@@ -594,6 +690,18 @@ struct FormFactorCrystal_wrapper : FormFactorCrystal, bp::wrapper< FormFactorCry
         return IFormFactor::getVolume( );
     }
 
+    virtual bool isDistributedFormFactor(  ) const  {
+        if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
+            return func_isDistributedFormFactor(  );
+        else{
+            return this->IFormFactor::isDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_isDistributedFormFactor(  ) const  {
+        return IFormFactor::isDistributedFormFactor( );
+    }
+
     virtual void walk_and_print(  ) {
         if( bp::override func_walk_and_print = this->get_override( "walk_and_print" ) )
             func_walk_and_print(  );
@@ -629,7 +737,19 @@ struct FormFactorCylinder_wrapper : FormFactorCylinder, bp::wrapper< FormFactorC
         return FormFactorCylinder::clone( );
     }
 
-    virtual int getNumberOfStochasticParameters(  ) {
+    virtual double getHeight(  ) const  {
+        if( bp::override func_getHeight = this->get_override( "getHeight" ) )
+            return func_getHeight(  );
+        else{
+            return this->FormFactorCylinder::getHeight(  );
+        }
+    }
+    
+    double default_getHeight(  ) const  {
+        return FormFactorCylinder::getHeight( );
+    }
+
+    virtual int getNumberOfStochasticParameters(  ) const  {
         if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
             return func_getNumberOfStochasticParameters(  );
         else{
@@ -637,11 +757,23 @@ struct FormFactorCylinder_wrapper : FormFactorCylinder, bp::wrapper< FormFactorC
         }
     }
     
-    int default_getNumberOfStochasticParameters(  ) {
+    int default_getNumberOfStochasticParameters(  ) const  {
         return FormFactorCylinder::getNumberOfStochasticParameters( );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual void createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        if( bp::override func_createDistributedFormFactors = this->get_override( "createDistributedFormFactors" ) )
+            func_createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        else{
+            this->IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        }
+    }
+    
+    void default_createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+    }
+
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -649,7 +781,7 @@ struct FormFactorCylinder_wrapper : FormFactorCylinder, bp::wrapper< FormFactorC
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -665,18 +797,6 @@ struct FormFactorCylinder_wrapper : FormFactorCylinder, bp::wrapper< FormFactorC
         return IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
     }
 
-    virtual int getNumberOfStochasticParameters(  ) const  {
-        if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
-            return func_getNumberOfStochasticParameters(  );
-        else{
-            return this->IFormFactor::getNumberOfStochasticParameters(  );
-        }
-    }
-    
-    int default_getNumberOfStochasticParameters(  ) const  {
-        return IFormFactor::getNumberOfStochasticParameters( );
-    }
-
     virtual double getVolume(  ) const  {
         if( bp::override func_getVolume = this->get_override( "getVolume" ) )
             return func_getVolume(  );
@@ -689,6 +809,18 @@ struct FormFactorCylinder_wrapper : FormFactorCylinder, bp::wrapper< FormFactorC
         return IFormFactor::getVolume( );
     }
 
+    virtual bool isDistributedFormFactor(  ) const  {
+        if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
+            return func_isDistributedFormFactor(  );
+        else{
+            return this->IFormFactor::isDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_isDistributedFormFactor(  ) const  {
+        return IFormFactor::isDistributedFormFactor( );
+    }
+
     virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
             func_setAmbientRefractiveIndex( refractive_index );
@@ -743,7 +875,19 @@ struct FormFactorFullSphere_wrapper : FormFactorFullSphere, bp::wrapper< FormFac
         return FormFactorFullSphere::clone( );
     }
 
-    virtual int getNumberOfStochasticParameters(  ) {
+    virtual double getHeight(  ) const  {
+        if( bp::override func_getHeight = this->get_override( "getHeight" ) )
+            return func_getHeight(  );
+        else{
+            return this->FormFactorFullSphere::getHeight(  );
+        }
+    }
+    
+    double default_getHeight(  ) const  {
+        return FormFactorFullSphere::getHeight( );
+    }
+
+    virtual int getNumberOfStochasticParameters(  ) const  {
         if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
             return func_getNumberOfStochasticParameters(  );
         else{
@@ -751,11 +895,23 @@ struct FormFactorFullSphere_wrapper : FormFactorFullSphere, bp::wrapper< FormFac
         }
     }
     
-    int default_getNumberOfStochasticParameters(  ) {
+    int default_getNumberOfStochasticParameters(  ) const  {
         return FormFactorFullSphere::getNumberOfStochasticParameters( );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual void createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        if( bp::override func_createDistributedFormFactors = this->get_override( "createDistributedFormFactors" ) )
+            func_createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        else{
+            this->IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        }
+    }
+    
+    void default_createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+    }
+
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -763,7 +919,7 @@ struct FormFactorFullSphere_wrapper : FormFactorFullSphere, bp::wrapper< FormFac
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -779,18 +935,6 @@ struct FormFactorFullSphere_wrapper : FormFactorFullSphere, bp::wrapper< FormFac
         return IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
     }
 
-    virtual int getNumberOfStochasticParameters(  ) const  {
-        if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
-            return func_getNumberOfStochasticParameters(  );
-        else{
-            return this->IFormFactor::getNumberOfStochasticParameters(  );
-        }
-    }
-    
-    int default_getNumberOfStochasticParameters(  ) const  {
-        return IFormFactor::getNumberOfStochasticParameters( );
-    }
-
     virtual double getVolume(  ) const  {
         if( bp::override func_getVolume = this->get_override( "getVolume" ) )
             return func_getVolume(  );
@@ -803,6 +947,18 @@ struct FormFactorFullSphere_wrapper : FormFactorFullSphere, bp::wrapper< FormFac
         return IFormFactor::getVolume( );
     }
 
+    virtual bool isDistributedFormFactor(  ) const  {
+        if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
+            return func_isDistributedFormFactor(  );
+        else{
+            return this->IFormFactor::isDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_isDistributedFormFactor(  ) const  {
+        return IFormFactor::isDistributedFormFactor( );
+    }
+
     virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
             func_setAmbientRefractiveIndex( refractive_index );
@@ -857,7 +1013,7 @@ struct FormFactorGauss_wrapper : FormFactorGauss, bp::wrapper< FormFactorGauss >
         return FormFactorGauss::clone( );
     }
 
-    virtual int getNumberOfStochasticParameters(  ) {
+    virtual int getNumberOfStochasticParameters(  ) const  {
         if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
             return func_getNumberOfStochasticParameters(  );
         else{
@@ -865,11 +1021,23 @@ struct FormFactorGauss_wrapper : FormFactorGauss, bp::wrapper< FormFactorGauss >
         }
     }
     
-    int default_getNumberOfStochasticParameters(  ) {
+    int default_getNumberOfStochasticParameters(  ) const  {
         return FormFactorGauss::getNumberOfStochasticParameters( );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual void createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        if( bp::override func_createDistributedFormFactors = this->get_override( "createDistributedFormFactors" ) )
+            func_createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        else{
+            this->IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        }
+    }
+    
+    void default_createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+    }
+
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -877,7 +1045,7 @@ struct FormFactorGauss_wrapper : FormFactorGauss, bp::wrapper< FormFactorGauss >
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -893,16 +1061,16 @@ struct FormFactorGauss_wrapper : FormFactorGauss, bp::wrapper< FormFactorGauss >
         return IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
     }
 
-    virtual int getNumberOfStochasticParameters(  ) const  {
-        if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
-            return func_getNumberOfStochasticParameters(  );
+    virtual double getHeight(  ) const  {
+        if( bp::override func_getHeight = this->get_override( "getHeight" ) )
+            return func_getHeight(  );
         else{
-            return this->IFormFactor::getNumberOfStochasticParameters(  );
+            return this->IFormFactor::getHeight(  );
         }
     }
     
-    int default_getNumberOfStochasticParameters(  ) const  {
-        return IFormFactor::getNumberOfStochasticParameters( );
+    double default_getHeight(  ) const  {
+        return IFormFactor::getHeight( );
     }
 
     virtual double getVolume(  ) const  {
@@ -917,6 +1085,18 @@ struct FormFactorGauss_wrapper : FormFactorGauss, bp::wrapper< FormFactorGauss >
         return IFormFactor::getVolume( );
     }
 
+    virtual bool isDistributedFormFactor(  ) const  {
+        if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
+            return func_isDistributedFormFactor(  );
+        else{
+            return this->IFormFactor::isDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_isDistributedFormFactor(  ) const  {
+        return IFormFactor::isDistributedFormFactor( );
+    }
+
     virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
             func_setAmbientRefractiveIndex( refractive_index );
@@ -971,7 +1151,7 @@ struct FormFactorLorentz_wrapper : FormFactorLorentz, bp::wrapper< FormFactorLor
         return FormFactorLorentz::clone( );
     }
 
-    virtual int getNumberOfStochasticParameters(  ) {
+    virtual int getNumberOfStochasticParameters(  ) const  {
         if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
             return func_getNumberOfStochasticParameters(  );
         else{
@@ -979,11 +1159,23 @@ struct FormFactorLorentz_wrapper : FormFactorLorentz, bp::wrapper< FormFactorLor
         }
     }
     
-    int default_getNumberOfStochasticParameters(  ) {
+    int default_getNumberOfStochasticParameters(  ) const  {
         return FormFactorLorentz::getNumberOfStochasticParameters( );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual void createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        if( bp::override func_createDistributedFormFactors = this->get_override( "createDistributedFormFactors" ) )
+            func_createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        else{
+            this->IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        }
+    }
+    
+    void default_createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+    }
+
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -991,7 +1183,7 @@ struct FormFactorLorentz_wrapper : FormFactorLorentz, bp::wrapper< FormFactorLor
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -1007,16 +1199,16 @@ struct FormFactorLorentz_wrapper : FormFactorLorentz, bp::wrapper< FormFactorLor
         return IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
     }
 
-    virtual int getNumberOfStochasticParameters(  ) const  {
-        if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
-            return func_getNumberOfStochasticParameters(  );
+    virtual double getHeight(  ) const  {
+        if( bp::override func_getHeight = this->get_override( "getHeight" ) )
+            return func_getHeight(  );
         else{
-            return this->IFormFactor::getNumberOfStochasticParameters(  );
+            return this->IFormFactor::getHeight(  );
         }
     }
     
-    int default_getNumberOfStochasticParameters(  ) const  {
-        return IFormFactor::getNumberOfStochasticParameters( );
+    double default_getHeight(  ) const  {
+        return IFormFactor::getHeight( );
     }
 
     virtual double getVolume(  ) const  {
@@ -1031,6 +1223,18 @@ struct FormFactorLorentz_wrapper : FormFactorLorentz, bp::wrapper< FormFactorLor
         return IFormFactor::getVolume( );
     }
 
+    virtual bool isDistributedFormFactor(  ) const  {
+        if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
+            return func_isDistributedFormFactor(  );
+        else{
+            return this->IFormFactor::isDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_isDistributedFormFactor(  ) const  {
+        return IFormFactor::isDistributedFormFactor( );
+    }
+
     virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
             func_setAmbientRefractiveIndex( refractive_index );
@@ -1078,126 +1282,43 @@ struct FormFactorPrism3_wrapper : FormFactorPrism3, bp::wrapper< FormFactorPrism
         return FormFactorPrism3::clone( );
     }
 
-    virtual int getNumberOfStochasticParameters(  ) {
-        if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
-            return func_getNumberOfStochasticParameters(  );
-        else{
-            return this->FormFactorPrism3::getNumberOfStochasticParameters(  );
-        }
-    }
-    
-    int default_getNumberOfStochasticParameters(  ) {
-        return FormFactorPrism3::getNumberOfStochasticParameters( );
-    }
-
-    virtual ::ParameterPool * createParameterTree(  ) {
-        if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
-            return func_createParameterTree(  );
+    virtual double getHeight(  ) const  {
+        if( bp::override func_getHeight = this->get_override( "getHeight" ) )
+            return func_getHeight(  );
         else{
-            return this->ISample::createParameterTree(  );
+            return this->FormFactorPrism3::getHeight(  );
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
-        return ISample::createParameterTree( );
-    }
-
-    virtual ::complex_t evaluate( ::cvector_t const & k_i, ::cvector_t const & k_f, double alpha_i, double alpha_f ) const  {
-        if( bp::override func_evaluate = this->get_override( "evaluate" ) )
-            return func_evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
-        else{
-            return this->IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
-        }
-    }
-    
-    ::complex_t default_evaluate( ::cvector_t const & k_i, ::cvector_t const & k_f, double alpha_i, double alpha_f ) const  {
-        return IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
+    double default_getHeight(  ) const  {
+        return FormFactorPrism3::getHeight( );
     }
 
     virtual int getNumberOfStochasticParameters(  ) const  {
         if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
             return func_getNumberOfStochasticParameters(  );
         else{
-            return this->IFormFactor::getNumberOfStochasticParameters(  );
+            return this->FormFactorPrism3::getNumberOfStochasticParameters(  );
         }
     }
     
     int default_getNumberOfStochasticParameters(  ) const  {
-        return IFormFactor::getNumberOfStochasticParameters( );
-    }
-
-    virtual double getVolume(  ) const  {
-        if( bp::override func_getVolume = this->get_override( "getVolume" ) )
-            return func_getVolume(  );
-        else{
-            return this->IFormFactor::getVolume(  );
-        }
-    }
-    
-    double default_getVolume(  ) const  {
-        return IFormFactor::getVolume( );
-    }
-
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
-        else{
-            this->IFormFactor::setAmbientRefractiveIndex( refractive_index );
-        }
-    }
-    
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        IFormFactor::setAmbientRefractiveIndex( refractive_index );
-    }
-
-    virtual void walk_and_print(  ) {
-        if( bp::override func_walk_and_print = this->get_override( "walk_and_print" ) )
-            func_walk_and_print(  );
-        else{
-            this->ISample::walk_and_print(  );
-        }
-    }
-    
-    void default_walk_and_print(  ) {
-        ISample::walk_and_print( );
-    }
-
-};
-
-struct FormFactorPyramid_wrapper : FormFactorPyramid, bp::wrapper< FormFactorPyramid > {
-
-    FormFactorPyramid_wrapper(double height, double half_side, double alpha )
-    : FormFactorPyramid( height, half_side, alpha )
-      , bp::wrapper< FormFactorPyramid >(){
-        // constructor
-    
-    }
-
-    virtual ::FormFactorPyramid * clone(  ) const  {
-        if( bp::override func_clone = this->get_override( "clone" ) )
-            return func_clone(  );
-        else{
-            return this->FormFactorPyramid::clone(  );
-        }
-    }
-    
-    ::FormFactorPyramid * default_clone(  ) const  {
-        return FormFactorPyramid::clone( );
+        return FormFactorPrism3::getNumberOfStochasticParameters( );
     }
 
-    virtual int getNumberOfStochasticParameters(  ) {
-        if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
-            return func_getNumberOfStochasticParameters(  );
+    virtual void createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        if( bp::override func_createDistributedFormFactors = this->get_override( "createDistributedFormFactors" ) )
+            func_createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
         else{
-            return this->FormFactorPyramid::getNumberOfStochasticParameters(  );
+            this->IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
         }
     }
     
-    int default_getNumberOfStochasticParameters(  ) {
-        return FormFactorPyramid::getNumberOfStochasticParameters( );
+    void default_createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -1205,7 +1326,7 @@ struct FormFactorPyramid_wrapper : FormFactorPyramid, bp::wrapper< FormFactorPyr
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -1221,18 +1342,6 @@ struct FormFactorPyramid_wrapper : FormFactorPyramid, bp::wrapper< FormFactorPyr
         return IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
     }
 
-    virtual int getNumberOfStochasticParameters(  ) const  {
-        if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
-            return func_getNumberOfStochasticParameters(  );
-        else{
-            return this->IFormFactor::getNumberOfStochasticParameters(  );
-        }
-    }
-    
-    int default_getNumberOfStochasticParameters(  ) const  {
-        return IFormFactor::getNumberOfStochasticParameters( );
-    }
-
     virtual double getVolume(  ) const  {
         if( bp::override func_getVolume = this->get_override( "getVolume" ) )
             return func_getVolume(  );
@@ -1245,6 +1354,18 @@ struct FormFactorPyramid_wrapper : FormFactorPyramid, bp::wrapper< FormFactorPyr
         return IFormFactor::getVolume( );
     }
 
+    virtual bool isDistributedFormFactor(  ) const  {
+        if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
+            return func_isDistributedFormFactor(  );
+        else{
+            return this->IFormFactor::isDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_isDistributedFormFactor(  ) const  {
+        return IFormFactor::isDistributedFormFactor( );
+    }
+
     virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
             func_setAmbientRefractiveIndex( refractive_index );
@@ -1271,43 +1392,22 @@ struct FormFactorPyramid_wrapper : FormFactorPyramid, bp::wrapper< FormFactorPyr
 
 };
 
-struct GISASExperiment_wrapper : GISASExperiment, bp::wrapper< GISASExperiment > {
+void register_classes_1(){
 
-    GISASExperiment_wrapper( )
-    : GISASExperiment( )
-      , bp::wrapper< GISASExperiment >(){
-        // null constructor
-    
+    { //::std::vector< double >
+        typedef bp::class_< std::vector< double > > vdouble1d_t_exposer_t;
+        vdouble1d_t_exposer_t vdouble1d_t_exposer = vdouble1d_t_exposer_t( "vdouble1d_t" );
+        bp::scope vdouble1d_t_scope( vdouble1d_t_exposer );
+        vdouble1d_t_exposer.def( bp::vector_indexing_suite< ::std::vector< double >, true >() );
     }
 
-    virtual void normalize(  ) {
-        if( bp::override func_normalize = this->get_override( "normalize" ) )
-            func_normalize(  );
-        else{
-            this->GISASExperiment::normalize(  );
-        }
-    }
-    
-    void default_normalize(  ) {
-        GISASExperiment::normalize( );
-    }
-
-    virtual void runSimulation(  ) {
-        if( bp::override func_runSimulation = this->get_override( "runSimulation" ) )
-            func_runSimulation(  );
-        else{
-            this->GISASExperiment::runSimulation(  );
-        }
-    }
-    
-    void default_runSimulation(  ) {
-        GISASExperiment::runSimulation( );
+    { //::std::vector< ParticleInfo* >
+        typedef bp::class_< std::vector< ParticleInfo* > > vector_less__ParticleInfo_ptr___greater__exposer_t;
+        vector_less__ParticleInfo_ptr___greater__exposer_t vector_less__ParticleInfo_ptr___greater__exposer = vector_less__ParticleInfo_ptr___greater__exposer_t( "vector_less__ParticleInfo_ptr___greater_" );
+        bp::scope vector_less__ParticleInfo_ptr___greater__scope( vector_less__ParticleInfo_ptr___greater__exposer );
+        vector_less__ParticleInfo_ptr___greater__exposer.def( bp::vector_indexing_suite< ::std::vector< ParticleInfo* > >() );
     }
 
-};
-
-void register_classes_1(){
-
     { //::std::vector< OpticalFresnel::FresnelCoeff >
         typedef bp::class_< std::vector< OpticalFresnel::FresnelCoeff > > MultiLayerCoeff_t_exposer_t;
         MultiLayerCoeff_t_exposer_t MultiLayerCoeff_t_exposer = MultiLayerCoeff_t_exposer_t( "MultiLayerCoeff_t" );
@@ -1315,6 +1415,13 @@ void register_classes_1(){
         MultiLayerCoeff_t_exposer.def( bp::vector_indexing_suite< ::std::vector< OpticalFresnel::FresnelCoeff > >() );
     }
 
+    { //::std::vector< IFormFactor* >
+        typedef bp::class_< std::vector< IFormFactor* > > vector_less__IFormFactor_ptr___greater__exposer_t;
+        vector_less__IFormFactor_ptr___greater__exposer_t vector_less__IFormFactor_ptr___greater__exposer = vector_less__IFormFactor_ptr___greater__exposer_t( "vector_less__IFormFactor_ptr___greater_" );
+        bp::scope vector_less__IFormFactor_ptr___greater__scope( vector_less__IFormFactor_ptr___greater__exposer );
+        vector_less__IFormFactor_ptr___greater__exposer.def( bp::vector_indexing_suite< ::std::vector< IFormFactor* > >() );
+    }
+
     { //::std::vector< Geometry::BasicVector3D<double> >
         typedef bp::class_< std::vector< Geometry::BasicVector3D<double> > > vector_kvector_t_exposer_t;
         vector_kvector_t_exposer_t vector_kvector_t_exposer = vector_kvector_t_exposer_t( "vector_kvector_t" );
@@ -1349,8 +1456,8 @@ void register_classes_1(){
         }
         { //::ISample::createParameterTree
         
-            typedef ::ParameterPool * ( ::ISample::*createParameterTree_function_type )(  ) ;
-            typedef ::ParameterPool * ( ISample_wrapper::*default_createParameterTree_function_type )(  ) ;
+            typedef ::ParameterPool * ( ::ISample::*createParameterTree_function_type )(  ) const;
+            typedef ::ParameterPool * ( ISample_wrapper::*default_createParameterTree_function_type )(  ) const;
             
             ISample_exposer.def( 
                 "createParameterTree"
@@ -1392,8 +1499,8 @@ void register_classes_1(){
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( ICompositeSample_wrapper::* )(  ) )(&ICompositeSample_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( ICompositeSample_wrapper::* )(  ) const)(&ICompositeSample_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "walk_and_print"
@@ -1423,8 +1530,8 @@ void register_classes_1(){
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( IClusteredParticles_wrapper::* )(  ) )(&IClusteredParticles_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( IClusteredParticles_wrapper::* )(  ) const)(&IClusteredParticles_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "walk_and_print"
@@ -1471,8 +1578,8 @@ void register_classes_1(){
             , ( bp::arg("dw_factor") ) )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( Crystal_wrapper::* )(  ) )(&Crystal_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( Crystal_wrapper::* )(  ) const)(&Crystal_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "walk_and_print"
@@ -1506,10 +1613,20 @@ void register_classes_1(){
             "clone"
             , bp::pure_virtual( (::IFormFactor * ( ::IFormFactor::* )(  ) const)(&::IFormFactor::clone) )
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "createDistributedFormFactors"
+            , (void ( ::IFormFactor::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&::IFormFactor::createDistributedFormFactors)
+            , (void ( IFormFactor_wrapper::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&IFormFactor_wrapper::default_createDistributedFormFactors)
+            , ( bp::arg("form_factors"), bp::arg("probabilities"), bp::arg("nbr_samples") )
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "evaluate"
             , bp::pure_virtual( (::complex_t ( ::IFormFactor::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&::IFormFactor::evaluate) )
             , ( bp::arg("k_i"), bp::arg("k_f"), bp::arg("alpha_i"), bp::arg("alpha_f") ) )    
+        .def( 
+            "getHeight"
+            , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getHeight)
+            , (double ( IFormFactor_wrapper::* )(  ) const)(&IFormFactor_wrapper::default_getHeight) )    
         .def( 
             "getNumberOfStochasticParameters"
             , (int ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getNumberOfStochasticParameters)
@@ -1518,6 +1635,10 @@ void register_classes_1(){
             "getVolume"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getVolume)
             , (double ( IFormFactor_wrapper::* )(  ) const)(&IFormFactor_wrapper::default_getVolume) )    
+        .def( 
+            "isDistributedFormFactor"
+            , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
+            , (bool ( IFormFactor_wrapper::* )(  ) const)(&IFormFactor_wrapper::default_isDistributedFormFactor) )    
         .def( 
             "setAmbientRefractiveIndex"
             , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
@@ -1525,8 +1646,8 @@ void register_classes_1(){
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( IFormFactor_wrapper::* )(  ) )(&IFormFactor_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( IFormFactor_wrapper::* )(  ) const)(&IFormFactor_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "walk_and_print"
@@ -1547,11 +1668,21 @@ void register_classes_1(){
             "evaluate_for_q"
             , (::complex_t ( IFormFactorBorn_wrapper::* )( ::cvector_t const & ) const)(&IFormFactorBorn_wrapper::evaluate_for_q)
             , ( bp::arg("q") ) )    
+        .def( 
+            "createDistributedFormFactors"
+            , (void ( ::IFormFactor::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&::IFormFactor::createDistributedFormFactors)
+            , (void ( IFormFactorBorn_wrapper::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&IFormFactorBorn_wrapper::default_createDistributedFormFactors)
+            , ( bp::arg("form_factors"), bp::arg("probabilities"), bp::arg("nbr_samples") )
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( IFormFactorBorn_wrapper::* )(  ) )(&IFormFactorBorn_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( IFormFactorBorn_wrapper::* )(  ) const)(&IFormFactorBorn_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getHeight"
+            , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getHeight)
+            , (double ( IFormFactorBorn_wrapper::* )(  ) const)(&IFormFactorBorn_wrapper::default_getHeight) )    
         .def( 
             "getNumberOfStochasticParameters"
             , (int ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getNumberOfStochasticParameters)
@@ -1560,6 +1691,10 @@ void register_classes_1(){
             "getVolume"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getVolume)
             , (double ( IFormFactorBorn_wrapper::* )(  ) const)(&IFormFactorBorn_wrapper::default_getVolume) )    
+        .def( 
+            "isDistributedFormFactor"
+            , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
+            , (bool ( IFormFactorBorn_wrapper::* )(  ) const)(&IFormFactorBorn_wrapper::default_isDistributedFormFactor) )    
         .def( 
             "setAmbientRefractiveIndex"
             , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
@@ -1581,16 +1716,26 @@ void register_classes_1(){
             , (void ( ::FormFactorCrystal::* )( ::complex_t ) )(&::FormFactorCrystal::setAmbientRefractiveIndex)
             , (void ( FormFactorCrystal_wrapper::* )( ::complex_t ) )(&FormFactorCrystal_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
+        .def( 
+            "createDistributedFormFactors"
+            , (void ( ::IFormFactor::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&::IFormFactor::createDistributedFormFactors)
+            , (void ( FormFactorCrystal_wrapper::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&FormFactorCrystal_wrapper::default_createDistributedFormFactors)
+            , ( bp::arg("form_factors"), bp::arg("probabilities"), bp::arg("nbr_samples") )
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( FormFactorCrystal_wrapper::* )(  ) )(&FormFactorCrystal_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( FormFactorCrystal_wrapper::* )(  ) const)(&FormFactorCrystal_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "evaluate"
             , (::complex_t ( ::IFormFactorBorn::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&::IFormFactorBorn::evaluate)
             , (::complex_t ( FormFactorCrystal_wrapper::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&FormFactorCrystal_wrapper::default_evaluate)
             , ( bp::arg("k_i"), bp::arg("k_f"), bp::arg("alpha_i"), bp::arg("alpha_f") ) )    
+        .def( 
+            "getHeight"
+            , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getHeight)
+            , (double ( FormFactorCrystal_wrapper::* )(  ) const)(&FormFactorCrystal_wrapper::default_getHeight) )    
         .def( 
             "getNumberOfStochasticParameters"
             , (int ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getNumberOfStochasticParameters)
@@ -1599,6 +1744,10 @@ void register_classes_1(){
             "getVolume"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getVolume)
             , (double ( FormFactorCrystal_wrapper::* )(  ) const)(&FormFactorCrystal_wrapper::default_getVolume) )    
+        .def( 
+            "isDistributedFormFactor"
+            , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
+            , (bool ( FormFactorCrystal_wrapper::* )(  ) const)(&FormFactorCrystal_wrapper::default_isDistributedFormFactor) )    
         .def( 
             "walk_and_print"
             , (void ( ::ISample::* )(  ) )(&::ISample::walk_and_print)
@@ -1610,28 +1759,38 @@ void register_classes_1(){
             , (::FormFactorCylinder * ( ::FormFactorCylinder::* )(  ) const)(&::FormFactorCylinder::clone)
             , (::FormFactorCylinder * ( FormFactorCylinder_wrapper::* )(  ) const)(&FormFactorCylinder_wrapper::default_clone)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getHeight"
+            , (double ( ::FormFactorCylinder::* )(  ) const)(&::FormFactorCylinder::getHeight)
+            , (double ( FormFactorCylinder_wrapper::* )(  ) const)(&FormFactorCylinder_wrapper::default_getHeight) )    
         .def( 
             "getNumberOfStochasticParameters"
-            , (int ( ::FormFactorCylinder::* )(  ) )(&::FormFactorCylinder::getNumberOfStochasticParameters)
-            , (int ( FormFactorCylinder_wrapper::* )(  ) )(&FormFactorCylinder_wrapper::default_getNumberOfStochasticParameters) )    
+            , (int ( ::FormFactorCylinder::* )(  ) const)(&::FormFactorCylinder::getNumberOfStochasticParameters)
+            , (int ( FormFactorCylinder_wrapper::* )(  ) const)(&FormFactorCylinder_wrapper::default_getNumberOfStochasticParameters) )    
+        .def( 
+            "createDistributedFormFactors"
+            , (void ( ::IFormFactor::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&::IFormFactor::createDistributedFormFactors)
+            , (void ( FormFactorCylinder_wrapper::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&FormFactorCylinder_wrapper::default_createDistributedFormFactors)
+            , ( bp::arg("form_factors"), bp::arg("probabilities"), bp::arg("nbr_samples") )
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( FormFactorCylinder_wrapper::* )(  ) )(&FormFactorCylinder_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( FormFactorCylinder_wrapper::* )(  ) const)(&FormFactorCylinder_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "evaluate"
             , (::complex_t ( ::IFormFactorBorn::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&::IFormFactorBorn::evaluate)
             , (::complex_t ( FormFactorCylinder_wrapper::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&FormFactorCylinder_wrapper::default_evaluate)
             , ( bp::arg("k_i"), bp::arg("k_f"), bp::arg("alpha_i"), bp::arg("alpha_f") ) )    
-        .def( 
-            "getNumberOfStochasticParameters"
-            , (int ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getNumberOfStochasticParameters)
-            , (int ( FormFactorCylinder_wrapper::* )(  ) const)(&FormFactorCylinder_wrapper::default_getNumberOfStochasticParameters) )    
         .def( 
             "getVolume"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getVolume)
             , (double ( FormFactorCylinder_wrapper::* )(  ) const)(&FormFactorCylinder_wrapper::default_getVolume) )    
+        .def( 
+            "isDistributedFormFactor"
+            , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
+            , (bool ( FormFactorCylinder_wrapper::* )(  ) const)(&FormFactorCylinder_wrapper::default_isDistributedFormFactor) )    
         .def( 
             "setAmbientRefractiveIndex"
             , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
@@ -1648,31 +1807,41 @@ void register_classes_1(){
             , (::FormFactorFullSphere * ( ::FormFactorFullSphere::* )(  ) const)(&::FormFactorFullSphere::clone)
             , (::FormFactorFullSphere * ( FormFactorFullSphere_wrapper::* )(  ) const)(&FormFactorFullSphere_wrapper::default_clone)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getHeight"
+            , (double ( ::FormFactorFullSphere::* )(  ) const)(&::FormFactorFullSphere::getHeight)
+            , (double ( FormFactorFullSphere_wrapper::* )(  ) const)(&FormFactorFullSphere_wrapper::default_getHeight) )    
         .def( 
             "getNumberOfStochasticParameters"
-            , (int ( ::FormFactorFullSphere::* )(  ) )(&::FormFactorFullSphere::getNumberOfStochasticParameters)
-            , (int ( FormFactorFullSphere_wrapper::* )(  ) )(&FormFactorFullSphere_wrapper::default_getNumberOfStochasticParameters) )    
+            , (int ( ::FormFactorFullSphere::* )(  ) const)(&::FormFactorFullSphere::getNumberOfStochasticParameters)
+            , (int ( FormFactorFullSphere_wrapper::* )(  ) const)(&FormFactorFullSphere_wrapper::default_getNumberOfStochasticParameters) )    
         .def( 
             "getRadius"
             , (double ( ::FormFactorFullSphere::* )(  ) const)( &::FormFactorFullSphere::getRadius ) )    
+        .def( 
+            "createDistributedFormFactors"
+            , (void ( ::IFormFactor::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&::IFormFactor::createDistributedFormFactors)
+            , (void ( FormFactorFullSphere_wrapper::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&FormFactorFullSphere_wrapper::default_createDistributedFormFactors)
+            , ( bp::arg("form_factors"), bp::arg("probabilities"), bp::arg("nbr_samples") )
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( FormFactorFullSphere_wrapper::* )(  ) )(&FormFactorFullSphere_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( FormFactorFullSphere_wrapper::* )(  ) const)(&FormFactorFullSphere_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "evaluate"
             , (::complex_t ( ::IFormFactorBorn::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&::IFormFactorBorn::evaluate)
             , (::complex_t ( FormFactorFullSphere_wrapper::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&FormFactorFullSphere_wrapper::default_evaluate)
             , ( bp::arg("k_i"), bp::arg("k_f"), bp::arg("alpha_i"), bp::arg("alpha_f") ) )    
-        .def( 
-            "getNumberOfStochasticParameters"
-            , (int ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getNumberOfStochasticParameters)
-            , (int ( FormFactorFullSphere_wrapper::* )(  ) const)(&FormFactorFullSphere_wrapper::default_getNumberOfStochasticParameters) )    
         .def( 
             "getVolume"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getVolume)
             , (double ( FormFactorFullSphere_wrapper::* )(  ) const)(&FormFactorFullSphere_wrapper::default_getVolume) )    
+        .def( 
+            "isDistributedFormFactor"
+            , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
+            , (bool ( FormFactorFullSphere_wrapper::* )(  ) const)(&FormFactorFullSphere_wrapper::default_isDistributedFormFactor) )    
         .def( 
             "setAmbientRefractiveIndex"
             , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
@@ -1692,12 +1861,18 @@ void register_classes_1(){
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "getNumberOfStochasticParameters"
-            , (int ( ::FormFactorGauss::* )(  ) )(&::FormFactorGauss::getNumberOfStochasticParameters)
-            , (int ( FormFactorGauss_wrapper::* )(  ) )(&FormFactorGauss_wrapper::default_getNumberOfStochasticParameters) )    
+            , (int ( ::FormFactorGauss::* )(  ) const)(&::FormFactorGauss::getNumberOfStochasticParameters)
+            , (int ( FormFactorGauss_wrapper::* )(  ) const)(&FormFactorGauss_wrapper::default_getNumberOfStochasticParameters) )    
+        .def( 
+            "createDistributedFormFactors"
+            , (void ( ::IFormFactor::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&::IFormFactor::createDistributedFormFactors)
+            , (void ( FormFactorGauss_wrapper::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&FormFactorGauss_wrapper::default_createDistributedFormFactors)
+            , ( bp::arg("form_factors"), bp::arg("probabilities"), bp::arg("nbr_samples") )
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( FormFactorGauss_wrapper::* )(  ) )(&FormFactorGauss_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( FormFactorGauss_wrapper::* )(  ) const)(&FormFactorGauss_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "evaluate"
@@ -1705,13 +1880,17 @@ void register_classes_1(){
             , (::complex_t ( FormFactorGauss_wrapper::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&FormFactorGauss_wrapper::default_evaluate)
             , ( bp::arg("k_i"), bp::arg("k_f"), bp::arg("alpha_i"), bp::arg("alpha_f") ) )    
         .def( 
-            "getNumberOfStochasticParameters"
-            , (int ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getNumberOfStochasticParameters)
-            , (int ( FormFactorGauss_wrapper::* )(  ) const)(&FormFactorGauss_wrapper::default_getNumberOfStochasticParameters) )    
+            "getHeight"
+            , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getHeight)
+            , (double ( FormFactorGauss_wrapper::* )(  ) const)(&FormFactorGauss_wrapper::default_getHeight) )    
         .def( 
             "getVolume"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getVolume)
             , (double ( FormFactorGauss_wrapper::* )(  ) const)(&FormFactorGauss_wrapper::default_getVolume) )    
+        .def( 
+            "isDistributedFormFactor"
+            , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
+            , (bool ( FormFactorGauss_wrapper::* )(  ) const)(&FormFactorGauss_wrapper::default_isDistributedFormFactor) )    
         .def( 
             "setAmbientRefractiveIndex"
             , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
@@ -1731,12 +1910,18 @@ void register_classes_1(){
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "getNumberOfStochasticParameters"
-            , (int ( ::FormFactorLorentz::* )(  ) )(&::FormFactorLorentz::getNumberOfStochasticParameters)
-            , (int ( FormFactorLorentz_wrapper::* )(  ) )(&FormFactorLorentz_wrapper::default_getNumberOfStochasticParameters) )    
+            , (int ( ::FormFactorLorentz::* )(  ) const)(&::FormFactorLorentz::getNumberOfStochasticParameters)
+            , (int ( FormFactorLorentz_wrapper::* )(  ) const)(&FormFactorLorentz_wrapper::default_getNumberOfStochasticParameters) )    
+        .def( 
+            "createDistributedFormFactors"
+            , (void ( ::IFormFactor::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&::IFormFactor::createDistributedFormFactors)
+            , (void ( FormFactorLorentz_wrapper::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&FormFactorLorentz_wrapper::default_createDistributedFormFactors)
+            , ( bp::arg("form_factors"), bp::arg("probabilities"), bp::arg("nbr_samples") )
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( FormFactorLorentz_wrapper::* )(  ) )(&FormFactorLorentz_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( FormFactorLorentz_wrapper::* )(  ) const)(&FormFactorLorentz_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "evaluate"
@@ -1744,13 +1929,17 @@ void register_classes_1(){
             , (::complex_t ( FormFactorLorentz_wrapper::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&FormFactorLorentz_wrapper::default_evaluate)
             , ( bp::arg("k_i"), bp::arg("k_f"), bp::arg("alpha_i"), bp::arg("alpha_f") ) )    
         .def( 
-            "getNumberOfStochasticParameters"
-            , (int ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getNumberOfStochasticParameters)
-            , (int ( FormFactorLorentz_wrapper::* )(  ) const)(&FormFactorLorentz_wrapper::default_getNumberOfStochasticParameters) )    
+            "getHeight"
+            , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getHeight)
+            , (double ( FormFactorLorentz_wrapper::* )(  ) const)(&FormFactorLorentz_wrapper::default_getHeight) )    
         .def( 
             "getVolume"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getVolume)
             , (double ( FormFactorLorentz_wrapper::* )(  ) const)(&FormFactorLorentz_wrapper::default_getVolume) )    
+        .def( 
+            "isDistributedFormFactor"
+            , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
+            , (bool ( FormFactorLorentz_wrapper::* )(  ) const)(&FormFactorLorentz_wrapper::default_isDistributedFormFactor) )    
         .def( 
             "setAmbientRefractiveIndex"
             , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
@@ -1768,90 +1957,45 @@ void register_classes_1(){
             , (::FormFactorPrism3 * ( FormFactorPrism3_wrapper::* )(  ) const)(&FormFactorPrism3_wrapper::default_clone)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
-            "getNumberOfStochasticParameters"
-            , (int ( ::FormFactorPrism3::* )(  ) )(&::FormFactorPrism3::getNumberOfStochasticParameters)
-            , (int ( FormFactorPrism3_wrapper::* )(  ) )(&FormFactorPrism3_wrapper::default_getNumberOfStochasticParameters) )    
-        .def( 
-            "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( FormFactorPrism3_wrapper::* )(  ) )(&FormFactorPrism3_wrapper::default_createParameterTree)
-            , bp::return_value_policy< bp::manage_new_object >() )    
-        .def( 
-            "evaluate"
-            , (::complex_t ( ::IFormFactorBorn::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&::IFormFactorBorn::evaluate)
-            , (::complex_t ( FormFactorPrism3_wrapper::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&FormFactorPrism3_wrapper::default_evaluate)
-            , ( bp::arg("k_i"), bp::arg("k_f"), bp::arg("alpha_i"), bp::arg("alpha_f") ) )    
+            "getHeight"
+            , (double ( ::FormFactorPrism3::* )(  ) const)(&::FormFactorPrism3::getHeight)
+            , (double ( FormFactorPrism3_wrapper::* )(  ) const)(&FormFactorPrism3_wrapper::default_getHeight) )    
         .def( 
             "getNumberOfStochasticParameters"
-            , (int ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getNumberOfStochasticParameters)
+            , (int ( ::FormFactorPrism3::* )(  ) const)(&::FormFactorPrism3::getNumberOfStochasticParameters)
             , (int ( FormFactorPrism3_wrapper::* )(  ) const)(&FormFactorPrism3_wrapper::default_getNumberOfStochasticParameters) )    
         .def( 
-            "getVolume"
-            , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getVolume)
-            , (double ( FormFactorPrism3_wrapper::* )(  ) const)(&FormFactorPrism3_wrapper::default_getVolume) )    
-        .def( 
-            "setAmbientRefractiveIndex"
-            , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
-            , (void ( FormFactorPrism3_wrapper::* )( ::complex_t ) )(&FormFactorPrism3_wrapper::default_setAmbientRefractiveIndex)
-            , ( bp::arg("refractive_index") ) )    
-        .def( 
-            "walk_and_print"
-            , (void ( ::ISample::* )(  ) )(&::ISample::walk_and_print)
-            , (void ( FormFactorPrism3_wrapper::* )(  ) )(&FormFactorPrism3_wrapper::default_walk_and_print) );
-
-    bp::class_< FormFactorPyramid_wrapper, bp::bases< IFormFactorBorn >, boost::noncopyable >( "FormFactorPyramid", bp::init< double, double, double >(( bp::arg("height"), bp::arg("half_side"), bp::arg("alpha") )) )    
-        .def( 
-            "clone"
-            , (::FormFactorPyramid * ( ::FormFactorPyramid::* )(  ) const)(&::FormFactorPyramid::clone)
-            , (::FormFactorPyramid * ( FormFactorPyramid_wrapper::* )(  ) const)(&FormFactorPyramid_wrapper::default_clone)
+            "createDistributedFormFactors"
+            , (void ( ::IFormFactor::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&::IFormFactor::createDistributedFormFactors)
+            , (void ( FormFactorPrism3_wrapper::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&FormFactorPrism3_wrapper::default_createDistributedFormFactors)
+            , ( bp::arg("form_factors"), bp::arg("probabilities"), bp::arg("nbr_samples") )
             , bp::return_value_policy< bp::manage_new_object >() )    
-        .def( 
-            "getNumberOfStochasticParameters"
-            , (int ( ::FormFactorPyramid::* )(  ) )(&::FormFactorPyramid::getNumberOfStochasticParameters)
-            , (int ( FormFactorPyramid_wrapper::* )(  ) )(&FormFactorPyramid_wrapper::default_getNumberOfStochasticParameters) )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( FormFactorPyramid_wrapper::* )(  ) )(&FormFactorPyramid_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( FormFactorPrism3_wrapper::* )(  ) const)(&FormFactorPrism3_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "evaluate"
             , (::complex_t ( ::IFormFactorBorn::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&::IFormFactorBorn::evaluate)
-            , (::complex_t ( FormFactorPyramid_wrapper::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&FormFactorPyramid_wrapper::default_evaluate)
+            , (::complex_t ( FormFactorPrism3_wrapper::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&FormFactorPrism3_wrapper::default_evaluate)
             , ( bp::arg("k_i"), bp::arg("k_f"), bp::arg("alpha_i"), bp::arg("alpha_f") ) )    
-        .def( 
-            "getNumberOfStochasticParameters"
-            , (int ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getNumberOfStochasticParameters)
-            , (int ( FormFactorPyramid_wrapper::* )(  ) const)(&FormFactorPyramid_wrapper::default_getNumberOfStochasticParameters) )    
         .def( 
             "getVolume"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getVolume)
-            , (double ( FormFactorPyramid_wrapper::* )(  ) const)(&FormFactorPyramid_wrapper::default_getVolume) )    
+            , (double ( FormFactorPrism3_wrapper::* )(  ) const)(&FormFactorPrism3_wrapper::default_getVolume) )    
+        .def( 
+            "isDistributedFormFactor"
+            , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
+            , (bool ( FormFactorPrism3_wrapper::* )(  ) const)(&FormFactorPrism3_wrapper::default_isDistributedFormFactor) )    
         .def( 
             "setAmbientRefractiveIndex"
             , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
-            , (void ( FormFactorPyramid_wrapper::* )( ::complex_t ) )(&FormFactorPyramid_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( FormFactorPrism3_wrapper::* )( ::complex_t ) )(&FormFactorPrism3_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "walk_and_print"
             , (void ( ::ISample::* )(  ) )(&::ISample::walk_and_print)
-            , (void ( FormFactorPyramid_wrapper::* )(  ) )(&FormFactorPyramid_wrapper::default_walk_and_print) );
-
-    bp::class_< GISASExperiment_wrapper, bp::bases< Experiment >, boost::noncopyable >( "GISASExperiment", bp::init< >() )    
-        .def( 
-            "normalize"
-            , (void ( ::GISASExperiment::* )(  ) )(&::GISASExperiment::normalize)
-            , (void ( GISASExperiment_wrapper::* )(  ) )(&GISASExperiment_wrapper::default_normalize) )    
-        .def( 
-            "runSimulation"
-            , (void ( ::GISASExperiment::* )(  ) )(&::GISASExperiment::runSimulation)
-            , (void ( GISASExperiment_wrapper::* )(  ) )(&GISASExperiment_wrapper::default_runSimulation) )    
-        .def( 
-            "setDetectorParameters"
-            , (void ( ::GISASExperiment::* )( ::size_t,double,double,::size_t,double,double,bool ) )( &::GISASExperiment::setDetectorParameters )
-            , ( bp::arg("n_phi"), bp::arg("phi_f_min"), bp::arg("phi_f_max"), bp::arg("n_alpha"), bp::arg("alpha_f_min"), bp::arg("alpha_f_max"), bp::arg("isgisaxs_style")=(bool)(false) ) )    
-        .def( 
-            "smearIntensityFromZAxisTilting"
-            , (void ( ::GISASExperiment::* )(  ) )( &::GISASExperiment::smearIntensityFromZAxisTilting ) );
+            , (void ( FormFactorPrism3_wrapper::* )(  ) )(&FormFactorPrism3_wrapper::default_walk_and_print) );
 
 }
diff --git a/Core/PythonAPI/src/PythonInterface_classes_2.cpp b/Core/PythonAPI/src/PythonInterface_classes_2.cpp
index b85a99ef3fc326368980b5ff1bebf76596680563..950c2ba1abbd32480249e9f3794cf68b06c5d6fe 100644
--- a/Core/PythonAPI/src/PythonInterface_classes_2.cpp
+++ b/Core/PythonAPI/src/PythonInterface_classes_2.cpp
@@ -43,8 +43,239 @@
 
 namespace bp = boost::python;
 
+struct FormFactorPyramid_wrapper : FormFactorPyramid, bp::wrapper< FormFactorPyramid > {
+
+    FormFactorPyramid_wrapper(double height, double half_side, double alpha )
+    : FormFactorPyramid( height, half_side, alpha )
+      , bp::wrapper< FormFactorPyramid >(){
+        // constructor
+    
+    }
+
+    virtual ::FormFactorPyramid * clone(  ) const  {
+        if( bp::override func_clone = this->get_override( "clone" ) )
+            return func_clone(  );
+        else{
+            return this->FormFactorPyramid::clone(  );
+        }
+    }
+    
+    ::FormFactorPyramid * default_clone(  ) const  {
+        return FormFactorPyramid::clone( );
+    }
+
+    virtual double getHeight(  ) const  {
+        if( bp::override func_getHeight = this->get_override( "getHeight" ) )
+            return func_getHeight(  );
+        else{
+            return this->FormFactorPyramid::getHeight(  );
+        }
+    }
+    
+    double default_getHeight(  ) const  {
+        return FormFactorPyramid::getHeight( );
+    }
+
+    virtual int getNumberOfStochasticParameters(  ) const  {
+        if( bp::override func_getNumberOfStochasticParameters = this->get_override( "getNumberOfStochasticParameters" ) )
+            return func_getNumberOfStochasticParameters(  );
+        else{
+            return this->FormFactorPyramid::getNumberOfStochasticParameters(  );
+        }
+    }
+    
+    int default_getNumberOfStochasticParameters(  ) const  {
+        return FormFactorPyramid::getNumberOfStochasticParameters( );
+    }
+
+    virtual void createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        if( bp::override func_createDistributedFormFactors = this->get_override( "createDistributedFormFactors" ) )
+            func_createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        else{
+            this->IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        }
+    }
+    
+    void default_createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+    }
+
+    virtual ::ParameterPool * createParameterTree(  ) const  {
+        if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
+            return func_createParameterTree(  );
+        else{
+            return this->ISample::createParameterTree(  );
+        }
+    }
+    
+    ::ParameterPool * default_createParameterTree(  ) const  {
+        return ISample::createParameterTree( );
+    }
+
+    virtual ::complex_t evaluate( ::cvector_t const & k_i, ::cvector_t const & k_f, double alpha_i, double alpha_f ) const  {
+        if( bp::override func_evaluate = this->get_override( "evaluate" ) )
+            return func_evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
+        else{
+            return this->IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
+        }
+    }
+    
+    ::complex_t default_evaluate( ::cvector_t const & k_i, ::cvector_t const & k_f, double alpha_i, double alpha_f ) const  {
+        return IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f), alpha_i, alpha_f );
+    }
+
+    virtual double getVolume(  ) const  {
+        if( bp::override func_getVolume = this->get_override( "getVolume" ) )
+            return func_getVolume(  );
+        else{
+            return this->IFormFactor::getVolume(  );
+        }
+    }
+    
+    double default_getVolume(  ) const  {
+        return IFormFactor::getVolume( );
+    }
+
+    virtual bool isDistributedFormFactor(  ) const  {
+        if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
+            return func_isDistributedFormFactor(  );
+        else{
+            return this->IFormFactor::isDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_isDistributedFormFactor(  ) const  {
+        return IFormFactor::isDistributedFormFactor( );
+    }
+
+    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+        if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
+            func_setAmbientRefractiveIndex( refractive_index );
+        else{
+            this->IFormFactor::setAmbientRefractiveIndex( refractive_index );
+        }
+    }
+    
+    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+        IFormFactor::setAmbientRefractiveIndex( refractive_index );
+    }
+
+    virtual void walk_and_print(  ) {
+        if( bp::override func_walk_and_print = this->get_override( "walk_and_print" ) )
+            func_walk_and_print(  );
+        else{
+            this->ISample::walk_and_print(  );
+        }
+    }
+    
+    void default_walk_and_print(  ) {
+        ISample::walk_and_print( );
+    }
+
+};
+
+struct GISASExperiment_wrapper : GISASExperiment, bp::wrapper< GISASExperiment > {
+
+    GISASExperiment_wrapper( )
+    : GISASExperiment( )
+      , bp::wrapper< GISASExperiment >(){
+        // null constructor
+    
+    }
+
+    virtual void normalize(  ) {
+        if( bp::override func_normalize = this->get_override( "normalize" ) )
+            func_normalize(  );
+        else{
+            this->GISASExperiment::normalize(  );
+        }
+    }
+    
+    void default_normalize(  ) {
+        GISASExperiment::normalize( );
+    }
+
+    virtual void runSimulation(  ) {
+        if( bp::override func_runSimulation = this->get_override( "runSimulation" ) )
+            func_runSimulation(  );
+        else{
+            this->GISASExperiment::runSimulation(  );
+        }
+    }
+    
+    void default_runSimulation(  ) {
+        GISASExperiment::runSimulation( );
+    }
+
+};
+
 void register_classes_2(){
 
+    bp::class_< FormFactorPyramid_wrapper, bp::bases< IFormFactorBorn >, boost::noncopyable >( "FormFactorPyramid", bp::init< double, double, double >(( bp::arg("height"), bp::arg("half_side"), bp::arg("alpha") )) )    
+        .def( 
+            "clone"
+            , (::FormFactorPyramid * ( ::FormFactorPyramid::* )(  ) const)(&::FormFactorPyramid::clone)
+            , (::FormFactorPyramid * ( FormFactorPyramid_wrapper::* )(  ) const)(&FormFactorPyramid_wrapper::default_clone)
+            , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getHeight"
+            , (double ( ::FormFactorPyramid::* )(  ) const)(&::FormFactorPyramid::getHeight)
+            , (double ( FormFactorPyramid_wrapper::* )(  ) const)(&FormFactorPyramid_wrapper::default_getHeight) )    
+        .def( 
+            "getNumberOfStochasticParameters"
+            , (int ( ::FormFactorPyramid::* )(  ) const)(&::FormFactorPyramid::getNumberOfStochasticParameters)
+            , (int ( FormFactorPyramid_wrapper::* )(  ) const)(&FormFactorPyramid_wrapper::default_getNumberOfStochasticParameters) )    
+        .def( 
+            "createDistributedFormFactors"
+            , (void ( ::IFormFactor::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&::IFormFactor::createDistributedFormFactors)
+            , (void ( FormFactorPyramid_wrapper::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&FormFactorPyramid_wrapper::default_createDistributedFormFactors)
+            , ( bp::arg("form_factors"), bp::arg("probabilities"), bp::arg("nbr_samples") )
+            , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "createParameterTree"
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( FormFactorPyramid_wrapper::* )(  ) const)(&FormFactorPyramid_wrapper::default_createParameterTree)
+            , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "evaluate"
+            , (::complex_t ( ::IFormFactorBorn::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&::IFormFactorBorn::evaluate)
+            , (::complex_t ( FormFactorPyramid_wrapper::* )( ::cvector_t const &,::cvector_t const &,double,double ) const)(&FormFactorPyramid_wrapper::default_evaluate)
+            , ( bp::arg("k_i"), bp::arg("k_f"), bp::arg("alpha_i"), bp::arg("alpha_f") ) )    
+        .def( 
+            "getVolume"
+            , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getVolume)
+            , (double ( FormFactorPyramid_wrapper::* )(  ) const)(&FormFactorPyramid_wrapper::default_getVolume) )    
+        .def( 
+            "isDistributedFormFactor"
+            , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
+            , (bool ( FormFactorPyramid_wrapper::* )(  ) const)(&FormFactorPyramid_wrapper::default_isDistributedFormFactor) )    
+        .def( 
+            "setAmbientRefractiveIndex"
+            , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
+            , (void ( FormFactorPyramid_wrapper::* )( ::complex_t ) )(&FormFactorPyramid_wrapper::default_setAmbientRefractiveIndex)
+            , ( bp::arg("refractive_index") ) )    
+        .def( 
+            "walk_and_print"
+            , (void ( ::ISample::* )(  ) )(&::ISample::walk_and_print)
+            , (void ( FormFactorPyramid_wrapper::* )(  ) )(&FormFactorPyramid_wrapper::default_walk_and_print) );
+
+    bp::class_< GISASExperiment_wrapper, bp::bases< Experiment >, boost::noncopyable >( "GISASExperiment", bp::init< >() )    
+        .def( 
+            "normalize"
+            , (void ( ::GISASExperiment::* )(  ) )(&::GISASExperiment::normalize)
+            , (void ( GISASExperiment_wrapper::* )(  ) )(&GISASExperiment_wrapper::default_normalize) )    
+        .def( 
+            "runSimulation"
+            , (void ( ::GISASExperiment::* )(  ) )(&::GISASExperiment::runSimulation)
+            , (void ( GISASExperiment_wrapper::* )(  ) )(&GISASExperiment_wrapper::default_runSimulation) )    
+        .def( 
+            "setDetectorParameters"
+            , (void ( ::GISASExperiment::* )( ::size_t,double,double,::size_t,double,double,bool ) )( &::GISASExperiment::setDetectorParameters )
+            , ( bp::arg("n_phi"), bp::arg("phi_f_min"), bp::arg("phi_f_max"), bp::arg("n_alpha"), bp::arg("alpha_f_min"), bp::arg("alpha_f_max"), bp::arg("isgisaxs_style")=(bool)(false) ) )    
+        .def( 
+            "smearIntensityFromZAxisTilting"
+            , (void ( ::GISASExperiment::* )(  ) )( &::GISASExperiment::smearIntensityFromZAxisTilting ) );
+
     { //::Geometry::BasicVector3D< double >
         typedef bp::class_< Geometry::BasicVector3D< double > > kvector_t_exposer_t;
         kvector_t_exposer_t kvector_t_exposer = kvector_t_exposer_t( "kvector_t", bp::init< >() );
@@ -744,7 +975,4 @@ void register_classes_2(){
     bp::class_< Geometry::TranslateY3D, bp::bases< Geometry::Translate3D > >( "TranslateY3D", bp::init< >() )    
         .def( bp::init< double >(( bp::arg("y") )) );
 
-    bp::class_< Geometry::TranslateZ3D, bp::bases< Geometry::Translate3D > >( "TranslateZ3D", bp::init< >() )    
-        .def( bp::init< double >(( bp::arg("z") )) );
-
 }
diff --git a/Core/PythonAPI/src/PythonInterface_classes_3.cpp b/Core/PythonAPI/src/PythonInterface_classes_3.cpp
index 2511355a76e6d4c67fa0ff76b67c56aa28b65c70..754e1b204cbb739cc5d44a0dd2f3c5e654d26334 100644
--- a/Core/PythonAPI/src/PythonInterface_classes_3.cpp
+++ b/Core/PythonAPI/src/PythonInterface_classes_3.cpp
@@ -50,6 +50,18 @@ struct IFormFactorDecorator_wrapper : IFormFactorDecorator, bp::wrapper< IFormFa
         return func_clone(  );
     }
 
+    virtual double getHeight(  ) const  {
+        if( bp::override func_getHeight = this->get_override( "getHeight" ) )
+            return func_getHeight(  );
+        else{
+            return this->IFormFactorDecorator::getHeight(  );
+        }
+    }
+    
+    double default_getHeight(  ) const  {
+        return IFormFactorDecorator::getHeight( );
+    }
+
     virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
             func_setAmbientRefractiveIndex( refractive_index );
@@ -62,7 +74,19 @@ struct IFormFactorDecorator_wrapper : IFormFactorDecorator, bp::wrapper< IFormFa
         IFormFactorDecorator::setAmbientRefractiveIndex( refractive_index );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual void createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        if( bp::override func_createDistributedFormFactors = this->get_override( "createDistributedFormFactors" ) )
+            func_createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        else{
+            this->IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+        }
+    }
+    
+    void default_createDistributedFormFactors( ::std::vector< IFormFactor* > & form_factors, ::std::vector< double > & probabilities, ::size_t nbr_samples ) const  {
+        IFormFactor::createDistributedFormFactors( boost::ref(form_factors), boost::ref(probabilities), nbr_samples );
+    }
+
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -70,7 +94,7 @@ struct IFormFactorDecorator_wrapper : IFormFactorDecorator, bp::wrapper< IFormFa
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -103,6 +127,18 @@ struct IFormFactorDecorator_wrapper : IFormFactorDecorator, bp::wrapper< IFormFa
         return IFormFactor::getVolume( );
     }
 
+    virtual bool isDistributedFormFactor(  ) const  {
+        if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
+            return func_isDistributedFormFactor(  );
+        else{
+            return this->IFormFactor::isDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_isDistributedFormFactor(  ) const  {
+        return IFormFactor::isDistributedFormFactor( );
+    }
+
     virtual void walk_and_print(  ) {
         if( bp::override func_walk_and_print = this->get_override( "walk_and_print" ) )
             func_walk_and_print(  );
@@ -136,7 +172,7 @@ struct IInterferenceFunction_wrapper : IInterferenceFunction, bp::wrapper< IInte
         return func_evaluate( boost::ref(q) );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -144,7 +180,7 @@ struct IInterferenceFunction_wrapper : IInterferenceFunction, bp::wrapper< IInte
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -195,7 +231,7 @@ struct InterferenceFunction1DParaCrystal_wrapper : InterferenceFunction1DParaCry
         return InterferenceFunction1DParaCrystal::evaluate( boost::ref(q) );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -203,7 +239,7 @@ struct InterferenceFunction1DParaCrystal_wrapper : InterferenceFunction1DParaCry
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -254,7 +290,7 @@ struct InterferenceFunctionNone_wrapper : InterferenceFunctionNone, bp::wrapper<
         return InterferenceFunctionNone::evaluate( boost::ref(q) );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -262,7 +298,7 @@ struct InterferenceFunctionNone_wrapper : InterferenceFunctionNone, bp::wrapper<
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -313,6 +349,18 @@ struct Particle_wrapper : Particle, bp::wrapper< Particle > {
         return Particle::createDiffuseParticleInfo( boost::ref(parent_info) );
     }
 
+    virtual ::std::vector< ParticleInfo* > createDistributedParticles( ::size_t samples_per_particle, double factor ) const  {
+        if( bp::override func_createDistributedParticles = this->get_override( "createDistributedParticles" ) )
+            return func_createDistributedParticles( samples_per_particle, factor );
+        else{
+            return this->Particle::createDistributedParticles( samples_per_particle, factor );
+        }
+    }
+    
+    ::std::vector< ParticleInfo* > default_createDistributedParticles( ::size_t samples_per_particle, double factor ) const  {
+        return Particle::createDistributedParticles( samples_per_particle, factor );
+    }
+
     virtual ::IFormFactor * createFormFactor(  ) const  {
         if( bp::override func_createFormFactor = this->get_override( "createFormFactor" ) )
             return func_createFormFactor(  );
@@ -325,6 +373,18 @@ struct Particle_wrapper : Particle, bp::wrapper< Particle > {
         return Particle::createFormFactor( );
     }
 
+    virtual ::complex_t const getRefractiveIndex(  ) const  {
+        if( bp::override func_getRefractiveIndex = this->get_override( "getRefractiveIndex" ) )
+            return func_getRefractiveIndex(  );
+        else{
+            return this->Particle::getRefractiveIndex(  );
+        }
+    }
+    
+    ::complex_t const default_getRefractiveIndex(  ) const  {
+        return Particle::getRefractiveIndex( );
+    }
+
     virtual ::IFormFactor const * getSimpleFormFactor(  ) const  {
         if( bp::override func_getSimpleFormFactor = this->get_override( "getSimpleFormFactor" ) )
             return func_getSimpleFormFactor(  );
@@ -337,6 +397,18 @@ struct Particle_wrapper : Particle, bp::wrapper< Particle > {
         return Particle::getSimpleFormFactor( );
     }
 
+    virtual bool hasDistributedFormFactor(  ) const  {
+        if( bp::override func_hasDistributedFormFactor = this->get_override( "hasDistributedFormFactor" ) )
+            return func_hasDistributedFormFactor(  );
+        else{
+            return this->Particle::hasDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_hasDistributedFormFactor(  ) const  {
+        return Particle::hasDistributedFormFactor( );
+    }
+
     virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
             func_setAmbientRefractiveIndex( refractive_index );
@@ -349,7 +421,7 @@ struct Particle_wrapper : Particle, bp::wrapper< Particle > {
         Particle::setAmbientRefractiveIndex( refractive_index );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -357,7 +429,7 @@ struct Particle_wrapper : Particle, bp::wrapper< Particle > {
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -396,7 +468,19 @@ struct LatticeBasis_wrapper : LatticeBasis, bp::wrapper< LatticeBasis > {
         return Particle::createDiffuseParticleInfo( boost::ref(parent_info) );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::std::vector< ParticleInfo* > createDistributedParticles( ::size_t samples_per_particle, double factor ) const  {
+        if( bp::override func_createDistributedParticles = this->get_override( "createDistributedParticles" ) )
+            return func_createDistributedParticles( samples_per_particle, factor );
+        else{
+            return this->Particle::createDistributedParticles( samples_per_particle, factor );
+        }
+    }
+    
+    ::std::vector< ParticleInfo* > default_createDistributedParticles( ::size_t samples_per_particle, double factor ) const  {
+        return Particle::createDistributedParticles( samples_per_particle, factor );
+    }
+
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -404,10 +488,22 @@ struct LatticeBasis_wrapper : LatticeBasis, bp::wrapper< LatticeBasis > {
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
+    virtual ::complex_t const getRefractiveIndex(  ) const  {
+        if( bp::override func_getRefractiveIndex = this->get_override( "getRefractiveIndex" ) )
+            return func_getRefractiveIndex(  );
+        else{
+            return this->Particle::getRefractiveIndex(  );
+        }
+    }
+    
+    ::complex_t const default_getRefractiveIndex(  ) const  {
+        return Particle::getRefractiveIndex( );
+    }
+
     virtual ::IFormFactor const * getSimpleFormFactor(  ) const  {
         if( bp::override func_getSimpleFormFactor = this->get_override( "getSimpleFormFactor" ) )
             return func_getSimpleFormFactor(  );
@@ -420,6 +516,18 @@ struct LatticeBasis_wrapper : LatticeBasis, bp::wrapper< LatticeBasis > {
         return Particle::getSimpleFormFactor( );
     }
 
+    virtual bool hasDistributedFormFactor(  ) const  {
+        if( bp::override func_hasDistributedFormFactor = this->get_override( "hasDistributedFormFactor" ) )
+            return func_hasDistributedFormFactor(  );
+        else{
+            return this->Particle::hasDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_hasDistributedFormFactor(  ) const  {
+        return Particle::hasDistributedFormFactor( );
+    }
+
     virtual void walk_and_print(  ) {
         if( bp::override func_walk_and_print = this->get_override( "walk_and_print" ) )
             func_walk_and_print(  );
@@ -539,7 +647,7 @@ struct Layer_wrapper : Layer, bp::wrapper< Layer > {
         Layer::setThickness( thickness );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -547,7 +655,7 @@ struct Layer_wrapper : Layer, bp::wrapper< Layer > {
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -670,7 +778,7 @@ struct LayerDecorator_wrapper : LayerDecorator, bp::wrapper< LayerDecorator > {
         LayerDecorator::setThickness( thickness );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -678,7 +786,7 @@ struct LayerDecorator_wrapper : LayerDecorator, bp::wrapper< LayerDecorator > {
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -731,7 +839,7 @@ struct LayerRoughness_wrapper : LayerRoughness, bp::wrapper< LayerRoughness > {
         return ISample::clone( );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -739,7 +847,7 @@ struct LayerRoughness_wrapper : LayerRoughness, bp::wrapper< LayerRoughness > {
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -766,7 +874,19 @@ struct MesoCrystal_wrapper : MesoCrystal, bp::wrapper< MesoCrystal > {
     
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::std::vector< ParticleInfo* > createDistributedParticles( ::size_t samples_per_particle, double factor ) const  {
+        if( bp::override func_createDistributedParticles = this->get_override( "createDistributedParticles" ) )
+            return func_createDistributedParticles( samples_per_particle, factor );
+        else{
+            return this->Particle::createDistributedParticles( samples_per_particle, factor );
+        }
+    }
+    
+    ::std::vector< ParticleInfo* > default_createDistributedParticles( ::size_t samples_per_particle, double factor ) const  {
+        return Particle::createDistributedParticles( samples_per_particle, factor );
+    }
+
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -774,10 +894,34 @@ struct MesoCrystal_wrapper : MesoCrystal, bp::wrapper< MesoCrystal > {
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
+    virtual ::complex_t const getRefractiveIndex(  ) const  {
+        if( bp::override func_getRefractiveIndex = this->get_override( "getRefractiveIndex" ) )
+            return func_getRefractiveIndex(  );
+        else{
+            return this->Particle::getRefractiveIndex(  );
+        }
+    }
+    
+    ::complex_t const default_getRefractiveIndex(  ) const  {
+        return Particle::getRefractiveIndex( );
+    }
+
+    virtual bool hasDistributedFormFactor(  ) const  {
+        if( bp::override func_hasDistributedFormFactor = this->get_override( "hasDistributedFormFactor" ) )
+            return func_hasDistributedFormFactor(  );
+        else{
+            return this->Particle::hasDistributedFormFactor(  );
+        }
+    }
+    
+    bool default_hasDistributedFormFactor(  ) const  {
+        return Particle::hasDistributedFormFactor( );
+    }
+
     virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
             func_setAmbientRefractiveIndex( refractive_index );
@@ -813,7 +957,7 @@ struct MultiLayer_wrapper : MultiLayer, bp::wrapper< MultiLayer > {
     
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -821,7 +965,7 @@ struct MultiLayer_wrapper : MultiLayer, bp::wrapper< MultiLayer > {
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -860,7 +1004,7 @@ struct ParticleDecoration_wrapper : ParticleDecoration, bp::wrapper< ParticleDec
         return ParticleDecoration::clone( );
     }
 
-    virtual ::ParameterPool * createParameterTree(  ) {
+    virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
         else{
@@ -868,7 +1012,7 @@ struct ParticleDecoration_wrapper : ParticleDecoration, bp::wrapper< ParticleDec
         }
     }
     
-    ::ParameterPool * default_createParameterTree(  ) {
+    ::ParameterPool * default_createParameterTree(  ) const  {
         return ISample::createParameterTree( );
     }
 
@@ -888,6 +1032,9 @@ struct ParticleDecoration_wrapper : ParticleDecoration, bp::wrapper< ParticleDec
 
 void register_classes_3(){
 
+    bp::class_< Geometry::TranslateZ3D, bp::bases< Geometry::Translate3D > >( "TranslateZ3D", bp::init< >() )    
+        .def( bp::init< double >(( bp::arg("z") )) );
+
     { //::IMaterial
         typedef bp::class_< IMaterial > IMaterial_exposer_t;
         IMaterial_exposer_t IMaterial_exposer = IMaterial_exposer_t( "IMaterial", bp::init< >() );
@@ -952,15 +1099,25 @@ void register_classes_3(){
             "clone"
             , bp::pure_virtual( (::IFormFactorDecorator * ( ::IFormFactorDecorator::* )(  ) const)(&::IFormFactorDecorator::clone) )
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getHeight"
+            , (double ( ::IFormFactorDecorator::* )(  ) const)(&::IFormFactorDecorator::getHeight)
+            , (double ( IFormFactorDecorator_wrapper::* )(  ) const)(&IFormFactorDecorator_wrapper::default_getHeight) )    
         .def( 
             "setAmbientRefractiveIndex"
             , (void ( ::IFormFactorDecorator::* )( ::complex_t ) )(&::IFormFactorDecorator::setAmbientRefractiveIndex)
             , (void ( IFormFactorDecorator_wrapper::* )( ::complex_t ) )(&IFormFactorDecorator_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
+        .def( 
+            "createDistributedFormFactors"
+            , (void ( ::IFormFactor::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&::IFormFactor::createDistributedFormFactors)
+            , (void ( IFormFactorDecorator_wrapper::* )( ::std::vector< IFormFactor* > &,::std::vector< double > &,::size_t ) const)(&IFormFactorDecorator_wrapper::default_createDistributedFormFactors)
+            , ( bp::arg("form_factors"), bp::arg("probabilities"), bp::arg("nbr_samples") )
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( IFormFactorDecorator_wrapper::* )(  ) )(&IFormFactorDecorator_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( IFormFactorDecorator_wrapper::* )(  ) const)(&IFormFactorDecorator_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "evaluate"
@@ -974,6 +1131,10 @@ void register_classes_3(){
             "getVolume"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getVolume)
             , (double ( IFormFactorDecorator_wrapper::* )(  ) const)(&IFormFactorDecorator_wrapper::default_getVolume) )    
+        .def( 
+            "isDistributedFormFactor"
+            , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
+            , (bool ( IFormFactorDecorator_wrapper::* )(  ) const)(&IFormFactorDecorator_wrapper::default_isDistributedFormFactor) )    
         .def( 
             "walk_and_print"
             , (void ( ::ISample::* )(  ) )(&::ISample::walk_and_print)
@@ -990,8 +1151,8 @@ void register_classes_3(){
             , ( bp::arg("q") ) )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( IInterferenceFunction_wrapper::* )(  ) )(&IInterferenceFunction_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( IInterferenceFunction_wrapper::* )(  ) const)(&IInterferenceFunction_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "walk_and_print"
@@ -1018,8 +1179,8 @@ void register_classes_3(){
             , ( bp::arg("q") ) )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( InterferenceFunction1DParaCrystal_wrapper::* )(  ) )(&InterferenceFunction1DParaCrystal_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( InterferenceFunction1DParaCrystal_wrapper::* )(  ) const)(&InterferenceFunction1DParaCrystal_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "walk_and_print"
@@ -1039,8 +1200,8 @@ void register_classes_3(){
             , ( bp::arg("q") ) )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( InterferenceFunctionNone_wrapper::* )(  ) )(&InterferenceFunctionNone_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( InterferenceFunctionNone_wrapper::* )(  ) const)(&InterferenceFunctionNone_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "walk_and_print"
@@ -1078,16 +1239,30 @@ void register_classes_3(){
             , (::std::vector< DiffuseParticleInfo* > * ( Particle_wrapper::* )( ::ParticleInfo const & ) const)(&Particle_wrapper::default_createDiffuseParticleInfo)
             , ( bp::arg("parent_info") )
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "createDistributedParticles"
+            , (::std::vector< ParticleInfo* > ( ::Particle::* )( ::size_t,double ) const)(&::Particle::createDistributedParticles)
+            , (::std::vector< ParticleInfo* > ( Particle_wrapper::* )( ::size_t,double ) const)(&Particle_wrapper::default_createDistributedParticles)
+            , ( bp::arg("samples_per_particle"), bp::arg("factor") )
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "createFormFactor"
             , (::IFormFactor * ( ::Particle::* )(  ) const)(&::Particle::createFormFactor)
             , (::IFormFactor * ( Particle_wrapper::* )(  ) const)(&Particle_wrapper::default_createFormFactor)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getRefractiveIndex"
+            , (::complex_t const ( ::Particle::* )(  ) const)(&::Particle::getRefractiveIndex)
+            , (::complex_t const ( Particle_wrapper::* )(  ) const)(&Particle_wrapper::default_getRefractiveIndex) )    
         .def( 
             "getSimpleFormFactor"
             , (::IFormFactor const * ( ::Particle::* )(  ) const)(&::Particle::getSimpleFormFactor)
             , (::IFormFactor const * ( Particle_wrapper::* )(  ) const)(&Particle_wrapper::default_getSimpleFormFactor)
             , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "hasDistributedFormFactor"
+            , (bool ( ::Particle::* )(  ) const)(&::Particle::hasDistributedFormFactor)
+            , (bool ( Particle_wrapper::* )(  ) const)(&Particle_wrapper::default_hasDistributedFormFactor) )    
         .def( 
             "setAmbientRefractiveIndex"
             , (void ( ::Particle::* )( ::complex_t ) )(&::Particle::setAmbientRefractiveIndex)
@@ -1095,8 +1270,8 @@ void register_classes_3(){
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( Particle_wrapper::* )(  ) )(&Particle_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( Particle_wrapper::* )(  ) const)(&Particle_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "walk_and_print"
@@ -1114,16 +1289,30 @@ void register_classes_3(){
             , (::std::vector< DiffuseParticleInfo* > * ( LatticeBasis_wrapper::* )( ::ParticleInfo const & ) const)(&LatticeBasis_wrapper::default_createDiffuseParticleInfo)
             , ( bp::arg("parent_info") )
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "createDistributedParticles"
+            , (::std::vector< ParticleInfo* > ( ::Particle::* )( ::size_t,double ) const)(&::Particle::createDistributedParticles)
+            , (::std::vector< ParticleInfo* > ( LatticeBasis_wrapper::* )( ::size_t,double ) const)(&LatticeBasis_wrapper::default_createDistributedParticles)
+            , ( bp::arg("samples_per_particle"), bp::arg("factor") )
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( LatticeBasis_wrapper::* )(  ) )(&LatticeBasis_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( LatticeBasis_wrapper::* )(  ) const)(&LatticeBasis_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getRefractiveIndex"
+            , (::complex_t const ( ::Particle::* )(  ) const)(&::Particle::getRefractiveIndex)
+            , (::complex_t const ( LatticeBasis_wrapper::* )(  ) const)(&LatticeBasis_wrapper::default_getRefractiveIndex) )    
         .def( 
             "getSimpleFormFactor"
             , (::IFormFactor const * ( ::Particle::* )(  ) const)(&::Particle::getSimpleFormFactor)
             , (::IFormFactor const * ( LatticeBasis_wrapper::* )(  ) const)(&LatticeBasis_wrapper::default_getSimpleFormFactor)
             , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "hasDistributedFormFactor"
+            , (bool ( ::Particle::* )(  ) const)(&::Particle::hasDistributedFormFactor)
+            , (bool ( LatticeBasis_wrapper::* )(  ) const)(&LatticeBasis_wrapper::default_hasDistributedFormFactor) )    
         .def( 
             "walk_and_print"
             , (void ( ::ISample::* )(  ) )(&::ISample::walk_and_print)
@@ -1169,8 +1358,8 @@ void register_classes_3(){
             , ( bp::arg("thickness") ) )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( Layer_wrapper::* )(  ) )(&Layer_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( Layer_wrapper::* )(  ) const)(&Layer_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "walk_and_print"
@@ -1223,8 +1412,8 @@ void register_classes_3(){
             , ( bp::arg("thickness") ) )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( LayerDecorator_wrapper::* )(  ) )(&LayerDecorator_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( LayerDecorator_wrapper::* )(  ) const)(&LayerDecorator_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "walk_and_print"
@@ -1319,8 +1508,8 @@ void register_classes_3(){
         }
         { //::ISample::createParameterTree
         
-            typedef ::ParameterPool * ( ::ISample::*createParameterTree_function_type )(  ) ;
-            typedef ::ParameterPool * ( LayerRoughness_wrapper::*default_createParameterTree_function_type )(  ) ;
+            typedef ::ParameterPool * ( ::ISample::*createParameterTree_function_type )(  ) const;
+            typedef ::ParameterPool * ( LayerRoughness_wrapper::*default_createParameterTree_function_type )(  ) const;
             
             LayerRoughness_exposer.def( 
                 "createParameterTree"
@@ -1360,11 +1549,25 @@ void register_classes_3(){
         .def( bp::self_ns::str( bp::self ) );
 
     bp::class_< MesoCrystal_wrapper, bp::bases< Particle >, boost::noncopyable >( "MesoCrystal", bp::init< IClusteredParticles const &, IFormFactor & >(( bp::arg("particle_structure"), bp::arg("form_factor") )) )    
+        .def( 
+            "createDistributedParticles"
+            , (::std::vector< ParticleInfo* > ( ::Particle::* )( ::size_t,double ) const)(&::Particle::createDistributedParticles)
+            , (::std::vector< ParticleInfo* > ( MesoCrystal_wrapper::* )( ::size_t,double ) const)(&MesoCrystal_wrapper::default_createDistributedParticles)
+            , ( bp::arg("samples_per_particle"), bp::arg("factor") )
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( MesoCrystal_wrapper::* )(  ) )(&MesoCrystal_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( MesoCrystal_wrapper::* )(  ) const)(&MesoCrystal_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getRefractiveIndex"
+            , (::complex_t const ( ::Particle::* )(  ) const)(&::Particle::getRefractiveIndex)
+            , (::complex_t const ( MesoCrystal_wrapper::* )(  ) const)(&MesoCrystal_wrapper::default_getRefractiveIndex) )    
+        .def( 
+            "hasDistributedFormFactor"
+            , (bool ( ::Particle::* )(  ) const)(&::Particle::hasDistributedFormFactor)
+            , (bool ( MesoCrystal_wrapper::* )(  ) const)(&MesoCrystal_wrapper::default_hasDistributedFormFactor) )    
         .def( 
             "setAmbientRefractiveIndex"
             , (void ( ::Particle::* )( ::complex_t ) )(&::Particle::setAmbientRefractiveIndex)
@@ -1386,8 +1589,8 @@ void register_classes_3(){
             , ( bp::arg("layer"), bp::arg("roughness") ) )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( MultiLayer_wrapper::* )(  ) )(&MultiLayer_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( MultiLayer_wrapper::* )(  ) const)(&MultiLayer_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "walk_and_print"
@@ -1421,22 +1624,12 @@ void register_classes_3(){
             .def_readwrite( "m_data", &OpticalFresnel::MultiLayerCoeff::m_data );
         { //::OpticalFresnel::execute
         
-            typedef int ( ::OpticalFresnel::*execute_function_type )( ::MultiLayer const &,::kvector_t const &,::std::vector< OpticalFresnel::FresnelCoeff > &,bool ) ;
-            
-            OpticalFresnel_exposer.def( 
-                "execute"
-                , execute_function_type( &::OpticalFresnel::execute )
-                , ( bp::arg("sample"), bp::arg("k"), bp::arg("coeff"), bp::arg("useRoughness")=(bool)(false) ) );
-        
-        }
-        { //::OpticalFresnel::execute
-        
-            typedef int ( ::OpticalFresnel::*execute_function_type )( ::MultiLayer const &,::kvector_t const &,::OpticalFresnel::MultiLayerCoeff &,bool ) ;
+            typedef int ( ::OpticalFresnel::*execute_function_type )( ::MultiLayer const &,::kvector_t const &,::std::vector< OpticalFresnel::FresnelCoeff > & ) ;
             
             OpticalFresnel_exposer.def( 
                 "execute"
                 , execute_function_type( &::OpticalFresnel::execute )
-                , ( bp::arg("sample"), bp::arg("k"), bp::arg("coeff"), bp::arg("useRoughness")=(bool)(false) ) );
+                , ( bp::arg("sample"), bp::arg("k"), bp::arg("coeff") ) );
         
         }
     }
@@ -1462,7 +1655,7 @@ void register_classes_3(){
             .def( bp::self_ns::str( bp::self ) );
         { //::ParameterPool::addParameter
         
-            typedef bool ( ::ParameterPool::*addParameter_function_type )( ::std::string,::ParameterPool::RealPar ) ;
+            typedef bool ( ::ParameterPool::*addParameter_function_type )( ::std::string const &,::ParameterPool::RealPar ) ;
             
             ParameterPool_exposer.def( 
                 "addParameter"
@@ -1509,7 +1702,7 @@ void register_classes_3(){
         }
         { //::ParameterPool::cloneWithPrefix
         
-            typedef ::ParameterPool * ( ::ParameterPool::*cloneWithPrefix_function_type )( ::std::string ) ;
+            typedef ::ParameterPool * ( ::ParameterPool::*cloneWithPrefix_function_type )( ::std::string const & ) ;
             
             ParameterPool_exposer.def( 
                 "cloneWithPrefix"
@@ -1538,7 +1731,7 @@ void register_classes_3(){
         }
         { //::ParameterPool::getParameter
         
-            typedef ::ParameterPool::RealPar ( ::ParameterPool::*getParameter_function_type )( ::std::string ) const;
+            typedef ::ParameterPool::RealPar ( ::ParameterPool::*getParameter_function_type )( ::std::string const & ) const;
             
             ParameterPool_exposer.def( 
                 "getParameter"
@@ -1548,7 +1741,7 @@ void register_classes_3(){
         }
         { //::ParameterPool::setMatchedParametersValue
         
-            typedef int ( ::ParameterPool::*setMatchedParametersValue_function_type )( ::std::string,double ) ;
+            typedef int ( ::ParameterPool::*setMatchedParametersValue_function_type )( ::std::string const &,double ) ;
             
             ParameterPool_exposer.def( 
                 "setMatchedParametersValue"
@@ -1558,7 +1751,7 @@ void register_classes_3(){
         }
         { //::ParameterPool::setParameterValue
         
-            typedef bool ( ::ParameterPool::*setParameterValue_function_type )( ::std::string,double ) ;
+            typedef bool ( ::ParameterPool::*setParameterValue_function_type )( ::std::string const &,double ) ;
             
             ParameterPool_exposer.def( 
                 "setParameterValue"
@@ -1626,8 +1819,8 @@ void register_classes_3(){
             , ( bp::arg("surface_density") ) )    
         .def( 
             "createParameterTree"
-            , (::ParameterPool * ( ::ISample::* )(  ) )(&::ISample::createParameterTree)
-            , (::ParameterPool * ( ParticleDecoration_wrapper::* )(  ) )(&ParticleDecoration_wrapper::default_createParameterTree)
+            , (::ParameterPool * ( ::ISample::* )(  ) const)(&::ISample::createParameterTree)
+            , (::ParameterPool * ( ParticleDecoration_wrapper::* )(  ) const)(&ParticleDecoration_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "walk_and_print"
diff --git a/Core/PythonAPI/src/PythonInterface_global_variables.cpp b/Core/PythonAPI/src/PythonInterface_global_variables.cpp
index 82c00be28f69cbe85127487db354378b174cd8d0..8f080a93f4a385161bd7211ded9fdb4d1b472073 100644
--- a/Core/PythonAPI/src/PythonInterface_global_variables.cpp
+++ b/Core/PythonAPI/src/PythonInterface_global_variables.cpp
@@ -45,6 +45,14 @@ namespace bp = boost::python;
 
 void register_global_variables(){
 
+    bp::scope().attr("PI") = Units::PI;
+
+    bp::scope().attr("PI2") = Units::PI2;
+
+    bp::scope().attr("PID2") = Units::PID2;
+
+    bp::scope().attr("PI_SQR") = Units::PI_SQR;
+
     bp::scope().attr("angstrom") = Units::angstrom;
 
     bp::scope().attr("deg") = Units::deg;
diff --git a/Core/Samples/inc/Crystal.h b/Core/Samples/inc/Crystal.h
index eff6b4e9889f2691852a9e073a8bfd92ffc1ad33..3c24c422c7285d7f6501f4f8288a66d0e45012f2 100644
--- a/Core/Samples/inc/Crystal.h
+++ b/Core/Samples/inc/Crystal.h
@@ -49,7 +49,8 @@ public:
 
     void setDWFactor(double dw_factor) { m_dw_factor = dw_factor; }
 
-     virtual std::vector<DiffuseParticleInfo *> *createDiffuseParticleInfo(const ParticleInfo &parent_info) const;
+    virtual std::vector<DiffuseParticleInfo *> *createDiffuseParticleInfo(
+            const ParticleInfo &parent_info) const;
 
 private:
     Lattice m_lattice;
diff --git a/Core/Samples/inc/DiffuseParticleInfo.h b/Core/Samples/inc/DiffuseParticleInfo.h
index 293753486424da243321e2e6a3432f9881422995..37c1b39720d90d24fdc39bbf1ffe287e66ec472a 100644
--- a/Core/Samples/inc/DiffuseParticleInfo.h
+++ b/Core/Samples/inc/DiffuseParticleInfo.h
@@ -33,8 +33,15 @@ public:
 
     //! get number of particles per containing mesocrystal
     double getNumberPerMeso() const { return m_number_per_meso; }
+
+    //! set the range of height
+    void setHeightRange(double height_range) { m_height_range = height_range; }
+
+    //! get the range of height
+    double getHeightRange() const { return m_height_range; }
 protected:
     double m_number_per_meso;
+    double m_height_range;
 
 };
 
diff --git a/Core/Samples/inc/LatticeBasis.h b/Core/Samples/inc/LatticeBasis.h
index b1cb65947e8d5aa4fd7bb1dd50882b76b1043503..e8e5965c6d13dc40181a4cb05da2753b51d15cc9 100644
--- a/Core/Samples/inc/LatticeBasis.h
+++ b/Core/Samples/inc/LatticeBasis.h
@@ -37,7 +37,7 @@ public:
     size_t getNbrParticles() const {return m_particles.size(); }
 
     //! return number of positions for particle with index
-    size_t getNbrPositionsForParticle(size_t index) { return m_positions_vector[check_index(index)].size(); }
+    size_t getNbrPositionsForParticle(size_t index) const { return m_positions_vector[check_index(index)].size(); }
 
     //! return position of element with given index
 //    kvector_t getPosition(size_t index) const { return m_positions[check_index(index)]; }
@@ -47,6 +47,9 @@ public:
 
     std::vector<kvector_t> getParticlePositions(size_t index) const { return m_positions_vector[check_index(index)]; }
 
+    //! create vector of size/shape distributed particles corresponding to the particle with index i
+    std::vector<DiffuseParticleInfo *> createDiffuseParticleInfos() const;
+
 private:
     //! check index
     inline size_t check_index(size_t index) const { return index < m_positions_vector.size() ? index : throw OutOfBoundsException("LatticeBasis::check_index() -> Index is out of bounds"); }
diff --git a/Core/Samples/inc/Particle.h b/Core/Samples/inc/Particle.h
index 3f4c612bde019fda7acd7c9e2b1aa59a2ab13f2f..a6d7d5e1bd2466fd3855a849b00c458d12fd9f87 100644
--- a/Core/Samples/inc/Particle.h
+++ b/Core/Samples/inc/Particle.h
@@ -57,7 +57,7 @@ public:
             registerChild(mp_form_factor);
         }
     }
-    
+
     //! return refractive index of the particle
     virtual const complex_t getRefractiveIndex() const {
         return m_refractive_index;
@@ -72,6 +72,10 @@ public:
         return 0;
     }
 
+    virtual bool hasDistributedFormFactor() const { return mp_form_factor->isDistributedFormFactor(); }
+
+    virtual std::vector<ParticleInfo *> createDistributedParticles(size_t samples_per_particle, double factor) const;
+
 protected:
     complex_t m_ambient_refractive_index;
     complex_t m_refractive_index;
diff --git a/Core/Samples/inc/ParticleInfo.h b/Core/Samples/inc/ParticleInfo.h
index ce7f0dfebcea9e96b6384486d988903b56988add..d653cb344685cf8cbc35175482e3422b1986b234 100644
--- a/Core/Samples/inc/ParticleInfo.h
+++ b/Core/Samples/inc/ParticleInfo.h
@@ -37,14 +37,26 @@ public:
     const Particle *getParticle() const { return mp_particle; }
 
     //! return particle transformation
-    const Geometry::Transform3D *getTransform3D() const { return m_transform; }
+    const Geometry::Transform3D *getTransform3D() const { return mp_transform; }
+
+    //! set particle transformation
+    void setTransform(const Geometry::Transform3D &transform) {
+        delete mp_transform;
+        mp_transform = new Geometry::Transform3D(transform);
+    }
 
     //! return particle depth
     double getDepth() const { return m_depth;}
 
+    //! set particle depth
+    void setDepth(double depth) { m_depth = depth; }
+
     //! return particle abundance
     double getAbundance() const { return m_abundance; }
 
+    //! set particle abundance
+    void setAbundance(double abundance) { m_abundance = abundance; }
+
 protected:
     ParticleInfo &operator=(const ParticleInfo &right);
     ParticleInfo(const ParticleInfo &source);
@@ -53,7 +65,7 @@ protected:
     virtual void init_parameters();
 
     Particle *mp_particle;
-    Geometry::Transform3D *m_transform;
+    Geometry::Transform3D *mp_transform;
     double m_depth;
     double m_abundance;
 };
diff --git a/Core/Samples/src/Crystal.cpp b/Core/Samples/src/Crystal.cpp
index a6cc7f0871168857c90443624b220172527e4cfa..c839b55cf168ef8ace676c92d64eb81f6cfb4c82 100644
--- a/Core/Samples/src/Crystal.cpp
+++ b/Core/Samples/src/Crystal.cpp
@@ -42,57 +42,29 @@ IFormFactor* Crystal::createTotalFormFactor(
 std::vector<DiffuseParticleInfo*>* Crystal::createDiffuseParticleInfo(
         const ParticleInfo& parent_info) const
 {
+    std::vector<DiffuseParticleInfo *> *p_result = new std::vector<DiffuseParticleInfo *>(
+            mp_lattice_basis->createDiffuseParticleInfos());
+    if (p_result->size()==0) {
+        return p_result;
+    }
     double primitive_cell_volume = m_lattice.getVolume();
     double parent_volume = parent_info.getParticle()->getSimpleFormFactor()->getVolume();
+    double parent_height = parent_info.getParticle()->getSimpleFormFactor()->getHeight();
+    double parent_depth = parent_info.getDepth();
+
+    Geometry::Transform3D *p_new_transform(0);
     const Geometry::Transform3D *p_parent_transform = parent_info.getTransform3D();
-    double depth = parent_info.getDepth();
-    double weight = parent_info.getAbundance();
-    double np_density = 3.0*parent_volume/primitive_cell_volume;
-    //TODO: refine this method; current implementation only serves as a test
-    double height = 0.5*Units::micrometer;
-    size_t nbr_heights = 251;
-    double mean_radius = 4.2*Units::nanometer;
-    double sigma = 0.2*Units::nanometer;
-    size_t nbr_radii = 7;
-    complex_t n_particle(0.999966, 5.62664e-7);
-    std::vector<DiffuseParticleInfo *> *p_infos = new std::vector<DiffuseParticleInfo *>();
-    double total_prob = 0.0;
-    for (size_t i=0; i<nbr_radii; ++i) {
-        double radius = (mean_radius-1.5*sigma) + 3.0*sigma/(nbr_radii-1);
-        total_prob += MathFunctions::Gaussian(radius, mean_radius, sigma);
-    }
-    total_prob *= nbr_heights;
-    for (size_t i=0; i<nbr_radii; ++i) {
-        double radius;
-        if (nbr_radii<2) {
-            radius = mean_radius;
-        }
-        else {
-            radius = (mean_radius-2.0*sigma) + 4.0*sigma*i/(nbr_radii-1);
-        }
-        double particle_weight = weight*MathFunctions::Gaussian(radius, mean_radius, sigma)/total_prob;
-        Particle particle(n_particle, new FormFactorFullSphere(radius));
-        DiffuseParticleInfo *p_new_np_info;
-        if (nbr_heights<2) {
-            Geometry::Transform3D *p_new_transform(0);
-            if(p_parent_transform) p_new_transform = new Geometry::Transform3D(*p_parent_transform);
-            p_new_np_info = new DiffuseParticleInfo(particle.clone(),
-                    p_new_transform, 5.0*Units::nanometer, particle_weight);
-            p_new_np_info->setNumberPerMeso(np_density*particle_weight);
-            p_infos->push_back(p_new_np_info);
-        }
-        else {
-            for (size_t j=0; j<nbr_heights; ++j) {
-//                double particle_depth = depth - height*MathFunctions::GenerateUniformRandom();
-                double particle_depth = depth - j*height/(nbr_heights-1);
-                Geometry::Transform3D *p_new_transform(0);
-                if(p_parent_transform) p_new_transform = new Geometry::Transform3D(*p_parent_transform);
-                p_new_np_info = new DiffuseParticleInfo(particle.clone(),
-                                    p_new_transform, particle_depth, particle_weight);
-                p_new_np_info->setNumberPerMeso(np_density*particle_weight);
-                p_infos->push_back(p_new_np_info);
-            }
-        }
+    if(p_parent_transform) p_new_transform = new Geometry::Transform3D(*p_parent_transform);
+
+    double nbr_unit_cells = parent_volume/primitive_cell_volume;
+
+    for (size_t i=0; i<p_result->size(); ++i) {
+        DiffuseParticleInfo *p_info = (*p_result)[i];
+        p_info->setTransform(*p_parent_transform);
+        p_info->setDepth(parent_depth);
+        p_info->setNumberPerMeso(nbr_unit_cells*p_info->getNumberPerMeso());
+        p_info->setHeightRange(parent_height);
     }
-    return p_infos;
+
+    return p_result;
 }
diff --git a/Core/Samples/src/LatticeBasis.cpp b/Core/Samples/src/LatticeBasis.cpp
index 1af813adc3f99ce73e558274aaa3ad66b4d24a23..58a51b4fc341965bd040a1c95e1f1d61f761dfbb 100644
--- a/Core/Samples/src/LatticeBasis.cpp
+++ b/Core/Samples/src/LatticeBasis.cpp
@@ -1,6 +1,7 @@
 #include "LatticeBasis.h"
 #include "FormFactorWeighted.h"
 #include "FormFactorDecoratorMultiPositionFactor.h"
+#include "DiffuseParticleInfo.h"
 
 LatticeBasis::LatticeBasis()
 : Particle(complex_t(1.0, 0.0))
@@ -61,7 +62,6 @@ void LatticeBasis::setAmbientRefractiveIndex(complex_t refractive_index)
 
 IFormFactor* LatticeBasis::createFormFactor() const
 {
-    // TODO: for equal particles, create position superposition times the formfactor
     FormFactorWeighted *p_ff = new FormFactorWeighted();
     for (size_t index=0; index<m_particles.size(); ++index) {
         IFormFactor *p_particle_ff = m_particles[index]->createFormFactor();
@@ -72,3 +72,18 @@ IFormFactor* LatticeBasis::createFormFactor() const
     p_ff->setAmbientRefractiveIndex(m_ambient_refractive_index);
     return p_ff;
 }
+
+std::vector<DiffuseParticleInfo *> LatticeBasis::createDiffuseParticleInfos() const
+{
+    std::vector<DiffuseParticleInfo *> result;
+    for (size_t index=0; index<getNbrParticles(); ++index) {
+        const Particle *p_particle = getParticle(index);
+        if (p_particle->hasDistributedFormFactor()) {
+            DiffuseParticleInfo *p_new_info = new DiffuseParticleInfo(
+                    p_particle->clone());
+            p_new_info->setNumberPerMeso((double)getNbrPositionsForParticle(index));
+            result.push_back(p_new_info);
+        }
+    }
+    return result;
+}
diff --git a/Core/Samples/src/LayerDecorator.cpp b/Core/Samples/src/LayerDecorator.cpp
index 18496d8f29b06f0a51a51cce35031fa6b4e06e41..462a8abd65429c7bd9d97ea253656379b6acaf79 100644
--- a/Core/Samples/src/LayerDecorator.cpp
+++ b/Core/Samples/src/LayerDecorator.cpp
@@ -32,27 +32,24 @@ DiffuseDWBASimulation* LayerDecorator::createDiffuseDWBASimulation() const
 {
     DiffuseDWBASimulation *p_sim = new DiffuseDWBASimulation;
     size_t nbr_particles = mp_decoration->getNumberOfParticles();
-    double meso_density = mp_decoration->getTotalParticleSurfaceDensity();
-    double nps_per_meso = 0.0;
-    double total_abundance = 0.0;
+    double particle_density = mp_decoration->getTotalParticleSurfaceDensity();
     for (size_t i=0; i<nbr_particles; ++i) {
         const ParticleInfo *p_info = mp_decoration->getParticleInfo(i);
         std::vector<DiffuseParticleInfo *> *p_diffuse_nps =
                 p_info->getParticle()->createDiffuseParticleInfo(*p_info);
         if (p_diffuse_nps) {
             for (size_t j=0; j<p_diffuse_nps->size(); ++j) {
+                DiffuseParticleInfo *p_diff_info = (*p_diffuse_nps)[j];
+                p_diff_info->setNumberPerMeso(particle_density*p_info->getAbundance()
+                        *p_diff_info->getNumberPerMeso());
                 p_sim->addParticleInfo((*p_diffuse_nps)[j]);
-                nps_per_meso += (*p_diffuse_nps)[j]->getNumberPerMeso();
             }
-            total_abundance += p_info->getAbundance();
             delete p_diffuse_nps;
-            break; // TODO: remove this (temporarely to increase speed)
+            break; // TODO: remove this break (this necessitates the creation of a phi-averaged mesocrystal class generating only one nanoparticle for diffuse calculations)
         }
     }
     if (p_sim->getSize()>0) {
         p_sim->setRefractiveIndex(getRefractiveIndex());
-        p_sim->setSurfaceDensity(meso_density*nps_per_meso);
-        p_sim->rescaleAbundances(1.0/total_abundance);
         return p_sim;
     }
     delete p_sim;
diff --git a/Core/Samples/src/Particle.cpp b/Core/Samples/src/Particle.cpp
index 3401ae4652950f6ac052c215f3bd25f6008411bf..211ca42024b2afb00d1bc24f3061e13055caacc2 100644
--- a/Core/Samples/src/Particle.cpp
+++ b/Core/Samples/src/Particle.cpp
@@ -1,4 +1,5 @@
 #include "Particle.h"
+#include "ParticleInfo.h"
 
 Particle::Particle(complex_t refractive_index, IFormFactor *p_form_factor)
 : m_ambient_refractive_index(complex_t(1.0, 0.0))
@@ -31,3 +32,23 @@ Particle* Particle::clone() const
     p_new->setAmbientRefractiveIndex(m_ambient_refractive_index);
     return p_new;
 }
+
+std::vector<ParticleInfo*> Particle::createDistributedParticles(
+        size_t samples_per_particle, double factor) const
+{
+    std::vector<ParticleInfo*> result;
+    if (mp_form_factor->isDistributedFormFactor()) {
+        std::vector<IFormFactor *> form_factors;
+        std::vector<double> probabilities;
+        mp_form_factor->createDistributedFormFactors(form_factors, probabilities, samples_per_particle);
+        if (form_factors.size() > 0 && form_factors.size()==probabilities.size()) {
+            for (size_t i=0; i<form_factors.size(); ++i) {
+                Particle *new_particle = clone();
+                new_particle->setSimpleFormFactor(form_factors[i]);
+                ParticleInfo *p_info = new ParticleInfo(new_particle, 0, 0, probabilities[i]*factor);
+                result.push_back(p_info);
+            }
+        }
+    }
+    return result;
+}
diff --git a/Core/Samples/src/ParticleInfo.cpp b/Core/Samples/src/ParticleInfo.cpp
index f35e95463aab22004e559663108aa8f6241eab83..f36b30300767edda8f7c39269f733e82358df9d0 100644
--- a/Core/Samples/src/ParticleInfo.cpp
+++ b/Core/Samples/src/ParticleInfo.cpp
@@ -4,7 +4,7 @@
 
 ParticleInfo::ParticleInfo(Particle* p_particle, Geometry::Transform3D *transform, double depth, double abundance)
 : mp_particle(p_particle)
-, m_transform(transform)
+, mp_transform(transform)
 , m_depth(depth)
 , m_abundance(abundance)
 {
@@ -17,7 +17,7 @@ ParticleInfo::ParticleInfo(Particle* p_particle, Geometry::Transform3D *transfor
 ParticleInfo::~ParticleInfo()
 {
     delete mp_particle;
-    delete m_transform;
+    delete mp_transform;
 }
 
 
@@ -35,6 +35,6 @@ void ParticleInfo::init_parameters()
 ParticleInfo *ParticleInfo::clone() const
 {
     Geometry::Transform3D *transform(0);
-    if(m_transform) transform = new Geometry::Transform3D(*m_transform);
+    if(mp_transform) transform = new Geometry::Transform3D(*mp_transform);
     return new ParticleInfo(mp_particle->clone(), transform, m_depth, m_abundance);
 }