From 80a7f35d2d1ba512074603168e6aad02d30c6c6f Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Wed, 21 Aug 2024 19:54:22 +0200 Subject: [PATCH 1/2] Add fraction of TPC clusters used for PID to AO2D We add this fraction as a binned variable contained in the track flags (like the PID in tracking). --- Detectors/AOD/src/AODProducerWorkflowSpec.cxx | 3 +++ Framework/Core/include/Framework/AnalysisDataModel.h | 4 ++++ Framework/Core/include/Framework/DataTypes.h | 1 + 3 files changed, 8 insertions(+) diff --git a/Detectors/AOD/src/AODProducerWorkflowSpec.cxx b/Detectors/AOD/src/AODProducerWorkflowSpec.cxx index 5d821fa3a971c..7502cb3ae7415 100644 --- a/Detectors/AOD/src/AODProducerWorkflowSpec.cxx +++ b/Detectors/AOD/src/AODProducerWorkflowSpec.cxx @@ -2487,6 +2487,9 @@ AODProducerWorkflowDPL::TrackExtraInfo AODProducerWorkflowDPL::processBarrelTrac extraInfoHolder.tpcNClsFindableMinusFound = tpcOrig.getNClusters() - tpcClData.found; extraInfoHolder.tpcNClsFindableMinusCrossedRows = tpcOrig.getNClusters() - tpcClData.crossed; extraInfoHolder.tpcNClsShared = tpcClData.shared; + uint8_t clsFractionUsedForPID = (tpcOrig.getdEdx().NHitsIROC + tpcOrig.getdEdx().NHitsOROC1 + tpcOrig.getdEdx().NHitsOROC2 + tpcOrig.getdEdx().NHitsOROC3) * 8 / tpcClData.found; + clsFractionUsedForPID = clsFractionUsedForPID > 7u ? 7u : clsFractionUsedForPID; // 7 is the maximum value + extraInfoHolder.flags |= clsFractionUsedForPID << 25; if (src == GIndex::TPC) { // standalone TPC track should set its time from their timebins range if (needBCSlice) { double t = (tpcOrig.getTime0() + 0.5 * (tpcOrig.getDeltaTFwd() - tpcOrig.getDeltaTBwd())) * mTPCBinNS; // central value diff --git a/Framework/Core/include/Framework/AnalysisDataModel.h b/Framework/Core/include/Framework/AnalysisDataModel.h index 26df12c008bee..7a7fcc7fe3bbb 100644 --- a/Framework/Core/include/Framework/AnalysisDataModel.h +++ b/Framework/Core/include/Framework/AnalysisDataModel.h @@ -343,6 +343,8 @@ DECLARE_SOA_DYNAMIC_COLUMN(IsPVContributor, isPVContributor, //! Run 3: Has this [](uint8_t flags) -> bool { return (flags & o2::aod::track::PVContributor) == o2::aod::track::PVContributor; }); DECLARE_SOA_DYNAMIC_COLUMN(PIDForTracking, pidForTracking, //! PID hypothesis used during tracking. See the constants in the class PID in PID.h [](uint32_t flags) -> uint32_t { return flags >> 28; }); +DECLARE_SOA_DYNAMIC_COLUMN(MinFractionOfTPCclustersForPID, minFractionOfTPCclustersForPID, //! Minimum fraction of TPC clusters used for PID in bins of 0.125 + [](uint32_t flags) -> float { return ((flags >> 25) & 0x7) * 0.125; }); DECLARE_SOA_DYNAMIC_COLUMN(TPCNClsFound, tpcNClsFound, //! Number of found TPC clusters [](uint8_t tpcNClsFindable, int8_t tpcNClsFindableMinusFound) -> int16_t { return (int16_t)tpcNClsFindable - tpcNClsFindableMinusFound; }); DECLARE_SOA_DYNAMIC_COLUMN(TPCNClsCrossedRows, tpcNClsCrossedRows, //! Number of crossed TPC Rows @@ -487,6 +489,7 @@ DECLARE_SOA_TABLE_FULL(StoredTracksExtra_000, "TracksExtra", "AOD", "TRACKEXTRA" track::TPCSignal, track::TRDSignal, track::Length, track::TOFExpMom, track::PIDForTracking, track::IsPVContributor, + track::MinFractionOfTPCclustersForPID, track::HasITS, track::HasTPC, track::HasTRD, track::HasTOF, track::TPCNClsFound, @@ -505,6 +508,7 @@ DECLARE_SOA_TABLE_FULL_VERSIONED(StoredTracksExtra_001, "TracksExtra", "AOD", "T track::TPCSignal, track::TRDSignal, track::Length, track::TOFExpMom, track::PIDForTracking, track::IsPVContributor, + track::MinFractionOfTPCclustersForPID, track::HasITS, track::HasTPC, track::HasTRD, track::HasTOF, track::TPCNClsFound, diff --git a/Framework/Core/include/Framework/DataTypes.h b/Framework/Core/include/Framework/DataTypes.h index 67dca478eb7c1..01c5ae44d94d2 100644 --- a/Framework/Core/include/Framework/DataTypes.h +++ b/Framework/Core/include/Framework/DataTypes.h @@ -42,6 +42,7 @@ enum TrackFlags : uint32_t { PVContributor = 0x2, // This track has contributed to the collision vertex fit OrphanTrack = 0x4, // Track has no association with any collision vertex TrackTimeAsym = 0x8, // track with an asymmetric time range + // NOTE bits 26..28 reserved for the fraction of TPC clusters used for PID // NOTE Highest 4 (29..32) bits reserved for PID hypothesis }; enum TrackFlagsRun2Enum { From e714151cd34340aaf31a69760835294fa416f860 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Thu, 22 Aug 2024 09:40:33 +0200 Subject: [PATCH 2/2] Use uint32_t for intermediate calculations --- Detectors/AOD/src/AODProducerWorkflowSpec.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Detectors/AOD/src/AODProducerWorkflowSpec.cxx b/Detectors/AOD/src/AODProducerWorkflowSpec.cxx index 7502cb3ae7415..d0803f918180e 100644 --- a/Detectors/AOD/src/AODProducerWorkflowSpec.cxx +++ b/Detectors/AOD/src/AODProducerWorkflowSpec.cxx @@ -2487,7 +2487,7 @@ AODProducerWorkflowDPL::TrackExtraInfo AODProducerWorkflowDPL::processBarrelTrac extraInfoHolder.tpcNClsFindableMinusFound = tpcOrig.getNClusters() - tpcClData.found; extraInfoHolder.tpcNClsFindableMinusCrossedRows = tpcOrig.getNClusters() - tpcClData.crossed; extraInfoHolder.tpcNClsShared = tpcClData.shared; - uint8_t clsFractionUsedForPID = (tpcOrig.getdEdx().NHitsIROC + tpcOrig.getdEdx().NHitsOROC1 + tpcOrig.getdEdx().NHitsOROC2 + tpcOrig.getdEdx().NHitsOROC3) * 8 / tpcClData.found; + uint32_t clsFractionUsedForPID = (tpcOrig.getdEdx().NHitsIROC + tpcOrig.getdEdx().NHitsOROC1 + tpcOrig.getdEdx().NHitsOROC2 + tpcOrig.getdEdx().NHitsOROC3) * 8 / tpcClData.found; clsFractionUsedForPID = clsFractionUsedForPID > 7u ? 7u : clsFractionUsedForPID; // 7 is the maximum value extraInfoHolder.flags |= clsFractionUsedForPID << 25; if (src == GIndex::TPC) { // standalone TPC track should set its time from their timebins range