From 001dc6853404cb99e74363e1af49f8dd7842389e Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Mon, 12 Jul 2021 15:15:02 +0200
Subject: [PATCH] don't duplicate Sample properties in ProcessedSample

---
 Core/Term/RoughMultiLayerContribution.cpp | 20 ++++++++++----------
 Core/Term/RoughMultiLayerContribution.h   |  4 ++--
 Resample/Processed/ProcessedSample.cpp    | 20 ++++----------------
 Resample/Processed/ProcessedSample.h      |  7 -------
 auto/Wrap/doxygenCore.i                   |  2 +-
 auto/Wrap/doxygenResample.i               |  9 ---------
 6 files changed, 17 insertions(+), 45 deletions(-)

diff --git a/Core/Term/RoughMultiLayerContribution.cpp b/Core/Term/RoughMultiLayerContribution.cpp
index 67b9878874f..e1e8d7513b3 100644
--- a/Core/Term/RoughMultiLayerContribution.cpp
+++ b/Core/Term/RoughMultiLayerContribution.cpp
@@ -41,8 +41,8 @@ complex_t h_min(complex_t z)
 }
 } // namespace
 
-RoughMultiLayerContribution::RoughMultiLayerContribution(const ProcessedSample* p_sample)
-    : m_sample{p_sample}
+RoughMultiLayerContribution::RoughMultiLayerContribution(const ProcessedSample* re_sample)
+    : m_re_sample{re_sample}
 {
 }
 
@@ -50,7 +50,7 @@ void RoughMultiLayerContribution::compute(DiffuseElement& ele) const
 {
     if (ele.getAlphaMean() < 0.0)
         return;
-    const size_t n_slices = m_sample->numberOfSlices();
+    const size_t n_slices = m_re_sample->numberOfSlices();
     kvector_t q = ele.meanQ();
     double wavelength = ele.wavelength();
     double autocorr(0.0);
@@ -64,17 +64,17 @@ void RoughMultiLayerContribution::compute(DiffuseElement& ele) const
         sterm[i] = get_sum8terms(i, ele);
     }
     for (size_t i = 0; i + 1 < n_slices; i++) {
-        const LayerRoughness* rough = m_sample->avgeSlice(i + 1).topRoughness();
+        const LayerRoughness* rough = m_re_sample->avgeSlice(i + 1).topRoughness();
         if (rough)
             autocorr += std::norm(rterm[i]) * std::norm(sterm[i]) * rough->getSpectralFun(q);
     }
     // cross correlation between layers
-    if (m_sample->crossCorrelationLength() != 0.0) {
+    if (m_re_sample->sample().crossCorrLength() != 0.0) {
         for (size_t j = 0; j < n_slices - 1; j++) {
             for (size_t k = 0; k < n_slices - 1; k++) {
                 if (j == k)
                     continue;
-                crosscorr += rterm[j] * sterm[j] * m_sample->crossCorrSpectralFun(q, j, k)
+                crosscorr += rterm[j] * sterm[j] * m_re_sample->crossCorrSpectralFun(q, j, k)
                              * std::conj(rterm[k]) * std::conj(sterm[k]);
             }
         }
@@ -85,15 +85,15 @@ void RoughMultiLayerContribution::compute(DiffuseElement& ele) const
 
 complex_t RoughMultiLayerContribution::get_refractive_term(size_t ilayer, double wavelength) const
 {
-    const SliceStack& slices = m_sample->slices();
+    const SliceStack& slices = m_re_sample->slices();
     return slices[ilayer].material().refractiveIndex2(wavelength)
            - slices[ilayer + 1].material().refractiveIndex2(wavelength);
 }
 
 complex_t RoughMultiLayerContribution::get_sum8terms(size_t ilayer, const DiffuseElement& ele) const
 {
-    const SliceStack& slices = m_sample->slices();
-    auto p_fresnel_map = m_sample->fresnelMap();
+    const SliceStack& slices = m_re_sample->slices();
+    auto p_fresnel_map = m_re_sample->fresnelMap();
     const auto P_in_plus = p_fresnel_map->getInFlux(ele.getKi(), ilayer);
     const auto P_out_plus = p_fresnel_map->getOutFlux(ele.getMeanKf(), ilayer);
 
@@ -120,7 +120,7 @@ complex_t RoughMultiLayerContribution::get_sum8terms(size_t ilayer, const Diffus
     const complex_t qz4_minus = -qz1_minus;
 
     double sigma(0.0);
-    if (const LayerRoughness* roughness = m_sample->avgeSlice(ilayer + 1).topRoughness())
+    if (const LayerRoughness* roughness = m_re_sample->avgeSlice(ilayer + 1).topRoughness())
         sigma = roughness->getSigma();
     const complex_t term1 = T_in_plus * T_out_plus * h_plus(qz1_plus * sigma);
     const complex_t term2 = T_in_plus * R_out_plus * h_plus(qz2_plus * sigma);
diff --git a/Core/Term/RoughMultiLayerContribution.h b/Core/Term/RoughMultiLayerContribution.h
index 4f566e62260..f7123ffc397 100644
--- a/Core/Term/RoughMultiLayerContribution.h
+++ b/Core/Term/RoughMultiLayerContribution.h
@@ -30,12 +30,12 @@ class DiffuseElement;
 
 class RoughMultiLayerContribution final {
 public:
-    RoughMultiLayerContribution(const ProcessedSample* p_sample);
+    RoughMultiLayerContribution(const ProcessedSample* re_sample);
 
     void compute(DiffuseElement& ele) const;
 
 private:
-    const ProcessedSample* m_sample;
+    const ProcessedSample* m_re_sample;
 
     complex_t get_refractive_term(size_t ilayer, double wavelength) const;
     complex_t get_sum8terms(size_t ilayer, const DiffuseElement& sim_element) const;
diff --git a/Resample/Processed/ProcessedSample.cpp b/Resample/Processed/ProcessedSample.cpp
index 3f84200678c..a2d5e90c76b 100644
--- a/Resample/Processed/ProcessedSample.cpp
+++ b/Resample/Processed/ProcessedSample.cpp
@@ -227,10 +227,7 @@ std::unique_ptr<IFresnelMap> fresnelify(const MultiLayer& sample, const SliceSta
 ProcessedSample::ProcessedSample(const MultiLayer& sample, const SimulationOptions& options,
                                  bool forcePolarized)
     : m_sample(sample)
-    , m_roughness_model(sample.roughnessModel())
     , m_polarized{forcePolarized || sample.isMagnetic()}
-    , m_crossCorrLength{sample.crossCorrLength()}
-    , m_ext_field{sample.externalField()}
     , m_slices{slicify(sample, options).setBField(sample.externalField())}
     , m_layouts{collectLayouts(sample, m_slices, m_polarized)}
     , m_fresnel_map{fresnelify(sample, m_slices, m_layouts, options)}
@@ -269,16 +266,6 @@ const IFresnelMap* ProcessedSample::fresnelMap() const
     return m_fresnel_map.get();
 }
 
-double ProcessedSample::crossCorrelationLength() const
-{
-    return m_crossCorrLength;
-}
-
-const kvector_t& ProcessedSample::externalField() const
-{
-    return m_ext_field;
-}
-
 double ProcessedSample::sliceTopZ(size_t i) const
 {
     return m_slices.at(i).zTop();
@@ -296,7 +283,7 @@ bool ProcessedSample::containsMagneticMaterial() const
 
 bool ProcessedSample::polarizing() const
 {
-    return containsMagneticMaterial() || externalField() != kvector_t{};
+    return containsMagneticMaterial() || m_sample.externalField() != kvector_t{};
 }
 
 bool ProcessedSample::hasRoughness() const
@@ -309,7 +296,8 @@ bool ProcessedSample::hasRoughness() const
 
 double ProcessedSample::crossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const
 {
-    if (m_crossCorrLength <= 0.0)
+    const double xCorrLength = m_sample.crossCorrLength();
+    if ( xCorrLength<= 0.0)
         return 0.0;
     const double z_j = sliceBottomZ(j);
     const double z_k = sliceBottomZ(k);
@@ -324,5 +312,5 @@ double ProcessedSample::crossCorrSpectralFun(const kvector_t kvec, size_t j, siz
     return 0.5
            * ((sigma_k / sigma_j) * rough_j->getSpectralFun(kvec)
               + (sigma_j / sigma_k) * rough_k->getSpectralFun(kvec))
-           * std::exp(-1 * std::abs(z_j - z_k) / m_crossCorrLength);
+           * std::exp(-1 * std::abs(z_j - z_k) / xCorrLength);
 }
diff --git a/Resample/Processed/ProcessedSample.h b/Resample/Processed/ProcessedSample.h
index 1cca988663d..99883470095 100644
--- a/Resample/Processed/ProcessedSample.h
+++ b/Resample/Processed/ProcessedSample.h
@@ -22,7 +22,6 @@
 
 #include "Base/Vector/Vectors3D.h"
 #include "Resample/Slice/SliceStack.h"
-#include "Sample/Multilayer/RoughnessModels.h"
 #include <memory>
 #include <vector>
 
@@ -49,14 +48,11 @@ public:
     const Slice& avgeSlice(size_t i) const;
     const std::vector<ProcessedLayout>& layouts() const;
     const IFresnelMap* fresnelMap() const;
-    double crossCorrelationLength() const;
-    const kvector_t& externalField() const;
     double sliceTopZ(size_t i) const;
     double sliceBottomZ(size_t i) const;
     bool containsMagneticMaterial() const;
     bool polarizing() const; //!< Contains magnetic material, or nonzero magnetic field
     bool hasRoughness() const;
-    const RoughnessModel& roughnessModel() const { return m_roughness_model; }
     const MultiLayer& sample() const { return m_sample; }
 
     //! Fourier transform of the correlation function of roughnesses between the interfaces
@@ -64,10 +60,7 @@ public:
 
 private:
     const MultiLayer& m_sample;
-    const RoughnessModel m_roughness_model;
     const bool m_polarized;
-    const double m_crossCorrLength;
-    const kvector_t m_ext_field;
     const SliceStack m_slices;
     const std::vector<ProcessedLayout> m_layouts;
     const std::unique_ptr<const IFresnelMap> m_fresnel_map;
diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i
index a36e2f73cf5..152aecce61b 100644
--- a/auto/Wrap/doxygenCore.i
+++ b/auto/Wrap/doxygenCore.i
@@ -1842,7 +1842,7 @@ Computes the diffuse reflection from the rough interfaces of a multilayer. Used
 C++ includes: RoughMultiLayerContribution.h
 ";
 
-%feature("docstring")  RoughMultiLayerContribution::RoughMultiLayerContribution "RoughMultiLayerContribution::RoughMultiLayerContribution(const ProcessedSample *p_sample)
+%feature("docstring")  RoughMultiLayerContribution::RoughMultiLayerContribution "RoughMultiLayerContribution::RoughMultiLayerContribution(const ProcessedSample *re_sample)
 ";
 
 %feature("docstring")  RoughMultiLayerContribution::compute "void RoughMultiLayerContribution::compute(DiffuseElement &ele) const
diff --git a/auto/Wrap/doxygenResample.i b/auto/Wrap/doxygenResample.i
index e6a82ab322a..f72bb0610a7 100644
--- a/auto/Wrap/doxygenResample.i
+++ b/auto/Wrap/doxygenResample.i
@@ -507,12 +507,6 @@ C++ includes: ProcessedSample.h
 %feature("docstring")  ProcessedSample::fresnelMap "const IFresnelMap * ProcessedSample::fresnelMap() const
 ";
 
-%feature("docstring")  ProcessedSample::crossCorrelationLength "double ProcessedSample::crossCorrelationLength() const
-";
-
-%feature("docstring")  ProcessedSample::externalField "const kvector_t & ProcessedSample::externalField() const
-";
-
 %feature("docstring")  ProcessedSample::sliceTopZ "double ProcessedSample::sliceTopZ(size_t i) const
 ";
 
@@ -530,9 +524,6 @@ Contains magnetic material, or nonzero magnetic field.
 %feature("docstring")  ProcessedSample::hasRoughness "bool ProcessedSample::hasRoughness() const
 ";
 
-%feature("docstring")  ProcessedSample::roughnessModel "const RoughnessModel& ProcessedSample::roughnessModel() const
-";
-
 %feature("docstring")  ProcessedSample::sample "const MultiLayer& ProcessedSample::sample() const
 ";
 
-- 
GitLab