From 6dd40161345e10df21e76f54c7f7a303350b90cb Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Mon, 6 Jul 2020 19:53:53 +0200
Subject: [PATCH] regenerate bindings

---
 auto/Wrap/doxygen_core.i            |  170 ++-
 auto/Wrap/doxygen_fit.i             |   31 +-
 auto/Wrap/libBornAgainCore.py       |  328 +++---
 auto/Wrap/libBornAgainCore_wrap.cpp | 1663 ++++++++++++++-------------
 auto/Wrap/libBornAgainFit_wrap.cpp  |   22 +-
 5 files changed, 1180 insertions(+), 1034 deletions(-)

diff --git a/auto/Wrap/doxygen_core.i b/auto/Wrap/doxygen_core.i
index 849be6a4216..c99e0897dfd 100644
--- a/auto/Wrap/doxygen_core.i
+++ b/auto/Wrap/doxygen_core.i
@@ -2938,10 +2938,12 @@ Calls the  INodeVisitor's visit method.
 %feature("docstring")  FormFactorBox::getLength "double FormFactorBox::getLength() const
 ";
 
-%feature("docstring")  FormFactorBox::getHeight "double FormFactorBox::getHeight() const
+%feature("docstring")  FormFactorBox::getWidth "double FormFactorBox::getWidth() const
 ";
 
-%feature("docstring")  FormFactorBox::getWidth "double FormFactorBox::getWidth() const
+%feature("docstring")  FormFactorBox::volume "double FormFactorBox::volume() const override final
+
+Returns the volume of this prism. 
 ";
 
 %feature("docstring")  FormFactorBox::radialExtension "double FormFactorBox::radialExtension() const override final
@@ -2951,7 +2953,7 @@ Returns the (approximate in some cases) radial size of the particle of this form
 
 %feature("docstring")  FormFactorBox::evaluate_for_q "complex_t FormFactorBox::evaluate_for_q(cvector_t q) const override final
 
-Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+Returns the form factor F(q) of this polyhedron, respecting the offset height/2. 
 ";
 
 
@@ -4261,12 +4263,12 @@ Returns the z-coordinate of the lowest point in this shape after a given rotatio
 Returns the z-coordinate of the lowest point in this shape after a given rotation. 
 ";
 
-%feature("docstring")  FormFactorPolygonalPrism::evaluate_for_q "complex_t FormFactorPolygonalPrism::evaluate_for_q(cvector_t q) const override final
+%feature("docstring")  FormFactorPolygonalPrism::evaluate_for_q "complex_t FormFactorPolygonalPrism::evaluate_for_q(cvector_t q) const override
 
 Returns the form factor F(q) of this polyhedron, respecting the offset height/2. 
 ";
 
-%feature("docstring")  FormFactorPolygonalPrism::volume "double FormFactorPolygonalPrism::volume() const override final
+%feature("docstring")  FormFactorPolygonalPrism::volume "double FormFactorPolygonalPrism::volume() const override
 
 Returns the volume of this prism. 
 ";
@@ -4274,7 +4276,7 @@ Returns the volume of this prism.
 %feature("docstring")  FormFactorPolygonalPrism::getHeight "double FormFactorPolygonalPrism::getHeight() const
 ";
 
-%feature("docstring")  FormFactorPolygonalPrism::radialExtension "double FormFactorPolygonalPrism::radialExtension() const override final
+%feature("docstring")  FormFactorPolygonalPrism::radialExtension "virtual double FormFactorPolygonalPrism::radialExtension() const override
 
 Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
 ";
@@ -6353,7 +6355,12 @@ C++ includes: IComputation.h
 
 
 // File: classIdentityRotation.xml
-%feature("docstring") IdentityRotation "";
+%feature("docstring") IdentityRotation "
+
+The identity rotation, which leaves everything in place.
+
+C++ includes: Rotations.h
+";
 
 %feature("docstring")  IdentityRotation::IdentityRotation "IdentityRotation::IdentityRotation()=default
 ";
@@ -9877,7 +9884,14 @@ Print scan definition in python format.
 
 
 // File: classISpecularStrategy.xml
-%feature("docstring") ISpecularStrategy "";
+%feature("docstring") ISpecularStrategy "
+
+Interface for the Fresnel computations, both in the scalar and magnetic case
+
+Inherited by  SpecularScalarStrategy,  SpecularMagneticOldStrategy,  SpecularMagneticStrategy, SpecularMagneticNewStrategy
+
+C++ includes: ISpecularStrategy.h
+";
 
 %feature("docstring")  ISpecularStrategy::~ISpecularStrategy "virtual ISpecularStrategy::~ISpecularStrategy()=default
 ";
@@ -12122,7 +12136,12 @@ Sets concrete writing strategy.
 
 
 // File: classParameterDistribution.xml
-%feature("docstring") ParameterDistribution "";
+%feature("docstring") ParameterDistribution "
+
+A parametric distribution function, for use with any model parameter.
+
+C++ includes: ParameterDistribution.h
+";
 
 %feature("docstring")  ParameterDistribution::ParameterDistribution "ParameterDistribution::ParameterDistribution(const std::string &par_name, const IDistribution1D &distribution, size_t nbr_samples, double sigma_factor=0.0, const RealLimits &limits=RealLimits())
 ";
@@ -13253,7 +13272,14 @@ Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This m
 
 
 // File: classProfileHelper.xml
-%feature("docstring") ProfileHelper "";
+%feature("docstring") ProfileHelper "
+
+Object that can generate the material profile of a sample as a function of depth.
+
+The generated profile contains the complex SLD for SLD materials and the parameters delta and beta for refractive index materials
+
+C++ includes: ProfileHelper.h
+";
 
 %feature("docstring")  ProfileHelper::ProfileHelper "ProfileHelper::ProfileHelper(const ProcessedSample &sample)
 ";
@@ -13986,7 +14012,12 @@ return default axes units
 
 
 // File: classRectangularPixel.xml
-%feature("docstring") RectangularPixel "";
+%feature("docstring") RectangularPixel "
+
+A pixel in a  RectangularDetector.
+
+C++ includes: RectangularDetector.h
+";
 
 %feature("docstring")  RectangularPixel::RectangularPixel "RectangularPixel::RectangularPixel(kvector_t corner_pos, kvector_t width, kvector_t height)
 ";
@@ -14325,7 +14356,12 @@ C++ includes: TwoDimLatticeBuilder.h
 
 
 // File: classRotationEuler.xml
-%feature("docstring") RotationEuler "";
+%feature("docstring") RotationEuler "
+
+A sequence of rotations about the z-x'-z'' axes.
+
+C++ includes: Rotations.h
+";
 
 %feature("docstring")  RotationEuler::RotationEuler "RotationEuler::RotationEuler(double alpha, double beta, double gamma)
 
@@ -14375,7 +14411,12 @@ Returns transformation.
 
 
 // File: classRotationX.xml
-%feature("docstring") RotationX "";
+%feature("docstring") RotationX "
+
+A rotation about the x axis.
+
+C++ includes: Rotations.h
+";
 
 %feature("docstring")  RotationX::RotationX "RotationX::RotationX(double angle)
 
@@ -14413,7 +14454,12 @@ Returns transformation.
 
 
 // File: classRotationY.xml
-%feature("docstring") RotationY "";
+%feature("docstring") RotationY "
+
+A rotation about the y axis.
+
+C++ includes: Rotations.h
+";
 
 %feature("docstring")  RotationY::RotationY "RotationY::RotationY(double angle)
 
@@ -14451,7 +14497,12 @@ Returns transformation.
 
 
 // File: classRotationZ.xml
-%feature("docstring") RotationZ "";
+%feature("docstring") RotationZ "
+
+A rotation about the z axis.
+
+C++ includes: Rotations.h
+";
 
 %feature("docstring")  RotationZ::RotationZ "RotationZ::RotationZ(double angle=0.0)
 
@@ -15897,6 +15948,8 @@ C++ includes: SpecularComputation.h
 
 Computes the specular scattering. Used by  SpecularComputation.
 
+Inherited by  SpecularScalarTerm,  SpecularMatrixTerm
+
 C++ includes: SpecularComputationTerm.h
 ";
 
@@ -15979,7 +16032,9 @@ Computes refraction angle reflection/transmission coefficients for given sliced
 // File: classSpecularMagneticStrategy.xml
 %feature("docstring") SpecularMagneticStrategy "
 
-Implements the matrix formalism for the calculation of wave amplitudes of the coherent wave solution in a multilayer with magnetization.
+Implements the magnetic Fresnel computation without roughness
+
+Implements the matrix formalism for the calculation of wave amplitudes of the coherent wave solution in a multilayer with magnetization. For a detailed description see internal document \"Polarized Specular Reflectometry\"
 
 C++ includes: SpecularMagneticStrategy.h
 ";
@@ -15996,7 +16051,12 @@ Computes refraction angle reflection/transmission coefficients for given sliced
 
 
 // File: classSpecularMatrixTerm.xml
-%feature("docstring") SpecularMatrixTerm "";
+%feature("docstring") SpecularMatrixTerm "
+
+Computes the specular scattering for a magnetic sample Used by  SpecularComputation.
+
+C++ includes: SpecularComputationTerm.h
+";
 
 %feature("docstring")  SpecularMatrixTerm::SpecularMatrixTerm "SpecularMatrixTerm::SpecularMatrixTerm(std::unique_ptr< ISpecularStrategy > strategy)
 ";
@@ -16005,7 +16065,9 @@ Computes refraction angle reflection/transmission coefficients for given sliced
 // File: classSpecularScalarNCStrategy.xml
 %feature("docstring") SpecularScalarNCStrategy "
 
-Implements method 'execute' to compute refraction angles and transmission/reflection coefficients for coherent wave propagation in a multilayer.
+Implements Nevot-Croce roughness for a scaler computation.
+
+Implements the transition function that includes Nevot-Croce roughness in the computation of the coefficients for coherent wave propagation in a multilayer by applying modified Fresnel coefficients.
 
 C++ includes: SpecularScalarNCStrategy.h
 ";
@@ -16014,8 +16076,12 @@ C++ includes: SpecularScalarNCStrategy.h
 // File: classSpecularScalarStrategy.xml
 %feature("docstring") SpecularScalarStrategy "
 
+Implements the scalar Fresnel computation
+
 Implements method 'execute' to compute refraction angles and transmission/reflection coefficients for coherent wave propagation in a multilayer.
 
+Inherited by  SpecularScalarNCStrategy,  SpecularScalarTanhStrategy
+
 C++ includes: SpecularScalarStrategy.h
 ";
 
@@ -16031,14 +16097,21 @@ Computes refraction angles and transmission/reflection coefficients for given co
 // File: classSpecularScalarTanhStrategy.xml
 %feature("docstring") SpecularScalarTanhStrategy "
 
-Implements method 'execute' to compute refraction angles and transmission/reflection coefficients for coherent wave propagation in a multilayer.
+Implements an tanh transition function to model roughness in a scaler computation.
+
+Implements the transition function that includes the analytical roughness model of an tanh interface transition in the computation of the coefficients for coherent wave propagation in a multilayer by applying modified Fresnel coefficients.
 
 C++ includes: SpecularScalarTanhStrategy.h
 ";
 
 
 // File: classSpecularScalarTerm.xml
-%feature("docstring") SpecularScalarTerm "";
+%feature("docstring") SpecularScalarTerm "
+
+Computes the specular scattering for a scalar sample Used by  SpecularComputation.
+
+C++ includes: SpecularComputationTerm.h
+";
 
 %feature("docstring")  SpecularScalarTerm::SpecularScalarTerm "SpecularScalarTerm::SpecularScalarTerm(std::unique_ptr< ISpecularStrategy > strategy)
 ";
@@ -16209,7 +16282,7 @@ Returns the list of all available units.
 // File: classSphericalDetector.xml
 %feature("docstring") SphericalDetector "
 
-A spherical detector with axes and resolution function.  SphericalDetector
+A spherical detector with axes and resolution function.
 
 C++ includes: SphericalDetector.h
 ";
@@ -16264,7 +16337,12 @@ return default axes units
 
 
 // File: classSphericalPixel.xml
-%feature("docstring") SphericalPixel "";
+%feature("docstring") SphericalPixel "
+
+A pixel in a  SphericalDetector.
+
+C++ includes: SphericalDetector.h
+";
 
 %feature("docstring")  SphericalPixel::SphericalPixel "SphericalPixel::SphericalPixel(const Bin1D &alpha_bin, const Bin1D &phi_bin)
 ";
@@ -17108,49 +17186,49 @@ C++ includes: ZLimits.h
 // File: namespace_0d312.xml
 
 
-// File: namespace_0d316.xml
+// File: namespace_0d314.xml
 
 
-// File: namespace_0d318.xml
+// File: namespace_0d32.xml
 
 
-// File: namespace_0d32.xml
+// File: namespace_0d326.xml
 
 
-// File: namespace_0d330.xml
+// File: namespace_0d332.xml
 
 
-// File: namespace_0d336.xml
+// File: namespace_0d353.xml
 
 
 // File: namespace_0d357.xml
 
 
-// File: namespace_0d361.xml
+// File: namespace_0d359.xml
 
 
-// File: namespace_0d363.xml
+// File: namespace_0d361.xml
 
 
-// File: namespace_0d365.xml
+// File: namespace_0d371.xml
 
 
-// File: namespace_0d375.xml
+// File: namespace_0d383.xml
 
 
 // File: namespace_0d387.xml
 
 
-// File: namespace_0d391.xml
+// File: namespace_0d399.xml
 
 
 // File: namespace_0d40.xml
 
 
-// File: namespace_0d403.xml
+// File: namespace_0d405.xml
 
 
-// File: namespace_0d409.xml
+// File: namespace_0d407.xml
 
 
 // File: namespace_0d414.xml
@@ -19258,18 +19336,6 @@ make Swappable
 // File: ResolutionFunction2DGaussian_8h.xml
 
 
-// File: SampleBuilderNode_8cpp.xml
-
-
-// File: SampleBuilderNode_8h.xml
-
-
-// File: SampleProvider_8cpp.xml
-
-
-// File: SampleProvider_8h.xml
-
-
 // File: ScanResolution_8cpp.xml
 
 
@@ -19661,6 +19727,18 @@ Generate z values (equidistant) for use in MaterialProfile.
 // File: RoughnessModels_8h.xml
 
 
+// File: SampleBuilderNode_8cpp.xml
+
+
+// File: SampleBuilderNode_8h.xml
+
+
+// File: SampleProvider_8cpp.xml
+
+
+// File: SampleProvider_8h.xml
+
+
 // File: ScalarFresnelMap_8cpp.xml
 
 
diff --git a/auto/Wrap/doxygen_fit.i b/auto/Wrap/doxygen_fit.i
index e25c3ccf26f..f3c24b28100 100644
--- a/auto/Wrap/doxygen_fit.i
+++ b/auto/Wrap/doxygen_fit.i
@@ -1256,31 +1256,36 @@ run minimization
 ";
 
 
-// File: classTimeInterval.xml
-%feature("docstring") TimeInterval "";
+// File: classWallclockTimer.xml
+%feature("docstring") WallclockTimer "
 
-%feature("docstring")  TimeInterval::TimeInterval "TimeInterval::TimeInterval()
+A timer for measuring real (wall-clock) time spent between 'start' and 'stop' commands.
+
+C++ includes: WallclockTimer.h
+";
+
+%feature("docstring")  WallclockTimer::WallclockTimer "WallclockTimer::WallclockTimer()
 ";
 
-%feature("docstring")  TimeInterval::~TimeInterval "TimeInterval::~TimeInterval()
+%feature("docstring")  WallclockTimer::~WallclockTimer "WallclockTimer::~WallclockTimer()
 ";
 
-%feature("docstring")  TimeInterval::start "void TimeInterval::start()
+%feature("docstring")  WallclockTimer::start "void WallclockTimer::start()
 ";
 
-%feature("docstring")  TimeInterval::stop "void TimeInterval::stop()
+%feature("docstring")  WallclockTimer::stop "void WallclockTimer::stop()
 ";
 
-%feature("docstring")  TimeInterval::runTime "double TimeInterval::runTime() const
+%feature("docstring")  WallclockTimer::runTime "double WallclockTimer::runTime() const
 
-returns run time in sec.msec 
+returns run time in sec. 
 ";
 
 
-// File: classTimeIntervalImp.xml
-%feature("docstring") TimeIntervalImp "";
+// File: structWallclockTimerState.xml
+%feature("docstring") WallclockTimerState "
 
-%feature("docstring")  TimeIntervalImp::TimeIntervalImp "TimeIntervalImp::TimeIntervalImp()
+Internal state of a  WallclockTimer object. 
 ";
 
 
@@ -1607,10 +1612,10 @@ Returns new string which is lower case of text.
 // File: StringUtils_8h.xml
 
 
-// File: TimeInterval_8cpp.xml
+// File: WallclockTimer_8cpp.xml
 
 
-// File: TimeInterval_8h.xml
+// File: WallclockTimer_8h.xml
 
 
 // File: dir_892d84e8d1420bf45a9053cf0eede900.xml
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index 27463c3dbd8..769f0c83af6 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -9481,7 +9481,7 @@ class FormFactorPolygonalPrism(IFormFactorBorn):
     def evaluate_for_q(self, q):
         r"""
         evaluate_for_q(FormFactorPolygonalPrism self, cvector_t q) -> complex_t
-        complex_t FormFactorPolygonalPrism::evaluate_for_q(cvector_t q) const override final
+        complex_t FormFactorPolygonalPrism::evaluate_for_q(cvector_t q) const override
 
         Returns the form factor F(q) of this polyhedron, respecting the offset height/2. 
 
@@ -9491,7 +9491,7 @@ class FormFactorPolygonalPrism(IFormFactorBorn):
     def volume(self):
         r"""
         volume(FormFactorPolygonalPrism self) -> double
-        double FormFactorPolygonalPrism::volume() const override final
+        double FormFactorPolygonalPrism::volume() const override
 
         Returns the volume of this prism. 
 
@@ -9509,7 +9509,7 @@ class FormFactorPolygonalPrism(IFormFactorBorn):
     def radialExtension(self):
         r"""
         radialExtension(FormFactorPolygonalPrism self) -> double
-        double FormFactorPolygonalPrism::radialExtension() const override final
+        virtual double FormFactorPolygonalPrism::radialExtension() const override
 
         Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
 
@@ -9888,7 +9888,7 @@ class FormFactorAnisoPyramid(FormFactorPolyhedron):
 # Register FormFactorAnisoPyramid in _libBornAgainCore:
 _libBornAgainCore.FormFactorAnisoPyramid_swigregister(FormFactorAnisoPyramid)
 
-class FormFactorBox(IFormFactorBorn):
+class FormFactorBox(FormFactorPolygonalPrism):
     r"""
 
 
@@ -9951,14 +9951,6 @@ class FormFactorBox(IFormFactorBorn):
         """
         return _libBornAgainCore.FormFactorBox_getLength(self)
 
-    def getHeight(self):
-        r"""
-        getHeight(FormFactorBox self) -> double
-        double FormFactorBox::getHeight() const
-
-        """
-        return _libBornAgainCore.FormFactorBox_getHeight(self)
-
     def getWidth(self):
         r"""
         getWidth(FormFactorBox self) -> double
@@ -9967,6 +9959,16 @@ class FormFactorBox(IFormFactorBorn):
         """
         return _libBornAgainCore.FormFactorBox_getWidth(self)
 
+    def volume(self):
+        r"""
+        volume(FormFactorBox self) -> double
+        double FormFactorBox::volume() const override final
+
+        Returns the volume of this prism. 
+
+        """
+        return _libBornAgainCore.FormFactorBox_volume(self)
+
     def radialExtension(self):
         r"""
         radialExtension(FormFactorBox self) -> double
@@ -9982,7 +9984,7 @@ class FormFactorBox(IFormFactorBorn):
         evaluate_for_q(FormFactorBox self, cvector_t q) -> complex_t
         complex_t FormFactorBox::evaluate_for_q(cvector_t q) const override final
 
-        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+        Returns the form factor F(q) of this polyhedron, respecting the offset height/2. 
 
         """
         return _libBornAgainCore.FormFactorBox_evaluate_for_q(self, q)
@@ -16207,7 +16209,14 @@ def IsZRotation(rot):
     """
     return _libBornAgainCore.IsZRotation(rot)
 class IdentityRotation(IRotation):
-    r"""Proxy of C++ IdentityRotation class."""
+    r"""
+
+
+    The identity rotation, which leaves everything in place.
+
+    C++ includes: Rotations.h
+
+    """
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
@@ -16275,7 +16284,14 @@ class IdentityRotation(IRotation):
 _libBornAgainCore.IdentityRotation_swigregister(IdentityRotation)
 
 class RotationX(IRotation):
-    r"""Proxy of C++ RotationX class."""
+    r"""
+
+
+    A rotation about the x axis.
+
+    C++ includes: Rotations.h
+
+    """
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
@@ -16349,7 +16365,14 @@ class RotationX(IRotation):
 _libBornAgainCore.RotationX_swigregister(RotationX)
 
 class RotationY(IRotation):
-    r"""Proxy of C++ RotationY class."""
+    r"""
+
+
+    A rotation about the y axis.
+
+    C++ includes: Rotations.h
+
+    """
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
@@ -16423,7 +16446,14 @@ class RotationY(IRotation):
 _libBornAgainCore.RotationY_swigregister(RotationY)
 
 class RotationZ(IRotation):
-    r"""Proxy of C++ RotationZ class."""
+    r"""
+
+
+    A rotation about the z axis.
+
+    C++ includes: Rotations.h
+
+    """
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
@@ -16497,7 +16527,14 @@ class RotationZ(IRotation):
 _libBornAgainCore.RotationZ_swigregister(RotationZ)
 
 class RotationEuler(IRotation):
-    r"""Proxy of C++ RotationEuler class."""
+    r"""
+
+
+    A sequence of rotations about the z-x'-z'' axes.
+
+    C++ includes: Rotations.h
+
+    """
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
@@ -18416,11 +18453,11 @@ class IPixel(object):
 # Register IPixel in _libBornAgainCore:
 _libBornAgainCore.IPixel_swigregister(IPixel)
 
-class SphericalDetector(IDetector2D):
+class SphericalPixel(IPixel):
     r"""
 
 
-    A spherical detector with axes and resolution function.  SphericalDetector
+    A pixel in a  SphericalDetector.
 
     C++ includes: SphericalDetector.h
 
@@ -18429,54 +18466,6 @@ class SphericalDetector(IDetector2D):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, *args):
-        r"""
-        __init__(SphericalDetector self) -> SphericalDetector
-        __init__(SphericalDetector self, size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max) -> SphericalDetector
-        __init__(SphericalDetector self, SphericalDetector other) -> SphericalDetector
-        SphericalDetector::SphericalDetector(const SphericalDetector &other)
-
-        """
-        _libBornAgainCore.SphericalDetector_swiginit(self, _libBornAgainCore.new_SphericalDetector(*args))
-
-    def clone(self):
-        r"""
-        clone(SphericalDetector self) -> SphericalDetector
-        SphericalDetector * SphericalDetector::clone() const override
-
-        """
-        return _libBornAgainCore.SphericalDetector_clone(self)
-
-    def accept(self, visitor):
-        r"""
-        accept(SphericalDetector self, INodeVisitor visitor)
-        void SphericalDetector::accept(INodeVisitor *visitor) const override
-
-        Calls the  INodeVisitor's visit method. 
-
-        """
-        return _libBornAgainCore.SphericalDetector_accept(self, visitor)
-    __swig_destroy__ = _libBornAgainCore.delete_SphericalDetector
-
-    def defaultAxesUnits(self):
-        r"""
-        defaultAxesUnits(SphericalDetector self) -> AxesUnits
-        AxesUnits SphericalDetector::defaultAxesUnits() const override
-
-        return default axes units 
-
-        """
-        return _libBornAgainCore.SphericalDetector_defaultAxesUnits(self)
-
-# Register SphericalDetector in _libBornAgainCore:
-_libBornAgainCore.SphericalDetector_swigregister(SphericalDetector)
-
-class SphericalPixel(IPixel):
-    r"""Proxy of C++ SphericalPixel class."""
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-
     def __init__(self, alpha_bin, phi_bin):
         r"""
         __init__(SphericalPixel self, Bin1D alpha_bin, Bin1D phi_bin) -> SphericalPixel
@@ -18529,6 +18518,61 @@ class SphericalPixel(IPixel):
 # Register SphericalPixel in _libBornAgainCore:
 _libBornAgainCore.SphericalPixel_swigregister(SphericalPixel)
 
+class SphericalDetector(IDetector2D):
+    r"""
+
+
+    A spherical detector with axes and resolution function.
+
+    C++ includes: SphericalDetector.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, *args):
+        r"""
+        __init__(SphericalDetector self) -> SphericalDetector
+        __init__(SphericalDetector self, size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max) -> SphericalDetector
+        __init__(SphericalDetector self, SphericalDetector other) -> SphericalDetector
+        SphericalDetector::SphericalDetector(const SphericalDetector &other)
+
+        """
+        _libBornAgainCore.SphericalDetector_swiginit(self, _libBornAgainCore.new_SphericalDetector(*args))
+
+    def clone(self):
+        r"""
+        clone(SphericalDetector self) -> SphericalDetector
+        SphericalDetector * SphericalDetector::clone() const override
+
+        """
+        return _libBornAgainCore.SphericalDetector_clone(self)
+
+    def accept(self, visitor):
+        r"""
+        accept(SphericalDetector self, INodeVisitor visitor)
+        void SphericalDetector::accept(INodeVisitor *visitor) const override
+
+        Calls the  INodeVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.SphericalDetector_accept(self, visitor)
+    __swig_destroy__ = _libBornAgainCore.delete_SphericalDetector
+
+    def defaultAxesUnits(self):
+        r"""
+        defaultAxesUnits(SphericalDetector self) -> AxesUnits
+        AxesUnits SphericalDetector::defaultAxesUnits() const override
+
+        return default axes units 
+
+        """
+        return _libBornAgainCore.SphericalDetector_defaultAxesUnits(self)
+
+# Register SphericalDetector in _libBornAgainCore:
+_libBornAgainCore.SphericalDetector_swigregister(SphericalDetector)
+
 class IsGISAXSDetector(SphericalDetector):
     r"""
 
@@ -20666,7 +20710,14 @@ class IntensityData(object):
 _libBornAgainCore.IntensityData_swigregister(IntensityData)
 
 class ParameterDistribution(IParameterized):
-    r"""Proxy of C++ ParameterDistribution class."""
+    r"""
+
+
+    A parametric distribution function, for use with any model parameter.
+
+    C++ includes: ParameterDistribution.h
+
+    """
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
@@ -22211,6 +22262,79 @@ class Rectangle(IShape2D):
 # Register Rectangle in _libBornAgainCore:
 _libBornAgainCore.Rectangle_swigregister(Rectangle)
 
+class RectangularPixel(IPixel):
+    r"""
+
+
+    A pixel in a  RectangularDetector.
+
+    C++ includes: RectangularDetector.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, corner_pos, width, height):
+        r"""
+        __init__(RectangularPixel self, kvector_t corner_pos, kvector_t width, kvector_t height) -> RectangularPixel
+        RectangularPixel::RectangularPixel(kvector_t corner_pos, kvector_t width, kvector_t height)
+
+        """
+        _libBornAgainCore.RectangularPixel_swiginit(self, _libBornAgainCore.new_RectangularPixel(corner_pos, width, height))
+
+    def clone(self):
+        r"""
+        clone(RectangularPixel self) -> RectangularPixel
+        RectangularPixel * RectangularPixel::clone() const override
+
+        """
+        return _libBornAgainCore.RectangularPixel_clone(self)
+
+    def createZeroSizePixel(self, x, y):
+        r"""
+        createZeroSizePixel(RectangularPixel self, double x, double y) -> RectangularPixel
+        RectangularPixel * RectangularPixel::createZeroSizePixel(double x, double y) const override
+
+        """
+        return _libBornAgainCore.RectangularPixel_createZeroSizePixel(self, x, y)
+
+    def getK(self, x, y, wavelength):
+        r"""
+        getK(RectangularPixel self, double x, double y, double wavelength) -> kvector_t
+        kvector_t RectangularPixel::getK(double x, double y, double wavelength) const override
+
+        """
+        return _libBornAgainCore.RectangularPixel_getK(self, x, y, wavelength)
+
+    def getPosition(self, x, y):
+        r"""
+        getPosition(RectangularPixel self, double x, double y) -> kvector_t
+        kvector_t RectangularPixel::getPosition(double x, double y) const
+
+        """
+        return _libBornAgainCore.RectangularPixel_getPosition(self, x, y)
+
+    def getIntegrationFactor(self, x, y):
+        r"""
+        getIntegrationFactor(RectangularPixel self, double x, double y) -> double
+        double RectangularPixel::getIntegrationFactor(double x, double y) const override
+
+        """
+        return _libBornAgainCore.RectangularPixel_getIntegrationFactor(self, x, y)
+
+    def getSolidAngle(self):
+        r"""
+        getSolidAngle(RectangularPixel self) -> double
+        double RectangularPixel::getSolidAngle() const override
+
+        """
+        return _libBornAgainCore.RectangularPixel_getSolidAngle(self)
+    __swig_destroy__ = _libBornAgainCore.delete_RectangularPixel
+
+# Register RectangularPixel in _libBornAgainCore:
+_libBornAgainCore.RectangularPixel_swigregister(RectangularPixel)
+
 class RectangularDetector(IDetector2D):
     r"""
 
@@ -22429,72 +22553,6 @@ class RectangularDetector(IDetector2D):
 # Register RectangularDetector in _libBornAgainCore:
 _libBornAgainCore.RectangularDetector_swigregister(RectangularDetector)
 
-class RectangularPixel(IPixel):
-    r"""Proxy of C++ RectangularPixel class."""
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-
-    def __init__(self, corner_pos, width, height):
-        r"""
-        __init__(RectangularPixel self, kvector_t corner_pos, kvector_t width, kvector_t height) -> RectangularPixel
-        RectangularPixel::RectangularPixel(kvector_t corner_pos, kvector_t width, kvector_t height)
-
-        """
-        _libBornAgainCore.RectangularPixel_swiginit(self, _libBornAgainCore.new_RectangularPixel(corner_pos, width, height))
-
-    def clone(self):
-        r"""
-        clone(RectangularPixel self) -> RectangularPixel
-        RectangularPixel * RectangularPixel::clone() const override
-
-        """
-        return _libBornAgainCore.RectangularPixel_clone(self)
-
-    def createZeroSizePixel(self, x, y):
-        r"""
-        createZeroSizePixel(RectangularPixel self, double x, double y) -> RectangularPixel
-        RectangularPixel * RectangularPixel::createZeroSizePixel(double x, double y) const override
-
-        """
-        return _libBornAgainCore.RectangularPixel_createZeroSizePixel(self, x, y)
-
-    def getK(self, x, y, wavelength):
-        r"""
-        getK(RectangularPixel self, double x, double y, double wavelength) -> kvector_t
-        kvector_t RectangularPixel::getK(double x, double y, double wavelength) const override
-
-        """
-        return _libBornAgainCore.RectangularPixel_getK(self, x, y, wavelength)
-
-    def getPosition(self, x, y):
-        r"""
-        getPosition(RectangularPixel self, double x, double y) -> kvector_t
-        kvector_t RectangularPixel::getPosition(double x, double y) const
-
-        """
-        return _libBornAgainCore.RectangularPixel_getPosition(self, x, y)
-
-    def getIntegrationFactor(self, x, y):
-        r"""
-        getIntegrationFactor(RectangularPixel self, double x, double y) -> double
-        double RectangularPixel::getIntegrationFactor(double x, double y) const override
-
-        """
-        return _libBornAgainCore.RectangularPixel_getIntegrationFactor(self, x, y)
-
-    def getSolidAngle(self):
-        r"""
-        getSolidAngle(RectangularPixel self) -> double
-        double RectangularPixel::getSolidAngle() const override
-
-        """
-        return _libBornAgainCore.RectangularPixel_getSolidAngle(self)
-    __swig_destroy__ = _libBornAgainCore.delete_RectangularPixel
-
-# Register RectangularPixel in _libBornAgainCore:
-_libBornAgainCore.RectangularPixel_swigregister(RectangularPixel)
-
 class ResolutionFunction2DGaussian(IResolutionFunction2D):
     r"""
 
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index fb7e4ed8af8..900f13eeb10 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -6895,165 +6895,165 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include <numpy/arrayobject.h>
 
 
-#include "AngularSpecScan.h"
+#include "Core/Instrument/AngularSpecScan.h"
 #include "BAVersion.h"
-#include "BasicVector3D.h"
-#include "Beam.h"
-#include "Bin.h"
-#include "ChiSquaredModule.h"
-#include "Complex.h"
-#include "ConstantBackground.h"
-#include "ConstKBinAxis.h"
-#include "Crystal.h"
-#include "CustomBinAxis.h"
-#include "DepthProbeSimulation.h"
-#include "DetectorMask.h"
-#include "Distributions.h"
-#include "Ellipse.h"
-#include "FTDecayFunctions.h"
-#include "FTDistributions1D.h"
-#include "FTDistributions2D.h"
-#include "FitOptions.h"
-#include "PyFittingCallbacks.h"
-#include "FitObjective.h"
-#include "FixedBinAxis.h"
-#include "FootprintFactorGaussian.h"
-#include "FootprintFactorSquare.h"
-#include "FormFactorAnisoPyramid.h"
-#include "FormFactorBar.h"
-#include "FormFactorBox.h"
-#include "FormFactorCantellatedCube.h"
-#include "FormFactorCone.h"
-#include "FormFactorCone6.h"
-#include "FormFactorCrystal.h"
-#include "FormFactorCuboctahedron.h"
-#include "FormFactorCylinder.h"
-#include "FormFactorDebyeBueche.h"
-#include "FormFactorDodecahedron.h"
-#include "FormFactorDot.h"
-#include "FormFactorEllipsoidalCylinder.h"
-#include "FormFactorFullSphere.h"
-#include "FormFactorFullSpheroid.h"
-#include "FormFactorGauss.h"
-#include "FormFactorHemiEllipsoid.h"
-#include "FormFactorIcosahedron.h"
-#include "FormFactorLongBoxGauss.h"
-#include "FormFactorLongBoxLorentz.h"
-#include "FormFactorLorentz.h"
-#include "FormFactorOrnsteinZernike.h"
-#include "FormFactorPolyhedron.h"
-#include "FormFactorPolyhedron.h"
-#include "FormFactorPrism3.h"
-#include "FormFactorPrism6.h"
-#include "FormFactorPyramid.h"
-#include "FormFactorRipple1.h"
-#include "FormFactorRipple2.h"
-#include "FormFactorSphereGaussianRadius.h"
-#include "FormFactorSphereLogNormalRadius.h"
-#include "FormFactorSphereUniformRadius.h"
-#include "FormFactorTetrahedron.h"
-#include "FormFactorTruncatedCube.h"
-#include "FormFactorTruncatedSphere.h"
-#include "FormFactorTruncatedSpheroid.h"
-#include "FormFactorWeighted.h"
-#include "GISASSimulation.h"
-#include "Histogram1D.h"
-#include "Histogram2D.h"
-#include "IAbstractParticle.h"
-#include "IBackground.h"
-#include "ICloneable.h"
-#include "IClusteredParticles.h"
-#include "IDetector2D.h"
-#include "IDetectorResolution.h"
-#include "IFormFactorDecorator.h"
-#include "IHistogram.h"
-#include "IIntensityFunction.h"
-#include "IInterferenceFunction.h"
-#include "ILayout.h"
-#include "INamed.h"
-#include "INode.h"
-#include "IObserver.h"
-#include "IParameterized.h"
-#include "IParticle.h"
-#include "IPeakShape.h"
-#include "IResolutionFunction2D.h"
-#include "ISample.h"
-#include "IMultiLayerBuilder.h"
-#include "INodeVisitor.h"
-#include "ISelectionRule.h"
-#include "IShape2D.h"
-#include "ISingleton.h"
-#include "Instrument.h"
-#include "IntensityDataFunctions.h"
-#include "IntensityDataIOFactory.h"
-#include "InterferenceFunction1DLattice.h"
-#include "InterferenceFunction2DLattice.h"
-#include "InterferenceFunction2DParaCrystal.h"
-#include "InterferenceFunction2DSuperLattice.h"
-#include "InterferenceFunction3DLattice.h"
-#include "InterferenceFunctionFinite2DLattice.h"
-#include "InterferenceFunctionFinite3DLattice.h"
-#include "InterferenceFunctionHardDisk.h"
-#include "InterferenceFunctionNone.h"
-#include "InterferenceFunctionRadialParaCrystal.h"
-#include "InterferenceFunctionTwin.h"
-#include "IsGISAXSDetector.h"
-#include "ILatticeOrientation.h"
-#include "Lattice.h"
-#include "LatticeUtils.h"
-#include "Lattice1DParameters.h"
-#include "Lattice2D.h"
-#include "Layer.h"
-#include "LayerInterface.h"
-#include "LayerRoughness.h"
-#include "Line.h"
-#include "MaterialFactoryFuncs.h"
-#include "MathFunctions.h"
-#include "MesoCrystal.h"
-#include "MultiLayer.h"
-#include "MultiLayerFuncs.h"
-#include "OffSpecSimulation.h"
-#include "OutputData.h"
-#include "ParameterDistribution.h"
-#include "ParameterPool.h"
-#include "ParameterSample.h"
-#include "Particle.h"
-#include "ParticleComposition.h"
-#include "ParticleCoreShell.h"
-#include "ParticleDistribution.h"
-#include "ParticleLayout.h"
-#include "PoissonNoiseBackground.h"
-#include "Polygon.h"
-#include "PyArrayImportUtils.h"
-#include "QSpecScan.h"
-#include "RangedDistributions.h"
-#include "RealParameter.h"
-#include "Rectangle.h"
-#include "RectangularDetector.h"
-#include "ResolutionFunction2DGaussian.h"
-#include "Ripples.h"
-#include "Rotations.h"
-#include "SampleBuilderFactory.h"
-#include "ScanResolution.h"
-#include "Simulation.h"
-#include "Simulation2D.h"
-#include "SimulationFactory.h"
-#include "SimulationOptions.h"
-#include "SimulationResult.h"
-#include "SlicedParticle.h"
-#include "SpecularSimulation.h"
-#include "SphericalDetector.h"
-#include "ThreadInfo.h"
-#include "Units.h"
-#include "VariableBinAxis.h"
-#include "Vectors3D.h"
-#include "WavevectorInfo.h"
-#include "IChiSquaredModule.h"
-#include "IIntensityFunction.h"
-#include "IIntensityNormalizer.h"
-#include "VarianceFunctions.h"
-#include "IterationInfo.h"
-#include "SpectrumUtils.h"
+#include "Core/Vector/BasicVector3D.h"
+#include "Core/Beam/Beam.h"
+#include "Core/Binning/Bin.h"
+#include "Core/Instrument/ChiSquaredModule.h"
+#include "Core/Basics/Complex.h"
+#include "Core/Computation/ConstantBackground.h"
+#include "Core/Binning/ConstKBinAxis.h"
+#include "Core/Particle/Crystal.h"
+#include "Core/Binning/CustomBinAxis.h"
+#include "Core/Simulation/DepthProbeSimulation.h"
+#include "Core/Instrument/DetectorMask.h"
+#include "Core/Parametrization/Distributions.h"
+#include "Core/Mask/Ellipse.h"
+#include "Core/Aggregate/FTDecayFunctions.h"
+#include "Core/Aggregate/FTDistributions1D.h"
+#include "Core/Aggregate/FTDistributions2D.h"
+#include "Fit/Kernel/FitOptions.h"
+#include "Core/Fitting/PyFittingCallbacks.h"
+#include "Core/Fitting/FitObjective.h"
+#include "Core/Binning/FixedBinAxis.h"
+#include "Core/Beam/FootprintFactorGaussian.h"
+#include "Core/Beam/FootprintFactorSquare.h"
+#include "Core/HardParticle/FormFactorAnisoPyramid.h"
+#include "Core/HardParticle/FormFactorBar.h"
+#include "Core/HardParticle/FormFactorBox.h"
+#include "Core/HardParticle/FormFactorCantellatedCube.h"
+#include "Core/HardParticle/FormFactorCone.h"
+#include "Core/HardParticle/FormFactorCone6.h"
+#include "Core/Particle/FormFactorCrystal.h"
+#include "Core/HardParticle/FormFactorCuboctahedron.h"
+#include "Core/HardParticle/FormFactorCylinder.h"
+#include "Core/SoftParticle/FormFactorDebyeBueche.h"
+#include "Core/HardParticle/FormFactorDodecahedron.h"
+#include "Core/HardParticle/FormFactorDot.h"
+#include "Core/HardParticle/FormFactorEllipsoidalCylinder.h"
+#include "Core/HardParticle/FormFactorFullSphere.h"
+#include "Core/HardParticle/FormFactorFullSpheroid.h"
+#include "Core/SoftParticle/FormFactorGauss.h"
+#include "Core/HardParticle/FormFactorHemiEllipsoid.h"
+#include "Core/HardParticle/FormFactorIcosahedron.h"
+#include "Core/HardParticle/FormFactorLongBoxGauss.h"
+#include "Core/HardParticle/FormFactorLongBoxLorentz.h"
+#include "Core/SoftParticle/FormFactorLorentz.h"
+#include "Core/SoftParticle/FormFactorOrnsteinZernike.h"
+#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/FormFactorPrism3.h"
+#include "Core/HardParticle/FormFactorPrism6.h"
+#include "Core/HardParticle/FormFactorPyramid.h"
+#include "Core/HardParticle/FormFactorRipple1.h"
+#include "Core/HardParticle/FormFactorRipple2.h"
+#include "Core/SoftParticle/FormFactorSphereGaussianRadius.h"
+#include "Core/SoftParticle/FormFactorSphereLogNormalRadius.h"
+#include "Core/SoftParticle/FormFactorSphereUniformRadius.h"
+#include "Core/HardParticle/FormFactorTetrahedron.h"
+#include "Core/HardParticle/FormFactorTruncatedCube.h"
+#include "Core/HardParticle/FormFactorTruncatedSphere.h"
+#include "Core/HardParticle/FormFactorTruncatedSpheroid.h"
+#include "Core/Particle/FormFactorWeighted.h"
+#include "Core/Simulation/GISASSimulation.h"
+#include "Core/Instrument/Histogram1D.h"
+#include "Core/Instrument/Histogram2D.h"
+#include "Core/Particle/IAbstractParticle.h"
+#include "Core/Computation/IBackground.h"
+#include "Core/Basics/ICloneable.h"
+#include "Core/Particle/IClusteredParticles.h"
+#include "Core/Instrument/IDetector2D.h"
+#include "Core/Instrument/IDetectorResolution.h"
+#include "Core/DecoratedFormFactor/IFormFactorDecorator.h"
+#include "Core/Instrument/IHistogram.h"
+#include "Core/Instrument/IIntensityFunction.h"
+#include "Core/Aggregate/IInterferenceFunction.h"
+#include "Core/Aggregate/ILayout.h"
+#include "Core/Basics/INamed.h"
+#include "Core/Parametrization/INode.h"
+#include "Core/Fitting/IObserver.h"
+#include "Core/Parametrization/IParameterized.h"
+#include "Core/Particle/IParticle.h"
+#include "Core/Aggregate/IPeakShape.h"
+#include "Core/Instrument/IResolutionFunction2D.h"
+#include "Core/Scattering/ISample.h"
+#include "Core/Multilayer/IMultiLayerBuilder.h"
+#include "Core/Parametrization/INodeVisitor.h"
+#include "Core/Lattice/ISelectionRule.h"
+#include "Core/Mask/IShape2D.h"
+#include "Core/Basics/ISingleton.h"
+#include "Core/Instrument/Instrument.h"
+#include "Core/Instrument/IntensityDataFunctions.h"
+#include "Core/InputOutput/IntensityDataIOFactory.h"
+#include "Core/Aggregate/InterferenceFunction1DLattice.h"
+#include "Core/Aggregate/InterferenceFunction2DLattice.h"
+#include "Core/Aggregate/InterferenceFunction2DParaCrystal.h"
+#include "Core/Aggregate/InterferenceFunction2DSuperLattice.h"
+#include "Core/Aggregate/InterferenceFunction3DLattice.h"
+#include "Core/Aggregate/InterferenceFunctionFinite2DLattice.h"
+#include "Core/Aggregate/InterferenceFunctionFinite3DLattice.h"
+#include "Core/Aggregate/InterferenceFunctionHardDisk.h"
+#include "Core/Aggregate/InterferenceFunctionNone.h"
+#include "Core/Aggregate/InterferenceFunctionRadialParaCrystal.h"
+#include "Core/Aggregate/InterferenceFunctionTwin.h"
+#include "Core/Instrument/IsGISAXSDetector.h"
+#include "Core/Lattice/ILatticeOrientation.h"
+#include "Core/Lattice/Lattice.h"
+#include "Core/Lattice/LatticeUtils.h"
+#include "Core/Lattice/Lattice1DParameters.h"
+#include "Core/Lattice/Lattice2D.h"
+#include "Core/Multilayer/Layer.h"
+#include "Core/Multilayer/LayerInterface.h"
+#include "Core/Multilayer/LayerRoughness.h"
+#include "Core/Mask/Line.h"
+#include "Core/Material/MaterialFactoryFuncs.h"
+#include "Core/Tools/MathFunctions.h"
+#include "Core/Particle/MesoCrystal.h"
+#include "Core/Multilayer/MultiLayer.h"
+#include "Core/Multilayer/MultiLayerFuncs.h"
+#include "Core/Simulation/OffSpecSimulation.h"
+#include "Core/Instrument/OutputData.h"
+#include "Core/Parametrization/ParameterDistribution.h"
+#include "Core/Parametrization/ParameterPool.h"
+#include "Core/Parametrization/ParameterSample.h"
+#include "Core/Particle/Particle.h"
+#include "Core/Particle/ParticleComposition.h"
+#include "Core/Particle/ParticleCoreShell.h"
+#include "Core/Particle/ParticleDistribution.h"
+#include "Core/Aggregate/ParticleLayout.h"
+#include "Core/Computation/PoissonNoiseBackground.h"
+#include "Core/Mask/Polygon.h"
+#include "Core/Instrument/PyArrayImportUtils.h"
+#include "Core/Instrument/QSpecScan.h"
+#include "Core/Parametrization/RangedDistributions.h"
+#include "Core/Parametrization/RealParameter.h"
+#include "Core/Mask/Rectangle.h"
+#include "Core/Instrument/RectangularDetector.h"
+#include "Core/Instrument/ResolutionFunction2DGaussian.h"
+#include "Core/HardParticle/Ripples.h"
+#include "Core/Scattering/Rotations.h"
+#include "Core/StandardSamples/SampleBuilderFactory.h"
+#include "Core/Instrument/ScanResolution.h"
+#include "Core/Simulation/Simulation.h"
+#include "Core/Simulation/Simulation2D.h"
+#include "Core/StandardSamples/SimulationFactory.h"
+#include "Core/Parametrization/SimulationOptions.h"
+#include "Core/Instrument/SimulationResult.h"
+#include "Core/Particle/SlicedParticle.h"
+#include "Core/Simulation/SpecularSimulation.h"
+#include "Core/Instrument/SphericalDetector.h"
+#include "Core/Parametrization/ThreadInfo.h"
+#include "Core/Parametrization/Units.h"
+#include "Core/Binning/VariableBinAxis.h"
+#include "Core/Vector/Vectors3D.h"
+#include "Core/Vector/WavevectorInfo.h"
+#include "Core/Instrument/IChiSquaredModule.h"
+#include "Core/Instrument/IIntensityFunction.h"
+#include "Core/Instrument/IIntensityNormalizer.h"
+#include "Core/Instrument/VarianceFunctions.h"
+#include "Core/Fitting/IterationInfo.h"
+#include "Core/Tools/SpectrumUtils.h"
 
 
   namespace swig {
@@ -69956,7 +69956,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorBox_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_FormFactorBox_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorBox *arg1 = (FormFactorBox *) 0 ;
   void *argp1 = 0 ;
@@ -69968,10 +69968,10 @@ SWIGINTERN PyObject *_wrap_FormFactorBox_getHeight(PyObject *SWIGUNUSEDPARM(self
   swig_obj[0] = args;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorBox, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorBox_getHeight" "', argument " "1"" of type '" "FormFactorBox const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorBox_getWidth" "', argument " "1"" of type '" "FormFactorBox const *""'"); 
   }
   arg1 = reinterpret_cast< FormFactorBox * >(argp1);
-  result = (double)((FormFactorBox const *)arg1)->getHeight();
+  result = (double)((FormFactorBox const *)arg1)->getWidth();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -69979,7 +69979,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorBox_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_FormFactorBox_volume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorBox *arg1 = (FormFactorBox *) 0 ;
   void *argp1 = 0 ;
@@ -69991,10 +69991,10 @@ SWIGINTERN PyObject *_wrap_FormFactorBox_getWidth(PyObject *SWIGUNUSEDPARM(self)
   swig_obj[0] = args;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorBox, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorBox_getWidth" "', argument " "1"" of type '" "FormFactorBox const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorBox_volume" "', argument " "1"" of type '" "FormFactorBox const *""'"); 
   }
   arg1 = reinterpret_cast< FormFactorBox * >(argp1);
-  result = (double)((FormFactorBox const *)arg1)->getWidth();
+  result = (double)((FormFactorBox const *)arg1)->volume();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -98450,282 +98450,6 @@ SWIGINTERN PyObject *IPixel_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObjec
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_new_SphericalDetector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
-  PyObject *resultobj = 0;
-  SphericalDetector *result = 0 ;
-  
-  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
-  result = (SphericalDetector *)new SphericalDetector();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SphericalDetector, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_SphericalDetector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  size_t arg1 ;
-  double arg2 ;
-  double arg3 ;
-  size_t arg4 ;
-  double arg5 ;
-  double arg6 ;
-  size_t val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  size_t val4 ;
-  int ecode4 = 0 ;
-  double val5 ;
-  int ecode5 = 0 ;
-  double val6 ;
-  int ecode6 = 0 ;
-  SphericalDetector *result = 0 ;
-  
-  if ((nobjs < 6) || (nobjs > 6)) SWIG_fail;
-  ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "size_t""'");
-  } 
-  arg1 = static_cast< size_t >(val1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SphericalDetector" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_SphericalDetector" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  ecode4 = SWIG_AsVal_size_t(swig_obj[3], &val4);
-  if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_SphericalDetector" "', argument " "4"" of type '" "size_t""'");
-  } 
-  arg4 = static_cast< size_t >(val4);
-  ecode5 = SWIG_AsVal_double(swig_obj[4], &val5);
-  if (!SWIG_IsOK(ecode5)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_SphericalDetector" "', argument " "5"" of type '" "double""'");
-  } 
-  arg5 = static_cast< double >(val5);
-  ecode6 = SWIG_AsVal_double(swig_obj[5], &val6);
-  if (!SWIG_IsOK(ecode6)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "new_SphericalDetector" "', argument " "6"" of type '" "double""'");
-  } 
-  arg6 = static_cast< double >(val6);
-  result = (SphericalDetector *)new SphericalDetector(arg1,arg2,arg3,arg4,arg5,arg6);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SphericalDetector, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_SphericalDetector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  SphericalDetector *arg1 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  SphericalDetector *result = 0 ;
-  
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_SphericalDetector,  0  | 0);
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "SphericalDetector const &""'"); 
-  }
-  if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "SphericalDetector const &""'"); 
-  }
-  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
-  result = (SphericalDetector *)new SphericalDetector((SphericalDetector const &)*arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SphericalDetector, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_SphericalDetector(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[7] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_SphericalDetector", 0, 6, argv))) SWIG_fail;
-  --argc;
-  if (argc == 0) {
-    return _wrap_new_SphericalDetector__SWIG_0(self, argc, argv);
-  }
-  if (argc == 1) {
-    int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_SphericalDetector, SWIG_POINTER_NO_NULL | 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_new_SphericalDetector__SWIG_2(self, argc, argv);
-    }
-  }
-  if (argc == 6) {
-    int _v;
-    {
-      int res = SWIG_AsVal_size_t(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          {
-            int res = SWIG_AsVal_size_t(argv[3], NULL);
-            _v = SWIG_CheckState(res);
-          }
-          if (_v) {
-            {
-              int res = SWIG_AsVal_double(argv[4], NULL);
-              _v = SWIG_CheckState(res);
-            }
-            if (_v) {
-              {
-                int res = SWIG_AsVal_double(argv[5], NULL);
-                _v = SWIG_CheckState(res);
-              }
-              if (_v) {
-                return _wrap_new_SphericalDetector__SWIG_1(self, argc, argv);
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_SphericalDetector'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    SphericalDetector::SphericalDetector()\n"
-    "    SphericalDetector::SphericalDetector(size_t,double,double,size_t,double,double)\n"
-    "    SphericalDetector::SphericalDetector(SphericalDetector const &)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_SphericalDetector_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SphericalDetector *arg1 = (SphericalDetector *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  SphericalDetector *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SphericalDetector, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SphericalDetector_clone" "', argument " "1"" of type '" "SphericalDetector const *""'"); 
-  }
-  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
-  result = (SphericalDetector *)((SphericalDetector const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SphericalDetector, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SphericalDetector_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SphericalDetector *arg1 = (SphericalDetector *) 0 ;
-  INodeVisitor *arg2 = (INodeVisitor *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "SphericalDetector_accept", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SphericalDetector, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SphericalDetector_accept" "', argument " "1"" of type '" "SphericalDetector const *""'"); 
-  }
-  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SphericalDetector_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
-  }
-  arg2 = reinterpret_cast< INodeVisitor * >(argp2);
-  ((SphericalDetector const *)arg1)->accept(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_SphericalDetector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SphericalDetector *arg1 = (SphericalDetector *) 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_SphericalDetector, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SphericalDetector" "', argument " "1"" of type '" "SphericalDetector *""'"); 
-  }
-  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SphericalDetector_defaultAxesUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SphericalDetector *arg1 = (SphericalDetector *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  AxesUnits result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SphericalDetector, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SphericalDetector_defaultAxesUnits" "', argument " "1"" of type '" "SphericalDetector const *""'"); 
-  }
-  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
-  result = (AxesUnits)((SphericalDetector const *)arg1)->defaultAxesUnits();
-  resultobj = SWIG_From_int(static_cast< int >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *SphericalDetector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_SphericalDetector, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *SphericalDetector_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
 SWIGINTERN PyObject *_wrap_new_SphericalPixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Bin1D *arg1 = 0 ;
@@ -98963,6 +98687,282 @@ SWIGINTERN PyObject *SphericalPixel_swiginit(PyObject *SWIGUNUSEDPARM(self), PyO
   return SWIG_Python_InitShadowInstance(args);
 }
 
+SWIGINTERN PyObject *_wrap_new_SphericalDetector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  SphericalDetector *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (SphericalDetector *)new SphericalDetector();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SphericalDetector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_SphericalDetector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  size_t arg1 ;
+  double arg2 ;
+  double arg3 ;
+  size_t arg4 ;
+  double arg5 ;
+  double arg6 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  size_t val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  double val6 ;
+  int ecode6 = 0 ;
+  SphericalDetector *result = 0 ;
+  
+  if ((nobjs < 6) || (nobjs > 6)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "size_t""'");
+  } 
+  arg1 = static_cast< size_t >(val1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SphericalDetector" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_SphericalDetector" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_size_t(swig_obj[3], &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_SphericalDetector" "', argument " "4"" of type '" "size_t""'");
+  } 
+  arg4 = static_cast< size_t >(val4);
+  ecode5 = SWIG_AsVal_double(swig_obj[4], &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_SphericalDetector" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  ecode6 = SWIG_AsVal_double(swig_obj[5], &val6);
+  if (!SWIG_IsOK(ecode6)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "new_SphericalDetector" "', argument " "6"" of type '" "double""'");
+  } 
+  arg6 = static_cast< double >(val6);
+  result = (SphericalDetector *)new SphericalDetector(arg1,arg2,arg3,arg4,arg5,arg6);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SphericalDetector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_SphericalDetector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  SphericalDetector *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SphericalDetector *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_SphericalDetector,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "SphericalDetector const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "SphericalDetector const &""'"); 
+  }
+  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
+  result = (SphericalDetector *)new SphericalDetector((SphericalDetector const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SphericalDetector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_SphericalDetector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[7] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_SphericalDetector", 0, 6, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_SphericalDetector__SWIG_0(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_SphericalDetector, SWIG_POINTER_NO_NULL | 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_SphericalDetector__SWIG_2(self, argc, argv);
+    }
+  }
+  if (argc == 6) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_size_t(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              {
+                int res = SWIG_AsVal_double(argv[5], NULL);
+                _v = SWIG_CheckState(res);
+              }
+              if (_v) {
+                return _wrap_new_SphericalDetector__SWIG_1(self, argc, argv);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_SphericalDetector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    SphericalDetector::SphericalDetector()\n"
+    "    SphericalDetector::SphericalDetector(size_t,double,double,size_t,double,double)\n"
+    "    SphericalDetector::SphericalDetector(SphericalDetector const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_SphericalDetector_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SphericalDetector *arg1 = (SphericalDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  SphericalDetector *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SphericalDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SphericalDetector_clone" "', argument " "1"" of type '" "SphericalDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
+  result = (SphericalDetector *)((SphericalDetector const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SphericalDetector, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SphericalDetector_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SphericalDetector *arg1 = (SphericalDetector *) 0 ;
+  INodeVisitor *arg2 = (INodeVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SphericalDetector_accept", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SphericalDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SphericalDetector_accept" "', argument " "1"" of type '" "SphericalDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SphericalDetector_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< INodeVisitor * >(argp2);
+  ((SphericalDetector const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SphericalDetector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SphericalDetector *arg1 = (SphericalDetector *) 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_SphericalDetector, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SphericalDetector" "', argument " "1"" of type '" "SphericalDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SphericalDetector_defaultAxesUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SphericalDetector *arg1 = (SphericalDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  AxesUnits result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SphericalDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SphericalDetector_defaultAxesUnits" "', argument " "1"" of type '" "SphericalDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
+  result = (AxesUnits)((SphericalDetector const *)arg1)->defaultAxesUnits();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SphericalDetector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SphericalDetector, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *SphericalDetector_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
 SWIGINTERN PyObject *_wrap_new_IsGISAXSDetector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
   PyObject *resultobj = 0;
   IsGISAXSDetector *result = 0 ;
@@ -116034,6 +116034,307 @@ SWIGINTERN PyObject *Rectangle_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject
   return SWIG_Python_InitShadowInstance(args);
 }
 
+SWIGINTERN PyObject *_wrap_new_RectangularPixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  kvector_t arg1 ;
+  kvector_t arg2 ;
+  kvector_t arg3 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  RectangularPixel *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_RectangularPixel", 3, 3, swig_obj)) SWIG_fail;
+  {
+    res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_RectangularPixel" "', argument " "1"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp1) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RectangularPixel" "', argument " "1"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp1);
+      arg1 = *temp;
+      if (SWIG_IsNewObj(res1)) delete temp;
+    }
+  }
+  {
+    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_RectangularPixel" "', argument " "2"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RectangularPixel" "', argument " "2"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_RectangularPixel" "', argument " "3"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RectangularPixel" "', argument " "3"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (RectangularPixel *)new RectangularPixel(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectangularPixel, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularPixel_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularPixel *arg1 = (RectangularPixel *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  RectangularPixel *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RectangularPixel, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularPixel_clone" "', argument " "1"" of type '" "RectangularPixel const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
+  result = (RectangularPixel *)((RectangularPixel const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectangularPixel, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularPixel_createZeroSizePixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularPixel *arg1 = (RectangularPixel *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  RectangularPixel *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "RectangularPixel_createZeroSizePixel", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RectangularPixel, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularPixel_createZeroSizePixel" "', argument " "1"" of type '" "RectangularPixel const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularPixel_createZeroSizePixel" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularPixel_createZeroSizePixel" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (RectangularPixel *)((RectangularPixel const *)arg1)->createZeroSizePixel(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectangularPixel, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularPixel_getK(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularPixel *arg1 = (RectangularPixel *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject *swig_obj[4] ;
+  kvector_t result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "RectangularPixel_getK", 4, 4, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RectangularPixel, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularPixel_getK" "', argument " "1"" of type '" "RectangularPixel const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularPixel_getK" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularPixel_getK" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(swig_obj[3], &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "RectangularPixel_getK" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = ((RectangularPixel const *)arg1)->getK(arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularPixel_getPosition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularPixel *arg1 = (RectangularPixel *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  kvector_t result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "RectangularPixel_getPosition", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RectangularPixel, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularPixel_getPosition" "', argument " "1"" of type '" "RectangularPixel const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularPixel_getPosition" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularPixel_getPosition" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = ((RectangularPixel const *)arg1)->getPosition(arg2,arg3);
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularPixel_getIntegrationFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularPixel *arg1 = (RectangularPixel *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  double result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "RectangularPixel_getIntegrationFactor", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RectangularPixel, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularPixel_getIntegrationFactor" "', argument " "1"" of type '" "RectangularPixel const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularPixel_getIntegrationFactor" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularPixel_getIntegrationFactor" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((RectangularPixel const *)arg1)->getIntegrationFactor(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularPixel_getSolidAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularPixel *arg1 = (RectangularPixel *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RectangularPixel, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularPixel_getSolidAngle" "', argument " "1"" of type '" "RectangularPixel const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
+  result = (double)((RectangularPixel const *)arg1)->getSolidAngle();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_RectangularPixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularPixel *arg1 = (RectangularPixel *) 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_RectangularPixel, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RectangularPixel" "', argument " "1"" of type '" "RectangularPixel *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *RectangularPixel_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_RectangularPixel, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *RectangularPixel_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
 SWIGINTERN PyObject *_wrap_new_RectangularDetector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   size_t arg1 ;
@@ -117105,307 +117406,6 @@ SWIGINTERN PyObject *RectangularDetector_swiginit(PyObject *SWIGUNUSEDPARM(self)
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_RectangularPixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  kvector_t arg1 ;
-  kvector_t arg2 ;
-  kvector_t arg3 ;
-  void *argp1 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
-  RectangularPixel *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "new_RectangularPixel", 3, 3, swig_obj)) SWIG_fail;
-  {
-    res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_RectangularPixel" "', argument " "1"" of type '" "kvector_t""'"); 
-    }  
-    if (!argp1) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RectangularPixel" "', argument " "1"" of type '" "kvector_t""'");
-    } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp1);
-      arg1 = *temp;
-      if (SWIG_IsNewObj(res1)) delete temp;
-    }
-  }
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_RectangularPixel" "', argument " "2"" of type '" "kvector_t""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RectangularPixel" "', argument " "2"" of type '" "kvector_t""'");
-    } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  {
-    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_RectangularPixel" "', argument " "3"" of type '" "kvector_t""'"); 
-    }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RectangularPixel" "', argument " "3"" of type '" "kvector_t""'");
-    } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
-    }
-  }
-  result = (RectangularPixel *)new RectangularPixel(arg1,arg2,arg3);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectangularPixel, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_RectangularPixel_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  RectangularPixel *arg1 = (RectangularPixel *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  RectangularPixel *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RectangularPixel, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularPixel_clone" "', argument " "1"" of type '" "RectangularPixel const *""'"); 
-  }
-  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
-  result = (RectangularPixel *)((RectangularPixel const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectangularPixel, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_RectangularPixel_createZeroSizePixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  RectangularPixel *arg1 = (RectangularPixel *) 0 ;
-  double arg2 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
-  RectangularPixel *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "RectangularPixel_createZeroSizePixel", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RectangularPixel, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularPixel_createZeroSizePixel" "', argument " "1"" of type '" "RectangularPixel const *""'"); 
-  }
-  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularPixel_createZeroSizePixel" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularPixel_createZeroSizePixel" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (RectangularPixel *)((RectangularPixel const *)arg1)->createZeroSizePixel(arg2,arg3);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectangularPixel, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_RectangularPixel_getK(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  RectangularPixel *arg1 = (RectangularPixel *) 0 ;
-  double arg2 ;
-  double arg3 ;
-  double arg4 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  double val4 ;
-  int ecode4 = 0 ;
-  PyObject *swig_obj[4] ;
-  kvector_t result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "RectangularPixel_getK", 4, 4, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RectangularPixel, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularPixel_getK" "', argument " "1"" of type '" "RectangularPixel const *""'"); 
-  }
-  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularPixel_getK" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularPixel_getK" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  ecode4 = SWIG_AsVal_double(swig_obj[3], &val4);
-  if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "RectangularPixel_getK" "', argument " "4"" of type '" "double""'");
-  } 
-  arg4 = static_cast< double >(val4);
-  result = ((RectangularPixel const *)arg1)->getK(arg2,arg3,arg4);
-  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_RectangularPixel_getPosition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  RectangularPixel *arg1 = (RectangularPixel *) 0 ;
-  double arg2 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
-  kvector_t result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "RectangularPixel_getPosition", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RectangularPixel, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularPixel_getPosition" "', argument " "1"" of type '" "RectangularPixel const *""'"); 
-  }
-  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularPixel_getPosition" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularPixel_getPosition" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = ((RectangularPixel const *)arg1)->getPosition(arg2,arg3);
-  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_RectangularPixel_getIntegrationFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  RectangularPixel *arg1 = (RectangularPixel *) 0 ;
-  double arg2 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "RectangularPixel_getIntegrationFactor", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RectangularPixel, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularPixel_getIntegrationFactor" "', argument " "1"" of type '" "RectangularPixel const *""'"); 
-  }
-  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularPixel_getIntegrationFactor" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularPixel_getIntegrationFactor" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (double)((RectangularPixel const *)arg1)->getIntegrationFactor(arg2,arg3);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_RectangularPixel_getSolidAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  RectangularPixel *arg1 = (RectangularPixel *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RectangularPixel, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularPixel_getSolidAngle" "', argument " "1"" of type '" "RectangularPixel const *""'"); 
-  }
-  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
-  result = (double)((RectangularPixel const *)arg1)->getSolidAngle();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_RectangularPixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  RectangularPixel *arg1 = (RectangularPixel *) 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_RectangularPixel, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RectangularPixel" "', argument " "1"" of type '" "RectangularPixel *""'"); 
-  }
-  arg1 = reinterpret_cast< RectangularPixel * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *RectangularPixel_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_RectangularPixel, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *RectangularPixel_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
 SWIGINTERN PyObject *_wrap_new_ResolutionFunction2DGaussian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
@@ -126902,14 +126902,14 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "FormFactorPolygonalPrism_evaluate_for_q", _wrap_FormFactorPolygonalPrism_evaluate_for_q, METH_VARARGS, "\n"
 		"FormFactorPolygonalPrism_evaluate_for_q(FormFactorPolygonalPrism self, cvector_t q) -> complex_t\n"
-		"complex_t FormFactorPolygonalPrism::evaluate_for_q(cvector_t q) const override final\n"
+		"complex_t FormFactorPolygonalPrism::evaluate_for_q(cvector_t q) const override\n"
 		"\n"
 		"Returns the form factor F(q) of this polyhedron, respecting the offset height/2. \n"
 		"\n"
 		""},
 	 { "FormFactorPolygonalPrism_volume", _wrap_FormFactorPolygonalPrism_volume, METH_O, "\n"
 		"FormFactorPolygonalPrism_volume(FormFactorPolygonalPrism self) -> double\n"
-		"double FormFactorPolygonalPrism::volume() const override final\n"
+		"double FormFactorPolygonalPrism::volume() const override\n"
 		"\n"
 		"Returns the volume of this prism. \n"
 		"\n"
@@ -126921,7 +126921,7 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "FormFactorPolygonalPrism_radialExtension", _wrap_FormFactorPolygonalPrism_radialExtension, METH_O, "\n"
 		"FormFactorPolygonalPrism_radialExtension(FormFactorPolygonalPrism self) -> double\n"
-		"double FormFactorPolygonalPrism::radialExtension() const override final\n"
+		"virtual double FormFactorPolygonalPrism::radialExtension() const override\n"
 		"\n"
 		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
 		"\n"
@@ -127161,16 +127161,18 @@ static PyMethodDef SwigMethods[] = {
 		"double FormFactorBox::getLength() const\n"
 		"\n"
 		""},
-	 { "FormFactorBox_getHeight", _wrap_FormFactorBox_getHeight, METH_O, "\n"
-		"FormFactorBox_getHeight(FormFactorBox self) -> double\n"
-		"double FormFactorBox::getHeight() const\n"
-		"\n"
-		""},
 	 { "FormFactorBox_getWidth", _wrap_FormFactorBox_getWidth, METH_O, "\n"
 		"FormFactorBox_getWidth(FormFactorBox self) -> double\n"
 		"double FormFactorBox::getWidth() const\n"
 		"\n"
 		""},
+	 { "FormFactorBox_volume", _wrap_FormFactorBox_volume, METH_O, "\n"
+		"FormFactorBox_volume(FormFactorBox self) -> double\n"
+		"double FormFactorBox::volume() const override final\n"
+		"\n"
+		"Returns the volume of this prism. \n"
+		"\n"
+		""},
 	 { "FormFactorBox_radialExtension", _wrap_FormFactorBox_radialExtension, METH_O, "\n"
 		"FormFactorBox_radialExtension(FormFactorBox self) -> double\n"
 		"double FormFactorBox::radialExtension() const override final\n"
@@ -127182,7 +127184,7 @@ static PyMethodDef SwigMethods[] = {
 		"FormFactorBox_evaluate_for_q(FormFactorBox self, cvector_t q) -> complex_t\n"
 		"complex_t FormFactorBox::evaluate_for_q(cvector_t q) const override final\n"
 		"\n"
-		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"Returns the form factor F(q) of this polyhedron, respecting the offset height/2. \n"
 		"\n"
 		""},
 	 { "delete_FormFactorBox", _wrap_delete_FormFactorBox, METH_O, "delete_FormFactorBox(FormFactorBox self)"},
@@ -132350,39 +132352,6 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "IPixel_swigregister", IPixel_swigregister, METH_O, NULL},
-	 { "new_SphericalDetector", _wrap_new_SphericalDetector, METH_VARARGS, "\n"
-		"SphericalDetector()\n"
-		"SphericalDetector(size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)\n"
-		"new_SphericalDetector(SphericalDetector other) -> SphericalDetector\n"
-		"SphericalDetector::SphericalDetector(const SphericalDetector &other)\n"
-		"\n"
-		""},
-	 { "SphericalDetector_clone", _wrap_SphericalDetector_clone, METH_O, "\n"
-		"SphericalDetector_clone(SphericalDetector self) -> SphericalDetector\n"
-		"SphericalDetector * SphericalDetector::clone() const override\n"
-		"\n"
-		""},
-	 { "SphericalDetector_accept", _wrap_SphericalDetector_accept, METH_VARARGS, "\n"
-		"SphericalDetector_accept(SphericalDetector self, INodeVisitor visitor)\n"
-		"void SphericalDetector::accept(INodeVisitor *visitor) const override\n"
-		"\n"
-		"Calls the  INodeVisitor's visit method. \n"
-		"\n"
-		""},
-	 { "delete_SphericalDetector", _wrap_delete_SphericalDetector, METH_O, "\n"
-		"delete_SphericalDetector(SphericalDetector self)\n"
-		"SphericalDetector::~SphericalDetector() override\n"
-		"\n"
-		""},
-	 { "SphericalDetector_defaultAxesUnits", _wrap_SphericalDetector_defaultAxesUnits, METH_O, "\n"
-		"SphericalDetector_defaultAxesUnits(SphericalDetector self) -> AxesUnits\n"
-		"AxesUnits SphericalDetector::defaultAxesUnits() const override\n"
-		"\n"
-		"return default axes units \n"
-		"\n"
-		""},
-	 { "SphericalDetector_swigregister", SphericalDetector_swigregister, METH_O, NULL},
-	 { "SphericalDetector_swiginit", SphericalDetector_swiginit, METH_VARARGS, NULL},
 	 { "new_SphericalPixel", _wrap_new_SphericalPixel, METH_VARARGS, "\n"
 		"new_SphericalPixel(Bin1D alpha_bin, Bin1D phi_bin) -> SphericalPixel\n"
 		"SphericalPixel::SphericalPixel(const Bin1D &alpha_bin, const Bin1D &phi_bin)\n"
@@ -132416,6 +132385,39 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_SphericalPixel", _wrap_delete_SphericalPixel, METH_O, "delete_SphericalPixel(SphericalPixel self)"},
 	 { "SphericalPixel_swigregister", SphericalPixel_swigregister, METH_O, NULL},
 	 { "SphericalPixel_swiginit", SphericalPixel_swiginit, METH_VARARGS, NULL},
+	 { "new_SphericalDetector", _wrap_new_SphericalDetector, METH_VARARGS, "\n"
+		"SphericalDetector()\n"
+		"SphericalDetector(size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)\n"
+		"new_SphericalDetector(SphericalDetector other) -> SphericalDetector\n"
+		"SphericalDetector::SphericalDetector(const SphericalDetector &other)\n"
+		"\n"
+		""},
+	 { "SphericalDetector_clone", _wrap_SphericalDetector_clone, METH_O, "\n"
+		"SphericalDetector_clone(SphericalDetector self) -> SphericalDetector\n"
+		"SphericalDetector * SphericalDetector::clone() const override\n"
+		"\n"
+		""},
+	 { "SphericalDetector_accept", _wrap_SphericalDetector_accept, METH_VARARGS, "\n"
+		"SphericalDetector_accept(SphericalDetector self, INodeVisitor visitor)\n"
+		"void SphericalDetector::accept(INodeVisitor *visitor) const override\n"
+		"\n"
+		"Calls the  INodeVisitor's visit method. \n"
+		"\n"
+		""},
+	 { "delete_SphericalDetector", _wrap_delete_SphericalDetector, METH_O, "\n"
+		"delete_SphericalDetector(SphericalDetector self)\n"
+		"SphericalDetector::~SphericalDetector() override\n"
+		"\n"
+		""},
+	 { "SphericalDetector_defaultAxesUnits", _wrap_SphericalDetector_defaultAxesUnits, METH_O, "\n"
+		"SphericalDetector_defaultAxesUnits(SphericalDetector self) -> AxesUnits\n"
+		"AxesUnits SphericalDetector::defaultAxesUnits() const override\n"
+		"\n"
+		"return default axes units \n"
+		"\n"
+		""},
+	 { "SphericalDetector_swigregister", SphericalDetector_swigregister, METH_O, NULL},
+	 { "SphericalDetector_swiginit", SphericalDetector_swiginit, METH_VARARGS, NULL},
 	 { "new_IsGISAXSDetector", _wrap_new_IsGISAXSDetector, METH_VARARGS, "\n"
 		"IsGISAXSDetector()\n"
 		"IsGISAXSDetector(size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)\n"
@@ -134662,6 +134664,44 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_Rectangle", _wrap_delete_Rectangle, METH_O, "delete_Rectangle(Rectangle self)"},
 	 { "Rectangle_swigregister", Rectangle_swigregister, METH_O, NULL},
 	 { "Rectangle_swiginit", Rectangle_swiginit, METH_VARARGS, NULL},
+	 { "new_RectangularPixel", _wrap_new_RectangularPixel, METH_VARARGS, "\n"
+		"new_RectangularPixel(kvector_t corner_pos, kvector_t width, kvector_t height) -> RectangularPixel\n"
+		"RectangularPixel::RectangularPixel(kvector_t corner_pos, kvector_t width, kvector_t height)\n"
+		"\n"
+		""},
+	 { "RectangularPixel_clone", _wrap_RectangularPixel_clone, METH_O, "\n"
+		"RectangularPixel_clone(RectangularPixel self) -> RectangularPixel\n"
+		"RectangularPixel * RectangularPixel::clone() const override\n"
+		"\n"
+		""},
+	 { "RectangularPixel_createZeroSizePixel", _wrap_RectangularPixel_createZeroSizePixel, METH_VARARGS, "\n"
+		"RectangularPixel_createZeroSizePixel(RectangularPixel self, double x, double y) -> RectangularPixel\n"
+		"RectangularPixel * RectangularPixel::createZeroSizePixel(double x, double y) const override\n"
+		"\n"
+		""},
+	 { "RectangularPixel_getK", _wrap_RectangularPixel_getK, METH_VARARGS, "\n"
+		"RectangularPixel_getK(RectangularPixel self, double x, double y, double wavelength) -> kvector_t\n"
+		"kvector_t RectangularPixel::getK(double x, double y, double wavelength) const override\n"
+		"\n"
+		""},
+	 { "RectangularPixel_getPosition", _wrap_RectangularPixel_getPosition, METH_VARARGS, "\n"
+		"RectangularPixel_getPosition(RectangularPixel self, double x, double y) -> kvector_t\n"
+		"kvector_t RectangularPixel::getPosition(double x, double y) const\n"
+		"\n"
+		""},
+	 { "RectangularPixel_getIntegrationFactor", _wrap_RectangularPixel_getIntegrationFactor, METH_VARARGS, "\n"
+		"RectangularPixel_getIntegrationFactor(RectangularPixel self, double x, double y) -> double\n"
+		"double RectangularPixel::getIntegrationFactor(double x, double y) const override\n"
+		"\n"
+		""},
+	 { "RectangularPixel_getSolidAngle", _wrap_RectangularPixel_getSolidAngle, METH_O, "\n"
+		"RectangularPixel_getSolidAngle(RectangularPixel self) -> double\n"
+		"double RectangularPixel::getSolidAngle() const override\n"
+		"\n"
+		""},
+	 { "delete_RectangularPixel", _wrap_delete_RectangularPixel, METH_O, "delete_RectangularPixel(RectangularPixel self)"},
+	 { "RectangularPixel_swigregister", RectangularPixel_swigregister, METH_O, NULL},
+	 { "RectangularPixel_swiginit", RectangularPixel_swiginit, METH_VARARGS, NULL},
 	 { "new_RectangularDetector", _wrap_new_RectangularDetector, METH_VARARGS, "\n"
 		"RectangularDetector(size_t nxbins, double width, size_t nybins, double height)\n"
 		"new_RectangularDetector(RectangularDetector other) -> RectangularDetector\n"
@@ -134791,44 +134831,6 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "RectangularDetector_swigregister", RectangularDetector_swigregister, METH_O, NULL},
 	 { "RectangularDetector_swiginit", RectangularDetector_swiginit, METH_VARARGS, NULL},
-	 { "new_RectangularPixel", _wrap_new_RectangularPixel, METH_VARARGS, "\n"
-		"new_RectangularPixel(kvector_t corner_pos, kvector_t width, kvector_t height) -> RectangularPixel\n"
-		"RectangularPixel::RectangularPixel(kvector_t corner_pos, kvector_t width, kvector_t height)\n"
-		"\n"
-		""},
-	 { "RectangularPixel_clone", _wrap_RectangularPixel_clone, METH_O, "\n"
-		"RectangularPixel_clone(RectangularPixel self) -> RectangularPixel\n"
-		"RectangularPixel * RectangularPixel::clone() const override\n"
-		"\n"
-		""},
-	 { "RectangularPixel_createZeroSizePixel", _wrap_RectangularPixel_createZeroSizePixel, METH_VARARGS, "\n"
-		"RectangularPixel_createZeroSizePixel(RectangularPixel self, double x, double y) -> RectangularPixel\n"
-		"RectangularPixel * RectangularPixel::createZeroSizePixel(double x, double y) const override\n"
-		"\n"
-		""},
-	 { "RectangularPixel_getK", _wrap_RectangularPixel_getK, METH_VARARGS, "\n"
-		"RectangularPixel_getK(RectangularPixel self, double x, double y, double wavelength) -> kvector_t\n"
-		"kvector_t RectangularPixel::getK(double x, double y, double wavelength) const override\n"
-		"\n"
-		""},
-	 { "RectangularPixel_getPosition", _wrap_RectangularPixel_getPosition, METH_VARARGS, "\n"
-		"RectangularPixel_getPosition(RectangularPixel self, double x, double y) -> kvector_t\n"
-		"kvector_t RectangularPixel::getPosition(double x, double y) const\n"
-		"\n"
-		""},
-	 { "RectangularPixel_getIntegrationFactor", _wrap_RectangularPixel_getIntegrationFactor, METH_VARARGS, "\n"
-		"RectangularPixel_getIntegrationFactor(RectangularPixel self, double x, double y) -> double\n"
-		"double RectangularPixel::getIntegrationFactor(double x, double y) const override\n"
-		"\n"
-		""},
-	 { "RectangularPixel_getSolidAngle", _wrap_RectangularPixel_getSolidAngle, METH_O, "\n"
-		"RectangularPixel_getSolidAngle(RectangularPixel self) -> double\n"
-		"double RectangularPixel::getSolidAngle() const override\n"
-		"\n"
-		""},
-	 { "delete_RectangularPixel", _wrap_delete_RectangularPixel, METH_O, "delete_RectangularPixel(RectangularPixel self)"},
-	 { "RectangularPixel_swigregister", RectangularPixel_swigregister, METH_O, NULL},
-	 { "RectangularPixel_swiginit", RectangularPixel_swiginit, METH_VARARGS, NULL},
 	 { "new_ResolutionFunction2DGaussian", _wrap_new_ResolutionFunction2DGaussian, METH_VARARGS, "\n"
 		"new_ResolutionFunction2DGaussian(double sigma_x, double sigma_y) -> ResolutionFunction2DGaussian\n"
 		"ResolutionFunction2DGaussian::ResolutionFunction2DGaussian(double sigma_x, double sigma_y)\n"
@@ -135460,6 +135462,9 @@ static void *_p_FormFactorPrism3To_p_FormFactorPolygonalPrism(void *x, int *SWIG
 static void *_p_FormFactorPrism6To_p_FormFactorPolygonalPrism(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((FormFactorPolygonalPrism *)  ((FormFactorPrism6 *) x));
 }
+static void *_p_FormFactorBoxTo_p_FormFactorPolygonalPrism(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((FormFactorPolygonalPrism *)  ((FormFactorBox *) x));
+}
 static void *_p_SimulationFactoryTo_p_IFactoryT_std__string_Simulation_t(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFactory< std::string,Simulation > *)  ((SimulationFactory *) x));
 }
@@ -135521,7 +135526,7 @@ static void *_p_FormFactorCylinderTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDP
     return (void *)((IFormFactorBorn *)  ((FormFactorCylinder *) x));
 }
 static void *_p_FormFactorBoxTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *)  ((FormFactorBox *) x));
+    return (void *)((IFormFactorBorn *) (FormFactorPolygonalPrism *) ((FormFactorBox *) x));
 }
 static void *_p_FormFactorIcosahedronTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
@@ -136052,7 +136057,7 @@ static void *_p_DistributionLogNormalTo_p_ICloneable(void *x, int *SWIGUNUSEDPAR
     return (void *)((ICloneable *) (IDistribution1D *) ((DistributionLogNormal *) x));
 }
 static void *_p_FormFactorBoxTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorBox *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorBox *) x));
 }
 static void *_p_FTDistribution1DGateTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IFTDistribution1D *) ((FTDistribution1DGate *) x));
@@ -136526,7 +136531,7 @@ static void *_p_DistributionLogNormalTo_p_INamed(void *x, int *SWIGUNUSEDPARM(ne
     return (void *)((INamed *) (IParameterized *)(INode *)(IDistribution1D *) ((DistributionLogNormal *) x));
 }
 static void *_p_FormFactorBoxTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamed *) (IParameterized *)(INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorBox *) x));
+    return (void *)((INamed *) (IParameterized *)(INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorBox *) x));
 }
 static void *_p_FTDistribution1DGateTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(INode *)(IFTDistribution1D *) ((FTDistribution1DGate *) x));
@@ -136679,7 +136684,7 @@ static void *_p_IntensityScaleAndShiftNormalizerTo_p_IIntensityNormalizer(void *
     return (void *)((IIntensityNormalizer *) (IntensityNormalizer *) ((IntensityScaleAndShiftNormalizer *) x));
 }
 static void *_p_FormFactorBoxTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorBox *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorBox *) x));
 }
 static void *_p_IBackgroundTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *) ((IBackground *) x));
@@ -137192,7 +137197,7 @@ static void *_p_FormFactorCylinderTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorCylinder *) x));
 }
 static void *_p_FormFactorBoxTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorBox *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorBox *) x));
 }
 static void *_p_IFormFactorDecoratorTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *)  ((IFormFactorDecorator *) x));
@@ -137273,7 +137278,7 @@ static void *_p_SampleBuilderFactoryTo_p_IFactoryT_std__string_IMultiLayerBuilde
     return (void *)((IFactory< std::string,IMultiLayerBuilder > *)  ((SampleBuilderFactory *) x));
 }
 static void *_p_FormFactorBoxTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorBox *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorBox *) x));
 }
 static void *_p_FormFactorSphereLogNormalRadiusTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereLogNormalRadius *) x));
@@ -137531,7 +137536,7 @@ static void *_p_RotationEulerTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory
     return (void *)((ISample *) (IRotation *) ((RotationEuler *) x));
 }
 static void *_p_FormFactorBoxTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorBox *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorBox *) x));
 }
 static void *_p_IBackgroundTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *)  ((IBackground *) x));
@@ -138928,7 +138933,7 @@ static swig_cast_info _swigc__p_FormFactorLongBoxGauss[] = {  {&_swigt__p_FormFa
 static swig_cast_info _swigc__p_FormFactorLongBoxLorentz[] = {  {&_swigt__p_FormFactorLongBoxLorentz, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorLorentz[] = {  {&_swigt__p_FormFactorLorentz, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorOrnsteinZernike[] = {  {&_swigt__p_FormFactorOrnsteinZernike, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_FormFactorPolygonalPrism[] = {  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_FormFactorPolygonalPrism, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_FormFactorPolygonalPrism, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorPolygonalPrism[] = {  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_FormFactorPolygonalPrism, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_FormFactorPolygonalPrism, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, 0, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_FormFactorPolygonalPrism, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorPolygonalSurface[] = {  {&_swigt__p_FormFactorPolygonalSurface, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorPolyhedron[] = {  {&_swigt__p_FormFactorPolyhedron, 0, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_FormFactorPolyhedron, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorPrism3[] = {  {&_swigt__p_FormFactorPrism3, 0, 0, 0},{0, 0, 0, 0}};
diff --git a/auto/Wrap/libBornAgainFit_wrap.cpp b/auto/Wrap/libBornAgainFit_wrap.cpp
index cce029d0b81..b271c28638a 100644
--- a/auto/Wrap/libBornAgainFit_wrap.cpp
+++ b/auto/Wrap/libBornAgainFit_wrap.cpp
@@ -5958,17 +5958,17 @@ SWIGINTERN void std_vector_Sl_std_string_Sg__insert__SWIG_1(std::vector< std::st
 #include <numpy/arrayobject.h>
 
 
-#include "RealLimits.h"
-#include "AttLimits.h"
-#include "Parameter.h"
-#include "Parameters.h"
-#include "IMinimizer.h"
-#include "MinimizerCatalogue.h"
-#include "MinimizerFactory.h"
-
-#include "PyCallback.h"
-#include "MinimizerResult.h"
-#include "Minimizer.h"
+#include "Fit/Tools/RealLimits.h"
+#include "Fit/Tools/AttLimits.h"
+#include "Fit/Kernel/Parameter.h"
+#include "Fit/Kernel/Parameters.h"
+#include "Fit/Minimizer/IMinimizer.h"
+#include "Fit/Minimizer/MinimizerCatalogue.h"
+#include "Fit/Minimizer/MinimizerFactory.h"
+
+#include "Fit/Kernel/PyCallback.h"
+#include "Fit/Kernel/MinimizerResult.h"
+#include "Fit/Kernel/Minimizer.h"
 
 
 SWIGINTERN int
-- 
GitLab