@@ -647,65 +647,71 @@ struct HfCorrelatorXicHadrons {
647647 }
648648
649649 template <typename Tracktype, typename V0Type>
650- bool isSelectedV0Daughter (Tracktype const & track, V0Type v0, int pid)
650+ bool isSelectedV0Daughter (Tracktype const & track, V0Type const & v0, int pid)
651651 {
652- if (std::abs (track.eta ()) > cfgXicCand .etaTrackMax ) {
652+ if (std::abs (track.eta ()) > cfgCharmCand .etaTrackMax ) {
653653 return false ;
654654 }
655+
655656 // ---------------------------------------------------------
656657 // 1. Proton PID Selection
657658 // ---------------------------------------------------------
658659 if (std::abs (pid) == kProton ) {
660+ bool hasTOFProton = (pid > 0 ) ? v0.positiveHasTOF () : v0.negativeHasTOF ();
659661 bool passTOF = false ;
660662
661- if (track.pt () > cfgV0.cfgDaughPrPtMax || track.pt () < cfgV0.cfgDaughPrPtMin ) {
663+ if (track.pt () > cfgV0.cfgV0DaughPrPtMax || track.pt () < cfgV0.cfgV0DaughPrPtMin ) {
662664 return false ;
663665 }
664- if (track.hasTOF ()) {
666+
667+ if (hasTOFProton && (track.pt () > cfgCharmCand.tofPIDThreshold )) {
665668 if constexpr (std::experimental::is_detected<HasStrangeTOFinV0, V0Type>::value) {
666669 // pid > 0: Proton from Lambda (LaPr)
667670 // pid < 0: Antiproton from Anti-Lambda (ALaPr)
668671 double strangeTOF = (pid > 0 ) ? v0.tofNSigmaLaPr () : v0.tofNSigmaALaPr ();
669- passTOF = std::abs (strangeTOF) > cfgV0.cfgDaughPIDCutsTOFPr ;
672+ passTOF = strangeTOF > cfgV0.cfgV0DaughPIDCutsTOFPr ;
673+
670674 } else {
671675 // if strange TOF is unavailable
672- passTOF = std::abs ( track.tofNSigmaPr ()) > cfgV0.cfgDaughPIDCutsTOFPr ;
676+ passTOF = track.tofNSigmaPr () > cfgV0.cfgV0DaughPIDCutsTOFPr ;
673677 }
678+
674679 }
675680
676- if ((std::abs (track.tpcNSigmaPr ()) > cfgV0.cfgDaughPIDCutsTPCPr ) || passTOF) {
681+ if ((std::abs (track.tpcNSigmaPr ()) > cfgV0.cfgV0DaughPIDCutsTPCPr ) && ! passTOF) {
677682 return false ;
678683 }
679684 }
680685
681686 // ---------------------------------------------------------
682687 // 2. Pion PID Selection
683688 // ---------------------------------------------------------
684- if (std::abs (pid) == kPiPlus ) {
689+ if (std::abs (pid) == kPiPlus && cfgV0.checkTOFForPion ) {
690+ bool hasTOFPion = (pid < 0 ) ? v0.negativeHasTOF () : v0.positiveHasTOF ();
685691 bool passTOF = false ;
686692
687- if (track.pt () > cfgV0.cfgDaughPiPtMax || track.pt () < cfgV0.cfgDaughPiPtMin ) {
693+ if (track.pt () > cfgV0.cfgV0DaughPiPtMax || track.pt () < cfgV0.cfgV0DaughPiPtMin ) {
688694 return false ;
689695 }
690696
691- if (track.hasTOF ( )) {
697+ if (hasTOFPion && ( track.pt () > cfgCharmCand. tofPIDThreshold )) {
692698 if constexpr (std::experimental::is_detected<HasStrangeTOFinV0, V0Type>::value) {
693699 // A pion can belong to either a Lambda/Anti-Lambda decay or a K0s decay.
694700 // We evaluate both applicable hypotheses based on charge sign and pick the best match.
695701 double tofLa = (pid > 0 ) ? v0.tofNSigmaALaPi () : v0.tofNSigmaLaPi ();
696702
697- passTOF = tofLa > cfgV0.cfgDaughPIDCutsTOFPi ;
703+ passTOF = std::abs ( tofLa) > cfgV0.cfgV0DaughPIDCutsTOFPi ;
698704 } else {
699705 // Fallback to standard track TOF
700- passTOF = std::abs (track.tofNSigmaPi ()) > cfgV0.cfgDaughPIDCutsTOFPi ;
706+ passTOF = std::abs (track.tofNSigmaPi ()) > cfgV0.cfgV0DaughPIDCutsTOFPi ;
701707 }
708+
702709 }
703710
704- if ((std::abs (track.tpcNSigmaPi ()) > cfgV0.cfgDaughPIDCutsTPCPi ) || passTOF) {
711+ if ((std::abs (track.tpcNSigmaPi ()) > cfgV0.cfgV0DaughPIDCutsTPCPi ) && ! passTOF) {
705712 return false ;
706713 }
707714 }
708-
709715 return true ;
710716 }
711717
@@ -730,7 +736,7 @@ struct HfCorrelatorXicHadrons {
730736 }
731737
732738 // Process Lambda (proton + pion)
733- if (passV0Sel && std::abs (o2::constants::physics::MassLambda - v0.mLambda ()) < cfgV0.cfgHypMassWindow ) {
739+ if (passV0Sel && std::abs (o2::constants::physics::MassLambda - v0.mLambda ()) < cfgV0.cfgHypMassWindow && v0. alpha () > 0 ) {
734740 entryHadron (v0.mLambda (), trackV0Pos.eta (), trackV0Pos.pt () * trackV0Pos.sign (), 0 , 0 , v0.pt ());
735741 entryTrkPID (trackV0Pos.tpcNSigmaPr (), trackV0Pos.tpcNSigmaKa (), trackV0Pos.tpcNSigmaPi (), trackV0Pos.tofNSigmaPr (), trackV0Pos.tofNSigmaKa (), trackV0Pos.tofNSigmaPi ());
736742
@@ -754,7 +760,7 @@ struct HfCorrelatorXicHadrons {
754760 }
755761 }
756762
757- if (passV0Sel && std::abs (o2::constants::physics::MassLambda - v0.mAntiLambda ()) < cfgV0.cfgHypMassWindow ) {
763+ if (passV0Sel && std::abs (o2::constants::physics::MassLambda - v0.mAntiLambda ()) < cfgV0.cfgHypMassWindow && v0. alpha () < 0 ) {
758764 entryHadron (v0.mAntiLambda (), trackV0Neg.eta (), trackV0Neg.pt () * trackV0Neg.sign (), 0 , 0 , v0.pt ());
759765 entryTrkPID (trackV0Neg.tpcNSigmaPr (), trackV0Neg.tpcNSigmaKa (), trackV0Neg.tpcNSigmaPi (), trackV0Neg.tofNSigmaPr (), trackV0Neg.tofNSigmaKa (), trackV0Neg.tofNSigmaPi ());
760766
@@ -787,7 +793,7 @@ struct HfCorrelatorXicHadrons {
787793 auto const & partV0Pos = trackV0Pos.mcParticle ();
788794 auto const & partV0Neg = trackV0Neg.mcParticle ();
789795
790- if (passV0Sel && v0Mc.pdgCode () == kLambda0 ) {
796+ if (passV0Sel && v0Mc.pdgCode () == kLambda0 && v0. alpha () > 0 ) {
791797 if (isSelectedV0Daughter (trackV0Pos, v0, kProton ) && isSelectedV0Daughter (trackV0Neg, v0, kPiMinus )) {
792798 registry.fill (HIST (" hV0LambdaMcRec" ), v0.mLambda (), v0.pt (), partV0Pos.pt ());
793799 registry.fill (HIST (" hV0LambdaReflMcRec" ), v0.mAntiLambda (), v0.pt (), partV0Neg.pt ());
@@ -802,7 +808,7 @@ struct HfCorrelatorXicHadrons {
802808 }
803809 }
804810 }
805- if (passV0Sel && v0Mc.pdgCode () == kLambda0Bar ) {
811+ if (passV0Sel && v0Mc.pdgCode () == kLambda0Bar && v0. alpha () < 0 ) {
806812 if (isSelectedV0Daughter (trackV0Neg, v0, kProtonBar ) && isSelectedV0Daughter (trackV0Pos, v0, kPiPlus )) {
807813 registry.fill (HIST (" hV0LambdaMcRec" ), v0.mAntiLambda (), v0.pt (), partV0Neg.pt ());
808814 registry.fill (HIST (" hV0LambdaReflMcRec" ), v0.mLambda (), v0.pt (), partV0Pos.pt ());
@@ -1032,7 +1038,7 @@ struct HfCorrelatorXicHadrons {
10321038 }
10331039
10341040 // Process Lambda (proton-pion)
1035- if (std::abs (o2::constants::physics::MassLambda - v0.mLambda ()) < cfgV0.cfgHypMassWindow ) {
1041+ if (std::abs (o2::constants::physics::MassLambda - v0.mLambda ()) < cfgV0.cfgHypMassWindow && v0. alpha () > 0 ) {
10361042 if (isSelectedV0Daughter (trackV0Pos, v0, kProton ) && isSelectedV0Daughter (trackV0Neg, v0, kPiMinus )) {
10371043
10381044 if (selXicCand) {
@@ -1050,7 +1056,7 @@ struct HfCorrelatorXicHadrons {
10501056 }
10511057
10521058 // Process anti-Lambda (anti-proton-pion)
1053- if (std::abs (o2::constants::physics::MassLambda - v0.mAntiLambda ()) < cfgV0.cfgHypMassWindow ) {
1059+ if (std::abs (o2::constants::physics::MassLambda - v0.mAntiLambda ()) < cfgV0.cfgHypMassWindow && v0. alpha () < 0 ) {
10541060 if (isSelectedV0Daughter (trackV0Neg, v0, kProtonBar ) && isSelectedV0Daughter (trackV0Pos, v0, kPiPlus )) {
10551061
10561062 if (selXicCand) {
@@ -1484,14 +1490,14 @@ struct HfCorrelatorXicHadrons {
14841490 auto const & trackV0Pos = assocParticle.template posTrack_as <TrackType>();
14851491 auto const & trackV0Neg = assocParticle.template negTrack_as <TrackType>();
14861492
1487- if (std::abs (o2::constants::physics::MassLambda - assocParticle.mLambda ()) < cfgV0.cfgHypMassWindow ) {
1493+ if (std::abs (o2::constants::physics::MassLambda - assocParticle.mLambda ()) < cfgV0.cfgHypMassWindow && v0. alpha () > 0 ) {
14881494 if (isSelectedV0Daughter (trackV0Pos, assocParticle, kProton ) && isSelectedV0Daughter (trackV0Neg, assocParticle, kPiPlus )) {
14891495
14901496 fillCorrelationTable<IsMcRec, V0LambdaType::Lambda>(cfgXicCand.fillTrkPID , assocParticle, ptCand, etaCand, phiCand, outputMlXic, poolBin, correlationStatus, yCand, massCand, *mcParticles);
14911497 }
14921498 }
14931499
1494- if (std::abs (o2::constants::physics::MassLambda - assocParticle.mAntiLambda ()) < cfgV0.cfgHypMassWindow ) {
1500+ if (std::abs (o2::constants::physics::MassLambda - assocParticle.mAntiLambda ()) < cfgV0.cfgHypMassWindow && v0. alpha () < 0 ) {
14951501 if (isSelectedV0Daughter (trackV0Neg, assocParticle, -kProton ) && isSelectedV0Daughter (trackV0Pos, assocParticle, -kPiPlus )) {
14961502 fillCorrelationTable<IsMcRec, V0LambdaType::AntiLambda>(cfgXicCand.fillTrkPID , assocParticle, ptCand, etaCand, phiCand, outputMlXic, poolBin, correlationStatus, yCand, massCand, *mcParticles);
14971503 }
0 commit comments