Skip to content

Commit 8941102

Browse files
[PWGHF] Add track sel. QA histogram and fix bug in applying track and event sels. (#11044)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 4db27ad commit 8941102

File tree

1 file changed

+102
-51
lines changed

1 file changed

+102
-51
lines changed

PWGHF/Tasks/taskPidStudies.cxx

Lines changed: 102 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
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;
4243
using namespace o2::hf_evsel;
4344
using namespace o2::hf_centrality;
4445

45-
namespace o2::aod
46-
{
47-
namespace pid_studies
48-
{
4946
enum 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
5466
DECLARE_SOA_COLUMN(MassK0, massK0, float); //! Candidate mass
5567
DECLARE_SOA_COLUMN(MassLambda, massLambda, float); //! Candidate mass
@@ -91,12 +103,6 @@ DECLARE_SOA_COLUMN(OccupancyIts, occupancyIts, float); //! Occupancy from IT
91103
DECLARE_SOA_COLUMN(CentralityFT0C, centralityFT0C, float); //! Centrality from FT0C
92104
DECLARE_SOA_COLUMN(CentralityFT0M, centralityFT0M, float); //! Centrality from FT0M
93105
DECLARE_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

102108
DECLARE_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

Comments
 (0)