4444#include < TMath.h>
4545#include < TString.h>
4646
47+ #include < TrackTools/TrackGeometry.h>
4748#include < sys/types.h>
4849
4950#include < bitset>
@@ -73,6 +74,8 @@ struct EventSelectionQaTask {
7374 Configurable<bool > isLowFlux{" isLowFlux" , 1 , " 1 - low flux (pp, pPb), 0 - high flux (PbPb)" };
7475 Configurable<bool > fillITSdeadStaveHists{" fillITSdeadStaveHists" , 0 , " 0 - no, 1 - yes" };
7576 Configurable<bool > fillTPCnClsVsOccupancyHists{" fillTPCnClsVsOccupancyHists" , 0 , " 0 - no, 1 - yes" };
77+ Configurable<bool > useTestWithTrackTools{" useTestWithTrackTools" , 0 , " 0 - no, 1 - yes" }; // experimental
78+ Configurable<int > thresholdNrowsForTrackToolTest{" thresholdNrowsForTrackToolTest" , 120 , " threshold for Nrows for TrackTool test" }; // minimum number of TPC rows (experimental)
7679
7780 Service<o2::ccdb::BasicCCDBManager> ccdb;
7881 HistogramRegistry histos{" Histos" , {}, OutputObjHandlingPolicy::AnalysisObject};
@@ -91,6 +94,8 @@ struct EventSelectionQaTask {
9194 std::string strPassName = " " ; // RecoPassName (for data) or AnchorPassName (for MC) from metadata
9295 bool isMC = false ;
9396
97+ o2::tpc::recohelpers::TPCSectorEdgeConfig tpcSectorEdgeConfig; // for special selection of tracks within TPC
98+
9499 std::bitset<nBCsPerOrbit> bcPatternA;
95100 std::bitset<nBCsPerOrbit> bcPatternC;
96101 std::bitset<nBCsPerOrbit> bcPatternB;
@@ -121,6 +126,12 @@ struct EventSelectionQaTask {
121126 strLPMProductionTag = metadataInfo.get (" LPMProductionTag" ); // to extract info from ccdb by the tag
122127 strPassName = metadataInfo.get (isMC ? " AnchorPassName" : " RecoPassName" );
123128
129+ // for special selection of tracks within TPC (Oct 2026)
130+ tpcSectorEdgeConfig.guardLowerCm = 0 .5f ;
131+ tpcSectorEdgeConfig.guardUpperCm = 0 .5f ;
132+ tpcSectorEdgeConfig.zMaxCm = 250 .f ;
133+ tpcSectorEdgeConfig.maxSnp = 0 .9f ;
134+
124135 const AxisSpec axisMultV0M{1000 , 0 ., 40000 ., " V0M multiplicity" };
125136 const AxisSpec axisMultV0A{1000 , 0 ., isLowFlux ? 40000 . : 200000 ., " V0A multiplicity" };
126137 const AxisSpec axisMultV0C{1000 , 0 ., 30000 ., " V0C multiplicity" };
@@ -390,6 +401,11 @@ struct EventSelectionQaTask {
390401 histos.add (" occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_StandardDeltaTimeCut" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks});
391402 histos.add (" occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy_GoodITSLayersAllCut" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksPV, axisOccupancyTracks});
392403 histos.add (" occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_GoodITSLayersAllCut" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks});
404+ // requested by TPC experts: check with tracks at given NrowsThreshold
405+ if (useTestWithTrackTools) {
406+ histos.add (" occupancyQA/hNumTracksITS_isValidAtNrowsThreshold_EtaPtCuts_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks});
407+ histos.add (" occupancyQA/hNumTracksPV_isValidAtNrowsThreshold_EtaPtSel8VxCuts_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks});
408+ }
393409 // requested by TPC experts: nTPConly tracks vs occupancy
394410 histos.add (" occupancyQA/hNumTracksTPConly_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks});
395411 histos.add (" occupancyQA/hNumTracksTPConlyNoITS_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks});
@@ -412,7 +428,7 @@ struct EventSelectionQaTask {
412428
413429 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.)" }});
414430 }
415- }
431+ } // end of init()
416432
417433 void processRun2 (
418434 ColEvSels const & cols,
@@ -1185,6 +1201,8 @@ struct EventSelectionQaTask {
11851201
11861202 int nTracksITS = 0 ;
11871203 int nTracksITSTPC = 0 ;
1204+ int nTracksITSValidAtNrowsThresholdAfterEtaPtCuts = 0 ;
1205+ int nContributorsAtNrowsThresholdAfterEtaPtSel8VxCuts = 0 ;
11881206
11891207 bool isTVX = col.selection_bit (kIsTriggerTVX );
11901208
@@ -1202,11 +1220,33 @@ struct EventSelectionQaTask {
12021220 nTPConlyNoITS++;
12031221 }
12041222
1223+ // Oct 2026: test presence of track at 85 cm radius using new tools - https://github.com/AliceO2Group/AliceO2/tree/dev/Common/TrackTools
1224+ bool isTrackWithNrowsAvailable = false ;
1225+ if (useTestWithTrackTools) {
1226+ const float bzKG = 5 .f ;
1227+ const float radiusOfInterest = 85 .f ; // cm
1228+ auto trackParLocal = o2::recohelpers::makeTrackParFromLocalParameters (
1229+ track.x (),
1230+ track.alpha (),
1231+ track.y (),
1232+ track.z (),
1233+ track.snp (),
1234+ track.tgl (),
1235+ track.signed1Pt ());
1236+ auto trackAt85 = o2::recohelpers::getParametersAtRadiusH (trackParLocal, radiusOfInterest, bzKG);
1237+ auto l0 = o2::tpc::recohelpers::sectorEdgeStackLinear (trackParLocal, bzKG, tpcSectorEdgeConfig);
1238+
1239+ isTrackWithNrowsAvailable = (trackAt85.valid () && l0.nRowsAvailable > thresholdNrowsForTrackToolTest);
1240+ }
1241+
12051242 if (std::fabs (track.eta ()) < 0.8 && track.pt () > 0.2 ) {
12061243 if (track.hasITS ()) {
12071244 nTracksITS++;
12081245 if (track.hasTPC ())
12091246 nTracksITSTPC++;
1247+ if (useTestWithTrackTools && isTrackWithNrowsAvailable) {
1248+ nTracksITSValidAtNrowsThresholdAfterEtaPtCuts++;
1249+ }
12101250 }
12111251 }
12121252
@@ -1234,12 +1274,18 @@ struct EventSelectionQaTask {
12341274 histos.fill (HIST (" occupancyQA/tpcNCrossedRows_vs_V0A_vs_occupancy" ), multV0A, track.tpcNClsFindable () - tpcNClsFindableMinusCrossedRowsCorrected, occupancyByTracks);
12351275 }
12361276 } // end of hasTPC
1237- if (col.sel8 () && fabs (col.posZ ()) < 10 && track.tpcNClsFound () > 50 && track.tpcNClsCrossedRows () > 80 && track.itsChi2NCl () < 36 && track.tpcChi2NCl () < 4 ) {
1238- nContributorsAfterEtaTPCCuts++;
1239- // ROF border QA
1240- histos.fill (HIST (" ITSROFborderQA/hFoundBC_kTVX_nITSlayers_for_ITSTPCtracks" ), localBC, track.itsNCls ());
1241- histos.fill (HIST (" ITSROFborderQA/hFoundBC_kTVX_counter_ITSTPCtracks" ), localBC);
1242- }
1277+ if (col.sel8 () && fabs (col.posZ ()) < 10 ) {
1278+ if (track.tpcNClsFound () > 50 && track.tpcNClsCrossedRows () > 80 && track.itsChi2NCl () < 36 && track.tpcChi2NCl () < 4 ) {
1279+ nContributorsAfterEtaTPCCuts++;
1280+ // ROF border QA
1281+ histos.fill (HIST (" ITSROFborderQA/hFoundBC_kTVX_nITSlayers_for_ITSTPCtracks" ), localBC, track.itsNCls ());
1282+ histos.fill (HIST (" ITSROFborderQA/hFoundBC_kTVX_counter_ITSTPCtracks" ), localBC);
1283+ }
1284+
1285+ if (useTestWithTrackTools && isTrackWithNrowsAvailable) {
1286+ nContributorsAtNrowsThresholdAfterEtaPtSel8VxCuts++;
1287+ }
1288+ } // end of sel8 and vZ cuts
12431289 }
12441290 if (!track.hasTPC ())
12451291 histos.fill (HIST (" hITStrackBcDiff" ), trackBcDiff);
@@ -1268,6 +1314,12 @@ struct EventSelectionQaTask {
12681314 histos.fill (HIST (" occupancyQA/hNumTracksPVTPCLooseCuts_vs_V0A_vs_occupancy" ), multV0A, nContributorsAfterEtaTPCLooseCuts, occupancyByTracks);
12691315 histos.fill (HIST (" occupancyQA/hNumTracksITS_vs_V0A_vs_occupancy" ), multV0A, nTracksITS, occupancyByTracks);
12701316 histos.fill (HIST (" occupancyQA/hNumTracksITSTPC_vs_V0A_vs_occupancy" ), multV0A, nTracksITSTPC, occupancyByTracks);
1317+
1318+ if (useTestWithTrackTools) {
1319+ histos.fill (HIST (" occupancyQA/hNumTracksITS_isValidAtNrowsThreshold_EtaPtCuts_vs_V0A_vs_occupancy" ), multV0A, nTracksITSValidAtNrowsThresholdAfterEtaPtCuts, occupancyByTracks);
1320+ histos.fill (HIST (" occupancyQA/hNumTracksPV_isValidAtNrowsThreshold_EtaPtSel8VxCuts_vs_V0A_vs_occupancy" ), multV0A, nContributorsAtNrowsThresholdAfterEtaPtSel8VxCuts, occupancyByTracks);
1321+ }
1322+
12711323 if (col.selection_bit (kNoCollInTimeRangeNarrow )) {
12721324 histos.fill (HIST (" occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy_NarrowDeltaTimeCut" ), multV0A, nPV, occupancyByTracks);
12731325 histos.fill (HIST (" occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_NarrowDeltaTimeCut" ), multV0A, nContributorsAfterEtaTPCCuts, occupancyByTracks);
0 commit comments