From 0bfa1ee434722c94505ff0d439a07c8ca5e50f48 Mon Sep 17 00:00:00 2001
From: Dmitry Yurov <d.yurov@fz-juelich.de>
Date: Mon, 30 Jul 2018 17:54:52 +0200
Subject: [PATCH] SpecularNewFitTest: Duplication of SpecularFitTest from
 FitSuite

Redmine: #2127
---
 .../Fit/FitObjective/CMakeLists.txt           |  1 +
 .../FitObjective/FitObjectiveTestCases.cpp    |  3 ++
 .../Fit/FitObjective/FitObjectiveTestCases.h  |  5 +++
 .../FitObjective/FitObjectiveTestFactory.cpp  |  2 +
 .../Fit/FitObjective/FitPlanCases.cpp         | 38 +++++++++++++++++++
 .../Fit/FitObjective/FitPlanCases.h           | 10 +++++
 .../Fit/FitObjective/FitPlanFactory.cpp       |  1 +
 7 files changed, 60 insertions(+)

diff --git a/Tests/Functional/Fit/FitObjective/CMakeLists.txt b/Tests/Functional/Fit/FitObjective/CMakeLists.txt
index 1977ee07dda..c7426a71592 100644
--- a/Tests/Functional/Fit/FitObjective/CMakeLists.txt
+++ b/Tests/Functional/Fit/FitObjective/CMakeLists.txt
@@ -2,6 +2,7 @@ set(test TestFitObjective)
 
 set(test_cases
     MigradCylindersInBA
+    SpecularNewFitTest
 )
 
 include_directories(${RootMinimizers_INCLUDE_DIRS})
diff --git a/Tests/Functional/Fit/FitObjective/FitObjectiveTestCases.cpp b/Tests/Functional/Fit/FitObjective/FitObjectiveTestCases.cpp
index 5ca6b7ed1d9..2c76458b29b 100644
--- a/Tests/Functional/Fit/FitObjective/FitObjectiveTestCases.cpp
+++ b/Tests/Functional/Fit/FitObjective/FitObjectiveTestCases.cpp
@@ -49,3 +49,6 @@ AdjustMinimizerFit::AdjustMinimizerFit()
 
 MultiPatternFit::MultiPatternFit()
     : FitObjectiveTest("GSLLMA", "", "MultiPatternPlan") {}
+
+SpecularNewFitTest::SpecularNewFitTest()
+    : FitObjectiveTest("Minuit2", "Migrad", "SpecularPlan") {}
diff --git a/Tests/Functional/Fit/FitObjective/FitObjectiveTestCases.h b/Tests/Functional/Fit/FitObjective/FitObjectiveTestCases.h
index 760bd9b6430..900aa533b11 100644
--- a/Tests/Functional/Fit/FitObjective/FitObjectiveTestCases.h
+++ b/Tests/Functional/Fit/FitObjective/FitObjectiveTestCases.h
@@ -82,5 +82,10 @@ public:
 
 };
 
+class SpecularNewFitTest : public FitObjectiveTest
+{
+public:
+    SpecularNewFitTest();
+};
 
 #endif //   MINIMIZERTESTCASES_H
diff --git a/Tests/Functional/Fit/FitObjective/FitObjectiveTestFactory.cpp b/Tests/Functional/Fit/FitObjective/FitObjectiveTestFactory.cpp
index e8f6f3dd6e7..f0699e6447a 100644
--- a/Tests/Functional/Fit/FitObjective/FitObjectiveTestFactory.cpp
+++ b/Tests/Functional/Fit/FitObjective/FitObjectiveTestFactory.cpp
@@ -37,4 +37,6 @@ FitObjectiveTestFactory::FitObjectiveTestFactory()
                  "Minuit + Genetic, CylindersInBA");
     registerItem("MultiPatternFit", create_new<MultiPatternFit>,
                  "Minuit, MultiPatternSample");
+    registerItem("SpecularNewFitTest", create_new<SpecularNewFitTest>,
+                 "Minuit, Basic specular fitting");
 }
diff --git a/Tests/Functional/Fit/FitObjective/FitPlanCases.cpp b/Tests/Functional/Fit/FitObjective/FitPlanCases.cpp
index 2517e0fef69..69afc40eca5 100644
--- a/Tests/Functional/Fit/FitObjective/FitPlanCases.cpp
+++ b/Tests/Functional/Fit/FitObjective/FitPlanCases.cpp
@@ -126,3 +126,41 @@ std::unique_ptr<MultiLayer> MultiPatternPlan::createMultiLayer(const Parameters&
     result->addLayer(substrate_layer);
     return result;
 }
+
+// ----------------------------------------------------------------------------
+
+SpecularPlan::SpecularPlan()
+    : FitPlan("SpecularPlan", /*residual_based = */ true)
+{
+    setSimulationName("BasicSpecular");
+    addParameter(Parameter("thickness", 5.0 * nm, AttLimits::limited(1.0 * nm, 7.0 * nm), 0.1),
+                 3.0 * nm);
+}
+
+SpecularPlan::~SpecularPlan() = default;
+
+std::unique_ptr<MultiLayer> SpecularPlan::createMultiLayer(const Fit::Parameters& params) const
+{
+    const size_t number_of_layers = 10;
+    double thick_ni = 7.0 * nm;
+    double thick_ti = params["thickness"].value();
+
+    Material vacuum_material = MaterialBySLD();
+    Material substrate_material = MaterialBySLD("Si_substrate", 2.0704e-06, 2.3726e-11);
+    Material ni_material = MaterialBySLD("Ni", -1.9493e-06, 9.6013e-10);
+    Material ti_material = MaterialBySLD("Ti", 9.4245e-06, 1.1423e-09);
+
+    Layer vacuum_layer(vacuum_material, 0);
+    Layer ni_layer(ni_material, thick_ni);
+    Layer ti_layer(ti_material, thick_ti);
+    Layer substrate_layer(substrate_material, 0);
+
+    std::unique_ptr<MultiLayer> multi_layer(new MultiLayer());
+    multi_layer->addLayer(vacuum_layer);
+    for (size_t i = 0; i < number_of_layers; ++i) {
+        multi_layer->addLayer(ti_layer);
+        multi_layer->addLayer(ni_layer);
+    }
+    multi_layer->addLayer(substrate_layer);
+    return multi_layer;
+}
diff --git a/Tests/Functional/Fit/FitObjective/FitPlanCases.h b/Tests/Functional/Fit/FitObjective/FitPlanCases.h
index b28825e704b..b361cdd069e 100644
--- a/Tests/Functional/Fit/FitObjective/FitPlanCases.h
+++ b/Tests/Functional/Fit/FitObjective/FitPlanCases.h
@@ -69,6 +69,16 @@ protected:
     std::unique_ptr<MultiLayer> createMultiLayer(const Fit::Parameters& params) const;
 };
 
+class SpecularPlan : public FitPlan
+{
+public:
+    SpecularPlan();
+    ~SpecularPlan() override;
+
+protected:
+    std::unique_ptr<MultiLayer> createMultiLayer(const Fit::Parameters& params) const override;
+};
+
 #endif  //  FITPLANCASES_H
 
 
diff --git a/Tests/Functional/Fit/FitObjective/FitPlanFactory.cpp b/Tests/Functional/Fit/FitObjective/FitPlanFactory.cpp
index 9bf7042c272..e53a65c5dd4 100644
--- a/Tests/Functional/Fit/FitObjective/FitPlanFactory.cpp
+++ b/Tests/Functional/Fit/FitObjective/FitPlanFactory.cpp
@@ -24,4 +24,5 @@ FitPlanFactory::FitPlanFactory()
     registerItem("RectDetPlan", create_new<RectDetPlan>);
     registerItem("AdjustMinimizerPlan", create_new<AdjustMinimizerPlan>);
     registerItem("MultiPatternPlan", create_new<MultiPatternPlan>);
+    registerItem("SpecularPlan", create_new<SpecularPlan>);
 }
-- 
GitLab