From 6d2002aaa5b3d1253f9bb9ef3c5e57fb30b42554 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Mon, 2 Nov 2020 18:15:18 +0100
Subject: [PATCH] init_iff -> c'tor

---
 Core/Computation/ComputationStatus.h          |  6 ++-
 Core/Computation/DWBAComputation.cpp          |  2 +-
 .../Computation/ParticleLayoutComputation.cpp | 34 +++++++++-------
 Core/Computation/ParticleLayoutComputation.h  |  4 +-
 Device/Unit/IUnitConverter.h                  |  4 +-
 .../DecouplingApproximationStrategy.cpp       |  7 ++--
 .../DecouplingApproximationStrategy.h         |  4 +-
 .../IInterferenceFunctionStrategy.cpp         | 19 +++------
 .../IInterferenceFunctionStrategy.h           | 11 ++----
 .../Interference/SSCApproximationStrategy.cpp | 12 +++---
 .../Interference/SSCApproximationStrategy.h   |  5 ++-
 auto/Wrap/doxygenCore.i                       | 39 +++++++------------
 auto/Wrap/doxygenSample.i                     | 11 ++----
 13 files changed, 71 insertions(+), 87 deletions(-)

diff --git a/Core/Computation/ComputationStatus.h b/Core/Computation/ComputationStatus.h
index b92a5eb533c..fa2e3423281 100644
--- a/Core/Computation/ComputationStatus.h
+++ b/Core/Computation/ComputationStatus.h
@@ -30,7 +30,11 @@ public:
 
     void setRunning() { m_status = RUNNING; }
     void setCompleted() { m_status = COMPLETED; }
-    void setFailed(const std::string& message) { m_error_message = message; m_status = FAILED; }
+    void setFailed(const std::string& message)
+    {
+        m_error_message = message;
+        m_status = FAILED;
+    }
 
 private:
     enum ESimulationStatus { IDLE, RUNNING, COMPLETED, FAILED };
diff --git a/Core/Computation/DWBAComputation.cpp b/Core/Computation/DWBAComputation.cpp
index a7e4c1e40ce..ae638a405be 100644
--- a/Core/Computation/DWBAComputation.cpp
+++ b/Core/Computation/DWBAComputation.cpp
@@ -38,7 +38,7 @@ DWBAComputation::DWBAComputation(const MultiLayer& multilayer, const SimulationO
     bool polarized = m_processed_sample->containsMagneticMaterial();
     for (const ProcessedLayout& layout : m_processed_sample->layouts()) {
         m_single_computation.addLayoutComputation(
-            new ParticleLayoutComputation(&layout, m_sim_options, polarized));
+            new ParticleLayoutComputation(layout, m_sim_options, polarized));
     }
     // scattering from rough surfaces in DWBA
     if (m_processed_sample->hasRoughness())
diff --git a/Core/Computation/ParticleLayoutComputation.cpp b/Core/Computation/ParticleLayoutComputation.cpp
index b47d612fbcb..91d52810cfd 100644
--- a/Core/Computation/ParticleLayoutComputation.cpp
+++ b/Core/Computation/ParticleLayoutComputation.cpp
@@ -21,40 +21,44 @@
 #include "Sample/Interference/IInterferenceFunctionStrategy.h"
 #include "Sample/Interference/SSCApproximationStrategy.h"
 
-namespace {
+namespace
+{
 
-std::unique_ptr<IInterferenceFunctionStrategy> processedInterferenceFunction(
-    const ProcessedLayout* layout, const SimulationOptions& sim_params, bool polarized)
+std::unique_ptr<IInterferenceFunctionStrategy>
+processedInterferenceFunction(const ProcessedLayout& layout, const SimulationOptions& sim_params,
+                              bool polarized)
 {
-    const IInterferenceFunction* p_iff = layout->interferenceFunction();
-    if (p_iff && layout->numberOfSlices() > 1 && !p_iff->supportsMultilayer())
+    const IInterferenceFunction* p_iff = layout.interferenceFunction();
+    if (p_iff && layout.numberOfSlices() > 1 && !p_iff->supportsMultilayer())
         throw std::runtime_error("LayoutStrategyBuilder::checkInterferenceFunction: "
                                  "interference function does not support multiple layers");
 
     auto p_radial_para = dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(p_iff);
 
+    const std::vector<FormFactorCoherentSum>& weighted_formfactors = layout.formFactorList();
+
     std::unique_ptr<IInterferenceFunctionStrategy> result;
 
     if (p_radial_para && p_radial_para->kappa() > 0.0) {
         double kappa = p_radial_para->kappa();
-        result = std::make_unique<SSCApproximationStrategy>(sim_params, kappa, polarized);
+        result = std::make_unique<SSCApproximationStrategy>(weighted_formfactors, p_iff, sim_params,
+                                                            polarized, kappa);
     } else {
-        result = std::make_unique<DecouplingApproximationStrategy>(sim_params, polarized);
+        result = std::make_unique<DecouplingApproximationStrategy>(weighted_formfactors, p_iff,
+                                                                   sim_params, polarized);
     }
     if (!result)
         throw Exceptions::ClassInitializationException("Could not create appropriate result");
-    result->init(layout->formFactorList(), p_iff);
     return result;
 }
 
 } // namespace
 
-ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout* layout,
+ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout& layout,
                                                      const SimulationOptions& options,
                                                      bool polarized)
-    : m_layout(layout)
-    , m_region_map(layout->regionMap())
-    , m_interference_function_strategy(processedInterferenceFunction(layout, options, polarized))
+    : m_layout(layout), m_region_map(layout.regionMap()),
+      m_interference_function_strategy(processedInterferenceFunction(layout, options, polarized))
 {
 }
 
@@ -63,12 +67,12 @@ ParticleLayoutComputation::~ParticleLayoutComputation() = default;
 void ParticleLayoutComputation::compute(SimulationElement& elem) const
 {
     const double alpha_f = elem.getAlphaMean();
-    const size_t n_layers = m_layout->numberOfSlices();
+    const size_t n_layers = m_layout.numberOfSlices();
     if (n_layers > 1 && alpha_f < 0)
         return; // zero for transmission with multilayers (n>1) # TODO: support transmission GISAS
 
-    elem.addIntensity(m_interference_function_strategy->evaluate(elem) *
-                      m_layout->surfaceDensity());
+    elem.addIntensity(m_interference_function_strategy->evaluate(elem)
+                      * m_layout.surfaceDensity());
 }
 
 void ParticleLayoutComputation::mergeRegionMap(
diff --git a/Core/Computation/ParticleLayoutComputation.h b/Core/Computation/ParticleLayoutComputation.h
index c7114bde059..5c98591d429 100644
--- a/Core/Computation/ParticleLayoutComputation.h
+++ b/Core/Computation/ParticleLayoutComputation.h
@@ -32,7 +32,7 @@ class SimulationOptions;
 class ParticleLayoutComputation final
 {
 public:
-    ParticleLayoutComputation(const ProcessedLayout* p_layout, const SimulationOptions& options,
+    ParticleLayoutComputation(const ProcessedLayout& layout, const SimulationOptions& options,
                               bool polarized);
     ~ParticleLayoutComputation();
 
@@ -42,7 +42,7 @@ public:
     void mergeRegionMap(std::map<size_t, std::vector<HomogeneousRegion>>& region_map) const;
 
 private:
-    const ProcessedLayout* m_layout;
+    const ProcessedLayout& m_layout;
     const std::map<size_t, std::vector<HomogeneousRegion>> m_region_map;
     std::unique_ptr<const IInterferenceFunctionStrategy> m_interference_function_strategy;
 };
diff --git a/Device/Unit/IUnitConverter.h b/Device/Unit/IUnitConverter.h
index e16f1fe5c05..29ddc1f61ab 100644
--- a/Device/Unit/IUnitConverter.h
+++ b/Device/Unit/IUnitConverter.h
@@ -36,8 +36,8 @@ public:
 
 const std::map<Axes::Units, const char*> axisUnitLabel = {
     {Axes::Units::DEFAULT, "undefined"}, {Axes::Units::NBINS, "bin"}, {Axes::Units::RADIANS, "rad"},
-    {Axes::Units::DEGREES, "deg"},     {Axes::Units::MM, "mm"},     {Axes::Units::QSPACE, "1/nm"},
-    {Axes::Units::QXQY, "1/nm"},       {Axes::Units::RQ4, "nm^-4?"}};
+    {Axes::Units::DEGREES, "deg"},       {Axes::Units::MM, "mm"},     {Axes::Units::QSPACE, "1/nm"},
+    {Axes::Units::QXQY, "1/nm"},         {Axes::Units::RQ4, "nm^-4?"}};
 
 //! Interface to provide axis translations to different units for simulation output
 //! @ingroup simulation_internal
diff --git a/Sample/Interference/DecouplingApproximationStrategy.cpp b/Sample/Interference/DecouplingApproximationStrategy.cpp
index 8b9b7ea07d6..9af74b45a1a 100644
--- a/Sample/Interference/DecouplingApproximationStrategy.cpp
+++ b/Sample/Interference/DecouplingApproximationStrategy.cpp
@@ -24,9 +24,10 @@
 using InterferenceFunctionUtils::PrecomputePolarizedFormFactors;
 using InterferenceFunctionUtils::PrecomputeScalarFormFactors;
 
-DecouplingApproximationStrategy::DecouplingApproximationStrategy(SimulationOptions sim_params,
-                                                                 bool polarized)
-    : IInterferenceFunctionStrategy(sim_params, polarized)
+DecouplingApproximationStrategy::DecouplingApproximationStrategy(
+    const std::vector<FormFactorCoherentSum>& weighted_formfactors,
+    const IInterferenceFunction* p_iff, SimulationOptions sim_params, bool polarized)
+    : IInterferenceFunctionStrategy(weighted_formfactors, p_iff, sim_params, polarized)
 {
 }
 
diff --git a/Sample/Interference/DecouplingApproximationStrategy.h b/Sample/Interference/DecouplingApproximationStrategy.h
index fc731275655..4bb91db9aee 100644
--- a/Sample/Interference/DecouplingApproximationStrategy.h
+++ b/Sample/Interference/DecouplingApproximationStrategy.h
@@ -26,7 +26,9 @@ class SimulationElement;
 class DecouplingApproximationStrategy final : public IInterferenceFunctionStrategy
 {
 public:
-    DecouplingApproximationStrategy(SimulationOptions sim_params, bool polarized);
+    DecouplingApproximationStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors,
+                                    const IInterferenceFunction* p_iff,
+                                    SimulationOptions sim_params, bool polarized);
 
 private:
     double scalarCalculation(const SimulationElement& sim_element) const override;
diff --git a/Sample/Interference/IInterferenceFunctionStrategy.cpp b/Sample/Interference/IInterferenceFunctionStrategy.cpp
index cb4a6a9ddfa..89cc44c9af0 100644
--- a/Sample/Interference/IInterferenceFunctionStrategy.cpp
+++ b/Sample/Interference/IInterferenceFunctionStrategy.cpp
@@ -19,19 +19,12 @@
 #include "Sample/Aggregate/InterferenceFunctionNone.h"
 #include "Sample/Fresnel/FormFactorCoherentSum.h"
 
-IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const SimulationOptions& sim_params,
-                                                             bool polarized)
+IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(
+    const std::vector<FormFactorCoherentSum>& weighted_formfactors,
+    const IInterferenceFunction* p_iff, const SimulationOptions& sim_params, bool polarized)
     : m_iff(nullptr), m_options(sim_params), m_polarized(polarized),
       m_integrator(
           make_integrator_miser(this, &IInterferenceFunctionStrategy::evaluate_for_fixed_angles, 2))
-{
-}
-
-IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy() = default;
-
-void IInterferenceFunctionStrategy::init(
-    const std::vector<FormFactorCoherentSum>& weighted_formfactors,
-    const IInterferenceFunction* p_iff)
 {
     if (weighted_formfactors.empty())
         throw Exceptions::ClassInitializationException(
@@ -41,10 +34,10 @@ void IInterferenceFunctionStrategy::init(
         m_iff.reset(p_iff->clone());
     else
         m_iff.reset(new InterferenceFunctionNone());
-
-    strategy_specific_post_init();
 }
 
+IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy() = default;
+
 double IInterferenceFunctionStrategy::evaluate(const SimulationElement& sim_element) const
 {
     if (m_options.isIntegrate() && (sim_element.getSolidAngle() > 0.0))
@@ -82,5 +75,3 @@ double IInterferenceFunctionStrategy::evaluate_for_fixed_angles(double* fraction
     SimulationElement sim_element = pars->pointElement(par0, par1);
     return pars->getIntegrationFactor(par0, par1) * evaluateSinglePoint(sim_element);
 }
-
-void IInterferenceFunctionStrategy::strategy_specific_post_init() {}
diff --git a/Sample/Interference/IInterferenceFunctionStrategy.h b/Sample/Interference/IInterferenceFunctionStrategy.h
index ba0a541a81c..842d41a8014 100644
--- a/Sample/Interference/IInterferenceFunctionStrategy.h
+++ b/Sample/Interference/IInterferenceFunctionStrategy.h
@@ -41,26 +41,23 @@ class SimulationElement;
 class IInterferenceFunctionStrategy
 {
 public:
-    IInterferenceFunctionStrategy(const SimulationOptions& sim_params, bool polarized);
+    IInterferenceFunctionStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors,
+                                  const IInterferenceFunction* p_iff,
+                                  const SimulationOptions& sim_params, bool polarized);
     virtual ~IInterferenceFunctionStrategy();
 
-    //! Initializes the object with form factors and an interference function
-    void init(const std::vector<FormFactorCoherentSum>& weighted_formfactors,
-              const IInterferenceFunction* p_iff);
-
     //! Calculates the intensity for scalar particles/interactions
     double evaluate(const SimulationElement& sim_element) const;
 
 protected:
     std::vector<FormFactorCoherentSum> m_formfactor_wrappers;
     std::unique_ptr<IInterferenceFunction> m_iff;
-    SimulationOptions m_options;
+    const SimulationOptions m_options;
 
 private:
     double evaluateSinglePoint(const SimulationElement& sim_element) const;
     double MCIntegratedEvaluate(const SimulationElement& sim_element) const;
     double evaluate_for_fixed_angles(double* fractions, size_t dim, void* params) const;
-    virtual void strategy_specific_post_init();
     //! Evaluates the intensity in the scalar case
     virtual double scalarCalculation(const SimulationElement& sim_element) const = 0;
     //! Evaluates the intensity in the polarized case
diff --git a/Sample/Interference/SSCApproximationStrategy.cpp b/Sample/Interference/SSCApproximationStrategy.cpp
index 6040bbfff23..c30565cf5b7 100644
--- a/Sample/Interference/SSCApproximationStrategy.cpp
+++ b/Sample/Interference/SSCApproximationStrategy.cpp
@@ -20,13 +20,11 @@
 using InterferenceFunctionUtils::PrecomputePolarizedFormFactors;
 using InterferenceFunctionUtils::PrecomputeScalarFormFactors;
 
-SSCApproximationStrategy::SSCApproximationStrategy(SimulationOptions sim_params, double kappa,
-                                                   bool polarized)
-    : IInterferenceFunctionStrategy(sim_params, polarized), m_helper(kappa)
-{
-}
-
-void SSCApproximationStrategy::strategy_specific_post_init()
+SSCApproximationStrategy::SSCApproximationStrategy(
+    const std::vector<FormFactorCoherentSum>& weighted_formfactors,
+    const IInterferenceFunction* p_iff, SimulationOptions sim_params, bool polarized, double kappa)
+    : IInterferenceFunctionStrategy(weighted_formfactors, p_iff, sim_params, polarized),
+      m_helper(kappa)
 {
     m_helper.init(m_formfactor_wrappers);
 }
diff --git a/Sample/Interference/SSCApproximationStrategy.h b/Sample/Interference/SSCApproximationStrategy.h
index a40fca106e1..0d4df12d676 100644
--- a/Sample/Interference/SSCApproximationStrategy.h
+++ b/Sample/Interference/SSCApproximationStrategy.h
@@ -26,10 +26,11 @@ class SimulationElement;
 class SSCApproximationStrategy final : public IInterferenceFunctionStrategy
 {
 public:
-    SSCApproximationStrategy(SimulationOptions sim_params, double kappa, bool polarized);
+    SSCApproximationStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors,
+                             const IInterferenceFunction* p_iff, SimulationOptions sim_params,
+                             bool polarized, double kappa);
 
 private:
-    void strategy_specific_post_init() override;
     double scalarCalculation(const SimulationElement& sim_element) const override;
     double polarizedCalculation(const SimulationElement& sim_element) const override;
     SSCAHelper m_helper;
diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i
index a4115d39bc1..5cbdf2f4163 100644
--- a/auto/Wrap/doxygenCore.i
+++ b/auto/Wrap/doxygenCore.i
@@ -1241,7 +1241,7 @@ Computes the scattering contribution from one particle layout. Used by  DWBAComp
 C++ includes: ParticleLayoutComputation.h
 ";
 
-%feature("docstring")  ParticleLayoutComputation::ParticleLayoutComputation "ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout *p_layout, const SimulationOptions &options, bool polarized)
+%feature("docstring")  ParticleLayoutComputation::ParticleLayoutComputation "ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout &layout, const SimulationOptions &options, bool polarized)
 ";
 
 %feature("docstring")  ParticleLayoutComputation::~ParticleLayoutComputation "ParticleLayoutComputation::~ParticleLayoutComputation()
@@ -2483,7 +2483,10 @@ Returns default units to convert to.
 ";
 
 
-// File: namespace_0d100.xml
+// File: namespace_0d23.xml
+
+
+// File: namespace_0d27.xml
 
 
 // File: namespace_0d29.xml
@@ -2492,43 +2495,43 @@ Returns default units to convert to.
 // File: namespace_0d31.xml
 
 
-// File: namespace_0d33.xml
+// File: namespace_0d35.xml
 
 
-// File: namespace_0d37.xml
+// File: namespace_0d39.xml
 
 
-// File: namespace_0d41.xml
+// File: namespace_0d43.xml
 
 
-// File: namespace_0d45.xml
+// File: namespace_0d51.xml
 
 
-// File: namespace_0d53.xml
+// File: namespace_0d56.xml
 
 
-// File: namespace_0d58.xml
+// File: namespace_0d65.xml
 
 
 // File: namespace_0d67.xml
 
 
-// File: namespace_0d69.xml
+// File: namespace_0d71.xml
 
 
 // File: namespace_0d73.xml
 
 
-// File: namespace_0d75.xml
+// File: namespace_0d80.xml
 
 
 // File: namespace_0d82.xml
 
 
-// File: namespace_0d84.xml
+// File: namespace_0d90.xml
 
 
-// File: namespace_0d92.xml
+// File: namespace_0d96.xml
 
 
 // File: namespace_0d98.xml
@@ -2867,18 +2870,6 @@ Helper factory function to use in  GISASSimulation. Depending on the type of det
 // File: IComputation_8h.xml
 
 
-// File: LayoutStrategyBuilder_8cpp.xml
-%feature("docstring")  processedIInterferenceFunctionStrategy "IInterferenceFunctionStrategy* processedIInterferenceFunctionStrategy(const ProcessedLayout *layout, const SimulationOptions &sim_params, bool polarized)
-";
-
-
-// File: LayoutStrategyBuilder_8h.xml
-%feature("docstring")  processedInterferenceFunction "IInterferenceFunctionStrategy* processedInterferenceFunction(const ProcessedLayout *layout, const SimulationOptions &sim_params, bool polarized)
-
-Provides a IInterferenceFunctionStrategy for a  ParticleLayoutComputation. 
-";
-
-
 // File: MultiLayerFuncs_8cpp.xml
 %feature("docstring")  MaterialProfile "std::vector<complex_t> MaterialProfile(const MultiLayer &multilayer, int n_points, double z_min, double z_max)
 
diff --git a/auto/Wrap/doxygenSample.i b/auto/Wrap/doxygenSample.i
index c58b712e4cb..d05ebb308f1 100644
--- a/auto/Wrap/doxygenSample.i
+++ b/auto/Wrap/doxygenSample.i
@@ -437,7 +437,7 @@ Strategy class to compute the total scattering from a particle layout in the dec
 C++ includes: DecouplingApproximationStrategy.h
 ";
 
-%feature("docstring")  DecouplingApproximationStrategy::DecouplingApproximationStrategy "DecouplingApproximationStrategy::DecouplingApproximationStrategy(SimulationOptions sim_params, bool polarized)
+%feature("docstring")  DecouplingApproximationStrategy::DecouplingApproximationStrategy "DecouplingApproximationStrategy::DecouplingApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, SimulationOptions sim_params, bool polarized)
 ";
 
 
@@ -3627,17 +3627,12 @@ Instantiation of child classes takes place in LayoutStrategyBuilder::createStrat
 C++ includes: IInterferenceFunctionStrategy.h
 ";
 
-%feature("docstring")  IInterferenceFunctionStrategy::IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const SimulationOptions &sim_params, bool polarized)
+%feature("docstring")  IInterferenceFunctionStrategy::IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, const SimulationOptions &sim_params, bool polarized)
 ";
 
 %feature("docstring")  IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy()
 ";
 
-%feature("docstring")  IInterferenceFunctionStrategy::init "void IInterferenceFunctionStrategy::init(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff)
-
-Initializes the object with form factors and an interference function. 
-";
-
 %feature("docstring")  IInterferenceFunctionStrategy::evaluate "double IInterferenceFunctionStrategy::evaluate(const SimulationElement &sim_element) const
 
 Calculates the intensity for scalar particles/interactions. 
@@ -7574,7 +7569,7 @@ Strategy class to compute the total scattering from a particle layout in the siz
 C++ includes: SSCApproximationStrategy.h
 ";
 
-%feature("docstring")  SSCApproximationStrategy::SSCApproximationStrategy "SSCApproximationStrategy::SSCApproximationStrategy(SimulationOptions sim_params, double kappa, bool polarized)
+%feature("docstring")  SSCApproximationStrategy::SSCApproximationStrategy "SSCApproximationStrategy::SSCApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, SimulationOptions sim_params, bool polarized, double kappa)
 ";
 
 
-- 
GitLab