71
72
73
74 from AthenaConfiguration.AllConfigFlags import initConfigFlags
75 flags = initConfigFlags()
76 parser = get_parser(flags)
77
78 args = flags.fillFromArgs(parser=parser)
79 menu_name = MENU_ALIASES.get(args.menu, args.menu)
80
81
82 if args.check_l1 or args.check_CPS or args.dump_dicts:
83 args.parse_names = True
84
85 flags.Trigger.triggerConfig='FILE'
86 flags.Input.Files=[]
87 flags.Trigger.triggerMenuSetup=menu_name
88 flags.lock()
89
90 if args.parse_names:
91 from TrigConfigSvc.TrigConfigSvcCfg import generateL1Menu
92 generateL1Menu(flags)
93
94
95 menumodule = importlib.import_module(f'TriggerMenuMT.HLT.Menu.{menu_name}')
96 menu = menumodule.setupMenu()
97
98
99 if args.stream:
100 def filt(chain):
101 return args.stream in chain.stream
102 else:
103 def filt(x):
104 return True
105
106 if args.group:
107 groupstr = args.group
108 def filt(x, old=filt):
109 if not old(x):
110 return False
111 for group in x.groups:
112 if group.startswith(groupstr):
113 return True
114 return False
115
116 chains = chain_iter(menu, filt)
117 if args.names:
118 dump_chains(chains)
119 elif args.parse_names:
120 chain_to_dict, failed = get_chain_dicts(flags, chains)
121 if failed:
122 sys.exit(1)
123 if args.check_l1:
124 l1items = get_l1_list(args.menu)
126 for chain, chain_dict in chain_to_dict.items():
127 if not chain_dict['L1item']:
128 continue
129
130 this_l1items = chain_dict[
'L1item'].
split(
',')
131 for this_l1 in this_l1items:
132 if this_l1 not in l1items:
133 sys.stderr.write(f'L1 item not in menu for HLT item {chain}\n')
134 missingl1.add(chain)
135 break
136 if missingl1:
137 sys.exit(1)
138
139 if args.check_CPS:
140
141 chains = chain_iter(menu, filt)
142 def match_group(expr,chain):
143 for group in chain.groups:
144 if expr in group:
145 return True
146 return False
147
148 cps_to_chains = {}
149 L1_to_chains = {}
150
151 for chain in chains:
152 chain_dict = chain_to_dict[chain.name]
153 if (
154 not chain_dict['L1item']
155 or not match_group('Support',chain)
156 or match_group('TagAndProbe',chain)
157 ):
158 continue
159
160
161
162 if len(chain_dict[
'L1item'].
split(
',')) == 1:
163 if chain_dict['L1item'] not in L1_to_chains:
164 L1_to_chains[chain_dict[
'L1item']] =
set()
165 L1_to_chains[chain_dict[
'L1item']].
add(chain.name)
166
167 if match_group('RATE:CPS',chain):
168 cps_item = None
169 for group in chain.groups:
170 if group.startswith('RATE:CPS_'):
171 cps_item = 'L1_'+group[9:]
172 if cps_item == 'L1_ZB':
173 cps_item = 'L1_ZeroBias'
174 if cps_item not in cps_to_chains:
175 cps_to_chains[cps_item] =
set()
176 cps_to_chains[cps_item].
add(chain.name)
177
178 for cps_item, cps_chains in cps_to_chains.items():
179 L1_chains = L1_to_chains[cps_item]
180 if len(L1_chains) < len(cps_chains):
181 raise RuntimeError('More CPS chains than L1-seeded, something wrong in parsing')
182 if len(cps_chains) < len(L1_chains):
183 print(f
'CPS group seeded by {cps_item} does not include all support chains')
184 print(f
' Contains {len(cps_chains)} / {len(L1_chains)}')
186 for missing in L1_chains.difference(cps_chains):
188
189 if args.dump_dicts:
190 dump_chain_dicts(chain_to_dict,args.menu)
191
void print(char *figname, TCanvas *c1)
bool add(const std::string &hname, TKey *tobj)
std::vector< std::string > split(const std::string &s, const std::string &t=":")