@@ -43,12 +43,22 @@ struct ThreeParticleCorrelations {
4343 float trackPtMin = 0.2 , trackPtMax = 3.0 ;
4444 float trackEtaMax = 0.8 ;
4545
46+ // Track PID parameters
4647 double pionID = 0.0 , kaonID = 1.0 , protonID = 2.0 ;
47- float nSigma0 = 0.0 , nSigma2 = 2.0 , nSigma4 = 4.0 ;
48-
48+ float nSigma0 = 0.0 , nSigma2 = 2.0 , nSigma4 = 4.0 , nSigma5 = 5.0 ;
49+
50+ // V0 filter parameters
51+ float tpcNCrossedRowsMin = 70.0 ;
52+ float decayRMin = 1.2 , ctauMax = 30.0 ;
53+ float cosPAMin = 0.995 ;
54+ float dcaProtonMin = 0.05 , dcaPionMin = 0.2 ;
55+ int dcaV0DauMax = 1 ;
56+
57+ // Track filter parameters
4958 float pionPtMin = 0.3 , pionPtMax = 2.3 , kaonPtMin = 0.5 , kaonPtMax = 2.5 , protonPtMin = 0.5 , protonPtMax = 2.5 ;
5059 float pionPtMid = 1.5 , kaonPtMid1 = 1.5 , kaonPtMid2 = 2.0 , protonPtMid = 0.7 ;
5160
61+ // RD filter parameters
5262 float dEtaMax = 0.05 , dEtaMin = 0.022 ;
5363 float dPhiStarMinOS = 0.075 , dPhiStarMinSS = 0.12 ;
5464 float rMin = 0.8 , rMax = 2.5 ;
@@ -64,13 +74,13 @@ struct ThreeParticleCorrelations {
6474 HistogramRegistry rQARegistry{" QARegistry" , {}, OutputObjHandlingPolicy::AnalysisObject, false , true };
6575
6676 // Collision & Event filters
67- Filter collCent = aod::cent::centFT0C > centMin&& aod::cent::centFT0C < centMax;
77+ Filter collCent = aod::cent::centFT0C > centMin && aod::cent::centFT0C < centMax;
6878 Filter collZvtx = nabs(aod::collision::posZ) < zvtxMax;
6979 Filter mcCollZvtx = nabs(aod::mccollision::posZ) < zvtxMax;
7080 Filter evSelect = aod::evsel::sel8 == true ;
7181
7282 // Track filters
73- Filter trackPt = aod::track::pt > trackPtMin&& aod::track::pt < trackPtMax;
83+ Filter trackPt = aod::track::pt > trackPtMin && aod::track::pt < trackPtMax;
7484 Filter trackEta = nabs(aod::track::eta) < trackEtaMax;
7585 Filter globalTracks = requireGlobalTrackInFilter();
7686
@@ -98,8 +108,8 @@ struct ThreeParticleCorrelations {
98108 aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr, aod::pidTOFbeta>>;
99109
100110 // Partitions
101- Partition<MyFilteredMCParticles> mcTracks = aod::mcparticle::pt > trackPtMin&& aod::mcparticle::pt < trackPtMax;
102- Partition<MyFilteredMCParticles> mcV0s = aod::mcparticle::pt > v0PtMin&& aod::mcparticle::pt < v0PtMax&& nabs(aod::mcparticle::eta) < v0EtaMax;
111+ Partition<MyFilteredMCParticles> mcTracks = aod::mcparticle::pt > trackPtMin && aod::mcparticle::pt < trackPtMax;
112+ Partition<MyFilteredMCParticles> mcV0s = aod::mcparticle::pt > v0PtMin && aod::mcparticle::pt < v0PtMax && nabs(aod::mcparticle::eta) < v0EtaMax;
103113 Partition<MyFilteredMCParticles> mcTriggers = ((aod::mcparticle::pdgCode == static_cast <int >(kLambda0 ) || aod::mcparticle::pdgCode == static_cast <int >(kLambda0Bar )) &&
104114 aod::mcparticle::pt > v0PtMin && aod::mcparticle::pt < v0PtMax && nabs(aod::mcparticle::eta) < v0EtaMax);
105115 Partition<MyFilteredMCParticles> mcAssociates = (((aod::mcparticle::pdgCode == static_cast <int >(kPiPlus ) || aod::mcparticle::pdgCode == static_cast <int >(kPiMinus )) && aod::mcparticle::pt > pionPtMin && aod::mcparticle::pt < pionPtMax) ||
@@ -156,8 +166,8 @@ struct ThreeParticleCorrelations {
156166 // QA & PID
157167 rQARegistry.add (" hNEvents" , " hNEvents" , {HistType::kTH1D , {{3 , 0 , 3 }}});
158168 rQARegistry.get <TH1>(HIST (" hNEvents" ))->GetXaxis ()->SetBinLabel (1 , " All" );
159- rQARegistry.get <TH1>(HIST (" hNEvents" ))->GetXaxis ()->SetBinLabel (2 , " kNoSameBunchPileup " );
160- rQARegistry.get <TH1>(HIST (" hNEvents" ))->GetXaxis ()->SetBinLabel (3 , " kIsGoodZvtxFT0vsPV " );
169+ rQARegistry.get <TH1>(HIST (" hNEvents" ))->GetXaxis ()->SetBinLabel (2 , " kIsGoodZvtxFT0vsPV " );
170+ rQARegistry.get <TH1>(HIST (" hNEvents" ))->GetXaxis ()->SetBinLabel (3 , " kNoSameBunchPileup " );
161171
162172 rQARegistry.add (" hEventCentrality" , " hEventCentrality" , {HistType::kTH1D , {{centralityAxis}}});
163173 rQARegistry.add (" hEventCentrality_MC" , " hEventCentrality_MC" , {HistType::kTH1D , {{centralityAxis}}});
@@ -366,7 +376,7 @@ struct ThreeParticleCorrelations {
366376
367377 // Start of the Same-Event correlations
368378 for (const auto & trigger : v0s) {
369- if (v0Filters (trigger, false )) {
379+ if (v0Filters (collision, trigger, tracks )) {
370380
371381 rQARegistry.fill (HIST (" hPtV0" ), trigger.pt (), collision.centFT0C ());
372382 triggSign = v0Sign (trigger);
@@ -429,7 +439,7 @@ struct ThreeParticleCorrelations {
429439 // End of the Same-Event correlations
430440 }
431441
432- void processMixed (MyFilteredCollisions const &, aod::V0Datas const &, MyFilteredTracks const &, aod::BCsWithTimestamps const &)
442+ void processMixed (MyFilteredCollisions const &, aod::V0Datas const &, MyFilteredTracks const & tracks , aod::BCsWithTimestamps const &)
433443 {
434444
435445 // Start of the Mixed-Event correlations
@@ -441,7 +451,7 @@ struct ThreeParticleCorrelations {
441451 auto bc = coll_1.bc_as <aod::BCsWithTimestamps>();
442452 auto bField = getMagneticField (bc.timestamp ());
443453 for (const auto & [trigger, associate] : soa::combinations (soa::CombinationsFullIndexPolicy (v0_1, track_2))) {
444- if (v0Filters (trigger, false ) && trackFilters (associate)) {
454+ if (v0Filters (coll_1, trigger, tracks ) && trackFilters (associate)) {
445455 if (radialDistanceFilter (trigger, associate, bField, true ) && fakeV0Filter (trigger, associate)) {
446456
447457 triggSign = v0Sign (trigger);
@@ -758,7 +768,7 @@ struct ThreeParticleCorrelations {
758768
759769 for (const auto & v0 : v0s) {
760770
761- if (!v0.has_mcParticle () || v0.pt () < v0PtMin || v0.pt () > v0PtMax || std::abs (v0.eta ()) > v0EtaMax) {
771+ if (!v0.has_mcParticle () || v0.pt () <= v0PtMin || v0.pt () >= v0PtMax || std::abs (v0.eta ()) >= v0EtaMax) {
762772 continue ;
763773 }
764774 auto particle = v0.mcParticle ();
@@ -772,7 +782,7 @@ struct ThreeParticleCorrelations {
772782 rMCRegistry.fill (HIST (" hRecLambdaN" ), v0.pt (), v0.eta (), collision.centFT0C ());
773783 }
774784
775- if (v0Filters (v0, true )) {
785+ if (v0Filters (collision, v0, tracks )) {
776786
777787 // V0 efficiency - Reconstructed
778788 if (v0Sign (v0) == 1 ) { // Lambdas
@@ -887,150 +897,164 @@ struct ThreeParticleCorrelations {
887897
888898 // ==========================================================================================================================================================================================================================================================================
889899
890- template <class CollCand >
891- bool acceptEvent (const CollCand& collision , bool FillHist) // Event filter
900+ template <class Col >
901+ bool acceptEvent (const Col& col , bool FillHist) // Event filter
892902 {
893903
894904 if (FillHist) {
895905 rQARegistry.fill (HIST (" hNEvents" ), 0.5 );
896906 }
897907
898- if (!collision .selection_bit (aod::evsel::kNoSameBunchPileup )) { // kNoSameBunchPileup
899- return kFALSE ;
908+ if (!col .selection_bit (aod::evsel::kIsGoodZvtxFT0vsPV )) { // kIsGoodZvtxFT0vsPV
909+ return false ;
900910 }
901911 if (FillHist) {
902912 rQARegistry.fill (HIST (" hNEvents" ), 1.5 );
903913 }
904914
905- if (!collision .selection_bit (aod::evsel::kIsGoodZvtxFT0vsPV )) { // kIsGoodZvtxFT0vsPV
906- return kFALSE ;
915+ if (!col .selection_bit (aod::evsel::kNoSameBunchPileup )) { // kNoSameBunchPileup
916+ return false ;
907917 }
908918 if (FillHist) {
909919 rQARegistry.fill (HIST (" hNEvents" ), 2.5 );
910920 }
911-
912- return kTRUE ;
921+
922+ return true ;
913923 }
914924
915- template <class V0Cand >
916- bool v0Filters (const V0Cand& v0, bool MCRec ) // V0 filter
925+ template <class Col , class V0Cand , typename T >
926+ bool v0Filters (const Col& col, const V0Cand& v0, T const & ) // V0 filter
917927 {
928+
929+ // Kinematic cuts
930+ if (v0.pt () <= v0PtMin || v0.pt () >= v0PtMax || std::abs (v0.eta ()) >= v0EtaMax) {
931+ return false ;
932+ }
918933
919- if (v0.pt () < v0PtMin || v0.pt () > v0PtMax)
920- return kFALSE ;
921- if (std::abs (v0.eta ()) > v0EtaMax)
922- return kFALSE ;
923-
924- if (!MCRec) { // Data
925- if (v0Sign (v0) == 1 ) {
926- const auto & posDaughter = v0.template posTrack_as <MyFilteredTracks>();
927- if (std::abs (posDaughter.tpcNSigmaPr ()) > nSigma4) {
928- return kFALSE ;
929- }
930- } else if (v0Sign (v0) == -1 ) {
931- const auto & negDaughter = v0.template negTrack_as <MyFilteredTracks>();
932- if (std::abs (negDaughter.tpcNSigmaPr ()) > nSigma4) {
933- return kFALSE ;
934- }
934+ // Daughter cuts
935+ auto posDaughter = v0.template posTrack_as <T>();
936+ auto negDaughter = v0.template negTrack_as <T>();
937+ if (std::abs (posDaughter.eta ()) >= trackEtaMax || std::abs (negDaughter.eta ()) >= trackEtaMax) {
938+ return false ;
939+ }
940+ if (posDaughter.tpcNClsCrossedRows () <= tpcNCrossedRowsMin || negDaughter.tpcNClsCrossedRows () <= tpcNCrossedRowsMin) {
941+ return false ;
942+ }
943+ if (v0Sign (v0) == 1 ) {
944+ if (std::abs (posDaughter.tpcNSigmaPr ()) >= nSigma5 || std::abs (negDaughter.tpcNSigmaPi ()) >= nSigma5) {
945+ return false ;
935946 }
936- } else { // MC Reconstructed
937- if (v0Sign (v0) == 1 ) {
938- const auto & posDaughter = v0.template posTrack_as <MyFilteredMCTracks>();
939- if (std::abs (posDaughter.tpcNSigmaPr ()) > nSigma4) {
940- return kFALSE ;
941- }
942- } else if (v0Sign (v0) == -1 ) {
943- const auto & negDaughter = v0.template negTrack_as <MyFilteredMCTracks>();
944- if (std::abs (negDaughter.tpcNSigmaPr ()) > nSigma4) {
945- return kFALSE ;
946- }
947+ if (std::abs (v0.dcapostopv ()) <= dcaProtonMin || std::abs (v0.dcanegtopv ()) <= dcaPionMin) {
948+ return false ;
949+ }
950+ } else if (v0Sign (v0) == -1 ) {
951+ if (std::abs (posDaughter.tpcNSigmaPi ()) >= nSigma5 || std::abs (negDaughter.tpcNSigmaPr ()) >= nSigma5) {
952+ return false ;
947953 }
954+ if (std::abs (v0.dcapostopv ()) <= dcaPionMin || std::abs (v0.dcanegtopv ()) <= dcaProtonMin) {
955+ return false ;
956+ }
957+ }
958+
959+ // Topological cuts
960+ float ctau = v0.distovertotmom (col.posX (), col.posY (), col.posZ ()) * MassLambda0;
961+ if (v0.v0radius () <= decayRMin) {
962+ return false ;
963+ }
964+ if (ctau >= ctauMax) {
965+ return false ;
966+ }
967+ if (v0.v0cosPA () <= cosPAMin) {
968+ return false ;
969+ }
970+ if (v0.dcaV0daughters () >= dcaV0DauMax) {
971+ return false ;
948972 }
949973
950- return kTRUE ;
974+ return true ;
951975 }
952976
953977 template <class TrackCand >
954978 bool trackFilters (const TrackCand& track) // Track filter
955979 {
956980
957981 if (!track.hasTOF ()) {
958- return kFALSE ;
982+ return false ;
959983 }
960984
961985 if (trackPID (track)[0 ] == pionID) { // Pions
962- if (std::abs (track.tpcNSigmaPi ()) > nSigma4) {
963- return kFALSE ;
986+ if (std::abs (track.tpcNSigmaPi ()) >= nSigma4) {
987+ return false ;
964988 }
965989 if (track.pt () < pionPtMin) {
966- return kFALSE ;
990+ return false ;
967991 } else if (track.pt () > pionPtMin && track.pt () < pionPtMid) {
968- if (std::abs (track.tofNSigmaPi ()) > nSigma4) {
969- return kFALSE ;
992+ if (std::abs (track.tofNSigmaPi ()) >= nSigma4) {
993+ return false ;
970994 }
971995 } else if (track.pt () > pionPtMid && track.pt () < pionPtMax) {
972- if (track.tofNSigmaPi () < -nSigma4 || track.tofNSigmaPi () > nSigma0) {
973- return kFALSE ;
996+ if (track.tofNSigmaPi () <= -nSigma4 || track.tofNSigmaPi () >= nSigma0) {
997+ return false ;
974998 }
975999 } else if (track.pt () > pionPtMax) {
976- return kFALSE ;
1000+ return false ;
9771001 }
9781002
9791003 } else if (trackPID (track)[0 ] == kaonID) { // Kaons
980- if (std::abs (track.tpcNSigmaKa ()) > nSigma4) {
981- return kFALSE ;
1004+ if (std::abs (track.tpcNSigmaKa ()) >= nSigma4) {
1005+ return false ;
9821006 }
9831007 if (track.pt () < kaonPtMin) {
984- return kFALSE ;
1008+ return false ;
9851009 } else if (track.pt () > kaonPtMin && track.pt () < kaonPtMid1) {
986- if (std::abs (track.tofNSigmaKa ()) > nSigma4) {
987- return kFALSE ;
1010+ if (std::abs (track.tofNSigmaKa ()) >= nSigma4) {
1011+ return false ;
9881012 }
9891013 } else if (track.pt () > kaonPtMid1 && track.pt () < kaonPtMid2) {
990- if (track.tofNSigmaKa () < -nSigma2 || track.tofNSigmaKa () > nSigma4) {
991- return kFALSE ;
1014+ if (track.tofNSigmaKa () <= -nSigma2 || track.tofNSigmaKa () >= nSigma4) {
1015+ return false ;
9921016 }
9931017 } else if (track.pt () > kaonPtMid2 && track.pt () < kaonPtMax) {
994- if (track.tofNSigmaKa () < nSigma0 || track.tofNSigmaKa () > nSigma4) {
995- return kFALSE ;
1018+ if (track.tofNSigmaKa () <= nSigma0 || track.tofNSigmaKa () >= nSigma4) {
1019+ return false ;
9961020 }
9971021 } else if (track.pt () > kaonPtMax) {
998- return kFALSE ;
1022+ return false ;
9991023 }
10001024
10011025 } else if (trackPID (track)[0 ] == protonID) { // Protons
1002- if (std::abs (track.tpcNSigmaPr ()) > nSigma4) {
1003- return kFALSE ;
1026+ if (std::abs (track.tpcNSigmaPr ()) >= nSigma4) {
1027+ return false ;
10041028 }
10051029 if (track.pt () < protonPtMin) {
1006- return kFALSE ;
1030+ return false ;
10071031 } else if (track.pt () > protonPtMin && track.pt () < protonPtMid) {
1008- if (track.tofNSigmaPr () < -nSigma2 || track.tofNSigmaPr () > nSigma4) {
1009- return kFALSE ;
1032+ if (track.tofNSigmaPr () <= -nSigma2 || track.tofNSigmaPr () >= nSigma4) {
1033+ return false ;
10101034 }
10111035 } else if (track.pt () > protonPtMid && track.pt () < protonPtMax) {
1012- if (std::abs (track.tofNSigmaPr ()) > nSigma4) {
1013- return kFALSE ;
1036+ if (std::abs (track.tofNSigmaPr ()) >= nSigma4) {
1037+ return false ;
10141038 }
10151039 } else if (track.pt () > protonPtMax) {
1016- if (track.tofNSigmaPr () < -nSigma2 || track.tofNSigmaPr () > nSigma4) {
1017- return kFALSE ;
1040+ if (track.tofNSigmaPr () <= -nSigma2 || track.tofNSigmaPr () >= nSigma4) {
1041+ return false ;
10181042 }
10191043 }
10201044 }
10211045
1022- return kTRUE ;
1046+ return true ;
10231047 }
10241048
10251049 template <class V0Cand , class TrackCand >
10261050 bool correlationFilters (const V0Cand& v0, const TrackCand& track) // Correlation filter
10271051 {
10281052
10291053 if (track.globalIndex () == v0.posTrackId () || track.globalIndex () == v0.negTrackId ()) {
1030- return kFALSE ;
1054+ return false ;
10311055 }
10321056
1033- return kTRUE ;
1057+ return true ;
10341058 }
10351059
10361060 template <class V0Cand , class TrackCand >
@@ -1040,7 +1064,7 @@ struct ThreeParticleCorrelations {
10401064 if (confFakeV0Switch) {
10411065
10421066 if (trackPID (track)[0 ] == kaonID) { // Kaons
1043- return kTRUE ;
1067+ return true ;
10441068 }
10451069
10461070 std::array<float , 2 > massArray;
@@ -1070,11 +1094,11 @@ struct ThreeParticleCorrelations {
10701094
10711095 double invMass = RecoDecay::m (std::array{dMomArray, aMomArray}, massArray);
10721096 if (invMass >= MassLambda0 - 4 * dGaussSigma && invMass <= MassLambda0 + 4 * dGaussSigma) {
1073- return kFALSE ;
1097+ return false ;
10741098 }
10751099 }
10761100
1077- return kTRUE ;
1101+ return true ;
10781102 }
10791103
10801104 template <class V0Cand , class TrackCand >
@@ -1132,13 +1156,13 @@ struct ThreeParticleCorrelations {
11321156 }
11331157 }
11341158
1135- if (std::abs (dEta) < dEtaMin) {
1159+ if (std::abs (dEta) <= dEtaMin) {
11361160 if (proton.sign () * track.sign () == -1 ) { // OS (Electric charge)
1137- if (std::abs (dPhiStar) < dPhiStarMinOS) {
1161+ if (std::abs (dPhiStar) <= dPhiStarMinOS) {
11381162 pass = false ;
11391163 }
11401164 } else if (proton.sign () * track.sign () == 1 ) { // SS (Electric charge)
1141- if (std::abs (dPhiStar) < dPhiStarMinSS) {
1165+ if (std::abs (dPhiStar) <= dPhiStarMinSS) {
11421166 pass = false ;
11431167 }
11441168 }
0 commit comments