1818#include " ALICE3/Core/Decayer.h"
1919#include " ALICE3/Core/TrackUtilities.h"
2020#include " ALICE3/DataModel/OTFMCParticle.h"
21-
22- #include < CCDB/BasicCCDBManager.h>
21+ #include < Framework/runDataProcessing.h>
2322#include < CommonConstants/MathConstants.h>
2423#include < CommonConstants/PhysicsConstants.h>
25- #include < DCAFitter/DCAFitterN.h>
26- #include < DataFormatsParameters/GRPMagField.h>
27- #include < DetectorsBase/Propagator.h>
28- #include < DetectorsVertexing/PVertexer.h>
29- #include < DetectorsVertexing/PVertexerHelpers.h>
30- #include < Field/MagneticField.h>
3124#include < Framework/AnalysisDataModel.h>
3225#include < Framework/AnalysisTask.h>
3326#include < Framework/HistogramRegistry.h>
3427#include < Framework/O2DatabasePDGPlugin.h>
35- #include < Framework/StaticFor.h>
36- #include < Framework/runDataProcessing.h>
37- #include < ReconstructionDataFormats/DCA.h>
38- #include < SimulationDataFormat/InteractionSampler.h>
3928
4029#include < TPDGCode.h>
4130
@@ -69,14 +58,15 @@ static const std::vector<int> pdgCodes{kK0Short,
6958 kOmegaPlusBar };
7059
7160struct OnTheFlyDecayer {
72- Produces<aod::McParticlesWithDau > tableMcParticlesWithDau;
61+ Produces<aod::McPartsWithDau > tableMcParticlesWithDau;
7362
7463 o2::upgrade::Decayer decayer;
7564 Service<o2::framework::O2DatabasePDG> pdgDB;
7665 std::map<int , std::vector<o2::upgrade::OTFParticle>> mDecayDaughters ;
7766
7867 Configurable<int > seed{" seed" , 0 , " Set seed for particle decayer" };
7968 Configurable<float > magneticField{" magneticField" , 20 ., " Magnetic field (kG)" };
69+ Configurable<float > maxEta{" maxEta" , 2.5 , " Only decay particles that appear within selected eta range" };
8070 Configurable<LabeledArray<int >> enabledDecays{" enabledDecays" ,
8171 {DefaultParameters[0 ], NumDecays, NumParameters, particleNames, parameterNames},
8272 " Enable option for particle to be decayed: 0 - no, 1 - yes" };
@@ -122,6 +112,15 @@ struct OnTheFlyDecayer {
122112 y (y),
123113 isAlive (isAlive),
124114 isPrimary (isPrimary) {}
115+
116+ bool hasNaN () const
117+ {
118+ return std::isnan (px) || std::isnan (py) || std::isnan (pz) || std::isnan (e) ||
119+ std::isnan (vx) || std::isnan (vy) || std::isnan (vz) || std::isnan (vt) ||
120+ std::isnan (phi) || std::isnan (eta) || std::isnan (pt) || std::isnan (p) ||
121+ std::isnan (y) || std::isnan (weight);
122+ }
123+
125124 int collisionId;
126125 int pdgCode;
127126 int statusCode;
@@ -148,6 +147,10 @@ struct OnTheFlyDecayer {
148147 }
149148 }
150149
150+ auto hNaNBookkeeping = histos.add <TH1>(" hNaNBookkeeping" , " hNaNBookkeeping" , kTH1D , {{2 , -0.5 , 1.5 }});
151+ hNaNBookkeeping->GetXaxis ()->SetBinLabel (1 , " OK" );
152+ hNaNBookkeeping->GetXaxis ()->SetBinLabel (2 , " NaN" );
153+
151154 histos.add (" K0S/hGenK0S" , " hGenK0S" , kTH1D , {axisPt});
152155 histos.add (" Lambda/hGenLambda" , " hGenLambda" , kTH1D , {axisPt});
153156 histos.add (" AntiLambda/hGenAntiLambda" , " hGenAntiLambda" , kTH1D , {axisPt});
@@ -175,30 +178,29 @@ struct OnTheFlyDecayer {
175178 mcParticlesAlice3.clear ();
176179 u_int64_t nStoredDaughters = 0 ;
177180 for (int index{0 }; index < static_cast <int >(mcParticles.size ()); ++index) {
178- const auto & particle = mcParticles.iteratorAt (index);
179- std::vector<o2::upgrade::OTFParticle> decayDaughters;
180- static constexpr int MaxNestedDecays = 10 ;
181- int nDecays = 0 ;
182- if (canDecay (particle.pdgCode ())) {
181+ const auto & particle = mcParticles.rawIteratorAt (index);
182+ std::vector<o2::upgrade::OTFParticle> decayDaughters, decayStack;
183+ if (canDecay (particle.pdgCode ()) && std::abs (particle.eta ()) < maxEta) {
183184 o2::track::TrackParCov o2track;
184185 o2::upgrade::convertMCParticleToO2Track (particle, o2track, pdgDB);
185- decayDaughters = decayer.decayParticle (pdgDB, o2track, particle.pdgCode ());
186- for (size_t idau{0 }; idau < decayDaughters.size (); ++idau) {
187- o2::upgrade::OTFParticle dau = decayDaughters[idau];
186+ decayStack = decayer.decayParticle (pdgDB, o2track, particle.pdgCode ());
187+ while (!decayStack.empty ()) {
188+ o2::upgrade::OTFParticle otfParticle = decayStack.back ();
189+ decayStack.pop_back ();
190+
191+ const bool stable = !canDecay (otfParticle.pdgCode ());
192+ otfParticle.setIsAlive (stable);
193+ decayDaughters.push_back (otfParticle);
194+
195+ if (stable) {
196+ continue ;
197+ }
198+
188199 o2::track::TrackParCov dauTrack;
189- o2::upgrade::convertOTFParticleToO2Track (dau, dauTrack, pdgDB);
190- if (canDecay (dau.pdgCode ())) {
191- dau.setIsAlive (false );
192- std::vector<o2::upgrade::OTFParticle> cascadingDaughers = decayer.decayParticle (pdgDB, dauTrack, dau.pdgCode ());
193- for (size_t idaudau{0 }; idaudau < cascadingDaughers.size (); ++idaudau) {
194- o2::upgrade::OTFParticle daudau = cascadingDaughers[idaudau];
195- decayDaughters.push_back (daudau);
196- if (MaxNestedDecays < ++nDecays) {
197- LOG (error) << " Seemingly stuck trying to perpetually decay products from pdg: " << particle.pdgCode ();
198- }
199- }
200- } else {
201- dau.setIsAlive (true );
200+ o2::upgrade::convertOTFParticleToO2Track (otfParticle, dauTrack, pdgDB);
201+ std::vector<o2::upgrade::OTFParticle> daughters = decayer.decayParticle (pdgDB, dauTrack, otfParticle.pdgCode ());
202+ for (o2::upgrade::OTFParticle dau : daughters) {
203+ decayStack.push_back (dau);
202204 }
203205 }
204206
@@ -338,7 +340,7 @@ struct OnTheFlyDecayer {
338340 // TODO: Particle status code
339341 // TODO: Expression columns
340342 // TODO: vt
341- auto mother = mcParticles.iteratorAt (index);
343+ auto mother = mcParticles.rawIteratorAt (index);
342344 mcParticlesAlice3.push_back (McParticleAlice3{mother.mcCollisionId (), dau.pdgCode (), 1 ,
343345 -1 , index, index, daughtersIdSlice[0 ], daughtersIdSlice[1 ], mother.weight (),
344346 dau.px (), dau.py (), dau.pz (), dau.e (),
@@ -348,8 +350,13 @@ struct OnTheFlyDecayer {
348350 }
349351
350352 for (const auto & particle : mcParticlesAlice3) {
351- std::span<const int > motherSpan (particle.mothersIds , 2 );
353+ if (particle.hasNaN ()) {
354+ histos.fill (HIST (" hNaNBookkeeping" ), 1 );
355+ continue ;
356+ }
352357
358+ histos.fill (HIST (" hNaNBookkeeping" ), 0 );
359+ std::span<const int > motherSpan (particle.mothersIds , 2 );
353360 tableMcParticlesWithDau (particle.collisionId , particle.pdgCode , particle.statusCode ,
354361 particle.flags , motherSpan, particle.daughtersIdSlice , particle.weight ,
355362 particle.px , particle.py , particle.pz , particle.e ,
0 commit comments