From 1204d989136cdee5576229795ed60ce234d06119 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Mon, 23 May 2022 20:57:26 +0200
Subject: [PATCH] also in GUI, set polarization at simulation level

---
 GUI/Model/Device/InstrumentItems.cpp     | 24 ++++++++++++++++++++----
 GUI/Model/Device/InstrumentItems.h       | 10 ++++++++--
 GUI/Model/To/DomainSimulationBuilder.cpp | 10 ++++------
 3 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/GUI/Model/Device/InstrumentItems.cpp b/GUI/Model/Device/InstrumentItems.cpp
index 06e693a6ff3..b97248f622a 100644
--- a/GUI/Model/Device/InstrumentItems.cpp
+++ b/GUI/Model/Device/InstrumentItems.cpp
@@ -37,6 +37,8 @@
 #include "GUI/Util/Error.h"
 #include "GUI/Util/String.h"
 #include "Sim/Simulation/DepthProbeSimulation.h"
+#include "Sim/Simulation/OffSpecularSimulation.h"
+#include "Sim/Simulation/ScatteringSimulation.h"
 
 namespace {
 
@@ -365,16 +367,30 @@ std::unique_ptr<Instrument> Instrument2DItem::createInstrument() const
     return std::make_unique<Instrument>(*beam, *detector);
 }
 
-std::unique_ptr<Instrument> Instrument2DItem::createPolInstrument() const
+std::unique_ptr<ScatteringSimulation> Instrument2DItem::createScatteringSimulation(
+    const MultiLayer& sample) const
 {
     auto beam = beamItem()->createBeam();
     auto detector = detectorItem()->createDetector();
     detector->setDetectorNormal(beam->direction().zReflected());
 
-    beam->setPolarization(m_polarization);
-    detector->setAnalyzer(m_analyzerDirection, m_analyzerEfficiency, m_analyzerTotalTransmission);
+    auto result = std::make_unique<ScatteringSimulation>(*beam, sample, *detector);
+    result->setPolarization(m_polarization);
+    result->setAnalyzer(m_analyzerDirection, m_analyzerEfficiency, m_analyzerTotalTransmission);
+    return result;
+}
 
-    return std::make_unique<Instrument>(*beam, *detector);
+std::unique_ptr<OffSpecularSimulation> Instrument2DItem::createOffSpecularSimulation(
+    const MultiLayer& sample) const
+{
+    auto beam = beamItem()->createBeam();
+    auto detector = detectorItem()->createDetector();
+    detector->setDetectorNormal(beam->direction().zReflected());
+
+    auto result = std::make_unique<OffSpecularSimulation>(*beam, sample, *detector);
+    result->setPolarization(m_polarization);
+    result->setAnalyzer(m_analyzerDirection, m_analyzerEfficiency, m_analyzerTotalTransmission);
+    return result;
 }
 
 //  ************************************************************************************************
diff --git a/GUI/Model/Device/InstrumentItems.h b/GUI/Model/Device/InstrumentItems.h
index efe28f1247b..f758b690d08 100644
--- a/GUI/Model/Device/InstrumentItems.h
+++ b/GUI/Model/Device/InstrumentItems.h
@@ -28,10 +28,13 @@
 class BackgroundItem;
 class DataItem;
 class DepthProbeSimulation;
-class Instrument;
 class ICoordSystem;
+class Instrument;
 class MaskContainerItem;
+class MultiLayer;
 class RealDataItem;
+class OffSpecularSimulation;
+class ScatteringSimulation;
 
 //! Abstract base class for instrument-specific item classes.
 
@@ -156,7 +159,10 @@ public:
     void importMasks(const MaskContainerItem* maskContainer) override;
 
     std::unique_ptr<Instrument> createInstrument() const;
-    std::unique_ptr<Instrument> createPolInstrument() const;
+    std::unique_ptr<ScatteringSimulation> createScatteringSimulation(
+        const MultiLayer& sample) const;
+    std::unique_ptr<OffSpecularSimulation> createOffSpecularSimulation(
+        const MultiLayer& sample) const;
 
     static bool isDetectorPropertyName(const QString& name);
 
diff --git a/GUI/Model/To/DomainSimulationBuilder.cpp b/GUI/Model/To/DomainSimulationBuilder.cpp
index ba396a918e4..1a9af18fb27 100644
--- a/GUI/Model/To/DomainSimulationBuilder.cpp
+++ b/GUI/Model/To/DomainSimulationBuilder.cpp
@@ -119,9 +119,8 @@ createScatteringSimulation(std::unique_ptr<MultiLayer> multilayer,
                            const GISASInstrumentItem* instrumentItem,
                            const SimulationOptionsItem& optionsItem)
 {
-    std::unique_ptr<const Instrument> instrument = instrumentItem->createPolInstrument();
-    auto result = std::make_unique<ScatteringSimulation>(
-        instrument->beam(), *multilayer, instrument->detector());
+    std::unique_ptr<ScatteringSimulation> result(
+        instrumentItem->createScatteringSimulation(*multilayer));
 
     addDistributionParametersToSimulation(*instrumentItem->beamItem(), *result);
 
@@ -138,9 +137,8 @@ createOffSpecularSimulation(std::unique_ptr<MultiLayer> multilayer,
                             const OffSpecularInstrumentItem* instrumentItem,
                             const SimulationOptionsItem& optionsItem)
 {
-    std::unique_ptr<const Instrument> instrument = instrumentItem->createPolInstrument();
-    auto result = std::make_unique<OffSpecularSimulation>(
-        instrument->beam(), *multilayer, instrument->detector());
+    std::unique_ptr<OffSpecularSimulation> result(
+        instrumentItem->createOffSpecularSimulation(*multilayer));
 
     auto* beamItem = instrumentItem->beamItem();
     const auto axis = instrumentItem->alphaAxis().createAxis(Units::deg);
-- 
GitLab