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"
3132using namespace o2 ;
3233using namespace o2 ::framework;
3334using namespace o2 ::framework::expressions;
35+ using namespace o2 ::aod::rctsel;
3436
3537struct 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