Skip to content

Commit d6b2286

Browse files
blacwoviealibuild
andauthored
[PWGCF] change pion selection (#16267)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 5c586f2 commit d6b2286

1 file changed

Lines changed: 120 additions & 8 deletions

File tree

PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx

Lines changed: 120 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,11 @@ struct HadNucleiFemto {
185185
Configurable<float> settingCutNsigmaTOFTPCHad{"settingCutNsigmaTOFTPCHad", 3.0f, "Value of the hsdron TOF TPC combNsigma cut"};
186186
Configurable<float> settingCutNsigTPCPrMin{"settingCutNsigTPCPrMin", 3.0f, "Minimum TPC Pr Nsigma cut for rejection"};
187187
Configurable<float> settingCutNsigTPCPiMin{"settingCutNsigTPCPiMin", 3.0f, "Minimum TPC Pi Nsigma cut for rejection"};
188+
Configurable<float> settingCutNsigTPCKaMin{"settingCutNsigTPCKaMin", 3.0f, "Minimum TPC Ka Nsigma cut for rejection"};
188189
Configurable<float> settingCutNsigTOFPrMin{"settingCutNsigTOFPrMin", 3.0f, "Minimum TOF Pr Nsigma cut for rejection"};
189190
Configurable<float> settingCutNsigTOFPiMin{"settingCutNsigTOFPiMin", 3.0f, "Minimum TOF Pi Nsigma cut for rejection"};
191+
Configurable<float> settingCutNsigTOFKaMin{"settingCutNsigTOFKaMin", 3.0f, "Minimum TOF Ka Nsigma cut for rejection"};
192+
Configurable<bool> settingUsePionReferencePIDCuts{"settingUsePionReferencePIDCuts", false, "If true, use the reference pion track/PID cuts from the pi-p study"};
190193
// Deuteron purity and PID cuts
191194
Configurable<float> settingCutPinMinDe{"settingCutPinMinDe", 0.0f, "Minimum Pin for De"};
192195
Configurable<float> settingCutClSizeItsDe{"settingCutClSizeItsDe", 4.0f, "Minimum ITS cluster size for De"};
@@ -297,18 +300,23 @@ struct HadNucleiFemto {
297300
{"h2NsigmaHadTPC_preselection", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
298301
{"h2NsigmaHadTOF", "NsigmaHad TOF distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{200, -5.0f, 5.0f}, {200, -5.0f, 5.0f}}}},
299302
{"h2NsigmaHadTOF_preselection", "NsigmaHad TOF distribution; #iit{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
303+
{"h2NsigmaHadComb_preselection", "NsigmaHad TPCTOF comb distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{comb}(had)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {100, 0.0f, 5.0f}}}},
300304
{"h2NsigmaHadPrTPC", "NsigmaHad TPC distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(p)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},
301305
{"h2NsigmaHadPiTPC", "NsigmaHad TPC distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(pi)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},
306+
{"h2NsigmaHadKaTPC", "NsigmaHad TPC distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(K)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},
302307
{"h2NsigmaHadPrTOF", "NsigmaHad TOF distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(p)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},
303308
{"h2NsigmaHadPiTOF", "NsigmaHad TOF distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(pi)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},
309+
{"h2NsigmaHadKaTOF", "NsigmaHad TOF distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(K)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},
304310

305311
// Purity
306312
{"purity/h2NsigmaNuTPC_preselection", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
307313
{"purity/h2NsigmaNuTPC_preselecComp", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
308314
{"purity/h2NSigmaNuITS_preselection", "NsigmaNu ITS distribution; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{ITS} Nu", {HistType::kTH2F, {{50, -5.0f, 5.0f}, {120, -3.0f, 3.0f}}}},
309315
{"purity/h2NsigmaNuTOF_preselection", "NsigmaNu TOF distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
316+
{"purity/h2NsigmaNuComb_preselection", "NsigmaNu TPCTOF comb distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{comb}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {100, 0.0f, 5.0f}}}},
310317
{"purity/h2NsigmaHadTPC_preselection", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
311318
{"purity/h2NsigmaHadTOF_preselection", "NsigmaHad TOF distribution; #iit{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
319+
{"purity/h2NsigmaHadComb_preselection", "NsigmaHad TPCTOF comb distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{comb}(had)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {100, 0.0f, 5.0f}}}},
312320

313321
// Hypertriton
314322
{"hHe3TPCnsigma", "NsigmaHe3 TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(He3)", {HistType::kTH2F, {{100, -2.0f, 2.0f}, {200, -5.0f, 5.0f}}}},
@@ -498,7 +506,7 @@ struct HadNucleiFemto {
498506
return false;
499507
}
500508
const int minTPCNClsFound = 90;
501-
const int minTPCNClsCrossedRows = 100;
509+
const int minTPCNClsCrossedRows = 70;
502510
const float crossedRowsToFindableRatio = 0.83f;
503511
if (candidate.itsNCls() < settingCutNCls ||
504512
candidate.tpcNClsFound() < minTPCNClsFound ||
@@ -513,6 +521,59 @@ struct HadNucleiFemto {
513521
return true;
514522
}
515523

524+
bool useReferencePionCuts() const
525+
{
526+
return settingUsePionReferencePIDCuts.value && settingHadPDGCode.value == static_cast<int>(PDG_t::kPiPlus);
527+
}
528+
529+
template <typename Ttrack>
530+
bool selectTrackPionReference(const Ttrack& candidate)
531+
{
532+
constexpr float pionRefPtMin = 0.14f;
533+
constexpr float pionRefPtMax = 2.5f;
534+
constexpr int pionRefITSInnerBarrelMin = 3;
535+
constexpr int pionRefITSNClsMin = 7;
536+
constexpr int pionRefTPCNClsFoundMin = 80;
537+
constexpr int pionRefTPCCrossedRowsMin = 90;
538+
539+
if (std::abs(candidate.eta()) > settingCutEta) {
540+
return false;
541+
}
542+
543+
const float absPt = std::abs(candidate.pt());
544+
if (absPt < pionRefPtMin || absPt > pionRefPtMax) {
545+
return false;
546+
}
547+
548+
if (candidate.itsNClsInnerBarrel() < pionRefITSInnerBarrelMin ||
549+
candidate.itsNCls() < pionRefITSNClsMin ||
550+
candidate.tpcNClsFound() < pionRefTPCNClsFoundMin ||
551+
candidate.tpcNClsCrossedRows() < pionRefTPCCrossedRowsMin) {
552+
return false;
553+
}
554+
555+
if (absPt <= 0.f) {
556+
return false;
557+
}
558+
559+
const float pionDCAxyMax = 0.004f + 0.013f / absPt;
560+
const float pionDCAzMax = 0.004f + 0.013f / absPt;
561+
if (std::abs(candidate.dcaXY()) > pionDCAxyMax || std::abs(candidate.dcaZ()) > pionDCAzMax) {
562+
return false;
563+
}
564+
565+
return true;
566+
}
567+
568+
template <typename Ttrack>
569+
bool selectTrackHadron(const Ttrack& candidate)
570+
{
571+
if (useReferencePionCuts()) {
572+
return selectTrackPionReference(candidate);
573+
}
574+
return selectTrack(candidate);
575+
}
576+
516577
template <typename Ttrack>
517578
bool selectTrackDe(const Ttrack& candidate)
518579
{
@@ -595,20 +656,64 @@ struct HadNucleiFemto {
595656
template <typename Ttrack>
596657
bool selectionPIDPion(const Ttrack& candidate)
597658
{
659+
if (useReferencePionCuts()) {
660+
constexpr float pionRefPCombMin = 0.5f;
661+
constexpr float pionRefTPCNsigmaMax = 3.0f;
662+
constexpr float pionRefCombNsigmaMax = 3.0f;
663+
664+
const float tpcNSigmaPi = candidate.tpcNSigmaPi();
665+
const float absP = std::abs(candidate.p());
666+
mQaRegistry.fill(HIST("h2NsigmaHadTPC_preselection"), candidate.sign() * candidate.tpcInnerParam(), tpcNSigmaPi);
667+
668+
if (absP <= pionRefPCombMin) {
669+
if (std::abs(tpcNSigmaPi) > pionRefTPCNsigmaMax) {
670+
return false;
671+
}
672+
mQaRegistry.fill(HIST("h2NsigmaHadTPC"), candidate.sign() * candidate.pt(), tpcNSigmaPi);
673+
mQaRegistry.fill(HIST("h2dEdxHadcandidates"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal());
674+
return true;
675+
}
676+
677+
if (!candidate.hasTOF()) {
678+
return false;
679+
}
680+
681+
const float tofNSigmaPi = candidate.tofNSigmaPi();
682+
const float combNsigma = std::sqrt(tofNSigmaPi * tofNSigmaPi + tpcNSigmaPi * tpcNSigmaPi);
683+
mQaRegistry.fill(HIST("h2NsigmaHadTOF_preselection"), candidate.sign() * candidate.pt(), tofNSigmaPi);
684+
mQaRegistry.fill(HIST("h2NsigmaHadComb_preselection"), candidate.sign() * candidate.pt(), combNsigma);
685+
if (combNsigma > pionRefCombNsigmaMax) {
686+
return false;
687+
}
688+
mQaRegistry.fill(HIST("h2NsigmaHadTPC"), candidate.sign() * candidate.pt(), tpcNSigmaPi);
689+
mQaRegistry.fill(HIST("h2NsigmaHadTOF"), candidate.sign() * candidate.pt(), tofNSigmaPi);
690+
mQaRegistry.fill(HIST("h2NsigmaHadComb"), candidate.sign() * candidate.pt(), combNsigma);
691+
mQaRegistry.fill(HIST("h2dEdxHadcandidates"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal());
692+
return true;
693+
}
694+
598695
if (std::abs(candidate.dcaXY()) > settingCutHadDCAxyMin || std::abs(candidate.dcaZ()) > settingCutHadDCAzMin)
599696
return false;
600697

601698
auto tpcNSigmaPi = candidate.tpcNSigmaPi();
602699
mQaRegistry.fill(HIST("h2NsigmaHadTPC_preselection"), candidate.sign() * candidate.tpcInnerParam(), tpcNSigmaPi);
603700
if (std::abs(candidate.pt()) < settingCutHadptMin || std::abs(candidate.pt()) > settingCutHadptMax)
604701
return false;
605-
// reject protons
702+
// reject protons and kaons
606703
if (std::abs(candidate.tpcNSigmaPr()) < settingCutNsigTPCPrMin)
607704
return false;
705+
if (std::abs(candidate.tpcNSigmaKa()) < settingCutNsigTPCKaMin)
706+
return false;
608707
mQaRegistry.fill(HIST("h2NsigmaHadPrTPC"), candidate.tpcNSigmaPr());
708+
mQaRegistry.fill(HIST("h2NsigmaHadKaTPC"), candidate.tpcNSigmaKa());
609709
if (candidate.hasTOF() && std::abs(candidate.tofNSigmaPr()) < settingCutNsigTOFPrMin)
610710
return false;
711+
if (candidate.hasTOF() && std::abs(candidate.tofNSigmaKa()) < settingCutNsigTOFKaMin)
712+
return false;
611713
mQaRegistry.fill(HIST("h2NsigmaHadPrTOF"), candidate.tofNSigmaPr());
714+
if (candidate.hasTOF()) {
715+
mQaRegistry.fill(HIST("h2NsigmaHadKaTOF"), candidate.tofNSigmaKa());
716+
}
612717

613718
if (candidate.hasTOF() && std::abs(candidate.pt()) > settingCutPinMinTOFHad) {
614719
auto tofNSigmaPi = candidate.tofNSigmaPi();
@@ -967,7 +1072,7 @@ struct HadNucleiFemto {
9671072
}
9681073
}
9691074

970-
if (!selectTrack(track1) || !selectionPIDHadron(track1)) {
1075+
if (!selectTrackHadron(track1) || !selectionPIDHadron(track1)) {
9711076
continue;
9721077
}
9731078

@@ -993,7 +1098,7 @@ struct HadNucleiFemto {
9931098

9941099
mQaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts);
9951100

996-
if (!selectTrack(hadTrack)) {
1101+
if (!selectTrackHadron(hadTrack)) {
9971102
continue;
9981103
}
9991104
mQaRegistry.fill(HIST("hTrackSel"), Selections::kTrackCuts);
@@ -1022,7 +1127,7 @@ struct HadNucleiFemto {
10221127
continue;
10231128
}
10241129
for (const auto& hadCand : hadCands) {
1025-
if (!selectTrack(hadCand) || !selectionPIDHadron(hadCand)) {
1130+
if (!selectTrackHadron(hadCand) || !selectionPIDHadron(hadCand)) {
10261131
continue;
10271132
}
10281133

@@ -1045,7 +1150,7 @@ struct HadNucleiFemto {
10451150
continue;
10461151
}
10471152
for (const auto& hadCand : hadCands) {
1048-
if (!selectTrack(hadCand) || !selectionPIDHadron(hadCand)) {
1153+
if (!selectTrackHadron(hadCand) || !selectionPIDHadron(hadCand)) {
10491154
continue;
10501155
}
10511156

@@ -1396,7 +1501,8 @@ PROCESS_SWITCH(HadNucleiFemto, processMixedEventHyper, "Process Mixed event", fa
13961501
trackTableThisCollision.bindExternalIndices(&tracks);
13971502

13981503
for (const auto& track : trackTableThisCollision) {
1399-
const bool passTrackHad = selectTrack(track);
1504+
constexpr float pionRefPCombMin = 0.5f;
1505+
const bool passTrackHad = selectTrackHadron(track);
14001506
const bool passTrackDe = selectTrackDe(track);
14011507

14021508
mQaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts);
@@ -1412,16 +1518,20 @@ PROCESS_SWITCH(HadNucleiFemto, processMixedEventHyper, "Process Mixed event", fa
14121518
if (passTrackHad && settingHadPDGCode == PDG_t::kPiPlus) {
14131519
const float tpcNSigmaHad = track.tpcNSigmaPi();
14141520
mQaRegistry.fill(HIST("purity/h2NsigmaHadTPC_preselection"), track.sign() * track.pt(), tpcNSigmaHad);
1415-
if (track.hasTOF() && std::abs(track.pt()) > settingCutPinMinTOFHad) {
1521+
if (useReferencePionCuts() ? (track.hasTOF() && std::abs(track.p()) > pionRefPCombMin) : (track.hasTOF() && std::abs(track.pt()) > settingCutPinMinTOFHad)) {
14161522
const float tofNSigmaHad = track.tofNSigmaPi();
1523+
const float combNsigmaHad = std::sqrt(tofNSigmaHad * tofNSigmaHad + tpcNSigmaHad * tpcNSigmaHad);
14171524
mQaRegistry.fill(HIST("purity/h2NsigmaHadTOF_preselection"), track.sign() * track.pt(), tofNSigmaHad);
1525+
mQaRegistry.fill(HIST("purity/h2NsigmaHadComb_preselection"), track.sign() * track.pt(), combNsigmaHad);
14181526
}
14191527
} else if (passTrackHad && settingHadPDGCode == PDG_t::kKPlus) {
14201528
const float tpcNSigmaHad = track.tpcNSigmaKa();
14211529
mQaRegistry.fill(HIST("purity/h2NsigmaHadTPC_preselection"), track.sign() * track.pt(), tpcNSigmaHad);
14221530
if (track.hasTOF() && track.tpcInnerParam() >= settingCutPinMinTOFHad) {
14231531
const float tofNSigmaHad = track.tofNSigmaKa();
1532+
const float combNsigmaHad = std::sqrt(tofNSigmaHad * tofNSigmaHad + tpcNSigmaHad * tpcNSigmaHad);
14241533
mQaRegistry.fill(HIST("purity/h2NsigmaHadTOF_preselection"), track.sign() * track.pt(), tofNSigmaHad);
1534+
mQaRegistry.fill(HIST("purity/h2NsigmaHadComb_preselection"), track.sign() * track.pt(), combNsigmaHad);
14251535
}
14261536
}
14271537

@@ -1431,7 +1541,9 @@ PROCESS_SWITCH(HadNucleiFemto, processMixedEventHyper, "Process Mixed event", fa
14311541
mQaRegistry.fill(HIST("purity/h2NsigmaNuTPC_preselecComp"), track.sign() * track.pt(), track.tpcNSigmaDe());
14321542
if (track.hasTOF() && track.tpcInnerParam() > settingCutPinMinTOFITSDe) {
14331543
const float tofNSigmaDe = track.tofNSigmaDe();
1544+
const float combNsigmaDe = std::sqrt(tofNSigmaDe * tofNSigmaDe + tpcNSigmaDe * tpcNSigmaDe);
14341545
mQaRegistry.fill(HIST("purity/h2NsigmaNuTOF_preselection"), track.sign() * track.pt(), tofNSigmaDe);
1546+
mQaRegistry.fill(HIST("purity/h2NsigmaNuComb_preselection"), track.sign() * track.pt(), combNsigmaDe);
14351547
} else if (track.tpcInnerParam() <= settingCutPinMinTOFITSDe) {
14361548
const float itsNSigmaDe = itsResponse.nSigmaITS<o2::track::PID::Deuteron>(track.itsClusterSizes(), track.p(), track.eta());
14371549
mQaRegistry.fill(HIST("purity/h2NSigmaNuITS_preselection"), track.sign() * track.pt(), itsNSigmaDe);

0 commit comments

Comments
 (0)