From 308ecf2dd77528691ba980e23a87b109d5dcfef9 Mon Sep 17 00:00:00 2001
From: ralfulrich <ralf.ulrich@kit.edu>
Date: Wed, 7 Oct 2020 17:00:01 +0200
Subject: [PATCH] use new setupEnvironment and setupStack everywhere

---
 Documentation/Examples/boundary_example.cc    |  3 +-
 Documentation/Examples/cascade_example.cc     | 28 ++++----
 .../Examples/cascade_proton_example.cc        | 14 ++--
 Documentation/Examples/em_shower.cc           | 28 +++++---
 Documentation/Examples/vertical_EAS.cc        | 28 +++++---
 .../CONEXSourceCut/testCONEXSourceCut.cc      | 33 ++++++---
 .../testInteractionCounter.cc                 | 69 +------------------
 Processes/OnShellCheck/testOnShellCheck.cc    |  2 +-
 Processes/ParticleCut/testParticleCut.cc      |  3 +-
 Processes/Proposal/ContinuousProcess.cc       |  2 +-
 Processes/Proposal/Interaction.cc             |  2 +-
 Processes/Proposal/ProposalProcessBase.cc     |  2 +-
 Processes/Proposal/ProposalProcessBase.h      |  2 +-
 Processes/Pythia/testPythia8.cc               | 15 ++--
 Processes/QGSJetII/testQGSJetII.cc            | 11 +--
 Processes/Sibyll/NuclearInteraction.cc        |  7 +-
 Processes/Sibyll/testSibyll.cc                | 30 ++++----
 .../StackInspector/testStackInspector.cc      |  8 +--
 Processes/UrQMD/testUrQMD.cc                  | 16 ++---
 Setup/SetupEnvironment.h                      |  2 +-
 Setup/SetupStack.h                            | 22 +++---
 21 files changed, 155 insertions(+), 172 deletions(-)

diff --git a/Documentation/Examples/boundary_example.cc b/Documentation/Examples/boundary_example.cc
index 9bf4e188a..e0451e947 100644
--- a/Documentation/Examples/boundary_example.cc
+++ b/Documentation/Examples/boundary_example.cc
@@ -45,7 +45,6 @@ using namespace corsika::process;
 using namespace corsika::units;
 using namespace corsika::particles;
 using namespace corsika::random;
-using namespace corsika::setup;
 using namespace corsika::geometry;
 using namespace corsika::environment;
 
@@ -95,7 +94,7 @@ int main() {
   random::RNGManager::GetInstance().RegisterRandomStream("cascade");
 
   // setup environment, geometry
-  using EnvType = Environment<setup::IEnvironmentModel>;
+  using EnvType = setup::Environment;
   EnvType env;
   auto& universe = *(env.GetUniverse());
 
diff --git a/Documentation/Examples/cascade_example.cc b/Documentation/Examples/cascade_example.cc
index b8551c87a..628109f93 100644
--- a/Documentation/Examples/cascade_example.cc
+++ b/Documentation/Examples/cascade_example.cc
@@ -72,25 +72,25 @@ int main() {
 
   const CoordinateSystem& rootCS = env.GetCoordinateSystem();
 
-  auto outerMedium = setup::EnvironmentType::CreateNode<Sphere>(
+  auto outerMedium = setup::Environment::CreateNode<Sphere>(
       Point{rootCS, 0_m, 0_m, 0_m}, 1_km * std::numeric_limits<double>::infinity());
 
+  using MyHomogeneousModel =
+      environment::UniformMediumType<environment::UniformMagneticField<
+          environment::HomogeneousMedium<setup::EnvironmentInterface>>>;
 
-  using EnvironmentModel = environment::UniformMediumType<environment::UniformMagneticField<environment::HomogeneousMedium<setup::IEnvironment>>>;
-  
   // fraction of oxygen
   const float fox = 0.20946;
-  auto const props =
-      outerMedium
-    ->SetModelProperties<EnvironmentModel>(environment::EMediumType::eAir,
-					   Vector(rootCS, 0_T, 0_T, 0_T),
-					   1_kg / (1_m * 1_m * 1_m),
-					   environment::NuclearComposition(
-									   std::vector<particles::Code>{particles::Code::Nitrogen,
-													  particles::Code::Oxygen},
-									   std::vector<float>{1.f - fox, fox}));
-
-  auto innerMedium = setup::Environment::CreateNode<Sphere>(Point{rootCS, 0_m, 0_m, 0_m}, 5000_m);
+  auto const props = outerMedium->SetModelProperties<MyHomogeneousModel>(
+      environment::EMediumType::eAir, Vector(rootCS, 0_T, 0_T, 0_T),
+      1_kg / (1_m * 1_m * 1_m),
+      environment::NuclearComposition(
+          std::vector<particles::Code>{particles::Code::Nitrogen,
+                                       particles::Code::Oxygen},
+          std::vector<float>{1.f - fox, fox}));
+
+  auto innerMedium =
+      setup::Environment::CreateNode<Sphere>(Point{rootCS, 0_m, 0_m, 0_m}, 5000_m);
 
   innerMedium->SetModelProperties(props);
 
diff --git a/Documentation/Examples/cascade_proton_example.cc b/Documentation/Examples/cascade_proton_example.cc
index 4ca053f37..51433db11 100644
--- a/Documentation/Examples/cascade_proton_example.cc
+++ b/Documentation/Examples/cascade_proton_example.cc
@@ -49,7 +49,6 @@ using namespace corsika::process;
 using namespace corsika::units;
 using namespace corsika::particles;
 using namespace corsika::random;
-using namespace corsika::setup;
 using namespace corsika::geometry;
 using namespace corsika::environment;
 
@@ -70,24 +69,27 @@ int main() {
   random::RNGManager::GetInstance().RegisterRandomStream("cascade");
 
   // setup environment, geometry
-  using EnvType = Environment<setup::IEnvironmentModel>;
+  using EnvType = setup::Environment;
   EnvType env;
   auto& universe = *(env.GetUniverse());
+  const CoordinateSystem& rootCS = env.GetCoordinateSystem();
 
   auto theMedium =
-      EnvType::CreateNode<Sphere>(Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m},
+      EnvType::CreateNode<Sphere>(Point{rootCS, 0_m, 0_m, 0_m},
                                   1_km * std::numeric_limits<double>::infinity());
 
-  using MyHomogeneousModel = HomogeneousMedium<IMediumModel>;
+  using MyHomogeneousModel =
+      environment::UniformMediumType<environment::UniformMagneticField<
+          environment::HomogeneousMedium<setup::EnvironmentInterface>>>;
+  
   theMedium->SetModelProperties<MyHomogeneousModel>(
+      environment::EMediumType::eAir, geometry::Vector(rootCS, 0_T, 0_T, 1_T),
       1_kg / (1_m * 1_m * 1_m),
       NuclearComposition(std::vector<particles::Code>{particles::Code::Hydrogen},
                          std::vector<float>{(float)1.}));
 
   universe.AddChild(std::move(theMedium));
 
-  const CoordinateSystem& rootCS = env.GetCoordinateSystem();
-
   // setup particle stack, and add primary particle
   setup::Stack stack;
   stack.Clear();
diff --git a/Documentation/Examples/em_shower.cc b/Documentation/Examples/em_shower.cc
index c41d45747..05863e543 100644
--- a/Documentation/Examples/em_shower.cc
+++ b/Documentation/Examples/em_shower.cc
@@ -42,7 +42,6 @@ using namespace corsika::process;
 using namespace corsika::units;
 using namespace corsika::particles;
 using namespace corsika::random;
-using namespace corsika::setup;
 using namespace corsika::geometry;
 using namespace corsika::environment;
 
@@ -55,6 +54,9 @@ void registerRandomStreams() {
   random::RNGManager::GetInstance().SeedAll();
 }
 
+template <typename T>
+using MEnv = environment::UniformMediumType<environment::UniformMagneticField<T>>;
+
 int main(int argc, char** argv) {
 
   logging::SetLevel(logging::level::info);
@@ -68,20 +70,30 @@ int main(int argc, char** argv) {
   registerRandomStreams();
 
   // setup environment, geometry
-  using EnvType = Environment<setup::IEnvironmentModel>;
+  using EnvType = setup::Environment;
   EnvType env;
   const CoordinateSystem& rootCS = env.GetCoordinateSystem();
   Point const center{rootCS, 0_m, 0_m, 0_m};
-  environment::LayeredSphericalAtmosphereBuilder builder{center};
+  environment::LayeredSphericalAtmosphereBuilder<setup::EnvironmentInterface> builder{
+      center};
   builder.setNuclearComposition(
       {{particles::Code::Nitrogen, particles::Code::Oxygen},
        {0.7847f, 1.f - 0.7847f}}); // values taken from AIRES manual, Ar removed for now
 
-  builder.addExponentialLayer(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km);
-  builder.addExponentialLayer(1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km);
-  builder.addExponentialLayer(1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km);
-  builder.addExponentialLayer(540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km);
-  builder.addLinearLayer(1e9_cm, 112.8_km);
+  builder.addExponentialLayer<MEnv>(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km,
+                                    environment::EMediumType::eAir,
+                                    geometry::Vector(rootCS, 0_T, 0_T, 1_T));
+  builder.addExponentialLayer<MEnv>(1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km,
+                                    environment::EMediumType::eAir,
+                                    geometry::Vector(rootCS, 0_T, 0_T, 1_T));
+  builder.addExponentialLayer<MEnv>(1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km,
+                                    environment::EMediumType::eAir,
+                                    geometry::Vector(rootCS, 0_T, 0_T, 1_T));
+  builder.addExponentialLayer<MEnv>(540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km,
+                                    environment::EMediumType::eAir,
+                                    geometry::Vector(rootCS, 0_T, 0_T, 1_T));
+  builder.addLinearLayer<MEnv>(1e9_cm, 112.8_km, environment::EMediumType::eAir,
+                               geometry::Vector(rootCS, 0_T, 0_T, 1_T));
 
   builder.assemble(env);
 
diff --git a/Documentation/Examples/vertical_EAS.cc b/Documentation/Examples/vertical_EAS.cc
index 14eeea8b9..6c602705b 100644
--- a/Documentation/Examples/vertical_EAS.cc
+++ b/Documentation/Examples/vertical_EAS.cc
@@ -53,7 +53,6 @@ using namespace corsika::process;
 using namespace corsika::units;
 using namespace corsika::particles;
 using namespace corsika::random;
-using namespace corsika::setup;
 using namespace corsika::geometry;
 using namespace corsika::environment;
 
@@ -76,6 +75,10 @@ void registerRandomStreams(const int seed) {
     random::RNGManager::GetInstance().SeedAll(seed);
 }
 
+template <typename T>
+using MEnv = environment::UniformMediumType<environment::UniformMagneticField<T>>;
+
+
 int main(int argc, char** argv) {
 
   logging::SetLevel(logging::level::info);
@@ -95,20 +98,29 @@ int main(int argc, char** argv) {
   registerRandomStreams(seed);
 
   // setup environment, geometry
-  using EnvType = Environment<setup::IEnvironmentModel>;
+  using EnvType = setup::Environment;
   EnvType env;
   const CoordinateSystem& rootCS = env.GetCoordinateSystem();
   Point const center{rootCS, 0_m, 0_m, 0_m};
-  environment::LayeredSphericalAtmosphereBuilder builder{center};
+  environment::LayeredSphericalAtmosphereBuilder<setup::EnvironmentInterface> builder{center};
   builder.setNuclearComposition(
       {{particles::Code::Nitrogen, particles::Code::Oxygen},
        {0.7847f, 1.f - 0.7847f}}); // values taken from AIRES manual, Ar removed for now
 
-  builder.addExponentialLayer(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km);
-  builder.addExponentialLayer(1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km);
-  builder.addExponentialLayer(1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km);
-  builder.addExponentialLayer(540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km);
-  builder.addLinearLayer(1e9_cm, 112.8_km);
+  builder.addExponentialLayer<MEnv>(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km,
+                                    environment::EMediumType::eAir,
+                                    geometry::Vector(rootCS, 0_T, 0_T, 1_T));
+  builder.addExponentialLayer<MEnv>(1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km,
+                                    environment::EMediumType::eAir,
+                                    geometry::Vector(rootCS, 0_T, 0_T, 1_T));
+  builder.addExponentialLayer<MEnv>(1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km,
+                                    environment::EMediumType::eAir,
+                                    geometry::Vector(rootCS, 0_T, 0_T, 1_T));
+  builder.addExponentialLayer<MEnv>(540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km,
+                                    environment::EMediumType::eAir,
+                                    geometry::Vector(rootCS, 0_T, 0_T, 1_T));
+  builder.addLinearLayer<MEnv>(1e9_cm, 112.8_km, environment::EMediumType::eAir,
+                               geometry::Vector(rootCS, 0_T, 0_T, 1_T));
 
   builder.assemble(env);
 
diff --git a/Processes/CONEXSourceCut/testCONEXSourceCut.cc b/Processes/CONEXSourceCut/testCONEXSourceCut.cc
index f70d54789..30831eed6 100644
--- a/Processes/CONEXSourceCut/testCONEXSourceCut.cc
+++ b/Processes/CONEXSourceCut/testCONEXSourceCut.cc
@@ -10,8 +10,8 @@
 
 #include <corsika/environment/Environment.h>
 #include <corsika/environment/LayeredSphericalAtmosphereBuilder.h>
-#include <corsika/environment/UniformMediumType.h>
 #include <corsika/environment/UniformMagneticField.h>
+#include <corsika/environment/UniformMediumType.h>
 
 #include <corsika/geometry/Point.h>
 #include <corsika/geometry/RootCoordinateSystem.h>
@@ -35,6 +35,9 @@ using namespace corsika::environment;
 using namespace corsika::geometry;
 using namespace corsika::units::si;
 
+template <typename T>
+using MEnv = environment::UniformMediumType<environment::UniformMagneticField<T>>;
+
 TEST_CASE("CONEXSourceCut") {
   random::RNGManager::GetInstance().RegisterRandomStream("cascade");
   random::RNGManager::GetInstance().RegisterRandomStream("sibyll");
@@ -43,22 +46,30 @@ TEST_CASE("CONEXSourceCut") {
 
   // setup environment, geometry
   setup::Environment env;
-  auto& universe = *(env.GetUniverse());
-  using EnvironmentModel = environment::UniformMediumType<environment::UniformMagneticField<environment::InhomogeneousMedium<setup::IEnvironment>>>;
-
   const CoordinateSystem& rootCS = env.GetCoordinateSystem();
   Point const center{rootCS, 0_m, 0_m, 0_m};
-  environment::LayeredSphericalAtmosphereBuilder builder{center, conex::earthRadius};
-  
+
+  environment::LayeredSphericalAtmosphereBuilder<setup::EnvironmentInterface> builder{
+      center, conex::earthRadius};
+
   builder.setNuclearComposition(
       {{particles::Code::Nitrogen, particles::Code::Oxygen},
        {0.7847f, 1.f - 0.7847f}}); // values taken from AIRES manual, Ar removed for now
 
-  builder.addExponentialLayer(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km);
-  builder.addExponentialLayer(1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km);
-  builder.addExponentialLayer(1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km);
-  builder.addExponentialLayer(540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km);
-  builder.addLinearLayer(1e9_cm, 112.8_km);
+  builder.addExponentialLayer<MEnv>(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km,
+                                    environment::EMediumType::eAir,
+                                    geometry::Vector(rootCS, 0_T, 0_T, 1_T));
+  builder.addExponentialLayer<MEnv>(1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km,
+                                    environment::EMediumType::eAir,
+                                    geometry::Vector(rootCS, 0_T, 0_T, 1_T));
+  builder.addExponentialLayer<MEnv>(1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km,
+                                    environment::EMediumType::eAir,
+                                    geometry::Vector(rootCS, 0_T, 0_T, 1_T));
+  builder.addExponentialLayer<MEnv>(540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km,
+                                    environment::EMediumType::eAir,
+                                    geometry::Vector(rootCS, 0_T, 0_T, 1_T));
+  builder.addLinearLayer<MEnv>(1e9_cm, 112.8_km, environment::EMediumType::eAir,
+                               geometry::Vector(rootCS, 0_T, 0_T, 1_T));
 
   builder.assemble(env);
 
diff --git a/Processes/InteractionCounter/testInteractionCounter.cc b/Processes/InteractionCounter/testInteractionCounter.cc
index af43fe63e..f8ded748c 100644
--- a/Processes/InteractionCounter/testInteractionCounter.cc
+++ b/Processes/InteractionCounter/testInteractionCounter.cc
@@ -27,69 +27,6 @@ using namespace corsika::process::interaction_counter;
 using namespace corsika::units;
 using namespace corsika::units::si;
 
-auto setupEnvironment(particles::Code target_code) {
-  // setup environment, geometry
-  auto env = std::make_unique<environment::Environment<environment::IMediumModel>>();
-  auto& universe = *(env->GetUniverse());
-  const geometry::CoordinateSystem& cs = env->GetCoordinateSystem();
-
-  auto theMedium =
-      environment::Environment<environment::IMediumModel>::CreateNode<geometry::Sphere>(
-          geometry::Point{cs, 0_m, 0_m, 0_m},
-          1_km * std::numeric_limits<double>::infinity());
-
-  using MyHomogeneousModel = environment::HomogeneousMedium<environment::IMediumModel>;
-  theMedium->SetModelProperties<MyHomogeneousModel>(
-      1_kg / (1_m * 1_m * 1_m),
-      environment::NuclearComposition(std::vector<particles::Code>{target_code},
-                                      std::vector<float>{1.}));
-
-  auto const* nodePtr = theMedium.get();
-  universe.AddChild(std::move(theMedium));
-
-  return std::make_tuple(std::move(env), &cs, nodePtr);
-}
-
-template <typename TNodeType>
-auto setupStack(int vA, int vZ, HEPEnergyType vMomentum, TNodeType* vNodePtr,
-                geometry::CoordinateSystem const& cs) {
-  auto stack = std::make_unique<setup::Stack>();
-  auto constexpr mN = corsika::units::constants::nucleonMass;
-
-  geometry::Point const origin(cs, {0_m, 0_m, 0_m});
-  corsika::stack::MomentumVector const pLab(cs, {vMomentum, 0_GeV, 0_GeV});
-
-  HEPEnergyType const E0 = sqrt(units::static_pow<2>(mN * vA) + pLab.squaredNorm());
-  setup::Stack::StackIterator particle =
-      stack->AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType,
-                                    corsika::stack::MomentumVector, geometry::Point,
-                                    units::si::TimeType, unsigned short, unsigned short>{
-          particles::Code::Nucleus, E0, pLab, origin, 0_ns, vA, vZ});
-
-  particle.SetNode(vNodePtr);
-  return std::make_tuple(
-      std::move(stack), std::make_unique<decltype(setup::StackView(particle))>(particle));
-}
-
-template <typename TNodeType>
-auto setupStack(particles::Code vProjectileType, HEPEnergyType vMomentum,
-                TNodeType* vNodePtr, geometry::CoordinateSystem const& cs) {
-  auto stack = std::make_unique<setup::Stack>();
-
-  geometry::Point const origin(cs, {0_m, 0_m, 0_m});
-  corsika::stack::MomentumVector const pLab(cs, {vMomentum, 0_GeV, 0_GeV});
-
-  HEPEnergyType const E0 = sqrt(
-      units::static_pow<2>(particles::GetMass(vProjectileType)) + pLab.squaredNorm());
-  auto particle = stack->AddParticle(
-      std::tuple<particles::Code, units::si::HEPEnergyType,
-                 corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{
-          vProjectileType, E0, pLab, origin, 0_ns});
-
-  particle.SetNode(vNodePtr);
-  return std::make_tuple(
-      std::move(stack), std::make_unique<decltype(setup::StackView(particle))>(particle));
-}
 
 struct DummyProcess {
   template <typename TParticle>
@@ -114,12 +51,12 @@ TEST_CASE("InteractionCounter") {
     REQUIRE(countedProcess.GetInteractionLength(nullptr) == 100_g / 1_cm / 1_cm);
   }
 
-  auto [env, csPtr, nodePtr] = setupEnvironment(particles::Code::Oxygen);
+  auto [env, csPtr, nodePtr] = setup::testing::setupEnvironment(particles::Code::Oxygen);
   [[maybe_unused]] auto& env_dummy = env;
 
   SECTION("DoInteraction nucleus") {
     unsigned short constexpr A = 14, Z = 7;
-    auto [stackPtr, secViewPtr] = setupStack(A, Z, 105_TeV, nodePtr, *csPtr);
+    auto [stackPtr, secViewPtr] = setup::testing::setupStack(particles::Code::Nucleus, A, Z, 105_TeV, nodePtr, *csPtr);
     REQUIRE(stackPtr->getEntries() == 1);
     REQUIRE(secViewPtr->getEntries() == 0);
 
@@ -139,7 +76,7 @@ TEST_CASE("InteractionCounter") {
   SECTION("DoInteraction Lambda") {
     auto constexpr code = particles::Code::Lambda0;
     auto constexpr codeInt = static_cast<particles::CodeIntType>(code);
-    auto [stackPtr, secViewPtr] = setupStack(code, 105_TeV, nodePtr, *csPtr);
+    auto [stackPtr, secViewPtr] = setup::testing::setupStack(code, 0,0, 105_TeV, nodePtr, *csPtr);
     REQUIRE(stackPtr->getEntries() == 1);
     REQUIRE(secViewPtr->getEntries() == 0);
 
diff --git a/Processes/OnShellCheck/testOnShellCheck.cc b/Processes/OnShellCheck/testOnShellCheck.cc
index 0d45b1e29..77c64e178 100644
--- a/Processes/OnShellCheck/testOnShellCheck.cc
+++ b/Processes/OnShellCheck/testOnShellCheck.cc
@@ -27,7 +27,7 @@ using namespace corsika::units::si;
 
 TEST_CASE("OnShellCheck", "[processes]") {
   feenableexcept(FE_INVALID);
-  using EnvType = environment::Environment<setup::IEnvironmentModel>;
+  using EnvType = setup::Environment;
   EnvType env;
   const geometry::CoordinateSystem& rootCS = env.GetCoordinateSystem();
 
diff --git a/Processes/ParticleCut/testParticleCut.cc b/Processes/ParticleCut/testParticleCut.cc
index 921eecc3e..adb0cef9f 100644
--- a/Processes/ParticleCut/testParticleCut.cc
+++ b/Processes/ParticleCut/testParticleCut.cc
@@ -26,7 +26,8 @@ using namespace corsika::units::si;
 
 TEST_CASE("ParticleCut", "[processes]") {
   feenableexcept(FE_INVALID);
-  using EnvType = environment::Environment<setup::IEnvironmentModel>;
+  using EnvType = setup::Environment;
+
   EnvType env;
   const geometry::CoordinateSystem& rootCS = env.GetCoordinateSystem();
 
diff --git a/Processes/Proposal/ContinuousProcess.cc b/Processes/Proposal/ContinuousProcess.cc
index 371f28262..5d758be3b 100644
--- a/Processes/Proposal/ContinuousProcess.cc
+++ b/Processes/Proposal/ContinuousProcess.cc
@@ -44,7 +44,7 @@ namespace corsika::process::proposal {
   }
 
   template <>
-  ContinuousProcess::ContinuousProcess(setup::SetupEnvironment const& _env,
+  ContinuousProcess::ContinuousProcess(setup::Environment const& _env,
                                        corsika::units::si::HEPEnergyType _emCut)
       : ProposalProcessBase(_env, _emCut) {}
 
diff --git a/Processes/Proposal/Interaction.cc b/Processes/Proposal/Interaction.cc
index b2417b426..f5ce68a80 100644
--- a/Processes/Proposal/Interaction.cc
+++ b/Processes/Proposal/Interaction.cc
@@ -22,7 +22,7 @@
 namespace corsika::process::proposal {
 
   template <>
-  Interaction::Interaction(setup::SetupEnvironment const& _env,
+  Interaction::Interaction(setup::Environment const& _env,
                            corsika::units::si::HEPEnergyType _emCut)
       : ProposalProcessBase(_env, _emCut) {}
 
diff --git a/Processes/Proposal/ProposalProcessBase.cc b/Processes/Proposal/ProposalProcessBase.cc
index 240c59d77..66a749bef 100644
--- a/Processes/Proposal/ProposalProcessBase.cc
+++ b/Processes/Proposal/ProposalProcessBase.cc
@@ -26,7 +26,7 @@ namespace corsika::process::proposal {
     return false;
   }
 
-  ProposalProcessBase::ProposalProcessBase(setup::SetupEnvironment const& _env,
+  ProposalProcessBase::ProposalProcessBase(setup::Environment const& _env,
                                            corsika::units::si::HEPEnergyType _emCut)
       : emCut_(_emCut)
       , fRNG(corsika::random::RNGManager::GetInstance().GetRandomStream("proposal")) {
diff --git a/Processes/Proposal/ProposalProcessBase.h b/Processes/Proposal/ProposalProcessBase.h
index 17c6b22d6..6346721e7 100644
--- a/Processes/Proposal/ProposalProcessBase.h
+++ b/Processes/Proposal/ProposalProcessBase.h
@@ -89,7 +89,7 @@ namespace corsika::process::proposal {
     //! Store cut and  nuclear composition of the whole universe in media which are
     //! required for creating crosssections by proposal.
     //!
-    ProposalProcessBase(corsika::setup::SetupEnvironment const& _env,
+    ProposalProcessBase(corsika::setup::Environment const& _env,
                         corsika::units::si::HEPEnergyType _emCut);
 
     //!
diff --git a/Processes/Pythia/testPythia8.cc b/Processes/Pythia/testPythia8.cc
index a0af2a46a..0019fdf0b 100644
--- a/Processes/Pythia/testPythia8.cc
+++ b/Processes/Pythia/testPythia8.cc
@@ -101,15 +101,19 @@ auto sumMomentum(TStackView const& view, geometry::CoordinateSystem const& vCS)
 
 TEST_CASE("pythia process") {
 
-  auto [env, csPtr, nodePtr] = testing::setupEnvironment(particles::Code::Oxygen);
+  auto [env, csPtr, nodePtr] = setup::testing::setupEnvironment(particles::Code::Oxygen);
   auto const& cs = *csPtr;
   [[maybe_unused]] auto const& env_dummy = env;
   [[maybe_unused]] auto const& node_dummy = nodePtr;
   
   SECTION("pythia decay") {
     feenableexcept(FE_INVALID);
-    auto [stackPtr, secViewPtr] = testing::setupStack(code::PiPlus, 0, 0, 10_GeV, nodePtr, *csPtr);
-    auto projectile = secViewPtr->GetProjectile();
+    const HEPEnergyType P0 = 10_GeV;
+    auto [stackPtr, secViewPtr] = setup::testing::setupStack(particles::Code::PiPlus, 0, 0, P0, nodePtr, *csPtr);
+    const auto plab = corsika::stack::MomentumVector(cs, {P0, 0_eV, 0_eV}); // this is secret knowledge about setupStack
+    auto& stack = *stackPtr;
+    auto& view = *secViewPtr;
+    auto particle = stackPtr->first();
 
     random::RNGManager::GetInstance().RegisterRandomStream("pythia");
 
@@ -150,8 +154,9 @@ TEST_CASE("pythia process") {
   SECTION("pythia interaction") {
 
     feenableexcept(FE_INVALID);
-    auto [stackPtr, secViewPtr] = testing::setupStack(code::PiPlus, 0, 0, 100_GeV, nodePtr, *csPtr);
-    auto projectile = secViewPtr->GetProjectile();
+    auto [stackPtr, secViewPtr] = setup::testing::setupStack(particles::Code::PiPlus, 0, 0, 100_GeV, nodePtr, *csPtr);
+    auto& view = *secViewPtr;
+    auto particle = stackPtr->first();
 
     process::pythia::Interaction model;
 
diff --git a/Processes/QGSJetII/testQGSJetII.cc b/Processes/QGSJetII/testQGSJetII.cc
index 7f9af0675..9a3fd1bc0 100644
--- a/Processes/QGSJetII/testQGSJetII.cc
+++ b/Processes/QGSJetII/testQGSJetII.cc
@@ -122,10 +122,11 @@ TEST_CASE("QgsjetII", "[processes]") {
 
 using namespace corsika::units::si;
 using namespace corsika::units;
+using namespace corsika;
 
 TEST_CASE("QgsjetIIInterface", "[processes]") {
 
-  auto [env, csPtr, nodePtr] = testing::setupEnvironment(particles::Code::Oxygen);
+  auto [env, csPtr, nodePtr] = setup::testing::setupEnvironment(particles::Code::Oxygen);
   auto const& cs = *csPtr;
   [[maybe_unused]] auto const& env_dummy = env;
   [[maybe_unused]] auto const& node_dummy = nodePtr;
@@ -135,13 +136,15 @@ TEST_CASE("QgsjetIIInterface", "[processes]") {
   SECTION("InteractionInterface") {
 
     auto [stackPtr, secViewPtr] =
-      testing::setupStack(particles::Code::Proton, 0,0, 110_GeV, nodePtr, *csPtr);
-    auto projectile = view.GetProjectile();
+      setup::testing::setupStack(particles::Code::Proton, 0,0, 110_GeV, nodePtr, *csPtr);
+    const auto& view = *secViewPtr;
+    auto particle = stackPtr->first();
+    auto projectile = secViewPtr->GetProjectile();
     auto const projectileMomentum = projectile.GetMomentum();
 
     Interaction model;
 
-    [[maybe_unused]] const process::EProcessReturn ret = model.DoInteraction(view);
+    [[maybe_unused]] const process::EProcessReturn ret = model.DoInteraction(*secViewPtr);
     [[maybe_unused]] const GrammageType length = model.GetInteractionLength(particle);
 
     CHECK(length / (1_g / square(1_cm)) == Approx(93.47).margin(0.1));
diff --git a/Processes/Sibyll/NuclearInteraction.cc b/Processes/Sibyll/NuclearInteraction.cc
index b87d02e5a..51d33a614 100644
--- a/Processes/Sibyll/NuclearInteraction.cc
+++ b/Processes/Sibyll/NuclearInteraction.cc
@@ -29,15 +29,14 @@ using std::tuple;
 using std::vector;
 
 using namespace corsika;
-using namespace corsika::setup;
 using Particle = corsika::setup::Stack::ParticleType; // StackIterator; // ParticleType;
 using View = corsika::setup::StackView;               // StackView::ParticleType;
-using Track = Trajectory;
+using Track = setup::Trajectory;
 
 namespace corsika::process::sibyll {
 
   template <>
-  NuclearInteraction<SetupEnvironment>::~NuclearInteraction() {
+  NuclearInteraction<setup::Environment>::~NuclearInteraction() {
     C8LOG_DEBUG(
         fmt::format("Nuclib::NuclearInteraction n={} Nnuc={}", count_, nucCount_));
   }
@@ -306,7 +305,7 @@ namespace corsika::process::sibyll {
 
   template <>
   template <>
-  process::EProcessReturn NuclearInteraction<SetupEnvironment>::DoInteraction(
+  process::EProcessReturn NuclearInteraction<setup::Environment>::DoInteraction(
       View& view) {
 
     // this routine superimposes different nucleon-nucleon interactions
diff --git a/Processes/Sibyll/testSibyll.cc b/Processes/Sibyll/testSibyll.cc
index ccdb4b651..1a7722805 100644
--- a/Processes/Sibyll/testSibyll.cc
+++ b/Processes/Sibyll/testSibyll.cc
@@ -96,7 +96,7 @@ auto sumMomentum(TStackView const& view, geometry::CoordinateSystem const& vCS)
 
 TEST_CASE("SibyllInterface", "[processes]") {
 
-  auto [env, csPtr, nodePtr] = testing::setupEnvironment(particles::Code::Oxygen);
+  auto [env, csPtr, nodePtr] = setup::testing::setupEnvironment(particles::Code::Oxygen);
   auto const& cs = *csPtr;
   [[maybe_unused]] auto const& env_dummy = env;
   [[maybe_unused]] auto const& node_dummy = nodePtr;
@@ -105,13 +105,16 @@ TEST_CASE("SibyllInterface", "[processes]") {
 
   SECTION("InteractionInterface - low energy") {
 
-    auto [stack, view] = testing::setupStack(particles::Code::Proton, 60_GeV, nodePtr, cs);
-    auto projectile = view.GetProjectile();
-
+    const HEPEnergyType P0 = 60_GeV;
+    auto [stack, view] = setup::testing::setupStack(particles::Code::Proton, 0,0, P0, nodePtr, cs);
+    const auto plab = corsika::stack::MomentumVector(cs, {P0, 0_eV, 0_eV}); // this is secret knowledge about setupStack
+    
+    auto particle = stack->first();
+    
     Interaction model;
 
-    [[maybe_unused]] const process::EProcessReturn ret = model.DoInteraction(view);
-    auto const pSum = sumMomentum(view, cs);
+    [[maybe_unused]] const process::EProcessReturn ret = model.DoInteraction(*view);
+    auto const pSum = sumMomentum(*view, cs);
 
     /*
       Interactions between hadrons (h) and nuclei (A) in Sibyll are treated in the
@@ -180,26 +183,27 @@ TEST_CASE("SibyllInterface", "[processes]") {
 
   SECTION("NuclearInteractionInterface") {
 
-    auto [stack, view] = testing::setupStack(particles::Code::Nucleus, 4, 2, 100_GeV, nodePtr, cs);
-    auto projectile = view.GetProjectile();
+    auto [stack, view] = setup::testing::setupStack(particles::Code::Nucleus, 4, 2, 100_GeV, nodePtr, cs);
+    auto particle = stack->first();
 
     Interaction hmodel;
-    NuclearInteraction model(hmodel, env);
+    NuclearInteraction model(hmodel, *env);
 
-    [[maybe_unused]] const process::EProcessReturn ret = model.DoInteraction(view);
+    [[maybe_unused]] const process::EProcessReturn ret = model.DoInteraction(*view);
     [[maybe_unused]] const GrammageType length = model.GetInteractionLength(particle);
   }
 
   SECTION("DecayInterface") {
 
-    auto [stack, view] = testing::setupStack(particles::Code::Lambda0, 0,0, 10_GeV, nodePtr, cs);
-    auto projectile = view.GetProjectile();
+    auto [stackPtr, view] = setup::testing::setupStack(particles::Code::Lambda0, 0,0, 10_GeV, nodePtr, cs);
+    auto& stack = *stackPtr; 
+    auto particle = stack.first();
 
     Decay model;
     model.PrintDecayConfig();
     [[maybe_unused]] const TimeType time = model.GetLifetime(particle);
 
-    /*[[maybe_unused]] const process::EProcessReturn ret =*/model.DoDecay(projectile);
+    /*[[maybe_unused]] const process::EProcessReturn ret =*/model.DoDecay(*view);
     // run checks
     // lambda decays into proton and pi- or neutron and pi+
     CHECK(stack.getEntries() == 3);
diff --git a/Processes/StackInspector/testStackInspector.cc b/Processes/StackInspector/testStackInspector.cc
index d76d9fd09..9814efa02 100644
--- a/Processes/StackInspector/testStackInspector.cc
+++ b/Processes/StackInspector/testStackInspector.cc
@@ -37,11 +37,9 @@ TEST_CASE("StackInspector", "[processes]") {
   stack.Clear();
   HEPEnergyType E0 = 100_GeV;
   stack.AddParticle(
-      std::tuple<particles::Code, units::si::HEPEnergyType,
-                 corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{
-          particles::Code::Electron, E0,
-          corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, -1_GeV}),
-          Point(rootCS, {0_m, 0_m, 10_km}), 0_ns});
+      std::make_tuple(particles::Code::Electron, E0,
+                      corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, -1_GeV}),
+                      Point(rootCS, {0_m, 0_m, 10_km}), 0_ns));
 
   SECTION("interface") {
 
diff --git a/Processes/UrQMD/testUrQMD.cc b/Processes/UrQMD/testUrQMD.cc
index 7bd929e3e..85616887e 100644
--- a/Processes/UrQMD/testUrQMD.cc
+++ b/Processes/UrQMD/testUrQMD.cc
@@ -67,7 +67,7 @@ TEST_CASE("UrQMD") {
   UrQMD urqmd;
 
   SECTION("interaction length") {
-    auto [env, csPtr, nodePtr] = testing::setupEnvironment(particles::Code::Nitrogen);
+    auto [env, csPtr, nodePtr] = setup::testing::setupEnvironment(particles::Code::Nitrogen);
     auto const& cs = *csPtr;
     [[maybe_unused]] auto const& env_dummy = env;
     [[maybe_unused]] auto const& node_dummy = nodePtr;
@@ -78,7 +78,7 @@ TEST_CASE("UrQMD") {
         particles::Code::K0,      particles::Code::K0Bar,   particles::Code::K0Long};
 
     for (auto code : validProjectileCodes) {
-      auto [stack, view] = setupStack(code, 100_GeV, nodePtr, cs);
+      auto [stack, view] = setup::testing::setupStack(code, 0,0, 100_GeV, nodePtr, cs);
       REQUIRE(stack->getEntries() == 1);
       REQUIRE(view->getEntries() == 0);
 
@@ -89,12 +89,12 @@ TEST_CASE("UrQMD") {
   }
 
   SECTION("nucleus projectile") {
-    auto [env, csPtr, nodePtr] = testing::setupEnvironment(particles::Code::Oxygen);
+    auto [env, csPtr, nodePtr] = setup::testing::setupEnvironment(particles::Code::Oxygen);
     [[maybe_unused]] auto const& env_dummy = env;      // against warnings
     [[maybe_unused]] auto const& node_dummy = nodePtr; // against warnings
 
     unsigned short constexpr A = 14, Z = 7;
-    auto [stackPtr, secViewPtr] = setupStack(code::Nucleus, A, Z, 400_GeV, nodePtr, *csPtr);
+    auto [stackPtr, secViewPtr] = setup::testing::setupStack(particles::Code::Nucleus, A, Z, 400_GeV, nodePtr, *csPtr);
     REQUIRE(stackPtr->getEntries() == 1);
     REQUIRE(secViewPtr->getEntries() == 0);
 
@@ -113,12 +113,12 @@ TEST_CASE("UrQMD") {
   }
 
   SECTION("\"special\" projectile") {
-    auto [env, csPtr, nodePtr] = testing::setupEnvironment(particles::Code::Oxygen);
+    auto [env, csPtr, nodePtr] = setup::testing::setupEnvironment(particles::Code::Oxygen);
     [[maybe_unused]] auto const& env_dummy = env;      // against warnings
     [[maybe_unused]] auto const& node_dummy = nodePtr; // against warnings
 
     auto [stackPtr, secViewPtr] =
-      setupStack(particles::Code::PiPlus, 0,0, 400_GeV, nodePtr, *csPtr);
+      setup::testing::setupStack(particles::Code::PiPlus, 0,0, 400_GeV, nodePtr, *csPtr);
     REQUIRE(stackPtr->getEntries() == 1);
     REQUIRE(secViewPtr->getEntries() == 0);
 
@@ -139,12 +139,12 @@ TEST_CASE("UrQMD") {
   }
 
   SECTION("K0Long projectile") {
-    auto [env, csPtr, nodePtr] = testing::setupEnvironment(particles::Code::Oxygen);
+    auto [env, csPtr, nodePtr] = setup::testing::setupEnvironment(particles::Code::Oxygen);
     [[maybe_unused]] auto const& env_dummy = env;      // against warnings
     [[maybe_unused]] auto const& node_dummy = nodePtr; // against warnings
 
     auto [stackPtr, secViewPtr] =
-      setupStack(particles::Code::K0Long,0,0, 400_GeV, nodePtr, *csPtr);
+      setup::testing::setupStack(particles::Code::K0Long,0,0, 400_GeV, nodePtr, *csPtr);
     REQUIRE(stackPtr->getEntries() == 1);
     REQUIRE(secViewPtr->getEntries() == 0);
 
diff --git a/Setup/SetupEnvironment.h b/Setup/SetupEnvironment.h
index 3e141455d..44b8ac261 100644
--- a/Setup/SetupEnvironment.h
+++ b/Setup/SetupEnvironment.h
@@ -39,7 +39,7 @@ namespace corsika::setup {
  */
 namespace corsika::setup::testing {
 
-  auto setupEnvironment(particles::Code vTargetCode) {
+  inline auto setupEnvironment(particles::Code vTargetCode) {
 
     using namespace corsika::units::si;
     using namespace corsika;
diff --git a/Setup/SetupStack.h b/Setup/SetupStack.h
index 91aa03417..1431c5dd5 100644
--- a/Setup/SetupStack.h
+++ b/Setup/SetupStack.h
@@ -26,9 +26,8 @@ namespace corsika::setup {
     // the GeometryNode stack needs to know the type of geometry-nodes from the
     // environment:
     template <typename TStackIter>
-    using SetupGeometryDataInterface =
-        typename stack::node::MakeGeometryDataInterface<TStackIter,
-                                                        setup::SetupEnvironment>::type;
+    using SetupGeometryDataInterface = typename stack::node::MakeGeometryDataInterface<
+        TStackIter, corsika::setup::Environment>::type;
 
     // combine particle data stack with geometry information for tracking
     template <typename TStackIter>
@@ -38,7 +37,7 @@ namespace corsika::setup {
 
     using StackWithGeometry = corsika::stack::CombinedStack<
         typename corsika::stack::nuclear_extension::ParticleDataStack::StackImpl,
-        corsika::stack::node::GeometryData<setup::SetupEnvironment>,
+        corsika::stack::node::GeometryData<setup::Environment>,
         StackWithGeometryInterface>;
 
     // ------------------------------------------
@@ -132,16 +131,17 @@ namespace corsika::setup {
 
 } // namespace corsika::setup
 
-namespace corsika::setup::testing {
-
   /**
-   * standard setup for unit tests. This can be moved to "test"
+   * standard stack setup for unit tests. This can be moved to "test"
    * directory, when available.
    */
-  auto setupStack(particles::Code vProjectileType, int vA, int vZ,
-                  units::si::HEPEnergyType vMomentum,
-                  setup::Environment::BaseNodeType* vNodePtr,
-                  geometry::CoordinateSystem const& cs) {
+
+namespace corsika::setup::testing {
+
+  inline auto setupStack(particles::Code vProjectileType, int vA, int vZ,
+			 units::si::HEPEnergyType vMomentum,
+			 const setup::Environment::BaseNodeType* vNodePtr,
+			 geometry::CoordinateSystem const& cs) {
 
     using namespace corsika;
     using namespace corsika::units::si;
-- 
GitLab