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 from AthenaConfiguration.TestDefaults import defaultGeometryTags
86 if "run4" in args.menu:
87 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN4
88 else:
89 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN3
90
91 flags.Trigger.triggerConfig='FILE'
92 flags.Input.Files=[]
93 flags.Trigger.triggerMenuSetup=menu_name
94 flags.lock()
95
96 if args.parse_names:
97 from TrigConfigSvc.TrigConfigSvcCfg import generateL1Menu
98 generateL1Menu(flags)
99
100
101 menumodule = importlib.import_module(f'TriggerMenuMT.HLT.Menu.{menu_name}')
102 menu = menumodule.setupMenu()
103
104
105 if args.stream:
106 def filt(chain):
107 return args.stream in chain.stream
108 else:
109 def filt(x):
110 return True
111
112 if args.group:
113 groupstr = args.group
114 def filt(x, old=filt):
115 if not old(x):
116 return False
117 for group in x.groups:
118 if group.startswith(groupstr):
119 return True
120 return False
121
122 chains = chain_iter(menu, filt)
123 if args.names:
124 dump_chains(chains)
125 elif args.parse_names:
126 chain_to_dict, failed = get_chain_dicts(flags, chains)
127 if failed:
128 sys.exit(1)
129 if args.check_l1:
130 l1items = get_l1_list(args.menu)
132 for chain, chain_dict in chain_to_dict.items():
133 if not chain_dict['L1item']:
134 continue
135
136 this_l1items = chain_dict[
'L1item'].
split(
',')
137 for this_l1 in this_l1items:
138 if this_l1 not in l1items:
139 sys.stderr.write(f'L1 item not in menu for HLT item {chain}\n')
140 missingl1.add(chain)
141 break
142 if missingl1:
143 sys.exit(1)
144
145 if args.check_CPS:
146
147 chains = chain_iter(menu, filt)
148 def match_group(expr,chain):
149 for group in chain.groups:
150 if expr in group:
151 return True
152 return False
153
154 cps_to_chains = {}
155 L1_to_chains = {}
156
157 for chain in chains:
158 chain_dict = chain_to_dict[chain.name]
159 if (
160 not chain_dict['L1item']
161 or not match_group('Support',chain)
162 or match_group('TagAndProbe',chain)
163 ):
164 continue
165
166
167
168 if len(chain_dict[
'L1item'].
split(
',')) == 1:
169 if chain_dict['L1item'] not in L1_to_chains:
170 L1_to_chains[chain_dict[
'L1item']] =
set()
171 L1_to_chains[chain_dict[
'L1item']].
add(chain.name)
172
173 if match_group('RATE:CPS',chain):
174 cps_item = None
175 for group in chain.groups:
176 if group.startswith('RATE:CPS_'):
177 cps_item = 'L1_'+group[9:]
178 if cps_item == 'L1_ZB':
179 cps_item = 'L1_ZeroBias'
180 if cps_item not in cps_to_chains:
181 cps_to_chains[cps_item] =
set()
182 cps_to_chains[cps_item].
add(chain.name)
183
184 for cps_item, cps_chains in cps_to_chains.items():
185 L1_chains = L1_to_chains[cps_item]
186 if len(L1_chains) < len(cps_chains):
187 raise RuntimeError('More CPS chains than L1-seeded, something wrong in parsing')
188 if len(cps_chains) < len(L1_chains):
189 print(f
'CPS group seeded by {cps_item} does not include all support chains')
190 print(f
' Contains {len(cps_chains)} / {len(L1_chains)}')
192 for missing in L1_chains.difference(cps_chains):
194
195 if args.dump_dicts:
196 dump_chain_dicts(chain_to_dict,args.menu)
197
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=":")
int run(int argc, char *argv[])