From eac2cb7316b22e473807be76d60efd04b4492fff Mon Sep 17 00:00:00 2001
From: Jean-Marco Alameddine <jean-marco.alameddine@tu-dortmund.de>
Date: Mon, 17 May 2021 13:55:04 +0200
Subject: [PATCH] Fix wrong treatment of energies in
 proposal::ContinuousProcess:doContinuous Update particle direction in
 proposal::ContinuousProcess::scatter

---
 .../detail/modules/proposal/ContinuousProcess.inl  | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/corsika/detail/modules/proposal/ContinuousProcess.inl b/corsika/detail/modules/proposal/ContinuousProcess.inl
index e65046c23..b8b47862d 100644
--- a/corsika/detail/modules/proposal/ContinuousProcess.inl
+++ b/corsika/detail/modules/proposal/ContinuousProcess.inl
@@ -73,14 +73,17 @@ namespace corsika::proposal {
     for (auto& it : rnd) it = distr(RNG_);
 
     // calculate deflection based on particle energy, loss
-    [[maybe_unused]] auto deflection = (c->second).scatter->CalculateMultipleScattering(
+    auto deflection = (c->second).scatter->CalculateMultipleScattering(
         grammage / 1_g * square(1_cm), vP.getEnergy() / 1_MeV, E_f / 1_MeV, rnd);
 
-    // TODO: multiple scattering is temporary deactivated !!!!!
+    [[maybe_unused]] auto [unused1, final_direction] = PROPOSAL::multiple_scattering::ScatterInitialDirection(direction, deflection);
+
     // update particle direction after continuous loss caused by multiple
     // scattering
-    auto vec = QuantityVector(direction.GetX() * E_f, direction.GetY() * E_f,
-                              direction.GetZ() * E_f);
+    auto particle_momentum = vP.getMomentum().getNorm();
+    auto vec = QuantityVector(final_direction.GetX() * particle_momentum,
+                              final_direction.GetY() * particle_momentum,
+                              final_direction.GetZ() * particle_momentum);
     vP.setMomentum(MomentumVector(vP_dir.getCoordinateSystem(), vec));
   }
 
@@ -108,7 +111,8 @@ namespace corsika::proposal {
     // if the particle has a charge take multiple scattering into account
     if (vP.getChargeNumber() != 0) scatter(vP, dE, dX);
     vP.setEnergy(final_energy);
-    vP.setMomentum(vP.getMomentum() * vP.getEnergy() / vP.getMomentum().getNorm());
+    auto new_momentum = sqrt(vP.getEnergy() * vP.getEnergy() - vP.getMass() * vP.getMass());
+    vP.setMomentum(vP.getMomentum() * new_momentum / vP.getMomentum().getNorm());
     return ProcessReturn::Ok;
   }
 
-- 
GitLab