15Check reading and writing of evt.pdl files as well as errors when creating new particles.
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
27from tempfile import NamedTemporaryFile
35db = ROOT.TDatabasePDG.Instance()
36# create particle which already exists, should print error
37db.AddParticle("e-", "electron", 0, False, 0, 0, "duplicate", 11, 0, 0, 0, 0, 0, 0)
38# create particle with whitespace in the name, should print error
39db.AddParticle("invalid name", "invalid name", 0, False, 0, 0, "custom", 2345, 0, 0, 0, 0, 0, 0)
40# and also create a particle with the python function: should give error due to
42pdg.add_particle("test2", 1, 5.28, 0.1, 0, 0.5)
43pdg.add_particle("foo\tbar", 10001, 0, 0, 0, 0)
45# default evt.pdl filename
46default_evtpdl = basf2.find_file(os.path.join("data", "framework", "particledb", "evt.pdl"))
47# create a temporary one and compare
49with 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])
94db.ReadEvtGenTable(
"/no/such/file/(I hope)")
98print(
"now we should have zero entries: ", db.ParticleList().GetEntries())
99print(
"so reread default file...")
101print(
"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)