From 11a8fcc78882a22d611f6d8f89e497321a3f3f6b Mon Sep 17 00:00:00 2001
From: ralfulrich <ralf.ulrich@kit.edu>
Date: Wed, 19 Sep 2018 15:05:06 +0200
Subject: [PATCH] updated process interface

---
 .../Examples/staticsequence_example.cc        | 12 ++++++----
 Framework/Cascade/Cascade.h                   | 14 ++++++------
 Framework/Cascade/testCascade.cc              |  8 ++++---
 Framework/ProcessSequence/CMakeLists.txt      |  1 +
 Framework/ProcessSequence/ProcessReturn.h     | 18 +++++++++++++++
 Framework/ProcessSequence/ProcessSequence.h   | 22 ++++++++++++-------
 .../ProcessSequence/testProcessSequence.cc    | 14 +++++++-----
 7 files changed, 62 insertions(+), 27 deletions(-)
 create mode 100644 Framework/ProcessSequence/ProcessReturn.h

diff --git a/Documentation/Examples/staticsequence_example.cc b/Documentation/Examples/staticsequence_example.cc
index 6b8406739..9acbc412a 100644
--- a/Documentation/Examples/staticsequence_example.cc
+++ b/Documentation/Examples/staticsequence_example.cc
@@ -11,8 +11,9 @@ class Process1 : public BaseProcess<Process1> {
 public:
   Process1() {}
   template <typename D, typename T, typename S>
-  void DoContinuous(D& d, T& t, S& s) const {
+  EProcessReturn DoContinuous(D& d, T& t, S& s) const {
     for (int i = 0; i < 10; ++i) d.p[i] += 1;
+    return EProcessReturn::eOk;
   }
 };
 
@@ -21,8 +22,9 @@ public:
   Process2() {}
 
   template <typename D, typename T, typename S>
-  inline void DoContinuous(D& d, T& t, S& s) const {
+  inline EProcessReturn DoContinuous(D& d, T& t, S& s) const {
     // for (int i=0; i<10; ++i) d.p[i] *= 2;
+    return EProcessReturn::eOk;
   }
 };
 
@@ -32,8 +34,9 @@ public:
   Process3() {}
 
   template <typename D, typename T, typename S>
-  inline void DoContinuous(D& d, T& t, S& s) const {
+  inline EProcessReturn DoContinuous(D& d, T& t, S& s) const {
     // for (int i=0; i<10; ++i) d.p[i] += fV;
+    return EProcessReturn::eOk;
   }
 
 private:
@@ -45,8 +48,9 @@ public:
   // Process4(const int v) : fV(v) {}
   Process4() {}
   template <typename D, typename T, typename S>
-  inline void DoContinuous(D& d, T& t, S& s) const {
+  inline EProcessReturn DoContinuous(D& d, T& t, S& s) const {
     // for (int i=0; i<10; ++i) d.p[i] /= fV;
+    return EProcessReturn::eOk;
   }
 
 private:
diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h
index 3ef8ce928..ebadbd8a6 100644
--- a/Framework/Cascade/Cascade.h
+++ b/Framework/Cascade/Cascade.h
@@ -4,6 +4,7 @@
 #include <corsika/geometry/LineTrajectory.h> // to be removed
 #include <corsika/geometry/Point.h>          // to be removed
 #include <corsika/units/PhysicalUnits.h>
+#include <corsika/process/ProcessReturn.h>
 
 using namespace corsika::units::si;
 
@@ -47,7 +48,7 @@ namespace corsika::cascade {
         // DoCascadeEquations(); //
       }
     }
-
+    
     void Step(Particle& particle) {
       double nextStep = fProcesseList.MinStepLength(particle);
       corsika::geometry::CoordinateSystem root;
@@ -55,13 +56,12 @@ namespace corsika::cascade {
           corsika::geometry::Point(root, {0_m, 0_m, 0_m}),
           corsika::geometry::Vector<corsika::units::si::SpeedType::dimension_type>(
               root, 0 * 1_m / second, 0 * 1_m / second, 1 * 1_m / second));
-      fProcesseList.DoContinuous(particle, trajectory, fStack);
-      // if (particle.IsMarkedToBeDeleted())
-      {
-        // std::cout << "DELETET THISSKSKJD!" << std::endl;
-        // fStack.Delete(particle);
+      corsika::process::EProcessReturn status = fProcesseList.DoContinuous(particle, trajectory, fStack);
+      if (status==corsika::process::EProcessReturn::eParticleAbsorbed) {
+	fStack.Delete(particle);
+      } else {
+	fProcesseList.DoDiscrete(particle, fStack);
       }
-      fProcesseList.DoDiscrete(particle, fStack);
     }
 
   private:
diff --git a/Framework/Cascade/testCascade.cc b/Framework/Cascade/testCascade.cc
index 7e0bd76ba..c110455cb 100644
--- a/Framework/Cascade/testCascade.cc
+++ b/Framework/Cascade/testCascade.cc
@@ -25,7 +25,8 @@ public:
   }
 
   template <typename Particle, typename Trajectory, typename Stack>
-  void DoContinuous(Particle& p, Trajectory& t, Stack& s) const {}
+  EProcessReturn DoContinuous(Particle& p, Trajectory& t, Stack& s) const {    return EProcessReturn::eOk;
+}
 
   template <typename Particle, typename Stack>
   void DoDiscrete(Particle& p, Stack& s) const {
@@ -59,9 +60,9 @@ public:
   }
 
   template <typename Particle, typename Trajectory, typename Stack>
-  void DoContinuous(Particle& p, Trajectory& t, Stack& s) const {
+  EProcessReturn DoContinuous(Particle& p, Trajectory& t, Stack& s) const {
     static int countStep = 0;
-    if (!fReport) return;
+    if (!fReport) return EProcessReturn::eOk;
     //std::cout << "generation  " << countStep << std::endl;
     int i = 0;
     EnergyType Etot = 0_GeV;
@@ -76,6 +77,7 @@ public:
     countStep++;
     //cout << "#=" << countStep << " " << s.GetSize() << " " << Etot/1_GeV << endl;
     cout << countStep << " " << s.GetSize() << " " << Etot/1_GeV << " " << fCount << endl;
+    return EProcessReturn::eOk;
   }
 
   template <typename Particle, typename Stack>
diff --git a/Framework/ProcessSequence/CMakeLists.txt b/Framework/ProcessSequence/CMakeLists.txt
index ac853c837..9852db42b 100644
--- a/Framework/ProcessSequence/CMakeLists.txt
+++ b/Framework/ProcessSequence/CMakeLists.txt
@@ -11,6 +11,7 @@ set (
 set (
   CORSIKAprocesssequence_HEADERS
   ProcessSequence.h
+  ProcessReturn.h
   )
 
 CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKAprocesssequence ${CORSIKAprocesssequence_NAMESPACE} ${CORSIKAprocesssequence_HEADERS})
diff --git a/Framework/ProcessSequence/ProcessReturn.h b/Framework/ProcessSequence/ProcessReturn.h
new file mode 100644
index 000000000..9813b0256
--- /dev/null
+++ b/Framework/ProcessSequence/ProcessReturn.h
@@ -0,0 +1,18 @@
+#ifndef _include_ProcessReturn_h_
+#define _include_ProcessReturn_h_
+
+namespace corsika::process {
+
+  /**
+     since in a process sequence many status updates can accumulate
+     for a single particle, this enum should define only bit-flags
+     that can be accumulated easily with "|=" 
+   */
+  
+  enum class EProcessReturn {
+    eOk = 1,
+    eParticleAbsorbed = 2,
+  };
+}
+
+#endif
diff --git a/Framework/ProcessSequence/ProcessSequence.h b/Framework/ProcessSequence/ProcessSequence.h
index 75ab8dad3..f11c45f5b 100644
--- a/Framework/ProcessSequence/ProcessSequence.h
+++ b/Framework/ProcessSequence/ProcessSequence.h
@@ -1,12 +1,14 @@
 #ifndef _include_ProcessSequence_h_
 #define _include_ProcessSequence_h_
 
+#include <corsika/process/ProcessReturn.h>
+
 #include <cmath>
 #include <iostream>
 #include <typeinfo>
 
-namespace corsika::process {
-
+namespace corsika::process {  
+  
   /**
      \class BaseProcess
 
@@ -44,9 +46,11 @@ namespace corsika::process {
         , B(in_B) {}
 
     template <typename Particle, typename Trajectory, typename Stack>
-    inline void DoContinuous(Particle& p, Trajectory& t, Stack& s) const {
-      A.DoContinuous(p, t, s);
-      B.DoContinuous(p, t, s);
+    inline EProcessReturn DoContinuous(Particle& p, Trajectory& t, Stack& s) const {
+      EProcessReturn ret = EProcessReturn::eOk;
+      /*ret |=*/ A.DoContinuous(p, t, s);
+      /*ret |=*/ B.DoContinuous(p, t, s);
+      return ret;
     } // add trajectory
 
     template <typename D>
@@ -54,9 +58,11 @@ namespace corsika::process {
       return std::min(A.MinStepLength(d), B.MinStepLength(d));
     }
 
-    // template<typename D>
-    // inline Trajectory Transport(D& d, double& length) const { A.Transport(d, length);
-    // B.Transport(d, length); }
+    template <typename Particle, typename Trajectory>
+    inline Trajectory Transport(Particle& p, double& length) const {
+      A.Transport(p, length); // todo: maybe check (?) if there is more than one Transport process implemented?? 
+      return B.Transport(p, length); // need to do this also to decide which Trajectory to return!!!!
+    }
 
     template <typename Particle, typename Stack>
     void DoDiscrete(Particle& p, Stack& s) const {
diff --git a/Framework/ProcessSequence/testProcessSequence.cc b/Framework/ProcessSequence/testProcessSequence.cc
index d057facff..efb0a0b2a 100644
--- a/Framework/ProcessSequence/testProcessSequence.cc
+++ b/Framework/ProcessSequence/testProcessSequence.cc
@@ -16,8 +16,9 @@ public:
   Process1() {}
   void Init() {} // cout << "Process1::Init" << endl; }
   template <typename D, typename T, typename S>
-  void DoContinuous(D& d, T& t, S& s) const {
+  inline EProcessReturn DoContinuous(D& d, T& t, S& s) const {
     for (int i = 0; i < 10; ++i) d.p[i] += 1 + i;
+    return EProcessReturn::eOk;
   }
 };
 
@@ -26,8 +27,9 @@ public:
   Process2() {}
   void Init() {} // cout << "Process2::Init" << endl; }
   template <typename D, typename T, typename S>
-  inline void DoContinuous(D& d, T& t, S& s) const {
+  inline EProcessReturn  DoContinuous(D& d, T& t, S& s) const {
     for (int i = 0; i < 10; ++i) d.p[i] *= 0.7;
+    return EProcessReturn::eOk;
   }
 };
 
@@ -36,8 +38,9 @@ public:
   Process3() {}
   void Init() {} // cout << "Process3::Init" << endl; }
   template <typename D, typename T, typename S>
-  inline void DoContinuous(D& d, T& t, S& s) const {
+  inline EProcessReturn  DoContinuous(D& d, T& t, S& s) const {
     for (int i = 0; i < 10; ++i) d.p[i] += 0.933;
+    return EProcessReturn::eOk;
   }
 };
 
@@ -46,9 +49,10 @@ public:
   Process4() {}
   void Init() {} // cout << "Process4::Init" << endl; }
   template <typename D, typename T, typename S>
-  inline void DoContinuous(D& d, T& t, S& s) const {
+  inline EProcessReturn  DoContinuous(D& d, T& t, S& s) const {
     for (int i = 0; i < 10; ++i) d.p[i] /= 1.2;
-  }
+    return EProcessReturn::eOk; 
+ }
   // inline double MinStepLength(D& d) {
   // void DoDiscrete(Particle& p, Stack& s) const {
 };
-- 
GitLab