From 6c5aa7a677ec8642a9c6bb218fe8ef522b8f8846 Mon Sep 17 00:00:00 2001 From: sawankumawat Date: Tue, 26 May 2026 12:34:01 +0530 Subject: [PATCH 1/2] Added new PID method and fake track rejection --- PWGLF/Tasks/Resonances/kstarqa.cxx | 263 ++++++++++++++--------------- 1 file changed, 128 insertions(+), 135 deletions(-) diff --git a/PWGLF/Tasks/Resonances/kstarqa.cxx b/PWGLF/Tasks/Resonances/kstarqa.cxx index cb175523fd2..1e4dcf2aad3 100644 --- a/PWGLF/Tasks/Resonances/kstarqa.cxx +++ b/PWGLF/Tasks/Resonances/kstarqa.cxx @@ -101,6 +101,8 @@ struct Kstarqa { Configurable isapplypTdepPIDTOF{"isapplypTdepPIDTOF", false, "Apply pT dependent PID for TOF"}; Configurable isApplyParticleMID{"isApplyParticleMID", false, "Apply particle misidentification"}; Configurable isApplyParticleMIDPtDep{"isApplyParticleMIDPtDep", false, "Apply pT dependent MID selection"}; + Configurable isapplyPID2{"isapplyPID2", false, "Apply second PID selection"}; + Configurable isapplyPID1{"isapplyPID1", true, "Apply default PID selection"}; Configurable isApplyParticleMIDPtDep2{"isApplyParticleMIDPtDep2", false, "Apply pT dependent MID selection (nSigma less of contamination lt nSigma of signal)"}; Configurable allGenEvents{"allGenEvents", false, "Fill all generated events in MC for signal loss calculations"}; @@ -125,8 +127,8 @@ struct Kstarqa { Configurable cfgCutDCAz{"cfgCutDCAz", 2.0f, "DCAz range for tracks"}; // Configurable ctrackRapidity{"ctrackRapidity", 0.3f, "Cut on track rapidity"}; Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 5, "Number of mixed events per event"}; - // Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; - Configurable cfgTPCcluster{"cfgTPCcluster", 70, "TPC NCL Found"}; + Configurable cfgITScluster{"cfgITScluster", 5, "Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 80, "TPC NCL Found"}; // Configurable cfgRCRFC{"cfgRCRFC", 0.8f, "Crossed Rows to Findable Clusters"}; // Configurable cfgITSChi2NCl{"cfgITSChi2NCl", 36.0, "ITS Chi2/NCl"}; // Configurable cfgTPCChi2NClMax{"cfgTPCChi2NClMax", 4.0, "TPC Chi2/NCl"}; @@ -136,6 +138,9 @@ struct Kstarqa { Configurable isApplyPtDepDCAxyCut{"isApplyPtDepDCAxyCut", false, "Apply pT dependent DCAxy cut"}; // Configurable isGoldenChi2{"isGoldenChi2", false, "Apply golden chi2 cut"}; // Configurable cfgDeepAngle{"cfgDeepAngle", 0.04, "Deep Angle cut value"}; + Configurable cFakeTrackCutKa{"cFakeTrackCutKa", 0.1, "Cut based on momentum difference in global and TPC tracks for Kaons"}; + Configurable cBetaCutTOFKaon{"cBetaCutTOFKaon", 0.0, "cut TOF beta"}; + Configurable cFakeTrack{"cFakeTrack", true, "Fake track selection"}; // cuts on mother // Configurable isApplyCutsOnMother{"isApplyCutsOnMother", false, "Enable additional cuts on Kstar mother"}; @@ -210,10 +215,6 @@ struct Kstarqa { // Configurable applyRecMotherRapidity{"applyRecMotherRapidity", true, "Apply rapidity cut on reconstructed mother track"}; // Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", false, "Global track selection without DCA"}; // kQualityTracks (kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits) | kInAcceptanceTracks (kPtRange | kEtaRange) - // Configurable cBetaCutTOF{"cBetaCutTOF", 0.0, "cut TOF beta"}; - // Configurable cFakeTrack{"cFakeTrack", true, "Fake track selection"}; - // Configurable cFakeTrackCutKa{"cFakeTrackCutKa", 0.5, "Cut based on momentum difference in global and TPC tracks for Kaons"}; - // Configurable cFakeTrackCutPi{"cFakeTrackCutPi", 0.5, "Cut based on momentum difference in global and TPC tracks for Pions"}; // Configurable for histograms Configurable avoidsplitrackMC{"avoidsplitrackMC", true, "avoid split track in MC"}; @@ -554,15 +555,13 @@ struct Kstarqa { bool selectionTrack(const T& candidate) { if (configGp.isGlobalTracks) { - if (!candidate.isGlobalTrackWoDCA()) + if (!candidate.isGlobalTrack()) return false; if (std::abs(candidate.pt()) < configGp.cfgCutPT) return false; - // if (std::abs(candidate.eta()) > configGp.cfgCutEtaMax || std::abs(candidate.eta()) < configGp.cfgCutEtaMin) if (std::abs(candidate.eta()) > configGp.cfgCutEtaMax) return false; if (!configGp.isApplyPtDepDCAxyCut) { - // if (std::abs(candidate.dcaXY()) > configGp.cfgCutDCAxyMax || std::abs(candidate.dcaXY()) < configGp.cfgCutDCAxyMin) if (std::abs(candidate.dcaXY()) > configGp.cfgCutDCAxyMax) return false; } else { @@ -571,16 +570,10 @@ struct Kstarqa { } if (std::abs(candidate.dcaZ()) > configGp.cfgCutDCAz) return false; - // if (candidate.tpcCrossedRowsOverFindableCls() < configGp.cfgRCRFC) - // return false; - // if (candidate.itsNCls() < configGp.cfgITScluster) - // return false; + if (candidate.itsNCls() < configGp.cfgITScluster) + return false; if (candidate.tpcNClsFound() < configGp.cfgTPCcluster) return false; - // if (candidate.itsChi2NCl() >= configGp.cfgITSChi2NCl) - // return false; - // if (candidate.tpcChi2NCl() >= configGp.cfgTPCChi2NClMax || candidate.tpcChi2NCl() < configGp.cfgTPCChi2NClMin) - // return false; if (configGp.hasITS && !candidate.hasITS()) return false; if (configGp.isITSTPCRefit && (!(o2::aod::track::ITSrefit) || !(o2::aod::track::TPCrefit))) @@ -600,8 +593,8 @@ struct Kstarqa { return false; // if (candidate.tpcCrossedRowsOverFindableCls() < configGp.cfgRCRFC) return false; - // if (candidate.itsNCls() < configGp.cfgITScluster) - // return false; + if (candidate.itsNCls() < configGp.cfgITScluster) + return false; if (candidate.tpcNClsFound() < configGp.cfgTPCcluster) return false; // if (candidate.itsChi2NCl() >= configGp.cfgITSChi2NCl) @@ -617,19 +610,16 @@ struct Kstarqa { return true; } - // template - // bool isFakeTrack(const T& track, int PID) - // { - // const auto pglobal = track.p(); - // const auto ptpc = track.tpcInnerParam(); - // if (PID == 0 && std::abs(pglobal - ptpc) > cFakeTrackCutPi) { - // return true; - // } - // if (PID == 1 && std::abs(pglobal - ptpc) > cFakeTrackCutKa) { - // return true; - // } - // return false; - // } + template + bool isFakeTrack(const T& track) + { + const auto pglobal = track.p(); + const auto ptpc = track.tpcInnerParam(); + if (std::abs(pglobal - ptpc) > configGp.cFakeTrackCutKa) { + return true; + } + return false; + } // deep angle cut on pair to remove photon conversion template @@ -653,6 +643,34 @@ struct Kstarqa { return true; } + template + bool selectionPID2(const T& candidate, int PID) + { + float ptThreshold = 0.5; // GeV/c + if (PID == PIDParticle::kPion) { + if (candidate.pt() < ptThreshold && TMath::Abs(candidate.tpcNSigmaPi()) < configGp.nsigmaCutTPCPi) { + return true; + } + if (candidate.pt() >= ptThreshold && TMath::Abs(candidate.tpcNSigmaPi()) < configGp.nsigmaCutTPCPi && candidate.hasTOF() && (std::pow(candidate.tofNSigmaPi() - configGp.shiftInNsigmaTOFPi, 2) + std::pow(candidate.tpcNSigmaPi(), 2)) < (std::pow(configGp.nsigmaCutCombinedPi, 2))) { + return true; + } + if (candidate.pt() >= ptThreshold && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaPi()) < configGp.nsigmaCutTPCPi) { + return true; + } + } else if (PID == PIDParticle::kKaon) { + if (candidate.pt() < ptThreshold && TMath::Abs(candidate.tpcNSigmaKa()) < configGp.nsigmaCutTPCKa) { + return true; + } + if (candidate.pt() >= ptThreshold && candidate.hasTOF() && (std::pow(candidate.tofNSigmaKa() - configGp.shiftInNsigmaTOFKa, 2) + std::pow(candidate.tpcNSigmaKa(), 2)) < (std::pow(configGp.nsigmaCutCombinedKa, 2)) && candidate.beta() > configGp.cBetaCutTOFKaon) { + return true; + } + if (candidate.pt() >= ptThreshold && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaKa()) < configGp.nsigmaCutTPCKa) { + return true; + } + } + return false; + } + template bool selectionPID(const T& candidate, int PID) { @@ -1156,27 +1174,30 @@ struct Kstarqa { } // since we are using combinations full index policy, so repeated pairs are allowed, so we can check one with Kaon and other with pion - if (!configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !selectionPID(track1, 1)) // Track 1 is checked with Kaon + if (configGp.isapplyPID1 && !selectionPID(track1, 1)) // kaon continue; - if (!configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !selectionPID(track2, 0)) // Track 2 is checked with Pion + if (configGp.isapplyPID1 && !selectionPID(track2, 0)) // pion continue; - if (configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !selectionPIDPtDep(track1, 1)) // Track 1 is checked with Kaon + if (configGp.isapplypTdepPID && !selectionPIDPtDep(track1, 1)) // kaon continue; - if (configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !selectionPIDPtDep(track2, 0)) // Track 2 is checked with Pion + if (configGp.isapplypTdepPID && !selectionPIDPtDep(track2, 0)) // pion continue; - if (!configGp.isapplypTdepPID && configGp.isapplypTdepPIDTOF && !selectionPIDptDepTOF(track1, 1)) // Track 1 is checked with Kaon + if (configGp.isapplypTdepPIDTOF && !selectionPIDptDepTOF(track1, 1)) // kaon continue; - if (!configGp.isapplypTdepPID && configGp.isapplypTdepPIDTOF && !selectionPIDptDepTOF(track2, 0)) // Track 2 is checked with Pion + if (configGp.isapplypTdepPIDTOF && !selectionPIDptDepTOF(track2, 0)) // pion + continue; + + if (configGp.isapplyPID2 && !selectionPID2(track1, 1)) // kaon + continue; + if (configGp.isapplyPID2 && !selectionPID2(track2, 0)) // pion continue; rEventSelection.fill(HIST("tracksCheckData"), 2.5); - // if (cFakeTrack && isFakeTrack(track1, 1)) // Kaon - // continue; - // if (cFakeTrack && isFakeTrack(track2, 0)) // Pion - // continue; + if (configGp.cFakeTrack && isFakeTrack(track1)) // Kaon + continue; rEventSelection.fill(HIST("tracksCheckData"), 3.5); // if (std::abs(track1.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) @@ -1308,21 +1329,25 @@ struct Kstarqa { o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { if (!selectionTrack(t1) || !selectionTrack(t2)) continue; - // if (!selectionPID(t1, 1) || !selectionPID(t2, 0)) - // continue; - if (!configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !selectionPID(t1, 1)) // Track 1 is checked with Kaon + + if (configGp.isapplyPID1 && !selectionPID(t1, 1)) // kaon continue; - if (!configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !selectionPID(t2, 0)) // Track 2 is checked with Pion + if (configGp.isapplyPID1 && !selectionPID(t2, 0)) // pion continue; - if (configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !selectionPIDPtDep(t1, 1)) // Track 1 is checked with Kaon + if (configGp.isapplypTdepPID && !selectionPIDPtDep(t1, 1)) // kaon continue; - if (configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !selectionPIDPtDep(t2, 0)) // Track 2 is checked with Pion + if (configGp.isapplypTdepPID && !selectionPIDPtDep(t2, 0)) // pion continue; - if (!configGp.isapplypTdepPID && configGp.isapplypTdepPIDTOF && !selectionPIDptDepTOF(t1, 1)) // Track 1 is checked with Kaon + if (configGp.isapplypTdepPIDTOF && !selectionPIDptDepTOF(t1, 1)) // kaon continue; - if (!configGp.isapplypTdepPID && configGp.isapplypTdepPIDTOF && !selectionPIDptDepTOF(t2, 0)) // Track 2 is checked with Pion + if (configGp.isapplypTdepPIDTOF && !selectionPIDptDepTOF(t2, 0)) // pion + continue; + + if (configGp.isapplyPID2 && !selectionPID2(t1, 1)) // kaon + continue; + if (configGp.isapplyPID2 && !selectionPID2(t2, 0)) // pion continue; // if (std::abs(t1.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) @@ -1331,10 +1356,8 @@ struct Kstarqa { // if (std::abs(t2.rapidity(o2::track::PID::getMass(o2::track::PID::Pion))) > configGp.ctrackRapidity) // continue; - // if (cFakeTrack && isFakeTrack(t1, 1)) // Kaon - // continue; - // if (cFakeTrack && isFakeTrack(t2, 0)) // Pion - // continue; + if (configGp.cFakeTrack && isFakeTrack(t1)) // Kaon + continue; if (configGp.isApplyParticleMID) { if (selectionMID(t1, 0)) // Kaon misidentified as pion @@ -1410,27 +1433,22 @@ struct Kstarqa { for (const auto& [t1, t2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { if (!selectionTrack(t1) || !selectionTrack(t2)) continue; - // if (!selectionPID(t1, 1) || !selectionPID(t2, 0)) - // continue; - if (!configGp.isapplypTdepPID && !selectionPID(t1, 1)) // Track 1 is checked with Kaon + + if (configGp.isapplyPID1 && !selectionPID(t1, 1)) // kaon continue; - if (!configGp.isapplypTdepPID && !selectionPID(t2, 0)) // Track 2 is checked with Pion + if (configGp.isapplyPID1 && !selectionPID(t2, 0)) // pion continue; - if (configGp.isapplypTdepPID && !selectionPIDPtDep(t1, 1)) // Track 1 is checked with Kaon + if (configGp.isapplypTdepPID && !selectionPIDPtDep(t1, 1)) // kaon continue; - if (configGp.isapplypTdepPID && !selectionPIDPtDep(t2, 0)) // Track 2 is checked with Pion + if (configGp.isapplypTdepPID && !selectionPIDPtDep(t2, 0)) // pion continue; if (configGp.isApplyParticleMID) { if (selectionMID(t1, 0)) // Kaon misidentified as pion continue; - // if (selectionMID(t1, 2)) // Kaon misidentified as proton - // continue; if (selectionMID(t2, 1)) // Pion misidentified as kaon continue; - // if (selectionMID(t2, 2)) // Pion misidentified as proton - // continue; } if (configGp.isApplyParticleMIDPtDep) { @@ -1446,6 +1464,10 @@ struct Kstarqa { if (selectionMIDPtDep2(t2, 1)) // Pion misidentified as kaon continue; } + if (configGp.isapplyPID2 && !selectionPID2(t1, 1)) // kaon + continue; + if (configGp.isapplyPID2 && !selectionPID2(t2, 0)) // pion + continue; if (!t1.has_mcParticle() || !t2.has_mcParticle()) { continue; // skip if no MC particle associated @@ -1567,27 +1589,28 @@ struct Kstarqa { } // since we are using combinations full index policy, so repeated pairs are allowed, so we can check one with Kaon and other with pion - if (!configGp.isapplypTdepPID && !selectionPID(track1, 1)) // Track 1 is checked with Kaon + if (configGp.isapplyPID1 && !selectionPID(track1, 1)) // kaon continue; - if (!configGp.isapplypTdepPID && !selectionPID(track2, 0)) // Track 2 is checked with Pion + if (configGp.isapplyPID1 && !selectionPID(track2, 0)) // pion continue; rEventSelection.fill(HIST("tracksCheckData"), 3.5); - if (configGp.isapplypTdepPID && !selectionPIDPtDep(track1, 1)) // Track 1 is checked with Kaon + if (configGp.isapplypTdepPID && !selectionPIDPtDep(track1, 1)) // kaon continue; - if (configGp.isapplypTdepPID && !selectionPIDPtDep(track2, 0)) // Track 2 is checked with Pion + if (configGp.isapplypTdepPID && !selectionPIDPtDep(track2, 0)) // pion continue; rEventSelection.fill(HIST("tracksCheckData"), 4.5); + if (configGp.isapplyPID2 && !selectionPID2(track1, 1)) // kaon + continue; + if (configGp.isapplyPID2 && !selectionPID2(track2, 0)) // pion + continue; + if (configGp.isApplyParticleMID) { if (selectionMID(track1, 0)) // Kaon misidentified as pion continue; - // if (selectionMID(track1, 2)) // Kaon misidentified as proton - // continue; if (selectionMID(track2, 1)) // Pion misidentified as kaon continue; - // if (selectionMID(track2, 2)) // Pion misidentified as proton - // continue; } if (configGp.isApplyParticleMIDPtDep) { @@ -1611,10 +1634,8 @@ struct Kstarqa { // if (std::abs(track2.rapidity(o2::track::PID::getMass(o2::track::PID::Pion))) > configGp.ctrackRapidity) // continue; - // if (cFakeTrack && isFakeTrack(track1, 1)) // Kaon - // continue; - // if (cFakeTrack && isFakeTrack(track2, 0)) // Pion - // continue; + if (configGp.cFakeTrack && isFakeTrack(track1)) // Kaon + continue; rEventSelection.fill(HIST("tracksCheckData"), 6.5); if (cQAplots) { @@ -2146,24 +2167,24 @@ struct Kstarqa { rEventSelection.fill(HIST("recMCparticles"), 11.5); if (track1PDG == PDG_t::kPiPlus) { - if (!configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !(selectionPID(track1, 0) && selectionPID(track2, 1))) { // pion and kaon + if (configGp.isapplyPID1 && !(selectionPID(track1, 0) && selectionPID(track2, 1))) { // pion and kaon continue; - } else if (configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !(selectionPIDPtDep(track1, 0) && selectionPIDPtDep(track2, 1))) { // pion and kaon + } + if (configGp.isapplypTdepPID && !(selectionPIDPtDep(track1, 0) && selectionPIDPtDep(track2, 1))) { // pion and kaon continue; - } else if (!configGp.isapplypTdepPID && configGp.isapplypTdepPIDTOF && !(selectionPIDptDepTOF(track1, 0) && selectionPIDptDepTOF(track2, 1))) { // pion and kaon + } + if (configGp.isapplypTdepPIDTOF && !(selectionPIDptDepTOF(track1, 0) && selectionPIDptDepTOF(track2, 1))) { // pion and kaon continue; } + if (configGp.isapplyPID2 && !selectionPID2(track2, 0)) // pion and kaon + continue; rEventSelection.fill(HIST("recMCparticles"), 12.5); if (configGp.isApplyParticleMID) { if (selectionMID(track2, 0)) // Kaon misidentified as pion continue; - // if (selectionMID(track2, 2)) // Kaon misidentified as proton - // continue; if (selectionMID(track1, 1)) // Pion misidentified as kaon continue; - // if (selectionMID(track1, 2)) // Pion misidentified as proton - // continue; } if (configGp.isApplyParticleMIDPtDep) { @@ -2198,24 +2219,26 @@ struct Kstarqa { } } else if (track1PDG == PDG_t::kKPlus) { - if (!configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !(selectionPID(track1, 1) && selectionPID(track2, 0))) { // pion and kaon + if (configGp.isapplyPID1 && !(selectionPID(track1, 1) && selectionPID(track2, 0))) { // pion and kaon continue; - } else if (configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !(selectionPIDPtDep(track1, 1) && selectionPIDPtDep(track2, 0))) { // pion and kaon + } + if (configGp.isapplypTdepPID && !(selectionPIDPtDep(track1, 1) && selectionPIDPtDep(track2, 0))) { // pion and kaon continue; - } else if (!configGp.isapplypTdepPID && configGp.isapplypTdepPIDTOF && !(selectionPIDptDepTOF(track1, 1) && selectionPIDptDepTOF(track2, 0))) { // pion and kaon + } + if (configGp.isapplypTdepPIDTOF && !(selectionPIDptDepTOF(track1, 1) && selectionPIDptDepTOF(track2, 0))) { // pion and kaon continue; } + if (configGp.isapplyPID2 && !selectionPID2(track1, 1)) // kaon + continue; + if (configGp.isapplyPID2 && !selectionPID2(track2, 0)) // pion + continue; rEventSelection.fill(HIST("recMCparticles"), 12.5); if (configGp.isApplyParticleMID) { if (selectionMID(track2, 1)) // Pion misidentified as kaon continue; - // if (selectionMID(track2, 2)) // Kaon misidentified as proton - // continue; if (selectionMID(track1, 0)) // Kaon misidentified as pion continue; - // if (selectionMID(track1, 2)) // Pion misidentified as proton - // continue; } if (configGp.isApplyParticleMIDPtDep) { @@ -2249,13 +2272,6 @@ struct Kstarqa { } } - /* if (configGp.isApplyCutsOnMother) { - if (mothertrack1.pt() >= configGp.cMaxPtMotherCut) // excluding candidates in overflow - continue; - if ((std::sqrt(mothertrack1.e() * mothertrack1.e() - mothertrack1.p() * mothertrack1.p())) >= configGp.cMaxMinvMotherCut) // excluding candidates in overflow - continue; - } */ - if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { hInvMass.fill(HIST("h1KSRecsplit"), mothertrack1.pt()); continue; @@ -2435,24 +2451,26 @@ struct Kstarqa { } rEventSelection.fill(HIST("recMCparticles"), 10.5); - if (!configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !(selectionPID(track1, 0) && selectionPID(track2, 1))) { // pion and kaon + if (configGp.isapplyPID1 && !(selectionPID(track1, 0) && selectionPID(track2, 1))) { // pion and kaon continue; - } else if (configGp.isapplypTdepPID && !configGp.isapplypTdepPIDTOF && !(selectionPIDPtDep(track1, 0) && selectionPIDPtDep(track2, 1))) { // pion and kaon + } + if (configGp.isapplypTdepPID && !(selectionPIDPtDep(track1, 0) && selectionPIDPtDep(track2, 1))) { // pion and kaon continue; - } else if (!configGp.isapplypTdepPID && configGp.isapplypTdepPIDTOF && !(selectionPIDptDepTOF(track1, 0) && selectionPIDptDepTOF(track2, 1))) { // pion and kaon + } + if (configGp.isapplypTdepPIDTOF && !(selectionPIDptDepTOF(track1, 0) && selectionPIDptDepTOF(track2, 1))) { // pion and kaon continue; } + if (configGp.isapplyPID2 && !selectionPID2(track1, 0)) + continue; + if (configGp.isapplyPID2 && !selectionPID2(track2, 1)) + continue; rEventSelection.fill(HIST("recMCparticles"), 11.5); if (configGp.isApplyParticleMID) { if (selectionMID(track1, 1)) // Pion misidentified as kaon continue; - // if (selectionMID(track1, 2)) // Kaon misidentified as proton - // continue; if (selectionMID(track2, 0)) // Kaon misidentified as pion continue; - // if (selectionMID(track2, 2)) // Pion misidentified as proton - // continue; } rEventSelection.fill(HIST("recMCparticles"), 12.5); @@ -2470,21 +2488,8 @@ struct Kstarqa { continue; } - // if (std::abs(track1.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) - // continue; - - // if (std::abs(track2.rapidity(o2::track::PID::getMass(o2::track::PID::Pion))) > configGp.ctrackRapidity) - // continue; - rEventSelection.fill(HIST("recMCparticles"), 13.5); - /* if (configGp.isApplyCutsOnMother) { - if (mothertrack1.pt() >= configGp.cMaxPtMotherCut) // excluding candidates in overflow - continue; - if ((std::sqrt(mothertrack1.e() * mothertrack1.e() - mothertrack1.p() * mothertrack1.p())) >= configGp.cMaxMinvMotherCut) // excluding candidates in overflow - continue; - } */ - if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { hInvMass.fill(HIST("h1KSRecsplit"), mothertrack1.pt()); continue; @@ -2601,22 +2606,20 @@ struct Kstarqa { } // since we are using combinations full index policy, so repeated pairs are allowed, so we can check one with Kaon and other with kaon - if (!configGp.isapplypTdepPID && !selectionPID(track1, 1)) // Track 1 is checked with Kaon + if (!configGp.isapplypTdepPID && !selectionPID(track1, 1)) // kaon continue; if (!configGp.isapplypTdepPID && !selectionPID(track2, 1)) // Track 2 is checked with kaon continue; - if (configGp.isapplypTdepPID && !selectionPIDPtDep(track1, 1)) // Track 1 is checked with Kaon + if (configGp.isapplypTdepPID && !selectionPIDPtDep(track1, 1)) // kaon continue; if (configGp.isapplypTdepPID && !selectionPIDPtDep(track2, 1)) // Track 2 is checked with kaon continue; rEventSelection.fill(HIST("tracksCheckData"), 2.5); - // if (cFakeTrack && isFakeTrack(track1, 1)) // Kaon - // continue; - // if (cFakeTrack && isFakeTrack(track2, 1)) // Pion - // continue; + if (configGp.cFakeTrack && isFakeTrack(track1)) // Kaon + continue; rEventSelection.fill(HIST("tracksCheckData"), 3.5); // if (std::abs(track1.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) @@ -2714,9 +2717,9 @@ struct Kstarqa { // if (std::abs(t2.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) // continue; - // if (cFakeTrack && isFakeTrack(t1, 1)) // Kaon + // if (configGp.cFakeTrack && isFakeTrack(t1, 1)) // Kaon // continue; - // if (cFakeTrack && isFakeTrack(t2, 1)) // Kaon + // if (configGp.cFakeTrack && isFakeTrack(t2, 1)) // Kaon // continue; /* if (configGp.isApplyParticleMID) { @@ -3156,9 +3159,6 @@ struct Kstarqa { } */ rEventSelection.fill(HIST("recMCparticles"), 13.5); - // if (std::abs(track1.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) - // continue; - // if (std::abs(track2.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) // continue; rEventSelection.fill(HIST("recMCparticles"), 14.5); @@ -3169,13 +3169,6 @@ struct Kstarqa { // hPID.fill(HIST("After/hTOFnsigPi_mult_pt"), track2.tofNSigmaPi(), multiplicity, track2.pt()); } - /* if (configGp.isApplyCutsOnMother) { - if (mothertrack1.pt() >= configGp.cMaxPtMotherCut) // excluding candidates in overflow - continue; - if ((std::sqrt(mothertrack1.e() * mothertrack1.e() - mothertrack1.p() * mothertrack1.p())) >= configGp.cMaxMinvMotherCut) // excluding candidates in overflow - continue; - } */ - if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { hInvMass.fill(HIST("h1KSRecsplit"), mothertrack1.pt()); continue; From b9efd0b7a1876763f665db29c294acac5f949835 Mon Sep 17 00:00:00 2001 From: sawankumawat Date: Tue, 26 May 2026 18:55:14 +0530 Subject: [PATCH 2/2] qa histograms added --- PWGLF/Tasks/Resonances/kstarqa.cxx | 132 ++++++----------------------- 1 file changed, 26 insertions(+), 106 deletions(-) diff --git a/PWGLF/Tasks/Resonances/kstarqa.cxx b/PWGLF/Tasks/Resonances/kstarqa.cxx index 1e4dcf2aad3..8dd87cb002a 100644 --- a/PWGLF/Tasks/Resonances/kstarqa.cxx +++ b/PWGLF/Tasks/Resonances/kstarqa.cxx @@ -297,6 +297,10 @@ struct Kstarqa { hOthers.add("hEta_after", "Eta distribution", kTH1F, {{200, -1.0f, 1.0f}}); hOthers.add("hCRFC_after", "CRFC after distribution", kTH1F, {{100, 0.0f, 10.0f}}); hOthers.add("hCRFC_before", "CRFC before distribution", kTH1F, {{100, 0.0f, 10.0f}}); + hOthers.add("hTOFBetaKa", "Beta distribution from TOF", kTH1F, {{50, 0.0f, 1.0f}}); + hOthers.add("hTOFBetaPi", "Beta distribution from TOF", kTH1F, {{50, 0.0f, 1.0f}}); + hOthers.add("hTPCMomDiffKa", "Momentum difference between global and TPC tracks for Kaons", kTH1F, {{100, -1.0f, 1.0f}}); + hOthers.add("hTPCMomDiffPi", "Momentum difference between global and TPC tracks for Pions", kTH1F, {{100, -1.0f, 1.0f}}); hOthers.add("hKstar_rap_pt", "Pair rapidity distribution; y; p_{T}; Counts", kTH2F, {{400, -2.0f, 2.0f}, ptAxis}); hOthers.add("hKstar_eta_pt", "Pair eta distribution; #eta; p_{T}; Counts", kTH2F, {{400, -2.0f, 2.0f}, ptAxis}); @@ -1200,22 +1204,13 @@ struct Kstarqa { continue; rEventSelection.fill(HIST("tracksCheckData"), 3.5); - // if (std::abs(track1.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) - // continue; - - // if (std::abs(track2.rapidity(o2::track::PID::getMass(o2::track::PID::Pion))) > configGp.ctrackRapidity) - // continue; rEventSelection.fill(HIST("tracksCheckData"), 4.5); if (configGp.isApplyParticleMID) { if (selectionMID(track1, 0)) // Kaon misidentified as pion continue; - // if (selectionMID(track1, 2)) // Kaon misidentified as proton - // continue; if (selectionMID(track2, 1)) // Pion misidentified as kaon continue; - // if (selectionMID(track2, 2)) // Pion misidentified as proton - // continue; } if (configGp.isApplyParticleMIDPtDep) { @@ -1244,10 +1239,18 @@ struct Kstarqa { hPID.fill(HIST("After/hTPCnsigPi_mult_pt"), track2.tpcNSigmaPi(), multiplicity, track2.pt()); hPID.fill(HIST("After/hTOFnsigKa_mult_pt"), track1.tofNSigmaKa() - configGp.shiftInNsigmaTOFKa, multiplicity, track1.pt()); hPID.fill(HIST("After/hTOFnsigPi_mult_pt"), track2.tofNSigmaPi() - configGp.shiftInNsigmaTOFPi, multiplicity, track2.pt()); - hOthers.fill(HIST("hEta_after"), track1.eta()); - hOthers.fill(HIST("hCRFC_after"), track1.tpcCrossedRowsOverFindableCls()); hPID.fill(HIST("After/hNsigma_TPC_TOF_Ka_after"), track1.tpcNSigmaKa(), track1.tofNSigmaKa() - configGp.shiftInNsigmaTOFKa, track1.pt()); hPID.fill(HIST("After/hNsigma_TPC_TOF_Pi_after"), track2.tpcNSigmaPi(), track2.tofNSigmaPi() - configGp.shiftInNsigmaTOFPi, track2.pt()); + hOthers.fill(HIST("hEta_after"), track1.eta()); + hOthers.fill(HIST("hCRFC_after"), track1.tpcCrossedRowsOverFindableCls()); + if (track1.hasTOF()) { + hOthers.fill(HIST("hTOFBetaKa"), track1.beta()); + } + if (track2.hasTOF()) { + hOthers.fill(HIST("hTOFBetaPi"), track2.beta()); + } + hOthers.fill(HIST("hTPCMomDiffKa"), track1.p() - track1.tpcInnerParam()); + hOthers.fill(HIST("hTPCMomDiffPi"), track2.p() - track2.tpcInnerParam()); } if (!selectionPair(track1, track2)) { @@ -1656,6 +1659,12 @@ struct Kstarqa { // hPID.fill(HIST("After/hNsigmaPionTOF_after"), track2.pt(), track2.tofNSigmaPi()); hPID.fill(HIST("After/hNsigma_TPC_TOF_Ka_after"), track1.tpcNSigmaKa(), track1.tofNSigmaKa() - configGp.shiftInNsigmaTOFKa, track1.pt()); hPID.fill(HIST("After/hNsigma_TPC_TOF_Pi_after"), track2.tpcNSigmaPi(), track2.tofNSigmaPi() - configGp.shiftInNsigmaTOFPi, track2.pt()); + if (track1.hasTOF()) { + hOthers.fill(HIST("hTOFBetaKa"), track1.beta()); + } + if (track2.hasTOF()) { + hOthers.fill(HIST("hTOFBetaPi"), track2.beta()); + } } if (configGp.isCheckMotherClosure) { @@ -2216,6 +2225,12 @@ struct Kstarqa { hPID.fill(HIST("After/hTOFnsigKa_mult_pt"), track2.tofNSigmaKa() - configGp.shiftInNsigmaTOFKa, multiplicity, track2.pt()); hPID.fill(HIST("After/hNsigma_TPC_TOF_Ka_after"), track2.tpcNSigmaKa(), track2.tofNSigmaKa() - configGp.shiftInNsigmaTOFKa, track2.pt()); hPID.fill(HIST("After/hNsigma_TPC_TOF_Pi_after"), track1.tpcNSigmaPi(), track1.tofNSigmaPi() - configGp.shiftInNsigmaTOFPi, track1.pt()); + if (track1.hasTOF()) { + hOthers.fill(HIST("hTOFBetaKa"), track1.beta()); + } + if (track2.hasTOF()) { + hOthers.fill(HIST("hTOFBetaPi"), track2.beta()); + } } } else if (track1PDG == PDG_t::kKPlus) { @@ -2571,33 +2586,15 @@ struct Kstarqa { continue; if (cQAplots) { - // hPID.fill(HIST("Before/hNsigmaTPC_Ka_before"), track1.pt(), track1.tpcNSigmaKa()); - // hPID.fill(HIST("Before/hNsigmaTOF_Ka_before"), track1.pt(), track1.tofNSigmaKa()); - // hPID.fill(HIST("Before/hNsigmaTPC_Pi_before"), track2.pt(), track2.tpcNSigmaPi()); - // hPID.fill(HIST("Before/hNsigmaTOF_Pi_before"), track2.pt(), track2.tofNSigmaPi()); hPID.fill(HIST("Before/hNsigma_TPC_TOF_Ka_before"), track1.tpcNSigmaKa(), track1.tofNSigmaKa(), track1.pt()); hPID.fill(HIST("Before/hNsigma_TPC_TOF_Pi_before"), track2.tpcNSigmaPi(), track2.tofNSigmaPi(), track2.pt()); hPID.fill(HIST("Before/hTPCnsigKa_mult_pt"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); - // hPID.fill(HIST("Before/hTPCnsigPi_mult_pt"), track2.tpcNSigmaPi(), multiplicity, track2.pt()); hPID.fill(HIST("Before/hTOFnsigKa_mult_pt"), track1.tofNSigmaKa(), multiplicity, track1.pt()); hPID.fill(HIST("Before/hTOFnsigPi_mult_pt"), track2.tofNSigmaPi(), multiplicity, track2.pt()); hOthers.fill(HIST("hCRFC_before"), track1.tpcCrossedRowsOverFindableCls()); - // hOthers.fill(HIST("dE_by_dx_TPC"), track1.p(), track1.tpcSignal()); hOthers.fill(HIST("hphi"), track1.phi()); - - // if (track1.sign() < 0) { - // hPID.fill(HIST("Before/h1PID_TPC_neg_kaon"), track1.tpcNSigmaKa()); - // // hPID.fill(HIST("Before/h1PID_TPC_neg_pion"), track2.tpcNSigmaPi()); - // hPID.fill(HIST("Before/h1PID_TOF_neg_kaon"), track1.tofNSigmaKa()); - // // hPID.fill(HIST("Before/h1PID_TOF_neg_pion"), track2.tofNSigmaPi()); - // } else { - // hPID.fill(HIST("Before/h1PID_TPC_pos_kaon"), track1.tpcNSigmaKa()); - // // hPID.fill(HIST("Before/h1PID_TPC_pos_pion"), track2.tpcNSigmaPi()); - // hPID.fill(HIST("Before/h1PID_TOF_pos_kaon"), track1.tofNSigmaKa()); - // // hPID.fill(HIST("Before/h1PID_TOF_pos_pion"), track2.tofNSigmaPi()); - // } } if (cQAevents) { @@ -2621,43 +2618,18 @@ struct Kstarqa { if (configGp.cFakeTrack && isFakeTrack(track1)) // Kaon continue; rEventSelection.fill(HIST("tracksCheckData"), 3.5); - - // if (std::abs(track1.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) - // continue; - - // if (std::abs(track2.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) - // continue; rEventSelection.fill(HIST("tracksCheckData"), 4.5); - - /* if (configGp.isApplyParticleMID) { - if (selectionMID(track1, 0)) // Kaon misidentified as pion - continue; - if (selectionMID(track1, 2)) // Kaon misidentified as proton - continue; - if (selectionMID(track2, 0)) // Pion misidentified as pion - continue; - if (selectionMID(track2, 2)) // Pion misidentified as proton - continue; - } */ - rEventSelection.fill(HIST("tracksCheckData"), 5.5); if (cQAplots) { - // hPID.fill(HIST("After/hDcaxyPi"), track2.dcaXY()); hPID.fill(HIST("After/hDcaxyKa"), track1.dcaXY()); - // hPID.fill(HIST("After/hDcazPi"), track2.dcaZ()); hPID.fill(HIST("After/hDcazKa"), track1.dcaZ()); hPID.fill(HIST("After/hTPCnsigKa_mult_pt"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); - // hPID.fill(HIST("After/hTPCnsigPi_mult_pt"), track2.tpcNSigmaPi(), multiplicity, track2.pt()); hPID.fill(HIST("After/hTOFnsigKa_mult_pt"), track1.tofNSigmaKa(), multiplicity, track1.pt()); hPID.fill(HIST("After/hTOFnsigPi_mult_pt"), track2.tofNSigmaPi(), multiplicity, track2.pt()); hOthers.fill(HIST("hEta_after"), track1.eta()); hOthers.fill(HIST("hCRFC_after"), track1.tpcCrossedRowsOverFindableCls()); - // hPID.fill(HIST("After/hNsigmaKaonTPC_after"), track1.pt(), track1.tpcNSigmaKa()); - // hPID.fill(HIST("After/hNsigmaKaonTOF_after"), track1.pt(), track1.tofNSigmaKa()); - // hPID.fill(HIST("After/hNsigmaPionTPC_after"), track2.pt(), track2.tpcNSigmaPi()); - // hPID.fill(HIST("After/hNsigmaPionTOF_after"), track2.pt(), track2.tofNSigmaPi()); hPID.fill(HIST("After/hNsigma_TPC_TOF_Ka_after"), track1.tpcNSigmaKa(), track1.tofNSigmaKa(), track1.pt()); hPID.fill(HIST("After/hNsigma_TPC_TOF_Pi_after"), track2.tpcNSigmaPi(), track2.tofNSigmaPi(), track2.pt()); } @@ -2671,13 +2643,6 @@ struct Kstarqa { daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); mother = daughter1 + daughter2; // Phi meson - /* if (configGp.isApplyCutsOnMother) { - if (mother.Pt() >= configGp.cMaxPtMotherCut) // excluding candidates in overflow - continue; - if (mother.M() >= configGp.cMaxMinvMotherCut) // excluding candidates in overflow - continue; - } */ - if (cQAplots) { hOthers.fill(HIST("hKstar_rap_pt"), mother.Rapidity(), mother.Pt()); hOthers.fill(HIST("hKstar_eta_pt"), mother.Eta(), mother.Pt()); @@ -2711,28 +2676,6 @@ struct Kstarqa { if (!selectionPID(t1, 1) || !selectionPID(t2, 1)) continue; - // if (std::abs(t1.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) - // continue; - - // if (std::abs(t2.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) - // continue; - - // if (configGp.cFakeTrack && isFakeTrack(t1, 1)) // Kaon - // continue; - // if (configGp.cFakeTrack && isFakeTrack(t2, 1)) // Kaon - // continue; - - /* if (configGp.isApplyParticleMID) { - if (selectionMID(t1, 0)) // Kaon misidentified as pion - continue; - if (selectionMID(t1, 2)) // Kaon misidentified as proton - continue; - if (selectionMID(t2, 0)) // Pion misidentified as pion - continue; - if (selectionMID(t2, 2)) // Pion misidentified as proton - continue; - } */ - if (!selectionPair(t1, t2)) { continue; } @@ -2849,13 +2792,6 @@ struct Kstarqa { continue; } - /* if (configGp.isApplyCutsOnMother) { - if (mcParticle.pt() >= configGp.cMaxPtMotherCut) // excluding candidates in overflow - continue; - if ((std::sqrt(mcParticle.e() * mcParticle.e() - mcParticle.p() * mcParticle.p())) >= configGp.cMaxMinvMotherCut) // excluding candidates in overflow - continue; - } */ - if (std::abs(mcParticle.pdgCode()) != o2::constants::physics::kPhi) { continue; } @@ -3146,27 +3082,11 @@ struct Kstarqa { continue; } rEventSelection.fill(HIST("recMCparticles"), 12.5); - - /* if (configGp.isApplyParticleMID) { - if (selectionMID(track1, 0)) // Kaon misidentified as pion - continue; - if (selectionMID(track1, 2)) // Kaon misidentified as proton - continue; - if (selectionMID(track2, 0)) // Kaon misidentified as pion - continue; - if (selectionMID(track2, 2)) // Kaon misidentified as proton - continue; - } */ rEventSelection.fill(HIST("recMCparticles"), 13.5); - - // if (std::abs(track2.rapidity(o2::track::PID::getMass(o2::track::PID::Kaon))) > configGp.ctrackRapidity) - // continue; rEventSelection.fill(HIST("recMCparticles"), 14.5); if (cQAplots) { hPID.fill(HIST("After/hTPCnsigKa_mult_pt"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); - // hPID.fill(HIST("After/hTPCnsigPi_mult_pt"), track2.tpcNSigmaPi(), multiplicity, track2.pt()); hPID.fill(HIST("After/hTOFnsigKa_mult_pt"), track1.tofNSigmaKa(), multiplicity, track1.pt()); - // hPID.fill(HIST("After/hTOFnsigPi_mult_pt"), track2.tofNSigmaPi(), multiplicity, track2.pt()); } if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) {