From f42ce0fa681ae2f32cb63c534e11495c344a2080 Mon Sep 17 00:00:00 2001
From: Marina Ganeva <m.ganeva@fz-juelich.de>
Date: Tue, 3 Dec 2013 09:41:54 +0100
Subject: [PATCH] IsGISAXS04 functional test is done.

---
 Core/StandardSamples/SimulationRegistry.cpp   | 10 ++-
 Core/StandardSamples/StandardSimulations.cpp  | 35 +++++++++
 Core/StandardSamples/StandardSimulations.h    |  3 +-
 Tests/FunctionalTests/TestCore/CMakeLists.txt |  3 +-
 .../TestCore/IsGISAXS03BA/IsGISAXS03BA.h      |  4 +-
 .../IsGISAXS03BAsize/IsGISAXS03BAsize.h       |  4 +-
 .../TestCore/IsGISAXS03DWBA/IsGISAXS03DWBA.h  |  4 +-
 .../IsGISAXS041DDL/IsGISAXS041DDL.cpp         | 78 +++++++++++++++++++
 .../TestCore/IsGISAXS041DDL/IsGISAXS041DDL.h  | 27 +++++++
 .../IsGISAXS042DDL/IsGISAXS042DDL.cpp         | 78 +++++++++++++++++++
 .../TestCore/IsGISAXS042DDL/IsGISAXS042DDL.h  | 27 +++++++
 11 files changed, 264 insertions(+), 9 deletions(-)
 create mode 100644 Tests/FunctionalTests/TestCore/IsGISAXS041DDL/IsGISAXS041DDL.cpp
 create mode 100644 Tests/FunctionalTests/TestCore/IsGISAXS041DDL/IsGISAXS041DDL.h
 create mode 100644 Tests/FunctionalTests/TestCore/IsGISAXS042DDL/IsGISAXS042DDL.cpp
 create mode 100644 Tests/FunctionalTests/TestCore/IsGISAXS042DDL/IsGISAXS042DDL.h

diff --git a/Core/StandardSamples/SimulationRegistry.cpp b/Core/StandardSamples/SimulationRegistry.cpp
index 1e8737f61f8..64cbf35ff49 100644
--- a/Core/StandardSamples/SimulationRegistry.cpp
+++ b/Core/StandardSamples/SimulationRegistry.cpp
@@ -24,7 +24,15 @@ SimulationRegistry::SimulationRegistry()
 
     registerItem(
         "isgisaxs03_basize", StandardSimulations::IsGISAXS03BAsize,
-        "Cylinder formfactor in BA size");
+        "Cylinder formfactor in BA with size distribution");
+
+    registerItem(
+        "isgisaxs04_1DDL", StandardSimulations::IsGISAXS041DDL,
+        "IsGISAXS04 example, 1DDL structure factor");
+
+    registerItem(
+        "isgisaxs04_2DDL", StandardSimulations::IsGISAXS042DDL,
+        "IsGISAXS04 example, 2DDL structure factor");
 
     registerItem(
         "mesocrystal01", StandardSimulations::MesoCrystal01,
diff --git a/Core/StandardSamples/StandardSimulations.cpp b/Core/StandardSamples/StandardSimulations.cpp
index b4fdcc85c97..b649f5417c4 100644
--- a/Core/StandardSamples/StandardSimulations.cpp
+++ b/Core/StandardSamples/StandardSimulations.cpp
@@ -94,6 +94,41 @@ Simulation *StandardSimulations::IsGISAXS03BAsize()
     return result;
 }
 
+Simulation *StandardSimulations::IsGISAXS041DDL()
+{
+    SampleBuilderFactory factory;
+    ISampleBuilder *builder = factory.createBuilder("isgisaxs04_1DDL");
+
+    Simulation *result = new Simulation();
+
+    result->setDetectorParameters(100, 0.0*Units::degree, 2.0*Units::degree,
+                100, 0.0*Units::degree, 2.0*Units::degree, true);
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree,
+                0.0*Units::degree);
+
+    result->setSampleBuilder( builder );
+
+    return result;
+}
+
+
+Simulation *StandardSimulations::IsGISAXS042DDL()
+{
+    SampleBuilderFactory factory;
+    ISampleBuilder *builder = factory.createBuilder("isgisaxs04_2DDL");
+
+    Simulation *result = new Simulation();
+
+    result->setDetectorParameters(100, 0.0*Units::degree, 2.0*Units::degree,
+                100, 0.0*Units::degree, 2.0*Units::degree, true);
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree,
+                0.0*Units::degree);
+
+    result->setSampleBuilder( builder );
+
+    return result;
+}
+
 Simulation *StandardSimulations::MesoCrystal01()
 {
     SampleBuilderFactory factory;
diff --git a/Core/StandardSamples/StandardSimulations.h b/Core/StandardSamples/StandardSimulations.h
index bb9902fa081..a2b8626d2bb 100644
--- a/Core/StandardSamples/StandardSimulations.h
+++ b/Core/StandardSamples/StandardSimulations.h
@@ -13,7 +13,8 @@ Simulation *IsGISAXS02();
 Simulation *IsGISAXS03BA();
 Simulation *IsGISAXS03DWBA();
 Simulation *IsGISAXS03BAsize();
-//Simulation *IsGISAXS04();
+Simulation *IsGISAXS041DDL();
+Simulation *IsGISAXS042DDL();
 //Simulation *IsGISAXS06();
 //Simulation *IsGISAXS07();
 //Simulation *IsGISAXS08();
diff --git a/Tests/FunctionalTests/TestCore/CMakeLists.txt b/Tests/FunctionalTests/TestCore/CMakeLists.txt
index 30f97f760b0..d09e64b6f24 100644
--- a/Tests/FunctionalTests/TestCore/CMakeLists.txt
+++ b/Tests/FunctionalTests/TestCore/CMakeLists.txt
@@ -10,7 +10,8 @@ set(list_of_tests
     "IsGISAXS03BA"
     "IsGISAXS03DWBA"
     "IsGISAXS03BAsize"
-    "IsGISAXS04"
+    "IsGISAXS041DDL"
+    "IsGISAXS042DDL"
     "IsGISAXS06"
     "IsGISAXS07"
     "IsGISAXS08"
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS03BA/IsGISAXS03BA.h b/Tests/FunctionalTests/TestCore/IsGISAXS03BA/IsGISAXS03BA.h
index 454df91317d..cc3d143cad9 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS03BA/IsGISAXS03BA.h
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS03BA/IsGISAXS03BA.h
@@ -1,5 +1,5 @@
-#ifndef FUNCTIONALTESTS_ISGISAXS03_H
-#define FUNCTIONALTESTS_ISGISAXS03_H
+#ifndef FUNCTIONALTESTS_ISGISAXS03BA_H
+#define FUNCTIONALTESTS_ISGISAXS03BA_H
 
 #include "ISampleBuilder.h"
 #include <string>
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS03BAsize/IsGISAXS03BAsize.h b/Tests/FunctionalTests/TestCore/IsGISAXS03BAsize/IsGISAXS03BAsize.h
index 0b7502a54a8..d2502f806bb 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS03BAsize/IsGISAXS03BAsize.h
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS03BAsize/IsGISAXS03BAsize.h
@@ -1,5 +1,5 @@
-#ifndef FUNCTIONALTESTS_ISGISAXS03_H
-#define FUNCTIONALTESTS_ISGISAXS03_H
+#ifndef FUNCTIONALTESTS_ISGISAXS03BAsize_H
+#define FUNCTIONALTESTS_ISGISAXS03BAsize_H
 
 #include "ISampleBuilder.h"
 #include <string>
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS03DWBA/IsGISAXS03DWBA.h b/Tests/FunctionalTests/TestCore/IsGISAXS03DWBA/IsGISAXS03DWBA.h
index 9ecd61e7604..9de6f0c4359 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS03DWBA/IsGISAXS03DWBA.h
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS03DWBA/IsGISAXS03DWBA.h
@@ -1,5 +1,5 @@
-#ifndef FUNCTIONALTESTS_ISGISAXS03_H
-#define FUNCTIONALTESTS_ISGISAXS03_H
+#ifndef FUNCTIONALTESTS_ISGISAXS03DWBA_H
+#define FUNCTIONALTESTS_ISGISAXS03DWBA_H
 
 #include "ISampleBuilder.h"
 #include <string>
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS041DDL/IsGISAXS041DDL.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS041DDL/IsGISAXS041DDL.cpp
new file mode 100644
index 00000000000..a73abde9b89
--- /dev/null
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS041DDL/IsGISAXS041DDL.cpp
@@ -0,0 +1,78 @@
+#include "IsGISAXS041DDL.h"
+#include "OutputDataIOFactory.h"
+#include "SampleBuilderFactory.h"
+#include "Simulation.h"
+#include "Units.h"
+#include "Utils.h"
+#include "MathFunctions.h"
+#include "SimulationRegistry.h"
+#include <iostream>
+#include <cmath>
+#include <gsl/gsl_errno.h>
+
+FunctionalTests::IsGISAXS041DDL::IsGISAXS041DDL()
+    : m_name("IsGISAXS041DDL")
+    , m_description("1D Paracrystal")
+    , m_result(0)
+	, m_reference(0)
+{ }
+
+
+void FunctionalTests::IsGISAXS041DDL::run(const std::string &path_to_data)
+{
+
+    SimulationRegistry sim_registry;
+    Simulation *simulation = sim_registry.createSimulation("isgisaxs04_1DDL");
+
+    // loading reference data
+    std::string filename = path_to_data + "isgisaxs04_reference_1DDL.ima.gz";
+    m_reference = OutputDataIOFactory::readIntensityData(filename);
+
+    simulation->runSimulation();
+
+    m_result = simulation->getIntensityData();
+    delete simulation;
+}
+
+
+int FunctionalTests::IsGISAXS041DDL::analyseResults()
+{
+    const double threshold(2e-10);
+
+    // Calculating average relative difference.
+    *m_result -= *m_reference;
+    *m_result /= *m_reference;
+
+    double diff(0);
+    for(OutputData<double>::const_iterator it =
+            m_result->begin(); it!=m_result->end(); ++it) {
+        diff+= std::fabs(*it);
+    }
+    diff /= m_result->getAllocatedSize();
+
+    // Assess result.
+	bool status_ok(true);
+    if( diff > threshold || std::isnan(diff)) status_ok=false;
+
+    std::cout << " diff " << diff << std::endl;
+    std::cout << m_name << " " << m_description << " " <<
+            (status_ok ? "[OK]" : "[FAILED]") << std::endl;
+    return (status_ok ? 0 : 1);
+}
+
+
+#ifdef STANDALONE
+std::string GetPathToData(int argc, char **argv)
+{
+    if(argc == 2) return argv[1];
+    return Utils::FileSystem::GetPathToData("../../../ReferenceData/BornAgain/", argv[0]);
+}
+
+int main(int argc, char **argv)
+{
+    FunctionalTests::IsGISAXS041DDL test;
+    test.run(GetPathToData(argc, argv));
+    return test.analyseResults();
+}
+#endif
+
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS041DDL/IsGISAXS041DDL.h b/Tests/FunctionalTests/TestCore/IsGISAXS041DDL/IsGISAXS041DDL.h
new file mode 100644
index 00000000000..39c7c439488
--- /dev/null
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS041DDL/IsGISAXS041DDL.h
@@ -0,0 +1,27 @@
+#ifndef FUNCTIONALTESTS_ISGISAXS041DDL_H
+#define FUNCTIONALTESTS_ISGISAXS041DDL_H
+
+#include "ISampleBuilder.h"
+#include <string>
+#include "OutputData.h"
+
+namespace FunctionalTests {
+
+class IsGISAXS041DDL
+{
+ public:
+    IsGISAXS041DDL();
+    ~IsGISAXS041DDL() { delete m_result; delete m_reference; }
+    void run(const std::string &path_to_data = std::string());
+    int analyseResults();
+//    const OutputData<double> *getOutputData() { return m_result;}
+ private:
+    std::string m_name;
+    std::string m_description;
+    OutputData<double> *m_result;
+    OutputData<double> *m_reference;
+};
+
+}
+
+#endif
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS042DDL/IsGISAXS042DDL.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS042DDL/IsGISAXS042DDL.cpp
new file mode 100644
index 00000000000..8e4c8689884
--- /dev/null
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS042DDL/IsGISAXS042DDL.cpp
@@ -0,0 +1,78 @@
+#include "IsGISAXS042DDL.h"
+#include "OutputDataIOFactory.h"
+#include "SampleBuilderFactory.h"
+#include "Simulation.h"
+#include "Units.h"
+#include "Utils.h"
+#include "MathFunctions.h"
+#include "SimulationRegistry.h"
+#include <iostream>
+#include <cmath>
+#include <gsl/gsl_errno.h>
+
+FunctionalTests::IsGISAXS042DDL::IsGISAXS042DDL()
+    : m_name("IsGISAXS042DDL")
+    , m_description("2D Paracrystal")
+    , m_result(0)
+	, m_reference(0)
+{ }
+
+
+void FunctionalTests::IsGISAXS042DDL::run(const std::string &path_to_data)
+{
+
+    SimulationRegistry sim_registry;
+    Simulation *simulation = sim_registry.createSimulation("isgisaxs04_2DDL");
+
+    // loading reference data
+    std::string filename = path_to_data + "isgisaxs04_reference_2DDLh.ima.gz";
+    m_reference = OutputDataIOFactory::readIntensityData(filename);
+
+    simulation->runSimulation();
+
+    m_result = simulation->getIntensityData();
+    delete simulation;
+}
+
+
+int FunctionalTests::IsGISAXS042DDL::analyseResults()
+{
+    const double threshold(2e-10);
+
+    // Calculating average relative difference.
+    *m_result -= *m_reference;
+    *m_result /= *m_reference;
+
+    double diff(0);
+    for(OutputData<double>::const_iterator it =
+            m_result->begin(); it!=m_result->end(); ++it) {
+        diff+= std::fabs(*it);
+    }
+    diff /= m_result->getAllocatedSize();
+
+    // Assess result.
+	bool status_ok(true);
+    if( diff > threshold || std::isnan(diff)) status_ok=false;
+
+    std::cout << " diff " << diff << std::endl;
+    std::cout << m_name << " " << m_description << " " <<
+            (status_ok ? "[OK]" : "[FAILED]") << std::endl;
+    return (status_ok ? 0 : 1);
+}
+
+
+#ifdef STANDALONE
+std::string GetPathToData(int argc, char **argv)
+{
+    if(argc == 2) return argv[1];
+    return Utils::FileSystem::GetPathToData("../../../ReferenceData/BornAgain/", argv[0]);
+}
+
+int main(int argc, char **argv)
+{
+    FunctionalTests::IsGISAXS042DDL test;
+    test.run(GetPathToData(argc, argv));
+    return test.analyseResults();
+}
+#endif
+
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS042DDL/IsGISAXS042DDL.h b/Tests/FunctionalTests/TestCore/IsGISAXS042DDL/IsGISAXS042DDL.h
new file mode 100644
index 00000000000..8c0ca2594e9
--- /dev/null
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS042DDL/IsGISAXS042DDL.h
@@ -0,0 +1,27 @@
+#ifndef FUNCTIONALTESTS_ISGISAXS042DDL_H
+#define FUNCTIONALTESTS_ISGISAXS042DDL_H
+
+#include "ISampleBuilder.h"
+#include <string>
+#include "OutputData.h"
+
+namespace FunctionalTests {
+
+class IsGISAXS042DDL
+{
+ public:
+    IsGISAXS042DDL();
+    ~IsGISAXS042DDL() { delete m_result; delete m_reference; }
+    void run(const std::string &path_to_data = std::string());
+    int analyseResults();
+//    const OutputData<double> *getOutputData() { return m_result;}
+ private:
+    std::string m_name;
+    std::string m_description;
+    OutputData<double> *m_result;
+    OutputData<double> *m_reference;
+};
+
+}
+
+#endif
-- 
GitLab