Belle II Software  release-08-01-10
evtpdl.py
1 #!/usr/bin/env python3
2 
3 
10 
11 # this is a test executable, not a module so we don't need doxygen warnings
12 # @cond SUPPRESS_DOXYGEN
13 
14 """
15 Check reading and writing of evt.pdl files as well as errors when creating new particles.
16 
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
24 """
25 
26 
27 from tempfile import NamedTemporaryFile
28 import basf2
29 import ROOT
30 import os
31 import sys
32 import subprocess
33 import pdg
34 
35 db = ROOT.TDatabasePDG.Instance()
36 # create particle which already exists, should print error
37 db.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
39 db.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
41 # dublicate pdg code
42 pdg.add_particle("test2", 1, 5.28, 0.1, 0, 0.5)
43 pdg.add_particle("foo\tbar", 10001, 0, 0, 0, 0)
44 
45 # default evt.pdl filename
46 default_evtpdl = basf2.find_file(os.path.join("data", "framework", "particledb", "evt.pdl"))
47 # create a temporary one and compare
48 retcode = 0
49 with NamedTemporaryFile() as tempfile:
50  # write a evt.pdl from the EventGenDatabasePDG
51  db.WriteEvtGenTable(tempfile.name)
52  # and make sure that it's the same as the original one except for
53  # whitespace, empty lines and lines starting with a "*"
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")]
58 
59  if len(old_lines) != len(new_lines):
60  basf2.B2ERROR("Different number of lines when writing pdl file")
61  retcode = 1
62  else:
63  # field types for comparison
64  types = [str] * 4 + [int, float, float, float, int, int, float, int]
65  # check all lines for equality but don't care about formatting
66  for old, new in zip(old_lines, new_lines):
67  # make sure the lines have the same number of fields
68  if len(old) != len(new):
69  basf2.B2ERROR("Number of field different between old and new:",
70  old=old, new=new)
71  retcode = 1
72  # and that they have enough fields for comparison
73  elif len(new) < len(types):
74  basf2.B2ERROR("Not enough fields", old=old, new=new)
75  retcode = 1
76  # and then make sure they're the same compariny the correct types
77  else:
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)
80  retcode = 1
81 
82  with NamedTemporaryFile() as tempfile2:
83  # create a new particle
84  db.AddParticle("testparticle", "testparticle", 1, False, 2, 3, "custom", 10001, 4, 5, 6, 7, 8, 9)
85 
86  # also test creating particle with the python functions
87  pdg.add_particle("test2", 10002, 5.28, 0.1, -1, 0.5)
88  # write the table again
89  db.WriteEvtGenTable(tempfile2.name)
90  # and make sure that it has the additional particle
91  subprocess.call(["diff", "--old-line-format=- %L", "--new-line-format=+ %L",
92  "--unchanged-line-format=", tempfile.name, tempfile2.name])
93 
94 db.ReadEvtGenTable("/no/such/file/(I hope)")
95 # and also test the python function
96 pdg.load("/no/such/file/(again)")
97 
98 print("now we should have zero entries: ", db.ParticleList().GetEntries())
99 print("so reread default file...")
100 db.ReadEvtGenTable()
101 print("number of entries is now", db.ParticleList().GetEntries() and "positive" or "zero")
102 sys.exit(retcode)
103 
104 # @endcond
def add_particle(name, pdgCode, mass, width, charge, spin, max_width=None, lifetime=0, pythiaID=0, define_anti_particle=False)
Definition: pdg.py:134
def load(filename)
Definition: pdg.py:121