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