Skip to content

Commit 64c3f8f

Browse files
blacwoviealibuild
andauthored
[PWGCF] Add triton purity QA in HadNucleiFemto.cxx (#18375)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent e910b0c commit 64c3f8f

1 file changed

Lines changed: 35 additions & 11 deletions

File tree

‎PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx‎

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//
1212

1313
/// \file HadNucleiFemtoDcaPurity.cxx
14-
/// \brief Nuclei-hadron femtoscopy task
14+
/// \brief Nuclei-hadron femtoscopy task with DCA-fraction and purity inputs
1515
/// \author CMY
1616
/// \date 2025-04-10
1717

@@ -428,6 +428,7 @@ struct HadNucleiFemto {
428428
// cppcheck-suppress unusedStructMember
429429
std::string prefix{"tritonPid"};
430430
// Triton track-quality, purity and PID cuts
431+
Configurable<int> settingITSNClsMinTr{"settingITSNClsMinTr", 5, "Minimum number of ITS clusters for triton candidates"};
431432
Configurable<float> settingPIDMomentumSplitTr{"settingPIDMomentumSplitTr", 2.f, "Momentum separating low- and high-momentum triton TPC PID"};
432433
Configurable<float> settingCutTPCNsigmaLowPTr{"settingCutTPCNsigmaLowPTr", 3.f, "Maximum absolute TPC n-sigma for tritons below the momentum split"};
433434
Configurable<float> settingCutITSNsigmaLowPTr{"settingCutITSNsigmaLowPTr", 3.f, "Maximum absolute ITS n-sigma for tritons below the momentum split"};
@@ -827,6 +828,7 @@ struct HadNucleiFemto {
827828
{"h2NsigmaHadKaTOF", "NsigmaHad TOF distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(K)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},
828829

829830
// Purity
831+
{"purity/h2MassTOFTr_preselection", "Triton TOF mass before mass cut; signed #it{p}_{T} (GeV/#it{c}); m_{TOF} (GeV/#it{c}^{2})", {HistType::kTH2F, {{280, -7.0f, 7.0f}, {280, 0.0f, 7.0f}}}},
830832
{"purity/h2NsigmaNuTPC_preselection", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{280, -7.0f, 7.0f}, {400, -10.0f, 10.0f}}}},
831833
{"purity/h2NsigmaNuTPC_preselecComp", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{280, -7.0f, 7.0f}, {400, -10.0f, 10.0f}}}},
832834
{"purity/h2NSigmaNuITS_preselection", "NsigmaNu ITS distribution; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{ITS} Nu", {HistType::kTH2F, {{280, -7.0f, 7.0f}, {120, -5.0f, 5.0f}}}},
@@ -1254,7 +1256,6 @@ struct HadNucleiFemto {
12541256
constexpr int minTPCCrossedRows = 70;
12551257
constexpr float maxTPCChi2NCl = 5.f;
12561258
constexpr float maxTPCFractionSharedCls = 0.3f;
1257-
constexpr int minITSNCls = 5;
12581259
constexpr float maxITSChi2NCl = 10.f;
12591260

12601261
return !(std::abs(candidate.eta()) >= maxAbsEta ||
@@ -1263,7 +1264,7 @@ struct HadNucleiFemto {
12631264
candidate.tpcNClsCrossedRows() < minTPCCrossedRows ||
12641265
candidate.tpcChi2NCl() >= maxTPCChi2NCl ||
12651266
candidate.tpcFractionSharedCls() >= maxTPCFractionSharedCls ||
1266-
candidate.itsNCls() < minITSNCls ||
1267+
candidate.itsNCls() < tritonPid.settingITSNClsMinTr ||
12671268
candidate.itsChi2NCl() >= maxITSChi2NCl);
12681269
}
12691270

@@ -3189,7 +3190,7 @@ struct HadNucleiFemto {
31893190
std::unordered_map<int, std::deque<HadHyperEvent>>& mixingPools,
31903191
int& mixingRunNumber)
31913192
{
3192-
const CentralityBinningType configuredBinningPolicy{{axisVertex, axisCentrality}};
3193+
const CentralityBinningType configuredBinningPolicy{{axisVertex, axisCentrality}, true};
31933194
for (const auto& collision : collisions) {
31943195
if (!selectCollision<isMC>(collision, bcs)) {
31953196
continue;
@@ -3344,8 +3345,8 @@ struct HadNucleiFemto {
33443345
void processMixedEvent(const CollisionsFullWithPVMult& collisions, const TrackCandidates& tracks, const aod::BCsWithTimestamps&)
33453346
{
33463347
LOG(debug) << "Processing mixed event";
3347-
const CentralityBinningType centralityBinningPolicy{{axisVertex, axisCentrality}};
3348-
const MultiplicityBinningType multiplicityBinningPolicy{{axisVertex, axisMultiplicity}};
3348+
const CentralityBinningType centralityBinningPolicy{{axisVertex, axisCentrality}, true};
3349+
const MultiplicityBinningType multiplicityBinningPolicy{{axisVertex, axisMultiplicity}, true};
33493350

33503351
for (const auto& collision : collisions) {
33513352
mQaRegistry.fill(HIST("hMixedEventSelections"), 0);
@@ -3478,8 +3479,8 @@ struct HadNucleiFemto {
34783479

34793480
void processMixedEventDiagnostic(const CollisionsFullWithPVMult& collisions, const TrackCandidates& tracks, const aod::BCsWithTimestamps&)
34803481
{
3481-
const CentralityBinningType centralityBinningPolicy{{axisVertex, axisCentrality}};
3482-
const MultiplicityBinningType multiplicityBinningPolicy{{axisVertex, axisMultiplicity}};
3482+
const CentralityBinningType centralityBinningPolicy{{axisVertex, axisCentrality}, true};
3483+
const MultiplicityBinningType multiplicityBinningPolicy{{axisVertex, axisMultiplicity}, true};
34833484
++mDiagnosticCall;
34843485
MEDiagnosticRow call;
34853486
call.run = mDiagnosticRun;
@@ -4079,10 +4080,33 @@ struct HadNucleiFemto {
40794080
}
40804081
} else if (passTrackNu && useTritonNucleus()) {
40814082
const float tpcNSigmaTr = track.tpcNSigmaTr();
4083+
const float absPTr = std::abs(track.p());
4084+
const float signedPtTr = track.sign() * track.pt();
4085+
const bool passTPCRejectTr = !(std::abs(track.tpcNSigmaDe()) < tritonPid.settingTPCRejectNsig ||
4086+
std::abs(track.tpcNSigmaPr()) < tritonPid.settingTPCRejectNsig ||
4087+
std::abs(track.tpcNSigmaPi()) < tritonPid.settingTPCRejectNsig);
40824088
o2::aod::ITSResponse itsResponse;
4083-
const float itsNSigmaTr = itsResponse.nSigmaITS<o2::track::PID::Triton>(track.itsClusterSizes(), std::abs(track.p()), track.eta());
4084-
mQaRegistry.fill(HIST("purity/h2NsigmaNuTPC_preselection"), track.sign() * track.pt(), tpcNSigmaTr);
4085-
mQaRegistry.fill(HIST("purity/h2NSigmaNuITS_preselection"), track.sign() * track.pt(), itsNSigmaTr);
4089+
const float itsNSigmaTr = itsResponse.nSigmaITS<o2::track::PID::Triton>(track.itsClusterSizes(), absPTr, track.eta());
4090+
if (passTPCRejectTr) {
4091+
mQaRegistry.fill(HIST("purity/h2NSigmaNuITS_preselection"), signedPtTr, itsNSigmaTr);
4092+
}
4093+
const bool passITSTr = absPTr >= tritonPid.settingPIDMomentumSplitTr ||
4094+
std::abs(itsNSigmaTr) < tritonPid.settingCutITSNsigmaLowPTr;
4095+
const bool passTPCTr = absPTr < tritonPid.settingPIDMomentumSplitTr
4096+
? std::abs(tpcNSigmaTr) < tritonPid.settingCutTPCNsigmaLowPTr
4097+
: tpcNSigmaTr > tritonPid.settingCutTPCNsigmaHighPMinTr &&
4098+
tpcNSigmaTr < tritonPid.settingCutTPCNsigmaHighPMaxTr;
4099+
// Keep triton TPC PID open, while matching the species-rejection and ITS cuts.
4100+
if (passTPCRejectTr && passITSTr) {
4101+
mQaRegistry.fill(HIST("purity/h2NsigmaNuTPC_preselection"), signedPtTr, tpcNSigmaTr);
4102+
// Apply the triton TPC PID cut but keep TOF mass uncut to retain its sidebands.
4103+
if (passTPCTr && absPTr > tritonPid.settingTOFMassMomentumMinTr && track.hasTOF()) {
4104+
const float massTOFTr = computeTOFMass(track);
4105+
if (std::isfinite(massTOFTr)) {
4106+
mQaRegistry.fill(HIST("purity/h2MassTOFTr_preselection"), signedPtTr, massTOFTr);
4107+
}
4108+
}
4109+
}
40864110
}
40874111

40884112
const bool isHadronSelected = passTrackHad && selectionPIDHadron(track);

0 commit comments

Comments
 (0)