From 17e56f7bea01bafd3a72d714b3c979ffaf0cf240 Mon Sep 17 00:00:00 2001
From: Maximilian Sackel <maximilian.sackel@tu-dortmund.de>
Date: Wed, 15 Jul 2020 10:49:56 +0000
Subject: [PATCH] Change unneccessary particle map to array and enable
 continuous losses for gammas.

---
 Processes/Proposal/ContinuousProcess.cc | 23 +++++++----------------
 Processes/Proposal/ContinuousProcess.h  |  6 +++++-
 Processes/Proposal/Interaction.cc       | 17 ++++-------------
 Processes/Proposal/Interaction.h        |  8 ++++++--
 4 files changed, 22 insertions(+), 32 deletions(-)

diff --git a/Processes/Proposal/ContinuousProcess.cc b/Processes/Proposal/ContinuousProcess.cc
index 53eddcc85..d95202e5d 100644
--- a/Processes/Proposal/ContinuousProcess.cc
+++ b/Processes/Proposal/ContinuousProcess.cc
@@ -18,18 +18,10 @@ namespace corsika::process::proposal {
   using namespace corsika::environment;
   using namespace corsika::units::si;
 
-  unordered_map<particles::Code, PROPOSAL::ParticleDef> ContinuousProcess::particles{
-      {particles::Code::Gamma, PROPOSAL::GammaDef()},
-      {particles::Code::Electron, PROPOSAL::EMinusDef()},
-      {particles::Code::Positron, PROPOSAL::EPlusDef()},
-      {particles::Code::MuMinus, PROPOSAL::MuMinusDef()},
-      {particles::Code::MuPlus, PROPOSAL::MuPlusDef()},
-      {particles::Code::TauPlus, PROPOSAL::TauPlusDef()},
-      {particles::Code::TauMinus, PROPOSAL::TauMinusDef()},
-  };
-
   bool ContinuousProcess::CanInteract(particles::Code pcode) const noexcept {
-    if (particles.find(pcode) != particles.end()) return true;
+    if (std::find(tracked_particles.begin(), tracked_particles.end(), pcode) !=
+        tracked_particles.end())
+      return true;
     return false;
   }
 
@@ -40,9 +32,8 @@ namespace corsika::process::proposal {
       , fRNG(corsika::random::RNGManager::GetInstance().GetRandomStream("proposal")) {
     auto all_compositions = std::vector<const NuclearComposition*>();
     _env.GetUniverse()->walk([&](auto& vtn) {
-      if (vtn.HasModelProperties()) {
+      if (vtn.HasModelProperties())
         all_compositions.push_back(&vtn.GetModelProperties().GetNuclearComposition());
-      }
     });
     for (auto& ncarg : all_compositions) {
       auto comp_vec = std::vector<PROPOSAL::Components::Component>();
@@ -71,7 +62,7 @@ namespace corsika::process::proposal {
 
   template <>
   void ContinuousProcess::Scatter(SetupParticle& vP, HEPEnergyType const& loss,
-                                           GrammageType const& grammage) {
+                                  GrammageType const& grammage) {
     auto calc = GetCalculator(vP);
     auto d = vP.GetDirection().GetComponents();
     auto direction = PROPOSAL::Vector3D(d.GetX().magnitude(), d.GetY().magnitude(),
@@ -94,10 +85,10 @@ namespace corsika::process::proposal {
   template <>
   EProcessReturn ContinuousProcess::DoContinuous(SetupParticle& vP,
                                                  SetupTrack const& vT) {
-    if (vP.GetChargeNumber() == 0) return process::EProcessReturn::eOk;
+    if (!CanInteract(vP.GetPID())) return process::EProcessReturn::eOk;
     auto dX = vP.GetNode()->GetModelProperties().IntegratedGrammage(vT, vT.GetLength());
     auto energy_loss = TotalEnergyLoss(vP, dX);
-    Scatter(vP, energy_loss, dX);
+    if (vP.GetChargeNumber() != 0) Scatter(vP, energy_loss, dX);
     vP.SetEnergy(vP.GetEnergy() - energy_loss);
     if (vP.GetEnergy() < cut.GetECut()) return process::EProcessReturn::eParticleAbsorbed;
     vP.SetMomentum(vP.GetMomentum() * vP.GetEnergy() / vP.GetMomentum().GetNorm());
diff --git a/Processes/Proposal/ContinuousProcess.h b/Processes/Proposal/ContinuousProcess.h
index 7a42c1224..7e234ac63 100644
--- a/Processes/Proposal/ContinuousProcess.h
+++ b/Processes/Proposal/ContinuousProcess.h
@@ -34,7 +34,11 @@ namespace corsika::process::proposal {
       : public corsika::process::ContinuousProcess<ContinuousProcess> {
     CORSIKA_ParticleCut& cut;
     corsika::random::RNG& fRNG;
-    static unordered_map<particles::Code, PROPOSAL::ParticleDef> particles;
+    static constexpr std::array<particles::Code, 7> tracked_particles{
+        particles::Code::Gamma,    particles::Code::Electron, particles::Code::Positron,
+        particles::Code::MuMinus,  particles::Code::MuPlus,   particles::Code::TauPlus,
+        particles::Code::TauMinus,
+    };
     unordered_map<const NuclearComposition*, PROPOSAL::Medium> media;
 
     bool CanInteract(particles::Code pcode) const noexcept;
diff --git a/Processes/Proposal/Interaction.cc b/Processes/Proposal/Interaction.cc
index 60ae3c81f..fb567b398 100644
--- a/Processes/Proposal/Interaction.cc
+++ b/Processes/Proposal/Interaction.cc
@@ -19,18 +19,10 @@ namespace corsika::process::proposal {
   using namespace corsika::environment;
   using namespace corsika::units::si;
 
-  std::unordered_map<particles::Code, PROPOSAL::ParticleDef> Interaction::particles{
-      {particles::Code::Gamma, PROPOSAL::GammaDef()},
-      {particles::Code::Electron, PROPOSAL::EMinusDef()},
-      {particles::Code::Positron, PROPOSAL::EPlusDef()},
-      {particles::Code::MuMinus, PROPOSAL::MuMinusDef()},
-      {particles::Code::MuPlus, PROPOSAL::MuPlusDef()},
-      {particles::Code::TauPlus, PROPOSAL::TauPlusDef()},
-      {particles::Code::TauMinus, PROPOSAL::TauMinusDef()},
-  };
-
   bool Interaction::CanInteract(particles::Code pcode) const noexcept {
-    if (particles.find(pcode) != particles.end()) return true;
+    if (std::find(tracked_particles.begin(), tracked_particles.end(), pcode) !=
+        tracked_particles.end())
+      return true;
     return false;
   }
 
@@ -40,9 +32,8 @@ namespace corsika::process::proposal {
       , fRNG(corsika::random::RNGManager::GetInstance().GetRandomStream("proposal")) {
     auto all_compositions = std::vector<const NuclearComposition*>();
     _env.GetUniverse()->walk([&](auto& vtn) {
-      if (vtn.HasModelProperties()) {
+      if (vtn.HasModelProperties())
         all_compositions.push_back(&vtn.GetModelProperties().GetNuclearComposition());
-      }
     });
     for (auto& ncarg : all_compositions) {
       auto comp_vec = std::vector<Component_PROPOSAL>();
diff --git a/Processes/Proposal/Interaction.h b/Processes/Proposal/Interaction.h
index 6d0ad2f37..f3c3b2cf0 100644
--- a/Processes/Proposal/Interaction.h
+++ b/Processes/Proposal/Interaction.h
@@ -17,7 +17,7 @@
 #include <corsika/process/particle_cut/ParticleCut.h>
 #include <corsika/random/RNGManager.h>
 #include <corsika/random/UniformRealDistribution.h>
-#include <unordered_map>
+#include <array>
 #include "PROPOSAL/PROPOSAL.h"
 
 using namespace corsika::environment;
@@ -32,7 +32,11 @@ namespace corsika::process::proposal {
   class Interaction : public corsika::process::InteractionProcess<Interaction> {
     CORSIKA_ParticleCut& cut;
     corsika::random::RNG& fRNG;
-    static std::unordered_map<particles::Code, PROPOSAL::ParticleDef> particles;
+    static constexpr std::array<particles::Code, 7> tracked_particles{
+        particles::Code::Gamma,    particles::Code::Electron, particles::Code::Positron,
+        particles::Code::MuMinus,  particles::Code::MuPlus,   particles::Code::TauPlus,
+        particles::Code::TauMinus,
+    };
     std::unordered_map<const NuclearComposition*, PROPOSAL::Medium> media;
 
     bool CanInteract(particles::Code pcode) const noexcept;
-- 
GitLab