From c64e6d551968df9ca8ab81481196a7864b14da3c Mon Sep 17 00:00:00 2001 From: ralfulrich <ralf.ulrich@kit.edu> Date: Tue, 6 Apr 2021 21:06:09 +0200 Subject: [PATCH] qgsjetII coverage --- README.rst | 13 ++--- .../detail/modules/qgsjetII/Interaction.inl | 11 ++-- tests/framework/testProcessSequence.cpp | 2 +- tests/modules/testQGSJetII.cpp | 52 +++++++++++++++++++ 4 files changed, 65 insertions(+), 13 deletions(-) diff --git a/README.rst b/README.rst index 3d49cee1b..896a4e571 100644 --- a/README.rst +++ b/README.rst @@ -56,19 +56,16 @@ Get in contact Installation ------------ - CORSIKA 8 is tested regularly at least on gcc7.3.0 and clang-8.0.0. Prerequisites ~~~~~~~~~~~~~ - You will also need: - -- Python 3 (supported versions are Python >= 3.6), with pip -- conan (via pip) -- cmake -- git -- g++, gfortran, binutils, make + * Python 3 (supported versions are Python >= 3.6), with pip + * conan (via pip) + * cmake + * git + * g++, gfortran, binutils, make On a bare Ubuntu 20.04, just add: :: diff --git a/corsika/detail/modules/qgsjetII/Interaction.inl b/corsika/detail/modules/qgsjetII/Interaction.inl index 2409ff8f4..c41b436cc 100644 --- a/corsika/detail/modules/qgsjetII/Interaction.inl +++ b/corsika/detail/modules/qgsjetII/Interaction.inl @@ -66,15 +66,18 @@ namespace corsika::qgsjetII { iTarget = targetA; if (iTarget > maxMassNumber_ || iTarget <= 0) { std::ostringstream txt; - txt << "QgsjetII target outside range. iTarget=" << iTarget; + txt << "QgsjetII target outside range. Atarget=" << iTarget; throw std::runtime_error(txt.str().c_str()); } } int iProjectile = 1; if (is_nucleus(beamId)) { iProjectile = Abeam; - if (iProjectile > maxMassNumber_ || iProjectile <= 0) - throw std::runtime_error("QgsjetII target outside range. "); + if (iProjectile > maxMassNumber_ || iProjectile <= 0) { + std::ostringstream txt; + txt << "QgsjetII projectile outside range. Aprojectile=" << iProjectile; + throw std::runtime_error(txt.str().c_str()); + } } CORSIKA_LOG_DEBUG( @@ -234,7 +237,7 @@ namespace corsika::qgsjetII { int targetMassNumber = 1; // proton if (is_nucleus(targetCode)) { // nucleus - targetMassNumber = get_nucleus_A(targetCode); + targetMassNumber = get_nucleus_A(targetCode); if (targetMassNumber > maxMassNumber_) throw std::runtime_error("QgsjetII target mass outside range."); } else { diff --git a/tests/framework/testProcessSequence.cpp b/tests/framework/testProcessSequence.cpp index 85c050645..e9592eebd 100644 --- a/tests/framework/testProcessSequence.cpp +++ b/tests/framework/testProcessSequence.cpp @@ -696,7 +696,7 @@ TEST_CASE("SwitchProcessSequence", "ProcessSequence") { checkInteract = 0; checkSec = 0; checkCont = 0; - particle.data_[0] = -100; // data negative + particle.data_[0] = -100; // data positive sequence4.selectInteraction(view, lambda_select); sequence4.doSecondaries(view); sequence4.selectDecay(view, time_select); diff --git a/tests/modules/testQGSJetII.cpp b/tests/modules/testQGSJetII.cpp index a721e57a6..09a28979c 100644 --- a/tests/modules/testQGSJetII.cpp +++ b/tests/modules/testQGSJetII.cpp @@ -169,4 +169,56 @@ TEST_CASE("QgsjetIIInterface", "[processes]") { CHECK((secMomSum - projectileMomentum).getNorm() / projectileMomentum.getNorm() == Approx(0).margin(1e-2)); } + + SECTION("InteractionInterface Nuclei") { + + auto [stackPtr, secViewPtr] = setup::testing::setup_stack( + Code::Nucleus, 20, 10, 10100_GeV, (setup::Environment::BaseNodeType* const)nodePtr, + *csPtr); + setup::StackView& view = *(secViewPtr.get()); + auto particle = stackPtr->first(); + auto projectile = secViewPtr->getProjectile(); + auto const projectileMomentum = projectile.getMomentum(); + + corsika::qgsjetII::Interaction model; + model.doInteraction(view); + [[maybe_unused]] const GrammageType length = model.getInteractionLength(particle); + + CHECK(length / (1_g / square(1_cm)) == Approx(20.13).margin(0.1)); + } + + SECTION("Heavy nuclei") { + + auto [stackPtr, secViewPtr] = setup::testing::setup_stack( + Code::Nucleus, 1000, 1000, 1100_GeV, (setup::Environment::BaseNodeType* const)nodePtr, + *csPtr); + setup::StackView& view = *(secViewPtr.get()); + auto particle = stackPtr->first(); + auto projectile = secViewPtr->getProjectile(); + auto const projectileMomentum = projectile.getMomentum(); + + corsika::qgsjetII::Interaction model; + + CHECK_THROWS(model.getCrossSection(Code::Nucleus, Code::Nucleus, 100_GeV, 10., 1000.)); + CHECK_THROWS(model.getCrossSection(Code::Nucleus, Code::Nucleus, 100_GeV, 1000., 10.)); + CHECK_THROWS(model.doInteraction(view)); + CHECK_THROWS(model.getInteractionLength(particle)); + } + + SECTION("Allowed Particles") { + + auto [stackPtr, secViewPtr] = setup::testing::setup_stack( + Code::Electron, 0, 0, 1100_GeV, (setup::Environment::BaseNodeType* const)nodePtr, + *csPtr); + setup::StackView& view = *(secViewPtr.get()); + auto particle = stackPtr->first(); + auto projectile = secViewPtr->getProjectile(); + auto const projectileMomentum = projectile.getMomentum(); + + corsika::qgsjetII::Interaction model; + + GrammageType const length = model.getInteractionLength(particle); + CHECK(length / (1_g / square(1_cm)) == std::numeric_limits<double>::infinity()); + } + } -- GitLab