From 27967bbeb5bd393e0da02d42cceee203922d624b Mon Sep 17 00:00:00 2001 From: Felix Riehn <friehn@lip.pt> Date: Fri, 9 Aug 2024 19:14:44 +0200 Subject: [PATCH] switch cross section application to getCrossSectionInelEla, add corr. routines for Sibyll and QgsJet (INCOMPLETE! returning zero for elastic cross section) --- applications/cross_section.cpp | 4 ++-- .../modules/qgsjetII/InteractionModel.inl | 6 ++++++ .../detail/modules/sibyll/InteractionModel.inl | 11 +++++++++++ corsika/modules/qgsjetII/InteractionModel.hpp | 18 ++++++++++++++++++ corsika/modules/sibyll/InteractionModel.hpp | 3 +++ 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/applications/cross_section.cpp b/applications/cross_section.cpp index 1d9c55298..19661f1f9 100644 --- a/applications/cross_section.cpp +++ b/applications/cross_section.cpp @@ -99,8 +99,8 @@ void calculate_cross_sections(TModel& model, std::string const& model_name, } // p-p - CrossSectionType const xs_prod_pp = - model->getCrossSection(Code::Proton, Code::Proton, p4protonProj, p4protonTarg); + auto const [xs_prod_pp, xs_ela_pp ]= + model->getCrossSectionInelEla(Code::Proton, Code::Proton, p4protonProj, p4protonTarg); // p-O CrossSectionType const xs_prod_pO = model->getCrossSection(Code::Proton, Code::Oxygen, p4protonProj, p4oxygenTarg); diff --git a/corsika/detail/modules/qgsjetII/InteractionModel.inl b/corsika/detail/modules/qgsjetII/InteractionModel.inl index bb5585af3..32e8398b7 100644 --- a/corsika/detail/modules/qgsjetII/InteractionModel.inl +++ b/corsika/detail/modules/qgsjetII/InteractionModel.inl @@ -102,6 +102,12 @@ namespace corsika::qgsjetII { return sigProd * 1_mb; } +inline std::tuple<CrossSectionType, CrossSectionType> InteractionModel::getCrossSectionInelEla( + Code projCode, Code targetCode, FourMomentum const& proj4mom, + FourMomentum const& target4mom) const { + return { getCrossSection(projCode, targetCode, proj4mom, target4mom), CrossSectionType::zero()}; + } + template <typename TSecondaries> inline void InteractionModel::doInteraction(TSecondaries& view, Code const projectileId, Code const targetId, diff --git a/corsika/detail/modules/sibyll/InteractionModel.inl b/corsika/detail/modules/sibyll/InteractionModel.inl index 5c2be73da..8a3b58f7b 100644 --- a/corsika/detail/modules/sibyll/InteractionModel.inl +++ b/corsika/detail/modules/sibyll/InteractionModel.inl @@ -50,6 +50,17 @@ namespace corsika::sibyll { target4mom); } +inline std::tuple<CrossSectionType, CrossSectionType> InteractionModel::getCrossSectionInelEla( + Code projCode, Code targetCode, FourMomentum const& proj4mom, + FourMomentum const& target4mom) const { + if (is_nucleus(projCode)) + return { getNuclearInteractionModel().getCrossSection(projCode, targetCode, proj4mom, + target4mom), CrossSectionType::zero()}; + else + return getHadronInteractionModel().getCrossSectionInelEla(projCode, targetCode, proj4mom, + target4mom); + } + template <typename TSecondaries> inline void InteractionModel::doInteraction(TSecondaries& view, Code projCode, Code targetCode, diff --git a/corsika/modules/qgsjetII/InteractionModel.hpp b/corsika/modules/qgsjetII/InteractionModel.hpp index c6fd881f9..bbd3b24e7 100644 --- a/corsika/modules/qgsjetII/InteractionModel.hpp +++ b/corsika/modules/qgsjetII/InteractionModel.hpp @@ -55,6 +55,24 @@ namespace corsika::qgsjetII { FourMomentum const& projectileP4, FourMomentum const& targetP4) const; + +/** + * Returns inelastic AND elastic cross sections. + * + * These cross sections must correspond to the process described in doInteraction + * AND elastic scattering (sigma_tot = sigma_inel + sigma_el). + * + * @param projectile is the Code of the projectile + * @param target is the Code of the target + * @param projectileP4: four-momentum of projectile + * @param targetP4: four-momentum of target + * + * @return a tuple of: inelastic cross section, elastic cross section + */ + std::tuple<CrossSectionType, CrossSectionType> getCrossSectionInelEla( + Code const projectile, Code const target, FourMomentum const& projectileP4, + FourMomentum const& targetP4) const; + /** * In this function QGSJETII is called to produce one event. * diff --git a/corsika/modules/sibyll/InteractionModel.hpp b/corsika/modules/sibyll/InteractionModel.hpp index c5fc50087..05135bdd6 100644 --- a/corsika/modules/sibyll/InteractionModel.hpp +++ b/corsika/modules/sibyll/InteractionModel.hpp @@ -31,6 +31,9 @@ namespace corsika::sibyll { CrossSectionType getCrossSection(Code, Code, FourMomentum const&, FourMomentum const&) const; + std::tuple<CrossSectionType, CrossSectionType> getCrossSectionInelEla(Code, Code, FourMomentum const&, + FourMomentum const&) const; + template <typename TSecondaries> void doInteraction(TSecondaries&, Code, Code, FourMomentum const&, FourMomentum const&); -- GitLab