Particles and decays
in the Scikit-HEP project

Eduardo Rodrigues
University of Cincinnati

PyHEP 2019 Workshop, Abingdon, 16-18 October 2019

Notebook: https://github.com/eduardo-rodrigues/2019-10-16_PyHEP2019Workshop

Particle package logo

PDG particle data and MC identification codes
with the Particle package

Pythonic interface to

  • Particle Data Group (PDG) particle data table.
  • Particle MC identification codes, with inter-MC converters.
  • With various extra goodies.

Package motivation - particle data

  • The PDG provides a downloadable table of particle masses, widths, charges and Monte Carlo particle ID numbers (PDG IDs).
    • Most recent file here.
  • It also provided an experimental file with extended information (spin, quark content, P and C parities, etc.) until 2008 only, see here (not widely known!).

  • But *anyone* wanting to use these data, the only readily available, has to parse the file programmatically.

  • Why not make a Python package to deal with all these data, for everyone?

Package motivation - MC identification codes

  • The C++ HepPID and HepPDT libraries provide functions for processing particle ID codes</apan> in the standard particle (aka PDG) numbering scheme.
  • Different event generators have their separate set of particle IDs: Pythia, EvtGen, etc.
  • Again, why not make a package providing all functionality/conversions, Python-ically, for everyone?

Package, in short

  • Particle - loads extended PDG data tables and implements search and manipulations / display.
  • PDGID - find out as much as possible from the PDG ID number. No table lookup.
  • Converters for MC IDs used in Pythia and Geant.
  • Basic usage via the command line.
  • Fexible / advanced usage programmatically.

1. Command line usage

Search and query ...

In [1]:
!python -m particle --version
particle 0.6.2
In [3]:
!python -m particle -h
usage: particle [-h] [--version] {search,pdgid} ...

Particle command line display utility. Has two modes.

positional arguments:
  {search,pdgid}  Subcommands
    search        Look up particles by PID or name (Ex.: python -m particle
                  search D+ D-)
    pdgid         Print info from PID (Ex.: python -m particle pdgid 11 13)

optional arguments:
  -h, --help      show this help message and exit
  --version       show program's version number and exit

PDGID

Print all information from a PDG ID:

In [4]:
!python -m particle pdgid 211
<PDGID: 211>
A              None
C              None
J              0.0
L              0
P              -1
S              0
Z              None
abspid         211
charge         1.0
has_bottom     False
has_charm      False
has_down       True
has_fundamental_anti False
has_strange    False
has_top        False
has_up         True
is_Qball       False
is_Rhadron     False
is_SUSY        False
is_baryon      False
is_diquark     False
is_dyon        False
is_hadron      True
is_lepton      False
is_meson       True
is_nucleus     False
is_pentaquark  False
is_valid       True
j_spin         1
l_spin         1
s_spin         1
three_charge   3

Particle

Search a particle by its PDG ID - return description summary of particle:

In [5]:
!python -m particle search 211
Name: pi+            ID: 211          Latex: $\pi^{+}$
Mass  = 139.57061 ± 0.00024 MeV
Lifetime = 26.033 ± 0.005 ns
Q (charge)        = +       J (total angular) = 0.0      P (space parity) = -
C (charge parity) = ?       I (isospin)       = 1        G (G-parity)     = -
    SpinType: SpinType.PseudoScalar
    Quarks: uD
    Antiparticle name: pi- (antiparticle status: ChargeInv)

Search a particle by its name - either return the description summary of matching particle ...

In [6]:
!python -m particle search "pi(1400)+"
Name: pi(1)(1400)+   ID: 9000213      Latex: $\pi_{1}(1400)^{+}$
Mass  = 1354 ± 25 MeV
Width = 330 ± 35 MeV
Q (charge)        = +       J (total angular) = 1.0      P (space parity) = -
C (charge parity) = ?       I (isospin)       = 1        G (G-parity)     = -
    SpinType: SpinType.Vector
    Quarks: Maybe non-qQ
    Antiparticle name: pi(1)(1400)- (antiparticle status: ChargeInv)

... or a list of particles matching the keyword in their names:

In [7]:
!python -m particle search "pi+"
<Particle: name="pi+", pdgid=211, mass=139.57061 ± 0.00024 MeV>
<Particle: name="pi(2)(1670)+", pdgid=10215, mass=1670.6 + 2.9 - 1.2 MeV>
<Particle: name="pi(1300)+", pdgid=100211, mass=1300 ± 100 MeV>
<Particle: name="pi(1)(1400)+", pdgid=9000213, mass=1354 ± 25 MeV>
<Particle: name="pi(1800)+", pdgid=9010211, mass=1810 + 9 - 11 MeV>
<Particle: name="pi(1)(1600)+", pdgid=9010213, mass=1660 + 15 - 11 MeV>

Bonus feature: zipapp

Package provides a zipapp version - one file that runs on any computer with Python, no other dependencies! Find it attached to releases.

Example:

./particle.pyz search gamma

All dependencies are installed inside the zipapp, and the data lookup is handled in a zip-safe way inside particle. Python 3 is used to make the zipapp, but including the backports makes it work on Python 2 as well.

2. PDGID class and MC ID classes

  • Classes PDGID, PythiaID, GeantID.
  • Converters in module particle.converters: Geant2PDGIDBiMap, etc.

PDG IDs module overview

  • Process and query PDG IDs, and more – no look-up table needed.
    • Current version of package reflects the latest version of the HepPID & HepPDT utility functions defined in the C++ HepPID and HepPDT versions 3.04.01
    • It contains more functionality than that available in the C++ code … and minor fixes too.
  • Definition of a PDGID class, PDG ID literals, and set of standalone HepPID functions to query PDG IDs (is_meson, has_bottom, j_spin, charge, etc.).
    • All PDGID class functions are available standalone.

PDGID class

  • Wrapper class PDGID for PDG IDs.
  • Behaves like an int, with extra goodies.
  • Large spectrum of properties and methods, with a Pythonic interface, and yet more!
In [8]:
from particle import PDGID
In [9]:
pid = PDGID(211)
pid
Out[9]:
<PDGID: 211>
In [10]:
PDGID(99999999)
Out[10]:
<PDGID: 99999999 (is_valid==False)>
In [11]:
from particle.pdgid import is_meson

pid.is_meson, is_meson(pid)
Out[11]:
(True, True)

To print all PDGID properties:

In [12]:
print(pid.info())
A              None
C              None
J              0.0
L              0
P              -1
S              0
Z              None
abspid         211
charge         1.0
has_bottom     False
has_charm      False
has_down       True
has_fundamental_anti False
has_strange    False
has_top        False
has_up         True
is_Qball       False
is_Rhadron     False
is_SUSY        False
is_baryon      False
is_diquark     False
is_dyon        False
is_hadron      True
is_lepton      False
is_meson       True
is_nucleus     False
is_pentaquark  False
is_valid       True
j_spin         1
l_spin         1
s_spin         1
three_charge   3

MC ID classes and converters

  • Classes for MC IDs used in Pythia and Geant: PythiaID and GeantID.
  • ID converters in module particle.converters: Geant2PDGIDBiMap, etc.
In [14]:
from particle import PythiaID, GeantID

pyid = PythiaID(10221)

pyid.to_pdgid()
Out[14]:
<PDGID: 9010221>

Conversions are directly available via mapping classes.

E.g., bi-directional map Pythia ID - PDG ID:

In [15]:
from particle.converters import Pythia2PDGIDBiMap

Pythia2PDGIDBiMap[PDGID(9010221)]
Out[15]:
<PythiaID: 10221>
In [16]:
Pythia2PDGIDBiMap[PythiaID(10221)]
Out[16]:
<PDGID: 9010221>

3. Particle class

There are lots of ways to create a particle.

In [20]:
from particle import Particle

From a PDG ID

In [18]:
Particle.from_pdgid(211)
Out[18]:
$\pi^{+}$

From a name

In [21]:
Particle.from_string('pi+')
Out[21]:
$\pi^{+}$

Searching

Simple and natural API to deal with the PDG particle data table,
with powerful 1-line search and look-up utilities!

  • Particle.find(…) – search a single match (exception raised if multiple particles match the search specifications).
  • Particle.findall(…) – search a list of candidates.

  • Search methods that can query any particle property!

In [22]:
Particle.find('J/psi')
Out[22]:
$J/\psi(1S)$

You can specify search terms as keywords - any particle property:

In [23]:
Particle.find(latex_name=r'\phi(1020)')
Out[23]:
$\phi(1020)$

Some properties have enums available. For example, you can directly check the numeric charge:

In [24]:
Particle.findall('pi', charge=-1)
Out[24]:
[<Particle: name="pi-", pdgid=-211, mass=139.57061 ± 0.00024 MeV>,
 <Particle: name="pi(2)(1670)-", pdgid=-10215, mass=1670.6 + 2.9 - 1.2 MeV>,
 <Particle: name="pi(1300)-", pdgid=-100211, mass=1300 ± 100 MeV>,
 <Particle: name="pi(1)(1400)-", pdgid=-9000213, mass=1354 ± 25 MeV>,
 <Particle: name="pi(1800)-", pdgid=-9010211, mass=1810 + 9 - 11 MeV>,
 <Particle: name="pi(1)(1600)-", pdgid=-9010213, mass=1660 + 15 - 11 MeV>]

Or you can use the enum (for charge, this is 3 times the charge, hence the name three_charge)

In [25]:
from particle import Charge

Particle.findall('pi', three_charge=Charge.p)
Out[25]:
[<Particle: name="pi+", pdgid=211, mass=139.57061 ± 0.00024 MeV>,
 <Particle: name="pi(2)(1670)+", pdgid=10215, mass=1670.6 + 2.9 - 1.2 MeV>,
 <Particle: name="pi(1300)+", pdgid=100211, mass=1300 ± 100 MeV>,
 <Particle: name="pi(1)(1400)+", pdgid=9000213, mass=1354 ± 25 MeV>,
 <Particle: name="pi(1800)+", pdgid=9010211, mass=1810 + 9 - 11 MeV>,
 <Particle: name="pi(1)(1600)+", pdgid=9010213, mass=1660 + 15 - 11 MeV>]

Or use a lambda function for the ultimate in generality! For example, to find all the neutral particles with a bottom quark between 5.2 and 5.3 GeV:

In [26]:
from hepunits import GeV, s  # Units are good. Use them.
In [27]:
Particle.findall(lambda p:
                     p.pdgid.has_bottom
                     and p.charge==0
                     and 5.2*GeV < p.mass < 5.3*GeV
                )
Out[27]:
[<Particle: name="B0", pdgid=511, mass=5279.64 ± 0.13 MeV>,
 <Particle: name="B~0", pdgid=-511, mass=5279.64 ± 0.13 MeV>]

Another lambda function example: You can use the width or the lifetime:

In [28]:
Particle.findall(lambda p: p.lifetime > 1000*s)
Out[28]:
[<Particle: name="e-", pdgid=11, mass=0.510998946 ± 0.000000003 MeV>,
 <Particle: name="e+", pdgid=-11, mass=0.510998946 ± 0.000000003 MeV>,
 <Particle: name="nu(e)", pdgid=12, mass=0.0 MeV>,
 <Particle: name="nu(e)~", pdgid=-12, mass=0.0 MeV>,
 <Particle: name="nu(mu)", pdgid=14, mass=0.0 MeV>,
 <Particle: name="nu(mu)~", pdgid=-14, mass=0.0 MeV>,
 <Particle: name="nu(tau)", pdgid=16, mass=0.0 MeV>,
 <Particle: name="nu(tau)~", pdgid=-16, mass=0.0 MeV>,
 <Particle: name="g", pdgid=21, mass=0.0 MeV>,
 <Particle: name="gamma", pdgid=22, mass=0.0 MeV>,
 <Particle: name="H0", pdgid=25, mass=125100 ± 140 MeV>,
 <Particle: name="B*+", pdgid=523, mass=5324.70 ± 0.22 MeV>,
 <Particle: name="B*-", pdgid=-523, mass=5324.70 ± 0.22 MeV>,
 <Particle: name="p", pdgid=2212, mass=938.272081 ± 0.000006 MeV>,
 <Particle: name="p~", pdgid=-2212, mass=938.272081 ± 0.000006 MeV>,
 <Particle: name="h(b)(1P)", pdgid=10553, mass=9899.3 ± 0.8 MeV>,
 <Particle: name="Upsilon(2)(1D)", pdgid=20555, mass=10163.7 ± 1.4 MeV>,
 <Particle: name="Lambda(c)(2625)+", pdgid=104122, mass=2628.11 ± 0.19 MeV>,
 <Particle: name="Lambda(c)(2625)~-", pdgid=-104122, mass=2628.11 ± 0.19 MeV>,
 <Particle: name="Xi(1690)-", pdgid=203312, mass=1690 ± 10 MeV>,
 <Particle: name="Xi(1690)~+", pdgid=-203312, mass=1690 ± 10 MeV>,
 <Particle: name="Xi(1690)0", pdgid=203322, mass=1690 ± 10 MeV>,
 <Particle: name="Xi(1690)~0", pdgid=-203322, mass=1690 ± 10 MeV>]

If you want infinite lifetime, you could just use the keyword search instead:

In [29]:
Particle.findall(lifetime=float('inf'))
Out[29]:
[<Particle: name="e-", pdgid=11, mass=0.510998946 ± 0.000000003 MeV>,
 <Particle: name="e+", pdgid=-11, mass=0.510998946 ± 0.000000003 MeV>,
 <Particle: name="nu(e)", pdgid=12, mass=0.0 MeV>,
 <Particle: name="nu(e)~", pdgid=-12, mass=0.0 MeV>,
 <Particle: name="nu(mu)", pdgid=14, mass=0.0 MeV>,
 <Particle: name="nu(mu)~", pdgid=-14, mass=0.0 MeV>,
 <Particle: name="nu(tau)", pdgid=16, mass=0.0 MeV>,
 <Particle: name="nu(tau)~", pdgid=-16, mass=0.0 MeV>,
 <Particle: name="g", pdgid=21, mass=0.0 MeV>,
 <Particle: name="gamma", pdgid=22, mass=0.0 MeV>,
 <Particle: name="H0", pdgid=25, mass=125100 ± 140 MeV>,
 <Particle: name="B*+", pdgid=523, mass=5324.70 ± 0.22 MeV>,
 <Particle: name="B*-", pdgid=-523, mass=5324.70 ± 0.22 MeV>,
 <Particle: name="p", pdgid=2212, mass=938.272081 ± 0.000006 MeV>,
 <Particle: name="p~", pdgid=-2212, mass=938.272081 ± 0.000006 MeV>,
 <Particle: name="h(b)(1P)", pdgid=10553, mass=9899.3 ± 0.8 MeV>,
 <Particle: name="Upsilon(2)(1D)", pdgid=20555, mass=10163.7 ± 1.4 MeV>,
 <Particle: name="Lambda(c)(2625)+", pdgid=104122, mass=2628.11 ± 0.19 MeV>,
 <Particle: name="Lambda(c)(2625)~-", pdgid=-104122, mass=2628.11 ± 0.19 MeV>,
 <Particle: name="Xi(1690)-", pdgid=203312, mass=1690 ± 10 MeV>,
 <Particle: name="Xi(1690)~+", pdgid=-203312, mass=1690 ± 10 MeV>,
 <Particle: name="Xi(1690)0", pdgid=203322, mass=1690 ± 10 MeV>,
 <Particle: name="Xi(1690)~0", pdgid=-203322, mass=1690 ± 10 MeV>]

Trivially find all pseudoscalar charm mesons:

In [30]:
from particle import SpinType

Particle.findall(lambda p: p.pdgid.is_meson and p.pdgid.has_charm and p.spin_type==SpinType.PseudoScalar)
Out[30]:
[<Particle: name="D+", pdgid=411, mass=1869.65 ± 0.05 MeV>,
 <Particle: name="D-", pdgid=-411, mass=1869.65 ± 0.05 MeV>,
 <Particle: name="D0", pdgid=421, mass=1864.83 ± 0.05 MeV>,
 <Particle: name="D~0", pdgid=-421, mass=1864.83 ± 0.05 MeV>,
 <Particle: name="D(s)+", pdgid=431, mass=1968.34 ± 0.07 MeV>,
 <Particle: name="D(s)-", pdgid=-431, mass=1968.34 ± 0.07 MeV>,
 <Particle: name="eta(c)(1S)", pdgid=441, mass=2983.9 ± 0.5 MeV>,
 <Particle: name="B(c)+", pdgid=541, mass=6274.9 ± 0.8 MeV>,
 <Particle: name="B(c)-", pdgid=-541, mass=6274.9 ± 0.8 MeV>,
 <Particle: name="eta(c)(2S)", pdgid=100441, mass=3637.5 ± 1.1 MeV>]

Display

Nice display in Jupyter notebooks, as well as str and repr support:

In [31]:
p = Particle.from_pdgid(-415)
p
Out[31]:
$D_{2}^{*}(2460)^{-}$
In [32]:
print(p)
D(2)*(2460)-
In [33]:
print(repr(p))
<Particle: name="D(2)*(2460)-", pdgid=-415, mass=2465.4 ± 1.3 MeV>

Full descriptions:

In [34]:
print(p.describe())
Name: D(2)*(2460)-   ID: -415         Latex: $D_{2}^{*}(2460)^{-}$
Mass  = 2465.4 ± 1.3 MeV
Width = 46.7 ± 1.2 MeV
Q (charge)        = -       J (total angular) = 2.0      P (space parity) = +
C (charge parity) = ?       I (isospin)       = 1/2      G (G-parity)     = ?
    SpinType: SpinType.Tensor
    Quarks: Cd
    Antiparticle name: D(2)*(2460)+ (antiparticle status: ChargeInv)

You may find LaTeX or HTML to be more useful in your program; both are supported:

In [35]:
print(p.latex_name, '\n', p.html_name)
D_{2}^{*}(2460)^{-} 
 D<SUB>2</SUB><SUP>*</SUP>(2460)<SUP>-</SUP>

It is easy to get hold of the whole list of particle (instances) as a list:

In [36]:
print('# of particles in loaded data table:', len(Particle.all()))
Particle.all()
# of particles in loaded data table: 536
Out[36]:
[<Particle: name="d", pdgid=1, mass=4.67 + 0.50 - 0.20 MeV>,
 <Particle: name="d~", pdgid=-1, mass=4.67 + 0.50 - 0.20 MeV>,
 <Particle: name="u", pdgid=2, mass=2.2 + 0.5 - 0.3 MeV>,
 <Particle: name="u~", pdgid=-2, mass=2.2 + 0.5 - 0.3 MeV>,
 <Particle: name="s", pdgid=3, mass=93 + 11 - 5 MeV>,
 <Particle: name="s~", pdgid=-3, mass=93 + 11 - 5 MeV>,
 <Particle: name="c", pdgid=4, mass=1270 ± 20 MeV>,
 <Particle: name="c~", pdgid=-4, mass=1270 ± 20 MeV>,
 <Particle: name="b", pdgid=5, mass=4180 + 30 - 20 MeV>,
 <Particle: name="b~", pdgid=-5, mass=4180 + 30 - 20 MeV>,
 <Particle: name="t", pdgid=6, mass=173100 ± 900 MeV>,
 <Particle: name="t~", pdgid=-6, mass=173100 ± 900 MeV>,
 <Particle: name="e-", pdgid=11, mass=0.510998946 ± 0.000000003 MeV>,
 <Particle: name="e+", pdgid=-11, mass=0.510998946 ± 0.000000003 MeV>,
 <Particle: name="nu(e)", pdgid=12, mass=0.0 MeV>,
 <Particle: name="nu(e)~", pdgid=-12, mass=0.0 MeV>,
 <Particle: name="mu-", pdgid=13, mass=105.6583745 ± 0.0000024 MeV>,
 <Particle: name="mu+", pdgid=-13, mass=105.6583745 ± 0.0000024 MeV>,
 <Particle: name="nu(mu)", pdgid=14, mass=0.0 MeV>,
 <Particle: name="nu(mu)~", pdgid=-14, mass=0.0 MeV>,
 <Particle: name="tau-", pdgid=15, mass=1776.86 ± 0.12 MeV>,
 <Particle: name="tau+", pdgid=-15, mass=1776.86 ± 0.12 MeV>,
 <Particle: name="nu(tau)", pdgid=16, mass=0.0 MeV>,
 <Particle: name="nu(tau)~", pdgid=-16, mass=0.0 MeV>,
 <Particle: name="g", pdgid=21, mass=0.0 MeV>,
 <Particle: name="gamma", pdgid=22, mass=0.0 MeV>,
 <Particle: name="Z0", pdgid=23, mass=91187.6 ± 2.1 MeV>,
 <Particle: name="W+", pdgid=24, mass=80379 ± 12 MeV>,
 <Particle: name="W-", pdgid=-24, mass=80379 ± 12 MeV>,
 <Particle: name="H0", pdgid=25, mass=125100 ± 140 MeV>,
 <Particle: name="pi0", pdgid=111, mass=134.9770 ± 0.0005 MeV>,
 <Particle: name="rho(770)0", pdgid=113, mass=775.3 ± 0.2 MeV>,
 <Particle: name="a(2)(1320)0", pdgid=115, mass=1316.9 ± 0.9 MeV>,
 <Particle: name="rho(3)(1690)0", pdgid=117, mass=1688.8 ± 2.1 MeV>,
 <Particle: name="a(4)(1970)0", pdgid=119, mass=1967 ± 16 MeV>,
 <Particle: name="K(L)0", pdgid=130, mass=497.611 ± 0.013 MeV>,
 <Particle: name="pi+", pdgid=211, mass=139.57061 ± 0.00024 MeV>,
 <Particle: name="pi-", pdgid=-211, mass=139.57061 ± 0.00024 MeV>,
 <Particle: name="rho(770)+", pdgid=213, mass=775.3 ± 0.2 MeV>,
 <Particle: name="rho(770)-", pdgid=-213, mass=775.3 ± 0.2 MeV>,
 <Particle: name="a(2)(1320)+", pdgid=215, mass=1316.9 ± 0.9 MeV>,
 <Particle: name="a(2)(1320)-", pdgid=-215, mass=1316.9 ± 0.9 MeV>,
 <Particle: name="rho(3)(1690)+", pdgid=217, mass=1688.8 ± 2.1 MeV>,
 <Particle: name="rho(3)(1690)-", pdgid=-217, mass=1688.8 ± 2.1 MeV>,
 <Particle: name="a(4)(1970)+", pdgid=219, mass=1967 ± 16 MeV>,
 <Particle: name="a(4)(1970)-", pdgid=-219, mass=1967 ± 16 MeV>,
 <Particle: name="eta", pdgid=221, mass=547.862 ± 0.017 MeV>,
 <Particle: name="omega(782)", pdgid=223, mass=782.65 ± 0.12 MeV>,
 <Particle: name="f(2)(1270)", pdgid=225, mass=1275.5 ± 0.8 MeV>,
 <Particle: name="omega(3)(1670)", pdgid=227, mass=1667 ± 4 MeV>,
 <Particle: name="f(4)(2050)", pdgid=229, mass=2018 ± 11 MeV>,
 <Particle: name="K(S)0", pdgid=310, mass=497.611 ± 0.013 MeV>,
 <Particle: name="K0", pdgid=311, mass=497.611 ± 0.013 MeV>,
 <Particle: name="K~0", pdgid=-311, mass=497.611 ± 0.013 MeV>,
 <Particle: name="K*(892)0", pdgid=313, mass=895.55 ± 0.20 MeV>,
 <Particle: name="K*(892)~0", pdgid=-313, mass=895.55 ± 0.20 MeV>,
 <Particle: name="K(2)*(1430)0", pdgid=315, mass=1432.4 ± 1.3 MeV>,
 <Particle: name="K(2)*(1430)~0", pdgid=-315, mass=1432.4 ± 1.3 MeV>,
 <Particle: name="K(3)*(1780)0", pdgid=317, mass=1776 ± 7 MeV>,
 <Particle: name="K(3)*(1780)~0", pdgid=-317, mass=1776 ± 7 MeV>,
 <Particle: name="K(4)*(2045)0", pdgid=319, mass=2045 ± 9 MeV>,
 <Particle: name="K(4)*(2045)~0", pdgid=-319, mass=2045 ± 9 MeV>,
 <Particle: name="K+", pdgid=321, mass=493.677 ± 0.016 MeV>,
 <Particle: name="K-", pdgid=-321, mass=493.677 ± 0.016 MeV>,
 <Particle: name="K*(892)+", pdgid=323, mass=891.7 ± 0.3 MeV>,
 <Particle: name="K*(892)-", pdgid=-323, mass=891.7 ± 0.3 MeV>,
 <Particle: name="K(2)*(1430)+", pdgid=325, mass=1425.6 ± 1.5 MeV>,
 <Particle: name="K(2)*(1430)-", pdgid=-325, mass=1425.6 ± 1.5 MeV>,
 <Particle: name="K(3)*(1780)+", pdgid=327, mass=1776 ± 7 MeV>,
 <Particle: name="K(3)*(1780)-", pdgid=-327, mass=1776 ± 7 MeV>,
 <Particle: name="K(4)*(2045)+", pdgid=329, mass=2045 ± 9 MeV>,
 <Particle: name="K(4)*(2045)-", pdgid=-329, mass=2045 ± 9 MeV>,
 <Particle: name="eta'(958)", pdgid=331, mass=957.78 ± 0.06 MeV>,
 <Particle: name="phi(1020)", pdgid=333, mass=1019.461 ± 0.016 MeV>,
 <Particle: name="f(2)'(1525)", pdgid=335, mass=1525 ± 5 MeV>,
 <Particle: name="phi(3)(1850)", pdgid=337, mass=1854 ± 7 MeV>,
 <Particle: name="D+", pdgid=411, mass=1869.65 ± 0.05 MeV>,
 <Particle: name="D-", pdgid=-411, mass=1869.65 ± 0.05 MeV>,
 <Particle: name="D*(2010)+", pdgid=413, mass=2010.26 ± 0.05 MeV>,
 <Particle: name="D*(2010)-", pdgid=-413, mass=2010.26 ± 0.05 MeV>,
 <Particle: name="D(2)*(2460)+", pdgid=415, mass=2465.4 ± 1.3 MeV>,
 <Particle: name="D(2)*(2460)-", pdgid=-415, mass=2465.4 ± 1.3 MeV>,
 <Particle: name="D0", pdgid=421, mass=1864.83 ± 0.05 MeV>,
 <Particle: name="D~0", pdgid=-421, mass=1864.83 ± 0.05 MeV>,
 <Particle: name="D*(2007)0", pdgid=423, mass=2006.85 ± 0.05 MeV>,
 <Particle: name="D*(2007)~0", pdgid=-423, mass=2006.85 ± 0.05 MeV>,
 <Particle: name="D(2)*(2460)0", pdgid=425, mass=2460.7 ± 0.4 MeV>,
 <Particle: name="D(2)*(2460)~0", pdgid=-425, mass=2460.7 ± 0.4 MeV>,
 <Particle: name="D(s)+", pdgid=431, mass=1968.34 ± 0.07 MeV>,
 <Particle: name="D(s)-", pdgid=-431, mass=1968.34 ± 0.07 MeV>,
 <Particle: name="D(s)*+", pdgid=433, mass=2112.2 ± 0.4 MeV>,
 <Particle: name="D(s)*-", pdgid=-433, mass=2112.2 ± 0.4 MeV>,
 <Particle: name="D(s2)*(2573)+", pdgid=435, mass=2569.1 ± 0.8 MeV>,
 <Particle: name="D(s2)*(2573)-", pdgid=-435, mass=2569.1 ± 0.8 MeV>,
 <Particle: name="eta(c)(1S)", pdgid=441, mass=2983.9 ± 0.5 MeV>,
 <Particle: name="J/psi(1S)", pdgid=443, mass=3096.900 ± 0.006 MeV>,
 <Particle: name="chi(c2)(1P)", pdgid=445, mass=3556.17 ± 0.07 MeV>,
 <Particle: name="B0", pdgid=511, mass=5279.64 ± 0.13 MeV>,
 <Particle: name="B~0", pdgid=-511, mass=5279.64 ± 0.13 MeV>,
 <Particle: name="B*0", pdgid=513, mass=5324.70 ± 0.22 MeV>,
 <Particle: name="B*~0", pdgid=-513, mass=5324.70 ± 0.22 MeV>,
 <Particle: name="B(2)*(5747)0", pdgid=515, mass=5739.5 ± 0.7 MeV>,
 <Particle: name="B(2)*(5747)~0", pdgid=-515, mass=5739.5 ± 0.7 MeV>,
 <Particle: name="B+", pdgid=521, mass=5279.33 ± 0.13 MeV>,
 <Particle: name="B-", pdgid=-521, mass=5279.33 ± 0.13 MeV>,
 <Particle: name="B*+", pdgid=523, mass=5324.70 ± 0.22 MeV>,
 <Particle: name="B*-", pdgid=-523, mass=5324.70 ± 0.22 MeV>,
 <Particle: name="B(2)*(5747)+", pdgid=525, mass=5739.5 ± 0.7 MeV>,
 <Particle: name="B(2)*(5747)-", pdgid=-525, mass=5739.5 ± 0.7 MeV>,
 <Particle: name="B(s)0", pdgid=531, mass=5366.88 ± 0.17 MeV>,
 <Particle: name="B(s)~0", pdgid=-531, mass=5366.88 ± 0.17 MeV>,
 <Particle: name="B(s)*0", pdgid=533, mass=5415.4 + 1.8 - 1.5 MeV>,
 <Particle: name="B(s)*~0", pdgid=-533, mass=5415.4 + 1.8 - 1.5 MeV>,
 <Particle: name="B(s2)*(5840)0", pdgid=535, mass=5839.85 ± 0.12 MeV>,
 <Particle: name="B(s2)*(5840)~0", pdgid=-535, mass=5839.85 ± 0.12 MeV>,
 <Particle: name="B(c)+", pdgid=541, mass=6274.9 ± 0.8 MeV>,
 <Particle: name="B(c)-", pdgid=-541, mass=6274.9 ± 0.8 MeV>,
 <Particle: name="Upsilon(1S)", pdgid=553, mass=9460.3 ± 0.3 MeV>,
 <Particle: name="chi(b2)(1P)", pdgid=555, mass=9912.2 ± 0.3 MeV>,
 <Particle: name="Delta(1620)-", pdgid=1112, mass=1610 ± 20 MeV>,
 <Particle: name="Delta(1620)~+", pdgid=-1112, mass=1610 ± 20 MeV>,
 <Particle: name="Delta(1232)-", pdgid=1114, mass=1232.0 ± 2.0 MeV>,
 <Particle: name="Delta(1232)~+", pdgid=-1114, mass=1232.0 ± 2.0 MeV>,
 <Particle: name="Delta(1905)-", pdgid=1116, mass=1880 + 30 - 25 MeV>,
 <Particle: name="Delta(1905)~+", pdgid=-1116, mass=1880 + 30 - 25 MeV>,
 <Particle: name="Delta(1950)-", pdgid=1118, mass=1930 + 20 - 15 MeV>,
 <Particle: name="Delta(1950)~+", pdgid=-1118, mass=1930 + 20 - 15 MeV>,
 <Particle: name="Delta(1620)0", pdgid=1212, mass=1610 ± 20 MeV>,
 <Particle: name="Delta(1620)~0", pdgid=-1212, mass=1610 ± 20 MeV>,
 <Particle: name="N(1520)0", pdgid=1214, mass=1515 ± 5 MeV>,
 <Particle: name="N(1520)~0", pdgid=-1214, mass=1515 ± 5 MeV>,
 <Particle: name="Delta(1905)0", pdgid=1216, mass=1880 + 30 - 25 MeV>,
 <Particle: name="Delta(1905)~0", pdgid=-1216, mass=1880 + 30 - 25 MeV>,
 <Particle: name="N(2190)0", pdgid=1218, mass=2180 ± 40 MeV>,
 <Particle: name="N(2190)~0", pdgid=-1218, mass=2180 ± 40 MeV>,
 <Particle: name="n", pdgid=2112, mass=939.565413 ± 0.000006 MeV>,
 <Particle: name="n~", pdgid=-2112, mass=939.565413 ± 0.000006 MeV>,
 <Particle: name="Delta(1232)0", pdgid=2114, mass=1232.0 ± 2.0 MeV>,
 <Particle: name="Delta(1232)~0", pdgid=-2114, mass=1232.0 ± 2.0 MeV>,
 <Particle: name="N(1675)0", pdgid=2116, mass=1675 + 5 - 10 MeV>,
 <Particle: name="N(1675)~0", pdgid=-2116, mass=1675 + 5 - 10 MeV>,
 <Particle: name="Delta(1950)0", pdgid=2118, mass=1930 + 20 - 15 MeV>,
 <Particle: name="Delta(1950)~0", pdgid=-2118, mass=1930 + 20 - 15 MeV>,
 <Particle: name="Delta(1620)+", pdgid=2122, mass=1610 ± 20 MeV>,
 <Particle: name="Delta(1620)~-", pdgid=-2122, mass=1610 ± 20 MeV>,
 <Particle: name="N(1520)+", pdgid=2124, mass=1515 ± 5 MeV>,
 <Particle: name="N(1520)~-", pdgid=-2124, mass=1515 ± 5 MeV>,
 <Particle: name="Delta(1905)+", pdgid=2126, mass=1880 + 30 - 25 MeV>,
 <Particle: name="Delta(1905)~-", pdgid=-2126, mass=1880 + 30 - 25 MeV>,
 <Particle: name="N(2190)+", pdgid=2128, mass=2180 ± 40 MeV>,
 <Particle: name="N(2190)~-", pdgid=-2128, mass=2180 ± 40 MeV>,
 <Particle: name="p", pdgid=2212, mass=938.272081 ± 0.000006 MeV>,
 <Particle: name="p~", pdgid=-2212, mass=938.272081 ± 0.000006 MeV>,
 <Particle: name="Delta(1232)+", pdgid=2214, mass=1232.0 ± 2.0 MeV>,
 <Particle: name="Delta(1232)~-", pdgid=-2214, mass=1232.0 ± 2.0 MeV>,
 <Particle: name="N(1675)+", pdgid=2216, mass=1675 + 5 - 10 MeV>,
 <Particle: name="N(1675)~-", pdgid=-2216, mass=1675 + 5 - 10 MeV>,
 <Particle: name="Delta(1950)+", pdgid=2218, mass=1930 + 20 - 15 MeV>,
 <Particle: name="Delta(1950)~-", pdgid=-2218, mass=1930 + 20 - 15 MeV>,
 <Particle: name="Delta(1620)++", pdgid=2222, mass=1610 ± 20 MeV>,
 <Particle: name="Delta(1620)~--", pdgid=-2222, mass=1610 ± 20 MeV>,
 <Particle: name="Delta(1232)++", pdgid=2224, mass=1232.0 ± 2.0 MeV>,
 <Particle: name="Delta(1232)~--", pdgid=-2224, mass=1232.0 ± 2.0 MeV>,
 <Particle: name="Delta(1905)++", pdgid=2226, mass=1880 + 30 - 25 MeV>,
 <Particle: name="Delta(1905)~--", pdgid=-2226, mass=1880 + 30 - 25 MeV>,
 <Particle: name="Delta(1950)++", pdgid=2228, mass=1930 + 20 - 15 MeV>,
 <Particle: name="Delta(1950)~--", pdgid=-2228, mass=1930 + 20 - 15 MeV>,
 <Particle: name="Sigma-", pdgid=3112, mass=1197.45 ± 0.03 MeV>,
 <Particle: name="Sigma~+", pdgid=-3112, mass=1197.45 ± 0.03 MeV>,
 <Particle: name="Sigma(1385)-", pdgid=3114, mass=1387.2 ± 0.5 MeV>,
 <Particle: name="Sigma(1385)~+", pdgid=-3114, mass=1387.2 ± 0.5 MeV>,
 <Particle: name="Sigma(1775)-", pdgid=3116, mass=1775 ± 5 MeV>,
 <Particle: name="Sigma(1775)~+", pdgid=-3116, mass=1775 ± 5 MeV>,
 <Particle: name="Sigma(2030)-", pdgid=3118, mass=2030 + 10 - 5 MeV>,
 <Particle: name="Sigma(2030)~+", pdgid=-3118, mass=2030 + 10 - 5 MeV>,
 <Particle: name="Lambda", pdgid=3122, mass=1115.683 ± 0.006 MeV>,
 <Particle: name="Lambda~", pdgid=-3122, mass=1115.683 ± 0.006 MeV>,
 <Particle: name="Lambda(1520)", pdgid=3124, mass=1519.5 ± 1.0 MeV>,
 <Particle: name="Lambda(1520)~", pdgid=-3124, mass=1519.5 ± 1.0 MeV>,
 <Particle: name="Lambda(1820)", pdgid=3126, mass=1820 ± 5 MeV>,
 <Particle: name="Lambda(1820)~", pdgid=-3126, mass=1820 ± 5 MeV>,
 <Particle: name="Lambda(2100)", pdgid=3128, mass=2100 ± 10 MeV>,
 <Particle: name="Lambda(2100)~", pdgid=-3128, mass=2100 ± 10 MeV>,
 <Particle: name="Sigma0", pdgid=3212, mass=1192.642 ± 0.024 MeV>,
 <Particle: name="Sigma~0", pdgid=-3212, mass=1192.642 ± 0.024 MeV>,
 <Particle: name="Sigma(1385)0", pdgid=3214, mass=1383.7 ± 1.0 MeV>,
 <Particle: name="Sigma(1385)~0", pdgid=-3214, mass=1383.7 ± 1.0 MeV>,
 <Particle: name="Sigma(1775)0", pdgid=3216, mass=1775 ± 5 MeV>,
 <Particle: name="Sigma(1775)~0", pdgid=-3216, mass=1775 ± 5 MeV>,
 <Particle: name="Sigma(2030)0", pdgid=3218, mass=2030 + 10 - 5 MeV>,
 <Particle: name="Sigma(2030)~0", pdgid=-3218, mass=2030 + 10 - 5 MeV>,
 <Particle: name="Sigma+", pdgid=3222, mass=1189.37 ± 0.07 MeV>,
 <Particle: name="Sigma~-", pdgid=-3222, mass=1189.37 ± 0.07 MeV>,
 <Particle: name="Sigma(1385)+", pdgid=3224, mass=1382.8 ± 0.3 MeV>,
 <Particle: name="Sigma(1385)~-", pdgid=-3224, mass=1382.8 ± 0.3 MeV>,
 <Particle: name="Sigma(1775)+", pdgid=3226, mass=1775 ± 5 MeV>,
 <Particle: name="Sigma(1775)~-", pdgid=-3226, mass=1775 ± 5 MeV>,
 <Particle: name="Sigma(2030)+", pdgid=3228, mass=2030 + 10 - 5 MeV>,
 <Particle: name="Sigma(2030)~-", pdgid=-3228, mass=2030 + 10 - 5 MeV>,
 <Particle: name="Xi-", pdgid=3312, mass=1321.71 ± 0.07 MeV>,
 <Particle: name="Xi~+", pdgid=-3312, mass=1321.71 ± 0.07 MeV>,
 <Particle: name="Xi(1530)-", pdgid=3314, mass=1535.0 ± 0.6 MeV>,
 <Particle: name="Xi(1530)~+", pdgid=-3314, mass=1535.0 ± 0.6 MeV>,
 <Particle: name="Xi0", pdgid=3322, mass=1314.86 ± 0.20 MeV>,
 <Particle: name="Xi~0", pdgid=-3322, mass=1314.86 ± 0.20 MeV>,
 <Particle: name="Xi(1530)0", pdgid=3324, mass=1531.8 ± 0.3 MeV>,
 <Particle: name="Xi(1530)~0", pdgid=-3324, mass=1531.8 ± 0.3 MeV>,
 <Particle: name="Omega-", pdgid=3334, mass=1672.5 ± 0.3 MeV>,
 <Particle: name="Omega~+", pdgid=-3334, mass=1672.5 ± 0.3 MeV>,
 <Particle: name="Sigma(c)(2455)0", pdgid=4112, mass=2453.75 ± 0.14 MeV>,
 <Particle: name="Sigma(c)(2455)~0", pdgid=-4112, mass=2453.75 ± 0.14 MeV>,
 <Particle: name="Sigma(c)(2520)0", pdgid=4114, mass=2518.48 ± 0.20 MeV>,
 <Particle: name="Sigma(c)(2520)~0", pdgid=-4114, mass=2518.48 ± 0.20 MeV>,
 <Particle: name="Lambda(c)+", pdgid=4122, mass=2286.46 ± 0.14 MeV>,
 <Particle: name="Lambda(c)~-", pdgid=-4122, mass=2286.46 ± 0.14 MeV>,
 <Particle: name="Xi(c)0", pdgid=4132, mass=2470.9 ± 0.2 MeV>,
 <Particle: name="Xi(c)~0", pdgid=-4132, mass=2470.9 ± 0.2 MeV>,
 <Particle: name="Sigma(c)(2455)+", pdgid=4212, mass=2452.9 ± 0.4 MeV>,
 <Particle: name="Sigma(c)(2455)~-", pdgid=-4212, mass=2452.9 ± 0.4 MeV>,
 <Particle: name="Sigma(c)(2520)+", pdgid=4214, mass=2517.5 ± 2.3 MeV>,
 <Particle: name="Sigma(c)(2520)~-", pdgid=-4214, mass=2517.5 ± 2.3 MeV>,
 <Particle: name="Sigma(c)(2455)++", pdgid=4222, mass=2453.97 ± 0.14 MeV>,
 <Particle: name="Sigma(c)(2455)~--", pdgid=-4222, mass=2453.97 ± 0.14 MeV>,
 <Particle: name="Sigma(c)(2520)++", pdgid=4224, mass=2518.41 + 0.21 - 0.19 MeV>,
 <Particle: name="Sigma(c)(2520)~--", pdgid=-4224, mass=2518.41 + 0.21 - 0.19 MeV>,
 <Particle: name="Xi(c)+", pdgid=4232, mass=2467.93 ± 0.18 MeV>,
 <Particle: name="Xi(c)~-", pdgid=-4232, mass=2467.93 ± 0.18 MeV>,
 <Particle: name="Xi(c)'0", pdgid=4312, mass=2579.2 ± 0.5 MeV>,
 <Particle: name="Xi(c)'~0", pdgid=-4312, mass=2579.2 ± 0.5 MeV>,
 <Particle: name="Xi(c)(2645)0", pdgid=4314, mass=2646.38 ± 0.21 MeV>,
 <Particle: name="Xi(c)(2645)~0", pdgid=-4314, mass=2646.38 ± 0.21 MeV>,
 <Particle: name="Xi(c)'+", pdgid=4322, mass=2578.4 ± 0.5 MeV>,
 <Particle: name="Xi(c)'~-", pdgid=-4322, mass=2578.4 ± 0.5 MeV>,
 <Particle: name="Xi(c)(2645)+", pdgid=4324, mass=2645.6 ± 0.3 MeV>,
 <Particle: name="Xi(c)(2645)~-", pdgid=-4324, mass=2645.6 ± 0.3 MeV>,
 <Particle: name="Omega(c)0", pdgid=4332, mass=2695.2 ± 1.7 MeV>,
 <Particle: name="Omega(c)~0", pdgid=-4332, mass=2695.2 ± 1.7 MeV>,
 <Particle: name="Omega(c)(2770)0", pdgid=4334, mass=2765.9 ± 2.0 MeV>,
 <Particle: name="Omega(c)(2770)~0", pdgid=-4334, mass=2765.9 ± 2.0 MeV>,
 <Particle: name="Sigma(b)-", pdgid=5112, mass=5815.6 ± 0.3 MeV>,
 <Particle: name="Sigma(b)~+", pdgid=-5112, mass=5815.6 ± 0.3 MeV>,
 <Particle: name="Sigma(b)*-", pdgid=5114, mass=5834.7 ± 0.3 MeV>,
 <Particle: name="Sigma(b)*~+", pdgid=-5114, mass=5834.7 ± 0.3 MeV>,
 <Particle: name="Lambda(b)0", pdgid=5122, mass=5619.60 ± 0.17 MeV>,
 <Particle: name="Lambda(b)~0", pdgid=-5122, mass=5619.60 ± 0.17 MeV>,
 <Particle: name="Xi(b)-", pdgid=5132, mass=5797.0 ± 0.9 MeV>,
 <Particle: name="Xi(b)~+", pdgid=-5132, mass=5797.0 ± 0.9 MeV>,
 <Particle: name="Sigma(b)+", pdgid=5222, mass=5810.6 ± 0.2 MeV>,
 <Particle: name="Sigma(b)~-", pdgid=-5222, mass=5810.6 ± 0.2 MeV>,
 <Particle: name="Sigma(b)*+", pdgid=5224, mass=5830.3 ± 0.3 MeV>,
 <Particle: name="Sigma(b)*~-", pdgid=-5224, mass=5830.3 ± 0.3 MeV>,
 <Particle: name="Xi(b)0", pdgid=5232, mass=5791.9 ± 0.5 MeV>,
 <Particle: name="Xi(b)~0", pdgid=-5232, mass=5791.9 ± 0.5 MeV>,
 <Particle: name="Omega(b)-", pdgid=5332, mass=6046.1 ± 1.7 MeV>,
 <Particle: name="Omega(b)~+", pdgid=-5332, mass=6046.1 ± 1.7 MeV>,
 <Particle: name="a(0)(1450)0", pdgid=10111, mass=1467 ± 14 MeV>,
 <Particle: name="b(1)(1235)0", pdgid=10113, mass=1230 ± 3 MeV>,
 <Particle: name="pi(2)(1670)0", pdgid=10115, mass=1670.6 + 2.9 - 1.2 MeV>,
 <Particle: name="a(0)(1450)+", pdgid=10211, mass=1467 ± 14 MeV>,
 <Particle: name="a(0)(1450)-", pdgid=-10211, mass=1467 ± 14 MeV>,
 <Particle: name="b(1)(1235)+", pdgid=10213, mass=1230 ± 3 MeV>,
 <Particle: name="b(1)(1235)-", pdgid=-10213, mass=1230 ± 3 MeV>,
 <Particle: name="pi(2)(1670)+", pdgid=10215, mass=1670.6 + 2.9 - 1.2 MeV>,
 <Particle: name="pi(2)(1670)-", pdgid=-10215, mass=1670.6 + 2.9 - 1.2 MeV>,
 <Particle: name="f(0)(1370)", pdgid=10221, mass=1350 ± 150 MeV>,
 <Particle: name="h(1)(1170)", pdgid=10223, mass=1170 ± 20 MeV>,
 <Particle: name="eta(2)(1645)", pdgid=10225, mass=1617 ± 5 MeV>,
 <Particle: name="K(0)*(1430)0", pdgid=10311, mass=1430 ± 50 MeV>,
 <Particle: name="K(0)*(1430)~0", pdgid=-10311, mass=1430 ± 50 MeV>,
 <Particle: name="K(1)(1270)0", pdgid=10313, mass=1272 ± 7 MeV>,
 <Particle: name="K(1)(1270)~0", pdgid=-10313, mass=1272 ± 7 MeV>,
 <Particle: name="K(2)(1770)0", pdgid=10315, mass=1773 ± 8 MeV>,
 <Particle: name="K(2)(1770)~0", pdgid=-10315, mass=1773 ± 8 MeV>,
 <Particle: name="K(0)*(1430)+", pdgid=10321, mass=1430 ± 50 MeV>,
 <Particle: name="K(0)*(1430)-", pdgid=-10321, mass=1430 ± 50 MeV>,
 <Particle: name="K(1)(1270)+", pdgid=10323, mass=1272 ± 7 MeV>,
 <Particle: name="K(1)(1270)-", pdgid=-10323, mass=1272 ± 7 MeV>,
 <Particle: name="K(2)(1770)+", pdgid=10325, mass=1773 ± 8 MeV>,
 <Particle: name="K(2)(1770)-", pdgid=-10325, mass=1773 ± 8 MeV>,
 <Particle: name="f(0)(1710)", pdgid=10331, mass=1704 ± 12 MeV>,
 <Particle: name="h(1)(1415)", pdgid=10333, mass=1416 ± 8 MeV>,
 <Particle: name="D(0)*(2300)+", pdgid=10411, mass=2300 ± 19 MeV>,
 <Particle: name="D(0)*(2300)-", pdgid=-10411, mass=2300 ± 19 MeV>,
 <Particle: name="D(0)*(2300)0", pdgid=10421, mass=2300 ± 19 MeV>,
 <Particle: name="D(0)*(2300)~0", pdgid=-10421, mass=2300 ± 19 MeV>,
 <Particle: name="D(1)(2420)0", pdgid=10423, mass=2420.8 ± 0.5 MeV>,
 <Particle: name="D(1)(2420)~0", pdgid=-10423, mass=2420.8 ± 0.5 MeV>,
 <Particle: name="D(s0)*(2317)+", pdgid=10431, mass=2317.8 ± 0.5 MeV>,
 <Particle: name="D(s0)*(2317)-", pdgid=-10431, mass=2317.8 ± 0.5 MeV>,
 <Particle: name="D(s1)(2536)+", pdgid=10433, mass=2535.11 ± 0.06 MeV>,
 <Particle: name="D(s1)(2536)-", pdgid=-10433, mass=2535.11 ± 0.06 MeV>,
 <Particle: name="chi(c0)(1P)", pdgid=10441, mass=3414.7 ± 0.3 MeV>,
 <Particle: name="h(c)(1P)", pdgid=10443, mass=3525.38 ± 0.11 MeV>,
 <Particle: name="chi(b0)(1P)", pdgid=10551, mass=9859.4 ± 0.5 MeV>,
 <Particle: name="h(b)(1P)", pdgid=10553, mass=9899.3 ± 0.8 MeV>,
 <Particle: name="Delta(1900)-", pdgid=11112, mass=1860 + 60 - 20 MeV>,
 <Particle: name="Delta(1900)~+", pdgid=-11112, mass=1860 + 60 - 20 MeV>,
 <Particle: name="Delta(1700)-", pdgid=11114, mass=1710 ± 20 MeV>,
 <Particle: name="Delta(1700)~+", pdgid=-11114, mass=1710 ± 20 MeV>,
 <Particle: name="Delta(1930)-", pdgid=11116, mass=1950 ± 50 MeV>,
 <Particle: name="Delta(1930)~+", pdgid=-11116, mass=1950 ± 50 MeV>,
 <Particle: name="Delta(1900)0", pdgid=11212, mass=1860 + 60 - 20 MeV>,
 <Particle: name="Delta(1900)~0", pdgid=-11212, mass=1860 + 60 - 20 MeV>,
 <Particle: name="Delta(1930)0", pdgid=11216, mass=1950 ± 50 MeV>,
 <Particle: name="Delta(1930)~0", pdgid=-11216, mass=1950 ± 50 MeV>,
 <Particle: name="N(1440)0", pdgid=12112, mass=1440 ± 30 MeV>,
 <Particle: name="N(1440)~0", pdgid=-12112, mass=1440 ± 30 MeV>,
 <Particle: name="Delta(1700)0", pdgid=12114, mass=1710 ± 20 MeV>,
 <Particle: name="Delta(1700)~0", pdgid=-12114, mass=1710 ± 20 MeV>,
 <Particle: name="N(1680)0", pdgid=12116, mass=1685 ± 5 MeV>,
 <Particle: name="N(1680)~0", pdgid=-12116, mass=1685 ± 5 MeV>,
 <Particle: name="Delta(1900)+", pdgid=12122, mass=1860 + 60 - 20 MeV>,
 <Particle: name="Delta(1900)~-", pdgid=-12122, mass=1860 + 60 - 20 MeV>,
 <Particle: name="Delta(1930)+", pdgid=12126, mass=1950 ± 50 MeV>,
 <Particle: name="Delta(1930)~-", pdgid=-12126, mass=1950 ± 50 MeV>,
 <Particle: name="N(1440)+", pdgid=12212, mass=1440 ± 30 MeV>,
 <Particle: name="N(1440)~-", pdgid=-12212, mass=1440 ± 30 MeV>,
 <Particle: name="Delta(1700)+", pdgid=12214, mass=1710 ± 20 MeV>,
 <Particle: name="Delta(1700)~-", pdgid=-12214, mass=1710 ± 20 MeV>,
 <Particle: name="N(1680)+", pdgid=12216, mass=1685 ± 5 MeV>,
 <Particle: name="N(1680)~-", pdgid=-12216, mass=1685 ± 5 MeV>,
 <Particle: name="Delta(1900)++", pdgid=12222, mass=1860 + 60 - 20 MeV>,
 <Particle: name="Delta(1900)~--", pdgid=-12222, mass=1860 + 60 - 20 MeV>,
 <Particle: name="Delta(1700)++", pdgid=12224, mass=1710 ± 20 MeV>,
 <Particle: name="Delta(1700)~--", pdgid=-12224, mass=1710 ± 20 MeV>,
 <Particle: name="Delta(1930)++", pdgid=12226, mass=1950 ± 50 MeV>,
 <Particle: name="Delta(1930)~--", pdgid=-12226, mass=1950 ± 50 MeV>,
 <Particle: name="Sigma(1660)-", pdgid=13112, mass=1660 ± 30 MeV>,
 <Particle: name="Sigma(1660)~+", pdgid=-13112, mass=1660 ± 30 MeV>,
 <Particle: name="Sigma(1670)-", pdgid=13114, mass=1670 + 15 - 5 MeV>,
 <Particle: name="Sigma(1670)~+", pdgid=-13114, mass=1670 + 15 - 5 MeV>,
 <Particle: name="Sigma(1915)-", pdgid=13116, mass=1915 + 20 - 15 MeV>,
 <Particle: name="Sigma(1915)~+", pdgid=-13116, mass=1915 + 20 - 15 MeV>,
 <Particle: name="Lambda(1405)", pdgid=13122, mass=1405.1 + 1.3 - 1.0 MeV>,
 <Particle: name="Lambda(1405)~", pdgid=-13122, mass=1405.1 + 1.3 - 1.0 MeV>,
 <Particle: name="Lambda(1690)", pdgid=13124, mass=1690 ± 5 MeV>,
 <Particle: name="Lambda(1690)~", pdgid=-13124, mass=1690 ± 5 MeV>,
 <Particle: name="Lambda(1830)", pdgid=13126, mass=1830.0 MeV>,
 <Particle: name="Lambda(1830)~", pdgid=-13126, mass=1830.0 MeV>,
 <Particle: name="Sigma(1660)0", pdgid=13212, mass=1660 ± 30 MeV>,
 <Particle: name="Sigma(1660)~0", pdgid=-13212, mass=1660 ± 30 MeV>,
 <Particle: name="Sigma(1670)0", pdgid=13214, mass=1670 + 15 - 5 MeV>,
 <Particle: name="Sigma(1670)~0", pdgid=-13214, mass=1670 + 15 - 5 MeV>,
 <Particle: name="Sigma(1915)0", pdgid=13216, mass=1915 + 20 - 15 MeV>,
 <Particle: name="Sigma(1915)~0", pdgid=-13216, mass=1915 + 20 - 15 MeV>,
 <Particle: name="Sigma(1660)+", pdgid=13222, mass=1660 ± 30 MeV>,
 <Particle: name="Sigma(1660)~-", pdgid=-13222, mass=1660 ± 30 MeV>,
 <Particle: name="Sigma(1670)+", pdgid=13224, mass=1670 + 15 - 5 MeV>,
 <Particle: name="Sigma(1670)~-", pdgid=-13224, mass=1670 + 15 - 5 MeV>,
 <Particle: name="Sigma(1915)+", pdgid=13226, mass=1915 + 20 - 15 MeV>,
 <Particle: name="Sigma(1915)~-", pdgid=-13226, mass=1915 + 20 - 15 MeV>,
 <Particle: name="Xi(1820)-", pdgid=13314, mass=1823 ± 5 MeV>,
 <Particle: name="Xi(1820)~+", pdgid=-13314, mass=1823 ± 5 MeV>,
 <Particle: name="Xi(1820)0", pdgid=13324, mass=1823 ± 5 MeV>,
 <Particle: name="Xi(1820)~0", pdgid=-13324, mass=1823 ± 5 MeV>,
 <Particle: name="Lambda(c)(2595)+", pdgid=14122, mass=2592.2 ± 0.3 MeV>,
 <Particle: name="Lambda(c)(2595)~-", pdgid=-14122, mass=2592.2 ± 0.3 MeV>,
 <Particle: name="a(1)(1260)0", pdgid=20113, mass=1230 ± 40 MeV>,
 <Particle: name="a(1)(1260)+", pdgid=20213, mass=1230 ± 40 MeV>,
 <Particle: name="a(1)(1260)-", pdgid=-20213, mass=1230 ± 40 MeV>,
 <Particle: name="f(1)(1285)", pdgid=20223, mass=1281.9 ± 0.5 MeV>,
 <Particle: name="K(1)(1400)0", pdgid=20313, mass=1403 ± 7 MeV>,
 <Particle: name="K(1)(1400)~0", pdgid=-20313, mass=1403 ± 7 MeV>,
 <Particle: name="K(2)(1820)0", pdgid=20315, mass=1819 ± 12 MeV>,
 <Particle: name="K(2)(1820)~0", pdgid=-20315, mass=1819 ± 12 MeV>,
 <Particle: name="K(1)(1400)+", pdgid=20323, mass=1403 ± 7 MeV>,
 <Particle: name="K(1)(1400)-", pdgid=-20323, mass=1403 ± 7 MeV>,
 <Particle: name="K(2)(1820)+", pdgid=20325, mass=1819 ± 12 MeV>,
 <Particle: name="K(2)(1820)-", pdgid=-20325, mass=1819 ± 12 MeV>,
 <Particle: name="f(1)(1420)", pdgid=20333, mass=1426.4 ± 0.9 MeV>,
 <Particle: name="D(s1)(2460)+", pdgid=20433, mass=2459.5 ± 0.6 MeV>,
 <Particle: name="D(s1)(2460)-", pdgid=-20433, mass=2459.5 ± 0.6 MeV>,
 <Particle: name="chi(c1)(1P)", pdgid=20443, mass=3510.67 ± 0.05 MeV>,
 <Particle: name="chi(b1)(1P)", pdgid=20553, mass=9892.9 ± 0.3 MeV>,
 <Particle: name="Upsilon(2)(1D)", pdgid=20555, mass=10163.7 ± 1.4 MeV>,
 <Particle: name="Delta(1910)-", pdgid=21112, mass=1900 ± 50 MeV>,
 <Particle: name="Delta(1910)~+", pdgid=-21112, mass=1900 ± 50 MeV>,
 <Particle: name="Delta(1920)-", pdgid=21114, mass=1920 ± 50 MeV>,
 <Particle: name="Delta(1920)~+", pdgid=-21114, mass=1920 ± 50 MeV>,
 <Particle: name="Delta(1910)0", pdgid=21212, mass=1900 ± 50 MeV>,
 <Particle: name="Delta(1910)~0", pdgid=-21212, mass=1900 ± 50 MeV>,
 <Particle: name="N(1700)0", pdgid=21214, mass=1720 + 80 - 70 MeV>,
 <Particle: name="N(1700)~0", pdgid=-21214, mass=1720 + 80 - 70 MeV>,
 <Particle: name="N(1535)0", pdgid=22112, mass=1530 ± 15 MeV>,
 <Particle: name="N(1535)~0", pdgid=-22112, mass=1530 ± 15 MeV>,
 <Particle: name="Delta(1920)0", pdgid=22114, mass=1920 ± 50 MeV>,
 <Particle: name="Delta(1920)~0", pdgid=-22114, mass=1920 ± 50 MeV>,
 <Particle: name="Delta(1910)+", pdgid=22122, mass=1900 ± 50 MeV>,
 <Particle: name="Delta(1910)~-", pdgid=-22122, mass=1900 ± 50 MeV>,
 <Particle: name="N(1700)+", pdgid=22124, mass=1720 + 80 - 70 MeV>,
 <Particle: name="N(1700)~-", pdgid=-22124, mass=1720 + 80 - 70 MeV>,
 <Particle: name="N(1535)+", pdgid=22212, mass=1530 ± 15 MeV>,
 <Particle: name="N(1535)~-", pdgid=-22212, mass=1530 ± 15 MeV>,
 <Particle: name="Delta(1920)+", pdgid=22214, mass=1920 ± 50 MeV>,
 <Particle: name="Delta(1920)~-", pdgid=-22214, mass=1920 ± 50 MeV>,
 <Particle: name="Delta(1910)++", pdgid=22222, mass=1900 ± 50 MeV>,
 <Particle: name="Delta(1910)~--", pdgid=-22222, mass=1900 ± 50 MeV>,
 <Particle: name="Delta(1920)++", pdgid=22224, mass=1920 ± 50 MeV>,
 <Particle: name="Delta(1920)~--", pdgid=-22224, mass=1920 ± 50 MeV>,
 <Particle: name="Sigma(1750)-", pdgid=23112, mass=1750 + 50 - 20 MeV>,
 <Particle: name="Sigma(1750)~+", pdgid=-23112, mass=1750 + 50 - 20 MeV>,
 <Particle: name="Sigma(1940)-", pdgid=23114, mass=1940 + 10 - 40 MeV>,
 <Particle: name="Sigma(1940)~+", pdgid=-23114, mass=1940 + 10 - 40 MeV>,
 <Particle: name="Lambda(1600)", pdgid=23122, mass=1600 + 100 - 40 MeV>,
 <Particle: name="Lambda(1600)~", pdgid=-23122, mass=1600 + 100 - 40 MeV>,
 <Particle: name="Lambda(1890)", pdgid=23124, mass=1890 + 20 - 40 MeV>,
 <Particle: name="Lambda(1890)~", pdgid=-23124, mass=1890 + 20 - 40 MeV>,
 <Particle: name="Lambda(2110)", pdgid=23126, mass=2110 + 30 - 20 MeV>,
 <Particle: name="Lambda(2110)~", pdgid=-23126, mass=2110 + 30 - 20 MeV>,
 <Particle: name="Sigma(1750)0", pdgid=23212, mass=1750 + 50 - 20 MeV>,
 <Particle: name="Sigma(1750)~0", pdgid=-23212, mass=1750 + 50 - 20 MeV>,
 <Particle: name="Sigma(1940)0", pdgid=23214, mass=1940 + 10 - 40 MeV>,
 <Particle: name="Sigma(1940)~0", pdgid=-23214, mass=1940 + 10 - 40 MeV>,
 <Particle: name="Sigma(1750)+", pdgid=23222, mass=1750 + 50 - 20 MeV>,
 <Particle: name="Sigma(1750)~-", pdgid=-23222, mass=1750 + 50 - 20 MeV>,
 <Particle: name="Sigma(1940)+", pdgid=23224, mass=1940 + 10 - 40 MeV>,
 <Particle: name="Sigma(1940)~-", pdgid=-23224, mass=1940 + 10 - 40 MeV>,
 <Particle: name="rho(1700)0", pdgid=30113, mass=1720 ± 20 MeV>,
 <Particle: name="rho(1700)+", pdgid=30213, mass=1720 ± 20 MeV>,
 <Particle: name="rho(1700)-", pdgid=-30213, mass=1720 ± 20 MeV>,
 <Particle: name="omega(1650)", pdgid=30223, mass=1670 ± 30 MeV>,
 <Particle: name="K*(1680)0", pdgid=30313, mass=1718 ± 18 MeV>,
 <Particle: name="K*(1680)~0", pdgid=-30313, mass=1718 ± 18 MeV>,
 <Particle: name="K*(1680)+", pdgid=30323, mass=1718 ± 18 MeV>,
 <Particle: name="K*(1680)-", pdgid=-30323, mass=1718 ± 18 MeV>,
 <Particle: name="psi(3770)", pdgid=30443, mass=3773.1 ± 0.3 MeV>,
 <Particle: name="Delta(1600)-", pdgid=31114, mass=1570 ± 70 MeV>,
 <Particle: name="Delta(1600)~+", pdgid=-31114, mass=1570 ± 70 MeV>,
 <Particle: name="N(1720)0", pdgid=31214, mass=1720 + 30 - 40 MeV>,
 <Particle: name="N(1720)~0", pdgid=-31214, mass=1720 + 30 - 40 MeV>,
 <Particle: name="N(1650)0", pdgid=32112, mass=1650 ± 15 MeV>,
 <Particle: name="N(1650)~0", pdgid=-32112, mass=1650 ± 15 MeV>,
 <Particle: name="Delta(1600)0", pdgid=32114, mass=1570 ± 70 MeV>,
 <Particle: name="Delta(1600)~0", pdgid=-32114, mass=1570 ± 70 MeV>,
 <Particle: name="N(1720)+", pdgid=32124, mass=1720 + 30 - 40 MeV>,
 <Particle: name="N(1720)~-", pdgid=-32124, mass=1720 + 30 - 40 MeV>,
 <Particle: name="N(1650)+", pdgid=32212, mass=1650 ± 15 MeV>,
 <Particle: name="N(1650)~-", pdgid=-32212, mass=1650 ± 15 MeV>,
 <Particle: name="Delta(1600)+", pdgid=32214, mass=1570 ± 70 MeV>,
 <Particle: name="Delta(1600)~-", pdgid=-32214, mass=1570 ± 70 MeV>,
 <Particle: name="Delta(1600)++", pdgid=32224, mass=1570 ± 70 MeV>,
 <Particle: name="Delta(1600)~--", pdgid=-32224, mass=1570 ± 70 MeV>,
 <Particle: name="Lambda(1670)", pdgid=33122, mass=1670 ± 10 MeV>,
 <Particle: name="Lambda(1670)~", pdgid=-33122, mass=1670 ± 10 MeV>,
 <Particle: name="N(1710)0", pdgid=42112, mass=1710 ± 30 MeV>,
 <Particle: name="N(1710)~0", pdgid=-42112, mass=1710 ± 30 MeV>,
 <Particle: name="N(1710)+", pdgid=42212, mass=1710 ± 30 MeV>,
 <Particle: name="N(1710)~-", pdgid=-42212, mass=1710 ± 30 MeV>,
 <Particle: name="Lambda(1800)", pdgid=43122, mass=1800 + 50 - 80 MeV>,
 <Particle: name="Lambda(1800)~", pdgid=-43122, mass=1800 + 50 - 80 MeV>,
 <Particle: name="Lambda(1810)", pdgid=53122, mass=1810 + 40 - 60 MeV>,
 <Particle: name="Lambda(1810)~", pdgid=-53122, mass=1810 + 40 - 60 MeV>,
 <Particle: name="pi(1300)0", pdgid=100111, mass=1300 ± 100 MeV>,
 <Particle: name="rho(1450)0", pdgid=100113, mass=1465 ± 25 MeV>,
 <Particle: name="pi(1300)+", pdgid=100211, mass=1300 ± 100 MeV>,
 <Particle: name="pi(1300)-", pdgid=-100211, mass=1300 ± 100 MeV>,
 <Particle: name="rho(1450)+", pdgid=100213, mass=1465 ± 25 MeV>,
 <Particle: name="rho(1450)-", pdgid=-100213, mass=1465 ± 25 MeV>,
 <Particle: name="eta(1295)", pdgid=100221, mass=1294 ± 4 MeV>,
 <Particle: name="K*(1410)0", pdgid=100313, mass=1421 ± 9 MeV>,
 <Particle: name="K*(1410)~0", pdgid=-100313, mass=1421 ± 9 MeV>,
 <Particle: name="K*(1410)+", pdgid=100323, mass=1421 ± 9 MeV>,
 <Particle: name="K*(1410)-", pdgid=-100323, mass=1421 ± 9 MeV>,
 <Particle: name="eta(1475)", pdgid=100331, mass=1475 ± 4 MeV>,
 <Particle: name="phi(1680)", pdgid=100333, mass=1680 ± 20 MeV>,
 <Particle: name="eta(c)(2S)", pdgid=100441, mass=3637.5 ± 1.1 MeV>,
 <Particle: name="psi(2S)", pdgid=100443, mass=3686.10 ± 0.03 MeV>,
 <Particle: name="chi(c2)(3930)", pdgid=100445, mass=3927 ± 3 MeV>,
 <Particle: name="Upsilon(2S)", pdgid=100553, mass=10023.3 ± 0.3 MeV>,
 <Particle: name="chi(b2)(2P)", pdgid=100555, mass=10268.65 + 0.20 - 0.50 MeV>,
 <Particle: name="Xi(1950)-", pdgid=103316, mass=1950 ± 15 MeV>,
 <Particle: name="Xi(1950)~+", pdgid=-103316, mass=1950 ± 15 MeV>,
 <Particle: name="Xi(1950)0", pdgid=103326, mass=1950 ± 15 MeV>,
 <Particle: name="Xi(1950)~0", pdgid=-103326, mass=1950 ± 15 MeV>,
 <Particle: name="Lambda(c)(2625)+", pdgid=104122, mass=2628.11 ± 0.19 MeV>,
 <Particle: name="Lambda(c)(2625)~-", pdgid=-104122, mass=2628.11 ± 0.19 MeV>,
 <Particle: name="Xi(c)(2815)0", pdgid=104312, mass=2820.3 ± 0.3 MeV>,
 <Particle: name="Xi(c)(2815)~0", pdgid=-104312, mass=2820.3 ± 0.3 MeV>,
 <Particle: name="Xi(c)(2790)0", pdgid=104314, mass=2794.1 ± 0.5 MeV>,
 <Particle: name="Xi(c)(2790)~0", pdgid=-104314, mass=2794.1 ± 0.5 MeV>,
 <Particle: name="Xi(c)(2815)+", pdgid=104322, mass=2816.73 ± 0.21 MeV>,
 <Particle: name="Xi(c)(2815)~-", pdgid=-104322, mass=2816.73 ± 0.21 MeV>,
 <Particle: name="Xi(c)(2790)+", pdgid=104324, mass=2792.4 ± 0.5 MeV>,
 <Particle: name="Xi(c)(2790)~-", pdgid=-104324, mass=2792.4 ± 0.5 MeV>,
 <Particle: name="chi(b0)(2P)", pdgid=110551, mass=10232.5 + 0.4 - 0.5 MeV>,
 <Particle: name="chi(b1)(2P)", pdgid=120553, mass=10255.46 + 0.20 - 0.50 MeV>,
 <Particle: name="Upsilon(3S)", pdgid=200553, mass=10355.2 ± 0.5 MeV>,
 <Particle: name="Xi(1690)-", pdgid=203312, mass=1690 ± 10 MeV>,
 <Particle: name="Xi(1690)~+", pdgid=-203312, mass=1690 ± 10 MeV>,
 <Particle: name="Xi(2030)-", pdgid=203316, mass=2025 ± 5 MeV>,
 <Particle: name="Xi(2030)~+", pdgid=-203316, mass=2025 ± 5 MeV>,
 <Particle: name="Xi(1690)0", pdgid=203322, mass=1690 ± 10 MeV>,
 <Particle: name="Xi(1690)~0", pdgid=-203322, mass=1690 ± 10 MeV>,
 <Particle: name="Xi(2030)0", pdgid=203326, mass=2025 ± 5 MeV>,
 <Particle: name="Xi(2030)~0", pdgid=-203326, mass=2025 ± 5 MeV>,
 <Particle: name="Omega(2250)-", pdgid=203338, mass=2252 ± 9 MeV>,
 <Particle: name="Omega(2250)~+", pdgid=-203338, mass=2252 ± 9 MeV>,
 <Particle: name="Lambda(c)(2880)+", pdgid=204126, mass=2881.63 ± 0.24 MeV>,
 <Particle: name="Lambda(c)(2880)~-", pdgid=-204126, mass=2881.63 ± 0.24 MeV>,
 <Particle: name="Upsilon(4S)", pdgid=300553, mass=10579.4 ± 1.2 MeV>,
 <Particle: name="omega(1420)", pdgid=1000223, mass=1425 ± 25 MeV>,
 <Particle: name="a(0)(980)0", pdgid=9000111, mass=980 ± 20 MeV>,
 <Particle: name="pi(1)(1400)", pdgid=9000113, mass=1354 ± 25 MeV>,
 <Particle: name="a(2)(1700)0", pdgid=9000115, mass=1700 ± 40 MeV>,
 <Particle: name="a(0)(980)+", pdgid=9000211, mass=980 ± 20 MeV>,
 <Particle: name="a(0)(980)-", pdgid=-9000211, mass=980 ± 20 MeV>,
 <Particle: name="pi(1)(1400)+", pdgid=9000213, mass=1354 ± 25 MeV>,
 <Particle: name="pi(1)(1400)-", pdgid=-9000213, mass=1354 ± 25 MeV>,
 <Particle: name="a(2)(1700)+", pdgid=9000215, mass=1700 ± 40 MeV>,
 <Particle: name="a(2)(1700)-", pdgid=-9000215, mass=1700 ± 40 MeV>,
 <Particle: name="f(0)(500)", pdgid=9000221, mass=475 ± 75 MeV>,
 <Particle: name="K(0)*(700)0", pdgid=9000311, mass=824 ± 30 MeV>,
 <Particle: name="K(0)*(700)~0", pdgid=-9000311, mass=824 ± 30 MeV>,
 <Particle: name="K(0)*(700)+", pdgid=9000321, mass=824 ± 30 MeV>,
 <Particle: name="K(0)*(700)-", pdgid=-9000321, mass=824 ± 30 MeV>,
 <Particle: name="psi(4040)", pdgid=9000443, mass=4039.0 ± 1.0 MeV>,
 <Particle: name="Upsilon(10860)", pdgid=9000553, mass=10890 + 3 - 3 MeV>,
 <Particle: name="pi(1800)0", pdgid=9010111, mass=1810 + 9 - 11 MeV>,
 <Particle: name="pi(1)(1600)", pdgid=9010113, mass=1660 + 15 - 11 MeV>,
 <Particle: name="pi(1800)+", pdgid=9010211, mass=1810 + 9 - 11 MeV>,
 <Particle: name="pi(1800)-", pdgid=-9010211, mass=1810 + 9 - 11 MeV>,
 <Particle: name="pi(1)(1600)+", pdgid=9010213, mass=1660 + 15 - 11 MeV>,
 <Particle: name="pi(1)(1600)-", pdgid=-9010213, mass=1660 + 15 - 11 MeV>,
 <Particle: name="f(0)(980)", pdgid=9010221, mass=990 ± 20 MeV>,
 <Particle: name="psi(4160)", pdgid=9010443, mass=4191 ± 5 MeV>,
 <Particle: name="Upsilon(11020)", pdgid=9010553, mass=10993 + 10 - 3 MeV>,
 <Particle: name="a(1)(1640)0", pdgid=9020113, mass=1655 ± 16 MeV>,
 <Particle: name="a(1)(1640)+", pdgid=9020213, mass=1655 ± 16 MeV>,
 <Particle: name="a(1)(1640)-", pdgid=-9020213, mass=1655 ± 16 MeV>,
 <Particle: name="eta(1405)", pdgid=9020221, mass=1408.8 ± 2.0 MeV>,
 <Particle: name="psi(4415)", pdgid=9020443, mass=4421 ± 4 MeV>,
 <Particle: name="f(0)(1500)", pdgid=9030221, mass=1506 ± 6 MeV>,
 <Particle: name="f(2)(1950)", pdgid=9050225, mass=1936 ± 12 MeV>,
 <Particle: name="f(2)(2010)", pdgid=9060225, mass=2010 + 60 - 80 MeV>,
 <Particle: name="f(2)(2300)", pdgid=9080225, mass=2297 ± 28 MeV>,
 <Particle: name="f(2)(2340)", pdgid=9090225, mass=2350 + 50 - 40 MeV>]

Particle properties

You can do things to particles, like invert them:

In [37]:
~p
Out[37]:
$D_{2}^{*}(2460)^{+}$

There are a plethora of properties you can access:

In [38]:
p.spin_type
Out[38]:
<SpinType.Tensor: 3>

You can quickly access the PDGID of a particle:

In [39]:
p.pdgid
Out[39]:
<PDGID: -415>
In [40]:
PDGID(p)
Out[40]:
<PDGID: -415>

4. Literals

They provide a handy way to manipulate things with human-readable names!

Package defines literals for most common particles, with easily recognisable names.

  • Literals are dynamically generated on import for both PDGID and Particle classes.

PDGID literals

In [41]:
from particle.pdgid import literals as lid
In [42]:
lid.phi_1020
Out[42]:
<PDGID: 333>

Particle literals

In [43]:
from particle.particle import literals as lpart
In [44]:
lpart.phi_1020
Out[44]:
$\phi(1020)$

5. Data files, stored in particle/data/

  • PDG particle data files

    • Original PDG data files, which are in a fixed-width format
    • Code uses “digested forms” of these, stored as CSV, for optimised querying
    • Latest PDG data (2019) used by default
    • Advanced usage: user can load older PDG table, load a “user table” with new particles, append to default table
  • Other data files

    • CSV file for mapping of PDG IDs to particle LaTeX names

Dump table contents

The Particle.dump_table(...) method is rather flexible.

(No need to dig into the package installation directory to inspect the particle data table ;-).)

In [45]:
help(Particle.dump_table)
Help on method dump_table in module particle.particle.particle:

dump_table(exclusive_fields=[], exclude_fields=[], n_rows=-1, filter_fn=None, filename=None, tablefmt='simple', floatfmt='.12g', numalign='decimal') method of builtins.type instance
    Dump the internal particle data CSV table,
    loading it from the default location if no table has yet been loaded.
    
    The table attributes are those of the class. By default all attributes
    are used as table fields. Their complete list is:
        pdgid
        pdg_name
        mass
        mass_upper
        mass_lower
        width
        width_upper
        width_lower
        three_charge
        I
        G
        P
        C
        anti_flag
        rank
        status
        quarks
        latex_name
    
    Optionally dump to a file.
    
    Parameters
    ----------
    exclusive_fields: list, optional, default is []
        Exclusive list of fields to print out.
    exclude_fields: list, optional, default is []
        List of table fields to exclude in the printout.
        Relevant only when exclusive_fields is not given.
    n_rows: int, optional, defaults to all rows
        Number of table rows to print out.
    filter_fn: function, optional, default is None
        Apply a filter to each particle.
        See findall(...) for typical use cases.
    filename: str, optional, default is None
        Name of file where to dump the table.
        By default the table is dumped to stdout.
    tablefmt: str, optional, default is 'simple'
        Table formatting option, see the tabulate's package
        tabulate function for a description of available options.
        The most common options are:
        'plain', 'simple', 'grid', 'rst', 'html', 'latex'.
    floatfmt: str, optional, default is '.12g'
        Number formatting, see the tabulate's package
        tabulate function for a description of available options.
    numalign: str or None, oprional, default is 'decimal'
        Column alignment for numbers, see the tabulate's package
        tabulate function for a description of available options.
    
    Note
    ----
    Uses the `tabulate` package.
    
    Examples
    --------
    Particle.dump_table()
    Particle.dump_table(n_rows=5)
    Particle.dump_table(exclusive_fields=['pdgid', 'pdg_name'])
    Particle.dump_table(filter_fn=lambda p: p.pdgid.has_bottom)
    Particle.dump_table(filename='output.txt', tablefmt='rst')

In [46]:
fields = ['pdgid', 'pdg_name', 'mass', 'mass_upper', 'mass_lower', 'three_charge']
    
Particle.dump_table(exclusive_fields=fields, n_rows=10)
  pdgid  pdg_name       mass    mass_upper    mass_lower    three_charge
-------  ----------  -------  ------------  ------------  --------------
      1  d              4.67           0.5           0.2              -1
     -1  d              4.67           0.5           0.2               1
      2  u              2.16           0.5           0.3               2
     -2  u              2.16           0.5           0.3              -2
      3  s             93             11             5                -1
     -3  s             93             11             5                 1
      4  c           1270             20            20                 2
     -4  c           1270             20            20                -2
      5  b           4180             30            20                -1
     -5  b           4180             30            20                 1

Table with all b-flavoured hadrons (in reStructuredText format):

In [47]:
Particle.dump_table(filter_fn=lambda p: p.pdgid.has_bottom, exclusive_fields=fields, tablefmt='rst')
=======  ==============  =========  ============  ============  ==============
  pdgid  pdg_name             mass    mass_upper    mass_lower    three_charge
=======  ==============  =========  ============  ============  ==============
    511  B                5279.64           0.13          0.13               0
   -511  B                5279.64           0.13          0.13               0
    513  B*               5324.7            0.22          0.22               0
   -513  B*               5324.7            0.22          0.22               0
    515  B(2)*(5747)      5739.5            0.7           0.7                0
   -515  B(2)*(5747)      5739.5            0.7           0.7                0
    521  B                5279.33           0.13          0.13               3
   -521  B                5279.33           0.13          0.13              -3
    523  B*               5324.7            0.22          0.22               3
   -523  B*               5324.7            0.22          0.22              -3
    525  B(2)*(5747)      5739.5            0.7           0.7                3
   -525  B(2)*(5747)      5739.5            0.7           0.7               -3
    531  B(s)             5366.88           0.17          0.17               0
   -531  B(s)             5366.88           0.17          0.17               0
    533  B(s)*            5415.4            1.8           1.5                0
   -533  B(s)*            5415.4            1.8           1.5                0
    535  B(s2)*(5840)     5839.85           0.12          0.12               0
   -535  B(s2)*(5840)     5839.85           0.12          0.12               0
    541  B(c)             6274.9            0.8           0.8                3
   -541  B(c)             6274.9            0.8           0.8               -3
    553  Upsilon(1S)      9460.3            0.26          0.26               0
    555  chi(b2)(1P)      9912.21           0.3           0.3                0
   5112  Sigma(b)         5815.64           0.27          0.27              -3
  -5112  Sigma(b)         5815.64           0.27          0.27               3
   5114  Sigma(b)*        5834.74           0.3           0.3               -3
  -5114  Sigma(b)*        5834.74           0.3           0.3                3
   5122  Lambda(b)        5619.6            0.17          0.17               0
  -5122  Lambda(b)        5619.6            0.17          0.17               0
   5132  Xi(b)            5797              0.9           0.9               -3
  -5132  Xi(b)            5797              0.9           0.9                3
   5222  Sigma(b)         5810.56           0.25          0.25               3
  -5222  Sigma(b)         5810.56           0.25          0.25              -3
   5224  Sigma(b)*        5830.32           0.27          0.27               3
  -5224  Sigma(b)*        5830.32           0.27          0.27              -3
   5232  Xi(b)            5791.9            0.5           0.5                0
  -5232  Xi(b)            5791.9            0.5           0.5                0
   5332  Omega(b)         6046.1            1.7           1.7               -3
  -5332  Omega(b)         6046.1            1.7           1.7                3
  10551  chi(b0)(1P)      9859.4            0.5           0.5                0
  10553  h(b)(1P)         9899.3            0.8           0.8                0
  20553  chi(b1)(1P)      9892.878          0.3           0.3                0
  20555  Upsilon(2)(1D)  10163.7            1.4           1.4                0
 100553  Upsilon(2S)     10023.26           0.31          0.31               0
 100555  chi(b2)(2P)     10268.65           0.2           0.5                0
 110551  chi(b0)(2P)     10232.5            0.4           0.5                0
 120553  chi(b1)(2P)     10255.46           0.2           0.5                0
 200553  Upsilon(3S)     10355.2            0.5           0.5                0
 300553  Upsilon(4S)     10579.4            1.2           1.2                0
9000553  Upsilon(10860)  10889.9            3.2           2.6                0
9010553  Upsilon(11020)  10992.9           10             3.1                0
=======  ==============  =========  ============  ============  ==============

6. Advanced usage

You can:

  • Extend or replace the default particle data table in Particle.
  • Adjust properties for a particle.
  • Make custom particles.
DecayLanguage package logo

Decays and decay chains with the DecayLanguage package

DecayLanguage is designed for the manipulation of decay structures in Python. The current package has:

  • Amplitude Analysis decay language:
    • Input based on AmpGen generator, output format for GooFit C++
  • Decay file parsers:
    • Read DecFiles, such as the LHCb master DecFile
    • Manipulate adn visualize them in Python

Package motivation

  • Ability to describe decay-tree-like structures
  • Provide a translation of decay amplitude models from AmpGen to GooFit

    • Idea is to generalise this to other decay descriptions

    • Any experiment uses event generators which, among many things, need to describe particle decay chains

    • Programs such as EvtGen rely on so-called .dec decay files
    • Many experiments need decay data files
    • Why not make a Python package to deal with decay files, for everyone?

Package, in short

  • Tools to parse decay files and programmatically manipulate them, query, display information.
  • Tools to translate decay amplitude models from AmpGen to GooFit, and manipulate them.

1. Decay files

*Master file” DECAY.DEC

Gigantic file defining decay modes for all relevant particles, including decay model specifications.

User .dec files

  • Needed to produce specific MC samples.
  • Typically contain a single decay chain (except if defining inclusive samples).

Example user decay file:

Decay file for [B_c+ -> (B_s0 -> K+ K-) pi+]cc

Alias B_c+sig B_c+ Alias B_c-sig B_c- ChargeConj B_c+sig B_c-sig Alias MyB_s0 B_s0 Alias Myanti-B_s0 anti-B_s0 ChargeConj MyB_s0 Myanti-B_s0

Decay B_c+sig 1.000 MyB_s0 pi+ PHOTOS PHSP; Enddecay CDecay B_c-sig

Decay MyB_s0 1.000 K+ K- SSD_CP 20.e12 0.1 1.0 0.04 9.6 -0.8 8.4 -0.6; Enddecay CDecay Myanti-B_s0 </pre> </small>

2. Decay file parsing

  • Parsing should be simple
    • Expert users can configure parser choice and settings, etc.
  • Parsing should be (reasonably) fast!

After parsing, many queries are possible!

In [48]:
from decaylanguage import DecFileParser

The LHCb "master decay file"

It's a big file! ~ 450 particle decays defined, thousands of decay modes, over 11k lines in total.

In [49]:
dfp = DecFileParser('data/DECAY_LHCB.DEC')
In [50]:
%%time
dfp.parse()
Wall time: 2.37 s
In [51]:
dfp
Out[51]:
<DecFileParser: decfile(s)=['data/DECAY_LHCB.DEC'], n_decays=506>

Let's parse and play with a small decay file:

In [53]:
with open('data/Dst.dec') as f:
    print(f.read())
# Example decay chain for testing purposes
# Considered by itself, this file in in fact incomplete,
# as there are no instructions on how to decay the anti-D0 and the D-!

Decay D*+
0.6770    D0  pi+                    VSS;
0.3070    D+  pi0                    VSS;
0.0160    D+  gamma                  VSP_PWAVE;
Enddecay

Decay D*-
0.6770    anti-D0  pi-                VSS;
0.3070    D-       pi0                VSS;
0.0160    D-       gamma              VSP_PWAVE;
Enddecay

Decay D0
1.0   K-      pi+                  PHSP;
Enddecay

Decay D+
1.0   K-   pi+   pi+   pi0    PHSP;
Enddecay

Decay pi0
0.988228297   gamma   gamma                   PHSP;
0.011738247   e+      e-      gamma           PI0_DALITZ;
0.000033392   e+      e+      e-      e-      PHSP;
0.000000065   e+      e-                      PHSP;
Enddecay

In [54]:
dfp_Dst = DecFileParser('data/Dst.dec')
dfp_Dst
Out[54]:
<DecFileParser: decfile(s)=['data/Dst.dec']>
In [55]:
dfp_Dst.parse()
dfp_Dst
Out[55]:
<DecFileParser: decfile(s)=['data/Dst.dec'], n_decays=5>

It can be handy to parse from a multi-line string rather than a file:

In [56]:
s = """
# Decay file for [B_c+ -> (B_s0 -> K+ K-) pi+]cc

Alias      B_c+sig        B_c+
Alias      B_c-sig        B_c-
ChargeConj B_c+sig        B_c-sig
Alias      MyB_s0         B_s0
Alias      Myanti-B_s0    anti-B_s0
ChargeConj MyB_s0         Myanti-B_s0

Decay B_c+sig
  1.000     MyB_s0     pi+     PHOTOS PHSP;
Enddecay
CDecay B_c-sig

Decay MyB_s0
    1.000     K+     K-     SSD_CP 20.e12 0.1 1.0 0.04 9.6 -0.8 8.4 -0.6;
Enddecay
CDecay Myanti-B_s0
"""
In [58]:
dfp = DecFileParser.from_string(s)
dfp.parse()
dfp
Out[58]:
<DecFileParser: decfile(s)=<dec file input as a string>, n_decays=4>

Decay file information

In [59]:
dfp_Dst.print_decay_modes('D*+')
       0.677 : D0  pi+                                                        VSS 
       0.307 : D+  pi0                                                        VSS 
       0.016 : D+  gamma                                                VSP_PWAVE 
In [60]:
dfp_Dst.list_decay_mother_names()
Out[60]:
['D*+', 'D*-', 'D0', 'D+', 'pi0']
In [61]:
dfp_Dst.list_decay_modes('D*+')
Out[61]:
[['D0', 'pi+'], ['D+', 'pi0'], ['D+', 'gamma']]

Info such as particle aliases

In [62]:
dfp.dict_aliases()
Out[62]:
{'B_c+sig': 'B_c+',
 'B_c-sig': 'B_c-',
 'MyB_s0': 'B_s0',
 'Myanti-B_s0': 'anti-B_s0'}
In [63]:
dfp.dict_charge_conjugates()
Out[63]:
{'B_c+sig': 'B_c-sig', 'MyB_s0': 'Myanti-B_s0'}

3. Display of decay chains

The parser can provide a simple representation of any decay chain found in the input decay file(s).

In [64]:
dc = dfp_Dst.build_decay_chains('D+')
dc
Out[64]:
{'D+': [{'bf': 1.0,
   'fs': ['K-',
    'pi+',
    'pi+',
    {'pi0': [{'bf': 0.988228297,
       'fs': ['gamma', 'gamma'],
       'm': 'PHSP',
       'mp': ''},
      {'bf': 0.011738247,
       'fs': ['e+', 'e-', 'gamma'],
       'm': 'PI0_DALITZ',
       'mp': ''},
      {'bf': 3.3392e-05,
       'fs': ['e+', 'e+', 'e-', 'e-'],
       'm': 'PHSP',
       'mp': ''},
      {'bf': 6.5e-08, 'fs': ['e+', 'e-'], 'm': 'PHSP', 'mp': ''}]}],
   'm': 'PHSP',
   'mp': ''}]}
In [65]:
from decaylanguage import DecayChainViewer
In [66]:
DecayChainViewer(dc)
Out[66]:
DecayChainGraph mother D + dec0 K - π + π + π 0 mother->dec0 1.0 dec1 γ γ dec0:p3->dec1 0.988228297 dec2 e + e - γ dec0:p3->dec2 0.011738247 dec3 e + e + e - e - dec0:p3->dec3 3.3392e-05 dec4 e + e - dec0:p3->dec4 6.5e-08
In [67]:
dc = dfp_Dst.build_decay_chains('D*+')
DecayChainViewer(dc)
Out[67]:
DecayChainGraph mother D * (2010) + dec5 D 0 π + mother->dec5 0.677 dec7 D + π 0 mother->dec7 0.307 dec17 D + γ mother->dec17 0.016 dec6 K - π + dec5:p0->dec6 1.0 dec8 K - π + π + π 0 dec7:p0->dec8 1.0 dec13 γ γ dec7:p1->dec13 0.988228297 dec14 e + e - γ dec7:p1->dec14 0.011738247 dec15 e + e + e - e - dec7:p1->dec15 3.3392e-05 dec16 e + e - dec7:p1->dec16 6.5e-08 dec9 γ γ dec8:p3->dec9 0.988228297 dec10 e + e - γ dec8:p3->dec10 0.011738247 dec11 e + e + e - e - dec8:p3->dec11 3.3392e-05 dec12 e + e - dec8:p3->dec12 6.5e-08 dec18 K - π + π + π 0 dec17:p0->dec18 1.0 dec19 γ γ dec18:p3->dec19 0.988228297 dec20 e + e - γ dec18:p3->dec20 0.011738247 dec21 e + e + e - e - dec18:p3->dec21 3.3392e-05 dec22 e + e - dec18:p3->dec22 6.5e-08
In [68]:
dc = dfp_Dst.build_decay_chains('D*+', stable_particles=['D+', 'D0', 'pi0'])
DecayChainViewer(dc)
Out[68]:
DecayChainGraph mother D * (2010) + dec23 D 0 π + mother->dec23 0.677 dec24 D + π 0 mother->dec24 0.307 dec25 D + γ mother->dec25 0.016

Charge conjugation

In [69]:
dc_cc = dfp_Dst.build_decay_chains('D*-', stable_particles=['D-', 'anti-D0', 'pi0'])
DecayChainViewer(dc_cc)
Out[69]:
DecayChainGraph mother D * (2010) - dec26 0 π - mother->dec26 0.677 dec27 D - π 0 mother->dec27 0.307 dec28 D - γ mother->dec28 0.016

Parsing several files

Typically useful when the user decay file needs information from the master decay file.

In [70]:
s = u"""
Alias      MyXic+              Xi_c+
Alias      MyantiXic-          anti-Xi_c-
ChargeConj MyXic+              MyantiXic-

Decay Xi_cc+sig
  1.000       MyXic+    pi-    pi+       PHSP;
Enddecay
CDecay anti-Xi_cc-sig

Decay MyXic+
  1.000       p+    K-    pi+       PHSP;
Enddecay
CDecay MyantiXic-

End
"""
In [71]:
dfp = DecFileParser.from_string(s)
dfp.parse()
dfp
C:\home\sw\Anaconda3\lib\site-packages\decaylanguage\dec\dec.py:445: UserWarning: 
Corresponding 'Decay' statement for 'CDecay' statement(s) of following particle(s) not found:
anti-Xi_cc-sig.
Skipping creation of these charge-conjugate decay trees.
  warnings.warn(msg)
Out[71]:
<DecFileParser: decfile(s)=<dec file input as a string>, n_decays=3>

Note the subtletly: 3, not 4 decays, are found! This is because the file contains no statement ChargeConj anti-Xi_cc-sigXi_cc+sig, hence the parser cannot know to which particle (matching Decay statement) the charge-conjugate decay of anti-Xi_cc-sig relates to (code does not rely on position of statements to guess ;-)).

In [72]:
d = dfp.build_decay_chains('Xi_cc+sig')
DecayChainViewer(d)
Out[72]:
DecayChainGraph mother Xi_cc+sig dec29 MyXic+ π - π + mother->dec29 1.0 dec30 p K - π + dec29:p0->dec30 1.0

As said in the warning, the information provided is not enough for the anti-Xi_cc-sig to make sense:

In [73]:
from decaylanguage.dec.dec import DecayNotFound

try:
    d = dfp.build_decay_chains('anti-Xi_cc-sig')
except DecayNotFound:
    print("Decays of particle 'anti-Xi_cc-sig' not found in .dec file!")
Decays of particle 'anti-Xi_cc-sig' not found in .dec file!

But the missing information is easily providing parsing two files simultaneously ...! (Any number of files is allowed.)

In [75]:
from tempfile import NamedTemporaryFile

with NamedTemporaryFile(delete=False) as tf:
    tf.write(s.encode('utf-8'))
    
dfp = DecFileParser(tf.name, 'data/DECAY_LHCB.DEC')
dfp.parse()
In [76]:
dc = dfp.build_decay_chains('Xi_cc+sig')

DecayChainViewer(dc)
Out[76]:
DecayChainGraph mother Xi_cc+sig dec31 MyXic+ π - π + mother->dec31 1.0 dec32 p K - π + dec31:p0->dec32 1.0
In [77]:
dc_cc = dfp.build_decay_chains('anti-Xi_cc-sig')

DecayChainViewer(dc_cc)
Out[77]:
DecayChainGraph mother anti-Xi_cc-sig dec33 MyantiXic- π + π - mother->dec33 1.0 dec34 K + π - dec33:p0->dec34 1.0

4. Representation of decay chains

The universal (and digital) representation of decay chains is of interest well outside the context of decay file parsing!

Building blocks

  • A daughters list - list of final-state particles.
  • A decay mode - typically a branching fraction and a list of final-state particles (may also contain any metadata such as decay model and optional decay-model parameters, as defined for example in .dec decay files).
  • A decay chain - can be seen as a mother particle and a list of decay modes.
In [78]:
from decaylanguage.decay.decay import DaughtersDict, DecayMode, DecayChain

Daughters list (actually a Counter dictionary, internally):

In [79]:
# Constructor from a dictionary
dd = DaughtersDict({'K+': 1, 'K-': 2, 'pi+': 1, 'pi0': 1})

# Constructor from a list of particle names
dd = DaughtersDict(['K+', 'K-', 'K-', 'pi+', 'pi0'])

# Constructor from a string representing the final state
dd = DaughtersDict('K+ K- pi0')
dd
Out[79]:
<DaughtersDict: ['K+', 'K-', 'pi0']>

Decay Modes

In [80]:
# A 'default' and hence empty, decay mode
dm = DecayMode()

# Decay mode with minimal input information
dd = DaughtersDict('K+ K-')
dm = DecayMode(0.5, dd)

# Decay mode with decay model information and user metadata
dm = DecayMode(0.2551,                                              # branching fraction
               'pi- pi0 nu_tau',                                    # final-state particles
               model='TAUHADNU',                                    # decay model
               model_params=[-0.108, 0.775, 0.149, 1.364, 0.400],   # decay-model parameters
               study='toy', year=2019                               # user metadata
              )
dm
Out[80]:
<DecayMode: daughters=nu_tau pi- pi0, BF=0.2551>
In [81]:
print(dm.describe())
Daughters: pi- pi0 nu_tau , BF: 0.2551         
    Decay model: TAUHADNU [-0.108, 0.775, 0.149, 1.364, 0.4]
    Extra info:
        study: toy
        year: 2019

Various manipulations are available:

In [82]:
dm = DecayMode.from_pdgids(0.5, [321, -321])
print(dm)

dm = DecayMode(1.0, 'K+ K+ pi-')
dm.charge_conjugate()
<DecayMode: daughters=K+ K-, BF=0.5>
Out[82]:
<DecayMode: daughters=K- K- pi+, BF=1.0>

Decay chains

In [83]:
dm1 = DecayMode(0.0124, 'K_S0 pi0', model='PHSP')
dm2 = DecayMode(0.692, 'pi+ pi-')
dm3 = DecayMode(0.98823, 'gamma gamma')
dc = DecayChain('D0', {'D0':dm1, 'K_S0':dm2, 'pi0':dm3})

dc
Out[83]:
<DecayChain: D0 -> K_S0 pi0 (2 sub-decays), BF=0.0124>

Flatten the decay chain, i.e. replace all intermediate, decaying particles, with their final states:

  • The BF is now the visible BF
In [84]:
dc.flatten()
Out[84]:
<DecayChain: D0 -> gamma gamma pi+ pi- (0 sub-decays), BF=0.008479803984>
In [85]:
dc.print_as_tree()
D0
+--> K_S0
|    +--> pi+
|    +--> pi-
+--> pi0
     +--> gamma
     +--> gamma
In [86]:
#dcv = DecayChainViewer(dc.to_dict())
#dcv.graph.write_pdf('test.pdf')

DecayChainViewer(dc.to_dict())
Out[86]:
DecayChainGraph mother D 0 dec35 K S 0 π 0 mother->dec35 0.0124 dec36 π + π - dec35:p0->dec36 0.692 dec37 γ γ dec35:p1->dec37 0.98823

Interested ? Want to try it ?

Particle

DecayLanguage