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