Skip to content

Commit b3aa1bf

Browse files
committed
[PWGJE] V0 QA:
* Added process to investigate V0s that share daughters
1 parent f2d174c commit b3aa1bf

1 file changed

Lines changed: 244 additions & 4 deletions

File tree

PWGJE/Tasks/v0QA.cxx

Lines changed: 244 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ using namespace o2::framework;
4545
using namespace o2::framework::expressions;
4646

4747
// V0 jets
48+
using V0ChargedJetsWithConstituents = soa::Join<aod::V0ChargedJets, aod::V0ChargedJetConstituents>;
4849
using MCDV0Jets = aod::V0ChargedMCDetectorLevelJets;
4950
using MCDV0JetsWithConstituents = soa::Join<MCDV0Jets, aod::V0ChargedMCDetectorLevelJetConstituents>;
5051
using MatchedMCDV0Jets = soa::Join<MCDV0Jets, aod::V0ChargedMCDetectorLevelJetsMatchedToV0ChargedMCParticleLevelJets>;
@@ -59,6 +60,10 @@ using MatchedMCPV0JetsWithConstituents = soa::Join<MCPV0Jets, aod::V0ChargedMCPa
5960

6061
using 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+
6267
struct 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

Comments
 (0)