4444#include < TMath.h>
4545#include < TString.h>
4646
47- #include " TrackTools/TrackGeometry.h"
47+ #include < TrackTools/TrackGeometry.h>
4848#include < sys/types.h>
4949
5050#include < bitset>
@@ -74,6 +74,7 @@ struct EventSelectionQaTask {
7474 Configurable<bool > isLowFlux{" isLowFlux" , 1 , " 1 - low flux (pp, pPb), 0 - high flux (PbPb)" };
7575 Configurable<bool > fillITSdeadStaveHists{" fillITSdeadStaveHists" , 0 , " 0 - no, 1 - yes" };
7676 Configurable<bool > fillTPCnClsVsOccupancyHists{" fillTPCnClsVsOccupancyHists" , 0 , " 0 - no, 1 - yes" };
77+ Configurable<bool > useTestWithTrackTools{" useTestWithTrackTools" , 0 , " 0 - no, 1 - yes" };
7778
7879 Service<o2::ccdb::BasicCCDBManager> ccdb;
7980 HistogramRegistry histos{" Histos" , {}, OutputObjHandlingPolicy::AnalysisObject};
@@ -92,6 +93,8 @@ struct EventSelectionQaTask {
9293 std::string strPassName = " " ; // RecoPassName (for data) or AnchorPassName (for MC) from metadata
9394 bool isMC = false ;
9495
96+ o2::tpc::recohelpers::TPCSectorEdgeConfig tpcSectorEdgeConfig; // for special selection of tracks within TPC
97+
9598 std::bitset<nBCsPerOrbit> bcPatternA;
9699 std::bitset<nBCsPerOrbit> bcPatternC;
97100 std::bitset<nBCsPerOrbit> bcPatternB;
@@ -122,6 +125,12 @@ struct EventSelectionQaTask {
122125 strLPMProductionTag = metadataInfo.get (" LPMProductionTag" ); // to extract info from ccdb by the tag
123126 strPassName = metadataInfo.get (isMC ? " AnchorPassName" : " RecoPassName" );
124127
128+ // for special selection of tracks within TPC (Oct 2026)
129+ tpcSectorEdgeConfig.guardLowerCm = 0 .5f ;
130+ tpcSectorEdgeConfig.guardUpperCm = 0 .5f ;
131+ tpcSectorEdgeConfig.zMaxCm = 250 .f ;
132+ tpcSectorEdgeConfig.maxSnp = 0 .9f ;
133+
125134 const AxisSpec axisMultV0M{1000 , 0 ., 40000 ., " V0M multiplicity" };
126135 const AxisSpec axisMultV0A{1000 , 0 ., isLowFlux ? 40000 . : 200000 ., " V0A multiplicity" };
127136 const AxisSpec axisMultV0C{1000 , 0 ., 30000 ., " V0C multiplicity" };
@@ -391,9 +400,11 @@ struct EventSelectionQaTask {
391400 histos.add (" occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_StandardDeltaTimeCut" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks});
392401 histos.add (" occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy_GoodITSLayersAllCut" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksPV, axisOccupancyTracks});
393402 histos.add (" occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy_GoodITSLayersAllCut" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks});
394- // check at R=85 cm (Oct 2026)
395- histos.add (" occupancyQA/hNumTracksITS_isValidAt85cm_EtaPtCuts_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks});
396- histos.add (" occupancyQA/hNumTracksPV_isValidAt85cm_EtaPtSel8VxCuts_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks});
403+ // requested by TPC experts: check with tracks at given NrowsThreshold
404+ if (useTestWithTrackTools) {
405+ histos.add (" occupancyQA/hNumTracksITS_isValidAtNrowsThreshold_EtaPtCuts_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks});
406+ histos.add (" occupancyQA/hNumTracksPV_isValidAtNrowsThreshold_EtaPtSel8VxCuts_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks});
407+ }
397408 // requested by TPC experts: nTPConly tracks vs occupancy
398409 histos.add (" occupancyQA/hNumTracksTPConly_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks});
399410 histos.add (" occupancyQA/hNumTracksTPConlyNoITS_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks});
@@ -416,7 +427,7 @@ struct EventSelectionQaTask {
416427
417428 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.)" }});
418429 }
419- }
430+ } // end of init()
420431
421432 void processRun2 (
422433 ColEvSels const & cols,
@@ -1189,8 +1200,8 @@ struct EventSelectionQaTask {
11891200
11901201 int nTracksITS = 0 ;
11911202 int nTracksITSTPC = 0 ;
1192- int nTracksITSValidAt85cmAfterEtaPtCuts = 0 ;
1193- int nContributorsAt85cmAfterEtaPtSel8VxCuts = 0 ;
1203+ int nTracksITSValidAtNrowsThresholdAfterEtaPtCuts = 0 ;
1204+ int nContributorsAtNrowsThresholdAfterEtaPtSel8VxCuts = 0 ;
11941205
11951206 bool isTVX = col.selection_bit (kIsTriggerTVX );
11961207
@@ -1209,26 +1220,33 @@ struct EventSelectionQaTask {
12091220 }
12101221
12111222 // Oct 2026: test presence of track at 85 cm radius using new tools - https://github.com/AliceO2Group/AliceO2/tree/dev/Common/TrackTools
1212- const float bzKG = 5 .f ;
1213- const float radiusOfInterest = 85 .f ; // cm
1214- auto trackParLocal = o2::recohelpers::makeTrackParFromLocalParameters (
1215- track.x (),
1216- track.alpha (),
1217- track.y (),
1218- track.z (),
1219- track.snp (),
1220- track.tgl (),
1221- track.signed1Pt ());
1222- auto trackAt85 = o2::recohelpers::getParametersAtRadiusH (trackParLocal, radiusOfInterest, bzKG);
1223- bool isTrackAt85 = trackAt85.valid ();
1223+ bool isTrackWithNrowsAvailable = false ;
1224+ if (useTestWithTrackTools) {
1225+ const float bzKG = 5 .f ;
1226+ const float radiusOfInterest = 85 .f ; // cm
1227+ auto trackParLocal = o2::recohelpers::makeTrackParFromLocalParameters (
1228+ track.x (),
1229+ track.alpha (),
1230+ track.y (),
1231+ track.z (),
1232+ track.snp (),
1233+ track.tgl (),
1234+ track.signed1Pt ());
1235+ auto trackAt85 = o2::recohelpers::getParametersAtRadiusH (trackParLocal, radiusOfInterest, bzKG);
1236+ auto l0 = o2::tpc::recohelpers::sectorEdgeStackLinear (trackParLocal, bzKG, tpcSectorEdgeConfig);
1237+ const int nRowsThreshold = 120 ; // minimum number of TPC rows required at 85 cm radius
1238+
1239+ isTrackWithNrowsAvailable = (trackAt85.valid () && l0.nRowsAvailable > nRowsThreshold);
1240+ }
12241241
12251242 if (std::fabs (track.eta ()) < 0.8 && track.pt () > 0.2 ) {
12261243 if (track.hasITS ()) {
12271244 nTracksITS++;
12281245 if (track.hasTPC ())
12291246 nTracksITSTPC++;
1230- if (isTrackAt85)
1231- nTracksITSValidAt85cmAfterEtaPtCuts++;
1247+ if (useTestWithTrackTools && isTrackWithNrowsAvailable) {
1248+ nTracksITSValidAtNrowsThresholdAfterEtaPtCuts++;
1249+ }
12321250 }
12331251 }
12341252
@@ -1264,8 +1282,8 @@ struct EventSelectionQaTask {
12641282 histos.fill (HIST (" ITSROFborderQA/hFoundBC_kTVX_counter_ITSTPCtracks" ), localBC);
12651283 }
12661284
1267- if (isTrackAt85 ) {
1268- nContributorsAt85cmAfterEtaPtSel8VxCuts ++;
1285+ if (useTestWithTrackTools && isTrackWithNrowsAvailable ) {
1286+ nContributorsAtNrowsThresholdAfterEtaPtSel8VxCuts ++;
12691287 }
12701288 } // end of sel8 and vZ cuts
12711289 }
@@ -1297,8 +1315,10 @@ struct EventSelectionQaTask {
12971315 histos.fill (HIST (" occupancyQA/hNumTracksITS_vs_V0A_vs_occupancy" ), multV0A, nTracksITS, occupancyByTracks);
12981316 histos.fill (HIST (" occupancyQA/hNumTracksITSTPC_vs_V0A_vs_occupancy" ), multV0A, nTracksITSTPC, occupancyByTracks);
12991317
1300- histos.fill (HIST (" occupancyQA/hNumTracksITS_isValidAt85cm_EtaPtCuts_vs_V0A_vs_occupancy" ), multV0A, nTracksITSValidAt85cmAfterEtaPtCuts, occupancyByTracks);
1301- histos.fill (HIST (" occupancyQA/hNumTracksPV_isValidAt85cm_EtaPtSel8VxCuts_vs_V0A_vs_occupancy" ), multV0A, nContributorsAt85cmAfterEtaPtSel8VxCuts, occupancyByTracks);
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+ }
13021322
13031323 if (col.selection_bit (kNoCollInTimeRangeNarrow )) {
13041324 histos.fill (HIST (" occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy_NarrowDeltaTimeCut" ), multV0A, nPV, occupancyByTracks);
0 commit comments