Skip to content

Commit d1dc0b0

Browse files
BongHwialibuild
andauthored
[PWGCF] jFlucEfficiencyTask - Add track selection systematics (#10865)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent c9852e9 commit d1dc0b0

File tree

1 file changed

+122
-41
lines changed

1 file changed

+122
-41
lines changed

PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx

Lines changed: 122 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
/// \since March 2024
1616

1717
#include <vector>
18+
#include <string>
1819
#include "Framework/AnalysisTask.h"
1920
#include "Framework/HistogramRegistry.h"
2021
#include "Framework/runDataProcessing.h"
@@ -31,6 +32,7 @@
3132
using namespace o2;
3233
using namespace o2::framework;
3334
using namespace o2::framework::expressions;
35+
using namespace o2::aod::rctsel;
3436

3537
struct JFlucEfficiencyTask {
3638
Service<o2::framework::O2DatabasePDG> pdg;
@@ -55,6 +57,8 @@ struct JFlucEfficiencyTask {
5557
o2::analysis::CollisonCuts colCuts;
5658
struct : ConfigurableGroup {
5759
Configurable<float> cfgEvtZvtx{"cfgEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"};
60+
Configurable<float> cfgCentMin{"cfgCentMin", 0.0f, "Min centrality"};
61+
Configurable<float> cfgCentMax{"cfgCentMax", 100.0f, "Max centrality"};
5862
Configurable<int> cfgEvtOccupancyInTimeRangeMax{"cfgEvtOccupancyInTimeRangeMax", -1, "Evt sel: maximum track occupancy"};
5963
Configurable<int> cfgEvtOccupancyInTimeRangeMin{"cfgEvtOccupancyInTimeRangeMin", -1, "Evt sel: minimum track occupancy"};
6064
Configurable<bool> cfgEvtTriggerCheck{"cfgEvtTriggerCheck", false, "Evt sel: check for trigger"};
@@ -68,44 +72,61 @@ struct JFlucEfficiencyTask {
6872
Configurable<bool> cfgEvtCollInTimeRangeStandard{"cfgEvtCollInTimeRangeStandard", true, "Evt sel: apply NoCollInTimeRangeStandard"};
6973
Configurable<bool> cfgEvtRun2AliEventCuts{"cfgEvtRun2AliEventCuts", true, "Evt sel: apply Run2 Ali event cuts"};
7074
Configurable<bool> cfgEvtRun2INELgtZERO{"cfgEvtRun2INELgtZERO", false, "Evt sel: apply Run2 INEL>0 event cuts"};
75+
Configurable<bool> cfgEvtUseRCTFlagChecker{"cfgEvtUseRCTFlagChecker", false, "Evt sel: use RCT flag checker"};
76+
Configurable<std::string> cfgEvtRCTFlagCheckerLabel{"cfgEvtRCTFlagCheckerLabel", "CBT_hadronPID", "Evt sel: RCT flag checker label"};
77+
Configurable<bool> cfgEvtRCTFlagCheckerZDCCheck{"cfgEvtRCTFlagCheckerZDCCheck", false, "Evt sel: RCT flag checker ZDC check"};
78+
Configurable<bool> cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", false, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"};
7179
} EventCuts;
80+
RCTFlagsChecker rctChecker;
81+
82+
// Track selections
83+
struct : ConfigurableGroup {
84+
Configurable<float> cfgMinPt{"cfgMinPt", 0.6, "Track minium pt cut"};
85+
Configurable<float> cfgMaxPt{"cfgMaxPt", 300.0f, "Maximum transverse momentum"};
86+
Configurable<float> cfgEtaMin{"cfgEtaMin", -1.0f, "Minimum pseudorapidity"};
87+
Configurable<float> cfgEtaMax{"cfgEtaMax", 1.0f, "Maximum pseudorapidity"};
88+
Configurable<bool> cfgPrimaryTrack{"cfgPrimaryTrack", false, "Primary track selection"}; // kGoldenChi2 | kDCAxy | kDCAz
89+
Configurable<bool> cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", false, "Global track selection without DCA"}; // kQualityTracks (kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits) | kInAcceptanceTracks (kPtRange | kEtaRange)
90+
Configurable<bool> cfgGlobalTrack{"cfgGlobalTrack", true, "Global track selection"}; // kGoldenChi2 | kDCAxy | kDCAz
91+
Configurable<bool> cfgPVContributor{"cfgPVContributor", false, "PV contributor track selection"}; // PV Contriuibutor
92+
Configurable<bool> cfgpTdepDCAxyCut{"cfgpTdepDCAxyCut", false, "pT-dependent DCAxy cut"};
93+
Configurable<int> cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"};
94+
Configurable<int> cfgTPCcluster{"cfgTPCcluster", 0, "Number of TPC cluster"};
95+
Configurable<float> cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.0f, "TPC Crossed Rows to Findable Clusters"};
96+
Configurable<float> cfgITSChi2NCl{"cfgITSChi2NCl", 999.0, "ITS Chi2/NCl"};
97+
Configurable<float> cfgTPCChi2NCl{"cfgTPCChi2NCl", 999.0, "TPC Chi2/NCl"};
98+
Configurable<bool> cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"};
99+
Configurable<bool> cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"};
100+
Configurable<bool> cfgHasITS{"cfgHasITS", false, "Require ITS"};
101+
Configurable<bool> cfgHasTPC{"cfgHasTPC", false, "Require TPC"};
102+
Configurable<bool> cfgHasTOF{"cfgHasTOF", false, "Require TOF"};
103+
// DCA to PV
104+
Configurable<float> cfgMaxbDCArToPVcut{"cfgMaxbDCArToPVcut", 0.5, "Track DCAr cut to PV Maximum"};
105+
Configurable<float> cfgMaxbDCAzToPVcut{"cfgMaxbDCAzToPVcut", 1.0, "Track DCAz cut to PV Maximum"};
106+
} TrackCuts;
72107

73108
// Configurable for track selection
74-
Configurable<float> cfgPtMin{"cfgPtMin", 0.2f, "Minimum transverse momentum"};
75-
Configurable<float> cfgPtMax{"cfgPtMax", 300.0f, "Maximum transverse momentum"};
76-
Configurable<float> cfgEtaMin{"cfgEtaMin", -1.0f, "Minimum pseudorapidity"};
77-
Configurable<float> cfgEtaMax{"cfgEtaMax", 1.0f, "Maximum pseudorapidity"};
78-
Configurable<float> cfgCutVertex{"cfgCutVertex", 10.0f, "Vertex cut"};
79-
Configurable<float> cfgCentMin{"cfgCentMin", 0.0f, "Min centrality"};
80-
Configurable<float> cfgCentMax{"cfgCentMax", 100.0f, "Max centrality"};
81-
Configurable<uint8_t> cfgTrackBitMask{"cfgTrackBitMask", 0, "BitMask for track selection systematics"};
82109
Configurable<int> trackSelection{"trackSelection", 0, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"};
83110

84111
// Configurable axes
85112
ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, "multiplicity / centrality axis"};
86113

87114
// Filter declarations
88-
Filter cfCollisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex);
89-
Filter cfTrackFilter = (aod::cftrack::pt >= cfgPtMin) &&
90-
(aod::cftrack::pt <= cfgPtMax) &&
91-
(aod::cftrack::eta >= cfgEtaMin) &&
92-
(aod::cftrack::eta <= cfgEtaMax);
93-
// Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex);
94-
// Filter trackFilter = (aod::track::pt >= cfgPtMin) &&
95-
// (aod::track::pt <= cfgPtMax) &&
96-
// (aod::track::eta >= cfgEtaMin) &&
97-
// (aod::track::eta <= cfgEtaMax);
98-
Filter trackSelectionFilter = (trackSelection.node() == 0) || // from tpcSkimsTableCreator
99-
((trackSelection.node() == 1) && requireGlobalTrackInFilter()) ||
100-
((trackSelection.node() == 2) && requirePrimaryTracksInFilter()) ||
101-
((trackSelection.node() == 3) && requireGlobalTrackWoDCAInFilter()) ||
102-
((trackSelection.node() == 4) && requireQualityTracksInFilter()) ||
103-
((trackSelection.node() == 5) && requireTrackCutInFilter(TrackSelectionFlags::kInAcceptanceTracks));
115+
Filter cfCollisionFilter = (nabs(aod::collision::posZ) < EventCuts.cfgEvtZvtx);
116+
Filter cfTrackFilter = (aod::cftrack::pt >= TrackCuts.cfgMinPt) &&
117+
(aod::cftrack::pt <= TrackCuts.cfgMaxPt) &&
118+
(aod::cftrack::eta >= TrackCuts.cfgEtaMin) &&
119+
(aod::cftrack::eta <= TrackCuts.cfgEtaMax);
120+
// Filter collisionFilter = (nabs(aod::collision::posZ) < EventCuts.cfgEvtZvtx);
121+
Filter trackFilter = (aod::track::pt >= TrackCuts.cfgMinPt) &&
122+
(aod::track::pt <= TrackCuts.cfgMaxPt) &&
123+
(aod::track::eta >= TrackCuts.cfgEtaMin) &&
124+
(aod::track::eta <= TrackCuts.cfgEtaMax);
104125

105126
Configurable<int> cfgCentBinsForMC{"cfgCentBinsForMC", 1, "Centrality bins for MC, 0: off, 1: on"};
106127
using CollisionCandidates = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Ms, aod::CentFT0Cs, aod::CentFT0As>;
107128
using CollisionRun2Candidates = soa::Join<aod::Collisions, aod::EvSels, aod::CentRun2V0Ms>;
108-
using TrackCandidates = soa::Join<aod::FullTracks, aod::TracksExtra, aod::TrackSelection>;
129+
using TrackCandidates = soa::Join<aod::FullTracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection, aod::TrackSelectionExtension>;
109130
using MCCollisionCandidates = soa::Join<CollisionCandidates, aod::McCollisionLabel>;
110131
using MCRun2CollisionCandidates = soa::Join<CollisionRun2Candidates, aod::McCollisionLabel>;
111132
using MCTrackCandidates = soa::Join<TrackCandidates, aod::McTrackLabel>;
@@ -145,6 +166,8 @@ struct JFlucEfficiencyTask {
145166
colCuts.setApplyRun2INELgtZERO(EventCuts.cfgEvtRun2INELgtZERO);
146167
colCuts.printCuts();
147168

169+
rctChecker.init(EventCuts.cfgEvtRCTFlagCheckerLabel, EventCuts.cfgEvtRCTFlagCheckerZDCCheck, EventCuts.cfgEvtRCTFlagCheckerLimitAcceptAsBad);
170+
148171
if (doprocessDerivedMC || doprocessMC || doprocessMCRun2) {
149172
registry.add("hPtGen", "Generated p_{T} (all);p_{T} (GeV/c);Centrality (%);Counts",
150173
o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)});
@@ -218,6 +241,59 @@ struct JFlucEfficiencyTask {
218241
}
219242
return std::abs(charge) >= 3.;
220243
}
244+
// Track selection
245+
template <typename TrackType>
246+
bool trackCut(TrackType const& track)
247+
{
248+
// basic track cuts
249+
if (std::abs(track.pt()) < TrackCuts.cfgMinPt)
250+
return false;
251+
if (std::abs(track.pt()) > TrackCuts.cfgMaxPt)
252+
return false;
253+
if (track.eta() < TrackCuts.cfgEtaMin)
254+
return false;
255+
if (track.eta() > TrackCuts.cfgEtaMax)
256+
return false;
257+
if (track.itsNCls() < TrackCuts.cfgITScluster)
258+
return false;
259+
if (track.tpcNClsFound() < TrackCuts.cfgTPCcluster)
260+
return false;
261+
if (track.tpcCrossedRowsOverFindableCls() < TrackCuts.cfgRatioTPCRowsOverFindableCls)
262+
return false;
263+
if (track.itsChi2NCl() >= TrackCuts.cfgITSChi2NCl)
264+
return false;
265+
if (track.tpcChi2NCl() >= TrackCuts.cfgTPCChi2NCl)
266+
return false;
267+
if (TrackCuts.cfgHasITS && !track.hasITS())
268+
return false;
269+
if (TrackCuts.cfgHasTPC && !track.hasTPC())
270+
return false;
271+
if (TrackCuts.cfgHasTOF && !track.hasTOF())
272+
return false;
273+
if (TrackCuts.cfgUseITSRefit && !track.passedITSRefit())
274+
return false;
275+
if (TrackCuts.cfgUseTPCRefit && !track.passedTPCRefit())
276+
return false;
277+
if (TrackCuts.cfgPVContributor && !track.isPVContributor())
278+
return false;
279+
if (TrackCuts.cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA())
280+
return false;
281+
if (TrackCuts.cfgGlobalTrack && !track.isGlobalTrack())
282+
return false;
283+
if (TrackCuts.cfgPrimaryTrack && !track.isPrimaryTrack())
284+
return false;
285+
if (TrackCuts.cfgpTdepDCAxyCut) {
286+
// Tuned on the LHC22f anchored MC LHC23d1d on primary pions. 7 Sigmas of the resolution
287+
if (std::abs(track.dcaXY()) > (0.004 + (0.013 / track.pt())))
288+
return false;
289+
} else {
290+
if (std::abs(track.dcaXY()) > TrackCuts.cfgMaxbDCArToPVcut)
291+
return false;
292+
}
293+
if (std::abs(track.dcaZ()) > TrackCuts.cfgMaxbDCAzToPVcut)
294+
return false;
295+
return true;
296+
}
221297

222298
void processDerivedMC(soa::Filtered<aod::CFMcCollisions>::iterator const& mcCollision, soa::Filtered<aod::CFMcParticles> const& mcParticles)
223299
{
@@ -245,7 +321,7 @@ struct JFlucEfficiencyTask {
245321
{
246322
float centrality = cfCollision.multiplicity();
247323

248-
if (centrality < cfgCentMin || centrality > cfgCentMax) {
324+
if (centrality < EventCuts.cfgCentMin || centrality > EventCuts.cfgCentMax) {
249325
return;
250326
}
251327
registry.fill(HIST("hZVertexReco"), cfCollision.posZ(), centrality);
@@ -269,7 +345,7 @@ struct JFlucEfficiencyTask {
269345
aod::McParticles const& mcParticles)
270346
{
271347
registry.fill(HIST("hEventCounterMC"), 0);
272-
if (!(std::abs(mcCollision.posZ()) < cfgCutVertex)) {
348+
if (!(std::abs(mcCollision.posZ()) < EventCuts.cfgEvtZvtx)) {
273349
return;
274350
}
275351
if (collisions.size() < 1) {
@@ -282,12 +358,15 @@ struct JFlucEfficiencyTask {
282358
for (const auto& collision : collisions) { // Anayway only 1 collision per mcCollision will be selected
283359
if (!colCuts.isSelected(collision)) // Default event selection
284360
return;
361+
if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) {
362+
return;
363+
}
285364
colCuts.fillQA(collision);
286365
centrality = collision.centFT0C();
287366
}
288367
registry.fill(HIST("hEventCounterMC"), 1);
289368
registry.fill(HIST("hZVertexMC"), mcCollision.posZ(), centrality);
290-
if (centrality < cfgCentMin || centrality > cfgCentMax) {
369+
if (centrality < EventCuts.cfgCentMin || centrality > EventCuts.cfgCentMax) {
291370
return;
292371
}
293372
for (const auto& particle : mcParticles) {
@@ -296,7 +375,7 @@ struct JFlucEfficiencyTask {
296375
continue;
297376
}
298377
// pT and eta selections
299-
if (particle.pt() < cfgPtMin || particle.pt() > cfgPtMax || particle.eta() < cfgEtaMin || particle.eta() > cfgEtaMax) {
378+
if (particle.pt() < TrackCuts.cfgMinPt || particle.pt() > TrackCuts.cfgMaxPt || particle.eta() < TrackCuts.cfgEtaMin || particle.eta() > TrackCuts.cfgEtaMax) {
300379
continue;
301380
}
302381
registry.fill(HIST("hPtGen"), particle.pt(), centrality);
@@ -316,12 +395,11 @@ struct JFlucEfficiencyTask {
316395
if (!track.has_mcParticle()) {
317396
continue;
318397
}
319-
auto mcPart = track.mcParticle();
320-
if (!mcPart.isPhysicalPrimary() || !isChargedParticle(mcPart.pdgCode())) {
398+
if (!trackCut(track)) {
321399
continue;
322400
}
323-
// pT and eta selections
324-
if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) {
401+
auto mcPart = track.mcParticle();
402+
if (!mcPart.isPhysicalPrimary() || !isChargedParticle(mcPart.pdgCode())) {
325403
continue;
326404
}
327405
registry.fill(HIST("hPtRec"), track.pt(), centrality);
@@ -342,7 +420,7 @@ struct JFlucEfficiencyTask {
342420
BCsWithRun2Info const&)
343421
{
344422
registry.fill(HIST("hEventCounterMC"), 0);
345-
if (!(std::abs(mcCollision.posZ()) < cfgCutVertex)) {
423+
if (!(std::abs(mcCollision.posZ()) < EventCuts.cfgEvtZvtx)) {
346424
return;
347425
}
348426
if (collisions.size() < 1) {
@@ -360,7 +438,7 @@ struct JFlucEfficiencyTask {
360438
}
361439
registry.fill(HIST("hEventCounterMC"), 1);
362440
registry.fill(HIST("hZVertexMC"), mcCollision.posZ(), centrality);
363-
if (centrality < cfgCentMin || centrality > cfgCentMax) {
441+
if (centrality < EventCuts.cfgCentMin || centrality > EventCuts.cfgCentMax) {
364442
return;
365443
}
366444
for (const auto& particle : mcParticles) {
@@ -369,7 +447,7 @@ struct JFlucEfficiencyTask {
369447
continue;
370448
}
371449
// pT and eta selections
372-
if (particle.pt() < cfgPtMin || particle.pt() > cfgPtMax || particle.eta() < cfgEtaMin || particle.eta() > cfgEtaMax) {
450+
if (particle.pt() < TrackCuts.cfgMinPt || particle.pt() > TrackCuts.cfgMaxPt || particle.eta() < TrackCuts.cfgEtaMin || particle.eta() > TrackCuts.cfgEtaMax) {
373451
continue;
374452
}
375453
registry.fill(HIST("hPtGen"), particle.pt(), centrality);
@@ -394,7 +472,7 @@ struct JFlucEfficiencyTask {
394472
continue;
395473
}
396474
// pT and eta selections
397-
if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) {
475+
if (!trackCut(track)) {
398476
continue;
399477
}
400478
registry.fill(HIST("hPtRec"), track.pt(), centrality);
@@ -412,15 +490,18 @@ struct JFlucEfficiencyTask {
412490
{
413491
if (!colCuts.isSelected(collision)) // Default event selection
414492
return;
493+
if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) {
494+
return;
495+
}
415496
colCuts.fillQA(collision);
416497
auto centrality = collision.centFT0C();
417-
if (centrality < cfgCentMin || centrality > cfgCentMax) {
498+
if (centrality < EventCuts.cfgCentMin || centrality > EventCuts.cfgCentMax) {
418499
return;
419500
}
420501
registry.fill(HIST("hZVertexReco"), collision.posZ(), centrality);
421502
for (const auto& track : tracks) {
422503
// pT and eta selections
423-
if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) {
504+
if (!trackCut(track)) {
424505
continue;
425506
}
426507
registry.fill(HIST("hPtRec"), track.pt(), centrality);
@@ -439,13 +520,13 @@ struct JFlucEfficiencyTask {
439520
return;
440521
colCuts.fillQARun2(collision);
441522
auto centrality = collision.centRun2V0M();
442-
if (centrality < cfgCentMin || centrality > cfgCentMax) {
523+
if (centrality < EventCuts.cfgCentMin || centrality > EventCuts.cfgCentMax) {
443524
return;
444525
}
445526
registry.fill(HIST("hZVertexReco"), collision.posZ(), centrality);
446527
for (const auto& track : tracks) {
447528
// pT and eta selections
448-
if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) {
529+
if (!trackCut(track)) {
449530
continue;
450531
}
451532
registry.fill(HIST("hPtRec"), track.pt(), centrality);

0 commit comments

Comments
 (0)