1818// / \author Luca Aglietta <luca.aglietta@unito.it>, Università and INFN Torino
1919
2020#include < string>
21+ #include < memory>
2122
2223#include " TPDGCode.h"
2324
@@ -42,14 +43,25 @@ using namespace o2::framework::expressions;
4243using namespace o2 ::hf_evsel;
4344using namespace o2 ::hf_centrality;
4445
45- namespace o2 ::aod
46- {
47- namespace pid_studies
48- {
4946enum Particle { NotMatched = 0 ,
5047 K0s,
5148 Lambda,
5249 Omega };
50+
51+ enum TrackCuts { All = 0 ,
52+ HasIts,
53+ HasTpc,
54+ TpcNClsCrossedRows,
55+ Eta,
56+ Pt,
57+ TpcChi2NCls,
58+ ItsChi2NCls,
59+ NCuts };
60+
61+ namespace o2 ::aod
62+ {
63+ namespace pid_studies
64+ {
5365// V0s
5466DECLARE_SOA_COLUMN (MassK0, massK0, float ); // ! Candidate mass
5567DECLARE_SOA_COLUMN (MassLambda, massLambda, float ); // ! Candidate mass
@@ -91,12 +103,6 @@ DECLARE_SOA_COLUMN(OccupancyIts, occupancyIts, float); //! Occupancy from IT
91103DECLARE_SOA_COLUMN (CentralityFT0C, centralityFT0C, float ); // ! Centrality from FT0C
92104DECLARE_SOA_COLUMN (CentralityFT0M, centralityFT0M, float ); // ! Centrality from FT0M
93105DECLARE_SOA_COLUMN (CandFlag, candFlag, int ); // ! Flag for MC matching
94-
95- const int minTpcNClsCrossedRows = 70 ; // Minimum number of crossed rows in TPC
96- const float maxEta = 0.8 ; // Maximum pseudorapidity
97- const float minPt = 0.1 ; // Minimum transverse momentum
98- const float maxTpcChi2NCl = 4 ; // Maximum TPC chi2 per number of TPC clusters
99- const float maxItsChi2NCl = 36 ; // Maximum ITS chi2 per number of ITS clusters
100106} // namespace pid_studies
101107
102108DECLARE_SOA_TABLE (PidV0s, " AOD" , " PIDV0S" , // ! Table with PID information
@@ -155,6 +161,11 @@ struct HfTaskPidStudies {
155161
156162 Configurable<bool > applyEvSels{" applyEvSels" , true , " Apply event selections" };
157163 Configurable<bool > applyTrackSels{" applyTrackSels" , true , " Apply track selections" };
164+ Configurable<float > tpcNClsCrossedRowsTrackMin{" tpcNClsCrossedRowsTrackMin" , 70 , " Minimum number of crossed rows in TPC" };
165+ Configurable<float > etaTrackMax{" etaTrackMax" , 0.8 , " Maximum pseudorapidity" };
166+ Configurable<float > ptTrackMin{" ptTrackMin" , 0.1 , " Minimum transverse momentum" };
167+ Configurable<float > tpcChi2NClTrackMax{" tpcChi2NClTrackMax" , 4 , " Maximum TPC chi2 per number of TPC clusters" };
168+ Configurable<float > itsChi2NClTrackMax{" itsChi2NClTrackMax" , 36 , " Maximum ITS chi2 per number of ITS clusters" };
158169 Configurable<float > massK0Min{" massK0Min" , 0.4 , " Minimum mass for K0" };
159170 Configurable<float > massK0Max{" massK0Max" , 0.6 , " Maximum mass for K0" };
160171 Configurable<float > massLambdaMin{" massLambdaMin" , 1.0 , " Minimum mass for lambda" };
@@ -195,6 +206,18 @@ struct HfTaskPidStudies {
195206 ccdb->setCaching (true );
196207 ccdb->setLocalObjectValidityChecking ();
197208 hfEvSel.addHistograms (registry);
209+
210+ std::shared_ptr<TH1> hTrackSel = registry.add <TH1>(" hTrackSel" , " Track selection;;Counts" , {HistType::kTH1F , {{TrackCuts::NCuts, 0 , TrackCuts::NCuts}}});
211+
212+ // Set Labels for hTrackSel
213+ hTrackSel->GetXaxis ()->SetBinLabel (TrackCuts::All + 1 , " All" );
214+ hTrackSel->GetXaxis ()->SetBinLabel (TrackCuts::HasIts + 1 , " HasITS" );
215+ hTrackSel->GetXaxis ()->SetBinLabel (TrackCuts::HasTpc + 1 , " HasTPC" );
216+ hTrackSel->GetXaxis ()->SetBinLabel (TrackCuts::TpcNClsCrossedRows + 1 , " TPC NCls/CrossedRows" );
217+ hTrackSel->GetXaxis ()->SetBinLabel (TrackCuts::Eta + 1 , " #eta" );
218+ hTrackSel->GetXaxis ()->SetBinLabel (TrackCuts::Pt + 1 , " #it{p}_{T}" );
219+ hTrackSel->GetXaxis ()->SetBinLabel (TrackCuts::TpcChi2NCls + 1 , " TPC #chi^{2}/NCls" );
220+ hTrackSel->GetXaxis ()->SetBinLabel (TrackCuts::ItsChi2NCls + 1 , " ITS #chi^{2}/NCls" );
198221 }
199222
200223 template <bool isV0, typename Coll, typename Cand>
@@ -266,40 +289,40 @@ struct HfTaskPidStudies {
266289 {
267290 if constexpr (std::is_same<T1, V0sMcRec::iterator>::value) {
268291 if (!cand.has_v0MCCore ()) {
269- return aod::pid_studies:: Particle::NotMatched;
292+ return Particle::NotMatched;
270293 }
271294 auto v0MC = cand.template v0MCCore_as <aod::V0MCCores>();
272295 if (v0MC.pdgCode () == kK0Short && v0MC.pdgCodeNegative () == -kPiPlus && v0MC.pdgCodePositive () == kPiPlus ) {
273- return aod::pid_studies:: Particle::K0s;
296+ return Particle::K0s;
274297 }
275298 if (v0MC.pdgCode () == kLambda0 && v0MC.pdgCodeNegative () == -kPiPlus && v0MC.pdgCodePositive () == kProton ) {
276- return aod::pid_studies:: Particle::Lambda;
299+ return Particle::Lambda;
277300 }
278301 if (v0MC.pdgCode () == -kLambda0 && v0MC.pdgCodeNegative () == -kProton && v0MC.pdgCodePositive () == kPiPlus ) {
279- return -aod::pid_studies:: Particle::Lambda;
302+ return -Particle::Lambda;
280303 }
281304 }
282305 if constexpr (std::is_same<T1, CascsMcRec::iterator>::value) {
283306 if (!cand.has_cascMCCore ()) {
284- return aod::pid_studies:: Particle::NotMatched;
307+ return Particle::NotMatched;
285308 }
286309 auto cascMC = cand.template cascMCCore_as <aod::CascMCCores>();
287310 if (cascMC.pdgCode () == kOmegaMinus &&
288311 cascMC.pdgCodeBachelor () == -kKPlus &&
289312 cascMC.pdgCodeV0 () == kLambda0 &&
290313 cascMC.pdgCodePositive () == kProton &&
291314 cascMC.pdgCodeNegative () == -kPiPlus ) {
292- return aod::pid_studies:: Particle::Omega;
315+ return Particle::Omega;
293316 }
294317 if (cascMC.pdgCode () == -kOmegaMinus &&
295318 cascMC.pdgCodeBachelor () == kKPlus &&
296319 cascMC.pdgCodeV0 () == -kLambda0 &&
297320 cascMC.pdgCodePositive () == kPiPlus &&
298321 cascMC.pdgCodeNegative () == -kProton ) {
299- return -aod::pid_studies:: Particle::Omega;
322+ return -Particle::Omega;
300323 }
301324 }
302- return aod::pid_studies:: Particle::NotMatched;
325+ return Particle::NotMatched;
303326 }
304327
305328 template <typename Coll>
@@ -317,38 +340,66 @@ struct HfTaskPidStudies {
317340 {
318341 const auto & posTrack = candidate.template posTrack_as <PidTracks>();
319342 const auto & negTrack = candidate.template negTrack_as <PidTracks>();
320- if (posTrack.tpcNClsCrossedRows () < o2::aod::pid_studies::minTpcNClsCrossedRows || negTrack.tpcNClsCrossedRows () < o2::aod::pid_studies::minTpcNClsCrossedRows) {
321- return false ;
322- }
323- if (std::abs (posTrack.eta ()) > o2::aod::pid_studies::maxEta || std::abs (negTrack.eta ()) > o2::aod::pid_studies::maxEta) {
324- return false ;
325- }
326- if (posTrack.pt () < o2::aod::pid_studies::minPt || negTrack.pt () < o2::aod::pid_studies::minPt) {
327- return false ;
328- }
329- if (posTrack.tpcChi2NCl () > o2::aod::pid_studies::maxTpcChi2NCl || negTrack.tpcChi2NCl () > o2::aod::pid_studies::maxTpcChi2NCl) {
330- return false ;
331- }
332- if (posTrack.itsChi2NCl () > o2::aod::pid_studies::maxItsChi2NCl || negTrack.itsChi2NCl () > o2::aod::pid_studies::maxItsChi2NCl) {
333- return false ;
334- }
335- if constexpr (!isV0) {
343+ registry.fill (HIST (" hTrackSel" ), TrackCuts::All);
344+ if constexpr (isV0) {
345+ if (!posTrack.hasITS () || !negTrack.hasITS ()) {
346+ return false ;
347+ }
348+ registry.fill (HIST (" hTrackSel" ), TrackCuts::HasIts);
349+ if (!posTrack.hasTPC () || !negTrack.hasTPC ()) {
350+ return false ;
351+ }
352+ registry.fill (HIST (" hTrackSel" ), TrackCuts::HasTpc);
353+ if (posTrack.tpcNClsCrossedRows () < tpcNClsCrossedRowsTrackMin || negTrack.tpcNClsCrossedRows () < tpcNClsCrossedRowsTrackMin) {
354+ return false ;
355+ }
356+ registry.fill (HIST (" hTrackSel" ), TrackCuts::TpcNClsCrossedRows);
357+ if (std::abs (posTrack.eta ()) > etaTrackMax || std::abs (negTrack.eta ()) > etaTrackMax) {
358+ return false ;
359+ }
360+ registry.fill (HIST (" hTrackSel" ), TrackCuts::Eta);
361+ if (posTrack.pt () < ptTrackMin || negTrack.pt () < ptTrackMin) {
362+ return false ;
363+ }
364+ registry.fill (HIST (" hTrackSel" ), TrackCuts::Pt);
365+ if (posTrack.tpcChi2NCl () > tpcChi2NClTrackMax || negTrack.tpcChi2NCl () > tpcChi2NClTrackMax) {
366+ return false ;
367+ }
368+ registry.fill (HIST (" hTrackSel" ), TrackCuts::TpcChi2NCls);
369+ if (posTrack.itsChi2NCl () > itsChi2NClTrackMax || negTrack.itsChi2NCl () > itsChi2NClTrackMax) {
370+ return false ;
371+ }
372+ registry.fill (HIST (" hTrackSel" ), TrackCuts::ItsChi2NCls);
373+ } else {
336374 const auto & bachTrack = candidate.template bachelor_as <PidTracks>();
337- if (bachTrack.tpcNClsCrossedRows () < o2::aod::pid_studies::minTpcNClsCrossedRows) {
375+ if (!posTrack.hasITS () || !negTrack.hasITS () || !bachTrack.hasITS ()) {
376+ return false ;
377+ }
378+ registry.fill (HIST (" hTrackSel" ), TrackCuts::HasIts);
379+ if (!posTrack.hasTPC () || !negTrack.hasTPC () || !bachTrack.hasTPC ()) {
380+ return false ;
381+ }
382+ registry.fill (HIST (" hTrackSel" ), TrackCuts::HasTpc);
383+ if (posTrack.tpcNClsCrossedRows () < tpcNClsCrossedRowsTrackMin || negTrack.tpcNClsCrossedRows () < tpcNClsCrossedRowsTrackMin || bachTrack.tpcNClsCrossedRows () < tpcNClsCrossedRowsTrackMin) {
338384 return false ;
339385 }
340- if (std::abs (bachTrack.eta ()) > o2::aod::pid_studies::maxEta) {
386+ registry.fill (HIST (" hTrackSel" ), TrackCuts::TpcNClsCrossedRows);
387+ if (std::abs (posTrack.eta ()) > etaTrackMax || std::abs (negTrack.eta ()) > etaTrackMax || std::abs (bachTrack.eta ()) > etaTrackMax) {
341388 return false ;
342389 }
343- if (bachTrack.pt () < o2::aod::pid_studies::minPt) {
390+ registry.fill (HIST (" hTrackSel" ), TrackCuts::Eta);
391+ if (posTrack.pt () < ptTrackMin || negTrack.pt () < ptTrackMin || bachTrack.pt () < ptTrackMin) {
344392 return false ;
345393 }
346- if (bachTrack.tpcChi2NCl () > o2::aod::pid_studies::maxTpcChi2NCl) {
394+ registry.fill (HIST (" hTrackSel" ), TrackCuts::Pt);
395+ if (posTrack.tpcChi2NCl () > tpcChi2NClTrackMax || negTrack.tpcChi2NCl () > tpcChi2NClTrackMax || bachTrack.tpcChi2NCl () > tpcChi2NClTrackMax) {
347396 return false ;
348397 }
349- if (bachTrack.itsChi2NCl () > o2::aod::pid_studies::maxItsChi2NCl) {
398+ registry.fill (HIST (" hTrackSel" ), TrackCuts::TpcChi2NCls);
399+ if (posTrack.itsChi2NCl () > itsChi2NClTrackMax || negTrack.itsChi2NCl () > itsChi2NClTrackMax || bachTrack.itsChi2NCl () > itsChi2NClTrackMax) {
350400 return false ;
351401 }
402+ registry.fill (HIST (" hTrackSel" ), TrackCuts::ItsChi2NCls);
352403 }
353404 return true ;
354405 }
@@ -439,14 +490,14 @@ struct HfTaskPidStudies {
439490 {
440491 for (const auto & v0 : V0s) {
441492 if (applyEvSels && !isCollSelected (v0.collision_as <CollisionsMc>())) {
442- return ;
493+ continue ;
443494 }
444495 if (applyTrackSels && !isTrackSelected<true >(v0)) {
445- return ;
496+ continue ;
446497 }
447498 if (isSelectedV0AsK0s (v0) || isSelectedV0AsLambda (v0)) {
448499 int matched = isMatched (v0);
449- if (matched != aod::pid_studies:: Particle::NotMatched) {
500+ if (matched != Particle::NotMatched) {
450501 fillTree<true , CollisionsMc>(v0, matched);
451502 }
452503 }
@@ -461,13 +512,13 @@ struct HfTaskPidStudies {
461512 {
462513 for (const auto & v0 : V0s) {
463514 if (applyEvSels && !isCollSelected (v0.collision_as <CollSels>())) {
464- return ;
515+ continue ;
465516 }
466517 if (applyTrackSels && !isTrackSelected<true >(v0)) {
467- return ;
518+ continue ;
468519 }
469520 if (isSelectedV0AsK0s (v0) || isSelectedV0AsLambda (v0)) {
470- fillTree<true , CollSels>(v0, aod::pid_studies:: Particle::NotMatched);
521+ fillTree<true , CollSels>(v0, Particle::NotMatched);
471522 }
472523 }
473524 }
@@ -482,14 +533,14 @@ struct HfTaskPidStudies {
482533 {
483534 for (const auto & casc : cascades) {
484535 if (applyEvSels && !isCollSelected (casc.collision_as <CollisionsMc>())) {
485- return ;
536+ continue ;
486537 }
487538 if (applyTrackSels && !isTrackSelected<false >(casc)) {
488- return ;
539+ continue ;
489540 }
490541 if (isSelectedCascAsOmega<CollisionsMc>(casc)) {
491542 int matched = isMatched (casc);
492- if (matched != aod::pid_studies:: Particle::NotMatched) {
543+ if (matched != Particle::NotMatched) {
493544 fillTree<false , CollisionsMc>(casc, matched);
494545 }
495546 }
@@ -504,13 +555,13 @@ struct HfTaskPidStudies {
504555 {
505556 for (const auto & casc : cascades) {
506557 if (applyEvSels && !isCollSelected (casc.collision_as <CollSels>())) {
507- return ;
558+ continue ;
508559 }
509560 if (applyTrackSels && !isTrackSelected<false >(casc)) {
510- return ;
561+ continue ;
511562 }
512563 if (isSelectedCascAsOmega<CollSels>(casc)) {
513- fillTree<false , CollSels>(casc, aod::pid_studies:: Particle::NotMatched);
564+ fillTree<false , CollSels>(casc, Particle::NotMatched);
514565 }
515566 }
516567 }
0 commit comments