@@ -144,6 +144,7 @@ struct HadronNucleiCorrelation {
144144 ConfigurableAxis deltaPhiAxis = {" deltaPhiAxis" , {46 , -1 * o2::constants::math::PIHalf, 3 * o2::constants::math::PIHalf}, " #Delta#phi (rad)" };
145145
146146 using FilteredCollisions = soa::Filtered<aod::SingleCollSels>;
147+ using FilteredCollisionsExtra = soa::Filtered<aod::SingleCollSels, aod::SingleCollExtras>;
147148 using SimCollisions = soa::Filtered<aod::McCollisions>;
148149 using SimParticles = aod::McParticles;
149150 using FilteredTracks = soa::Filtered<soa::Join<aod::SingleTrackSels, aod::SingleTrkExtras, aod::SinglePIDEls, aod::SinglePIDPrs, aod::SinglePIDDes>>; // new tables (v3)
@@ -774,7 +775,198 @@ struct HadronNucleiCorrelation {
774775
775776 for (const auto & track : tracks) {
776777
777- if (removeSameBunchPileup && !track.template singleCollSel_as <soa::Filtered<FilteredCollisions>>().isNoSameBunchPileup ())
778+ if (track.tpcFractionSharedCls () > maxtpcSharedCls)
779+ continue ;
780+ if (track.itsNCls () < minitsNCls)
781+ continue ;
782+
783+ if (IsProton (track, +1 ))
784+ registry.fill (HIST (" hPrDCAxy" ), track.dcaXY (), track.pt ());
785+ if (IsProton (track, -1 ))
786+ registry.fill (HIST (" hAntiPrDCAxy" ), track.dcaXY (), track.pt ());
787+ if (IsDeuteron (track, +1 ))
788+ registry.fill (HIST (" hDeDCAxy" ), track.dcaXY (), track.pt ());
789+ if (IsDeuteron (track, -1 ))
790+ registry.fill (HIST (" hAntiDeDCAxy" ), track.dcaXY (), track.pt ());
791+
792+ if (!applyDCAcut (track))
793+ continue ;
794+
795+ if (doQA) {
796+ QA .fill (HIST (" QA/hTPCnClusters" ), track.tpcNClsFound ());
797+ QA .fill (HIST (" QA/hTPCSharedClusters" ), track.tpcFractionSharedCls ());
798+ QA .fill (HIST (" QA/hTPCchi2" ), track.tpcChi2NCl ());
799+ QA .fill (HIST (" QA/hTPCcrossedRowsOverFindableCls" ), track.tpcCrossedRowsOverFindableCls ());
800+ QA .fill (HIST (" QA/hITSchi2" ), track.itsChi2NCl ());
801+ QA .fill (HIST (" QA/hDCAxy" ), track.dcaXY (), track.pt ());
802+ QA .fill (HIST (" QA/hDCAz" ), track.dcaZ (), track.pt ());
803+ QA .fill (HIST (" QA/TPCChi2VsPZ" ), track.tpcInnerParam () / track.sign (), track.tpcChi2NCl ());
804+ QA .fill (HIST (" QA/hVtxZ_trk" ), collision.posZ ());
805+ QA .fill (HIST (" QA/hnSigmaTPCVsPt_El" ), track.pt () * track.sign (), track.tpcNSigmaEl ());
806+ QA .fill (HIST (" QA/hnSigmaTPCVsPt_Pr" ), track.pt () * track.sign (), track.tpcNSigmaPr ());
807+ QA .fill (HIST (" QA/hnSigmaTPCVsPt_De" ), track.pt () * track.sign (), track.tpcNSigmaDe ());
808+ QA .fill (HIST (" QA/hnSigmaTOFVsPt_Pr" ), track.pt () * track.sign (), track.tofNSigmaPr ());
809+ QA .fill (HIST (" QA/hnSigmaTOFVsPt_De" ), track.pt () * track.sign (), track.tofNSigmaDe ());
810+ QA .fill (HIST (" QA/hnSigmaITSVsPt_Pr" ), track.pt () * track.sign (), track.itsNSigmaPr ());
811+ QA .fill (HIST (" QA/hnSigmaITSVsPt_De" ), track.pt () * track.sign (), track.itsNSigmaDe ());
812+ QA .fill (HIST (" QA/h2dTPCTOF_AntiPr" ), track.tpcNSigmaPr (), track.tofNSigmaPr ());
813+ QA .fill (HIST (" QA/h2dTPCTOF_Pr" ), track.tpcNSigmaPr (), track.tofNSigmaPr ());
814+
815+ if (IsProton (track, -1 )) {
816+ QA .fill (HIST (" QA/hEtaAntiPr" ), track.eta ());
817+ QA .fill (HIST (" QA/hPhiAntiPr" ), track.phi ());
818+ QA .fill (HIST (" QA/hnSigmaTOFVsPt_Pr_AfterSel" ), track.pt () * track.sign (), track.tofNSigmaPr ());
819+ QA .fill (HIST (" QA/hnSigmaTPCVsPt_Pr_AfterSel" ), track.pt () * track.sign (), track.tpcNSigmaPr ());
820+ QA .fill (HIST (" QA/hnSigmaITSVsPt_Pr_AfterSel" ), track.pt () * track.sign (), track.itsNSigmaPr ());
821+ QA .fill (HIST (" QA/h2dTPCTOF_AntiPr_AfterSel" ), track.tpcNSigmaPr (), track.tofNSigmaPr ());
822+ }
823+ if (IsProton (track, +1 )) {
824+ QA .fill (HIST (" QA/hEtaPr" ), track.eta ());
825+ QA .fill (HIST (" QA/hPhiPr" ), track.phi ());
826+ QA .fill (HIST (" QA/hnSigmaTOFVsPt_Pr_AfterSel" ), track.pt () * track.sign (), track.tofNSigmaPr ());
827+ QA .fill (HIST (" QA/hnSigmaTPCVsPt_Pr_AfterSel" ), track.pt () * track.sign (), track.tpcNSigmaPr ());
828+ QA .fill (HIST (" QA/hnSigmaITSVsPt_Pr_AfterSel" ), track.pt () * track.sign (), track.itsNSigmaPr ());
829+ QA .fill (HIST (" QA/h2dTPCTOF_Pr_AfterSel" ), track.tpcNSigmaPr (), track.tofNSigmaPr ());
830+ }
831+ if (IsDeuteron (track, -1 )) {
832+ QA .fill (HIST (" QA/hEtaAntiDe" ), track.eta ());
833+ QA .fill (HIST (" QA/hPhiAntiDe" ), track.phi ());
834+ QA .fill (HIST (" QA/hnSigmaTOFVsPt_De_AfterSel" ), track.pt () * track.sign (), track.tofNSigmaDe ());
835+ QA .fill (HIST (" QA/hnSigmaTPCVsPt_De_AfterSel" ), track.pt () * track.sign (), track.tpcNSigmaDe ());
836+ QA .fill (HIST (" QA/hnSigmaITSVsPt_De_AfterSel" ), track.pt () * track.sign (), track.itsNSigmaDe ());
837+ }
838+ if (IsDeuteron (track, +1 )) {
839+ QA .fill (HIST (" QA/hEtaDe" ), track.eta ());
840+ QA .fill (HIST (" QA/hPhiDe" ), track.phi ());
841+ QA .fill (HIST (" QA/hnSigmaTOFVsPt_De_AfterSel" ), track.pt () * track.sign (), track.tofNSigmaDe ());
842+ QA .fill (HIST (" QA/hnSigmaTPCVsPt_De_AfterSel" ), track.pt () * track.sign (), track.tpcNSigmaDe ());
843+ QA .fill (HIST (" QA/hnSigmaITSVsPt_De_AfterSel" ), track.pt () * track.sign (), track.itsNSigmaDe ());
844+ }
845+ }
846+ }
847+
848+ Pair->SetMagField1 (collision.magField ());
849+ Pair->SetMagField2 (collision.magField ());
850+
851+ if (mode == kPbarPbar || mode == kPP ) { // Identical particle combinations
852+
853+ for (const auto & [part0, part1] : combinations (CombinationsStrictlyUpperIndexPolicy (tracks, tracks))) {
854+
855+ if (part0.tpcFractionSharedCls () > maxtpcSharedCls)
856+ continue ;
857+ if (part0.itsNCls () < minitsNCls)
858+ continue ;
859+ if (part1.tpcFractionSharedCls () > maxtpcSharedCls)
860+ continue ;
861+ if (part1.itsNCls () < minitsNCls)
862+ continue ;
863+
864+ if (!applyDCAcut (part0))
865+ continue ;
866+ if (!applyDCAcut (part1))
867+ continue ;
868+
869+ // remove tracks outside pt bins
870+ if (part0.pt () < pTBins.value .at (0 ) || part0.pt () >= pTBins.value .at (nBinspT))
871+ continue ;
872+ if (part1.pt () < pTBins.value .at (0 ) || part1.pt () >= pTBins.value .at (nBinspT))
873+ continue ;
874+
875+ // mode 6
876+ if (mode == kPP ) {
877+ if (!IsProton (part0, +1 ))
878+ continue ;
879+ if (!IsProton (part1, +1 ))
880+ continue ;
881+ }
882+ // mode 5
883+ if (mode == kPbarPbar ) {
884+ if (!IsProton (part0, -1 ))
885+ continue ;
886+ if (!IsProton (part1, -1 ))
887+ continue ;
888+ }
889+
890+ fillHistograms (part0, part1, false , true );
891+ }
892+
893+ } else {
894+
895+ for (const auto & [part0, part1] : combinations (CombinationsFullIndexPolicy (tracks, tracks))) {
896+
897+ if (part0.tpcFractionSharedCls () > maxtpcSharedCls)
898+ continue ;
899+ if (part0.itsNCls () < minitsNCls)
900+ continue ;
901+ if (part1.tpcFractionSharedCls () > maxtpcSharedCls)
902+ continue ;
903+ if (part1.itsNCls () < minitsNCls)
904+ continue ;
905+
906+ if (!applyDCAcut (part0))
907+ continue ;
908+ if (!applyDCAcut (part1))
909+ continue ;
910+
911+ // remove tracks outside pt bins
912+ if (part0.pt () < pTBins.value .at (0 ) || part0.pt () >= pTBins.value .at (nBinspT))
913+ continue ;
914+ if (part1.pt () < pTBins.value .at (0 ) || part1.pt () >= pTBins.value .at (nBinspT))
915+ continue ;
916+
917+ // modes 0,1,2,3,4,7
918+ if (mode == kDbarPbar ) {
919+ if (!IsDeuteron (part0, -1 ))
920+ continue ;
921+ if (!IsProton (part1, -1 ))
922+ continue ;
923+ }
924+ if (mode == kDP ) {
925+ if (!IsDeuteron (part0, +1 ))
926+ continue ;
927+ if (!IsProton (part1, +1 ))
928+ continue ;
929+ }
930+ if (mode == kDbarP ) {
931+ if (!IsDeuteron (part0, -1 ))
932+ continue ;
933+ if (!IsProton (part1, +1 ))
934+ continue ;
935+ }
936+ if (mode == kDPbar ) {
937+ if (!IsDeuteron (part0, +1 ))
938+ continue ;
939+ if (!IsProton (part1, -1 ))
940+ continue ;
941+ }
942+ if (mode == kPbarP ) {
943+ if (!IsProton (part0, -1 ))
944+ continue ;
945+ if (!IsProton (part1, +1 ))
946+ continue ;
947+ }
948+ if (mode == kPPbar ) {
949+ if (!IsProton (part0, +1 ))
950+ continue ;
951+ if (!IsProton (part1, -1 ))
952+ continue ;
953+ }
954+
955+ fillHistograms (part0, part1, false , false );
956+ }
957+ }
958+ }
959+ PROCESS_SWITCH (HadronNucleiCorrelation, processSameEvent, " processSameEvent" , true );
960+
961+ void processSameEventEvSel (FilteredCollisionsExtra::iterator const & collision, FilteredTracks const & tracks)
962+ {
963+
964+ registry.fill (HIST (" hNEvents" ), 0.5 );
965+ registry.fill (HIST (" hMult" ), collision.mult ());
966+
967+ for (const auto & track : tracks) {
968+
969+ if (removeSameBunchPileup && !track.template singleCollSel_as <soa::Filtered<FilteredCollisionsExtra>>().isNoSameBunchPileup ())
778970 continue ;
779971
780972 if (track.tpcFractionSharedCls () > maxtpcSharedCls)
@@ -854,7 +1046,7 @@ struct HadronNucleiCorrelation {
8541046
8551047 for (const auto & [part0, part1] : combinations (CombinationsStrictlyUpperIndexPolicy (tracks, tracks))) {
8561048
857- if (removeSameBunchPileup && !part0.template singleCollSel_as <soa::Filtered<FilteredCollisions >>().isNoSameBunchPileup ())
1049+ if (removeSameBunchPileup && !part0.template singleCollSel_as <soa::Filtered<FilteredCollisionsExtra >>().isNoSameBunchPileup ())
8581050 continue ;
8591051
8601052 if (part0.tpcFractionSharedCls () > maxtpcSharedCls)
@@ -899,7 +1091,7 @@ struct HadronNucleiCorrelation {
8991091
9001092 for (const auto & [part0, part1] : combinations (CombinationsFullIndexPolicy (tracks, tracks))) {
9011093
902- if (removeSameBunchPileup && !part0.template singleCollSel_as <soa::Filtered<FilteredCollisions >>().isNoSameBunchPileup ())
1094+ if (removeSameBunchPileup && !part0.template singleCollSel_as <soa::Filtered<FilteredCollisionsExtra >>().isNoSameBunchPileup ())
9031095 continue ;
9041096
9051097 if (part0.tpcFractionSharedCls () > maxtpcSharedCls)
@@ -964,7 +1156,7 @@ struct HadronNucleiCorrelation {
9641156 }
9651157 }
9661158 }
967- PROCESS_SWITCH (HadronNucleiCorrelation, processSameEvent , " processSameEvent " , true );
1159+ PROCESS_SWITCH (HadronNucleiCorrelation, processSameEventEvSel , " processSameEventEvSel " , false );
9681160
9691161 void processMixedEvent (FilteredCollisions const & collisions, FilteredTracks const & tracks)
9701162 {
@@ -988,9 +1180,113 @@ struct HadronNucleiCorrelation {
9881180
9891181 for (const auto & [part0, part1] : combinations (CombinationsFullIndexPolicy (groupPartsOne, groupPartsTwo))) {
9901182
991- if (removeSameBunchPileup && !part0.template singleCollSel_as <soa::Filtered<FilteredCollisions>>().isNoSameBunchPileup ())
1183+ if (part0.tpcFractionSharedCls () > maxtpcSharedCls)
1184+ continue ;
1185+ if (part0.itsNCls () < minitsNCls)
1186+ continue ;
1187+ if (part1.tpcFractionSharedCls () > maxtpcSharedCls)
1188+ continue ;
1189+ if (part1.itsNCls () < minitsNCls)
1190+ continue ;
1191+
1192+ if (!applyDCAcut (part0))
1193+ continue ;
1194+ if (!applyDCAcut (part1))
1195+ continue ;
1196+
1197+ // remove tracks outside pt bins
1198+ if (part0.pt () < pTBins.value .at (0 ) || part0.pt () >= pTBins.value .at (nBinspT))
1199+ continue ;
1200+ if (part1.pt () < pTBins.value .at (0 ) || part1.pt () >= pTBins.value .at (nBinspT))
1201+ continue ;
1202+
1203+ // {"mode", 0, "0: antid-antip, 1: d-p, 2: antid-p, 3: d-antip, 4: antip-p, 5: antip-antip, 6: p-p, 7: p-antip"};
1204+ if (mode == kDbarPbar ) {
1205+ if (!IsDeuteron (part0, -1 ))
1206+ continue ;
1207+ if (!IsProton (part1, -1 ))
1208+ continue ;
1209+ }
1210+ if (mode == kDP ) {
1211+ if (!IsDeuteron (part0, +1 ))
1212+ continue ;
1213+ if (!IsProton (part1, +1 ))
1214+ continue ;
1215+ }
1216+ if (mode == kDbarP ) {
1217+ if (!IsDeuteron (part0, -1 ))
1218+ continue ;
1219+ if (!IsProton (part1, +1 ))
1220+ continue ;
1221+ }
1222+ if (mode == kDPbar ) {
1223+ if (!IsDeuteron (part0, +1 ))
1224+ continue ;
1225+ if (!IsProton (part1, -1 ))
1226+ continue ;
1227+ }
1228+ if (mode == kPbarP ) {
1229+ if (!IsProton (part0, -1 ))
1230+ continue ;
1231+ if (!IsProton (part1, +1 ))
1232+ continue ;
1233+ }
1234+ if (mode == kPbarPbar ) {
1235+ if (!IsProton (part0, -1 ))
1236+ continue ;
1237+ if (!IsProton (part1, -1 ))
1238+ continue ;
1239+ }
1240+ if (mode == kPP ) {
1241+ if (!IsProton (part0, +1 ))
1242+ continue ;
1243+ if (!IsProton (part1, +1 ))
1244+ continue ;
1245+ }
1246+ if (mode == kPPbar ) {
1247+ if (!IsProton (part0, +1 ))
1248+ continue ;
1249+ if (!IsProton (part1, -1 ))
1250+ continue ;
1251+ }
1252+
1253+ bool isIdentical = false ;
1254+ if (mode == kPbarPbar || mode == kPP )
1255+ isIdentical = true ;
1256+
1257+ fillHistograms (part0, part1, true , isIdentical);
1258+ }
1259+ }
1260+ }
1261+ PROCESS_SWITCH (HadronNucleiCorrelation, processMixedEvent, " processMixedEvent" , true );
1262+
1263+ void processMixedEventEvSel (FilteredCollisionsExtra const & collisions, FilteredTracks const & tracks)
1264+ {
1265+
1266+ for (const auto & [collision1, collision2] : soa::selfCombinations (colBinning, 5 , -1 , collisions, collisions)) {
1267+
1268+ // LOGF(info, "Mixed event collisions: (%d, %d) zvtx (%.1f, %.1f) mult (%d, %d)", collision1.globalIndex(), collision2.globalIndex(), collision1.posZ(), collision2.posZ(), collision1.mult(), collision2.mult());
1269+
1270+ auto groupPartsOne = tracks.sliceByCached (o2::aod::singletrackselector::singleCollSelId, collision1.globalIndex (), cache);
1271+ auto groupPartsTwo = tracks.sliceByCached (o2::aod::singletrackselector::singleCollSelId, collision2.globalIndex (), cache);
1272+
1273+ const auto & magFieldTesla1 = collision1.magField ();
1274+ const auto & magFieldTesla2 = collision2.magField ();
1275+
1276+ const float limit = 1e-4 ;
1277+
1278+ if (std::abs (magFieldTesla1 - magFieldTesla2) > limit) {
1279+ continue ;
1280+ }
1281+
1282+ Pair->SetMagField1 (magFieldTesla1);
1283+ Pair->SetMagField2 (magFieldTesla2);
1284+
1285+ for (const auto & [part0, part1] : combinations (CombinationsFullIndexPolicy (groupPartsOne, groupPartsTwo))) {
1286+
1287+ if (removeSameBunchPileup && !part0.template singleCollSel_as <soa::Filtered<FilteredCollisionsExtra>>().isNoSameBunchPileup ())
9921288 continue ;
993- if (removeSameBunchPileup && !part1.template singleCollSel_as <soa::Filtered<FilteredCollisions >>().isNoSameBunchPileup ())
1289+ if (removeSameBunchPileup && !part1.template singleCollSel_as <soa::Filtered<FilteredCollisionsExtra >>().isNoSameBunchPileup ())
9941290 continue ;
9951291
9961292 if (part0.tpcFractionSharedCls () > maxtpcSharedCls)
@@ -1071,7 +1367,7 @@ struct HadronNucleiCorrelation {
10711367 }
10721368 }
10731369 }
1074- PROCESS_SWITCH (HadronNucleiCorrelation, processMixedEvent , " processMixedEvent " , true );
1370+ PROCESS_SWITCH (HadronNucleiCorrelation, processMixedEventEvSel , " processMixedEventEvSel " , false );
10751371
10761372 void processMC (FilteredCollisions const &, FilteredTracksMC const & tracks)
10771373 {
0 commit comments