From d699c7811bef44274c13632fb4061a01bb7160ed Mon Sep 17 00:00:00 2001
From: ralfulrich <ralf.ulrich@kit.edu>
Date: Fri, 11 Jun 2021 20:36:07 +0200
Subject: [PATCH] further unit testing

---
 .../modules/tracking/TrackingLeapFrogCurved.inl   |  5 ++++-
 tests/modules/testTracking.cpp                    | 15 +++++++++------
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/corsika/detail/modules/tracking/TrackingLeapFrogCurved.inl b/corsika/detail/modules/tracking/TrackingLeapFrogCurved.inl
index f96afdb1c..16b836967 100644
--- a/corsika/detail/modules/tracking/TrackingLeapFrogCurved.inl
+++ b/corsika/detail/modules/tracking/TrackingLeapFrogCurved.inl
@@ -112,11 +112,13 @@ namespace corsika {
                                     constants::c / (abs(charge) * magnitudeB);
 
       if (gyroradius > 1e9_m) {
+        // this cannot be really unit-tested. It is hidden. LCOV_EXCL_START
         CORSIKA_LOG_WARN(
             "CurvedLeapFrog is not very stable for extremely high gyroradius steps. "
             "Rg={} -> straight tracking.",
             gyroradius);
         return getLinearTrajectory(particle);
+        // LCOV_EXCL_STOP
       }
 
       double const maxRadians = 0.01; // maximally allowed deflection
@@ -168,7 +170,8 @@ namespace corsika {
 
       CORSIKA_LOG_TRACE("projectedDirectionSqrNorm={} T^2",
                         projectedDirectionSqrNorm / square(1_T));
-      if ((charge == 0 * constants::e) || magneticfield.getNorm() == 0_T || isParallel) {
+      if (isParallel) {
+        // particle moves parallel to field -> no deflection
         return tracking_line::Tracking::intersect<TParticle>(particle, sphere);
       }
 
diff --git a/tests/modules/testTracking.cpp b/tests/modules/testTracking.cpp
index 15d2aad25..cfeba1ec0 100644
--- a/tests/modules/testTracking.cpp
+++ b/tests/modules/testTracking.cpp
@@ -70,6 +70,8 @@ TEMPLATE_TEST_CASE("Tracking", "tracking", tracking_leapfrog_curved::Tracking,
   const HEPEnergyType P0 = 10_GeV;
 
   auto PID = GENERATE(as<Code>{}, Code::MuPlus, Code::MuPlus, Code::Photon);
+  // test also special case: movement parallel to field (along x)
+  auto isParallel = GENERATE(as<bool>{}, true, false);
   // for algorithms that know magnetic deflections choose: +-50uT, 0uT
   // otherwise just 0uT
   auto Bfield = GENERATE(filter(
@@ -79,25 +81,26 @@ TEMPLATE_TEST_CASE("Tracking", "tracking", tracking_leapfrog_curved::Tracking,
         else
           return true;
       },
-      values<MagneticFluxType>({50_uT, 0_uT, -50_uT})));
+      values<MagneticFluxType>({50_uT, 0_uT, (isParallel ? 0 : -50_uT)})));
   // particle --> (world) --> | --> (target)
   // true: start inside "world" volume
   // false: start inside "target" volume
   auto outer = GENERATE(as<bool>{}, true, false);
 
-  SECTION(fmt::format("Tracking PID={}, Bfield={} uT, from outside={}", PID,
-                      Bfield / 1_uT, outer)) {
+  SECTION(fmt::format("Tracking PID={}, Bfield={} uT, isParallel={}, from outside={}",
+                      PID, Bfield / 1_uT, isParallel, outer)) {
 
     CORSIKA_LOG_DEBUG(
         "********************\n                          TEST algo={} section PID={}, "
         "Bfield={} "
-        "uT, start_outside={}",
-        boost::typeindex::type_id<TestType>().pretty_name(), PID, Bfield / 1_uT, outer);
+        "uT, field is parallel={}, start_outside={}",
+        boost::typeindex::type_id<TestType>().pretty_name(), PID, Bfield / 1_uT,
+        isParallel, outer);
 
     const int chargeNumber = get_charge_number(PID);
     LengthType radius = 10_m;
     int deflect = 0;
-    if (chargeNumber != 0 and Bfield != 0_T) {
+    if (chargeNumber != 0 && Bfield != 0_T && !isParallel) {
       deflect = -sgn(chargeNumber) * sgn(Bfield / 1_T); // direction of deflection
       LengthType const gyroradius = (convert_HEP_to_SI<MassType::dimension_type>(P0) *
                                      constants::c / (abs(get_charge(PID)) * abs(Bfield)));
-- 
GitLab