From cce55ccc70f4422d7d6d0a002b325a1d0169364f Mon Sep 17 00:00:00 2001
From: Maximilian Reininghaus <maximilian.reininghaus@tu-dortmund.de>
Date: Fri, 22 Mar 2019 00:10:21 -0300
Subject: [PATCH] some progress...

---
 Documentation/Examples/cascade_example.cc     | 83 ++++++++++---------
 Framework/Cascade/testCascade.cc              |  1 -
 Framework/Geometry/testGeometry.cc            |  6 +-
 .../HadronicElasticModel.cc                   | 12 ++-
 .../HadronicElasticModel.h                    |  4 -
 Processes/Sibyll/Interaction.cc               |  4 +-
 Processes/Sibyll/NuclearInteraction.cc        |  3 +-
 Processes/Sibyll/testSibyll.cc                |  7 +-
 Processes/StackInspector/StackInspector.cc    |  2 +-
 Processes/TrackingLine/TrackingLine.cc        |  5 +-
 Processes/TrackingLine/TrackingLine.h         |  2 +-
 Processes/TrackingLine/testTrackingLine.cc    | 29 ++++---
 .../TrackingLine/testTrackingLineStack.h      | 36 +++-----
 13 files changed, 91 insertions(+), 103 deletions(-)

diff --git a/Documentation/Examples/cascade_example.cc b/Documentation/Examples/cascade_example.cc
index 9ff2e73cd..8b1f90be6 100644
--- a/Documentation/Examples/cascade_example.cc
+++ b/Documentation/Examples/cascade_example.cc
@@ -15,13 +15,13 @@
 #include <corsika/process/stack_inspector/StackInspector.h>
 #include <corsika/process/tracking_line/TrackingLine.h>
 
-#include <corsika/setup/SetupStack.h>
 #include <corsika/setup/SetupEnvironment.h>
+#include <corsika/setup/SetupStack.h>
 #include <corsika/setup/SetupTrajectory.h>
 
-#include <corsika/environment/NameModel.h>
 #include <corsika/environment/Environment.h>
 #include <corsika/environment/HomogeneousMedium.h>
+#include <corsika/environment/NameModel.h>
 #include <corsika/environment/NuclearComposition.h>
 
 #include <corsika/geometry/Sphere.h>
@@ -216,25 +216,29 @@ public:
   HEPEnergyType GetEmEnergy() const { return fEmEnergy; }
 };
 
-struct MyBoundaryCrossingProcess : public BoundaryCrossingProcess<MyBoundaryCrossingProcess> {
-    //~ environment::BaseNodeType const& fA, fB;
-    
-    MyBoundaryCrossingProcess() {}
-    
-    //~ MyBoundaryCrossingProcess(environment::BaseNodeType const& a, environment::BaseNodeType const& b) : fA(a), fB(b) {}
-    
-    template <typename Particle>
-    EProcessReturn DoBoundaryCrossing(Particle& p, environment::BaseNodeType const& from, environment::BaseNodeType const& to) {
-        std::cout << "boundary crossing! from:" << &from << "; to: " << &to << std::endl;
-        
-        //~ if ((&fA == &from && &fB == &to) || (&fA == &to && &fB == &from)) {
-            p.Delete();
-        //~ }
-        
-        return EProcessReturn::eOk;
-    }
-    
-    void Init() {}
+struct MyBoundaryCrossingProcess
+    : public BoundaryCrossingProcess<MyBoundaryCrossingProcess> {
+  //~ environment::BaseNodeType const& fA, fB;
+
+  MyBoundaryCrossingProcess() {}
+
+  //~ MyBoundaryCrossingProcess(environment::BaseNodeType const& a,
+  //environment::BaseNodeType const& b) : fA(a), fB(b) {}
+
+  template <typename Particle>
+  EProcessReturn DoBoundaryCrossing(Particle& p,
+                                    typename Particle::BaseNodeType const& from,
+                                    typename Particle::BaseNodeType const& to) {
+    std::cout << "boundary crossing! from:" << &from << "; to: " << &to << std::endl;
+
+    //~ if ((&fA == &from && &fB == &to) || (&fA == &to && &fB == &from)) {
+    p.Delete();
+    //~ }
+
+    return EProcessReturn::eOk;
+  }
+
+  void Init() {}
 };
 
 //
@@ -246,34 +250,34 @@ int main() {
   random::RNGManager::GetInstance().RegisterRandomStream("cascade");
 
   // setup environment, geometry
-  environment::Environment env;
+  using EnvType = environment::Environment<setup::IEnvironmentModel>;
+  EnvType env;
   auto& universe = *(env.GetUniverse());
 
-  auto outerMedium = environment::Environment::CreateNode<Sphere>(
+  auto outerMedium = environment::Environment<EnvType>::CreateNode<Sphere>(
       Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m},
       1_km * std::numeric_limits<double>::infinity());
 
   // fraction of oxygen
   const float fox = 0.20946;
   using MyHomogeneousModel = environment::HomogeneousMedium<setup::IEnvironmentModel>;
-  outerMedium->SetModelProperties<setup::IEnvironmentModel>("outer",
-      1_kg / (1_m * 1_m * 1_m),
+  outerMedium->SetModelProperties<setup::IEnvironmentModel>(
+      "outer", 1_kg / (1_m * 1_m * 1_m),
       environment::NuclearComposition(
           std::vector<particles::Code>{particles::Code::Nitrogen,
                                        particles::Code::Oxygen},
           std::vector<float>{(float)1. - fox, fox}));
-          
-  auto innerMedium = environment::Environment::CreateNode<Sphere>(
-      Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m},
-      2000_m);
 
-  innerMedium->SetModelProperties<setup::IEnvironmentModel>("inner",
-      1_kg / (1_m * 1_m * 1_m),
+  auto innerMedium = environment::Environment<EnvType>::CreateNode<Sphere>(
+      Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m}, 2000_m);
+
+  innerMedium->SetModelProperties<setup::IEnvironmentModel>(
+      "inner", 1_kg / (1_m * 1_m * 1_m),
       environment::NuclearComposition(
           std::vector<particles::Code>{particles::Code::Nitrogen,
                                        particles::Code::Oxygen},
           std::vector<float>{(float)1. - fox, fox}));
-          
+
   outerMedium->AddChild(std::move(innerMedium));
 
   universe.AddChild(std::move(outerMedium));
@@ -291,14 +295,16 @@ int main() {
   ProcessCut cut(20_GeV);
 
   random::RNGManager::GetInstance().RegisterRandomStream("HadronicElasticModel");
-  process::HadronicElasticModel::HadronicElasticInteraction
-  hadronicElastic(env);
+  process::HadronicElasticModel::HadronicElasticInteraction hadronicElastic(env);
 
   process::TrackWriter::TrackWriter trackWriter("tracks.dat");
 
   // assemble all processes into an ordered process list
   // auto sequence = p0 << sibyll << decay << hadronicElastic << cut << trackWriter;
-  auto sequence = p0 /*<< sibyll << sibyllNuc << decay << cut*/ << hadronicElastic << MyBoundaryCrossingProcess() << trackWriter;
+  auto sequence =
+      p0 /*<< sibyll << sibyllNuc << decay << cut*/ << hadronicElastic
+                                                    << MyBoundaryCrossingProcess()
+                                                    << trackWriter;
 
   // setup particle stack, and add primary particle
   setup::Stack stack;
@@ -329,10 +335,9 @@ int main() {
     cout << "input momentum: " << plab.GetComponents() / 1_GeV << endl;
     Point pos(rootCS, 0_m, 0_m, 0_m);
     for (int l = 0; l < 100; ++l) {
-    stack.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType,
-                                 corsika::stack::MomentumVector, geometry::Point,
-                                 units::si::TimeType>{
-        beamCode, E0, plab, pos, 0_ns});
+      stack.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType,
+                                   corsika::stack::MomentumVector, geometry::Point,
+                                   units::si::TimeType>{beamCode, E0, plab, pos, 0_ns});
     }
   }
 
diff --git a/Framework/Cascade/testCascade.cc b/Framework/Cascade/testCascade.cc
index 7d473eecc..5ec522a67 100644
--- a/Framework/Cascade/testCascade.cc
+++ b/Framework/Cascade/testCascade.cc
@@ -45,7 +45,6 @@ using namespace corsika::geometry;
 #include <iostream>
 using namespace std;
 
-
 auto MakeDummyEnv() {
   TestEnvironmentType env; // dummy environment
   auto& universe = *(env.GetUniverse());
diff --git a/Framework/Geometry/testGeometry.cc b/Framework/Geometry/testGeometry.cc
index d73ae99b2..dae272be1 100644
--- a/Framework/Geometry/testGeometry.cc
+++ b/Framework/Geometry/testGeometry.cc
@@ -177,8 +177,10 @@ TEST_CASE("Trajectories") {
     CHECK(line.GetPosition(t).GetCoordinates() == base.GetPosition(1.).GetCoordinates());
 
     CHECK(base.ArcLength(1_s, 2_s) / 1_m == Approx(3));
-    
-    CHECK((base.NormalizedDirection().GetComponents(rootCS) - QuantityVector<dimensionless_d>{1, 0, 0}).eVector.norm() == Approx(0).margin(absMargin));
+
+    CHECK((base.NormalizedDirection().GetComponents(rootCS) -
+           QuantityVector<dimensionless_d>{1, 0, 0})
+              .eVector.norm() == Approx(0).margin(absMargin));
   }
 
   SECTION("Helix") {
diff --git a/Processes/HadronicElasticModel/HadronicElasticModel.cc b/Processes/HadronicElasticModel/HadronicElasticModel.cc
index 681d8fc0d..42a42e0ab 100644
--- a/Processes/HadronicElasticModel/HadronicElasticModel.cc
+++ b/Processes/HadronicElasticModel/HadronicElasticModel.cc
@@ -24,16 +24,15 @@
 #include <iostream>
 
 using namespace corsika::setup;
-using Particle = Stack::ParticleType;
-using Track = Trajectory;
+using Particle = corsika::setup::Stack::ParticleType;
+using Track = corsika::setup::Trajectory;
 
 namespace corsika::process::HadronicElasticModel {
 
   void HadronicElasticInteraction::Init() {}
 
-  HadronicElasticInteraction::HadronicElasticInteraction(
-      environment::Environment const& env, units::si::CrossSectionType x,
-      units::si::CrossSectionType y)
+  HadronicElasticInteraction::HadronicElasticInteraction(units::si::CrossSectionType x,
+                                                         units::si::CrossSectionType y)
       : fX(x)
       , fY(y) {}
 
@@ -87,8 +86,7 @@ namespace corsika::process::HadronicElasticModel {
     using namespace units::si;
     using namespace units::constants;
 
-    const auto* currentNode =
-        fEnvironment.GetUniverse()->GetContainingNode(p.GetPosition());
+    const auto* currentNode = p.GetNode();
     const auto& composition = currentNode->GetModelProperties().GetNuclearComposition();
     const auto& components = composition.GetComponents();
 
diff --git a/Processes/HadronicElasticModel/HadronicElasticModel.h b/Processes/HadronicElasticModel/HadronicElasticModel.h
index 9760569ee..d0826a304 100644
--- a/Processes/HadronicElasticModel/HadronicElasticModel.h
+++ b/Processes/HadronicElasticModel/HadronicElasticModel.h
@@ -19,10 +19,6 @@
 #include <corsika/units/PhysicalConstants.h>
 #include <corsika/units/PhysicalUnits.h>
 
-namespace corsika::environment {
-  class Environment;
-}
-
 namespace corsika::process::HadronicElasticModel {
   /**
    * A simple model for elastic hadronic interactions based on the formulas
diff --git a/Processes/Sibyll/Interaction.cc b/Processes/Sibyll/Interaction.cc
index 683730554..290c72b2a 100644
--- a/Processes/Sibyll/Interaction.cc
+++ b/Processes/Sibyll/Interaction.cc
@@ -271,8 +271,8 @@ namespace corsika::process::sibyll {
         cross_section_of_components[i] = sigProd;
       }
 
-      const auto targetCode = mediumComposition.SampleTarget(
-          cross_section_of_components, fRNG);
+      const auto targetCode =
+          mediumComposition.SampleTarget(cross_section_of_components, fRNG);
       cout << "Interaction: target selected: " << targetCode << endl;
       /*
         FOR NOW: allow nuclei with A<18 or protons only.
diff --git a/Processes/Sibyll/NuclearInteraction.cc b/Processes/Sibyll/NuclearInteraction.cc
index 56a0c67f7..23ec7510d 100644
--- a/Processes/Sibyll/NuclearInteraction.cc
+++ b/Processes/Sibyll/NuclearInteraction.cc
@@ -353,7 +353,8 @@ namespace corsika::process::sibyll {
       [[maybe_unused]] auto sigNucCopy = nNuc;   // ONLY TO AVOID COMPILER WARNINGS
     }
 
-    const auto targetCode = mediumComposition.SampleTarget(cross_section_of_components, fRNG);
+    const auto targetCode =
+        mediumComposition.SampleTarget(cross_section_of_components, fRNG);
     cout << "Interaction: target selected: " << targetCode << endl;
     /*
       FOR NOW: allow nuclei with A<18 or protons only.
diff --git a/Processes/Sibyll/testSibyll.cc b/Processes/Sibyll/testSibyll.cc
index 6d286624e..318bb5c23 100644
--- a/Processes/Sibyll/testSibyll.cc
+++ b/Processes/Sibyll/testSibyll.cc
@@ -88,9 +88,10 @@ TEST_CASE("SibyllInterface", "[processes]") {
   environment::Environment<environment::IMediumModel> env;
   auto& universe = *(env.GetUniverse());
 
-  auto theMedium = environment::Environment<environment::IMediumModel>::CreateNode<geometry::Sphere>(
-      geometry::Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m},
-      1_km * std::numeric_limits<double>::infinity());
+  auto theMedium =
+      environment::Environment<environment::IMediumModel>::CreateNode<geometry::Sphere>(
+          geometry::Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m},
+          1_km * std::numeric_limits<double>::infinity());
 
   using MyHomogeneousModel = environment::HomogeneousMedium<environment::IMediumModel>;
   theMedium->SetModelProperties<MyHomogeneousModel>(
diff --git a/Processes/StackInspector/StackInspector.cc b/Processes/StackInspector/StackInspector.cc
index 8552da191..a22742165 100644
--- a/Processes/StackInspector/StackInspector.cc
+++ b/Processes/StackInspector/StackInspector.cc
@@ -16,8 +16,8 @@
 
 #include <corsika/logging/Logger.h>
 
-#include <corsika/setup/SetupTrajectory.h>
 #include <corsika/cascade/testCascade.h>
+#include <corsika/setup/SetupTrajectory.h>
 
 #include <iostream>
 #include <limits>
diff --git a/Processes/TrackingLine/TrackingLine.cc b/Processes/TrackingLine/TrackingLine.cc
index 4806e7110..6b119c890 100644
--- a/Processes/TrackingLine/TrackingLine.cc
+++ b/Processes/TrackingLine/TrackingLine.cc
@@ -9,12 +9,12 @@
  * the license.
  */
 
-#include <corsika/process/tracking_line/TrackingLine.h>
 #include <corsika/environment/Environment.h>
 #include <corsika/geometry/Point.h>
 #include <corsika/geometry/QuantityVector.h>
 #include <corsika/geometry/Sphere.h>
 #include <corsika/geometry/Vector.h>
+#include <corsika/process/tracking_line/TrackingLine.h>
 
 #include <algorithm>
 #include <iostream>
@@ -27,7 +27,7 @@ namespace corsika::process::tracking_line {
 
   std::optional<std::pair<corsika::units::si::TimeType, corsika::units::si::TimeType>>
   TimeOfIntersection(corsika::geometry::Line const& line,
-                                                      geometry::Sphere const& sphere) {
+                     geometry::Sphere const& sphere) {
     auto const delta = line.GetR0() - sphere.GetCenter();
     auto const v = line.GetV0();
     auto const vSqNorm = v.squaredNorm();
@@ -51,4 +51,3 @@ namespace corsika::process::tracking_line {
     }
   }
 } // namespace corsika::process::tracking_line
-
diff --git a/Processes/TrackingLine/TrackingLine.h b/Processes/TrackingLine/TrackingLine.h
index 55c865295..ef482fd3d 100644
--- a/Processes/TrackingLine/TrackingLine.h
+++ b/Processes/TrackingLine/TrackingLine.h
@@ -74,7 +74,7 @@ namespace corsika::process {
         auto const& children = currentLogicalVolumeNode->GetChildNodes();
         auto const& excluded = currentLogicalVolumeNode->GetExcludedNodes();
 
-		std::vector<std::pair<TimeType, decltype(p.GetNode())>> intersections;
+        std::vector<std::pair<TimeType, decltype(p.GetNode())>> intersections;
 
         auto addIfIntersects = [&](auto const& vtn, auto const& nextNode) {
           static_assert(std::is_same_v<decltype(vtn), decltype(nextNode)>);
diff --git a/Processes/TrackingLine/testTrackingLine.cc b/Processes/TrackingLine/testTrackingLine.cc
index 19efb14f3..26dce27d1 100644
--- a/Processes/TrackingLine/testTrackingLine.cc
+++ b/Processes/TrackingLine/testTrackingLine.cc
@@ -1,4 +1,3 @@
-
 /*
  * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu
  *
@@ -36,10 +35,10 @@ using namespace std;
 using namespace corsika::units::si;
 
 TEST_CASE("TrackingLine") {
-  corsika::environment::Environment env; // dummy environment
+  environment::Environment<environment::Empty> env; // dummy environment
   auto const& cs = env.GetCoordinateSystem();
 
-  tracking_line::TrackingLine<DummyStack, setup::Trajectory> tracking(env);
+  tracking_line::TrackingLine tracking;
 
   SECTION("intersection with sphere") {
     Point const origin(cs, {0_m, 0_m, 0_m});
@@ -52,7 +51,7 @@ TEST_CASE("TrackingLine") {
     setup::Trajectory traj(line, 12345_s);
 
     auto const opt =
-        tracking.TimeOfIntersection(traj, Sphere(Point(cs, {0_m, 0_m, 10_m}), 1_m));
+        tracking_line::TimeOfIntersection(traj, Sphere(Point(cs, {0_m, 0_m, 10_m}), 1_m));
     REQUIRE(opt.has_value());
 
     auto [t1, t2] = opt.value();
@@ -60,25 +59,29 @@ TEST_CASE("TrackingLine") {
     REQUIRE(t2 / 11_s == Approx(1));
 
     auto const optNoIntersection =
-        tracking.TimeOfIntersection(traj, Sphere(Point(cs, {5_m, 0_m, 10_m}), 1_m));
+        tracking_line::TimeOfIntersection(traj, Sphere(Point(cs, {5_m, 0_m, 10_m}), 1_m));
     REQUIRE_FALSE(optNoIntersection.has_value());
   }
 
   SECTION("maximally possible propagation") {
     auto& universe = *(env.GetUniverse());
 
-    //~ std::cout << env.GetUniverse().get() << std::endl;
-
     auto const radius = 20_m;
 
-    auto theMedium = corsika::environment::Environment::CreateNode<Sphere>(
+    auto theMedium = environment::Environment<environment::Empty>::CreateNode<Sphere>(
         Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m}, radius);
     universe.AddChild(std::move(theMedium));
-    
-    Point p0(cs, 0_m, 0_m, 0_m);
-    auto* const node = universe.GetContainingNode(p0);
-    DummyParticle p(1_GeV, Vector<MOMENTUM>(cs, 0_GeV, 0_GeV, 1_GeV),
-                    p0, node);
+
+    TestTrackingLineStack stack;
+    stack.AddParticle(
+        std::tuple<particles::Code, units::si::HEPEnergyType,
+                   corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{
+            particles::Code::MuPlus,
+            1_GeV,
+            {cs, {0_GeV, 0_GeV, 1_GeV}},
+            {cs, {0_m, 0_m, 0_km}},
+            0_ns});
+    auto p = stack.GetNextParticle();
 
     Point const origin(cs, {0_m, 0_m, 0_m});
     Vector<corsika::units::si::SpeedType::dimension_type> v(cs, 0_m / second,
diff --git a/Processes/TrackingLine/testTrackingLineStack.h b/Processes/TrackingLine/testTrackingLineStack.h
index 45975d032..5c3de074e 100644
--- a/Processes/TrackingLine/testTrackingLineStack.h
+++ b/Processes/TrackingLine/testTrackingLineStack.h
@@ -1,4 +1,3 @@
-
 /*
  * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu
  *
@@ -17,34 +16,19 @@
 #include <corsika/geometry/Vector.h>
 #include <corsika/particles/ParticleProperties.h>
 #include <corsika/units/PhysicalUnits.h>
+#include <corsika/setup/SetupStack.h>
 
-typedef corsika::units::si::hepmomentum_d MOMENTUM;
-
-struct DummyParticle {
-  corsika::units::si::HEPEnergyType fEnergy;
-  corsika::geometry::Vector<MOMENTUM> fMomentum;
-  corsika::geometry::Point fPosition;
-  corsika::environment::VolumeTreeNode<> const* fNodePtr;
+using TestEnvironmentType = corsika::environment::Environment<corsika::environment::Empty>;
 
-  DummyParticle(corsika::units::si::HEPEnergyType pEnergy,
-                corsika::geometry::Vector<MOMENTUM> pMomentum,
-                corsika::geometry::Point pPosition,
-                corsika::environment::BaseNodeType const* pNodePtr)
-      : fEnergy(pEnergy)
-      , fMomentum(pMomentum)
-      , fPosition(pPosition)
-      , fNodePtr(pNodePtr) {}
+template <typename T>
+using SetupGeometryDataInterface = GeometryDataInterface<T, TestEnvironmentType>;
 
-  auto GetEnergy() const { return fEnergy; }
-  auto GetMomentum() const { return fMomentum; }
-  auto GetPosition() const { return fPosition; }
-  auto GetPID() const { return corsika::particles::Code::Unknown; }
-  auto* GetNode() const { return fNodePtr; }
-};
+// combine particle data stack with geometry information for tracking
+template <typename StackIter>
+using StackWithGeometryInterface =
+        corsika::stack::CombinedParticleInterface<corsika::setup::detail::ParticleDataStack::PIType,
+                                                  SetupGeometryDataInterface, StackIter>;
+using TestTrackingLineStack = corsika::stack::CombinedStack<typename corsika::setup::detail::ParticleDataStack::StackImpl, GeometryData<TestEnvironmentType>, StackWithGeometryInterface>;
 
-struct DummyStack {
-  using ParticleType = DummyParticle;
-  using StackIterator = DummyParticle;
-};
 
 #endif
-- 
GitLab