diff --git a/Core/Computation/DWBASingleComputation.cpp b/Core/Computation/DWBASingleComputation.cpp
index 219b8c26ef26b3bfcd67ea62422b68cacd1a74c4..4b64c8f859e3324d1403cbb0b13e4a635df1300b 100644
--- a/Core/Computation/DWBASingleComputation.cpp
+++ b/Core/Computation/DWBASingleComputation.cpp
@@ -20,7 +20,7 @@
 #include "Core/Computation/RoughMultiLayerComputation.h"
 #include "Resample/Processed/ProcessedLayout.h"
 #include "Resample/Processed/ProcessedSample.h"
-#include "Sample/RT/SimulationOptions.h"
+#include "Resample/Options/SimulationOptions.h"
 
 DWBASingleComputation::DWBASingleComputation(const ProcessedSample& sample,
                                              const SimulationOptions& options, bool forcePolarized)
diff --git a/Core/Computation/GISASSpecularComputation.cpp b/Core/Computation/GISASSpecularComputation.cpp
index 52f97d537d2784011c35d3d89572aa8971bfbefa..be82f4fe5481db8e87183da332b0d2af791b7aa3 100644
--- a/Core/Computation/GISASSpecularComputation.cpp
+++ b/Core/Computation/GISASSpecularComputation.cpp
@@ -15,7 +15,7 @@
 #include "Core/Computation/GISASSpecularComputation.h"
 #include "Base/Pixel/SimulationElement.h"
 #include "Resample/Fresnel/IFresnelMap.h"
-#include "Sample/RT/ILayerRTCoefficients.h"
+#include "Resample/RT/ILayerRTCoefficients.h"
 
 GISASSpecularComputation::GISASSpecularComputation(const IFresnelMap* p_fresnel_map)
     : m_fresnel_map{p_fresnel_map}
diff --git a/Core/Computation/IComputation.h b/Core/Computation/IComputation.h
index 16dacf146479b373d7994b70e4cb0e097c3fcfca..7ce5993ab9754a4a757a4debecc81cebebdaecb9 100644
--- a/Core/Computation/IComputation.h
+++ b/Core/Computation/IComputation.h
@@ -21,7 +21,7 @@
 #define BORNAGAIN_CORE_COMPUTATION_ICOMPUTATION_H
 
 #include "Core/Computation/ComputationStatus.h"
-#include "Sample/RT/SimulationOptions.h"
+#include "Resample/Options/SimulationOptions.h"
 #include <memory>
 #include <vector>
 
diff --git a/Core/Computation/RoughMultiLayerComputation.cpp b/Core/Computation/RoughMultiLayerComputation.cpp
index 86546ed2379145c3758126d150f1e415d1f05c32..a94b53c5e955fad37b40e3ea4af3753a7e154251 100644
--- a/Core/Computation/RoughMultiLayerComputation.cpp
+++ b/Core/Computation/RoughMultiLayerComputation.cpp
@@ -23,7 +23,7 @@
 #include "Sample/Interface/LayerRoughness.h"
 #include "Sample/Multilayer/Layer.h"
 #include "Sample/Multilayer/MultiLayer.h"
-#include "Sample/RT/ILayerRTCoefficients.h"
+#include "Resample/RT/ILayerRTCoefficients.h"
 
 #include <cerfcpp.h>
 
diff --git a/Core/Simulation/DepthProbeSimulation.h b/Core/Simulation/DepthProbeSimulation.h
index c1ce4a43a66bfcb4d2791d35c249c002a52870e1..db9648bc0ecaa9472468c5f3cc14151393de593c 100644
--- a/Core/Simulation/DepthProbeSimulation.h
+++ b/Core/Simulation/DepthProbeSimulation.h
@@ -17,7 +17,7 @@
 
 #include "Core/Element/DepthProbeElement.h"
 #include "Core/Simulation/ISimulation.h"
-#include "Sample/RT/ILayerRTCoefficients.h"
+#include "Resample/RT/ILayerRTCoefficients.h"
 
 #include <vector>
 
diff --git a/Core/Simulation/ISimulation.h b/Core/Simulation/ISimulation.h
index 5165d31cfe8ed5671291f4f4365042d56808da3e..749e42ac11a57f8d9346330c23cff21d4835ce6a 100644
--- a/Core/Simulation/ISimulation.h
+++ b/Core/Simulation/ISimulation.h
@@ -21,7 +21,7 @@
 #include "Device/Histo/SimulationResult.h"
 #include "Device/Instrument/Instrument.h"
 #include "Param/Distrib/DistributionHandler.h"
-#include "Sample/RT/SimulationOptions.h"
+#include "Resample/Options/SimulationOptions.h"
 #include "Sample/SampleBuilderEngine/SampleProvider.h"
 
 template <class T> class OutputData;
diff --git a/Core/Swig/MultiLayerFuncs.cpp b/Core/Swig/MultiLayerFuncs.cpp
index dee72a4fa61da8c6a59e27afd97a89918cb3842b..9caeb1ceb99bab99fb59c0176efaa69b2be6600c 100644
--- a/Core/Swig/MultiLayerFuncs.cpp
+++ b/Core/Swig/MultiLayerFuncs.cpp
@@ -15,7 +15,7 @@
 #include "Core/Swig/MultiLayerFuncs.h"
 #include "Resample/Processed/ProcessedSample.h"
 #include "Resample/Processed/ProfileHelper.h"
-#include "Sample/RT/SimulationOptions.h"
+#include "Resample/Options/SimulationOptions.h"
 
 std::vector<double> swigAPI::generateZValues(int n_points, double z_min, double z_max)
 {
diff --git a/Core/Term/DepthProbeComputationTerm.cpp b/Core/Term/DepthProbeComputationTerm.cpp
index cef49db7697bede7e7d94e85f51eee33678cb09b..50d10acb91231db8364e5cc49c6879dc1221e9de 100644
--- a/Core/Term/DepthProbeComputationTerm.cpp
+++ b/Core/Term/DepthProbeComputationTerm.cpp
@@ -18,7 +18,7 @@
 #include "Core/Element/DepthProbeElement.h"
 #include "Resample/Fresnel/IFresnelMap.h"
 #include "Resample/Processed/ProcessedSample.h"
-#include "Sample/RT/ILayerRTCoefficients.h"
+#include "Resample/RT/ILayerRTCoefficients.h"
 
 DepthProbeComputationTerm::DepthProbeComputationTerm(const ProcessedSample* p_sample)
     : m_sample{p_sample}
diff --git a/Core/Term/SpecularComputationTerm.cpp b/Core/Term/SpecularComputationTerm.cpp
index 927ed1cabde6704e0cb6617a4e6dc2b39f879134..4c7b9b9ad4beb8b6838795aa031ca856004db323 100644
--- a/Core/Term/SpecularComputationTerm.cpp
+++ b/Core/Term/SpecularComputationTerm.cpp
@@ -16,7 +16,7 @@
 #include "Base/Progress/DelayedProgressCounter.h"
 #include "Core/Element/SpecularSimulationElement.h"
 #include "Resample/Specular/SpecularStrategyBuilder.h"
-#include "Sample/RT/ILayerRTCoefficients.h"
+#include "Resample/RT/ILayerRTCoefficients.h"
 
 //  ************************************************************************************************
 //  class SpecularComputationTerm
diff --git a/Resample/Coherence/FFTerm.cpp b/Resample/Coherence/FFTerm.cpp
index 23f8109b5c3f0641d4b104bbdb7b4adcde91edcb..9cf91122cfee052454dfd43243817fa51ee77eb3 100644
--- a/Resample/Coherence/FFTerm.cpp
+++ b/Resample/Coherence/FFTerm.cpp
@@ -18,7 +18,7 @@
 #include "Resample/FFCompute/IComputeFF.h"
 #include "Resample/Fresnel/IFresnelMap.h"
 #include "Sample/Material/WavevectorInfo.h"
-#include "Sample/RT/ILayerRTCoefficients.h"
+#include "Resample/RT/ILayerRTCoefficients.h"
 
 FormFactorCoherentPart::FormFactorCoherentPart(IComputeFF* ff, size_t layer_index)
     : m_ff(ff), m_layer_index(layer_index)
diff --git a/Resample/FFCompute/ComputeDWBA.cpp b/Resample/FFCompute/ComputeDWBA.cpp
index b49b06589aaef9011ee74ccc715a75fa95db02e5..6be05d7e37ffa14f7b8f93b66865bbd35975443c 100644
--- a/Resample/FFCompute/ComputeDWBA.cpp
+++ b/Resample/FFCompute/ComputeDWBA.cpp
@@ -14,7 +14,7 @@
 
 #include "Resample/FFCompute/ComputeDWBA.h"
 #include "Sample/Material/WavevectorInfo.h"
-#include "Sample/RT/ILayerRTCoefficients.h"
+#include "Resample/RT/ILayerRTCoefficients.h"
 #include "Sample/Scattering/IFormFactor.h"
 
 ComputeDWBA::ComputeDWBA(const IFormFactor& ff) : IComputeFF(ff) {}
diff --git a/Resample/FFCompute/ComputeDWBAPol.cpp b/Resample/FFCompute/ComputeDWBAPol.cpp
index 13010a69a858e3fa83e84b76d756a1b2beb45357..42e82b518dcd7b9aca311eb6c1756a768cf0717c 100644
--- a/Resample/FFCompute/ComputeDWBAPol.cpp
+++ b/Resample/FFCompute/ComputeDWBAPol.cpp
@@ -14,7 +14,7 @@
 
 #include "Resample/FFCompute/ComputeDWBAPol.h"
 #include "Sample/Material/WavevectorInfo.h"
-#include "Sample/RT/ILayerRTCoefficients.h"
+#include "Resample/RT/ILayerRTCoefficients.h"
 #include "Sample/Scattering/IFormFactor.h"
 
 namespace {
diff --git a/Resample/FFCompute/IComputeFF.cpp b/Resample/FFCompute/IComputeFF.cpp
index 6ab51d81eb3bb64ae0a3a70fdd1a5f226d12ed91..5b67b05ff35521915bb0c16f3bfdede33efbc882 100644
--- a/Resample/FFCompute/IComputeFF.cpp
+++ b/Resample/FFCompute/IComputeFF.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Resample/FFCompute/IComputeFF.h"
-#include "Sample/RT/ILayerRTCoefficients.h" // required by VS19 compiler
+#include "Resample/RT/ILayerRTCoefficients.h" // required by VS19 compiler
 #include "Sample/Scattering/IFormFactor.h"
 #include <stdexcept>
 
diff --git a/Resample/Fresnel/MatrixFresnelMap.cpp b/Resample/Fresnel/MatrixFresnelMap.cpp
index d11fdf4dbb1d9ac62ed882c0763f3e5fa76aebfe..9feefe901fa0471bb2e280dd70ac1246e7cc6a08 100644
--- a/Resample/Fresnel/MatrixFresnelMap.cpp
+++ b/Resample/Fresnel/MatrixFresnelMap.cpp
@@ -16,7 +16,7 @@
 #include "Base/Pixel/SimulationElement.h"
 #include "Resample/Slice/Slice.h"
 #include "Resample/Slice/SliceStack.h"
-#include "Sample/RT/ILayerRTCoefficients.h"
+#include "Resample/RT/ILayerRTCoefficients.h"
 
 MatrixFresnelMap::MatrixFresnelMap(const SliceStack& stack,
                                    std::unique_ptr<ISpecularStrategy>&& strategy, bool useCache)
diff --git a/Resample/Fresnel/ScalarFresnelMap.cpp b/Resample/Fresnel/ScalarFresnelMap.cpp
index a54dc19fdc9065a4939e680ae6aa4d0717a88363..34ecfd6b9880a3398010c7b69426b87b192fe27b 100644
--- a/Resample/Fresnel/ScalarFresnelMap.cpp
+++ b/Resample/Fresnel/ScalarFresnelMap.cpp
@@ -14,7 +14,7 @@
 
 #include "Resample/Fresnel/ScalarFresnelMap.h"
 #include "Base/Pixel/SimulationElement.h"
-#include "Sample/RT/ILayerRTCoefficients.h"
+#include "Resample/RT/ILayerRTCoefficients.h"
 
 ScalarFresnelMap::ScalarFresnelMap(const SliceStack& stack,
                                    std::unique_ptr<ISpecularStrategy>&& strategy, bool useCache)
diff --git a/Resample/Interference/IInterferenceFunctionStrategy.h b/Resample/Interference/IInterferenceFunctionStrategy.h
index 93116b7c6e90fb98afbe0f7467e660d2558178b0..b36824a3416a349d11fa824dfa872ddd7369a364 100644
--- a/Resample/Interference/IInterferenceFunctionStrategy.h
+++ b/Resample/Interference/IInterferenceFunctionStrategy.h
@@ -21,7 +21,7 @@
 #define BORNAGAIN_RESAMPLE_INTERFERENCE_IINTERFERENCEFUNCTIONSTRATEGY_H
 
 #include "Base/Types/Complex.h"
-#include "Sample/RT/SimulationOptions.h"
+#include "Resample/Options/SimulationOptions.h"
 #include <memory>
 #include <vector>
 
diff --git a/Sample/RT/SimulationOptions.cpp b/Resample/Options/SimulationOptions.cpp
similarity index 96%
rename from Sample/RT/SimulationOptions.cpp
rename to Resample/Options/SimulationOptions.cpp
index 54ef41cb5cd5d56a7dce1b1a09a3d7ee9607ce1f..d76957a8c39fa5c343c7140f67b08a2c8b37a929 100644
--- a/Sample/RT/SimulationOptions.cpp
+++ b/Resample/Options/SimulationOptions.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Sample/RT/SimulationOptions.cpp
+//! @file      Resample/Options/SimulationOptions.cpp
 //! @brief     Implements class SimulationOptions
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 //  ************************************************************************************************
 
-#include "Sample/RT/SimulationOptions.h"
+#include "Resample/Options/SimulationOptions.h"
 #include <stdexcept>
 #include <thread>
 
diff --git a/Sample/RT/SimulationOptions.h b/Resample/Options/SimulationOptions.h
similarity index 91%
rename from Sample/RT/SimulationOptions.h
rename to Resample/Options/SimulationOptions.h
index 79e619fd2431250a25ec4feadfaa4403e8b0e49c..587ee4e3a78dcded6c00930d6183b75f6109d901 100644
--- a/Sample/RT/SimulationOptions.h
+++ b/Resample/Options/SimulationOptions.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Sample/RT/SimulationOptions.h
+//! @file      Resample/Options/SimulationOptions.h
 //! @brief     Defines class SimulationOptions.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,8 +12,8 @@
 //
 //  ************************************************************************************************
 
-#ifndef BORNAGAIN_SAMPLE_RT_SIMULATIONOPTIONS_H
-#define BORNAGAIN_SAMPLE_RT_SIMULATIONOPTIONS_H
+#ifndef BORNAGAIN_RESAMPLE_OPTIONS_SIMULATIONOPTIONS_H
+#define BORNAGAIN_RESAMPLE_OPTIONS_SIMULATIONOPTIONS_H
 
 #include "Base/Utils/ThreadInfo.h"
 #include <cstddef>
@@ -70,4 +70,4 @@ private:
     ThreadInfo m_thread_info;
 };
 
-#endif // BORNAGAIN_SAMPLE_RT_SIMULATIONOPTIONS_H
+#endif // BORNAGAIN_RESAMPLE_OPTIONS_SIMULATIONOPTIONS_H
diff --git a/Resample/Processed/ProcessedSample.cpp b/Resample/Processed/ProcessedSample.cpp
index 7fd0aa1f1bb0c292aa51c41cd5a6c3a8da5ea3ef..9e674b1a682e5d054acd4401b4310e31251cba6c 100644
--- a/Resample/Processed/ProcessedSample.cpp
+++ b/Resample/Processed/ProcessedSample.cpp
@@ -27,7 +27,7 @@
 #include "Sample/Multilayer/Layer.h"
 #include "Sample/Multilayer/MultiLayer.h"
 #include "Sample/Multilayer/MultilayerUtils.h"
-#include "Sample/RT/SimulationOptions.h"
+#include "Resample/Options/SimulationOptions.h"
 #include "Sample/Scattering/ZLimits.h"
 
 namespace {
diff --git a/Sample/RT/ILayerRTCoefficients.h b/Resample/RT/ILayerRTCoefficients.h
similarity index 92%
rename from Sample/RT/ILayerRTCoefficients.h
rename to Resample/RT/ILayerRTCoefficients.h
index 1fa241a2ef88914aab22709eaa26fef51141aeaa..7b0f0311418e2687bfb5ff1a8a7220f426c1e2a2 100644
--- a/Sample/RT/ILayerRTCoefficients.h
+++ b/Resample/RT/ILayerRTCoefficients.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Sample/RT/ILayerRTCoefficients.h
+//! @file      Resample/RT/ILayerRTCoefficients.h
 //! @brief     Defines and implements class ILayerRTCoefficients.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -17,8 +17,8 @@
 #endif
 
 #ifndef USER_API
-#ifndef BORNAGAIN_SAMPLE_RT_ILAYERRTCOEFFICIENTS_H
-#define BORNAGAIN_SAMPLE_RT_ILAYERRTCOEFFICIENTS_H
+#ifndef BORNAGAIN_RESAMPLE_RT_ILAYERRTCOEFFICIENTS_H
+#define BORNAGAIN_RESAMPLE_RT_ILAYERRTCOEFFICIENTS_H
 
 #include "Base/Types/Complex.h"
 #include "Base/Vector/EigenCore.h"
@@ -69,5 +69,5 @@ public:
     }
 };
 
-#endif // BORNAGAIN_SAMPLE_RT_ILAYERRTCOEFFICIENTS_H
+#endif // BORNAGAIN_RESAMPLE_RT_ILAYERRTCOEFFICIENTS_H
 #endif // USER_API
diff --git a/Sample/RT/MatrixRTCoefficients.cpp b/Resample/RT/MatrixRTCoefficients.cpp
similarity index 98%
rename from Sample/RT/MatrixRTCoefficients.cpp
rename to Resample/RT/MatrixRTCoefficients.cpp
index c2f93938c559c98225c7be42451416e612e8c022..6513a61bf002e1dce8c26e7ffc9fa88545e2f206 100644
--- a/Sample/RT/MatrixRTCoefficients.cpp
+++ b/Resample/RT/MatrixRTCoefficients.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file     Sample/RT/MatrixRTCoefficients.cpp
+//! @file     Resample/RT/MatrixRTCoefficients.cpp
 //! @brief    Implements class MatrixRTCoefficients.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 //  ************************************************************************************************
 
-#include "Sample/RT/MatrixRTCoefficients.h"
+#include "Resample/RT/MatrixRTCoefficients.h"
 #include "Base/Utils/Assert.h"
 
 namespace {
diff --git a/Sample/RT/MatrixRTCoefficients.h b/Resample/RT/MatrixRTCoefficients.h
similarity index 92%
rename from Sample/RT/MatrixRTCoefficients.h
rename to Resample/RT/MatrixRTCoefficients.h
index ab3743ff0c7b66e10288b1d63e374cdeb6dd8173..d8e6a9bc970b760934c9ccc31e7b7b5ca8dc7030 100644
--- a/Sample/RT/MatrixRTCoefficients.h
+++ b/Resample/RT/MatrixRTCoefficients.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file     Sample/RT/MatrixRTCoefficients.h
+//! @file     Resample/RT/MatrixRTCoefficients.h
 //! @brief    Defines class MatrixRTCoefficients.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -17,11 +17,11 @@
 #endif
 
 #ifndef USER_API
-#ifndef BORNAGAIN_SAMPLE_RT_MATRIXRTCOEFFICIENTS_H
-#define BORNAGAIN_SAMPLE_RT_MATRIXRTCOEFFICIENTS_H
+#ifndef BORNAGAIN_RESAMPLE_RT_MATRIXRTCOEFFICIENTS_H
+#define BORNAGAIN_RESAMPLE_RT_MATRIXRTCOEFFICIENTS_H
 
 #include "Base/Vector/Vectors3D.h"
-#include "Sample/RT/ILayerRTCoefficients.h"
+#include "Resample/RT/ILayerRTCoefficients.h"
 #include <vector>
 
 //! Specular reflection and transmission coefficients in a layer in case
@@ -80,5 +80,5 @@ private:
     Eigen::Matrix2cd pMatrixHelper(double sign) const;
 };
 
-#endif // BORNAGAIN_SAMPLE_RT_MATRIXRTCOEFFICIENTS_H
+#endif // BORNAGAIN_RESAMPLE_RT_MATRIXRTCOEFFICIENTS_H
 #endif // USER_API
diff --git a/Sample/RT/ScalarRTCoefficients.h b/Resample/RT/ScalarRTCoefficients.h
similarity index 94%
rename from Sample/RT/ScalarRTCoefficients.h
rename to Resample/RT/ScalarRTCoefficients.h
index 72321b5525830bdc6feee27f070dfedbb1813388..89e367047e2f5510f61f34e9214caa9bf799784e 100644
--- a/Sample/RT/ScalarRTCoefficients.h
+++ b/Resample/RT/ScalarRTCoefficients.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Sample/RT/ScalarRTCoefficients.h
+//! @file      Resample/RT/ScalarRTCoefficients.h
 //! @brief     Defines class ScalarRTCoefficients.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -17,10 +17,10 @@
 #endif
 
 #ifndef USER_API
-#ifndef BORNAGAIN_SAMPLE_RT_SCALARRTCOEFFICIENTS_H
-#define BORNAGAIN_SAMPLE_RT_SCALARRTCOEFFICIENTS_H
+#ifndef BORNAGAIN_RESAMPLE_RT_SCALARRTCOEFFICIENTS_H
+#define BORNAGAIN_RESAMPLE_RT_SCALARRTCOEFFICIENTS_H
 
-#include "Sample/RT/ILayerRTCoefficients.h"
+#include "Resample/RT/ILayerRTCoefficients.h"
 
 //! Specular reflection and transmission coefficients in a layer in case
 //! of scalar interactions between the layers and the scattered particle.
@@ -145,5 +145,5 @@ inline complex_t ScalarRTCoefficients::getScalarT() const
     return t_r(0);
 }
 
-#endif // BORNAGAIN_SAMPLE_RT_SCALARRTCOEFFICIENTS_H
+#endif // BORNAGAIN_RESAMPLE_RT_SCALARRTCOEFFICIENTS_H
 #endif // USER_API
diff --git a/Resample/Specular/SpecularMagneticStrategy.h b/Resample/Specular/SpecularMagneticStrategy.h
index 26586b387efcb600b9b3011bde46503840d6a6b4..2d0ac2f1177bcd4c98db23fb2b5b0b491425a275 100644
--- a/Resample/Specular/SpecularMagneticStrategy.h
+++ b/Resample/Specular/SpecularMagneticStrategy.h
@@ -21,7 +21,7 @@
 #define BORNAGAIN_RESAMPLE_SPECULAR_SPECULARMAGNETICSTRATEGY_H
 
 #include "Resample/Slice/ISpecularStrategy.h"
-#include "Sample/RT/MatrixRTCoefficients.h"
+#include "Resample/RT/MatrixRTCoefficients.h"
 #include <memory>
 #include <vector>
 
diff --git a/Resample/Specular/SpecularScalarStrategy.h b/Resample/Specular/SpecularScalarStrategy.h
index d9f0557c17879a421598d4b77aa9730608e778cd..5be5d09b3162246aa6df0e30aaa5e1a2f7026c8b 100644
--- a/Resample/Specular/SpecularScalarStrategy.h
+++ b/Resample/Specular/SpecularScalarStrategy.h
@@ -21,7 +21,7 @@
 #define BORNAGAIN_RESAMPLE_SPECULAR_SPECULARSCALARSTRATEGY_H
 
 #include "Resample/Slice/ISpecularStrategy.h"
-#include "Sample/RT/ScalarRTCoefficients.h"
+#include "Resample/RT/ScalarRTCoefficients.h"
 #include <memory>
 #include <vector>
 
diff --git a/Tests/UnitTests/Core/Fresnel/KzComputationTest.cpp b/Tests/UnitTests/Core/Fresnel/KzComputationTest.cpp
index bfddeda621f00fd41f1dfdcf2036bba2b6542a95..513f1d96aeebef88b8f5929d68b1a39a2aa363bc 100644
--- a/Tests/UnitTests/Core/Fresnel/KzComputationTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/KzComputationTest.cpp
@@ -5,7 +5,7 @@
 #include "Sample/Material/MaterialFactoryFuncs.h"
 #include "Sample/Multilayer/Layer.h"
 #include "Sample/Multilayer/MultiLayer.h"
-#include "Sample/RT/SimulationOptions.h"
+#include "Resample/Options/SimulationOptions.h"
 #include "Sample/StandardSamples/PlainMultiLayerBySLDBuilder.h"
 #include "Tests/GTestWrapper/google_test.h"
 
diff --git a/Tests/UnitTests/Core/Fresnel/MatrixRTCoefficientsTest.cpp b/Tests/UnitTests/Core/Fresnel/MatrixRTCoefficientsTest.cpp
index 322012b4734c8b33ee749c5feebbe49a5139fa92..705fed2dc29a10f4d1d497ee8ceeed4df4cbadab 100644
--- a/Tests/UnitTests/Core/Fresnel/MatrixRTCoefficientsTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/MatrixRTCoefficientsTest.cpp
@@ -1,4 +1,4 @@
-#include "Sample/RT/MatrixRTCoefficients.h"
+#include "Resample/RT/MatrixRTCoefficients.h"
 #include "Tests/GTestWrapper/google_test.h"
 
 class MatrixRTCoefficientsTest : public ::testing::Test {
diff --git a/Tests/UnitTests/Core/Fresnel/ScalarRTCoefficientsTest.cpp b/Tests/UnitTests/Core/Fresnel/ScalarRTCoefficientsTest.cpp
index 5d56946770849bc4f33abb731e62eb569fd3a899..6ce773dfdfb61de8fce06db99900536118a930a6 100644
--- a/Tests/UnitTests/Core/Fresnel/ScalarRTCoefficientsTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/ScalarRTCoefficientsTest.cpp
@@ -1,4 +1,4 @@
-#include "Sample/RT/ScalarRTCoefficients.h"
+#include "Resample/RT/ScalarRTCoefficients.h"
 #include "Tests/GTestWrapper/google_test.h"
 
 class ScalarRTCoefficientsTest : public ::testing::Test {
diff --git a/Tests/UnitTests/Core/Fresnel/SpecularMagneticTest.cpp b/Tests/UnitTests/Core/Fresnel/SpecularMagneticTest.cpp
index 4458e798ba0964fa09810f83ae0164cfee4dfa26..1e7c350de17645281766874b439f71fecf63f9fe 100644
--- a/Tests/UnitTests/Core/Fresnel/SpecularMagneticTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/SpecularMagneticTest.cpp
@@ -7,7 +7,7 @@
 #include "Sample/Material/MaterialFactoryFuncs.h"
 #include "Sample/Multilayer/Layer.h"
 #include "Sample/Multilayer/MultiLayer.h"
-#include "Sample/RT/SimulationOptions.h"
+#include "Resample/Options/SimulationOptions.h"
 #include "Tests/GTestWrapper/google_test.h"
 #include <utility>
 
diff --git a/Tests/UnitTests/Core/Sample/MultilayerAveragingTest.cpp b/Tests/UnitTests/Core/Sample/MultilayerAveragingTest.cpp
index d7d4cb94d31cc44f3105cf02301fc3cdd6398680..68569634a2ee254b2e27c17e1d0f64359ec750bd 100644
--- a/Tests/UnitTests/Core/Sample/MultilayerAveragingTest.cpp
+++ b/Tests/UnitTests/Core/Sample/MultilayerAveragingTest.cpp
@@ -8,7 +8,7 @@
 #include "Sample/Multilayer/Layer.h"
 #include "Sample/Multilayer/MultiLayer.h"
 #include "Sample/Particle/Particle.h"
-#include "Sample/RT/SimulationOptions.h"
+#include "Resample/Options/SimulationOptions.h"
 #include "Tests/GTestWrapper/google_test.h"
 
 class MultilayerAveragingTest : public ::testing::Test {
diff --git a/Tests/UnitTests/Core/Sample/RTTest.cpp b/Tests/UnitTests/Core/Sample/RTTest.cpp
index 69cda8641b8c169ae11ca6998320a189f2249014..6827b5548a99cf629a4d897ec13e4279b2fd579f 100644
--- a/Tests/UnitTests/Core/Sample/RTTest.cpp
+++ b/Tests/UnitTests/Core/Sample/RTTest.cpp
@@ -7,7 +7,7 @@
 #include "Sample/Material/MaterialFactoryFuncs.h"
 #include "Sample/Multilayer/Layer.h"
 #include "Sample/Multilayer/MultiLayer.h"
-#include "Sample/RT/SimulationOptions.h"
+#include "Resample/Options/SimulationOptions.h"
 #include "Tests/GTestWrapper/google_test.h"
 
 class RTTest : public ::testing::Test {
diff --git a/Wrap/Swig/libBornAgainResample.i b/Wrap/Swig/libBornAgainResample.i
index d4a460ddf47d3fde1a8329deb2f393f063bf94b8..4736b26f7320e2f6b353c005b0b3da386ddefe21 100644
--- a/Wrap/Swig/libBornAgainResample.i
+++ b/Wrap/Swig/libBornAgainResample.i
@@ -20,3 +20,9 @@
 %include "commons.i"
 
 %include "../../auto/Wrap/doxygenResample.i"
+
+%{
+#include "Resample/Options/SimulationOptions.h"
+%}
+
+%include "Resample/Options/SimulationOptions.h"
diff --git a/Wrap/Swig/libBornAgainSample.i b/Wrap/Swig/libBornAgainSample.i
index 87c0c01e1b34831369c07cbaf84c469a04dfaa60..9fb33ff29946c047474f0775b3112516e399f9d1 100644
--- a/Wrap/Swig/libBornAgainSample.i
+++ b/Wrap/Swig/libBornAgainSample.i
@@ -92,7 +92,6 @@
 #include "Sample/Particle/ParticleComposition.h"
 #include "Sample/Particle/ParticleCoreShell.h"
 #include "Sample/Particle/SlicedParticle.h"
-#include "Sample/RT/SimulationOptions.h"
 #include "Sample/SampleBuilderEngine/ISampleBuilder.h"
 #include "Sample/Scattering/IFormFactorDecorator.h"
 #include "Sample/Interface/LayerInterface.h"
@@ -133,8 +132,6 @@
 %include "Sample/Material/MaterialFactoryFuncs.h"
 %include "Sample/Material/WavevectorInfo.h"
 
-%include "Sample/RT/SimulationOptions.h"
-
 %include "Base/Vector/Transform3D.h"
 %include "Sample/Scattering/ISampleNode.h"
 %include "Sample/Scattering/IFormFactor.h"
diff --git a/auto/Wrap/doxygenResample.i b/auto/Wrap/doxygenResample.i
index 6253ea4d8f98ee0a2afd2d219c8b79fc13354288..b292a010d102f4db0606cd6e6f1ec7cf289a4c7e 100644
--- a/auto/Wrap/doxygenResample.i
+++ b/auto/Wrap/doxygenResample.i
@@ -233,7 +233,7 @@ Sets reflection/transmission info.
 // File: classIFresnelMap.xml
 %feature("docstring") IFresnelMap "
 
-Holds all information that is needed to compute the ILayerRTCoefficients that characterize an incoming or outgoing wavefunction in all layers.
+Holds all information that is needed to compute the  ILayerRTCoefficients that characterize an incoming or outgoing wavefunction in all layers.
 
 C++ includes: IFresnelMap.h
 ";
@@ -280,6 +280,66 @@ Calculates the intensity for scalar particles/interactions.
 ";
 
 
+// File: classILayerRTCoefficients.xml
+%feature("docstring") ILayerRTCoefficients "
+
+Interface to access reflection/transmission coefficients. Realized by  ScalarRTCoefficients and  MatrixRTCoefficients.
+
+C++ includes: ILayerRTCoefficients.h
+";
+
+%feature("docstring")  ILayerRTCoefficients::~ILayerRTCoefficients "virtual ILayerRTCoefficients::~ILayerRTCoefficients()
+";
+
+%feature("docstring")  ILayerRTCoefficients::clone "virtual ILayerRTCoefficients* ILayerRTCoefficients::clone() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::T1plus "virtual Eigen::Vector2cd ILayerRTCoefficients::T1plus() const =0
+
+The following functions return the transmitted and reflected amplitudes for different incoming beam polarizations and eigenmodes 
+";
+
+%feature("docstring")  ILayerRTCoefficients::R1plus "virtual Eigen::Vector2cd ILayerRTCoefficients::R1plus() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::T2plus "virtual Eigen::Vector2cd ILayerRTCoefficients::T2plus() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::R2plus "virtual Eigen::Vector2cd ILayerRTCoefficients::R2plus() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::T1min "virtual Eigen::Vector2cd ILayerRTCoefficients::T1min() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::R1min "virtual Eigen::Vector2cd ILayerRTCoefficients::R1min() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::T2min "virtual Eigen::Vector2cd ILayerRTCoefficients::T2min() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::R2min "virtual Eigen::Vector2cd ILayerRTCoefficients::R2min() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::getKz "virtual Eigen::Vector2cd ILayerRTCoefficients::getKz() const =0
+
+Returns z-part of the two wavevector eigenmodes. 
+";
+
+%feature("docstring")  ILayerRTCoefficients::getScalarT "virtual complex_t ILayerRTCoefficients::getScalarT() const
+
+Scalar value getters; these throw errors by default as they should only be used when the derived object is really scalar 
+";
+
+%feature("docstring")  ILayerRTCoefficients::getScalarR "virtual complex_t ILayerRTCoefficients::getScalarR() const
+";
+
+%feature("docstring")  ILayerRTCoefficients::getScalarKz "virtual complex_t ILayerRTCoefficients::getScalarKz() const
+";
+
+%feature("docstring")  ILayerRTCoefficients::getReflectionMatrix "virtual Eigen::Matrix2cd ILayerRTCoefficients::getReflectionMatrix() const
+";
+
+
 // File: classIntegratorMCMiser.xml
 %feature("docstring") IntegratorMCMiser "";
 
@@ -358,6 +418,73 @@ Retrieves the amplitude coefficients for a (time-reversed) outgoing wavevector.
 ";
 
 
+// File: classMatrixRTCoefficients.xml
+%feature("docstring") MatrixRTCoefficients "
+
+Specular reflection and transmission coefficients in a layer in case of magnetic interactions between the scattered particle and the layer.
+
+C++ includes: MatrixRTCoefficients.h
+";
+
+%feature("docstring")  MatrixRTCoefficients::MatrixRTCoefficients "MatrixRTCoefficients::MatrixRTCoefficients(double kz_sign, Eigen::Vector2cd eigenvalues, kvector_t b, double magnetic_SLD)
+";
+
+%feature("docstring")  MatrixRTCoefficients::MatrixRTCoefficients "MatrixRTCoefficients::MatrixRTCoefficients(const MatrixRTCoefficients &other)
+";
+
+%feature("docstring")  MatrixRTCoefficients::~MatrixRTCoefficients "MatrixRTCoefficients::~MatrixRTCoefficients() override
+";
+
+%feature("docstring")  MatrixRTCoefficients::clone "MatrixRTCoefficients * MatrixRTCoefficients::clone() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients::T1plus "Eigen::Vector2cd MatrixRTCoefficients::T1plus() const override
+
+The following functions return the transmitted and reflected amplitudes for different incoming beam polarizations and eigenmodes 
+";
+
+%feature("docstring")  MatrixRTCoefficients::R1plus "Eigen::Vector2cd MatrixRTCoefficients::R1plus() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients::T2plus "Eigen::Vector2cd MatrixRTCoefficients::T2plus() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients::R2plus "Eigen::Vector2cd MatrixRTCoefficients::R2plus() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients::T1min "Eigen::Vector2cd MatrixRTCoefficients::T1min() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients::R1min "Eigen::Vector2cd MatrixRTCoefficients::R1min() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients::T2min "Eigen::Vector2cd MatrixRTCoefficients::T2min() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients::R2min "Eigen::Vector2cd MatrixRTCoefficients::R2min() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients::getKz "Eigen::Vector2cd MatrixRTCoefficients::getKz() const override
+
+Returns z-part of the two wavevector eigenmodes. 
+";
+
+%feature("docstring")  MatrixRTCoefficients::magneticSLD "double MatrixRTCoefficients::magneticSLD() const
+";
+
+%feature("docstring")  MatrixRTCoefficients::computeP "Eigen::Matrix2cd MatrixRTCoefficients::computeP() const
+";
+
+%feature("docstring")  MatrixRTCoefficients::computeInverseP "Eigen::Matrix2cd MatrixRTCoefficients::computeInverseP() const
+";
+
+%feature("docstring")  MatrixRTCoefficients::computeDeltaMatrix "Eigen::Matrix2cd MatrixRTCoefficients::computeDeltaMatrix(double thickness)
+";
+
+%feature("docstring")  MatrixRTCoefficients::getReflectionMatrix "Eigen::Matrix2cd MatrixRTCoefficients::getReflectionMatrix() const override
+";
+
+
 // File: classProcessedLayout.xml
 %feature("docstring") ProcessedLayout "
 
@@ -497,6 +624,139 @@ Retrieves the amplitude coefficients for a (time-reversed) outgoing wavevector.
 ";
 
 
+// File: classScalarRTCoefficients.xml
+%feature("docstring") ScalarRTCoefficients "
+
+Specular reflection and transmission coefficients in a layer in case of scalar interactions between the layers and the scattered particle.
+
+C++ includes: ScalarRTCoefficients.h
+";
+
+%feature("docstring")  ScalarRTCoefficients::ScalarRTCoefficients "ScalarRTCoefficients::ScalarRTCoefficients()
+";
+
+%feature("docstring")  ScalarRTCoefficients::~ScalarRTCoefficients "virtual ScalarRTCoefficients::~ScalarRTCoefficients()
+";
+
+%feature("docstring")  ScalarRTCoefficients::clone "ScalarRTCoefficients * ScalarRTCoefficients::clone() const
+";
+
+%feature("docstring")  ScalarRTCoefficients::T1plus "Eigen::Vector2cd ScalarRTCoefficients::T1plus() const
+
+The following functions return the transmitted and reflected amplitudes for different incoming beam polarizations and eigenmodes 
+";
+
+%feature("docstring")  ScalarRTCoefficients::R1plus "Eigen::Vector2cd ScalarRTCoefficients::R1plus() const
+";
+
+%feature("docstring")  ScalarRTCoefficients::T2plus "Eigen::Vector2cd ScalarRTCoefficients::T2plus() const
+";
+
+%feature("docstring")  ScalarRTCoefficients::R2plus "Eigen::Vector2cd ScalarRTCoefficients::R2plus() const
+";
+
+%feature("docstring")  ScalarRTCoefficients::T1min "Eigen::Vector2cd ScalarRTCoefficients::T1min() const
+";
+
+%feature("docstring")  ScalarRTCoefficients::R1min "Eigen::Vector2cd ScalarRTCoefficients::R1min() const
+";
+
+%feature("docstring")  ScalarRTCoefficients::T2min "Eigen::Vector2cd ScalarRTCoefficients::T2min() const
+";
+
+%feature("docstring")  ScalarRTCoefficients::R2min "Eigen::Vector2cd ScalarRTCoefficients::R2min() const
+";
+
+%feature("docstring")  ScalarRTCoefficients::getKz "Eigen::Vector2cd ScalarRTCoefficients::getKz() const
+
+Returns z-part of the two wavevector eigenmodes. 
+";
+
+%feature("docstring")  ScalarRTCoefficients::getScalarT "complex_t ScalarRTCoefficients::getScalarT() const
+
+Scalar value getters; these throw errors by default as they should only be used when the derived object is really scalar 
+";
+
+%feature("docstring")  ScalarRTCoefficients::getScalarR "complex_t ScalarRTCoefficients::getScalarR() const
+";
+
+%feature("docstring")  ScalarRTCoefficients::getScalarKz "virtual complex_t ScalarRTCoefficients::getScalarKz() const
+";
+
+
+// File: classSimulationOptions.xml
+%feature("docstring") SimulationOptions "
+
+Collect the different options for simulation.
+
+SimulationOptions
+
+C++ includes: SimulationOptions.h
+";
+
+%feature("docstring")  SimulationOptions::SimulationOptions "SimulationOptions::SimulationOptions()
+";
+
+%feature("docstring")  SimulationOptions::isIntegrate "bool SimulationOptions::isIntegrate() const
+";
+
+%feature("docstring")  SimulationOptions::getMcPoints "size_t SimulationOptions::getMcPoints() const
+";
+
+%feature("docstring")  SimulationOptions::setMonteCarloIntegration "void SimulationOptions::setMonteCarloIntegration(bool flag=true, size_t mc_points=50)
+
+Enables/disables MonetCarlo integration.
+
+Parameters:
+-----------
+
+flag: 
+If true, MonteCarlo integration will be used, otherwise analytical calculations
+
+mc_points: 
+Number of points for MonteCarlo integrator 
+";
+
+%feature("docstring")  SimulationOptions::setNumberOfThreads "void SimulationOptions::setNumberOfThreads(int nthreads)
+
+Sets number of threads to use during the simulation (0 - take the default value from the hardware) 
+";
+
+%feature("docstring")  SimulationOptions::getNumberOfThreads "unsigned SimulationOptions::getNumberOfThreads() const
+";
+
+%feature("docstring")  SimulationOptions::setNumberOfBatches "void SimulationOptions::setNumberOfBatches(int nbatches)
+
+Sets number of batches to split. 
+";
+
+%feature("docstring")  SimulationOptions::getNumberOfBatches "unsigned SimulationOptions::getNumberOfBatches() const
+";
+
+%feature("docstring")  SimulationOptions::getCurrentBatch "unsigned SimulationOptions::getCurrentBatch() const
+";
+
+%feature("docstring")  SimulationOptions::setThreadInfo "void SimulationOptions::setThreadInfo(const ThreadInfo &thread_info)
+
+Sets the batch and thread information to be used. 
+";
+
+%feature("docstring")  SimulationOptions::getHardwareConcurrency "unsigned SimulationOptions::getHardwareConcurrency() const
+";
+
+%feature("docstring")  SimulationOptions::setIncludeSpecular "void SimulationOptions::setIncludeSpecular(bool include_specular)
+";
+
+%feature("docstring")  SimulationOptions::includeSpecular "bool SimulationOptions::includeSpecular() const
+";
+
+%feature("docstring")  SimulationOptions::setUseAvgMaterials "void SimulationOptions::setUseAvgMaterials(bool use_avg_materials)
+";
+
+%feature("docstring")  SimulationOptions::useAvgMaterials "bool SimulationOptions::useAvgMaterials() const
+";
+
+
 // File: classSlice.xml
 %feature("docstring") Slice "
 
@@ -726,31 +986,28 @@ C++ includes: SSCApproximationStrategy.h
 // File: namespace_0d10.xml
 
 
-// File: namespace_0d26.xml
-
-
 // File: namespace_0d28.xml
 
 
-// File: namespace_0d32.xml
+// File: namespace_0d30.xml
 
 
 // File: namespace_0d34.xml
 
 
-// File: namespace_0d37.xml
+// File: namespace_0d36.xml
 
 
-// File: namespace_0d41.xml
+// File: namespace_0d39.xml
 
 
-// File: namespace_0d45.xml
+// File: namespace_0d43.xml
 
 
 // File: namespace_0d47.xml
 
 
-// File: namespace_0d49.xml
+// File: namespace_0d51.xml
 
 
 // File: namespace_0d53.xml
@@ -759,6 +1016,12 @@ C++ includes: SSCApproximationStrategy.h
 // File: namespace_0d55.xml
 
 
+// File: namespace_0d59.xml
+
+
+// File: namespace_0d61.xml
+
+
 // File: namespaceSampleUtils.xml
 
 
@@ -872,6 +1135,12 @@ Calculate z-regions occupied by particles.
 // File: SSCApproximationStrategy_8h.xml
 
 
+// File: SimulationOptions_8cpp.xml
+
+
+// File: SimulationOptions_8h.xml
+
+
 // File: MaterialSlicer_8cpp.xml
 
 
@@ -902,6 +1171,18 @@ Calculate z-regions occupied by particles.
 // File: ProfileHelper_8h.xml
 
 
+// File: ILayerRTCoefficients_8h.xml
+
+
+// File: MatrixRTCoefficients_8cpp.xml
+
+
+// File: MatrixRTCoefficients_8h.xml
+
+
+// File: ScalarRTCoefficients_8h.xml
+
+
 // File: ISpecularStrategy_8h.xml
 
 
@@ -983,12 +1264,18 @@ Calculate z-regions occupied by particles.
 // File: dir_7a082be0d4a3ee2af8eda8a58d93fc3c.xml
 
 
+// File: dir_fc04159ec4b49a4525d9d1e735a03048.xml
+
+
 // File: dir_8b8e406e0c078f14186b4022c818284f.xml
 
 
 // File: dir_dd8f7bdc5adb03cd4741fd30e320356d.xml
 
 
+// File: dir_b7ca7ff3f846ea4197e25a4010395078.xml
+
+
 // File: dir_5a6fad4f9f1572339acc49c35f6f6afa.xml
 
 
diff --git a/auto/Wrap/libBornAgainResample.py b/auto/Wrap/libBornAgainResample.py
index 9855eafad87f3ea277fb134c5e7d304ec7c546de..9983ebf648b250af69d815e0fc1954f1b1f1a287 100644
--- a/auto/Wrap/libBornAgainResample.py
+++ b/auto/Wrap/libBornAgainResample.py
@@ -1678,4 +1678,160 @@ class vector_pvacuum_double_t(object):
 # Register vector_pvacuum_double_t in _libBornAgainResample:
 _libBornAgainResample.vector_pvacuum_double_t_swigregister(vector_pvacuum_double_t)
 
+class SimulationOptions(object):
+    r"""
+
+
+    Collect the different options for simulation.
+
+    SimulationOptions
+
+    C++ includes: SimulationOptions.h
+
+    """
+
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        r"""
+        __init__(SimulationOptions self) -> SimulationOptions
+        SimulationOptions::SimulationOptions()
+
+        """
+        _libBornAgainResample.SimulationOptions_swiginit(self, _libBornAgainResample.new_SimulationOptions())
+
+    def isIntegrate(self):
+        r"""
+        isIntegrate(SimulationOptions self) -> bool
+        bool SimulationOptions::isIntegrate() const
+
+        """
+        return _libBornAgainResample.SimulationOptions_isIntegrate(self)
+
+    def getMcPoints(self):
+        r"""
+        getMcPoints(SimulationOptions self) -> size_t
+        size_t SimulationOptions::getMcPoints() const
+
+        """
+        return _libBornAgainResample.SimulationOptions_getMcPoints(self)
+
+    def setMonteCarloIntegration(self, flag=True, mc_points=50):
+        r"""
+        setMonteCarloIntegration(SimulationOptions self, bool flag=True, size_t mc_points=50)
+        void SimulationOptions::setMonteCarloIntegration(bool flag=true, size_t mc_points=50)
+
+        Enables/disables MonetCarlo integration.
+
+        Parameters:
+        -----------
+
+        flag: 
+        If true, MonteCarlo integration will be used, otherwise analytical calculations
+
+        mc_points: 
+        Number of points for MonteCarlo integrator 
+
+        """
+        return _libBornAgainResample.SimulationOptions_setMonteCarloIntegration(self, flag, mc_points)
+
+    def setNumberOfThreads(self, nthreads):
+        r"""
+        setNumberOfThreads(SimulationOptions self, int nthreads)
+        void SimulationOptions::setNumberOfThreads(int nthreads)
+
+        Sets number of threads to use during the simulation (0 - take the default value from the hardware) 
+
+        """
+        return _libBornAgainResample.SimulationOptions_setNumberOfThreads(self, nthreads)
+
+    def getNumberOfThreads(self):
+        r"""
+        getNumberOfThreads(SimulationOptions self) -> unsigned int
+        unsigned SimulationOptions::getNumberOfThreads() const
+
+        """
+        return _libBornAgainResample.SimulationOptions_getNumberOfThreads(self)
+
+    def setNumberOfBatches(self, nbatches):
+        r"""
+        setNumberOfBatches(SimulationOptions self, int nbatches)
+        void SimulationOptions::setNumberOfBatches(int nbatches)
+
+        Sets number of batches to split. 
+
+        """
+        return _libBornAgainResample.SimulationOptions_setNumberOfBatches(self, nbatches)
+
+    def getNumberOfBatches(self):
+        r"""
+        getNumberOfBatches(SimulationOptions self) -> unsigned int
+        unsigned SimulationOptions::getNumberOfBatches() const
+
+        """
+        return _libBornAgainResample.SimulationOptions_getNumberOfBatches(self)
+
+    def getCurrentBatch(self):
+        r"""
+        getCurrentBatch(SimulationOptions self) -> unsigned int
+        unsigned SimulationOptions::getCurrentBatch() const
+
+        """
+        return _libBornAgainResample.SimulationOptions_getCurrentBatch(self)
+
+    def setThreadInfo(self, thread_info):
+        r"""
+        setThreadInfo(SimulationOptions self, ThreadInfo const & thread_info)
+        void SimulationOptions::setThreadInfo(const ThreadInfo &thread_info)
+
+        Sets the batch and thread information to be used. 
+
+        """
+        return _libBornAgainResample.SimulationOptions_setThreadInfo(self, thread_info)
+
+    def getHardwareConcurrency(self):
+        r"""
+        getHardwareConcurrency(SimulationOptions self) -> unsigned int
+        unsigned SimulationOptions::getHardwareConcurrency() const
+
+        """
+        return _libBornAgainResample.SimulationOptions_getHardwareConcurrency(self)
+
+    def setIncludeSpecular(self, include_specular):
+        r"""
+        setIncludeSpecular(SimulationOptions self, bool include_specular)
+        void SimulationOptions::setIncludeSpecular(bool include_specular)
+
+        """
+        return _libBornAgainResample.SimulationOptions_setIncludeSpecular(self, include_specular)
+
+    def includeSpecular(self):
+        r"""
+        includeSpecular(SimulationOptions self) -> bool
+        bool SimulationOptions::includeSpecular() const
+
+        """
+        return _libBornAgainResample.SimulationOptions_includeSpecular(self)
+
+    def setUseAvgMaterials(self, use_avg_materials):
+        r"""
+        setUseAvgMaterials(SimulationOptions self, bool use_avg_materials)
+        void SimulationOptions::setUseAvgMaterials(bool use_avg_materials)
+
+        """
+        return _libBornAgainResample.SimulationOptions_setUseAvgMaterials(self, use_avg_materials)
+
+    def useAvgMaterials(self):
+        r"""
+        useAvgMaterials(SimulationOptions self) -> bool
+        bool SimulationOptions::useAvgMaterials() const
+
+        """
+        return _libBornAgainResample.SimulationOptions_useAvgMaterials(self)
+    __swig_destroy__ = _libBornAgainResample.delete_SimulationOptions
+
+# Register SimulationOptions in _libBornAgainResample:
+_libBornAgainResample.SimulationOptions_swigregister(SimulationOptions)
+
 
diff --git a/auto/Wrap/libBornAgainResample_wrap.cpp b/auto/Wrap/libBornAgainResample_wrap.cpp
index 6e26d34f77d478cada4fd31ef5b8830c523a261f..0f39aa017a3c9fe2032f88443074f4df81c1e3a7 100644
--- a/auto/Wrap/libBornAgainResample_wrap.cpp
+++ b/auto/Wrap/libBornAgainResample_wrap.cpp
@@ -3097,48 +3097,50 @@ namespace Swig {
 
 /* -------- TYPES TABLE (BEGIN) -------- */
 
-#define SWIGTYPE_p_allocator_type swig_types[0]
-#define SWIGTYPE_p_char swig_types[1]
-#define SWIGTYPE_p_difference_type swig_types[2]
-#define SWIGTYPE_p_first_type swig_types[3]
-#define SWIGTYPE_p_int swig_types[4]
-#define SWIGTYPE_p_key_type swig_types[5]
-#define SWIGTYPE_p_long_long swig_types[6]
-#define SWIGTYPE_p_mapped_type swig_types[7]
-#define SWIGTYPE_p_p_PyObject swig_types[8]
-#define SWIGTYPE_p_second_type swig_types[9]
-#define SWIGTYPE_p_short swig_types[10]
-#define SWIGTYPE_p_signed_char swig_types[11]
-#define SWIGTYPE_p_size_type swig_types[12]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[13]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[14]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[15]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[16]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[17]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[18]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[19]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[20]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[21]
-#define SWIGTYPE_p_std__invalid_argument swig_types[22]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[23]
-#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[24]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[25]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[26]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[27]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[28]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[29]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[30]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[31]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[32]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[33]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[34]
-#define SWIGTYPE_p_unsigned_char swig_types[35]
-#define SWIGTYPE_p_unsigned_int swig_types[36]
-#define SWIGTYPE_p_unsigned_long_long swig_types[37]
-#define SWIGTYPE_p_unsigned_short swig_types[38]
-#define SWIGTYPE_p_value_type swig_types[39]
-static swig_type_info *swig_types[41];
-static swig_module_info swig_module = {swig_types, 40, 0, 0, 0, 0};
+#define SWIGTYPE_p_SimulationOptions swig_types[0]
+#define SWIGTYPE_p_ThreadInfo swig_types[1]
+#define SWIGTYPE_p_allocator_type swig_types[2]
+#define SWIGTYPE_p_char swig_types[3]
+#define SWIGTYPE_p_difference_type swig_types[4]
+#define SWIGTYPE_p_first_type swig_types[5]
+#define SWIGTYPE_p_int swig_types[6]
+#define SWIGTYPE_p_key_type swig_types[7]
+#define SWIGTYPE_p_long_long swig_types[8]
+#define SWIGTYPE_p_mapped_type swig_types[9]
+#define SWIGTYPE_p_p_PyObject swig_types[10]
+#define SWIGTYPE_p_second_type swig_types[11]
+#define SWIGTYPE_p_short swig_types[12]
+#define SWIGTYPE_p_signed_char swig_types[13]
+#define SWIGTYPE_p_size_type swig_types[14]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[15]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[16]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[17]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[18]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[19]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[20]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[21]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[22]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[23]
+#define SWIGTYPE_p_std__invalid_argument swig_types[24]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[25]
+#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[26]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[27]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[28]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[29]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[30]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[31]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[32]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[33]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[34]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[35]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[36]
+#define SWIGTYPE_p_unsigned_char swig_types[37]
+#define SWIGTYPE_p_unsigned_int swig_types[38]
+#define SWIGTYPE_p_unsigned_long_long swig_types[39]
+#define SWIGTYPE_p_unsigned_short swig_types[40]
+#define SWIGTYPE_p_value_type swig_types[41]
+static swig_type_info *swig_types[43];
+static swig_module_info swig_module = {swig_types, 42, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -6631,6 +6633,30 @@ SWIGINTERN std::vector< std::pair< double,double > >::iterator std_vector_Sl_std
 SWIGINTERN std::vector< std::pair< double,double > >::iterator std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_0(std::vector< std::pair< double,double > > *self,std::vector< std::pair< double,double > >::iterator pos,std::vector< std::pair< double,double > >::value_type const &x){ return self->insert(pos, x); }
 SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_1(std::vector< std::pair< double,double > > *self,std::vector< std::pair< double,double > >::iterator pos,std::vector< std::pair< double,double > >::size_type n,std::vector< std::pair< double,double > >::value_type const &x){ self->insert(pos, n, x); }
 
+#include "Resample/Options/SimulationOptions.h"
+
+
+SWIGINTERN int
+SWIG_AsVal_bool (PyObject *obj, bool *val)
+{
+  int r;
+  if (!PyBool_Check(obj))
+    return SWIG_ERROR;
+  r = PyObject_IsTrue(obj);
+  if (r == -1)
+    return SWIG_ERROR;
+  if (val) *val = r ? true : false;
+  return SWIG_OK;
+}
+
+
+SWIGINTERNINLINE PyObject*
+  SWIG_From_unsigned_SS_int  (unsigned int value)
+{
+  return PyInt_FromSize_t((size_t) value);
+}
+
+
 
 /* ---------------------------------------------------
  * C++ director class methods
@@ -23621,6 +23647,532 @@ SWIGINTERN PyObject *vector_pvacuum_double_t_swiginit(PyObject *SWIGUNUSEDPARM(s
   return SWIG_Python_InitShadowInstance(args);
 }
 
+SWIGINTERN PyObject *_wrap_new_SimulationOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_SimulationOptions", 0, 0, 0)) SWIG_fail;
+  result = (SimulationOptions *)new SimulationOptions();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SimulationOptions, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_isIntegrate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_isIntegrate" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (bool)((SimulationOptions const *)arg1)->isIntegrate();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_getMcPoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  size_t result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getMcPoints" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = ((SimulationOptions const *)arg1)->getMcPoints();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setMonteCarloIntegration__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  bool arg2 ;
+  size_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  ecode3 = SWIG_AsVal_size_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  (arg1)->setMonteCarloIntegration(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setMonteCarloIntegration__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  (arg1)->setMonteCarloIntegration(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setMonteCarloIntegration__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  (arg1)->setMonteCarloIntegration();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setMonteCarloIntegration(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "SimulationOptions_setMonteCarloIntegration", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationOptions, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_SimulationOptions_setMonteCarloIntegration__SWIG_2(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationOptions, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_bool(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SimulationOptions_setMonteCarloIntegration__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationOptions, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_bool(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_SimulationOptions_setMonteCarloIntegration__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'SimulationOptions_setMonteCarloIntegration'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    SimulationOptions::setMonteCarloIntegration(bool,size_t)\n"
+    "    SimulationOptions::setMonteCarloIntegration(bool)\n"
+    "    SimulationOptions::setMonteCarloIntegration()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setNumberOfThreads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SimulationOptions_setNumberOfThreads", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setNumberOfThreads" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setNumberOfThreads" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  (arg1)->setNumberOfThreads(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_getNumberOfThreads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  unsigned int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getNumberOfThreads" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (unsigned int)((SimulationOptions const *)arg1)->getNumberOfThreads();
+  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setNumberOfBatches(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SimulationOptions_setNumberOfBatches", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setNumberOfBatches" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setNumberOfBatches" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  (arg1)->setNumberOfBatches(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_getNumberOfBatches(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  unsigned int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getNumberOfBatches" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (unsigned int)((SimulationOptions const *)arg1)->getNumberOfBatches();
+  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_getCurrentBatch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  unsigned int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getCurrentBatch" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (unsigned int)((SimulationOptions const *)arg1)->getCurrentBatch();
+  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setThreadInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  ThreadInfo *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SimulationOptions_setThreadInfo", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setThreadInfo" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_ThreadInfo,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SimulationOptions_setThreadInfo" "', argument " "2"" of type '" "ThreadInfo const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationOptions_setThreadInfo" "', argument " "2"" of type '" "ThreadInfo const &""'"); 
+  }
+  arg2 = reinterpret_cast< ThreadInfo * >(argp2);
+  (arg1)->setThreadInfo((ThreadInfo const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_getHardwareConcurrency(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  unsigned int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getHardwareConcurrency" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (unsigned int)((SimulationOptions const *)arg1)->getHardwareConcurrency();
+  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setIncludeSpecular(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SimulationOptions_setIncludeSpecular", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setIncludeSpecular" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setIncludeSpecular" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  (arg1)->setIncludeSpecular(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_includeSpecular(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_includeSpecular" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (bool)((SimulationOptions const *)arg1)->includeSpecular();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setUseAvgMaterials(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SimulationOptions_setUseAvgMaterials", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setUseAvgMaterials" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setUseAvgMaterials" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  (arg1)->setUseAvgMaterials(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_useAvgMaterials(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_useAvgMaterials" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (bool)((SimulationOptions const *)arg1)->useAvgMaterials();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SimulationOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SimulationOptions" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SimulationOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SimulationOptions, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *SimulationOptions_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
 static PyMethodDef SwigMethods[] = {
 	 { "SWIG_PyInstanceMethod_New", SWIG_PyInstanceMethod_New, METH_O, NULL},
 	 { "delete_SwigPyIterator", _wrap_delete_SwigPyIterator, METH_O, "delete_SwigPyIterator(SwigPyIterator self)"},
@@ -24196,6 +24748,101 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_vector_pvacuum_double_t", _wrap_delete_vector_pvacuum_double_t, METH_O, "delete_vector_pvacuum_double_t(vector_pvacuum_double_t self)"},
 	 { "vector_pvacuum_double_t_swigregister", vector_pvacuum_double_t_swigregister, METH_O, NULL},
 	 { "vector_pvacuum_double_t_swiginit", vector_pvacuum_double_t_swiginit, METH_VARARGS, NULL},
+	 { "new_SimulationOptions", _wrap_new_SimulationOptions, METH_NOARGS, "\n"
+		"new_SimulationOptions() -> SimulationOptions\n"
+		"SimulationOptions::SimulationOptions()\n"
+		"\n"
+		""},
+	 { "SimulationOptions_isIntegrate", _wrap_SimulationOptions_isIntegrate, METH_O, "\n"
+		"SimulationOptions_isIntegrate(SimulationOptions self) -> bool\n"
+		"bool SimulationOptions::isIntegrate() const\n"
+		"\n"
+		""},
+	 { "SimulationOptions_getMcPoints", _wrap_SimulationOptions_getMcPoints, METH_O, "\n"
+		"SimulationOptions_getMcPoints(SimulationOptions self) -> size_t\n"
+		"size_t SimulationOptions::getMcPoints() const\n"
+		"\n"
+		""},
+	 { "SimulationOptions_setMonteCarloIntegration", _wrap_SimulationOptions_setMonteCarloIntegration, METH_VARARGS, "\n"
+		"SimulationOptions_setMonteCarloIntegration(SimulationOptions self, bool flag=True, size_t mc_points=50)\n"
+		"void SimulationOptions::setMonteCarloIntegration(bool flag=true, size_t mc_points=50)\n"
+		"\n"
+		"Enables/disables MonetCarlo integration.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"flag: \n"
+		"If true, MonteCarlo integration will be used, otherwise analytical calculations\n"
+		"\n"
+		"mc_points: \n"
+		"Number of points for MonteCarlo integrator \n"
+		"\n"
+		""},
+	 { "SimulationOptions_setNumberOfThreads", _wrap_SimulationOptions_setNumberOfThreads, METH_VARARGS, "\n"
+		"SimulationOptions_setNumberOfThreads(SimulationOptions self, int nthreads)\n"
+		"void SimulationOptions::setNumberOfThreads(int nthreads)\n"
+		"\n"
+		"Sets number of threads to use during the simulation (0 - take the default value from the hardware) \n"
+		"\n"
+		""},
+	 { "SimulationOptions_getNumberOfThreads", _wrap_SimulationOptions_getNumberOfThreads, METH_O, "\n"
+		"SimulationOptions_getNumberOfThreads(SimulationOptions self) -> unsigned int\n"
+		"unsigned SimulationOptions::getNumberOfThreads() const\n"
+		"\n"
+		""},
+	 { "SimulationOptions_setNumberOfBatches", _wrap_SimulationOptions_setNumberOfBatches, METH_VARARGS, "\n"
+		"SimulationOptions_setNumberOfBatches(SimulationOptions self, int nbatches)\n"
+		"void SimulationOptions::setNumberOfBatches(int nbatches)\n"
+		"\n"
+		"Sets number of batches to split. \n"
+		"\n"
+		""},
+	 { "SimulationOptions_getNumberOfBatches", _wrap_SimulationOptions_getNumberOfBatches, METH_O, "\n"
+		"SimulationOptions_getNumberOfBatches(SimulationOptions self) -> unsigned int\n"
+		"unsigned SimulationOptions::getNumberOfBatches() const\n"
+		"\n"
+		""},
+	 { "SimulationOptions_getCurrentBatch", _wrap_SimulationOptions_getCurrentBatch, METH_O, "\n"
+		"SimulationOptions_getCurrentBatch(SimulationOptions self) -> unsigned int\n"
+		"unsigned SimulationOptions::getCurrentBatch() const\n"
+		"\n"
+		""},
+	 { "SimulationOptions_setThreadInfo", _wrap_SimulationOptions_setThreadInfo, METH_VARARGS, "\n"
+		"SimulationOptions_setThreadInfo(SimulationOptions self, ThreadInfo const & thread_info)\n"
+		"void SimulationOptions::setThreadInfo(const ThreadInfo &thread_info)\n"
+		"\n"
+		"Sets the batch and thread information to be used. \n"
+		"\n"
+		""},
+	 { "SimulationOptions_getHardwareConcurrency", _wrap_SimulationOptions_getHardwareConcurrency, METH_O, "\n"
+		"SimulationOptions_getHardwareConcurrency(SimulationOptions self) -> unsigned int\n"
+		"unsigned SimulationOptions::getHardwareConcurrency() const\n"
+		"\n"
+		""},
+	 { "SimulationOptions_setIncludeSpecular", _wrap_SimulationOptions_setIncludeSpecular, METH_VARARGS, "\n"
+		"SimulationOptions_setIncludeSpecular(SimulationOptions self, bool include_specular)\n"
+		"void SimulationOptions::setIncludeSpecular(bool include_specular)\n"
+		"\n"
+		""},
+	 { "SimulationOptions_includeSpecular", _wrap_SimulationOptions_includeSpecular, METH_O, "\n"
+		"SimulationOptions_includeSpecular(SimulationOptions self) -> bool\n"
+		"bool SimulationOptions::includeSpecular() const\n"
+		"\n"
+		""},
+	 { "SimulationOptions_setUseAvgMaterials", _wrap_SimulationOptions_setUseAvgMaterials, METH_VARARGS, "\n"
+		"SimulationOptions_setUseAvgMaterials(SimulationOptions self, bool use_avg_materials)\n"
+		"void SimulationOptions::setUseAvgMaterials(bool use_avg_materials)\n"
+		"\n"
+		""},
+	 { "SimulationOptions_useAvgMaterials", _wrap_SimulationOptions_useAvgMaterials, METH_O, "\n"
+		"SimulationOptions_useAvgMaterials(SimulationOptions self) -> bool\n"
+		"bool SimulationOptions::useAvgMaterials() const\n"
+		"\n"
+		""},
+	 { "delete_SimulationOptions", _wrap_delete_SimulationOptions, METH_O, "delete_SimulationOptions(SimulationOptions self)"},
+	 { "SimulationOptions_swigregister", SimulationOptions_swigregister, METH_O, NULL},
+	 { "SimulationOptions_swiginit", SimulationOptions_swiginit, METH_VARARGS, NULL},
 	 { NULL, NULL, 0, NULL }
 };
 
@@ -24206,6 +24853,8 @@ static PyMethodDef SwigMethods_proxydocs[] = {
 
 /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
 
+static swig_type_info _swigt__p_SimulationOptions = {"_p_SimulationOptions", "SimulationOptions *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ThreadInfo = {"_p_ThreadInfo", "ThreadInfo *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_allocator_type = {"_p_allocator_type", "allocator_type *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_difference_type = {"_p_difference_type", "difference_type *", 0, 0, (void*)0, 0};
@@ -24248,6 +24897,8 @@ static swig_type_info _swigt__p_unsigned_short = {"_p_unsigned_short", "unsigned
 static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0, 0, (void*)0, 0};
 
 static swig_type_info *swig_type_initial[] = {
+  &_swigt__p_SimulationOptions,
+  &_swigt__p_ThreadInfo,
   &_swigt__p_allocator_type,
   &_swigt__p_char,
   &_swigt__p_difference_type,
@@ -24290,6 +24941,8 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_value_type,
 };
 
+static swig_cast_info _swigc__p_SimulationOptions[] = {  {&_swigt__p_SimulationOptions, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ThreadInfo[] = {  {&_swigt__p_ThreadInfo, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_allocator_type[] = {  {&_swigt__p_allocator_type, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_difference_type[] = {  {&_swigt__p_difference_type, 0, 0, 0},{0, 0, 0, 0}};
@@ -24332,6 +24985,8 @@ static swig_cast_info _swigc__p_unsigned_short[] = {  {&_swigt__p_unsigned_short
 static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0, 0},{0, 0, 0, 0}};
 
 static swig_cast_info *swig_cast_initial[] = {
+  _swigc__p_SimulationOptions,
+  _swigc__p_ThreadInfo,
   _swigc__p_allocator_type,
   _swigc__p_char,
   _swigc__p_difference_type,
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index aae99025bfb752f20085b6063d899b1f65e0a6dc..8e41475f484b7338e68a73df8023970f30dd9dcb 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -3001,162 +3001,6 @@ def WavevectorInfo_GetZeroQ():
     r"""WavevectorInfo_GetZeroQ() -> WavevectorInfo"""
     return _libBornAgainSample.WavevectorInfo_GetZeroQ()
 
-class SimulationOptions(object):
-    r"""
-
-
-    Collect the different options for simulation.
-
-    SimulationOptions
-
-    C++ includes: SimulationOptions.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-
-    def __init__(self):
-        r"""
-        __init__(SimulationOptions self) -> SimulationOptions
-        SimulationOptions::SimulationOptions()
-
-        """
-        _libBornAgainSample.SimulationOptions_swiginit(self, _libBornAgainSample.new_SimulationOptions())
-
-    def isIntegrate(self):
-        r"""
-        isIntegrate(SimulationOptions self) -> bool
-        bool SimulationOptions::isIntegrate() const
-
-        """
-        return _libBornAgainSample.SimulationOptions_isIntegrate(self)
-
-    def getMcPoints(self):
-        r"""
-        getMcPoints(SimulationOptions self) -> size_t
-        size_t SimulationOptions::getMcPoints() const
-
-        """
-        return _libBornAgainSample.SimulationOptions_getMcPoints(self)
-
-    def setMonteCarloIntegration(self, flag=True, mc_points=50):
-        r"""
-        setMonteCarloIntegration(SimulationOptions self, bool flag=True, size_t mc_points=50)
-        void SimulationOptions::setMonteCarloIntegration(bool flag=true, size_t mc_points=50)
-
-        Enables/disables MonetCarlo integration.
-
-        Parameters:
-        -----------
-
-        flag: 
-        If true, MonteCarlo integration will be used, otherwise analytical calculations
-
-        mc_points: 
-        Number of points for MonteCarlo integrator 
-
-        """
-        return _libBornAgainSample.SimulationOptions_setMonteCarloIntegration(self, flag, mc_points)
-
-    def setNumberOfThreads(self, nthreads):
-        r"""
-        setNumberOfThreads(SimulationOptions self, int nthreads)
-        void SimulationOptions::setNumberOfThreads(int nthreads)
-
-        Sets number of threads to use during the simulation (0 - take the default value from the hardware) 
-
-        """
-        return _libBornAgainSample.SimulationOptions_setNumberOfThreads(self, nthreads)
-
-    def getNumberOfThreads(self):
-        r"""
-        getNumberOfThreads(SimulationOptions self) -> unsigned int
-        unsigned SimulationOptions::getNumberOfThreads() const
-
-        """
-        return _libBornAgainSample.SimulationOptions_getNumberOfThreads(self)
-
-    def setNumberOfBatches(self, nbatches):
-        r"""
-        setNumberOfBatches(SimulationOptions self, int nbatches)
-        void SimulationOptions::setNumberOfBatches(int nbatches)
-
-        Sets number of batches to split. 
-
-        """
-        return _libBornAgainSample.SimulationOptions_setNumberOfBatches(self, nbatches)
-
-    def getNumberOfBatches(self):
-        r"""
-        getNumberOfBatches(SimulationOptions self) -> unsigned int
-        unsigned SimulationOptions::getNumberOfBatches() const
-
-        """
-        return _libBornAgainSample.SimulationOptions_getNumberOfBatches(self)
-
-    def getCurrentBatch(self):
-        r"""
-        getCurrentBatch(SimulationOptions self) -> unsigned int
-        unsigned SimulationOptions::getCurrentBatch() const
-
-        """
-        return _libBornAgainSample.SimulationOptions_getCurrentBatch(self)
-
-    def setThreadInfo(self, thread_info):
-        r"""
-        setThreadInfo(SimulationOptions self, ThreadInfo const & thread_info)
-        void SimulationOptions::setThreadInfo(const ThreadInfo &thread_info)
-
-        Sets the batch and thread information to be used. 
-
-        """
-        return _libBornAgainSample.SimulationOptions_setThreadInfo(self, thread_info)
-
-    def getHardwareConcurrency(self):
-        r"""
-        getHardwareConcurrency(SimulationOptions self) -> unsigned int
-        unsigned SimulationOptions::getHardwareConcurrency() const
-
-        """
-        return _libBornAgainSample.SimulationOptions_getHardwareConcurrency(self)
-
-    def setIncludeSpecular(self, include_specular):
-        r"""
-        setIncludeSpecular(SimulationOptions self, bool include_specular)
-        void SimulationOptions::setIncludeSpecular(bool include_specular)
-
-        """
-        return _libBornAgainSample.SimulationOptions_setIncludeSpecular(self, include_specular)
-
-    def includeSpecular(self):
-        r"""
-        includeSpecular(SimulationOptions self) -> bool
-        bool SimulationOptions::includeSpecular() const
-
-        """
-        return _libBornAgainSample.SimulationOptions_includeSpecular(self)
-
-    def setUseAvgMaterials(self, use_avg_materials):
-        r"""
-        setUseAvgMaterials(SimulationOptions self, bool use_avg_materials)
-        void SimulationOptions::setUseAvgMaterials(bool use_avg_materials)
-
-        """
-        return _libBornAgainSample.SimulationOptions_setUseAvgMaterials(self, use_avg_materials)
-
-    def useAvgMaterials(self):
-        r"""
-        useAvgMaterials(SimulationOptions self) -> bool
-        bool SimulationOptions::useAvgMaterials() const
-
-        """
-        return _libBornAgainSample.SimulationOptions_useAvgMaterials(self)
-    __swig_destroy__ = _libBornAgainSample.delete_SimulationOptions
-
-# Register SimulationOptions in _libBornAgainSample:
-_libBornAgainSample.SimulationOptions_swigregister(SimulationOptions)
-
 class Transform3D(object):
     r"""Proxy of C++ Transform3D class."""
 
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index 3928d0d36a3a40200f5781855c34ffb777c00e87..5700e50f97fdffed4d03a6764d3c8f8906b90010 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -3226,74 +3226,72 @@ namespace Swig {
 #define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[126]
 #define SWIGTYPE_p_SampleBuilderFactory swig_types[127]
 #define SWIGTYPE_p_SimpleSelectionRule swig_types[128]
-#define SWIGTYPE_p_SimulationOptions swig_types[129]
-#define SWIGTYPE_p_SlicedParticle swig_types[130]
-#define SWIGTYPE_p_SlicingEffects swig_types[131]
-#define SWIGTYPE_p_SquareLattice2D swig_types[132]
-#define SWIGTYPE_p_ThreadInfo swig_types[133]
-#define SWIGTYPE_p_Transform3D swig_types[134]
-#define SWIGTYPE_p_WavevectorInfo swig_types[135]
-#define SWIGTYPE_p_ZLimits swig_types[136]
-#define SWIGTYPE_p_allocator_type swig_types[137]
-#define SWIGTYPE_p_char swig_types[138]
-#define SWIGTYPE_p_difference_type swig_types[139]
-#define SWIGTYPE_p_double swig_types[140]
-#define SWIGTYPE_p_first_type swig_types[141]
-#define SWIGTYPE_p_int swig_types[142]
-#define SWIGTYPE_p_key_type swig_types[143]
-#define SWIGTYPE_p_long_long swig_types[144]
-#define SWIGTYPE_p_mapped_type swig_types[145]
-#define SWIGTYPE_p_p_PyObject swig_types[146]
-#define SWIGTYPE_p_second_type swig_types[147]
-#define SWIGTYPE_p_short swig_types[148]
-#define SWIGTYPE_p_signed_char swig_types[149]
-#define SWIGTYPE_p_size_type swig_types[150]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[151]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[152]
-#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[153]
-#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[154]
-#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[155]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[156]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[157]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[158]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[159]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[160]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[161]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[162]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[163]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[164]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[165]
-#define SWIGTYPE_p_std__functionT_ISampleBuilder_pfF_t swig_types[166]
-#define SWIGTYPE_p_std__invalid_argument swig_types[167]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[168]
-#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[169]
-#define SWIGTYPE_p_std__ostream swig_types[170]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[171]
-#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[172]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[173]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[174]
-#define SWIGTYPE_p_std__vectorT_HomogeneousRegion_std__allocatorT_HomogeneousRegion_t_t swig_types[175]
-#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[176]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[177]
-#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[178]
-#define SWIGTYPE_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t swig_types[179]
-#define SWIGTYPE_p_std__vectorT_ParticleLayout_const_p_std__allocatorT_ParticleLayout_const_p_t_t swig_types[180]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[181]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[182]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[183]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[184]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[185]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[186]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[187]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[188]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[189]
-#define SWIGTYPE_p_unsigned_char swig_types[190]
-#define SWIGTYPE_p_unsigned_int swig_types[191]
-#define SWIGTYPE_p_unsigned_long_long swig_types[192]
-#define SWIGTYPE_p_unsigned_short swig_types[193]
-#define SWIGTYPE_p_value_type swig_types[194]
-static swig_type_info *swig_types[196];
-static swig_module_info swig_module = {swig_types, 195, 0, 0, 0, 0};
+#define SWIGTYPE_p_SlicedParticle swig_types[129]
+#define SWIGTYPE_p_SlicingEffects swig_types[130]
+#define SWIGTYPE_p_SquareLattice2D swig_types[131]
+#define SWIGTYPE_p_Transform3D swig_types[132]
+#define SWIGTYPE_p_WavevectorInfo swig_types[133]
+#define SWIGTYPE_p_ZLimits swig_types[134]
+#define SWIGTYPE_p_allocator_type swig_types[135]
+#define SWIGTYPE_p_char swig_types[136]
+#define SWIGTYPE_p_difference_type swig_types[137]
+#define SWIGTYPE_p_double swig_types[138]
+#define SWIGTYPE_p_first_type swig_types[139]
+#define SWIGTYPE_p_int swig_types[140]
+#define SWIGTYPE_p_key_type swig_types[141]
+#define SWIGTYPE_p_long_long swig_types[142]
+#define SWIGTYPE_p_mapped_type swig_types[143]
+#define SWIGTYPE_p_p_PyObject swig_types[144]
+#define SWIGTYPE_p_second_type swig_types[145]
+#define SWIGTYPE_p_short swig_types[146]
+#define SWIGTYPE_p_signed_char swig_types[147]
+#define SWIGTYPE_p_size_type swig_types[148]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[149]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[150]
+#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[151]
+#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[152]
+#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[153]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[154]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[155]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[156]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[157]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[158]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[159]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[160]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[161]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[162]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[163]
+#define SWIGTYPE_p_std__functionT_ISampleBuilder_pfF_t swig_types[164]
+#define SWIGTYPE_p_std__invalid_argument swig_types[165]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[166]
+#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[167]
+#define SWIGTYPE_p_std__ostream swig_types[168]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[169]
+#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[170]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[171]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[172]
+#define SWIGTYPE_p_std__vectorT_HomogeneousRegion_std__allocatorT_HomogeneousRegion_t_t swig_types[173]
+#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[174]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[175]
+#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[176]
+#define SWIGTYPE_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t swig_types[177]
+#define SWIGTYPE_p_std__vectorT_ParticleLayout_const_p_std__allocatorT_ParticleLayout_const_p_t_t swig_types[178]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[179]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[180]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[181]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[182]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[183]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[184]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[185]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[186]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[187]
+#define SWIGTYPE_p_unsigned_char swig_types[188]
+#define SWIGTYPE_p_unsigned_int swig_types[189]
+#define SWIGTYPE_p_unsigned_long_long swig_types[190]
+#define SWIGTYPE_p_unsigned_short swig_types[191]
+#define SWIGTYPE_p_value_type swig_types[192]
+static swig_type_info *swig_types[194];
+static swig_module_info swig_module = {swig_types, 193, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -6841,7 +6839,6 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include "Sample/Particle/ParticleComposition.h"
 #include "Sample/Particle/ParticleCoreShell.h"
 #include "Sample/Particle/SlicedParticle.h"
-#include "Sample/RT/SimulationOptions.h"
 #include "Sample/SampleBuilderEngine/ISampleBuilder.h"
 #include "Sample/Scattering/IFormFactorDecorator.h"
 #include "Sample/Interface/LayerInterface.h"
@@ -7424,13 +7421,6 @@ SWIG_AsVal_bool (PyObject *obj, bool *val)
 }
 
 
-SWIGINTERNINLINE PyObject*
-  SWIG_From_unsigned_SS_int  (unsigned int value)
-{
-  return PyInt_FromSize_t((size_t) value);
-}
-
-
 SWIGINTERN int
 SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val)
 {
@@ -7446,6 +7436,13 @@ SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val)
   return res;
 }
 
+
+SWIGINTERNINLINE PyObject*
+  SWIG_From_unsigned_SS_int  (unsigned int value)
+{
+  return PyInt_FromSize_t((size_t) value);
+}
+
 SWIGINTERN void ISampleBuilder_onChange(ISampleBuilder *self){
         return (self)->IParametricComponent::onChange();
     }
@@ -37572,532 +37569,6 @@ SWIGINTERN PyObject *WavevectorInfo_swiginit(PyObject *SWIGUNUSEDPARM(self), PyO
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_SimulationOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "new_SimulationOptions", 0, 0, 0)) SWIG_fail;
-  result = (SimulationOptions *)new SimulationOptions();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SimulationOptions, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_isIntegrate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  bool result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_isIntegrate" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  result = (bool)((SimulationOptions const *)arg1)->isIntegrate();
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_getMcPoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  size_t result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getMcPoints" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  result = ((SimulationOptions const *)arg1)->getMcPoints();
-  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_setMonteCarloIntegration__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  bool arg2 ;
-  size_t arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  bool val2 ;
-  int ecode2 = 0 ;
-  size_t val3 ;
-  int ecode3 = 0 ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "1"" of type '" "SimulationOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "2"" of type '" "bool""'");
-  } 
-  arg2 = static_cast< bool >(val2);
-  ecode3 = SWIG_AsVal_size_t(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "3"" of type '" "size_t""'");
-  } 
-  arg3 = static_cast< size_t >(val3);
-  (arg1)->setMonteCarloIntegration(arg2,arg3);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_setMonteCarloIntegration__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  bool arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  bool val2 ;
-  int ecode2 = 0 ;
-  
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "1"" of type '" "SimulationOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "2"" of type '" "bool""'");
-  } 
-  arg2 = static_cast< bool >(val2);
-  (arg1)->setMonteCarloIntegration(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_setMonteCarloIntegration__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "1"" of type '" "SimulationOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  (arg1)->setMonteCarloIntegration();
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_setMonteCarloIntegration(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "SimulationOptions_setMonteCarloIntegration", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationOptions, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_SimulationOptions_setMonteCarloIntegration__SWIG_2(self, argc, argv);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationOptions, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_bool(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_SimulationOptions_setMonteCarloIntegration__SWIG_1(self, argc, argv);
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationOptions, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_bool(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        {
-          int res = SWIG_AsVal_size_t(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_SimulationOptions_setMonteCarloIntegration__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'SimulationOptions_setMonteCarloIntegration'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    SimulationOptions::setMonteCarloIntegration(bool,size_t)\n"
-    "    SimulationOptions::setMonteCarloIntegration(bool)\n"
-    "    SimulationOptions::setMonteCarloIntegration()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_setNumberOfThreads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  int arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  int val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "SimulationOptions_setNumberOfThreads", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setNumberOfThreads" "', argument " "1"" of type '" "SimulationOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setNumberOfThreads" "', argument " "2"" of type '" "int""'");
-  } 
-  arg2 = static_cast< int >(val2);
-  (arg1)->setNumberOfThreads(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_getNumberOfThreads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  unsigned int result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getNumberOfThreads" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  result = (unsigned int)((SimulationOptions const *)arg1)->getNumberOfThreads();
-  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_setNumberOfBatches(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  int arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  int val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "SimulationOptions_setNumberOfBatches", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setNumberOfBatches" "', argument " "1"" of type '" "SimulationOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setNumberOfBatches" "', argument " "2"" of type '" "int""'");
-  } 
-  arg2 = static_cast< int >(val2);
-  (arg1)->setNumberOfBatches(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_getNumberOfBatches(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  unsigned int result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getNumberOfBatches" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  result = (unsigned int)((SimulationOptions const *)arg1)->getNumberOfBatches();
-  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_getCurrentBatch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  unsigned int result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getCurrentBatch" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  result = (unsigned int)((SimulationOptions const *)arg1)->getCurrentBatch();
-  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_setThreadInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  ThreadInfo *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "SimulationOptions_setThreadInfo", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setThreadInfo" "', argument " "1"" of type '" "SimulationOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_ThreadInfo,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SimulationOptions_setThreadInfo" "', argument " "2"" of type '" "ThreadInfo const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationOptions_setThreadInfo" "', argument " "2"" of type '" "ThreadInfo const &""'"); 
-  }
-  arg2 = reinterpret_cast< ThreadInfo * >(argp2);
-  (arg1)->setThreadInfo((ThreadInfo const &)*arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_getHardwareConcurrency(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  unsigned int result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getHardwareConcurrency" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  result = (unsigned int)((SimulationOptions const *)arg1)->getHardwareConcurrency();
-  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_setIncludeSpecular(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  bool arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  bool val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "SimulationOptions_setIncludeSpecular", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setIncludeSpecular" "', argument " "1"" of type '" "SimulationOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setIncludeSpecular" "', argument " "2"" of type '" "bool""'");
-  } 
-  arg2 = static_cast< bool >(val2);
-  (arg1)->setIncludeSpecular(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_includeSpecular(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  bool result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_includeSpecular" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  result = (bool)((SimulationOptions const *)arg1)->includeSpecular();
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_setUseAvgMaterials(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  bool arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  bool val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "SimulationOptions_setUseAvgMaterials", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setUseAvgMaterials" "', argument " "1"" of type '" "SimulationOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setUseAvgMaterials" "', argument " "2"" of type '" "bool""'");
-  } 
-  arg2 = static_cast< bool >(val2);
-  (arg1)->setUseAvgMaterials(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SimulationOptions_useAvgMaterials(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  bool result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_useAvgMaterials" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  result = (bool)((SimulationOptions const *)arg1)->useAvgMaterials();
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_SimulationOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationOptions, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SimulationOptions" "', argument " "1"" of type '" "SimulationOptions *""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *SimulationOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_SimulationOptions, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *SimulationOptions_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
 SWIGINTERN PyObject *_wrap_new_Transform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Transform3D *result = 0 ;
@@ -69463,101 +68934,6 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_WavevectorInfo", _wrap_delete_WavevectorInfo, METH_O, "delete_WavevectorInfo(WavevectorInfo self)"},
 	 { "WavevectorInfo_swigregister", WavevectorInfo_swigregister, METH_O, NULL},
 	 { "WavevectorInfo_swiginit", WavevectorInfo_swiginit, METH_VARARGS, NULL},
-	 { "new_SimulationOptions", _wrap_new_SimulationOptions, METH_NOARGS, "\n"
-		"new_SimulationOptions() -> SimulationOptions\n"
-		"SimulationOptions::SimulationOptions()\n"
-		"\n"
-		""},
-	 { "SimulationOptions_isIntegrate", _wrap_SimulationOptions_isIntegrate, METH_O, "\n"
-		"SimulationOptions_isIntegrate(SimulationOptions self) -> bool\n"
-		"bool SimulationOptions::isIntegrate() const\n"
-		"\n"
-		""},
-	 { "SimulationOptions_getMcPoints", _wrap_SimulationOptions_getMcPoints, METH_O, "\n"
-		"SimulationOptions_getMcPoints(SimulationOptions self) -> size_t\n"
-		"size_t SimulationOptions::getMcPoints() const\n"
-		"\n"
-		""},
-	 { "SimulationOptions_setMonteCarloIntegration", _wrap_SimulationOptions_setMonteCarloIntegration, METH_VARARGS, "\n"
-		"SimulationOptions_setMonteCarloIntegration(SimulationOptions self, bool flag=True, size_t mc_points=50)\n"
-		"void SimulationOptions::setMonteCarloIntegration(bool flag=true, size_t mc_points=50)\n"
-		"\n"
-		"Enables/disables MonetCarlo integration.\n"
-		"\n"
-		"Parameters:\n"
-		"-----------\n"
-		"\n"
-		"flag: \n"
-		"If true, MonteCarlo integration will be used, otherwise analytical calculations\n"
-		"\n"
-		"mc_points: \n"
-		"Number of points for MonteCarlo integrator \n"
-		"\n"
-		""},
-	 { "SimulationOptions_setNumberOfThreads", _wrap_SimulationOptions_setNumberOfThreads, METH_VARARGS, "\n"
-		"SimulationOptions_setNumberOfThreads(SimulationOptions self, int nthreads)\n"
-		"void SimulationOptions::setNumberOfThreads(int nthreads)\n"
-		"\n"
-		"Sets number of threads to use during the simulation (0 - take the default value from the hardware) \n"
-		"\n"
-		""},
-	 { "SimulationOptions_getNumberOfThreads", _wrap_SimulationOptions_getNumberOfThreads, METH_O, "\n"
-		"SimulationOptions_getNumberOfThreads(SimulationOptions self) -> unsigned int\n"
-		"unsigned SimulationOptions::getNumberOfThreads() const\n"
-		"\n"
-		""},
-	 { "SimulationOptions_setNumberOfBatches", _wrap_SimulationOptions_setNumberOfBatches, METH_VARARGS, "\n"
-		"SimulationOptions_setNumberOfBatches(SimulationOptions self, int nbatches)\n"
-		"void SimulationOptions::setNumberOfBatches(int nbatches)\n"
-		"\n"
-		"Sets number of batches to split. \n"
-		"\n"
-		""},
-	 { "SimulationOptions_getNumberOfBatches", _wrap_SimulationOptions_getNumberOfBatches, METH_O, "\n"
-		"SimulationOptions_getNumberOfBatches(SimulationOptions self) -> unsigned int\n"
-		"unsigned SimulationOptions::getNumberOfBatches() const\n"
-		"\n"
-		""},
-	 { "SimulationOptions_getCurrentBatch", _wrap_SimulationOptions_getCurrentBatch, METH_O, "\n"
-		"SimulationOptions_getCurrentBatch(SimulationOptions self) -> unsigned int\n"
-		"unsigned SimulationOptions::getCurrentBatch() const\n"
-		"\n"
-		""},
-	 { "SimulationOptions_setThreadInfo", _wrap_SimulationOptions_setThreadInfo, METH_VARARGS, "\n"
-		"SimulationOptions_setThreadInfo(SimulationOptions self, ThreadInfo const & thread_info)\n"
-		"void SimulationOptions::setThreadInfo(const ThreadInfo &thread_info)\n"
-		"\n"
-		"Sets the batch and thread information to be used. \n"
-		"\n"
-		""},
-	 { "SimulationOptions_getHardwareConcurrency", _wrap_SimulationOptions_getHardwareConcurrency, METH_O, "\n"
-		"SimulationOptions_getHardwareConcurrency(SimulationOptions self) -> unsigned int\n"
-		"unsigned SimulationOptions::getHardwareConcurrency() const\n"
-		"\n"
-		""},
-	 { "SimulationOptions_setIncludeSpecular", _wrap_SimulationOptions_setIncludeSpecular, METH_VARARGS, "\n"
-		"SimulationOptions_setIncludeSpecular(SimulationOptions self, bool include_specular)\n"
-		"void SimulationOptions::setIncludeSpecular(bool include_specular)\n"
-		"\n"
-		""},
-	 { "SimulationOptions_includeSpecular", _wrap_SimulationOptions_includeSpecular, METH_O, "\n"
-		"SimulationOptions_includeSpecular(SimulationOptions self) -> bool\n"
-		"bool SimulationOptions::includeSpecular() const\n"
-		"\n"
-		""},
-	 { "SimulationOptions_setUseAvgMaterials", _wrap_SimulationOptions_setUseAvgMaterials, METH_VARARGS, "\n"
-		"SimulationOptions_setUseAvgMaterials(SimulationOptions self, bool use_avg_materials)\n"
-		"void SimulationOptions::setUseAvgMaterials(bool use_avg_materials)\n"
-		"\n"
-		""},
-	 { "SimulationOptions_useAvgMaterials", _wrap_SimulationOptions_useAvgMaterials, METH_O, "\n"
-		"SimulationOptions_useAvgMaterials(SimulationOptions self) -> bool\n"
-		"bool SimulationOptions::useAvgMaterials() const\n"
-		"\n"
-		""},
-	 { "delete_SimulationOptions", _wrap_delete_SimulationOptions, METH_O, "delete_SimulationOptions(SimulationOptions self)"},
-	 { "SimulationOptions_swigregister", SimulationOptions_swigregister, METH_O, NULL},
-	 { "SimulationOptions_swiginit", SimulationOptions_swiginit, METH_VARARGS, NULL},
 	 { "new_Transform3D", _wrap_new_Transform3D, METH_NOARGS, "new_Transform3D() -> Transform3D"},
 	 { "delete_Transform3D", _wrap_delete_Transform3D, METH_O, "delete_Transform3D(Transform3D self)"},
 	 { "Transform3D_clone", _wrap_Transform3D_clone, METH_O, "Transform3D_clone(Transform3D self) -> Transform3D"},
@@ -76484,11 +75860,9 @@ static swig_type_info _swigt__p_RoughnessModelWrap__RoughnessModel = {"_p_Roughn
 static swig_type_info _swigt__p_SafePointerVectorT_IParticle_t = {"_p_SafePointerVectorT_IParticle_t", "SafePointerVector< IParticle > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SampleBuilderFactory = {"_p_SampleBuilderFactory", "SampleBuilderFactory *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SimpleSelectionRule = {"_p_SimpleSelectionRule", "SimpleSelectionRule *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_SimulationOptions = {"_p_SimulationOptions", "SimulationOptions *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SlicedParticle = {"_p_SlicedParticle", "SlicedParticle *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SlicingEffects = {"_p_SlicingEffects", "SlicingEffects *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SquareLattice2D = {"_p_SquareLattice2D", "SquareLattice2D *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_ThreadInfo = {"_p_ThreadInfo", "ThreadInfo *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Transform3D = {"_p_Transform3D", "Transform3D *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_WavevectorInfo = {"_p_WavevectorInfo", "WavevectorInfo *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ZLimits = {"_p_ZLimits", "ZLimits *", 0, 0, (void*)0, 0};
@@ -76681,11 +76055,9 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_SafePointerVectorT_IParticle_t,
   &_swigt__p_SampleBuilderFactory,
   &_swigt__p_SimpleSelectionRule,
-  &_swigt__p_SimulationOptions,
   &_swigt__p_SlicedParticle,
   &_swigt__p_SlicingEffects,
   &_swigt__p_SquareLattice2D,
-  &_swigt__p_ThreadInfo,
   &_swigt__p_Transform3D,
   &_swigt__p_WavevectorInfo,
   &_swigt__p_ZLimits,
@@ -76878,11 +76250,9 @@ static swig_cast_info _swigc__p_RoughnessModelWrap__RoughnessModel[] = {  {&_swi
 static swig_cast_info _swigc__p_SafePointerVectorT_IParticle_t[] = {  {&_swigt__p_SafePointerVectorT_IParticle_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SampleBuilderFactory[] = {  {&_swigt__p_SampleBuilderFactory, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SimpleSelectionRule[] = {  {&_swigt__p_SimpleSelectionRule, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_SimulationOptions[] = {  {&_swigt__p_SimulationOptions, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SlicedParticle[] = {  {&_swigt__p_SlicedParticle, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SlicingEffects[] = {  {&_swigt__p_SlicingEffects, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SquareLattice2D[] = {  {&_swigt__p_SquareLattice2D, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ThreadInfo[] = {  {&_swigt__p_ThreadInfo, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Transform3D[] = {  {&_swigt__p_Transform3D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_WavevectorInfo[] = {  {&_swigt__p_WavevectorInfo, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ZLimits[] = {  {&_swigt__p_ZLimits, 0, 0, 0},{0, 0, 0, 0}};
@@ -77075,11 +76445,9 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_SafePointerVectorT_IParticle_t,
   _swigc__p_SampleBuilderFactory,
   _swigc__p_SimpleSelectionRule,
-  _swigc__p_SimulationOptions,
   _swigc__p_SlicedParticle,
   _swigc__p_SlicingEffects,
   _swigc__p_SquareLattice2D,
-  _swigc__p_ThreadInfo,
   _swigc__p_Transform3D,
   _swigc__p_WavevectorInfo,
   _swigc__p_ZLimits,