From 3e666822e536d561eca58da04521bce088158d14 Mon Sep 17 00:00:00 2001 From: ralfulrich <ralf.ulrich@kit.edu> Date: Wed, 19 Dec 2018 16:33:55 +0100 Subject: [PATCH] converted EProcessReturn to bitwise enum, as it was desinged for --- Documentation/Examples/cascade_example.cc | 6 +++--- Framework/Cascade/Cascade.h | 5 ++++- Framework/Cascade/testCascade.cc | 3 ++- Framework/ProcessSequence/ProcessReturn.h | 22 ++++++++++++++++----- Framework/ProcessSequence/ProcessSequence.h | 4 ++-- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/Documentation/Examples/cascade_example.cc b/Documentation/Examples/cascade_example.cc index cc37b2131..ee2d9940b 100644 --- a/Documentation/Examples/cascade_example.cc +++ b/Documentation/Examples/cascade_example.cc @@ -141,18 +141,18 @@ public: cout << "removing em. particle..." << endl; fEmEnergy += p.GetEnergy(); fEmCount += 1; - p.Delete(); + // p.Delete(); ret = EProcessReturn::eParticleAbsorbed; } else if (isInvisible(pid)) { cout << "removing inv. particle..." << endl; fInvEnergy += p.GetEnergy(); fInvCount += 1; - p.Delete(); + // p.Delete(); ret = EProcessReturn::eParticleAbsorbed; } else if (isBelowEnergyCut(p)) { cout << "removing low en. particle..." << endl; fEnergy += p.GetEnergy(); - p.Delete(); + // p.Delete(); ret = EProcessReturn::eParticleAbsorbed; } return ret; diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h index 31c16e2ea..51d709950 100644 --- a/Framework/Cascade/Cascade.h +++ b/Framework/Cascade/Cascade.h @@ -119,7 +119,10 @@ namespace corsika::cascade { fProcessSequence.DoContinuous(particle, step, fStack); if (status == corsika::process::EProcessReturn::eParticleAbsorbed) { - // fStack.Delete(particle); // TODO: check if this is really needed + std::cout << "Cascade: delete absorbed particle " << particle.GetPID() << " " + << particle.GetEnergy() / 1_GeV << "GeV" << std::endl; + particle.Delete(); + return; } else { std::cout << "sth. happening before geometric limit ?" diff --git a/Framework/Cascade/testCascade.cc b/Framework/Cascade/testCascade.cc index 80ebf4b21..081325f96 100644 --- a/Framework/Cascade/testCascade.cc +++ b/Framework/Cascade/testCascade.cc @@ -80,7 +80,7 @@ public: } template <typename Particle, typename T, typename Stack> - void DoContinuous(Particle& p, T&, Stack& s) const { + EProcessReturn DoContinuous(Particle& p, T&, Stack& s) const { EnergyType E = p.GetEnergy(); if (E < 85_MeV) { p.Delete(); @@ -95,6 +95,7 @@ public: pnew.SetPosition(p.GetPosition()); pnew.SetMomentum(p.GetMomentum()); } + return EProcessReturn::eOk; } void Init() { fCount = 0; } diff --git a/Framework/ProcessSequence/ProcessReturn.h b/Framework/ProcessSequence/ProcessReturn.h index ae4869ea8..215994b42 100644 --- a/Framework/ProcessSequence/ProcessReturn.h +++ b/Framework/ProcessSequence/ProcessReturn.h @@ -20,13 +20,25 @@ namespace corsika::process { that can be accumulated easily with "|=" */ - enum class EProcessReturn { - eOk = 1, - eParticleAbsorbed = 2, - eInteracted = 3, - eDecayed = 4, + enum class EProcessReturn : int { + eOk = (1 << 0), + eParticleAbsorbed = (1 << 2), + eInteracted = (1 << 3), + eDecayed = (1 << 4), }; + inline EProcessReturn operator|(EProcessReturn a, EProcessReturn b) { + return static_cast<EProcessReturn>(static_cast<int>(a) | static_cast<int>(b)); + } + + inline EProcessReturn& operator|=(EProcessReturn& a, EProcessReturn b) { + return a = a | b; + } + + inline bool operator==(EProcessReturn a, EProcessReturn b) { + return (static_cast<int>(a) & static_cast<int>(b)) != 0; + } + } // namespace corsika::process #endif diff --git a/Framework/ProcessSequence/ProcessSequence.h b/Framework/ProcessSequence/ProcessSequence.h index a1b92b0e3..bc4bf679e 100644 --- a/Framework/ProcessSequence/ProcessSequence.h +++ b/Framework/ProcessSequence/ProcessSequence.h @@ -60,11 +60,11 @@ namespace corsika::process { EProcessReturn ret = EProcessReturn::eOk; if constexpr (std::is_base_of<ContinuousProcess<T1>, T1>::value || is_process_sequence<T1>::value) { - A.DoContinuous(p, t, s); + ret |= A.DoContinuous(p, t, s); } if constexpr (std::is_base_of<ContinuousProcess<T2>, T2>::value || is_process_sequence<T2>::value) { - B.DoContinuous(p, t, s); + ret |= B.DoContinuous(p, t, s); } return ret; } -- GitLab