From ade578778bdaa8f9bfe30af4341fc9aeda88f5f0 Mon Sep 17 00:00:00 2001
From: Andre Schmidt <schmidt-a@iklx288.ikp.kit.edu>
Date: Sun, 16 Aug 2020 15:01:41 +0200
Subject: [PATCH] mal 1.0001

---
 Framework/Cascade/Cascade.h                    | 15 +++++++--------
 Processes/ObservationPlane/ObservationPlane.cc |  1 +
 Processes/TrackingLine/TrackingLine.h          |  9 +++++----
 3 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h
index 90df44a82..9ba4c4bc8 100644
--- a/Framework/Cascade/Cascade.h
+++ b/Framework/Cascade/Cascade.h
@@ -227,12 +227,11 @@ namespace corsika::cascade {
       std::cout << "distance_max=" << distance_max << std::endl;
 
       // take minimum of geometry, interaction, decay for next step
-      std::cout << "Interaction: " << distance_interact << std::endl;
-      std::cout << "Decay: " << distance_decay << std::endl;
-      std::cout << "ObsPlane: " << distance_max << std::endl;
-      std::cout << "Transition: " << geomMaxLength << std::endl;
-      auto const min_distance = std::min(
+      auto min_distance = std::min(
           {distance_interact, distance_decay, distance_max, geomMaxLength});
+      if (min_distance == geomMaxLength) {
+        min_distance = 1.001 * geomMaxLength;
+      } 
 
       C8LOG_DEBUG("transport particle by : {} m", min_distance / 1_m);
 
@@ -260,11 +259,11 @@ namespace corsika::cascade {
   		// Second Movement
   		position = position + directionAfter * min_distance / 2;
       auto distance = position - vParticle.GetPosition();
-      //distance.norm() != min_distance if q != 0
-      //small error can be neglected
+      // distance.norm() != min_distance if q != 0
+      // small error can be neglected
       if (distance.norm() != 0_m) {
       velocity = distance.normalized() * velocity.norm();
-      } //no velocity update for very small steps
+      } // no velocity update for very small steps
       
       // here the particle is actually moved along the trajectory to new position:
       // std::visit(setup::ParticleUpdate<Particle>{vParticle}, step);
diff --git a/Processes/ObservationPlane/ObservationPlane.cc b/Processes/ObservationPlane/ObservationPlane.cc
index 298b53b88..d12a55f5a 100644
--- a/Processes/ObservationPlane/ObservationPlane.cc
+++ b/Processes/ObservationPlane/ObservationPlane.cc
@@ -88,6 +88,7 @@ LengthType ObservationPlane::MaxStepLength(setup::Stack::ParticleType const& vPa
       plane_.GetNormal().dot(velocity.cross(magneticfield)) * 2 * k)) - 
       velocity.dot(plane_.GetNormal()) / velocity.GetNorm() ) / 
       (plane_.GetNormal().dot(velocity.cross(magneticfield)) * k);
+      
     if (MaxStepLength1 <= 0_m && MaxStepLength2 <= 0_m) {
       return std::numeric_limits<double>::infinity() * 1_m;
     } else if (MaxStepLength1 <= 0_m || MaxStepLength2 < MaxStepLength1) {
diff --git a/Processes/TrackingLine/TrackingLine.h b/Processes/TrackingLine/TrackingLine.h
index fd89415ab..eff54e7e2 100644
--- a/Processes/TrackingLine/TrackingLine.h
+++ b/Processes/TrackingLine/TrackingLine.h
@@ -135,7 +135,7 @@ namespace corsika::process {
   									                                            (position - currentPosition).GetNorm();
   		      velocity1 = direction * velocity.GetNorm();
           } // instead of changing the line with magnetic field, the TimeOfIntersection() could be changed
-          // line has some errors
+          // using line has some errors for huge steps
           geometry::Line line(currentPosition, velocity1);
 
           if (auto opt = TimeOfIntersection(line, sphere); opt.has_value()) {
@@ -232,9 +232,10 @@ namespace corsika::process {
                                                                   min * k;
         // Second Movement
         position = position + directionAfter * velocity.norm() * min / 2;
-        geometry::Vector<dimensionless_d> const direction = (position - currentPosition) / 
-                                                            (position - currentPosition).GetNorm();
-        velocity = direction * velocity.GetNorm();
+        if ((position - currentPosition).GetNorm() != 0_m) {
+          geometry::Vector<dimensionless_d> const direction = (position - currentPosition).normalized();
+          velocity = direction * velocity.norm();
+        } // no velocity update for very small steps
         geometry::Line lineWithB(currentPosition, velocity);
 
         return std::make_tuple(geometry::Trajectory<geometry::Line>(lineWithoutB, min),
-- 
GitLab