@@ -45,6 +45,7 @@ using namespace o2::framework;
4545using namespace o2 ::framework::expressions;
4646
4747// V0 jets
48+ using V0ChargedJetsWithConstituents = soa::Join<aod::V0ChargedJets, aod::V0ChargedJetConstituents>;
4849using MCDV0Jets = aod::V0ChargedMCDetectorLevelJets;
4950using MCDV0JetsWithConstituents = soa::Join<MCDV0Jets, aod::V0ChargedMCDetectorLevelJetConstituents>;
5051using MatchedMCDV0Jets = soa::Join<MCDV0Jets, aod::V0ChargedMCDetectorLevelJetsMatchedToV0ChargedMCParticleLevelJets>;
@@ -59,6 +60,10 @@ using MatchedMCPV0JetsWithConstituents = soa::Join<MCPV0Jets, aod::V0ChargedMCPa
5960
6061using JetMcCollisionsWithPIs = soa::Join<aod::JetMcCollisions, aod::JMcCollisionPIs>;
6162
63+ // Tracks
64+ using DaughterJTracks = soa::Join<aod::JetTracks, aod::JTrackPIs>;
65+ using DaughterTracks = soa::Join<aod::FullTracks, aod::TracksDCA, aod::TrackSelection, aod::TracksCov>;
66+
6267struct V0QA {
6368 HistogramRegistry registry{" registry" };
6469
@@ -300,6 +305,44 @@ struct V0QA {
300305 registry.add (" tests/sub/JetPtEtaAntiLambdaPt" , " Jet Pt, Eta, AntiLambda Pt" , HistType::kTH3D , {axisJetPt, axisEta, axisV0Pt});
301306 registry.add (" tests/sub/JetPtEtaAntiLambdaZ" , " Jet Pt, Eta, AntiLambda Z" , HistType::kTH3D , {axisJetPt, axisEta, axisV0Z});
302307 }
308+ if (doprocessTestV0DaughterSharing) {
309+ registry.add (" sharing/hEvents" , " Events" , {HistType::kTH1D , {{2 , 0 .0f , 2 .0f }}});
310+ registry.add (" sharing/V0PtEtaPhi" , " V0 Pt, Eta, Phi" , HistType::kTH3D , {axisV0Pt, axisEta, axisPhi});
311+ registry.add (" sharing/K0SPtEtaPhi" , " K0S Pt, Eta, Phi" , HistType::kTH3D , {axisV0Pt, axisEta, axisPhi});
312+ registry.add (" sharing/LambdaPtEtaPhi" , " Lambda Pt, Eta, Phi" , HistType::kTH3D , {axisV0Pt, axisEta, axisPhi});
313+ registry.add (" sharing/AntiLambdaPtEtaPhi" , " AntiLambda Pt, Eta, Phi" , HistType::kTH3D , {axisV0Pt, axisEta, axisPhi});
314+
315+ registry.add (" sharing/V0PtEtaPt" , " V0s w shared daughter" , HistType::kTHnSparseD , {axisV0Pt, axisEta, axisV0Pt});
316+ registry.add (" sharing/V0PtEtaPtDaughterPt" , " V0s w shared daughter and daughter pt" , HistType::kTHnSparseD , {axisV0Pt, axisEta, axisV0Pt, axisV0Pt});
317+ registry.add (" sharing/K0SK0S" , " K0S-K0S w shared daughter" , HistType::kTHnSparseD , {axisV0Pt, axisEta, axisV0Pt});
318+ registry.add (" sharing/K0SLambda" , " K0S-Lambda w shared daughter" , HistType::kTHnSparseD , {axisV0Pt, axisEta, axisV0Pt});
319+ registry.add (" sharing/K0SAntiLambda" , " K0S-AntiLambda w shared daughter" , HistType::kTHnSparseD , {axisV0Pt, axisEta, axisV0Pt});
320+ registry.add (" sharing/LambdaK0S" , " Lambda-K0S w shared daughter" , HistType::kTHnSparseD , {axisV0Pt, axisEta, axisV0Pt});
321+ registry.add (" sharing/LambdaLambda" , " Lambda-Lambda w shared daughter" , HistType::kTHnSparseD , {axisV0Pt, axisEta, axisV0Pt});
322+ registry.add (" sharing/LambdaAntiLambda" , " Lambda-AntiLambda w shared daughter" , HistType::kTHnSparseD , {axisV0Pt, axisEta, axisV0Pt});
323+ registry.add (" sharing/AntiLambdaK0S" , " AntiLambda-K0S w shared daughter" , HistType::kTHnSparseD , {axisV0Pt, axisEta, axisV0Pt});
324+ registry.add (" sharing/AntiLambdaLambda" , " AntiLambda-Lambda w shared daughter" , HistType::kTHnSparseD , {axisV0Pt, axisEta, axisV0Pt});
325+ registry.add (" sharing/AntiLambdaAntiLambda" , " AntiLambda-AntiLambda w shared daughter" , HistType::kTHnSparseD , {axisV0Pt, axisEta, axisV0Pt});
326+
327+ registry.add (" sharing/JetPtEtaPhi" , " JetPtEtaPhi" , HistType::kTH3D , {axisJetPt, axisEta, axisPhi});
328+ registry.add (" sharing/JetPtEtaPhiSingle" , " JetPtEtaPhiSingle" , HistType::kTH3D , {axisJetPt, axisEta, axisPhi});
329+ registry.add (" sharing/JetPtEtaPhiMultiple" , " JetPtEtaPhiMultiple" , HistType::kTH3D , {axisJetPt, axisEta, axisPhi});
330+ registry.add (" sharing/JetPtEtaV0Pt" , " JetPtEtaV0Pt" , HistType::kTH3D , {axisJetPt, axisEta, axisPhi});
331+ registry.add (" sharing/JetPtEtaK0SPt" , " JetPtEtaK0SPt" , HistType::kTH3D , {axisJetPt, axisEta, axisPhi});
332+ registry.add (" sharing/JetPtEtaLambdaPt" , " JetPtEtaLambdaPt" , HistType::kTH3D , {axisJetPt, axisEta, axisPhi});
333+ registry.add (" sharing/JetPtEtaAntiLambdaPt" , " JetPtEtaAntiLambdaPt" , HistType::kTH3D , {axisJetPt, axisEta, axisPhi});
334+ registry.add (" sharing/JetPtEtaV0PtPt" , " JetPtEtaV0PtPt" , HistType::kTHnSparseD , {axisJetPt, axisEta, axisV0Pt, axisV0Pt});
335+ registry.add (" sharing/JetPtEtaV0PtPtDaughterPt" , " JetPtEtaV0PtPtDaughterPt" , HistType::kTHnSparseD , {axisJetPt, axisEta, axisV0Pt, axisV0Pt, axisV0Pt});
336+ registry.add (" sharing/JetK0SK0S" , " JetK0SK0S" , HistType::kTHnSparseD , {axisJetPt, axisEta, axisV0Pt, axisV0Pt});
337+ registry.add (" sharing/JetK0SLambda" , " JetK0SLambda" , HistType::kTHnSparseD , {axisJetPt, axisEta, axisV0Pt, axisV0Pt});
338+ registry.add (" sharing/JetK0SAntiLambda" , " JetK0SAntiLambda" , HistType::kTHnSparseD , {axisJetPt, axisEta, axisV0Pt, axisV0Pt});
339+ registry.add (" sharing/JetLambdaK0S" , " JetLambdaK0S" , HistType::kTHnSparseD , {axisJetPt, axisEta, axisV0Pt, axisV0Pt});
340+ registry.add (" sharing/JetLambdaLambda" , " JetLambdaLambda" , HistType::kTHnSparseD , {axisJetPt, axisEta, axisV0Pt, axisV0Pt});
341+ registry.add (" sharing/JetLambdaAntiLambda" , " JetLambdaAntiLambda" , HistType::kTHnSparseD , {axisJetPt, axisEta, axisV0Pt, axisV0Pt});
342+ registry.add (" sharing/JetAntiLambdaK0S" , " JetAntiLambdaK0S" , HistType::kTHnSparseD , {axisJetPt, axisEta, axisV0Pt, axisV0Pt});
343+ registry.add (" sharing/JetAntiLambdaLambda" , " JetAntiLambdaLambda" , HistType::kTHnSparseD , {axisJetPt, axisEta, axisV0Pt, axisV0Pt});
344+ registry.add (" sharing/JetAntiLambdaAntiLambda" , " JetAntiLambdaAntiLambda" , HistType::kTHnSparseD , {axisJetPt, axisEta, axisV0Pt, axisV0Pt});
345+ }
303346 if (doprocessV0TrackQA) {
304347 registry.add (" tracks/hEvents" , " evts" , {HistType::kTH1D , {{2 , 0 .0f , 2 .0f }}});
305348 registry.add (" tracks/Pos" , " pos" , HistType::kTHnSparseD , {axisV0Pt, axisV0Pt, axisEta, axisPhi});
@@ -496,6 +539,16 @@ struct V0QA {
496539 auto daughters = particle.daughtersIds ();
497540 return ((negId == daughters[0 ] && posId == daughters[1 ]) || (posId == daughters[0 ] && negId == daughters[1 ]));
498541 }
542+ template <typename T, typename U>
543+ bool v0sShareDaughter (U const & trigger, U const & associate)
544+ {
545+ // LOGF(info, "Checking if V0s share daughter");
546+ auto trigNeg = trigger.template negTrack_as <T>();
547+ auto trigPos = trigger.template posTrack_as <T>();
548+ auto assocNeg = associate.template negTrack_as <T>();
549+ auto assocPos = associate.template posTrack_as <T>();
550+ return (trigNeg == assocNeg || trigNeg == assocPos || trigPos == assocNeg || trigPos == assocPos);
551+ }
499552 template <typename T>
500553 bool genV0PassesEfficiencyCuts (T const & pv0)
501554 {
@@ -784,6 +837,138 @@ struct V0QA {
784837 }
785838 }
786839
840+ template <typename T>
841+ void fillV0DaughterSharingInclusive (T const & v0)
842+ {
843+ registry.fill (HIST (" sharing/V0PtEtaPhi" ), v0.pt (), v0.eta (), v0.phi ());
844+ if (v0.isK0SCandidate ())
845+ registry.fill (HIST (" sharing/K0SPtEtaPhi" ), v0.pt (), v0.eta (), v0.phi ());
846+ if (v0.isLambdaCandidate ())
847+ registry.fill (HIST (" sharing/LambdaPtEtaPhi" ), v0.pt (), v0.eta (), v0.phi ());
848+ if (v0.isAntiLambdaCandidate ())
849+ registry.fill (HIST (" sharing/AntiLambdaPtEtaPhi" ), v0.pt (), v0.eta (), v0.phi ());
850+ }
851+
852+ template <typename T, typename U, typename V>
853+ void fillV0DaughterSharingInclusive (V const & trigger, V const & associate)
854+ {
855+ double weight = 0.5 ; // To correct for double-counting
856+ double pthard, etahard, ptsoft;
857+ if (trigger.pt () > associate.pt ()) {
858+ pthard = trigger.pt ();
859+ etahard = trigger.eta ();
860+ ptsoft = associate.pt ();
861+ } else {
862+ pthard = associate.pt ();
863+ etahard = associate.eta ();
864+ ptsoft = trigger.pt ();
865+ }
866+
867+ registry.fill (HIST (" sharing/V0PtEtaPt" ), pthard, etahard, ptsoft, weight);
868+ // Tried to get this in a function, but couldn't make it work
869+ auto trigNeg = trigger.template negTrack_as <T>().template track_as <U>();
870+ auto trigPos = trigger.template posTrack_as <T>().template track_as <U>();
871+ auto assocNeg = associate.template negTrack_as <T>().template track_as <U>();
872+ auto assocPos = associate.template posTrack_as <T>().template track_as <U>();
873+ double sharedDaughterPt;
874+ if (trigNeg == assocNeg || trigNeg == assocPos)
875+ sharedDaughterPt = trigNeg.pt ();
876+ else
877+ sharedDaughterPt = trigPos.pt ();
878+ registry.fill (HIST (" sharing/V0PtEtaPtDaughterPt" ), pthard, etahard, ptsoft, sharedDaughterPt, weight);
879+
880+ if (trigger.isK0SCandidate () && associate.isK0SCandidate ())
881+ registry.fill (HIST (" sharing/K0SK0S" ), pthard, etahard, ptsoft, weight);
882+ if (trigger.isK0SCandidate () && associate.isLambdaCandidate ())
883+ registry.fill (HIST (" sharing/K0SLambda" ), pthard, etahard, ptsoft, weight);
884+ if (trigger.isK0SCandidate () && associate.isAntiLambdaCandidate ())
885+ registry.fill (HIST (" sharing/K0SAntiLambda" ), pthard, etahard, ptsoft, weight);
886+
887+ if (trigger.isLambdaCandidate () && associate.isK0SCandidate ())
888+ registry.fill (HIST (" sharing/LambdaK0S" ), pthard, etahard, ptsoft, weight);
889+ if (trigger.isLambdaCandidate () && associate.isLambdaCandidate ())
890+ registry.fill (HIST (" sharing/LambdaLambda" ), pthard, etahard, ptsoft, weight);
891+ if (trigger.isLambdaCandidate () && associate.isAntiLambdaCandidate ())
892+ registry.fill (HIST (" sharing/LambdaAntiLambda" ), pthard, etahard, ptsoft, weight);
893+
894+ if (trigger.isAntiLambdaCandidate () && associate.isK0SCandidate ())
895+ registry.fill (HIST (" sharing/AntiLambdaK0S" ), pthard, etahard, ptsoft, weight);
896+ if (trigger.isAntiLambdaCandidate () && associate.isLambdaCandidate ())
897+ registry.fill (HIST (" sharing/AntiLambdaLambda" ), pthard, etahard, ptsoft, weight);
898+ if (trigger.isAntiLambdaCandidate () && associate.isAntiLambdaCandidate ())
899+ registry.fill (HIST (" sharing/AntiLambdaAntiLambda" ), pthard, etahard, ptsoft, weight);
900+ }
901+
902+ template <typename T>
903+ void fillV0DaughterSharingJet (T const & jet, bool jetHasSingleV0)
904+ {
905+ registry.fill (HIST (" sharing/JetPtEtaPhi" ), jet.pt (), jet.eta (), jet.phi ());
906+
907+ if (jetHasSingleV0)
908+ registry.fill (HIST (" sharing/JetPtEtaPhiSingle" ), jet.pt (), jet.eta (), jet.phi ());
909+ else
910+ registry.fill (HIST (" sharing/JetPtEtaPhiMultiple" ), jet.pt (), jet.eta (), jet.phi ());
911+ }
912+
913+ template <typename T, typename U>
914+ void fillV0DaughterSharingJet (T const & jet, U const & v0)
915+ {
916+ registry.fill (HIST (" sharing/JetPtEtaV0Pt" ), jet.pt (), jet.eta (), v0.pt ());
917+ if (v0.isK0SCandidate ())
918+ registry.fill (HIST (" sharing/JetPtEtaK0SPt" ), jet.pt (), jet.eta (), v0.pt ());
919+ if (v0.isLambdaCandidate ())
920+ registry.fill (HIST (" sharing/JetPtEtaLambdaPt" ), jet.pt (), jet.eta (), v0.pt ());
921+ if (v0.isAntiLambdaCandidate ())
922+ registry.fill (HIST (" sharing/JetPtEtaAntiLambdaPt" ), jet.pt (), jet.eta (), v0.pt ());
923+ }
924+
925+ template <typename T, typename U, typename V, typename W>
926+ void fillV0DaughterSharingJet (V const & jet, W const & trigger, W const & associate)
927+ {
928+ double weight = 0.5 ; // To correct for double-counting
929+ double pthard, ptsoft;
930+ if (trigger.pt () > associate.pt ()) {
931+ pthard = trigger.pt ();
932+ ptsoft = associate.pt ();
933+ } else {
934+ pthard = associate.pt ();
935+ ptsoft = trigger.pt ();
936+ }
937+
938+ registry.fill (HIST (" sharing/JetPtEtaV0PtPt" ), jet.pt (), jet.eta (), pthard, ptsoft, weight);
939+ auto trigNeg = trigger.template negTrack_as <T>().template track_as <U>();
940+ auto trigPos = trigger.template posTrack_as <T>().template track_as <U>();
941+ auto assocNeg = associate.template negTrack_as <T>().template track_as <U>();
942+ auto assocPos = associate.template posTrack_as <T>().template track_as <U>();
943+ double sharedDaughterPt;
944+ if (trigNeg == assocNeg || trigNeg == assocPos)
945+ sharedDaughterPt = trigNeg.pt ();
946+ else
947+ sharedDaughterPt = trigPos.pt ();
948+ registry.fill (HIST (" sharing/JetPtEtaV0PtPtDaughterPt" ), jet.pt (), jet.eta (), pthard, ptsoft, sharedDaughterPt, weight);
949+
950+ if (trigger.isK0SCandidate () && associate.isK0SCandidate ())
951+ registry.fill (HIST (" sharing/JetK0SK0S" ), jet.pt (), jet.eta (), pthard, ptsoft, weight);
952+ if (trigger.isK0SCandidate () && associate.isLambdaCandidate ())
953+ registry.fill (HIST (" sharing/JetK0SLambda" ), jet.pt (), jet.eta (), pthard, ptsoft, weight);
954+ if (trigger.isK0SCandidate () && associate.isAntiLambdaCandidate ())
955+ registry.fill (HIST (" sharing/JetK0SAntiLambda" ), jet.pt (), jet.eta (), pthard, ptsoft, weight);
956+
957+ if (trigger.isLambdaCandidate () && associate.isK0SCandidate ())
958+ registry.fill (HIST (" sharing/JetLambdaK0S" ), jet.pt (), jet.eta (), pthard, ptsoft, weight);
959+ if (trigger.isLambdaCandidate () && associate.isLambdaCandidate ())
960+ registry.fill (HIST (" sharing/JetLambdaLambda" ), jet.pt (), jet.eta (), pthard, ptsoft, weight);
961+ if (trigger.isLambdaCandidate () && associate.isAntiLambdaCandidate ())
962+ registry.fill (HIST (" sharing/JetLambdaAntiLambda" ), jet.pt (), jet.eta (), pthard, ptsoft, weight);
963+
964+ if (trigger.isAntiLambdaCandidate () && associate.isK0SCandidate ())
965+ registry.fill (HIST (" sharing/JetAntiLambdaK0S" ), jet.pt (), jet.eta (), pthard, ptsoft, weight);
966+ if (trigger.isAntiLambdaCandidate () && associate.isLambdaCandidate ())
967+ registry.fill (HIST (" sharing/JetAntiLambdaLambda" ), jet.pt (), jet.eta (), pthard, ptsoft, weight);
968+ if (trigger.isAntiLambdaCandidate () && associate.isAntiLambdaCandidate ())
969+ registry.fill (HIST (" sharing/JetAntiLambdaAntiLambda" ), jet.pt (), jet.eta (), pthard, ptsoft, weight);
970+ }
971+
787972 template <typename T, typename U, typename V>
788973 void fillTrackQa (V const & v0)
789974 {
@@ -1477,7 +1662,7 @@ struct V0QA {
14771662 PROCESS_SWITCH (V0QA , processFeeddownMatchedJets, " Jets feeddown" , false );
14781663
14791664 // Test the difference between excluding V0s from jet finding and subtracting V0s from jets afterwards
1480- void processTestWeightedJetFinder (soa::Filtered<aod::JetCollisions>::iterator const & jcoll, soa::Join<aod::V0ChargedJets, aod::V0ChargedJetConstituents> const & jets, aod::CandidatesV0Data const & v0s)
1665+ void processTestWeightedJetFinder (soa::Filtered<aod::JetCollisions>::iterator const & jcoll, V0ChargedJetsWithConstituents const & jets, aod::CandidatesV0Data const & v0s)
14811666 {
14821667 registry.fill (HIST (" tests/weighted/hEvents" ), 0.5 );
14831668 if (!jetderiveddatautilities::selectCollision (jcoll, eventSelectionBits))
@@ -1505,7 +1690,7 @@ struct V0QA {
15051690 }
15061691 PROCESS_SWITCH (V0QA , processTestWeightedJetFinder, " Test weighted jet finder" , false );
15071692
1508- void processTestSubtractedJetFinder (soa::Filtered<aod::JetCollisions>::iterator const & jcoll, soa::Join<aod::V0ChargedJets, aod::V0ChargedJetConstituents> const & jets, aod::CandidatesV0Data const & v0s)
1693+ void processTestSubtractedJetFinder (soa::Filtered<aod::JetCollisions>::iterator const & jcoll, V0ChargedJetsWithConstituents const & jets, aod::CandidatesV0Data const & v0s)
15091694 {
15101695 registry.fill (HIST (" tests/hEvents" ), 0.5 );
15111696 if (!jetderiveddatautilities::selectCollision (jcoll, eventSelectionBits))
@@ -1552,8 +1737,63 @@ struct V0QA {
15521737 }
15531738 PROCESS_SWITCH (V0QA , processTestSubtractedJetFinder, " Test subtracted jet finder" , false );
15541739
1555- using DaughterJTracks = soa::Join<aod::JetTracks, aod::JTrackPIs>;
1556- using DaughterTracks = soa::Join<aod::FullTracks, aod::TracksDCA, aod::TrackSelection, aod::TracksCov>;
1740+ void processTestV0DaughterSharing (soa::Filtered<aod::JetCollisions>::iterator const & jcoll, V0ChargedJetsWithConstituents const & jets, aod::CandidatesV0Data const & v0s, DaughterJTracks const &, DaughterTracks const &)
1741+ {
1742+ registry.fill (HIST (" sharing/hEvents" ), 0.5 );
1743+ if (!jetderiveddatautilities::selectCollision (jcoll, eventSelectionBits))
1744+ return ;
1745+ registry.fill (HIST (" sharing/hEvents" ), 1.5 );
1746+
1747+ // Check if V0s within the same event share daughters
1748+ for (const auto & trigger : v0s) {
1749+ if (trigger.isRejectedCandidate ())
1750+ continue ;
1751+
1752+ fillV0DaughterSharingInclusive (trigger);
1753+
1754+ for (const auto & associate : v0s) {
1755+ if (associate.isRejectedCandidate ())
1756+ continue ;
1757+
1758+ if (trigger == associate)
1759+ continue ;
1760+
1761+ // Double-counting accounted for by filling histograms with weight 0.5
1762+ if (v0sShareDaughter<DaughterJTracks>(trigger, associate)) {
1763+ fillV0DaughterSharingInclusive<DaughterJTracks, DaughterTracks>(trigger, associate);
1764+ }
1765+ }
1766+ }
1767+
1768+ // Check if V0s within the same jet share daughters
1769+ for (const auto & jet : jets) {
1770+ bool jetHasSingleV0 = true ;
1771+
1772+ for (const auto & trigger : jet.template candidates_as <aod::CandidatesV0Data>()) {
1773+ if (trigger.isRejectedCandidate ())
1774+ continue ;
1775+
1776+ fillV0DaughterSharingJet (jet, trigger);
1777+
1778+ for (const auto & associate : jet.template candidates_as <aod::CandidatesV0Data>()) {
1779+ if (associate.isRejectedCandidate ())
1780+ continue ;
1781+
1782+ if (trigger == associate)
1783+ continue ;
1784+
1785+ jetHasSingleV0 = false ;
1786+
1787+ // Double-counting accounted for by filling histograms with weight 0.5
1788+ if (v0sShareDaughter<DaughterJTracks>(trigger, associate))
1789+ fillV0DaughterSharingJet<DaughterJTracks, DaughterTracks>(jet, trigger, associate);
1790+ }
1791+ }
1792+ fillV0DaughterSharingJet (jet, jetHasSingleV0);
1793+ }
1794+ }
1795+ PROCESS_SWITCH (V0QA , processTestV0DaughterSharing, " Test V0s with shared daughters" , false );
1796+
15571797 void processV0TrackQA (aod::JetCollision const & jcoll, aod::CandidatesV0Data const & v0s, DaughterJTracks const &, DaughterTracks const &)
15581798 {
15591799 registry.fill (HIST (" tracks/hEvents" ), 0.5 );
0 commit comments