From da7bee3a07fdc9884e58e2a3580b6a547d150065 Mon Sep 17 00:00:00 2001
From: ralfulrich <ralf.ulrich@kit.edu>
Date: Tue, 2 Apr 2019 11:33:59 +0200
Subject: [PATCH] use new SecondariesProcess, added ObservationLevel (passive
 version) for tests

---
 Documentation/Examples/CMakeLists.txt         |  25 +++-
 Documentation/Examples/cascade_example.cc     | 108 ++++++++++--------
 .../Examples/staticsequence_example.cc        |   7 +-
 Documentation/Examples/vertical_EAS.cc        |  58 +++++-----
 4 files changed, 118 insertions(+), 80 deletions(-)

diff --git a/Documentation/Examples/CMakeLists.txt b/Documentation/Examples/CMakeLists.txt
index 06b4467e4..4d3c5fd75 100644
--- a/Documentation/Examples/CMakeLists.txt
+++ b/Documentation/Examples/CMakeLists.txt
@@ -31,7 +31,7 @@ target_link_libraries (cascade_example SuperStupidStack CORSIKAunits
   ProcessPythia
   CORSIKAcascade
   ProcessEnergyLoss
-  ProcessStackInspector
+#  ProcessStackInspector
   ProcessTrackWriter
   ProcessTrackingLine
   ProcessHadronicElasticModel
@@ -45,6 +45,29 @@ target_link_libraries (cascade_example SuperStupidStack CORSIKAunits
 install (TARGETS cascade_example DESTINATION share/examples)
 CORSIKA_ADD_TEST (cascade_example)
 
+add_executable (vertical_EAS vertical_EAS.cc)
+target_compile_options(vertical_EAS PRIVATE -g) # do not skip asserts
+target_link_libraries (vertical_EAS SuperStupidStack CORSIKAunits
+  CORSIKAlogging
+  CORSIKArandom
+  ProcessSibyll
+  ProcessPythia
+  CORSIKAcascade
+  ProcessEnergyLoss
+#  ProcessStackInspector
+  ProcessTrackWriter
+  ProcessTrackingLine
+  ProcessHadronicElasticModel
+  CORSIKAprocesses
+  CORSIKAcascade
+  CORSIKAparticles
+  CORSIKAgeometry
+  CORSIKAenvironment
+  CORSIKAprocesssequence
+  )
+install (TARGETS vertical_EAS DESTINATION share/examples)
+CORSIKA_ADD_TEST (vertical_EAS)
+
 add_executable (staticsequence_example staticsequence_example.cc)
 target_compile_options(staticsequence_example PRIVATE -g) # do not skip asserts
 target_link_libraries (staticsequence_example
diff --git a/Documentation/Examples/cascade_example.cc b/Documentation/Examples/cascade_example.cc
index 764eeeba0..6c4036deb 100644
--- a/Documentation/Examples/cascade_example.cc
+++ b/Documentation/Examples/cascade_example.cc
@@ -58,7 +58,7 @@ using namespace corsika::environment;
 using namespace std;
 using namespace corsika::units::si;
 
-class ProcessCut : public process::ContinuousProcess<ProcessCut> {
+class ProcessCut : public process::SecondariesProcess<ProcessCut> {
 
   HEPEnergyType fECut;
 
@@ -152,47 +152,38 @@ public:
     return is_inv;
   }
 
-  template <typename Particle>
-  LengthType MaxStepLength(Particle& p, setup::Trajectory&) const {
-    cout << "ProcessCut: MinStep: pid: " << p.GetPID() << endl;
-    cout << "ProcessCut: MinStep: energy (GeV): " << p.GetEnergy() / 1_GeV << endl;
-    const Code pid = p.GetPID();
-    if (isEmParticle(pid) || isInvisible(pid) || isBelowEnergyCut(p)) {
-      cout << "ProcessCut: MinStep: next cut: " << 0. << endl;
-      return 0_m;
-    } else {
-      LengthType next_step = 1_m * std::numeric_limits<double>::infinity();
-      cout << "ProcessCut: MinStep: next cut: " << next_step << endl;
-      return next_step;
-    }
-  }
-
-  template <typename Particle, typename Stack>
-  EProcessReturn DoContinuous(Particle& p, setup::Trajectory&, Stack&) {
-    const Code pid = p.GetPID();
-    HEPEnergyType energy = p.GetEnergy();
-    cout << "ProcessCut: DoContinuous: " << pid << " E= " << energy
-         << ", EcutTot=" << (fEmEnergy + fInvEnergy + fEnergy) / 1_GeV << " GeV" << endl;
-    EProcessReturn ret = EProcessReturn::eOk;
-    if (isEmParticle(pid)) {
-      cout << "removing em. particle..." << endl;
-      fEmEnergy += energy;
-      fEmCount += 1;
-      // p.Delete();
-      ret = EProcessReturn::eParticleAbsorbed;
-    } else if (isInvisible(pid)) {
-      cout << "removing inv. particle..." << endl;
-      fInvEnergy += energy;
-      fInvCount += 1;
-      // p.Delete();
-      ret = EProcessReturn::eParticleAbsorbed;
-    } else if (isBelowEnergyCut(p)) {
-      cout << "removing low en. particle..." << endl;
-      fEnergy += energy;
-      // p.Delete();
-      ret = EProcessReturn::eParticleAbsorbed;
+  template <typename TSecondaries>
+  EProcessReturn DoSecondaries(TSecondaries& vS) {
+    auto p = vS.begin();
+    while (p != vS.end()) {
+      const Code pid = p.GetPID();
+      HEPEnergyType energy = p.GetEnergy();
+      cout << "ProcessCut: DoSecondaries: " << pid << " E= " << energy
+           << ", EcutTot=" << (fEmEnergy + fInvEnergy + fEnergy) / 1_GeV << " GeV"
+           << endl;
+      if (isEmParticle(pid)) {
+        cout << "removing em. particle..." << endl;
+        fEmEnergy += energy;
+        fEmCount += 1;
+        p.Delete();
+      } else if (isInvisible(pid)) {
+        cout << "removing inv. particle..." << endl;
+        fInvEnergy += energy;
+        fInvCount += 1;
+        p.Delete();
+      } else if (isBelowEnergyCut(p)) {
+        cout << "removing low en. particle..." << endl;
+        fEnergy += energy;
+        p.Delete();
+      } else if (p.GetTime() > 10_ms) {
+        cout << "removing OLD particle..." << endl;
+        fEnergy += energy;
+        p.Delete();
+      } else {
+        ++p; // next entry in SecondaryView
+      }
     }
-    return ret;
+    return EProcessReturn::eOk;
   }
 
   void Init() {
@@ -220,6 +211,31 @@ public:
   HEPEnergyType GetEmEnergy() const { return fEmEnergy; }
 };
 
+class ObservationLevel : public process::ContinuousProcess<ObservationLevel> {
+
+  LengthType fHeight;
+
+public:
+  ObservationLevel(const LengthType vHeight)
+      : fHeight(vHeight) {}
+
+  template <typename Particle>
+  LengthType MaxStepLength(Particle&, setup::Trajectory&) const {
+    return 1_m * std::numeric_limits<double>::infinity();
+  }
+
+  template <typename TParticle, typename TTrack>
+  EProcessReturn DoContinuous(TParticle&, TTrack& vT) {
+    if ((vT.GetPosition(0).GetZ() <= fHeight && vT.GetPosition(1).GetZ() > fHeight) ||
+        (vT.GetPosition(0).GetZ() > fHeight && vT.GetPosition(1).GetZ() <= fHeight)) {
+      cout << "OBSERVED " << endl;
+      return EProcessReturn::eParticleAbsorbed;
+    }
+    return EProcessReturn::eOk;
+  }
+  void Init() {}
+};
+
 //
 // The example main program for a particle cascade
 //
@@ -252,7 +268,7 @@ int main() {
 
   // setup processes, decays and interactions
   tracking_line::TrackingLine<setup::Stack, setup::Trajectory> tracking(env);
-  stack_inspector::StackInspector<setup::Stack> stackInspect(true);
+  // stack_inspector::StackInspector<setup::Stack> stackInspect(true);
 
   const std::vector<particles::Code> trackedHadrons = {
       particles::Code::PiPlus, particles::Code::PiMinus, particles::Code::KPlus,
@@ -265,6 +281,7 @@ int main() {
   // random::RNGManager::GetInstance().RegisterRandomStream("pythia");
   // process::pythia::Decay decay(trackedHadrons);
   ProcessCut cut(20_GeV);
+  ObservationLevel obsLevel(1400_m);
 
   // random::RNGManager::GetInstance().RegisterRandomStream("HadronicElasticModel");
   // process::HadronicElasticModel::HadronicElasticInteraction
@@ -277,8 +294,8 @@ int main() {
   // auto sequence = stackInspect << sibyll << decay << hadronicElastic << cut <<
   // trackWriter; auto sequence = stackInspect << sibyll << sibyllNuc << decay << eLoss <<
   // cut << trackWriter;
-  // auto sequence = sibyll << sibyllNuc << decay << eLoss << cut;
-  auto sequence = stackInspect << sibyll << sibyllNuc << decay << eLoss << cut;
+  auto sequence = sibyll << sibyllNuc << decay << eLoss << cut << obsLevel;
+  // auto sequence = stackInspect << sibyll << sibyllNuc << decay << eLoss << cut;
 
   // cout << "decltype(sequence)=" << type_id_with_cvr<decltype(sequence)>().pretty_name()
   // << "\n";
@@ -309,7 +326,8 @@ int main() {
     cout << "input particle: " << beamCode << endl;
     cout << "input angles: theta=" << theta << " phi=" << phi << endl;
     cout << "input momentum: " << plab.GetComponents() / 1_GeV << endl;
-    Point pos(rootCS, 0_m, 0_m, 0_m);
+    Point pos(rootCS, 0_m, 0_m,
+              112.8_km); // this is the CORSIKA 7 start of atmosphere/universe
     stack.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType,
                                  corsika::stack::MomentumVector, geometry::Point,
                                  units::si::TimeType, unsigned short, unsigned short>{
diff --git a/Documentation/Examples/staticsequence_example.cc b/Documentation/Examples/staticsequence_example.cc
index 5e881ebbe..0cd2901c3 100644
--- a/Documentation/Examples/staticsequence_example.cc
+++ b/Documentation/Examples/staticsequence_example.cc
@@ -88,12 +88,11 @@ void modular() {
 
   auto sequence = m1 << m2 << m3 << m4;
 
-  DummyData p;
-  DummyStack s;
-  DummyTrajectory t;
+  DummyData particle;
+  DummyTrajectory track;
 
   const int n = 1000;
-  for (int i = 0; i < n; ++i) { sequence.DoContinuous(p, t, s); }
+  for (int i = 0; i < n; ++i) { sequence.DoContinuous(particle, track); }
 
   for (int i = 0; i < nData; ++i) {
     // cout << p.p[i] << endl;
diff --git a/Documentation/Examples/vertical_EAS.cc b/Documentation/Examples/vertical_EAS.cc
index d3bee8145..6c4036deb 100644
--- a/Documentation/Examples/vertical_EAS.cc
+++ b/Documentation/Examples/vertical_EAS.cc
@@ -159,27 +159,28 @@ public:
       const Code pid = p.GetPID();
       HEPEnergyType energy = p.GetEnergy();
       cout << "ProcessCut: DoSecondaries: " << pid << " E= " << energy
-	   << ", EcutTot=" << (fEmEnergy + fInvEnergy + fEnergy) / 1_GeV << " GeV" << endl;
+           << ", EcutTot=" << (fEmEnergy + fInvEnergy + fEnergy) / 1_GeV << " GeV"
+           << endl;
       if (isEmParticle(pid)) {
-	cout << "removing em. particle..." << endl;
-	fEmEnergy += energy;
-	fEmCount += 1;
-	p.Delete();
+        cout << "removing em. particle..." << endl;
+        fEmEnergy += energy;
+        fEmCount += 1;
+        p.Delete();
       } else if (isInvisible(pid)) {
-	cout << "removing inv. particle..." << endl;
-	fInvEnergy += energy;
-	fInvCount += 1;
-	p.Delete();
+        cout << "removing inv. particle..." << endl;
+        fInvEnergy += energy;
+        fInvCount += 1;
+        p.Delete();
       } else if (isBelowEnergyCut(p)) {
-	cout << "removing low en. particle..." << endl;
-	fEnergy += energy;
-	p.Delete();
-      } else if (p.GetTime()>10_ms) {
-	cout << "removing OLD particle..." << endl;
-	fEnergy += energy;
-	p.Delete();
+        cout << "removing low en. particle..." << endl;
+        fEnergy += energy;
+        p.Delete();
+      } else if (p.GetTime() > 10_ms) {
+        cout << "removing OLD particle..." << endl;
+        fEnergy += energy;
+        p.Delete();
       } else {
-	++p; // next entry in SecondaryView
+        ++p; // next entry in SecondaryView
       }
     }
     return EProcessReturn::eOk;
@@ -210,33 +211,29 @@ public:
   HEPEnergyType GetEmEnergy() const { return fEmEnergy; }
 };
 
-
 class ObservationLevel : public process::ContinuousProcess<ObservationLevel> {
 
   LengthType fHeight;
-  
+
 public:
   ObservationLevel(const LengthType vHeight)
-    : fHeight(vHeight) {}
+      : fHeight(vHeight) {}
 
   template <typename Particle>
   LengthType MaxStepLength(Particle&, setup::Trajectory&) const {
     return 1_m * std::numeric_limits<double>::infinity();
   }
-  
+
   template <typename TParticle, typename TTrack>
   EProcessReturn DoContinuous(TParticle&, TTrack& vT) {
-    if ((vT.GetPosition(0).GetZ()<=fHeight &&
-	 vT.GetPosition(1).GetZ()>fHeight) ||
-	(vT.GetPosition(0).GetZ()>fHeight &&
-	 vT.GetPosition(1).GetZ()<=fHeight)) {
-      cout << "OBSERVED " << endl; 
-      return EProcessReturn::eParticleAbsorbed;	  
+    if ((vT.GetPosition(0).GetZ() <= fHeight && vT.GetPosition(1).GetZ() > fHeight) ||
+        (vT.GetPosition(0).GetZ() > fHeight && vT.GetPosition(1).GetZ() <= fHeight)) {
+      cout << "OBSERVED " << endl;
+      return EProcessReturn::eParticleAbsorbed;
     }
     return EProcessReturn::eOk;
   }
   void Init() {}
-
 };
 
 //
@@ -285,7 +282,7 @@ int main() {
   // process::pythia::Decay decay(trackedHadrons);
   ProcessCut cut(20_GeV);
   ObservationLevel obsLevel(1400_m);
-  
+
   // random::RNGManager::GetInstance().RegisterRandomStream("HadronicElasticModel");
   // process::HadronicElasticModel::HadronicElasticInteraction
   // hadronicElastic(env);
@@ -329,7 +326,8 @@ int main() {
     cout << "input particle: " << beamCode << endl;
     cout << "input angles: theta=" << theta << " phi=" << phi << endl;
     cout << "input momentum: " << plab.GetComponents() / 1_GeV << endl;
-    Point pos(rootCS, 0_m, 0_m, 112.8_km); // this is the CORSIKA 7 start of atmosphere/universe
+    Point pos(rootCS, 0_m, 0_m,
+              112.8_km); // this is the CORSIKA 7 start of atmosphere/universe
     stack.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType,
                                  corsika::stack::MomentumVector, geometry::Point,
                                  units::si::TimeType, unsigned short, unsigned short>{
-- 
GitLab