main114
Back to index.
// main114.cc is a part of the PYTHIA event generator.
// Copyright (C) 2025 Torbjorn Sjostrand.
// PYTHIA is licenced under the GNU GPL v2 or later, see COPYING for details.
// Please respect the MCnet Guidelines, see GUIDELINES for details.
// Authors:
// Christian Bierlich
// Keywords:
// Basic usage
// Plotting
// Yoda
// This is a simple test program.
// It illustrates how YODA2 histograms can be used through the Pythia8Yoda
// simplified interface. This can be useful for more advanced statistical
// treatments than the built-in histogram types allow, for example using
// profile histograms or custom types, as shown below.
#include "Pythia8/Pythia.h"
#include "Pythia8Plugins/Pythia8Yoda.h"
using namespace Pythia8;
//==========================================================================
int main() {
Pythia pythia;
pythia.readString("Beams:eCM = 8000.");
pythia.readString("SoftQCD:all = on");
// If Pythia fails to initialize, exit with error.
if (!pythia.init()) return 1;
Pythia8Yoda p8y("MAIN114", "main114.yoda");
// Booking of normal types, as defined in Pythia8Yoda.
auto h1 = p8y.bookHisto1D(15, 0.5, 191.5, "charged-mult");
auto h2 = p8y.bookProfile1D(15, 0.5, 191.5, "mean-pt");
// Booking of custom YODA types. Two examples:
// 1) a 1D histogram with discrete string binning, used
// to count the number of pi, K and p per event, and
// 2) a 1D Profile histogram with discrete string binning,
// used to count <pT> of said particles.
// First the types:
using IntegerHisto1D = YODA::BinnedHisto1D<string>;
using IntegerProfile1D = YODA::BinnedProfile1D<string>;
// Then the desired axis binning.
const auto pidAxis = YODA::Axis<string>({"211", "321", "2212"});
// And finally the two histograms.
auto h3 = p8y.book<IntegerHisto1D>(pidAxis,
"/MAIN114/pid-mult", "pid-mult");
auto h4 = p8y.book<IntegerProfile1D>(pidAxis,
"/MAIN114/pid-mean-pt", "pid-mean-pt");
// Begin event loop. Generate event. Skip if error. List first one.
int nEvents = 10000;
for (int iEvent = 0; iEvent < nEvents; ++iEvent) {
if (!pythia.next()) continue;
// Find number of all final charged particles and fill histogram.
int nCharged = 0;
double sumpT = 0.;
for (auto p : pythia.event) {
if (p.isFinal() && p.isHadron() && p.isCharged() &&
abs(p.eta()) < 2.5) {
++nCharged;
h3->fill(to_string(abs(p.id())));
sumpT += p.pT();
h4->fill(to_string(abs(p.id())), p.pT());
}
}
if (nCharged > 0) {
h1->fill(nCharged);
h2->fill(nCharged, sumpT/double(nCharged));
}
// End of event loop. Statistics. Histogram. Done.
}
pythia.stat();
// Normalize to number of events generated.
h1->scaleW(1./double(nEvents));
h3->scaleW(1./double(nEvents));
// Write histograms to file.
p8y.write();
cout << "Histograms have been written. "
"You can now plot them with e.g. rivet-mkhtml or Python.\n";
// Done.
return 0;
}