From 2e75bd86dd5d456651b95cf4b21b0eb1afd2f5cd Mon Sep 17 00:00:00 2001
From: Maximilian Reininghaus <maximilian.reininghaus@tu-dortmund.de>
Date: Fri, 16 Jun 2023 01:51:55 +0200
Subject: [PATCH] use pre-step cross-section/lifetime; doSecondaries() only
 after real event generation

---
 corsika/detail/framework/core/Cascade.inl | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/corsika/detail/framework/core/Cascade.inl b/corsika/detail/framework/core/Cascade.inl
index bb0d0b854..c3a1eee37 100644
--- a/corsika/detail/framework/core/Cascade.inl
+++ b/corsika/detail/framework/core/Cascade.inl
@@ -303,15 +303,11 @@ namespace corsika {
         false; // only erase original particle if it decayed or interacted
 
     if (distance_interact < distance_decay) {
-      CrossSectionType const total_cx_post = composition.getWeightedSum(xs_function);
       eraseParticle = isInteracted(
-          interaction(secondaries, projectileP4Post, composition, total_cx_post));
+          interaction(secondaries, projectileP4Post, composition, total_cx_pre));
     } else {
       [[maybe_unused]] auto projectile = secondaries.getProjectile();
-
-      InverseTimeType const total_inv_lifetime_post =
-          sequence_.getInverseLifetime(particle);
-      if (decay(secondaries, total_inv_lifetime_post) == ProcessReturn::Decayed) {
+      if (decay(secondaries, total_inv_lifetime_pre) == ProcessReturn::Decayed) {
         eraseParticle = true;
         if (secondaries.getSize() == 1 &&
             projectile.getPID() == secondaries.getNextParticle().getPID()) {
@@ -321,8 +317,11 @@ namespace corsika {
       }
     }
 
-    sequence_.doSecondaries(secondaries);
-    if (eraseParticle) particle.erase();
+    if (eraseParticle) {
+      // doSecondaries() makes sense only if there was an actual event
+      sequence_.doSecondaries(secondaries);
+      particle.erase();
+    }
   }
 
   template <typename TTracking, typename TProcessList, typename TOutput, typename TStack>
-- 
GitLab