From 03d30b5210da605544db1ffdbc734415dd886c1f Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Thu, 29 Oct 2020 20:59:42 +0100
Subject: [PATCH] mv a few files to achieve decoupling of Device from Sample

---
 Core/Export/SimulationToPython.cpp            |    2 +-
 {Device => Core}/Scan/AngularSpecScan.cpp     |    4 +-
 {Device => Core}/Scan/AngularSpecScan.h       |    4 +-
 {Device => Core}/Scan/ISpecularScan.h         |    2 +-
 {Device => Core}/Scan/QSpecScan.cpp           |    4 +-
 {Device => Core}/Scan/QSpecScan.h             |    4 +-
 .../Unit => Core/Scan}/UnitConverter1D.cpp    |    8 +-
 {Device/Unit => Core/Scan}/UnitConverter1D.h  |    2 +-
 Core/Simulation/SpecularSimulation.cpp        |    4 +-
 Core/Simulation/StandardSimulations.cpp       |    4 +-
 Core/Simulation/UnitConverterUtils.cpp        |    2 +-
 GUI/coregui/Models/DomainObjectBuilder.cpp    |    2 +-
 .../Models/DomainSimulationBuilder.cpp        |    2 +-
 GUI/coregui/Models/InstrumentItems.cpp        |    2 +-
 GUI/coregui/Models/TransformFromDomain.cpp    |    2 +-
 GUI/coregui/Models/TransformToDomain.cpp      |    2 +-
 .../Core/Axes/UnitConverter1DTest.cpp         |    4 +-
 .../Core/Fresnel/SpecularScanTest.cpp         |    4 +-
 .../Core/Fresnel/SpecularSimulationTest.cpp   |    4 +-
 Wrap/swig/libBornAgainCore.i                  |    8 +
 Wrap/swig/libBornAgainDevice.i                |    8 -
 auto/Wrap/doxygenCore.i                       |  402 +++-
 auto/Wrap/doxygenDevice.i                     |  393 +---
 auto/Wrap/doxygenSample.i                     |   11 +-
 auto/Wrap/libBornAgainCore.py                 |  180 ++
 auto/Wrap/libBornAgainCore_wrap.cpp           | 1798 +++++++++++++++--
 auto/Wrap/libBornAgainDevice.py               |  180 --
 auto/Wrap/libBornAgainDevice_wrap.cpp         | 1789 ++--------------
 28 files changed, 2418 insertions(+), 2413 deletions(-)
 rename {Device => Core}/Scan/AngularSpecScan.cpp (99%)
 rename {Device => Core}/Scan/AngularSpecScan.h (98%)
 rename {Device => Core}/Scan/ISpecularScan.h (98%)
 rename {Device => Core}/Scan/QSpecScan.cpp (98%)
 rename {Device => Core}/Scan/QSpecScan.h (98%)
 rename {Device/Unit => Core/Scan}/UnitConverter1D.cpp (98%)
 rename {Device/Unit => Core/Scan}/UnitConverter1D.h (99%)

diff --git a/Core/Export/SimulationToPython.cpp b/Core/Export/SimulationToPython.cpp
index a6223687612..f7f84d998d9 100644
--- a/Core/Export/SimulationToPython.cpp
+++ b/Core/Export/SimulationToPython.cpp
@@ -30,7 +30,7 @@
 #include "Device/Instrument/PyFmt2.h"
 #include "Device/Resolution/ConvolutionDetectorResolution.h"
 #include "Device/Resolution/ResolutionFunction2DGaussian.h"
-#include "Device/Scan/ISpecularScan.h"
+#include "Core/Scan/ISpecularScan.h"
 #include "Param/Varia/ParameterUtils.h"
 #include "Param/Varia/PyFmtLimits.h"
 #include <iomanip>
diff --git a/Device/Scan/AngularSpecScan.cpp b/Core/Scan/AngularSpecScan.cpp
similarity index 99%
rename from Device/Scan/AngularSpecScan.cpp
rename to Core/Scan/AngularSpecScan.cpp
index 1a769688a00..0b34e2b93c3 100644
--- a/Device/Scan/AngularSpecScan.cpp
+++ b/Core/Scan/AngularSpecScan.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Device/Scan/AngularSpecScan.cpp
+//! @file      Core/Scan/AngularSpecScan.cpp
 //! @brief     Implements AngularSpecScan class.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Device/Scan/AngularSpecScan.h"
+#include "Core/Scan/AngularSpecScan.h"
 #include "Base/Axis/FixedBinAxis.h"
 #include "Base/Axis/PointwiseAxis.h"
 #include "Base/Utils/PyFmt.h"
diff --git a/Device/Scan/AngularSpecScan.h b/Core/Scan/AngularSpecScan.h
similarity index 98%
rename from Device/Scan/AngularSpecScan.h
rename to Core/Scan/AngularSpecScan.h
index 9e9d99fff84..9933f308f4e 100644
--- a/Device/Scan/AngularSpecScan.h
+++ b/Core/Scan/AngularSpecScan.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Device/Scan/AngularSpecScan.h
+//! @file      Core/Scan/AngularSpecScan.h
 //! @brief     Declares AngularSpecScan class.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_CORE_INSTRUMENT_ANGULARSPECSCAN_H
 #define BORNAGAIN_CORE_INSTRUMENT_ANGULARSPECSCAN_H
 
-#include "Device/Scan/ISpecularScan.h"
+#include "Core/Scan/ISpecularScan.h"
 #include <memory>
 
 class ParameterSample;
diff --git a/Device/Scan/ISpecularScan.h b/Core/Scan/ISpecularScan.h
similarity index 98%
rename from Device/Scan/ISpecularScan.h
rename to Core/Scan/ISpecularScan.h
index 666c0f6724f..c68d3b7613b 100644
--- a/Device/Scan/ISpecularScan.h
+++ b/Core/Scan/ISpecularScan.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Device/Scan/ISpecularScan.h
+//! @file      Core/Scan/ISpecularScan.h
 //! @brief     Declares and implements pure virtual class ISpecularScan.
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Device/Scan/QSpecScan.cpp b/Core/Scan/QSpecScan.cpp
similarity index 98%
rename from Device/Scan/QSpecScan.cpp
rename to Core/Scan/QSpecScan.cpp
index 5574c99f8ea..11acfccfa6b 100644
--- a/Device/Scan/QSpecScan.cpp
+++ b/Core/Scan/QSpecScan.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Device/Scan/QSpecScan.cpp
+//! @file      Core/Scan/QSpecScan.cpp
 //! @brief     Implements QSpecScan class.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 // ************************************************************************** //
 
-#include "Device/Scan/QSpecScan.h"
+#include "Core/Scan/QSpecScan.h"
 #include "Base/Axis/FixedBinAxis.h"
 #include "Base/Axis/PointwiseAxis.h"
 #include "Base/Utils/PyFmt.h"
diff --git a/Device/Scan/QSpecScan.h b/Core/Scan/QSpecScan.h
similarity index 98%
rename from Device/Scan/QSpecScan.h
rename to Core/Scan/QSpecScan.h
index c22fc36e5cb..7b09ac54e3c 100644
--- a/Device/Scan/QSpecScan.h
+++ b/Core/Scan/QSpecScan.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Device/Scan/QSpecScan.h
+//! @file      Core/Scan/QSpecScan.h
 //! @brief     Declares QSpecScan class.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_CORE_INSTRUMENT_QSPECSCAN_H
 #define BORNAGAIN_CORE_INSTRUMENT_QSPECSCAN_H
 
-#include "Device/Scan/ISpecularScan.h"
+#include "Core/Scan/ISpecularScan.h"
 #include <memory>
 
 class ParameterSample;
diff --git a/Device/Unit/UnitConverter1D.cpp b/Core/Scan/UnitConverter1D.cpp
similarity index 98%
rename from Device/Unit/UnitConverter1D.cpp
rename to Core/Scan/UnitConverter1D.cpp
index 1f0f5ca83ea..09569a64a53 100644
--- a/Device/Unit/UnitConverter1D.cpp
+++ b/Core/Scan/UnitConverter1D.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Device/Unit/UnitConverter1D.cpp
+//! @file      Core/Scan/UnitConverter1D.cpp
 //! @brief     Implements UnitConverter1D class and derived classes.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,14 +12,14 @@
 //
 // ************************************************************************** //
 
-#include "Device/Unit/UnitConverter1D.h"
+#include "Core/Scan/UnitConverter1D.h"
 #include "Base/Axis/PointwiseAxis.h"
 #include "Base/Const/MathConstants.h"
 #include "Base/Const/Units.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Data/OutputData.h"
-#include "Device/Scan/AngularSpecScan.h"
-#include "Device/Scan/QSpecScan.h"
+#include "Core/Scan/AngularSpecScan.h"
+#include "Core/Scan/QSpecScan.h"
 #include "Device/Unit/AxisNames.h"
 
 namespace
diff --git a/Device/Unit/UnitConverter1D.h b/Core/Scan/UnitConverter1D.h
similarity index 99%
rename from Device/Unit/UnitConverter1D.h
rename to Core/Scan/UnitConverter1D.h
index d928bea5af5..be72cd6f57a 100644
--- a/Device/Unit/UnitConverter1D.h
+++ b/Core/Scan/UnitConverter1D.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Device/Unit/UnitConverter1D.h
+//! @file      Core/Scan/UnitConverter1D.h
 //! @brief     Defines UnitConverter1D class and derived classes.
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/Simulation/SpecularSimulation.cpp b/Core/Simulation/SpecularSimulation.cpp
index 3f449d7990c..14e319511ee 100644
--- a/Core/Simulation/SpecularSimulation.cpp
+++ b/Core/Simulation/SpecularSimulation.cpp
@@ -19,8 +19,8 @@
 #include "Device/Beam/IFootprintFactor.h"
 #include "Device/Detector/SpecularDetector1D.h"
 #include "Device/Histo/Histogram1D.h"
-#include "Device/Scan/AngularSpecScan.h"
-#include "Device/Unit/UnitConverter1D.h"
+#include "Core/Scan/AngularSpecScan.h"
+#include "Core/Scan/UnitConverter1D.h"
 #include "Param/Base/ParameterPool.h"
 #include "Param/Base/RealParameter.h"
 #include "Param/Distrib/Distributions.h"
diff --git a/Core/Simulation/StandardSimulations.cpp b/Core/Simulation/StandardSimulations.cpp
index c0aa2374d15..45c916a0505 100644
--- a/Core/Simulation/StandardSimulations.cpp
+++ b/Core/Simulation/StandardSimulations.cpp
@@ -29,8 +29,8 @@
 #include "Device/Mask/Rectangle.h"
 #include "Device/Resolution/ResolutionFunction2DGaussian.h"
 #include "Device/Resolution/ScanResolution.h"
-#include "Device/Scan/AngularSpecScan.h"
-#include "Device/Scan/QSpecScan.h"
+#include "Core/Scan/AngularSpecScan.h"
+#include "Core/Scan/QSpecScan.h"
 #include "Param/Base/RealParameter.h"
 #include "Param/Distrib/Distributions.h"
 #include "Param/Distrib/RangedDistributions.h"
diff --git a/Core/Simulation/UnitConverterUtils.cpp b/Core/Simulation/UnitConverterUtils.cpp
index 207c605c700..bad833a2f3d 100644
--- a/Core/Simulation/UnitConverterUtils.cpp
+++ b/Core/Simulation/UnitConverterUtils.cpp
@@ -20,7 +20,7 @@
 #include "Device/Detector/RectangularDetector.h"
 #include "Device/Detector/SimpleUnitConverters.h"
 #include "Device/Detector/SphericalDetector.h"
-#include "Device/Unit/UnitConverter1D.h"
+#include "Core/Scan/UnitConverter1D.h"
 
 std::unique_ptr<OutputData<double>>
 UnitConverterUtils::createOutputData(const IUnitConverter& converter, Axes::Units units)
diff --git a/GUI/coregui/Models/DomainObjectBuilder.cpp b/GUI/coregui/Models/DomainObjectBuilder.cpp
index 6f3be24156f..92fce9acba8 100644
--- a/GUI/coregui/Models/DomainObjectBuilder.cpp
+++ b/GUI/coregui/Models/DomainObjectBuilder.cpp
@@ -17,7 +17,7 @@
 #include "Core/Simulation/UnitConverterUtils.h"
 #include "Device/Detector/IDetector2D.h"
 #include "Device/Detector/SimpleUnitConverters.h"
-#include "Device/Unit/UnitConverter1D.h"
+#include "Core/Scan/UnitConverter1D.h"
 #include "GUI/coregui/Models/AxesItems.h"
 #include "GUI/coregui/Models/ComboProperty.h"
 #include "GUI/coregui/Models/DepthProbeInstrumentItem.h"
diff --git a/GUI/coregui/Models/DomainSimulationBuilder.cpp b/GUI/coregui/Models/DomainSimulationBuilder.cpp
index b370c9c7245..01aab0c0e6e 100644
--- a/GUI/coregui/Models/DomainSimulationBuilder.cpp
+++ b/GUI/coregui/Models/DomainSimulationBuilder.cpp
@@ -20,7 +20,7 @@
 #include "Core/Simulation/OffSpecSimulation.h"
 #include "Core/Simulation/SpecularSimulation.h"
 #include "Device/Beam/IFootprintFactor.h"
-#include "Device/Scan/AngularSpecScan.h"
+#include "Core/Scan/AngularSpecScan.h"
 #include "GUI/coregui/Models/AxesItems.h"
 #include "GUI/coregui/Models/BackgroundItems.h"
 #include "GUI/coregui/Models/DepthProbeInstrumentItem.h"
diff --git a/GUI/coregui/Models/InstrumentItems.cpp b/GUI/coregui/Models/InstrumentItems.cpp
index 11d7de0c93a..70e7cb54de5 100644
--- a/GUI/coregui/Models/InstrumentItems.cpp
+++ b/GUI/coregui/Models/InstrumentItems.cpp
@@ -15,7 +15,7 @@
 #include "GUI/coregui/Models/InstrumentItems.h"
 #include "Device/Detector/IDetector2D.h"
 #include "Device/Instrument/Instrument.h"
-#include "Device/Unit/UnitConverter1D.h"
+#include "Core/Scan/UnitConverter1D.h"
 #include "GUI/coregui/Models/BackgroundItems.h"
 #include "GUI/coregui/Models/DataItem.h"
 #include "GUI/coregui/Models/DetectorItems.h"
diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp
index 6497c5b2bb9..9f6786ef4de 100644
--- a/GUI/coregui/Models/TransformFromDomain.cpp
+++ b/GUI/coregui/Models/TransformFromDomain.cpp
@@ -33,7 +33,7 @@
 #include "Device/Resolution/ConvolutionDetectorResolution.h"
 #include "Device/Resolution/ResolutionFunction2DGaussian.h"
 #include "Device/Resolution/ScanResolution.h"
-#include "Device/Scan/AngularSpecScan.h"
+#include "Core/Scan/AngularSpecScan.h"
 #include "GUI/coregui/Models/AxesItems.h"
 #include "GUI/coregui/Models/BackgroundItems.h"
 #include "GUI/coregui/Models/BeamAngleItems.h"
diff --git a/GUI/coregui/Models/TransformToDomain.cpp b/GUI/coregui/Models/TransformToDomain.cpp
index 4b770de9f99..24a33362df9 100644
--- a/GUI/coregui/Models/TransformToDomain.cpp
+++ b/GUI/coregui/Models/TransformToDomain.cpp
@@ -16,7 +16,7 @@
 #include "Base/Const/Units.h"
 #include "Core/Simulation/GISASSimulation.h"
 #include "Device/Resolution/ScanResolution.h"
-#include "Device/Scan/AngularSpecScan.h"
+#include "Core/Scan/AngularSpecScan.h"
 #include "GUI/coregui/Models/BeamAngleItems.h"
 #include "GUI/coregui/Models/BeamItems.h"
 #include "GUI/coregui/Models/BeamWavelengthItem.h"
diff --git a/Tests/UnitTests/Core/Axes/UnitConverter1DTest.cpp b/Tests/UnitTests/Core/Axes/UnitConverter1DTest.cpp
index 0353451f36d..ca4b1ea7e61 100644
--- a/Tests/UnitTests/Core/Axes/UnitConverter1DTest.cpp
+++ b/Tests/UnitTests/Core/Axes/UnitConverter1DTest.cpp
@@ -1,11 +1,11 @@
-#include "Device/Unit/UnitConverter1D.h"
+#include "Core/Scan/UnitConverter1D.h"
 #include "Base/Axis/PointwiseAxis.h"
 #include "Base/Axis/VariableBinAxis.h"
 #include "Base/Const/MathConstants.h"
 #include "Base/Const/Units.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Data/OutputData.h"
-#include "Device/Scan/QSpecScan.h"
+#include "Core/Scan/QSpecScan.h"
 #include "Tests/GTestWrapper/google_test.h"
 
 class UnitConverter1DTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/Fresnel/SpecularScanTest.cpp b/Tests/UnitTests/Core/Fresnel/SpecularScanTest.cpp
index b76df62f777..c2ef4232d89 100644
--- a/Tests/UnitTests/Core/Fresnel/SpecularScanTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/SpecularScanTest.cpp
@@ -2,8 +2,8 @@
 #include "Base/Axis/PointwiseAxis.h"
 #include "Device/Beam/FootprintGauss.h"
 #include "Device/Resolution/ScanResolution.h"
-#include "Device/Scan/AngularSpecScan.h"
-#include "Device/Scan/QSpecScan.h"
+#include "Core/Scan/AngularSpecScan.h"
+#include "Core/Scan/QSpecScan.h"
 #include "Param/Distrib/RangedDistributions.h"
 #include "Sample/Slice/SpecularSimulationElement.h"
 #include "Tests/GTestWrapper/google_test.h"
diff --git a/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp b/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp
index 28b10bbf2a1..58557b7ce84 100644
--- a/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp
@@ -3,8 +3,8 @@
 #include "Base/Const/MathConstants.h"
 #include "Base/Const/Units.h"
 #include "Device/Histo/Histogram1D.h"
-#include "Device/Scan/AngularSpecScan.h"
-#include "Device/Scan/QSpecScan.h"
+#include "Core/Scan/AngularSpecScan.h"
+#include "Core/Scan/QSpecScan.h"
 #include "Param/Base/RealParameter.h"
 #include "Param/Distrib/Distributions.h"
 #include "Param/Varia/ParameterPattern.h"
diff --git a/Wrap/swig/libBornAgainCore.i b/Wrap/swig/libBornAgainCore.i
index 53f1128456e..cd458740da5 100644
--- a/Wrap/swig/libBornAgainCore.i
+++ b/Wrap/swig/libBornAgainCore.i
@@ -24,6 +24,8 @@
 %include "ignoreBase.i"
 %include "ignoreSample.i"
 
+%ignore ISpecularScan;
+
 %rename(MaterialProfile_cpp) MaterialProfile;
 
 %rename(setSampleBuilderCpp) Simulation::setSampleBuilder;
@@ -56,6 +58,8 @@
 
 %{
 #include "BAVersion.h"
+#include "Core/Scan/AngularSpecScan.h"
+#include "Core/Scan/QSpecScan.h"
 #include "Core/Computation/ConstantBackground.h"
 #include "Core/Computation/IBackground.h"
 #include "Core/Computation/MultiLayerFuncs.h"
@@ -105,6 +109,10 @@
 %include "Core/Fitting/IterationInfo.h"
 %include "Core/Fitting/PyFittingCallbacks.h"
 
+%include "Core/Scan/ISpecularScan.h"
+%include "Core/Scan/AngularSpecScan.h"
+%include "Core/Scan/QSpecScan.h"
+
 %include "Core/Simulation/Simulation.h"
 %include "Core/Simulation/Simulation2D.h"
 %include "Core/Simulation/GISASSimulation.h"
diff --git a/Wrap/swig/libBornAgainDevice.i b/Wrap/swig/libBornAgainDevice.i
index cb295ad5cf2..75cc8cf1da7 100644
--- a/Wrap/swig/libBornAgainDevice.i
+++ b/Wrap/swig/libBornAgainDevice.i
@@ -23,8 +23,6 @@
 
 %include "ignoreBase.i"
 
-%ignore ISpecularScan;
-
 // deprecations:
 %rename(getArrayObsolete) IHistogram::getArray;
 %extend IHistogram {
@@ -69,8 +67,6 @@
 #include "Device/Resolution/IResolutionFunction2D.h"
 #include "Device/Resolution/ResolutionFunction2DGaussian.h"
 #include "Device/Resolution/ScanResolution.h"
-#include "Device/Scan/AngularSpecScan.h"
-#include "Device/Scan/QSpecScan.h"
 %}
 
 %import(module="libBornAgainFit") "Fit/Tools/AttLimits.h"
@@ -123,10 +119,6 @@
 %include "Device/Instrument/SpectrumUtils.h"
 %include "Device/Instrument/VarianceFunctions.h"
 
-%include "Device/Scan/ISpecularScan.h"
-%include "Device/Scan/AngularSpecScan.h"
-%include "Device/Scan/QSpecScan.h"
-
 %include "Device/Unit/IUnitConverter.h"
 
 %include "Device/Detector/DetectorMask.h"
diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i
index 74b155265ca..bfa00895e7a 100644
--- a/auto/Wrap/doxygenCore.i
+++ b/auto/Wrap/doxygenCore.i
@@ -1,6 +1,123 @@
 
 // File: index.xml
 
+// File: classAngularSpecScan.xml
+%feature("docstring") AngularSpecScan "
+
+Scan type with inclination angles as coordinate values and a unique wavelength. Features footprint correction.
+
+C++ includes: AngularSpecScan.h
+";
+
+%feature("docstring")  AngularSpecScan::AngularSpecScan "AngularSpecScan::AngularSpecScan(double wl, std::vector< double > inc_angle)
+";
+
+%feature("docstring")  AngularSpecScan::AngularSpecScan "AngularSpecScan::AngularSpecScan(double wl, const IAxis &inc_angle)
+";
+
+%feature("docstring")  AngularSpecScan::AngularSpecScan "AngularSpecScan::AngularSpecScan(double wl, int nbins, double alpha_i_min, double alpha_i_max)
+
+Sets angle-defined specular scan. The first parameter is always a wavelength in nm. Second parameter is either a numpy array of incident angles in radians or an IAxis object with angle values. Alternatively an axis can be defined in-place, then the second passed parameter is the number of bins, third - minimum on-axis angle value, fourth - maximum on-axis angle value. 
+";
+
+%feature("docstring")  AngularSpecScan::~AngularSpecScan "AngularSpecScan::~AngularSpecScan() override
+";
+
+%feature("docstring")  AngularSpecScan::clone "AngularSpecScan * AngularSpecScan::clone() const override
+";
+
+%feature("docstring")  AngularSpecScan::generateSimulationElements "std::vector< SpecularSimulationElement > AngularSpecScan::generateSimulationElements() const override
+
+Generates simulation elements for specular simulations. 
+";
+
+%feature("docstring")  AngularSpecScan::coordinateAxis "virtual const IAxis* AngularSpecScan::coordinateAxis() const override
+
+Returns coordinate axis assigned to the data holder. 
+";
+
+%feature("docstring")  AngularSpecScan::footprintFactor "virtual const IFootprintFactor* AngularSpecScan::footprintFactor() const override
+
+Returns IFootprintFactor object pointer. 
+";
+
+%feature("docstring")  AngularSpecScan::footprint "std::vector< double > AngularSpecScan::footprint(size_t i, size_t n_elements) const override
+
+Returns footprint correction factor for a range of simulation elements of size  n_elements and starting from element with index  i. 
+";
+
+%feature("docstring")  AngularSpecScan::numberOfSimulationElements "size_t AngularSpecScan::numberOfSimulationElements() const override
+
+Returns the number of simulation elements. 
+";
+
+%feature("docstring")  AngularSpecScan::createIntensities "std::vector< double > AngularSpecScan::createIntensities(const std::vector< SpecularSimulationElement > &sim_elements) const override
+
+Returns intensity vector corresponding to convolution of given simulation elements. 
+";
+
+%feature("docstring")  AngularSpecScan::print "std::string AngularSpecScan::print() const override
+
+Print scan definition in python format. 
+";
+
+%feature("docstring")  AngularSpecScan::wavelength "double AngularSpecScan::wavelength() const
+";
+
+%feature("docstring")  AngularSpecScan::wavelengthResolution "const ScanResolution* AngularSpecScan::wavelengthResolution() const
+";
+
+%feature("docstring")  AngularSpecScan::angleResolution "const ScanResolution* AngularSpecScan::angleResolution() const
+";
+
+%feature("docstring")  AngularSpecScan::setFootprintFactor "void AngularSpecScan::setFootprintFactor(const IFootprintFactor *f_factor)
+
+Sets footprint correction factor. 
+";
+
+%feature("docstring")  AngularSpecScan::setWavelengthResolution "void AngularSpecScan::setWavelengthResolution(const ScanResolution &resolution)
+
+Sets wavelength resolution values via ScanResolution object. 
+";
+
+%feature("docstring")  AngularSpecScan::setRelativeWavelengthResolution "void AngularSpecScan::setRelativeWavelengthResolution(const RangedDistribution &distr, double rel_dev)
+";
+
+%feature("docstring")  AngularSpecScan::setRelativeWavelengthResolution "void AngularSpecScan::setRelativeWavelengthResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)
+
+Sets wavelength resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
+";
+
+%feature("docstring")  AngularSpecScan::setAbsoluteWavelengthResolution "void AngularSpecScan::setAbsoluteWavelengthResolution(const RangedDistribution &distr, double std_dev)
+";
+
+%feature("docstring")  AngularSpecScan::setAbsoluteWavelengthResolution "void AngularSpecScan::setAbsoluteWavelengthResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)
+
+Sets wavelength resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
+";
+
+%feature("docstring")  AngularSpecScan::setAngleResolution "void AngularSpecScan::setAngleResolution(const ScanResolution &resolution)
+
+Sets angle resolution values via ScanResolution object. 
+";
+
+%feature("docstring")  AngularSpecScan::setRelativeAngularResolution "void AngularSpecScan::setRelativeAngularResolution(const RangedDistribution &distr, double rel_dev)
+";
+
+%feature("docstring")  AngularSpecScan::setRelativeAngularResolution "void AngularSpecScan::setRelativeAngularResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)
+
+Sets angular resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
+";
+
+%feature("docstring")  AngularSpecScan::setAbsoluteAngularResolution "void AngularSpecScan::setAbsoluteAngularResolution(const RangedDistribution &distr, double std_dev)
+";
+
+%feature("docstring")  AngularSpecScan::setAbsoluteAngularResolution "void AngularSpecScan::setAbsoluteAngularResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)
+
+Sets angular resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
+";
+
+
 // File: classChi2Metric.xml
 %feature("docstring") Chi2Metric "
 
@@ -787,6 +904,53 @@ method which is used by observable subject to notify change in status
 ";
 
 
+// File: classISpecularScan.xml
+%feature("docstring") ISpecularScan "
+
+Pure virtual base class for all types of specular scans.
+
+C++ includes: ISpecularScan.h
+";
+
+%feature("docstring")  ISpecularScan::clone "ISpecularScan* ISpecularScan::clone() const override=0
+";
+
+%feature("docstring")  ISpecularScan::generateSimulationElements "virtual std::vector<SpecularSimulationElement> ISpecularScan::generateSimulationElements() const =0
+
+Generates simulation elements for specular simulations. 
+";
+
+%feature("docstring")  ISpecularScan::coordinateAxis "virtual const IAxis* ISpecularScan::coordinateAxis() const =0
+
+Returns coordinate axis assigned to the data holder. 
+";
+
+%feature("docstring")  ISpecularScan::footprintFactor "virtual const IFootprintFactor* ISpecularScan::footprintFactor() const =0
+
+Returns IFootprintFactor object pointer. 
+";
+
+%feature("docstring")  ISpecularScan::footprint "virtual std::vector<double> ISpecularScan::footprint(size_t i, size_t n_elements) const =0
+
+Returns footprint correction factor for a range of simulation elements of size  n_elements and starting from element with index  i. 
+";
+
+%feature("docstring")  ISpecularScan::numberOfSimulationElements "virtual size_t ISpecularScan::numberOfSimulationElements() const =0
+
+Returns the number of simulation elements. 
+";
+
+%feature("docstring")  ISpecularScan::createIntensities "virtual std::vector<double> ISpecularScan::createIntensities(const std::vector< SpecularSimulationElement > &sim_elements) const =0
+
+Returns intensity vector corresponding to convolution of given simulation elements. 
+";
+
+%feature("docstring")  ISpecularScan::print "virtual std::string ISpecularScan::print() const =0
+
+Print scan definition in python format. 
+";
+
+
 // File: classIterationInfo.xml
 %feature("docstring") IterationInfo "
 
@@ -1387,6 +1551,90 @@ C++ includes: PyFittingCallbacks.h
 ";
 
 
+// File: classQSpecScan.xml
+%feature("docstring") QSpecScan "
+
+Scan type with z-components of scattering vector as coordinate values. Wavelength and incident angles are not accessible separately.
+
+C++ includes: QSpecScan.h
+";
+
+%feature("docstring")  QSpecScan::QSpecScan "QSpecScan::QSpecScan(std::vector< double > qs_nm)
+
+Accepts qz-value vector (in inverse nm) 
+";
+
+%feature("docstring")  QSpecScan::QSpecScan "QSpecScan::QSpecScan(const IAxis &qs_nm)
+";
+
+%feature("docstring")  QSpecScan::QSpecScan "QSpecScan::QSpecScan(int nbins, double qz_min, double qz_max)
+
+Sets q-defined specular scan. Accepts either numpy array of q-values sorted in ascending order or an IAxis object with q-values. Alternatively an axis can be defined in-place, then the first passed parameter is the number of bins, second - minimum on-axis q-value, third - maximum on-axis q_value. 
+";
+
+%feature("docstring")  QSpecScan::~QSpecScan "QSpecScan::~QSpecScan() override
+";
+
+%feature("docstring")  QSpecScan::clone "QSpecScan * QSpecScan::clone() const override
+";
+
+%feature("docstring")  QSpecScan::generateSimulationElements "std::vector< SpecularSimulationElement > QSpecScan::generateSimulationElements() const override
+
+Generates simulation elements for specular simulations. 
+";
+
+%feature("docstring")  QSpecScan::coordinateAxis "virtual const IAxis* QSpecScan::coordinateAxis() const override
+
+Returns coordinate axis assigned to the data holder. 
+";
+
+%feature("docstring")  QSpecScan::footprintFactor "virtual const IFootprintFactor* QSpecScan::footprintFactor() const override
+
+Returns IFootprintFactor object pointer. 
+";
+
+%feature("docstring")  QSpecScan::footprint "std::vector< double > QSpecScan::footprint(size_t i, size_t n_elements) const override
+
+Returns footprint correction factor for a range of simulation elements of size  n_elements and starting from element with index  i. 
+";
+
+%feature("docstring")  QSpecScan::numberOfSimulationElements "size_t QSpecScan::numberOfSimulationElements() const override
+
+Returns the number of simulation elements. 
+";
+
+%feature("docstring")  QSpecScan::createIntensities "std::vector< double > QSpecScan::createIntensities(const std::vector< SpecularSimulationElement > &sim_elements) const override
+
+Returns intensity vector corresponding to convolution of given simulation elements. 
+";
+
+%feature("docstring")  QSpecScan::print "std::string QSpecScan::print() const override
+
+Print scan definition in python format. 
+";
+
+%feature("docstring")  QSpecScan::setQResolution "void QSpecScan::setQResolution(const ScanResolution &resolution)
+
+Sets q resolution values via ScanResolution object. 
+";
+
+%feature("docstring")  QSpecScan::setRelativeQResolution "void QSpecScan::setRelativeQResolution(const RangedDistribution &distr, double rel_dev)
+";
+
+%feature("docstring")  QSpecScan::setRelativeQResolution "void QSpecScan::setRelativeQResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)
+
+Sets qz resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the qz-axis. 
+";
+
+%feature("docstring")  QSpecScan::setAbsoluteQResolution "void QSpecScan::setAbsoluteQResolution(const RangedDistribution &distr, double std_dev)
+";
+
+%feature("docstring")  QSpecScan::setAbsoluteQResolution "void QSpecScan::setAbsoluteQResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)
+
+Sets qz resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the qz-axis. 
+";
+
+
 // File: classRelativeDifferenceMetric.xml
 %feature("docstring") RelativeDifferenceMetric "
 
@@ -1995,7 +2243,7 @@ C++ includes: SpecularComputation.h
 
 Computes the specular scattering. Used by  SpecularComputation.
 
-Inherited by  SpecularScalarTerm,  SpecularMatrixTerm
+Pure virtual base class of  SpecularScalarTerm,  SpecularMatrixTerm
 
 C++ includes: SpecularComputationTerm.h
 ";
@@ -2012,7 +2260,7 @@ C++ includes: SpecularComputationTerm.h
 %feature("docstring")  SpecularComputationTerm::setProgressHandler "void SpecularComputationTerm::setProgressHandler(ProgressHandler *p_progress)
 ";
 
-%feature("docstring")  SpecularComputationTerm::compute "void SpecularComputationTerm::compute(SpecularSimulationElement &elem, const std::vector< Slice > &slices) const
+%feature("docstring")  SpecularComputationTerm::computeIntensity "void SpecularComputationTerm::computeIntensity(SpecularSimulationElement &elem, const std::vector< Slice > &slices) const
 ";
 
 
@@ -2100,6 +2348,117 @@ Returns internal data handler.
 %feature("docstring") SpecularStrategyBuilder "";
 
 
+// File: classUnitConverter1D.xml
+%feature("docstring") UnitConverter1D "
+
+Conversion of axis units for the case of 1D simulation result.
+
+C++ includes: UnitConverter1D.h
+";
+
+%feature("docstring")  UnitConverter1D::~UnitConverter1D "UnitConverter1D::~UnitConverter1D() override=default
+";
+
+%feature("docstring")  UnitConverter1D::clone "UnitConverter1D* UnitConverter1D::clone() const override=0
+";
+
+%feature("docstring")  UnitConverter1D::dimension "size_t UnitConverter1D::dimension() const override
+
+Returns dimensionality of converted canvas. 
+";
+
+%feature("docstring")  UnitConverter1D::calculateMin "double UnitConverter1D::calculateMin(size_t i_axis, Axes::Units units_type) const override
+
+Calculates minimum on-axis value in given units. 
+";
+
+%feature("docstring")  UnitConverter1D::calculateMax "double UnitConverter1D::calculateMax(size_t i_axis, Axes::Units units_type) const override
+
+Calculates maximum on-axis value in given units. 
+";
+
+%feature("docstring")  UnitConverter1D::createConvertedAxis "std::unique_ptr< IAxis > UnitConverter1D::createConvertedAxis(size_t i_axis, Axes::Units units) const override
+
+Creates axis in converted units. 
+";
+
+%feature("docstring")  UnitConverter1D::createConvertedData "std::unique_ptr< OutputData< double > > UnitConverter1D::createConvertedData(const OutputData< double > &data, Axes::Units units) const override
+
+Creates  OutputData array in converter units. 
+";
+
+
+// File: classUnitConverterConvSpec.xml
+%feature("docstring") UnitConverterConvSpec "
+
+Conversion of axis units for the case of conventional (angle-based) reflectometry.
+
+C++ includes: UnitConverter1D.h
+";
+
+%feature("docstring")  UnitConverterConvSpec::UnitConverterConvSpec "UnitConverterConvSpec::UnitConverterConvSpec(const Beam &beam, const IAxis &axis, Axes::Units axis_units=Axes::Units::RADIANS)
+
+Constructs the object for unit conversion. 
+";
+
+%feature("docstring")  UnitConverterConvSpec::UnitConverterConvSpec "UnitConverterConvSpec::UnitConverterConvSpec(const AngularSpecScan &handler)
+";
+
+%feature("docstring")  UnitConverterConvSpec::~UnitConverterConvSpec "UnitConverterConvSpec::~UnitConverterConvSpec() override
+";
+
+%feature("docstring")  UnitConverterConvSpec::clone "UnitConverterConvSpec * UnitConverterConvSpec::clone() const override
+";
+
+%feature("docstring")  UnitConverterConvSpec::axisSize "size_t UnitConverterConvSpec::axisSize(size_t i_axis) const override
+
+Returns the size of underlying axis. 
+";
+
+%feature("docstring")  UnitConverterConvSpec::availableUnits "std::vector< Axes::Units > UnitConverterConvSpec::availableUnits() const override
+
+Returns the list of all available units. 
+";
+
+%feature("docstring")  UnitConverterConvSpec::defaultUnits "Axes::Units UnitConverterConvSpec::defaultUnits() const override
+
+Returns default units to convert to. 
+";
+
+
+// File: classUnitConverterQSpec.xml
+%feature("docstring") UnitConverterQSpec "
+
+Conversion of axis units for the case of q-defined reflectometry.
+
+C++ includes: UnitConverter1D.h
+";
+
+%feature("docstring")  UnitConverterQSpec::UnitConverterQSpec "UnitConverterQSpec::UnitConverterQSpec(const QSpecScan &handler)
+";
+
+%feature("docstring")  UnitConverterQSpec::~UnitConverterQSpec "UnitConverterQSpec::~UnitConverterQSpec() override
+";
+
+%feature("docstring")  UnitConverterQSpec::clone "UnitConverterQSpec * UnitConverterQSpec::clone() const override
+";
+
+%feature("docstring")  UnitConverterQSpec::axisSize "size_t UnitConverterQSpec::axisSize(size_t i_axis) const override
+
+Returns the size of underlying axis. 
+";
+
+%feature("docstring")  UnitConverterQSpec::availableUnits "std::vector< Axes::Units > UnitConverterQSpec::availableUnits() const override
+
+Returns the list of all available units. 
+";
+
+%feature("docstring")  UnitConverterQSpec::defaultUnits "Axes::Units UnitConverterQSpec::defaultUnits() const override
+
+Returns default units to convert to. 
+";
+
+
 // File: namespace_0d29.xml
 
 
@@ -2112,6 +2471,9 @@ Returns internal data handler.
 // File: namespace_0d37.xml
 
 
+// File: namespace_0d41.xml
+
+
 // File: namespace_0d45.xml
 
 
@@ -2133,13 +2495,19 @@ Returns internal data handler.
 // File: namespace_0d75.xml
 
 
-// File: namespace_0d83.xml
+// File: namespace_0d80.xml
+
+
+// File: namespace_0d82.xml
 
 
-// File: namespace_0d89.xml
+// File: namespace_0d90.xml
 
 
-// File: namespace_0d91.xml
+// File: namespace_0d96.xml
+
+
+// File: namespace_0d98.xml
 
 
 // File: namespaceExportToPython.xml
@@ -2665,6 +3033,27 @@ Generate z values (equidistant) for use in MaterialProfile.
 // File: SimDataPair_8h.xml
 
 
+// File: AngularSpecScan_8cpp.xml
+
+
+// File: AngularSpecScan_8h.xml
+
+
+// File: ISpecularScan_8h.xml
+
+
+// File: QSpecScan_8cpp.xml
+
+
+// File: QSpecScan_8h.xml
+
+
+// File: UnitConverter1D_8cpp.xml
+
+
+// File: UnitConverter1D_8h.xml
+
+
 // File: DepthProbeSimulation_8cpp.xml
 
 
@@ -2737,5 +3126,8 @@ Generate z values (equidistant) for use in MaterialProfile.
 // File: dir_4470199ae7eb44153ffe31d163ed0f28.xml
 
 
+// File: dir_6de83e740cfcd9d0abfe8dffab2832a5.xml
+
+
 // File: dir_d7a24665a95cfc15308ebd7b07b5ebd6.xml
 
diff --git a/auto/Wrap/doxygenDevice.i b/auto/Wrap/doxygenDevice.i
index 99b2b9494b9..ffe98c08e80 100644
--- a/auto/Wrap/doxygenDevice.i
+++ b/auto/Wrap/doxygenDevice.i
@@ -1,123 +1,6 @@
 
 // File: index.xml
 
-// File: classAngularSpecScan.xml
-%feature("docstring") AngularSpecScan "
-
-Scan type with inclination angles as coordinate values and a unique wavelength. Features footprint correction.
-
-C++ includes: AngularSpecScan.h
-";
-
-%feature("docstring")  AngularSpecScan::AngularSpecScan "AngularSpecScan::AngularSpecScan(double wl, std::vector< double > inc_angle)
-";
-
-%feature("docstring")  AngularSpecScan::AngularSpecScan "AngularSpecScan::AngularSpecScan(double wl, const IAxis &inc_angle)
-";
-
-%feature("docstring")  AngularSpecScan::AngularSpecScan "AngularSpecScan::AngularSpecScan(double wl, int nbins, double alpha_i_min, double alpha_i_max)
-
-Sets angle-defined specular scan. The first parameter is always a wavelength in nm. Second parameter is either a numpy array of incident angles in radians or an IAxis object with angle values. Alternatively an axis can be defined in-place, then the second passed parameter is the number of bins, third - minimum on-axis angle value, fourth - maximum on-axis angle value. 
-";
-
-%feature("docstring")  AngularSpecScan::~AngularSpecScan "AngularSpecScan::~AngularSpecScan() override
-";
-
-%feature("docstring")  AngularSpecScan::clone "AngularSpecScan * AngularSpecScan::clone() const override
-";
-
-%feature("docstring")  AngularSpecScan::generateSimulationElements "std::vector< SpecularSimulationElement > AngularSpecScan::generateSimulationElements() const override
-
-Generates simulation elements for specular simulations. 
-";
-
-%feature("docstring")  AngularSpecScan::coordinateAxis "virtual const IAxis* AngularSpecScan::coordinateAxis() const override
-
-Returns coordinate axis assigned to the data holder. 
-";
-
-%feature("docstring")  AngularSpecScan::footprintFactor "virtual const IFootprintFactor* AngularSpecScan::footprintFactor() const override
-
-Returns  IFootprintFactor object pointer. 
-";
-
-%feature("docstring")  AngularSpecScan::footprint "std::vector< double > AngularSpecScan::footprint(size_t i, size_t n_elements) const override
-
-Returns footprint correction factor for a range of simulation elements of size  n_elements and starting from element with index  i. 
-";
-
-%feature("docstring")  AngularSpecScan::numberOfSimulationElements "size_t AngularSpecScan::numberOfSimulationElements() const override
-
-Returns the number of simulation elements. 
-";
-
-%feature("docstring")  AngularSpecScan::createIntensities "std::vector< double > AngularSpecScan::createIntensities(const std::vector< SpecularSimulationElement > &sim_elements) const override
-
-Returns intensity vector corresponding to convolution of given simulation elements. 
-";
-
-%feature("docstring")  AngularSpecScan::print "std::string AngularSpecScan::print() const override
-
-Print scan definition in python format. 
-";
-
-%feature("docstring")  AngularSpecScan::wavelength "double AngularSpecScan::wavelength() const
-";
-
-%feature("docstring")  AngularSpecScan::wavelengthResolution "const ScanResolution* AngularSpecScan::wavelengthResolution() const
-";
-
-%feature("docstring")  AngularSpecScan::angleResolution "const ScanResolution* AngularSpecScan::angleResolution() const
-";
-
-%feature("docstring")  AngularSpecScan::setFootprintFactor "void AngularSpecScan::setFootprintFactor(const IFootprintFactor *f_factor)
-
-Sets footprint correction factor. 
-";
-
-%feature("docstring")  AngularSpecScan::setWavelengthResolution "void AngularSpecScan::setWavelengthResolution(const ScanResolution &resolution)
-
-Sets wavelength resolution values via  ScanResolution object. 
-";
-
-%feature("docstring")  AngularSpecScan::setRelativeWavelengthResolution "void AngularSpecScan::setRelativeWavelengthResolution(const RangedDistribution &distr, double rel_dev)
-";
-
-%feature("docstring")  AngularSpecScan::setRelativeWavelengthResolution "void AngularSpecScan::setRelativeWavelengthResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)
-
-Sets wavelength resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
-";
-
-%feature("docstring")  AngularSpecScan::setAbsoluteWavelengthResolution "void AngularSpecScan::setAbsoluteWavelengthResolution(const RangedDistribution &distr, double std_dev)
-";
-
-%feature("docstring")  AngularSpecScan::setAbsoluteWavelengthResolution "void AngularSpecScan::setAbsoluteWavelengthResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)
-
-Sets wavelength resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
-";
-
-%feature("docstring")  AngularSpecScan::setAngleResolution "void AngularSpecScan::setAngleResolution(const ScanResolution &resolution)
-
-Sets angle resolution values via  ScanResolution object. 
-";
-
-%feature("docstring")  AngularSpecScan::setRelativeAngularResolution "void AngularSpecScan::setRelativeAngularResolution(const RangedDistribution &distr, double rel_dev)
-";
-
-%feature("docstring")  AngularSpecScan::setRelativeAngularResolution "void AngularSpecScan::setRelativeAngularResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)
-
-Sets angular resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
-";
-
-%feature("docstring")  AngularSpecScan::setAbsoluteAngularResolution "void AngularSpecScan::setAbsoluteAngularResolution(const RangedDistribution &distr, double std_dev)
-";
-
-%feature("docstring")  AngularSpecScan::setAbsoluteAngularResolution "void AngularSpecScan::setAbsoluteAngularResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)
-
-Sets angular resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
-";
-
-
 // File: classAxes.xml
 %feature("docstring") Axes "
 
@@ -1821,53 +1704,6 @@ Returns true if area defined by two bins is inside or on border of polygon (more
 ";
 
 
-// File: classISpecularScan.xml
-%feature("docstring") ISpecularScan "
-
-Pure virtual base class for all types of specular scans.
-
-C++ includes: ISpecularScan.h
-";
-
-%feature("docstring")  ISpecularScan::clone "ISpecularScan* ISpecularScan::clone() const override=0
-";
-
-%feature("docstring")  ISpecularScan::generateSimulationElements "virtual std::vector<SpecularSimulationElement> ISpecularScan::generateSimulationElements() const =0
-
-Generates simulation elements for specular simulations. 
-";
-
-%feature("docstring")  ISpecularScan::coordinateAxis "virtual const IAxis* ISpecularScan::coordinateAxis() const =0
-
-Returns coordinate axis assigned to the data holder. 
-";
-
-%feature("docstring")  ISpecularScan::footprintFactor "virtual const IFootprintFactor* ISpecularScan::footprintFactor() const =0
-
-Returns  IFootprintFactor object pointer. 
-";
-
-%feature("docstring")  ISpecularScan::footprint "virtual std::vector<double> ISpecularScan::footprint(size_t i, size_t n_elements) const =0
-
-Returns footprint correction factor for a range of simulation elements of size  n_elements and starting from element with index  i. 
-";
-
-%feature("docstring")  ISpecularScan::numberOfSimulationElements "virtual size_t ISpecularScan::numberOfSimulationElements() const =0
-
-Returns the number of simulation elements. 
-";
-
-%feature("docstring")  ISpecularScan::createIntensities "virtual std::vector<double> ISpecularScan::createIntensities(const std::vector< SpecularSimulationElement > &sim_elements) const =0
-
-Returns intensity vector corresponding to convolution of given simulation elements. 
-";
-
-%feature("docstring")  ISpecularScan::print "virtual std::string ISpecularScan::print() const =0
-
-Print scan definition in python format. 
-";
-
-
 // File: classIUnitConverter.xml
 %feature("docstring") IUnitConverter "
 
@@ -2589,90 +2425,6 @@ The private data for polygons to hide boost dependency from the header.
 ";
 
 
-// File: classQSpecScan.xml
-%feature("docstring") QSpecScan "
-
-Scan type with z-components of scattering vector as coordinate values. Wavelength and incident angles are not accessible separately.
-
-C++ includes: QSpecScan.h
-";
-
-%feature("docstring")  QSpecScan::QSpecScan "QSpecScan::QSpecScan(std::vector< double > qs_nm)
-
-Accepts qz-value vector (in inverse nm) 
-";
-
-%feature("docstring")  QSpecScan::QSpecScan "QSpecScan::QSpecScan(const IAxis &qs_nm)
-";
-
-%feature("docstring")  QSpecScan::QSpecScan "QSpecScan::QSpecScan(int nbins, double qz_min, double qz_max)
-
-Sets q-defined specular scan. Accepts either numpy array of q-values sorted in ascending order or an IAxis object with q-values. Alternatively an axis can be defined in-place, then the first passed parameter is the number of bins, second - minimum on-axis q-value, third - maximum on-axis q_value. 
-";
-
-%feature("docstring")  QSpecScan::~QSpecScan "QSpecScan::~QSpecScan() override
-";
-
-%feature("docstring")  QSpecScan::clone "QSpecScan * QSpecScan::clone() const override
-";
-
-%feature("docstring")  QSpecScan::generateSimulationElements "std::vector< SpecularSimulationElement > QSpecScan::generateSimulationElements() const override
-
-Generates simulation elements for specular simulations. 
-";
-
-%feature("docstring")  QSpecScan::coordinateAxis "virtual const IAxis* QSpecScan::coordinateAxis() const override
-
-Returns coordinate axis assigned to the data holder. 
-";
-
-%feature("docstring")  QSpecScan::footprintFactor "virtual const IFootprintFactor* QSpecScan::footprintFactor() const override
-
-Returns  IFootprintFactor object pointer. 
-";
-
-%feature("docstring")  QSpecScan::footprint "std::vector< double > QSpecScan::footprint(size_t i, size_t n_elements) const override
-
-Returns footprint correction factor for a range of simulation elements of size  n_elements and starting from element with index  i. 
-";
-
-%feature("docstring")  QSpecScan::numberOfSimulationElements "size_t QSpecScan::numberOfSimulationElements() const override
-
-Returns the number of simulation elements. 
-";
-
-%feature("docstring")  QSpecScan::createIntensities "std::vector< double > QSpecScan::createIntensities(const std::vector< SpecularSimulationElement > &sim_elements) const override
-
-Returns intensity vector corresponding to convolution of given simulation elements. 
-";
-
-%feature("docstring")  QSpecScan::print "std::string QSpecScan::print() const override
-
-Print scan definition in python format. 
-";
-
-%feature("docstring")  QSpecScan::setQResolution "void QSpecScan::setQResolution(const ScanResolution &resolution)
-
-Sets q resolution values via  ScanResolution object. 
-";
-
-%feature("docstring")  QSpecScan::setRelativeQResolution "void QSpecScan::setRelativeQResolution(const RangedDistribution &distr, double rel_dev)
-";
-
-%feature("docstring")  QSpecScan::setRelativeQResolution "void QSpecScan::setRelativeQResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)
-
-Sets qz resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the qz-axis. 
-";
-
-%feature("docstring")  QSpecScan::setAbsoluteQResolution "void QSpecScan::setAbsoluteQResolution(const RangedDistribution &distr, double std_dev)
-";
-
-%feature("docstring")  QSpecScan::setAbsoluteQResolution "void QSpecScan::setAbsoluteQResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)
-
-Sets qz resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the qz-axis. 
-";
-
-
 // File: classRectangle.xml
 %feature("docstring") Rectangle "
 
@@ -3301,117 +3053,6 @@ C++ includes: SphericalPixel.h
 ";
 
 
-// File: classUnitConverter1D.xml
-%feature("docstring") UnitConverter1D "
-
-Conversion of axis units for the case of 1D simulation result.
-
-C++ includes: UnitConverter1D.h
-";
-
-%feature("docstring")  UnitConverter1D::~UnitConverter1D "UnitConverter1D::~UnitConverter1D() override=default
-";
-
-%feature("docstring")  UnitConverter1D::clone "UnitConverter1D* UnitConverter1D::clone() const override=0
-";
-
-%feature("docstring")  UnitConverter1D::dimension "size_t UnitConverter1D::dimension() const override
-
-Returns dimensionality of converted canvas. 
-";
-
-%feature("docstring")  UnitConverter1D::calculateMin "double UnitConverter1D::calculateMin(size_t i_axis, Axes::Units units_type) const override
-
-Calculates minimum on-axis value in given units. 
-";
-
-%feature("docstring")  UnitConverter1D::calculateMax "double UnitConverter1D::calculateMax(size_t i_axis, Axes::Units units_type) const override
-
-Calculates maximum on-axis value in given units. 
-";
-
-%feature("docstring")  UnitConverter1D::createConvertedAxis "std::unique_ptr< IAxis > UnitConverter1D::createConvertedAxis(size_t i_axis, Axes::Units units) const override
-
-Creates axis in converted units. 
-";
-
-%feature("docstring")  UnitConverter1D::createConvertedData "std::unique_ptr< OutputData< double > > UnitConverter1D::createConvertedData(const OutputData< double > &data, Axes::Units units) const override
-
-Creates  OutputData array in converter units. 
-";
-
-
-// File: classUnitConverterConvSpec.xml
-%feature("docstring") UnitConverterConvSpec "
-
-Conversion of axis units for the case of conventional (angle-based) reflectometry.
-
-C++ includes: UnitConverter1D.h
-";
-
-%feature("docstring")  UnitConverterConvSpec::UnitConverterConvSpec "UnitConverterConvSpec::UnitConverterConvSpec(const Beam &beam, const IAxis &axis, Axes::Units axis_units=Axes::Units::RADIANS)
-
-Constructs the object for unit conversion. 
-";
-
-%feature("docstring")  UnitConverterConvSpec::UnitConverterConvSpec "UnitConverterConvSpec::UnitConverterConvSpec(const AngularSpecScan &handler)
-";
-
-%feature("docstring")  UnitConverterConvSpec::~UnitConverterConvSpec "UnitConverterConvSpec::~UnitConverterConvSpec() override
-";
-
-%feature("docstring")  UnitConverterConvSpec::clone "UnitConverterConvSpec * UnitConverterConvSpec::clone() const override
-";
-
-%feature("docstring")  UnitConverterConvSpec::axisSize "size_t UnitConverterConvSpec::axisSize(size_t i_axis) const override
-
-Returns the size of underlying axis. 
-";
-
-%feature("docstring")  UnitConverterConvSpec::availableUnits "std::vector< Axes::Units > UnitConverterConvSpec::availableUnits() const override
-
-Returns the list of all available units. 
-";
-
-%feature("docstring")  UnitConverterConvSpec::defaultUnits "Axes::Units UnitConverterConvSpec::defaultUnits() const override
-
-Returns default units to convert to. 
-";
-
-
-// File: classUnitConverterQSpec.xml
-%feature("docstring") UnitConverterQSpec "
-
-Conversion of axis units for the case of q-defined reflectometry.
-
-C++ includes: UnitConverter1D.h
-";
-
-%feature("docstring")  UnitConverterQSpec::UnitConverterQSpec "UnitConverterQSpec::UnitConverterQSpec(const QSpecScan &handler)
-";
-
-%feature("docstring")  UnitConverterQSpec::~UnitConverterQSpec "UnitConverterQSpec::~UnitConverterQSpec() override
-";
-
-%feature("docstring")  UnitConverterQSpec::clone "UnitConverterQSpec * UnitConverterQSpec::clone() const override
-";
-
-%feature("docstring")  UnitConverterQSpec::axisSize "size_t UnitConverterQSpec::axisSize(size_t i_axis) const override
-
-Returns the size of underlying axis. 
-";
-
-%feature("docstring")  UnitConverterQSpec::availableUnits "std::vector< Axes::Units > UnitConverterQSpec::availableUnits() const override
-
-Returns the list of all available units. 
-";
-
-%feature("docstring")  UnitConverterQSpec::defaultUnits "Axes::Units UnitConverterQSpec::defaultUnits() const override
-
-Returns default units to convert to. 
-";
-
-
 // File: classUnitConverterSimple.xml
 %feature("docstring") UnitConverterSimple "
 
@@ -3514,19 +3155,13 @@ Returns true if area defined by two bins is inside or on border of polygon (more
 ";
 
 
-// File: classConvolve_1_1Workspace.xml
-
-
 // File: classFourierTransform_1_1Workspace.xml
 
 
-// File: namespace_0d113.xml
-
-
-// File: namespace_0d115.xml
+// File: classConvolve_1_1Workspace.xml
 
 
-// File: namespace_0d124.xml
+// File: namespace_0d113.xml
 
 
 // File: namespace_0d33.xml
@@ -4123,21 +3758,6 @@ make Swappable
 // File: ScanResolution_8h.xml
 
 
-// File: AngularSpecScan_8cpp.xml
-
-
-// File: AngularSpecScan_8h.xml
-
-
-// File: ISpecularScan_8h.xml
-
-
-// File: QSpecScan_8cpp.xml
-
-
-// File: QSpecScan_8h.xml
-
-
 // File: AxisNames_8cpp.xml
 
 
@@ -4150,12 +3770,6 @@ make Swappable
 // File: IUnitConverter_8h.xml
 
 
-// File: UnitConverter1D_8cpp.xml
-
-
-// File: UnitConverter1D_8h.xml
-
-
 // File: deprecated.xml
 
 
@@ -4189,8 +3803,5 @@ make Swappable
 // File: dir_aa6451b5aab7f40a79bc1a0dc7cac3c6.xml
 
 
-// File: dir_07fe00a841f74c01dc91ea0f813bfe61.xml
-
-
 // File: dir_1129f0bc4b0b28573da786f6a995b6c2.xml
 
diff --git a/auto/Wrap/doxygenSample.i b/auto/Wrap/doxygenSample.i
index f6593cd1e1d..3318ee252af 100644
--- a/auto/Wrap/doxygenSample.i
+++ b/auto/Wrap/doxygenSample.i
@@ -7489,10 +7489,10 @@ Data stucture containing both input and output of a single image pixel for specu
 C++ includes: SpecularSimulationElement.h
 ";
 
-%feature("docstring")  SpecularSimulationElement::SpecularSimulationElement "SpecularSimulationElement::SpecularSimulationElement(double kz)
+%feature("docstring")  SpecularSimulationElement::SpecularSimulationElement "SpecularSimulationElement::SpecularSimulationElement(double kz, bool computable)
 ";
 
-%feature("docstring")  SpecularSimulationElement::SpecularSimulationElement "SpecularSimulationElement::SpecularSimulationElement(double wavelength, double alpha)
+%feature("docstring")  SpecularSimulationElement::SpecularSimulationElement "SpecularSimulationElement::SpecularSimulationElement(double wavelength, double alpha, bool computable)
 ";
 
 %feature("docstring")  SpecularSimulationElement::SpecularSimulationElement "SpecularSimulationElement::SpecularSimulationElement(const SpecularSimulationElement &other)
@@ -7520,12 +7520,9 @@ Returns assigned PolarizationHandler.
 %feature("docstring")  SpecularSimulationElement::setIntensity "void SpecularSimulationElement::setIntensity(double intensity)
 ";
 
-%feature("docstring")  SpecularSimulationElement::setCalculationFlag "void SpecularSimulationElement::setCalculationFlag(bool calculation_flag)
-
-Set calculation flag (if it's false, zero intensity is assigned to the element) 
-";
-
 %feature("docstring")  SpecularSimulationElement::isCalculated "bool SpecularSimulationElement::isCalculated() const
+
+Returns calculation flag (if it's false, zero intensity is assigned to the element) 
 ";
 
 %feature("docstring")  SpecularSimulationElement::produceKz "std::vector< complex_t > SpecularSimulationElement::produceKz(const std::vector< Slice > &slices)
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index c41db1ffaf0..a51214000b7 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -3401,6 +3401,186 @@ class PyObserverCallback(object):
 # Register PyObserverCallback in _libBornAgainCore:
 _libBornAgainCore.PyObserverCallback_swigregister(PyObserverCallback)
 
+class AngularSpecScan(object):
+    r"""
+
+
+    Scan type with inclination angles as coordinate values and a unique wavelength. Features footprint correction.
+
+    C++ includes: AngularSpecScan.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__(AngularSpecScan self, double wl, vdouble1d_t inc_angle) -> AngularSpecScan
+        __init__(AngularSpecScan self, double wl, IAxis inc_angle) -> AngularSpecScan
+        __init__(AngularSpecScan self, double wl, int nbins, double alpha_i_min, double alpha_i_max) -> AngularSpecScan
+        AngularSpecScan::AngularSpecScan(double wl, int nbins, double alpha_i_min, double alpha_i_max)
+
+        Sets angle-defined specular scan. The first parameter is always a wavelength in nm. Second parameter is either a numpy array of incident angles in radians or an IAxis object with angle values. Alternatively an axis can be defined in-place, then the second passed parameter is the number of bins, third - minimum on-axis angle value, fourth - maximum on-axis angle value. 
+
+        """
+        _libBornAgainCore.AngularSpecScan_swiginit(self, _libBornAgainCore.new_AngularSpecScan(*args))
+    __swig_destroy__ = _libBornAgainCore.delete_AngularSpecScan
+
+    def clone(self):
+        r"""
+        clone(AngularSpecScan self) -> AngularSpecScan
+        AngularSpecScan * AngularSpecScan::clone() const override
+
+        """
+        return _libBornAgainCore.AngularSpecScan_clone(self)
+
+    def setFootprintFactor(self, f_factor):
+        r"""
+        setFootprintFactor(AngularSpecScan self, IFootprintFactor const * f_factor)
+        void AngularSpecScan::setFootprintFactor(const IFootprintFactor *f_factor)
+
+        Sets footprint correction factor. 
+
+        """
+        return _libBornAgainCore.AngularSpecScan_setFootprintFactor(self, f_factor)
+
+    def setWavelengthResolution(self, resolution):
+        r"""
+        setWavelengthResolution(AngularSpecScan self, ScanResolution const & resolution)
+        void AngularSpecScan::setWavelengthResolution(const ScanResolution &resolution)
+
+        Sets wavelength resolution values via ScanResolution object. 
+
+        """
+        return _libBornAgainCore.AngularSpecScan_setWavelengthResolution(self, resolution)
+
+    def setRelativeWavelengthResolution(self, *args):
+        r"""
+        setRelativeWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, double rel_dev)
+        setRelativeWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t rel_dev)
+        void AngularSpecScan::setRelativeWavelengthResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)
+
+        Sets wavelength resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
+
+        """
+        return _libBornAgainCore.AngularSpecScan_setRelativeWavelengthResolution(self, *args)
+
+    def setAbsoluteWavelengthResolution(self, *args):
+        r"""
+        setAbsoluteWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, double std_dev)
+        setAbsoluteWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t std_dev)
+        void AngularSpecScan::setAbsoluteWavelengthResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)
+
+        Sets wavelength resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
+
+        """
+        return _libBornAgainCore.AngularSpecScan_setAbsoluteWavelengthResolution(self, *args)
+
+    def setAngleResolution(self, resolution):
+        r"""
+        setAngleResolution(AngularSpecScan self, ScanResolution const & resolution)
+        void AngularSpecScan::setAngleResolution(const ScanResolution &resolution)
+
+        Sets angle resolution values via ScanResolution object. 
+
+        """
+        return _libBornAgainCore.AngularSpecScan_setAngleResolution(self, resolution)
+
+    def setRelativeAngularResolution(self, *args):
+        r"""
+        setRelativeAngularResolution(AngularSpecScan self, RangedDistribution const & distr, double rel_dev)
+        setRelativeAngularResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t rel_dev)
+        void AngularSpecScan::setRelativeAngularResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)
+
+        Sets angular resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
+
+        """
+        return _libBornAgainCore.AngularSpecScan_setRelativeAngularResolution(self, *args)
+
+    def setAbsoluteAngularResolution(self, *args):
+        r"""
+        setAbsoluteAngularResolution(AngularSpecScan self, RangedDistribution const & distr, double std_dev)
+        setAbsoluteAngularResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t std_dev)
+        void AngularSpecScan::setAbsoluteAngularResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)
+
+        Sets angular resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
+
+        """
+        return _libBornAgainCore.AngularSpecScan_setAbsoluteAngularResolution(self, *args)
+
+# Register AngularSpecScan in _libBornAgainCore:
+_libBornAgainCore.AngularSpecScan_swigregister(AngularSpecScan)
+
+class QSpecScan(object):
+    r"""
+
+
+    Scan type with z-components of scattering vector as coordinate values. Wavelength and incident angles are not accessible separately.
+
+    C++ includes: QSpecScan.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__(QSpecScan self, vdouble1d_t qs_nm) -> QSpecScan
+        __init__(QSpecScan self, IAxis qs_nm) -> QSpecScan
+        __init__(QSpecScan self, int nbins, double qz_min, double qz_max) -> QSpecScan
+        QSpecScan::QSpecScan(int nbins, double qz_min, double qz_max)
+
+        Sets q-defined specular scan. Accepts either numpy array of q-values sorted in ascending order or an IAxis object with q-values. Alternatively an axis can be defined in-place, then the first passed parameter is the number of bins, second - minimum on-axis q-value, third - maximum on-axis q_value. 
+
+        """
+        _libBornAgainCore.QSpecScan_swiginit(self, _libBornAgainCore.new_QSpecScan(*args))
+    __swig_destroy__ = _libBornAgainCore.delete_QSpecScan
+
+    def clone(self):
+        r"""
+        clone(QSpecScan self) -> QSpecScan
+        QSpecScan * QSpecScan::clone() const override
+
+        """
+        return _libBornAgainCore.QSpecScan_clone(self)
+
+    def setQResolution(self, resolution):
+        r"""
+        setQResolution(QSpecScan self, ScanResolution const & resolution)
+        void QSpecScan::setQResolution(const ScanResolution &resolution)
+
+        Sets q resolution values via ScanResolution object. 
+
+        """
+        return _libBornAgainCore.QSpecScan_setQResolution(self, resolution)
+
+    def setRelativeQResolution(self, *args):
+        r"""
+        setRelativeQResolution(QSpecScan self, RangedDistribution const & distr, double rel_dev)
+        setRelativeQResolution(QSpecScan self, RangedDistribution const & distr, vdouble1d_t rel_dev)
+        void QSpecScan::setRelativeQResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)
+
+        Sets qz resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the qz-axis. 
+
+        """
+        return _libBornAgainCore.QSpecScan_setRelativeQResolution(self, *args)
+
+    def setAbsoluteQResolution(self, *args):
+        r"""
+        setAbsoluteQResolution(QSpecScan self, RangedDistribution const & distr, double std_dev)
+        setAbsoluteQResolution(QSpecScan self, RangedDistribution const & distr, vdouble1d_t std_dev)
+        void QSpecScan::setAbsoluteQResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)
+
+        Sets qz resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the qz-axis. 
+
+        """
+        return _libBornAgainCore.QSpecScan_setAbsoluteQResolution(self, *args)
+
+# Register QSpecScan in _libBornAgainCore:
+_libBornAgainCore.QSpecScan_swigregister(QSpecScan)
+
 class Simulation(libBornAgainBase.ICloneable, libBornAgainParam.INode):
     r"""
 
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index 96958905c38..c474f1ac296 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -3097,114 +3097,118 @@ namespace Swig {
 
 /* -------- TYPES TABLE (BEGIN) -------- */
 
-#define SWIGTYPE_p_AxisInfo swig_types[0]
-#define SWIGTYPE_p_BasicVector3DT_double_t swig_types[1]
-#define SWIGTYPE_p_BasicVector3DT_int_t swig_types[2]
-#define SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t swig_types[3]
-#define SWIGTYPE_p_CallbackMap_t swig_types[4]
-#define SWIGTYPE_p_ConstantBackground swig_types[5]
-#define SWIGTYPE_p_CreateItemCallback swig_types[6]
-#define SWIGTYPE_p_DepthProbeSimulation swig_types[7]
-#define SWIGTYPE_p_DistributionHandler swig_types[8]
-#define SWIGTYPE_p_FitObjective swig_types[9]
-#define SWIGTYPE_p_FitOptions swig_types[10]
-#define SWIGTYPE_p_Fit__MinimizerResult swig_types[11]
-#define SWIGTYPE_p_Fit__Parameters swig_types[12]
-#define SWIGTYPE_p_GISASSimulation swig_types[13]
-#define SWIGTYPE_p_IAxis swig_types[14]
-#define SWIGTYPE_p_IBackground swig_types[15]
-#define SWIGTYPE_p_IChiSquaredModule swig_types[16]
-#define SWIGTYPE_p_ICloneable swig_types[17]
-#define SWIGTYPE_p_IDetector2D swig_types[18]
-#define SWIGTYPE_p_IDistribution1D swig_types[19]
-#define SWIGTYPE_p_IFactoryT_std__string_Simulation_t swig_types[20]
-#define SWIGTYPE_p_IFootprintFactor swig_types[21]
-#define SWIGTYPE_p_IFormFactor swig_types[22]
-#define SWIGTYPE_p_IFormFactorBorn swig_types[23]
-#define SWIGTYPE_p_INode swig_types[24]
-#define SWIGTYPE_p_INodeVisitor swig_types[25]
-#define SWIGTYPE_p_IObservable swig_types[26]
-#define SWIGTYPE_p_IObserver swig_types[27]
-#define SWIGTYPE_p_IParameterized swig_types[28]
-#define SWIGTYPE_p_IResolutionFunction2D swig_types[29]
-#define SWIGTYPE_p_ISample swig_types[30]
-#define SWIGTYPE_p_IShape2D swig_types[31]
-#define SWIGTYPE_p_ISpecularScan swig_types[32]
-#define SWIGTYPE_p_Instrument swig_types[33]
-#define SWIGTYPE_p_IterationInfo swig_types[34]
-#define SWIGTYPE_p_MultiLayer swig_types[35]
-#define SWIGTYPE_p_OffSpecSimulation swig_types[36]
-#define SWIGTYPE_p_OutputDataT_double_t swig_types[37]
-#define SWIGTYPE_p_ParameterDistribution swig_types[38]
-#define SWIGTYPE_p_ParameterPool swig_types[39]
-#define SWIGTYPE_p_PoissonNoiseBackground swig_types[40]
-#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[41]
-#define SWIGTYPE_p_PyBuilderCallback swig_types[42]
-#define SWIGTYPE_p_PyObserverCallback swig_types[43]
-#define SWIGTYPE_p_RealLimits swig_types[44]
-#define SWIGTYPE_p_Simulation swig_types[45]
-#define SWIGTYPE_p_Simulation2D swig_types[46]
-#define SWIGTYPE_p_SimulationFactory swig_types[47]
-#define SWIGTYPE_p_SimulationOptions swig_types[48]
-#define SWIGTYPE_p_SimulationResult swig_types[49]
-#define SWIGTYPE_p_SpecularSimulation swig_types[50]
-#define SWIGTYPE_p_allocator_type swig_types[51]
-#define SWIGTYPE_p_char swig_types[52]
-#define SWIGTYPE_p_difference_type swig_types[53]
-#define SWIGTYPE_p_first_type swig_types[54]
-#define SWIGTYPE_p_int swig_types[55]
-#define SWIGTYPE_p_key_type swig_types[56]
-#define SWIGTYPE_p_long_long swig_types[57]
-#define SWIGTYPE_p_mapped_type swig_types[58]
-#define SWIGTYPE_p_observer_t swig_types[59]
-#define SWIGTYPE_p_p_PyObject swig_types[60]
-#define SWIGTYPE_p_second_type swig_types[61]
-#define SWIGTYPE_p_short swig_types[62]
-#define SWIGTYPE_p_signed_char swig_types[63]
-#define SWIGTYPE_p_size_type swig_types[64]
-#define SWIGTYPE_p_std__allocatorT_AxisInfo_t swig_types[65]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[66]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[67]
-#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[68]
-#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[69]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[70]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[71]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[72]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[73]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[74]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[75]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[76]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[77]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[78]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[79]
-#define SWIGTYPE_p_std__functionT_Simulation_pfF_t swig_types[80]
-#define SWIGTYPE_p_std__invalid_argument swig_types[81]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[82]
-#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[83]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[84]
-#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[85]
-#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[86]
-#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[87]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[88]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[89]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[90]
-#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[91]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[92]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[93]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[94]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[95]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[96]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[97]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[98]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[99]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[100]
-#define SWIGTYPE_p_unsigned_char swig_types[101]
-#define SWIGTYPE_p_unsigned_int swig_types[102]
-#define SWIGTYPE_p_unsigned_long_long swig_types[103]
-#define SWIGTYPE_p_unsigned_short swig_types[104]
-#define SWIGTYPE_p_value_type swig_types[105]
-static swig_type_info *swig_types[107];
-static swig_module_info swig_module = {swig_types, 106, 0, 0, 0, 0};
+#define SWIGTYPE_p_AngularSpecScan swig_types[0]
+#define SWIGTYPE_p_AxisInfo swig_types[1]
+#define SWIGTYPE_p_BasicVector3DT_double_t swig_types[2]
+#define SWIGTYPE_p_BasicVector3DT_int_t swig_types[3]
+#define SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t swig_types[4]
+#define SWIGTYPE_p_CallbackMap_t swig_types[5]
+#define SWIGTYPE_p_ConstantBackground swig_types[6]
+#define SWIGTYPE_p_CreateItemCallback swig_types[7]
+#define SWIGTYPE_p_DepthProbeSimulation swig_types[8]
+#define SWIGTYPE_p_DistributionHandler swig_types[9]
+#define SWIGTYPE_p_FitObjective swig_types[10]
+#define SWIGTYPE_p_FitOptions swig_types[11]
+#define SWIGTYPE_p_Fit__MinimizerResult swig_types[12]
+#define SWIGTYPE_p_Fit__Parameters swig_types[13]
+#define SWIGTYPE_p_GISASSimulation swig_types[14]
+#define SWIGTYPE_p_IAxis swig_types[15]
+#define SWIGTYPE_p_IBackground swig_types[16]
+#define SWIGTYPE_p_IChiSquaredModule swig_types[17]
+#define SWIGTYPE_p_ICloneable swig_types[18]
+#define SWIGTYPE_p_IDetector2D swig_types[19]
+#define SWIGTYPE_p_IDistribution1D swig_types[20]
+#define SWIGTYPE_p_IFactoryT_std__string_Simulation_t swig_types[21]
+#define SWIGTYPE_p_IFootprintFactor swig_types[22]
+#define SWIGTYPE_p_IFormFactor swig_types[23]
+#define SWIGTYPE_p_IFormFactorBorn swig_types[24]
+#define SWIGTYPE_p_INode swig_types[25]
+#define SWIGTYPE_p_INodeVisitor swig_types[26]
+#define SWIGTYPE_p_IObservable swig_types[27]
+#define SWIGTYPE_p_IObserver swig_types[28]
+#define SWIGTYPE_p_IParameterized swig_types[29]
+#define SWIGTYPE_p_IResolutionFunction2D swig_types[30]
+#define SWIGTYPE_p_ISample swig_types[31]
+#define SWIGTYPE_p_IShape2D swig_types[32]
+#define SWIGTYPE_p_ISpecularScan swig_types[33]
+#define SWIGTYPE_p_Instrument swig_types[34]
+#define SWIGTYPE_p_IterationInfo swig_types[35]
+#define SWIGTYPE_p_MultiLayer swig_types[36]
+#define SWIGTYPE_p_OffSpecSimulation swig_types[37]
+#define SWIGTYPE_p_OutputDataT_double_t swig_types[38]
+#define SWIGTYPE_p_ParameterDistribution swig_types[39]
+#define SWIGTYPE_p_ParameterPool swig_types[40]
+#define SWIGTYPE_p_PoissonNoiseBackground swig_types[41]
+#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[42]
+#define SWIGTYPE_p_PyBuilderCallback swig_types[43]
+#define SWIGTYPE_p_PyObserverCallback swig_types[44]
+#define SWIGTYPE_p_QSpecScan swig_types[45]
+#define SWIGTYPE_p_RangedDistribution swig_types[46]
+#define SWIGTYPE_p_RealLimits swig_types[47]
+#define SWIGTYPE_p_ScanResolution swig_types[48]
+#define SWIGTYPE_p_Simulation swig_types[49]
+#define SWIGTYPE_p_Simulation2D swig_types[50]
+#define SWIGTYPE_p_SimulationFactory swig_types[51]
+#define SWIGTYPE_p_SimulationOptions swig_types[52]
+#define SWIGTYPE_p_SimulationResult swig_types[53]
+#define SWIGTYPE_p_SpecularSimulation swig_types[54]
+#define SWIGTYPE_p_allocator_type swig_types[55]
+#define SWIGTYPE_p_char swig_types[56]
+#define SWIGTYPE_p_difference_type swig_types[57]
+#define SWIGTYPE_p_first_type swig_types[58]
+#define SWIGTYPE_p_int swig_types[59]
+#define SWIGTYPE_p_key_type swig_types[60]
+#define SWIGTYPE_p_long_long swig_types[61]
+#define SWIGTYPE_p_mapped_type swig_types[62]
+#define SWIGTYPE_p_observer_t swig_types[63]
+#define SWIGTYPE_p_p_PyObject swig_types[64]
+#define SWIGTYPE_p_second_type swig_types[65]
+#define SWIGTYPE_p_short swig_types[66]
+#define SWIGTYPE_p_signed_char swig_types[67]
+#define SWIGTYPE_p_size_type swig_types[68]
+#define SWIGTYPE_p_std__allocatorT_AxisInfo_t swig_types[69]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[70]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[71]
+#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[72]
+#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[73]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[74]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[75]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[76]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[77]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[78]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[79]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[80]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[81]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[82]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[83]
+#define SWIGTYPE_p_std__functionT_Simulation_pfF_t swig_types[84]
+#define SWIGTYPE_p_std__invalid_argument swig_types[85]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[86]
+#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[87]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[88]
+#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[89]
+#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[90]
+#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[91]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[92]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[93]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[94]
+#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[95]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[96]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[97]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[98]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[99]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[100]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[101]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[102]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[103]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[104]
+#define SWIGTYPE_p_unsigned_char swig_types[105]
+#define SWIGTYPE_p_unsigned_int swig_types[106]
+#define SWIGTYPE_p_unsigned_long_long swig_types[107]
+#define SWIGTYPE_p_unsigned_short swig_types[108]
+#define SWIGTYPE_p_value_type swig_types[109]
+static swig_type_info *swig_types[111];
+static swig_module_info swig_module = {swig_types, 110, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -6698,6 +6702,8 @@ SWIGINTERN std::vector< std::pair< double,double > >::iterator std_vector_Sl_std
 SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_1(std::vector< std::pair< double,double > > *self,std::vector< std::pair< double,double > >::iterator pos,std::vector< std::pair< double,double > >::size_type n,std::vector< std::pair< double,double > >::value_type const &x){ self->insert(pos, n, x); }
 
 #include "BAVersion.h"
+#include "Core/Scan/AngularSpecScan.h"
+#include "Core/Scan/QSpecScan.h"
 #include "Core/Computation/ConstantBackground.h"
 #include "Core/Computation/IBackground.h"
 #include "Core/Computation/MultiLayerFuncs.h"
@@ -37789,6 +37795,1401 @@ SWIGINTERN PyObject *PyObserverCallback_swiginit(PyObject *SWIGUNUSEDPARM(self),
   return SWIG_Python_InitShadowInstance(args);
 }
 
+SWIGINTERN PyObject *_wrap_new_AngularSpecScan__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  std::vector< double,std::allocator< double > > arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  AngularSpecScan *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_AngularSpecScan" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_AngularSpecScan" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > >""'"); 
+    }
+    arg2 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (AngularSpecScan *)new AngularSpecScan(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AngularSpecScan, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_AngularSpecScan__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  IAxis *arg2 = 0 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  AngularSpecScan *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_AngularSpecScan" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_AngularSpecScan" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AngularSpecScan" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAxis * >(argp2);
+  result = (AngularSpecScan *)new AngularSpecScan(arg1,(IAxis const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AngularSpecScan, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_AngularSpecScan__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  int arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  AngularSpecScan *result = 0 ;
+  
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_AngularSpecScan" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_AngularSpecScan" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_AngularSpecScan" "', 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 '" "new_AngularSpecScan" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (AngularSpecScan *)new AngularSpecScan(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AngularSpecScan, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_AngularSpecScan(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_AngularSpecScan", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAxis, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_AngularSpecScan__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_AngularSpecScan__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(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_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_AngularSpecScan__SWIG_2(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_AngularSpecScan'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    AngularSpecScan::AngularSpecScan(double,std::vector< double,std::allocator< double > >)\n"
+    "    AngularSpecScan::AngularSpecScan(double,IAxis const &)\n"
+    "    AngularSpecScan::AngularSpecScan(double,int,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_AngularSpecScan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 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_AngularSpecScan, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AngularSpecScan" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  AngularSpecScan *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_clone" "', argument " "1"" of type '" "AngularSpecScan const *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  result = (AngularSpecScan *)((AngularSpecScan const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setFootprintFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
+  IFootprintFactor *arg2 = (IFootprintFactor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "AngularSpecScan_setFootprintFactor", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setFootprintFactor" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_IFootprintFactor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setFootprintFactor" "', argument " "2"" of type '" "IFootprintFactor const *""'"); 
+  }
+  arg2 = reinterpret_cast< IFootprintFactor * >(argp2);
+  (arg1)->setFootprintFactor((IFootprintFactor const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setWavelengthResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
+  ScanResolution *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "AngularSpecScan_setWavelengthResolution", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setWavelengthResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_ScanResolution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setWavelengthResolution" "', argument " "2"" of type '" "ScanResolution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setWavelengthResolution" "', argument " "2"" of type '" "ScanResolution const &""'"); 
+  }
+  arg2 = reinterpret_cast< ScanResolution * >(argp2);
+  (arg1)->setWavelengthResolution((ScanResolution const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setRelativeWavelengthResolution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
+  RangedDistribution *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setRelativeWavelengthResolution((RangedDistribution const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setRelativeWavelengthResolution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
+  RangedDistribution *arg2 = 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->setRelativeWavelengthResolution((RangedDistribution const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setRelativeWavelengthResolution(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "AngularSpecScan_setRelativeWavelengthResolution", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_AngularSpecScan_setRelativeWavelengthResolution__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_AngularSpecScan_setRelativeWavelengthResolution__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'AngularSpecScan_setRelativeWavelengthResolution'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    AngularSpecScan::setRelativeWavelengthResolution(RangedDistribution const &,double)\n"
+    "    AngularSpecScan::setRelativeWavelengthResolution(RangedDistribution const &,std::vector< double,std::allocator< double > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setAbsoluteWavelengthResolution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
+  RangedDistribution *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setAbsoluteWavelengthResolution((RangedDistribution const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setAbsoluteWavelengthResolution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
+  RangedDistribution *arg2 = 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->setAbsoluteWavelengthResolution((RangedDistribution const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setAbsoluteWavelengthResolution(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "AngularSpecScan_setAbsoluteWavelengthResolution", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_AngularSpecScan_setAbsoluteWavelengthResolution__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_AngularSpecScan_setAbsoluteWavelengthResolution__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'AngularSpecScan_setAbsoluteWavelengthResolution'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    AngularSpecScan::setAbsoluteWavelengthResolution(RangedDistribution const &,double)\n"
+    "    AngularSpecScan::setAbsoluteWavelengthResolution(RangedDistribution const &,std::vector< double,std::allocator< double > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setAngleResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
+  ScanResolution *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "AngularSpecScan_setAngleResolution", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setAngleResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_ScanResolution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setAngleResolution" "', argument " "2"" of type '" "ScanResolution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAngleResolution" "', argument " "2"" of type '" "ScanResolution const &""'"); 
+  }
+  arg2 = reinterpret_cast< ScanResolution * >(argp2);
+  (arg1)->setAngleResolution((ScanResolution const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setRelativeAngularResolution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
+  RangedDistribution *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setRelativeAngularResolution((RangedDistribution const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setRelativeAngularResolution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
+  RangedDistribution *arg2 = 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->setRelativeAngularResolution((RangedDistribution const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setRelativeAngularResolution(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "AngularSpecScan_setRelativeAngularResolution", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_AngularSpecScan_setRelativeAngularResolution__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_AngularSpecScan_setRelativeAngularResolution__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'AngularSpecScan_setRelativeAngularResolution'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    AngularSpecScan::setRelativeAngularResolution(RangedDistribution const &,double)\n"
+    "    AngularSpecScan::setRelativeAngularResolution(RangedDistribution const &,std::vector< double,std::allocator< double > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setAbsoluteAngularResolution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
+  RangedDistribution *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setAbsoluteAngularResolution((RangedDistribution const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setAbsoluteAngularResolution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
+  RangedDistribution *arg2 = 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->setAbsoluteAngularResolution((RangedDistribution const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularSpecScan_setAbsoluteAngularResolution(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "AngularSpecScan_setAbsoluteAngularResolution", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_AngularSpecScan_setAbsoluteAngularResolution__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_AngularSpecScan_setAbsoluteAngularResolution__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'AngularSpecScan_setAbsoluteAngularResolution'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    AngularSpecScan::setAbsoluteAngularResolution(RangedDistribution const &,double)\n"
+    "    AngularSpecScan::setAbsoluteAngularResolution(RangedDistribution const &,std::vector< double,std::allocator< double > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *AngularSpecScan_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_AngularSpecScan, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *AngularSpecScan_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_QSpecScan__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  QSpecScan *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_QSpecScan" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > >""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (QSpecScan *)new QSpecScan(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_QSpecScan, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_QSpecScan__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  QSpecScan *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_QSpecScan" "', argument " "1"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_QSpecScan" "', argument " "1"" of type '" "IAxis const &""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  result = (QSpecScan *)new QSpecScan((IAxis const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_QSpecScan, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_QSpecScan__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  int arg1 ;
+  double arg2 ;
+  double arg3 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  QSpecScan *result = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_QSpecScan" "', argument " "1"" of type '" "int""'");
+  } 
+  arg1 = static_cast< int >(val1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_QSpecScan" "', 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_QSpecScan" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (QSpecScan *)new QSpecScan(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_QSpecScan, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_QSpecScan(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_QSpecScan", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IAxis, SWIG_POINTER_NO_NULL | 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_QSpecScan__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_QSpecScan__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(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) {
+          return _wrap_new_QSpecScan__SWIG_2(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_QSpecScan'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    QSpecScan::QSpecScan(std::vector< double,std::allocator< double > >)\n"
+    "    QSpecScan::QSpecScan(IAxis const &)\n"
+    "    QSpecScan::QSpecScan(int,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_QSpecScan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  QSpecScan *arg1 = (QSpecScan *) 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_QSpecScan, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_QSpecScan" "', argument " "1"" of type '" "QSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< QSpecScan * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_QSpecScan_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  QSpecScan *arg1 = (QSpecScan *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  QSpecScan *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QSpecScan_clone" "', argument " "1"" of type '" "QSpecScan const *""'"); 
+  }
+  arg1 = reinterpret_cast< QSpecScan * >(argp1);
+  result = (QSpecScan *)((QSpecScan const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_QSpecScan, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_QSpecScan_setQResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  QSpecScan *arg1 = (QSpecScan *) 0 ;
+  ScanResolution *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "QSpecScan_setQResolution", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QSpecScan_setQResolution" "', argument " "1"" of type '" "QSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< QSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_ScanResolution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "QSpecScan_setQResolution" "', argument " "2"" of type '" "ScanResolution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setQResolution" "', argument " "2"" of type '" "ScanResolution const &""'"); 
+  }
+  arg2 = reinterpret_cast< ScanResolution * >(argp2);
+  (arg1)->setQResolution((ScanResolution const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_QSpecScan_setRelativeQResolution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  QSpecScan *arg1 = (QSpecScan *) 0 ;
+  RangedDistribution *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QSpecScan_setRelativeQResolution" "', argument " "1"" of type '" "QSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< QSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "QSpecScan_setRelativeQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setRelativeQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "QSpecScan_setRelativeQResolution" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setRelativeQResolution((RangedDistribution const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_QSpecScan_setRelativeQResolution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  QSpecScan *arg1 = (QSpecScan *) 0 ;
+  RangedDistribution *arg2 = 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QSpecScan_setRelativeQResolution" "', argument " "1"" of type '" "QSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< QSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "QSpecScan_setRelativeQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setRelativeQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "QSpecScan_setRelativeQResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setRelativeQResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->setRelativeQResolution((RangedDistribution const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_QSpecScan_setRelativeQResolution(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "QSpecScan_setRelativeQResolution", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_QSpecScan, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_QSpecScan_setRelativeQResolution__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_QSpecScan, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_QSpecScan_setRelativeQResolution__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'QSpecScan_setRelativeQResolution'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    QSpecScan::setRelativeQResolution(RangedDistribution const &,double)\n"
+    "    QSpecScan::setRelativeQResolution(RangedDistribution const &,std::vector< double,std::allocator< double > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_QSpecScan_setAbsoluteQResolution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  QSpecScan *arg1 = (QSpecScan *) 0 ;
+  RangedDistribution *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "1"" of type '" "QSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< QSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setAbsoluteQResolution((RangedDistribution const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_QSpecScan_setAbsoluteQResolution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  QSpecScan *arg1 = (QSpecScan *) 0 ;
+  RangedDistribution *arg2 = 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QSpecScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "1"" of type '" "QSpecScan *""'"); 
+  }
+  arg1 = reinterpret_cast< QSpecScan * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->setAbsoluteQResolution((RangedDistribution const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_QSpecScan_setAbsoluteQResolution(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "QSpecScan_setAbsoluteQResolution", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_QSpecScan, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_QSpecScan_setAbsoluteQResolution__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_QSpecScan, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_QSpecScan_setAbsoluteQResolution__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'QSpecScan_setAbsoluteQResolution'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    QSpecScan::setAbsoluteQResolution(RangedDistribution const &,double)\n"
+    "    QSpecScan::setAbsoluteQResolution(RangedDistribution const &,std::vector< double,std::allocator< double > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *QSpecScan_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_QSpecScan, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *QSpecScan_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
 SWIGINTERN PyObject *_wrap_delete_Simulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Simulation *arg1 = (Simulation *) 0 ;
@@ -42442,6 +43843,124 @@ static PyMethodDef SwigMethods[] = {
 	 { "disown_PyObserverCallback", _wrap_disown_PyObserverCallback, METH_O, NULL},
 	 { "PyObserverCallback_swigregister", PyObserverCallback_swigregister, METH_O, NULL},
 	 { "PyObserverCallback_swiginit", PyObserverCallback_swiginit, METH_VARARGS, NULL},
+	 { "new_AngularSpecScan", _wrap_new_AngularSpecScan, METH_VARARGS, "\n"
+		"AngularSpecScan(double wl, vdouble1d_t inc_angle)\n"
+		"AngularSpecScan(double wl, IAxis inc_angle)\n"
+		"new_AngularSpecScan(double wl, int nbins, double alpha_i_min, double alpha_i_max) -> AngularSpecScan\n"
+		"AngularSpecScan::AngularSpecScan(double wl, int nbins, double alpha_i_min, double alpha_i_max)\n"
+		"\n"
+		"Sets angle-defined specular scan. The first parameter is always a wavelength in nm. Second parameter is either a numpy array of incident angles in radians or an IAxis object with angle values. Alternatively an axis can be defined in-place, then the second passed parameter is the number of bins, third - minimum on-axis angle value, fourth - maximum on-axis angle value. \n"
+		"\n"
+		""},
+	 { "delete_AngularSpecScan", _wrap_delete_AngularSpecScan, METH_O, "\n"
+		"delete_AngularSpecScan(AngularSpecScan self)\n"
+		"AngularSpecScan::~AngularSpecScan() override\n"
+		"\n"
+		""},
+	 { "AngularSpecScan_clone", _wrap_AngularSpecScan_clone, METH_O, "\n"
+		"AngularSpecScan_clone(AngularSpecScan self) -> AngularSpecScan\n"
+		"AngularSpecScan * AngularSpecScan::clone() const override\n"
+		"\n"
+		""},
+	 { "AngularSpecScan_setFootprintFactor", _wrap_AngularSpecScan_setFootprintFactor, METH_VARARGS, "\n"
+		"AngularSpecScan_setFootprintFactor(AngularSpecScan self, IFootprintFactor const * f_factor)\n"
+		"void AngularSpecScan::setFootprintFactor(const IFootprintFactor *f_factor)\n"
+		"\n"
+		"Sets footprint correction factor. \n"
+		"\n"
+		""},
+	 { "AngularSpecScan_setWavelengthResolution", _wrap_AngularSpecScan_setWavelengthResolution, METH_VARARGS, "\n"
+		"AngularSpecScan_setWavelengthResolution(AngularSpecScan self, ScanResolution const & resolution)\n"
+		"void AngularSpecScan::setWavelengthResolution(const ScanResolution &resolution)\n"
+		"\n"
+		"Sets wavelength resolution values via ScanResolution object. \n"
+		"\n"
+		""},
+	 { "AngularSpecScan_setRelativeWavelengthResolution", _wrap_AngularSpecScan_setRelativeWavelengthResolution, METH_VARARGS, "\n"
+		"AngularSpecScan_setRelativeWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, double rel_dev)\n"
+		"AngularSpecScan_setRelativeWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t rel_dev)\n"
+		"void AngularSpecScan::setRelativeWavelengthResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)\n"
+		"\n"
+		"Sets wavelength resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. \n"
+		"\n"
+		""},
+	 { "AngularSpecScan_setAbsoluteWavelengthResolution", _wrap_AngularSpecScan_setAbsoluteWavelengthResolution, METH_VARARGS, "\n"
+		"AngularSpecScan_setAbsoluteWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, double std_dev)\n"
+		"AngularSpecScan_setAbsoluteWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t std_dev)\n"
+		"void AngularSpecScan::setAbsoluteWavelengthResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)\n"
+		"\n"
+		"Sets wavelength resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. \n"
+		"\n"
+		""},
+	 { "AngularSpecScan_setAngleResolution", _wrap_AngularSpecScan_setAngleResolution, METH_VARARGS, "\n"
+		"AngularSpecScan_setAngleResolution(AngularSpecScan self, ScanResolution const & resolution)\n"
+		"void AngularSpecScan::setAngleResolution(const ScanResolution &resolution)\n"
+		"\n"
+		"Sets angle resolution values via ScanResolution object. \n"
+		"\n"
+		""},
+	 { "AngularSpecScan_setRelativeAngularResolution", _wrap_AngularSpecScan_setRelativeAngularResolution, METH_VARARGS, "\n"
+		"AngularSpecScan_setRelativeAngularResolution(AngularSpecScan self, RangedDistribution const & distr, double rel_dev)\n"
+		"AngularSpecScan_setRelativeAngularResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t rel_dev)\n"
+		"void AngularSpecScan::setRelativeAngularResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)\n"
+		"\n"
+		"Sets angular resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. \n"
+		"\n"
+		""},
+	 { "AngularSpecScan_setAbsoluteAngularResolution", _wrap_AngularSpecScan_setAbsoluteAngularResolution, METH_VARARGS, "\n"
+		"AngularSpecScan_setAbsoluteAngularResolution(AngularSpecScan self, RangedDistribution const & distr, double std_dev)\n"
+		"AngularSpecScan_setAbsoluteAngularResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t std_dev)\n"
+		"void AngularSpecScan::setAbsoluteAngularResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)\n"
+		"\n"
+		"Sets angular resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. \n"
+		"\n"
+		""},
+	 { "AngularSpecScan_swigregister", AngularSpecScan_swigregister, METH_O, NULL},
+	 { "AngularSpecScan_swiginit", AngularSpecScan_swiginit, METH_VARARGS, NULL},
+	 { "new_QSpecScan", _wrap_new_QSpecScan, METH_VARARGS, "\n"
+		"QSpecScan(vdouble1d_t qs_nm)\n"
+		"QSpecScan(IAxis qs_nm)\n"
+		"new_QSpecScan(int nbins, double qz_min, double qz_max) -> QSpecScan\n"
+		"QSpecScan::QSpecScan(int nbins, double qz_min, double qz_max)\n"
+		"\n"
+		"Sets q-defined specular scan. Accepts either numpy array of q-values sorted in ascending order or an IAxis object with q-values. Alternatively an axis can be defined in-place, then the first passed parameter is the number of bins, second - minimum on-axis q-value, third - maximum on-axis q_value. \n"
+		"\n"
+		""},
+	 { "delete_QSpecScan", _wrap_delete_QSpecScan, METH_O, "\n"
+		"delete_QSpecScan(QSpecScan self)\n"
+		"QSpecScan::~QSpecScan() override\n"
+		"\n"
+		""},
+	 { "QSpecScan_clone", _wrap_QSpecScan_clone, METH_O, "\n"
+		"QSpecScan_clone(QSpecScan self) -> QSpecScan\n"
+		"QSpecScan * QSpecScan::clone() const override\n"
+		"\n"
+		""},
+	 { "QSpecScan_setQResolution", _wrap_QSpecScan_setQResolution, METH_VARARGS, "\n"
+		"QSpecScan_setQResolution(QSpecScan self, ScanResolution const & resolution)\n"
+		"void QSpecScan::setQResolution(const ScanResolution &resolution)\n"
+		"\n"
+		"Sets q resolution values via ScanResolution object. \n"
+		"\n"
+		""},
+	 { "QSpecScan_setRelativeQResolution", _wrap_QSpecScan_setRelativeQResolution, METH_VARARGS, "\n"
+		"QSpecScan_setRelativeQResolution(QSpecScan self, RangedDistribution const & distr, double rel_dev)\n"
+		"QSpecScan_setRelativeQResolution(QSpecScan self, RangedDistribution const & distr, vdouble1d_t rel_dev)\n"
+		"void QSpecScan::setRelativeQResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)\n"
+		"\n"
+		"Sets qz resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the qz-axis. \n"
+		"\n"
+		""},
+	 { "QSpecScan_setAbsoluteQResolution", _wrap_QSpecScan_setAbsoluteQResolution, METH_VARARGS, "\n"
+		"QSpecScan_setAbsoluteQResolution(QSpecScan self, RangedDistribution const & distr, double std_dev)\n"
+		"QSpecScan_setAbsoluteQResolution(QSpecScan self, RangedDistribution const & distr, vdouble1d_t std_dev)\n"
+		"void QSpecScan::setAbsoluteQResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)\n"
+		"\n"
+		"Sets qz resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the qz-axis. \n"
+		"\n"
+		""},
+	 { "QSpecScan_swigregister", QSpecScan_swigregister, METH_O, NULL},
+	 { "QSpecScan_swiginit", QSpecScan_swiginit, METH_VARARGS, NULL},
 	 { "delete_Simulation", _wrap_delete_Simulation, METH_O, "\n"
 		"delete_Simulation(Simulation self)\n"
 		"Simulation::~Simulation()\n"
@@ -43064,6 +44583,12 @@ static void *_p_SpecularSimulationTo_p_Simulation(void *x, int *SWIGUNUSEDPARM(n
 static void *_p_OffSpecSimulationTo_p_Simulation(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((Simulation *) (Simulation2D *) ((OffSpecSimulation *) x));
 }
+static void *_p_AngularSpecScanTo_p_ISpecularScan(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISpecularScan *)  ((AngularSpecScan *) x));
+}
+static void *_p_QSpecScanTo_p_ISpecularScan(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISpecularScan *)  ((QSpecScan *) x));
+}
 static void *_p_IFormFactorTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISample *) ((IFormFactor *) x));
 }
@@ -43151,26 +44676,20 @@ static void *_p_OffSpecSimulationTo_p_Simulation2D(void *x, int *SWIGUNUSEDPARM(
 static void *_p_IFormFactorTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *) ((IFormFactor *) x));
 }
-static void *_p_Simulation2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (Simulation *) ((Simulation2D *) x));
-}
-static void *_p_IFormFactorBornTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *) ((IFormFactorBorn *) x));
-}
-static void *_p_SimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *)  ((Simulation *) x));
+static void *_p_OffSpecSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Simulation *)(Simulation2D *) ((OffSpecSimulation *) x));
 }
-static void *_p_GISASSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (Simulation *)(Simulation2D *) ((GISASSimulation *) x));
+static void *_p_SpecularSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Simulation *) ((SpecularSimulation *) x));
 }
 static void *_p_DepthProbeSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (Simulation *) ((DepthProbeSimulation *) x));
 }
-static void *_p_SpecularSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (Simulation *) ((SpecularSimulation *) x));
+static void *_p_GISASSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Simulation *)(Simulation2D *) ((GISASSimulation *) x));
 }
-static void *_p_OffSpecSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (Simulation *)(Simulation2D *) ((OffSpecSimulation *) x));
+static void *_p_SimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *)  ((Simulation *) x));
 }
 static void *_p_IBackgroundTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((IBackground *) x));
@@ -43184,9 +44703,25 @@ static void *_p_PoissonNoiseBackgroundTo_p_ICloneable(void *x, int *SWIGUNUSEDPA
 static void *_p_ParameterPoolTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((ParameterPool *) x));
 }
+static void *_p_ISpecularScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *)  ((ISpecularScan *) x));
+}
 static void *_p_ISampleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((ISample *) x));
 }
+static void *_p_QSpecScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISpecularScan *) ((QSpecScan *) x));
+}
+static void *_p_AngularSpecScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISpecularScan *) ((AngularSpecScan *) x));
+}
+static void *_p_IFormFactorBornTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *) ((IFormFactorBorn *) x));
+}
+static void *_p_Simulation2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Simulation *) ((Simulation2D *) x));
+}
+static swig_type_info _swigt__p_AngularSpecScan = {"_p_AngularSpecScan", "AngularSpecScan *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_AxisInfo = {"_p_AxisInfo", "std::vector< AxisInfo >::value_type *|AxisInfo *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicVector3DT_double_t = {"_p_BasicVector3DT_double_t", "std::vector< BasicVector3D< double > >::value_type *|kvector_t *|BasicVector3D< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicVector3DT_int_t = {"_p_BasicVector3DT_int_t", "ivector_t *|BasicVector3D< int > *", 0, 0, (void*)0, 0};
@@ -43231,7 +44766,10 @@ static swig_type_info _swigt__p_PoissonNoiseBackground = {"_p_PoissonNoiseBackgr
 static swig_type_info _swigt__p_ProgressHandler__Callback_t = {"_p_ProgressHandler__Callback_t", "ProgressHandler::Callback_t *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_PyBuilderCallback = {"_p_PyBuilderCallback", "PyBuilderCallback *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_PyObserverCallback = {"_p_PyObserverCallback", "PyObserverCallback *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_QSpecScan = {"_p_QSpecScan", "QSpecScan *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_RangedDistribution = {"_p_RangedDistribution", "RangedDistribution *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_RealLimits = {"_p_RealLimits", "RealLimits *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ScanResolution = {"_p_ScanResolution", "ScanResolution *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Simulation = {"_p_Simulation", "Simulation *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Simulation2D = {"_p_Simulation2D", "Simulation2D *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SimulationFactory = {"_p_SimulationFactory", "SimulationFactory *", 0, 0, (void*)0, 0};
@@ -43295,6 +44833,7 @@ static swig_type_info _swigt__p_unsigned_short = {"_p_unsigned_short", "unsigned
 static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0, 0, (void*)0, 0};
 
 static swig_type_info *swig_type_initial[] = {
+  &_swigt__p_AngularSpecScan,
   &_swigt__p_AxisInfo,
   &_swigt__p_BasicVector3DT_double_t,
   &_swigt__p_BasicVector3DT_int_t,
@@ -43339,7 +44878,10 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_ProgressHandler__Callback_t,
   &_swigt__p_PyBuilderCallback,
   &_swigt__p_PyObserverCallback,
+  &_swigt__p_QSpecScan,
+  &_swigt__p_RangedDistribution,
   &_swigt__p_RealLimits,
+  &_swigt__p_ScanResolution,
   &_swigt__p_Simulation,
   &_swigt__p_Simulation2D,
   &_swigt__p_SimulationFactory,
@@ -43403,6 +44945,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_value_type,
 };
 
+static swig_cast_info _swigc__p_AngularSpecScan[] = {  {&_swigt__p_AngularSpecScan, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_AxisInfo[] = {  {&_swigt__p_AxisInfo, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicVector3DT_double_t[] = {  {&_swigt__p_BasicVector3DT_double_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicVector3DT_int_t[] = {  {&_swigt__p_BasicVector3DT_int_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -43424,7 +44967,7 @@ static swig_cast_info _swigc__p_IFormFactor[] = {{&_swigt__p_IFormFactor, 0, 0,
 static swig_cast_info _swigc__p_ParameterPool[] = {{&_swigt__p_ParameterPool, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISample[] = {{&_swigt__p_ISample, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFormFactorBorn[] = {{&_swigt__p_IFormFactorBorn, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_ISpecularScan, _p_ISpecularScanTo_p_ICloneable, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_ICloneable, 0, 0},  {&_swigt__p_AngularSpecScan, _p_AngularSpecScanTo_p_ICloneable, 0, 0},  {&_swigt__p_QSpecScan, _p_QSpecScanTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IDetector2D[] = {  {&_swigt__p_IDetector2D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IDistribution1D[] = {  {&_swigt__p_IDistribution1D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFactoryT_std__string_Simulation_t[] = {  {&_swigt__p_SimulationFactory, _p_SimulationFactoryTo_p_IFactoryT_std__string_Simulation_t, 0, 0},  {&_swigt__p_IFactoryT_std__string_Simulation_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -43436,7 +44979,7 @@ static swig_cast_info _swigc__p_IObserver[] = {  {&_swigt__p_IObserver, 0, 0, 0}
 static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IParameterized, 0, 0},  {&_swigt__p_IParameterized, 0, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_IParameterized, 0, 0},  {&_swigt__p_INode, _p_INodeTo_p_IParameterized, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IResolutionFunction2D[] = {  {&_swigt__p_IResolutionFunction2D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IShape2D[] = {  {&_swigt__p_IShape2D, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ISpecularScan[] = {  {&_swigt__p_ISpecularScan, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ISpecularScan[] = {  {&_swigt__p_AngularSpecScan, _p_AngularSpecScanTo_p_ISpecularScan, 0, 0},  {&_swigt__p_QSpecScan, _p_QSpecScanTo_p_ISpecularScan, 0, 0},  {&_swigt__p_ISpecularScan, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Instrument[] = {  {&_swigt__p_Instrument, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IterationInfo[] = {  {&_swigt__p_IterationInfo, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_MultiLayer[] = {  {&_swigt__p_MultiLayer, 0, 0, 0},{0, 0, 0, 0}};
@@ -43447,7 +44990,10 @@ static swig_cast_info _swigc__p_PoissonNoiseBackground[] = {  {&_swigt__p_Poisso
 static swig_cast_info _swigc__p_ProgressHandler__Callback_t[] = {  {&_swigt__p_ProgressHandler__Callback_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_PyBuilderCallback[] = {  {&_swigt__p_PyBuilderCallback, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_PyObserverCallback[] = {  {&_swigt__p_PyObserverCallback, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_QSpecScan[] = {  {&_swigt__p_QSpecScan, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_RangedDistribution[] = {  {&_swigt__p_RangedDistribution, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_RealLimits[] = {  {&_swigt__p_RealLimits, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ScanResolution[] = {  {&_swigt__p_ScanResolution, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Simulation[] = {  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_Simulation, 0, 0},  {&_swigt__p_Simulation, 0, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_Simulation, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_Simulation, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_Simulation, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_Simulation, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Simulation2D[] = {  {&_swigt__p_Simulation2D, 0, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_Simulation2D, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_Simulation2D, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SimulationFactory[] = {  {&_swigt__p_SimulationFactory, 0, 0, 0},{0, 0, 0, 0}};
@@ -43511,6 +45057,7 @@ static swig_cast_info _swigc__p_unsigned_short[] = {  {&_swigt__p_unsigned_short
 static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0, 0},{0, 0, 0, 0}};
 
 static swig_cast_info *swig_cast_initial[] = {
+  _swigc__p_AngularSpecScan,
   _swigc__p_AxisInfo,
   _swigc__p_BasicVector3DT_double_t,
   _swigc__p_BasicVector3DT_int_t,
@@ -43555,7 +45102,10 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_ProgressHandler__Callback_t,
   _swigc__p_PyBuilderCallback,
   _swigc__p_PyObserverCallback,
+  _swigc__p_QSpecScan,
+  _swigc__p_RangedDistribution,
   _swigc__p_RealLimits,
+  _swigc__p_ScanResolution,
   _swigc__p_Simulation,
   _swigc__p_Simulation2D,
   _swigc__p_SimulationFactory,
diff --git a/auto/Wrap/libBornAgainDevice.py b/auto/Wrap/libBornAgainDevice.py
index 00d89099304..09bb76f4d1a 100644
--- a/auto/Wrap/libBornAgainDevice.py
+++ b/auto/Wrap/libBornAgainDevice.py
@@ -4285,186 +4285,6 @@ class VarianceSimFunction(IVarianceFunction):
 # Register VarianceSimFunction in _libBornAgainDevice:
 _libBornAgainDevice.VarianceSimFunction_swigregister(VarianceSimFunction)
 
-class AngularSpecScan(object):
-    r"""
-
-
-    Scan type with inclination angles as coordinate values and a unique wavelength. Features footprint correction.
-
-    C++ includes: AngularSpecScan.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__(AngularSpecScan self, double wl, vdouble1d_t inc_angle) -> AngularSpecScan
-        __init__(AngularSpecScan self, double wl, IAxis inc_angle) -> AngularSpecScan
-        __init__(AngularSpecScan self, double wl, int nbins, double alpha_i_min, double alpha_i_max) -> AngularSpecScan
-        AngularSpecScan::AngularSpecScan(double wl, int nbins, double alpha_i_min, double alpha_i_max)
-
-        Sets angle-defined specular scan. The first parameter is always a wavelength in nm. Second parameter is either a numpy array of incident angles in radians or an IAxis object with angle values. Alternatively an axis can be defined in-place, then the second passed parameter is the number of bins, third - minimum on-axis angle value, fourth - maximum on-axis angle value. 
-
-        """
-        _libBornAgainDevice.AngularSpecScan_swiginit(self, _libBornAgainDevice.new_AngularSpecScan(*args))
-    __swig_destroy__ = _libBornAgainDevice.delete_AngularSpecScan
-
-    def clone(self):
-        r"""
-        clone(AngularSpecScan self) -> AngularSpecScan
-        AngularSpecScan * AngularSpecScan::clone() const override
-
-        """
-        return _libBornAgainDevice.AngularSpecScan_clone(self)
-
-    def setFootprintFactor(self, f_factor):
-        r"""
-        setFootprintFactor(AngularSpecScan self, IFootprintFactor f_factor)
-        void AngularSpecScan::setFootprintFactor(const IFootprintFactor *f_factor)
-
-        Sets footprint correction factor. 
-
-        """
-        return _libBornAgainDevice.AngularSpecScan_setFootprintFactor(self, f_factor)
-
-    def setWavelengthResolution(self, resolution):
-        r"""
-        setWavelengthResolution(AngularSpecScan self, ScanResolution resolution)
-        void AngularSpecScan::setWavelengthResolution(const ScanResolution &resolution)
-
-        Sets wavelength resolution values via  ScanResolution object. 
-
-        """
-        return _libBornAgainDevice.AngularSpecScan_setWavelengthResolution(self, resolution)
-
-    def setRelativeWavelengthResolution(self, *args):
-        r"""
-        setRelativeWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, double rel_dev)
-        setRelativeWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t rel_dev)
-        void AngularSpecScan::setRelativeWavelengthResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)
-
-        Sets wavelength resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
-
-        """
-        return _libBornAgainDevice.AngularSpecScan_setRelativeWavelengthResolution(self, *args)
-
-    def setAbsoluteWavelengthResolution(self, *args):
-        r"""
-        setAbsoluteWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, double std_dev)
-        setAbsoluteWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t std_dev)
-        void AngularSpecScan::setAbsoluteWavelengthResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)
-
-        Sets wavelength resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
-
-        """
-        return _libBornAgainDevice.AngularSpecScan_setAbsoluteWavelengthResolution(self, *args)
-
-    def setAngleResolution(self, resolution):
-        r"""
-        setAngleResolution(AngularSpecScan self, ScanResolution resolution)
-        void AngularSpecScan::setAngleResolution(const ScanResolution &resolution)
-
-        Sets angle resolution values via  ScanResolution object. 
-
-        """
-        return _libBornAgainDevice.AngularSpecScan_setAngleResolution(self, resolution)
-
-    def setRelativeAngularResolution(self, *args):
-        r"""
-        setRelativeAngularResolution(AngularSpecScan self, RangedDistribution const & distr, double rel_dev)
-        setRelativeAngularResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t rel_dev)
-        void AngularSpecScan::setRelativeAngularResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)
-
-        Sets angular resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
-
-        """
-        return _libBornAgainDevice.AngularSpecScan_setRelativeAngularResolution(self, *args)
-
-    def setAbsoluteAngularResolution(self, *args):
-        r"""
-        setAbsoluteAngularResolution(AngularSpecScan self, RangedDistribution const & distr, double std_dev)
-        setAbsoluteAngularResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t std_dev)
-        void AngularSpecScan::setAbsoluteAngularResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)
-
-        Sets angular resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. 
-
-        """
-        return _libBornAgainDevice.AngularSpecScan_setAbsoluteAngularResolution(self, *args)
-
-# Register AngularSpecScan in _libBornAgainDevice:
-_libBornAgainDevice.AngularSpecScan_swigregister(AngularSpecScan)
-
-class QSpecScan(object):
-    r"""
-
-
-    Scan type with z-components of scattering vector as coordinate values. Wavelength and incident angles are not accessible separately.
-
-    C++ includes: QSpecScan.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__(QSpecScan self, vdouble1d_t qs_nm) -> QSpecScan
-        __init__(QSpecScan self, IAxis qs_nm) -> QSpecScan
-        __init__(QSpecScan self, int nbins, double qz_min, double qz_max) -> QSpecScan
-        QSpecScan::QSpecScan(int nbins, double qz_min, double qz_max)
-
-        Sets q-defined specular scan. Accepts either numpy array of q-values sorted in ascending order or an IAxis object with q-values. Alternatively an axis can be defined in-place, then the first passed parameter is the number of bins, second - minimum on-axis q-value, third - maximum on-axis q_value. 
-
-        """
-        _libBornAgainDevice.QSpecScan_swiginit(self, _libBornAgainDevice.new_QSpecScan(*args))
-    __swig_destroy__ = _libBornAgainDevice.delete_QSpecScan
-
-    def clone(self):
-        r"""
-        clone(QSpecScan self) -> QSpecScan
-        QSpecScan * QSpecScan::clone() const override
-
-        """
-        return _libBornAgainDevice.QSpecScan_clone(self)
-
-    def setQResolution(self, resolution):
-        r"""
-        setQResolution(QSpecScan self, ScanResolution resolution)
-        void QSpecScan::setQResolution(const ScanResolution &resolution)
-
-        Sets q resolution values via  ScanResolution object. 
-
-        """
-        return _libBornAgainDevice.QSpecScan_setQResolution(self, resolution)
-
-    def setRelativeQResolution(self, *args):
-        r"""
-        setRelativeQResolution(QSpecScan self, RangedDistribution const & distr, double rel_dev)
-        setRelativeQResolution(QSpecScan self, RangedDistribution const & distr, vdouble1d_t rel_dev)
-        void QSpecScan::setRelativeQResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)
-
-        Sets qz resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the qz-axis. 
-
-        """
-        return _libBornAgainDevice.QSpecScan_setRelativeQResolution(self, *args)
-
-    def setAbsoluteQResolution(self, *args):
-        r"""
-        setAbsoluteQResolution(QSpecScan self, RangedDistribution const & distr, double std_dev)
-        setAbsoluteQResolution(QSpecScan self, RangedDistribution const & distr, vdouble1d_t std_dev)
-        void QSpecScan::setAbsoluteQResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)
-
-        Sets qz resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the qz-axis. 
-
-        """
-        return _libBornAgainDevice.QSpecScan_setAbsoluteQResolution(self, *args)
-
-# Register QSpecScan in _libBornAgainDevice:
-_libBornAgainDevice.QSpecScan_swigregister(QSpecScan)
-
 class Axes(object):
     r"""
 
diff --git a/auto/Wrap/libBornAgainDevice_wrap.cpp b/auto/Wrap/libBornAgainDevice_wrap.cpp
index 13bead5a8d7..e733f304733 100644
--- a/auto/Wrap/libBornAgainDevice_wrap.cpp
+++ b/auto/Wrap/libBornAgainDevice_wrap.cpp
@@ -3097,130 +3097,127 @@ namespace Swig {
 
 /* -------- TYPES TABLE (BEGIN) -------- */
 
-#define SWIGTYPE_p_AngularSpecScan swig_types[0]
-#define SWIGTYPE_p_Axes swig_types[1]
-#define SWIGTYPE_p_AxisInfo swig_types[2]
-#define SWIGTYPE_p_BasicVector3DT_double_t swig_types[3]
-#define SWIGTYPE_p_BasicVector3DT_int_t swig_types[4]
-#define SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t swig_types[5]
-#define SWIGTYPE_p_Beam swig_types[6]
-#define SWIGTYPE_p_Bin1D swig_types[7]
-#define SWIGTYPE_p_ChiSquaredModule swig_types[8]
-#define SWIGTYPE_p_DetectionProperties swig_types[9]
-#define SWIGTYPE_p_DetectorMask swig_types[10]
-#define SWIGTYPE_p_Ellipse swig_types[11]
-#define SWIGTYPE_p_FootprintGauss swig_types[12]
-#define SWIGTYPE_p_FootprintSquare swig_types[13]
-#define SWIGTYPE_p_Histogram1D swig_types[14]
-#define SWIGTYPE_p_Histogram2D swig_types[15]
-#define SWIGTYPE_p_HorizontalLine swig_types[16]
-#define SWIGTYPE_p_IAxis swig_types[17]
-#define SWIGTYPE_p_IChiSquaredModule swig_types[18]
-#define SWIGTYPE_p_ICloneable swig_types[19]
-#define SWIGTYPE_p_IDetector swig_types[20]
-#define SWIGTYPE_p_IDetector2D swig_types[21]
-#define SWIGTYPE_p_IDetectorResolution swig_types[22]
-#define SWIGTYPE_p_IFootprintFactor swig_types[23]
-#define SWIGTYPE_p_IHistogram swig_types[24]
-#define SWIGTYPE_p_IIntensityFunction swig_types[25]
-#define SWIGTYPE_p_INode swig_types[26]
-#define SWIGTYPE_p_INodeVisitor swig_types[27]
-#define SWIGTYPE_p_IParameterized swig_types[28]
-#define SWIGTYPE_p_IPixel swig_types[29]
-#define SWIGTYPE_p_IResolutionFunction2D swig_types[30]
-#define SWIGTYPE_p_IShape2D swig_types[31]
-#define SWIGTYPE_p_ISpecularScan swig_types[32]
-#define SWIGTYPE_p_IUnitConverter swig_types[33]
-#define SWIGTYPE_p_IVarianceFunction swig_types[34]
-#define SWIGTYPE_p_Instrument swig_types[35]
-#define SWIGTYPE_p_IntensityDataIOFactory swig_types[36]
-#define SWIGTYPE_p_IntensityFunctionLog swig_types[37]
-#define SWIGTYPE_p_IntensityFunctionSqrt swig_types[38]
-#define SWIGTYPE_p_IsGISAXSDetector swig_types[39]
-#define SWIGTYPE_p_Line swig_types[40]
-#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[41]
-#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[42]
-#define SWIGTYPE_p_OutputDataT_CumulativeValue_t swig_types[43]
-#define SWIGTYPE_p_OutputDataT_bool_t swig_types[44]
-#define SWIGTYPE_p_OutputDataT_double_t swig_types[45]
-#define SWIGTYPE_p_ParameterDistribution swig_types[46]
-#define SWIGTYPE_p_ParameterPool swig_types[47]
-#define SWIGTYPE_p_Polygon swig_types[48]
-#define SWIGTYPE_p_PolygonPrivate swig_types[49]
-#define SWIGTYPE_p_QSpecScan swig_types[50]
-#define SWIGTYPE_p_RangedDistribution swig_types[51]
-#define SWIGTYPE_p_Rectangle swig_types[52]
-#define SWIGTYPE_p_RectangularDetector swig_types[53]
-#define SWIGTYPE_p_RectangularPixel swig_types[54]
-#define SWIGTYPE_p_RegionOfInterest swig_types[55]
-#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[56]
-#define SWIGTYPE_p_ScanResolution swig_types[57]
-#define SWIGTYPE_p_SimulationResult swig_types[58]
-#define SWIGTYPE_p_SphericalDetector swig_types[59]
-#define SWIGTYPE_p_VarianceConstantFunction swig_types[60]
-#define SWIGTYPE_p_VarianceSimFunction swig_types[61]
-#define SWIGTYPE_p_VerticalLine swig_types[62]
-#define SWIGTYPE_p_allocator_type swig_types[63]
-#define SWIGTYPE_p_bool swig_types[64]
-#define SWIGTYPE_p_char swig_types[65]
-#define SWIGTYPE_p_const_iterator swig_types[66]
-#define SWIGTYPE_p_corr_matrix_t swig_types[67]
-#define SWIGTYPE_p_difference_type swig_types[68]
-#define SWIGTYPE_p_double swig_types[69]
-#define SWIGTYPE_p_first_type swig_types[70]
-#define SWIGTYPE_p_int swig_types[71]
-#define SWIGTYPE_p_iterator swig_types[72]
-#define SWIGTYPE_p_key_type swig_types[73]
-#define SWIGTYPE_p_long_long swig_types[74]
-#define SWIGTYPE_p_mapped_type swig_types[75]
-#define SWIGTYPE_p_p_PyObject swig_types[76]
-#define SWIGTYPE_p_parameters_t swig_types[77]
-#define SWIGTYPE_p_second_type swig_types[78]
-#define SWIGTYPE_p_short swig_types[79]
-#define SWIGTYPE_p_signed_char swig_types[80]
-#define SWIGTYPE_p_size_type swig_types[81]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[82]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[83]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[84]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[85]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[86]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[87]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[88]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[89]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[90]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[91]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[92]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[93]
-#define SWIGTYPE_p_std__functionT_void_fSimulationAreaIterator_const_RF_t swig_types[94]
-#define SWIGTYPE_p_std__invalid_argument swig_types[95]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[96]
-#define SWIGTYPE_p_std__mapT_Axes__Units_char_const_p_std__lessT_Axes__Units_t_std__allocatorT_std__pairT_Axes__Units_const_char_const_p_t_t_t swig_types[97]
-#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[98]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[99]
-#define SWIGTYPE_p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t swig_types[100]
-#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[101]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[102]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[103]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[104]
-#define SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t swig_types[105]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[106]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[107]
-#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[108]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[109]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[110]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[111]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[112]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[113]
-#define SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t swig_types[114]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[115]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[116]
-#define SWIGTYPE_p_unsigned_char swig_types[117]
-#define SWIGTYPE_p_unsigned_int swig_types[118]
-#define SWIGTYPE_p_unsigned_long_long swig_types[119]
-#define SWIGTYPE_p_unsigned_short swig_types[120]
-#define SWIGTYPE_p_value_type swig_types[121]
-static swig_type_info *swig_types[123];
-static swig_module_info swig_module = {swig_types, 122, 0, 0, 0, 0};
+#define SWIGTYPE_p_Axes swig_types[0]
+#define SWIGTYPE_p_AxisInfo swig_types[1]
+#define SWIGTYPE_p_BasicVector3DT_double_t swig_types[2]
+#define SWIGTYPE_p_BasicVector3DT_int_t swig_types[3]
+#define SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t swig_types[4]
+#define SWIGTYPE_p_Beam swig_types[5]
+#define SWIGTYPE_p_Bin1D swig_types[6]
+#define SWIGTYPE_p_ChiSquaredModule swig_types[7]
+#define SWIGTYPE_p_DetectionProperties swig_types[8]
+#define SWIGTYPE_p_DetectorMask swig_types[9]
+#define SWIGTYPE_p_Ellipse swig_types[10]
+#define SWIGTYPE_p_FootprintGauss swig_types[11]
+#define SWIGTYPE_p_FootprintSquare swig_types[12]
+#define SWIGTYPE_p_Histogram1D swig_types[13]
+#define SWIGTYPE_p_Histogram2D swig_types[14]
+#define SWIGTYPE_p_HorizontalLine swig_types[15]
+#define SWIGTYPE_p_IAxis swig_types[16]
+#define SWIGTYPE_p_IChiSquaredModule swig_types[17]
+#define SWIGTYPE_p_ICloneable swig_types[18]
+#define SWIGTYPE_p_IDetector swig_types[19]
+#define SWIGTYPE_p_IDetector2D swig_types[20]
+#define SWIGTYPE_p_IDetectorResolution swig_types[21]
+#define SWIGTYPE_p_IFootprintFactor swig_types[22]
+#define SWIGTYPE_p_IHistogram swig_types[23]
+#define SWIGTYPE_p_IIntensityFunction swig_types[24]
+#define SWIGTYPE_p_INode swig_types[25]
+#define SWIGTYPE_p_INodeVisitor swig_types[26]
+#define SWIGTYPE_p_IParameterized swig_types[27]
+#define SWIGTYPE_p_IPixel swig_types[28]
+#define SWIGTYPE_p_IResolutionFunction2D swig_types[29]
+#define SWIGTYPE_p_IShape2D swig_types[30]
+#define SWIGTYPE_p_IUnitConverter swig_types[31]
+#define SWIGTYPE_p_IVarianceFunction swig_types[32]
+#define SWIGTYPE_p_Instrument swig_types[33]
+#define SWIGTYPE_p_IntensityDataIOFactory swig_types[34]
+#define SWIGTYPE_p_IntensityFunctionLog swig_types[35]
+#define SWIGTYPE_p_IntensityFunctionSqrt swig_types[36]
+#define SWIGTYPE_p_IsGISAXSDetector swig_types[37]
+#define SWIGTYPE_p_Line swig_types[38]
+#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[39]
+#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[40]
+#define SWIGTYPE_p_OutputDataT_CumulativeValue_t swig_types[41]
+#define SWIGTYPE_p_OutputDataT_bool_t swig_types[42]
+#define SWIGTYPE_p_OutputDataT_double_t swig_types[43]
+#define SWIGTYPE_p_ParameterDistribution swig_types[44]
+#define SWIGTYPE_p_ParameterPool swig_types[45]
+#define SWIGTYPE_p_Polygon swig_types[46]
+#define SWIGTYPE_p_PolygonPrivate swig_types[47]
+#define SWIGTYPE_p_RangedDistribution swig_types[48]
+#define SWIGTYPE_p_Rectangle swig_types[49]
+#define SWIGTYPE_p_RectangularDetector swig_types[50]
+#define SWIGTYPE_p_RectangularPixel swig_types[51]
+#define SWIGTYPE_p_RegionOfInterest swig_types[52]
+#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[53]
+#define SWIGTYPE_p_ScanResolution swig_types[54]
+#define SWIGTYPE_p_SimulationResult swig_types[55]
+#define SWIGTYPE_p_SphericalDetector swig_types[56]
+#define SWIGTYPE_p_VarianceConstantFunction swig_types[57]
+#define SWIGTYPE_p_VarianceSimFunction swig_types[58]
+#define SWIGTYPE_p_VerticalLine swig_types[59]
+#define SWIGTYPE_p_allocator_type swig_types[60]
+#define SWIGTYPE_p_bool swig_types[61]
+#define SWIGTYPE_p_char swig_types[62]
+#define SWIGTYPE_p_const_iterator swig_types[63]
+#define SWIGTYPE_p_corr_matrix_t swig_types[64]
+#define SWIGTYPE_p_difference_type swig_types[65]
+#define SWIGTYPE_p_double swig_types[66]
+#define SWIGTYPE_p_first_type swig_types[67]
+#define SWIGTYPE_p_int swig_types[68]
+#define SWIGTYPE_p_iterator swig_types[69]
+#define SWIGTYPE_p_key_type swig_types[70]
+#define SWIGTYPE_p_long_long swig_types[71]
+#define SWIGTYPE_p_mapped_type swig_types[72]
+#define SWIGTYPE_p_p_PyObject swig_types[73]
+#define SWIGTYPE_p_parameters_t swig_types[74]
+#define SWIGTYPE_p_second_type swig_types[75]
+#define SWIGTYPE_p_short swig_types[76]
+#define SWIGTYPE_p_signed_char swig_types[77]
+#define SWIGTYPE_p_size_type swig_types[78]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[79]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[80]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[81]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[82]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[83]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[84]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[85]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[86]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[87]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[88]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[89]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[90]
+#define SWIGTYPE_p_std__functionT_void_fSimulationAreaIterator_const_RF_t swig_types[91]
+#define SWIGTYPE_p_std__invalid_argument swig_types[92]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[93]
+#define SWIGTYPE_p_std__mapT_Axes__Units_char_const_p_std__lessT_Axes__Units_t_std__allocatorT_std__pairT_Axes__Units_const_char_const_p_t_t_t swig_types[94]
+#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[95]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[96]
+#define SWIGTYPE_p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t swig_types[97]
+#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[98]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[99]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[100]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[101]
+#define SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t swig_types[102]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[103]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[104]
+#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[105]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[106]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[107]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[108]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[109]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[110]
+#define SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t swig_types[111]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[112]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[113]
+#define SWIGTYPE_p_unsigned_char swig_types[114]
+#define SWIGTYPE_p_unsigned_int swig_types[115]
+#define SWIGTYPE_p_unsigned_long_long swig_types[116]
+#define SWIGTYPE_p_unsigned_short swig_types[117]
+#define SWIGTYPE_p_value_type swig_types[118]
+static swig_type_info *swig_types[120];
+static swig_module_info swig_module = {swig_types, 119, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -6746,8 +6743,6 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include "Device/Resolution/IResolutionFunction2D.h"
 #include "Device/Resolution/ResolutionFunction2DGaussian.h"
 #include "Device/Resolution/ScanResolution.h"
-#include "Device/Scan/AngularSpecScan.h"
-#include "Device/Scan/QSpecScan.h"
 
 
   namespace swig {
@@ -37160,1401 +37155,6 @@ SWIGINTERN PyObject *VarianceSimFunction_swiginit(PyObject *SWIGUNUSEDPARM(self)
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_AngularSpecScan__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  std::vector< double,std::allocator< double > > arg2 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  AngularSpecScan *result = 0 ;
-  
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_AngularSpecScan" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    int res = swig::asptr(swig_obj[1], &ptr);
-    if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_AngularSpecScan" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > >""'"); 
-    }
-    arg2 = *ptr;
-    if (SWIG_IsNewObj(res)) delete ptr;
-  }
-  result = (AngularSpecScan *)new AngularSpecScan(arg1,arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AngularSpecScan, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_AngularSpecScan__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  IAxis *arg2 = 0 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  AngularSpecScan *result = 0 ;
-  
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_AngularSpecScan" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IAxis,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_AngularSpecScan" "', argument " "2"" of type '" "IAxis const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AngularSpecScan" "', argument " "2"" of type '" "IAxis const &""'"); 
-  }
-  arg2 = reinterpret_cast< IAxis * >(argp2);
-  result = (AngularSpecScan *)new AngularSpecScan(arg1,(IAxis const &)*arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AngularSpecScan, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_AngularSpecScan__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  int arg2 ;
-  double arg3 ;
-  double arg4 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  int val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  double val4 ;
-  int ecode4 = 0 ;
-  AngularSpecScan *result = 0 ;
-  
-  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_AngularSpecScan" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_AngularSpecScan" "', argument " "2"" of type '" "int""'");
-  } 
-  arg2 = static_cast< int >(val2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_AngularSpecScan" "', 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 '" "new_AngularSpecScan" "', argument " "4"" of type '" "double""'");
-  } 
-  arg4 = static_cast< double >(val4);
-  result = (AngularSpecScan *)new AngularSpecScan(arg1,arg2,arg3,arg4);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AngularSpecScan, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_AngularSpecScan(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[5] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_AngularSpecScan", 0, 4, argv))) SWIG_fail;
-  --argc;
-  if (argc == 2) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAxis, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_new_AngularSpecScan__SWIG_1(self, argc, argv);
-      }
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_new_AngularSpecScan__SWIG_0(self, argc, argv);
-      }
-    }
-  }
-  if (argc == 4) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      {
-        int res = SWIG_AsVal_int(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_double(argv[3], NULL);
-            _v = SWIG_CheckState(res);
-          }
-          if (_v) {
-            return _wrap_new_AngularSpecScan__SWIG_2(self, argc, argv);
-          }
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_AngularSpecScan'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AngularSpecScan::AngularSpecScan(double,std::vector< double,std::allocator< double > >)\n"
-    "    AngularSpecScan::AngularSpecScan(double,IAxis const &)\n"
-    "    AngularSpecScan::AngularSpecScan(double,int,double,double)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_AngularSpecScan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 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_AngularSpecScan, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AngularSpecScan" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  AngularSpecScan *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_clone" "', argument " "1"" of type '" "AngularSpecScan const *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  result = (AngularSpecScan *)((AngularSpecScan const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setFootprintFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
-  IFootprintFactor *arg2 = (IFootprintFactor *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "AngularSpecScan_setFootprintFactor", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setFootprintFactor" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_IFootprintFactor, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setFootprintFactor" "', argument " "2"" of type '" "IFootprintFactor const *""'"); 
-  }
-  arg2 = reinterpret_cast< IFootprintFactor * >(argp2);
-  (arg1)->setFootprintFactor((IFootprintFactor const *)arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setWavelengthResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
-  ScanResolution *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "AngularSpecScan_setWavelengthResolution", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setWavelengthResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_ScanResolution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setWavelengthResolution" "', argument " "2"" of type '" "ScanResolution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setWavelengthResolution" "', argument " "2"" of type '" "ScanResolution const &""'"); 
-  }
-  arg2 = reinterpret_cast< ScanResolution * >(argp2);
-  (arg1)->setWavelengthResolution((ScanResolution const &)*arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setRelativeWavelengthResolution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
-  RangedDistribution *arg2 = 0 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  (arg1)->setRelativeWavelengthResolution((RangedDistribution const &)*arg2,arg3);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setRelativeWavelengthResolution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
-  RangedDistribution *arg2 = 0 ;
-  std::vector< double,std::allocator< double > > *arg3 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  int res3 = SWIG_OLDOBJ ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res3 = swig::asptr(swig_obj[2], &ptr);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setRelativeWavelengthResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg3 = ptr;
-  }
-  (arg1)->setRelativeWavelengthResolution((RangedDistribution const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
-  resultobj = SWIG_Py_Void();
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setRelativeWavelengthResolution(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "AngularSpecScan_setRelativeWavelengthResolution", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_AngularSpecScan_setRelativeWavelengthResolution__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          return _wrap_AngularSpecScan_setRelativeWavelengthResolution__SWIG_1(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'AngularSpecScan_setRelativeWavelengthResolution'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AngularSpecScan::setRelativeWavelengthResolution(RangedDistribution const &,double)\n"
-    "    AngularSpecScan::setRelativeWavelengthResolution(RangedDistribution const &,std::vector< double,std::allocator< double > > const &)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setAbsoluteWavelengthResolution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
-  RangedDistribution *arg2 = 0 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  (arg1)->setAbsoluteWavelengthResolution((RangedDistribution const &)*arg2,arg3);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setAbsoluteWavelengthResolution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
-  RangedDistribution *arg2 = 0 ;
-  std::vector< double,std::allocator< double > > *arg3 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  int res3 = SWIG_OLDOBJ ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res3 = swig::asptr(swig_obj[2], &ptr);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAbsoluteWavelengthResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg3 = ptr;
-  }
-  (arg1)->setAbsoluteWavelengthResolution((RangedDistribution const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
-  resultobj = SWIG_Py_Void();
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setAbsoluteWavelengthResolution(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "AngularSpecScan_setAbsoluteWavelengthResolution", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_AngularSpecScan_setAbsoluteWavelengthResolution__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          return _wrap_AngularSpecScan_setAbsoluteWavelengthResolution__SWIG_1(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'AngularSpecScan_setAbsoluteWavelengthResolution'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AngularSpecScan::setAbsoluteWavelengthResolution(RangedDistribution const &,double)\n"
-    "    AngularSpecScan::setAbsoluteWavelengthResolution(RangedDistribution const &,std::vector< double,std::allocator< double > > const &)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setAngleResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
-  ScanResolution *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "AngularSpecScan_setAngleResolution", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setAngleResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_ScanResolution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setAngleResolution" "', argument " "2"" of type '" "ScanResolution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAngleResolution" "', argument " "2"" of type '" "ScanResolution const &""'"); 
-  }
-  arg2 = reinterpret_cast< ScanResolution * >(argp2);
-  (arg1)->setAngleResolution((ScanResolution const &)*arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setRelativeAngularResolution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
-  RangedDistribution *arg2 = 0 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  (arg1)->setRelativeAngularResolution((RangedDistribution const &)*arg2,arg3);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setRelativeAngularResolution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
-  RangedDistribution *arg2 = 0 ;
-  std::vector< double,std::allocator< double > > *arg3 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  int res3 = SWIG_OLDOBJ ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res3 = swig::asptr(swig_obj[2], &ptr);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setRelativeAngularResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg3 = ptr;
-  }
-  (arg1)->setRelativeAngularResolution((RangedDistribution const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
-  resultobj = SWIG_Py_Void();
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setRelativeAngularResolution(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "AngularSpecScan_setRelativeAngularResolution", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_AngularSpecScan_setRelativeAngularResolution__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          return _wrap_AngularSpecScan_setRelativeAngularResolution__SWIG_1(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'AngularSpecScan_setRelativeAngularResolution'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AngularSpecScan::setRelativeAngularResolution(RangedDistribution const &,double)\n"
-    "    AngularSpecScan::setRelativeAngularResolution(RangedDistribution const &,std::vector< double,std::allocator< double > > const &)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setAbsoluteAngularResolution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
-  RangedDistribution *arg2 = 0 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  (arg1)->setAbsoluteAngularResolution((RangedDistribution const &)*arg2,arg3);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setAbsoluteAngularResolution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  AngularSpecScan *arg1 = (AngularSpecScan *) 0 ;
-  RangedDistribution *arg2 = 0 ;
-  std::vector< double,std::allocator< double > > *arg3 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  int res3 = SWIG_OLDOBJ ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AngularSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "1"" of type '" "AngularSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< AngularSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res3 = swig::asptr(swig_obj[2], &ptr);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AngularSpecScan_setAbsoluteAngularResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg3 = ptr;
-  }
-  (arg1)->setAbsoluteAngularResolution((RangedDistribution const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
-  resultobj = SWIG_Py_Void();
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AngularSpecScan_setAbsoluteAngularResolution(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "AngularSpecScan_setAbsoluteAngularResolution", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_AngularSpecScan_setAbsoluteAngularResolution__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AngularSpecScan, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          return _wrap_AngularSpecScan_setAbsoluteAngularResolution__SWIG_1(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'AngularSpecScan_setAbsoluteAngularResolution'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AngularSpecScan::setAbsoluteAngularResolution(RangedDistribution const &,double)\n"
-    "    AngularSpecScan::setAbsoluteAngularResolution(RangedDistribution const &,std::vector< double,std::allocator< double > > const &)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *AngularSpecScan_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_AngularSpecScan, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *AngularSpecScan_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
-SWIGINTERN PyObject *_wrap_new_QSpecScan__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  std::vector< double,std::allocator< double > > arg1 ;
-  QSpecScan *result = 0 ;
-  
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    int res = swig::asptr(swig_obj[0], &ptr);
-    if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_QSpecScan" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > >""'"); 
-    }
-    arg1 = *ptr;
-    if (SWIG_IsNewObj(res)) delete ptr;
-  }
-  result = (QSpecScan *)new QSpecScan(arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_QSpecScan, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_QSpecScan__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  IAxis *arg1 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  QSpecScan *result = 0 ;
-  
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IAxis,  0  | 0);
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_QSpecScan" "', argument " "1"" of type '" "IAxis const &""'"); 
-  }
-  if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_QSpecScan" "', argument " "1"" of type '" "IAxis const &""'"); 
-  }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = (QSpecScan *)new QSpecScan((IAxis const &)*arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_QSpecScan, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_QSpecScan__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  int arg1 ;
-  double arg2 ;
-  double arg3 ;
-  int val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  QSpecScan *result = 0 ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  ecode1 = SWIG_AsVal_int(swig_obj[0], &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_QSpecScan" "', argument " "1"" of type '" "int""'");
-  } 
-  arg1 = static_cast< int >(val1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_QSpecScan" "', 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_QSpecScan" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (QSpecScan *)new QSpecScan(arg1,arg2,arg3);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_QSpecScan, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_QSpecScan(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_QSpecScan", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 1) {
-    int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IAxis, SWIG_POINTER_NO_NULL | 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_new_QSpecScan__SWIG_1(self, argc, argv);
-    }
-  }
-  if (argc == 1) {
-    int _v;
-    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_new_QSpecScan__SWIG_0(self, argc, argv);
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    {
-      int res = SWIG_AsVal_int(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) {
-          return _wrap_new_QSpecScan__SWIG_2(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_QSpecScan'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    QSpecScan::QSpecScan(std::vector< double,std::allocator< double > >)\n"
-    "    QSpecScan::QSpecScan(IAxis const &)\n"
-    "    QSpecScan::QSpecScan(int,double,double)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_QSpecScan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  QSpecScan *arg1 = (QSpecScan *) 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_QSpecScan, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_QSpecScan" "', argument " "1"" of type '" "QSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< QSpecScan * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_QSpecScan_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  QSpecScan *arg1 = (QSpecScan *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  QSpecScan *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QSpecScan_clone" "', argument " "1"" of type '" "QSpecScan const *""'"); 
-  }
-  arg1 = reinterpret_cast< QSpecScan * >(argp1);
-  result = (QSpecScan *)((QSpecScan const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_QSpecScan, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_QSpecScan_setQResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  QSpecScan *arg1 = (QSpecScan *) 0 ;
-  ScanResolution *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "QSpecScan_setQResolution", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QSpecScan_setQResolution" "', argument " "1"" of type '" "QSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< QSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_ScanResolution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "QSpecScan_setQResolution" "', argument " "2"" of type '" "ScanResolution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setQResolution" "', argument " "2"" of type '" "ScanResolution const &""'"); 
-  }
-  arg2 = reinterpret_cast< ScanResolution * >(argp2);
-  (arg1)->setQResolution((ScanResolution const &)*arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_QSpecScan_setRelativeQResolution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  QSpecScan *arg1 = (QSpecScan *) 0 ;
-  RangedDistribution *arg2 = 0 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QSpecScan_setRelativeQResolution" "', argument " "1"" of type '" "QSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< QSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "QSpecScan_setRelativeQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setRelativeQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "QSpecScan_setRelativeQResolution" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  (arg1)->setRelativeQResolution((RangedDistribution const &)*arg2,arg3);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_QSpecScan_setRelativeQResolution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  QSpecScan *arg1 = (QSpecScan *) 0 ;
-  RangedDistribution *arg2 = 0 ;
-  std::vector< double,std::allocator< double > > *arg3 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  int res3 = SWIG_OLDOBJ ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QSpecScan_setRelativeQResolution" "', argument " "1"" of type '" "QSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< QSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "QSpecScan_setRelativeQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setRelativeQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res3 = swig::asptr(swig_obj[2], &ptr);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "QSpecScan_setRelativeQResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setRelativeQResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg3 = ptr;
-  }
-  (arg1)->setRelativeQResolution((RangedDistribution const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
-  resultobj = SWIG_Py_Void();
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_QSpecScan_setRelativeQResolution(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "QSpecScan_setRelativeQResolution", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_QSpecScan, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_QSpecScan_setRelativeQResolution__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_QSpecScan, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          return _wrap_QSpecScan_setRelativeQResolution__SWIG_1(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'QSpecScan_setRelativeQResolution'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    QSpecScan::setRelativeQResolution(RangedDistribution const &,double)\n"
-    "    QSpecScan::setRelativeQResolution(RangedDistribution const &,std::vector< double,std::allocator< double > > const &)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_QSpecScan_setAbsoluteQResolution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  QSpecScan *arg1 = (QSpecScan *) 0 ;
-  RangedDistribution *arg2 = 0 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "1"" of type '" "QSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< QSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  (arg1)->setAbsoluteQResolution((RangedDistribution const &)*arg2,arg3);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_QSpecScan_setAbsoluteQResolution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  QSpecScan *arg1 = (QSpecScan *) 0 ;
-  RangedDistribution *arg2 = 0 ;
-  std::vector< double,std::allocator< double > > *arg3 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  int res3 = SWIG_OLDOBJ ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QSpecScan, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "1"" of type '" "QSpecScan *""'"); 
-  }
-  arg1 = reinterpret_cast< QSpecScan * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RangedDistribution,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "2"" of type '" "RangedDistribution const &""'"); 
-  }
-  arg2 = reinterpret_cast< RangedDistribution * >(argp2);
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res3 = swig::asptr(swig_obj[2], &ptr);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "QSpecScan_setAbsoluteQResolution" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg3 = ptr;
-  }
-  (arg1)->setAbsoluteQResolution((RangedDistribution const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
-  resultobj = SWIG_Py_Void();
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_QSpecScan_setAbsoluteQResolution(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "QSpecScan_setAbsoluteQResolution", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_QSpecScan, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_QSpecScan_setAbsoluteQResolution__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_QSpecScan, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_RangedDistribution, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          return _wrap_QSpecScan_setAbsoluteQResolution__SWIG_1(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'QSpecScan_setAbsoluteQResolution'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    QSpecScan::setAbsoluteQResolution(RangedDistribution const &,double)\n"
-    "    QSpecScan::setAbsoluteQResolution(RangedDistribution const &,std::vector< double,std::allocator< double > > const &)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *QSpecScan_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_QSpecScan, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *QSpecScan_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
 SWIGINTERN PyObject *_wrap_new_Axes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Axes *result = 0 ;
@@ -48979,124 +47579,6 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_VarianceSimFunction", _wrap_delete_VarianceSimFunction, METH_O, "delete_VarianceSimFunction(VarianceSimFunction self)"},
 	 { "VarianceSimFunction_swigregister", VarianceSimFunction_swigregister, METH_O, NULL},
 	 { "VarianceSimFunction_swiginit", VarianceSimFunction_swiginit, METH_VARARGS, NULL},
-	 { "new_AngularSpecScan", _wrap_new_AngularSpecScan, METH_VARARGS, "\n"
-		"AngularSpecScan(double wl, vdouble1d_t inc_angle)\n"
-		"AngularSpecScan(double wl, IAxis inc_angle)\n"
-		"new_AngularSpecScan(double wl, int nbins, double alpha_i_min, double alpha_i_max) -> AngularSpecScan\n"
-		"AngularSpecScan::AngularSpecScan(double wl, int nbins, double alpha_i_min, double alpha_i_max)\n"
-		"\n"
-		"Sets angle-defined specular scan. The first parameter is always a wavelength in nm. Second parameter is either a numpy array of incident angles in radians or an IAxis object with angle values. Alternatively an axis can be defined in-place, then the second passed parameter is the number of bins, third - minimum on-axis angle value, fourth - maximum on-axis angle value. \n"
-		"\n"
-		""},
-	 { "delete_AngularSpecScan", _wrap_delete_AngularSpecScan, METH_O, "\n"
-		"delete_AngularSpecScan(AngularSpecScan self)\n"
-		"AngularSpecScan::~AngularSpecScan() override\n"
-		"\n"
-		""},
-	 { "AngularSpecScan_clone", _wrap_AngularSpecScan_clone, METH_O, "\n"
-		"AngularSpecScan_clone(AngularSpecScan self) -> AngularSpecScan\n"
-		"AngularSpecScan * AngularSpecScan::clone() const override\n"
-		"\n"
-		""},
-	 { "AngularSpecScan_setFootprintFactor", _wrap_AngularSpecScan_setFootprintFactor, METH_VARARGS, "\n"
-		"AngularSpecScan_setFootprintFactor(AngularSpecScan self, IFootprintFactor f_factor)\n"
-		"void AngularSpecScan::setFootprintFactor(const IFootprintFactor *f_factor)\n"
-		"\n"
-		"Sets footprint correction factor. \n"
-		"\n"
-		""},
-	 { "AngularSpecScan_setWavelengthResolution", _wrap_AngularSpecScan_setWavelengthResolution, METH_VARARGS, "\n"
-		"AngularSpecScan_setWavelengthResolution(AngularSpecScan self, ScanResolution resolution)\n"
-		"void AngularSpecScan::setWavelengthResolution(const ScanResolution &resolution)\n"
-		"\n"
-		"Sets wavelength resolution values via  ScanResolution object. \n"
-		"\n"
-		""},
-	 { "AngularSpecScan_setRelativeWavelengthResolution", _wrap_AngularSpecScan_setRelativeWavelengthResolution, METH_VARARGS, "\n"
-		"AngularSpecScan_setRelativeWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, double rel_dev)\n"
-		"AngularSpecScan_setRelativeWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t rel_dev)\n"
-		"void AngularSpecScan::setRelativeWavelengthResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)\n"
-		"\n"
-		"Sets wavelength resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. \n"
-		"\n"
-		""},
-	 { "AngularSpecScan_setAbsoluteWavelengthResolution", _wrap_AngularSpecScan_setAbsoluteWavelengthResolution, METH_VARARGS, "\n"
-		"AngularSpecScan_setAbsoluteWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, double std_dev)\n"
-		"AngularSpecScan_setAbsoluteWavelengthResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t std_dev)\n"
-		"void AngularSpecScan::setAbsoluteWavelengthResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)\n"
-		"\n"
-		"Sets wavelength resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. \n"
-		"\n"
-		""},
-	 { "AngularSpecScan_setAngleResolution", _wrap_AngularSpecScan_setAngleResolution, METH_VARARGS, "\n"
-		"AngularSpecScan_setAngleResolution(AngularSpecScan self, ScanResolution resolution)\n"
-		"void AngularSpecScan::setAngleResolution(const ScanResolution &resolution)\n"
-		"\n"
-		"Sets angle resolution values via  ScanResolution object. \n"
-		"\n"
-		""},
-	 { "AngularSpecScan_setRelativeAngularResolution", _wrap_AngularSpecScan_setRelativeAngularResolution, METH_VARARGS, "\n"
-		"AngularSpecScan_setRelativeAngularResolution(AngularSpecScan self, RangedDistribution const & distr, double rel_dev)\n"
-		"AngularSpecScan_setRelativeAngularResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t rel_dev)\n"
-		"void AngularSpecScan::setRelativeAngularResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)\n"
-		"\n"
-		"Sets angular resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. \n"
-		"\n"
-		""},
-	 { "AngularSpecScan_setAbsoluteAngularResolution", _wrap_AngularSpecScan_setAbsoluteAngularResolution, METH_VARARGS, "\n"
-		"AngularSpecScan_setAbsoluteAngularResolution(AngularSpecScan self, RangedDistribution const & distr, double std_dev)\n"
-		"AngularSpecScan_setAbsoluteAngularResolution(AngularSpecScan self, RangedDistribution const & distr, vdouble1d_t std_dev)\n"
-		"void AngularSpecScan::setAbsoluteAngularResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)\n"
-		"\n"
-		"Sets angular resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the inclination angle axis. \n"
-		"\n"
-		""},
-	 { "AngularSpecScan_swigregister", AngularSpecScan_swigregister, METH_O, NULL},
-	 { "AngularSpecScan_swiginit", AngularSpecScan_swiginit, METH_VARARGS, NULL},
-	 { "new_QSpecScan", _wrap_new_QSpecScan, METH_VARARGS, "\n"
-		"QSpecScan(vdouble1d_t qs_nm)\n"
-		"QSpecScan(IAxis qs_nm)\n"
-		"new_QSpecScan(int nbins, double qz_min, double qz_max) -> QSpecScan\n"
-		"QSpecScan::QSpecScan(int nbins, double qz_min, double qz_max)\n"
-		"\n"
-		"Sets q-defined specular scan. Accepts either numpy array of q-values sorted in ascending order or an IAxis object with q-values. Alternatively an axis can be defined in-place, then the first passed parameter is the number of bins, second - minimum on-axis q-value, third - maximum on-axis q_value. \n"
-		"\n"
-		""},
-	 { "delete_QSpecScan", _wrap_delete_QSpecScan, METH_O, "\n"
-		"delete_QSpecScan(QSpecScan self)\n"
-		"QSpecScan::~QSpecScan() override\n"
-		"\n"
-		""},
-	 { "QSpecScan_clone", _wrap_QSpecScan_clone, METH_O, "\n"
-		"QSpecScan_clone(QSpecScan self) -> QSpecScan\n"
-		"QSpecScan * QSpecScan::clone() const override\n"
-		"\n"
-		""},
-	 { "QSpecScan_setQResolution", _wrap_QSpecScan_setQResolution, METH_VARARGS, "\n"
-		"QSpecScan_setQResolution(QSpecScan self, ScanResolution resolution)\n"
-		"void QSpecScan::setQResolution(const ScanResolution &resolution)\n"
-		"\n"
-		"Sets q resolution values via  ScanResolution object. \n"
-		"\n"
-		""},
-	 { "QSpecScan_setRelativeQResolution", _wrap_QSpecScan_setRelativeQResolution, METH_VARARGS, "\n"
-		"QSpecScan_setRelativeQResolution(QSpecScan self, RangedDistribution const & distr, double rel_dev)\n"
-		"QSpecScan_setRelativeQResolution(QSpecScan self, RangedDistribution const & distr, vdouble1d_t rel_dev)\n"
-		"void QSpecScan::setRelativeQResolution(const RangedDistribution &distr, const std::vector< double > &rel_dev)\n"
-		"\n"
-		"Sets qz resolution values via RangedDistribution and values of relative deviations (that is,  rel_dev equals standard deviation divided by the mean value).  rel_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the qz-axis. \n"
-		"\n"
-		""},
-	 { "QSpecScan_setAbsoluteQResolution", _wrap_QSpecScan_setAbsoluteQResolution, METH_VARARGS, "\n"
-		"QSpecScan_setAbsoluteQResolution(QSpecScan self, RangedDistribution const & distr, double std_dev)\n"
-		"QSpecScan_setAbsoluteQResolution(QSpecScan self, RangedDistribution const & distr, vdouble1d_t std_dev)\n"
-		"void QSpecScan::setAbsoluteQResolution(const RangedDistribution &distr, const std::vector< double > &std_dev)\n"
-		"\n"
-		"Sets qz resolution values via RangedDistribution and values of standard deviations.  std_dev can be either single-valued or a numpy array. In the latter case the length of the array should coinside with the length of the qz-axis. \n"
-		"\n"
-		""},
-	 { "QSpecScan_swigregister", QSpecScan_swigregister, METH_O, NULL},
-	 { "QSpecScan_swiginit", QSpecScan_swiginit, METH_VARARGS, NULL},
 	 { "new_Axes", _wrap_new_Axes, METH_NOARGS, "\n"
 		"new_Axes() -> Axes\n"
 		"\n"
@@ -50307,9 +48789,6 @@ static void *_p_EllipseTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory))
 static void *_p_HorizontalLineTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IShape2D *) ((HorizontalLine *) x));
 }
-static void *_p_ISpecularScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *)  ((ISpecularScan *) x));
-}
 static void *_p_VerticalLineTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IShape2D *) ((VerticalLine *) x));
 }
@@ -50331,12 +48810,6 @@ static void *_p_SphericalDetectorTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(ne
 static void *_p_IsGISAXSDetectorTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IDetector *)(IDetector2D *)(SphericalDetector *) ((IsGISAXSDetector *) x));
 }
-static void *_p_AngularSpecScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISpecularScan *) ((AngularSpecScan *) x));
-}
-static void *_p_QSpecScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISpecularScan *) ((QSpecScan *) x));
-}
 static void *_p_PolygonTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IShape2D *) ((Polygon *) x));
 }
@@ -50418,12 +48891,6 @@ static void *_p_IsGISAXSDetectorTo_p_IDetector(void *x, int *SWIGUNUSEDPARM(newm
 static void *_p_IDetector2DTo_p_IDetector(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IDetector *)  ((IDetector2D *) x));
 }
-static void *_p_AngularSpecScanTo_p_ISpecularScan(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISpecularScan *)  ((AngularSpecScan *) x));
-}
-static void *_p_QSpecScanTo_p_ISpecularScan(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISpecularScan *)  ((QSpecScan *) x));
-}
 static void *_p_PolygonTo_p_IShape2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IShape2D *)  ((Polygon *) x));
 }
@@ -50460,7 +48927,6 @@ static void *_p_FootprintGaussTo_p_IFootprintFactor(void *x, int *SWIGUNUSEDPARM
 static void *_p_ResolutionFunction2DGaussianTo_p_IResolutionFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IResolutionFunction2D *)  ((ResolutionFunction2DGaussian *) x));
 }
-static swig_type_info _swigt__p_AngularSpecScan = {"_p_AngularSpecScan", "AngularSpecScan *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Axes = {"_p_Axes", "Axes *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_AxisInfo = {"_p_AxisInfo", "AxisInfo *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicVector3DT_double_t = {"_p_BasicVector3DT_double_t", "std::vector< BasicVector3D< double > >::value_type *|kvector_t *|BasicVector3D< double > *", 0, 0, (void*)0, 0};
@@ -50494,7 +48960,6 @@ static swig_type_info _swigt__p_ParameterDistribution = {"_p_ParameterDistributi
 static swig_type_info _swigt__p_IPixel = {"_p_IPixel", "IPixel *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IResolutionFunction2D = {"_p_IResolutionFunction2D", "IResolutionFunction2D *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IShape2D = {"_p_IShape2D", "IShape2D *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_ISpecularScan = {"_p_ISpecularScan", "ISpecularScan *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IUnitConverter = {"_p_IUnitConverter", "IUnitConverter *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IVarianceFunction = {"_p_IVarianceFunction", "IVarianceFunction *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Instrument = {"_p_Instrument", "Instrument *", 0, 0, (void*)0, 0};
@@ -50510,7 +48975,6 @@ static swig_type_info _swigt__p_OutputDataT_bool_t = {"_p_OutputDataT_bool_t", "
 static swig_type_info _swigt__p_OutputDataT_double_t = {"_p_OutputDataT_double_t", "OutputData< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Polygon = {"_p_Polygon", "Polygon *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_PolygonPrivate = {"_p_PolygonPrivate", "PolygonPrivate *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_QSpecScan = {"_p_QSpecScan", "QSpecScan *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_RangedDistribution = {"_p_RangedDistribution", "RangedDistribution *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Rectangle = {"_p_Rectangle", "Rectangle *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_RectangularDetector = {"_p_RectangularDetector", "RectangularDetector *", 0, 0, (void*)0, 0};
@@ -50584,7 +49048,6 @@ static swig_type_info _swigt__p_unsigned_short = {"_p_unsigned_short", "unsigned
 static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0, 0, (void*)0, 0};
 
 static swig_type_info *swig_type_initial[] = {
-  &_swigt__p_AngularSpecScan,
   &_swigt__p_Axes,
   &_swigt__p_AxisInfo,
   &_swigt__p_BasicVector3DT_double_t,
@@ -50616,7 +49079,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_IPixel,
   &_swigt__p_IResolutionFunction2D,
   &_swigt__p_IShape2D,
-  &_swigt__p_ISpecularScan,
   &_swigt__p_IUnitConverter,
   &_swigt__p_IVarianceFunction,
   &_swigt__p_Instrument,
@@ -50634,7 +49096,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_ParameterPool,
   &_swigt__p_Polygon,
   &_swigt__p_PolygonPrivate,
-  &_swigt__p_QSpecScan,
   &_swigt__p_RangedDistribution,
   &_swigt__p_Rectangle,
   &_swigt__p_RectangularDetector,
@@ -50708,7 +49169,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_value_type,
 };
 
-static swig_cast_info _swigc__p_AngularSpecScan[] = {  {&_swigt__p_AngularSpecScan, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Axes[] = {  {&_swigt__p_Axes, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_AxisInfo[] = {  {&_swigt__p_AxisInfo, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicVector3DT_double_t[] = {  {&_swigt__p_BasicVector3DT_double_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -50728,7 +49188,7 @@ static swig_cast_info _swigc__p_HorizontalLine[] = {  {&_swigt__p_HorizontalLine
 static swig_cast_info _swigc__p_IAxis[] = {  {&_swigt__p_IAxis, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IChiSquaredModule[] = {  {&_swigt__p_IChiSquaredModule, 0, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_IChiSquaredModule, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ParameterPool[] = {{&_swigt__p_ParameterPool, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_ScanResolution, _p_ScanResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Line, _p_LineTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_Rectangle, _p_RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_IShape2D, _p_IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Ellipse, _p_EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_HorizontalLine, _p_HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_ISpecularScan, _p_ISpecularScanTo_p_ICloneable, 0, 0},  {&_swigt__p_VerticalLine, _p_VerticalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_IChiSquaredModule, _p_IChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_AngularSpecScan, _p_AngularSpecScanTo_p_ICloneable, 0, 0},  {&_swigt__p_QSpecScan, _p_QSpecScanTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_ICloneable, 0, 0},  {&_swigt__p_Polygon, _p_PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_IUnitConverter, _p_IUnitConverterTo_p_ICloneable, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_ScanResolution, _p_ScanResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Line, _p_LineTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_Rectangle, _p_RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_IShape2D, _p_IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Ellipse, _p_EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_HorizontalLine, _p_HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_VerticalLine, _p_VerticalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_IChiSquaredModule, _p_IChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_ICloneable, 0, 0},  {&_swigt__p_Polygon, _p_PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_IUnitConverter, _p_IUnitConverterTo_p_ICloneable, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IDetector[] = {  {&_swigt__p_IDetector, 0, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IDetector, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IDetector, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IDetector, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IDetector, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IDetector2D[] = {  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IDetector2D, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IDetector2D, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IDetector2D, 0, 0},  {&_swigt__p_IDetector2D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IDetectorResolution[] = {  {&_swigt__p_IDetectorResolution, 0, 0, 0},{0, 0, 0, 0}};
@@ -50742,7 +49202,6 @@ static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_Beam, _p_BeamT
 static swig_cast_info _swigc__p_IPixel[] = {  {&_swigt__p_IPixel, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IResolutionFunction2D[] = {  {&_swigt__p_IResolutionFunction2D, 0, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IResolutionFunction2D, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IShape2D[] = {  {&_swigt__p_Polygon, _p_PolygonTo_p_IShape2D, 0, 0},  {&_swigt__p_Line, _p_LineTo_p_IShape2D, 0, 0},  {&_swigt__p_VerticalLine, _p_VerticalLineTo_p_IShape2D, 0, 0},  {&_swigt__p_Ellipse, _p_EllipseTo_p_IShape2D, 0, 0},  {&_swigt__p_HorizontalLine, _p_HorizontalLineTo_p_IShape2D, 0, 0},  {&_swigt__p_Rectangle, _p_RectangleTo_p_IShape2D, 0, 0},  {&_swigt__p_IShape2D, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ISpecularScan[] = {  {&_swigt__p_AngularSpecScan, _p_AngularSpecScanTo_p_ISpecularScan, 0, 0},  {&_swigt__p_QSpecScan, _p_QSpecScanTo_p_ISpecularScan, 0, 0},  {&_swigt__p_ISpecularScan, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IUnitConverter[] = {  {&_swigt__p_IUnitConverter, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IVarianceFunction[] = {  {&_swigt__p_IVarianceFunction, 0, 0, 0},  {&_swigt__p_VarianceConstantFunction, _p_VarianceConstantFunctionTo_p_IVarianceFunction, 0, 0},  {&_swigt__p_VarianceSimFunction, _p_VarianceSimFunctionTo_p_IVarianceFunction, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Instrument[] = {  {&_swigt__p_Instrument, 0, 0, 0},{0, 0, 0, 0}};
@@ -50758,7 +49217,6 @@ static swig_cast_info _swigc__p_OutputDataT_bool_t[] = {  {&_swigt__p_OutputData
 static swig_cast_info _swigc__p_OutputDataT_double_t[] = {  {&_swigt__p_OutputDataT_double_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Polygon[] = {  {&_swigt__p_Polygon, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_PolygonPrivate[] = {  {&_swigt__p_PolygonPrivate, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_QSpecScan[] = {  {&_swigt__p_QSpecScan, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_RangedDistribution[] = {  {&_swigt__p_RangedDistribution, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Rectangle[] = {  {&_swigt__p_Rectangle, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_RectangularDetector[] = {  {&_swigt__p_RectangularDetector, 0, 0, 0},{0, 0, 0, 0}};
@@ -50832,7 +49290,6 @@ static swig_cast_info _swigc__p_unsigned_short[] = {  {&_swigt__p_unsigned_short
 static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0, 0},{0, 0, 0, 0}};
 
 static swig_cast_info *swig_cast_initial[] = {
-  _swigc__p_AngularSpecScan,
   _swigc__p_Axes,
   _swigc__p_AxisInfo,
   _swigc__p_BasicVector3DT_double_t,
@@ -50864,7 +49321,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_IPixel,
   _swigc__p_IResolutionFunction2D,
   _swigc__p_IShape2D,
-  _swigc__p_ISpecularScan,
   _swigc__p_IUnitConverter,
   _swigc__p_IVarianceFunction,
   _swigc__p_Instrument,
@@ -50882,7 +49338,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_ParameterPool,
   _swigc__p_Polygon,
   _swigc__p_PolygonPrivate,
-  _swigc__p_QSpecScan,
   _swigc__p_RangedDistribution,
   _swigc__p_Rectangle,
   _swigc__p_RectangularDetector,
-- 
GitLab