Skip to content

Commit d83aef8

Browse files
committed
Add more pair and leg features in prompt-non prompt separation table, add FT0C centrality value, and setup stable filling outside the cut loop
1 parent fff9af3 commit d83aef8

2 files changed

Lines changed: 166 additions & 20 deletions

File tree

‎PWGDQ/Tasks/dqEfficiency_withAssoc.cxx‎

Lines changed: 81 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ DECLARE_SOA_COLUMN(Etaee, etaee, float);
164164
DECLARE_SOA_COLUMN(Rapee, rapee, float);
165165
DECLARE_SOA_COLUMN(Phiee, phiee, float);
166166
DECLARE_SOA_COLUMN(Ptee, ptee, float);
167-
DECLARE_SOA_COLUMN(Lxyee, lxyee, float);
168-
DECLARE_SOA_COLUMN(LxyeePoleMass, lxyeepolemass, float);
167+
DECLARE_SOA_COLUMN(Lxyee, lxyJPsi2ee, float);
168+
DECLARE_SOA_COLUMN(LxyeePoleMass, lxyJPsi2eePoleMass, float);
169169
DECLARE_SOA_COLUMN(Lzee, lzee, float);
170170
DECLARE_SOA_COLUMN(LxyeePoleMassPVrecomputed, lxyeePoleMassPVrecomputed, float);
171171
DECLARE_SOA_COLUMN(Vx, vx, float);
@@ -178,10 +178,26 @@ DECLARE_SOA_COLUMN(DcaZ2, dcaZ2, float);
178178
DECLARE_SOA_COLUMN(MultiplicityFT0A, multiplicityFT0AJPsi2ee, float);
179179
DECLARE_SOA_COLUMN(MultiplicityFT0C, multiplicityFT0CJPsi2ee, float);
180180
DECLARE_SOA_COLUMN(PercentileFT0M, percentileFT0MJPsi2ee, float);
181+
DECLARE_SOA_COLUMN(PercentileFT0C, percentileFT0CJPsi2ee, float);
181182
DECLARE_SOA_COLUMN(MultiplicityNContrib, multiplicityNContribJPsi2ee, float);
182183
DECLARE_SOA_COLUMN(AmbiguousInBunchPairs, AmbiguousJpsiPairsInBunch, bool);
183184
DECLARE_SOA_COLUMN(AmbiguousOutOfBunchPairs, AmbiguousJpsiPairsOutOfBunch, bool);
184185
DECLARE_SOA_COLUMN(Corrassoc, corrassoc, bool);
186+
// Additional columns for prompt-non-prompt JPsi separation (BDT training), identical to tableReader_withAssoc
187+
DECLARE_SOA_COLUMN(PairFilter, pairFilter, uint32_t); //! twoTrackFilter (cut bits + ambiguity bits 28-31)
188+
DECLARE_SOA_COLUMN(McDecision, mcDecision, uint32_t); //! MC signal bits, 0 in data
189+
DECLARE_SOA_COLUMN(TauxyeeErr, tauxyeeErr, float); //! kVertexingTauxyErr: in ns (not cm) and with the reconstructed mass
190+
DECLARE_SOA_COLUMN(TauzeeErr, tauzeeErr, float); //! kVertexingTauzErr: in ns (not cm) and with the reconstructed mass
191+
DECLARE_SOA_COLUMN(LxyeeProjected, lxyeeProjected, float); //! kVertexingLxyProjected
192+
DECLARE_SOA_COLUMN(LxyeeOverErr, lxyeeOverErr, float); //! kVertexingLxy / kVertexingLxyErr (computed in the task)
193+
DECLARE_SOA_COLUMN(Lxyzee, lxyzee, float); //! kVertexingLxyz
194+
DECLARE_SOA_COLUMN(LxyzeeOverErr, lxyzeeOverErr, float); //! kVertexingLxyz / kVertexingLxyzErr (computed in the task)
195+
DECLARE_SOA_COLUMN(Chi2PCAee, chi2PCAee, float); //! kVertexingChi2PCA
196+
DECLARE_SOA_COLUMN(CosPAee, cosPAee, float); //! kCosPointingAngle
197+
DECLARE_SOA_COLUMN(DcaSigXY1, dcaSigXY1, float); //! leg-1 DCAxy / sqrt(cYY), computed in the task
198+
DECLARE_SOA_COLUMN(DcaSigZ1, dcaSigZ1, float); //! leg-1 DCAz / sqrt(cZZ), computed in the task
199+
DECLARE_SOA_COLUMN(DcaSigXY2, dcaSigXY2, float); //! leg-2 DCAxy / sqrt(cYY), computed in the task
200+
DECLARE_SOA_COLUMN(DcaSigZ2, dcaSigZ2, float); //! leg-2 DCAz / sqrt(cZZ), computed in the task
185201
DECLARE_SOA_COLUMN(DeltaEta, deltaEta, float);
186202
DECLARE_SOA_COLUMN(DeltaPhi, deltaPhi, float);
187203
// Candidate columns efficiency calculation for prompt-non-prompt JPsi separation
@@ -224,10 +240,27 @@ DECLARE_SOA_TABLE(JPsiMuonCandidates, "AOD", "DQJPSIMUONA",
224240
dqanalysisflags::Ptleg1, dqanalysisflags::Etaleg1, dqanalysisflags::Phileg1, dqanalysisflags::Ptleg2, dqanalysisflags::Etaleg2, dqanalysisflags::Phileg2,
225241
dqanalysisflags::McFlag);
226242
DECLARE_SOA_TABLE(JPsieeCandidates, "AOD", "DQPSEUDOPROPER",
243+
// bookkeeping / labels
244+
dqanalysisflags::PairFilter, dqanalysisflags::McDecision,
245+
// pair kinematics
227246
dqanalysisflags::Massee, dqanalysisflags::Ptee, dqanalysisflags::Etaee, dqanalysisflags::Rapee, dqanalysisflags::Phiee,
247+
// pseudo-proper decay length (Lxyee/Lzee hold kVertexingTauxyProjected/kVertexingTauzProjected)
228248
dqanalysisflags::Lxyee, dqanalysisflags::LxyeePoleMass, dqanalysisflags::Lzee, dqanalysisflags::LxyeePoleMassPVrecomputed,
229-
dqanalysisflags::Vx, dqanalysisflags::Vy, dqanalysisflags::Vz, dqanalysisflags::DcaXY1, dqanalysisflags::DcaZ1, dqanalysisflags::ITSClusterMapleg1, dqanalysisflags::TPCnsigmaElleg1, dqanalysisflags::DcaXY2, dqanalysisflags::DcaZ2, dqanalysisflags::ITSClusterMapleg2, dqanalysisflags::TPCnsigmaElleg2,
230-
dqanalysisflags::AmbiguousInBunchPairs, dqanalysisflags::AmbiguousOutOfBunchPairs, dqanalysisflags::Corrassoc, dqanalysisflags::MultiplicityFT0A, dqanalysisflags::MultiplicityFT0C, dqanalysisflags::PercentileFT0M, dqanalysisflags::MultiplicityNContrib);
249+
dqanalysisflags::TauxyeeErr, dqanalysisflags::TauzeeErr,
250+
// secondary vertex
251+
dqanalysisflags::LxyeeProjected, dqanalysisflags::LxyeeOverErr, dqanalysisflags::Lxyzee, dqanalysisflags::LxyzeeOverErr,
252+
dqanalysisflags::Chi2PCAee, dqanalysisflags::CosPAee,
253+
// primary vertex
254+
dqanalysisflags::Vx, dqanalysisflags::Vy, dqanalysisflags::Vz,
255+
// leg 1
256+
dqanalysisflags::Ptleg1, dqanalysisflags::Etaleg1, dqanalysisflags::DcaXY1, dqanalysisflags::DcaZ1, dqanalysisflags::DcaSigXY1, dqanalysisflags::DcaSigZ1,
257+
dqanalysisflags::ITSClusterMapleg1, dqanalysisflags::ITSChi2leg1,
258+
// leg 2
259+
dqanalysisflags::Ptleg2, dqanalysisflags::Etaleg2, dqanalysisflags::DcaXY2, dqanalysisflags::DcaZ2, dqanalysisflags::DcaSigXY2, dqanalysisflags::DcaSigZ2,
260+
dqanalysisflags::ITSClusterMapleg2, dqanalysisflags::ITSChi2leg2,
261+
// ambiguity, event
262+
dqanalysisflags::AmbiguousInBunchPairs, dqanalysisflags::AmbiguousOutOfBunchPairs, dqanalysisflags::Corrassoc,
263+
dqanalysisflags::MultiplicityFT0C, dqanalysisflags::PercentileFT0C, dqanalysisflags::MultiplicityNContrib);
231264
DECLARE_SOA_TABLE(OniaMCTruth, "AOD", "MCTRUTHONIA", dqanalysisflags::OniaPt, dqanalysisflags::OniaEta, dqanalysisflags::OniaY, dqanalysisflags::OniaPhi, dqanalysisflags::OniaVz, dqanalysisflags::OniaVtxZ, dqanalysisflags::MultiplicityFT0A, dqanalysisflags::MultiplicityFT0C, dqanalysisflags::PercentileFT0M, dqanalysisflags::MultiplicityNContrib);
232265
} // namespace o2::aod
233266

@@ -2371,6 +2404,50 @@ struct AnalysisSameEventPairing {
23712404
}
23722405
}
23732406
}
2407+
// flat table for prompt / non-prompt BDT training: one row per MC-matched opposite-sign pair
2408+
// (not per cut; select cuts offline via PairFilter). Kept identical to tableReader_withAssoc.
2409+
// Only meaningful with track covariances, the two-prong fitter and an event vertex covariance:
2410+
constexpr bool eventHasVtxCovForTable = ((TEventFillMap & VarManager::ObjTypes::ReducedEventVtxCov) > 0);
2411+
if constexpr ((TTrackFillMap & VarManager::ObjTypes::ReducedTrackBarrelPID) > 0 && trackHasCov && TTwoProngFitter && eventHasVtxCovForTable) {
2412+
// kVertexingProcCode == 0: the fit failed; FillPairVertexing then returns early without updating the
2413+
// projected / pseudo-proper / pointing-angle variables, so they would be stale -> skip the pair
2414+
const bool vertexingOK = VarManager::fgValues[VarManager::kVertexingProcCode] > 0;
2415+
if (t1.sign() * t2.sign() < 0 && mcDecision > 0 && vertexingOK) {
2416+
const bool ambiInBunch = (twoTrackFilter & (static_cast<uint32_t>(1) << 28)) || (twoTrackFilter & (static_cast<uint32_t>(1) << 29));
2417+
const bool ambiOutOfBunch = (twoTrackFilter & (static_cast<uint32_t>(1) << 30)) || (twoTrackFilter & (static_cast<uint32_t>(1) << 31));
2418+
2419+
// track DCA significances (DCA w.r.t. the collision the track was stored with, as kDCAxy1/kDCAz1)
2420+
auto dcaSig = [](float dca, float cov) -> float {
2421+
return cov > 0.f ? dca / std::sqrt(cov) : -999.f;
2422+
};
2423+
const float dcaSigXY1 = dcaSig(VarManager::fgValues[VarManager::kDCAxy1], t1.cYY());
2424+
const float dcaSigZ1 = dcaSig(VarManager::fgValues[VarManager::kDCAz1], t1.cZZ());
2425+
const float dcaSigXY2 = dcaSig(VarManager::fgValues[VarManager::kDCAxy2], t2.cYY());
2426+
const float dcaSigZ2 = dcaSig(VarManager::fgValues[VarManager::kDCAz2], t2.cZZ());
2427+
2428+
// decay-length significances: kVertexingLxyOverErr / kVertexingLxyzOverErr are only filled in the
2429+
// KFParticle branch of FillPairVertexing, not with the DCAFitter -> compute them explicitly
2430+
auto ratio = [](float num, float den) -> float {
2431+
return den > 0.f ? num / den : -999.f;
2432+
};
2433+
const float lxyOverErr = ratio(VarManager::fgValues[VarManager::kVertexingLxy], VarManager::fgValues[VarManager::kVertexingLxyErr]);
2434+
const float lxyzOverErr = ratio(VarManager::fgValues[VarManager::kVertexingLxyz], VarManager::fgValues[VarManager::kVertexingLxyzErr]);
2435+
2436+
PromptNonPromptSepTable(twoTrackFilter, mcDecision,
2437+
VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kRap], VarManager::fgValues[VarManager::kPhi],
2438+
VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMass], VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV],
2439+
VarManager::fgValues[VarManager::kVertexingTauxyErr], VarManager::fgValues[VarManager::kVertexingTauzErr],
2440+
VarManager::fgValues[VarManager::kVertexingLxyProjected], lxyOverErr, VarManager::fgValues[VarManager::kVertexingLxyz], lxyzOverErr,
2441+
VarManager::fgValues[VarManager::kVertexingChi2PCA], VarManager::fgValues[VarManager::kCosPointingAngle],
2442+
VarManager::fgValues[VarManager::kVtxX], VarManager::fgValues[VarManager::kVtxY], VarManager::fgValues[VarManager::kVtxZ],
2443+
t1.pt(), t1.eta(), VarManager::fgValues[VarManager::kDCAxy1], VarManager::fgValues[VarManager::kDCAz1], dcaSigXY1, dcaSigZ1,
2444+
VarManager::fgValues[VarManager::kITSclusterMap1], t1.itsChi2NCl(),
2445+
t2.pt(), t2.eta(), VarManager::fgValues[VarManager::kDCAxy2], VarManager::fgValues[VarManager::kDCAz2], dcaSigXY2, dcaSigZ2,
2446+
VarManager::fgValues[VarManager::kITSclusterMap2], t2.itsChi2NCl(),
2447+
ambiInBunch, ambiOutOfBunch, isCorrectAssoc_leg1 && isCorrectAssoc_leg2,
2448+
VarManager::fgValues[VarManager::kMultFT0C], VarManager::fgValues[VarManager::kCentFT0C], VarManager::fgValues[VarManager::kVtxNcontribReal]);
2449+
}
2450+
}
23742451
}
23752452

23762453
if constexpr (TPairType == VarManager::kDecayToMuMu) {
@@ -2469,11 +2546,6 @@ struct AnalysisSameEventPairing {
24692546
// Fill histograms
24702547
bool isAmbiInBunch = false;
24712548
bool isAmbiOutOfBunch = false;
2472-
bool isCorrect_pair = false;
2473-
if (isCorrectAssoc_leg1 && isCorrectAssoc_leg2) {
2474-
isCorrect_pair = true;
2475-
}
2476-
24772549
for (int icut = 0; icut < ncuts; icut++) {
24782550
if (twoTrackFilter & (static_cast<uint32_t>(1) << icut)) {
24792551
isAmbiInBunch = (twoTrackFilter & (static_cast<uint32_t>(1) << 28)) || (twoTrackFilter & (static_cast<uint32_t>(1) << 29));
@@ -2482,10 +2554,6 @@ struct AnalysisSameEventPairing {
24822554
fHistMan->FillHistClass(histNames[icut][0].Data(), dqefficiency_helpers::varValues()); // reconstructed, unmatched
24832555
for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals
24842556
if (mcDecision & (static_cast<uint32_t>(1) << isig)) {
2485-
PromptNonPromptSepTable(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kRap], VarManager::fgValues[VarManager::kPhi],
2486-
VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMass], VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMassRecalculatePV],
2487-
VarManager::fgValues[VarManager::kVtxX], VarManager::fgValues[VarManager::kVtxY], VarManager::fgValues[VarManager::kVtxZ], VarManager::fgValues[VarManager::kDCAxy1], VarManager::fgValues[VarManager::kDCAz1], VarManager::fgValues[VarManager::kITSclusterMap1], VarManager::fgValues[VarManager::kTPCnSigmaEl1], VarManager::fgValues[VarManager::kDCAxy2], VarManager::fgValues[VarManager::kDCAz2], VarManager::fgValues[VarManager::kITSclusterMap2], VarManager::fgValues[VarManager::kTPCnSigmaEl2],
2488-
isAmbiInBunch, isAmbiOutOfBunch, isCorrect_pair, VarManager::fgValues[VarManager::kMultFT0A], VarManager::fgValues[VarManager::kMultFT0C], VarManager::fgValues[VarManager::kCentFT0M], VarManager::fgValues[VarManager::kVtxNcontribReal]);
24892557
fHistMan->FillHistClass(histNamesMC[icut * fRecMCSignals.size() + isig][0].Data(), dqefficiency_helpers::varValues()); // matched signal
24902558
if (useMiniTree.fConfigMiniTree) {
24912559
if constexpr (TPairType == VarManager::kDecayToMuMu) {

0 commit comments

Comments
 (0)