diff --git a/Documentation/Examples/cascade_example.cc b/Documentation/Examples/cascade_example.cc index cc37b2131566ad1ad39afcba3311f66532298154..ee2d9940b8c54809269dc40db77a91ff929389a3 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 31c16e2eab8164db2598c9149409cd5dc7900f76..51d7099500a4606ad818e91c6437c6872a6b9e8c 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 80ebf4b21b1999754a2ccf2d244e4dfd7e5e0b4f..081325f96038dc8c733f4599603e0ee97a22d04f 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 ae4869ea84ba228e1b59b2fe89778f2e932efc25..215994b42fb74daaba3b382513d94e50a45d430b 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 a1b92b0e3f9c27dd896012a16b56d0e063c3954f..bc4bf679e4c92bf5d5dc60188ecb3404eef05a35 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; }