Skip to content

Commit ed25c14

Browse files
authored
[PWGCF] Update meanPtFlucId.cxx (#11738)
1 parent e501845 commit ed25c14

File tree

1 file changed

+68
-56
lines changed

1 file changed

+68
-56
lines changed

PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx

Lines changed: 68 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)