From 200c193f25857eb59095bccf09b608c167ca7747 Mon Sep 17 00:00:00 2001
From: Felix Riehn <felix@matilda>
Date: Fri, 8 Apr 2022 19:52:20 +0100
Subject: [PATCH] added template parameter for hadronic model to proposal,
 split proposal process from interaction

---
 .../modules/proposal/ContinuousProcess.inl    |  2 +-
 .../{Interaction.inl => InteractionModel.inl} | 29 +++++++++++--------
 corsika/modules/PROPOSAL.hpp                  | 14 ++++++++-
 .../{Interaction.hpp => InteractionModel.hpp} | 20 ++++++++-----
 4 files changed, 44 insertions(+), 21 deletions(-)
 rename corsika/detail/modules/proposal/{Interaction.inl => InteractionModel.inl} (89%)
 rename corsika/modules/proposal/{Interaction.hpp => InteractionModel.hpp} (79%)

diff --git a/corsika/detail/modules/proposal/ContinuousProcess.inl b/corsika/detail/modules/proposal/ContinuousProcess.inl
index 6054a0d5f..30a183e3a 100644
--- a/corsika/detail/modules/proposal/ContinuousProcess.inl
+++ b/corsika/detail/modules/proposal/ContinuousProcess.inl
@@ -11,7 +11,7 @@
 
 #include <corsika/media/IMediumModel.hpp>
 #include <corsika/modules/proposal/ContinuousProcess.hpp>
-#include <corsika/modules/proposal/Interaction.hpp>
+#include <corsika/modules/proposal/InteractionModel.hpp>
 #include <corsika/framework/core/PhysicalUnits.hpp>
 #include <corsika/framework/utility/COMBoost.hpp>
 #include <corsika/framework/core/Logging.hpp>
diff --git a/corsika/detail/modules/proposal/Interaction.inl b/corsika/detail/modules/proposal/InteractionModel.inl
similarity index 89%
rename from corsika/detail/modules/proposal/Interaction.inl
rename to corsika/detail/modules/proposal/InteractionModel.inl
index ef75b79c9..9d051b71c 100644
--- a/corsika/detail/modules/proposal/Interaction.inl
+++ b/corsika/detail/modules/proposal/InteractionModel.inl
@@ -18,13 +18,16 @@
 
 namespace corsika::proposal {
 
+  template <typename THadronicModel>
   template <typename TEnvironment>
-  inline Interaction::Interaction(TEnvironment const& _env,
-                                  corsika::sibyll::Interaction& hadint)
+  inline InteractionModel<THadronicModel>::InteractionModel(TEnvironment const& _env,
+                                                            THadronicModel& hadint)
       : ProposalProcessBase(_env)
       , hadronicInteraction_(hadint) {}
 
-  inline void Interaction::buildCalculator(Code code, NuclearComposition const& comp) {
+  template <typename THadronicModel>
+  inline void InteractionModel<THadronicModel>::buildCalculator(
+      Code code, NuclearComposition const& comp) {
     // search crosssection builder for given particle
     auto p_cross = cross.find(code);
     if (p_cross == cross.end())
@@ -48,10 +51,10 @@ namespace corsika::proposal {
         PROPOSAL::make_interaction(c, true));
   }
 
+  template <typename THadronicModel>
   template <typename TStackView>
-  inline ProcessReturn Interaction::doInteraction(TStackView& view,
-                                                  Code const projectileId,
-                                                  FourMomentum const& projectileP4) {
+  inline ProcessReturn InteractionModel<THadronicModel>::doInteraction(
+      TStackView& view, Code const projectileId, FourMomentum const& projectileP4) {
 
     auto const projectile = view.getProjectile();
 
@@ -126,10 +129,11 @@ namespace corsika::proposal {
     return ProcessReturn::Ok;
   }
 
+  template <typename THadronicModel>
   template <typename TStackView>
-  inline ProcessReturn Interaction::doHadronicInteraction(
+  inline ProcessReturn InteractionModel<THadronicModel>::doHadronicInteraction(
       TStackView& view, CoordinateSystemPtr const& labCS,
-      FourMomentum const& projectileP4, Code const targetId) {
+      FourMomentum const& projectileP4, Code const& targetId) {
     CORSIKA_LOG_INFO(
         "HE photo-hadronic interaction! calling hadronic interaction model..");
 
@@ -170,14 +174,15 @@ namespace corsika::proposal {
       HEPEnergyType const Ekin = sqrt(p3lab.getSquaredNorm() + mass * mass) - mass;
       view.addSecondary(std::make_tuple(pid, Ekin, p3lab.normalized()));
     }
-    // throw std::runtime_error("photo-hadronic interaction!");
+    CORSIKA_LOG_INFO("number of particles produced: {}", view.getEntries());
     return ProcessReturn::Ok;
   }
 
+  template <typename THadronicModel>
   template <typename TParticle>
-  inline CrossSectionType Interaction::getCrossSection(TParticle const& projectile,
-                                                       Code const projectileId,
-                                                       FourMomentum const& projectileP4) {
+  inline CrossSectionType InteractionModel<THadronicModel>::getCrossSection(
+      TParticle const& projectile, Code const projectileId,
+      FourMomentum const& projectileP4) {
 
     // ==============================================
     // this block better diappears. RU 26.10.2021
diff --git a/corsika/modules/PROPOSAL.hpp b/corsika/modules/PROPOSAL.hpp
index bccfce90c..a019ac63d 100644
--- a/corsika/modules/PROPOSAL.hpp
+++ b/corsika/modules/PROPOSAL.hpp
@@ -8,5 +8,17 @@
 
 #pragma once
 
-#include <corsika/modules/proposal/Interaction.hpp>
+#include <corsika/modules/proposal/InteractionModel.hpp>
 #include <corsika/modules/proposal/ContinuousProcess.hpp>
+
+namespace corsika::proposal {
+
+  template <typename THadronicModel>
+  class Interaction : public InteractionModel<THadronicModel>,
+                      public InteractionProcess<Interaction<THadronicModel>> {
+  public:
+    template <typename TEnvironment>
+    Interaction(TEnvironment const& env, THadronicModel& model)
+        : InteractionModel<THadronicModel>(env, model) {}
+  };
+} // namespace corsika::proposal
diff --git a/corsika/modules/proposal/Interaction.hpp b/corsika/modules/proposal/InteractionModel.hpp
similarity index 79%
rename from corsika/modules/proposal/Interaction.hpp
rename to corsika/modules/proposal/InteractionModel.hpp
index d42970f66..0ea0c4bae 100644
--- a/corsika/modules/proposal/Interaction.hpp
+++ b/corsika/modules/proposal/InteractionModel.hpp
@@ -16,7 +16,6 @@
 #include <corsika/framework/geometry/FourVector.hpp>
 #include <corsika/framework/random/RNGManager.hpp>
 #include <corsika/framework/random/UniformRealDistribution.hpp>
-#include <corsika/modules/Sibyll.hpp>
 #include <corsika/modules/proposal/ProposalProcessBase.hpp>
 
 namespace corsika::proposal {
@@ -25,10 +24,16 @@ namespace corsika::proposal {
   //! Electro-magnetic and photon stochastic losses produced by proposal. It makes
   //! use of interpolation tables which are runtime intensive calculation, but can be
   //! reused by setting the \param PROPOSAL::InterpolationDef::path_to_tables variable.
-  //! @tparam THadronModel
+  //! Hadroninc interactions of photons with nuclei are included. The cross section is
+  //! calculated by PROPOSAL. For the production of hadronic secondaries an external model
+  //! is needed that implements the doInteraction(TSecondaries& view, Code const
+  //! projectile, Code const target,FourMomentum const& projectileP4, FourMomentum const&
+  //! targetP4) routine.
+  //! @tparam THadronicModel
   //!
 
-  class Interaction : public InteractionProcess<Interaction>, ProposalProcessBase {
+  template <class THadronicModel>
+  class InteractionModel : public ProposalProcessBase {
 
     enum { eSECONDARIES, eINTERACTION };
     using calculator_t = std::tuple<std::unique_ptr<PROPOSAL::SecondariesCalculator>,
@@ -48,7 +53,7 @@ namespace corsika::proposal {
     //! compositions and stochastic description limited by the particle cut.
     //!
     template <typename TEnvironment>
-    Interaction(TEnvironment const& env, corsika::sibyll::Interaction&);
+    InteractionModel(TEnvironment const& env, THadronicModel&);
 
     //!
     //! Calculate the rates for the different targets and interactions. Sample a
@@ -66,7 +71,7 @@ namespace corsika::proposal {
     template <typename TSecondaryView>
     ProcessReturn doHadronicInteraction(TSecondaryView&, CoordinateSystemPtr const&,
                                         FourMomentum const& projectileP4,
-                                        Code const targetId);
+                                        Code const& targetId);
 
     //!
     //! Calculates and returns the cross section.
@@ -76,10 +81,11 @@ namespace corsika::proposal {
                                      FourMomentum const& projectileP4);
 
   private:
-    corsika::sibyll::Interaction& hadronicInteraction_;
+    THadronicModel& hadronicInteraction_;    
     static HEPEnergyType constexpr heHadronicModelThresholdLab_ =
         80. * 1e9 * electronvolt;
   };
+
 } // namespace corsika::proposal
 
-#include <corsika/detail/modules/proposal/Interaction.inl>
+#include <corsika/detail/modules/proposal/InteractionModel.inl>
-- 
GitLab