From b91799fd5cda6f700c0c7eda69d82e9ef1159775 Mon Sep 17 00:00:00 2001 From: Felix Riehn <felix@matilda> Date: Mon, 27 Jul 2020 18:05:11 +0100 Subject: [PATCH] added expected precision to sibyll --- Processes/Sibyll/Interaction.h | 26 ++++++++++++++++++++++++++ Processes/Sibyll/testSibyll.cc | 9 ++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/Processes/Sibyll/Interaction.h b/Processes/Sibyll/Interaction.h index 61e8c30dd..e7f30add2 100644 --- a/Processes/Sibyll/Interaction.h +++ b/Processes/Sibyll/Interaction.h @@ -12,6 +12,7 @@ #include <corsika/particles/ParticleProperties.h> #include <corsika/process/InteractionProcess.h> +#include <corsika/process/sibyll/sibyll2.3d.h> #include <corsika/random/RNGManager.h> #include <corsika/units/PhysicalUnits.h> #include <tuple> @@ -39,6 +40,18 @@ namespace corsika::process::sibyll { int GetMaxTargetMassNumber() const { return maxTargetMassNumber_; } corsika::units::si::HEPEnergyType GetMinEnergyCoM() const { return minEnergyCoM_; } corsika::units::si::HEPEnergyType GetMaxEnergyCoM() const { return maxEnergyCoM_; } + double get_relative_precision_momentum() const { + if (get_nwounded() == 1) + return precision_momentum_single_; + else + return precision_momentum_ * get_nwounded(); + } + double get_relative_precision_energy() const { + if (get_nwounded() == 1) + return precision_energy_single_; + else + return precision_energy_ * get_nwounded(); + } bool IsValidTarget(corsika::particles::Code TargetId) const { return (corsika::particles::GetNucleusA(TargetId) < maxTargetMassNumber_) && corsika::particles::IsNucleus(TargetId); @@ -68,6 +81,19 @@ namespace corsika::process::sibyll { const corsika::units::si::HEPEnergyType maxEnergyCoM_ = 1.e6 * 1e9 * corsika::units::si::electronvolt; const int maxTargetMassNumber_ = 18; + /* + for interactions with a single target nucleon energy and momentum conservation + are fullfilled + for more than one target nucleon, conservation is only approximately true in the + lab frame in addition there seems to be a bug in sibyll that leads to violation of + momentum conservation already in the nuc-nuc frame. see Issue #272 + + https://gitlab.ikp.kit.edu/AirShowerPhysics/corsika/-/issues/272 + */ + const double precision_energy_single_ = 1.e-8; + const double precision_momentum_single_ = 1.e-8; + const double precision_energy_ = 2.e-2; + const double precision_momentum_ = 5.e-2; }; } // namespace corsika::process::sibyll diff --git a/Processes/Sibyll/testSibyll.cc b/Processes/Sibyll/testSibyll.cc index 508b80e0f..94aa6394c 100644 --- a/Processes/Sibyll/testSibyll.cc +++ b/Processes/Sibyll/testSibyll.cc @@ -145,12 +145,15 @@ TEST_CASE("SibyllInterface", "[processes]") { std::cout << pSum.GetComponents(cs) << std::endl; std::cout << plab.GetComponents(cs) << std::endl; - CHECK(pSum.GetComponents(cs).GetX() / P0 == Approx(1).margin(1e-4)); + CHECK(pSum.GetComponents(cs).GetX() / P0 == + Approx(1).margin(model.get_relative_precision_momentum())); CHECK(pSum.GetComponents(cs).GetY() / 1_GeV == Approx(0).margin(1e-4)); CHECK(pSum.GetComponents(cs).GetZ() / 1_GeV == Approx(0).margin(1e-4)); - CHECK((pSum - plab).norm() / 1_GeV == Approx(0).margin(1e-4)); - CHECK(pSum.norm() / P0 == Approx(1).margin(1e-4)); + CHECK( + (pSum - plab).norm() / 1_GeV == + Approx(0).margin(plab.norm() * model.get_relative_precision_momentum() / 1_GeV)); + CHECK(pSum.norm() / P0 == Approx(1).margin(model.get_relative_precision_momentum())); [[maybe_unused]] const GrammageType length = model.GetInteractionLength(particle); } -- GitLab