diff --git a/Core/Scan/UnitConverter1D.cpp b/Core/Scan/UnitConverter1D.cpp index 530f9143d75debc960fdd49b0011f8329ed4ab96..28a6f80f1b76a2e779f1613682f0db58ab0d323a 100644 --- a/Core/Scan/UnitConverter1D.cpp +++ b/Core/Scan/UnitConverter1D.cpp @@ -62,11 +62,6 @@ std::unique_ptr<UnitConverter1D> UnitConverter1D::createUnitConverter(const ISpe throw std::runtime_error("Bug in UnitConverter1D::createUnitConverter: invalid case"); } -size_t UnitConverter1D::dimension() const -{ - return 1u; -} - double UnitConverter1D::calculateMin(size_t i_axis, Axes::Units units) const { ASSERT(i_axis == 0); @@ -155,11 +150,6 @@ std::vector<Axes::Units> AngularReflectometryConverter::availableUnits() const Axes::Units::RQ4}; } -Axes::Units AngularReflectometryConverter::defaultUnits() const -{ - return Axes::Units::DEGREES; -} - AngularReflectometryConverter::AngularReflectometryConverter( const AngularReflectometryConverter& other) : m_wavelength(other.m_wavelength), m_axis(other.m_axis->clone()) @@ -234,12 +224,6 @@ std::vector<Axes::Units> WavenumberReflectometryConverter::availableUnits() cons return {Axes::Units::NBINS, Axes::Units::QSPACE, Axes::Units::RQ4}; } -//! Returns default units to convert to. -Axes::Units WavenumberReflectometryConverter::defaultUnits() const -{ - return Axes::Units::QSPACE; -} - WavenumberReflectometryConverter::WavenumberReflectometryConverter( const WavenumberReflectometryConverter& other) : m_axis(std::unique_ptr<IAxis>(other.coordinateAxis()->clone())) diff --git a/Core/Scan/UnitConverter1D.h b/Core/Scan/UnitConverter1D.h index a17f58382560765bc7fba318a4a607c27f3620cd..9f2e28a9bdfab9083c8e5a92baea8b7946b0dcde 100644 --- a/Core/Scan/UnitConverter1D.h +++ b/Core/Scan/UnitConverter1D.h @@ -43,7 +43,7 @@ public: UnitConverter1D* clone() const override = 0; //! Returns dimensionality of converted canvas. - size_t dimension() const override; + size_t dimension() const final { return 1u; } //! Calculates minimum on-axis value in given units. double calculateMin(size_t i_axis, Axes::Units units) const override; @@ -84,7 +84,8 @@ public: std::vector<Axes::Units> availableUnits() const override; //! Returns default units to convert to. - Axes::Units defaultUnits() const override; + Axes::Units defaultUnits() const override { return Axes::Units::DEGREES; } + protected: AngularReflectometryConverter(const AngularReflectometryConverter& other); @@ -120,7 +121,7 @@ public: std::vector<Axes::Units> availableUnits() const override; //! Returns default units to convert to. - Axes::Units defaultUnits() const override; + Axes::Units defaultUnits() const override { return Axes::Units::QSPACE; } protected: WavenumberReflectometryConverter(const WavenumberReflectometryConverter& other); diff --git a/Device/Detector/UnitConverter2D.cpp b/Device/Detector/UnitConverter2D.cpp index 74a6d1e96b983bb9de8768dbbf74435f98982ece..25597953786c90d68263ff1b5b7047e89c9627b1 100644 --- a/Device/Detector/UnitConverter2D.cpp +++ b/Device/Detector/UnitConverter2D.cpp @@ -43,11 +43,6 @@ UnitConverter2D::UnitConverter2D(const Beam& beam) { } -size_t UnitConverter2D::dimension() const -{ - return m_axis_data_table.size(); -} - void UnitConverter2D::addAxisData(std::string name, double min, double max, Axes::Units default_units, size_t nbins) { @@ -156,11 +151,6 @@ std::vector<Axes::Units> SphericalConverter::availableUnits() const return result; } -Axes::Units SphericalConverter::defaultUnits() const -{ - return Axes::Units::DEGREES; -} - SphericalConverter::SphericalConverter(const SphericalConverter& other) : UnitConverter2D(other) {} double SphericalConverter::calculateValue(size_t i_axis, Axes::Units units, double value) const @@ -234,11 +224,6 @@ std::vector<Axes::Units> RectangularConverter::availableUnits() const return result; } -Axes::Units RectangularConverter::defaultUnits() const -{ - return Axes::Units::MM; -} - RectangularConverter::RectangularConverter(const RectangularConverter& other) : UnitConverter2D(other), m_detector_pixel(other.m_detector_pixel->clone()) { diff --git a/Device/Detector/UnitConverter2D.h b/Device/Detector/UnitConverter2D.h index eddea1de3ce0d4890d5f0e7d5123f319e5a9a78f..172b7b4aab668ab8022d6fb94ada00de4c35a401 100644 --- a/Device/Detector/UnitConverter2D.h +++ b/Device/Detector/UnitConverter2D.h @@ -39,13 +39,14 @@ public: UnitConverter2D(const Beam& beam); ~UnitConverter2D() override = default; - virtual size_t dimension() const override; + virtual size_t dimension() const override { return m_axis_data_table.size(); } double calculateMin(size_t i_axis, Axes::Units units) const override; double calculateMax(size_t i_axis, Axes::Units units) const override; size_t axisSize(size_t i_axis) const override; - //! Returns the list of all available units + //! Returns list of units that are available for all 2D detectors. + //! Further units may be added by child classes. std::vector<Axes::Units> availableUnits() const override; std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, Axes::Units units) const override; @@ -78,6 +79,7 @@ private: virtual double calculateValue(size_t i_axis, Axes::Units units, double value) const = 0; }; + //! IUnitConverter class that handles the unit translations for spherical detectors //! Its default units are radians for both axes //! @ingroup simulation_internal @@ -93,7 +95,7 @@ public: //! Returns the list of all available units std::vector<Axes::Units> availableUnits() const override; - Axes::Units defaultUnits() const override; + Axes::Units defaultUnits() const override { return Axes::Units::DEGREES; } private: SphericalConverter(const SphericalConverter& other); @@ -101,6 +103,7 @@ private: std::vector<std::map<Axes::Units, std::string>> createNameMaps() const override; }; + //! IUnitConverter class that handles the unit translations for rectangular detectors //! Its default units are mm for both axes //! @ingroup simulation_internal @@ -115,7 +118,7 @@ public: //! Returns the list of all available units std::vector<Axes::Units> availableUnits() const override; - Axes::Units defaultUnits() const override; + Axes::Units defaultUnits() const override { return Axes::Units::MM; } private: RectangularConverter(const RectangularConverter& other); @@ -126,6 +129,7 @@ private: std::unique_ptr<RectangularPixel> m_detector_pixel; }; + //! IUnitConverter class that handles the unit translations for off-specular simulations //! with a spherical detector //! Its default units are radians for both axes @@ -147,6 +151,7 @@ private: void addDetectorYAxis(const IDetector2D& detector); }; + //! DepthProbeConverter class handles the unit translations for depth probe simulations //! Its default units are radians for x-axis and nm for y-axis //! @ingroup simulation_internal diff --git a/Device/Unit/IUnitConverter.h b/Device/Unit/IUnitConverter.h index 7217446b027de86337fbdab476337c1b801bbbef..7f8b9d7f13331533ad4637abc40e77472524313f 100644 --- a/Device/Unit/IUnitConverter.h +++ b/Device/Unit/IUnitConverter.h @@ -16,6 +16,7 @@ #error no need to expose this header to Swig #endif +#ifndef USER_API #ifndef BORNAGAIN_DEVICE_UNIT_IUNITCONVERTER_H #define BORNAGAIN_DEVICE_UNIT_IUNITCONVERTER_H @@ -26,16 +27,14 @@ #include <string> #include <vector> - class IAxis; template <class T> class OutputData; -#ifndef USER_API //! Interface to provide axis translations to different units for simulation output //! Child classes are currently declared in -//! - Device/Detector/SimpleUnitConverters.h, +//! - Device/Detector/UnitConverter2D.h, //! - Core/Scan/UnitConverter1D.h. //! @ingroup simulation_internal @@ -59,7 +58,6 @@ public: virtual std::vector<Axes::Units> availableUnits() const = 0; virtual Axes::Units defaultUnits() const = 0; - Axes::Units substituteDefaultUnits(Axes::Units units) const; #ifndef SWIG virtual std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, Axes::Units units) const = 0; @@ -70,6 +68,7 @@ public: #endif // SWIG protected: + Axes::Units substituteDefaultUnits(Axes::Units units) const; #ifndef SWIG [[noreturn]] void throwUnitsError(std::string method, std::vector<Axes::Units> available) const; #endif // SWIG @@ -78,6 +77,5 @@ private: virtual std::vector<std::map<Axes::Units, std::string>> createNameMaps() const = 0; }; -#endif // USER_API - #endif // BORNAGAIN_DEVICE_UNIT_IUNITCONVERTER_H +#endif // USER_API diff --git a/GUI/coregui/Models/DataViewUtils.cpp b/GUI/coregui/Models/DataViewUtils.cpp index 6ba163040da8f332c4dc9ffe156769940463d35f..6094ffa5776d0e31f757ee4736b5b9708afbf90a 100644 --- a/GUI/coregui/Models/DataViewUtils.cpp +++ b/GUI/coregui/Models/DataViewUtils.cpp @@ -18,6 +18,7 @@ #include "GUI/coregui/Models/DataItem.h" #include "GUI/coregui/Models/DataPropertyContainer.h" #include "GUI/coregui/Models/DomainObjectBuilder.h" +#include "GUI/coregui/Models/InstrumentItems.h" #include "GUI/coregui/Models/JobItem.h" #include "GUI/coregui/Models/JobItemUtils.h" @@ -28,7 +29,7 @@ std::unique_ptr<IUnitConverter> getConverter(Data1DViewItem* view_item) auto job_item = view_item->jobItem(); ASSERT(job_item->instrumentItem()); - return DomainObjectBuilder::createUnitConverter(job_item->instrumentItem()); + return job_item->instrumentItem()->createUnitConverter(); } Axes::Units selectedUnits(Data1DViewItem* view_item) diff --git a/GUI/coregui/Models/DepthProbeInstrumentItem.cpp b/GUI/coregui/Models/DepthProbeInstrumentItem.cpp deleted file mode 100644 index afea9a15517568a9efdced3300296e2fbcb62209..0000000000000000000000000000000000000000 --- a/GUI/coregui/Models/DepthProbeInstrumentItem.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file GUI/coregui/Models/DepthProbeInstrumentItem.cpp -//! @brief Implements DepthProbeInstrumentItem class -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#include "GUI/coregui/Models/DepthProbeInstrumentItem.h" -#include "Base/Const/Units.h" -#include "Core/Simulation/DepthProbeSimulation.h" -#include "GUI/coregui/Models/AxesItems.h" -#include "GUI/coregui/Models/BeamItems.h" -#include "GUI/coregui/Models/BeamWavelengthItem.h" -#include "GUI/coregui/Models/SpecularBeamInclinationItem.h" -#include "GUI/coregui/Models/TransformToDomain.h" - -const QString DepthProbeInstrumentItem::P_BEAM = "Beam"; -const QString DepthProbeInstrumentItem::P_Z_AXIS = "Z axis"; - -DepthProbeInstrumentItem::DepthProbeInstrumentItem() : InstrumentItem("DepthProbeInstrument") -{ - setItemName("DepthProbeInstrument"); - - addProperty<SpecularBeamItem>(P_BEAM); - - auto axisItem = beamItem()->currentInclinationAxisItem(); - axisItem->setLowerBound(0.0); - axisItem->setUpperBound(1.0); - axisItem->setBinCount(500); - - auto axis = addProperty<BasicAxisItem>(P_Z_AXIS); - axis->setLowerBound(-100.0); - axis->setUpperBound(100.0); - axis->getItem(BasicAxisItem::P_TITLE)->setVisible(false); - axis->getItem(BasicAxisItem::P_NBINS) - ->setToolTip("Number of points in scan across sample bulk"); - axis->getItem(BasicAxisItem::P_MIN_DEG) - ->setToolTip("Starting value below sample horizont in nm"); - axis->getItem(BasicAxisItem::P_MAX_DEG)->setToolTip("Ending value above sample horizont in nm"); -} - -SpecularBeamItem* DepthProbeInstrumentItem::beamItem() const -{ - return item<SpecularBeamItem>(P_BEAM); -} - -std::unique_ptr<Instrument> DepthProbeInstrumentItem::createInstrument() const -{ - throw std::runtime_error("DepthProbeInstrumentItem::createInstrument()"); -} - -std::vector<int> DepthProbeInstrumentItem::shape() const -{ - return std::vector<int>(); // no certain shape to avoid linking to real data -} - -void DepthProbeInstrumentItem::updateToRealData(const RealDataItem*) -{ - throw std::runtime_error("DepthProbeInstrumentItem::updateToRealData()"); -} - -QString DepthProbeInstrumentItem::defaultName() const -{ - return "DepthProbe"; -} - -std::unique_ptr<DepthProbeSimulation> DepthProbeInstrumentItem::createSimulation() const -{ - std::unique_ptr<DepthProbeSimulation> simulation = std::make_unique<DepthProbeSimulation>(); - - const auto axis_item = beamItem()->currentInclinationAxisItem(); - - auto axis = axis_item->createAxis(Units::deg); - - simulation->setBeamParameters(beamItem()->wavelength(), static_cast<int>(axis->size()), - axis->lowerBound(), axis->upperBound()); - - auto depthAxisItem = dynamic_cast<BasicAxisItem*>(getItem(P_Z_AXIS)); - auto depthAxis = depthAxisItem->createAxis(1.0); - simulation->setZSpan(depthAxis->size(), depthAxis->lowerBound(), depthAxis->upperBound()); - - TransformToDomain::setBeamDistribution( - "Wavelength", *beamItem()->item<BeamWavelengthItem>(SpecularBeamItem::P_WAVELENGTH), - *simulation.get()); - - TransformToDomain::setBeamDistribution( - "InclinationAngle", - *beamItem()->item<SpecularBeamInclinationItem>(SpecularBeamItem::P_INCLINATION_ANGLE), - *simulation.get()); - - return simulation; -} diff --git a/GUI/coregui/Models/DepthProbeInstrumentItem.h b/GUI/coregui/Models/DepthProbeInstrumentItem.h deleted file mode 100644 index ba1f29d09a04c2e0c6fe03242fb8bf7731100855..0000000000000000000000000000000000000000 --- a/GUI/coregui/Models/DepthProbeInstrumentItem.h +++ /dev/null @@ -1,43 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file GUI/coregui/Models/DepthProbeInstrumentItem.h -//! @brief Defines DepthProbeInstrumentItem class -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#ifndef BORNAGAIN_GUI_COREGUI_MODELS_DEPTHPROBEINSTRUMENTITEM_H -#define BORNAGAIN_GUI_COREGUI_MODELS_DEPTHPROBEINSTRUMENTITEM_H - -#include "GUI/coregui/Models/InstrumentItems.h" - -class DepthProbeSimulation; - -//! Depth probe instrument. - -class BA_CORE_API_ DepthProbeInstrumentItem : public InstrumentItem { -public: - static const QString P_BEAM; - static const QString P_Z_AXIS; - - DepthProbeInstrumentItem(); - - SpecularBeamItem* beamItem() const override; - - std::unique_ptr<Instrument> createInstrument() const override; - std::vector<int> shape() const override; - void updateToRealData(const RealDataItem* item) override; - virtual QString defaultName() const override; - - // FIXME switch to base ISimulation class after InstrumentItem refactoring and - // after ISimulation gets createUnitConverter method - std::unique_ptr<DepthProbeSimulation> createSimulation() const; -}; - -#endif // BORNAGAIN_GUI_COREGUI_MODELS_DEPTHPROBEINSTRUMENTITEM_H diff --git a/GUI/coregui/Models/DomainObjectBuilder.cpp b/GUI/coregui/Models/DomainObjectBuilder.cpp index a2a359ef452bbb7d4195708fbc0e967dd5306fb0..de7c3e3671b58b712061c43a6b4017d92dc1dc29 100644 --- a/GUI/coregui/Models/DomainObjectBuilder.cpp +++ b/GUI/coregui/Models/DomainObjectBuilder.cpp @@ -15,13 +15,12 @@ #include "GUI/coregui/Models/DomainObjectBuilder.h" #include "Base/Const/Units.h" #include "Core/Scan/UnitConverter1D.h" -#include "Core/Simulation/DepthProbeSimulation.h" #include "Device/Detector/IDetector2D.h" #include "Device/Detector/UnitConverter2D.h" #include "GUI/coregui/Models/AxesItems.h" #include "GUI/coregui/Models/ComboProperty.h" -#include "GUI/coregui/Models/DepthProbeInstrumentItem.h" #include "GUI/coregui/Models/InterferenceFunctionItems.h" +#include "GUI/coregui/Models/InstrumentItems.h" #include "GUI/coregui/Models/LayerItem.h" #include "GUI/coregui/Models/ParticleDistributionItem.h" #include "GUI/coregui/Models/ParticleLayoutItem.h" @@ -126,30 +125,3 @@ DomainObjectBuilder::buildInstrument(const InstrumentItem& instrumentItem) { return instrumentItem.createInstrument(); } - -std::unique_ptr<IUnitConverter> -DomainObjectBuilder::createUnitConverter(const InstrumentItem* instrumentItem) -{ - if (auto specular_instrument = dynamic_cast<const SpecularInstrumentItem*>(instrumentItem)) - return specular_instrument->createUnitConverter(); - - if (auto depth_instrument = dynamic_cast<const DepthProbeInstrumentItem*>(instrumentItem)) - return depth_instrument->createSimulation()->createUnitConverter(); - - const auto instrument = instrumentItem->createInstrument(); - instrument->initDetector(); - - if (instrumentItem->is<GISASInstrumentItem>()) - return UnitConverter2D::createConverterForGISAS(*instrument); - - if (instrumentItem->is<OffSpecularInstrumentItem>()) { - auto axis_item = - instrumentItem->item<BasicAxisItem>(OffSpecularInstrumentItem::P_ALPHA_AXIS); - const auto detector2d = dynamic_cast<const IDetector2D*>(instrument->getDetector()); - return std::make_unique<OffSpecularConverter>(*detector2d, instrument->beam(), - *axis_item->createAxis(Units::deg)); - } - - throw GUIHelpers::Error( - "Error in DomainObjectBuilder::createUnitConverter: unknown instrument type."); -} diff --git a/GUI/coregui/Models/DomainObjectBuilder.h b/GUI/coregui/Models/DomainObjectBuilder.h index bd9f2fb152e5dd7ead21d841518bc61633eb040f..48264b04eae0fa64a00c4df3b9de66ef3bd96198 100644 --- a/GUI/coregui/Models/DomainObjectBuilder.h +++ b/GUI/coregui/Models/DomainObjectBuilder.h @@ -27,14 +27,13 @@ class InstrumentItem; class IUnitConverter; namespace DomainObjectBuilder { + std::unique_ptr<MultiLayer> buildMultiLayer(const SessionItem& multilayer_item); std::unique_ptr<Layer> buildLayer(const SessionItem& item); std::unique_ptr<ParticleLayout> buildParticleLayout(const SessionItem& item); std::unique_ptr<IInterferenceFunction> buildInterferenceFunction(const SessionItem& item); std::unique_ptr<Instrument> buildInstrument(const InstrumentItem& instrumentItem); -//! Creates a unit converter corresponding to the given instrument item -std::unique_ptr<IUnitConverter> createUnitConverter(const InstrumentItem* instrumentItem); }; // namespace DomainObjectBuilder #endif // BORNAGAIN_GUI_COREGUI_MODELS_DOMAINOBJECTBUILDER_H diff --git a/GUI/coregui/Models/DomainSimulationBuilder.cpp b/GUI/coregui/Models/DomainSimulationBuilder.cpp index 6d63782be560d98aeaf06253526608367b8c571e..907bd0f2812e48cf175792e1353a13971c120876 100644 --- a/GUI/coregui/Models/DomainSimulationBuilder.cpp +++ b/GUI/coregui/Models/DomainSimulationBuilder.cpp @@ -20,10 +20,10 @@ #include "Device/Beam/IFootprintFactor.h" #include "GUI/coregui/Models/AxesItems.h" #include "GUI/coregui/Models/BackgroundItems.h" -#include "GUI/coregui/Models/DepthProbeInstrumentItem.h" #include "GUI/coregui/Models/DetectorItems.h" #include "GUI/coregui/Models/DomainObjectBuilder.h" #include "GUI/coregui/Models/FootprintItems.h" +#include "GUI/coregui/Models/InstrumentItems.h" #include "GUI/coregui/Models/MultiLayerItem.h" #include "GUI/coregui/Models/SimulationOptionsItem.h" #include "GUI/coregui/Models/SpecularBeamInclinationItem.h" @@ -115,12 +115,12 @@ createSpecularSimulation(std::unique_ptr<MultiLayer> P_multilayer, } std::unique_ptr<DepthProbeSimulation> -createDepthProbeSimulation(std::unique_ptr<MultiLayer> P_multilayer, +createDepthProbeSimulation(std::unique_ptr<MultiLayer> multilayer, const DepthProbeInstrumentItem* instrument, const SimulationOptionsItem* options_item) { std::unique_ptr<DepthProbeSimulation> ret = instrument->createSimulation(); - ret->setSample(*P_multilayer); + ret->setSample(*multilayer); if (options_item) TransformToDomain::setSimulationOptions(ret.get(), *options_item); @@ -130,6 +130,7 @@ createDepthProbeSimulation(std::unique_ptr<MultiLayer> P_multilayer, } // namespace + std::unique_ptr<ISimulation> DomainSimulationBuilder::createSimulation(const MultiLayerItem* sampleItem, const InstrumentItem* instrumentItem, diff --git a/GUI/coregui/Models/InstrumentItems.cpp b/GUI/coregui/Models/InstrumentItems.cpp index cf03ebbeccc49f58ddf7b2a35b0b3afb120be711..a8fbb2f489dc1c188f469acad338c7a7a220e1e7 100644 --- a/GUI/coregui/Models/InstrumentItems.cpp +++ b/GUI/coregui/Models/InstrumentItems.cpp @@ -13,11 +13,13 @@ // ************************************************************************************************ #include "GUI/coregui/Models/InstrumentItems.h" +#include "Base/Const/Units.h" #include "Core/Scan/UnitConverter1D.h" -#include "Device/Detector/IDetector2D.h" +#include "Core/Simulation/DepthProbeSimulation.h" +#include "Device/Detector/UnitConverter2D.h" #include "Device/Instrument/Instrument.h" #include "GUI/coregui/Models/BackgroundItems.h" -#include "GUI/coregui/Models/BeamItems.h" +#include "GUI/coregui/Models/BeamWavelengthItem.h" #include "GUI/coregui/Models/DataItem.h" #include "GUI/coregui/Models/DetectorItems.h" #include "GUI/coregui/Models/GroupItem.h" @@ -27,6 +29,8 @@ #include "GUI/coregui/Models/PointwiseAxisItem.h" #include "GUI/coregui/Models/RealDataItem.h" #include "GUI/coregui/Models/SessionModel.h" +#include "GUI/coregui/Models/SpecularBeamInclinationItem.h" +#include "GUI/coregui/Models/TransformToDomain.h" #include "GUI/coregui/utils/GUIHelpers.h" namespace { @@ -118,9 +122,7 @@ bool InstrumentItem::alignedWith(const RealDataItem* item) const std::unique_ptr<Instrument> InstrumentItem::createInstrument() const { std::unique_ptr<Instrument> result(new Instrument); - - auto beam = beamItem()->createBeam(); - result->setBeam(*beam); + result->setBeam(*beamItem()->createBeam()); return result; } @@ -159,11 +161,6 @@ SpecularBeamItem* SpecularInstrumentItem::beamItem() const SpecularInstrumentItem::~SpecularInstrumentItem() = default; -std::unique_ptr<Instrument> SpecularInstrumentItem::createInstrument() const -{ - return InstrumentItem::createInstrument(); -} - std::vector<int> SpecularInstrumentItem::shape() const { const auto axis_item = beamItem()->currentInclinationAxisItem(); @@ -272,9 +269,7 @@ void Instrument2DItem::importMasks(const MaskContainerItem* maskContainer) std::unique_ptr<Instrument> Instrument2DItem::createInstrument() const { auto result = InstrumentItem::createInstrument(); - - auto detector = detectorItem()->createDetector(); - result->setDetector(*detector); + result->setDetector(*detectorItem()->createDetector()); return result; } @@ -310,6 +305,12 @@ QString GISASInstrumentItem::defaultName() const return "GISAS"; } +std::unique_ptr<IUnitConverter> GISASInstrumentItem::createUnitConverter() const +{ + const auto instrument = createInstrument(); + instrument->initDetector(); + return UnitConverter2D::createConverterForGISAS(*instrument); +} // ************************************************************************************************ // class OffSpecularInstrumentItem @@ -354,3 +355,100 @@ QString OffSpecularInstrumentItem::defaultName() const { return "OffSpecular"; } + +std::unique_ptr<IUnitConverter> OffSpecularInstrumentItem::createUnitConverter() const +{ + const auto instrument = createInstrument(); + instrument->initDetector(); + auto axis_item = item<BasicAxisItem>(OffSpecularInstrumentItem::P_ALPHA_AXIS); + const auto detector2d = dynamic_cast<const IDetector2D*>(instrument->getDetector()); + return std::make_unique<OffSpecularConverter>(*detector2d, instrument->beam(), + *axis_item->createAxis(Units::deg)); +} + +// ************************************************************************************************ +// class DepthProbeInstrumentItem +// ************************************************************************************************ + + +const QString DepthProbeInstrumentItem::P_BEAM = "Beam"; +const QString DepthProbeInstrumentItem::P_Z_AXIS = "Z axis"; + +DepthProbeInstrumentItem::DepthProbeInstrumentItem() : InstrumentItem("DepthProbeInstrument") +{ + setItemName("DepthProbeInstrument"); + + addProperty<SpecularBeamItem>(P_BEAM); + + auto axisItem = beamItem()->currentInclinationAxisItem(); + axisItem->setLowerBound(0.0); + axisItem->setUpperBound(1.0); + axisItem->setBinCount(500); + + auto axis = addProperty<BasicAxisItem>(P_Z_AXIS); + axis->setLowerBound(-100.0); + axis->setUpperBound(100.0); + axis->getItem(BasicAxisItem::P_TITLE)->setVisible(false); + axis->getItem(BasicAxisItem::P_NBINS) + ->setToolTip("Number of points in scan across sample bulk"); + axis->getItem(BasicAxisItem::P_MIN_DEG) + ->setToolTip("Starting value below sample horizont in nm"); + axis->getItem(BasicAxisItem::P_MAX_DEG)->setToolTip("Ending value above sample horizont in nm"); +} + +SpecularBeamItem* DepthProbeInstrumentItem::beamItem() const +{ + return item<SpecularBeamItem>(P_BEAM); +} + +std::unique_ptr<Instrument> DepthProbeInstrumentItem::createInstrument() const +{ + throw std::runtime_error("DepthProbeInstrumentItem::createInstrument()"); +} + +std::vector<int> DepthProbeInstrumentItem::shape() const +{ + return std::vector<int>(); // no certain shape to avoid linking to real data +} + +void DepthProbeInstrumentItem::updateToRealData(const RealDataItem*) +{ + throw std::runtime_error("DepthProbeInstrumentItem::updateToRealData()"); +} + +QString DepthProbeInstrumentItem::defaultName() const +{ + return "DepthProbe"; +} + +std::unique_ptr<DepthProbeSimulation> DepthProbeInstrumentItem::createSimulation() const +{ + std::unique_ptr<DepthProbeSimulation> simulation = std::make_unique<DepthProbeSimulation>(); + + const auto axis_item = beamItem()->currentInclinationAxisItem(); + + auto axis = axis_item->createAxis(Units::deg); + + simulation->setBeamParameters(beamItem()->wavelength(), static_cast<int>(axis->size()), + axis->lowerBound(), axis->upperBound()); + + auto depthAxisItem = dynamic_cast<BasicAxisItem*>(getItem(P_Z_AXIS)); + auto depthAxis = depthAxisItem->createAxis(1.0); + simulation->setZSpan(depthAxis->size(), depthAxis->lowerBound(), depthAxis->upperBound()); + + TransformToDomain::setBeamDistribution( + "Wavelength", *beamItem()->item<BeamWavelengthItem>(SpecularBeamItem::P_WAVELENGTH), + *simulation.get()); + + TransformToDomain::setBeamDistribution( + "InclinationAngle", + *beamItem()->item<SpecularBeamInclinationItem>(SpecularBeamItem::P_INCLINATION_ANGLE), + *simulation.get()); + + return simulation; +} + +std::unique_ptr<IUnitConverter> DepthProbeInstrumentItem::createUnitConverter() const +{ + return createSimulation()->createUnitConverter(); +} diff --git a/GUI/coregui/Models/InstrumentItems.h b/GUI/coregui/Models/InstrumentItems.h index f733e2c7fd2b66eb1c6c70d326903b8b85ecbb9e..d12978d8ba31c07172e4146945c1abfcb7e40cbb 100644 --- a/GUI/coregui/Models/InstrumentItems.h +++ b/GUI/coregui/Models/InstrumentItems.h @@ -15,10 +15,11 @@ #ifndef BORNAGAIN_GUI_COREGUI_MODELS_INSTRUMENTITEMS_H #define BORNAGAIN_GUI_COREGUI_MODELS_INSTRUMENTITEMS_H -#include "GUI/coregui/Models/BeamItems.h" +#include "GUI/coregui/Models/BeamItems.h" // inheritance prevents forward declaration class BackgroundItem; class DataItem; +class DepthProbeSimulation; class DetectorItem; class GroupItem; class Instrument; @@ -49,7 +50,7 @@ public: BackgroundItem* backgroundItem() const; GroupItem* backgroundGroup(); - virtual std::unique_ptr<Instrument> createInstrument() const = 0; + virtual std::unique_ptr<Instrument> createInstrument() const; virtual std::vector<int> shape() const = 0; virtual void clearMasks() {} virtual void importMasks(const MaskContainerItem*) {} @@ -59,6 +60,8 @@ public: //! The default user visible name when creating an instrument virtual QString defaultName() const = 0; + virtual std::unique_ptr<IUnitConverter> createUnitConverter() const = 0; + protected: explicit InstrumentItem(const QString& modelType); @@ -73,13 +76,13 @@ public: SpecularBeamItem* beamItem() const override; - std::unique_ptr<Instrument> createInstrument() const override; + // std::unique_ptr<Instrument> createInstrument() const override; std::vector<int> shape() const override; void updateToRealData(const RealDataItem* item) override; bool alignedWith(const RealDataItem* item) const override; virtual QString defaultName() const override; - std::unique_ptr<IUnitConverter> createUnitConverter() const; + std::unique_ptr<IUnitConverter> createUnitConverter() const final; }; @@ -110,6 +113,8 @@ public: std::vector<int> shape() const override; void updateToRealData(const RealDataItem* item) override; virtual QString defaultName() const override; + + std::unique_ptr<IUnitConverter> createUnitConverter() const final; }; @@ -121,6 +126,30 @@ public: std::vector<int> shape() const override; void updateToRealData(const RealDataItem* item) override; virtual QString defaultName() const override; + + std::unique_ptr<IUnitConverter> createUnitConverter() const final; +}; + + +class BA_CORE_API_ DepthProbeInstrumentItem : public InstrumentItem { +public: + static const QString P_BEAM; + static const QString P_Z_AXIS; + + DepthProbeInstrumentItem(); + + SpecularBeamItem* beamItem() const override; + + std::unique_ptr<Instrument> createInstrument() const override; + std::vector<int> shape() const override; + void updateToRealData(const RealDataItem* item) override; + virtual QString defaultName() const override; + + // FIXME switch to base ISimulation class after InstrumentItem refactoring and + // after ISimulation gets createUnitConverter method + std::unique_ptr<DepthProbeSimulation> createSimulation() const; + + std::unique_ptr<IUnitConverter> createUnitConverter() const final; }; #endif // BORNAGAIN_GUI_COREGUI_MODELS_INSTRUMENTITEMS_H diff --git a/GUI/coregui/Models/ItemCatalog.cpp b/GUI/coregui/Models/ItemCatalog.cpp index 4c095c430c03c65cecdff1dcc139fd281dddbd4e..a88ffd651e0b57eff86358900d99a71a0fd5e50c 100644 --- a/GUI/coregui/Models/ItemCatalog.cpp +++ b/GUI/coregui/Models/ItemCatalog.cpp @@ -19,7 +19,6 @@ #include "GUI/coregui/Models/Data1DViewItem.h" #include "GUI/coregui/Models/DataProperties.h" #include "GUI/coregui/Models/DataPropertyContainer.h" -#include "GUI/coregui/Models/DepthProbeInstrumentItem.h" #include "GUI/coregui/Models/FTDecayFunctionItems.h" #include "GUI/coregui/Models/FTDistributionItems.h" #include "GUI/coregui/Models/FitParameterItems.h" @@ -27,6 +26,7 @@ #include "GUI/coregui/Models/FootprintItems.h" #include "GUI/coregui/Models/FormFactorItems.h" #include "GUI/coregui/Models/GroupItem.h" +#include "GUI/coregui/Models/InstrumentItems.h" #include "GUI/coregui/Models/IntensityDataItem.h" #include "GUI/coregui/Models/InterferenceFunctionItems.h" #include "GUI/coregui/Models/JobItem.h" diff --git a/GUI/coregui/Models/JobItemUtils.cpp b/GUI/coregui/Models/JobItemUtils.cpp index 4f99a8075eeb589a70a799d5ff4ec83e0df638c7..03f0989b8d66b48687520b066b248efa4158dc4c 100644 --- a/GUI/coregui/Models/JobItemUtils.cpp +++ b/GUI/coregui/Models/JobItemUtils.cpp @@ -67,7 +67,7 @@ void JobItemUtils::updateDataAxes(DataItem* intensityItem, const InstrumentItem* Axes::Units requested_units = axesUnitsFromName(intensityItem->selectedAxesUnits()); - const auto converter = DomainObjectBuilder::createUnitConverter(instrumentItem); + const auto converter = instrumentItem->createUnitConverter(); auto newData = converter->createOutputData(requested_units); newData->setRawDataVector(intensityItem->getOutputData()->getRawDataVector()); @@ -98,7 +98,7 @@ Axes::Units JobItemUtils::axesUnitsFromName(const QString& name) void JobItemUtils::setIntensityItemAxesUnits(DataItem* intensityItem, const InstrumentItem* instrumentItem) { - const auto converter = DomainObjectBuilder::createUnitConverter(instrumentItem); + const auto converter = instrumentItem->createUnitConverter(); if (!converter) return; setIntensityItemAxesUnits(intensityItem, *converter); @@ -114,7 +114,7 @@ void JobItemUtils::setIntensityItemAxesUnits(DataItem* intensityItem, void JobItemUtils::createDefaultDetectorMap(DataItem* intensityItem, const InstrumentItem* instrumentItem) { - const auto converter = DomainObjectBuilder::createUnitConverter(instrumentItem); + const auto converter = instrumentItem->createUnitConverter(); auto output_data = converter->createOutputData(converter->defaultUnits()); intensityItem->setOutputData(output_data.release()); setIntensityItemAxesUnits(intensityItem, *converter); diff --git a/GUI/coregui/Models/JobModelFunctions.cpp b/GUI/coregui/Models/JobModelFunctions.cpp index 794d0cd693cea637372d0737e15e672a969092c8..3e0c1908596e5e3732ee0eeaba3d83d76fecab58 100644 --- a/GUI/coregui/Models/JobModelFunctions.cpp +++ b/GUI/coregui/Models/JobModelFunctions.cpp @@ -18,7 +18,6 @@ #include "Device/Unit/IUnitConverter.h" #include "GUI/coregui/Models/Data1DViewItem.h" #include "GUI/coregui/Models/DataPropertyContainer.h" -#include "GUI/coregui/Models/DepthProbeInstrumentItem.h" #include "GUI/coregui/Models/DetectorItems.h" #include "GUI/coregui/Models/DomainObjectBuilder.h" #include "GUI/coregui/Models/FitParameterItems.h" @@ -79,7 +78,7 @@ void JobModelFunctions::initDataView(JobItem* job_item) // also triggers Data1DViewItem::setAxesRangeToData and DataViewUtils::updateAxesTitle by // setting new value of P_AXES_UNITS. - auto converter = DomainObjectBuilder::createUnitConverter(job_item->instrumentItem()); + auto converter = job_item->instrumentItem()->createUnitConverter(); view_item->setItemValue(Data1DViewItem::P_AXES_UNITS, JobItemUtils::availableUnits(*converter).variant()); } diff --git a/GUI/coregui/Models/SessionDecorationModel.cpp b/GUI/coregui/Models/SessionDecorationModel.cpp index 08e166e84681c6fb44ad583608c3ad8a70a7a854..938b0a014771277331b07dca8ef9ab896cbf2440 100644 --- a/GUI/coregui/Models/SessionDecorationModel.cpp +++ b/GUI/coregui/Models/SessionDecorationModel.cpp @@ -13,7 +13,6 @@ // ************************************************************************************************ #include "GUI/coregui/Models/SessionDecorationModel.h" -#include "GUI/coregui/Models/DepthProbeInstrumentItem.h" #include "GUI/coregui/Models/InstrumentItems.h" #include "GUI/coregui/Models/MaterialItem.h" #include "GUI/coregui/Models/SessionModel.h" diff --git a/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp index 36b6ef34bb06df3743899ea6c0e3b15b381371fd..acde70ca74633194322de8410bd221760ec33e13 100644 --- a/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp @@ -13,7 +13,7 @@ // ************************************************************************************************ #include "GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.h" -#include "GUI/coregui/Models/DepthProbeInstrumentItem.h" +#include "GUI/coregui/Models/InstrumentItems.h" #include "GUI/coregui/Models/SpecularBeamInclinationItem.h" #include "GUI/coregui/Views/InfoWidgets/DistributionDialog.h" #include "GUI/coregui/Views/PropertyEditor/ComponentEditor.h" diff --git a/GUI/coregui/Views/InstrumentWidgets/InstrumentPresenter.cpp b/GUI/coregui/Views/InstrumentWidgets/InstrumentPresenter.cpp index 9f12cfd69ef6889d5b2cbf53ab2b70cee1c14d80..03e2c5cf2e5dc22980bb3e4f8aa16fb9230d2be1 100644 --- a/GUI/coregui/Views/InstrumentWidgets/InstrumentPresenter.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/InstrumentPresenter.cpp @@ -13,7 +13,6 @@ // ************************************************************************************************ #include "GUI/coregui/Views/InstrumentWidgets/InstrumentPresenter.h" -#include "GUI/coregui/Models/DepthProbeInstrumentItem.h" #include "GUI/coregui/Models/InstrumentItems.h" #include "GUI/coregui/Models/SessionItem.h" #include "GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.h" diff --git a/GUI/coregui/Views/InstrumentWidgets/InstrumentViewActions.cpp b/GUI/coregui/Views/InstrumentWidgets/InstrumentViewActions.cpp index 8f2c92f192df69b872272ba1895f29cb17d8f80b..cdacc5b732f6234065aed0c34de6239285c68f25 100644 --- a/GUI/coregui/Views/InstrumentWidgets/InstrumentViewActions.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/InstrumentViewActions.cpp @@ -13,7 +13,6 @@ // ************************************************************************************************ #include "GUI/coregui/Views/InstrumentWidgets/InstrumentViewActions.h" -#include "GUI/coregui/Models/DepthProbeInstrumentItem.h" #include "GUI/coregui/Models/GroupItem.h" #include "GUI/coregui/Models/InstrumentItems.h" #include "GUI/coregui/Models/ModelUtils.h" diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i index ef3daa84044bb8f3b736b8543207f9a7142b88ff..0e12ad149c8f8296762f4cc42cc4be16641a54a0 100644 --- a/auto/Wrap/doxygenCore.i +++ b/auto/Wrap/doxygenCore.i @@ -2198,7 +2198,7 @@ C++ includes: UnitConverter1D.h %feature("docstring") UnitConverter1D::clone "UnitConverter1D* UnitConverter1D::clone() const override=0 "; -%feature("docstring") UnitConverter1D::dimension "size_t UnitConverter1D::dimension() const override +%feature("docstring") UnitConverter1D::dimension "size_t UnitConverter1D::dimension() const final Returns dimensionality of converted canvas. "; diff --git a/auto/Wrap/doxygenDevice.i b/auto/Wrap/doxygenDevice.i index a896ca2be7e057f9709af1a80702ae18ba825d29..0581d585e0edd54126d4c1158741a29f67e8c936 100644 --- a/auto/Wrap/doxygenDevice.i +++ b/auto/Wrap/doxygenDevice.i @@ -1456,7 +1456,7 @@ Returns true if area defined by two bins is inside or on border of polygon (more Interface to provide axis translations to different units for simulation output. Child classes are currently declared in -Device/Detector/SimpleUnitConverters.h, + Device/Detector/UnitConverter2D.h, Core/Scan/UnitConverter1D.h. @@ -1495,9 +1495,6 @@ Returns zero-valued output data array in specified units. %feature("docstring") IUnitConverter::defaultUnits "virtual Axes::Units IUnitConverter::defaultUnits() const =0 "; -%feature("docstring") IUnitConverter::substituteDefaultUnits "Axes::Units IUnitConverter::substituteDefaultUnits(Axes::Units units) const -"; - %feature("docstring") IUnitConverter::createConvertedAxis "virtual std::unique_ptr<IAxis> IUnitConverter::createConvertedAxis(size_t i_axis, Axes::Units units) const =0 "; @@ -2698,7 +2695,7 @@ C++ includes: UnitConverter2D.h %feature("docstring") UnitConverter2D::~UnitConverter2D "UnitConverter2D::~UnitConverter2D() override=default "; -%feature("docstring") UnitConverter2D::dimension "size_t UnitConverter2D::dimension() const override +%feature("docstring") UnitConverter2D::dimension "virtual size_t UnitConverter2D::dimension() const override "; %feature("docstring") UnitConverter2D::calculateMin "double UnitConverter2D::calculateMin(size_t i_axis, Axes::Units units) const override @@ -2712,7 +2709,7 @@ C++ includes: UnitConverter2D.h %feature("docstring") UnitConverter2D::availableUnits "std::vector< Axes::Units > UnitConverter2D::availableUnits() const override -Returns the list of all available units. +Returns list of units that are available for all 2D detectors. Further units may be added by child classes. "; %feature("docstring") UnitConverter2D::createConvertedAxis "std::unique_ptr< IAxis > UnitConverter2D::createConvertedAxis(size_t i_axis, Axes::Units units) const override