numpythia
has not been actively maintained for a couple of years. This is mostly due to the emergence of new alternatives which are both faster and more flexible.
For example:
- The official Pythia 8 (SWIG) bindings available from Conda.
- The impy project implementing a generic user interface to popular event generators used in cosmic ray and high-energy particle physics.
numpythia provides an interface between PYTHIA and NumPy allowing you to generate events as NumPy arrays of particle four-momenta. By default numpythia only depends on NumPy and builds internal copies of the PYTHIA and HepMC source code.
To simply use the built-in PYTHIA and HepMC:
pip install -v numpythia
And you're good to go!
Support for building against an external PYTHIA is on the wishlist.
Note that if you are using a Mac OSX system, then installation may require setting an environment variable as explained here.
>>> from numpythia import Pythia, hepmc_write, hepmc_read
>>> from numpythia import STATUS, HAS_END_VERTEX, ABS_PDG_ID
>>> from numpythia.testcmnd import get_cmnd
>>> from numpy.testing import assert_array_equal
>>> pythia = Pythia(get_cmnd('w'), random_state=1)
>>> selection = ((STATUS == 1) & ~HAS_END_VERTEX &
(ABS_PDG_ID != 12) & (ABS_PDG_ID != 14) & (ABS_PDG_ID != 16))
>>> # generate events while writing to ascii hepmc
>>> for event in hepmc_write('events.hepmc', pythia(events=1)):
>>> array1 = event.all(selection)
>>> # read the same event back from ascii hepmc
>>> for event in hepmc_read('events.hepmc'):
>>> array2 = event.all(selection)
>>> assert_array_equal(array1, array2)
True
The dtype of any array of particle information is:
np.dtype([('E', 'f8'), ('px', 'f8'), ('py', 'f8'), ('pz', 'f8'), ('pt', 'f8'),
('mass', 'f8'), ('rap', 'f8'), ('eta', 'f8'), ('theta', 'f8'),
('phi', 'f8'), ('prodx', 'f8'), ('prody', 'f8'), ('prodz', 'f8'),
('prodt', 'f8'), ('pdgid', 'i4'), ('status', 'i4')])
Also see pyjet for jet clustering.
PYTHIA settings can be passed in one of three ways: through the **kwargs arguments of the constructor Pythia(..., **kwargs):
>>> pythia = Pythia(..., Beams_eCM=13000.)
Or as a dictionary:
>>> pythia = Pythia(..., params={'Beams:eCM': 13000.})
Or via a Python command file:
>>> pythia = Pythia(config='path/to/config.cmd')
The full list of settings can be found on the PYTHIA homepage.
Note that the ":" in settings names is replaced by a "_" if using kwargs. kwargs take precedence over params and they both take precedence over config. Example config files can be found under the numpythia.testcmnd directory.
To generate events do
>>> events = pythia(events=100)
>>> events
<generator at 0x10cf06f78>
where events is a generator of GenEvent
containing all the generated particles.
Generated particles can be accessed through the all
, first
and last
methods which have two optional arguments selection
and return_hepmc
.
Selection is a filter or a combination of filters with bitwise operations (as
shown in the getting started example) applied on the particles in the event.
The available filters are
STATUS, PDG_ID, ABS_PDG_ID, HAS_END_VERTEX, HAS_PRODUCTION_VERTEX,
HAS_SAME_PDG_ID_DAUGHTER, IS_STABLE, IS_BEAM
return_hepmc
is by default set to False
when using all
:
>>> for e in events:
>>> array = e.all(selection)
returns an array of particles, with the dtype described above. return_hepmc
is
by default set to True
for first
and last
:
>>> for e in events:
>>> gen_part_f = e.first(selection)
>>> gen_part_l = e.last(selection)
returns a GenParticle
.
GenParticle
is the numpythia interface of
HepMC::GenParticle,
and has the following attributes
pid, status, e, px, py, pz, pt, eta, phi, mass, theta, rap
GenParticle
also has the following methods parents
, children
, ancestors
,
descendants
and siblings
both with the two optional arguments selection
and return_hepmc
described before. For instance:
>>> for e in events:
>>> w = e.last((ABS_PDG_ID == 24) & HAS_END_VERTEX))
>>> w.children()
array([(240.60708981, 115.76101664, 126.16766767, -169.03439984, 171.22760682, 0.5, -0.87228439, -0.87228739, 2.34974894, 0.82838703, 0., 0., 0., 0., 3, 23),
( 52.59241372, 9.21296404, 50.77873929, -10.01763001, 51.60774235, 1.5, -0.19283178, -0.19291222, 1.76252302, 1.39131523, 0., 0., 0., 0., -4, 23)],
dtype=[('E', '<f8'), ('px', '<f8'), ('py', '<f8'), ('pz', '<f8'), ('pT', '<f8'), ('mass', '<f8'), ('rap', '<f8'), ('eta', '<f8'), ('theta', '<f8'), ('phi', '<f8'), ('prodx', '<f8'), ('prody', '<f8'), ('prodz', '<f8'), ('prodt', '<f8'), ('pdgid', '<i4'), ('status', '<i4')])