From 288857c1595f4cac8ad56de485d64a208570386c Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Wed, 8 Sep 2021 20:20:19 +0200
Subject: [PATCH] standard simulations -> namespace test::makeSimulation

---
 Core/Examples/StandardSimulations.cpp         | 311 ------------------
 Core/Examples/StandardSimulations.h           |  59 ----
 .../Core/Consistence/ConsistenceTests.cpp     |   5 +-
 Tests/Functional/Core/Fitting/FitTests.cpp    |   9 +-
 .../Functional/ProStd/StdTestSimulations.cpp  | 279 +++++++++++++++-
 Tests/Functional/ProStd/StdTestSimulations.h  |  27 +-
 Tests/Functional/PyCore/utils.py              |   2 +-
 Tests/Functional/Std/StandardTests.h          | 195 ++++++-----
 Tests/Performance/Core/Multilayer.cpp         |   2 +-
 9 files changed, 398 insertions(+), 491 deletions(-)
 delete mode 100644 Core/Examples/StandardSimulations.cpp
 delete mode 100644 Core/Examples/StandardSimulations.h

diff --git a/Core/Examples/StandardSimulations.cpp b/Core/Examples/StandardSimulations.cpp
deleted file mode 100644
index b2d2dda38ae..00000000000
--- a/Core/Examples/StandardSimulations.cpp
+++ /dev/null
@@ -1,311 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Core/Examples/StandardSimulations.cpp
-//! @brief     Implements functions for standard simulations.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "Core/Examples/StandardSimulations.h"
-#include "Base/Axis/FixedBinAxis.h"
-#include "Base/Const/Units.h"
-#include "Core/Scan/AlphaScan.h"
-#include "Core/Scan/QzScan.h"
-#include "Core/Simulation/GISASSimulation.h"
-#include "Device/Beam/Beam.h"
-#include "Device/Beam/FootprintGauss.h"
-#include "Device/Beam/FootprintSquare.h"
-#include "Device/Data/OutputData.h"
-#include "Device/Detector/RectangularDetector.h"
-#include "Device/Detector/SphericalDetector.h"
-#include "Device/Mask/Ellipse.h"
-#include "Device/Mask/Line.h"
-#include "Device/Mask/Polygon.h"
-#include "Device/Mask/Rectangle.h"
-#include "Device/Resolution/ResolutionFunction2DGaussian.h"
-#include "Device/Resolution/ScanResolution.h"
-#include "Param/Distrib/Distributions.h"
-#include "Param/Distrib/RangedDistributions.h"
-#include "Resample/Options/SimulationOptions.h"
-#include "Sample/StandardSamples/SampleBuilderFactory.h"
-#include <memory>
-
-namespace {
-
-const size_t rdet_nbinsx(40), rdet_nbinsy(30);
-const double rdet_width(20.0), rdet_height(18.0), rdet_distance(1000.0);
-
-const R3 zplus(0.0, 0.0, 1.0);
-const R3 yplus(0.0, 1.0, 0.0);
-
-const std::map<std::string, std::pair<R3, R3>> ZPolarizationCases = {
-    {"PP", {+zplus, +zplus}},
-    {"PM", {+zplus, -zplus}},
-    {"MP", {-zplus, +zplus}},
-    {"MM", {-zplus, -zplus}},
-};
-
-const std::map<std::string, std::pair<R3, R3>> YPolarizationCases = {
-    {"PP", {+yplus, +yplus}},
-    {"PM", {+yplus, -yplus}},
-    {"MP", {-yplus, +yplus}},
-    {"MM", {-yplus, -yplus}},
-};
-
-} // namespace
-
-using Units::angstrom;
-using Units::deg;
-
-//! GISAS simulation with small detector and phi[-2,2], theta[0,2].
-
-std::unique_ptr<GISASSimulation> StdSimulations::MiniGISAS(const MultiLayer& sample)
-{
-    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
-    SphericalDetector det(25, -2 * deg, 2 * deg, 25, 0, 2 * deg);
-    return std::make_unique<GISASSimulation>(beam, sample, det);
-}
-
-
-//! GISAS simulation with small detector and phi[-1,1], theta[0,1].
-
-std::unique_ptr<GISASSimulation> StdSimulations::MiniGISAS_v2(const MultiLayer& sample)
-{
-    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
-    SphericalDetector det(25, -1 * deg, 1 * deg, 25, 0, 1 * deg);
-    return std::make_unique<GISASSimulation>(beam, sample, det);
-}
-
-std::unique_ptr<GISASSimulation> StdSimulations::MiniZPolarizedGISAS(const MultiLayer& sample,
-                                                                     const std::string& polCase)
-{
-    const auto zCase = ZPolarizationCases.at(polCase);
-    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
-    beam.setPolarization(zCase.first);
-    SphericalDetector det(25, -2 * deg, 2 * deg, 25, 0, 2 * deg);
-    det.setAnalyzer(zCase.second, 1., .5);
-    return std::make_unique<GISASSimulation>(beam, sample, det);
-}
-
-
-//! Basic GISAS simulation with the detector phi[0,2], theta[0,2].
-
-std::unique_ptr<GISASSimulation> StdSimulations::BasicGISAS(const MultiLayer& sample)
-{
-    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
-    SphericalDetector det(100, 0, 2 * deg, 100, 0, 2 * deg);
-    return std::make_unique<GISASSimulation>(beam, sample, det);
-}
-
-//! Basic GISAS simulation for spin flip channel.
-
-std::unique_ptr<GISASSimulation> StdSimulations::SpinflipGISAS(const MultiLayer& sample)
-{
-    std::unique_ptr<GISASSimulation> result = BasicGISAS(sample);
-    result->instrument().setPolFilters(zplus, zplus, -1.0, 0.5);
-    return result;
-}
-
-//! GISAS simulation with beam divergence applied.
-
-std::unique_ptr<GISASSimulation> StdSimulations::MiniGISASBeamDivergence(const MultiLayer& sample)
-{
-    std::unique_ptr<GISASSimulation> result = MiniGISAS(sample);
-
-    DistributionLogNormal wavelength_distr(1 * angstrom, 0.1);
-    DistributionGaussian alpha_distr(0.2 * deg, 0.02 * deg);
-    DistributionGate phi_distr(-0.1 * deg, 0.02 * deg);
-
-    result->addParameterDistribution(ParameterDistribution::BeamWavelength, wavelength_distr, 5);
-    result->addParameterDistribution(ParameterDistribution::BeamInclinationAngle, alpha_distr, 4);
-    result->addParameterDistribution(ParameterDistribution::BeamAzimuthalAngle, phi_distr, 3);
-
-    return result;
-}
-
-//! GISAS simulation with multiple masks on the detector plane.
-
-std::unique_ptr<GISASSimulation> StdSimulations::GISASWithMasks(const MultiLayer& sample)
-{
-    Beam beam(1e7, 1 * angstrom, Direction(0.2 * deg, 0));
-    SphericalDetector det(50, -1 * deg, 1 * deg, 50, 0, 2 * deg);
-    std::unique_ptr<GISASSimulation> result = std::make_unique<GISASSimulation>(beam, sample, det);
-
-    result->maskAll();
-    // pacman
-    result->addMask(Ellipse(0.0 * deg, 1.0 * deg, 0.5 * deg, 0.5 * deg), false);
-    result->addMask(Ellipse(0.11 * deg, 1.25 * deg, 0.05 * deg, 0.05 * deg), true);
-
-    std::vector<std::vector<double>> points = {{0.0 * deg, 1.0 * deg},
-                                               {0.5 * deg, 1.2 * deg},
-                                               {0.5 * deg, 0.8 * deg},
-                                               {0.0 * deg, 1.0 * deg}};
-    result->addMask(Polygon(points), true);
-
-    result->addMask(Rectangle(0.45 * deg, 0.95 * deg, 0.55 * deg, 1.05 * deg), false);
-    result->addMask(Rectangle(0.61 * deg, 0.95 * deg, 0.71 * deg, 1.05 * deg), false);
-    result->addMask(Rectangle(0.75 * deg, 0.95 * deg, 0.85 * deg, 1.05 * deg), false);
-
-    // more masks
-    result->addMask(Ellipse(-0.5 * deg, 1.5 * deg, 0.3 * deg, 0.1 * deg, 45. * deg), false);
-    result->addMask(VerticalLine(-0.6 * deg), true);
-    result->addMask(HorizontalLine(0.3 * deg), false);
-
-    return result;
-}
-
-//! GISAS simulation with detector resolution.
-
-std::unique_ptr<GISASSimulation>
-StdSimulations::MiniGISASDetectorResolution(const MultiLayer& sample)
-{
-    std::unique_ptr<GISASSimulation> result = MiniGISAS(sample);
-    ResolutionFunction2DGaussian resfunc(0.0025, 0.0025);
-    result->detector().setResolutionFunction(resfunc);
-    return result;
-}
-
-//! GISAS simulation with small detector and including specular peak.
-
-std::unique_ptr<GISASSimulation> StdSimulations::MiniGISASSpecularPeak(const MultiLayer& sample)
-{
-    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
-    SphericalDetector det(25, -2 * deg, 2 * deg, 25, 0, 2 * deg);
-    std::unique_ptr<GISASSimulation> result = std::make_unique<GISASSimulation>(beam, sample, det);
-    result->setBeamParameters(1 * angstrom, 0.2 * deg, 0);
-    result->options().setIncludeSpecular(true);
-    return result;
-}
-
-//! GISAS simulation with large detector to test performance.
-
-std::unique_ptr<GISASSimulation> StdSimulations::MaxiGISAS(const MultiLayer& sample)
-{
-    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
-    SphericalDetector det(256, -2 * deg, 2 * deg, 256, 0, 2 * deg);
-    return std::make_unique<GISASSimulation>(beam, sample, det);
-}
-
-//! Basic GISAS for polarization studies.
-
-std::unique_ptr<GISASSimulation> StdSimulations::MaxiGISAS00(const MultiLayer& sample)
-{
-    std::unique_ptr<GISASSimulation> result = MaxiGISAS(sample);
-    result->instrument().setPolFilters(zplus, zplus, 1.0, 0.5);
-    return result;
-}
-
-//! GISAS simulation with generic rectangular detector.
-
-std::unique_ptr<GISASSimulation> StdSimulations::RectDetectorGeneric(const MultiLayer& sample)
-{
-    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
-    RectangularDetector det(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
-    det.setPosition(R3(rdet_distance, 10.0, 5.0), rdet_width / 2., 1.0, R3(0.1, -1.0, 0.2));
-    return std::make_unique<GISASSimulation>(beam, sample, det);
-}
-
-//! GISAS simulation with the rectangular detector perpendicular to the sample.
-
-std::unique_ptr<GISASSimulation> StdSimulations::RectDetectorPerpToSample(const MultiLayer& sample)
-{
-    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
-    RectangularDetector det(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
-    det.setPerpendicularToSampleX(rdet_distance, rdet_width / 2., 1.0);
-    return std::make_unique<GISASSimulation>(beam, sample, det);
-}
-
-//! GISAS simulation with the rectangular detector perpendicular to the direct beam.
-
-std::unique_ptr<GISASSimulation>
-StdSimulations::RectDetectorPerpToDirectBeam(const MultiLayer& sample)
-{
-    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
-    RectangularDetector det(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
-    det.setPerpendicularToDirectBeam(rdet_distance, rdet_width / 2., 1.0);
-    return std::make_unique<GISASSimulation>(beam, sample, det);
-}
-
-//! GISAS simulation with the rectangular detector perpendicular to the reflected beam.
-
-std::unique_ptr<GISASSimulation>
-StdSimulations::RectDetectorPerpToReflectedBeam(const MultiLayer& sample)
-{
-    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
-    RectangularDetector det(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
-    det.setPerpendicularToReflectedBeam(rdet_distance, rdet_width / 2., 1.0);
-    return std::make_unique<GISASSimulation>(beam, sample, det);
-}
-
-//! GISAS simulation with the rectangular detector perpendicular to the reflected beam when
-//! the coordinates of direct beam are known.
-
-std::unique_ptr<GISASSimulation>
-StdSimulations::RectDetectorPerpToReflectedBeamDpos(const MultiLayer& sample)
-{
-    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
-    RectangularDetector det(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
-    det.setPerpendicularToReflectedBeam(rdet_distance);
-    det.setDirectBeamPosition(rdet_width / 2., 1.0);
-    return std::make_unique<GISASSimulation>(beam, sample, det);
-}
-
-//! GISAS simulation with Monte-Carlo integration switched ON.
-
-std::unique_ptr<GISASSimulation> StdSimulations::MiniGISASMonteCarlo(const MultiLayer& sample)
-{
-    std::unique_ptr<GISASSimulation> result = MiniGISAS(sample);
-    result->options().setMonteCarloIntegration(true, 100);
-    return result;
-}
-
-//! GISAS simulation with spherical detector, region of interest and mask.
-
-std::unique_ptr<GISASSimulation> StdSimulations::SphericalDetWithRoi(const MultiLayer& sample)
-{
-    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
-    SphericalDetector det(40, -2 * deg, 2 * deg, 30, 0, 3 * deg);
-    std::unique_ptr<GISASSimulation> result = std::make_unique<GISASSimulation>(beam, sample, det);
-    result->addMask(Rectangle(-0.5 * deg, 0.3 * deg, -0.2 * deg, 0.6 * deg));
-    result->setRegionOfInterest(-1.5 * deg, 0.25 * deg, 1.5 * deg, 1.75 * deg);
-    return result;
-}
-
-//! GISAS simulation with rectangular detector, region of interest and mask.
-
-std::unique_ptr<GISASSimulation> StdSimulations::RectDetWithRoi(const MultiLayer& sample)
-{
-    std::unique_ptr<GISASSimulation> result = RectDetectorPerpToDirectBeam(sample);
-    result->addMask(Rectangle(3.0, 4.0, 5.0, 7.0));
-    result->setRegionOfInterest(2.0, 3.0, 18.0, 15.0);
-    return result;
-}
-
-//! GISAS simulation with an extra long wavelength
-
-std::unique_ptr<GISASSimulation> StdSimulations::ExtraLongWavelengthGISAS(const MultiLayer& sample)
-{
-    Beam beam(1e8, 13.52 * Units::nm, Direction(0.2 * deg, 0));
-    SphericalDetector det(100, -1 * deg, 1 * deg, 100, 0.0, 2 * deg);
-    auto simulation = std::make_unique<GISASSimulation>(beam, sample, det);
-    simulation->options().setIncludeSpecular(true);
-    return simulation;
-}
-
-//! ISimulation with fitting.
-//! Beam intensity set to provide reasonably large values in detector channels.
-std::unique_ptr<GISASSimulation> StdSimulations::MiniGISASFit(const MultiLayer& sample)
-{
-    auto result = std::make_unique<GISASSimulation>();
-    result->setSample(sample);
-    result->setDetectorParameters(25, -2 * deg, 2 * deg, 25, 0, 2 * deg);
-    result->setBeamParameters(1 * angstrom, 0.2 * deg, 0);
-    result->beam().setIntensity(1e6);
-    return result;
-}
diff --git a/Core/Examples/StandardSimulations.h b/Core/Examples/StandardSimulations.h
deleted file mode 100644
index 326ce7750cd..00000000000
--- a/Core/Examples/StandardSimulations.h
+++ /dev/null
@@ -1,59 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Core/Examples/StandardSimulations.h
-//! @brief     Defines namespace and functions for standard simulations.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifdef SWIG
-#error no need to expose this header to Swig
-#endif
-
-#ifndef USER_API
-#ifndef BORNAGAIN_CORE_EXAMPLES_STANDARDSIMULATIONS_H
-#define BORNAGAIN_CORE_EXAMPLES_STANDARDSIMULATIONS_H
-
-#include <memory>
-
-class GISASSimulation;
-class MultiLayer;
-
-//! Standard pre-defined simulations.
-
-namespace StdSimulations {
-
-// CoreSuite tests:
-std::unique_ptr<GISASSimulation> MiniGISAS(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> MiniGISAS_v2(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> MiniZPolarizedGISAS(const MultiLayer& sample,
-                                                     const std::string& polCase);
-std::unique_ptr<GISASSimulation> BasicGISAS(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> SpinflipGISAS(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> MiniGISASBeamDivergence(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> MiniGISASDetectorResolution(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> MiniGISASSpecularPeak(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> GISASWithMasks(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> MaxiGISAS(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> MaxiGISAS00(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> RectDetectorGeneric(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> RectDetectorPerpToSample(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> RectDetectorPerpToDirectBeam(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> RectDetectorPerpToReflectedBeam(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> RectDetectorPerpToReflectedBeamDpos(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> MiniGISASMonteCarlo(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> SphericalDetWithRoi(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> RectDetWithRoi(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> MiniGISASFit(const MultiLayer& sample);
-std::unique_ptr<GISASSimulation> ExtraLongWavelengthGISAS(const MultiLayer& sample);
-
-} // namespace StdSimulations
-
-#endif // BORNAGAIN_CORE_EXAMPLES_STANDARDSIMULATIONS_H
-#endif // USER_API
diff --git a/Tests/Functional/Core/Consistence/ConsistenceTests.cpp b/Tests/Functional/Core/Consistence/ConsistenceTests.cpp
index b49c1989dfe..2762da04d6c 100644
--- a/Tests/Functional/Core/Consistence/ConsistenceTests.cpp
+++ b/Tests/Functional/Core/Consistence/ConsistenceTests.cpp
@@ -15,7 +15,6 @@
 // These tests check whether pairs of reference data sets, generated by
 // some other tests, coincide within reasonable numeric error margins.
 
-#include "Core/Examples/StandardSimulations.h"
 #include "Core/Simulation/GISASSimulation.h"
 #include "Core/Simulation/SpecularSimulation.h"
 #include "Device/Data/OutputData.h"
@@ -58,7 +57,7 @@ TEST_F(Consistence, PolarizedQAngleReflectivity)
 TEST_F(Consistence, PolarizedScalarSpinFlip)
 {
     auto sample = PlainMultiLayerBySLDBuilder(10).buildSample();
-    auto simulation = StdTestSimulations::BasicYPolarizedSpecular(*sample, "PM", false);
+    auto simulation = test::makeSimulation::BasicYPolarizedSpecular(*sample, "PM", false);
     simulation->setSample(*sample);
     simulation->runSimulation();
     auto result = simulation->result().data();
@@ -69,7 +68,7 @@ TEST_F(Consistence, PolarizedScalarSpinFlip)
 TEST_F(Consistence, PolarizedScalarSpinFlipParticles)
 {
     auto sample = CylindersAndPrismsBuilder().buildSample();
-    auto simulation = StdSimulations::MiniZPolarizedGISAS(*sample, "PM");
+    auto simulation = test::makeSimulation::MiniZPolarizedGISAS(*sample, "PM");
     simulation->runSimulation();
     auto result = simulation->result().data();
     for (auto r : *result)
diff --git a/Tests/Functional/Core/Fitting/FitTests.cpp b/Tests/Functional/Core/Fitting/FitTests.cpp
index 991ffc8fb1d..72c3815b56c 100644
--- a/Tests/Functional/Core/Fitting/FitTests.cpp
+++ b/Tests/Functional/Core/Fitting/FitTests.cpp
@@ -13,7 +13,6 @@
 //  ************************************************************************************************
 
 #include "Base/Const/Units.h"
-#include "Core/Examples/StandardSimulations.h"
 #include "Core/Fitting/FitObjective.h"
 #include "Core/Simulation/GISASSimulation.h"
 #include "Core/Simulation/OffSpecularSimulation.h"
@@ -66,7 +65,7 @@ const auto build_Resonator = [](const mumufit::Parameters& params) -> MultiLayer
 
 const auto build_CylBA_MiniGISAS =
     [](const mumufit::Parameters& params) -> std::unique_ptr<ISimulation> {
-    return StdSimulations::MiniGISAS(*build_CylBA(params));
+    return test::makeSimulation::MiniGISAS(*build_CylBA(params));
 };
 
 const auto build_CylBA_Masked =
@@ -87,17 +86,17 @@ const auto build_CylBA_Masked =
 
 const auto build_AlternatingLayers_Specular =
     [](const mumufit::Parameters& params) -> std::unique_ptr<ISimulation> {
-    return StdTestSimulations::BasicSpecular(*build_AlternatingLayers(params), false);
+    return test::makeSimulation::BasicSpecular(*build_AlternatingLayers(params), false);
 };
 
 const auto build_AlternatingLayers_SpecularQ =
     [](const mumufit::Parameters& params) -> std::unique_ptr<ISimulation> {
-    return StdTestSimulations::BasicSpecular(*build_AlternatingLayers(params), true);
+    return test::makeSimulation::BasicSpecular(*build_AlternatingLayers(params), true);
 };
 
 const auto build_Resonator_Offspec =
     [](const mumufit::Parameters& params) -> std::unique_ptr<ISimulation> {
-    return StdTestSimulations::MiniOffSpecular(*build_Resonator(params));
+    return test::makeSimulation::MiniOffSpecular(*build_Resonator(params));
 };
 
 
diff --git a/Tests/Functional/ProStd/StdTestSimulations.cpp b/Tests/Functional/ProStd/StdTestSimulations.cpp
index cdd7d29044f..5e2b6b9a64d 100644
--- a/Tests/Functional/ProStd/StdTestSimulations.cpp
+++ b/Tests/Functional/ProStd/StdTestSimulations.cpp
@@ -64,11 +64,267 @@ const std::map<std::string, std::pair<R3, R3>> YPolarizationCases = {
 using Units::angstrom;
 using Units::deg;
 
+//  ************************************************************************************************
+//  GISAS simulations
+//  ************************************************************************************************
+
+//! GISAS simulation with small detector and phi[-2,2], theta[0,2].
+
+std::unique_ptr<GISASSimulation> test::makeSimulation::MiniGISAS(const MultiLayer& sample)
+{
+    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
+    SphericalDetector det(25, -2 * deg, 2 * deg, 25, 0, 2 * deg);
+    return std::make_unique<GISASSimulation>(beam, sample, det);
+}
+
+
+//! GISAS simulation with small detector and phi[-1,1], theta[0,1].
+
+std::unique_ptr<GISASSimulation> test::makeSimulation::MiniGISAS_v2(const MultiLayer& sample)
+{
+    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
+    SphericalDetector det(25, -1 * deg, 1 * deg, 25, 0, 1 * deg);
+    return std::make_unique<GISASSimulation>(beam, sample, det);
+}
+
+std::unique_ptr<GISASSimulation>
+test::makeSimulation::MiniZPolarizedGISAS(const MultiLayer& sample, const std::string& polCase)
+{
+    const auto zCase = ZPolarizationCases.at(polCase);
+    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
+    beam.setPolarization(zCase.first);
+    SphericalDetector det(25, -2 * deg, 2 * deg, 25, 0, 2 * deg);
+    det.setAnalyzer(zCase.second, 1., .5);
+    return std::make_unique<GISASSimulation>(beam, sample, det);
+}
+
+
+//! Basic GISAS simulation with the detector phi[0,2], theta[0,2].
+
+std::unique_ptr<GISASSimulation> test::makeSimulation::BasicGISAS(const MultiLayer& sample)
+{
+    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
+    SphericalDetector det(100, 0, 2 * deg, 100, 0, 2 * deg);
+    return std::make_unique<GISASSimulation>(beam, sample, det);
+}
+
+//! Basic GISAS simulation for spin flip channel.
+
+std::unique_ptr<GISASSimulation> test::makeSimulation::SpinflipGISAS(const MultiLayer& sample)
+{
+    std::unique_ptr<GISASSimulation> result = BasicGISAS(sample);
+    result->instrument().setPolFilters(zplus, zplus, -1.0, 0.5);
+    return result;
+}
+
+//! GISAS simulation with beam divergence applied.
+
+std::unique_ptr<GISASSimulation>
+test::makeSimulation::MiniGISASBeamDivergence(const MultiLayer& sample)
+{
+    std::unique_ptr<GISASSimulation> result = MiniGISAS(sample);
+
+    DistributionLogNormal wavelength_distr(1 * angstrom, 0.1);
+    DistributionGaussian alpha_distr(0.2 * deg, 0.02 * deg);
+    DistributionGate phi_distr(-0.1 * deg, 0.02 * deg);
+
+    result->addParameterDistribution(ParameterDistribution::BeamWavelength, wavelength_distr, 5);
+    result->addParameterDistribution(ParameterDistribution::BeamInclinationAngle, alpha_distr, 4);
+    result->addParameterDistribution(ParameterDistribution::BeamAzimuthalAngle, phi_distr, 3);
+
+    return result;
+}
+
+//! GISAS simulation with multiple masks on the detector plane.
+
+std::unique_ptr<GISASSimulation> test::makeSimulation::GISASWithMasks(const MultiLayer& sample)
+{
+    Beam beam(1e7, 1 * angstrom, Direction(0.2 * deg, 0));
+    SphericalDetector det(50, -1 * deg, 1 * deg, 50, 0, 2 * deg);
+    std::unique_ptr<GISASSimulation> result = std::make_unique<GISASSimulation>(beam, sample, det);
+
+    result->maskAll();
+    // pacman
+    result->addMask(Ellipse(0.0 * deg, 1.0 * deg, 0.5 * deg, 0.5 * deg), false);
+    result->addMask(Ellipse(0.11 * deg, 1.25 * deg, 0.05 * deg, 0.05 * deg), true);
+
+    std::vector<std::vector<double>> points = {{0.0 * deg, 1.0 * deg},
+                                               {0.5 * deg, 1.2 * deg},
+                                               {0.5 * deg, 0.8 * deg},
+                                               {0.0 * deg, 1.0 * deg}};
+    result->addMask(Polygon(points), true);
+
+    result->addMask(Rectangle(0.45 * deg, 0.95 * deg, 0.55 * deg, 1.05 * deg), false);
+    result->addMask(Rectangle(0.61 * deg, 0.95 * deg, 0.71 * deg, 1.05 * deg), false);
+    result->addMask(Rectangle(0.75 * deg, 0.95 * deg, 0.85 * deg, 1.05 * deg), false);
+
+    // more masks
+    result->addMask(Ellipse(-0.5 * deg, 1.5 * deg, 0.3 * deg, 0.1 * deg, 45. * deg), false);
+    result->addMask(VerticalLine(-0.6 * deg), true);
+    result->addMask(HorizontalLine(0.3 * deg), false);
+
+    return result;
+}
+
+//! GISAS simulation with detector resolution.
+
+std::unique_ptr<GISASSimulation>
+test::makeSimulation::MiniGISASDetectorResolution(const MultiLayer& sample)
+{
+    std::unique_ptr<GISASSimulation> result = MiniGISAS(sample);
+    ResolutionFunction2DGaussian resfunc(0.0025, 0.0025);
+    result->detector().setResolutionFunction(resfunc);
+    return result;
+}
+
+//! GISAS simulation with small detector and including specular peak.
+
+std::unique_ptr<GISASSimulation>
+test::makeSimulation::MiniGISASSpecularPeak(const MultiLayer& sample)
+{
+    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
+    SphericalDetector det(25, -2 * deg, 2 * deg, 25, 0, 2 * deg);
+    std::unique_ptr<GISASSimulation> result = std::make_unique<GISASSimulation>(beam, sample, det);
+    result->setBeamParameters(1 * angstrom, 0.2 * deg, 0);
+    result->options().setIncludeSpecular(true);
+    return result;
+}
+
+//! GISAS simulation with large detector to test performance.
+
+std::unique_ptr<GISASSimulation> test::makeSimulation::MaxiGISAS(const MultiLayer& sample)
+{
+    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
+    SphericalDetector det(256, -2 * deg, 2 * deg, 256, 0, 2 * deg);
+    return std::make_unique<GISASSimulation>(beam, sample, det);
+}
+
+//! Basic GISAS for polarization studies.
+
+std::unique_ptr<GISASSimulation> test::makeSimulation::MaxiGISAS00(const MultiLayer& sample)
+{
+    std::unique_ptr<GISASSimulation> result = MaxiGISAS(sample);
+    result->instrument().setPolFilters(zplus, zplus, 1.0, 0.5);
+    return result;
+}
+
+//! GISAS simulation with generic rectangular detector.
+
+std::unique_ptr<GISASSimulation> test::makeSimulation::RectDetectorGeneric(const MultiLayer& sample)
+{
+    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
+    RectangularDetector det(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
+    det.setPosition(R3(rdet_distance, 10.0, 5.0), rdet_width / 2., 1.0, R3(0.1, -1.0, 0.2));
+    return std::make_unique<GISASSimulation>(beam, sample, det);
+}
+
+//! GISAS simulation with the rectangular detector perpendicular to the sample.
+
+std::unique_ptr<GISASSimulation>
+test::makeSimulation::RectDetectorPerpToSample(const MultiLayer& sample)
+{
+    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
+    RectangularDetector det(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
+    det.setPerpendicularToSampleX(rdet_distance, rdet_width / 2., 1.0);
+    return std::make_unique<GISASSimulation>(beam, sample, det);
+}
+
+//! GISAS simulation with the rectangular detector perpendicular to the direct beam.
+
+std::unique_ptr<GISASSimulation>
+test::makeSimulation::RectDetectorPerpToDirectBeam(const MultiLayer& sample)
+{
+    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
+    RectangularDetector det(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
+    det.setPerpendicularToDirectBeam(rdet_distance, rdet_width / 2., 1.0);
+    return std::make_unique<GISASSimulation>(beam, sample, det);
+}
+
+//! GISAS simulation with the rectangular detector perpendicular to the reflected beam.
+
+std::unique_ptr<GISASSimulation>
+test::makeSimulation::RectDetectorPerpToReflectedBeam(const MultiLayer& sample)
+{
+    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
+    RectangularDetector det(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
+    det.setPerpendicularToReflectedBeam(rdet_distance, rdet_width / 2., 1.0);
+    return std::make_unique<GISASSimulation>(beam, sample, det);
+}
+
+//! GISAS simulation with the rectangular detector perpendicular to the reflected beam when
+//! the coordinates of direct beam are known.
+
+std::unique_ptr<GISASSimulation>
+test::makeSimulation::RectDetectorPerpToReflectedBeamDpos(const MultiLayer& sample)
+{
+    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
+    RectangularDetector det(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
+    det.setPerpendicularToReflectedBeam(rdet_distance);
+    det.setDirectBeamPosition(rdet_width / 2., 1.0);
+    return std::make_unique<GISASSimulation>(beam, sample, det);
+}
+
+//! GISAS simulation with Monte-Carlo integration switched ON.
+
+std::unique_ptr<GISASSimulation> test::makeSimulation::MiniGISASMonteCarlo(const MultiLayer& sample)
+{
+    std::unique_ptr<GISASSimulation> result = MiniGISAS(sample);
+    result->options().setMonteCarloIntegration(true, 100);
+    return result;
+}
+
+//! GISAS simulation with spherical detector, region of interest and mask.
+
+std::unique_ptr<GISASSimulation> test::makeSimulation::SphericalDetWithRoi(const MultiLayer& sample)
+{
+    Beam beam(1.0, 1 * angstrom, Direction(0.2 * deg, 0));
+    SphericalDetector det(40, -2 * deg, 2 * deg, 30, 0, 3 * deg);
+    std::unique_ptr<GISASSimulation> result = std::make_unique<GISASSimulation>(beam, sample, det);
+    result->addMask(Rectangle(-0.5 * deg, 0.3 * deg, -0.2 * deg, 0.6 * deg));
+    result->setRegionOfInterest(-1.5 * deg, 0.25 * deg, 1.5 * deg, 1.75 * deg);
+    return result;
+}
+
+//! GISAS simulation with rectangular detector, region of interest and mask.
+
+std::unique_ptr<GISASSimulation> test::makeSimulation::RectDetWithRoi(const MultiLayer& sample)
+{
+    std::unique_ptr<GISASSimulation> result = RectDetectorPerpToDirectBeam(sample);
+    result->addMask(Rectangle(3.0, 4.0, 5.0, 7.0));
+    result->setRegionOfInterest(2.0, 3.0, 18.0, 15.0);
+    return result;
+}
+
+//! GISAS simulation with an extra long wavelength
+
+std::unique_ptr<GISASSimulation>
+test::makeSimulation::ExtraLongWavelengthGISAS(const MultiLayer& sample)
+{
+    Beam beam(1e8, 13.52 * Units::nm, Direction(0.2 * deg, 0));
+    SphericalDetector det(100, -1 * deg, 1 * deg, 100, 0.0, 2 * deg);
+    auto simulation = std::make_unique<GISASSimulation>(beam, sample, det);
+    simulation->options().setIncludeSpecular(true);
+    return simulation;
+}
+
+//! ISimulation with fitting.
+//! Beam intensity set to provide reasonably large values in detector channels.
+std::unique_ptr<GISASSimulation> test::makeSimulation::MiniGISASFit(const MultiLayer& sample)
+{
+    auto result = std::make_unique<GISASSimulation>();
+    result->setSample(sample);
+    result->setDetectorParameters(25, -2 * deg, 2 * deg, 25, 0, 2 * deg);
+    result->setBeamParameters(1 * angstrom, 0.2 * deg, 0);
+    result->beam().setIntensity(1e6);
+    return result;
+}
+
 //  ************************************************************************************************
 //  off-specular simulations
 //  ************************************************************************************************
 
-std::unique_ptr<OffSpecularSimulation> StdTestSimulations::MiniOffSpecular(const MultiLayer& sample)
+std::unique_ptr<OffSpecularSimulation>
+test::makeSimulation::MiniOffSpecular(const MultiLayer& sample)
 {
     auto result = std::make_unique<OffSpecularSimulation>();
     result->setSample(sample);
@@ -99,8 +355,8 @@ std::unique_ptr<OffSpecularSimulation> StdTestSimulations::MiniOffSpecular(const
 //  specular simulations
 //  ************************************************************************************************
 
-std::unique_ptr<SpecularSimulation> StdTestSimulations::BasicSpecular(const MultiLayer& sample,
-                                                                      bool vsQ)
+std::unique_ptr<SpecularSimulation> test::makeSimulation::BasicSpecular(const MultiLayer& sample,
+                                                                        bool vsQ)
 {
     const double wavelength = 1.54 * angstrom;
     const int number_of_bins = 2000;
@@ -128,8 +384,8 @@ std::unique_ptr<SpecularSimulation> StdTestSimulations::BasicSpecular(const Mult
 }
 
 std::unique_ptr<SpecularSimulation>
-StdTestSimulations::BasicYPolarizedSpecular(const MultiLayer& sample, const std::string& polCase,
-                                            bool vsQ)
+test::makeSimulation::BasicYPolarizedSpecular(const MultiLayer& sample, const std::string& polCase,
+                                              bool vsQ)
 {
     const auto yCase = YPolarizationCases.at(polCase);
     auto simulation = BasicSpecular(sample, vsQ);
@@ -139,7 +395,7 @@ StdTestSimulations::BasicYPolarizedSpecular(const MultiLayer& sample, const std:
 }
 
 std::unique_ptr<SpecularSimulation>
-StdTestSimulations::SpecularWithGaussianBeam(const MultiLayer& sample)
+test::makeSimulation::SpecularWithGaussianBeam(const MultiLayer& sample)
 {
     const double wavelength = 1.54 * angstrom;
     const int number_of_bins = 2000;
@@ -156,7 +412,7 @@ StdTestSimulations::SpecularWithGaussianBeam(const MultiLayer& sample)
 }
 
 std::unique_ptr<SpecularSimulation>
-StdTestSimulations::SpecularWithSquareBeam(const MultiLayer& sample)
+test::makeSimulation::SpecularWithSquareBeam(const MultiLayer& sample)
 {
     const double wavelength = 1.54 * angstrom;
     const int number_of_bins = 2000;
@@ -173,7 +429,7 @@ StdTestSimulations::SpecularWithSquareBeam(const MultiLayer& sample)
 }
 
 std::unique_ptr<SpecularSimulation>
-StdTestSimulations::SpecularDivergentBeam(const MultiLayer& sample)
+test::makeSimulation::SpecularDivergentBeam(const MultiLayer& sample)
 {
     const double wavelength = 1.54 * angstrom;
     const int number_of_bins = 20;
@@ -202,7 +458,7 @@ StdTestSimulations::SpecularDivergentBeam(const MultiLayer& sample)
 }
 
 std::unique_ptr<SpecularSimulation>
-StdTestSimulations::TOFRWithRelativeResolution(const MultiLayer& sample)
+test::makeSimulation::TOFRWithRelativeResolution(const MultiLayer& sample)
 {
     FixedBinAxis qs("axis", 500, 0.0, 1.0);
     QzScan q_scan(qs);
@@ -216,7 +472,7 @@ StdTestSimulations::TOFRWithRelativeResolution(const MultiLayer& sample)
 }
 
 std::unique_ptr<SpecularSimulation>
-StdTestSimulations::TOFRWithPointwiseResolution(const MultiLayer& sample)
+test::makeSimulation::TOFRWithPointwiseResolution(const MultiLayer& sample)
 {
     FixedBinAxis qs("axis", 500, 0.0, 1.0);
     QzScan q_scan(qs);
@@ -239,7 +495,8 @@ StdTestSimulations::TOFRWithPointwiseResolution(const MultiLayer& sample)
 //  depth probe simulations
 //  ************************************************************************************************
 
-std::unique_ptr<DepthProbeSimulation> StdTestSimulations::BasicDepthProbe(const MultiLayer& sample)
+std::unique_ptr<DepthProbeSimulation>
+test::makeSimulation::BasicDepthProbe(const MultiLayer& sample)
 {
     auto result = std::make_unique<DepthProbeSimulation>();
 
diff --git a/Tests/Functional/ProStd/StdTestSimulations.h b/Tests/Functional/ProStd/StdTestSimulations.h
index c05da762f92..f1d5177cf3f 100644
--- a/Tests/Functional/ProStd/StdTestSimulations.h
+++ b/Tests/Functional/ProStd/StdTestSimulations.h
@@ -30,7 +30,30 @@ class MultiLayer;
 
 //! Simulations for standard tests.
 
-namespace StdTestSimulations {
+namespace test::makeSimulation {
+
+std::unique_ptr<GISASSimulation> MiniGISAS(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> MiniGISAS_v2(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> MiniZPolarizedGISAS(const MultiLayer& sample,
+                                                     const std::string& polCase);
+std::unique_ptr<GISASSimulation> BasicGISAS(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> SpinflipGISAS(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> MiniGISASBeamDivergence(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> MiniGISASDetectorResolution(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> MiniGISASSpecularPeak(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> GISASWithMasks(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> MaxiGISAS(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> MaxiGISAS00(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> RectDetectorGeneric(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> RectDetectorPerpToSample(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> RectDetectorPerpToDirectBeam(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> RectDetectorPerpToReflectedBeam(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> RectDetectorPerpToReflectedBeamDpos(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> MiniGISASMonteCarlo(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> SphericalDetWithRoi(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> RectDetWithRoi(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> MiniGISASFit(const MultiLayer& sample);
+std::unique_ptr<GISASSimulation> ExtraLongWavelengthGISAS(const MultiLayer& sample);
 
 std::unique_ptr<OffSpecularSimulation> MiniOffSpecular(const MultiLayer& sample);
 
@@ -45,7 +68,7 @@ std::unique_ptr<SpecularSimulation> TOFRWithPointwiseResolution(const MultiLayer
 
 std::unique_ptr<DepthProbeSimulation> BasicDepthProbe(const MultiLayer& sample);
 
-} // namespace StdTestSimulations
+} // namespace test::makeSimulations
 
 #endif // BORNAGAIN_TESTS_FUNCTIONAL_PROSTD_STDTESTSIMULATIONS_H
 #endif // USER_API
diff --git a/Tests/Functional/PyCore/utils.py b/Tests/Functional/PyCore/utils.py
index 3ec9b57a6b6..3f03dacc324 100644
--- a/Tests/Functional/PyCore/utils.py
+++ b/Tests/Functional/PyCore/utils.py
@@ -39,7 +39,7 @@ def get_reference_data(filename):
     return ba.IntensityDataIOFactory.readIntensityData(
         os.path.join(REFERENCE_DIR, filename))
 
-# TODO rather use StdSimulations::MiniGISAS
+# TODO rather use test::makeSimulation::MiniGISAS
 def get_simulation_MiniGISAS(sample):
     detector = ba.SphericalDetector(25, -2*deg, 2*deg, 25, 0, 2*deg)
     beam = ba.Beam(1., 1*angstrom, ba.Direction(0.2*deg, 0))
diff --git a/Tests/Functional/Std/StandardTests.h b/Tests/Functional/Std/StandardTests.h
index a3acefc52a2..5d658cb15a3 100644
--- a/Tests/Functional/Std/StandardTests.h
+++ b/Tests/Functional/Std/StandardTests.h
@@ -20,7 +20,6 @@
 #define BORNAGAIN_TESTS_FUNCTIONAL_STD_STANDARDTESTS_H
 
 #include "Core/Background/ConstantBackground.h"
-#include "Core/Examples/StandardSimulations.h"
 #include "Core/Simulation/DepthProbeSimulation.h"
 #include "Core/Simulation/GISASSimulation.h"
 #include "Core/Simulation/OffSpecularSimulation.h"
@@ -52,7 +51,7 @@ TEST_F(Std, FormFactors)
         ASSERT(ff);
         std::unique_ptr<const MultiLayer> sample(ParticleInVacuumBuilder().buildSampleWithFF(ff));
         ASSERT(sample);
-        auto sim = StdSimulations::MiniGISAS(*sample);
+        auto sim = test::makeSimulation::MiniGISAS(*sample);
         EXPECT_TRUE(run("FormFactors_" + ff->shapeName(), *sim, 2e-10));
     }
 }
@@ -60,28 +59,28 @@ TEST_F(Std, FormFactors)
 TEST_F(Std, GISASAbsorptiveSLDLayers)
 {
     std::unique_ptr<const MultiLayer> sample(LayersWithAbsorptionBySLDBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("GISASAbsorptiveSLDLayers", *sim, 2e-10));
 }
 
 TEST_F(Std, CylindersAndPrisms)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersAndPrismsBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("CylindersAndPrisms", *sim, 2e-10));
 }
 
 TEST_F(Std, RadialParaCrystal)
 {
     std::unique_ptr<const MultiLayer> sample(RadialParaCrystalBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("RadialParaCrystal", *sim, 2e-10));
 }
 
 TEST_F(Std, HardDisk)
 {
     std::unique_ptr<const MultiLayer> sample(HardDiskBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("HardDisk", *sim, 2e-10));
 }
 
@@ -94,7 +93,7 @@ TEST_F(Std, Basic2DParaCrystal)
         std::unique_ptr<const MultiLayer> sample(
             Basic2DParaCrystalBuilder().buildSampleWithFTDis(pdf2));
         ASSERT(sample);
-        auto sim = StdSimulations::MiniGISAS(*sample);
+        auto sim = test::makeSimulation::MiniGISAS(*sample);
         EXPECT_TRUE(run("Basic2DParaCrystal_" + pdf2->className(), *sim, 2e-10));
     }
 }
@@ -102,14 +101,14 @@ TEST_F(Std, Basic2DParaCrystal)
 TEST_F(Std, HexParaCrystal)
 {
     std::unique_ptr<const MultiLayer> sample(HexParaCrystalBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("HexParaCrystal", *sim, 2e-10));
 }
 
 TEST_F(Std, Lattice1D)
 {
     std::unique_ptr<const MultiLayer> sample(Lattice1DBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("Lattice1D", *sim, 2e-10));
 }
 
@@ -118,273 +117,273 @@ TEST_F(Std, RectParaCrystal)
     // TODO: investigate numeric integration, which has become problematic under Windows
     //       after moving code from Core/Tools to Base/Utils
     std::unique_ptr<const MultiLayer> sample(RectParaCrystalBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("RectParaCrystal", *sim, 1e-9));
 }
 
 TEST_F(Std, CoreShellParticle)
 {
     std::unique_ptr<const MultiLayer> sample(CoreShellParticleBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("CoreShellParticle", *sim, 2e-10));
 }
 
 TEST_F(Std, CoreShellBoxRotateZandY)
 {
     std::unique_ptr<const MultiLayer> sample(CoreShellBoxRotateZandYBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("CoreShellBoxRotateZandY", *sim, 2e-10));
 }
 
 TEST_F(Std, MultiLayerWithRoughness)
 {
     std::unique_ptr<const MultiLayer> sample(MultiLayerWithRoughnessBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("MultiLayerWithRoughness", *sim, 2e-10));
 }
 
 TEST_F(Std, SquareLattice2D)
 {
     std::unique_ptr<const MultiLayer> sample(SquareLattice2DBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("SquareLattice2D", *sim, 2e-10));
 }
 
 TEST_F(Std, CenteredSquareLattice2D)
 {
     std::unique_ptr<const MultiLayer> sample(CenteredSquareLattice2DBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("CenteredSquareLattice2D", *sim, 2e-10));
 }
 
 TEST_F(Std, RotatedSquareLattice2D)
 {
     std::unique_ptr<const MultiLayer> sample(RotatedSquareLattice2DBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("RotatedSquareLattice2D", *sim, 2e-10));
 }
 
 TEST_F(Std, FiniteSquareLattice2D)
 {
     std::unique_ptr<const MultiLayer> sample(FiniteSquareLattice2DBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("FiniteSquareLattice2D", *sim, 2e-10));
 }
 
 TEST_F(Std, RotatedPyramids)
 {
     std::unique_ptr<const MultiLayer> sample(RotatedPyramidsBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("RotatedPyramids", *sim, 2e-10));
 }
 
 TEST_F(Std, ThickAbsorptiveSampleWithRoughness)
 {
     std::unique_ptr<const MultiLayer> sample(ThickAbsorptiveSampleBuilder().buildSample());
-    auto sim = StdSimulations::ExtraLongWavelengthGISAS(*sample);
+    auto sim = test::makeSimulation::ExtraLongWavelengthGISAS(*sample);
     EXPECT_TRUE(run("ThickAbsorptiveSampleWithRoughness", *sim, 2e-10));
 }
 
 TEST_F(Std, ParticleComposition)
 {
     std::unique_ptr<const MultiLayer> sample(ParticleCompositionBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("ParticleComposition", *sim, 2e-10));
 }
 
 TEST_F(Std, BoxCompositionRotateX)
 {
     std::unique_ptr<const MultiLayer> sample(BoxCompositionRotateXBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("BoxCompositionRotateX", *sim, 2e-10));
 }
 
 TEST_F(Std, BoxCompositionRotateY)
 {
     std::unique_ptr<const MultiLayer> sample(BoxCompositionRotateYBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("BoxCompositionRotateY", *sim, 2e-10));
 }
 
 TEST_F(Std, BoxCompositionRotateZ)
 {
     std::unique_ptr<const MultiLayer> sample(BoxCompositionRotateZBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("BoxCompositionRotateZ", *sim, 2e-10));
 }
 
 TEST_F(Std, BoxCompositionRotateZandY)
 {
     std::unique_ptr<const MultiLayer> sample(BoxCompositionRotateZandYBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("BoxCompositionRotateZandY", *sim, 2e-10));
 }
 
 TEST_F(Std, BoxStackComposition)
 {
     std::unique_ptr<const MultiLayer> sample(BoxStackCompositionBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("BoxStackComposition", *sim, 2e-10));
 }
 
 DISTRIBUTION_TEST_F(Std, CylindersWithSizeDistribution)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersWithSizeDistributionBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("CylindersWithSizeDistribution", *sim, 2e-10));
 }
 
 DISTRIBUTION_TEST_F(Std, TwoTypesCylindersDistribution)
 {
     std::unique_ptr<const MultiLayer> sample(TwoTypesCylindersDistributionBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("TwoTypesCylindersDistribution", *sim, 2e-10));
 }
 
 DISTRIBUTION_TEST_F(Std, RotatedPyramidsDistribution)
 {
     std::unique_ptr<const MultiLayer> sample(RotatedPyramidsDistributionBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("RotatedPyramidsDistribution", *sim, 2e-10));
 }
 
 DISTRIBUTION_TEST_F(Std, SpheresWithLimitsDistribution)
 {
     std::unique_ptr<const MultiLayer> sample(SpheresWithLimitsDistributionBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("SpheresWithLimitsDistribution", *sim, 2e-10));
 }
 
 DISTRIBUTION_TEST_F(Std, ConesWithLimitsDistribution)
 {
     std::unique_ptr<const MultiLayer> sample(ConesWithLimitsDistributionBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("ConesWithLimitsDistribution", *sim, 2e-10));
 }
 
 DISTRIBUTION_TEST_F(Std, LinkedBoxDistribution)
 {
     std::unique_ptr<const MultiLayer> sample(LinkedBoxDistributionBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("LinkedBoxDistribution", *sim, 2e-10));
 }
 
 TEST_F(Std, MultipleLayout)
 {
     std::unique_ptr<const MultiLayer> sample(MultipleLayoutBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("MultipleLayout", *sim, 2e-10));
 }
 
 TEST_F(Std, ApproximationDA)
 {
     std::unique_ptr<const MultiLayer> sample(SizeDistributionDAModelBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("ApproximationDA", *sim, 2e-10));
 }
 
 TEST_F(Std, ApproximationLMA)
 {
     std::unique_ptr<const MultiLayer> sample(SizeDistributionLMAModelBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("ApproximationLMA", *sim, 2e-10));
 }
 
 TEST_F(Std, ApproximationSSCA)
 {
     std::unique_ptr<const MultiLayer> sample(SizeDistributionSSCAModelBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("ApproximationSSCA", *sim, 2e-10));
 }
 
 DISTRIBUTION_TEST_F(Std, CylindersInSSCA)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersInSSCABuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("CylindersInSSCA", *sim, 2e-10));
 }
 
 TEST_F(Std, CosineRipple)
 {
     std::unique_ptr<const MultiLayer> sample(CosineRippleBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("CosineRipple", *sim, 2e-10));
 }
 
 TEST_F(Std, TriangularRipple)
 {
     std::unique_ptr<const MultiLayer> sample(TriangularRippleBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("TriangularRipple", *sim, 2e-10));
 }
 
 TEST_F(Std, AsymRipple)
 {
     std::unique_ptr<const MultiLayer> sample(AsymRippleBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("AsymRipple", *sim, 2e-10));
 }
 
 TEST_F(Std, MesoCrystal)
 {
     std::unique_ptr<const MultiLayer> sample(MesoCrystalBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("MesoCrystal", *sim, 2e-10));
 }
 
 TEST_F(Std, CustomMorphology)
 {
     std::unique_ptr<const MultiLayer> sample(CustomMorphologyBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("CustomMorphology", *sim, 2e-10));
 }
 
 TEST_F(Std, TransformBox)
 {
     std::unique_ptr<const MultiLayer> sample(TransformBoxBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("TransformBox", *sim, 1e-10));
 }
 
 TEST_F(Std, MagneticParticleZeroField)
 {
     std::unique_ptr<const MultiLayer> sample(MagneticParticleZeroFieldBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("MagneticParticleZeroField", *sim, 2e-10));
 }
 
 TEST_F(Std, RotatedCylinder)
 {
     std::unique_ptr<const MultiLayer> sample(RotatedCylindersBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("RotatedCylinder", *sim, 1e-10));
 }
 
 TEST_F(Std, SlicedComposition)
 {
     std::unique_ptr<const MultiLayer> sample(SlicedCompositionBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("SlicedComposition", *sim, 1e-10));
 }
 
 TEST_F(Std, MagneticSubstrateZeroField)
 {
     std::unique_ptr<const MultiLayer> sample(MagneticSubstrateZeroFieldBuilder().buildSample());
-    auto sim = StdSimulations::MiniZPolarizedGISAS(*sample, "PP");
+    auto sim = test::makeSimulation::MiniZPolarizedGISAS(*sample, "PP");
     EXPECT_TRUE(run("MagneticSubstrateZeroField", *sim, 2e-10));
 }
 
 TEST_F(Std, MagneticRotation)
 {
     std::unique_ptr<const MultiLayer> sample(MagneticRotationBuilder().buildSample());
-    auto sim = StdSimulations::MiniZPolarizedGISAS(*sample, "PM");
+    auto sim = test::makeSimulation::MiniZPolarizedGISAS(*sample, "PM");
     EXPECT_TRUE(run("MagneticRotationZPM", *sim, 2e-10));
 }
 
 TEST_F(Std, MagneticSpheres)
 {
     std::unique_ptr<const MultiLayer> sample(MagneticSpheresBuilder().buildSample());
-    auto sim = StdSimulations::MiniZPolarizedGISAS(*sample, "PM");
+    auto sim = test::makeSimulation::MiniZPolarizedGISAS(*sample, "PM");
     EXPECT_TRUE(run("MagneticSpheres", *sim, 2e-10));
 }
 
@@ -392,7 +391,7 @@ TEST_F(Std, MagneticCylinders)
 {
     for (const std::string& polCase : {"PP", "MP", "PM", "MM"}) {
         std::unique_ptr<const MultiLayer> sample(MagneticCylindersBuilder().buildSample());
-        auto sim = StdSimulations::MiniZPolarizedGISAS(*sample, polCase);
+        auto sim = test::makeSimulation::MiniZPolarizedGISAS(*sample, polCase);
         EXPECT_TRUE(run("MagneticCylinders" + polCase, *sim, 2e-10));
     }
 }
@@ -401,7 +400,7 @@ TEST_F(Std, MagneticSpheresInMagLayer)
 {
     for (const std::string& polCase : {"PP", "MP"}) {
         std::unique_ptr<const MultiLayer> sample(MagneticLayerBuilder().buildSample());
-        auto sim = StdSimulations::MiniZPolarizedGISAS(*sample, polCase);
+        auto sim = test::makeSimulation::MiniZPolarizedGISAS(*sample, polCase);
         EXPECT_TRUE(run("MagneticSpheresInMagLayer" + polCase, *sim, 2e-10));
     }
 }
@@ -409,91 +408,91 @@ TEST_F(Std, MagneticSpheresInMagLayer)
 TEST_F(Std, BeamDivergence)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersInBABuilder().buildSample());
-    auto sim = StdSimulations::MiniGISASBeamDivergence(*sample);
+    auto sim = test::makeSimulation::MiniGISASBeamDivergence(*sample);
     EXPECT_TRUE(run("BeamDivergence", *sim, 2e-10));
 }
 
 TEST_F(Std, DetectorResolution)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersInBABuilder().buildSample());
-    auto sim = StdSimulations::MiniGISASDetectorResolution(*sample);
+    auto sim = test::makeSimulation::MiniGISASDetectorResolution(*sample);
     EXPECT_TRUE(run("DetectorResolution", *sim, 2e-10));
 }
 
 TEST_F(Std, SimulationWithMasks)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersAndPrismsBuilder().buildSample());
-    auto sim = StdSimulations::GISASWithMasks(*sample);
+    auto sim = test::makeSimulation::GISASWithMasks(*sample);
     EXPECT_TRUE(run("SimulationWithMasks", *sim, 1e-10));
 }
 
 TEST_F(Std, RectDetectorGeneric)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersInBABuilder().buildSample());
-    auto sim = StdSimulations::RectDetectorGeneric(*sample);
+    auto sim = test::makeSimulation::RectDetectorGeneric(*sample);
     EXPECT_TRUE(run("RectDetectorGeneric", *sim, 1e-10));
 }
 
 TEST_F(Std, RectDetectorPerpToSample)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersInBABuilder().buildSample());
-    auto sim = StdSimulations::RectDetectorPerpToSample(*sample);
+    auto sim = test::makeSimulation::RectDetectorPerpToSample(*sample);
     EXPECT_TRUE(run("RectDetectorPerpToSample", *sim, 1e-10));
 }
 
 TEST_F(Std, RectDetectorPerpToDirectBeam)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersInBABuilder().buildSample());
-    auto sim = StdSimulations::RectDetectorPerpToDirectBeam(*sample);
+    auto sim = test::makeSimulation::RectDetectorPerpToDirectBeam(*sample);
     EXPECT_TRUE(run("RectDetectorPerpToDirectBeam", *sim, 1e-10));
 }
 
 TEST_F(Std, RectDetectorPerpToReflectedBeam)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersInBABuilder().buildSample());
-    auto sim = StdSimulations::RectDetectorPerpToReflectedBeam(*sample);
+    auto sim = test::makeSimulation::RectDetectorPerpToReflectedBeam(*sample);
     EXPECT_TRUE(run("RectDetectorPerpToReflectedBeam", *sim, 1e-10));
 }
 
 TEST_F(Std, RectDetectorPerpToReflectedBeamDpos)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersInBABuilder().buildSample());
-    auto sim = StdSimulations::RectDetectorPerpToReflectedBeamDpos(*sample);
+    auto sim = test::makeSimulation::RectDetectorPerpToReflectedBeamDpos(*sample);
     EXPECT_TRUE(run("RectDetectorPerpToReflectedBeamDpos", *sim, 1e-10));
 }
 
 TEST_F(Std, LargeCylindersMonteCarlo)
 {
     std::unique_ptr<const MultiLayer> sample(LargeCylindersInDWBABuilder().buildSample());
-    auto sim = StdSimulations::MiniGISASMonteCarlo(*sample);
+    auto sim = test::makeSimulation::MiniGISASMonteCarlo(*sample);
     EXPECT_TRUE(run("LargeCylindersMonteCarlo", *sim, 5e-1));
 }
 
 TEST_F(Std, SphericalDetWithRoi)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersAndPrismsBuilder().buildSample());
-    auto sim = StdSimulations::SphericalDetWithRoi(*sample);
+    auto sim = test::makeSimulation::SphericalDetWithRoi(*sample);
     EXPECT_TRUE(run("SphericalDetWithRoi", *sim, 1e-10));
 }
 
 TEST_F(Std, RectDetWithRoi)
 {
     std::unique_ptr<const MultiLayer> sample(CylindersAndPrismsBuilder().buildSample());
-    auto sim = StdSimulations::RectDetWithRoi(*sample);
+    auto sim = test::makeSimulation::RectDetWithRoi(*sample);
     EXPECT_TRUE(run("RectDetWithRoi", *sim, 1e-10));
 }
 
 TEST_F(Std, BoxesWithSpecular)
 {
     std::unique_ptr<const MultiLayer> sample(BoxesSquareLattice2DBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISASSpecularPeak(*sample);
+    auto sim = test::makeSimulation::MiniGISASSpecularPeak(*sample);
     EXPECT_TRUE(run("BoxesWithSpecular", *sim, 1e-10));
 }
 
 TEST_F(Std, ConstantBackground)
 {
     auto sample = CylindersInBABuilder().buildSample();
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     sim->setBackground(ConstantBackground(1e3));
     EXPECT_TRUE(run("ConstantBackground", *sim, 1e-10));
 }
@@ -501,42 +500,42 @@ TEST_F(Std, ConstantBackground)
 TEST_F(Std, HomogeneousTiNiSample)
 {
     auto sample = HomogeneousMultilayerBuilder().buildSample();
-    auto sim = StdTestSimulations::BasicSpecular(*sample, false);
+    auto sim = test::makeSimulation::BasicSpecular(*sample, false);
     EXPECT_TRUE(run("HomogeneousTiNiSample", *sim, 1e-10));
 }
 
 TEST_F(Std, HomogeneousTiNiSampleWithAbsorption)
 {
     auto sample = PlainMultiLayerBySLDBuilder().buildSample();
-    auto sim = StdTestSimulations::BasicSpecular(*sample, false);
+    auto sim = test::makeSimulation::BasicSpecular(*sample, false);
     EXPECT_TRUE(run("HomogeneousTiNiSampleWithAbsorption", *sim, 1e-10));
 }
 
 TEST_F(Std, RoughnessInSpecular)
 {
     auto sample = MultiLayerWithRoughnessBuilder().buildSample();
-    auto sim = StdTestSimulations::BasicSpecular(*sample, false);
+    auto sim = test::makeSimulation::BasicSpecular(*sample, false);
     EXPECT_TRUE(run("RoughnessInSpecular", *sim, 2e-9));
 }
 
 TEST_F(Std, GaussianBeamFootprint)
 {
     auto sample = HomogeneousMultilayerBuilder().buildSample();
-    auto sim = StdTestSimulations::SpecularWithGaussianBeam(*sample);
+    auto sim = test::makeSimulation::SpecularWithGaussianBeam(*sample);
     EXPECT_TRUE(run("GaussianBeamFootprint", *sim, 1e-10));
 }
 
 TEST_F(Std, SquareBeamFootprint)
 {
     auto sample = HomogeneousMultilayerBuilder().buildSample();
-    auto sim = StdTestSimulations::SpecularWithSquareBeam(*sample);
+    auto sim = test::makeSimulation::SpecularWithSquareBeam(*sample);
     EXPECT_TRUE(run("SquareBeamFootprint", *sim, 1e-10));
 }
 
 TEST_F(Std, SpecularDivergentBeam)
 {
     auto sample = HomogeneousMultilayerBuilder().buildSample();
-    auto sim = StdTestSimulations::SpecularDivergentBeam(*sample);
+    auto sim = test::makeSimulation::SpecularDivergentBeam(*sample);
     EXPECT_TRUE(run("SpecularDivergentBeam", *sim, 1e-10));
 }
 
@@ -549,7 +548,7 @@ TEST_F(Std, SpecularDivergentBeam)
 TEST_F(Std, RelativeResolutionTOF)
 {
     auto sample = PlainMultiLayerBySLDBuilder().buildSample();
-    auto sim = StdTestSimulations::TOFRWithRelativeResolution(*sample);
+    auto sim = test::makeSimulation::TOFRWithRelativeResolution(*sample);
     EXPECT_TRUE(run("RelativeResolutionTOF", *sim, 1e-10));
 }
 
@@ -564,7 +563,7 @@ TEST_F(Std, RelativeResolutionTOF)
 TEST_F(Std, OffSpecularResonator)
 {
     auto sample = ResonatorBuilder().buildSample();
-    auto sim = StdTestSimulations::MiniOffSpecular(*sample);
+    auto sim = test::makeSimulation::MiniOffSpecular(*sample);
     EXPECT_TRUE(run("OffSpecularResonator", *sim, 1e-10));
 }
 
@@ -576,7 +575,7 @@ TEST_F(Std, FormFactorsWithAbsorption)
         std::unique_ptr<const MultiLayer> sample(
             LayersWithAbsorptionBuilder().buildSampleWithFF(ff));
         ASSERT(sample);
-        auto sim = StdSimulations::MiniGISAS_v2(*sample);
+        auto sim = test::makeSimulation::MiniGISAS_v2(*sample);
         EXPECT_TRUE(run("FormFactorsWithAbsorption_" + ff->shapeName(), *sim, 2e-10));
     }
 }
@@ -592,14 +591,14 @@ TEST_F(Std, FormFactorsWithAbsorption)
 TEST_F(Std, NCRoughnessInSpecular)
 {
     auto sample = MultiLayerWithNCRoughnessBuilder().buildSample();
-    auto sim = StdTestSimulations::BasicSpecular(*sample, false);
+    auto sim = test::makeSimulation::BasicSpecular(*sample, false);
     EXPECT_TRUE(run("NCRoughnessInSpecular", *sim, 2e-9));
 }
 
 TEST_F(Std, SuperLattice)
 {
     std::unique_ptr<const MultiLayer> sample(SuperLatticeBuilder().buildSample());
-    auto sim = StdSimulations::MiniGISAS(*sample);
+    auto sim = test::makeSimulation::MiniGISAS(*sample);
     EXPECT_TRUE(run("SuperLattice", *sim, 2e-10));
 }
 
@@ -607,16 +606,16 @@ TEST_F(Std, SpecularWithSlicing1)
 {
     // data almost fully agree with SpecularWithSlicing2, as verified by ConsistenceTest
     auto sample = SlicedCylindersBuilder().buildSample();
-    auto sim = StdTestSimulations::BasicSpecular(*sample, false);
+    auto sim = test::makeSimulation::BasicSpecular(*sample, false);
     EXPECT_TRUE(run("SpecularWithSlicing1", *sim, 1e-10));
 }
 
 TEST_F(Std, SpecularWithSlicing2)
 {
     auto sample = SLDSlicedCylindersBuilder().buildSample();
-    auto sim = StdTestSimulations::BasicSpecular(*sample, false);
+    auto sim = test::makeSimulation::BasicSpecular(*sample, false);
     EXPECT_TRUE(run("SpecularWithSlicing2", *sim, 1e-10));
-    auto simQ = StdTestSimulations::BasicSpecular(*sample, true);
+    auto simQ = test::makeSimulation::BasicSpecular(*sample, true);
     EXPECT_TRUE(run("SpecularWithSlicing2Q", *simQ, 1e-10));
 }
 
@@ -624,25 +623,25 @@ TEST_F(Std, SpecularWithSlicing3)
 {
     // data fully agree with SpecularWithSlicing2, as verified by ConsistenceTest
     auto sample = AveragedSlicedCylindersBuilder().buildSample();
-    auto sim = StdTestSimulations::BasicSpecular(*sample, false);
+    auto sim = test::makeSimulation::BasicSpecular(*sample, false);
     EXPECT_TRUE(run("SpecularWithSlicing3", *sim, 1e-10));
 }
 
 TEST_F(Std, InstrumentDefinitionComparison)
 {
     auto sample = PlainMultiLayerBySLDBuilder().buildSample();
-    auto sim = StdTestSimulations::BasicSpecular(*sample, false);
+    auto sim = test::makeSimulation::BasicSpecular(*sample, false);
     EXPECT_TRUE(run("InstrumentDefinitionComparison_0", *sim, 1e-10));
-    auto simQ = StdTestSimulations::BasicSpecular(*sample, true);
+    auto simQ = test::makeSimulation::BasicSpecular(*sample, true);
     EXPECT_TRUE(run("InstrumentDefinitionComparison_Q", *simQ, 1e-10));
 }
 
 TEST_F(Std, TOFResolutionComparison)
 {
     auto sample = PlainMultiLayerBySLDBuilder().buildSample();
-    auto sim1 = StdTestSimulations::TOFRWithRelativeResolution(*sample);
+    auto sim1 = test::makeSimulation::TOFRWithRelativeResolution(*sample);
     EXPECT_TRUE(run("TOFResolutionComparison_TR", *sim1, 1e-10));
-    auto sim2 = StdTestSimulations::TOFRWithPointwiseResolution(*sample);
+    auto sim2 = test::makeSimulation::TOFRWithPointwiseResolution(*sample);
     EXPECT_TRUE(run("TOFResolutionComparison_TP", *sim2, 1e-10));
 }
 
@@ -650,7 +649,7 @@ TEST_F(Std, BasicSpecular)
 {
     std::unique_ptr<const MultiLayer> sample(SimpleMagneticLayerBuilder().buildSample());
     for (const std::string& polCase : {"PP", "MM"}) {
-        auto sim = StdTestSimulations::BasicYPolarizedSpecular(*sample, polCase, false);
+        auto sim = test::makeSimulation::BasicYPolarizedSpecular(*sample, polCase, false);
         EXPECT_TRUE(run("BasicSpecular" + polCase, *sim, 1e-10));
     }
 }
@@ -659,7 +658,7 @@ TEST_F(Std, PolarizedQAngleReflectivity)
 {
     std::unique_ptr<const MultiLayer> sample(SimpleMagneticLayerBuilder().buildSample());
     for (const std::string& polKey : {"PP", "MM"}) {
-        auto sim = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, true);
+        auto sim = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
         EXPECT_TRUE(run("PolarizedQAngleReflectivity" + polKey + "_Q", *sim, 1e-10));
     }
 }
@@ -670,7 +669,7 @@ TEST_F(Std, MagneticRotationReflectivity)
         std::unique_ptr<const MultiLayer> sample(
             SimpleMagneticRotationBuilder().buildSampleWithRoughness(roughnessKey));
         for (const std::string& polKey : {"PP", "PM", "MP", "MM"}) {
-            auto sim = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, false);
+            auto sim = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
             EXPECT_TRUE(
                 run("MagneticRotationReflectivity" + polKey + "_" + roughnessKey, *sim, 1e-10));
         }
@@ -681,9 +680,9 @@ TEST_F(Std, PolarizedFeNiBilayer)
 {
     std::unique_ptr<const MultiLayer> sample(FeNiBilayerBuilder().buildSample());
     for (const std::string& polKey : {"PP", "MM"}) {
-        auto sim1 = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, false);
+        auto sim1 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
         EXPECT_TRUE(run("PolarizedFeNiBilayer" + polKey, *sim1, 1e-7));
-        auto sim2 = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, true);
+        auto sim2 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
         EXPECT_TRUE(run("PolarizedFeNiBilayer" + polKey + "_Q", *sim2, 1e-7));
     }
 }
@@ -692,9 +691,9 @@ TEST_F(Std, PolarizedFeNiBilayerTanh)
 {
     std::unique_ptr<const MultiLayer> sample(FeNiBilayerTanhBuilder().buildSample());
     for (const std::string& polKey : {"PP", "MM"}) {
-        auto sim1 = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, false);
+        auto sim1 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
         EXPECT_TRUE(run("PolarizedFeNiBilayerTanh" + polKey, *sim1, 1e-7));
-        auto sim2 = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, true);
+        auto sim2 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
         EXPECT_TRUE(run("PolarizedFeNiBilayerTanh" + polKey + "_Q", *sim2, 1e-7));
     }
 }
@@ -703,9 +702,9 @@ TEST_F(Std, PolarizedFeNiBilayerNC)
 {
     std::unique_ptr<const MultiLayer> sample(FeNiBilayerNCBuilder().buildSample());
     for (const std::string& polKey : {"PP", "MM"}) {
-        auto sim1 = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, false);
+        auto sim1 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
         EXPECT_TRUE(run("PolarizedFeNiBilayerNC" + polKey, *sim1, 1e-7));
-        auto sim2 = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, true);
+        auto sim2 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
         EXPECT_TRUE(run("PolarizedFeNiBilayerNC" + polKey + "_Q", *sim2, 1e-7));
     }
 }
@@ -714,9 +713,9 @@ TEST_F(Std, PolarizedFeNiBilayerSpinFlip)
 {
     std::unique_ptr<const MultiLayer> sample(FeNiBilayerSpinFlipBuilder().buildSample());
     for (const std::string& polKey : {"PP", "PM", "MP", "MM"}) {
-        auto sim1 = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, false);
+        auto sim1 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
         EXPECT_TRUE(run("PolarizedFeNiBilayerSpinFlip" + polKey, *sim1, 1e-7));
-        auto sim2 = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, true);
+        auto sim2 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
         EXPECT_TRUE(run("PolarizedFeNiBilayerSpinFlip" + polKey + "_Q", *sim2, 1e-7));
     }
 }
@@ -725,9 +724,9 @@ TEST_F(Std, PolarizedFeNiBilayerSpinFlipTanh)
 {
     std::unique_ptr<const MultiLayer> sample(FeNiBilayerSpinFlipTanhBuilder().buildSample());
     for (const std::string& polKey : {"PP", "PM", "MP", "MM"}) {
-        auto sim1 = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, false);
+        auto sim1 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
         EXPECT_TRUE(run("PolarizedFeNiBilayerSpinFlipTanh" + polKey, *sim1, 1e-7));
-        auto sim2 = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, true);
+        auto sim2 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
         EXPECT_TRUE(run("PolarizedFeNiBilayerSpinFlipTanh" + polKey + "_Q", *sim2, 1e-7));
     }
 }
@@ -736,9 +735,9 @@ TEST_F(Std, PolarizedFeNiBilayerSpinFlipNC)
 {
     std::unique_ptr<const MultiLayer> sample(FeNiBilayerSpinFlipNCBuilder().buildSample());
     for (const std::string& polKey : {"PP", "PM", "MP", "MM"}) {
-        auto sim1 = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, false);
+        auto sim1 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, false);
         EXPECT_TRUE(run("PolarizedFeNiBilayerSpinFlipNC" + polKey, *sim1, 1e-7));
-        auto sim2 = StdTestSimulations::BasicYPolarizedSpecular(*sample, polKey, true);
+        auto sim2 = test::makeSimulation::BasicYPolarizedSpecular(*sample, polKey, true);
         EXPECT_TRUE(run("PolarizedFeNiBilayerSpinFlipNC" + polKey + "_Q", *sim2, 1e-7));
     }
 }
@@ -746,7 +745,7 @@ TEST_F(Std, PolarizedFeNiBilayerSpinFlipNC)
 TEST_F(Std, DepthProbeTest)
 {
     auto sample = HomogeneousMultilayerBuilder().buildSample();
-    auto sim = StdTestSimulations::BasicDepthProbe(*sample);
+    auto sim = test::makeSimulation::BasicDepthProbe(*sample);
     EXPECT_TRUE(run("DepthProbeTest", *sim, 1e-10));
 }
 
diff --git a/Tests/Performance/Core/Multilayer.cpp b/Tests/Performance/Core/Multilayer.cpp
index 43b4cd4028e..b5f38c94ce4 100644
--- a/Tests/Performance/Core/Multilayer.cpp
+++ b/Tests/Performance/Core/Multilayer.cpp
@@ -45,7 +45,7 @@ int main()
         const auto start_time = now();
         std::unique_ptr<MultiLayer> sample(PlainMultiLayerBySLDBuilder(layer_mult).buildSample());
         std::unique_ptr<SpecularSimulation> simulation(
-            StdTestSimulations::BasicSpecular(*sample, false));
+            test::makeSimulation::BasicSpecular(*sample, false));
 
         simulation->runSimulation();
 
-- 
GitLab