15 Check reading and writing of evt.pdl files as well as errors when creating new particles.
17 This script tests that
18 - the ROOT.TDatabasePDG instance is in fact an EvtGenDatabasePDG
19 - reading a pdl file raises a warning if it's not the original one
20 - creating a particle which already exists is forbidden
21 - creating particles with whitespace in the name is forbidden
22 - writing an evt.pdl results in the same output as the original pdl, except for
23 whitespace and additionally defined particles
27 from tempfile
import NamedTemporaryFile
35 db = ROOT.TDatabasePDG.Instance()
37 db.AddParticle(
"e-",
"electron", 0,
False, 0, 0,
"duplicate", 11, 0, 0, 0, 0, 0, 0)
39 db.AddParticle(
"invalid name",
"invalid name", 0,
False, 0, 0,
"custom", 2345, 0, 0, 0, 0, 0, 0)
46 default_evtpdl = basf2.find_file(os.path.join(
"data",
"framework",
"particledb",
"evt.pdl"))
49 with NamedTemporaryFile()
as tempfile:
51 db.WriteEvtGenTable(tempfile.name)
54 with open(default_evtpdl)
as default:
55 old_lines = [x.split()
for x
in default
if x[0] !=
'*' and not x.startswith(
"end")]
56 with open(tempfile.name)
as changed:
57 new_lines = [x.split()
for x
in changed
if x[0] !=
'*' and not x.startswith(
"end")]
59 if len(old_lines) != len(new_lines):
60 basf2.B2ERROR(
"Different number of lines when writing pdl file")
64 types = [str] * 4 + [int, float, float, float, int, int, float, int]
66 for old, new
in zip(old_lines, new_lines):
68 if len(old) != len(new):
69 basf2.B2ERROR(
"Number of field different between old and new:",
73 elif len(new) < len(types):
74 basf2.B2ERROR(
"Not enough fields", old=old, new=new)
78 if not all(t(o) == t(n)
for t, o, n
in zip(types, old, new)):
79 basf2.B2ERROR(
"Particles differ", old=old, new=new)
82 with NamedTemporaryFile()
as tempfile2:
84 db.AddParticle(
"testparticle",
"testparticle", 1,
False, 2, 3,
"custom", 10001, 4, 5, 6, 7, 8, 9)
89 db.WriteEvtGenTable(tempfile2.name)
91 subprocess.call([
"diff",
"--old-line-format=- %L",
"--new-line-format=+ %L",
92 "--unchanged-line-format=", tempfile.name, tempfile2.name])
94 db.ReadEvtGenTable(
"/no/such/file/(I hope)")
98 print(
"now we should have zero entries: ", db.ParticleList().GetEntries())
99 print(
"so reread default file...")
101 print(
"number of entries is now", db.ParticleList().GetEntries()
and "positive" or "zero")
def add_particle(name, pdgCode, mass, width, charge, spin, max_width=None, lifetime=0, pythiaID=0, define_anti_particle=False)