ATLAS Offline Software
Loading...
Searching...
No Matches
ros2rob_from_partition.py
Go to the documentation of this file.
1#!/usr/bin/env python
2
3# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
4
5import eformat
6from pm.project import Project
7from argparse import ArgumentParser
8from types import MethodType
9from sys import stdout, stderr
10from datetime import datetime
11
12# get the arg parser
14 parser = ArgumentParser(description='Produce a ros2rob map, as a python '
15 'dictionary, from a given partition.')
16 parser.add_argument('--database_file', '-d', required=True,
17 help='A partition filename (e.g. ATLAS.data.xml).')
18 parser.add_argument('--partition', '-p', required=True,
19 help='A partition filename. The name of the partition '
20 'that is read from pfile (e.g. ATLAS).')
21 parser.add_argument('--output_file', '-o',
22 help='The output filename. The name of the file to which '
23 'the ros2rob map is written. If omitted, stdout is '
24 'used (e.g. myros2rob.py).')
26 return parser
27
29 """
30 Alter an ArgumentParser so that it shows a help msg whenever there is an
31 error in the command line
32 """
33 def error(self, msg):
34 print('error: %s\n' % msg, file=stderr)
35 self.print_help()
36 exit(2)
37 parser.error = MethodType(error, parser)
38
39def get_roses(pfname, pname):
40 """
41 Get all the ROSes and swRODs in the partition
42 """
43 partition = Project(pfname).getObject('Partition', pname)
44 roses = partition.get('ROS')
45 swrods = partition.get('SwRodApplication')
46 return roses + swrods
47
48def get_ros2rob(roses):
49 """
50 Get the ros2rob map from the ROS list
51 """
52 ros2rob = {}
53 for ros in roses:
54 if ros.id in ros2rob:
55 print("WARNING: %s is repeated in the partition: ignoring "
56 "second occurrence", file=stderr)
57 else:
58 ros2rob[ros.id] = get_robs(ros)
59 ros2rob['RoIBuilder'] = get_roib_robs()
60 return ros2rob
61
62def get_robs(ros):
63 """
64 Get the list of ROBs that correspond to a ROS
65 """
66 return [eformat.helper.SourceIdentifier(rol.Id).code()
67 for robin in ros.Contains for rol in robin.Contains]
68
70 """
71 Get a hardcoded list of RoIBuilder ROB IDs which are not listed in the partition
72 """
73 return [
74 # CTP
75 0x770001,
76 # L1Calo
77 0x7300a8, 0x7300a9, 0x7300aa, 0x7300ab, 0x7500ac, 0x7500ad,
78 # L1Topo
79 0x910081, 0x910091, 0x910082, 0x910092]
80
81def print_ros2rob(ros2rob, out):
82 """
83 Print the ros2rob map as an easily readable/editable python dictionary
84 """
85 print("ros2rob = {", file=out)
86 count = 0
87 for k, v in ros2rob.items():
88 count += 1
89 print("\t'%s': \n\t[" % k, file=out)
90 for i in range(len(v)):
91 print("\t\t%s" % hex(v[i]), end=' ', file=out)
92 if i+1 != len(v):
93 print(",", file=out)
94 else:
95 print("\n\t]", end=' ', file=out)
96 if count != len(ros2rob):
97 print(",", file=out)
98 print("\n}", file=out)
99
100def print_header(dbfile, outname, out):
101 header = f"""
102#
103# Copyright (C) 2002-{datetime.now().year} CERN for the benefit of the ATLAS collaboration
104#
105'''
106@file {outname}
107@brief Store ROS to ROB map extracted from {dbfile}
108'''
109"""
110 print(header, file=out)
111
113 footer = """
114class ROSToROBMap:
115\tdef __init__(self):
116\t\tself.data = ros2rob
117
118\tdef get_mapping(self):
119\t\treturn self.data
120"""
121 print(footer, file=out)
122
123# main
124if __name__ == '__main__':
125 args = argparser().parse_args()
126 out = open(args.output_file, 'w') if args.output_file else stdout
127 print("# Extracting ROS2ROB map", file=stderr)
128 print_header(args.database_file, args.output_file, out)
129 print_ros2rob(get_ros2rob(get_roses(args.database_file, args.partition)), out)
130 print_footer(out)
131
void print(char *figname, TCanvas *c1)
print_header(dbfile, outname, out)