Skip to content

Commit ea53c75

Browse files
nstrangmNicolas Strangmann
andauthored
[PWGEM/PhotonMeson] Enable cross section normalization in generator task (#18355)
Co-authored-by: Nicolas Strangmann <nicolas.strangmann@.cern.ch>
1 parent a1e75aa commit ea53c75

1 file changed

Lines changed: 54 additions & 8 deletions

File tree

‎PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx‎

Lines changed: 54 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
/// \brief Task that produces the generated pT spectrum of a given particle for MC studies based on on the fly MC simulations
1414
/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) - Goethe University Frankfurt
1515

16+
#include "PWGEM/PhotonMeson/Utils/MCUtilities.h"
17+
1618
#include <Framework/AnalysisDataModel.h>
1719
#include <Framework/AnalysisTask.h>
1820
#include <Framework/Configurable.h>
@@ -22,6 +24,9 @@
2224
#include <Framework/InitContext.h>
2325
#include <Framework/runDataProcessing.h>
2426

27+
#include <TH1.h>
28+
#include <TString.h>
29+
2530
#include <cstdlib>
2631

2732
using namespace o2;
@@ -31,23 +36,64 @@ struct MCGeneratorStudies {
3136
HistogramRegistry mHistManager{"MCGeneratorStudyHistograms"};
3237
Configurable<int> cfgSelectedParticleCode{"cfgSelectedParticleCode", 111, "PDG code of the particle to be investigated"};
3338
Configurable<float> cfgMaxZVertex{"cfgMaxZVertex", 10, "Maximum absolute z-vertex distance (cm)"};
34-
Configurable<float> cfgRapidityCut{"cfgRapidityCut", 0.8, "Maximum absolute rapditity of selected generated particles"};
35-
ConfigurableAxis cfgMultiplicityBinning{"cfgMultiplicityBinning", {1000, 0, 10000}, "Binning used for the binning of the number of particles in the event"};
39+
Configurable<float> cfgRapidityCut{"cfgRapidityCut", 0.8, "Maximum absolute rapidity of selected generated particles"};
3640
expressions::Filter zVertexFilter = aod::mccollision::posZ < cfgMaxZVertex && aod::mccollision::posZ > -cfgMaxZVertex;
3741

3842
void init(InitContext const&)
3943
{
40-
mHistManager.add("Multiplicity", "Number of generated particles per MC collision;#bf{#it{N} (Multiplicity)};#bf{#it{N}_{MC collisions}}", HistType::kTH1F, {cfgMultiplicityBinning});
41-
mHistManager.add("YieldVsMultiplicity", "pT of selected particles in all MC collisions vs number of all generated particles in event;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N} (Multiplicity)};#bf{#it{N}}", HistType::kTH2F, {{200, 0, 20}, cfgMultiplicityBinning});
44+
mHistManager.add("Yield", Form("Yield of primary selected particles in all MC collisions (PDG code %d);#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}}", cfgSelectedParticleCode.value), HistType::kTH1D, {{250, 0, 25}});
45+
mHistManager.add("FullYield", Form("Yield of selected particles in all MC collisions (PDG code %d);#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}}", cfgSelectedParticleCode.value), HistType::kTH1D, {{250, 0, 25}});
46+
mHistManager.add("MCGenXSec", "Generated cross section = GetBinContent(1)/GetBinContent(2)", HistType::kTH1D, {{2, 0, 2}});
47+
auto hX = mHistManager.get<TH1>(HIST("MCGenXSec"));
48+
hX->GetXaxis()->SetBinLabel(1, "#sigma_{gen} (b)");
49+
hX->GetXaxis()->SetBinLabel(2, "nStreams");
50+
hX->SetBinContent(2, 1); // Unity to enable normalization by number of streams
51+
hX->SetBinError(2, 0);
52+
mHistManager.add("RapidityCut", "#Delta y = GetBinContent(1)/GetBinContent(2)", HistType::kTH1D, {{2, 0, 2}});
53+
auto hY = mHistManager.get<TH1>(HIST("RapidityCut"));
54+
hY->GetXaxis()->SetBinLabel(1, "2#Delta y");
55+
hY->GetXaxis()->SetBinLabel(2, "nStreams");
56+
hY->SetBinContent(1, 2 * cfgRapidityCut);
57+
hY->SetBinContent(2, 1); // Unity to enable normalization by number of streams
58+
hY->SetBinError(2, 0);
59+
mHistManager.add("EventWeight", "MC collision weight;Event weight;#bf{#it{N}_{MC Collisions}}", HistType::kTH1D, {{1000, 0, 10}});
60+
mHistManager.add("MCGenXSecDistribution", "Generated cross section distribution;#sigma_{gen} (b);#bf{#it{N}_{MC Collisions}}", HistType::kTH1D, {{20000, 0, 2}});
61+
mHistManager.add("MCGenXSecErrDistribution", "Generated cross section error distribution;#sigma_{gen}^{err} (b);#bf{#it{N}_{MC Collisions}}", HistType::kTH1D, {{20000, 0, 2}});
62+
mHistManager.add("EventWeightSum", "Sum of event weights", HistType::kTH1D, {{2, 0., 2.}}, true);
63+
auto hE = mHistManager.get<TH1>(HIST("EventWeightSum"));
64+
hE->GetXaxis()->SetBinLabel(1, "#Sigma w");
65+
hE->GetXaxis()->SetBinLabel(2, "N_{MC Collisions}");
66+
mHistManager.add("zVertex", "zVertex position;#bf{z (cm)};#bf{#it{N}_{MC Collisions}}", HistType::kTH1D, {{500, -25., 25.}}, true);
4267
}
4368

44-
void process(soa::Filtered<aod::McCollisions>::iterator const&, aod::McParticles const& mcParticles)
69+
void process(soa::Filtered<aod::McCollisions>::iterator const& mcCollision, aod::McParticles const& mcParticles, aod::HepMCXSections const& crossSections)
4570
{
46-
int nParticles = mcParticles.size();
47-
mHistManager.fill(HIST("Multiplicity"), nParticles);
71+
const double w = mcCollision.weight();
72+
mHistManager.fill(HIST("EventWeight"), w);
73+
mHistManager.fill(HIST("EventWeightSum"), 0.5, w); // Fill with event weight (used for normalization)
74+
mHistManager.fill(HIST("EventWeightSum"), 1.5, 1); // Fill with number of MC collisions
75+
mHistManager.fill(HIST("zVertex"), mcCollision.posZ(), w);
76+
if (crossSections.size() == 1) {
77+
auto const xs = crossSections.begin();
78+
const double sigmaGen = xs.xsectGen() * 1E-12; // From pb to b
79+
const double sigmaGenErr = xs.xsectErr() * 1E-12; // From pb to b
80+
mHistManager.fill(HIST("MCGenXSecDistribution"), sigmaGen);
81+
mHistManager.fill(HIST("MCGenXSecErrDistribution"), sigmaGenErr);
82+
83+
auto hX = mHistManager.get<TH1>(HIST("MCGenXSec"));
84+
hX->SetBinContent(1, sigmaGen); // Set bin content to latest generated cross section and uncertainty
85+
hX->SetBinError(1, sigmaGenErr);
86+
} else {
87+
LOG(warn) << "Multiple cross sections found: " << crossSections.size();
88+
}
4889
for (auto& mcParticle : mcParticles) {
4990
if (mcParticle.pdgCode() == cfgSelectedParticleCode && std::abs(mcParticle.y()) < cfgRapidityCut) {
50-
mHistManager.fill(HIST("YieldVsMultiplicity"), mcParticle.pt(), nParticles);
91+
mHistManager.fill(HIST("FullYield"), mcParticle.pt(), w);
92+
bool isPrimary = mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator();
93+
bool isFromWD = (aod::pwgem::photonmeson::utils::mcutil::IsFromWD(mcCollision, mcParticle, mcParticles)) > 0;
94+
if (isPrimary && !isFromWD) {
95+
mHistManager.fill(HIST("Yield"), mcParticle.pt(), w);
96+
}
5197
}
5298
}
5399
}

0 commit comments

Comments
 (0)