Skip to content

Commit 3531bdd

Browse files
authored
[DPG] adding histograms to monitor track quality vs occupancy for tracks reaching specified NrowsThreshold (#18474)
1 parent ecee2d9 commit 3531bdd

2 files changed

Lines changed: 60 additions & 8 deletions

File tree

‎DPG/Tasks/AOTEvent/CMakeLists.txt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
o2physics_add_dpl_workflow(event-selection-qa
1313
SOURCES eventSelectionQa.cxx
14-
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2::DetectorsBase O2::DataFormatsITSMFT
14+
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2::DetectorsBase O2::DataFormatsITSMFT O2::TPCBase
1515
COMPONENT_NAME Analysis)
1616

1717
o2physics_add_dpl_workflow(lumi-qa

‎DPG/Tasks/AOTEvent/eventSelectionQa.cxx‎

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
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

Comments
 (0)