main297-python
Back to index.
# main297.py 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:
# Philip Ilten
# Artem Havryliuk
# Jim Pivarski
# Keywords:
# Python
# Parallelism
# This example shows how to use the Awkward array interface to
# generating Pythia events.
# To set the path to the Pythia 8 Python interface do either
# (in a shell prompt):
# export PYTHONPATH=$(PREFIX_LIB):$PYTHONPATH
# or the following which sets the path from within Python.
import sys
cfg = open("Makefile.inc")
lib = "../lib"
for line in cfg:
if line.startswith("PREFIX_LIB="): lib = line[11:-1]; break
sys.path.insert(0, lib)
# Import the Pythia module.
import pythia8
#==========================================================================
# The following code demonstrates how to use the nextBatch function to
# generate an Awkward array of events using a single Pythia instance.
# Create a Pythia instance.
pythia = pythia8.Pythia()
pythia.readString("Beams:eCM = 8000.")
pythia.readString("HardQCD:all = on")
pythia.readString("PhaseSpace:pTHatMin = 20.")
pythia.init()
# Generate a run of events.
run = pythia.nextBatch(2)
# The following is intended to demonstrate the structure of the
# returned array. Normally, you would not use a for loop like this and
# instead use array slicing, which is shown later.
for event in run:
# The event object consists of the event info, accessed as
# event.info, and the particles, accessed as event.prt.
# Print the ID of the first scattering parton for each event.
# Most, but not all, of the event info is available this way,
# where the naming convention follows the methods of the Info
# class in Pythia.
print(event.info.id1)
# Loop over the particles.
for prt in event.prt:
# Print the ID of the first scattering parton. The
# particle information is accessible in a similar fashion to
# the event info, where all the relevant data members of the
# Particle class in Pythia are available.
if (prt.status != -21): continue
print(prt.id)
# Print the particle energy. The momentum is accessed via
# prt.p, and has the relevant Vec4 data members: px, py, pz,
# and e.
vec = prt.p
print(vec.e)
break
#==========================================================================
# The nextBatch method is also available for PythiaParallel. The
# configuration of PythiaParallel is the same as shown in
# main221.cc. However, an event analysis function is not needed,
# because the result is instead the full event record for each event.
# Create and initialize the parallel instance.
pythia = pythia8.PythiaParallel()
pythia.readString("Beams:eCM = 8000.")
pythia.readString("HardQCD:all = on")
pythia.readString("PhaseSpace:pTHatMin = 20.")
pythia.init()
# Generate events.
events = pythia.nextBatch(1000)
# Generally, we would use array slicing to perform operations on the
# event record. There are some good examples given with the Awkward
# library.
# https://awkward-array.org/doc/main/getting-started/
# jagged-ragged-awkward-arrays.html
# We can use array slicing to quickly access all the charged pions in
# the event.
cpis = events.prt[abs(events.prt.id) == 211]
# We can then plot the energy of these pions. The following requires
# matplotlib to be installed.
# python -m pip install matplotlib
# To make a histogram of the array, we have to flatten it with the
# awkward.flatten method.
import awkward as ak
try:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.hist(ak.flatten(cpis.p.e))
fig.savefig("main297_e.pdf")
except:
pass
# It is possible to also use the scikit-hep vector package to interact
# with the particle momentum as a four-vector. The following requires
# the vector package to be installed.
# python -m pip install vector
try:
import vector
# This tells vector to convert compatible Awkward arrays into
# appropriate vector objects.
vector.register_awkward()
# We can now plot the pseudorapidity of the charged pions. Here,
# the eta member of the charged pion momenta is now available as
# p.eta. Similarly, methods like phi, etc. are available.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.hist(ak.flatten(cpis.p.eta))
fig.savefig("main297_eta.pdf")
except:
pass