From a6166bbbe13008e9f159f1fe63b46d3192484441 Mon Sep 17 00:00:00 2001
From: "felix@home" <felix.riehn@kit.edu>
Date: Mon, 13 May 2019 20:24:33 +0100
Subject: [PATCH] added ParticleCut test

---
 Processes/ParticleCut/testParticleCut.cc | 77 ++++++++++++++++++------
 1 file changed, 57 insertions(+), 20 deletions(-)

diff --git a/Processes/ParticleCut/testParticleCut.cc b/Processes/ParticleCut/testParticleCut.cc
index f315cb17e..c1a69696f 100644
--- a/Processes/ParticleCut/testParticleCut.cc
+++ b/Processes/ParticleCut/testParticleCut.cc
@@ -34,39 +34,76 @@ TEST_CASE("ParticleCut", "[processes]") {
   using EnvType = environment::Environment<setup::IEnvironmentModel>;
   EnvType env;
   const geometry::CoordinateSystem& rootCS = env.GetCoordinateSystem();
-  SECTION("cut") {
+
+  // setup empty particle stack
+  setup::Stack stack;
+  stack.Clear();
+  // two energies
+  const HEPEnergyType Eabove = 1_TeV;
+  const HEPEnergyType Ebelow = 10_GeV;
+  // list of arbitrary particles
+  std::vector<particles::Code> particleList = {
+      particles::Code::PiPlus,   particles::Code::PiMinus, particles::Code::KPlus,
+      particles::Code::KMinus,   particles::Code::K0Long,  particles::Code::K0Short,
+      particles::Code::Electron, particles::Code::MuPlus,  particles::Code::NuE,
+      particles::Code::Neutron};
+
+  SECTION("cut invisible") {
 
     ParticleCut cut(20_GeV);
 
-    // setup particle stack, and add primary particle
-    setup::Stack stack;
-    stack.Clear();
-    const HEPEnergyType Eabove = 1_TeV;
-    const HEPEnergyType Ebelow = 10_GeV;
-    std::vector<particles::Code> particleList = {
-        particles::Code::PiPlus,   particles::Code::PiMinus, particles::Code::KPlus,
-        particles::Code::KMinus,   particles::Code::K0Long,  particles::Code::K0Short,
-        particles::Code::Electron, particles::Code::MuPlus,  particles::Code::NuE,
-        particles::Code::Neutron};
+    // add primary particle to stack
     auto particle = stack.AddParticle(
         std::tuple<particles::Code, units::si::HEPEnergyType,
                    corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{
-	  particles::Code::Proton, Eabove,
+            particles::Code::Proton, Eabove,
             corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}),
             geometry::Point(rootCS, 0_m, 0_m, 0_m), 0_ns});
-
+    // view on secondary particles
+    corsika::stack::SecondaryView view(particle);
+    // ref. to primary particle through the secondary view.
+    // only this way the secondary view is populated
+    auto projectile = view.GetProjectile();
+    // add secondaries, all with energies above the threshold
+    // only cut is by species
     for (auto proType : particleList)
-
-      particle.AddSecondary(std::tuple<particles::Code, units::si::HEPEnergyType,
-                                        corsika::stack::MomentumVector, geometry::Point,
-                                        units::si::TimeType>{
+      projectile.AddSecondary(std::tuple<particles::Code, units::si::HEPEnergyType,
+                                         corsika::stack::MomentumVector, geometry::Point,
+                                         units::si::TimeType>{
           proType, Eabove, corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}),
           geometry::Point(rootCS, 0_m, 0_m, 0_m), 0_ns});
 
-    //    auto secViewPtr = corsika::stack::SecondaryView(particle);
+    cut.DoSecondaries(view);
+
+    REQUIRE(view.GetSize() == 6);
+  }
+
+  SECTION("cut low energy") {
+    ParticleCut cut(20_GeV);
+
+    // add primary particle to stack
+    auto particle = stack.AddParticle(
+        std::tuple<particles::Code, units::si::HEPEnergyType,
+                   corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{
+            particles::Code::Proton, Eabove,
+            corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}),
+            geometry::Point(rootCS, 0_m, 0_m, 0_m), 0_ns});
+    // view on secondary particles
     corsika::stack::SecondaryView view(particle);
+    // ref. to primary particle through the secondary view.
+    // only this way the secondary view is populated
+    auto projectile = view.GetProjectile();
+    // add secondaries, all with energies below the threshold
+    // only cut is by species
+    for (auto proType : particleList)
+      projectile.AddSecondary(std::tuple<particles::Code, units::si::HEPEnergyType,
+                                         corsika::stack::MomentumVector, geometry::Point,
+                                         units::si::TimeType>{
+          proType, Ebelow, corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}),
+          geometry::Point(rootCS, 0_m, 0_m, 0_m), 0_ns});
+
     cut.DoSecondaries(view);
-    REQUIRE(stack.GetSize() == 1);
-    
+
+    REQUIRE(view.GetSize() == 0);
   }
 }
-- 
GitLab