Skip to content

Commit 43405e4

Browse files
authored
add CPR switch
1 parent f671f06 commit 43405e4

1 file changed

Lines changed: 104 additions & 7 deletions

File tree

PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx

Lines changed: 104 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ namespace
8383
{
8484
constexpr double betheBlochDefault[1][6]{{-136.71, 0.441, 0.2269, 1.347, 0.8035, 0.09}};
8585
static const std::vector<std::string> betheBlochParNames{"p0", "p1", "p2", "p3", "p4", "resolution"};
86+
static constexpr std::array<float, 9> tmpRadiiTPC{{85.f, 105.f, 125.f, 145.f, 165.f, 185.f, 205.f, 225.f, 245.f}};
8687

8788
enum Selections {
8889
kNoCuts = 0,
@@ -189,6 +190,8 @@ struct HadNucleiFemto {
189190
Configurable<float> settingCutNsigTOFPrMin{"settingCutNsigTOFPrMin", 3.0f, "Minimum TOF Pr Nsigma cut for rejection"};
190191
Configurable<float> settingCutNsigTOFPiMin{"settingCutNsigTOFPiMin", 3.0f, "Minimum TOF Pi Nsigma cut for rejection"};
191192
Configurable<float> settingCutNsigTOFKaMin{"settingCutNsigTOFKaMin", 3.0f, "Minimum TOF Ka Nsigma cut for rejection"};
193+
Configurable<bool> settingEnablePionProtonRejection{"settingEnablePionProtonRejection", true, "If true, apply proton rejection in the pion PID"};
194+
Configurable<bool> settingEnablePionKaonRejection{"settingEnablePionKaonRejection", true, "If true, apply kaon rejection in the pion PID"};
192195
Configurable<bool> settingUsePionReferencePIDCuts{"settingUsePionReferencePIDCuts", false, "If true, use the reference pion track/PID cuts from the pi-p study"};
193196
// Deuteron purity and PID cuts
194197
Configurable<float> settingCutPinMinDe{"settingCutPinMinDe", 0.0f, "Minimum Pin for De"};
@@ -199,6 +202,12 @@ struct HadNucleiFemto {
199202
Configurable<float> settingCutNsigmaTPCDe{"settingCutNsigmaTPCDe", 2.5f, "Value of the TPC Nsigma cut on De"};
200203
Configurable<float> settingCutNsigmaITSDe{"settingCutNsigmaITSDe", 2.5f, "Value of the ITD Nsigma cut on De"};
201204
Configurable<float> settingCutNsigmaTOFTPCDe{"settingCutNsigmaTOFTPCDe", 2.5f, "Value of the De TOF TPC combNsigma cut"};
205+
Configurable<bool> settingUseProtonMassForKstarMt{"settingUseProtonMassForKstarMt", false, "If true, use proton mass instead of deuteron mass for kstar and mT"};
206+
Configurable<bool> settingEnableClosePairRejection{"settingEnableClosePairRejection", false, "Enable close pair rejection for deuteron-hadron track pairs"};
207+
Configurable<float> settingClosePairDeltaPhiMax{"settingClosePairDeltaPhiMax", 0.01f, "Maximum delta phi star for close pair rejection"};
208+
Configurable<float> settingClosePairDeltaEtaMax{"settingClosePairDeltaEtaMax", 0.01f, "Maximum delta eta for close pair rejection"};
209+
Configurable<int> settingClosePairRadiusMode{"settingClosePairRadiusMode", 1, "Close pair rejection mode: 0 = PV, 1 = average phi star, 2 = specific TPC radius"};
210+
Configurable<float> settingClosePairSpecificRadius{"settingClosePairSpecificRadius", 85.f, "TPC radius in cm used when close pair rejection mode is 2"};
202211
// Hypertriton-specific cuts
203212
Configurable<float> settingCutTPCChi2He{"settingCutTPCChi2He", 0.0f, "Minimum tpcChi2He for Hyper He3"};
204213
Configurable<float> settingCutAverClsSizeHe{"settingCutAverClsSizeHe", 0.0f, "Minimum averClusSizeHe for Hyper He3"};
@@ -278,6 +287,8 @@ struct HadNucleiFemto {
278287
{"hHadPin", "P distribution; #it{p} (GeV/#it{c})", {HistType::kTH1F, {{120, -4.0f, 4.0f}}}},
279288
{"hHadEta", "eta distribution; #eta(had)", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}},
280289
{"hHadPhi", "phi distribution; phi(had)", {HistType::kTH1F, {{600, -4.0f, 4.0f}}}},
290+
{"h2CPRBefore", "Close pair rejection before cut; #Delta#eta; #Delta#phi^{*}", {HistType::kTH2F, {{160, -2.0f, 2.0f}, {160, -3.2f, 3.2f}}}},
291+
{"h2CPRAfter", "Close pair rejection after cut; #Delta#eta; #Delta#phi^{*}", {HistType::kTH2F, {{160, -2.0f, 2.0f}, {160, -3.2f, 3.2f}}}},
281292

282293
// dE/dx
283294
{"h2dEdxNucandidates", "dEdx distribution; #it{p} (GeV/#it{c}); dE/dx (a.u.)", {HistType::kTH2F, {{200, -5.0f, 5.0f}, {100, 0.0f, 2000.0f}}}},
@@ -602,6 +613,85 @@ struct HadNucleiFemto {
602613
return true;
603614
}
604615

616+
template <typename Ttrack>
617+
float phiAtSpecificRadiiTPC(const Ttrack& track, float radius) const
618+
{
619+
const float absPt = std::abs(track.pt());
620+
if (absPt <= 0.f) {
621+
return 999.f;
622+
}
623+
const float arg = 0.3f * static_cast<float>(track.sign()) * 0.1f * mDbz * radius * 0.01f / (2.f * absPt);
624+
if (std::fabs(arg) >= 1.f) {
625+
return 999.f;
626+
}
627+
return track.phi() - std::asin(arg);
628+
}
629+
630+
float wrapDeltaPhi(float dphi) const
631+
{
632+
return std::atan2(std::sin(dphi), std::cos(dphi));
633+
}
634+
635+
template <typename Ttrack1, typename Ttrack2>
636+
float averagePhiStar(const Ttrack1& track1, const Ttrack2& track2) const
637+
{
638+
constexpr float invalidPhiStar = 999.f;
639+
float dPhiAvg = 0.f;
640+
int meaningfulEntries = 0;
641+
for (const auto& radius : tmpRadiiTPC) {
642+
const float phi1 = phiAtSpecificRadiiTPC(track1, radius);
643+
const float phi2 = phiAtSpecificRadiiTPC(track2, radius);
644+
if (phi1 == invalidPhiStar || phi2 == invalidPhiStar) {
645+
continue;
646+
}
647+
dPhiAvg += wrapDeltaPhi(phi1 - phi2);
648+
meaningfulEntries++;
649+
}
650+
if (meaningfulEntries == 0) {
651+
return invalidPhiStar;
652+
}
653+
return dPhiAvg / static_cast<float>(meaningfulEntries);
654+
}
655+
656+
template <typename Ttrack1, typename Ttrack2>
657+
bool isClosePair(const Ttrack1& track1, const Ttrack2& track2)
658+
{
659+
constexpr int closePairRadiusModePv = 0;
660+
constexpr int closePairRadiusModeSpecificTpc = 2;
661+
constexpr float invalidPhiStar = 999.f;
662+
if (!settingEnableClosePairRejection.value) {
663+
return false;
664+
}
665+
if (track1.sign() != track2.sign()) {
666+
return false;
667+
}
668+
669+
const float deta = track1.eta() - track2.eta();
670+
const float dphiAtPV = wrapDeltaPhi(track1.phi() - track2.phi());
671+
const float dphiAtSpecificRadius = wrapDeltaPhi(phiAtSpecificRadiiTPC(track1, settingClosePairSpecificRadius.value) - phiAtSpecificRadiiTPC(track2, settingClosePairSpecificRadius.value));
672+
const float dphiAvg = averagePhiStar(track1, track2);
673+
674+
float dphiToCut = dphiAvg;
675+
if (settingClosePairRadiusMode.value == closePairRadiusModePv) {
676+
dphiToCut = dphiAtPV;
677+
} else if (settingClosePairRadiusMode.value == closePairRadiusModeSpecificTpc) {
678+
dphiToCut = dphiAtSpecificRadius;
679+
}
680+
681+
if (dphiToCut == invalidPhiStar) {
682+
return false;
683+
}
684+
685+
mQaRegistry.fill(HIST("h2CPRBefore"), deta, dphiToCut);
686+
const bool isRejected = std::pow(dphiToCut, 2.f) / std::pow(settingClosePairDeltaPhiMax.value, 2.f) +
687+
std::pow(deta, 2.f) / std::pow(settingClosePairDeltaEtaMax.value, 2.f) <
688+
1.f;
689+
if (!isRejected) {
690+
mQaRegistry.fill(HIST("h2CPRAfter"), deta, dphiToCut);
691+
}
692+
return isRejected;
693+
}
694+
605695
template <typename Ttrack>
606696
bool selectionPIDKaon(const Ttrack& candidate)
607697
{
@@ -700,15 +790,15 @@ struct HadNucleiFemto {
700790
if (std::abs(candidate.pt()) < settingCutHadptMin || std::abs(candidate.pt()) > settingCutHadptMax)
701791
return false;
702792
// reject protons and kaons
703-
if (std::abs(candidate.tpcNSigmaPr()) < settingCutNsigTPCPrMin)
793+
if (settingEnablePionProtonRejection && std::abs(candidate.tpcNSigmaPr()) < settingCutNsigTPCPrMin)
704794
return false;
705-
if (std::abs(candidate.tpcNSigmaKa()) < settingCutNsigTPCKaMin)
795+
if (settingEnablePionKaonRejection && std::abs(candidate.tpcNSigmaKa()) < settingCutNsigTPCKaMin)
706796
return false;
707797
mQaRegistry.fill(HIST("h2NsigmaHadPrTPC"), candidate.tpcNSigmaPr());
708798
mQaRegistry.fill(HIST("h2NsigmaHadKaTPC"), candidate.tpcNSigmaKa());
709-
if (candidate.hasTOF() && std::abs(candidate.tofNSigmaPr()) < settingCutNsigTOFPrMin)
799+
if (settingEnablePionProtonRejection && candidate.hasTOF() && std::abs(candidate.tofNSigmaPr()) < settingCutNsigTOFPrMin)
710800
return false;
711-
if (candidate.hasTOF() && std::abs(candidate.tofNSigmaKa()) < settingCutNsigTOFKaMin)
801+
if (settingEnablePionKaonRejection && candidate.hasTOF() && std::abs(candidate.tofNSigmaKa()) < settingCutNsigTOFKaMin)
712802
return false;
713803
mQaRegistry.fill(HIST("h2NsigmaHadPrTOF"), candidate.tofNSigmaPr());
714804
if (candidate.hasTOF()) {
@@ -794,7 +884,7 @@ struct HadNucleiFemto {
794884
const float deDCAzMax = 0.004f + 0.013f / absPt;
795885
if (std::abs(candidate.dcaXY()) > deDCAxyMax || std::abs(candidate.dcaZ()) > deDCAzMax)
796886
return false;
797-
887+
798888
if (candidate.hasTOF() && candidate.tpcInnerParam() > settingCutPinMinTOFITSDe) {
799889
auto tofNSigmaDe = candidate.tofNSigmaDe();
800890
auto combNsigma = std::sqrt(tofNSigmaDe * tofNSigmaDe + tpcNSigmaDe * tpcNSigmaDe);
@@ -967,8 +1057,9 @@ struct HadNucleiFemto {
9671057
hadNucand.massTOFHad = trackHad.tpcInnerParam() * std::sqrt(1.f / (beta * beta) - 1.f);
9681058
}
9691059

970-
hadNucand.kstar = o2::analysis::femtoWorld::FemtoWorldMath::getkstar(trackHad, MassHad, trackDe, o2::constants::physics::MassDeuteron);
971-
hadNucand.mT = o2::analysis::femtoWorld::FemtoWorldMath::getmT(trackHad, MassHad, trackDe, o2::constants::physics::MassDeuteron);
1060+
const float massLightNucleusForKstarMt = settingUseProtonMassForKstarMt ? static_cast<float>(o2::constants::physics::MassProton) : static_cast<float>(o2::constants::physics::MassDeuteron);
1061+
hadNucand.kstar = o2::analysis::femtoWorld::FemtoWorldMath::getkstar(trackHad, MassHad, trackDe, massLightNucleusForKstarMt);
1062+
hadNucand.mT = o2::analysis::femtoWorld::FemtoWorldMath::getmT(trackHad, MassHad, trackDe, massLightNucleusForKstarMt);
9721063

9731064
return true;
9741065
}
@@ -1075,6 +1166,9 @@ struct HadNucleiFemto {
10751166
if (!selectTrackHadron(track1) || !selectionPIDHadron(track1)) {
10761167
continue;
10771168
}
1169+
if (isClosePair(track0, track1)) {
1170+
continue;
1171+
}
10781172

10791173
SVCand trackPair;
10801174
trackPair.tr0Idx = track0.globalIndex();
@@ -1130,6 +1224,9 @@ struct HadNucleiFemto {
11301224
if (!selectTrackHadron(hadCand) || !selectionPIDHadron(hadCand)) {
11311225
continue;
11321226
}
1227+
if (isClosePair(DeCand, hadCand)) {
1228+
continue;
1229+
}
11331230

11341231
SVCand trackPair;
11351232
trackPair.tr0Idx = DeCand.globalIndex();

0 commit comments

Comments
 (0)