diff --git a/Core/Fitting/SimDataPair.cpp b/Core/Fitting/SimDataPair.cpp index ff336ec5b387795d51c7769a8dd731c2e73eec7f..f6ab295de6a02a47f90d6b46d24930a123cdbad0 100644 --- a/Core/Fitting/SimDataPair.cpp +++ b/Core/Fitting/SimDataPair.cpp @@ -15,7 +15,7 @@ #include "Core/Fitting/SimDataPair.h" #include "Base/Math/Numeric.h" #include "Core/Scan/UnitConverter1D.h" -#include "Core/Simulation/UnitConverterUtils.h" +#include "Device/Detector/SimpleUnitConverters.h" #include "Core/Simulation/includeSimulations.h" #include "Device/Data/DataUtils.h" @@ -51,7 +51,7 @@ bool detHasSameDimensions(const IDetector& detector, const OutputData<double>& d std::unique_ptr<IUnitConverter> createConverter(const ISimulation& simulation) { if (auto gisas = dynamic_cast<const GISASSimulation*>(&simulation)) - return UnitConverterUtils::createConverterForGISAS(gisas->instrument()); + return UnitConverterSimple::createConverterForGISAS(gisas->instrument()); if (auto spec = dynamic_cast<const SpecularSimulation*>(&simulation)) return UnitConverter1D::createUnitConverter(*spec->dataHandler()); @@ -62,8 +62,7 @@ std::unique_ptr<IUnitConverter> createConverter(const ISimulation& simulation) if (auto off_spec = dynamic_cast<const OffSpecularSimulation*>(&simulation)) return off_spec->createUnitConverter(); - throw std::runtime_error("UnitConverterUtils::createConverter -> " - "Not implemented simulation."); + ASSERT(0); } //! Convert user data to SimulationResult object for later drawing in various axes units. diff --git a/Core/Simulation/GISASSimulation.cpp b/Core/Simulation/GISASSimulation.cpp index fb556a2fd649f5b6a0871e21f32b2042bd1d6e74..b97a1056f61f2f314786e2c56f1534b7745981c3 100644 --- a/Core/Simulation/GISASSimulation.cpp +++ b/Core/Simulation/GISASSimulation.cpp @@ -13,7 +13,7 @@ // ************************************************************************************************ #include "Core/Simulation/GISASSimulation.h" -#include "Core/Simulation/UnitConverterUtils.h" +#include "Device/Detector/SimpleUnitConverters.h" #include "Sample/SampleBuilderEngine/ISampleBuilder.h" GISASSimulation::GISASSimulation(const Beam& beam, const MultiLayer& sample, @@ -57,7 +57,7 @@ void GISASSimulation::prepareSimulation() SimulationResult GISASSimulation::result() const { - const auto converter = UnitConverterUtils::createConverterForGISAS(instrument()); + const auto converter = UnitConverterSimple::createConverterForGISAS(instrument()); const std::unique_ptr<OutputData<double>> data( detector().createDetectorIntensity(m_sim_elements)); return SimulationResult(*data, *converter); diff --git a/Core/Simulation/UnitConverterUtils.cpp b/Core/Simulation/UnitConverterUtils.cpp deleted file mode 100644 index 723ab3517cf3737bf78e598033561cc1a4af7465..0000000000000000000000000000000000000000 --- a/Core/Simulation/UnitConverterUtils.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file Core/Simulation/UnitConverterUtils.cpp -//! @brief Implements utilities for unit convertion. -//! -//! @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 "Core/Simulation/UnitConverterUtils.h" -#include "Device/Detector/RectangularDetector.h" -#include "Device/Detector/SimpleUnitConverters.h" -#include "Device/Detector/SphericalDetector.h" -#include "Device/Instrument/Instrument.h" - -std::unique_ptr<IUnitConverter> -UnitConverterUtils::createConverterForGISAS(const Instrument& instrument) -{ - const IDetector* const detector = instrument.getDetector(); - - if (const auto* const det = dynamic_cast<const SphericalDetector*>(detector)) - return std::make_unique<SphericalConverter>(*det, instrument.beam()); - - if (const auto* const det = dynamic_cast<const RectangularDetector*>(detector)) - return std::make_unique<RectangularConverter>(*det, instrument.beam()); - - throw std::runtime_error("Error in createConverterForGISAS: wrong or absent detector type"); -} diff --git a/Core/Simulation/UnitConverterUtils.h b/Core/Simulation/UnitConverterUtils.h deleted file mode 100644 index cfb4ac7c99de5fc6fe0baa00530ef61a2cbc3416..0000000000000000000000000000000000000000 --- a/Core/Simulation/UnitConverterUtils.h +++ /dev/null @@ -1,39 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file Core/Simulation/UnitConverterUtils.h -//! @brief Declares utilities for unit converters. -//! -//! @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) -// -// ************************************************************************************************ - -#ifdef SWIG -#error no need to expose this header to Swig -#endif - -#ifndef USER_API -#ifndef BORNAGAIN_CORE_SIMULATION_UNITCONVERTERUTILS_H -#define BORNAGAIN_CORE_SIMULATION_UNITCONVERTERUTILS_H - -#include "Device/Unit/IUnitConverter.h" - -class Instrument; -template <class T> class OutputData; - -//! Namespace enclosing a number of utilities/helpers for unit converters - -namespace UnitConverterUtils { - -//! Helper factory function to use in GISASSimulation. Depending on the type of detector, -//! returns either RectangularConverter or SphericalConverter. -std::unique_ptr<IUnitConverter> createConverterForGISAS(const Instrument& instrument); - -} // namespace UnitConverterUtils - -#endif // BORNAGAIN_CORE_SIMULATION_UNITCONVERTERUTILS_H -#endif // USER_API diff --git a/Device/Detector/SimpleUnitConverters.cpp b/Device/Detector/SimpleUnitConverters.cpp index 7be4f59181d46eba84fb21ac70d2436cf7fba7fa..10e08f5f967a7472ef337e3a219cb5c8e94612a9 100644 --- a/Device/Detector/SimpleUnitConverters.cpp +++ b/Device/Detector/SimpleUnitConverters.cpp @@ -16,7 +16,7 @@ #include "Base/Const/Units.h" #include "Base/Math/Constants.h" #include "Base/Pixel/RectangularPixel.h" -#include "Device/Beam/Beam.h" +#include "Device/Instrument/Instrument.h" #include "Device/Detector/RectangularDetector.h" #include "Device/Detector/SphericalDetector.h" #include "Device/ProDetector/RegionOfInterest.h" @@ -117,6 +117,20 @@ void UnitConverterSimple::addDetectorAxis(const IDetector& detector, size_t i_ax P_roi_axis->size()); } +std::unique_ptr<UnitConverterSimple> +UnitConverterSimple::createConverterForGISAS(const Instrument& instrument) +{ + const IDetector* const detector = instrument.getDetector(); + + if (const auto* const det = dynamic_cast<const SphericalDetector*>(detector)) + return std::make_unique<SphericalConverter>(*det, instrument.beam()); + + if (const auto* const det = dynamic_cast<const RectangularDetector*>(detector)) + return std::make_unique<RectangularConverter>(*det, instrument.beam()); + + throw std::runtime_error("Error in createConverterForGISAS: wrong or absent detector type"); +} + // ************************************************************************************************ // class SphericalConverter // ************************************************************************************************ diff --git a/Device/Detector/SimpleUnitConverters.h b/Device/Detector/SimpleUnitConverters.h index 464877ca6a66a19a253039159ec8370fd1912731..b2f52e59eda679fb1a346406ec5e90fbf1b1ec83 100644 --- a/Device/Detector/SimpleUnitConverters.h +++ b/Device/Detector/SimpleUnitConverters.h @@ -26,6 +26,7 @@ class Beam; class IDetector; class IDetector2D; +class Instrument; class RectangularDetector; class RectangularPixel; class SphericalDetector; @@ -49,6 +50,11 @@ public: std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, Axes::Units units) const override; + //! Helper factory function to use in GISASSimulation. Depending on the type of detector, + //! returns either RectangularConverter or SphericalConverter. + static std::unique_ptr<UnitConverterSimple> createConverterForGISAS( + const Instrument& instrument); + protected: UnitConverterSimple(const UnitConverterSimple& other); void addDetectorAxis(const IDetector& detector, size_t i_axis); diff --git a/GUI/coregui/Models/DomainObjectBuilder.cpp b/GUI/coregui/Models/DomainObjectBuilder.cpp index d4e7d16ac1b79b2178c70b5e534c795db643908d..91946b33fc72d1acecbce8412469b1c166594f51 100644 --- a/GUI/coregui/Models/DomainObjectBuilder.cpp +++ b/GUI/coregui/Models/DomainObjectBuilder.cpp @@ -15,7 +15,6 @@ #include "GUI/coregui/Models/DomainObjectBuilder.h" #include "Base/Const/Units.h" #include "Core/Scan/UnitConverter1D.h" -#include "Core/Simulation/UnitConverterUtils.h" #include "Device/Detector/IDetector2D.h" #include "Device/Detector/SimpleUnitConverters.h" #include "GUI/coregui/Models/AxesItems.h" @@ -40,11 +39,10 @@ std::unique_ptr<MultiLayer> DomainObjectBuilder::buildMultiLayer(const SessionIt ASSERT(roughnessItem); auto P_roughness = TransformToDomain::createLayerRoughness(*roughnessItem); if (P_layer) { - if (P_roughness) { + if (P_roughness) P_multilayer->addLayerWithTopRoughness(*P_layer, *P_roughness); - } else { + else P_multilayer->addLayer(*P_layer); - } } } } @@ -58,9 +56,8 @@ std::unique_ptr<Layer> DomainObjectBuilder::buildLayer(const SessionItem& item) for (int i = 0; i < children.size(); ++i) { if (children[i]->modelType() == "ParticleLayout") { auto P_layout = buildParticleLayout(*children[i]); - if (P_layout) { + if (P_layout) P_layer->addLayout(*P_layout); - } } } return P_layer; @@ -109,9 +106,8 @@ std::unique_ptr<ParticleLayout> DomainObjectBuilder::buildParticleLayout(const S QVector<SessionItem*> interferences = item.getItems(ParticleLayoutItem::T_INTERFERENCE); for (int i = 0; i < interferences.size(); i++) { auto P_interference = buildInterferenceFunction(*interferences[i]); - if (P_interference) { + if (P_interference) P_layout->setInterferenceFunction(*P_interference); - } } return P_layout; } @@ -143,7 +139,7 @@ DomainObjectBuilder::createUnitConverter(const InstrumentItem* instrumentItem) instrument->initDetector(); if (instrumentItem->is<GISASInstrumentItem>()) - return UnitConverterUtils::createConverterForGISAS(*instrument); + return UnitConverterSimple::createConverterForGISAS(*instrument); if (instrumentItem->is<OffSpecularInstrumentItem>()) { auto axis_item =