From 49730465bfebb92757460ee9c2bb586c420b95e1 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Tue, 25 Oct 2022 13:54:43 +0200
Subject: [PATCH] IAxis* -> const (in Frame and many other places)

---
 Base/Axis/Frame.cpp                     |  4 +-
 Base/Axis/Frame.h                       |  6 +-
 Device/Coord/ICoordSystem.cpp           |  6 +-
 Device/Coord/ICoordSystem.h             |  4 +-
 Device/Data/ArrayUtils.cpp              |  6 +-
 Device/Data/DataUtils.cpp               |  4 +-
 Device/Data/Datafield.cpp               |  6 +-
 Device/Data/Datafield.h                 |  6 +-
 Device/Detector/IDetector.cpp           |  2 +-
 Device/IO/ReadWriteINT.cpp              |  2 +-
 Device/IO/ReadWriteNicos.cpp            |  4 +-
 GUI/Support/IO/IOUtils.cpp              |  2 +-
 Sim/Simulation/DepthProbeSimulation.cpp |  2 +-
 Tests/Unit/GUI/Utils.cpp                |  2 +-
 auto/Wrap/doxygenBase.i                 |  4 +-
 auto/Wrap/doxygenDevice.i               |  6 +-
 auto/Wrap/libBornAgainBase.py           |  8 +-
 auto/Wrap/libBornAgainBase_wrap.cpp     | 34 ++++-----
 auto/Wrap/libBornAgainDevice.py         |  6 +-
 auto/Wrap/libBornAgainDevice_wrap.cpp   | 99 ++++++++++++-------------
 20 files changed, 104 insertions(+), 109 deletions(-)

diff --git a/Base/Axis/Frame.cpp b/Base/Axis/Frame.cpp
index a89f3e31060..d5103bf99bf 100644
--- a/Base/Axis/Frame.cpp
+++ b/Base/Axis/Frame.cpp
@@ -17,7 +17,7 @@
 #include "Base/Axis/IAxis.h"
 #include "Base/Util/Assert.h"
 
-Frame::Frame(const std::vector<IAxis*>& axes)
+Frame::Frame(const std::vector<const IAxis*>& axes)
     : m_axes(axes)
 {
     m_size = 1;
@@ -29,7 +29,7 @@ Frame::Frame(const std::vector<IAxis*>& axes)
 
 Frame::~Frame() = default;
 
-std::vector<IAxis*> Frame::cloned_axes() const
+std::vector<const IAxis*> Frame::cloned_axes() const
 {
     return m_axes.cloned_vector();
 }
diff --git a/Base/Axis/Frame.h b/Base/Axis/Frame.h
index 33a69490849..904f1eac710 100644
--- a/Base/Axis/Frame.h
+++ b/Base/Axis/Frame.h
@@ -27,7 +27,7 @@ class Bin1D;
 class Frame {
 public:
     //! Constructor that takes ownership of supplied axes.
-    Frame(const std::vector<IAxis*>& axes);
+    Frame(const std::vector<const IAxis*>& axes);
     virtual ~Frame();
 
     //! Returns number of dimensions.
@@ -40,7 +40,7 @@ public:
     size_t projectedSize(size_t k_axis) const;
 
     //! Returns cloned axes.
-    std::vector<IAxis*> cloned_axes() const;
+    std::vector<const IAxis*> cloned_axes() const;
 
     //! Returns axis with given serial number
     const IAxis& axis(size_t k_axis) const { return *m_axes.at(k_axis); }
@@ -77,7 +77,7 @@ public:
     bool operator==(const Frame&) const;
 
 protected:
-    OwningVector<IAxis> m_axes;
+    OwningVector<const IAxis> m_axes;
 
 private:
     size_t m_size; // cached product of axis sizes
diff --git a/Device/Coord/ICoordSystem.cpp b/Device/Coord/ICoordSystem.cpp
index 2251aa62cf4..cc1aa3c0f34 100644
--- a/Device/Coord/ICoordSystem.cpp
+++ b/Device/Coord/ICoordSystem.cpp
@@ -20,14 +20,14 @@
 
 ICoordSystem::~ICoordSystem() = default;
 
-std::vector<IAxis*> ICoordSystem::defaultAxes() const
+std::vector<const IAxis*> ICoordSystem::defaultAxes() const
 {
     return convertedAxes(defaultUnits());
 }
 
-std::vector<IAxis*> ICoordSystem::convertedAxes(Coords units) const
+std::vector<const IAxis*> ICoordSystem::convertedAxes(Coords units) const
 {
-    std::vector<IAxis*> result;
+    std::vector<const IAxis*> result;
     for (size_t i = 0; i < rank(); ++i)
         result.emplace_back(createConvertedAxis(i, units));
     return result;
diff --git a/Device/Coord/ICoordSystem.h b/Device/Coord/ICoordSystem.h
index dfdf20f780a..2cb36590166 100644
--- a/Device/Coord/ICoordSystem.h
+++ b/Device/Coord/ICoordSystem.h
@@ -56,8 +56,8 @@ public:
 
     virtual IAxis* createConvertedAxis(size_t i_axis, Coords units) const = 0;
 
-    std::vector<IAxis*> defaultAxes() const;
-    std::vector<IAxis*> convertedAxes(Coords units) const;
+    std::vector<const IAxis*> defaultAxes() const;
+    std::vector<const IAxis*> convertedAxes(Coords units) const;
 
     //! Creates Datafield array in converter units.
     virtual Datafield* createConvertedData(const Datafield& data, Coords units) const;
diff --git a/Device/Data/ArrayUtils.cpp b/Device/Data/ArrayUtils.cpp
index 46b74e1b97d..2b4e9485e53 100644
--- a/Device/Data/ArrayUtils.cpp
+++ b/Device/Data/ArrayUtils.cpp
@@ -32,7 +32,7 @@ std::pair<size_t, size_t> DataUtils::Array::getShape(const std::vector<std::vect
 std::unique_ptr<Datafield> DataUtils::Array::createPField1D(const std::vector<double>& vec)
 {
     const size_t N = vec.size();
-    const std::vector<IAxis*> axes{new FixedBinAxis("axis0", N, 0.0, (double)N)};
+    const std::vector<const IAxis*> axes{new FixedBinAxis("axis0", N, 0.0, (double)N)};
     return std::make_unique<Datafield>(axes, vec);
 }
 
@@ -47,8 +47,8 @@ DataUtils::Array::createPField2D(const std::vector<std::vector<double>>& vec)
         throw std::runtime_error(
             "Error in DataUtils::Array::createDataImpl: input argument contains empty dimensions");
 
-    const std::vector<IAxis*> axes{new FixedBinAxis("axis0", ncols, 0.0, (double)ncols),
-                                   new FixedBinAxis("axis1", nrows, 0.0, (double)nrows)};
+    const std::vector<const IAxis*> axes{new FixedBinAxis("axis0", ncols, 0.0, (double)ncols),
+                                         new FixedBinAxis("axis1", nrows, 0.0, (double)nrows)};
 
     std::vector<double> out(nrows * ncols);
     for (size_t row = 0; row < nrows; ++row) {
diff --git a/Device/Data/DataUtils.cpp b/Device/Data/DataUtils.cpp
index 7c91bd062a4..ecfe6437a2f 100644
--- a/Device/Data/DataUtils.cpp
+++ b/Device/Data/DataUtils.cpp
@@ -111,8 +111,8 @@ DataUtils::Data::vecvecToDatafield(const std::vector<std::vector<double>>& array
     size_t nrows = array_2d.size();
     size_t ncols = array_2d[0].size();
 
-    std::vector<IAxis*> axes{new FixedBinAxis("x", nrows, 0.0, double(nrows)),
-                             new FixedBinAxis("y", ncols, 0.0, double(ncols))};
+    std::vector<const IAxis*> axes{new FixedBinAxis("x", nrows, 0.0, double(nrows)),
+                                   new FixedBinAxis("y", ncols, 0.0, double(ncols))};
     std::vector<double> out;
     out.reserve(nrows * ncols);
     for (unsigned row = 0; row < nrows; row++) {
diff --git a/Device/Data/Datafield.cpp b/Device/Data/Datafield.cpp
index e50ef30e747..fd2be8c9c2f 100644
--- a/Device/Data/Datafield.cpp
+++ b/Device/Data/Datafield.cpp
@@ -43,17 +43,17 @@ Datafield::Datafield(const Frame* frame, const std::vector<double>& values,
     ASSERT(m_errSigmas.size() == 0 || m_errSigmas.size() == m_values.size());
 }
 
-Datafield::Datafield(const std::vector<IAxis*>& axes)
+Datafield::Datafield(const std::vector<const IAxis*>& axes)
     : Datafield(new Frame(axes))
 {
 }
 
-Datafield::Datafield(const std::vector<IAxis*>& axes, const std::vector<double>& values)
+Datafield::Datafield(const std::vector<const IAxis*>& axes, const std::vector<double>& values)
     : Datafield(new Frame(axes), values)
 {
 }
 
-Datafield::Datafield(const std::vector<IAxis*>& axes, const std::vector<double>& values,
+Datafield::Datafield(const std::vector<const IAxis*>& axes, const std::vector<double>& values,
                      const std::vector<double>& errSigmas)
     : Datafield(new Frame(axes), values, errSigmas)
 {
diff --git a/Device/Data/Datafield.h b/Device/Data/Datafield.h
index 2a1c277be70..f5428941dcc 100644
--- a/Device/Data/Datafield.h
+++ b/Device/Data/Datafield.h
@@ -30,11 +30,11 @@ class Frame;
 class Datafield {
 public:
     //! Constructor that takes ownership of supplied axes.
-    Datafield(const std::vector<IAxis*>& axes);
+    Datafield(const std::vector<const IAxis*>& axes);
     //! Constructor that takes ownership of supplied axes and initializes values.
-    Datafield(const std::vector<IAxis*>& axes, const std::vector<double>& values);
+    Datafield(const std::vector<const IAxis*>& axes, const std::vector<double>& values);
     //! Constructor that takes ownership of supplied axes and initializes values and errorbars
-    Datafield(const std::vector<IAxis*>& axes, const std::vector<double>& values,
+    Datafield(const std::vector<const IAxis*>& axes, const std::vector<double>& values,
               const std::vector<double>& errSigmas);
 
     Datafield(const Datafield&) = delete;
diff --git a/Device/Detector/IDetector.cpp b/Device/Detector/IDetector.cpp
index cf85ebf22bc..e7a218c043c 100644
--- a/Device/Detector/IDetector.cpp
+++ b/Device/Detector/IDetector.cpp
@@ -204,7 +204,7 @@ std::unique_ptr<Datafield> IDetector::createDetectorMap() const
     const size_t dim = rank();
     ASSERT(dim != 0);
 
-    std::vector<IAxis*> axes;
+    std::vector<const IAxis*> axes;
     for (size_t iAxis = 0; iAxis < dim; ++iAxis) {
         IAxis* tmp = axis(iAxis).clone();
         tmp->clip(regionOfInterestBounds(iAxis));
diff --git a/Device/IO/ReadWriteINT.cpp b/Device/IO/ReadWriteINT.cpp
index 2f0cb40a92d..63841aa4c18 100644
--- a/Device/IO/ReadWriteINT.cpp
+++ b/Device/IO/ReadWriteINT.cpp
@@ -25,7 +25,7 @@ Datafield* ReadWriteINT::readDatafield(std::istream& input_stream)
 {
     std::string line;
 
-    std::vector<IAxis*> axes;
+    std::vector<const IAxis*> axes;
     while (std::getline(input_stream, line)) {
         line = BaseUtils::String::trim(line);
 
diff --git a/Device/IO/ReadWriteNicos.cpp b/Device/IO/ReadWriteNicos.cpp
index 6337621a4f2..cb69e49ea36 100644
--- a/Device/IO/ReadWriteNicos.cpp
+++ b/Device/IO/ReadWriteNicos.cpp
@@ -101,8 +101,8 @@ Datafield* IO::readNicosData(std::istream& input_stream)
     if (height == 0)
         throw std::runtime_error("Could not find 'DataSizeY' value");
 
-    std::vector<IAxis*> axes{new FixedBinAxis("x", width, 0.0, width),
-                             new FixedBinAxis("y", height, 0.0, height)};
+    std::vector<const IAxis*> axes{new FixedBinAxis("x", width, 0.0, width),
+                                   new FixedBinAxis("y", height, 0.0, height)};
     auto result = std::make_unique<Datafield>(axes);
 
     // -- read data
diff --git a/GUI/Support/IO/IOUtils.cpp b/GUI/Support/IO/IOUtils.cpp
index a0a31054b7c..cf47d7d59f1 100644
--- a/GUI/Support/IO/IOUtils.cpp
+++ b/GUI/Support/IO/IOUtils.cpp
@@ -21,7 +21,7 @@
 
 std::unique_ptr<Datafield> GUI::Util::IO::binifyAxes(const Datafield& data)
 {
-    std::vector<IAxis*> axes;
+    std::vector<const IAxis*> axes;
     for (size_t i = 0; i < data.rank(); ++i)
         axes.emplace_back(data.axis(i).clone());
 
diff --git a/Sim/Simulation/DepthProbeSimulation.cpp b/Sim/Simulation/DepthProbeSimulation.cpp
index 1405e65490a..446fd05240c 100644
--- a/Sim/Simulation/DepthProbeSimulation.cpp
+++ b/Sim/Simulation/DepthProbeSimulation.cpp
@@ -82,7 +82,7 @@ SimulationResult DepthProbeSimulation::pack_result() const
 {
     validityCheck();
 
-    const std::vector<IAxis*> axes{alphaAxis()->clone(), zAxis()->clone()};
+    const std::vector<const IAxis*> axes{alphaAxis()->clone(), zAxis()->clone()};
     std::vector<double> out;
     out.reserve(axes[0]->size() * axes[1]->size());
     for (size_t i = 0, size = m_depth_eles.size(); i < size; ++i)
diff --git a/Tests/Unit/GUI/Utils.cpp b/Tests/Unit/GUI/Utils.cpp
index b7a54f0dba9..6b0c71f7b64 100644
--- a/Tests/Unit/GUI/Utils.cpp
+++ b/Tests/Unit/GUI/Utils.cpp
@@ -43,7 +43,7 @@ void UTest::GUI::create_dir(const QString& dir_name)
 
 std::unique_ptr<Datafield> UTest::GUI::createData(double value, DIM n_dim)
 {
-    std::vector<IAxis*> axes;
+    std::vector<const IAxis*> axes;
     axes.emplace_back(new FixedBinAxis("x", nxsize, -1.0, 1.0));
     if (n_dim == DIM::D2)
         axes.emplace_back(new FixedBinAxis("y", nysize, 0.0, 2.0));
diff --git a/auto/Wrap/doxygenBase.i b/auto/Wrap/doxygenBase.i
index 40258f27a51..008bcda5870 100644
--- a/auto/Wrap/doxygenBase.i
+++ b/auto/Wrap/doxygenBase.i
@@ -198,7 +198,7 @@ Holds one or two axes.
 C++ includes: Frame.h
 ";
 
-%feature("docstring")  Frame::Frame "Frame::Frame(const std::vector< IAxis * > &axes)
+%feature("docstring")  Frame::Frame "Frame::Frame(const std::vector< const IAxis * > &axes)
 Frame::Frame
 Constructor that takes ownership of supplied axes. 
 ";
@@ -221,7 +221,7 @@ Frame::projectedSize
 Returns number of bins along axis. 
 ";
 
-%feature("docstring")  Frame::cloned_axes "std::vector< IAxis * > Frame::cloned_axes() const
+%feature("docstring")  Frame::cloned_axes "std::vector< const IAxis * > Frame::cloned_axes() const
 Frame::cloned_axes
 Returns cloned axes. 
 ";
diff --git a/auto/Wrap/doxygenDevice.i b/auto/Wrap/doxygenDevice.i
index e19ada495b2..5ea5134c68a 100644
--- a/auto/Wrap/doxygenDevice.i
+++ b/auto/Wrap/doxygenDevice.i
@@ -86,17 +86,17 @@ Stores radiation power per bin.
 C++ includes: Datafield.h
 ";
 
-%feature("docstring")  Datafield::Datafield "Datafield::Datafield(const std::vector< IAxis * > &axes)
+%feature("docstring")  Datafield::Datafield "Datafield::Datafield(const std::vector< const IAxis * > &axes)
 Datafield::Datafield
 Constructor that takes ownership of supplied axes. 
 ";
 
-%feature("docstring")  Datafield::Datafield "Datafield::Datafield(const std::vector< IAxis * > &axes, const std::vector< double > &values)
+%feature("docstring")  Datafield::Datafield "Datafield::Datafield(const std::vector< const IAxis * > &axes, const std::vector< double > &values)
 Datafield::Datafield
 Constructor that takes ownership of supplied axes and initializes values. 
 ";
 
-%feature("docstring")  Datafield::Datafield "Datafield::Datafield(const std::vector< IAxis * > &axes, const std::vector< double > &values, const std::vector< double > &errSigmas)
+%feature("docstring")  Datafield::Datafield "Datafield::Datafield(const std::vector< const IAxis * > &axes, const std::vector< double > &values, const std::vector< double > &errSigmas)
 Datafield::Datafield
 Constructor that takes ownership of supplied axes and initializes values and errorbars. 
 ";
diff --git a/auto/Wrap/libBornAgainBase.py b/auto/Wrap/libBornAgainBase.py
index 473a3b05cfe..cc4e26153d3 100644
--- a/auto/Wrap/libBornAgainBase.py
+++ b/auto/Wrap/libBornAgainBase.py
@@ -2426,8 +2426,8 @@ class Frame(object):
 
     def __init__(self, axes):
         r"""
-        __init__(Frame self, std::vector< IAxis *,std::allocator< IAxis * > > const & axes) -> Frame
-        Frame::Frame(const std::vector< IAxis * > &axes)
+        __init__(Frame self, std::vector< IAxis const *,std::allocator< IAxis const * > > const & axes) -> Frame
+        Frame::Frame(const std::vector< const IAxis * > &axes)
         Frame::Frame
         Constructor that takes ownership of supplied axes. 
 
@@ -2467,8 +2467,8 @@ class Frame(object):
 
     def cloned_axes(self):
         r"""
-        cloned_axes(Frame self) -> std::vector< IAxis *,std::allocator< IAxis * > >
-        std::vector< IAxis * > Frame::cloned_axes() const
+        cloned_axes(Frame self) -> std::vector< IAxis const *,std::allocator< IAxis const * > >
+        std::vector< const IAxis * > Frame::cloned_axes() const
         Frame::cloned_axes
         Returns cloned axes. 
 
diff --git a/auto/Wrap/libBornAgainBase_wrap.cpp b/auto/Wrap/libBornAgainBase_wrap.cpp
index 7a289cc7f49..14b6c3f3636 100644
--- a/auto/Wrap/libBornAgainBase_wrap.cpp
+++ b/auto/Wrap/libBornAgainBase_wrap.cpp
@@ -3139,7 +3139,7 @@ namespace Swig {
 #define SWIGTYPE_p_std__lessT_std__string_t swig_types[39]
 #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[40]
 #define SWIGTYPE_p_std__pairT_double_double_t swig_types[41]
-#define SWIGTYPE_p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t swig_types[42]
+#define SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t swig_types[42]
 #define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[43]
 #define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[44]
 #define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[45]
@@ -26860,7 +26860,7 @@ SWIGINTERN PyObject *PointwiseAxis_swigregister(PyObject *SWIGUNUSEDPARM(self),
 
 SWIGINTERN PyObject *_wrap_new_Frame(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  std::vector< IAxis *,std::allocator< IAxis * > > *arg1 = 0 ;
+  std::vector< IAxis const *,std::allocator< IAxis const * > > *arg1 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -26868,15 +26868,15 @@ SWIGINTERN PyObject *_wrap_new_Frame(PyObject *SWIGUNUSEDPARM(self), PyObject *a
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Frame" "', argument " "1"" of type '" "std::vector< IAxis *,std::allocator< IAxis * > > const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Frame" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Frame" "', argument " "1"" of type '" "std::vector< IAxis *,std::allocator< IAxis * > > const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Frame" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > const &""'"); 
   }
-  arg1 = reinterpret_cast< std::vector< IAxis *,std::allocator< IAxis * > > * >(argp1);
-  result = (Frame *)new Frame((std::vector< IAxis *,std::allocator< IAxis * > > const &)*arg1);
+  arg1 = reinterpret_cast< std::vector< IAxis const *,std::allocator< IAxis const * > > * >(argp1);
+  result = (Frame *)new Frame((std::vector< IAxis const *,std::allocator< IAxis const * > > const &)*arg1);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Frame, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
@@ -26988,7 +26988,7 @@ SWIGINTERN PyObject *_wrap_Frame_cloned_axes(PyObject *SWIGUNUSEDPARM(self), PyO
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  SwigValueWrapper< std::vector< IAxis *,std::allocator< IAxis * > > > result;
+  SwigValueWrapper< std::vector< IAxis const *,std::allocator< IAxis const * > > > result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
@@ -26998,7 +26998,7 @@ SWIGINTERN PyObject *_wrap_Frame_cloned_axes(PyObject *SWIGUNUSEDPARM(self), PyO
   }
   arg1 = reinterpret_cast< Frame * >(argp1);
   result = ((Frame const *)arg1)->cloned_axes();
-  resultobj = SWIG_NewPointerObj((new std::vector< IAxis *,std::allocator< IAxis * > >(static_cast< const std::vector< IAxis *,std::allocator< IAxis * > >& >(result))), SWIGTYPE_p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t, SWIG_POINTER_OWN |  0 );
+  resultobj = SWIG_NewPointerObj((new std::vector< IAxis const *,std::allocator< IAxis const * > >(static_cast< const std::vector< IAxis const *,std::allocator< IAxis const * > >& >(result))), SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -29583,8 +29583,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "PointwiseAxis_clip", _wrap_PointwiseAxis_clip, METH_VARARGS, "PointwiseAxis_clip(PointwiseAxis self, double lower, double upper)"},
 	 { "PointwiseAxis_swigregister", PointwiseAxis_swigregister, METH_O, NULL},
 	 { "new_Frame", _wrap_new_Frame, METH_O, "\n"
-		"new_Frame(std::vector< IAxis *,std::allocator< IAxis * > > const & axes) -> Frame\n"
-		"Frame::Frame(const std::vector< IAxis * > &axes)\n"
+		"new_Frame(std::vector< IAxis const *,std::allocator< IAxis const * > > const & axes) -> Frame\n"
+		"Frame::Frame(const std::vector< const IAxis * > &axes)\n"
 		"Frame::Frame\n"
 		"Constructor that takes ownership of supplied axes. \n"
 		"\n"
@@ -29616,8 +29616,8 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "Frame_cloned_axes", _wrap_Frame_cloned_axes, METH_O, "\n"
-		"Frame_cloned_axes(Frame self) -> std::vector< IAxis *,std::allocator< IAxis * > >\n"
-		"std::vector< IAxis * > Frame::cloned_axes() const\n"
+		"Frame_cloned_axes(Frame self) -> std::vector< IAxis const *,std::allocator< IAxis const * > >\n"
+		"std::vector< const IAxis * > Frame::cloned_axes() const\n"
 		"Frame::cloned_axes\n"
 		"Returns cloned axes. \n"
 		"\n"
@@ -29842,7 +29842,7 @@ static swig_type_info _swigt__p_std__invalid_argument = {"_p_std__invalid_argume
 static swig_type_info _swigt__p_std__lessT_std__string_t = {"_p_std__lessT_std__string_t", "std::less< std::string > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t = {"_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t", "std::map< std::string,double,std::less< std::string >,std::allocator< std::pair< std::string const,double > > > *|std::map< std::string,double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__pairT_double_double_t = {"_p_std__pairT_double_double_t", "std::pair< double,double > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t = {"_p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t", "std::vector< IAxis *,std::allocator< IAxis * > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t = {"_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t", "std::vector< IAxis const *,std::allocator< IAxis const * > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_double_std__allocatorT_double_t_t = {"_p_std__vectorT_double_std__allocatorT_double_t_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_int_std__allocatorT_int_t_t = {"_p_std__vectorT_int_std__allocatorT_int_t_t", "std::vector< int,std::allocator< int > > *|std::vector< int > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t = {"_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t", "std::vector< std::complex< double > > *|std::vector< std::complex< double >,std::allocator< std::complex< double > > > *", 0, 0, (void*)0, 0};
@@ -29902,7 +29902,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_std__lessT_std__string_t,
   &_swigt__p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t,
   &_swigt__p_std__pairT_double_double_t,
-  &_swigt__p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t,
+  &_swigt__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t,
   &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t,
   &_swigt__p_std__vectorT_int_std__allocatorT_int_t_t,
   &_swigt__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t,
@@ -29962,7 +29962,7 @@ static swig_cast_info _swigc__p_std__invalid_argument[] = {  {&_swigt__p_std__in
 static swig_cast_info _swigc__p_std__lessT_std__string_t[] = {  {&_swigt__p_std__lessT_std__string_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t[] = {  {&_swigt__p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__pairT_double_double_t[] = {  {&_swigt__p_std__pairT_double_double_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t[] = {  {&_swigt__p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t[] = {  {&_swigt__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_double_std__allocatorT_double_t_t[] = {  {&_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_int_std__allocatorT_int_t_t[] = {  {&_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t[] = {  {&_swigt__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -30022,7 +30022,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_std__lessT_std__string_t,
   _swigc__p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t,
   _swigc__p_std__pairT_double_double_t,
-  _swigc__p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t,
+  _swigc__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t,
   _swigc__p_std__vectorT_double_std__allocatorT_double_t_t,
   _swigc__p_std__vectorT_int_std__allocatorT_int_t_t,
   _swigc__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t,
diff --git a/auto/Wrap/libBornAgainDevice.py b/auto/Wrap/libBornAgainDevice.py
index 825d7290899..549a0970cc5 100644
--- a/auto/Wrap/libBornAgainDevice.py
+++ b/auto/Wrap/libBornAgainDevice.py
@@ -2057,9 +2057,9 @@ class Datafield(object):
 
     def __init__(self, *args):
         r"""
-        __init__(Datafield self, std::vector< IAxis *,std::allocator< IAxis * > > const & axes) -> Datafield
-        __init__(Datafield self, std::vector< IAxis *,std::allocator< IAxis * > > const & axes, vdouble1d_t values) -> Datafield
-        __init__(Datafield self, std::vector< IAxis *,std::allocator< IAxis * > > const & axes, vdouble1d_t values, vdouble1d_t errSigmas) -> Datafield
+        __init__(Datafield self, std::vector< IAxis const *,std::allocator< IAxis const * > > const & axes) -> Datafield
+        __init__(Datafield self, std::vector< IAxis const *,std::allocator< IAxis const * > > const & axes, vdouble1d_t values) -> Datafield
+        __init__(Datafield self, std::vector< IAxis const *,std::allocator< IAxis const * > > const & axes, vdouble1d_t values, vdouble1d_t errSigmas) -> Datafield
         __init__(Datafield self, Datafield arg2) -> Datafield
         Datafield::Datafield(Datafield &&)=default
         Datafield::Datafield
diff --git a/auto/Wrap/libBornAgainDevice_wrap.cpp b/auto/Wrap/libBornAgainDevice_wrap.cpp
index c3dd4621ea5..1ade8cad773 100644
--- a/auto/Wrap/libBornAgainDevice_wrap.cpp
+++ b/auto/Wrap/libBornAgainDevice_wrap.cpp
@@ -3172,27 +3172,26 @@ namespace Swig {
 #define SWIGTYPE_p_std__shared_ptrT_IAxis_t swig_types[72]
 #define SWIGTYPE_p_std__vectorT_DiffuseElement_std__allocatorT_DiffuseElement_t_t swig_types[73]
 #define SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t swig_types[74]
-#define SWIGTYPE_p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t swig_types[75]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[76]
-#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[77]
-#define SWIGTYPE_p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t swig_types[78]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[79]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[80]
-#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[81]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[82]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[83]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[84]
-#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[85]
-#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[86]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[87]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[88]
-#define SWIGTYPE_p_unsigned_char swig_types[89]
-#define SWIGTYPE_p_unsigned_int swig_types[90]
-#define SWIGTYPE_p_unsigned_long_long swig_types[91]
-#define SWIGTYPE_p_unsigned_short swig_types[92]
-#define SWIGTYPE_p_value_type swig_types[93]
-static swig_type_info *swig_types[95];
-static swig_module_info swig_module = {swig_types, 94, 0, 0, 0, 0};
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[75]
+#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[76]
+#define SWIGTYPE_p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t swig_types[77]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[78]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[79]
+#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[80]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[81]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[82]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[83]
+#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[84]
+#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[85]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[86]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[87]
+#define SWIGTYPE_p_unsigned_char swig_types[88]
+#define SWIGTYPE_p_unsigned_int swig_types[89]
+#define SWIGTYPE_p_unsigned_long_long swig_types[90]
+#define SWIGTYPE_p_unsigned_short swig_types[91]
+#define SWIGTYPE_p_value_type swig_types[92]
+static swig_type_info *swig_types[94];
+static swig_module_info swig_module = {swig_types, 93, 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)
 
@@ -26980,21 +26979,21 @@ SWIGINTERN PyObject *vector_R3_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject
 
 SWIGINTERN PyObject *_wrap_new_Datafield__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  std::vector< IAxis *,std::allocator< IAxis * > > *arg1 = 0 ;
+  std::vector< IAxis const *,std::allocator< IAxis const * > > *arg1 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   Datafield *result = 0 ;
   
   if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis *,std::allocator< IAxis * > > const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis *,std::allocator< IAxis * > > const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > const &""'"); 
   }
-  arg1 = reinterpret_cast< std::vector< IAxis *,std::allocator< IAxis * > > * >(argp1);
-  result = (Datafield *)new Datafield((std::vector< IAxis *,std::allocator< IAxis * > > const &)*arg1);
+  arg1 = reinterpret_cast< std::vector< IAxis const *,std::allocator< IAxis const * > > * >(argp1);
+  result = (Datafield *)new Datafield((std::vector< IAxis const *,std::allocator< IAxis const * > > const &)*arg1);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Datafield, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
@@ -27004,7 +27003,7 @@ fail:
 
 SWIGINTERN PyObject *_wrap_new_Datafield__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  std::vector< IAxis *,std::allocator< IAxis * > > *arg1 = 0 ;
+  std::vector< IAxis const *,std::allocator< IAxis const * > > *arg1 = 0 ;
   std::vector< double,std::allocator< double > > *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -27012,14 +27011,14 @@ SWIGINTERN PyObject *_wrap_new_Datafield__SWIG_1(PyObject *SWIGUNUSEDPARM(self),
   Datafield *result = 0 ;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis *,std::allocator< IAxis * > > const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis *,std::allocator< IAxis * > > const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > const &""'"); 
   }
-  arg1 = reinterpret_cast< std::vector< IAxis *,std::allocator< IAxis * > > * >(argp1);
+  arg1 = reinterpret_cast< std::vector< IAxis const *,std::allocator< IAxis const * > > * >(argp1);
   {
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
     res2 = swig::asptr(swig_obj[1], &ptr);
@@ -27031,7 +27030,7 @@ SWIGINTERN PyObject *_wrap_new_Datafield__SWIG_1(PyObject *SWIGUNUSEDPARM(self),
     }
     arg2 = ptr;
   }
-  result = (Datafield *)new Datafield((std::vector< IAxis *,std::allocator< IAxis * > > const &)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
+  result = (Datafield *)new Datafield((std::vector< IAxis const *,std::allocator< IAxis const * > > const &)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Datafield, SWIG_POINTER_NEW |  0 );
   if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
@@ -27043,7 +27042,7 @@ fail:
 
 SWIGINTERN PyObject *_wrap_new_Datafield__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  std::vector< IAxis *,std::allocator< IAxis * > > *arg1 = 0 ;
+  std::vector< IAxis const *,std::allocator< IAxis const * > > *arg1 = 0 ;
   std::vector< double,std::allocator< double > > *arg2 = 0 ;
   std::vector< double,std::allocator< double > > *arg3 = 0 ;
   void *argp1 = 0 ;
@@ -27053,14 +27052,14 @@ SWIGINTERN PyObject *_wrap_new_Datafield__SWIG_2(PyObject *SWIGUNUSEDPARM(self),
   Datafield *result = 0 ;
   
   if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis *,std::allocator< IAxis * > > const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis *,std::allocator< IAxis * > > const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > const &""'"); 
   }
-  arg1 = reinterpret_cast< std::vector< IAxis *,std::allocator< IAxis * > > * >(argp1);
+  arg1 = reinterpret_cast< std::vector< IAxis const *,std::allocator< IAxis const * > > * >(argp1);
   {
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
     res2 = swig::asptr(swig_obj[1], &ptr);
@@ -27083,7 +27082,7 @@ SWIGINTERN PyObject *_wrap_new_Datafield__SWIG_2(PyObject *SWIGUNUSEDPARM(self),
     }
     arg3 = ptr;
   }
-  result = (Datafield *)new Datafield((std::vector< IAxis *,std::allocator< IAxis * > > const &)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  result = (Datafield *)new Datafield((std::vector< IAxis const *,std::allocator< IAxis const * > > const &)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Datafield, SWIG_POINTER_NEW |  0 );
   if (SWIG_IsNewObj(res2)) delete arg2;
   if (SWIG_IsNewObj(res3)) delete arg3;
@@ -27129,7 +27128,7 @@ SWIGINTERN PyObject *_wrap_new_Datafield(PyObject *self, PyObject *args) {
   --argc;
   if (argc == 1) {
     int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       return _wrap_new_Datafield__SWIG_0(self, argc, argv);
@@ -27146,7 +27145,7 @@ SWIGINTERN PyObject *_wrap_new_Datafield(PyObject *self, PyObject *args) {
   }
   if (argc == 2) {
     int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
@@ -27158,7 +27157,7 @@ SWIGINTERN PyObject *_wrap_new_Datafield(PyObject *self, PyObject *args) {
   }
   if (argc == 3) {
     int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
@@ -27176,9 +27175,9 @@ SWIGINTERN PyObject *_wrap_new_Datafield(PyObject *self, PyObject *args) {
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_Datafield'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    Datafield::Datafield(std::vector< IAxis *,std::allocator< IAxis * > > const &)\n"
-    "    Datafield::Datafield(std::vector< IAxis *,std::allocator< IAxis * > > const &,std::vector< double,std::allocator< double > > const &)\n"
-    "    Datafield::Datafield(std::vector< IAxis *,std::allocator< IAxis * > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &)\n"
+    "    Datafield::Datafield(std::vector< IAxis const *,std::allocator< IAxis const * > > const &)\n"
+    "    Datafield::Datafield(std::vector< IAxis const *,std::allocator< IAxis const * > > const &,std::vector< double,std::allocator< double > > const &)\n"
+    "    Datafield::Datafield(std::vector< IAxis const *,std::allocator< IAxis const * > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &)\n"
     "    Datafield::Datafield(Datafield &&)\n");
   return 0;
 }
@@ -37930,9 +37929,9 @@ static PyMethodDef SwigMethods[] = {
 	 { "vector_R3_swigregister", vector_R3_swigregister, METH_O, NULL},
 	 { "vector_R3_swiginit", vector_R3_swiginit, METH_VARARGS, NULL},
 	 { "new_Datafield", _wrap_new_Datafield, METH_VARARGS, "\n"
-		"Datafield(std::vector< IAxis *,std::allocator< IAxis * > > const & axes)\n"
-		"Datafield(std::vector< IAxis *,std::allocator< IAxis * > > const & axes, vdouble1d_t values)\n"
-		"Datafield(std::vector< IAxis *,std::allocator< IAxis * > > const & axes, vdouble1d_t values, vdouble1d_t errSigmas)\n"
+		"Datafield(std::vector< IAxis const *,std::allocator< IAxis const * > > const & axes)\n"
+		"Datafield(std::vector< IAxis const *,std::allocator< IAxis const * > > const & axes, vdouble1d_t values)\n"
+		"Datafield(std::vector< IAxis const *,std::allocator< IAxis const * > > const & axes, vdouble1d_t values, vdouble1d_t errSigmas)\n"
 		"new_Datafield(Datafield arg1) -> Datafield\n"
 		"Datafield::Datafield(Datafield &&)=default\n"
 		"Datafield::Datafield\n"
@@ -39510,7 +39509,6 @@ static swig_type_info _swigt__p_std__pairT_double_double_t = {"_p_std__pairT_dou
 static swig_type_info _swigt__p_std__shared_ptrT_IAxis_t = {"_p_std__shared_ptrT_IAxis_t", "std::shared_ptr< IAxis > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_DiffuseElement_std__allocatorT_DiffuseElement_t_t = {"_p_std__vectorT_DiffuseElement_std__allocatorT_DiffuseElement_t_t", "std::vector< DiffuseElement,std::allocator< DiffuseElement > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t = {"_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t", "std::vector< IAxis const *,std::allocator< IAxis const * > > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t = {"_p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t", "std::vector< IAxis *,std::allocator< IAxis * > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t = {"_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t", "std::vector< INode const *,std::allocator< INode const * > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t = {"_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t", "std::vector< ParaMeta,std::allocator< ParaMeta > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t = {"_p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t", "std::vector< Vec3< double > > *|std::vector< Vec3< double >,std::allocator< Vec3< double > > > *", 0, 0, (void*)0, 0};
@@ -39606,7 +39604,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_std__shared_ptrT_IAxis_t,
   &_swigt__p_std__vectorT_DiffuseElement_std__allocatorT_DiffuseElement_t_t,
   &_swigt__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t,
-  &_swigt__p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t,
   &_swigt__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t,
   &_swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,
   &_swigt__p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t,
@@ -39702,7 +39699,6 @@ static swig_cast_info _swigc__p_std__pairT_double_double_t[] = {  {&_swigt__p_st
 static swig_cast_info _swigc__p_std__shared_ptrT_IAxis_t[] = {  {&_swigt__p_std__shared_ptrT_IAxis_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_DiffuseElement_std__allocatorT_DiffuseElement_t_t[] = {  {&_swigt__p_std__vectorT_DiffuseElement_std__allocatorT_DiffuseElement_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t[] = {  {&_swigt__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t[] = {  {&_swigt__p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t[] = {  {&_swigt__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t[] = {  {&_swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t[] = {  {&_swigt__p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -39798,7 +39794,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_std__shared_ptrT_IAxis_t,
   _swigc__p_std__vectorT_DiffuseElement_std__allocatorT_DiffuseElement_t_t,
   _swigc__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t,
-  _swigc__p_std__vectorT_IAxis_p_std__allocatorT_IAxis_p_t_t,
   _swigc__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t,
   _swigc__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,
   _swigc__p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t,
-- 
GitLab