From df388d1705053c796f999369119bc344424364ad Mon Sep 17 00:00:00 2001
From: Joachim Wuttke <j.wuttke@fz-juelich.de>
Date: Wed, 24 Jul 2024 21:37:42 +0200
Subject: [PATCH] mv all members from GrazingScanItem to ScanItem

---
 GUI/Model/Beam/GrazingScanItem.cpp  |  93 +-----------------------
 GUI/Model/Beam/GrazingScanItem.h    |  30 --------
 GUI/Model/Beam/SourceItems.cpp      | 109 +++++++++++++++++++++++++---
 GUI/Model/Beam/SourceItems.h        |  30 ++++++++
 GUI/Model/Sim/InstrumentItems.cpp   |  12 ++-
 GUI/View/Device/AlphaScanEditor.cpp |   5 +-
 GUI/View/Device/AlphaScanEditor.h   |   6 +-
 GUI/View/Device/ScanEditor.cpp      |   2 +-
 8 files changed, 143 insertions(+), 144 deletions(-)

diff --git a/GUI/Model/Beam/GrazingScanItem.cpp b/GUI/Model/Beam/GrazingScanItem.cpp
index 9e63956f9c8..29e61127465 100644
--- a/GUI/Model/Beam/GrazingScanItem.cpp
+++ b/GUI/Model/Beam/GrazingScanItem.cpp
@@ -21,7 +21,6 @@
 #include "GUI/Model/Beam/DistributionItems.h"
 
 namespace {
-
 namespace Tag {
 
 const QString UniformAxis("UniformAxis");
@@ -32,29 +31,13 @@ const QString IsUniformAxis("IsUniformAxis");
 const QString BaseData("BaseData");
 
 } // namespace Tag
-
-
-void setAxisPresentationDefaults(BasicAxisItem* axisItem)
-{
-    ASSERT(axisItem);
-    if (dynamic_cast<PointwiseAxisItem*>(axisItem))
-        return;
-    axisItem->setMin(0.0);
-    axisItem->setMax(3.0);
-    axisItem->resize(500);
-}
-
 } // namespace
 
 
 GrazingScanItem::GrazingScanItem()
     : BeamDistributionItem()
-    , m_current_axis_is_uniform_axis(true)
 {
     m_distribution.simpleInit("Distribution", "", DistributionCatalog::Type::None);
-
-    m_uniform_alpha_axis = std::make_unique<BasicAxisItem>();
-    setAxisPresentationDefaults(m_uniform_alpha_axis.get());
 }
 
 GrazingScanItem::~GrazingScanItem() = default;
@@ -62,17 +45,6 @@ GrazingScanItem::~GrazingScanItem() = default;
 void GrazingScanItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeBaseElement<BeamDistributionItem>(w, XML::Tag::BaseData, this);
-    XML::writeTaggedValue(w, Tag::IsUniformAxis, m_current_axis_is_uniform_axis);
-
-    // uniform axis
-    if (m_uniform_alpha_axis) {
-        XML::writeTaggedElement(w, Tag::UniformAxis, *m_uniform_alpha_axis);
-    }
-
-    // pointwise axis
-    if (m_pointwise_alpha_axis) {
-        XML::writeTaggedElement(w, Tag::ListScan, *m_pointwise_alpha_axis);
-    }
 }
 
 void GrazingScanItem::readFrom(QXmlStreamReader* r)
@@ -81,18 +53,7 @@ void GrazingScanItem::readFrom(QXmlStreamReader* r)
         QString tag = r->name().toString();
         if (tag == Tag::BaseData)
             XML::readBaseElement<BeamDistributionItem>(r, tag, this);
-        else if (tag == Tag::IsUniformAxis)
-            m_current_axis_is_uniform_axis = XML::readTaggedBool(r, tag);
-        else if (tag == Tag::UniformAxis) {
-            m_uniform_alpha_axis = std::make_unique<BasicAxisItem>();
-            setAxisPresentationDefaults(m_uniform_alpha_axis.get());
-            XML::readTaggedElement(r, tag, *m_uniform_alpha_axis);
-        } else if (tag == Tag::ListScan || tag == Tag::PointwiseAxis) { // compatibility with pre-21
-            m_pointwise_alpha_axis = std::make_unique<PointwiseAxisItem>();
-            setAxisPresentationDefaults(m_pointwise_alpha_axis.get());
-            XML::readTaggedElement(r, tag, *m_pointwise_alpha_axis);
-
-        } else
+        else
             r->skipCurrentElement();
     }
 }
@@ -101,55 +62,3 @@ double GrazingScanItem::scaleFactor() const
 {
     return Units::deg;
 }
-
-int GrazingScanItem::nBins() const
-{
-    return alphaAxisItem()->size();
-}
-
-BasicAxisItem* GrazingScanItem::alphaAxisItem() const
-{
-    return m_current_axis_is_uniform_axis ? m_uniform_alpha_axis.get()
-                                          : m_pointwise_alpha_axis.get();
-}
-
-bool GrazingScanItem::pointwiseAlphaAxisDefined() const
-{
-    return (bool)m_pointwise_alpha_axis;
-}
-
-bool GrazingScanItem::pointwiseAlphaAxisSelected() const
-{
-    return !m_current_axis_is_uniform_axis;
-}
-void GrazingScanItem::selectUniformAxis()
-{
-    m_current_axis_is_uniform_axis = true;
-}
-
-void GrazingScanItem::selectListScan()
-{
-    ASSERT(pointwiseAlphaAxisDefined());
-    m_current_axis_is_uniform_axis = false;
-}
-
-void GrazingScanItem::initUniformAxis(const Scale& axis)
-{
-    m_uniform_alpha_axis->resize(static_cast<int>(axis.size()));
-}
-
-void GrazingScanItem::initListScan(const Scale& axis)
-{
-    if (!m_pointwise_alpha_axis) {
-        m_pointwise_alpha_axis = std::make_unique<PointwiseAxisItem>();
-        setAxisPresentationDefaults(m_pointwise_alpha_axis.get());
-    }
-    m_pointwise_alpha_axis->setAxis(axis);
-}
-
-void GrazingScanItem::updateAxIndicators(const Frame& frame)
-{
-    if (!m_pointwise_alpha_axis)
-        return;
-    m_pointwise_alpha_axis->updateAxIndicators(frame);
-}
diff --git a/GUI/Model/Beam/GrazingScanItem.h b/GUI/Model/Beam/GrazingScanItem.h
index 228abda9628..b48712071dd 100644
--- a/GUI/Model/Beam/GrazingScanItem.h
+++ b/GUI/Model/Beam/GrazingScanItem.h
@@ -19,7 +19,6 @@
 
 class BasicAxisItem;
 class Frame;
-class PointwiseAxisItem;
 class Scale;
 
 class GrazingScanItem : public BeamDistributionItem {
@@ -32,36 +31,7 @@ public:
 
     double scaleFactor() const override;
 
-    int nBins() const;
-
-    //! The currently selected axis
-    BasicAxisItem* alphaAxisItem() const;
-
-    //! True if a pointwise axis was defined.
-    //!
-    //! It still is no necessarily the selected axis!
-    //! Not to be confused with pointwiseAlphaAxisSelected
-    bool pointwiseAlphaAxisDefined() const;
-
-    //! True if pointwise axis is selected.
-    //!
-    //! Not to be confused with pointwiseAlphaAxisDefined
-    bool pointwiseAlphaAxisSelected() const;
-
-    //! True if uniform axis is selected.
-    bool uniformAlphaAxisSelected() const { return m_current_axis_is_uniform_axis; }
-
-    void selectUniformAxis();
-    void selectListScan();
-
-    void initUniformAxis(const Scale& axis);
-    void initListScan(const Scale& axis);
-    void updateAxIndicators(const Frame& frame);
-
 private:
-    std::unique_ptr<BasicAxisItem> m_uniform_alpha_axis;
-    std::unique_ptr<PointwiseAxisItem> m_pointwise_alpha_axis;
-    bool m_current_axis_is_uniform_axis;
 };
 
 #endif // BORNAGAIN_GUI_MODEL_BEAM_GRAZINGSCANITEM_H
diff --git a/GUI/Model/Beam/SourceItems.cpp b/GUI/Model/Beam/SourceItems.cpp
index a2edc723989..463e2861944 100644
--- a/GUI/Model/Beam/SourceItems.cpp
+++ b/GUI/Model/Beam/SourceItems.cpp
@@ -13,6 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/Beam/SourceItems.h"
+#include "Base/Axis/Frame.h"
 #include "Base/Axis/Scale.h"
 #include "Base/Const/Units.h"
 #include "Base/Util/Assert.h"
@@ -20,9 +21,12 @@
 #include "Device/Beam/FootprintGauss.h"
 #include "Device/Beam/FootprintSquare.h"
 #include "GUI/Model/Axis/BasicAxisItem.h"
+#include "GUI/Model/Axis/PointwiseAxisItem.h"
 #include "GUI/Model/Beam/BeamDistributionItem.h"
+#include "GUI/Model/Beam/DistributionItems.h"
 #include "GUI/Model/Beam/FootprintItems.h"
 #include "GUI/Model/Beam/GrazingScanItem.h"
+#include "Param/Distrib/Distributions.h"
 #include "Sim/Scan/AlphaScan.h"
 
 namespace {
@@ -31,16 +35,32 @@ namespace Tag {
 
 const QString AzimuthalAngle("AzimuthalAngle");
 const QString BaseData("BaseData");
+const QString BeamInclinationDistribution("BeamInclinationDistribution");
+const QString Distribution("Distribution");
 const QString ExpandBeamParametersGroupbox("ExpandBeamParametersGroupbox");
 const QString ExpandFootprintGroupbox("ExpandFootprintGroupbox");
 const QString Footprint("Footprint");
 const QString GrazingScan("GrazingScan");
 const QString InclinationAngle("InclinationAngle");
 const QString Intensity("Intensity");
+const QString IsUniformAxis("IsUniformAxis");
+const QString ListScan("ListScan");
+const QString PointwiseAxis("PointwiseAxis"); // used in pre-21
+const QString UniformAxis("UniformAxis");
 const QString Wavelength("Wavelength");
 
 } // namespace Tag
 
+void setAxisPresentationDefaults(BasicAxisItem* axisItem)
+{
+    ASSERT(axisItem);
+    if (dynamic_cast<PointwiseAxisItem*>(axisItem))
+        return;
+    axisItem->setMin(0.0);
+    axisItem->setMax(3.0);
+    axisItem->resize(500);
+}
+
 } // namespace
 
 //  ************************************************************************************************
@@ -59,7 +79,6 @@ SourceItem::SourceItem()
 void SourceItem::writeTo(QXmlStreamWriter* w) const
 {
     ASSERT(m_wavelength_item);
-    // intensity
     m_intensity.writeTo2(w, Tag::Intensity);
     XML::writeTaggedElement(w, Tag::Wavelength, *m_wavelength_item);
     XML::writeTaggedElement(w, Tag::AzimuthalAngle, *m_azimuthal_angle_item);
@@ -73,9 +92,9 @@ void SourceItem::readFrom(QXmlStreamReader* r)
     ASSERT(m_wavelength_item);
     while (r->readNextStartElement()) {
         QString tag = r->name().toString();
-        if (tag == Tag::Intensity) {
+        if (tag == Tag::Intensity)
             m_intensity.readFrom2(r, tag);
-        } else if (tag == Tag::Wavelength)
+        else if (tag == Tag::Wavelength)
             XML::readTaggedElement(r, tag, *m_wavelength_item);
         else if (tag == Tag::AzimuthalAngle)
             XML::readTaggedElement(r, tag, *m_azimuthal_angle_item);
@@ -197,9 +216,13 @@ std::unique_ptr<Beam> BeamItem::createBeam() const
 //  ************************************************************************************************
 
 ScanItem::ScanItem()
+    : m_current_axis_is_uniform_axis(true)
 {
     m_grazing_scan_item = std::make_unique<GrazingScanItem>();
     m_wavelength_item = std::make_unique<BeamDistributionItem>();
+
+    m_uniform_alpha_axis = std::make_unique<BasicAxisItem>();
+    setAxisPresentationDefaults(m_uniform_alpha_axis.get());
 }
 
 void ScanItem::setScan(const BeamScan* scan)
@@ -224,6 +247,11 @@ void ScanItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeBaseElement<SourceItem>(w, XML::Tag::BaseData, this);
     XML::writeTaggedElement(w, Tag::GrazingScan, *m_grazing_scan_item);
+    XML::writeTaggedValue(w, Tag::IsUniformAxis, m_current_axis_is_uniform_axis);
+    if (m_uniform_alpha_axis)
+        XML::writeTaggedElement(w, Tag::UniformAxis, *m_uniform_alpha_axis);
+    if (m_pointwise_alpha_axis)
+        XML::writeTaggedElement(w, Tag::ListScan, *m_pointwise_alpha_axis);
 }
 
 void ScanItem::readFrom(QXmlStreamReader* r)
@@ -234,7 +262,17 @@ void ScanItem::readFrom(QXmlStreamReader* r)
             XML::readBaseElement<SourceItem>(r, tag, this);
         else if (tag == Tag::GrazingScan)
             XML::readTaggedElement(r, tag, *m_grazing_scan_item);
-        else
+        else if (tag == Tag::IsUniformAxis)
+            m_current_axis_is_uniform_axis = XML::readTaggedBool(r, tag);
+        else if (tag == Tag::UniformAxis) {
+            m_uniform_alpha_axis = std::make_unique<BasicAxisItem>();
+            setAxisPresentationDefaults(m_uniform_alpha_axis.get());
+            XML::readTaggedElement(r, tag, *m_uniform_alpha_axis);
+        } else if (tag == Tag::ListScan || tag == Tag::PointwiseAxis) { // compatibility with pre-21
+            m_pointwise_alpha_axis = std::make_unique<PointwiseAxisItem>();
+            setAxisPresentationDefaults(m_pointwise_alpha_axis.get());
+            XML::readTaggedElement(r, tag, *m_pointwise_alpha_axis);
+        } else
             r->skipCurrentElement();
     }
 }
@@ -246,16 +284,69 @@ GrazingScanItem* ScanItem::grazingScanItem() const
 
 BasicAxisItem* ScanItem::inclinationAxisItem() const
 {
-    return grazingScanItem()->alphaAxisItem();
+    return alphaAxisItem();
 }
 
 void ScanItem::updateToData(const Scale& axis)
 {
     if (axis.unit() == "bin") {
-        grazingScanItem()->initUniformAxis(axis);
-        grazingScanItem()->selectUniformAxis();
+        initUniformAxis(axis);
+        selectUniformAxis();
     } else {
-        grazingScanItem()->initListScan(axis);
-        grazingScanItem()->selectListScan();
+        initListScan(axis);
+        selectListScan();
     }
 }
+
+
+int ScanItem::nBins() const
+{
+    return alphaAxisItem()->size();
+}
+
+BasicAxisItem* ScanItem::alphaAxisItem() const
+{
+    return m_current_axis_is_uniform_axis ? m_uniform_alpha_axis.get()
+                                          : m_pointwise_alpha_axis.get();
+}
+
+bool ScanItem::pointwiseAlphaAxisDefined() const
+{
+    return (bool)m_pointwise_alpha_axis;
+}
+
+bool ScanItem::pointwiseAlphaAxisSelected() const
+{
+    return !m_current_axis_is_uniform_axis;
+}
+void ScanItem::selectUniformAxis()
+{
+    m_current_axis_is_uniform_axis = true;
+}
+
+void ScanItem::selectListScan()
+{
+    ASSERT(pointwiseAlphaAxisDefined());
+    m_current_axis_is_uniform_axis = false;
+}
+
+void ScanItem::initUniformAxis(const Scale& axis)
+{
+    m_uniform_alpha_axis->resize(static_cast<int>(axis.size()));
+}
+
+void ScanItem::initListScan(const Scale& axis)
+{
+    if (!m_pointwise_alpha_axis) {
+        m_pointwise_alpha_axis = std::make_unique<PointwiseAxisItem>();
+        setAxisPresentationDefaults(m_pointwise_alpha_axis.get());
+    }
+    m_pointwise_alpha_axis->setAxis(axis);
+}
+
+void ScanItem::updateAxIndicators(const Frame& frame)
+{
+    if (!m_pointwise_alpha_axis)
+        return;
+    m_pointwise_alpha_axis->updateAxIndicators(frame);
+}
diff --git a/GUI/Model/Beam/SourceItems.h b/GUI/Model/Beam/SourceItems.h
index 04b11241a95..ab91b37dcc5 100644
--- a/GUI/Model/Beam/SourceItems.h
+++ b/GUI/Model/Beam/SourceItems.h
@@ -28,6 +28,7 @@ class BeamScan;
 class Frame;
 class GrazingScanItem;
 class IFootprint;
+class PointwiseAxisItem;
 class Scale;
 
 //! Base class for BeamItem and ScanItem. Name refers to radiation source.
@@ -98,7 +99,36 @@ public:
 
     void updateToData(const Scale& axis);
 
+    int nBins() const;
+
+    //! The currently selected axis
+    BasicAxisItem* alphaAxisItem() const;
+
+    //! True if a pointwise axis was defined.
+    //!
+    //! It still is no necessarily the selected axis!
+    //! Not to be confused with pointwiseAlphaAxisSelected
+    bool pointwiseAlphaAxisDefined() const;
+
+    //! True if pointwise axis is selected.
+    //!
+    //! Not to be confused with pointwiseAlphaAxisDefined
+    bool pointwiseAlphaAxisSelected() const;
+
+    //! True if uniform axis is selected.
+    bool uniformAlphaAxisSelected() const { return m_current_axis_is_uniform_axis; }
+
+    void selectUniformAxis();
+    void selectListScan();
+
+    void initUniformAxis(const Scale& axis);
+    void initListScan(const Scale& axis);
+    void updateAxIndicators(const Frame& frame);
+
 private:
+    std::unique_ptr<BasicAxisItem> m_uniform_alpha_axis;
+    std::unique_ptr<PointwiseAxisItem> m_pointwise_alpha_axis;
+    bool m_current_axis_is_uniform_axis;
     std::unique_ptr<GrazingScanItem> m_grazing_scan_item;
 };
 
diff --git a/GUI/Model/Sim/InstrumentItems.cpp b/GUI/Model/Sim/InstrumentItems.cpp
index df5f14e9e53..75da600fa11 100644
--- a/GUI/Model/Sim/InstrumentItems.cpp
+++ b/GUI/Model/Sim/InstrumentItems.cpp
@@ -339,7 +339,7 @@ size_t OffspecInstrumentItem::axdim(int i) const
 {
     if (i == 0) {
         ASSERT(scanItem() && scanItem()->grazingScanItem());
-        return scanItem()->grazingScanItem()->nBins();
+        return scanItem()->nBins();
     } else if (i == 1) {
         ASSERT(detectorItem());
         return detectorItem()->ySize();
@@ -423,20 +423,18 @@ void SpecularInstrumentItem::updateToRealData(const DatafileItem* dfi)
 
     const Scale& dataAxis = dfi->dataItem()->c_field()->axis(0);
     scanItem()->updateToData(dataAxis);
-    scanItem()->grazingScanItem()->updateAxIndicators(makeFrame());
+    scanItem()->updateAxIndicators(makeFrame());
 }
 
 bool SpecularInstrumentItem::alignedWith(const DatafileItem* dfi) const
 {
     if (!dfi->holdsDimensionalData())
-        return scanItem()->grazingScanItem()->uniformAlphaAxisSelected()
-               && axdim(0) == dfi->axdim(0);
+        return scanItem()->uniformAlphaAxisSelected() && axdim(0) == dfi->axdim(0);
 
-    if (!scanItem()->grazingScanItem()->pointwiseAlphaAxisSelected())
+    if (!scanItem()->pointwiseAlphaAxisSelected())
         return false;
 
-    const auto* axisItem =
-        dynamic_cast<const PointwiseAxisItem*>(scanItem()->grazingScanItem()->alphaAxisItem());
+    const auto* axisItem = dynamic_cast<const PointwiseAxisItem*>(scanItem()->alphaAxisItem());
     ASSERT(axisItem);
 
     const Scale* instrumentAxis = axisItem->axis();
diff --git a/GUI/View/Device/AlphaScanEditor.cpp b/GUI/View/Device/AlphaScanEditor.cpp
index e84b008988d..1634499ffbb 100644
--- a/GUI/View/Device/AlphaScanEditor.cpp
+++ b/GUI/View/Device/AlphaScanEditor.cpp
@@ -15,11 +15,12 @@
 #include "GUI/View/Device/AlphaScanEditor.h"
 #include "GUI/Model/Beam/DistributionItems.h"
 #include "GUI/Model/Beam/GrazingScanItem.h"
+#include "GUI/Model/Beam/SourceItems.h"
 #include "GUI/View/Device/DistributionPlot.h"
 #include "GUI/View/Device/DistributionSelector.h"
 #include "GUI/View/Device/ScanRangeForm.h"
 
-AlphaScanEditor::AlphaScanEditor(QWidget* parent, GrazingScanItem* item, bool allow_distr)
+AlphaScanEditor::AlphaScanEditor(QWidget* parent, ScanItem* item, bool allow_distr)
     : StaticGroupBox("Grazing angles (deg)", parent)
     , m_item(item)
     , m_plot(new DistributionPlot(this))
@@ -39,7 +40,7 @@ AlphaScanEditor::AlphaScanEditor(QWidget* parent, GrazingScanItem* item, bool al
 
     //... beam distribution
     m_selector = new DistributionSelector(std::nullopt, DistributionSelector::Category::Symmetric,
-                                          this, m_item, allow_distr);
+                                          this, m_item->grazingScanItem(), allow_distr);
     connect(m_selector, &DistributionSelector::distributionChanged, this,
             &AlphaScanEditor::dataChanged);
     connect(m_selector, &DistributionSelector::distributionChanged, this,
diff --git a/GUI/View/Device/AlphaScanEditor.h b/GUI/View/Device/AlphaScanEditor.h
index 8a25b9b831a..eeb836c46c6 100644
--- a/GUI/View/Device/AlphaScanEditor.h
+++ b/GUI/View/Device/AlphaScanEditor.h
@@ -19,7 +19,7 @@
 
 class DistributionPlot;
 class DistributionSelector;
-class GrazingScanItem;
+class ScanItem;
 class ScanRangeForm;
 
 //! Editor for scanning inclination angles
@@ -27,7 +27,7 @@ class ScanRangeForm;
 class AlphaScanEditor : public StaticGroupBox {
     Q_OBJECT
 public:
-    AlphaScanEditor(QWidget* parent, GrazingScanItem* item, bool allow_distr);
+    AlphaScanEditor(QWidget* parent, ScanItem* item, bool allow_distr);
 
     void updateIndicators();
 
@@ -41,7 +41,7 @@ private slots:
 private:
     DistributionSelector* m_selector;
     ScanRangeForm* m_form;
-    GrazingScanItem* m_item;
+    ScanItem* m_item;
     DistributionPlot* m_plot;
 };
 
diff --git a/GUI/View/Device/ScanEditor.cpp b/GUI/View/Device/ScanEditor.cpp
index 74675b8959a..dc7625359bb 100644
--- a/GUI/View/Device/ScanEditor.cpp
+++ b/GUI/View/Device/ScanEditor.cpp
@@ -54,7 +54,7 @@ ScanEditor::ScanEditor(QWidget* parent, InstrumentItem* instr_item, ScanItem* it
 
     //... Inclination scan (alpha or qz)
 
-    auto* inclinationEditor = new AlphaScanEditor(this, item->grazingScanItem(), allow_distr);
+    auto* inclinationEditor = new AlphaScanEditor(this, item, allow_distr);
     layout->addWidget(inclinationEditor, 1, 1);
 
     //... Signals, will couple wavelength and inclination
-- 
GitLab