@@ -164,8 +164,8 @@ DECLARE_SOA_COLUMN(Etaee, etaee, float);
164164DECLARE_SOA_COLUMN (Rapee, rapee, float );
165165DECLARE_SOA_COLUMN (Phiee, phiee, float );
166166DECLARE_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 );
169169DECLARE_SOA_COLUMN (Lzee, lzee, float );
170170DECLARE_SOA_COLUMN (LxyeePoleMassPVrecomputed, lxyeePoleMassPVrecomputed, float );
171171DECLARE_SOA_COLUMN (Vx, vx, float );
@@ -178,10 +178,26 @@ DECLARE_SOA_COLUMN(DcaZ2, dcaZ2, float);
178178DECLARE_SOA_COLUMN (MultiplicityFT0A, multiplicityFT0AJPsi2ee, float );
179179DECLARE_SOA_COLUMN (MultiplicityFT0C, multiplicityFT0CJPsi2ee, float );
180180DECLARE_SOA_COLUMN (PercentileFT0M, percentileFT0MJPsi2ee, float );
181+ DECLARE_SOA_COLUMN (PercentileFT0C, percentileFT0CJPsi2ee, float );
181182DECLARE_SOA_COLUMN (MultiplicityNContrib, multiplicityNContribJPsi2ee, float );
182183DECLARE_SOA_COLUMN (AmbiguousInBunchPairs, AmbiguousJpsiPairsInBunch, bool );
183184DECLARE_SOA_COLUMN (AmbiguousOutOfBunchPairs, AmbiguousJpsiPairsOutOfBunch, bool );
184185DECLARE_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
185201DECLARE_SOA_COLUMN (DeltaEta, deltaEta, float );
186202DECLARE_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);
226242DECLARE_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);
231264DECLARE_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