Skip to content

Commit 8a16f98

Browse files
committed
Fix crashes from when decay products have NaN's
1 parent 9840db8 commit 8a16f98

File tree

5 files changed

+56
-49
lines changed

5 files changed

+56
-49
lines changed

ALICE3/DataModel/OTFMCParticle.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ DECLARE_SOA_COLUMN(IsPrimary, isPrimary, bool);
3737

3838
} // namespace otfmcparticle
3939

40-
DECLARE_SOA_TABLE_FULL(McParticlesWithDau, "McParticlesWithDau", "AOD", "MCPARTICLEWITHDAU",
40+
DECLARE_SOA_TABLE_FULL(McPartsWithDau, "McPartsWithDau", "AOD", "MCPARTSWITHDAU",
4141
o2::soa::Index<>,
4242
mcparticle::McCollisionId,
4343
mcparticle::PdgCode,
@@ -69,7 +69,7 @@ DECLARE_SOA_TABLE_FULL(McParticlesWithDau, "McParticlesWithDau", "AOD", "MCPARTI
6969
mcparticle::GetProcess<mcparticle::Flags, mcparticle::StatusCode>,
7070
mcparticle::IsPhysicalPrimary<mcparticle::Flags>);
7171

72-
using McParticleWithDau = McParticlesWithDau::iterator;
72+
using McPartWithDau = McPartsWithDau::iterator;
7373

7474
} // namespace o2::aod
7575

ALICE3/TableProducer/OTF/onTheFlyDecayer.cxx

Lines changed: 43 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,13 @@
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

7160
struct 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,

ALICE3/TableProducer/OTF/onTheFlyTracker.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ struct OnTheFlyTracker {
705705

706706
float dNdEta = 0.f; // Charged particle multiplicity to use in the efficiency evaluation
707707
std::pair<float, float> vertexReconstructionEfficiencyCounters = {0, 0}; // {nVerticesWithMoreThan2Contributors, nVerticesReconstructed}
708-
void processWithLUTs(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles, int const& icfg)
708+
void processWithLUTs(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles, const int icfg)
709709
{
710710
vertexReconstructionEfficiencyCounters.first += 1;
711711
const int lastTrackIndex = tableStoredTracksCov.lastIndex() + 1; // bookkeep the last added track
@@ -1736,7 +1736,7 @@ struct OnTheFlyTracker {
17361736
}
17371737
}
17381738

1739-
void processConfigurationDev(aod::McCollision const& mcCollision, aod::McParticlesWithDau const& mcParticles, int const& icfg)
1739+
void processConfigurationDev(aod::McCollision const& mcCollision, aod::McPartsWithDau const& mcParticles, const int icfg)
17401740
{
17411741
// const int lastTrackIndex = tableStoredTracksCov.lastIndex() + 1; // bookkeep the last added track
17421742
const std::string histPath = "Configuration_" + std::to_string(icfg) + "/";
@@ -1991,7 +1991,7 @@ struct OnTheFlyTracker {
19911991
}
19921992
}
19931993

1994-
void processDecayer(aod::McCollision const& mcCollision, aod::McParticlesWithDau const& mcParticles)
1994+
void processDecayer(aod::McCollision const& mcCollision, aod::McPartsWithDau const& mcParticles)
19951995
{
19961996
for (size_t icfg = 0; icfg < mSmearer.size(); ++icfg) {
19971997
processConfigurationDev(mcCollision, mcParticles, static_cast<int>(icfg));

ALICE3/Tasks/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,6 @@ o2physics_add_dpl_workflow(alice3-dq-efficiency
9595
COMPONENT_NAME Analysis)
9696

9797
o2physics_add_dpl_workflow(alice3-decayer-qa
98-
SOURCES alice3DecayerQA.cxx
98+
SOURCES alice3DecayerQa.cxx
9999
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
100100
COMPONENT_NAME Analysis)
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ struct Alice3DecayerQA {
6060
Partition<aod::McParticles> trueKa = aod::mcparticle::pdgCode == static_cast<int>(kKMinus);
6161
Partition<aod::McParticles> truePr = aod::mcparticle::pdgCode == static_cast<int>(kProton);
6262

63-
Partition<aod::McParticlesWithDau> trueElWithDau = aod::mcparticle::pdgCode == static_cast<int>(kElectron);
64-
Partition<aod::McParticlesWithDau> trueMuWithDau = aod::mcparticle::pdgCode == static_cast<int>(kMuonMinus);
65-
Partition<aod::McParticlesWithDau> truePiWithDau = aod::mcparticle::pdgCode == static_cast<int>(kPiPlus);
66-
Partition<aod::McParticlesWithDau> trueKaWithDau = aod::mcparticle::pdgCode == static_cast<int>(kKMinus);
67-
Partition<aod::McParticlesWithDau> truePrWithDau = aod::mcparticle::pdgCode == static_cast<int>(kProton);
63+
Partition<aod::McPartsWithDau> trueElWithDau = aod::mcparticle::pdgCode == static_cast<int>(kElectron);
64+
Partition<aod::McPartsWithDau> trueMuWithDau = aod::mcparticle::pdgCode == static_cast<int>(kMuonMinus);
65+
Partition<aod::McPartsWithDau> truePiWithDau = aod::mcparticle::pdgCode == static_cast<int>(kPiPlus);
66+
Partition<aod::McPartsWithDau> trueKaWithDau = aod::mcparticle::pdgCode == static_cast<int>(kKMinus);
67+
Partition<aod::McPartsWithDau> truePrWithDau = aod::mcparticle::pdgCode == static_cast<int>(kProton);
6868

6969
void init(o2::framework::InitContext&)
7070
{
@@ -123,7 +123,7 @@ struct Alice3DecayerQA {
123123
}
124124
}
125125

126-
void processMCWithDau(const aod::McCollision&, const aod::McParticlesWithDau& particles)
126+
void processMCWithDau(const aod::McCollision&, const aod::McPartsWithDau& particles)
127127
{
128128
for (const auto& particle : trueElWithDau) {
129129
histos.fill(HIST("MCWithDau/hElPt"), particle.pt());
@@ -155,7 +155,7 @@ struct Alice3DecayerQA {
155155
histos.fill(HIST("MCWithDau/hEta"), particle.eta());
156156
histos.fill(HIST("MCWithDau/hRapidity"), particle.y());
157157
histos.fill(HIST("MCWithDau/hIsAlive"), particle.isAlive());
158-
histos.fill(HIST("MCWithDau/hIsPrimary"), particle.isPrimary());
158+
histos.fill(HIST("MCWithDau/hIsPrimary"), particle.isPhysicalPrimary());
159159
histos.fill(HIST("MCWithDau/hPx"), particle.px());
160160
histos.fill(HIST("MCWithDau/hPy"), particle.py());
161161
histos.fill(HIST("MCWithDau/hPz"), particle.pz());

0 commit comments

Comments
 (0)