From 3d918e88efc61442a4ccbe509f3130af3a75bccd Mon Sep 17 00:00:00 2001 From: Tobias Knopff <t.knopff@fz-juelich.de> Date: Fri, 30 Apr 2021 15:29:19 +0200 Subject: [PATCH] Make BeamItem::P_WAVELENGTH private --- GUI/coregui/Models/BeamItems.cpp | 21 +++++++++++++++---- GUI/coregui/Models/BeamItems.h | 8 +++++-- GUI/coregui/Models/InstrumentItems.cpp | 4 ++-- GUI/coregui/Models/TransformFromDomain.cpp | 21 ++++++++++++++++--- GUI/coregui/Models/TransformToDomain.cpp | 8 +++---- GUI/coregui/Models/TransformToDomain.h | 5 +++-- .../DepthProbeInstrumentEditor.cpp | 5 +++-- .../InstrumentWidgets/GISASBeamEditor.cpp | 3 ++- .../OffSpecularBeamEditor.cpp | 3 ++- .../InstrumentWidgets/SpecularBeamEditor.cpp | 3 ++- 10 files changed, 59 insertions(+), 22 deletions(-) diff --git a/GUI/coregui/Models/BeamItems.cpp b/GUI/coregui/Models/BeamItems.cpp index 1f3423e65df..8990ee82384 100644 --- a/GUI/coregui/Models/BeamItems.cpp +++ b/GUI/coregui/Models/BeamItems.cpp @@ -78,6 +78,11 @@ void BeamItem::setWavelength(double value) item<BeamWavelengthItem>(P_WAVELENGTH)->resetToValue(value); } +BeamWavelengthItem* BeamItem::wavelengthItem() const +{ + return item<BeamWavelengthItem>(P_WAVELENGTH); +} + void BeamItem::setInclinationAngle(double value) { item<BeamDistributionItem>(P_INCLINATION_ANGLE)->resetToValue(value); @@ -107,6 +112,14 @@ std::unique_ptr<Beam> BeamItem::createBeam() const return result; } +template<typename T> void BeamItem::initWavelength() +{ + static_assert(std::is_base_of<BeamWavelengthItem,T>::value, + "Class must be derived from BeamWavelengthItem"); + + addProperty<T>(P_WAVELENGTH); +} + // Specular beam item /* ------------------------------------------------------------------------- */ @@ -117,7 +130,7 @@ const QString footprint_group_label("Type"); SpecularBeamItem::SpecularBeamItem() : BeamItem("SpecularBeam") { addProperty<SpecularBeamInclinationItem>(P_INCLINATION_ANGLE); - addProperty<SpecularBeamWavelengthItem>(P_WAVELENGTH); + initWavelength<SpecularBeamWavelengthItem>(); getItem(P_AZIMUTHAL_ANGLE)->setVisible(false); getItem(P_POLARIZATION)->setVisible(false); @@ -126,7 +139,7 @@ SpecularBeamItem::SpecularBeamItem() : BeamItem("SpecularBeam") item->setDisplayName(footprint_group_label); item->setToolTip("Footprint type"); - getItem(P_WAVELENGTH) + wavelengthItem() ->mapper() ->setOnChildPropertyChange( [this](SessionItem*, QString property) { @@ -212,7 +225,7 @@ void SpecularBeamItem::updateToData(const IAxis& axis, QString units) void SpecularBeamItem::updateWavelength() { auto item = inclinationAxisGroup()->currentItem(); - auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH)); + auto wl_item = static_cast<SpecularBeamWavelengthItem*>(wavelengthItem()); if (auto axis_item = dynamic_cast<PointwiseAxisItem*>(item)) { auto axis = axis_item->axis(); if (axis && axis_item->getUnitsLabel() == "q-space") @@ -227,7 +240,7 @@ void SpecularBeamItem::updateWavelength() GISASBeamItem::GISASBeamItem() : BeamItem("GISASBeam") { addProperty<BeamInclinationAngleItem>(P_INCLINATION_ANGLE); - addProperty<BeamWavelengthItem>(P_WAVELENGTH); + initWavelength<BeamWavelengthItem>(); } GISASBeamItem::~GISASBeamItem() = default; diff --git a/GUI/coregui/Models/BeamItems.h b/GUI/coregui/Models/BeamItems.h index 5583c139a05..16ea7315796 100644 --- a/GUI/coregui/Models/BeamItems.h +++ b/GUI/coregui/Models/BeamItems.h @@ -19,6 +19,7 @@ class BasicAxisItem; class Beam; +class BeamWavelengthItem; class FootprintItem; class GroupItem; class IAxis; @@ -26,8 +27,8 @@ class IAxis; class BA_CORE_API_ BeamItem : public SessionItem { private: static const QString P_INTENSITY; -public: static const QString P_WAVELENGTH; +public: static const QString P_INCLINATION_ANGLE; static const QString P_AZIMUTHAL_ANGLE; static const QString P_POLARIZATION; @@ -40,7 +41,8 @@ public: double wavelength() const; void setWavelength(double value); - + BeamWavelengthItem* wavelengthItem() const; + virtual double getInclinationAngle() const = 0; virtual void setInclinationAngle(double value); @@ -51,6 +53,8 @@ public: protected: explicit BeamItem(const QString& beam_model); + + template<typename T> void initWavelength(); }; class BA_CORE_API_ SpecularBeamItem : public BeamItem { diff --git a/GUI/coregui/Models/InstrumentItems.cpp b/GUI/coregui/Models/InstrumentItems.cpp index 3f4a84e7d48..a6a274a5d35 100644 --- a/GUI/coregui/Models/InstrumentItems.cpp +++ b/GUI/coregui/Models/InstrumentItems.cpp @@ -422,8 +422,8 @@ std::unique_ptr<DepthProbeSimulation> DepthProbeInstrumentItem::createSimulation simulation->setZSpan(depthAxis->size(), depthAxis->lowerBound(), depthAxis->upperBound()); TransformToDomain::setBeamDistribution( - ParameterDistribution::BeamWavelength, - *beamItem()->item<BeamWavelengthItem>(SpecularBeamItem::P_WAVELENGTH), *simulation.get()); + ParameterDistribution::BeamWavelength, *beamItem()->wavelengthItem(), + *simulation.get()); TransformToDomain::setBeamDistribution( ParameterDistribution::BeamInclinationAngle, diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp index 298d361e5b1..d1228420e06 100644 --- a/GUI/coregui/Models/TransformFromDomain.cpp +++ b/GUI/coregui/Models/TransformFromDomain.cpp @@ -35,6 +35,7 @@ #include "GUI/coregui/Models/AxesItems.h" #include "GUI/coregui/Models/BackgroundItems.h" #include "GUI/coregui/Models/BeamAngleItems.h" +#include "GUI/coregui/Models/BeamWavelengthItem.h" #include "GUI/coregui/Models/FTDecayFunctionItems.h" #include "GUI/coregui/Models/FTDistributionItems.h" #include "GUI/coregui/Models/FootprintItems.h" @@ -77,6 +78,10 @@ void addDistributionToBeamItem(ParameterDistribution::WhichParameter which, const QString& item_name, const ParameterDistribution& distribution, const BeamItem* beam_item); +void addDistributionToBeamItem(ParameterDistribution::WhichParameter which, + BeamDistributionItem* item, + const ParameterDistribution& distribution); + void addRangedDistributionToItem(SessionItem* item, const IRangedDistribution& ranged, double mean, double std_dev); } // namespace @@ -222,8 +227,8 @@ void TransformFromDomain::setGISASBeamItem(BeamItem* beam_item, const GISASSimul const std::vector<ParameterDistribution> distributions = simulation.getDistributionHandler().getDistributions(); for (size_t i = 0; i < distributions.size(); ++i) { - addDistributionToBeamItem(ParameterDistribution::BeamWavelength, BeamItem::P_WAVELENGTH, - distributions[i], beam_item); + addDistributionToBeamItem(ParameterDistribution::BeamWavelength, + beam_item->wavelengthItem(), distributions[i]); addDistributionToBeamItem(ParameterDistribution::BeamInclinationAngle, BeamItem::P_INCLINATION_ANGLE, distributions[i], beam_item); addDistributionToBeamItem(ParameterDistribution::BeamAzimuthalAngle, @@ -269,7 +274,7 @@ void TransformFromDomain::setSpecularBeamItem(SpecularBeamItem* beam_item, if (!resolution->empty()) { double mean = scan->wavelength(); double std_dev = resolution->stdDevs(mean, 1).front(); - addRangedDistributionToItem(beam_item->getItem(SpecularBeamItem::P_WAVELENGTH), + addRangedDistributionToItem(beam_item->wavelengthItem(), *resolution->distribution(), mean, std_dev); } @@ -812,6 +817,16 @@ void addDistributionToBeamItem(ParameterDistribution::WhichParameter which, TransformFromDomain::setItemFromSample(beam_parameter, distribution); } +void addDistributionToBeamItem(ParameterDistribution::WhichParameter which, + BeamDistributionItem* item, + const ParameterDistribution& distribution) +{ + if (distribution.whichParameter() != which) + return; + + TransformFromDomain::setItemFromSample(item, distribution); +} + void addRangedDistributionToItem(SessionItem* item, const IRangedDistribution& ranged, double mean, double std_dev) { diff --git a/GUI/coregui/Models/TransformToDomain.cpp b/GUI/coregui/Models/TransformToDomain.cpp index 25b6f2bd5d6..4632cc5d01f 100644 --- a/GUI/coregui/Models/TransformToDomain.cpp +++ b/GUI/coregui/Models/TransformToDomain.cpp @@ -134,7 +134,7 @@ std::unique_ptr<IParticle> TransformToDomain::createIParticle(const SessionItem& } //! adds DistributionParameters to the ISimulation -void TransformToDomain::addDistributionParametersToSimulation(const SessionItem& beam_item, +void TransformToDomain::addDistributionParametersToSimulation(const BeamItem& beam_item, GISASSimulation& simulation) { if (beam_item.modelType() != "GISASBeam") { @@ -143,7 +143,7 @@ void TransformToDomain::addDistributionParametersToSimulation(const SessionItem& } setParameterDistributionToSimulation<BeamWavelengthItem>( - ParameterDistribution::BeamWavelength, beam_item.getItem(BeamItem::P_WAVELENGTH), + ParameterDistribution::BeamWavelength, beam_item.wavelengthItem(), simulation); setParameterDistributionToSimulation<BeamInclinationAngleItem>( ParameterDistribution::BeamInclinationAngle, @@ -153,7 +153,7 @@ void TransformToDomain::addDistributionParametersToSimulation(const SessionItem& simulation); } -void TransformToDomain::addBeamDivergencesToScan(const SessionItem& beam_item, +void TransformToDomain::addBeamDivergencesToScan(const BeamItem& beam_item, AngularSpecScan& scan) { if (beam_item.modelType() != "SpecularBeam") { @@ -161,7 +161,7 @@ void TransformToDomain::addBeamDivergencesToScan(const SessionItem& beam_item, return; } - auto resolution = createScanResolution(beam_item.getItem(SpecularBeamItem::P_WAVELENGTH)); + auto resolution = createScanResolution(beam_item.wavelengthItem()); if (resolution) scan.setWavelengthResolution(*resolution); resolution = createScanResolution(beam_item.getItem(SpecularBeamItem::P_INCLINATION_ANGLE)); diff --git a/GUI/coregui/Models/TransformToDomain.h b/GUI/coregui/Models/TransformToDomain.h index a741641f388..3c6c84dca7b 100644 --- a/GUI/coregui/Models/TransformToDomain.h +++ b/GUI/coregui/Models/TransformToDomain.h @@ -28,6 +28,7 @@ class AngularSpecScan; class BeamDistributionItem; +class BeamItem; class GISASSimulation; class Material; class MaterialItemContainer; @@ -42,9 +43,9 @@ std::unique_ptr<LayerRoughness> createLayerRoughness(const SessionItem& item); std::unique_ptr<MultiLayer> createMultiLayer(const SessionItem& item); std::unique_ptr<ParticleLayout> createParticleLayout(const SessionItem& item); -void addDistributionParametersToSimulation(const SessionItem& beam_item, +void addDistributionParametersToSimulation(const BeamItem& beam_item, GISASSimulation& simulation); -void addBeamDivergencesToScan(const SessionItem& beam_item, AngularSpecScan& simulation); +void addBeamDivergencesToScan(const BeamItem& beam_item, AngularSpecScan& simulation); void setBeamDistribution(ParameterDistribution::WhichParameter which, const BeamDistributionItem& item, ISimulation& simulation); diff --git a/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp index acde70ca746..a0667148ebf 100644 --- a/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp @@ -13,6 +13,7 @@ // ************************************************************************************************ #include "GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.h" +#include "GUI/coregui/Models/BeamWavelengthItem.h" #include "GUI/coregui/Models/InstrumentItems.h" #include "GUI/coregui/Models/SpecularBeamInclinationItem.h" #include "GUI/coregui/Views/InfoWidgets/DistributionDialog.h" @@ -52,9 +53,9 @@ DepthProbeInstrumentEditor::DepthProbeInstrumentEditor(QWidget* parent) void DepthProbeInstrumentEditor::subscribeToItem() { - const auto beam_item = instrumentItem()->getItem(DepthProbeInstrumentItem::P_BEAM); + const SpecularBeamItem* beam_item = instrumentItem()->beamItem(); - auto wavelengthItem = beam_item->getItem(SpecularBeamItem::P_WAVELENGTH); + BeamWavelengthItem* wavelengthItem = beam_item->wavelengthItem(); m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION)); auto inclinationItem = beam_item->getItem(SpecularBeamItem::P_INCLINATION_ANGLE); diff --git a/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp index ba3fa70705f..cd6a28d6c3b 100644 --- a/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp @@ -14,6 +14,7 @@ #include "GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.h" #include "GUI/coregui/Models/BeamDistributionItem.h" +#include "GUI/coregui/Models/BeamWavelengthItem.h" #include "GUI/coregui/Models/InstrumentItems.h" #include "GUI/coregui/Views/CommonWidgets/ColumnResizer.h" #include "GUI/coregui/Views/InfoWidgets/DistributionDialog.h" @@ -63,7 +64,7 @@ void GISASBeamEditor::subscribeToItem() { m_intensityEditor->setItem(beamItem()->intensityItem()); - auto wavelengthItem = beamItem()->getItem(BeamItem::P_WAVELENGTH); + auto wavelengthItem = beamItem()->wavelengthItem(); m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION)); auto inclinationItem = beamItem()->getItem(BeamItem::P_INCLINATION_ANGLE); diff --git a/GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.cpp index 4dcf2324af7..2fad56c6066 100644 --- a/GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.cpp @@ -14,6 +14,7 @@ #include "GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.h" #include "GUI/coregui/Models/BeamDistributionItem.h" +#include "GUI/coregui/Models/BeamWavelengthItem.h" #include "GUI/coregui/Models/InstrumentItems.h" #include "GUI/coregui/Views/CommonWidgets/ColumnResizer.h" #include "GUI/coregui/Views/InfoWidgets/DistributionDialog.h" @@ -63,7 +64,7 @@ void OffSpecularBeamEditor::subscribeToItem() { m_intensityEditor->setItem(beamItem()->intensityItem()); - auto wavelengthItem = beamItem()->getItem(BeamItem::P_WAVELENGTH); + auto wavelengthItem = beamItem()->wavelengthItem(); m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION)); auto inclinationItem = instrumentItem()->getItem(OffSpecularInstrumentItem::P_ALPHA_AXIS); diff --git a/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp index fbcb096d050..b261a4c96ea 100644 --- a/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp @@ -13,6 +13,7 @@ // ************************************************************************************************ #include "GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.h" +#include "GUI/coregui/Models/BeamWavelengthItem.h" #include "GUI/coregui/Models/InstrumentItems.h" #include "GUI/coregui/Models/SpecularBeamInclinationItem.h" #include "GUI/coregui/Views/CommonWidgets/ColumnResizer.h" @@ -66,7 +67,7 @@ void SpecularBeamEditor::subscribeToItem() m_intensityEditor->setItem(beam_item->intensityItem()); - auto wavelengthItem = beam_item->getItem(SpecularBeamItem::P_WAVELENGTH); + auto wavelengthItem = beam_item->wavelengthItem(); m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION)); auto inclinationItem = beam_item->getItem(SpecularBeamItem::P_INCLINATION_ANGLE); -- GitLab