17from generators
import add_kkmc_generator
18from simulation
import add_simulation
19from validation_gt
import get_validation_globaltags
20from rawdata
import add_unpackers
21from reconstruction
import add_reconstruction
22from argparse
import ArgumentParser
28parser = ArgumentParser(description=
'Measure the execution time.')
29parser.add_argument(
'-m',
'--multiplicity', default=
'high', choices=[
'high',
'low',
'data'], help=
'Multiplicity or type of events')
30parser.add_argument(
'-l',
'--limits', help=
'Name of file containing limits')
31parser.add_argument(
'-f',
'--file', help=
'Name of benchmark output file')
32args = parser.parse_args()
35main = b2.create_path()
36b2.set_log_level(b2.LogLevel.ERROR)
38if args.multiplicity ==
'data':
40 b2.conditions.override_globaltags(get_validation_globaltags())
42 input_files = glob.glob(os.environ.get(
'BELLE2_VALIDATION_DATA_DIR',
'') +
'/rawdata/physics.0010.05095*.root')
43 main.add_module(
"RootInput", inputFileNames=input_files)
45 main.add_module(
'EventInfoPrinter').set_log_level(b2.LogLevel.INFO)
48 main.add_module(
'Gearbox')
49 main.add_module(
'Geometry', useDB=
True)
56 main.add_module(
'EventInfoSetter', evtNumList=[1000])
57 main.add_module(
'EventInfoPrinter').set_log_level(b2.LogLevel.INFO)
59 if args.multiplicity ==
'high':
61 main.add_module(
'EvtGenInput')
63 elif args.multiplicity ==
'low':
65 add_kkmc_generator(main,
'mu+mu-')
68 add_simulation(main, bkgfiles=glob.glob(os.environ.get(
'BELLE2_BACKGROUND_DIR',
'/sw/belle2/bkg') +
'/*.root'))
71add_reconstruction(main)
79limits_file = args.limits
80default_limits_file = args.multiplicity +
'.limits'
81if limits_file
is None and os.path.isfile(default_limits_file):
82 limits_file = default_limits_file
83if limits_file
is not None:
84 for line
in open(limits_file).readlines():
85 entries = line.split()
86 limits[entries[0]] = float(entries[1])
88 limits[entries[0]] /= float(entries[2])
96 'Posttracking_Reconstruction',
97 'Postfilter_Reconstruction']
99for module
in b2.statistics.modules:
100 if module.name
not in [
'Sum_' + category
for category
in categories]:
102 category = module.name[4:]
103 if category
not in times.keys():
105 times[category] += module.time_mean(b2.statistics.EVENT) * 1e-6
109if args.file
is not None:
110 output = open(args.file,
'w')
113b2.set_log_level(b2.LogLevel.INFO)
115for category
in categories:
116 if category
not in times.keys():
118 time = times[category]
119 message = f
'Execution time per event for {category} is {time:.0f} ms'
121 if category
in limits.keys():
122 fraction = time / limits[category]
123 if fraction > max_fraction:
124 max_fraction = fraction
125 message += f
' = {fraction:.0%} of the limit.'
129 b2.B2WARNING(message)
135 if output
is not None:
136 output.write(f
'{category} {time:.2f}')
138 output.write(f
' {fraction:.4f}')
142sys.exit(0
if max_fraction <= 1
else 1)