From 69557388586966ee3cbe04ed87a12d755122841c Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 13 Apr 2023 14:30:43 +0200
Subject: [PATCH 1/8] rm unused include

---
 Device/Coord/ICoordSystem.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/Device/Coord/ICoordSystem.cpp b/Device/Coord/ICoordSystem.cpp
index 7e41e822229..bc481d51271 100644
--- a/Device/Coord/ICoordSystem.cpp
+++ b/Device/Coord/ICoordSystem.cpp
@@ -14,7 +14,6 @@
 
 #include "Device/Coord/ICoordSystem.h"
 #include "Base/Util/Assert.h"
-#include <sstream>
 
 ICoordSystem::~ICoordSystem() = default;
 
-- 
GitLab


From be3ac6933b29324ef86ab76db0d9e5a9f83e446c Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 13 Apr 2023 14:31:18 +0200
Subject: [PATCH 2/8] rm unused include

---
 Base/Axis/Frame.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/Base/Axis/Frame.cpp b/Base/Axis/Frame.cpp
index 1419a2f766d..1e02a36b844 100644
--- a/Base/Axis/Frame.cpp
+++ b/Base/Axis/Frame.cpp
@@ -13,7 +13,6 @@
 //  ************************************************************************************************
 
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/Bin.h"
 #include "Base/Axis/IAxis.h"
 #include "Base/Util/Assert.h"
 
-- 
GitLab


From 2fb4d8a2f61a72af27dfe61fcbd42e130a79f6ae Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 13 Apr 2023 15:29:42 +0200
Subject: [PATCH 3/8] + FramUtil::product_size

---
 Base/Axis/FrameUtil.cpp | 10 ++++++++++
 Base/Axis/FrameUtil.h   |  6 ++++++
 2 files changed, 16 insertions(+)

diff --git a/Base/Axis/FrameUtil.cpp b/Base/Axis/FrameUtil.cpp
index 8d99b7bf826..dde6d5ab92a 100644
--- a/Base/Axis/FrameUtil.cpp
+++ b/Base/Axis/FrameUtil.cpp
@@ -17,6 +17,16 @@
 #include "Base/Axis/Frame.h"
 #include "Base/Axis/IAxis.h"
 
+size_t FramUtil::product_size(const std::vector<const IAxis*>& axes)
+{
+    if (axes.empty())
+        return 0;
+    size_t result = 1;
+    for (const IAxis* ax : axes)
+        result *= ax->size();
+    return result;
+}
+
 // For axis FixedBinAxis("axis", 8, -5.0, 3.0) the coordinate x=-4.5 (center of bin #0) will
 // be converted into 0.5 (which is a bin center expressed in bin fraction coordinates).
 // The coordinate -5.0 (outside of axis definition) will be converted to -0.5
diff --git a/Base/Axis/FrameUtil.h b/Base/Axis/FrameUtil.h
index fcc5ba14e1e..f59c7114fbb 100644
--- a/Base/Axis/FrameUtil.h
+++ b/Base/Axis/FrameUtil.h
@@ -15,11 +15,17 @@
 #ifndef BORNAGAIN_BASE_AXIS_FRAMEUTIL_H
 #define BORNAGAIN_BASE_AXIS_FRAMEUTIL_H
 
+#include <cstddef>
+#include <vector>
+
 class Frame;
 class IAxis;
 
 namespace FramUtil {
 
+//! Product of axis sizes.
+size_t product_size(const std::vector<const IAxis*>& axes);
+
 //! Transforms coordinate on axis into the bin-fraction-coordinate.
 double coordinateToBinf(double coordinate, const IAxis& axis);
 
-- 
GitLab


From a4ea7ca453643e1f1fa2f3bcb2137343a8dac536 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 13 Apr 2023 15:30:18 +0200
Subject: [PATCH 4/8] rename -> FrameUtil

---
 Base/Axis/FrameUtil.cpp                       | 12 ++++----
 Base/Axis/FrameUtil.h                         |  6 ++--
 GUI/Model/Data/MaskUnitsConverter.cpp         | 12 ++++----
 .../Device/IntensityDataFunctionsTest.cpp     | 28 +++++++++----------
 4 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/Base/Axis/FrameUtil.cpp b/Base/Axis/FrameUtil.cpp
index dde6d5ab92a..02d4f129f08 100644
--- a/Base/Axis/FrameUtil.cpp
+++ b/Base/Axis/FrameUtil.cpp
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit reflection and scattering
 //
 //! @file      Base/Axis/FrameUtil.cpp
-//! @brief     Implements namespace FramUtil.
+//! @brief     Implements namespace FrameUtil.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -17,7 +17,7 @@
 #include "Base/Axis/Frame.h"
 #include "Base/Axis/IAxis.h"
 
-size_t FramUtil::product_size(const std::vector<const IAxis*>& axes)
+size_t FrameUtil::product_size(const std::vector<const IAxis*>& axes)
 {
     if (axes.empty())
         return 0;
@@ -33,7 +33,7 @@ size_t FramUtil::product_size(const std::vector<const IAxis*>& axes)
 // (center of non-existing bin #-1).
 // Used for Mask conversion.
 
-double FramUtil::coordinateToBinf(double coordinate, const IAxis& axis)
+double FrameUtil::coordinateToBinf(double coordinate, const IAxis& axis)
 {
     size_t index = axis.findClosestIndex(coordinate);
     Bin1D bin = axis.bin(index);
@@ -41,7 +41,7 @@ double FramUtil::coordinateToBinf(double coordinate, const IAxis& axis)
     return static_cast<double>(index) + f;
 }
 
-double FramUtil::coordinateFromBinf(double value, const IAxis& axis)
+double FrameUtil::coordinateFromBinf(double value, const IAxis& axis)
 {
     int index = static_cast<int>(value);
 
@@ -60,13 +60,13 @@ double FramUtil::coordinateFromBinf(double value, const IAxis& axis)
     return result;
 }
 
-void FramUtil::coordinatesToBinf(double& x, double& y, const Frame& frame)
+void FrameUtil::coordinatesToBinf(double& x, double& y, const Frame& frame)
 {
     x = coordinateToBinf(x, frame.xAxis());
     y = coordinateToBinf(y, frame.yAxis());
 }
 
-void FramUtil::coordinatesFromBinf(double& x, double& y, const Frame& frame)
+void FrameUtil::coordinatesFromBinf(double& x, double& y, const Frame& frame)
 {
     x = coordinateFromBinf(x, frame.xAxis());
     y = coordinateFromBinf(y, frame.yAxis());
diff --git a/Base/Axis/FrameUtil.h b/Base/Axis/FrameUtil.h
index f59c7114fbb..28ad4ded0a5 100644
--- a/Base/Axis/FrameUtil.h
+++ b/Base/Axis/FrameUtil.h
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit reflection and scattering
 //
 //! @file      Base/Axis/FrameUtil.h
-//! @brief     Defines namespace FramUtil.
+//! @brief     Defines namespace FrameUtil.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -21,7 +21,7 @@
 class Frame;
 class IAxis;
 
-namespace FramUtil {
+namespace FrameUtil {
 
 //! Product of axis sizes.
 size_t product_size(const std::vector<const IAxis*>& axes);
@@ -38,6 +38,6 @@ void coordinatesToBinf(double& x, double& y, const Frame& frame);
 //! Transforms x,y coordinate from bin-fraction-coordinates to Datafield's axes coordinates.
 void coordinatesFromBinf(double& x, double& y, const Frame& frame);
 
-} // namespace FramUtil
+} // namespace FrameUtil
 
 #endif // BORNAGAIN_BASE_AXIS_FRAMEUTIL_H
diff --git a/GUI/Model/Data/MaskUnitsConverter.cpp b/GUI/Model/Data/MaskUnitsConverter.cpp
index 5e0c2ce3a2a..7c5c4291da0 100644
--- a/GUI/Model/Data/MaskUnitsConverter.cpp
+++ b/GUI/Model/Data/MaskUnitsConverter.cpp
@@ -86,11 +86,11 @@ void MaskUnitsConverter::convertMask(MaskItem* maskItem)
         double y2 = yc + yR;
 
         if (m_direction == TO_NBINS) {
-            FramUtil::coordinatesToBinf(xc, yc, m_data->frame());
-            FramUtil::coordinatesToBinf(x2, y2, m_data->frame());
+            FrameUtil::coordinatesToBinf(xc, yc, m_data->frame());
+            FrameUtil::coordinatesToBinf(x2, y2, m_data->frame());
         } else {
-            FramUtil::coordinatesFromBinf(xc, yc, m_data->frame());
-            FramUtil::coordinatesFromBinf(x2, y2, m_data->frame());
+            FrameUtil::coordinatesFromBinf(xc, yc, m_data->frame());
+            FrameUtil::coordinatesFromBinf(x2, y2, m_data->frame());
         }
         ellItem->setXCenter(xc);
         ellItem->setYCenter(yc);
@@ -109,8 +109,8 @@ double MaskUnitsConverter::convert(double value, Axis axis)
     ASSERT(axis_index == 0 || axis_index == 1);
 
     if (m_direction == TO_NBINS)
-        return FramUtil::coordinateToBinf(value, m_data->axis(axis_index));
+        return FrameUtil::coordinateToBinf(value, m_data->axis(axis_index));
     if (m_direction == FROM_NBINS)
-        return FramUtil::coordinateFromBinf(value, m_data->axis(axis_index));
+        return FrameUtil::coordinateFromBinf(value, m_data->axis(axis_index));
     ASSERT(false);
 }
diff --git a/Tests/Unit/Device/IntensityDataFunctionsTest.cpp b/Tests/Unit/Device/IntensityDataFunctionsTest.cpp
index fc87d29022c..7e72414d524 100644
--- a/Tests/Unit/Device/IntensityDataFunctionsTest.cpp
+++ b/Tests/Unit/Device/IntensityDataFunctionsTest.cpp
@@ -65,20 +65,20 @@ TEST(DataUtilsTest, createRearrangedDataSet)
 TEST(DataUtilsTest, coordinateToFromBinf)
 {
     FixedBinAxis axis("axis", 8, -5.0, 3.0);
-    EXPECT_EQ(0.5, FramUtil::coordinateToBinf(-4.5, axis));
-    EXPECT_EQ(-4.5, FramUtil::coordinateFromBinf(0.5, axis));
+    EXPECT_EQ(0.5, FrameUtil::coordinateToBinf(-4.5, axis));
+    EXPECT_EQ(-4.5, FrameUtil::coordinateFromBinf(0.5, axis));
 
-    EXPECT_EQ(1.0, FramUtil::coordinateToBinf(-4.0, axis));
-    EXPECT_EQ(-4.0, FramUtil::coordinateFromBinf(1.0, axis));
+    EXPECT_EQ(1.0, FrameUtil::coordinateToBinf(-4.0, axis));
+    EXPECT_EQ(-4.0, FrameUtil::coordinateFromBinf(1.0, axis));
 
-    EXPECT_EQ(-0.5, FramUtil::coordinateToBinf(-5.5, axis));
-    EXPECT_EQ(-5.5, FramUtil::coordinateFromBinf(-0.5, axis));
+    EXPECT_EQ(-0.5, FrameUtil::coordinateToBinf(-5.5, axis));
+    EXPECT_EQ(-5.5, FrameUtil::coordinateFromBinf(-0.5, axis));
 
-    EXPECT_EQ(8.0, FramUtil::coordinateToBinf(3.0, axis));
-    EXPECT_EQ(3.0, FramUtil::coordinateFromBinf(8.0, axis));
+    EXPECT_EQ(8.0, FrameUtil::coordinateToBinf(3.0, axis));
+    EXPECT_EQ(3.0, FrameUtil::coordinateFromBinf(8.0, axis));
 
-    EXPECT_EQ(8.5, FramUtil::coordinateToBinf(3.5, axis));
-    EXPECT_EQ(3.5, FramUtil::coordinateFromBinf(8.5, axis));
+    EXPECT_EQ(8.5, FrameUtil::coordinateToBinf(3.5, axis));
+    EXPECT_EQ(3.5, FrameUtil::coordinateFromBinf(8.5, axis));
 }
 
 //! Transformation of coordinates from one Datafield to another using conversion from axes
@@ -91,15 +91,15 @@ TEST(DataUtilsTest, datafieldToFromBinf)
         {new FixedBinAxis("axis0", 8, -10.0, 70.0), new FixedBinAxis("axis1", 3, -10.0, 20.0)});
 
     double x(-4.5), y(2.5);
-    FramUtil::coordinatesToBinf(x, y, data1);
-    FramUtil::coordinatesFromBinf(x, y, data2);
+    FrameUtil::coordinatesToBinf(x, y, data1);
+    FrameUtil::coordinatesFromBinf(x, y, data2);
     EXPECT_DOUBLE_EQ(x, -5.0);
     EXPECT_DOUBLE_EQ(y, -5.0);
 
     x = 3.1;
     y = 5.1;
-    FramUtil::coordinatesToBinf(x, y, data1);
-    FramUtil::coordinatesFromBinf(x, y, data2);
+    FrameUtil::coordinatesToBinf(x, y, data1);
+    FrameUtil::coordinatesFromBinf(x, y, data2);
     EXPECT_DOUBLE_EQ(x, 71.0);
     EXPECT_DOUBLE_EQ(y, 21.0);
 }
-- 
GitLab


From b13fb717cd8c8e4cc98794cc5b5b7a00198e60ed Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 13 Apr 2023 15:32:03 +0200
Subject: [PATCH 5/8] use it

---
 Base/Axis/Frame.cpp | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/Base/Axis/Frame.cpp b/Base/Axis/Frame.cpp
index 1e02a36b844..5f50664370e 100644
--- a/Base/Axis/Frame.cpp
+++ b/Base/Axis/Frame.cpp
@@ -13,17 +13,14 @@
 //  ************************************************************************************************
 
 #include "Base/Axis/Frame.h"
+#include "Base/Axis/FrameUtil.h"
 #include "Base/Axis/IAxis.h"
 #include "Base/Util/Assert.h"
 
 Frame::Frame(const std::vector<const IAxis*>& axes)
     : m_axes(axes)
-    , m_size(1)
+    , m_size(FrameUtil::product_size(axes))
 {
-    for (size_t k = 0; k < rank(); ++k) {
-        ASSERT(axis(k).size() > 0);
-        m_size *= axis(k).size();
-    }
 }
 
 Frame* Frame::clone() const
-- 
GitLab


From 6ed467c781d5f920e53a24df480c15797274a090 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 13 Apr 2023 15:32:56 +0200
Subject: [PATCH 6/8] provide ICoordSystem::size

---
 Device/Coord/ICoordSystem.cpp | 12 ++++++++++++
 Device/Coord/ICoordSystem.h   |  9 +++++----
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/Device/Coord/ICoordSystem.cpp b/Device/Coord/ICoordSystem.cpp
index bc481d51271..92d59f2c815 100644
--- a/Device/Coord/ICoordSystem.cpp
+++ b/Device/Coord/ICoordSystem.cpp
@@ -13,8 +13,15 @@
 //  ************************************************************************************************
 
 #include "Device/Coord/ICoordSystem.h"
+#include "Base/Axis/FrameUtil.h"
 #include "Base/Util/Assert.h"
 
+ICoordSystem::ICoordSystem(std::vector<const IAxis*> axes)
+    : m_axes(axes)
+    , m_size(FrameUtil::product_size(axes))
+{
+}
+
 ICoordSystem::~ICoordSystem() = default;
 
 std::vector<const IAxis*> ICoordSystem::defaultAxes() const
@@ -27,6 +34,11 @@ size_t ICoordSystem::rank() const
     return m_axes.size();
 }
 
+size_t ICoordSystem::size() const
+{
+    return m_size;
+}
+
 std::vector<const IAxis*> ICoordSystem::convertedAxes(Coords units) const
 {
     std::vector<const IAxis*> result;
diff --git a/Device/Coord/ICoordSystem.h b/Device/Coord/ICoordSystem.h
index 5351c8e7725..ff7356ea91a 100644
--- a/Device/Coord/ICoordSystem.h
+++ b/Device/Coord/ICoordSystem.h
@@ -35,15 +35,13 @@ class IAxis;
 
 class ICoordSystem : public ICloneable {
 public:
-    ICoordSystem(std::vector<const IAxis*> axes)
-        : m_axes(axes)
-    {
-    }
+    ICoordSystem(std::vector<const IAxis*> axes);
     ~ICoordSystem() override;
 
     ICoordSystem* clone() const override = 0;
 
     size_t rank() const;
+    size_t size() const;
 
     virtual double calculateMin(size_t i_axis, Coords units) const = 0;
     virtual double calculateMax(size_t i_axis, Coords units) const = 0;
@@ -62,6 +60,9 @@ protected:
     Coords substituteDefaultUnits(Coords units) const;
 
     std::vector<const IAxis*> m_axes;
+
+private:
+    size_t m_size; // cached product of axis sizes
 };
 
 #endif // BORNAGAIN_DEVICE_COORD_ICOORDSYSTEM_H
-- 
GitLab


From 22d1e5874dbe5f1b1bfd61dbf0be8fb6f069f965 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 13 Apr 2023 15:34:59 +0200
Subject: [PATCH 7/8] use it

---
 Device/Histo/SimulationResult.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Device/Histo/SimulationResult.cpp b/Device/Histo/SimulationResult.cpp
index 8cdfd547448..89a2740fc32 100644
--- a/Device/Histo/SimulationResult.cpp
+++ b/Device/Histo/SimulationResult.cpp
@@ -44,12 +44,12 @@ SimulationResult& SimulationResult::operator=(SimulationResult&& other) noexcept
 
 size_t SimulationResult::rank() const
 {
-    return m_data->rank();
+    return m_coordsys ? m_coordsys->rank() : 0;
 }
 
 size_t SimulationResult::size() const
 {
-    return m_data ? m_data->size() : 0;
+    return m_coordsys ? m_coordsys->size() : 0;
 }
 
 bool SimulationResult::empty() const
-- 
GitLab


From 36a7e54330a53a5478513e4cba395a07e9221189 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 13 Apr 2023 15:52:43 +0200
Subject: [PATCH 8/8] Datafield::scaled modify out of place

---
 Device/Data/Datafield.cpp                     | 20 ++++++++++++++-----
 Device/Data/Datafield.h                       |  4 ++--
 Examples/fit/specular/Honeycomb_fit.py        |  3 +--
 .../specular/RealLifeReflectometryFitting.py  |  2 +-
 auto/Wrap/libBornAgainDevice.py               |  6 +++---
 auto/Wrap/libBornAgainDevice_wrap.cpp         | 15 +++++++-------
 6 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/Device/Data/Datafield.cpp b/Device/Data/Datafield.cpp
index 1b151691ce7..43619e775c1 100644
--- a/Device/Data/Datafield.cpp
+++ b/Device/Data/Datafield.cpp
@@ -149,14 +149,24 @@ const std::vector<double>& Datafield::flatVector() const
     return m_values;
 }
 
-void Datafield::scale(double factor)
+Datafield Datafield::scaled(double factor) const
 {
-    for (size_t i = 0; i < frame().size(); ++i)
-        m_values[i] *= factor;
+    size_t N = frame().size();
 
-    if (!m_errSigmas.empty())
+    std::vector<double> out_val;
+    std::vector<double> out_err;
+
+    out_val.resize(N);
+    for (size_t i = 0; i < N; ++i)
+        out_val[i] = factor * m_values[i];
+
+    if (!m_errSigmas.empty()) {
+        out_err.resize(N);
         for (size_t i = 0; i < frame().size(); ++i)
-            m_errSigmas[i] *= factor;
+            out_err[i] = factor * m_errSigmas[i];
+    }
+
+    return Datafield(frame().clone(), out_val, out_err);
 }
 
 double Datafield::maxVal() const
diff --git a/Device/Data/Datafield.h b/Device/Data/Datafield.h
index d2a7245d422..5f1d465c28e 100644
--- a/Device/Data/Datafield.h
+++ b/Device/Data/Datafield.h
@@ -78,8 +78,8 @@ public:
 
     const double& operator[](size_t i) const;
 
-    //! Multiplies contents by constant factor
-    void scale(double factor);
+    //! Returns Datafield with contents multiplied by constant factor
+    Datafield scaled(double factor) const;
 
     // helpers
 
diff --git a/Examples/fit/specular/Honeycomb_fit.py b/Examples/fit/specular/Honeycomb_fit.py
index e2199b0f29e..4fc812abf2e 100755
--- a/Examples/fit/specular/Honeycomb_fit.py
+++ b/Examples/fit/specular/Honeycomb_fit.py
@@ -82,7 +82,7 @@ def get_simulation(q_axis, parameters, sign, ms150=False):
     dq = parameters["dq"]*q_axis
     scan = ba.QzScan(q_axis)
     scan.setVectorResolution(q_distr, dq)
-
+    scan.setIntensity(parameters["intensity"])
 
     if ms150:
         sample = get_sample(parameters=parameters,
@@ -102,7 +102,6 @@ def run_simulation(q_axis, fitParams, *, sign, ms150=False):
 
     simulation = get_simulation(q_axis, parameters, sign, ms150)
     result = simulation.simulate()
-    result.data_field().scale(parameters["intensity"])
     return result
 
 
diff --git a/Examples/fit/specular/RealLifeReflectometryFitting.py b/Examples/fit/specular/RealLifeReflectometryFitting.py
index 9f34368f3d1..bb3277c0bb4 100755
--- a/Examples/fit/specular/RealLifeReflectometryFitting.py
+++ b/Examples/fit/specular/RealLifeReflectometryFitting.py
@@ -99,6 +99,7 @@ def create_simulation(sample, arg_dict, bin_start, bin_end):
     scan = ba.AlphaScan(wavelength, get_real_data_axis(bin_start, bin_end))
     scan.setAngleDistribution(alpha_distr)
     scan.setFootprintFactor(footprint)
+    scan.setIntensity(arg_dict["intensity"])
 
     simulation = ba.SpecularSimulation(scan, sample)
     return simulation
@@ -141,7 +142,6 @@ def run_simulation(arg_dict, bin_start=0, bin_end=-1):
     simulation = create_simulation(sample, arg_dict, bin_start, bin_end)
 
     result = simulation.simulate()
-    result.data_field().scale(arg_dict["intensity"])
 
     return result
 
diff --git a/auto/Wrap/libBornAgainDevice.py b/auto/Wrap/libBornAgainDevice.py
index 63f81d62177..6aac3f95b9e 100644
--- a/auto/Wrap/libBornAgainDevice.py
+++ b/auto/Wrap/libBornAgainDevice.py
@@ -2116,9 +2116,9 @@ class Datafield(object):
         r"""setVector(Datafield self, vdouble1d_t data_vector)"""
         return _libBornAgainDevice.Datafield_setVector(self, data_vector)
 
-    def scale(self, factor):
-        r"""scale(Datafield self, double factor)"""
-        return _libBornAgainDevice.Datafield_scale(self, factor)
+    def scaled(self, factor):
+        r"""scaled(Datafield self, double factor) -> Datafield"""
+        return _libBornAgainDevice.Datafield_scaled(self, factor)
 
     def hasSameSizes(self, other):
         r"""hasSameSizes(Datafield self, Datafield other) -> bool"""
diff --git a/auto/Wrap/libBornAgainDevice_wrap.cpp b/auto/Wrap/libBornAgainDevice_wrap.cpp
index c846d54d9de..de4d812d0c0 100644
--- a/auto/Wrap/libBornAgainDevice_wrap.cpp
+++ b/auto/Wrap/libBornAgainDevice_wrap.cpp
@@ -28247,7 +28247,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Datafield_scale(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Datafield_scaled(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
   Datafield *arg1 = (Datafield *) 0 ;
   double arg2 ;
@@ -28256,20 +28256,21 @@ SWIGINTERN PyObject *_wrap_Datafield_scale(PyObject *self, PyObject *args) {
   double val2 ;
   int ecode2 = 0 ;
   PyObject *swig_obj[2] ;
+  SwigValueWrapper< Datafield > result;
   
-  if (!SWIG_Python_UnpackTuple(args, "Datafield_scale", 2, 2, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "Datafield_scaled", 2, 2, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Datafield, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Datafield_scale" "', argument " "1"" of type '" "Datafield *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Datafield_scaled" "', argument " "1"" of type '" "Datafield const *""'"); 
   }
   arg1 = reinterpret_cast< Datafield * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Datafield_scale" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Datafield_scaled" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  (arg1)->scale(arg2);
-  resultobj = SWIG_Py_Void();
+  result = ((Datafield const *)arg1)->scaled(arg2);
+  resultobj = SWIG_NewPointerObj((new Datafield(result)), SWIGTYPE_p_Datafield, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -38382,7 +38383,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "Datafield_minVal", _wrap_Datafield_minVal, METH_O, "Datafield_minVal(Datafield self) -> double"},
 	 { "Datafield_setAllTo", _wrap_Datafield_setAllTo, METH_VARARGS, "Datafield_setAllTo(Datafield self, double const & value)"},
 	 { "Datafield_setVector", _wrap_Datafield_setVector, METH_VARARGS, "Datafield_setVector(Datafield self, vdouble1d_t data_vector)"},
-	 { "Datafield_scale", _wrap_Datafield_scale, METH_VARARGS, "Datafield_scale(Datafield self, double factor)"},
+	 { "Datafield_scaled", _wrap_Datafield_scaled, METH_VARARGS, "Datafield_scaled(Datafield self, double factor) -> Datafield"},
 	 { "Datafield_hasSameSizes", _wrap_Datafield_hasSameSizes, METH_VARARGS, "Datafield_hasSameSizes(Datafield self, Datafield other) -> bool"},
 	 { "Datafield_hasSameShape", _wrap_Datafield_hasSameShape, METH_VARARGS, "Datafield_hasSameShape(Datafield self, Datafield other) -> bool"},
 	 { "Datafield_crop", _wrap_Datafield_crop, METH_VARARGS, "\n"
-- 
GitLab