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