From 560a023d4ddfd2979dd816d18f68f5b6289b70ad Mon Sep 17 00:00:00 2001
From: Joachim Wuttke <j.wuttke@fz-juelich.de>
Date: Fri, 7 Apr 2023 14:02:07 +0200
Subject: [PATCH] lift calls to itemToAxis to children of InstrumentItems

---
 GUI/Model/Device/InstrumentItems.cpp | 38 ++++++++++++++++++----------
 GUI/Model/Device/InstrumentItems.h   |  3 ++-
 2 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/GUI/Model/Device/InstrumentItems.cpp b/GUI/Model/Device/InstrumentItems.cpp
index 2cdf4d054bf..82b9e879a92 100644
--- a/GUI/Model/Device/InstrumentItems.cpp
+++ b/GUI/Model/Device/InstrumentItems.cpp
@@ -284,11 +284,11 @@ ScanningFunctionality::ScanningFunctionality(InstrumentItem* instrument, double
     m_scanItem->intensity().setValue(intensity); // overwrite default value set by BeamItem c'tor
 }
 
-std::unique_ptr<IBeamScan> ScanningFunctionality::createScan() const
+//! Takes ownership of argument 'axis'.
+std::unique_ptr<IBeamScan> ScanningFunctionality::createScan(const IAxis& axis) const
 {
-    BasicAxisItem* const axis_item = scanItem()->inclinationAxisItem();
+    auto result = std::make_unique<AlphaScan>(axis);
 
-    auto result = std::make_unique<AlphaScan>(*axis_item->itemToAxis(Units::deg));
     result->setIntensity(scanItem()->intensity());
 
     FootprintItemCatalog::CatalogedType* const footprint_item =
@@ -429,7 +429,10 @@ std::unique_ptr<const ICoordSystem> SpecularInstrumentItem::createCoordSystem()
 
 ISimulation* SpecularInstrumentItem::createSimulation(const MultiLayer& sample) const
 {
-    return new SpecularSimulation(*createScan(), sample);
+    BasicAxisItem* const axis_item = scanItem()->inclinationAxisItem();
+    std::unique_ptr<IAxis> axis = axis_item->itemToAxis(Units::deg);
+    std::unique_ptr<IBeamScan> scan = createScan(*axis);
+    return new SpecularSimulation(*scan, sample);
 }
 
 void SpecularInstrumentItem::writeTo(QXmlStreamWriter* w) const
@@ -504,15 +507,19 @@ std::unique_ptr<const ICoordSystem> DepthprobeInstrumentItem::createCoordSystem(
     // https://jugit.fz-juelich.de/mlz/bornagain/-/issues/478
     // https://jugit.fz-juelich.de/mlz/bornagain/-/issues/505
 
-    std::unique_ptr<IBeamScan> scan = createScan();
-    std::vector<const IAxis*> axes(
-        {scan->coordinateAxis()->clone(), m_zAxis.createAxis(1.)->clone()});
-    return std::make_unique<DepthprobeCoords>(axes, M_TWOPI / scan->wavelength());
+    BasicAxisItem* const axis_item = scanItem()->inclinationAxisItem();
+    std::unique_ptr<IAxis> axis = axis_item->itemToAxis(Units::deg);
+
+    std::vector<const IAxis*> axes({axis.release(), m_zAxis.createAxis(1.)->clone()});
+    return std::make_unique<DepthprobeCoords>(axes, M_TWOPI / scanItem()->wavelength());
 }
 
 ISimulation* DepthprobeInstrumentItem::createSimulation(const MultiLayer& sample) const
 {
-    return new DepthprobeSimulation(*createScan(), sample, *m_zAxis.createAxis(1.));
+    BasicAxisItem* const axis_item = scanItem()->inclinationAxisItem();
+    std::unique_ptr<IAxis> axis = axis_item->itemToAxis(Units::deg);
+    std::unique_ptr<IBeamScan> scan = createScan(*axis);
+    return new DepthprobeSimulation(*scan, sample, *m_zAxis.createAxis(1.));
 }
 
 void DepthprobeInstrumentItem::writeTo(QXmlStreamWriter* w) const
@@ -596,9 +603,10 @@ void OffspecInstrumentItem::updateToRealData(const RealItem* dataItem)
 
 std::unique_ptr<const ICoordSystem> OffspecInstrumentItem::createCoordSystem() const
 {
-    return std::make_unique<OffspecCoords>(
-        std::vector<const IAxis*>{createScan()->coordinateAxis()->clone(),
-                                  detectorItem()->createOffspecDetector()->axis(1).clone()});
+    BasicAxisItem* const axis_item = scanItem()->inclinationAxisItem();
+    std::unique_ptr<IAxis> axis = axis_item->itemToAxis(Units::deg);
+    return std::make_unique<OffspecCoords>(std::vector<const IAxis*>{
+        axis.release(), detectorItem()->createOffspecDetector()->axis(1).clone()});
 }
 
 ISimulation* OffspecInstrumentItem::createSimulation(const MultiLayer& sample) const
@@ -606,7 +614,11 @@ ISimulation* OffspecInstrumentItem::createSimulation(const MultiLayer& sample) c
     const auto detector = detectorItem()->createOffspecDetector();
     detector->setAnalyzer(m_analyzerDirection, m_analyzerEfficiency, m_analyzerTotalTransmission);
 
-    auto* result = new OffspecSimulation(*createScan(), sample, *detector);
+    BasicAxisItem* const axis_item = scanItem()->inclinationAxisItem();
+    std::unique_ptr<IAxis> axis = axis_item->itemToAxis(Units::deg);
+    std::unique_ptr<IBeamScan> scan = createScan(*axis);
+
+    auto* result = new OffspecSimulation(*scan, sample, *detector);
 
     if (const auto background = backgroundItem()->createBackground())
         result->setBackground(*background);
diff --git a/GUI/Model/Device/InstrumentItems.h b/GUI/Model/Device/InstrumentItems.h
index 7b2c9e64271..1dd7bd15cfd 100644
--- a/GUI/Model/Device/InstrumentItems.h
+++ b/GUI/Model/Device/InstrumentItems.h
@@ -30,6 +30,7 @@
 class BackgroundItem;
 class DataItem;
 class DepthprobeSimulation;
+class IAxis;
 class IBeamScan;
 class ISimulation;
 class MaskContainerItem;
@@ -145,7 +146,7 @@ public:
     ScanningFunctionality(InstrumentItem* instrument, double intensity);
     ScanItem* scanItem() const { return m_scanItem.get(); }
 
-    std::unique_ptr<IBeamScan> createScan() const;
+    std::unique_ptr<IBeamScan> createScan(const IAxis& axis) const;
 
     void writeScanTo(QXmlStreamWriter* w) const;
     void readScanFrom(QXmlStreamReader* r);
-- 
GitLab