diff --git a/GUI/Model/Device/InstrumentItems.cpp b/GUI/Model/Device/InstrumentItems.cpp index 06e693a6ff3305fd5479f397d137e38f1418fc01..b97248f622a57df27c0832e187363f5f749f959f 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 efe28f1247b1c3715d476d0e1000921e30d46888..f758b690d083c3b874c53989d70de68c47ffe681 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 ba396a918e4216048c4f208183cd13753d378b12..1a9af18fb2700792d7ef5f0523423717c6e2be0e 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);