@@ -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