From fdbbb4bc0b475783a6593a0ec5ecea19c1235f37 Mon Sep 17 00:00:00 2001 From: Igor Altsybeev Date: Tue, 6 Oct 2026 12:31:49 +0200 Subject: [PATCH 1/5] add time dependency monitoring for Vx and Vy --- DPG/Tasks/AOTEvent/timeDependentQa.cxx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/DPG/Tasks/AOTEvent/timeDependentQa.cxx b/DPG/Tasks/AOTEvent/timeDependentQa.cxx index 03f9850a1b5..2599f74018b 100644 --- a/DPG/Tasks/AOTEvent/timeDependentQa.cxx +++ b/DPG/Tasks/AOTEvent/timeDependentQa.cxx @@ -227,7 +227,12 @@ struct TimeDependentQaTask { histos.add("hSecondsCollisions", "", kTH1D, {axisSeconds}); histos.add("hSecondsCollisionsNoPileup", "", kTH1D, {axisSeconds}); histos.add("hSecondsIR", "", kTH1D, {axisSeconds}); + histos.add("hSecondsVzBeforeAllCuts", "", kTH1D, {axisSeconds}); + histos.add("hSecondsVxBeforeAllCuts", "", kTH1D, {axisSeconds}); + histos.add("hSecondsVyBeforeAllCuts", "", kTH1D, {axisSeconds}); histos.add("hSecondsVz", "", kTH1D, {axisSeconds}); + histos.add("hSecondsVx", "", kTH1D, {axisSeconds}); + histos.add("hSecondsVy", "", kTH1D, {axisSeconds}); histos.add("hSecondsFT0Camlp", "", kTH1D, {axisSeconds}); histos.add("hSecondsFT0CamlpByColMult", "", kTH1D, {axisSeconds}); histos.add("hSecondsFT0AamlpByColMult", "", kTH1D, {axisSeconds}); @@ -527,6 +532,10 @@ struct TimeDependentQaTask { histos.fill(HIST("hSecondsUPCverticesBeforeAllCuts"), secFromSOR, isVertexUPC ? 1 : 0); + histos.fill(HIST("hSecondsVzBeforeAllCuts"), secFromSOR, col.posZ()); + histos.fill(HIST("hSecondsVxBeforeAllCuts"), secFromSOR, col.posX()); + histos.fill(HIST("hSecondsVyBeforeAllCuts"), secFromSOR, col.posY()); + if (std::fabs(col.posZ()) > 10) continue; @@ -546,6 +555,8 @@ struct TimeDependentQaTask { if (col.selection_bit(kNoSameBunchPileup)) histos.fill(HIST("hSecondsCollisionsNoPileup"), secFromSOR); histos.fill(HIST("hSecondsVz"), secFromSOR, col.posZ()); + histos.fill(HIST("hSecondsVx"), secFromSOR, col.posX()); + histos.fill(HIST("hSecondsVy"), secFromSOR, col.posY()); histos.fill(HIST("hSecondsFT0Camlp"), secFromSOR, bc.foundFT0().sumAmpC()); histos.fill(HIST("hSecondsFT0CamlpByColMult"), secFromSOR, col.multFT0C()); histos.fill(HIST("hSecondsFT0AamlpByColMult"), secFromSOR, col.multFT0A()); From c3034934baa2b627bc968e8953437b3dd92d605c Mon Sep 17 00:00:00 2001 From: Igor Altsybeev Date: Tue, 27 Oct 2026 11:14:44 +0100 Subject: [PATCH 2/5] adding monitoring of trackAt85.valid() vs occupancy --- DPG/Tasks/AOTEvent/eventSelectionQa.cxx | 44 +++++++++++++++++++++---- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx index 56a4c9a28ac..1398732dd0c 100644 --- a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx +++ b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx @@ -44,6 +44,7 @@ #include #include +#include "TrackTools/TrackGeometry.h" #include #include @@ -390,6 +391,9 @@ struct EventSelectionQaTask { histos.add("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_StandardDeltaTimeCut", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); histos.add("occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy_GoodITSLayersAllCut", "", kTH3F, {axisMultV0AForOccup, axisNtracksPV, axisOccupancyTracks}); histos.add("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_GoodITSLayersAllCut", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); + // check at R=85 cm (Oct 2026) + histos.add("occupancyQA/hNumTracksITS_isValidAt85cm_EtaPtCuts_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); + histos.add("occupancyQA/hNumTracksPV_isValidAt85cm_EtaPtSel8VxCuts_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); // requested by TPC experts: nTPConly tracks vs occupancy histos.add("occupancyQA/hNumTracksTPConly_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks}); histos.add("occupancyQA/hNumTracksTPConlyNoITS_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks}); @@ -1185,6 +1189,8 @@ struct EventSelectionQaTask { int nTracksITS = 0; int nTracksITSTPC = 0; + int nTracksITSValidAt85cmAfterEtaPtCuts = 0; + int nContributorsAt85cmAfterEtaPtSel8VxCuts = 0; bool isTVX = col.selection_bit(kIsTriggerTVX); @@ -1202,11 +1208,27 @@ struct EventSelectionQaTask { nTPConlyNoITS++; } + // Oct 2026: test presence of track at 85 cm radius using new tools - https://github.com/AliceO2Group/AliceO2/tree/dev/Common/TrackTools + const float bzKG = 5.f; + const float radiusOfInterest = 85.f; // cm + auto trackParLocal = o2::recohelpers::makeTrackParFromLocalParameters( + track.x(), + track.alpha(), + track.y(), + track.z(), + track.snp(), + track.tgl(), + track.signed1Pt()); + auto trackAt85 = o2::recohelpers::getParametersAtRadiusH(trackParLocal, radiusOfInterest, bzKG); + bool isTrackAt85 = trackAt85.valid(); + if (std::fabs(track.eta()) < 0.8 && track.pt() > 0.2) { if (track.hasITS()) { nTracksITS++; if (track.hasTPC()) nTracksITSTPC++; + if (isTrackAt85) + nTracksITSValidAt85cmAfterEtaPtCuts++; } } @@ -1234,12 +1256,18 @@ struct EventSelectionQaTask { histos.fill(HIST("occupancyQA/tpcNCrossedRows_vs_V0A_vs_occupancy"), multV0A, track.tpcNClsFindable() - tpcNClsFindableMinusCrossedRowsCorrected, occupancyByTracks); } } // end of hasTPC - if (col.sel8() && fabs(col.posZ()) < 10 && track.tpcNClsFound() > 50 && track.tpcNClsCrossedRows() > 80 && track.itsChi2NCl() < 36 && track.tpcChi2NCl() < 4) { - nContributorsAfterEtaTPCCuts++; - // ROF border QA - histos.fill(HIST("ITSROFborderQA/hFoundBC_kTVX_nITSlayers_for_ITSTPCtracks"), localBC, track.itsNCls()); - histos.fill(HIST("ITSROFborderQA/hFoundBC_kTVX_counter_ITSTPCtracks"), localBC); - } + if (col.sel8() && fabs(col.posZ()) < 10) { + if (track.tpcNClsFound() > 50 && track.tpcNClsCrossedRows() > 80 && track.itsChi2NCl() < 36 && track.tpcChi2NCl() < 4) { + nContributorsAfterEtaTPCCuts++; + // ROF border QA + histos.fill(HIST("ITSROFborderQA/hFoundBC_kTVX_nITSlayers_for_ITSTPCtracks"), localBC, track.itsNCls()); + histos.fill(HIST("ITSROFborderQA/hFoundBC_kTVX_counter_ITSTPCtracks"), localBC); + } + + if (isTrackAt85) { + nContributorsAt85cmAfterEtaPtSel8VxCuts++; + } + } // end of sel8 and vZ cuts } if (!track.hasTPC()) histos.fill(HIST("hITStrackBcDiff"), trackBcDiff); @@ -1268,6 +1296,10 @@ struct EventSelectionQaTask { histos.fill(HIST("occupancyQA/hNumTracksPVTPCLooseCuts_vs_V0A_vs_occupancy"), multV0A, nContributorsAfterEtaTPCLooseCuts, occupancyByTracks); histos.fill(HIST("occupancyQA/hNumTracksITS_vs_V0A_vs_occupancy"), multV0A, nTracksITS, occupancyByTracks); histos.fill(HIST("occupancyQA/hNumTracksITSTPC_vs_V0A_vs_occupancy"), multV0A, nTracksITSTPC, occupancyByTracks); + + histos.fill(HIST("occupancyQA/hNumTracksITS_isValidAt85cm_EtaPtCuts_vs_V0A_vs_occupancy"), multV0A, nTracksITSValidAt85cmAfterEtaPtCuts, occupancyByTracks); + histos.fill(HIST("occupancyQA/hNumTracksPV_isValidAt85cm_EtaPtSel8VxCuts_vs_V0A_vs_occupancy"), multV0A, nContributorsAt85cmAfterEtaPtSel8VxCuts, occupancyByTracks); + if (col.selection_bit(kNoCollInTimeRangeNarrow)) { histos.fill(HIST("occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy_NarrowDeltaTimeCut"), multV0A, nPV, occupancyByTracks); histos.fill(HIST("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_NarrowDeltaTimeCut"), multV0A, nContributorsAfterEtaTPCCuts, occupancyByTracks); From 19dc19f496010575d06c95782307861a25ee1baa Mon Sep 17 00:00:00 2001 From: Igor Altsybeev Date: Tue, 27 Oct 2026 11:16:52 +0100 Subject: [PATCH 3/5] adding monitoring of trackAt85.valid() vs occupancy Added new histograms to track occupancy at 85 cm radius and validate tracks with specific cuts. --- DPG/Tasks/AOTEvent/eventSelectionQa.cxx | 44 +++++++++++++++++++++---- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx index 56a4c9a28ac..1398732dd0c 100644 --- a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx +++ b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx @@ -44,6 +44,7 @@ #include #include +#include "TrackTools/TrackGeometry.h" #include #include @@ -390,6 +391,9 @@ struct EventSelectionQaTask { histos.add("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_StandardDeltaTimeCut", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); histos.add("occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy_GoodITSLayersAllCut", "", kTH3F, {axisMultV0AForOccup, axisNtracksPV, axisOccupancyTracks}); histos.add("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_GoodITSLayersAllCut", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); + // check at R=85 cm (Oct 2026) + histos.add("occupancyQA/hNumTracksITS_isValidAt85cm_EtaPtCuts_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); + histos.add("occupancyQA/hNumTracksPV_isValidAt85cm_EtaPtSel8VxCuts_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); // requested by TPC experts: nTPConly tracks vs occupancy histos.add("occupancyQA/hNumTracksTPConly_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks}); histos.add("occupancyQA/hNumTracksTPConlyNoITS_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks}); @@ -1185,6 +1189,8 @@ struct EventSelectionQaTask { int nTracksITS = 0; int nTracksITSTPC = 0; + int nTracksITSValidAt85cmAfterEtaPtCuts = 0; + int nContributorsAt85cmAfterEtaPtSel8VxCuts = 0; bool isTVX = col.selection_bit(kIsTriggerTVX); @@ -1202,11 +1208,27 @@ struct EventSelectionQaTask { nTPConlyNoITS++; } + // Oct 2026: test presence of track at 85 cm radius using new tools - https://github.com/AliceO2Group/AliceO2/tree/dev/Common/TrackTools + const float bzKG = 5.f; + const float radiusOfInterest = 85.f; // cm + auto trackParLocal = o2::recohelpers::makeTrackParFromLocalParameters( + track.x(), + track.alpha(), + track.y(), + track.z(), + track.snp(), + track.tgl(), + track.signed1Pt()); + auto trackAt85 = o2::recohelpers::getParametersAtRadiusH(trackParLocal, radiusOfInterest, bzKG); + bool isTrackAt85 = trackAt85.valid(); + if (std::fabs(track.eta()) < 0.8 && track.pt() > 0.2) { if (track.hasITS()) { nTracksITS++; if (track.hasTPC()) nTracksITSTPC++; + if (isTrackAt85) + nTracksITSValidAt85cmAfterEtaPtCuts++; } } @@ -1234,12 +1256,18 @@ struct EventSelectionQaTask { histos.fill(HIST("occupancyQA/tpcNCrossedRows_vs_V0A_vs_occupancy"), multV0A, track.tpcNClsFindable() - tpcNClsFindableMinusCrossedRowsCorrected, occupancyByTracks); } } // end of hasTPC - if (col.sel8() && fabs(col.posZ()) < 10 && track.tpcNClsFound() > 50 && track.tpcNClsCrossedRows() > 80 && track.itsChi2NCl() < 36 && track.tpcChi2NCl() < 4) { - nContributorsAfterEtaTPCCuts++; - // ROF border QA - histos.fill(HIST("ITSROFborderQA/hFoundBC_kTVX_nITSlayers_for_ITSTPCtracks"), localBC, track.itsNCls()); - histos.fill(HIST("ITSROFborderQA/hFoundBC_kTVX_counter_ITSTPCtracks"), localBC); - } + if (col.sel8() && fabs(col.posZ()) < 10) { + if (track.tpcNClsFound() > 50 && track.tpcNClsCrossedRows() > 80 && track.itsChi2NCl() < 36 && track.tpcChi2NCl() < 4) { + nContributorsAfterEtaTPCCuts++; + // ROF border QA + histos.fill(HIST("ITSROFborderQA/hFoundBC_kTVX_nITSlayers_for_ITSTPCtracks"), localBC, track.itsNCls()); + histos.fill(HIST("ITSROFborderQA/hFoundBC_kTVX_counter_ITSTPCtracks"), localBC); + } + + if (isTrackAt85) { + nContributorsAt85cmAfterEtaPtSel8VxCuts++; + } + } // end of sel8 and vZ cuts } if (!track.hasTPC()) histos.fill(HIST("hITStrackBcDiff"), trackBcDiff); @@ -1268,6 +1296,10 @@ struct EventSelectionQaTask { histos.fill(HIST("occupancyQA/hNumTracksPVTPCLooseCuts_vs_V0A_vs_occupancy"), multV0A, nContributorsAfterEtaTPCLooseCuts, occupancyByTracks); histos.fill(HIST("occupancyQA/hNumTracksITS_vs_V0A_vs_occupancy"), multV0A, nTracksITS, occupancyByTracks); histos.fill(HIST("occupancyQA/hNumTracksITSTPC_vs_V0A_vs_occupancy"), multV0A, nTracksITSTPC, occupancyByTracks); + + histos.fill(HIST("occupancyQA/hNumTracksITS_isValidAt85cm_EtaPtCuts_vs_V0A_vs_occupancy"), multV0A, nTracksITSValidAt85cmAfterEtaPtCuts, occupancyByTracks); + histos.fill(HIST("occupancyQA/hNumTracksPV_isValidAt85cm_EtaPtSel8VxCuts_vs_V0A_vs_occupancy"), multV0A, nContributorsAt85cmAfterEtaPtSel8VxCuts, occupancyByTracks); + if (col.selection_bit(kNoCollInTimeRangeNarrow)) { histos.fill(HIST("occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy_NarrowDeltaTimeCut"), multV0A, nPV, occupancyByTracks); histos.fill(HIST("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_NarrowDeltaTimeCut"), multV0A, nContributorsAfterEtaTPCCuts, occupancyByTracks); From 18d74f36d7d9836e056b504631816658b338bb9a Mon Sep 17 00:00:00 2001 From: Igor Altsybeev Date: Tue, 27 Oct 2026 17:06:46 +0100 Subject: [PATCH 4/5] update usage of TrackTools to check tracks with NrowsThreshold in evSelQA --- DPG/Tasks/AOTEvent/CMakeLists.txt | 2 +- DPG/Tasks/AOTEvent/eventSelectionQa.cxx | 70 ++++++++++++++++--------- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/DPG/Tasks/AOTEvent/CMakeLists.txt b/DPG/Tasks/AOTEvent/CMakeLists.txt index 59e049e6356..202543fa7c2 100644 --- a/DPG/Tasks/AOTEvent/CMakeLists.txt +++ b/DPG/Tasks/AOTEvent/CMakeLists.txt @@ -11,7 +11,7 @@ o2physics_add_dpl_workflow(event-selection-qa SOURCES eventSelectionQa.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2::DetectorsBase O2::DataFormatsITSMFT + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2::DetectorsBase O2::DataFormatsITSMFT O2::TPCBase COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(lumi-qa diff --git a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx index 1398732dd0c..be8f67e5428 100644 --- a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx +++ b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx @@ -44,7 +44,7 @@ #include #include -#include "TrackTools/TrackGeometry.h" +#include #include #include @@ -74,6 +74,7 @@ struct EventSelectionQaTask { Configurable isLowFlux{"isLowFlux", 1, "1 - low flux (pp, pPb), 0 - high flux (PbPb)"}; Configurable fillITSdeadStaveHists{"fillITSdeadStaveHists", 0, "0 - no, 1 - yes"}; Configurable fillTPCnClsVsOccupancyHists{"fillTPCnClsVsOccupancyHists", 0, "0 - no, 1 - yes"}; + Configurable useTestWithTrackTools{"useTestWithTrackTools", 0, "0 - no, 1 - yes"}; Service ccdb; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -92,6 +93,8 @@ struct EventSelectionQaTask { std::string strPassName = ""; // RecoPassName (for data) or AnchorPassName (for MC) from metadata bool isMC = false; + o2::tpc::recohelpers::TPCSectorEdgeConfig tpcSectorEdgeConfig; // for special selection of tracks within TPC + std::bitset bcPatternA; std::bitset bcPatternC; std::bitset bcPatternB; @@ -122,6 +125,12 @@ struct EventSelectionQaTask { strLPMProductionTag = metadataInfo.get("LPMProductionTag"); // to extract info from ccdb by the tag strPassName = metadataInfo.get(isMC ? "AnchorPassName" : "RecoPassName"); + // for special selection of tracks within TPC (Oct 2026) + tpcSectorEdgeConfig.guardLowerCm = 0.5f; + tpcSectorEdgeConfig.guardUpperCm = 0.5f; + tpcSectorEdgeConfig.zMaxCm = 250.f; + tpcSectorEdgeConfig.maxSnp = 0.9f; + const AxisSpec axisMultV0M{1000, 0., 40000., "V0M multiplicity"}; const AxisSpec axisMultV0A{1000, 0., isLowFlux ? 40000. : 200000., "V0A multiplicity"}; const AxisSpec axisMultV0C{1000, 0., 30000., "V0C multiplicity"}; @@ -391,9 +400,11 @@ struct EventSelectionQaTask { histos.add("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_StandardDeltaTimeCut", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); histos.add("occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy_GoodITSLayersAllCut", "", kTH3F, {axisMultV0AForOccup, axisNtracksPV, axisOccupancyTracks}); histos.add("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_GoodITSLayersAllCut", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); - // check at R=85 cm (Oct 2026) - histos.add("occupancyQA/hNumTracksITS_isValidAt85cm_EtaPtCuts_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); - histos.add("occupancyQA/hNumTracksPV_isValidAt85cm_EtaPtSel8VxCuts_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); + // requested by TPC experts: check with tracks at given NrowsThreshold + if (useTestWithTrackTools) { + histos.add("occupancyQA/hNumTracksITS_isValidAtNrowsThreshold_EtaPtCuts_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); + histos.add("occupancyQA/hNumTracksPV_isValidAtNrowsThreshold_EtaPtSel8VxCuts_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); + } // requested by TPC experts: nTPConly tracks vs occupancy histos.add("occupancyQA/hNumTracksTPConly_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks}); histos.add("occupancyQA/hNumTracksTPConlyNoITS_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks}); @@ -416,7 +427,7 @@ struct EventSelectionQaTask { histos.add("occupancyQA/dEdx_vs_centr_vs_occup_narrow_p_win", "dE/dx", kTH3F, {{20, 0, 4000, "n PV tracks"}, {60, 0, 15000, "occupancy"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}}); } - } + } // end of init() void processRun2( ColEvSels const& cols, @@ -1189,8 +1200,8 @@ struct EventSelectionQaTask { int nTracksITS = 0; int nTracksITSTPC = 0; - int nTracksITSValidAt85cmAfterEtaPtCuts = 0; - int nContributorsAt85cmAfterEtaPtSel8VxCuts = 0; + int nTracksITSValidAtNrowsThresholdAfterEtaPtCuts = 0; + int nContributorsAtNrowsThresholdAfterEtaPtSel8VxCuts = 0; bool isTVX = col.selection_bit(kIsTriggerTVX); @@ -1209,26 +1220,33 @@ struct EventSelectionQaTask { } // Oct 2026: test presence of track at 85 cm radius using new tools - https://github.com/AliceO2Group/AliceO2/tree/dev/Common/TrackTools - const float bzKG = 5.f; - const float radiusOfInterest = 85.f; // cm - auto trackParLocal = o2::recohelpers::makeTrackParFromLocalParameters( - track.x(), - track.alpha(), - track.y(), - track.z(), - track.snp(), - track.tgl(), - track.signed1Pt()); - auto trackAt85 = o2::recohelpers::getParametersAtRadiusH(trackParLocal, radiusOfInterest, bzKG); - bool isTrackAt85 = trackAt85.valid(); + bool isTrackWithNrowsAvailable = false; + if (useTestWithTrackTools) { + const float bzKG = 5.f; + const float radiusOfInterest = 85.f; // cm + auto trackParLocal = o2::recohelpers::makeTrackParFromLocalParameters( + track.x(), + track.alpha(), + track.y(), + track.z(), + track.snp(), + track.tgl(), + track.signed1Pt()); + auto trackAt85 = o2::recohelpers::getParametersAtRadiusH(trackParLocal, radiusOfInterest, bzKG); + auto l0 = o2::tpc::recohelpers::sectorEdgeStackLinear(trackParLocal, bzKG, tpcSectorEdgeConfig); + const int nRowsThreshold = 120; // minimum number of TPC rows required at 85 cm radius + + isTrackWithNrowsAvailable = (trackAt85.valid() && l0.nRowsAvailable > nRowsThreshold); + } if (std::fabs(track.eta()) < 0.8 && track.pt() > 0.2) { if (track.hasITS()) { nTracksITS++; if (track.hasTPC()) nTracksITSTPC++; - if (isTrackAt85) - nTracksITSValidAt85cmAfterEtaPtCuts++; + if (useTestWithTrackTools && isTrackWithNrowsAvailable) { + nTracksITSValidAtNrowsThresholdAfterEtaPtCuts++; + } } } @@ -1264,8 +1282,8 @@ struct EventSelectionQaTask { histos.fill(HIST("ITSROFborderQA/hFoundBC_kTVX_counter_ITSTPCtracks"), localBC); } - if (isTrackAt85) { - nContributorsAt85cmAfterEtaPtSel8VxCuts++; + if (useTestWithTrackTools && isTrackWithNrowsAvailable) { + nContributorsAtNrowsThresholdAfterEtaPtSel8VxCuts++; } } // end of sel8 and vZ cuts } @@ -1297,8 +1315,10 @@ struct EventSelectionQaTask { histos.fill(HIST("occupancyQA/hNumTracksITS_vs_V0A_vs_occupancy"), multV0A, nTracksITS, occupancyByTracks); histos.fill(HIST("occupancyQA/hNumTracksITSTPC_vs_V0A_vs_occupancy"), multV0A, nTracksITSTPC, occupancyByTracks); - histos.fill(HIST("occupancyQA/hNumTracksITS_isValidAt85cm_EtaPtCuts_vs_V0A_vs_occupancy"), multV0A, nTracksITSValidAt85cmAfterEtaPtCuts, occupancyByTracks); - histos.fill(HIST("occupancyQA/hNumTracksPV_isValidAt85cm_EtaPtSel8VxCuts_vs_V0A_vs_occupancy"), multV0A, nContributorsAt85cmAfterEtaPtSel8VxCuts, occupancyByTracks); + if (useTestWithTrackTools) { + histos.fill(HIST("occupancyQA/hNumTracksITS_isValidAtNrowsThreshold_EtaPtCuts_vs_V0A_vs_occupancy"), multV0A, nTracksITSValidAtNrowsThresholdAfterEtaPtCuts, occupancyByTracks); + histos.fill(HIST("occupancyQA/hNumTracksPV_isValidAtNrowsThreshold_EtaPtSel8VxCuts_vs_V0A_vs_occupancy"), multV0A, nContributorsAtNrowsThresholdAfterEtaPtSel8VxCuts, occupancyByTracks); + } if (col.selection_bit(kNoCollInTimeRangeNarrow)) { histos.fill(HIST("occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy_NarrowDeltaTimeCut"), multV0A, nPV, occupancyByTracks); From 338408915919145d9ea795f35ca5f59151da48bf Mon Sep 17 00:00:00 2001 From: Igor Altsybeev Date: Tue, 27 Oct 2026 17:44:07 +0100 Subject: [PATCH 5/5] add configurable thresholdNrowsForTrackToolTest for experimental checks --- DPG/Tasks/AOTEvent/eventSelectionQa.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx index be8f67e5428..752a81885ca 100644 --- a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx +++ b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx @@ -74,7 +74,8 @@ struct EventSelectionQaTask { Configurable isLowFlux{"isLowFlux", 1, "1 - low flux (pp, pPb), 0 - high flux (PbPb)"}; Configurable fillITSdeadStaveHists{"fillITSdeadStaveHists", 0, "0 - no, 1 - yes"}; Configurable fillTPCnClsVsOccupancyHists{"fillTPCnClsVsOccupancyHists", 0, "0 - no, 1 - yes"}; - Configurable useTestWithTrackTools{"useTestWithTrackTools", 0, "0 - no, 1 - yes"}; + Configurable useTestWithTrackTools{"useTestWithTrackTools", 0, "0 - no, 1 - yes"}; // experimental + Configurable thresholdNrowsForTrackToolTest{"thresholdNrowsForTrackToolTest", 120, "threshold for Nrows for TrackTool test"}; // minimum number of TPC rows (experimental) Service ccdb; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -1234,9 +1235,8 @@ struct EventSelectionQaTask { track.signed1Pt()); auto trackAt85 = o2::recohelpers::getParametersAtRadiusH(trackParLocal, radiusOfInterest, bzKG); auto l0 = o2::tpc::recohelpers::sectorEdgeStackLinear(trackParLocal, bzKG, tpcSectorEdgeConfig); - const int nRowsThreshold = 120; // minimum number of TPC rows required at 85 cm radius - isTrackWithNrowsAvailable = (trackAt85.valid() && l0.nRowsAvailable > nRowsThreshold); + isTrackWithNrowsAvailable = (trackAt85.valid() && l0.nRowsAvailable > thresholdNrowsForTrackToolTest); } if (std::fabs(track.eta()) < 0.8 && track.pt() > 0.2) {