diff --git a/GUI/Model/FromCore/FromCore.h b/GUI/Model/FromCore/FromCore.h deleted file mode 100644 index ae62dd1e07d1b3a386b6511f1878ae2e76a7dde6..0000000000000000000000000000000000000000 --- a/GUI/Model/FromCore/FromCore.h +++ /dev/null @@ -1,74 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file GUI/Model/FromCore/FromCore.h -//! @brief Defines namespace GUI::Transform::FromCore -//! -//! @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_MODEL_FROMCORE_FROMCORE_H -#define BORNAGAIN_GUI_MODEL_FROMCORE_FROMCORE_H - -#include <QString> -#include <variant> - -class BasicAxisItem; -class BeamDistributionItem; -class BeamItem; -class DetectorItem; -class GISASInstrumentItem; -class Instrument2DItem; -class InstrumentItem; -class RectangularDetectorItem; -class SpecularBeamItem; -class SphericalDetectorItem; - -class IAxis; -class IDetector; -class ISimulation2D; -class ISimulation; -class OffspecSimulation; -class ParameterDistribution; -class RectangularDetector; -class ScatteringSimulation; -class SessionItem; -class SpecularSimulation; -class SphericalDetector; - -namespace GUI::Transform::FromCore { - -void setGISASBeamItem(BeamItem* beam_item, const ScatteringSimulation& simulation); - -void setOffspecBeamItem(BeamItem* beam_item, const OffspecSimulation& simulation); - -void setSpecularBeamItem(SpecularBeamItem* beam_item, const SpecularSimulation& simulation); - -void updateDetector(Instrument2DItem* instrument_item, const ISimulation2D& simulation); - -void setDetectorGeometry(Instrument2DItem* instrument_item, const IDetector& detector); - -void setDetectorResolution(DetectorItem* detector_item, const IDetector& detector); - -void setPolarizerAnalyzer(Instrument2DItem* instrument_item, const ISimulation2D& simulation); - -void setSphericalDetector(SphericalDetectorItem* detector_item, const SphericalDetector& detector); - -void setRectangularDetector(RectangularDetectorItem* detector_item, - const RectangularDetector& detector); - -void setItemFromSample(BeamDistributionItem* beam_distribution_item, - const ParameterDistribution& parameter_distribution); - -void setBackground(InstrumentItem* instrument_item, const ISimulation& simulation); - -void setAxisItem(BasicAxisItem* item, const IAxis& axis, double factor = 1.0); - -} // namespace GUI::Transform::FromCore - -#endif // BORNAGAIN_GUI_MODEL_FROMCORE_FROMCORE_H diff --git a/GUI/Model/FromCore/GUIExamplesFactory.cpp b/GUI/Model/FromCore/GUIExamplesFactory.cpp index 7d21be067f218c13281e2c52abb485a4fde34a35..fc3bbe2f56cb60e4bec737d1f1daa89c3fe77605 100644 --- a/GUI/Model/FromCore/GUIExamplesFactory.cpp +++ b/GUI/Model/FromCore/GUIExamplesFactory.cpp @@ -14,8 +14,8 @@ #include "GUI/Model/FromCore/GUIExamplesFactory.h" #include "Base/Util/Assert.h" -#include "GUI/Model/FromCore/GUIObjectBuilder.h" -#include "GUI/Model/FromCore/GUISampleBuilder.h" +#include "GUI/Model/FromCore/ItemizeSimulation.h" +#include "GUI/Model/FromCore/ItemizeSample.h" #include "Sample/Multilayer/MultiLayer.h" #include "Sample/StandardSamples/ExemplarySamples.h" #include <QMap> diff --git a/GUI/Model/FromCore/GUIObjectBuilder.cpp b/GUI/Model/FromCore/GUIObjectBuilder.cpp deleted file mode 100644 index aed3e0e6f5ced5dbb6551708e93ac98f4dc44efa..0000000000000000000000000000000000000000 --- a/GUI/Model/FromCore/GUIObjectBuilder.cpp +++ /dev/null @@ -1,101 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file GUI/Model/FromCore/GUIObjectBuilder.cpp -//! @brief Implements GUI::Model::ObjectBuilder namespace -//! -//! @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/Model/FromCore/GUIObjectBuilder.h" -#include "Base/Const/Units.h" -#include "Base/Util/Assert.h" -#include "GUI/Model/Device/InstrumentCollection.h" -#include "GUI/Model/Device/InstrumentItems.h" -#include "GUI/Model/FromCore/FromCore.h" -#include "GUI/Model/FromCore/GUISampleBuilder.h" -#include "GUI/Support/Data/SimulationOptionsItem.h" -#include "Resample/Options/SimulationOptions.h" -#include "Sim/Simulation/includeSimulations.h" - -namespace { - -GISASInstrumentItem* createGISASInstrumentItem(InstrumentCollection* model, - const ScatteringSimulation& simulation) -{ - auto* result = model->addInstrument<GISASInstrumentItem>(); - GUI::Transform::FromCore::setGISASBeamItem(result->beamItem(), simulation); - GUI::Transform::FromCore::updateDetector(result, simulation); - GUI::Transform::FromCore::setBackground(result, simulation); - - return result; -} - -OffspecInstrumentItem* createOffspecInstrumentItem(InstrumentCollection* model, - const OffspecSimulation& simulation) -{ - auto* result = model->addInstrument<OffspecInstrumentItem>(); - GUI::Transform::FromCore::setOffspecBeamItem(result->beamItem(), simulation); - GUI::Transform::FromCore::updateDetector(result, simulation); - GUI::Transform::FromCore::setBackground(result, simulation); - - const double factor = 1. / Units::deg; - result->alphaAxis().setNbins(simulation.beamAxis()->size()); - result->alphaAxis().setMin(factor * simulation.beamAxis()->min()); - result->alphaAxis().setMax(factor * simulation.beamAxis()->max()); - - return result; -} - -SpecularInstrumentItem* createSpecularInstrumentItem(InstrumentCollection* model, - const SpecularSimulation& simulation) -{ - auto* result = model->addInstrument<SpecularInstrumentItem>(); - GUI::Transform::FromCore::setSpecularBeamItem(result->beamItem(), simulation); - GUI::Transform::FromCore::setBackground(result, simulation); - - return result; -} - -} // namespace - -// ************************************************************************************************ -// class implementation -// ************************************************************************************************ - -InstrumentCollection* GUI::Transform::FromCore::itemizeInstruments(const ISimulation& simulation) -{ - auto* result = new InstrumentCollection; - - if (const auto* gisasSimulation = dynamic_cast<const ScatteringSimulation*>(&simulation)) - createGISASInstrumentItem(result, *gisasSimulation); - else if (const auto* offspecSimulation = dynamic_cast<const OffspecSimulation*>(&simulation)) - createOffspecInstrumentItem(result, *offspecSimulation); - else if (const auto* spec_simulation = dynamic_cast<const SpecularSimulation*>(&simulation)) - createSpecularInstrumentItem(result, *spec_simulation); - else - ASSERT(0); - - return result; -} - -SimulationOptionsItem* GUI::Transform::FromCore::itemizeOptions(const ISimulation& simulation) -{ - auto* result = new SimulationOptionsItem; - - if (simulation.options().isIntegrate()) - result->setUseMonteCarloIntegration( - static_cast<unsigned>(simulation.options().getMcPoints())); - else - result->setUseAnalytical(); - - result->setUseAverageMaterials(simulation.options().useAvgMaterials()); - result->setIncludeSpecularPeak(simulation.options().includeSpecular()); - - return result; -} diff --git a/GUI/Model/FromCore/GUISampleBuilder.cpp b/GUI/Model/FromCore/ItemizeSample.cpp similarity index 99% rename from GUI/Model/FromCore/GUISampleBuilder.cpp rename to GUI/Model/FromCore/ItemizeSample.cpp index 2b23759f1239f8ba3e3096399e92b7454bd297df..78d0392b985d0a248575d426351206b71edff6fd 100644 --- a/GUI/Model/FromCore/GUISampleBuilder.cpp +++ b/GUI/Model/FromCore/ItemizeSample.cpp @@ -2,7 +2,7 @@ // // BornAgain: simulate and fit reflection and scattering // -//! @file GUI/Model/FromCore/GUISampleBuilder.cpp +//! @file GUI/Model/FromCore/ItemizeSample.cpp //! @brief Implements class GUISampleBuilder //! //! @homepage http://www.bornagainproject.org @@ -12,10 +12,9 @@ // // ************************************************************************************************ -#include "GUI/Model/FromCore/GUISampleBuilder.h" +#include "GUI/Model/FromCore/ItemizeSample.h" #include "Base/Const/Units.h" #include "GUI/Model/Descriptor/DoubleDescriptor.h" -#include "GUI/Model/FromCore/FromCore.h" #include "GUI/Model/Sample/LayerItem.h" #include "GUI/Model/Sample/MaterialItem.h" #include "GUI/Model/Sample/MaterialItems.h" @@ -629,6 +628,7 @@ void copyParticle(const IParticle* iparticle, MaterialItems& matItems, } // namespace + namespace GUI::Transform::FromCore { MultiLayerItem* itemizeSample(const MultiLayer& sample, const QString& nodeName) diff --git a/GUI/Model/FromCore/GUISampleBuilder.h b/GUI/Model/FromCore/ItemizeSample.h similarity index 79% rename from GUI/Model/FromCore/GUISampleBuilder.h rename to GUI/Model/FromCore/ItemizeSample.h index 494dd9926126d1244ac6be66d56bbc75cfdbbb2f..0b2adcc88943143e761005629c1369a5260575ca 100644 --- a/GUI/Model/FromCore/GUISampleBuilder.h +++ b/GUI/Model/FromCore/ItemizeSample.h @@ -2,7 +2,7 @@ // // BornAgain: simulate and fit reflection and scattering // -//! @file GUI/Model/FromCore/GUISampleBuilder.h +//! @file GUI/Model/FromCore/ItemizeSample.h //! @brief Defines class GUISampleBuilder //! //! @homepage http://www.bornagainproject.org @@ -12,8 +12,8 @@ // // ************************************************************************************************ -#ifndef BORNAGAIN_GUI_MODEL_FROMCORE_GUISAMPLEBUILDER_H -#define BORNAGAIN_GUI_MODEL_FROMCORE_GUISAMPLEBUILDER_H +#ifndef BORNAGAIN_GUI_MODEL_FROMCORE_ITEMIZESAMPLE_H +#define BORNAGAIN_GUI_MODEL_FROMCORE_ITEMIZESAMPLE_H #include <QString> @@ -27,4 +27,4 @@ MultiLayerItem* itemizeSample(const MultiLayer& sample, const QString& nodeName } // namespace GUI::Transform::FromCore -#endif // BORNAGAIN_GUI_MODEL_FROMCORE_GUISAMPLEBUILDER_H +#endif // BORNAGAIN_GUI_MODEL_FROMCORE_ITEMIZESAMPLE_H diff --git a/GUI/Model/FromCore/FromCore.cpp b/GUI/Model/FromCore/ItemizeSimulation.cpp similarity index 81% rename from GUI/Model/FromCore/FromCore.cpp rename to GUI/Model/FromCore/ItemizeSimulation.cpp index 86d5677b00e78d54e0a7662333ab5d54514582ca..52c1b9000a31c36a8cc0ee82567ea3ef5c982681 100644 --- a/GUI/Model/FromCore/FromCore.cpp +++ b/GUI/Model/FromCore/ItemizeSimulation.cpp @@ -2,8 +2,8 @@ // // BornAgain: simulate and fit reflection and scattering // -//! @file GUI/Model/FromCore/FromCore.cpp -//! @brief Implements namespace TransformFromCore +//! @file GUI/Model/FromCore/ItemizeSimulation.cpp +//! @brief Implements functions that convert ISimulation from core to GUI items //! //! @homepage http://www.bornagainproject.org //! @license GNU General Public License v3 or higher (see COPYING) @@ -12,8 +12,9 @@ // // ************************************************************************************************ -#include "GUI/Model/FromCore/FromCore.h" +#include "GUI/Model/FromCore/ItemizeSimulation.h" #include "Base/Const/Units.h" +#include "Base/Util/Assert.h" #include "Device/Beam/Beam.h" #include "Device/Beam/FootprintGauss.h" #include "Device/Beam/FootprintSquare.h" @@ -31,19 +32,23 @@ #include "GUI/Model/Device/BackgroundItems.h" #include "GUI/Model/Device/BeamAngleItems.h" #include "GUI/Model/Device/BeamWavelengthItem.h" +#include "GUI/Model/Device/InstrumentCollection.h" #include "GUI/Model/Device/InstrumentItems.h" #include "GUI/Model/Device/MaskItems.h" #include "GUI/Model/Device/RectangularDetectorItem.h" #include "GUI/Model/Device/ResolutionFunctionItems.h" #include "GUI/Model/Device/SphericalDetectorItem.h" +#include "GUI/Model/FromCore/ItemizeSample.h" #include "GUI/Model/Sample/LayerItem.h" #include "GUI/Model/Sample/MesoCrystalItem.h" #include "GUI/Model/Sample/ParticleItem.h" #include "GUI/Model/Sample/ParticleLayoutItem.h" +#include "GUI/Support/Data/SimulationOptionsItem.h" #include "GUI/Util/Error.h" #include "Param/Distrib/Distributions.h" #include "Param/Distrib/RangedDistributions.h" #include "Param/Node/NodeUtils.h" +#include "Resample/Options/SimulationOptions.h" #include "Sim/Background/ConstantBackground.h" #include "Sim/Background/PoissonBackground.h" #include "Sim/Scan/AlphaScan.h" @@ -152,27 +157,6 @@ void setFootprintFactor(const IFootprintFactor* footprint, SpecularBeamItem* bea beam_item->setSquareFootprint(square_fp->widthRatio()); } -void addDistributionToBeamItem(ParameterDistribution::WhichParameter which, - BeamDistributionItem* item, - const ParameterDistribution& distribution) -{ - if (distribution.whichParameter() != which) - return; - - GUI::Transform::FromCore::setItemFromSample(item, distribution); -} - -void addRangedDistributionToItem(BeamDistributionItem* distributionItem, - const IRangedDistribution& ranged, double mean, double std_dev) -{ - if (!distributionItem) - return; - ParameterDistribution par_distr(ParameterDistribution::None, - *ranged.distribution(mean, std_dev), ranged.nSamples(), - ranged.sigmaFactor(), ranged.limits()); - GUI::Transform::FromCore::setItemFromSample(distributionItem, par_distr); -} - void setDistribution(BeamDistributionItem* part_distr_item, ParameterDistribution par_distr, double factor) { @@ -212,7 +196,7 @@ void setDistribution(BeamDistributionItem* part_distr_item, ParameterDistributio distr_trapez_item->setRightWidth(factor * distr->getRightWidth()); distItem = distr_trapez_item; } else - throw Error("GUI::Transform::FromCore::setDistribution: -> unknown distribution"); + throw Error("setDistribution: -> unknown distribution"); distItem->setNumberOfSamples((int)par_distr.getNbrSamples()); @@ -223,13 +207,46 @@ void setDistribution(BeamDistributionItem* part_distr_item, ParameterDistributio distItem->setLimits(par_distr.getLimits().scaledLimits(factor)); } -} // namespace +void setItemFromSample( + BeamDistributionItem* beam_distribution_item, + const ParameterDistribution& parameter_distribution) +{ + ASSERT(beam_distribution_item); -// ************************************************************************************************ -// class implementation -// ************************************************************************************************ + if (parameter_distribution.getMinValue() < parameter_distribution.getMaxValue()) { + throw Error( + "setItemFromSample(BeamDistributionItem* " + "beamDistributionItem," + "const ParameterDistribution& parameterDistribution) -> Error. ParameterDistribution " + "with defined min,max are not yet implemented in GUI"); + } + + const double unit_factor = 1.0 / beam_distribution_item->scaleFactor(); + setDistribution(beam_distribution_item, parameter_distribution, unit_factor); +} + +void addDistributionToBeamItem(ParameterDistribution::WhichParameter which, + BeamDistributionItem* item, + const ParameterDistribution& distribution) +{ + if (distribution.whichParameter() != which) + return; + + setItemFromSample(item, distribution); +} + +void addRangedDistributionToItem(BeamDistributionItem* distributionItem, + const IRangedDistribution& ranged, double mean, double std_dev) +{ + if (!distributionItem) + return; + ParameterDistribution par_distr(ParameterDistribution::None, + *ranged.distribution(mean, std_dev), ranged.nSamples(), + ranged.sigmaFactor(), ranged.limits()); + setItemFromSample(distributionItem, par_distr); +} -void GUI::Transform::FromCore::setGISASBeamItem(BeamItem* beam_item, +void setGISASBeamItem(BeamItem* beam_item, const ScatteringSimulation& simulation) { ASSERT(beam_item); @@ -253,7 +270,7 @@ void GUI::Transform::FromCore::setGISASBeamItem(BeamItem* beam_item, } } -void GUI::Transform::FromCore::setOffspecBeamItem(BeamItem* beam_item, +void setOffspecBeamItem(BeamItem* beam_item, const OffspecSimulation& simulation) { const Beam& beam = simulation.beam(); @@ -265,7 +282,18 @@ void GUI::Transform::FromCore::setOffspecBeamItem(BeamItem* beam_item, // TODO implement beam divergence } -void GUI::Transform::FromCore::setSpecularBeamItem(SpecularBeamItem* beam_item, +void setAxisItem(BasicAxisItem* item, const IAxis& axis, double factor) +{ + if (!dynamic_cast<const FixedBinAxis*>(&axis)) + throw Error("setAxisItem() -> Error. Unexpected axis"); + + item->setBinCount(static_cast<int>(axis.size())); + item->setLowerBound(factor * axis.min()); + item->setUpperBound(factor * axis.max()); + item->setTitle(QString::fromStdString(axis.axisName())); +} + +void setSpecularBeamItem(SpecularBeamItem* beam_item, const SpecularSimulation& simulation) { const Beam& beam = simulation.beam(); @@ -276,7 +304,7 @@ void GUI::Transform::FromCore::setSpecularBeamItem(SpecularBeamItem* beam_item, beam_item->setAzimuthalAngle(0.0); // azimuthal angle is hardcoded auto* axis_item = beam_item->inclinationAxis(); - GUI::Transform::FromCore::setAxisItem(axis_item, *simulation.coordinateAxis(), 1. / Units::deg); + setAxisItem(axis_item, *simulation.coordinateAxis(), 1. / Units::deg); setFootprintFactor(simulation.footprintFactor(), beam_item); @@ -300,77 +328,7 @@ void GUI::Transform::FromCore::setSpecularBeamItem(SpecularBeamItem* beam_item, } } -void GUI::Transform::FromCore::updateDetector(Instrument2DItem* instrument_item, - const ISimulation2D& simulation) -{ - const IDetector& detector = simulation.detector(); - setDetectorGeometry(instrument_item, detector); - - auto* detector_item = instrument_item->detectorItem(); - - setDetectorResolution(detector_item, detector); - setDetectorMasks(detector_item, simulation); - setPolarizerAnalyzer(instrument_item, simulation); -} - -void GUI::Transform::FromCore::setDetectorGeometry(Instrument2DItem* instrument_item, - const IDetector& detector) -{ - if (const auto* det = dynamic_cast<const SphericalDetector*>(&detector)) { - auto* item = instrument_item->setDetectorType<SphericalDetectorItem>(); - setSphericalDetector(item, *det); - } else if (const auto* det = dynamic_cast<const RectangularDetector*>(&detector)) { - auto* item = instrument_item->setDetectorType<RectangularDetectorItem>(); - setRectangularDetector(item, *det); - } else { - throw Error("GUI::Transform::FromCore::setDetectorGeometry() -> Unknown detector type."); - } -} - -void GUI::Transform::FromCore::setDetectorResolution(DetectorItem* detector_item, - const IDetector& detector) -{ - const IDetectorResolution* p_resfunc = detector.detectorResolution(); - - if (!p_resfunc) - return; - - if (const auto* p_convfunc = dynamic_cast<const ConvolutionDetectorResolution*>(p_resfunc)) { - if (const auto* resfunc = dynamic_cast<const ResolutionFunction2DGaussian*>( - p_convfunc->getResolutionFunction2D())) { - auto* item = - detector_item->setResolutionFunctionType<ResolutionFunction2DGaussianItem>(); - const double scale = 1.0 / detector_item->axesToCoreUnitsFactor(); - item->setSigmaX(scale * resfunc->sigmaX()); - item->setSigmaY(scale * resfunc->sigmaY()); - } else { - throw Error("GUI::Transform::FromCore::setDetectorResolution() -> Error. " - "Unknown detector resolution function"); - } - } else { - throw Error("GUI::Transform::FromCore::setDetectorResolution() -> Error. " - "Not a ConvolutionDetectorResolution function"); - } -} - -void GUI::Transform::FromCore::setPolarizerAnalyzer(Instrument2DItem* instrument_item, - const ISimulation2D& simulation) -{ - instrument_item->setPolarization(simulation.beam().polVector()); - - const IDetector& detector = simulation.detector(); - double total_transmission = detector.analyzer().totalTransmission(); - if (total_transmission <= 0.0) - return; - - R3 analyzer_dir = detector.analyzer().analyzerDirection(); - double efficiency = detector.analyzer().analyzerEfficiency(); - instrument_item->setAnalyzerDirection(analyzer_dir); - instrument_item->setAnalyzerEfficiency(efficiency); - instrument_item->setAnalyzerTotalTransmission(total_transmission); -} - -void GUI::Transform::FromCore::setSphericalDetector(SphericalDetectorItem* detectorItem, +void setSphericalDetector(SphericalDetectorItem* detectorItem, const SphericalDetector& detector) { // Axes @@ -388,7 +346,7 @@ void GUI::Transform::FromCore::setSphericalDetector(SphericalDetectorItem* detec alphaAxis.setMax(Units::rad2deg(alpha_axis.max())); } -void GUI::Transform::FromCore::setRectangularDetector(RectangularDetectorItem* detectorItem, +void setRectangularDetector(RectangularDetectorItem* detectorItem, const RectangularDetector& detector) { // Axes @@ -430,31 +388,83 @@ void GUI::Transform::FromCore::setRectangularDetector(RectangularDetectorItem* d detectorItem->setU0(detector.getDirectBeamU0()); detectorItem->setV0(detector.getDirectBeamV0()); } else { - throw Error("GUI::Transform::FromCore::setItemFromSample(RectangularDetectorItem* " + throw Error("setItemFromSample(RectangularDetectorItem* " "detectorItem " "Error. Unknown detector arrangement"); } } -void GUI::Transform::FromCore::setItemFromSample( - BeamDistributionItem* beam_distribution_item, - const ParameterDistribution& parameter_distribution) +void setDetectorGeometry(Instrument2DItem* instrument_item, + const IDetector& detector) { - ASSERT(beam_distribution_item); + if (const auto* det = dynamic_cast<const SphericalDetector*>(&detector)) { + auto* item = instrument_item->setDetectorType<SphericalDetectorItem>(); + setSphericalDetector(item, *det); + } else if (const auto* det = dynamic_cast<const RectangularDetector*>(&detector)) { + auto* item = instrument_item->setDetectorType<RectangularDetectorItem>(); + setRectangularDetector(item, *det); + } else { + throw Error("setDetectorGeometry() -> Unknown detector type."); + } +} - if (parameter_distribution.getMinValue() < parameter_distribution.getMaxValue()) { - throw Error( - "GUI::Transform::FromCore::setItemFromSample(BeamDistributionItem* " - "beamDistributionItem," - "const ParameterDistribution& parameterDistribution) -> Error. ParameterDistribution " - "with defined min,max are not yet implemented in GUI"); +void setDetectorResolution(DetectorItem* detector_item, + const IDetector& detector) +{ + const IDetectorResolution* p_resfunc = detector.detectorResolution(); + + if (!p_resfunc) + return; + + if (const auto* p_convfunc = dynamic_cast<const ConvolutionDetectorResolution*>(p_resfunc)) { + if (const auto* resfunc = dynamic_cast<const ResolutionFunction2DGaussian*>( + p_convfunc->getResolutionFunction2D())) { + auto* item = + detector_item->setResolutionFunctionType<ResolutionFunction2DGaussianItem>(); + const double scale = 1.0 / detector_item->axesToCoreUnitsFactor(); + item->setSigmaX(scale * resfunc->sigmaX()); + item->setSigmaY(scale * resfunc->sigmaY()); + } else { + throw Error("setDetectorResolution() -> Error. " + "Unknown detector resolution function"); + } + } else { + throw Error("setDetectorResolution() -> Error. " + "Not a ConvolutionDetectorResolution function"); } +} - const double unit_factor = 1.0 / beam_distribution_item->scaleFactor(); - setDistribution(beam_distribution_item, parameter_distribution, unit_factor); +void setPolarizerAnalyzer(Instrument2DItem* instrument_item, + const ISimulation2D& simulation) +{ + instrument_item->setPolarization(simulation.beam().polVector()); + + const IDetector& detector = simulation.detector(); + double total_transmission = detector.analyzer().totalTransmission(); + if (total_transmission <= 0.0) + return; + + R3 analyzer_dir = detector.analyzer().analyzerDirection(); + double efficiency = detector.analyzer().analyzerEfficiency(); + instrument_item->setAnalyzerDirection(analyzer_dir); + instrument_item->setAnalyzerEfficiency(efficiency); + instrument_item->setAnalyzerTotalTransmission(total_transmission); } -void GUI::Transform::FromCore::setBackground(InstrumentItem* instrument_item, +void updateDetector(Instrument2DItem* instrument_item, + const ISimulation2D& simulation) +{ + const IDetector& detector = simulation.detector(); + setDetectorGeometry(instrument_item, detector); + + auto* detector_item = instrument_item->detectorItem(); + + setDetectorResolution(detector_item, detector); + setDetectorMasks(detector_item, simulation); + setPolarizerAnalyzer(instrument_item, simulation); +} + +void setBackground(InstrumentItem* instrument_item, const ISimulation& simulation) { const auto* p_bg = simulation.background(); @@ -466,13 +476,74 @@ void GUI::Transform::FromCore::setBackground(InstrumentItem* instrument_item, instrument_item->setBackgroundType<PoissonBackgroundItem>(); } -void GUI::Transform::FromCore::setAxisItem(BasicAxisItem* item, const IAxis& axis, double factor) +GISASInstrumentItem* createGISASInstrumentItem(InstrumentCollection* model, + const ScatteringSimulation& simulation) { - if (!dynamic_cast<const FixedBinAxis*>(&axis)) - throw Error("GUI::Transform::FromCore::setAxisItem() -> Error. Unexpected axis"); + auto* result = model->addInstrument<GISASInstrumentItem>(); + setGISASBeamItem(result->beamItem(), simulation); + updateDetector(result, simulation); + setBackground(result, simulation); - item->setBinCount(static_cast<int>(axis.size())); - item->setLowerBound(factor * axis.min()); - item->setUpperBound(factor * axis.max()); - item->setTitle(QString::fromStdString(axis.axisName())); + return result; +} + +OffspecInstrumentItem* createOffspecInstrumentItem(InstrumentCollection* model, + const OffspecSimulation& simulation) +{ + auto* result = model->addInstrument<OffspecInstrumentItem>(); + setOffspecBeamItem(result->beamItem(), simulation); + updateDetector(result, simulation); + setBackground(result, simulation); + + const double factor = 1. / Units::deg; + result->alphaAxis().setNbins(simulation.beamAxis()->size()); + result->alphaAxis().setMin(factor * simulation.beamAxis()->min()); + result->alphaAxis().setMax(factor * simulation.beamAxis()->max()); + + return result; +} + +SpecularInstrumentItem* createSpecularInstrumentItem(InstrumentCollection* model, + const SpecularSimulation& simulation) +{ + auto* result = model->addInstrument<SpecularInstrumentItem>(); + setSpecularBeamItem(result->beamItem(), simulation); + setBackground(result, simulation); + + return result; +} + +} // namespace + + +InstrumentCollection* GUI::Transform::FromCore::itemizeInstruments(const ISimulation& simulation) +{ + auto* result = new InstrumentCollection; + + if (const auto* gisasSimulation = dynamic_cast<const ScatteringSimulation*>(&simulation)) + createGISASInstrumentItem(result, *gisasSimulation); + else if (const auto* offspecSimulation = dynamic_cast<const OffspecSimulation*>(&simulation)) + createOffspecInstrumentItem(result, *offspecSimulation); + else if (const auto* spec_simulation = dynamic_cast<const SpecularSimulation*>(&simulation)) + createSpecularInstrumentItem(result, *spec_simulation); + else + ASSERT(0); + + return result; +} + +SimulationOptionsItem* GUI::Transform::FromCore::itemizeOptions(const ISimulation& simulation) +{ + auto* result = new SimulationOptionsItem; + + if (simulation.options().isIntegrate()) + result->setUseMonteCarloIntegration( + static_cast<unsigned>(simulation.options().getMcPoints())); + else + result->setUseAnalytical(); + + result->setUseAverageMaterials(simulation.options().useAvgMaterials()); + result->setIncludeSpecularPeak(simulation.options().includeSpecular()); + + return result; } diff --git a/GUI/Model/FromCore/GUIObjectBuilder.h b/GUI/Model/FromCore/ItemizeSimulation.h similarity index 80% rename from GUI/Model/FromCore/GUIObjectBuilder.h rename to GUI/Model/FromCore/ItemizeSimulation.h index 0ac3999ec5e270d2e22ed3d2ea5a1d58aaa59087..d651bc6a38af01e2b8a1562e8b64714bacb7ef85 100644 --- a/GUI/Model/FromCore/GUIObjectBuilder.h +++ b/GUI/Model/FromCore/ItemizeSimulation.h @@ -2,7 +2,7 @@ // // BornAgain: simulate and fit reflection and scattering // -//! @file GUI/Model/FromCore/GUIObjectBuilder.h +//! @file GUI/Model/FromCore/ItemizeSimulation.h //! @brief Defines namespace GUI::Model::ObjectBuilder //! //! @homepage http://www.bornagainproject.org @@ -12,8 +12,8 @@ // // ************************************************************************************************ -#ifndef BORNAGAIN_GUI_MODEL_FROMCORE_GUIOBJECTBUILDER_H -#define BORNAGAIN_GUI_MODEL_FROMCORE_GUIOBJECTBUILDER_H +#ifndef BORNAGAIN_GUI_MODEL_FROMCORE_ITEMIZESIMULATION_H +#define BORNAGAIN_GUI_MODEL_FROMCORE_ITEMIZESIMULATION_H class SimulationOptionsItem; class ISimulation; @@ -29,4 +29,4 @@ SimulationOptionsItem* itemizeOptions(const ISimulation& simulation); } // namespace GUI::Transform::FromCore -#endif // BORNAGAIN_GUI_MODEL_FROMCORE_GUIOBJECTBUILDER_H +#endif // BORNAGAIN_GUI_MODEL_FROMCORE_ITEMIZESIMULATION_H diff --git a/GUI/View/Project/PyImportAssistant.cpp b/GUI/View/Project/PyImportAssistant.cpp index bc9818cabf7965f231967978a18340a8d0b9e2a5..7880df33de3ae32d5193c519025f1b1a0fa801e4 100644 --- a/GUI/View/Project/PyImportAssistant.cpp +++ b/GUI/View/Project/PyImportAssistant.cpp @@ -19,8 +19,8 @@ #include "Base/Util/Assert.h" #include "Base/Util/SysUtils.h" #include "GUI/Application/ApplicationSettings.h" -#include "GUI/Model/FromCore/GUIObjectBuilder.h" -#include "GUI/Model/FromCore/GUISampleBuilder.h" +#include "GUI/Model/FromCore/ItemizeSimulation.h" +#include "GUI/Model/FromCore/ItemizeSample.h" #include "GUI/Support/IO/ProjectUtils.h" #include "GUI/Util/Path.h" #include "GUI/Util/String.h" diff --git a/GUI/View/SampleDesigner/SampleListModel.cpp b/GUI/View/SampleDesigner/SampleListModel.cpp index 89bda989428f93523674bc74d003ba750d5b7616..f1218d0fae3fc532daa6b8820ad790ef6c709a03 100644 --- a/GUI/View/SampleDesigner/SampleListModel.cpp +++ b/GUI/View/SampleDesigner/SampleListModel.cpp @@ -15,7 +15,7 @@ #include "GUI/View/SampleDesigner/SampleListModel.h" #include "Base/Util/Assert.h" #include "GUI/Model/FromCore/GUIExamplesFactory.h" -#include "GUI/Model/FromCore/GUISampleBuilder.h" +#include "GUI/Model/FromCore/ItemizeSample.h" #include "GUI/Model/Sample/MultiLayerItem.h" #include "GUI/Model/Sample/MultiLayerItems.h" #include "GUI/Util/String.h" diff --git a/Tests/Functional/GUI/Check.cpp b/Tests/Functional/GUI/Check.cpp index 7f7e0f91d2c94d786eb0316eb3db2ab74407714e..5c0f03613c6212eaa86a0b707129bf7724225503 100644 --- a/Tests/Functional/GUI/Check.cpp +++ b/Tests/Functional/GUI/Check.cpp @@ -19,8 +19,8 @@ #include "Device/Histo/IOFactory.h" #include "Device/Histo/SimulationResult.h" #include "GUI/Model/Device/InstrumentCollection.h" -#include "GUI/Model/FromCore/GUIObjectBuilder.h" -#include "GUI/Model/FromCore/GUISampleBuilder.h" +#include "GUI/Model/FromCore/ItemizeSimulation.h" +#include "GUI/Model/FromCore/ItemizeSample.h" #include "GUI/Model/Sample/MultiLayerItem.h" #include "GUI/Model/ToCore/SimulationToCore.h" #include "GUI/Support/Data/SimulationOptionsItem.h" diff --git a/Tests/Unit/GUI/TestAxesItems.cpp b/Tests/Unit/GUI/TestAxesItems.cpp deleted file mode 100644 index 8318fe0f0877ceb10936b0405c07e8d93daf9913..0000000000000000000000000000000000000000 --- a/Tests/Unit/GUI/TestAxesItems.cpp +++ /dev/null @@ -1,98 +0,0 @@ -#include "Base/Axis/FixedBinAxis.h" -#include "Base/Axis/PointwiseAxis.h" -#include "Base/Axis/VariableBinAxis.h" -#include "Base/Const/Units.h" -#include "GUI/Model/Device/AxesItems.h" -#include "GUI/Model/Device/PointwiseAxisItem.h" -#include "GUI/Model/FromCore/FromCore.h" -#include "GUI/Util/Error.h" -#include "Tests/GTestWrapper/google_test.h" - -class TestAxesItems : public ::testing::Test { -}; - -TEST_F(TestAxesItems, gettersAndSettes) -{ - BasicAxisItem item; - - item.setBinCount(42); - EXPECT_EQ(item.binCount(), 42); - - item.setLowerBound(42.1); - EXPECT_EQ(item.min(), 42.1); - - item.setUpperBound(42.2); - EXPECT_EQ(item.max(), 42.2); - - item.setTitle("abc"); - EXPECT_EQ(item.title(), QString("abc")); -} - -TEST_F(TestAxesItems, AmplitudeAxisGettersAndSetters) -{ - AmplitudeAxisItem item; - - item.setLogScale(true); - EXPECT_TRUE(item.isLogScale()); - item.setLogScale(false); - EXPECT_FALSE(item.isLogScale()); -} - -TEST_F(TestAxesItems, transformFromCore) -{ - BasicAxisItem item; - - // transform domain axis without scale factor - FixedBinAxis axis0("axis0", 99, -42.0, 42.0); - GUI::Transform::FromCore::setAxisItem(&item, axis0); - EXPECT_EQ(item.binCount(), static_cast<int>(axis0.size())); - EXPECT_EQ(item.min(), axis0.min()); - EXPECT_EQ(item.max(), axis0.max()); - EXPECT_EQ(item.title(), QString::fromStdString(axis0.axisName())); - - // transform domain axis with limits given in radians - FixedBinAxis axis1("axis1", 42, -42.0 * Units::deg, 42.0 * Units::deg); - const double scale = 1. / Units::deg; - GUI::Transform::FromCore::setAxisItem(&item, axis1, scale); - EXPECT_EQ(item.binCount(), static_cast<int>(axis1.size())); - EXPECT_EQ(item.min(), -42.0); - EXPECT_EQ(item.max(), 42.0); - EXPECT_EQ(item.title(), QString::fromStdString(axis1.axisName())); - - // transform from unexpected axis - std::vector<double> bins = {1.0, 2.0, 3.0}; - VariableBinAxis varaxis("axis", bins.size() - 1, bins); - EXPECT_THROW(GUI::Transform::FromCore::setAxisItem(&item, varaxis), Error); -} - -TEST_F(TestAxesItems, serializeBinaryData) -{ - PointwiseAxisItem axisItem; - EXPECT_EQ(axisItem.axis(), nullptr); - EXPECT_EQ(axisItem.serializeBinaryData().size(), 0); - - // init item with pointwise axis - std::vector<double> coordinates{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - PointwiseAxis axis("nameXY", coordinates); - axisItem.init(axis, "mm"); - - // check whether binary data is not empty - QByteArray binData1 = axisItem.serializeBinaryData(); - EXPECT_NE(axisItem.serializeBinaryData().size(), 0); - - // create a new item, fill it with the serialized data - PointwiseAxisItem axisItem2; - EXPECT_EQ(axisItem2.axis(), nullptr); - axisItem2.deserializeBinaryData(binData1); - - // check whether coordinates are the same as originally set - EXPECT_NE(axisItem2.axis(), nullptr); - auto* pwaxis = dynamic_cast<const PointwiseAxis*>(axisItem2.axis()); - ASSERT_NE(pwaxis, nullptr); - - EXPECT_EQ(axis.binCenters(), pwaxis->binCenters()); - - // check whether serializing axisItem2 results in same bin data - QByteArray binData2 = axisItem2.serializeBinaryData(); - EXPECT_EQ(binData1, binData2); -}