Skip to content

Commit 35f6282

Browse files
nstrangmNicolas Strangmann
andauthored
[PWGJE/EMCal,PWGEM/PhotonMeson] Add BC wise generated particles and track matching QA histos (#8258)
Co-authored-by: Nicolas Strangmann <nicolas.strangmann@.cern.ch>
1 parent d807fe7 commit 35f6282

File tree

2 files changed

+99
-37
lines changed

2 files changed

+99
-37
lines changed

PWGEM/PhotonMeson/Utils/ClusterHistograms.h

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,21 @@ void addClusterHistograms(HistogramRegistry* fRegistry, bool do2DQA)
2525
fRegistry->add("Cluster/before/hPt", "Transverse momenta of clusters;#it{p}_{T} (GeV/c);#it{N}_{cluster}", kTH1F, {{500, 0.0f, 50}}, true);
2626
fRegistry->add("Cluster/before/hNgamma", "Number of #gamma candidates per collision;#it{N}_{#gamma} per collision;#it{N}_{collisions}", kTH1F, {{51, -0.5f, 50.5f}}, true);
2727
fRegistry->add("Cluster/before/hEtaPhi", "#eta vs #varphi;#eta;#varphi (rad.)", kTH2F, {{280, -0.7f, 0.7f}, {180, 0, 2 * M_PI}}, true);
28-
fRegistry->add("Cluster/before/hTrackEtaPhi", "d#eta vs. d#varphi of matched tracks;d#eta;d#varphi (rad.)", kTH2F, {{200, -0.2f, 0.2f}, {200, -0.2f, 0.2f}}, true);
28+
fRegistry->add("Cluster/before/hNTracks", "Number of tracks considered for TM;#it{N}_{tracks};#it{N}_{cluster}", kTH1F, {{20, -0.5f, 19.5}}, true);
29+
fRegistry->add("Cluster/before/hTrackdEtadPhi", "d#eta vs. d#varphi of matched tracks;d#eta;d#varphi (rad.)", kTH2F, {{200, -0.2f, 0.2f}, {200, -0.2f, 0.2f}}, true);
2930

3031
if (do2DQA) { // Check if 2D QA histograms were selected in em-qc task
3132
fRegistry->add("Cluster/before/hNCell", "#it{N}_{cells};N_{cells} (GeV);#it{E}_{cluster} (GeV)", kTH2F, {{26, -0.5, 25.5}, {200, 0, 20}}, true);
3233
fRegistry->add("Cluster/before/hM02", "Long ellipse axis;#it{M}_{02} (cm);#it{E}_{cluster} (GeV)", kTH2F, {{200, 0, 2}, {200, 0, 20}}, true);
3334
fRegistry->add("Cluster/before/hTime", "Cluster time;#it{t}_{cls} (ns);#it{E}_{cluster} (GeV)", kTH2F, {{300, -150, 150}, {200, 0, 20}}, true);
34-
fRegistry->add("Cluster/before/hCellTime", "Cell time;#it{t}_{cell} (ns);#it{E}_{cluster} (GeV)", kTH2F, {{100, -250, 250}, {200, 0, 20}}, true);
35+
fRegistry->add("Cluster/before/hTrackdEta", "d#eta vs. E of matched tracks;d#eta;#it{E}_{cluster} (GeV)", kTH2F, {{200, -0.2f, 0.2f}, {200, 0, 20}}, true);
36+
fRegistry->add("Cluster/before/hTrackdPhi", "d#phi vs. E of matched tracks;d#varphi (rad.);#it{E}_{cluster} (GeV)", kTH2F, {{200, -0.2f, 0.2f}, {200, 0, 20}}, true);
37+
fRegistry->add("Cluster/before/hTrackEOverP", "Energy of cluster divided by momentum of matched tracks;#it{E}_{cluster}/#it{p}_{track} (#it{c});#it{E}_{cluster} (GeV)", kTH2F, {{200, 0., 5.}, {200, 0, 20}}, true);
3538
} else {
3639
fRegistry->add("Cluster/before/hNCell", "#it{N}_{cells};N_{cells} (GeV);#it{N}_{cluster}", kTH1F, {{26, -0.5, 25.5}}, true);
3740
fRegistry->add("Cluster/before/hM02", "Long ellipse axis;#it{M}_{02} (cm);#it{N}_{cluster}", kTH1F, {{400, 0, 2}}, true);
3841
fRegistry->add("Cluster/before/hTime", "Cluster time;#it{t}_{cls} (ns);#it{N}_{cluster}", kTH1F, {{600, -150, 150}}, true);
39-
fRegistry->add("Cluster/before/hCellTime", "Cluster time;#it{t}_{cell} (ns);#it{N}_{cluster}", kTH1F, {{500, -250, 250}}, true);
42+
fRegistry->add("Cluster/before/hTrackEOverP", "Energy of cluster divided by momentum of matched tracks;#it{E}_{cluster}/#it{p}_{track} (#it{c})", kTH1F, {{200, 0., 5.}}, true);
4043
}
4144

4245
auto hClusterQualityCuts = fRegistry->add<TH2>("Cluster/hClusterQualityCuts", "Energy at which clusters are removed by a given cut;;#it{E} (GeV)", kTH2F, {{8, -0.5, 7.5}, {500, 0, 50}}, true);
@@ -59,17 +62,26 @@ void fillClusterHistograms(HistogramRegistry* fRegistry, SkimEMCCluster cluster,
5962
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hE"), cluster.e(), weight);
6063
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hPt"), cluster.pt(), weight);
6164
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hEtaPhi"), cluster.eta(), cluster.phi(), weight);
65+
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hNTracks"), cluster.tracketa().size(), weight);
6266
for (size_t itrack = 0; itrack < cluster.tracketa().size(); itrack++) { // Fill TrackEtaPhi histogram with delta phi and delta eta of all tracks saved in the vectors in skimmerGammaCalo.cxx
63-
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hTrackEtaPhi"), cluster.tracketa()[itrack] - cluster.eta(), cluster.trackphi()[itrack] - cluster.phi(), weight);
67+
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hTrackdEtadPhi"), cluster.tracketa()[itrack] - cluster.eta(), cluster.trackphi()[itrack] - cluster.phi(), weight);
6468
}
6569
if (do2DQA) {
6670
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hNCell"), cluster.nCells(), cluster.e(), weight);
6771
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hM02"), cluster.m02(), cluster.e(), weight);
6872
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hTime"), cluster.time(), cluster.e(), weight);
73+
for (size_t itrack = 0; itrack < cluster.tracketa().size(); itrack++) {
74+
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hTrackEOverP"), cluster.e() / cluster.trackp()[itrack], cluster.e(), weight);
75+
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hTrackdEta"), cluster.tracketa()[itrack] - cluster.eta(), cluster.e(), weight);
76+
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hTrackdPhi"), cluster.trackphi()[itrack] - cluster.phi(), cluster.e(), weight);
77+
}
6978
} else {
7079
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hNCell"), cluster.nCells(), weight);
7180
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hM02"), cluster.m02(), weight);
7281
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hTime"), cluster.time(), weight);
82+
for (size_t itrack = 0; itrack < cluster.tracketa().size(); itrack++) {
83+
fRegistry->fill(HIST("Cluster/") + HIST(cluster_types[cls_id]) + HIST("hTrackEOverP"), cluster.e() / cluster.trackp()[itrack], weight);
84+
}
7385
}
7486
}
7587

PWGJE/Tasks/mcgeneratorstudies.cxx

Lines changed: 83 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ using namespace o2::framework;
3232
using namespace o2::framework::expressions;
3333

3434
using MyMCCollisions = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels, aod::EMCALMatchedCollisions>;
35+
using MyBCs = o2::soa::Join<o2::aod::BCs, o2::aod::BcSels>;
3536

3637
struct MCGeneratorStudies {
3738
HistogramRegistry mHistManager{"MCGeneratorStudyHistograms"};
@@ -55,6 +56,11 @@ struct MCGeneratorStudies {
5556
hCollisionCounter->GetXaxis()->SetBinLabel(6, "+unique"); // TVX with z < 10cm and Sel8 and good z xertex and unique (only collision in the BC)
5657
hCollisionCounter->GetXaxis()->SetBinLabel(7, "+EMC readout"); // TVX with z < 10cm and Sel8 and good z xertex and unique (only collision in the BC) and kTVXinEMC
5758

59+
auto hBCCounter = mHistManager.add<TH1>("hBCCounter", "Number of BCs after BC cuts", HistType::kTH1F, {{3, 0.5, 3.5}});
60+
hBCCounter->GetXaxis()->SetBinLabel(1, "all");
61+
hBCCounter->GetXaxis()->SetBinLabel(2, "+TVX");
62+
hBCCounter->GetXaxis()->SetBinLabel(3, "+Collision");
63+
5864
TString mesonLatexString = (TString)mSelectedParticleCode;
5965
switch (mSelectedParticleCode) {
6066
case 0:
@@ -77,6 +83,11 @@ struct MCGeneratorStudies {
7783
mHistManager.add("Yield_TZSGUE", Form("Generated %s in unique TVXinEMC collisions with good z < 10cm and Sel8", mesonLatexString.Data()), HistType::kTH1F, {pTAxis});
7884
mHistManager.add("Yield_TZSGUE_Accepted", Form("Accepted %s in unique TVXinEMC collisions with good z < 10cm and Sel8", mesonLatexString.Data()), HistType::kTH1F, {pTAxis});
7985

86+
mHistManager.add("Yield_BC_T", Form("Generated %s in TVX triggered BCs", mesonLatexString.Data()), HistType::kTH1F, {pTAxis});
87+
mHistManager.add("Yield_BC_TC", Form("Generated %s in TVX triggered BCs that have at least one collision", mesonLatexString.Data()), HistType::kTH1F, {pTAxis});
88+
mHistManager.add("NCollisionsMCCollisions", "Number of (MC)Collisions in the BC;#it{N}_(Collisions);#it{N}_(MC Collisions)", kTH2F, {{4, -0.5, 3.5}, {4, -0.5, 3.5}});
89+
mHistManager.add("NTVXCollisionsMCCollisions", "Number of (MC)Collisions in the TVX triggered BC;#it{N}_(Collisions);#it{N}_(MC Collisions)", kTH2F, {{4, -0.5, 3.5}, {4, -0.5, 3.5}});
90+
8091
auto hEMCollisionCounter = mHistManager.add<TH1>("hEMCollisionCounter", "collision counter;;Number of events", kTH1F, {{13, 0.5, 13.5}}, false);
8192
hEMCollisionCounter->GetXaxis()->SetBinLabel(1, "all");
8293
hEMCollisionCounter->GetXaxis()->SetBinLabel(2, "No TF border");
@@ -97,40 +108,79 @@ struct MCGeneratorStudies {
97108

98109
PresliceUnsorted<aod::McParticles> perMcCollision = aod::mcparticle::mcCollisionId;
99110

100-
void process(MyMCCollisions::iterator const& collision, aod::McCollisions const&, aod::McParticles const& mcParticles)
111+
void process(MyBCs::iterator const& bc, MyMCCollisions const& collisions, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles)
101112
{
102-
fillEventHistogram(&mHistManager, collision);
103-
104-
auto mcCollision = collision.mcCollision();
105-
auto mcParticles_inColl = mcParticles.sliceBy(perMcCollision, mcCollision.globalIndex());
106-
107-
for (auto& mcParticle : mcParticles_inColl) {
108-
if (mcParticle.pdgCode() != 0 && mcParticle.pdgCode() != mSelectedParticleCode)
109-
continue;
110-
if (fabs(mcParticle.y()) > mRapidityCut)
111-
continue;
112-
if (!mcParticle.isPhysicalPrimary() && !mcParticle.producedByGenerator())
113-
continue;
114-
if (mRequireGammaGammaDecay && !isGammaGammaDecay(mcParticle, mcParticles))
115-
continue;
116-
117-
mHistManager.fill(HIST("Yield"), mcParticle.pt());
118-
if (isAccepted(mcParticle, mcParticles))
119-
mHistManager.fill(HIST("Yield_Accepted"), mcParticle.pt());
120-
if (collision.selection_bit(o2::aod::evsel::kIsTriggerTVX)) {
121-
mHistManager.fill(HIST("Yield_T"), mcParticle.pt());
122-
if (abs(collision.posZ()) < mVertexCut) {
123-
mHistManager.fill(HIST("Yield_TZ"), mcParticle.pt());
124-
if (collision.sel8()) {
125-
mHistManager.fill(HIST("Yield_TZS"), mcParticle.pt());
126-
if (collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) {
127-
mHistManager.fill(HIST("Yield_TZSG"), mcParticle.pt());
128-
if (collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) {
129-
mHistManager.fill(HIST("Yield_TZSGU"), mcParticle.pt());
130-
if (mRequireEMCCellContent ? collision.isemcreadout() : collision.alias_bit(kTVXinEMC)) {
131-
mHistManager.fill(HIST("Yield_TZSGUE"), mcParticle.pt());
132-
if (isAccepted(mcParticle, mcParticles))
133-
mHistManager.fill(HIST("Yield_TZSGUE_Accepted"), mcParticle.pt());
113+
114+
mHistManager.fill(HIST("NCollisionsMCCollisions"), collisions.size(), mcCollisions.size());
115+
mHistManager.fill(HIST("hBCCounter"), 1);
116+
117+
if (bc.selection_bit(aod::evsel::kIsTriggerTVX)) { // Count BCs with TVX trigger with and without a collision, as well as the generated particles within
118+
119+
mHistManager.fill(HIST("NTVXCollisionsMCCollisions"), collisions.size(), mcCollisions.size());
120+
121+
mHistManager.fill(HIST("hBCCounter"), 2);
122+
123+
bool bcHasCollision = collisions.size() > 0;
124+
125+
if (bcHasCollision)
126+
mHistManager.fill(HIST("hBCCounter"), 3);
127+
128+
for (auto& mcCollision : mcCollisions) {
129+
130+
auto mcParticles_inColl = mcParticles.sliceBy(perMcCollision, mcCollision.globalIndex());
131+
132+
for (auto& mcParticle : mcParticles_inColl) {
133+
if (mcParticle.pdgCode() != 0 && mcParticle.pdgCode() != mSelectedParticleCode)
134+
continue;
135+
if (fabs(mcParticle.y()) > mRapidityCut)
136+
continue;
137+
if (!mcParticle.isPhysicalPrimary() && !mcParticle.producedByGenerator())
138+
continue;
139+
if (mRequireGammaGammaDecay && !isGammaGammaDecay(mcParticle, mcParticles))
140+
continue;
141+
142+
mHistManager.fill(HIST("Yield_BC_T"), mcParticle.pt());
143+
144+
if (bcHasCollision)
145+
mHistManager.fill(HIST("Yield_BC_TC"), mcParticle.pt());
146+
}
147+
}
148+
}
149+
150+
for (auto& collision : collisions) {
151+
fillEventHistogram(&mHistManager, collision);
152+
153+
auto mcCollision = collision.mcCollision();
154+
auto mcParticles_inColl = mcParticles.sliceBy(perMcCollision, mcCollision.globalIndex());
155+
156+
for (auto& mcParticle : mcParticles_inColl) {
157+
if (mcParticle.pdgCode() != 0 && mcParticle.pdgCode() != mSelectedParticleCode)
158+
continue;
159+
if (fabs(mcParticle.y()) > mRapidityCut)
160+
continue;
161+
if (!mcParticle.isPhysicalPrimary() && !mcParticle.producedByGenerator())
162+
continue;
163+
if (mRequireGammaGammaDecay && !isGammaGammaDecay(mcParticle, mcParticles))
164+
continue;
165+
166+
mHistManager.fill(HIST("Yield"), mcParticle.pt());
167+
if (isAccepted(mcParticle, mcParticles))
168+
mHistManager.fill(HIST("Yield_Accepted"), mcParticle.pt());
169+
if (collision.selection_bit(o2::aod::evsel::kIsTriggerTVX)) {
170+
mHistManager.fill(HIST("Yield_T"), mcParticle.pt());
171+
if (abs(collision.posZ()) < mVertexCut) {
172+
mHistManager.fill(HIST("Yield_TZ"), mcParticle.pt());
173+
if (collision.sel8()) {
174+
mHistManager.fill(HIST("Yield_TZS"), mcParticle.pt());
175+
if (collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) {
176+
mHistManager.fill(HIST("Yield_TZSG"), mcParticle.pt());
177+
if (collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) {
178+
mHistManager.fill(HIST("Yield_TZSGU"), mcParticle.pt());
179+
if (mRequireEMCCellContent ? collision.isemcreadout() : collision.alias_bit(kTVXinEMC)) {
180+
mHistManager.fill(HIST("Yield_TZSGUE"), mcParticle.pt());
181+
if (isAccepted(mcParticle, mcParticles))
182+
mHistManager.fill(HIST("Yield_TZSGUE_Accepted"), mcParticle.pt());
183+
}
134184
}
135185
}
136186
}

0 commit comments

Comments
 (0)