From cd4e04931a2ab43cdb0709a794a974962794cf62 Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Mon, 9 Dec 2013 16:33:08 +0100
Subject: [PATCH] MesoCrystal01 test cleanup

---
 App/CMakeLists.txt                            |   17 +-
 App/inc/StandardSamples.h                     |   28 +-
 App/inc/TestIsGISAXS15.h                      |   49 -
 App/src/ApplicationTestFactory.cpp            |    6 -
 App/src/SampleFactory.cpp                     |   28 +-
 App/src/StandardSamples.cpp                   | 1080 ++++++++---------
 App/src/TestFunctionalTests.cpp               |    3 +-
 App/src/TestIsGISAXS15.cpp                    |   55 -
 App/src/TestMesoCrystal1.cpp                  |    6 +-
 App/src/TestMiscellaneous.cpp                 |    2 +-
 .../FunctionalTestRegistry.cpp                |   22 +-
 Core/StandardSamples/FunctionalTestRegistry.h |    4 +-
 Core/StandardSamples/IFunctionalTest.cpp      |   28 +-
 Core/StandardSamples/IFunctionalTest.h        |   13 +-
 Core/StandardSamples/MesoCrystal01Builder.cpp |    2 +-
 Core/StandardSamples/SampleBuilderFactory.cpp |    3 +-
 Core/StandardSamples/SimulationRegistry.cpp   |    4 +-
 Core/StandardSamples/StandardSimulations.cpp  |    8 +
 .../{IsGISAXS082DDL.cpp => IsGISAXS08a.cpp}   |    0
 .../{IsGISAXS082DDL2.cpp => IsGISAXS08b.cpp}  |    0
 .../{IsGISAXS09P.cpp => IsGISAXS09a.cpp}      |    0
 .../{IsGISAXS09R.cpp => IsGISAXS09b.cpp}      |    0
 .../TestCore/IsGISAXS15/IsGISAXS15.cpp        |   75 +-
 .../TestCore/IsGISAXS15/IsGISAXS15.h          |   31 -
 .../TestCore/MesoCrystal1/MesoCrystal1.cpp    |   80 +-
 .../TestCore/MesoCrystal1/MesoCrystal1.h      |   38 -
 26 files changed, 656 insertions(+), 926 deletions(-)
 delete mode 100644 App/inc/TestIsGISAXS15.h
 delete mode 100644 App/src/TestIsGISAXS15.cpp
 rename Tests/FunctionalTests/TestCore/IsGISAXS08a/{IsGISAXS082DDL.cpp => IsGISAXS08a.cpp} (100%)
 rename Tests/FunctionalTests/TestCore/IsGISAXS08b/{IsGISAXS082DDL2.cpp => IsGISAXS08b.cpp} (100%)
 rename Tests/FunctionalTests/TestCore/IsGISAXS09a/{IsGISAXS09P.cpp => IsGISAXS09a.cpp} (100%)
 rename Tests/FunctionalTests/TestCore/IsGISAXS09b/{IsGISAXS09R.cpp => IsGISAXS09b.cpp} (100%)
 delete mode 100644 Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.h
 delete mode 100644 Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.h

diff --git a/App/CMakeLists.txt b/App/CMakeLists.txt
index 5114d9ebace..af0093f55ac 100644
--- a/App/CMakeLists.txt
+++ b/App/CMakeLists.txt
@@ -7,23 +7,16 @@ cmake_minimum_required(VERSION 2.8.3 FATAL_ERROR)
 set(executable_name App)
 
 # source files
-file(GLOB source_files
-    "src/*.cpp"
-    "${CMAKE_CURRENT_SOURCE_DIR}/../Tests/FunctionalTests/TestCore/IsGISAXS15/*.cpp"
-)
+file(GLOB source_files "src/*.cpp")
 
 # to get rid from files generated via qmake compilation
-list(REMOVE_ITEM source_files ${CMAKE_CURRENT_SOURCE_DIR}/src/AppDict.cpp)
+#list(REMOVE_ITEM source_files ${CMAKE_CURRENT_SOURCE_DIR}/src/AppDict.cpp)
 
 # include files
-file(GLOB include_files
-    "inc/*.h"
-    "${CMAKE_CURRENT_SOURCE_DIR}/../Tests/FunctionalTests/TestCore/IsGISAXS15/*.h"
-)
+file(GLOB include_files "inc/*.h")
 
 include_directories(
     ${CMAKE_CURRENT_SOURCE_DIR}/inc
-    ${CMAKE_CURRENT_SOURCE_DIR}/../Tests/FunctionalTests/TestCore/IsGISAXS15
 )
 
 if(MSVC)
@@ -32,7 +25,7 @@ if(MSVC)
 endif()
 
 # data files are required by App for comparison
-execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/Tests/ReferenceData/IsGISAXS ${CMAKE_BINARY_DIR}/Tests/ReferenceData/IsGISAXS)
+#execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/Tests/ReferenceData/IsGISAXS ${CMAKE_BINARY_DIR}/Tests/ReferenceData/IsGISAXS)
 
 # dictionaries
 ROOT_GENERATE_DICTIONARY(AppDict inc/DrawHelper.h inc/TreeEventStructure.h  LINKDEF AppLinkDef.h)
@@ -56,7 +49,7 @@ target_link_libraries(${executable_name}
 
 # --- Installation ---
 install (TARGETS ${executable_name} DESTINATION ${destination_bin} COMPONENT Applications)
-install (DIRECTORY ${CMAKE_SOURCE_DIR}/Tests/ReferenceData/IsGISAXS DESTINATION Tests/ReferenceData COMPONENT Applications)
+#install (DIRECTORY ${CMAKE_SOURCE_DIR}/Tests/ReferenceData/IsGISAXS DESTINATION Tests/ReferenceData COMPONENT Applications)
 
 # system libraries: ROOT installation
 if(WIN32)
diff --git a/App/inc/StandardSamples.h b/App/inc/StandardSamples.h
index fc1d311e603..ff1d93dbc4a 100644
--- a/App/inc/StandardSamples.h
+++ b/App/inc/StandardSamples.h
@@ -32,20 +32,20 @@ ISample *MultilayerOffspecTestcase2a();
 ISample *MultilayerOffspecTestcase2b();
 ISample *MultilayerSpecularMagneticTestCase();
 ISample *PolarizedDWBATestCase();
-ISample *IsGISAXS15_SSCA();
-ISample *MesoCrystal1();
-ISample *MesoCrystal2();
-ISample *FormFactor_Box();
-ISample *FormFactor_Cone();
-ISample *FormFactor_Sphere();
-ISample *FormFactor_Ellipsoid();
-ISample *FormFactor_FullSpheroid();
-ISample *FormFactor_HemiSpheroid();
-ISample *FormFactor_Parallelpiped();
-ISample *FormFactor_Cylinder();
-ISample *FormFactor_Pyramid();
-ISample *FormFactor_FullSphere();
-ISample *FormFactor_Prism3();
+//ISample *IsGISAXS15_SSCA();
+//ISample *MesoCrystal1();
+//ISample *MesoCrystal2();
+//ISample *FormFactor_Box();
+//ISample *FormFactor_Cone();
+//ISample *FormFactor_Sphere();
+//ISample *FormFactor_Ellipsoid();
+//ISample *FormFactor_FullSpheroid();
+//ISample *FormFactor_HemiSpheroid();
+//ISample *FormFactor_Parallelpiped();
+//ISample *FormFactor_Cylinder();
+//ISample *FormFactor_Pyramid();
+//ISample *FormFactor_FullSphere();
+//ISample *FormFactor_Prism3();
 
 }
 #endif // STANDARDSAMPLES_H
diff --git a/App/inc/TestIsGISAXS15.h b/App/inc/TestIsGISAXS15.h
deleted file mode 100644
index 2a810ce78f9..00000000000
--- a/App/inc/TestIsGISAXS15.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// ************************************************************************** //
-//                                                                         
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      App/inc/TestIsGISAXS15.h
-//! @brief     Defines class TestIsGISAXS15.
-//
-//! Homepage:  apps.jcns.fz-juelich.de/BornAgain
-//! License:   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2013
-//! @authors   Scientific Computing Group at MLZ Garching
-//! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
-//
-// ************************************************************************** //
-
-#ifndef TESTISGISAXS15_H_
-#define TESTISGISAXS15_H_
-
-#include "IApplicationTest.h"
-
-//! IsGISAXS ex#15: Size-Spacing Correlation Approximation.
-
-class TestIsGISAXS15 : public IApplicationTest
-{
-public:
-    TestIsGISAXS15();
-    virtual ~TestIsGISAXS15(){}
-
-    virtual void execute();
-    virtual void finalise();
-private:
-    // structure to hold info over several compare cases
-    struct CompareStruct
-    {
-        CompareStruct(std::string _isginame,
-                      std::string _thisname,
-                      std::string _descr)
-        : isginame(_isginame), thisname(_thisname), descr(_descr){}
-        std::string isginame;
-        std::string thisname;
-        std::string descr;
-    };
-
-    std::string m_data_path;
-};
-
-#endif /* TESTISGISAXS15_H_ */
-
-
diff --git a/App/src/ApplicationTestFactory.cpp b/App/src/ApplicationTestFactory.cpp
index 62ab481f717..c546239146d 100644
--- a/App/src/ApplicationTestFactory.cpp
+++ b/App/src/ApplicationTestFactory.cpp
@@ -27,7 +27,6 @@
 #include "TestFumiliLMA.h"
 #include "TestIsGISAXS12.h"
 #include "TestIsGISAXS13.h"
-#include "TestIsGISAXS15.h"
 #include "TestIsGISAXS5.h"
 #include "TestMesoCrystal1.h"
 #include "TestMesoCrystal2.h"
@@ -167,11 +166,6 @@ void RegisterApplicationTests(ApplicationTestFactory *p_test_factory)
         "isgisaxs13",
         IFactoryCreateFunction<TestIsGISAXS13, IApplicationTest>,
         "functional test: isgisaxs ex-13 (simulated annealing fit)");
-    p_test_factory->registerItem(
-        "isgisaxs15",
-        IFactoryCreateFunction<TestIsGISAXS15, IApplicationTest>,
-        "functional test: isgisaxs ex-15 (size-spacing correlation "
-        "approximation)");
     p_test_factory->registerItem(
         "convolution",
         IFactoryCreateFunction<TestConvolution, IApplicationTest>,
diff --git a/App/src/SampleFactory.cpp b/App/src/SampleFactory.cpp
index d8677bf404b..cb87348f79c 100644
--- a/App/src/SampleFactory.cpp
+++ b/App/src/SampleFactory.cpp
@@ -51,23 +51,23 @@ SampleFactory::SampleFactory()
             StandardSamples::MultilayerSpecularMagneticTestCase);
 
     // IsGISAXS15 example: Size-Spacing Correlation Approximation
-    registerItem("IsGISAXS15_SSCA", StandardSamples::IsGISAXS15_SSCA);
+//    registerItem("IsGISAXS15_SSCA", StandardSamples::IsGISAXS15_SSCA);
 
     // mesocrystal's
-    registerItem("MesoCrystal1", StandardSamples::MesoCrystal1);
-    registerItem("MesoCrystal2", StandardSamples::MesoCrystal2);
+//    registerItem("MesoCrystal1", StandardSamples::MesoCrystal1);
+//    registerItem("MesoCrystal2", StandardSamples::MesoCrystal2);
 
-    registerItem("FormFactor_Box", StandardSamples::FormFactor_Box);
-    registerItem("FormFactor_Cone", StandardSamples::FormFactor_Cone);
-    registerItem("FormFactor_Sphere", StandardSamples::FormFactor_Sphere);
-    registerItem("FormFactor_Ellipsoid", StandardSamples::FormFactor_Ellipsoid);
-    registerItem("FormFactor_FullSpheroid", StandardSamples::FormFactor_FullSpheroid);
-    registerItem("FormFactor_HemiSpheroid", StandardSamples::FormFactor_HemiSpheroid);
-    registerItem("FormFactor_Parallelepiped", StandardSamples::FormFactor_Parallelpiped);
-    registerItem("FormFactor_Cylinder", StandardSamples::FormFactor_Cylinder);
-    registerItem("FormFactor_Pyramid", StandardSamples::FormFactor_Pyramid);
-    registerItem("FormFactor_FullSphere", StandardSamples::FormFactor_FullSphere);
-    registerItem("FormFactor_Prism3", StandardSamples::FormFactor_Prism3);
+//    registerItem("FormFactor_Box", StandardSamples::FormFactor_Box);
+//    registerItem("FormFactor_Cone", StandardSamples::FormFactor_Cone);
+//    registerItem("FormFactor_Sphere", StandardSamples::FormFactor_Sphere);
+//    registerItem("FormFactor_Ellipsoid", StandardSamples::FormFactor_Ellipsoid);
+//    registerItem("FormFactor_FullSpheroid", StandardSamples::FormFactor_FullSpheroid);
+//    registerItem("FormFactor_HemiSpheroid", StandardSamples::FormFactor_HemiSpheroid);
+//    registerItem("FormFactor_Parallelepiped", StandardSamples::FormFactor_Parallelpiped);
+//    registerItem("FormFactor_Cylinder", StandardSamples::FormFactor_Cylinder);
+//    registerItem("FormFactor_Pyramid", StandardSamples::FormFactor_Pyramid);
+//    registerItem("FormFactor_FullSphere", StandardSamples::FormFactor_FullSphere);
+//    registerItem("FormFactor_Prism3", StandardSamples::FormFactor_Prism3);
 }
 
 
diff --git a/App/src/StandardSamples.cpp b/App/src/StandardSamples.cpp
index a49b1154989..bd5dfb1b7c0 100644
--- a/App/src/StandardSamples.cpp
+++ b/App/src/StandardSamples.cpp
@@ -257,549 +257,549 @@ ISample *StandardSamples::MultilayerOffspecTestcase2b()
 
 //! IsGISAXS ex#15: Size-spacing correlation approximation.
 
-ISample *StandardSamples::IsGISAXS15_SSCA()
-{
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_particle(1.0-6e-4, 2e-8);
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air", n_air);
-    const IMaterial *particle_material =
-            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    InterferenceFunction1DParaCrystal *p_interference_function =
-        new InterferenceFunction1DParaCrystal
-        (15.0*Units::nanometer,5*Units::nanometer, 1e3*Units::nanometer);
-    p_interference_function->setKappa(4.02698);
-    ParticleDecoration particle_decoration;
-    Particle particle_prototype(particle_material, new FormFactorCylinder
-                                (5.0*Units::nanometer, 5.0*Units::nanometer));
-    StochasticDoubleGaussian sg(5.0*Units::nanometer, 1.25*Units::nanometer);
-    StochasticSampledParameter stochastic_radius(sg,30, 2);
-    ParticleBuilder particle_builder;
-    particle_builder.setPrototype
-        (particle_prototype, "/Particle/FormFactorCylinder/radius",
-         stochastic_radius);
-    particle_builder.plantParticles(particle_decoration);
-
-    // Set height of each particle to its radius (H/R fixed)
-    ParameterPool *p_parameters = particle_decoration.createParameterTree();
-    int nbr_replacements =
-        p_parameters->fixRatioBetweenParameters("height", "radius", 1.0);
-    std::cout << "Number of replacements: " << nbr_replacements << std::endl;
-
-    particle_decoration.addInterferenceFunction(p_interference_function);
-
-    air_layer.setDecoration(particle_decoration);
-
-    p_multi_layer->addLayer(air_layer);
-    return p_multi_layer;
-}
-
-//! First mesocrystal test.
-
-ISample *StandardSamples::MesoCrystal1()
-{
-    // create mesocrystal
-    double nanoparticle_radius = 6.1*Units::nanometer;
-    Lattice lat = Lattice::createTrigonalLattice(
-        nanoparticle_radius*2.0, nanoparticle_radius*2.0*2.3);
-    kvector_t bas_a = lat.getBasisVectorA();
-    kvector_t bas_b = lat.getBasisVectorB();
-    kvector_t bas_c = lat.getBasisVectorC();
-    complex_t n_particle(1.0-1.5e-5, 1.3e-6);
-    const IMaterial *particle_material =
-            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
-
-    Particle particle(particle_material,
-                      new FormFactorFullSphere(nanoparticle_radius));
-    kvector_t position_0 = kvector_t(0.0, 0.0, 0.0);
-    kvector_t position_1 = 1.0/3.0*(2.0*bas_a + bas_b + bas_c);
-    kvector_t position_2 = 1.0/3.0*(bas_a + 2.0*bas_b + 2.0*bas_c);
-    std::vector<kvector_t> pos_vector;
-    pos_vector.push_back(position_0);
-    pos_vector.push_back(position_1);
-    pos_vector.push_back(position_2);
-    LatticeBasis basis(particle, pos_vector);
-    Crystal npc(basis, lat);
-
-    MesoCrystal meso(npc.clone(), new FormFactorCylinder
-                     (0.2*Units::micrometer, 300*Units::nanometer));
-    MesoCrystal meso2(npc.clone(), new FormFactorPyramid
-                      (0.2*Units::micrometer,
-                       300*Units::nanometer,
-                       84*Units::degree));
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_substrate(1.0-3.5e-6, 7.8e-8);
-
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air2", n_air);
-    const IMaterial *p_substrate_material =
-        MaterialManager::getHomogeneousMaterial("Substrate2", n_substrate);
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Layer substrate_layer;
-    substrate_layer.setMaterial(p_substrate_material);
-    IInterferenceFunction *p_interference_function =
-        new InterferenceFunction1DParaCrystal
-        (800.0*Units::nanometer, 50*Units::nanometer, 1e7*Units::nanometer);
-    ParticleDecoration particle_decoration;
-    particle_decoration.addParticle(meso.clone(), 0.0, 0.5);
-    particle_decoration.addParticle(meso2.clone(), 0.0, 0.5);
-    particle_decoration.addInterferenceFunction(p_interference_function);
-
-    air_layer.setDecoration(particle_decoration);
-
-    p_multi_layer->addLayer(air_layer);
-    p_multi_layer->addLayer(substrate_layer);
-    return p_multi_layer;
-
-}
-
-//! Second mesocrystal test: Mesocrystal from TestMesocrystal to play with.
-
-ISample *StandardSamples::MesoCrystal2()
-{
-    double meso_radius = 300*Units::nanometer;
-    double surface_filling_ratio = 0.25;
-    double surface_density = surface_filling_ratio/M_PI/meso_radius/meso_radius;
-    complex_t n_particle(1.0-1.55e-5, 1.37e-6);
-    complex_t avg_n_squared_meso = 0.7886*n_particle*n_particle + 0.2114;
-    complex_t n_avg = std::sqrt(surface_filling_ratio*avg_n_squared_meso +
-                                1.0 - surface_filling_ratio);
-    complex_t n_particle_adapted =
-        std::sqrt(n_avg*n_avg + n_particle*n_particle - 1.0);
-
-    const IMaterial *particle_adapted_material =
-            MaterialManager::getHomogeneousMaterial("Particle", n_particle_adapted);
-
-
-    FormFactorCylinder ff_meso(0.2*Units::micrometer, meso_radius);
-
-    // Create multilayer
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_substrate(1.0-7.57e-6, 1.73e-7);
-
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air", n_air);
-    const IMaterial *p_average_layer_material =
-        MaterialManager::getHomogeneousMaterial("Averagelayer", n_avg);
-    const IMaterial *p_substrate_material =
-        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Layer avg_layer;
-    avg_layer.setMaterial(p_average_layer_material);
-    avg_layer.setThickness(0.2*Units::micrometer);
-    Layer substrate_layer;
-    substrate_layer.setMaterial(p_substrate_material);
-    IInterferenceFunction *p_interference_function =
-        new InterferenceFunctionNone();
-    ParticleDecoration particle_decoration;
-    double nanoparticle_radius = 5.4*Units::nanometer;
-    const IFormFactor* p_meso_form_factor =& ff_meso;
-    Lattice lat = Lattice::createTrigonalLattice
-        (nanoparticle_radius*2.0, nanoparticle_radius*2.0*2.3);
-    kvector_t bas_a = lat.getBasisVectorA();
-    kvector_t bas_b = lat.getBasisVectorB();
-    kvector_t bas_c = lat.getBasisVectorC();
-    Particle particle(particle_adapted_material,
-                      new FormFactorFullSphere(nanoparticle_radius));
-    kvector_t position_0 = kvector_t(0.0, 0.0, 0.0);
-    kvector_t position_1 = 1.0/3.0*(2.0*bas_a + bas_b + bas_c);
-    kvector_t position_2 = 1.0/3.0*(bas_a + 2.0*bas_b + 2.0*bas_c);
-    std::vector<kvector_t> pos_vector;
-    pos_vector.push_back(position_0);
-    pos_vector.push_back(position_1);
-    pos_vector.push_back(position_2);
-    LatticeBasis basis(particle, pos_vector);
-    Crystal npc(basis, lat);
-    MesoCrystal *meso_crystal =
-        new MesoCrystal(npc.clone(), p_meso_form_factor->clone());
-    particle_decoration.addParticle(meso_crystal, 0.2*Units::micrometer);
-    particle_decoration.setTotalParticleSurfaceDensity(surface_density);
-    particle_decoration.addInterferenceFunction(p_interference_function);
-
-    avg_layer.setDecoration(particle_decoration);
-
-    p_multi_layer->addLayer(air_layer);
-    p_multi_layer->addLayer(avg_layer);
-    p_multi_layer->addLayer(substrate_layer);
-    return p_multi_layer;
-
-}
+//ISample *StandardSamples::IsGISAXS15_SSCA()
+//{
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_particle(1.0-6e-4, 2e-8);
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air", n_air);
+//    const IMaterial *particle_material =
+//            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    InterferenceFunction1DParaCrystal *p_interference_function =
+//        new InterferenceFunction1DParaCrystal
+//        (15.0*Units::nanometer,5*Units::nanometer, 1e3*Units::nanometer);
+//    p_interference_function->setKappa(4.02698);
+//    ParticleDecoration particle_decoration;
+//    Particle particle_prototype(particle_material, new FormFactorCylinder
+//                                (5.0*Units::nanometer, 5.0*Units::nanometer));
+//    StochasticDoubleGaussian sg(5.0*Units::nanometer, 1.25*Units::nanometer);
+//    StochasticSampledParameter stochastic_radius(sg,30, 2);
+//    ParticleBuilder particle_builder;
+//    particle_builder.setPrototype
+//        (particle_prototype, "/Particle/FormFactorCylinder/radius",
+//         stochastic_radius);
+//    particle_builder.plantParticles(particle_decoration);
+
+//    // Set height of each particle to its radius (H/R fixed)
+//    ParameterPool *p_parameters = particle_decoration.createParameterTree();
+//    int nbr_replacements =
+//        p_parameters->fixRatioBetweenParameters("height", "radius", 1.0);
+//    std::cout << "Number of replacements: " << nbr_replacements << std::endl;
+
+//    particle_decoration.addInterferenceFunction(p_interference_function);
+
+//    air_layer.setDecoration(particle_decoration);
+
+//    p_multi_layer->addLayer(air_layer);
+//    return p_multi_layer;
+//}
+
+////! First mesocrystal test.
+
+//ISample *StandardSamples::MesoCrystal1()
+//{
+//    // create mesocrystal
+//    double nanoparticle_radius = 6.1*Units::nanometer;
+//    Lattice lat = Lattice::createTrigonalLattice(
+//        nanoparticle_radius*2.0, nanoparticle_radius*2.0*2.3);
+//    kvector_t bas_a = lat.getBasisVectorA();
+//    kvector_t bas_b = lat.getBasisVectorB();
+//    kvector_t bas_c = lat.getBasisVectorC();
+//    complex_t n_particle(1.0-1.5e-5, 1.3e-6);
+//    const IMaterial *particle_material =
+//            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+
+//    Particle particle(particle_material,
+//                      new FormFactorFullSphere(nanoparticle_radius));
+//    kvector_t position_0 = kvector_t(0.0, 0.0, 0.0);
+//    kvector_t position_1 = 1.0/3.0*(2.0*bas_a + bas_b + bas_c);
+//    kvector_t position_2 = 1.0/3.0*(bas_a + 2.0*bas_b + 2.0*bas_c);
+//    std::vector<kvector_t> pos_vector;
+//    pos_vector.push_back(position_0);
+//    pos_vector.push_back(position_1);
+//    pos_vector.push_back(position_2);
+//    LatticeBasis basis(particle, pos_vector);
+//    Crystal npc(basis, lat);
+
+//    MesoCrystal meso(npc.clone(), new FormFactorCylinder
+//                     (0.2*Units::micrometer, 300*Units::nanometer));
+//    MesoCrystal meso2(npc.clone(), new FormFactorPyramid
+//                      (0.2*Units::micrometer,
+//                       300*Units::nanometer,
+//                       84*Units::degree));
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_substrate(1.0-3.5e-6, 7.8e-8);
+
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air2", n_air);
+//    const IMaterial *p_substrate_material =
+//        MaterialManager::getHomogeneousMaterial("Substrate2", n_substrate);
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    Layer substrate_layer;
+//    substrate_layer.setMaterial(p_substrate_material);
+//    IInterferenceFunction *p_interference_function =
+//        new InterferenceFunction1DParaCrystal
+//        (800.0*Units::nanometer, 50*Units::nanometer, 1e7*Units::nanometer);
+//    ParticleDecoration particle_decoration;
+//    particle_decoration.addParticle(meso.clone(), 0.0, 0.5);
+//    particle_decoration.addParticle(meso2.clone(), 0.0, 0.5);
+//    particle_decoration.addInterferenceFunction(p_interference_function);
+
+//    air_layer.setDecoration(particle_decoration);
+
+//    p_multi_layer->addLayer(air_layer);
+//    p_multi_layer->addLayer(substrate_layer);
+//    return p_multi_layer;
+
+//}
+
+////! Second mesocrystal test: Mesocrystal from TestMesocrystal to play with.
+
+//ISample *StandardSamples::MesoCrystal2()
+//{
+//    double meso_radius = 300*Units::nanometer;
+//    double surface_filling_ratio = 0.25;
+//    double surface_density = surface_filling_ratio/M_PI/meso_radius/meso_radius;
+//    complex_t n_particle(1.0-1.55e-5, 1.37e-6);
+//    complex_t avg_n_squared_meso = 0.7886*n_particle*n_particle + 0.2114;
+//    complex_t n_avg = std::sqrt(surface_filling_ratio*avg_n_squared_meso +
+//                                1.0 - surface_filling_ratio);
+//    complex_t n_particle_adapted =
+//        std::sqrt(n_avg*n_avg + n_particle*n_particle - 1.0);
+
+//    const IMaterial *particle_adapted_material =
+//            MaterialManager::getHomogeneousMaterial("Particle", n_particle_adapted);
+
+
+//    FormFactorCylinder ff_meso(0.2*Units::micrometer, meso_radius);
+
+//    // Create multilayer
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_substrate(1.0-7.57e-6, 1.73e-7);
+
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air", n_air);
+//    const IMaterial *p_average_layer_material =
+//        MaterialManager::getHomogeneousMaterial("Averagelayer", n_avg);
+//    const IMaterial *p_substrate_material =
+//        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    Layer avg_layer;
+//    avg_layer.setMaterial(p_average_layer_material);
+//    avg_layer.setThickness(0.2*Units::micrometer);
+//    Layer substrate_layer;
+//    substrate_layer.setMaterial(p_substrate_material);
+//    IInterferenceFunction *p_interference_function =
+//        new InterferenceFunctionNone();
+//    ParticleDecoration particle_decoration;
+//    double nanoparticle_radius = 5.4*Units::nanometer;
+//    const IFormFactor* p_meso_form_factor =& ff_meso;
+//    Lattice lat = Lattice::createTrigonalLattice
+//        (nanoparticle_radius*2.0, nanoparticle_radius*2.0*2.3);
+//    kvector_t bas_a = lat.getBasisVectorA();
+//    kvector_t bas_b = lat.getBasisVectorB();
+//    kvector_t bas_c = lat.getBasisVectorC();
+//    Particle particle(particle_adapted_material,
+//                      new FormFactorFullSphere(nanoparticle_radius));
+//    kvector_t position_0 = kvector_t(0.0, 0.0, 0.0);
+//    kvector_t position_1 = 1.0/3.0*(2.0*bas_a + bas_b + bas_c);
+//    kvector_t position_2 = 1.0/3.0*(bas_a + 2.0*bas_b + 2.0*bas_c);
+//    std::vector<kvector_t> pos_vector;
+//    pos_vector.push_back(position_0);
+//    pos_vector.push_back(position_1);
+//    pos_vector.push_back(position_2);
+//    LatticeBasis basis(particle, pos_vector);
+//    Crystal npc(basis, lat);
+//    MesoCrystal *meso_crystal =
+//        new MesoCrystal(npc.clone(), p_meso_form_factor->clone());
+//    particle_decoration.addParticle(meso_crystal, 0.2*Units::micrometer);
+//    particle_decoration.setTotalParticleSurfaceDensity(surface_density);
+//    particle_decoration.addInterferenceFunction(p_interference_function);
+
+//    avg_layer.setDecoration(particle_decoration);
+
+//    p_multi_layer->addLayer(air_layer);
+//    p_multi_layer->addLayer(avg_layer);
+//    p_multi_layer->addLayer(substrate_layer);
+//    return p_multi_layer;
+
+//}
 
 //! Functional test: Formfactor of a box.
 
-ISample *StandardSamples::FormFactor_Box()
-{
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_substrate(1.0-6e-6, 2e-8);
-    complex_t n_particle(1.0-6e-4, 2e-8);
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air", n_air);
-    const IMaterial *p_substrate_material =
-        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
-    const IMaterial *particle_material =
-            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
-
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Layer substrate_layer;
-    substrate_layer.setMaterial(p_substrate_material);
-    ParticleDecoration particle_decoration
-        (new Particle(particle_material,
-                      new FormFactorBox(5*Units::nanometer,
-                                        5*Units::nanometer,
-                                        5*Units::nanometer)));
-    particle_decoration.addInterferenceFunction
-        (new InterferenceFunctionNone());
-
-    air_layer.setDecoration(particle_decoration);
-
-    p_multi_layer->addLayer(air_layer);
-    p_multi_layer->addLayer(substrate_layer);
-    return p_multi_layer;
-}
-
-//! Functional test: Formfactor of a cone.
-
-ISample *StandardSamples::FormFactor_Cone()
-{
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_substrate(1.0-6e-6, 2e-8);
-    complex_t n_particle(1.0-6e-4, 2e-8);
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air", n_air);
-    const IMaterial *p_substrate_material =
-        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
-    const IMaterial *particle_material =
-            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Layer substrate_layer;
-    substrate_layer.setMaterial(p_substrate_material);
-    ParticleDecoration particle_decoration
-        (new Particle(particle_material,
-                      new FormFactorCone(5*Units::nanometer,
-                                         5*Units::nanometer,
-                                         Units::deg2rad(54.73 ))));
-    particle_decoration.addInterferenceFunction
-        (new InterferenceFunctionNone());
-
-    air_layer.setDecoration(particle_decoration);
-
-    p_multi_layer->addLayer(air_layer);
-    p_multi_layer->addLayer(substrate_layer);
-    return p_multi_layer;
-}
-
-//! Functional test: Formfactor of a sphere.
-
-ISample *StandardSamples::FormFactor_Sphere()
-{
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_substrate(1.0-6e-6, 2e-8);
-    complex_t n_particle(1.0-6e-4, 2e-8);
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air", n_air);
-    const IMaterial *p_substrate_material =
-        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
-    const IMaterial *particle_material =
-            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
-
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Layer substrate_layer;
-    substrate_layer.setMaterial(p_substrate_material);
-    ParticleDecoration particle_decoration
-        (new Particle(particle_material,
-                      new FormFactorSphere(5*Units::nanometer,
-                                           5*Units::nanometer)));
-    particle_decoration.addInterferenceFunction
-(new InterferenceFunctionNone());
-
-    air_layer.setDecoration(particle_decoration);
-
-    p_multi_layer->addLayer(air_layer);
-    p_multi_layer->addLayer(substrate_layer);
-    return p_multi_layer;
-}
-
-// Functional test: Formfactor of an ellipsoid.
-
-ISample *StandardSamples::FormFactor_Ellipsoid()
-{
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_substrate(1.0-6e-6, 2e-8);
-    complex_t n_particle(1.0-6e-4, 2e-8);
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air", n_air);
-    const IMaterial *p_substrate_material =
-        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
-    const IMaterial *particle_material =
-            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Layer substrate_layer;
-    substrate_layer.setMaterial(p_substrate_material);
-    ParticleDecoration particle_decoration
-        (new Particle(particle_material,
-                      new FormFactorEllipsoid(5*Units::nanometer,
-                                              5*Units::nanometer,
-                                              5*Units::nanometer,
-                                              Units::deg2rad(54.73 ))));
-    particle_decoration.addInterferenceFunction
-        (new InterferenceFunctionNone());
-
-    air_layer.setDecoration(particle_decoration);
-
-    p_multi_layer->addLayer(air_layer);
-    p_multi_layer->addLayer(substrate_layer);
-    return p_multi_layer;
-}
-
-//! Functional test: Formfactor of a full spheroid.
-
-ISample *StandardSamples::FormFactor_FullSpheroid()
-{
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_substrate(1.0-6e-5, 2e-8);
-    complex_t n_particle(1.0-6e-4, 2e-8);
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air", n_air);
-    const IMaterial *p_substrate_material =
-        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
-    const IMaterial *particle_material =
-            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Layer substrate_layer;
-    substrate_layer.setMaterial(p_substrate_material);
-    ParticleDecoration particle_decoration
-        (new Particle(particle_material,
-                      new FormFactorFullSpheroid(5*Units::nanometer,
-                                                 7*Units::nanometer )));
-    particle_decoration.addInterferenceFunction
-        (new InterferenceFunctionNone());
-
-    air_layer.setDecoration(particle_decoration);
-
-    p_multi_layer->addLayer(air_layer);
-    p_multi_layer->addLayer(substrate_layer);
-    return p_multi_layer;
-}
-
-//! Functional test: Formfactor of a hemi spheroid.
-
-ISample *StandardSamples::FormFactor_HemiSpheroid()
-{
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_substrate(1.0-6e-7, 2e-8);
-    complex_t n_particle(1.0-6e-5, 2e-8);
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air", n_air);
-    const IMaterial *p_substrate_material =
-        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
-    const IMaterial *particle_material =
-            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
-
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Layer substrate_layer;
-    substrate_layer.setMaterial(p_substrate_material);
-    ParticleDecoration particle_decoration
-        (new Particle(particle_material,
-                      new FormFactorHemiSpheroid(5*Units::nanometer,
-                                                 4*Units::nanometer,
-                                                 2*Units::nanometer)));
-    particle_decoration.addInterferenceFunction
-        (new InterferenceFunctionNone());
-
-    air_layer.setDecoration(particle_decoration);
-
-    p_multi_layer->addLayer(air_layer);
-    p_multi_layer->addLayer(substrate_layer);
-    return p_multi_layer;
-}
-
-//! Functional test: Formfactor of a parallelepiped.
-
-ISample *StandardSamples::FormFactor_Parallelpiped()
-{
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_particle_shell(1.0-1e-4, 2e-8);
-    complex_t n_particle_core(1.0-6e-5, 2e-8);
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air11", n_air);
-
-    const IMaterial *shell_material =
-            MaterialManager::getHomogeneousMaterial("Shell", n_particle_shell);
-    const IMaterial *core_material =
-            MaterialManager::getHomogeneousMaterial("Core", n_particle_core);
-
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Particle shell_particle(shell_material,
-                            new FormFactorParallelepiped(8*Units::nanometer,
-                                                         8*Units::nanometer));
-    Particle core_particle(core_material,
-                           new FormFactorParallelepiped(7*Units::nanometer,
-                                                        6*Units::nanometer));
-    kvector_t core_position(0.0, 0.0, 0.0);
-    ParticleCoreShell particle(shell_particle, core_particle, core_position);
-    ParticleDecoration particle_decoration(particle.clone());
-    particle_decoration.addInterferenceFunction
-        (new InterferenceFunctionNone());
-
-    air_layer.setDecoration(particle_decoration);
-
-    p_multi_layer->addLayer(air_layer);
-    return p_multi_layer;
-}
-
-//! Functional test: Formfactor of a cylinder.
-
-ISample *StandardSamples::FormFactor_Cylinder()
-{
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_particle_shell(1.0-1e-4, 2e-8);
-    complex_t n_particle_core(1.0-6e-5, 2e-8);
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air11", n_air);
-    const IMaterial *shell_material =
-            MaterialManager::getHomogeneousMaterial("Shell", n_particle_shell);
-    const IMaterial *core_material =
-            MaterialManager::getHomogeneousMaterial("Core", n_particle_core);
-
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Particle shell_particle(shell_material,
-                            new FormFactorCylinder(8*Units::nanometer,
-                                                   8*Units::nanometer));
-    Particle core_particle(core_material,
-                           new FormFactorCylinder(7*Units::nanometer,
-                                                  6*Units::nanometer));
-    kvector_t core_position(0.0, 0.0, 0.0);
-    ParticleCoreShell particle(shell_particle, core_particle, core_position);
-    ParticleDecoration particle_decoration(particle.clone());
-    particle_decoration.addInterferenceFunction
-        (new InterferenceFunctionNone());
-
-    air_layer.setDecoration(particle_decoration);
-
-
-    p_multi_layer->addLayer(air_layer);
-    return p_multi_layer;
-}
-
-//! Functional test: Formfactor of a pyramid.
-
-ISample *StandardSamples::FormFactor_Pyramid()
-{
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_substrate(1.0-6e-6, 2e-8);
-    complex_t n_particle(1.0-6e-4, 2e-8);
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air", n_air);
-    const IMaterial *p_substrate_material =
-        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
-    const IMaterial *particle_material =
-            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
-
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Layer substrate_layer;
-    substrate_layer.setMaterial(p_substrate_material);
-    ParticleDecoration particle_decoration
-        (new Particle(particle_material,
-                      new FormFactorPyramid(5*Units::nanometer,
-                                            5*Units::nanometer,
-                                            Units::deg2rad(54.73 ) ) ) );
-    particle_decoration.addInterferenceFunction
-        (new InterferenceFunctionNone());
-
-    air_layer.setDecoration(particle_decoration);
-
-    p_multi_layer->addLayer(air_layer);
-    p_multi_layer->addLayer(substrate_layer);
-    return p_multi_layer;
-}
-
-//! Functional test: Formfactor of Prism3.
-
-ISample *StandardSamples::FormFactor_Prism3()
-{
-    MultiLayer *p_multi_layer = new MultiLayer();
-    complex_t n_air(1.0, 0.0);
-    complex_t n_substrate(1.0-7e-6, 2e-8);
-    complex_t n_particle(1.0-8e-4, 2e-8);
-    const IMaterial *p_air_material =
-        MaterialManager::getHomogeneousMaterial("Air", n_air);
-    const IMaterial *p_substrate_material =
-        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
-    const IMaterial *particle_material =
-            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Layer substrate_layer;
-    substrate_layer.setMaterial(p_substrate_material);
-    ParticleDecoration particle_decoration
-        (new Particle(particle_material,
-                      new FormFactorPrism3(5*Units::nanometer,
-                                           5*Units::nanometer)));
-    particle_decoration.addInterferenceFunction
-        (new InterferenceFunctionNone());
-
-    air_layer.setDecoration(particle_decoration);
-
-    p_multi_layer->addLayer(air_layer);
-    p_multi_layer->addLayer(substrate_layer);
-    return p_multi_layer;
-}
-
-//! Functional test: Formfactor of a full sphere.
-
-ISample *StandardSamples::FormFactor_FullSphere()
-{
-     MultiLayer *p_multi_layer = new MultiLayer();
-     complex_t n_air(1.0, 0.0);
-     complex_t n_substrate(1.0-6e-6, 2e-8);
-     complex_t n_particle(1.0-6e-4, 2e-8);
-     const IMaterial *p_air_material =
-         MaterialManager::getHomogeneousMaterial("Air", n_air);
-     const IMaterial *p_substrate_material =
-         MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
-     const IMaterial *particle_material =
-             MaterialManager::getHomogeneousMaterial("Particle", n_particle);
-     Layer air_layer;
-     air_layer.setMaterial(p_air_material);
-     Layer substrate_layer;
-     substrate_layer.setMaterial(p_substrate_material);
-     ParticleDecoration particle_decoration
-         (new Particle(particle_material,
-                       new FormFactorFullSphere(5*Units::nanometer ) ) );
-     particle_decoration.addInterferenceFunction
-         (new InterferenceFunctionNone());
-
-     air_layer.setDecoration(particle_decoration);
-
-     p_multi_layer->addLayer(air_layer);
-     p_multi_layer->addLayer(substrate_layer);
-     return p_multi_layer;
-}
+//ISample *StandardSamples::FormFactor_Box()
+//{
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_substrate(1.0-6e-6, 2e-8);
+//    complex_t n_particle(1.0-6e-4, 2e-8);
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air", n_air);
+//    const IMaterial *p_substrate_material =
+//        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
+//    const IMaterial *particle_material =
+//            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    Layer substrate_layer;
+//    substrate_layer.setMaterial(p_substrate_material);
+//    ParticleDecoration particle_decoration
+//        (new Particle(particle_material,
+//                      new FormFactorBox(5*Units::nanometer,
+//                                        5*Units::nanometer,
+//                                        5*Units::nanometer)));
+//    particle_decoration.addInterferenceFunction
+//        (new InterferenceFunctionNone());
+
+//    air_layer.setDecoration(particle_decoration);
+
+//    p_multi_layer->addLayer(air_layer);
+//    p_multi_layer->addLayer(substrate_layer);
+//    return p_multi_layer;
+//}
+
+////! Functional test: Formfactor of a cone.
+
+//ISample *StandardSamples::FormFactor_Cone()
+//{
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_substrate(1.0-6e-6, 2e-8);
+//    complex_t n_particle(1.0-6e-4, 2e-8);
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air", n_air);
+//    const IMaterial *p_substrate_material =
+//        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
+//    const IMaterial *particle_material =
+//            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    Layer substrate_layer;
+//    substrate_layer.setMaterial(p_substrate_material);
+//    ParticleDecoration particle_decoration
+//        (new Particle(particle_material,
+//                      new FormFactorCone(5*Units::nanometer,
+//                                         5*Units::nanometer,
+//                                         Units::deg2rad(54.73 ))));
+//    particle_decoration.addInterferenceFunction
+//        (new InterferenceFunctionNone());
+
+//    air_layer.setDecoration(particle_decoration);
+
+//    p_multi_layer->addLayer(air_layer);
+//    p_multi_layer->addLayer(substrate_layer);
+//    return p_multi_layer;
+//}
+
+////! Functional test: Formfactor of a sphere.
+
+//ISample *StandardSamples::FormFactor_Sphere()
+//{
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_substrate(1.0-6e-6, 2e-8);
+//    complex_t n_particle(1.0-6e-4, 2e-8);
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air", n_air);
+//    const IMaterial *p_substrate_material =
+//        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
+//    const IMaterial *particle_material =
+//            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    Layer substrate_layer;
+//    substrate_layer.setMaterial(p_substrate_material);
+//    ParticleDecoration particle_decoration
+//        (new Particle(particle_material,
+//                      new FormFactorSphere(5*Units::nanometer,
+//                                           5*Units::nanometer)));
+//    particle_decoration.addInterferenceFunction
+//(new InterferenceFunctionNone());
+
+//    air_layer.setDecoration(particle_decoration);
+
+//    p_multi_layer->addLayer(air_layer);
+//    p_multi_layer->addLayer(substrate_layer);
+//    return p_multi_layer;
+//}
+
+//// Functional test: Formfactor of an ellipsoid.
+
+//ISample *StandardSamples::FormFactor_Ellipsoid()
+//{
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_substrate(1.0-6e-6, 2e-8);
+//    complex_t n_particle(1.0-6e-4, 2e-8);
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air", n_air);
+//    const IMaterial *p_substrate_material =
+//        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
+//    const IMaterial *particle_material =
+//            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    Layer substrate_layer;
+//    substrate_layer.setMaterial(p_substrate_material);
+//    ParticleDecoration particle_decoration
+//        (new Particle(particle_material,
+//                      new FormFactorEllipsoid(5*Units::nanometer,
+//                                              5*Units::nanometer,
+//                                              5*Units::nanometer,
+//                                              Units::deg2rad(54.73 ))));
+//    particle_decoration.addInterferenceFunction
+//        (new InterferenceFunctionNone());
+
+//    air_layer.setDecoration(particle_decoration);
+
+//    p_multi_layer->addLayer(air_layer);
+//    p_multi_layer->addLayer(substrate_layer);
+//    return p_multi_layer;
+//}
+
+////! Functional test: Formfactor of a full spheroid.
+
+//ISample *StandardSamples::FormFactor_FullSpheroid()
+//{
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_substrate(1.0-6e-5, 2e-8);
+//    complex_t n_particle(1.0-6e-4, 2e-8);
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air", n_air);
+//    const IMaterial *p_substrate_material =
+//        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
+//    const IMaterial *particle_material =
+//            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    Layer substrate_layer;
+//    substrate_layer.setMaterial(p_substrate_material);
+//    ParticleDecoration particle_decoration
+//        (new Particle(particle_material,
+//                      new FormFactorFullSpheroid(5*Units::nanometer,
+//                                                 7*Units::nanometer )));
+//    particle_decoration.addInterferenceFunction
+//        (new InterferenceFunctionNone());
+
+//    air_layer.setDecoration(particle_decoration);
+
+//    p_multi_layer->addLayer(air_layer);
+//    p_multi_layer->addLayer(substrate_layer);
+//    return p_multi_layer;
+//}
+
+////! Functional test: Formfactor of a hemi spheroid.
+
+//ISample *StandardSamples::FormFactor_HemiSpheroid()
+//{
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_substrate(1.0-6e-7, 2e-8);
+//    complex_t n_particle(1.0-6e-5, 2e-8);
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air", n_air);
+//    const IMaterial *p_substrate_material =
+//        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
+//    const IMaterial *particle_material =
+//            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    Layer substrate_layer;
+//    substrate_layer.setMaterial(p_substrate_material);
+//    ParticleDecoration particle_decoration
+//        (new Particle(particle_material,
+//                      new FormFactorHemiSpheroid(5*Units::nanometer,
+//                                                 4*Units::nanometer,
+//                                                 2*Units::nanometer)));
+//    particle_decoration.addInterferenceFunction
+//        (new InterferenceFunctionNone());
+
+//    air_layer.setDecoration(particle_decoration);
+
+//    p_multi_layer->addLayer(air_layer);
+//    p_multi_layer->addLayer(substrate_layer);
+//    return p_multi_layer;
+//}
+
+////! Functional test: Formfactor of a parallelepiped.
+
+//ISample *StandardSamples::FormFactor_Parallelpiped()
+//{
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_particle_shell(1.0-1e-4, 2e-8);
+//    complex_t n_particle_core(1.0-6e-5, 2e-8);
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air11", n_air);
+
+//    const IMaterial *shell_material =
+//            MaterialManager::getHomogeneousMaterial("Shell", n_particle_shell);
+//    const IMaterial *core_material =
+//            MaterialManager::getHomogeneousMaterial("Core", n_particle_core);
+
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    Particle shell_particle(shell_material,
+//                            new FormFactorParallelepiped(8*Units::nanometer,
+//                                                         8*Units::nanometer));
+//    Particle core_particle(core_material,
+//                           new FormFactorParallelepiped(7*Units::nanometer,
+//                                                        6*Units::nanometer));
+//    kvector_t core_position(0.0, 0.0, 0.0);
+//    ParticleCoreShell particle(shell_particle, core_particle, core_position);
+//    ParticleDecoration particle_decoration(particle.clone());
+//    particle_decoration.addInterferenceFunction
+//        (new InterferenceFunctionNone());
+
+//    air_layer.setDecoration(particle_decoration);
+
+//    p_multi_layer->addLayer(air_layer);
+//    return p_multi_layer;
+//}
+
+////! Functional test: Formfactor of a cylinder.
+
+//ISample *StandardSamples::FormFactor_Cylinder()
+//{
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_particle_shell(1.0-1e-4, 2e-8);
+//    complex_t n_particle_core(1.0-6e-5, 2e-8);
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air11", n_air);
+//    const IMaterial *shell_material =
+//            MaterialManager::getHomogeneousMaterial("Shell", n_particle_shell);
+//    const IMaterial *core_material =
+//            MaterialManager::getHomogeneousMaterial("Core", n_particle_core);
+
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    Particle shell_particle(shell_material,
+//                            new FormFactorCylinder(8*Units::nanometer,
+//                                                   8*Units::nanometer));
+//    Particle core_particle(core_material,
+//                           new FormFactorCylinder(7*Units::nanometer,
+//                                                  6*Units::nanometer));
+//    kvector_t core_position(0.0, 0.0, 0.0);
+//    ParticleCoreShell particle(shell_particle, core_particle, core_position);
+//    ParticleDecoration particle_decoration(particle.clone());
+//    particle_decoration.addInterferenceFunction
+//        (new InterferenceFunctionNone());
+
+//    air_layer.setDecoration(particle_decoration);
+
+
+//    p_multi_layer->addLayer(air_layer);
+//    return p_multi_layer;
+//}
+
+////! Functional test: Formfactor of a pyramid.
+
+//ISample *StandardSamples::FormFactor_Pyramid()
+//{
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_substrate(1.0-6e-6, 2e-8);
+//    complex_t n_particle(1.0-6e-4, 2e-8);
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air", n_air);
+//    const IMaterial *p_substrate_material =
+//        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
+//    const IMaterial *particle_material =
+//            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    Layer substrate_layer;
+//    substrate_layer.setMaterial(p_substrate_material);
+//    ParticleDecoration particle_decoration
+//        (new Particle(particle_material,
+//                      new FormFactorPyramid(5*Units::nanometer,
+//                                            5*Units::nanometer,
+//                                            Units::deg2rad(54.73 ) ) ) );
+//    particle_decoration.addInterferenceFunction
+//        (new InterferenceFunctionNone());
+
+//    air_layer.setDecoration(particle_decoration);
+
+//    p_multi_layer->addLayer(air_layer);
+//    p_multi_layer->addLayer(substrate_layer);
+//    return p_multi_layer;
+//}
+
+////! Functional test: Formfactor of Prism3.
+
+//ISample *StandardSamples::FormFactor_Prism3()
+//{
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    complex_t n_air(1.0, 0.0);
+//    complex_t n_substrate(1.0-7e-6, 2e-8);
+//    complex_t n_particle(1.0-8e-4, 2e-8);
+//    const IMaterial *p_air_material =
+//        MaterialManager::getHomogeneousMaterial("Air", n_air);
+//    const IMaterial *p_substrate_material =
+//        MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
+//    const IMaterial *particle_material =
+//            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+//    Layer air_layer;
+//    air_layer.setMaterial(p_air_material);
+//    Layer substrate_layer;
+//    substrate_layer.setMaterial(p_substrate_material);
+//    ParticleDecoration particle_decoration
+//        (new Particle(particle_material,
+//                      new FormFactorPrism3(5*Units::nanometer,
+//                                           5*Units::nanometer)));
+//    particle_decoration.addInterferenceFunction
+//        (new InterferenceFunctionNone());
+
+//    air_layer.setDecoration(particle_decoration);
+
+//    p_multi_layer->addLayer(air_layer);
+//    p_multi_layer->addLayer(substrate_layer);
+//    return p_multi_layer;
+//}
+
+////! Functional test: Formfactor of a full sphere.
+
+//ISample *StandardSamples::FormFactor_FullSphere()
+//{
+//     MultiLayer *p_multi_layer = new MultiLayer();
+//     complex_t n_air(1.0, 0.0);
+//     complex_t n_substrate(1.0-6e-6, 2e-8);
+//     complex_t n_particle(1.0-6e-4, 2e-8);
+//     const IMaterial *p_air_material =
+//         MaterialManager::getHomogeneousMaterial("Air", n_air);
+//     const IMaterial *p_substrate_material =
+//         MaterialManager::getHomogeneousMaterial("Substrate", n_substrate);
+//     const IMaterial *particle_material =
+//             MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+//     Layer air_layer;
+//     air_layer.setMaterial(p_air_material);
+//     Layer substrate_layer;
+//     substrate_layer.setMaterial(p_substrate_material);
+//     ParticleDecoration particle_decoration
+//         (new Particle(particle_material,
+//                       new FormFactorFullSphere(5*Units::nanometer ) ) );
+//     particle_decoration.addInterferenceFunction
+//         (new InterferenceFunctionNone());
+
+//     air_layer.setDecoration(particle_decoration);
+
+//     p_multi_layer->addLayer(air_layer);
+//     p_multi_layer->addLayer(substrate_layer);
+//     return p_multi_layer;
+//}
 
 //! Multilayer specular magnetic testcase
 
diff --git a/App/src/TestFunctionalTests.cpp b/App/src/TestFunctionalTests.cpp
index fe14446dbaa..1654bedaa37 100644
--- a/App/src/TestFunctionalTests.cpp
+++ b/App/src/TestFunctionalTests.cpp
@@ -11,7 +11,8 @@ void TestFunctionalTests::execute()
     if(!readTestNames()) return;
 
     for(size_t i=0; i<m_testNames.size(); ++i) {
-        FunctionalTest_t test = m_testRegistry.runTest(m_testNames[i]);
+        FunctionalTest_t test = m_testRegistry.getTest(m_testNames[i]);
+        test->runTest();
 
         IsGISAXSTools::drawOutputDataComparisonResults( *test->getResult(),
             *test->getReference(), test->getName(), test->getDescription());
diff --git a/App/src/TestIsGISAXS15.cpp b/App/src/TestIsGISAXS15.cpp
deleted file mode 100644
index 07558e053a2..00000000000
--- a/App/src/TestIsGISAXS15.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-// ************************************************************************** //
-//                                                                         
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      App/src/TestIsGISAXS15.cpp
-//! @brief     Implements class TestIsGISAXS15.
-//
-//! Homepage:  apps.jcns.fz-juelich.de/BornAgain
-//! License:   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2013
-//! @authors   Scientific Computing Group at MLZ Garching
-//! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
-//
-// ************************************************************************** //
-
-#include "TestIsGISAXS15.h"
-#include "IsGISAXS15.h"
-#include "IsGISAXSTools.h"
-#include "OutputDataIOFactory.h"
-#include "Utils.h"
-
-#include <fstream>
-
-
-TestIsGISAXS15::TestIsGISAXS15() : IApplicationTest("TestIsGISAXS15")
-{
-    setOutputPath(Utils::FileSystem::GetPathToData("../Tests/ReferenceData/IsGISAXS/ex-15/" ));
-}
-
-
-void TestIsGISAXS15::execute()
-{
-    FunctionalTests::IsGISAXS15 test;
-    test.run();
-
-    OutputDataIOFactory::writeIntensityData(*test.getOutputData(), "this_SSCA.ima");
-}
-
-
-void TestIsGISAXS15::finalise()
-{
-    std::string isgi_file(getOutputPath()+"isgi_SSCA.ima");
-    std::string this_file("this_SSCA.ima");
-
-    OutputData<double> *isgi_data = OutputDataIOFactory::readIntensityData(isgi_file);
-    OutputData<double> *our_data = OutputDataIOFactory::readIntensityData(this_file);
-
-    IsGISAXSTools::drawOutputDataComparisonResults(*our_data, *isgi_data, "TestIsGISAXS15_c1", "SSCA Cylinders");
-
-    delete isgi_data;
-    delete our_data;
-}
-
-
-
diff --git a/App/src/TestMesoCrystal1.cpp b/App/src/TestMesoCrystal1.cpp
index 170ff808d43..4257a84c0dc 100644
--- a/App/src/TestMesoCrystal1.cpp
+++ b/App/src/TestMesoCrystal1.cpp
@@ -30,9 +30,8 @@ void TestMesoCrystal1::execute()
     // loading reference data
     //std::string filename = Utils::FileSystem::GetPathToData("../Tests/ReferenceData/BornAgain/")+ "mesocrystal1b_reference.txt.gz";
     //std::string filename = "dev-tools/tmp-examples/MesoCrystals/ex02_fitspheres/004_230_P144_im_full_phitheta.txt.gz";
-    std::string filename = Utils::FileSystem::GetPathToData("../Tests/ReferenceData/BornAgain/")+ "mesocrystal1_reference_v2_nphi180.txt.gz";
+    std::string filename = Utils::FileSystem::GetReferenceDataDir()+ "mesocrystal1_reference_v2_nphi180.txt.gz";
     //std::string filename = Utils::FileSystem::GetPathToData("../Tests/ReferenceData/BornAgain/")+ "mesocrystal1_reference_v2_nphi2.txt.gz";
-    //std::string filename = "mac_test_mesocrystal.txt";
 
     OutputData<double> *reference = OutputDataIOFactory::readIntensityData(filename);
 
@@ -41,8 +40,7 @@ void TestMesoCrystal1::execute()
     // setting detector axis as in reference data
     simulation->setDetectorParameters(*reference);
 
-    //simulation->getSampleBuilder()->setMatchedParametersValue("*/nphi_rotations", 2.);
-
+    simulation->getSampleBuilder()->setParameterValue("nphi_rotations", 180.);
 
     simulation->runSimulation();
     simulation->normalize();
diff --git a/App/src/TestMiscellaneous.cpp b/App/src/TestMiscellaneous.cpp
index bb2c8e60eee..71243db1f90 100644
--- a/App/src/TestMiscellaneous.cpp
+++ b/App/src/TestMiscellaneous.cpp
@@ -74,7 +74,7 @@ void TestMiscellaneous::test_FunctionalTestRegistry()
     FunctionalTestRegistry tests;
     tests.printCatalogue();
 
-    tests.runTest("isgisaxs01");
+    tests.getTest("isgisaxs01");
     std::cout << Utils::FileSystem::GetReferenceDataDir() << std::endl;
 
 }
diff --git a/Core/StandardSamples/FunctionalTestRegistry.cpp b/Core/StandardSamples/FunctionalTestRegistry.cpp
index 42ec584b7fd..e79fd532a91 100644
--- a/Core/StandardSamples/FunctionalTestRegistry.cpp
+++ b/Core/StandardSamples/FunctionalTestRegistry.cpp
@@ -73,6 +73,14 @@ FunctionalTestRegistry::Catalogue::Catalogue()
         "Core shell nanoparticles",
         "isgisaxs11_reference.ima.gz", 2e-10);
 
+    add("isgisaxs15",
+        "Size spacing correlation approximation",
+        "isgisaxs15_reference.ima.gz", 2e-10);
+
+    add("mesocrystal01",
+        "Mesocrystals of cylindrical shape composed by spherical nanoparticles",
+        "mesocrystal1_reference_v2_nphi2.txt.gz", 1e-10);
+
 }
 
 
@@ -128,18 +136,26 @@ bool FunctionalTestRegistry::isRegisteredName(const std::string &name)
 }
 
 
-FunctionalTest_t FunctionalTestRegistry::runTest(const std::string &name)
+FunctionalTest_t FunctionalTestRegistry::getTest(const std::string &name)
 {
     FunctionalTest_t test(new FunctionalTest(m_catalogue.getInfo(name)));
-    test->runTest();
     return test;
 }
 
 
+//FunctionalTest_t FunctionalTestRegistry::runTest(const std::string &name)
+//{
+//    FunctionalTest_t test(new FunctionalTest(m_catalogue.getInfo(name)));
+//    test->runTest();
+//    return test;
+//}
+
+
 int FUNCTIONAL_TEST(const std::string &name)
 {
     FunctionalTestRegistry registry;
-    FunctionalTest_t test = registry.runTest(name);
+    FunctionalTest_t test = registry.getTest(name);
+    test->runTest();
     return test->analyseResults();
 }
 
diff --git a/Core/StandardSamples/FunctionalTestRegistry.h b/Core/StandardSamples/FunctionalTestRegistry.h
index 763a2694dba..68d37f7c760 100644
--- a/Core/StandardSamples/FunctionalTestRegistry.h
+++ b/Core/StandardSamples/FunctionalTestRegistry.h
@@ -24,7 +24,9 @@ public:
 
     void printCatalogue() { m_catalogue.print(); }
 
-    FunctionalTest_t runTest(const std::string &name);
+    FunctionalTest_t getTest(const std::string &name);
+
+    //FunctionalTest_t runTest(const std::string &name);
 
     bool isRegisteredName(const std::string &name);
 
diff --git a/Core/StandardSamples/IFunctionalTest.cpp b/Core/StandardSamples/IFunctionalTest.cpp
index 09917b62957..9530840e2fe 100644
--- a/Core/StandardSamples/IFunctionalTest.cpp
+++ b/Core/StandardSamples/IFunctionalTest.cpp
@@ -5,24 +5,38 @@
 #include "FileSystem.h"
 
 
-void FunctionalTest::runTest()
+FunctionalTest::FunctionalTest(const FunctionalTestInfo &info)
+    : m_info(info),
+      m_simulation(0),
+      m_reference(0)
 {
     SimulationRegistry sim_registry;
-    Simulation *simulation = sim_registry.createSimulation(getName());
+    m_simulation = sim_registry.createSimulation(getName());
 
     std::string filename = Utils::FileSystem::GetReferenceDataDir() + m_info.m_reference_file;
     m_reference = OutputDataIOFactory::readIntensityData(filename);
+}
+
+
+FunctionalTest::~FunctionalTest()
+{
+    delete m_simulation;
+    delete m_reference;
+}
+
 
-    simulation->runSimulation();
-    m_result = simulation->getIntensityData();
-    delete simulation;
+void FunctionalTest::runTest()
+{
+    m_simulation->runSimulation();
 }
 
+
 int FunctionalTest::analyseResults()
 {
-    assert(m_result);
+    assert(m_simulation);
+//    assert(m_result);
     assert(m_reference);
-    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
+    double diff = OutputDataFunctions::GetDifference(*getResult(),*m_reference);
 
     std::cout << getName() << " " << getDescription() << " " << diff
               << " " << (diff>m_info.m_threshold ? "[FAILED]" : "[OK]") << std::endl;
diff --git a/Core/StandardSamples/IFunctionalTest.h b/Core/StandardSamples/IFunctionalTest.h
index c0192e21e57..4dd550812a5 100644
--- a/Core/StandardSamples/IFunctionalTest.h
+++ b/Core/StandardSamples/IFunctionalTest.h
@@ -2,10 +2,11 @@
 #define _IFUNCTIONALTEST_H
 
 
-#include "OutputData.h"
+#include "Simulation.h"
 #include <boost/shared_ptr.hpp>
 #include <string>
 
+
 class IFunctionalTest
 {
 public:
@@ -40,10 +41,12 @@ class FunctionalTest : public IFunctionalTest
 {
 public:
     enum TestResult { SUCCESS, FAILED};
-    FunctionalTest(const FunctionalTestInfo &info) : m_info(info), m_result(0), m_reference(0) {}
-    ~FunctionalTest() { delete m_result; delete m_reference; }
 
-    const OutputData<double> *getResult() const { return m_result; }
+    FunctionalTest(const FunctionalTestInfo &info);
+    ~FunctionalTest();
+
+    Simulation *getSimulation() { return m_simulation; }
+    const OutputData<double> *getResult() const { return m_simulation->getOutputData(); }
     const OutputData<double> *getReference() const { return m_reference; }
     std::string getName() const { return m_info.m_name; }
     std::string getDescription() const { return m_info.m_description; }
@@ -52,7 +55,7 @@ public:
 
 private:
     FunctionalTestInfo m_info;
-    OutputData<double> *m_result;
+    Simulation *m_simulation;
     OutputData<double> *m_reference;
 };
 
diff --git a/Core/StandardSamples/MesoCrystal01Builder.cpp b/Core/StandardSamples/MesoCrystal01Builder.cpp
index 0606a782f45..50ea1b84f43 100644
--- a/Core/StandardSamples/MesoCrystal01Builder.cpp
+++ b/Core/StandardSamples/MesoCrystal01Builder.cpp
@@ -24,7 +24,7 @@ MesoCrystal01Builder::MesoCrystal01Builder()
     , m_sigma_lattice_length_a(1.1601e+00*Units::nanometer)
     , m_surface_filling_ratio(1.7286e-01)
     , m_roughness(2.8746e+01*Units::nanometer)
-    , m_nphi_rotations(180)
+    , m_nphi_rotations(2)
 {
     init_parameters();
 }
diff --git a/Core/StandardSamples/SampleBuilderFactory.cpp b/Core/StandardSamples/SampleBuilderFactory.cpp
index c0b2ddc3ec6..20fedfeb847 100644
--- a/Core/StandardSamples/SampleBuilderFactory.cpp
+++ b/Core/StandardSamples/SampleBuilderFactory.cpp
@@ -107,7 +107,8 @@ SampleBuilderFactory::SampleBuilderFactory()
     registerItem(
         "mesocrystal01",
         IFactoryCreateFunction<MesoCrystal01Builder, ISampleBuilder>,
-        "mesocrystals of cylindrical shape composed by spherical nanoparticles");
+        "Mesocrystals of cylindrical shape composed by spherical nanoparticles");
+
     registerItem(
         "PolarizedDWBAZeroMag",
         IFactoryCreateFunction<PolarizedDWBAZeroMagBuilder, ISampleBuilder>,
diff --git a/Core/StandardSamples/SimulationRegistry.cpp b/Core/StandardSamples/SimulationRegistry.cpp
index 3ff1476d59a..1eccd25178a 100644
--- a/Core/StandardSamples/SimulationRegistry.cpp
+++ b/Core/StandardSamples/SimulationRegistry.cpp
@@ -72,11 +72,11 @@ SimulationRegistry::SimulationRegistry()
 
     registerItem(
         "isgisaxs15", StandardSimulations::IsGISAXS15,
-        "IsGISAXS15 example, Size spacing correlation approximation");
+        "Size spacing correlation approximation");
 
     registerItem(
         "mesocrystal01", StandardSimulations::MesoCrystal01,
-        "mesocrystals of cylindrical shape composed by spherical nanoparticles");
+        "Mesocrystals of cylindrical shape composed by spherical nanoparticles");
 
 	registerItem(
         "PolarizedDWBAZeroMag", StandardSimulations::PolarizedDWBAZeroMag,
diff --git a/Core/StandardSamples/StandardSimulations.cpp b/Core/StandardSamples/StandardSimulations.cpp
index f07a7060bac..00c95799238 100644
--- a/Core/StandardSamples/StandardSimulations.cpp
+++ b/Core/StandardSamples/StandardSimulations.cpp
@@ -3,6 +3,8 @@
 #include "Simulation.h"
 #include "ResolutionFunction2DSimple.h"
 #include "Units.h"
+#include "FileSystem.h"
+#include "OutputDataIOFactory.h"
 
 Simulation *StandardSimulations::IsGISAXS01()
 {
@@ -373,6 +375,12 @@ Simulation *StandardSimulations::MesoCrystal01()
     Simulation *result = new Simulation();
     result->setBeamParameters(1.77*Units::angstrom, 0.4*Units::degree, 0.0*Units::degree);
     result->setBeamIntensity(5.0090e+12);
+
+    std::string filename = Utils::FileSystem::GetReferenceDataDir() + "mesocrystal1_reference_v2_nphi2.txt.gz";
+    OutputData<double> *reference = OutputDataIOFactory::readIntensityData(filename);
+    result->setDetectorParameters(*reference);
+    delete reference;
+
 //    result->setDetectorResolutionFunction(
 //            new ResolutionFunction2DSimple(0.0002, 0.0002));
 
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS08a/IsGISAXS082DDL.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS08a/IsGISAXS08a.cpp
similarity index 100%
rename from Tests/FunctionalTests/TestCore/IsGISAXS08a/IsGISAXS082DDL.cpp
rename to Tests/FunctionalTests/TestCore/IsGISAXS08a/IsGISAXS08a.cpp
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS08b/IsGISAXS082DDL2.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS08b/IsGISAXS08b.cpp
similarity index 100%
rename from Tests/FunctionalTests/TestCore/IsGISAXS08b/IsGISAXS082DDL2.cpp
rename to Tests/FunctionalTests/TestCore/IsGISAXS08b/IsGISAXS08b.cpp
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS09a/IsGISAXS09P.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS09a/IsGISAXS09a.cpp
similarity index 100%
rename from Tests/FunctionalTests/TestCore/IsGISAXS09a/IsGISAXS09P.cpp
rename to Tests/FunctionalTests/TestCore/IsGISAXS09a/IsGISAXS09a.cpp
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS09b/IsGISAXS09R.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS09b/IsGISAXS09b.cpp
similarity index 100%
rename from Tests/FunctionalTests/TestCore/IsGISAXS09b/IsGISAXS09R.cpp
rename to Tests/FunctionalTests/TestCore/IsGISAXS09b/IsGISAXS09b.cpp
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.cpp
index fbbb1008c54..0a9943137a8 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.cpp
@@ -1,75 +1,8 @@
-#include "IsGISAXS15.h"
-#include "MultiLayer.h"
-#include "ParticleDecoration.h"
-#include "ParticleBuilder.h"
-#include "InterferenceFunction1DParaCrystal.h"
-#include "FormFactorCylinder.h"
-#include "Simulation.h"
-#include "Units.h"
-#include "MaterialManager.h"
-#include "StochasticGaussian.h"
-#include "StochasticSampledParameter.h"
-#include "OutputDataIOFactory.h"
-#include "Utils.h"
-#include "MathFunctions.h"
-#include "SimulationRegistry.h"
-#include "OutputDataFunctions.h"
-#include <iostream>
-#include <cmath>
-
-
-FunctionalTests::IsGISAXS15::IsGISAXS15()
-    : m_name("IsGISAXS15")
-    , m_description("Size spacing correlation approximation")
-    , m_result(0)
-    , m_reference(0)
-{ }
-
-
-void FunctionalTests::IsGISAXS15::run(const std::string &path_to_data)
-{
-    SimulationRegistry sim_registry;
-    Simulation *simulation = sim_registry.createSimulation("isgisaxs15");
-
-    // loading reference data
-    std::string filename = path_to_data + "isgisaxs15_reference.ima.gz";
-    m_reference = OutputDataIOFactory::readIntensityData(filename);
-
-    simulation->runSimulation();
-
-    m_result = simulation->getIntensityData();
-    delete simulation;
-}
-
-
-int FunctionalTests::IsGISAXS15::analyseResults()
-{
-    const double threshold(2e-10);
-
-    // calculating average relative difference
-    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
-
-    bool status_ok(true);
-    if( diff > threshold ) status_ok=false;
-
-    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]);
-}
+#include "FunctionalTestRegistry.h"
+#include "FileSystem.h"
 
 int main(int argc, char **argv)
 {
-    FunctionalTests::IsGISAXS15 test;
-    test.run(GetPathToData(argc, argv));
-    return test.analyseResults();
+    if(argc == 2) Utils::FileSystem::SetReferenceDataDir(argv[1]);
+    return FUNCTIONAL_TEST("isgisaxs15");
 }
-#endif
-
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.h b/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.h
deleted file mode 100644
index a91e1104ce0..00000000000
--- a/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef FUNCTIONALTESTS_ISGISAXS15_H
-#define FUNCTIONALTESTS_ISGISAXS15_H
-
-#include "ISampleBuilder.h"
-#include <string>
-#include "OutputData.h"
-
-
-namespace FunctionalTests {
-
-class IsGISAXS15
-{
-public :
-    IsGISAXS15();
-    ~IsGISAXS15() { 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/MesoCrystal1/MesoCrystal1.cpp b/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.cpp
index 9119717bca1..3284193a401 100644
--- a/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.cpp
+++ b/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.cpp
@@ -1,76 +1,16 @@
-#include "MesoCrystal1.h"
-#include "Simulation.h"
-#include "ResolutionFunction2DSimple.h"
-#include "OutputDataIOFactory.h"
-#include "Utils.h"
-#include "Units.h"
-#include "Types.h"
+#include "FunctionalTestRegistry.h"
+#include "FileSystem.h"
 #include "SimulationRegistry.h"
-#include "OutputDataFunctions.h"
-
-using namespace FunctionalTests;
-
-
-
-MesoCrystal1::MesoCrystal1()
-: m_name("MesoCrystal1")
-, m_description("Meso crystal simulation")
-, m_result(0)
-, m_reference(0)
-{ }
-
-
-void MesoCrystal1::MesoCrystal1::run(const std::string &path_to_data)
-{
-    SimulationRegistry sim_registry;
-    Simulation *simulation = sim_registry.createSimulation("mesocrystal01");
-    simulation->getSampleBuilder()->setParameterValue("nphi_rotations", 2.);
-
-    // loading reference data
-    std::string filename = path_to_data + "mesocrystal1_reference_v2_nphi2.txt.gz";
-    m_reference = OutputDataIOFactory::readIntensityData(filename);
-
-    // setting detector axis as in reference data
-    simulation->setDetectorParameters(*m_reference);
-
-    simulation->runSimulation();
-    simulation->normalize();
-
-    m_result = simulation->getIntensityData();
-    delete simulation;
-}
-
-
-int MesoCrystal1::analyseResults()
-{
-    const double threshold(1e-10);
-
-    // calculating average relative difference
-    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
-
-    bool status_ok(true);
-    if( diff > threshold ) 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::MesoCrystal1 test;
-    test.run(GetPathToData(argc, argv));
-    return test.analyseResults();
+    if(argc == 2) Utils::FileSystem::SetReferenceDataDir(argv[1]);
+
+    FunctionalTestRegistry registry;
+    FunctionalTest_t test = registry.getTest("mesocrystal01");
+    test->runTest();
+    test->getSimulation()->normalize();
+    return test->analyseResults();
+    //return FUNCTIONAL_TEST("mesocrystal01");
 }
-#endif
 
diff --git a/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.h b/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.h
deleted file mode 100644
index 61f89d51d0e..00000000000
--- a/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef _TESTMESOCRYSTAL1_H
-#define _TESTMESOCRYSTAL1_H
-
-#include "ISampleBuilder.h"
-#include "OutputData.h"
-#include <string>
-#include <vector>
-
-class ISample;
-class Simulation;
-#include "OutputData.h"
-
-
-namespace FunctionalTests {
-
-//! functional test: mesocrystal simulation
-
-class MesoCrystal1
-{
-public:
-    MesoCrystal1();
-    ~MesoCrystal1() { delete m_result; delete m_reference;}
-
-    //! run fitting
-    void run(const std::string &path_to_data = std::string());
-    int analyseResults();
-
-private:
-    std::string m_name;
-    std::string m_description;
-    OutputData<double> *m_result;
-    OutputData<double> *m_reference;
-};
-
-}
-
-
-#endif
-- 
GitLab