From 8547b8c90837233501b053a42743c2c11f5fcedf Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 27 May 2022 20:41:53 +0200
Subject: [PATCH] mv m_beam, m_detector down to ISimulation2D

---
 Sim/Simulation/ISimulation.cpp     | 22 +---------------------
 Sim/Simulation/ISimulation.h       |  5 -----
 Sim/Simulation/ISimulation2D.cpp   | 17 ++++++++++++++++-
 Sim/Simulation/ISimulation2D.h     |  6 ++++++
 auto/Wrap/doxygenSim.i             |  6 +++---
 auto/Wrap/libBornAgainSim.py       |  8 ++++++++
 auto/Wrap/libBornAgainSim_wrap.cpp | 28 ++++++++++++++++++++++++++++
 7 files changed, 62 insertions(+), 30 deletions(-)

diff --git a/Sim/Simulation/ISimulation.cpp b/Sim/Simulation/ISimulation.cpp
index e75d809865c..4577d9386b3 100644
--- a/Sim/Simulation/ISimulation.cpp
+++ b/Sim/Simulation/ISimulation.cpp
@@ -16,9 +16,6 @@
 #include "Base/Progress/ProgressHandler.h"
 #include "Base/Util/Assert.h"
 #include "Base/Util/StringUtils.h"
-#include "Device/Beam/Beam.h"
-#include "Device/Detector/IDetector.h"
-#include "Device/Detector/SphericalDetector.h"
 #include "Device/Histo/SimulationResult.h"
 #include "Resample/Options/SimulationOptions.h"
 #include "Resample/Processed/ReSample.h"
@@ -108,20 +105,8 @@ void runComputations(const std::vector<std::unique_ptr<IComputation>>& computati
 //  class implementation
 //  ************************************************************************************************
 
-ISimulation::ISimulation(const Beam& beam, const MultiLayer& sample, const IDetector& detector)
-    : m_beam(beam.clone())
-    , m_detector(detector.clone())
-    , m_sample(sample.clone())
-    , m_options(std::make_unique<SimulationOptions>())
-    , m_progress(std::make_unique<ProgressHandler>())
-{
-    m_detector->setDetectorNormal(m_beam->direction().zReflected());
-}
-
 ISimulation::ISimulation(const MultiLayer& sample)
-    : m_beam(Beam::horizontalBeam().clone())
-    , m_detector(new SphericalDetector())
-    , m_sample(sample.clone())
+    : m_sample(sample.clone())
     , m_options(std::make_unique<SimulationOptions>())
     , m_progress(std::make_unique<ProgressHandler>())
 {
@@ -216,11 +201,6 @@ void ISimulation::setBackground(const IBackground& bg)
 std::vector<const INode*> ISimulation::nodeChildren() const
 {
     std::vector<const INode*> result;
-    result.push_back(m_beam.get());
-    if (m_detector)
-        result.push_back(m_detector.get());
-    if (m_background)
-        result << m_background.get();
     if (m_sample)
         result << m_sample.get();
     return result;
diff --git a/Sim/Simulation/ISimulation.h b/Sim/Simulation/ISimulation.h
index b15bc8b288d..0aee457f56c 100644
--- a/Sim/Simulation/ISimulation.h
+++ b/Sim/Simulation/ISimulation.h
@@ -22,8 +22,6 @@
 template <class T>
 class Powerfield;
 
-class Beam;
-class IDetector;
 class IBackground;
 class IComputation;
 class ICoordSystem;
@@ -45,7 +43,6 @@ class SimulationResult;
 
 class ISimulation : public INode {
 public:
-    ISimulation(const Beam& beam, const MultiLayer& sample, const IDetector& detector);
     ISimulation(const MultiLayer& sample);
     ~ISimulation() override;
 
@@ -106,8 +103,6 @@ protected:
 
     ProgressHandler& progress();
 
-    std::unique_ptr<Beam> m_beam;
-    std::unique_ptr<IDetector> m_detector;
     DistributionHandler m_distribution_handler;
 
     virtual void initDistributionHandler() {}
diff --git a/Sim/Simulation/ISimulation2D.cpp b/Sim/Simulation/ISimulation2D.cpp
index fd24ea1a986..f98ee1b2e75 100644
--- a/Sim/Simulation/ISimulation2D.cpp
+++ b/Sim/Simulation/ISimulation2D.cpp
@@ -16,18 +16,24 @@
 #include "Base/Util/Assert.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Detector/DetectorContext.h"
+#include "Device/Detector/SphericalDetector.h"
 #include "Device/Detector/IDetector2D.h"
 #include "Resample/Element/DiffuseElement.h"
 #include "Sim/Background/IBackground.h"
 #include "Sim/Computation/DWBAComputation.h"
 
 ISimulation2D::ISimulation2D(const Beam& beam, const MultiLayer& sample, const IDetector& detector)
-    : ISimulation(beam, sample, detector)
+    : ISimulation(sample)
+    , m_beam(beam.clone())
+    , m_detector(detector.clone())
 {
+    m_detector->setDetectorNormal(m_beam->direction().zReflected());
 }
 
 ISimulation2D::ISimulation2D(const MultiLayer& sample)
     : ISimulation(sample)
+    , m_beam(Beam::horizontalBeam().clone())
+    , m_detector(new SphericalDetector())
 {
 }
 
@@ -47,6 +53,15 @@ const IDetector2D& ISimulation2D::detector2D() const
     return *p;
 }
 
+std::vector<const INode*> ISimulation2D::nodeChildren() const
+{
+    std::vector<const INode*> result = ISimulation::nodeChildren();
+    result.push_back(m_beam.get());
+    if (m_detector)
+        result.push_back(m_detector.get());
+    return result;
+}
+
 void ISimulation2D::prepareSimulation()
 {
     m_detector_context = detector2D().createContext();
diff --git a/Sim/Simulation/ISimulation2D.h b/Sim/Simulation/ISimulation2D.h
index eb209f1cf09..3768c9ec326 100644
--- a/Sim/Simulation/ISimulation2D.h
+++ b/Sim/Simulation/ISimulation2D.h
@@ -18,6 +18,8 @@
 #include "Sim/Simulation/ISimulation.h"
 #include <memory>
 
+class Beam;
+class IDetector;
 class DetectorContext;
 class DiffuseElement;
 class IDetector2D;
@@ -35,6 +37,8 @@ public:
     ISimulation2D(const MultiLayer& sample);
     ~ISimulation2D() override;
 
+    std::vector<const INode*> nodeChildren() const override;
+
     //! Sets spherical detector parameters using angle ranges
     //! @param n_x number of phi-axis bins
     //! @param x_min low edge of first phi-bin
@@ -104,6 +108,8 @@ protected:
 
     void moveDataFromCache() override;
 
+    std::unique_ptr<Beam> m_beam;
+    std::unique_ptr<IDetector> m_detector;
     std::vector<std::unique_ptr<DiffuseElement>> m_eles;
     std::vector<double> m_cache;
 
diff --git a/auto/Wrap/doxygenSim.i b/auto/Wrap/doxygenSim.i
index 673af2e0614..c1a6544bf15 100644
--- a/auto/Wrap/doxygenSim.i
+++ b/auto/Wrap/doxygenSim.i
@@ -862,9 +862,6 @@ Simulations are run, and results returned, by the function  ISimulation::simulat
 C++ includes: ISimulation.h
 ";
 
-%feature("docstring")  ISimulation::ISimulation "ISimulation::ISimulation(const Beam &beam, const MultiLayer &sample, const IDetector &detector)
-";
-
 %feature("docstring")  ISimulation::ISimulation "ISimulation::ISimulation(const MultiLayer &sample)
 ";
 
@@ -957,6 +954,9 @@ C++ includes: ISimulation2D.h
 %feature("docstring")  ISimulation2D::~ISimulation2D "ISimulation2D::~ISimulation2D() override
 ";
 
+%feature("docstring")  ISimulation2D::nodeChildren "std::vector< const INode * > ISimulation2D::nodeChildren() const override
+";
+
 %feature("docstring")  ISimulation2D::setDetectorParameters "void ISimulation2D::setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)
 
 Sets spherical detector parameters using angle ranges
diff --git a/auto/Wrap/libBornAgainSim.py b/auto/Wrap/libBornAgainSim.py
index fac963de747..88fcbda622d 100644
--- a/auto/Wrap/libBornAgainSim.py
+++ b/auto/Wrap/libBornAgainSim.py
@@ -3510,6 +3510,14 @@ class ISimulation2D(ISimulation):
     __repr__ = _swig_repr
     __swig_destroy__ = _libBornAgainSim.delete_ISimulation2D
 
+    def nodeChildren(self):
+        r"""
+        nodeChildren(ISimulation2D self) -> swig_dummy_type_const_inode_vector
+        std::vector< const INode * > ISimulation2D::nodeChildren() const override
+
+        """
+        return _libBornAgainSim.ISimulation2D_nodeChildren(self)
+
     def setDetectorParameters(self, n_x, x_min, x_max, n_y, y_min, y_max):
         r"""
         setDetectorParameters(ISimulation2D self, size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)
diff --git a/auto/Wrap/libBornAgainSim_wrap.cpp b/auto/Wrap/libBornAgainSim_wrap.cpp
index 532cd2e417f..3d0d4b65f11 100644
--- a/auto/Wrap/libBornAgainSim_wrap.cpp
+++ b/auto/Wrap/libBornAgainSim_wrap.cpp
@@ -37916,6 +37916,29 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_ISimulation2D_nodeChildren(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISimulation2D *arg1 = (ISimulation2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< INode const *,std::allocator< INode const * > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ISimulation2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISimulation2D_nodeChildren" "', argument " "1"" of type '" "ISimulation2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISimulation2D * >(argp1);
+  result = ((ISimulation2D const *)arg1)->nodeChildren();
+  resultobj = swig::from(static_cast< std::vector< INode const*,std::allocator< INode const * > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_ISimulation2D_setDetectorParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   ISimulation2D *arg1 = (ISimulation2D *) 0 ;
@@ -42214,6 +42237,11 @@ static PyMethodDef SwigMethods[] = {
 		"ISimulation2D::~ISimulation2D() override\n"
 		"\n"
 		""},
+	 { "ISimulation2D_nodeChildren", _wrap_ISimulation2D_nodeChildren, METH_O, "\n"
+		"ISimulation2D_nodeChildren(ISimulation2D self) -> swig_dummy_type_const_inode_vector\n"
+		"std::vector< const INode * > ISimulation2D::nodeChildren() const override\n"
+		"\n"
+		""},
 	 { "ISimulation2D_setDetectorParameters", _wrap_ISimulation2D_setDetectorParameters, METH_VARARGS, "\n"
 		"ISimulation2D_setDetectorParameters(ISimulation2D self, size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)\n"
 		"void ISimulation2D::setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)\n"
-- 
GitLab