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