Belle II Software development
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"""
15Check reading and writing of evt.pdl files as well as errors when creating new particles.
16
17This 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
27from tempfile import NamedTemporaryFile
28import basf2
29import ROOT
30import os
31import sys
32import subprocess
33import pdg
34
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
41# dublicate pdg code
42pdg.add_particle("test2", 1, 5.28, 0.1, 0, 0.5)
43pdg.add_particle("foo\tbar", 10001, 0, 0, 0, 0)
44
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
48retcode = 0
49with 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
94db.ReadEvtGenTable("/no/such/file/(I hope)")
95# and also test the python function
96pdg.load("/no/such/file/(again)")
97
98print("now we should have zero entries: ", db.ParticleList().GetEntries())
99print("so reread default file...")
100db.ReadEvtGenTable()
101print("number of entries is now", db.ParticleList().GetEntries() and "positive" or "zero")
102sys.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:135
def load(filename)
Definition: pdg.py:122