From f1dfaa747f6a6cb0c97cb65fde8d53cd46a42cdc Mon Sep 17 00:00:00 2001 From: Dmitry Yurov <d.yurov@fz-juelich.de> Date: Fri, 2 Feb 2018 13:33:24 +0100 Subject: [PATCH] createSpecularSimulation in DomainSimulationBuilder Redmine: #1936 --- .../Models/DomainSimulationBuilder.cpp | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/GUI/coregui/Models/DomainSimulationBuilder.cpp b/GUI/coregui/Models/DomainSimulationBuilder.cpp index b726440041b..37a192ff677 100644 --- a/GUI/coregui/Models/DomainSimulationBuilder.cpp +++ b/GUI/coregui/Models/DomainSimulationBuilder.cpp @@ -25,6 +25,7 @@ #include "MultiLayerItem.h" #include "SimulationOptionsItem.h" #include "OffSpecSimulation.h" +#include "SpecularSimulation.h" #include "TransformToDomain.h" #include "AxesItems.h" #include "Units.h" @@ -38,6 +39,11 @@ std::unique_ptr<OffSpecSimulation> createOffSpecSimulation(std::unique_ptr<MultiLayer> P_multilayer, const OffSpecInstrumentItem* offspecInstrument, const SimulationOptionsItem* optionsItem); + +std::unique_ptr<SpecularSimulation> +createSpecularSimulation(std::unique_ptr<MultiLayer> P_multilayer, + const SpecularInstrumentItem* specular_instrument, + const SimulationOptionsItem* options_item); } std::unique_ptr<Simulation> @@ -57,6 +63,8 @@ DomainSimulationBuilder::createSimulation(const MultiLayerItem* sampleItem, return createGISASSimulation(std::move(P_multilayer), gisasInstrument, optionsItem); else if (auto offspecInstrument = dynamic_cast<const OffSpecInstrumentItem*>(instrumentItem)) return createOffSpecSimulation(std::move(P_multilayer), offspecInstrument, optionsItem); + else if (auto specular_instrument = dynamic_cast<const SpecularInstrumentItem*>(instrumentItem)) + return createSpecularSimulation(std::move(P_multilayer), specular_instrument, optionsItem); throw GUIHelpers::Error( "DomainSimulationBuilder::createSimulation() -> Error. Not yet implemented"); @@ -117,4 +125,33 @@ std::unique_ptr<OffSpecSimulation> createOffSpecSimulation(std::unique_ptr<Multi return offspec; } + +std::unique_ptr<SpecularSimulation> +createSpecularSimulation(std::unique_ptr<MultiLayer> P_multilayer, + const SpecularInstrumentItem* specular_instrument, + const SimulationOptionsItem* options_item) +{ + std::unique_ptr<SpecularSimulation> specular_simulation + = std::make_unique<SpecularSimulation>(*P_multilayer); + + auto beam_item = specular_instrument->beamItem(); + auto axis_item = dynamic_cast<BasicAxisItem*>( + specular_instrument->getItem(SpecularInstrumentItem::P_ALPHA_AXIS)); + + // TODO Take care about beam divergence + // TODO: add footprint correction factor + specular_simulation->setBeamParameters(beam_item->getWavelength(), + *axis_item->createAxis(Units::degree)); + + // Simulation options + if (options_item) + TransformToDomain::setSimulationOptions(specular_simulation.get(), *options_item); + + // Background simulation + auto P_background = specular_instrument->backgroundItem()->createBackground(); + if (P_background) + specular_simulation->setBackground(*P_background); + + return specular_simulation; +} } -- GitLab