Skip to content

Commit 43d64af

Browse files
hfribertHenrik FribertHenrik Fribertnjacazioalibuild
authored
[ALICE3] Implementation of tracker PID with ToT (#13113)
Co-authored-by: Henrik Fribert <ge35huh@nidoqueen.ktas.ph.tum.de> Co-authored-by: Henrik Fribert <ge35huh@nidoking.ktas.ph.tum.de> Co-authored-by: Nicolò Jacazio <njacazio@users.noreply.github.com> Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent f8fb960 commit 43d64af

File tree

5 files changed

+683
-122
lines changed

5 files changed

+683
-122
lines changed

ALICE3/Core/DelphesO2TrackSmearer.cxx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,18 @@ bool TrackSmearer::loadTable(int pdg, const char* filename, bool forceReload)
105105
mLUTHeader[ipdg] = nullptr;
106106
return false;
107107
}
108-
if (mLUTHeader[ipdg]->pdg != pdg) {
108+
bool specialPdgCase = false;
109+
switch (pdg) { // Handle special cases
110+
case o2::constants::physics::kAlpha: // Special case: Allow Alpha particles to use He3 LUT
111+
specialPdgCase = (mLUTHeader[ipdg]->pdg == o2::constants::physics::kHelium3);
112+
if (specialPdgCase)
113+
LOG(info)
114+
<< " --- Alpha particles (PDG " << pdg << ") will use He3 LUT data (PDG " << mLUTHeader[ipdg]->pdg << ")" << std::endl;
115+
break;
116+
default:
117+
break;
118+
}
119+
if (mLUTHeader[ipdg]->pdg != pdg && !specialPdgCase) {
109120
LOG(info) << " --- LUT header PDG mismatch: expected/detected = " << pdg << "/" << mLUTHeader[ipdg]->pdg << std::endl;
110121
delete mLUTHeader[ipdg];
111122
mLUTHeader[ipdg] = nullptr;

ALICE3/Core/DelphesO2TrackSmearer.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
#include <TRandom.h>
3131

32+
#include <cstdio>
3233
#include <fstream>
3334
#include <iostream>
3435
#include <map>
@@ -214,6 +215,8 @@ class TrackSmearer
214215
return 6; // Triton
215216
case 1000020030:
216217
return 7; // Helium3
218+
case 1000020040:
219+
return 8; // Alphas
217220
default:
218221
return 2; // Default: pion
219222
}
@@ -238,6 +241,8 @@ class TrackSmearer
238241
return "triton";
239242
case 1000020030:
240243
return "helium3";
244+
case 1000020040:
245+
return "alpha";
241246
default:
242247
return "pion"; // Default: pion
243248
}
@@ -246,7 +251,7 @@ class TrackSmearer
246251
void setCcdbManager(o2::ccdb::BasicCCDBManager* mgr) { mCcdbManager = mgr; } //;
247252

248253
protected:
249-
static constexpr unsigned int nLUTs = 8; // Number of LUT available
254+
static constexpr unsigned int nLUTs = 9; // Number of LUT available
250255
lutHeader_t* mLUTHeader[nLUTs] = {nullptr};
251256
lutEntry_t***** mLUTEntry[nLUTs] = {nullptr};
252257
bool mUseEfficiency = true;

ALICE3/DataModel/OTFPIDTrk.h

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
///
1313
/// \file OTFPIDTrk.h
14-
/// \author Berkin Ulukutlu TUM
1514
/// \author Henrik Fribert TUM
1615
/// \author Nicolò Jacazio Università del Piemonte Orientale
1716
/// \since May 22, 2025
@@ -29,23 +28,29 @@ namespace o2::aod
2928
namespace upgrade::trk
3029
{
3130

32-
DECLARE_SOA_COLUMN(TimeOverThresholdBarrel, timeOverThresholdBarrel, float); //! Time over threshold for the barrel layers
33-
DECLARE_SOA_COLUMN(ClusterSizeBarrel, clusterSizeBarrel, float); //! Cluster size for the barrel layers
31+
DECLARE_SOA_COLUMN(TimeOverThresholdBarrel, timeOverThresholdBarrel, float); //! Time over threshold for the Barrel layers
3432
DECLARE_SOA_COLUMN(TimeOverThresholdForward, timeOverThresholdForward, float); //! Time over threshold for the Forward layers
35-
DECLARE_SOA_COLUMN(ClusterSizeForward, clusterSizeForward, float); //! Cluster size for the barrel layers
3633

37-
DECLARE_SOA_COLUMN(NSigmaTrkEl, nSigmaEl, float); //! NSigma electron from the tracker layers
38-
DECLARE_SOA_COLUMN(NSigmaTrkMu, nSigmaMu, float); //! NSigma muon from the tracker layers
39-
DECLARE_SOA_COLUMN(NSigmaTrkPi, nSigmaPi, float); //! NSigma pion from the tracker layers
40-
DECLARE_SOA_COLUMN(NSigmaTrkKa, nSigmaKa, float); //! NSigma kaon from the tracker layers
41-
DECLARE_SOA_COLUMN(NSigmaTrkPr, nSigmaPr, float); //! NSigma proton from the tracker layers
34+
DECLARE_SOA_COLUMN(NSigmaTrkEl, nSigmaTrkEl, float); //! NSigma electron from the tracker layers
35+
DECLARE_SOA_COLUMN(NSigmaTrkMu, nSigmaTrkMu, float); //! NSigma muon from the tracker layers
36+
DECLARE_SOA_COLUMN(NSigmaTrkPi, nSigmaTrkPi, float); //! NSigma pion from the tracker layers
37+
DECLARE_SOA_COLUMN(NSigmaTrkKa, nSigmaTrkKa, float); //! NSigma kaon from the tracker layers
38+
DECLARE_SOA_COLUMN(NSigmaTrkPr, nSigmaTrkPr, float); //! NSigma proton from the tracker layers
39+
DECLARE_SOA_COLUMN(NSigmaTrkDe, nSigmaTrkDe, float); //! NSigma deuteron from the tracker layers
40+
DECLARE_SOA_COLUMN(NSigmaTrkTr, nSigmaTrkTr, float); //! NSigma triton from the tracker layers
41+
DECLARE_SOA_COLUMN(NSigmaTrkHe, nSigmaTrkHe, float); //! NSigma helium-3 from the tracker layers
42+
DECLARE_SOA_COLUMN(NSigmaTrkAl, nSigmaTrkAl, float); //! NSigma alpha from the tracker layers
4243

4344
DECLARE_SOA_DYNAMIC_COLUMN(NSigmaTrk, nSigmaTrk, //! General function to get the nSigma for the tracker layers
4445
[](const float el,
4546
const float mu,
4647
const float pi,
4748
const float ka,
4849
const float pr,
50+
const float de,
51+
const float tr,
52+
const float he,
53+
const float al,
4954
const int id) -> float {
5055
switch (std::abs(id)) {
5156
case 0:
@@ -58,29 +63,46 @@ DECLARE_SOA_DYNAMIC_COLUMN(NSigmaTrk, nSigmaTrk, //! General function to get the
5863
return ka;
5964
case 4:
6065
return pr;
66+
case 5:
67+
return de;
68+
case 6:
69+
return tr;
70+
case 7:
71+
return he;
72+
case 8:
73+
return al;
6174
default:
62-
LOG(fatal) << "Unrecognized PDG code for InnerTOF";
75+
LOG(fatal) << "Unrecognized PDG code";
6376
return 999.f;
6477
}
6578
});
6679

6780
} // namespace upgrade::trk
6881

6982
DECLARE_SOA_TABLE(UpgradeTrkPidSignals, "AOD", "UPGRADETRKSIG",
70-
upgrade::trk::TimeOverThresholdBarrel,
71-
upgrade::trk::ClusterSizeBarrel);
83+
o2::soa::Index<>,
84+
upgrade::trk::TimeOverThresholdBarrel);
7285

7386
DECLARE_SOA_TABLE(UpgradeTrkPids, "AOD", "UPGRADETRKPID",
87+
o2::soa::Index<>,
7488
upgrade::trk::NSigmaTrkEl,
7589
upgrade::trk::NSigmaTrkMu,
7690
upgrade::trk::NSigmaTrkPi,
7791
upgrade::trk::NSigmaTrkKa,
7892
upgrade::trk::NSigmaTrkPr,
93+
upgrade::trk::NSigmaTrkDe,
94+
upgrade::trk::NSigmaTrkTr,
95+
upgrade::trk::NSigmaTrkHe,
96+
upgrade::trk::NSigmaTrkAl,
7997
upgrade::trk::NSigmaTrk<upgrade::trk::NSigmaTrkEl,
8098
upgrade::trk::NSigmaTrkMu,
8199
upgrade::trk::NSigmaTrkPi,
82100
upgrade::trk::NSigmaTrkKa,
83-
upgrade::trk::NSigmaTrkPr>);
101+
upgrade::trk::NSigmaTrkPr,
102+
upgrade::trk::NSigmaTrkDe,
103+
upgrade::trk::NSigmaTrkTr,
104+
upgrade::trk::NSigmaTrkHe,
105+
upgrade::trk::NSigmaTrkAl>);
84106

85107
using UpgradeTrkPidSignal = UpgradeTrkPidSignals::iterator;
86108
using UpgradeTrkPid = UpgradeTrkPids::iterator;

ALICE3/TableProducer/OTF/onTheFlyTracker.cxx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ struct OnTheFlyTracker {
113113
Configurable<std::string> lutDe{"lutDe", "lutCovm.de.dat", "LUT for deuterons"};
114114
Configurable<std::string> lutTr{"lutTr", "lutCovm.tr.dat", "LUT for tritons"};
115115
Configurable<std::string> lutHe3{"lutHe3", "lutCovm.he3.dat", "LUT for Helium-3"};
116+
Configurable<std::string> lutAl{"lutAl", "lutCovm.he3.dat", "LUT for Alphas"};
116117

117118
struct : ConfigurableGroup {
118119
ConfigurableAxis axisMomentum{"axisMomentum", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "#it{p} (GeV/#it{c})"};
@@ -265,6 +266,7 @@ struct OnTheFlyTracker {
265266
loadLUT(1000010020, lutDe.value);
266267
loadLUT(1000010030, lutTr.value);
267268
loadLUT(1000020030, lutHe3.value);
269+
loadLUT(1000020040, lutAl.value);
268270

269271
// interpolate efficiencies if requested to do so
270272
mSmearer.interpolateEfficiency(static_cast<bool>(interpolateLutEfficiencyVsNch));
@@ -501,6 +503,16 @@ struct OnTheFlyTracker {
501503
auto ir = irSampler.generateCollisionTime();
502504
const float eventCollisionTime = ir.timeInBCNS;
503505

506+
constexpr std::array<int, 9> longLivedHandledPDGs = {kElectron,
507+
kMuonMinus,
508+
kPiPlus,
509+
kKPlus,
510+
kProton,
511+
o2::constants::physics::kDeuteron,
512+
o2::constants::physics::kTriton,
513+
o2::constants::physics::kHelium3,
514+
o2::constants::physics::kAlpha};
515+
504516
// First we compute the number of charged particles in the event
505517
dNdEta = 0.f;
506518
for (const auto& mcParticle : mcParticles) {
@@ -511,7 +523,8 @@ struct OnTheFlyTracker {
511523
continue;
512524
}
513525
const auto pdg = std::abs(mcParticle.pdgCode());
514-
if (pdg != kElectron && pdg != kMuonMinus && pdg != kPiPlus && pdg != kKPlus && pdg != kProton) {
526+
const bool longLivedToBeHandled = std::find(longLivedHandledPDGs.begin(), longLivedHandledPDGs.end(), pdg) != longLivedHandledPDGs.end();
527+
if (!longLivedToBeHandled) {
515528
if (!cascadeDecaySettings.decayXi) {
516529
continue;
517530
} else if (pdg != 3312) {
@@ -558,7 +571,8 @@ struct OnTheFlyTracker {
558571
continue;
559572
}
560573
}
561-
if (pdg != kElectron && pdg != kMuonMinus && pdg != kPiPlus && pdg != kKPlus && pdg != kProton) {
574+
const bool longLivedToBeHandled = std::find(longLivedHandledPDGs.begin(), longLivedHandledPDGs.end(), pdg) != longLivedHandledPDGs.end();
575+
if (!longLivedToBeHandled) {
562576
if (!cascadeDecaySettings.decayXi) {
563577
continue;
564578
} else if (pdg != 3312) {

0 commit comments

Comments
 (0)