From d748d69a6956429b594ab5698bb01bbe352f8245 Mon Sep 17 00:00:00 2001 From: Felix Riehn <felix@matilda> Date: Fri, 31 Jul 2020 11:03:47 +0100 Subject: [PATCH] comment on limited precision --- Processes/Sibyll/testSibyll.cc | 49 ++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/Processes/Sibyll/testSibyll.cc b/Processes/Sibyll/testSibyll.cc index 94aa6394c..23c9eb043 100644 --- a/Processes/Sibyll/testSibyll.cc +++ b/Processes/Sibyll/testSibyll.cc @@ -119,7 +119,7 @@ TEST_CASE("SibyllInterface", "[processes]") { random::RNGManager::GetInstance().RegisterRandomStream("s_rndm"); - SECTION("InteractionInterface") { + SECTION("InteractionInterface - low energy") { setup::Stack stack; const HEPEnergyType E0 = 60_GeV; @@ -141,22 +141,49 @@ TEST_CASE("SibyllInterface", "[processes]") { [[maybe_unused]] const process::EProcessReturn ret = model.DoInteraction(projectile); auto const pSum = sumMomentum(view, cs); - // for debugging! - std::cout << pSum.GetComponents(cs) << std::endl; - std::cout << plab.GetComponents(cs) << std::endl; + /* + Interactions between hadrons (h) and nuclei (A) in Sibyll are treated in the + hadron-nucleon center-of-mass frame (hnCoM). In addition the incoming hadron (h) and + nucleon (n) are assumed massless, such that the energy and momentum in the hnCoM are + : E_i_cm = 0.5 * SQS and P_i_cm = +- 0.5 * SQS where i is either the projectile + hadron or the target nucleon and SQS is the hadron-nucleon center-of-mass energy. - CHECK(pSum.GetComponents(cs).GetX() / P0 == - Approx(1).margin(model.get_relative_precision_momentum())); + Any hadron-nucleus event can contain several nucleon interactions. In case of Nw + (number of wounded nucleons) in the hadron-nucleus interaction the total energy and + momentum in the hadron-nucleon center-of-mass frame are: momentum: p_projectile + + p_nucleon_1 + p_nucleon_2 + .... p_nucleon_Nw = -(Nw-1) Pcm with center-of-mass + momentum Pcm = p_projectile = - p_nucleon_i energy: E_projectile + E_nucleon_1 + ... + E_nucleon_Nw = (Nw+1) / 2 * SQS with SQS the hadron-nucleon center-of-mass energy. + + In case of a single interaction (Nw=1), by definition, the total momentum is zero in + the hadron-nucleon frame. After the boost to the lab. frame the lab. momentum of the + projectile before the interaction is recoverred. + + In case of multiple interactions (Nw>1), the momentum is not zero and the total + momentum in the lab. frame after the boost is different from the original projectile + (momentum violation). + + The level of violation of momentum conservation is further enhanced due to the + approximation of massless hadrons. At low energies (~10GeV), where the masses can + not be neglected the violation is at the level of percent. + + For this reason the numerical precision in these tests is limited to 5% at low + energies. see also: + + Issue 272 / MR 204 + https://gitlab.ikp.kit.edu/AirShowerPhysics/corsika/-/merge_requests/204 + + */ + + CHECK(pSum.GetComponents(cs).GetX() / P0 == Approx(1).margin(0.05)); 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(plab.norm() * model.get_relative_precision_momentum() / 1_GeV)); - CHECK(pSum.norm() / P0 == Approx(1).margin(model.get_relative_precision_momentum())); + CHECK((pSum - plab).norm() / 1_GeV == Approx(0).margin(plab.norm() * 0.05 / 1_GeV)); + CHECK(pSum.norm() / P0 == Approx(1).margin(0.05)); [[maybe_unused]] const GrammageType length = model.GetInteractionLength(particle); } - + SECTION("NuclearInteractionInterface") { setup::Stack stack; -- GitLab