IAP GITLAB

Skip to content
Snippets Groups Projects
Commit 0f6b023e authored by Felix Riehn's avatar Felix Riehn Committed by Ralf Ulrich
Browse files

Sibyll coverage

parent e7a52608
No related branches found
No related tags found
No related merge requests found
...@@ -44,34 +44,6 @@ namespace corsika::sibyll { ...@@ -44,34 +44,6 @@ namespace corsika::sibyll {
CORSIKA_LOG_DEBUG("Sibyll::Interaction n={}, Nnuc={}", count_, nucCount_); CORSIKA_LOG_DEBUG("Sibyll::Interaction n={}, Nnuc={}", count_, nucCount_);
} }
inline void Interaction::setStable(std::vector<corsika::Code> const& vParticleList) {
for (auto p : vParticleList) Interaction::setStable(p);
}
inline void Interaction::setUnstable(std::vector<corsika::Code> const& vParticleList) {
for (auto p : vParticleList) Interaction::setUnstable(p);
}
inline void Interaction::setUnstable(const corsika::Code vCode) {
CORSIKA_LOG_DEBUG("Sibyll::Interaction: setting {} unstable..", vCode);
const int s_id = abs(corsika::sibyll::convertToSibyllRaw(vCode));
s_csydec_.idb[s_id - 1] = abs(s_csydec_.idb[s_id - 1]);
}
inline void Interaction::setStable(const corsika::Code vCode) {
CORSIKA_LOG_DEBUG("Sibyll::Interaction: setting {} stable..", vCode);
const int s_id = abs(corsika::sibyll::convertToSibyllRaw(vCode));
s_csydec_.idb[s_id - 1] = (-1) * abs(s_csydec_.idb[s_id - 1]);
}
inline void Interaction::setAllUnstable() {
for (int i = 0; i < 99; ++i) s_csydec_.idb[i] = abs(s_csydec_.idb[i]);
}
inline void Interaction::setAllStable() {
for (int i = 0; i < 99; ++i) s_csydec_.idb[i] = -1 * abs(s_csydec_.idb[i]);
}
inline std::tuple<corsika::CrossSectionType, corsika::CrossSectionType> inline std::tuple<corsika::CrossSectionType, corsika::CrossSectionType>
Interaction::getCrossSection(const corsika::Code BeamId, const corsika::Code TargetId, Interaction::getCrossSection(const corsika::Code BeamId, const corsika::Code TargetId,
const corsika::HEPEnergyType CoMenergy) const { const corsika::HEPEnergyType CoMenergy) const {
......
...@@ -52,14 +52,6 @@ namespace corsika::sibyll { ...@@ -52,14 +52,6 @@ namespace corsika::sibyll {
void doInteraction(TSecondaries&); void doInteraction(TSecondaries&);
private: private:
void setStable(std::vector<Code> const&);
void setUnstable(std::vector<Code> const&);
void setUnstable(Code const);
void setStable(Code const);
void setAllUnstable();
void setAllStable();
int getMaxTargetMassNumber() const { return maxTargetMassNumber_; } int getMaxTargetMassNumber() const { return maxTargetMassNumber_; }
HEPEnergyType getMinEnergyCoM() const { return minEnergyCoM_; } HEPEnergyType getMinEnergyCoM() const { return minEnergyCoM_; }
HEPEnergyType getMaxEnergyCoM() const { return maxEnergyCoM_; } HEPEnergyType getMaxEnergyCoM() const { return maxEnergyCoM_; }
......
...@@ -68,8 +68,11 @@ TEST_CASE("Sibyll", "[processes]") { ...@@ -68,8 +68,11 @@ TEST_CASE("Sibyll", "[processes]") {
} }
SECTION("sibyll mass") { SECTION("sibyll mass") {
CHECK_FALSE(corsika::sibyll::getSibyllMass(Code::Electron) == 0_GeV); CHECK_FALSE(corsika::sibyll::getSibyllMass(Code::Electron) == 0_GeV);
// Nucleus not a particle
CHECK_THROWS(corsika::sibyll::getSibyllMass(Code::Nucleus));
// Higgs not a particle in Sibyll
CHECK_THROWS(corsika::sibyll::getSibyllMass(Code::H0));
} }
} }
...@@ -129,6 +132,16 @@ TEST_CASE("SibyllInterface", "[processes]") { ...@@ -129,6 +132,16 @@ TEST_CASE("SibyllInterface", "[processes]") {
CHECK(xs_prod_pp == xs_prod_pn); CHECK(xs_prod_pp == xs_prod_pn);
CHECK(xs_ela_pp == xs_ela_pHydrogen); CHECK(xs_ela_pp == xs_ela_pHydrogen);
CHECK(xs_ela_pn == xs_ela_pHydrogen); CHECK(xs_ela_pn == xs_ela_pHydrogen);
// out of range
// beam particle
CHECK_THROWS(
std::get<0>(model.getCrossSection(Code::Electron, Code::Hydrogen, 100_GeV)));
// target particle
CHECK(std::get<0>(model.getCrossSection(Code::Proton, Code::Electron, 100_GeV)) ==
std::numeric_limits<double>::infinity() * 1_mb);
// energy out of range
CHECK_THROWS(std::get<0>(model.getCrossSection(Code::Proton, Code::Hydrogen, 5_GeV)));
} }
SECTION("InteractionInterface - low energy") { SECTION("InteractionInterface - low energy") {
...@@ -142,7 +155,9 @@ TEST_CASE("SibyllInterface", "[processes]") { ...@@ -142,7 +155,9 @@ TEST_CASE("SibyllInterface", "[processes]") {
auto particle = stack->first(); auto particle = stack->first();
Interaction model; // also print particles after sibyll was called
Interaction model(true);
model.doInteraction(view); model.doInteraction(view);
auto const pSum = sumMomentum(view, cs); auto const pSum = sumMomentum(view, cs);
...@@ -209,13 +224,59 @@ TEST_CASE("SibyllInterface", "[processes]") { ...@@ -209,13 +224,59 @@ TEST_CASE("SibyllInterface", "[processes]") {
CHECK((pSum - plab).getNorm() / 1_GeV == CHECK((pSum - plab).getNorm() / 1_GeV ==
Approx(0).margin(plab.getNorm() * 0.05 / 1_GeV)); Approx(0).margin(plab.getNorm() * 0.05 / 1_GeV));
CHECK(pSum.getNorm() / P0 == Approx(1).margin(0.05)); CHECK(pSum.getNorm() / P0 == Approx(1).margin(0.05));
[[maybe_unused]] const GrammageType length = model.getInteractionLength(particle); [[maybe_unused]] GrammageType const length = model.getInteractionLength(particle);
CHECK(length / 1_g * 1_cm * 1_cm == Approx(88.7).margin(0.1)); CHECK(length / 1_g * 1_cm * 1_cm == Approx(88.7).margin(0.1));
// CHECK(view.getEntries() == 9); //! \todo: this was 20 before refactory-2020: check // CHECK(view.getEntries() == 9); //! \todo: this was 20 before refactory-2020: check
// "also sibyll not stable wrt. to compiler // "also sibyll not stable wrt. to compiler
// changes" // changes"
} }
SECTION("InteractionInterface - energy too low") {
const HEPEnergyType P0 = 5_GeV;
auto [stack, viewPtr] = setup::testing::setup_stack(
Code::Proton, 0, 0, P0, (setup::Environment::BaseNodeType* const)nodePtr, cs);
MomentumVector plab =
MomentumVector(cs, {P0, 0_eV, 0_eV}); // this is secret knowledge about setupStack
setup::StackView& view = *viewPtr;
auto particle = stack->first();
Interaction model;
CHECK_THROWS(model.doInteraction(view));
[[maybe_unused]] GrammageType const length = model.getInteractionLength(particle);
CHECK(model.getInteractionLength(particle) / 1_g * 1_cm * 1_cm ==
std::numeric_limits<double>::infinity());
}
SECTION("InteractionInterface - energy too high") {
const HEPEnergyType P0 = 1000_EeV;
auto [stack, viewPtr] = setup::testing::setup_stack(
Code::Proton, 0, 0, P0, (setup::Environment::BaseNodeType* const)nodePtr, cs);
MomentumVector plab =
MomentumVector(cs, {P0, 0_eV, 0_eV}); // this is secret knowledge about setupStack
setup::StackView& view = *viewPtr;
Interaction model;
CHECK_THROWS(model.doInteraction(view));
}
SECTION("InteractionInterface - target nucleus out of range") {
auto [env1, csPtr1, nodePtr1] = setup::testing::setup_environment(Code::Argon);
auto const& cs1 = *csPtr1;
const HEPEnergyType P0 = 150_GeV;
auto [stack, viewPtr] = setup::testing::setup_stack(
Code::Electron, 0, 0, P0, (setup::Environment::BaseNodeType* const)nodePtr1, cs1);
MomentumVector plab = MomentumVector(
cs1, {P0, 0_eV, 0_eV}); // this is secret knowledge about setupStack
setup::StackView& view = *viewPtr;
Interaction model;
CHECK_THROWS(model.doInteraction(view));
}
SECTION("NuclearInteractionInterface") { SECTION("NuclearInteractionInterface") {
auto [stack, viewPtr] = auto [stack, viewPtr] =
...@@ -248,16 +309,32 @@ TEST_CASE("SibyllInterface", "[processes]") { ...@@ -248,16 +309,32 @@ TEST_CASE("SibyllInterface", "[processes]") {
Decay model; Decay model;
model.printDecayConfig(); model.printDecayConfig();
[[maybe_unused]] const TimeType time = model.getLifetime(particle); [[maybe_unused]] const TimeType time = model.getLifetime(particle);
auto const gamma = particle.getEnergy() / particle.getMass();
CHECK(time == get_lifetime(Code::Lambda0) * gamma);
model.doDecay(view); model.doDecay(view);
// run checks // run checks
// lambda decays into proton and pi- or neutron and pi+ // lambda decays into proton and pi- or neutron and pi+
CHECK(stack.getEntries() == 3); CHECK(stack.getEntries() == 3);
} }
SECTION("DecayInterface - decay not handled") {
// sibyll does not know the higgs for example
auto [stackPtr, viewPtr] = setup::testing::setup_stack(
Code::H0, 0, 0, 10_GeV, (setup::Environment::BaseNodeType* const)nodePtr, cs);
setup::StackView& view = *viewPtr;
auto& stack = *stackPtr;
auto particle = stack.first();
Decay model;
CHECK(model.getLifetime(particle) == std::numeric_limits<double>::infinity() * 1_s);
CHECK_THROWS(model.doDecay(view));
}
SECTION("DecayConfiguration") { SECTION("DecayConfiguration") {
Decay model({Code::PiPlus, Code::PiMinus}); Decay model({Code::PiPlus, Code::PiMinus});
model.printDecayConfig();
CHECK(model.isDecayHandled(Code::PiPlus)); CHECK(model.isDecayHandled(Code::PiPlus));
CHECK(model.isDecayHandled(Code::PiMinus)); CHECK(model.isDecayHandled(Code::PiMinus));
CHECK_FALSE(model.isDecayHandled(Code::KPlus)); CHECK_FALSE(model.isDecayHandled(Code::KPlus));
...@@ -269,10 +346,13 @@ TEST_CASE("SibyllInterface", "[processes]") { ...@@ -269,10 +346,13 @@ TEST_CASE("SibyllInterface", "[processes]") {
model.setHandleDecay(particleTestList); model.setHandleDecay(particleTestList);
for (auto& pCode : particleTestList) CHECK(model.isDecayHandled(pCode)); for (auto& pCode : particleTestList) CHECK(model.isDecayHandled(pCode));
// individually // set decay individually
model.setHandleDecay(Code::KMinus); model.setHandleDecay(Code::KMinus);
// fail
CHECK_THROWS(model.setHandleDecay(Code::H0));
// possible decays // possible decays
CHECK_FALSE(model.canHandleDecay(Code::H0));
CHECK_FALSE(model.canHandleDecay(Code::Proton)); CHECK_FALSE(model.canHandleDecay(Code::Proton));
CHECK_FALSE(model.canHandleDecay(Code::Electron)); CHECK_FALSE(model.canHandleDecay(Code::Electron));
CHECK(model.canHandleDecay(Code::PiPlus)); CHECK(model.canHandleDecay(Code::PiPlus));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment