Skip to content

Commit c7ab83b

Browse files
committed
Merge remote-tracking branch 'upstream/master'
2 parents b5111b2 + 2e61882 commit c7ab83b

File tree

101 files changed

+10167
-3547
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+10167
-3547
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: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,13 @@
1919
#include "ALICE3/Core/TrackUtilities.h"
2020
#include "ALICE3/DataModel/OTFMCParticle.h"
2121

22-
#include <CCDB/BasicCCDBManager.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>
3628
#include <Framework/runDataProcessing.h>
37-
#include <ReconstructionDataFormats/DCA.h>
38-
#include <SimulationDataFormat/InteractionSampler.h>
3929

4030
#include <TPDGCode.h>
4131

@@ -69,14 +59,15 @@ static const std::vector<int> pdgCodes{kK0Short,
6959
kOmegaPlusBar};
7060

7161
struct OnTheFlyDecayer {
72-
Produces<aod::McParticlesWithDau> tableMcParticlesWithDau;
62+
Produces<aod::McPartsWithDau> tableMcParticlesWithDau;
7363

7464
o2::upgrade::Decayer decayer;
7565
Service<o2::framework::O2DatabasePDG> pdgDB;
7666
std::map<int, std::vector<o2::upgrade::OTFParticle>> mDecayDaughters;
7767

7868
Configurable<int> seed{"seed", 0, "Set seed for particle decayer"};
7969
Configurable<float> magneticField{"magneticField", 20., "Magnetic field (kG)"};
70+
Configurable<float> maxEta{"maxEta", 2.5, "Only decay particles that appear within selected eta range"};
8071
Configurable<LabeledArray<int>> enabledDecays{"enabledDecays",
8172
{DefaultParameters[0], NumDecays, NumParameters, particleNames, parameterNames},
8273
"Enable option for particle to be decayed: 0 - no, 1 - yes"};
@@ -122,6 +113,15 @@ struct OnTheFlyDecayer {
122113
y(y),
123114
isAlive(isAlive),
124115
isPrimary(isPrimary) {}
116+
117+
bool hasNaN() const
118+
{
119+
return std::isnan(px) || std::isnan(py) || std::isnan(pz) || std::isnan(e) ||
120+
std::isnan(vx) || std::isnan(vy) || std::isnan(vz) || std::isnan(vt) ||
121+
std::isnan(phi) || std::isnan(eta) || std::isnan(pt) || std::isnan(p) ||
122+
std::isnan(y) || std::isnan(weight);
123+
}
124+
125125
int collisionId;
126126
int pdgCode;
127127
int statusCode;
@@ -148,6 +148,10 @@ struct OnTheFlyDecayer {
148148
}
149149
}
150150

151+
auto hNaNBookkeeping = histos.add<TH1>("hNaNBookkeeping", "hNaNBookkeeping", kTH1D, {{2, -0.5, 1.5}});
152+
hNaNBookkeeping->GetXaxis()->SetBinLabel(1, "OK");
153+
hNaNBookkeeping->GetXaxis()->SetBinLabel(2, "NaN");
154+
151155
histos.add("K0S/hGenK0S", "hGenK0S", kTH1D, {axisPt});
152156
histos.add("Lambda/hGenLambda", "hGenLambda", kTH1D, {axisPt});
153157
histos.add("AntiLambda/hGenAntiLambda", "hGenAntiLambda", kTH1D, {axisPt});
@@ -175,30 +179,29 @@ struct OnTheFlyDecayer {
175179
mcParticlesAlice3.clear();
176180
u_int64_t nStoredDaughters = 0;
177181
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())) {
182+
const auto& particle = mcParticles.rawIteratorAt(index);
183+
std::vector<o2::upgrade::OTFParticle> decayDaughters, decayStack;
184+
if (canDecay(particle.pdgCode()) && std::abs(particle.eta()) < maxEta) {
183185
o2::track::TrackParCov o2track;
184186
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];
187+
decayStack = decayer.decayParticle(pdgDB, o2track, particle.pdgCode());
188+
while (!decayStack.empty()) {
189+
o2::upgrade::OTFParticle otfParticle = decayStack.back();
190+
decayStack.pop_back();
191+
192+
const bool stable = !canDecay(otfParticle.pdgCode());
193+
otfParticle.setIsAlive(stable);
194+
decayDaughters.push_back(otfParticle);
195+
196+
if (stable) {
197+
continue;
198+
}
199+
188200
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);
201+
o2::upgrade::convertOTFParticleToO2Track(otfParticle, dauTrack, pdgDB);
202+
std::vector<o2::upgrade::OTFParticle> daughters = decayer.decayParticle(pdgDB, dauTrack, otfParticle.pdgCode());
203+
for (o2::upgrade::OTFParticle dau : daughters) {
204+
decayStack.push_back(dau);
202205
}
203206
}
204207

@@ -338,7 +341,7 @@ struct OnTheFlyDecayer {
338341
// TODO: Particle status code
339342
// TODO: Expression columns
340343
// TODO: vt
341-
auto mother = mcParticles.iteratorAt(index);
344+
auto mother = mcParticles.rawIteratorAt(index);
342345
mcParticlesAlice3.push_back(McParticleAlice3{mother.mcCollisionId(), dau.pdgCode(), 1,
343346
-1, index, index, daughtersIdSlice[0], daughtersIdSlice[1], mother.weight(),
344347
dau.px(), dau.py(), dau.pz(), dau.e(),
@@ -348,8 +351,13 @@ struct OnTheFlyDecayer {
348351
}
349352

350353
for (const auto& particle : mcParticlesAlice3) {
351-
std::span<const int> motherSpan(particle.mothersIds, 2);
354+
if (particle.hasNaN()) {
355+
histos.fill(HIST("hNaNBookkeeping"), 1);
356+
continue;
357+
}
352358

359+
histos.fill(HIST("hNaNBookkeeping"), 0);
360+
std::span<const int> motherSpan(particle.mothersIds, 2);
353361
tableMcParticlesWithDau(particle.collisionId, particle.pdgCode, particle.statusCode,
354362
particle.flags, motherSpan, particle.daughtersIdSlice, particle.weight,
355363
particle.px, particle.py, particle.pz, particle.e,

ALICE3/TableProducer/OTF/onTheFlyTracker.cxx

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#include <Framework/StaticFor.h>
5252
#include <Framework/runDataProcessing.h>
5353
#include <ReconstructionDataFormats/DCA.h>
54+
#include <ReconstructionDataFormats/PID.h>
5455
#include <SimulationDataFormat/InteractionSampler.h>
5556

5657
#include <TGenPhaseSpace.h>
@@ -597,6 +598,31 @@ struct OnTheFlyTracker {
597598
gRandom->SetSeed(seed);
598599
}
599600

601+
/// Function to get the internal PID for a given pdgCode
602+
/// \param pdgCode pdg code for a common particle (particle handled by the tracker)
603+
int pdgCodeToPID(int pdgCode) const
604+
{
605+
if (std::abs(pdgCode) == PDG_t::kElectron) {
606+
return o2::track::PID::Electron;
607+
} else if (std::abs(pdgCode) == PDG_t::kMuonMinus) {
608+
return o2::track::PID::Muon;
609+
} else if (std::abs(pdgCode) == PDG_t::kPiPlus) {
610+
return o2::track::PID::Pion;
611+
} else if (std::abs(pdgCode) == PDG_t::kKPlus) {
612+
return o2::track::PID::Kaon;
613+
} else if (std::abs(pdgCode) == PDG_t::kProton) {
614+
return o2::track::PID::Proton;
615+
} else if (std::abs(pdgCode) == PDG_t::kLambda0) {
616+
return o2::track::PID::Lambda;
617+
} else if (std::abs(pdgCode) == PDG_t::kXiMinus) {
618+
return o2::track::PID::XiMinus;
619+
} else if (std::abs(pdgCode) == PDG_t::kOmegaMinus) {
620+
return o2::track::PID::OmegaMinus;
621+
} else {
622+
return o2::track::PID::Pion; // Default trackParCov assumption
623+
}
624+
}
625+
600626
/// Function to decay the xi
601627
/// \param particle the particle to decay
602628
/// \param track track of particle to decay
@@ -705,7 +731,7 @@ struct OnTheFlyTracker {
705731

706732
float dNdEta = 0.f; // Charged particle multiplicity to use in the efficiency evaluation
707733
std::pair<float, float> vertexReconstructionEfficiencyCounters = {0, 0}; // {nVerticesWithMoreThan2Contributors, nVerticesReconstructed}
708-
void processWithLUTs(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles, int const& icfg)
734+
void processWithLUTs(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles, const int icfg)
709735
{
710736
vertexReconstructionEfficiencyCounters.first += 1;
711737
const int lastTrackIndex = tableStoredTracksCov.lastIndex() + 1; // bookkeep the last added track
@@ -878,9 +904,12 @@ struct OnTheFlyTracker {
878904
getHist(TH1, histPath + "hXiBuilding")->Fill(0.0f);
879905
}
880906

881-
o2::upgrade::convertTLorentzVectorToO2Track(kPiMinus, cascadeDecayProducts[0], xiDecayVertex, xiDaughterTrackParCovsPerfect[0], pdgDB);
882-
o2::upgrade::convertTLorentzVectorToO2Track(kPiMinus, cascadeDecayProducts[1], laDecayVertex, xiDaughterTrackParCovsPerfect[1], pdgDB);
883-
o2::upgrade::convertTLorentzVectorToO2Track(kProton, cascadeDecayProducts[2], laDecayVertex, xiDaughterTrackParCovsPerfect[2], pdgDB);
907+
o2::upgrade::convertTLorentzVectorToO2Track(PDG_t::kPiMinus, cascadeDecayProducts[0], xiDecayVertex, xiDaughterTrackParCovsPerfect[0], pdgDB);
908+
xiDaughterTrackParCovsPerfect[0].setPID(pdgCodeToPID(PDG_t::kPiMinus));
909+
o2::upgrade::convertTLorentzVectorToO2Track(PDG_t::kPiMinus, cascadeDecayProducts[1], laDecayVertex, xiDaughterTrackParCovsPerfect[1], pdgDB);
910+
xiDaughterTrackParCovsPerfect[1].setPID(pdgCodeToPID(PDG_t::kPiMinus));
911+
o2::upgrade::convertTLorentzVectorToO2Track(PDG_t::kProton, cascadeDecayProducts[2], laDecayVertex, xiDaughterTrackParCovsPerfect[2], pdgDB);
912+
xiDaughterTrackParCovsPerfect[2].setPID(pdgCodeToPID(PDG_t::kProton));
884913

885914
for (int i = 0; i < kCascProngs; i++) {
886915
isReco[i] = false;
@@ -1001,7 +1030,7 @@ struct OnTheFlyTracker {
10011030
{posP[0] + negP[0], posP[1] + negP[1], posP[2] + negP[2]},
10021031
covV, 0, true);
10031032
v0Track.setAbsCharge(0);
1004-
v0Track.setPID(o2::track::PID::Lambda);
1033+
v0Track.setPID(pdgCodeToPID(PDG_t::kLambda0));
10051034

10061035
// dca fitter step
10071036
nCand = 0;
@@ -1040,8 +1069,8 @@ struct OnTheFlyTracker {
10401069

10411070
// initialize cascade track
10421071
o2::track::TrackParCov cascadeTrack = fitter.createParentTrackParCov();
1043-
cascadeTrack.setAbsCharge(-1); // may require more adjustments
1044-
cascadeTrack.setPID(o2::track::PID::XiMinus); // FIXME: not OK for omegas
1072+
cascadeTrack.setAbsCharge(-1); // may require more adjustments
1073+
cascadeTrack.setPID(pdgCodeToPID(PDG_t::kXiMinus)); // FIXME: not OK for omegas
10451074

10461075
thisCascade.cascradiusMC = xiDecayRadius2D;
10471076
thisCascade.pt = cascadeTrack.getPt();
@@ -1131,6 +1160,7 @@ struct OnTheFlyTracker {
11311160
o2::upgrade::convertMCParticleToO2Track(mcParticle, prefectCascadeTrack, pdgDB);
11321161

11331162
// back track is already smeared
1163+
prefectCascadeTrack.setPID(pdgCodeToPID(PDG_t::kXiMinus)); // FIXME: not OK for omegas
11341164
int nCascHits = fastTracker[icfg]->FastTrack(prefectCascadeTrack, trackedCasc, dNdEta);
11351165
reconstructedCascade = (fastTrackerSettings.minSiliconHitsForKinkReco < nCascHits) ? false : true;
11361166

@@ -1201,6 +1231,7 @@ struct OnTheFlyTracker {
12011231
std::array{pV0[0], pV0[1], pV0[2]}},
12021232
std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassLambda});
12031233

1234+
newCascadeTrack.setPID(pdgCodeToPID(PDG_t::kXiMinus)); // FIXME: not OK for omegas
12041235
tracksAlice3.push_back(TrackAlice3{newCascadeTrack, mcParticle.globalIndex(), time, timeResolutionUs, false, false, 1, thisCascade.foundClusters});
12051236

12061237
// add this cascade to vector (will fill cursor later with collision ID)
@@ -1436,6 +1467,7 @@ struct OnTheFlyTracker {
14361467
} else if (fastPrimaryTrackerSettings.fastTrackPrimaries) {
14371468
o2::track::TrackParCov o2Track;
14381469
o2::upgrade::convertMCParticleToO2Track(mcParticle, o2Track, pdgDB);
1470+
o2Track.setPID(pdgCodeToPID(mcParticle.pdgCode()));
14391471
const int nHits = fastTracker[icfg]->FastTrack(o2Track, trackParCov, dNdEta);
14401472
if (nHits < fastPrimaryTrackerSettings.minSiliconHits) {
14411473
reconstructed = false;
@@ -1736,7 +1768,7 @@ struct OnTheFlyTracker {
17361768
}
17371769
}
17381770

1739-
void processConfigurationDev(aod::McCollision const& mcCollision, aod::McParticlesWithDau const& mcParticles, int const& icfg)
1771+
void processConfigurationDev(aod::McCollision const& mcCollision, aod::McPartsWithDau const& mcParticles, const int icfg)
17401772
{
17411773
// const int lastTrackIndex = tableStoredTracksCov.lastIndex() + 1; // bookkeep the last added track
17421774
const std::string histPath = "Configuration_" + std::to_string(icfg) + "/";
@@ -1838,6 +1870,7 @@ struct OnTheFlyTracker {
18381870
} else if (enableSecondarySmearing) {
18391871
o2::track::TrackParCov perfectTrackParCov;
18401872
o2::upgrade::convertMCParticleToO2Track(mcParticle, perfectTrackParCov, pdgDB);
1873+
perfectTrackParCov.setPID(pdgCodeToPID(mcParticle.pdgCode()));
18411874
const int nHits = fastTracker[icfg]->FastTrack(perfectTrackParCov, trackParCov, dNdEta);
18421875
if (nHits < fastTrackerSettings.minSiliconHits) {
18431876
reconstructed = false;
@@ -1991,7 +2024,7 @@ struct OnTheFlyTracker {
19912024
}
19922025
}
19932026

1994-
void processDecayer(aod::McCollision const& mcCollision, aod::McParticlesWithDau const& mcParticles)
2027+
void processDecayer(aod::McCollision const& mcCollision, aod::McPartsWithDau const& mcParticles)
19952028
{
19962029
for (size_t icfg = 0; icfg < mSmearer.size(); ++icfg) {
19972030
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)

0 commit comments

Comments
 (0)