diff --git a/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx b/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx index a8ef42e5973..88540514c26 100644 --- a/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx +++ b/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx @@ -185,8 +185,11 @@ struct HadNucleiFemto { Configurable settingCutNsigmaTOFTPCHad{"settingCutNsigmaTOFTPCHad", 3.0f, "Value of the hsdron TOF TPC combNsigma cut"}; Configurable settingCutNsigTPCPrMin{"settingCutNsigTPCPrMin", 3.0f, "Minimum TPC Pr Nsigma cut for rejection"}; Configurable settingCutNsigTPCPiMin{"settingCutNsigTPCPiMin", 3.0f, "Minimum TPC Pi Nsigma cut for rejection"}; + Configurable settingCutNsigTPCKaMin{"settingCutNsigTPCKaMin", 3.0f, "Minimum TPC Ka Nsigma cut for rejection"}; Configurable settingCutNsigTOFPrMin{"settingCutNsigTOFPrMin", 3.0f, "Minimum TOF Pr Nsigma cut for rejection"}; Configurable settingCutNsigTOFPiMin{"settingCutNsigTOFPiMin", 3.0f, "Minimum TOF Pi Nsigma cut for rejection"}; + Configurable settingCutNsigTOFKaMin{"settingCutNsigTOFKaMin", 3.0f, "Minimum TOF Ka Nsigma cut for rejection"}; + Configurable settingUsePionReferencePIDCuts{"settingUsePionReferencePIDCuts", false, "If true, use the reference pion track/PID cuts from the pi-p study"}; // Deuteron purity and PID cuts Configurable settingCutPinMinDe{"settingCutPinMinDe", 0.0f, "Minimum Pin for De"}; Configurable settingCutClSizeItsDe{"settingCutClSizeItsDe", 4.0f, "Minimum ITS cluster size for De"}; @@ -297,18 +300,23 @@ struct HadNucleiFemto { {"h2NsigmaHadTPC_preselection", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, {"h2NsigmaHadTOF", "NsigmaHad TOF distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{200, -5.0f, 5.0f}, {200, -5.0f, 5.0f}}}}, {"h2NsigmaHadTOF_preselection", "NsigmaHad TOF distribution; #iit{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, + {"h2NsigmaHadComb_preselection", "NsigmaHad TPCTOF comb distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{comb}(had)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {100, 0.0f, 5.0f}}}}, {"h2NsigmaHadPrTPC", "NsigmaHad TPC distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(p)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}}, {"h2NsigmaHadPiTPC", "NsigmaHad TPC distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(pi)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}}, + {"h2NsigmaHadKaTPC", "NsigmaHad TPC distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(K)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}}, {"h2NsigmaHadPrTOF", "NsigmaHad TOF distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(p)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}}, {"h2NsigmaHadPiTOF", "NsigmaHad TOF distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(pi)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}}, + {"h2NsigmaHadKaTOF", "NsigmaHad TOF distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(K)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}}, // Purity {"purity/h2NsigmaNuTPC_preselection", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, {"purity/h2NsigmaNuTPC_preselecComp", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, {"purity/h2NSigmaNuITS_preselection", "NsigmaNu ITS distribution; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{ITS} Nu", {HistType::kTH2F, {{50, -5.0f, 5.0f}, {120, -3.0f, 3.0f}}}}, {"purity/h2NsigmaNuTOF_preselection", "NsigmaNu TOF distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, + {"purity/h2NsigmaNuComb_preselection", "NsigmaNu TPCTOF comb distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{comb}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {100, 0.0f, 5.0f}}}}, {"purity/h2NsigmaHadTPC_preselection", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, {"purity/h2NsigmaHadTOF_preselection", "NsigmaHad TOF distribution; #iit{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, + {"purity/h2NsigmaHadComb_preselection", "NsigmaHad TPCTOF comb distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{comb}(had)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {100, 0.0f, 5.0f}}}}, // Hypertriton {"hHe3TPCnsigma", "NsigmaHe3 TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(He3)", {HistType::kTH2F, {{100, -2.0f, 2.0f}, {200, -5.0f, 5.0f}}}}, @@ -498,7 +506,7 @@ struct HadNucleiFemto { return false; } const int minTPCNClsFound = 90; - const int minTPCNClsCrossedRows = 100; + const int minTPCNClsCrossedRows = 70; const float crossedRowsToFindableRatio = 0.83f; if (candidate.itsNCls() < settingCutNCls || candidate.tpcNClsFound() < minTPCNClsFound || @@ -513,6 +521,59 @@ struct HadNucleiFemto { return true; } + bool useReferencePionCuts() const + { + return settingUsePionReferencePIDCuts.value && settingHadPDGCode.value == static_cast(PDG_t::kPiPlus); + } + + template + bool selectTrackPionReference(const Ttrack& candidate) + { + constexpr float pionRefPtMin = 0.14f; + constexpr float pionRefPtMax = 2.5f; + constexpr int pionRefITSInnerBarrelMin = 3; + constexpr int pionRefITSNClsMin = 7; + constexpr int pionRefTPCNClsFoundMin = 80; + constexpr int pionRefTPCCrossedRowsMin = 90; + + if (std::abs(candidate.eta()) > settingCutEta) { + return false; + } + + const float absPt = std::abs(candidate.pt()); + if (absPt < pionRefPtMin || absPt > pionRefPtMax) { + return false; + } + + if (candidate.itsNClsInnerBarrel() < pionRefITSInnerBarrelMin || + candidate.itsNCls() < pionRefITSNClsMin || + candidate.tpcNClsFound() < pionRefTPCNClsFoundMin || + candidate.tpcNClsCrossedRows() < pionRefTPCCrossedRowsMin) { + return false; + } + + if (absPt <= 0.f) { + return false; + } + + const float pionDCAxyMax = 0.004f + 0.013f / absPt; + const float pionDCAzMax = 0.004f + 0.013f / absPt; + if (std::abs(candidate.dcaXY()) > pionDCAxyMax || std::abs(candidate.dcaZ()) > pionDCAzMax) { + return false; + } + + return true; + } + + template + bool selectTrackHadron(const Ttrack& candidate) + { + if (useReferencePionCuts()) { + return selectTrackPionReference(candidate); + } + return selectTrack(candidate); + } + template bool selectTrackDe(const Ttrack& candidate) { @@ -595,6 +656,42 @@ struct HadNucleiFemto { template bool selectionPIDPion(const Ttrack& candidate) { + if (useReferencePionCuts()) { + constexpr float pionRefPCombMin = 0.5f; + constexpr float pionRefTPCNsigmaMax = 3.0f; + constexpr float pionRefCombNsigmaMax = 3.0f; + + const float tpcNSigmaPi = candidate.tpcNSigmaPi(); + const float absP = std::abs(candidate.p()); + mQaRegistry.fill(HIST("h2NsigmaHadTPC_preselection"), candidate.sign() * candidate.tpcInnerParam(), tpcNSigmaPi); + + if (absP <= pionRefPCombMin) { + if (std::abs(tpcNSigmaPi) > pionRefTPCNsigmaMax) { + return false; + } + mQaRegistry.fill(HIST("h2NsigmaHadTPC"), candidate.sign() * candidate.pt(), tpcNSigmaPi); + mQaRegistry.fill(HIST("h2dEdxHadcandidates"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); + return true; + } + + if (!candidate.hasTOF()) { + return false; + } + + const float tofNSigmaPi = candidate.tofNSigmaPi(); + const float combNsigma = std::sqrt(tofNSigmaPi * tofNSigmaPi + tpcNSigmaPi * tpcNSigmaPi); + mQaRegistry.fill(HIST("h2NsigmaHadTOF_preselection"), candidate.sign() * candidate.pt(), tofNSigmaPi); + mQaRegistry.fill(HIST("h2NsigmaHadComb_preselection"), candidate.sign() * candidate.pt(), combNsigma); + if (combNsigma > pionRefCombNsigmaMax) { + return false; + } + mQaRegistry.fill(HIST("h2NsigmaHadTPC"), candidate.sign() * candidate.pt(), tpcNSigmaPi); + mQaRegistry.fill(HIST("h2NsigmaHadTOF"), candidate.sign() * candidate.pt(), tofNSigmaPi); + mQaRegistry.fill(HIST("h2NsigmaHadComb"), candidate.sign() * candidate.pt(), combNsigma); + mQaRegistry.fill(HIST("h2dEdxHadcandidates"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); + return true; + } + if (std::abs(candidate.dcaXY()) > settingCutHadDCAxyMin || std::abs(candidate.dcaZ()) > settingCutHadDCAzMin) return false; @@ -602,13 +699,21 @@ struct HadNucleiFemto { mQaRegistry.fill(HIST("h2NsigmaHadTPC_preselection"), candidate.sign() * candidate.tpcInnerParam(), tpcNSigmaPi); if (std::abs(candidate.pt()) < settingCutHadptMin || std::abs(candidate.pt()) > settingCutHadptMax) return false; - // reject protons + // reject protons and kaons if (std::abs(candidate.tpcNSigmaPr()) < settingCutNsigTPCPrMin) return false; + if (std::abs(candidate.tpcNSigmaKa()) < settingCutNsigTPCKaMin) + return false; mQaRegistry.fill(HIST("h2NsigmaHadPrTPC"), candidate.tpcNSigmaPr()); + mQaRegistry.fill(HIST("h2NsigmaHadKaTPC"), candidate.tpcNSigmaKa()); if (candidate.hasTOF() && std::abs(candidate.tofNSigmaPr()) < settingCutNsigTOFPrMin) return false; + if (candidate.hasTOF() && std::abs(candidate.tofNSigmaKa()) < settingCutNsigTOFKaMin) + return false; mQaRegistry.fill(HIST("h2NsigmaHadPrTOF"), candidate.tofNSigmaPr()); + if (candidate.hasTOF()) { + mQaRegistry.fill(HIST("h2NsigmaHadKaTOF"), candidate.tofNSigmaKa()); + } if (candidate.hasTOF() && std::abs(candidate.pt()) > settingCutPinMinTOFHad) { auto tofNSigmaPi = candidate.tofNSigmaPi(); @@ -967,7 +1072,7 @@ struct HadNucleiFemto { } } - if (!selectTrack(track1) || !selectionPIDHadron(track1)) { + if (!selectTrackHadron(track1) || !selectionPIDHadron(track1)) { continue; } @@ -993,7 +1098,7 @@ struct HadNucleiFemto { mQaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts); - if (!selectTrack(hadTrack)) { + if (!selectTrackHadron(hadTrack)) { continue; } mQaRegistry.fill(HIST("hTrackSel"), Selections::kTrackCuts); @@ -1022,7 +1127,7 @@ struct HadNucleiFemto { continue; } for (const auto& hadCand : hadCands) { - if (!selectTrack(hadCand) || !selectionPIDHadron(hadCand)) { + if (!selectTrackHadron(hadCand) || !selectionPIDHadron(hadCand)) { continue; } @@ -1045,7 +1150,7 @@ struct HadNucleiFemto { continue; } for (const auto& hadCand : hadCands) { - if (!selectTrack(hadCand) || !selectionPIDHadron(hadCand)) { + if (!selectTrackHadron(hadCand) || !selectionPIDHadron(hadCand)) { continue; } @@ -1396,7 +1501,8 @@ PROCESS_SWITCH(HadNucleiFemto, processMixedEventHyper, "Process Mixed event", fa trackTableThisCollision.bindExternalIndices(&tracks); for (const auto& track : trackTableThisCollision) { - const bool passTrackHad = selectTrack(track); + constexpr float pionRefPCombMin = 0.5f; + const bool passTrackHad = selectTrackHadron(track); const bool passTrackDe = selectTrackDe(track); mQaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts); @@ -1412,16 +1518,20 @@ PROCESS_SWITCH(HadNucleiFemto, processMixedEventHyper, "Process Mixed event", fa if (passTrackHad && settingHadPDGCode == PDG_t::kPiPlus) { const float tpcNSigmaHad = track.tpcNSigmaPi(); mQaRegistry.fill(HIST("purity/h2NsigmaHadTPC_preselection"), track.sign() * track.pt(), tpcNSigmaHad); - if (track.hasTOF() && std::abs(track.pt()) > settingCutPinMinTOFHad) { + if (useReferencePionCuts() ? (track.hasTOF() && std::abs(track.p()) > pionRefPCombMin) : (track.hasTOF() && std::abs(track.pt()) > settingCutPinMinTOFHad)) { const float tofNSigmaHad = track.tofNSigmaPi(); + const float combNsigmaHad = std::sqrt(tofNSigmaHad * tofNSigmaHad + tpcNSigmaHad * tpcNSigmaHad); mQaRegistry.fill(HIST("purity/h2NsigmaHadTOF_preselection"), track.sign() * track.pt(), tofNSigmaHad); + mQaRegistry.fill(HIST("purity/h2NsigmaHadComb_preselection"), track.sign() * track.pt(), combNsigmaHad); } } else if (passTrackHad && settingHadPDGCode == PDG_t::kKPlus) { const float tpcNSigmaHad = track.tpcNSigmaKa(); mQaRegistry.fill(HIST("purity/h2NsigmaHadTPC_preselection"), track.sign() * track.pt(), tpcNSigmaHad); if (track.hasTOF() && track.tpcInnerParam() >= settingCutPinMinTOFHad) { const float tofNSigmaHad = track.tofNSigmaKa(); + const float combNsigmaHad = std::sqrt(tofNSigmaHad * tofNSigmaHad + tpcNSigmaHad * tpcNSigmaHad); mQaRegistry.fill(HIST("purity/h2NsigmaHadTOF_preselection"), track.sign() * track.pt(), tofNSigmaHad); + mQaRegistry.fill(HIST("purity/h2NsigmaHadComb_preselection"), track.sign() * track.pt(), combNsigmaHad); } } @@ -1431,7 +1541,9 @@ PROCESS_SWITCH(HadNucleiFemto, processMixedEventHyper, "Process Mixed event", fa mQaRegistry.fill(HIST("purity/h2NsigmaNuTPC_preselecComp"), track.sign() * track.pt(), track.tpcNSigmaDe()); if (track.hasTOF() && track.tpcInnerParam() > settingCutPinMinTOFITSDe) { const float tofNSigmaDe = track.tofNSigmaDe(); + const float combNsigmaDe = std::sqrt(tofNSigmaDe * tofNSigmaDe + tpcNSigmaDe * tpcNSigmaDe); mQaRegistry.fill(HIST("purity/h2NsigmaNuTOF_preselection"), track.sign() * track.pt(), tofNSigmaDe); + mQaRegistry.fill(HIST("purity/h2NsigmaNuComb_preselection"), track.sign() * track.pt(), combNsigmaDe); } else if (track.tpcInnerParam() <= settingCutPinMinTOFITSDe) { const float itsNSigmaDe = itsResponse.nSigmaITS(track.itsClusterSizes(), track.p(), track.eta()); mQaRegistry.fill(HIST("purity/h2NSigmaNuITS_preselection"), track.sign() * track.pt(), itsNSigmaDe);