@@ -54,22 +54,19 @@ struct MeanPtFlucId {
5454 Configurable<float > cfgCutDcaZ{" cfgCutDcaZ" , 0.15 , " DCAz cut" };
5555 Configurable<float > cfgCutPosZ{" cfgCutPosZ" , 7.0 , " cut for vertex Z" };
5656 Configurable<bool > cfgPosZ{" cfgPosZ" , true , " Position Z" };
57- Configurable<float > cfgCutNSig2{" cfgCutNSig2" , 2.0 , " nSigma cut (2)" };
58- Configurable<float > cfgCutNSig3{" cfgCutNSig3" , 3.0 , " nSigma cut (3)" };
59- Configurable<float > cfgCutNSig5{" cfgCutNSig5" , 5.0 , " nSigma cut (3)" };
57+ Configurable<float > cfgCutNSig2{" cfgCutNSig2" , 2.0 , " nSigma cut: 2" };
58+ Configurable<float > cfgCutNSig3{" cfgCutNSig3" , 3.0 , " nSigma cut: 3" };
59+ Configurable<float > cfgCutNSig5{" cfgCutNSig5" , 5.0 , " nSigma cut: 5" };
60+ Configurable<float > cfgSelCutNSigPi{" cfgSelCutNSigPi" , 2.0 , " nSigma cut for pion selection" };
61+ Configurable<float > cfgSelCutNSigKa{" cfgSelCutNSigKa" , 3.0 , " nSigma cut for kaon selection" };
62+ Configurable<float > cfgSelCutNSigPr{" cfgSelCutNSigPr" , 2.0 , " nSigma cut for proton selection" };
63+ Configurable<float > cfgRejCutNSigPi{" cfgRejCutNSigPi" , 3.0 , " nSigma cut for rejection of other particles while selecting pion" };
6064 Configurable<float > cfgCutPiPtMin{" cfgCutPiPtMin" , 0.2 , " Minimum pion p_{T} cut" };
6165 Configurable<float > cfgCutKaPtMin{" cfgCutKaPtMin" , 0.3 , " Minimum kaon p_{T} cut" };
6266 Configurable<float > cfgCutPrPtMin{" cfgCutPrPtMin" , 0.5 , " Minimum proton p_{T} cut" };
6367 Configurable<float > cfgCutPiThrsldP{" cfgCutPiThrsldP" , 0.6 , " Threshold p cut pion" };
6468 Configurable<float > cfgCutKaThrsldP{" cfgCutKaThrsldP" , 0.6 , " Threshold p cut kaon" };
6569 Configurable<float > cfgCutPrThrsldP{" cfgCutPrThrsldP" , 1.0 , " Threshold p cut proton " };
66- Configurable<float > cfgCutPiP1{" cfgCutPiP1" , 0.5 , " pion p cut-1" };
67- Configurable<float > cfgCutPiP2{" cfgCutPiP2" , 0.6 , " pion p cut-2" };
68- Configurable<float > cfgCutKaP1{" cfgCutKaP1" , 0.4 , " kaon p cut-1" };
69- Configurable<float > cfgCutKaP2{" cfgCutKaP2" , 0.6 , " kaon p cut-2" };
70- Configurable<float > cfgCutKaP3{" cfgCutKaP3" , 1.2 , " kaon p cut-3" };
71- Configurable<float > cfgCutPrP1{" cfgCutPrP1" , 0.9 , " proton p cut-1" };
72- Configurable<float > cfgCutPrP2{" cfgCutPrP2" , 1.0 , " proton p cut-2" };
7370 Configurable<bool > cfgSel8{" cfgSel8" , true , " Sel8 trigger" };
7471 Configurable<float > cfgMinWeight{" cfgMinWeight" , 1e-6 , " Minimum weight for efficiency correction" };
7572 Configurable<bool > cfgNoSameBunchPileup{" cfgNoSameBunchPileup" , true , " kNoSameBunchPileup" };
@@ -455,50 +452,63 @@ struct MeanPtFlucId {
455452 return false ;
456453 }
457454
458- template <typename T>
459- PIDType identifyParticle (const T & track)
455+ template <PIDType s1, PIDType s2, PIDType s3, typename T>
456+ bool identifyParticle (T const & track, float momThreshold )
460457 {
461- const float pt = track.pt ();
462- const float p = track.p ();
463-
464- // Check pion
465- const bool tpcPi = std::fabs (track.tpcNSigmaPi ()) < cfgCutNSig3 && std::fabs (track.tpcNSigmaPi ()) < std::fabs (track.tpcNSigmaKa ()) && std::fabs (track.tpcNSigmaPi ()) < std::fabs (track.tpcNSigmaPr ());
466- const bool tofPi = track.hasTOF () && std::fabs (track.tofNSigmaPi ()) < cfgCutNSig3 && std::fabs (track.tofNSigmaPi ()) < std::fabs (track.tofNSigmaKa ()) && std::fabs (track.tofNSigmaPi ()) < std::fabs (track.tofNSigmaPr ());
467- const bool isPi = (pt >= cfgCutPiPtMin &&
468- ((p <= cfgCutPiThrsldP && ((tpcPi && !track.hasTOF ()) || (tpcPi && tofPi))) ||
469- (p > cfgCutPiThrsldP && tpcPi && tofPi)));
470-
471- // Check kaon
472- const bool tpcKa = std::fabs (track.tpcNSigmaKa ()) < cfgCutNSig3 && std::fabs (track.tpcNSigmaKa ()) < std::fabs (track.tpcNSigmaPi ()) && std::fabs (track.tpcNSigmaKa ()) < std::fabs (track.tpcNSigmaPr ());
473- const bool tofKa = track.hasTOF () && std::fabs (track.tofNSigmaKa ()) < cfgCutNSig3 && std::fabs (track.tofNSigmaKa ()) < std::fabs (track.tofNSigmaPi ()) && std::fabs (track.tofNSigmaKa ()) < std::fabs (track.tofNSigmaPr ());
474- const bool tofKaTight = track.hasTOF () && std::fabs (track.tofNSigmaKa ()) < cfgCutNSig2;
475- const bool isKa = (pt >= cfgCutKaPtMin &&
476- ((p <= cfgCutKaThrsldP && ((tpcKa && !track.hasTOF ()) || (tpcKa && tofKa))) ||
477- (p > cfgCutKaThrsldP && tpcKa &&
478- ((tofKa && p <= cfgCutKaP3) || (tofKaTight && p > cfgCutKaP3)))));
479-
480- // Check proton
481- const bool tpcPr = std::fabs (track.tpcNSigmaPr ()) < cfgCutNSig3 && std::fabs (track.tpcNSigmaPr ()) < std::fabs (track.tpcNSigmaPi ()) && std::fabs (track.tpcNSigmaPr ()) < std::fabs (track.tpcNSigmaKa ());
482- const bool tofPr = track.hasTOF () && std::fabs (track.tofNSigmaPr ()) < cfgCutNSig3 && std::fabs (track.tofNSigmaPr ()) < std::fabs (track.tofNSigmaPi ()) && std::fabs (track.tofNSigmaPr ()) < std::fabs (track.tofNSigmaKa ());
483- const bool isPr = (pt >= cfgCutPrPtMin &&
484- ((p <= cfgCutPrThrsldP && ((tpcPr && !track.hasTOF ()) || (tpcPr && tofPr))) ||
485- (p > cfgCutPrThrsldP && tpcPr && tofPr)));
486-
487- if (!isPi && !isKa && !isPr) { // Reject tracks that are not identified as any particle
488- return PIDType::kNone ;
458+
459+ const int sp = static_cast <int >(s1);
460+ const int sq = static_cast <int >(s2);
461+ const int sr = static_cast <int >(s3);
462+ std::vector<float > vTpcNSigma = {-999 ., track.tpcNSigmaPi (), track.tpcNSigmaKa (), track.tpcNSigmaPr ()};
463+ std::vector<float > vTofNSigma = {-999 ., track.tofNSigmaPi (), track.tofNSigmaKa (), track.tofNSigmaPr ()};
464+ bool isTofPidFlag = false , isTpcPidFlag = false ;
465+
466+ float nSigmaSelCut = 0 .;
467+ float nSigmaTofRejCut = 0 .;
468+ float nSigmaTpcRejCut = 0 .;
469+ if constexpr (s1 == PIDType::kProtons ) {
470+ nSigmaSelCut = cfgSelCutNSigPr;
471+ nSigmaTofRejCut = std::fabs (vTofNSigma[sp]);
472+ nSigmaTpcRejCut = std::fabs (vTpcNSigma[sp]);
473+ } else if constexpr (s1 == PIDType::kKaons ) {
474+ nSigmaSelCut = cfgSelCutNSigKa;
475+ nSigmaTofRejCut = std::fabs (vTofNSigma[sp]);
476+ nSigmaTpcRejCut = std::fabs (vTpcNSigma[sp]);
477+ } else if constexpr (s1 == PIDType::kPions ) {
478+ nSigmaSelCut = cfgSelCutNSigPi;
479+ nSigmaTofRejCut = cfgRejCutNSigPi;
480+ nSigmaTpcRejCut = cfgRejCutNSigPi;
481+ }
482+
483+ if (track.hasTOF ()) {
484+ if (std::fabs (vTofNSigma[sp]) < nSigmaSelCut &&
485+ std::fabs (vTofNSigma[sq]) > nSigmaTofRejCut &&
486+ std::fabs (vTofNSigma[sr]) > nSigmaTofRejCut) {
487+ isTofPidFlag = true ;
488+ }
489+ if (std::fabs (vTpcNSigma[sp]) < cfgCutNSig2) {
490+ isTpcPidFlag = true ;
491+ }
492+ } else { // select from TPC Only
493+ if (track.p () >= momThreshold) {
494+ return false ;
495+ }
496+ if (std::fabs (vTpcNSigma[sp]) < nSigmaSelCut &&
497+ std::fabs (vTpcNSigma[sq]) > nSigmaTpcRejCut &&
498+ std::fabs (vTpcNSigma[sr]) > nSigmaTpcRejCut) {
499+ isTofPidFlag = true ;
500+ isTpcPidFlag = true ;
501+ }
489502 }
490503
491- if (isPi) {
492- return PIDType::kPions ;
493- } else if (isKa) {
494- return PIDType::kKaons ;
495- } else if (isPr) {
496- return PIDType::kProtons ;
504+ if (isTofPidFlag && isTpcPidFlag) {
505+ return true ; // Track is identified as one of the particles
497506 }
498507
499- return PIDType:: kNone ;
508+ return false ; // Track is not identified as any of the particles
500509 }
501510
511+ // Get corrected weight for the track:
502512 template <typename T1>
503513 float getCorrectedWeight (T1 hWeightPt, T1 hPurePt, float pt, bool cfgWeightPt, bool cfgPurity)
504514 {
@@ -647,12 +657,12 @@ struct MeanPtFlucId {
647657 hist.fill (HIST (Dire[Mode]) + HIST (" h2_TOFNsigma" ), track.p (), nSigmaTOF);
648658 hist.fill (HIST (Dire[Mode]) + HIST (" h2_TpcTofNsigma" ), nSigmaTPC, nSigmaTOF);
649659 hist.fill (HIST (Dire[Mode]) + HIST (" h2_TPCSignal" ), track.p (), track.tpcSignal ());
650- hist.fill (HIST (Dire[Mode]) + HIST (" innerParam/h2_TPCSignal" ), track.p (), track.tpcSignal ());
660+ hist.fill (HIST (Dire[Mode]) + HIST (" innerParam/h2_TPCSignal" ), track.tpcInnerParam (), track.tpcSignal ());
651661 hist.fill (HIST (Dire[Mode]) + HIST (" h2_TOFSignal" ), track.p (), track.beta ());
652662 hist.fill (HIST (Dire[Mode]) + HIST (" h2_pvsm2" ), track.mass () * track.mass (), track.p ());
653663
654664 hist.fill (HIST (" QA/after/h2_TPCSignal" ), track.p (), track.tpcSignal ());
655- hist.fill (HIST (" QA/after/innerParam/h2_TPCSignal" ), track.p (), track.tpcSignal ());
665+ hist.fill (HIST (" QA/after/innerParam/h2_TPCSignal" ), track.tpcInnerParam (), track.tpcSignal ());
656666 hist.fill (HIST (" QA/after/h2_TOFSignal" ), track.p (), track.beta ());
657667 hist.fill (HIST (" QA/after/h2_pvsm2" ), track.mass () * track.mass (), track.p ());
658668 }
@@ -797,24 +807,26 @@ struct MeanPtFlucId {
797807 if (cfgRejTrk && rejectTracks (track)) {
798808 continue ;
799809 }
800- auto selID = identifyParticle (track);
801- if (selID == PIDType::kPions && pt >= cfgCutPiPtMin) {
810+ auto selIDPion = identifyParticle<PIDType::kPions , PIDType::kKaons , PIDType::kProtons >(track, cfgCutPiThrsldP);
811+ auto selIDKaon = identifyParticle<PIDType::kKaons , PIDType::kPions , PIDType::kProtons >(track, cfgCutKaThrsldP);
812+ auto selIDProton = identifyParticle<PIDType::kProtons , PIDType::kPions , PIDType::kKaons >(track, cfgCutPrThrsldP);
813+ if (selIDPion && pt >= cfgCutPiPtMin) {
802814 hist.fill (HIST (" QA/Pion/h_Pt" ), track.pt ());
803815 fillIdParticleQAHistos<QA_Pion>(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, centFT0M, hWeightPtPi, hPurePtPi, cfgWeightPtId, cfgPurityId, nPiW, nPiW2, q1Pi, q2Pi);
804816 }
805- if (selID == PIDType:: kKaons && pt >= cfgCutKaPtMin) {
817+ if (selIDKaon && pt >= cfgCutKaPtMin) {
806818 hist.fill (HIST (" QA/Kaon/h_Pt" ), track.pt ());
807819 fillIdParticleQAHistos<QA_Kaon>(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, centFT0M, hWeightPtKa, hPurePtKa, cfgWeightPtId, cfgPurityId, nKaW, nKaW2, q1Ka, q2Ka);
808820 }
809- if (selID == PIDType:: kProtons && pt >= cfgCutPrPtMin) {
821+ if (selIDProton && pt >= cfgCutPrPtMin) {
810822 hist.fill (HIST (" QA/Proton/h_Pt" ), track.pt ());
811823 fillIdParticleQAHistos<QA_Proton>(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, centFT0M, hWeightPtPr, hPurePtPr, cfgWeightPtId, cfgPurityId, nPrW, nPrW2, q1Pr, q2Pr);
812824 }
813825
814826 if constexpr (RecoFlag) {
815827 auto mc = track.template mcParticle_as <aod::McParticles>();
816828 int pid = mc.pdgCode ();
817- if (selID == PIDType:: kPions && pt >= cfgCutPiPtMin) {
829+ if (selIDPion && pt >= cfgCutPiPtMin) {
818830 if (std::abs (pid) == kPiPlus ) {
819831 hist.fill (HIST (" QA/Pion/h_PtTruth" ), pt);
820832 fillPtMCHist<QA_Pion>(false , pt, eta, rapPi, phi, centFT0M, pid, kPiPlus , kPiMinus );
@@ -825,7 +837,7 @@ struct MeanPtFlucId {
825837 }
826838 }
827839 }
828- if (selID == PIDType:: kKaons && pt >= cfgCutKaPtMin) {
840+ if (selIDKaon && pt >= cfgCutKaPtMin) {
829841 if (std::abs (pid) == kKPlus ) {
830842 hist.fill (HIST (" QA/Kaon/h_PtTruth" ), pt);
831843 fillPtMCHist<QA_Kaon>(false , pt, eta, rapKa, phi, centFT0M, pid, kKPlus , kKMinus );
@@ -836,7 +848,7 @@ struct MeanPtFlucId {
836848 }
837849 }
838850 }
839- if (selID == PIDType:: kProtons && pt >= cfgCutPrPtMin) {
851+ if (selIDProton && pt >= cfgCutPrPtMin) {
840852 if (std::abs (pid) == kProton ) {
841853 hist.fill (HIST (" QA/Proton/h_PtTruth" ), pt);
842854 fillPtMCHist<QA_Proton>(false , pt, eta, rapPr, phi, centFT0M, pid, kProton , kProtonBar );
0 commit comments