diff --git a/corsika/detail/modules/proposal/ContinuousProcess.inl b/corsika/detail/modules/proposal/ContinuousProcess.inl index 6054a0d5fd0d823779d8bbaeb6dc912be8078a32..30a183e3ad49602ebd41f06189578dff01aa2dd3 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 ef75b79c99766f3cb0a6491b200a8a0d5c730672..9d051b71c456fae4191de3b648b0dcca5ecfe7ef 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 bccfce90ce40e60e2e18e86dcffa416322a4bf8a..a019ac63d0ad3714999394c604a4cf3381345fcb 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 d42970f666598b925dd85109218320635bb9ffc5..0ea0c4bae8f2c96e14a9f21067c1cc11602b7689 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>