12 pdg - access particle definitions
13 ---------------------------------
15 This module helps to access particle definitions. When the software is loaded a
16 list of known particles is read from the EvtGen particle definition file
17 :file:`framework/particledb/data/evt.pdl`. This file contains all well-known
18 standard-model particles and their properties: mass, width or lifetime, charge,
22 This module allows to easily access this information (see `get`) or if necessary
23 add new particles using `add_particle` and even replace the whole particle
24 definition list using `load`.
26 It also provides simple getters to convert `PDG codes`_ into particle names and
27 vice versa for use with modules which require a list of PDG codes for the
28 particles to generate. See `from_name`, `from_names`, `to_name` and `to_names`
30 .. _PDG codes: http://pdg.lbl.gov/2020/reviews/rpp2020-rev-monte-carlo-numbering.pdf
39 Function to return an instance of the EvtGenDatabasePDG class.
42 from ROOT
import Belle2
49 Function to return particle information (TParticlePDG) from ROOT Database.
51 'name' can be either the name of the particle, or a pdg code.
52 Will throw an LookupError of no such particle exists.
55 p = _get_instance().GetParticle(name)
57 raise LookupError(
"No particle with name '%s'" % name)
64 Function to return pdg code for the given particle name.
66 >>> pdg.from_name("pi+")
70 return get(name).PdgCode()
73 def from_names(names):
75 for a list/tuple of particle names, return list of pdg codes.
77 >>> pdg.from_names(["e+","e-","gamma"])
81 assert not isinstance(names, str),
'Argument is not a list!'
83 return [from_name(n)
for n
in names]
88 Return particle name for given pdg code.
94 return get(pdg).GetName()
97 def to_names(pdg_codes):
99 for a list/tuple of pdg codes, return list of paricle names.
101 >>> pdg.to_names([11, -11, -211, 3212])
102 ['e-', 'e+', 'pi-', 'Sigma0']
105 assert not isinstance(pdg_codes, int),
'Argument is not a list!'
107 return [to_name(pdg)
for pdg
in pdg_codes]
112 Function to return name of conjugated particle
116 return to_name(-from_name(name))
123 Read particle database from given evtgen pdl file
125 _get_instance().ReadEvtGenTable(filename)
129 """Read default evt.pdl file"""
130 _get_instance().ReadEvtGenTable()
133 def add_particle(name, pdgCode, mass, width, charge, spin, max_width=None, lifetime=0, pythiaID=0):
135 Add a new particle to the list of known particles.
137 The name cannot contain any whitespace character.
140 name (str): name of the particle
141 pdgCode (int): pdg code identifiert for the particle
142 mass (float): mass of the particle in GeV
143 width (float): width of the particle in GeV
144 charge (float): charge of the particle in e
145 sping (float): spin of the particle
146 max_width (float): max width, if omitted 3*width will be used
147 lifetime (float): lifetime in ns, should be 0 as geant4 cannot handle it correctly otherwise
148 pythiaID (int): pythiaID of the particle (if any), if omitted 0 will be used
151 basf2.B2WARNING(
"Userdefined particle with non-zero lifetime will not be simulated correctly")
153 if max_width
is None:
155 max_width = width * 3
157 particle = _get_instance().AddParticle(name, name, mass,
False, width, charge * 3,
"userdefined",
158 pdgCode, 0, 0, lifetime, spin, max_width, pythiaID)
160 basf2.B2INFO(
"Adding new particle '%s' (pdg=%d, mass=%.3g GeV, width=%.3g GeV, charge=%d, spin=%d)" %
161 (name, pdgCode, mass, width, charge, spin))
167 def search(name=None, min_mass=None, max_mass=None, name_regex=False, include_width=False):
169 Search for a particles by name or mass or both.
171 This function allows to search for particle by name or mass and will return
172 a list of all particles which match the given criteria.
174 By default all searches for the name are case insensitive but if ``name``
175 starts with "~" the search will be case sensitive. The "~" will not be part
178 If ``name_regex=True`` the name will be interpreted as a python
179 :py:mod:`regular expression <re>` and the function will return all particles
180 whose names match the expression. If ``name_regex=False`` the function will
181 return a list of all particles containing the given pattern as substring
182 ignoring case with two special cases:
184 - if ``name`` begins with "^", only particles beginning with the pattern
185 will be searched. The "^" will not be part of the search.
186 - if ``name`` ends with "$" the pattern will only be matched to the end
187 of the particle name. The "$" will not be part of the search.
189 If ``include_width=True`` the search will include all particles if their
190 (mass ± width) is within the given limit. If ``include_width`` is a positive
191 number then the particle will be returned if :math:`m ± n*\Gamma` is within the
192 required range where n is the value of ``include_width`` and :math:`\Gamma` the
193 width of the particle.
196 Return a list of all particles
200 Search for all particles containing a "pi" somewhere in the name and ignore the case
204 Search for all particles beginning with K or k
208 Search for all particles ending with "+" and having a maximal mass of 3 GeV:
210 >>> search("+$", max_mass=3.0)
212 Search for all particles which contain a capital D and have a minimal mass of 1 GeV
214 >>> search("~D", min_mass=1.0)
216 Search for all partiles which contain a set of parenthesis containing a number
218 >>> search(r".*\(\d*\).*", name_regex=True)
220 Search all particles whose mass ± width covers 1 to 1.2 GeV
222 >>> search(min_mass=1.0, max_mass=1.2, include_width=True)
224 Search all particles whose mass ± 3*width touches 1 GeV
226 >>> search(min_mass=1.0, max_mass=1.0, include_width=3)
230 name (str): Search pattern which will either be matched as a substring
231 or as regular expression if ``name_regex=True``
232 min_mass (float): minimal mass for all returned particles or None for no limit
233 max_mass (float): maximal mass for all returned particles or None for no limit
234 name_regex (bool): if True then ``name`` will be treated as a regular expression
235 include_width (float or bool): if True or >0 include the particles if
236 (mass ± include_width*width) falls within the mass limits
241 options = re.IGNORECASE
247 if name[0] ==
"^" and name[-1] ==
"$":
248 name =
"^{}$".format(re.escape(name[1:-1]))
250 name =
"^{}.*".format(re.escape(name[1:]))
251 elif name[-1] ==
"$":
252 name =
".*{}$".format(re.escape(name[:-1]))
254 name =
".*{}.*".format(re.escape(name))
256 pattern = re.compile(name, options)
258 if include_width
is True:
261 if include_width < 0:
265 for p
in _get_instance().ParticleList():
266 if pattern
is not None and not pattern.match(p.GetName()):
269 w = p.Width() * include_width
270 if min_mass
is not None and min_mass > (m + w):
272 if max_mass
is not None and max_mass < (m - w):
static EvtGenDatabasePDG * Instance()
Instance method that loads the EvtGen table.