From 9397c1a97bd5d77d93f82027932a505ad59d6f44 Mon Sep 17 00:00:00 2001
From: Maximilian Sackel <maximilian.sackel@tu-dortmund.de>
Date: Sun, 21 Jun 2020 10:30:48 +0000
Subject: [PATCH] add proposal sec to corsika stack

---
 Processes/Proposal/Interaction.cc | 49 ++++++++++---------------------
 Processes/Proposal/Interaction.h  | 44 +++++++++++++--------------
 2 files changed, 36 insertions(+), 57 deletions(-)

diff --git a/Processes/Proposal/Interaction.cc b/Processes/Proposal/Interaction.cc
index a62e45ca9..a19b6bf5f 100644
--- a/Processes/Proposal/Interaction.cc
+++ b/Processes/Proposal/Interaction.cc
@@ -19,13 +19,11 @@ namespace corsika::process::proposal {
   using namespace corsika::setup;
   using namespace corsika::environment;
   using namespace corsika::units::si;
-  using namespace corsika;
-
   using SetupParticle = corsika::setup::Stack::StackIterator;
 
   template <>
   std::unordered_map<particles::Code, PROPOSAL::ParticleDef>
-      Interaction<SetupEnvironment>::particle_map{
+      Interaction<SetupEnvironment>::particles{
           {particles::Code::Gamma, PROPOSAL::GammaDef()},
           {particles::Code::Electron, PROPOSAL::EMinusDef()},
           {particles::Code::Positron, PROPOSAL::EPlusDef()},
@@ -40,8 +38,10 @@ namespace corsika::process::proposal {
                                              CORSIKA_ParticleCut const& e_cut)
       : fEnvironment(env)
       , cut(make_shared<const PROPOSAL::EnergyCutSettings>(e_cut.GetCutEnergy() / 1_GeV,
-                                                           0, false)) {
+                                                           1, false)) {}
 
+  template <>
+  void Interaction<SetupEnvironment>::Init() {
     auto all_compositions = std::vector<NuclearComposition>();
     fEnvironment.GetUniverse()->walk([&](auto& vtn) {
       if (vtn.HasModelProperties())
@@ -55,44 +55,24 @@ namespace corsika::process::proposal {
                               *frac_iter);
         ++frac_iter;
       }
-      medium_map[&ncarg] = PROPOSAL::Medium(
+      media[&ncarg] = PROPOSAL::Medium(
           "Modified Air", 1., PROPOSAL::Air().GetI(), PROPOSAL::Air().GetC(),
           PROPOSAL::Air().GetA(), PROPOSAL::Air().GetM(), PROPOSAL::Air().GetX0(),
           PROPOSAL::Air().GetX1(), PROPOSAL::Air().GetD0(), 1.0, comp_vec);
     }
-    std::cout << "PROPOSAL done." << std::endl;
-  }
-
-  template <>
-  template <>
-  auto Interaction<SetupEnvironment>::GetCalculator(SetupParticle const& vP) {
-    auto& mediumComposition = vP.GetNode()->GetModelProperties().GetNuclearComposition();
-    auto calc_it = calculators.find(&mediumComposition);
-    if (calc_it != calculators.end()) return calc_it;
-    auto const& p_def = particle_map[vP.GetPID()];
-    auto& medium = medium_map[&mediumComposition];
-    auto cross = PROPOSAL::GetStdCrossSections(p_def, medium, cut, true);
-    auto inter_types = PROPOSAL::CrossSectionVector::GetInteractionTypes(cross);
-    auto [insert_it, success] = calculators.insert(
-        {&mediumComposition,
-         make_tuple(PROPOSAL::SecondariesCalculator(inter_types, p_def, medium),
-                    PROPOSAL::make_interaction(cross, true),
-                    PROPOSAL::make_displacement(cross, true))});
-    if (success) return insert_it;
-    throw std::logic_error("insert failed.");
   }
 
   template <>
   template <>
   corsika::process::EProcessReturn Interaction<SetupEnvironment>::DoInteraction(
-      SetupParticle const& vP) {
+      SetupParticle& vP) {
     auto calc = GetCalculator(vP); // [CrossSections]
     std::uniform_real_distribution<double> distr(0., 1.);
     auto [type, comp_ptr, v] = std::get<INTERACTION>(calc->second)
                                    ->TypeInteraction(vP.GetEnergy() / 1_GeV, distr(fRNG));
     auto rnd = std::vector<double>();
-    for (auto i = 0; i < std::get<SECONDARIES>(calc->second).RequiredRandomNumbers(type);
-         ++i)
+    for (size_t i = 0;
+         i < std::get<SECONDARIES>(calc->second).RequiredRandomNumbers(type); ++i)
       rnd.push_back(distr(fRNG));
     double primary_energy = vP.GetEnergy() / 1_GeV;
     auto point =
@@ -114,11 +94,14 @@ namespace corsika::process::proposal {
           corsika::geometry::RootCoordinateSystem::GetInstance()
               .GetRootCoordinateSystem(),
           vec);
-      // particles::Code, units::si::HEPEnergyType, stack::MomentumVector,
-      // geometry::Point, units::si::TimeType
-      auto sec = make_tuple(get<PROPOSAL::Loss::TYPE>(s), energy, momentum,
-                            vP.GetPosition(), vP.GetTime());
-      vP.AddSecondary(sec);
+      particles::Code sec_code = corsika::particles::ConvertFromPDG(
+          static_cast<particles::PDGCode>(get<PROPOSAL::Loss::TYPE>(s)));
+      corsika::units::si::HEPEnergyType sec_energy = energy;
+      stack::MomentumVector sec_momentum = momentum;
+      geometry::Point sec_position = vP.GetPosition();
+      corsika::units::si::TimeType sec_time = vP.GetTime();
+      vP.AddSecondary(
+          make_tuple(sec_code, sec_energy, sec_momentum, sec_position, sec_time));
     }
     return process::EProcessReturn::eOk;
   }
diff --git a/Processes/Proposal/Interaction.h b/Processes/Proposal/Interaction.h
index 6dfe30995..8692dd4e6 100644
--- a/Processes/Proposal/Interaction.h
+++ b/Processes/Proposal/Interaction.h
@@ -27,16 +27,6 @@ using CORSIKA_ParticleCut = corsika::process::particle_cut::ParticleCut;
 
 namespace corsika::process::proposal {
 
-  /* static std::unordered_map<particles::Code, PROPOSAL::ParticleDef> particle_map{ */
-  /*     {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()}, */
-  /* }; */
-
   template <class TEnvironment>
   class Interaction
       : public corsika::process::InteractionProcess<Interaction<TEnvironment>> {
@@ -45,26 +35,17 @@ namespace corsika::process::proposal {
     TEnvironment const& fEnvironment;
     shared_ptr<const PROPOSAL::EnergyCutSettings> cut;
 
-    static std::unordered_map<particles::Code, PROPOSAL::ParticleDef> particle_map;
-    std::unordered_map<const NuclearComposition*, PROPOSAL::Medium> medium_map;
+    static std::unordered_map<particles::Code, PROPOSAL::ParticleDef> particles;
+    std::unordered_map<const NuclearComposition*, PROPOSAL::Medium> media;
 
     enum { SECONDARIES, INTERACTION, DISPLACEMENT };
-    /* std::uniform_real_distribution<> rnd_uniform(0., 1.); */
-
-    /* std::map<particles::Code, std::unique_ptr<PROPOSAL::UtilityInterpolantInteraction>>
-     * corsika_particle_to_utility_map; */
-    /* std::map<particles::Code,
-     * std::unique_ptr<PROPOSAL::UtilityInterpolantDisplacement>>
-     * corsika_particle_to_displacement_map; */
 
     corsika::random::RNG& fRNG =
         corsika::random::RNGManager::GetInstance().GetRandomStream("s_rndm");
 
-    // fTrackedParticles[proposal_particle.GetName()] return  particle::Code
-
     auto IsTracked(particles::Code pcode) const noexcept {
-      auto search = particle_map.find(pcode);
-      if (search != particle_map.end()) return true;
+      auto search = particles.find(pcode);
+      if (search != particles.end()) return true;
       return false;
     };
 
@@ -74,11 +55,26 @@ namespace corsika::process::proposal {
     std::unordered_map<const NuclearComposition*, calculator_t> calculators;
 
     template <typename Particle>
-    auto GetCalculator(Particle&);
+    auto GetCalculator(Particle& vP) {
+      auto& comp = vP.GetNode()->GetModelProperties().GetNuclearComposition();
+      auto calc_it = calculators.find(&comp);
+      if (calc_it != calculators.end()) return calc_it;
+      auto cross =
+          PROPOSAL::GetStdCrossSections(particles[vP.GetPID()], media[&comp], cut, true);
+      auto inter_types = PROPOSAL::CrossSectionVector::GetInteractionTypes(cross);
+      auto [insert_it, success] = calculators.insert(
+          {&comp, make_tuple(PROPOSAL::SecondariesCalculator(
+                                 inter_types, particles[vP.GetPID()], media[&comp]),
+                             PROPOSAL::make_interaction(cross, true),
+                             PROPOSAL::make_displacement(cross, true))});
+      return insert_it;
+    }
 
   public:
     Interaction(TEnvironment const& env, CORSIKA_ParticleCut const& cut);
 
+    void Init();
+
     template <typename Particle>
     corsika::process::EProcessReturn DoInteraction(Particle&);
 
-- 
GitLab