7 from AthenaCommon.Logging
import logging
8 log = logging.getLogger(__name__)
9 logging.getLogger().
info(
"Importing %s",__name__)
12 from TrigConfHLTUtils.HLTUtils
import string2hash
13 from AthenaConfiguration.ComponentFactory
import CompFactory
15 topoLegIndices =
"ABCDEF"
16 anomdetWPIndices =
"LMT"
17 topo3VarLegIndices =
"ABC"
36 'n_MET_legs' : [0,1,2],
42 'n_MET_legs' : [0,1,2],
65 from TriggerMenuMT.HLT.MinBias.AFPMenuSequence
import TrigAFPDijetComboHypoToolCfg
66 from TriggerMenuMT.HLT.Muon.MuonChainConfiguration
import TrigMuonEFIdtpInvMassHypoToolCfg
67 from TriggerMenuMT.HLT.AnomalyDetection.AnomalyDetectionChainConfiguration
import TrigADComboHypoToolCfg
70 from AthenaMonitoringKernel.GenericMonitoringTool
import GenericMonitoringTool
72 chainName = chainDict[
'chainName']
73 log.debug(
"[TrigComboHypoToolFromDict] chain %s, combo hypos to be processed: %s, t", chainName, chainDict[
'extraComboHypos'])
81 theregex = fr
"(\d*)({'|'.join(allowed_obs.keys())})([{topoLegIndices}])([{topoLegIndices}])(\d*)"
82 matcher = re.compile(theregex)
84 for iTopo, topoInfo
in enumerate(chainDict[
'extraComboHypos']):
85 log.debug(
"[TrigComboHypoToolFromDict] new combo hypo for chain: %s, topoInfo = %s", chainName, topoInfo)
87 result = matcher.match(topoInfo)
89 log.error(
"[TrigComboHypoToolFromDict] Topo expression %s does not conform to format (min?)(var)(legA)(legB)(max?).",topoInfo)
90 log.error(
"[TrigComboHypoToolFromDict] Must use leg IDs in %s, vars in {allowed_obs.keys()}",topoLegIndices)
91 raise ValueError(f
"[TrigComboHypoToolFromDict] Invalid topo expression {topoInfo} received in 'extraComboHypos'!")
94 str_min, var, char_legA, char_legB, str_max = result.groups()
97 use_min =
bool(str_min)
98 use_max =
bool(str_max)
99 if not (use_min
or use_max):
100 log.error(
"[TrigComboHypoToolFromDict] Topo expression %s does not specify a min or max cut value.",topoInfo)
101 raise ValueError(f
"[TrigComboHypoToolFromDict] Invalid topo expression {topoInfo} received in 'extraComboHypos'!")
103 if var
in [
'dR',
'dphi',
'deta']:
104 cut_min =
float(str_min)/10.
if use_min
else float(
'nan')
105 cut_max =
float(str_max)/10.
if use_max
else float(
'nan')
107 cut_min =
float(str_min)
if use_min
else float(
'nan')
108 cut_max =
float(str_max)
if use_max
else float(
'nan')
111 i_legA = topoLegIndices.find(char_legA)
112 i_legB = topoLegIndices.find(char_legB)
117 for ileg
in [i_legA,i_legB]:
118 cpart = chainDict[
'chainParts'][ileg]
119 legname = f
"leg{ileg:03d}_{chainName}"
124 'isMET' : cpart[
'signature']==
'MET',
125 'multiplicity':
int(cpart[
'multiplicity'])
129 n_MET_legs = legInfo[0][
'isMET'] + legInfo[1][
'isMET']
136 if legInfo[0][
'multiplicity'] != 2:
137 log.error(
"[TrigComboHypoToolFromDict] Error configuring topo for chain %s!",chainName)
138 log.error(
"[TrigComboHypoToolFromDict] Topo selection %s requires multiplicity 2 on leg %d, found %d!",topoInfo,i_legA,legInfo[0][
'multiplicity'])
139 raise Exception(
"[TrigComboHypoToolFromDict] Invalid multiplicity")
141 log.error(
"[TrigComboHypoToolFromDict] Configured with the same MET leg on both sides -- impossible to satisfy!")
142 raise Exception(
"[TrigComboHypoToolFromDict] Identical MET legs for topo selection")
143 if len(chainDict[
'chainParts'])==1:
147 if li[
'multiplicity'] != 1:
148 log.error(
"[TrigComboHypoToolFromDict] Error configuring topo for chain %s!",chainName)
149 log.error(
"[TrigComboHypoToolFromDict] Topo selection %s requires multiplicity 1 on leg %d, found %d!",topoInfo,li[
'index'],li[
'multiplicity'])
150 raise Exception(
"[TrigComboHypoToolFromDict] Invalid multiplicity")
153 if n_MET_legs
not in allowed_obs[var][
'n_MET_legs']:
154 log.error(
"[TrigComboHypoToolFromDict] Attempting var %s with %d MET legs, %s allowed", var, n_MET_legs, allowed_obs[var][
'n_MET_legs'])
155 raise Exception(
"[TrigComboHypoToolFromDict] Attempting to use the MET leg in var")
157 if len(chainDict[
'extraComboHypos'])==1:
158 monToolName =
"MonTool_"+chainName
160 monToolName = f
"MonTool_{chainName}_{chainDict['extraComboHypos'][iTopo]}"
163 monTool.defineHistogram(histNameTag+
'OfAccepted', type=
'TH1F', path=
'EXPERT',
164 title=var+
" in accepted combinations; {}".
format(var),
165 xbins=allowed_obs[var][
'hist_nbins'],
166 xmin=allowed_obs[var][
'hist_min'],
167 xmax=allowed_obs[var][
'hist_max'])
168 monTool.defineHistogram(histNameTag+
'OfProcessed', type=
'TH1F', path=
'EXPERT',
169 title=var+
" in processed combinations; {}".
format(var),
170 xbins=allowed_obs[var][
'hist_nbins'],
171 xmin=allowed_obs[var][
'hist_min'],
172 xmax=allowed_obs[var][
'hist_max'])
173 log.debug(
"[TrigComboHypoToolFromDict] tool configured for hypo name: %s, topoInfo = %s", chainName, topoInfo)
174 log.debug(
"[TrigComboHypoToolFromDict] histName = %s", histNameTag)
176 if len(chainDict[
'extraComboHypos'])==1:
177 monTool.HistPath = f
'ComboHypo/{chainName}'
179 subDirNameTag = f
"{var}leg{i_legA:03d}leg{i_legB:03d}"
180 monTool.HistPath = f
'ComboHypo/{chainName}/detail_{subDirNameTag}'
185 "UseMinVec" : use_min,
186 "UseMaxVec" : use_max,
187 "LowerCutVec" : cut_min,
188 "UpperCutVec" : cut_max,
189 "LegAVec" : legInfo[0][
"HLTId"],
190 "LegBVec" : legInfo[1][
"HLTId"],
191 "IsLegA_METVec": legInfo[0][
"isMET"],
192 "IsLegB_METVec": legInfo[1][
"isMET"],
193 "MonTools" : monTool,
195 topoDefs.append(singleTopoDef)
198 log.debug(
"[TrigComboHypoToolFromDict] tool configured for hypo name: %s, topoInfo = %s", chainName, topoInfo)
199 log.debug(
"[TrigComboHypoToolFromDict] var = %s", singleTopoDef[
'Variables'])
200 log.debug(
"[TrigComboHypoToolFromDict] legA = %s", singleTopoDef[
'LegAVec'])
201 log.debug(
"[TrigComboHypoToolFromDict] legB = %s", singleTopoDef[
'LegBVec'])
203 log.debug(
"[TrigComboHypoToolFromDict] min = %10.3f", singleTopoDef[
'LowerCutVec'])
205 log.debug(
"[TrigComboHypoToolFromDict] max = %10.3f", singleTopoDef[
'UpperCutVec'])
210 toolProps = {k:[thedef[k]
for thedef
in topoDefs]
for k
in topoDefs[0]}
211 tool = CompFactory.TrigComboHypoTool(chainName, SkipLegCheck=skipLegCheck, **toolProps)
216 from AthenaMonitoringKernel.GenericMonitoringTool
import GenericMonitoringTool
218 chainName = chainDict[
'chainName']
219 log.debug(
"[Trig3VarComboHypoToolFromDict] chain %s, combo hypos to be processed: %s, t", chainName, chainDict[
'extraComboHypos'])
227 theregex = fr
"(\d*)({'|'.join(allowed_3var_obs.keys())})([{topo3VarLegIndices}])([{topo3VarLegIndices}])([{topo3VarLegIndices}])(\d*)"
228 matcher = re.compile(theregex)
230 for iTopo, topoInfo
in enumerate(chainDict[
'extraComboHypos']):
231 log.debug(
"[Trig3VarComboHypoToolFromDict] new combo hypo for chain: %s, topoInfo = %s", chainName, topoInfo)
233 result = matcher.match(topoInfo)
235 log.error(
"[Trig3VarComboHypoToolFromDict] Topo expression %s does not conform to format (min?)(var)(legA)(legB)(legC)(max?).",topoInfo)
236 log.error(
"[Trig3VarComboHypoToolFromDict] Must use leg IDs in %s, vars in {allowed_3var_obs.keys()}",topo3VarLegIndices)
237 raise ValueError(f
"[Trig3VarComboHypoToolFromDict] Invalid topo expression {topoInfo} received in 'extraComboHypos'!")
240 str_min, var, char_legA, char_legB, char_legC, str_max = result.groups()
243 use_min =
bool(str_min)
244 use_max =
bool(str_max)
245 if not (use_min
or use_max):
246 log.error(
"[Trig3VarComboHypoToolFromDict] Topo expression %s does not specify a min or max cut value.",topoInfo)
247 raise ValueError(f
"[Trig3VarComboHypoToolFromDict] Invalid topo expression {topoInfo} received in 'extraComboHypos'!")
249 cut_min =
float(str_min)
if use_min
else float(
'nan')
250 cut_max =
float(str_max)
if use_max
else float(
'nan')
253 i_legA = topo3VarLegIndices.find(char_legA)
254 i_legB = topo3VarLegIndices.find(char_legB)
255 i_legC = topo3VarLegIndices.find(char_legC)
260 for ileg
in [i_legA,i_legB,i_legC]:
261 cpart = chainDict[
'chainParts'][ileg]
262 legname = f
"leg{ileg:03d}_{chainName}"
267 'isMET' : cpart[
'signature']==
'MET',
268 'multiplicity':
int(cpart[
'multiplicity'])
272 n_MET_legs = legInfo[0][
'isMET'] + legInfo[1][
'isMET'] + legInfo[2][
'isMET']
275 if n_MET_legs
not in allowed_3var_obs[var][
'n_MET_legs']:
276 log.error(
"[Trig3VarComboHypoToolFromDict] Attempting var %s with %d MET legs, %s allowed", var, n_MET_legs, allowed_3var_obs[var][
'n_MET_legs'])
277 raise Exception(
"[Trig3VarComboHypoToolFromDict] Attempting to use the MET leg in var")
279 if len(chainDict[
'extraComboHypos'])==1:
280 monToolName =
"MonTool_"+chainName
282 monToolName = f
"MonTool_{chainName}_{chainDict['extraComboHypos'][iTopo]}"
285 monTool.defineHistogram(histNameTag+
'OfAccepted', type=
'TH1F', path=
'EXPERT',
286 title=var+
" in accepted combinations; {}".
format(var),
287 xbins=allowed_3var_obs[var][
'hist_nbins'],
288 xmin=allowed_3var_obs[var][
'hist_min'],
289 xmax=allowed_3var_obs[var][
'hist_max'])
290 monTool.defineHistogram(histNameTag+
'OfProcessed', type=
'TH1F', path=
'EXPERT',
291 title=var+
" in processed combinations; {}".
format(var),
292 xbins=allowed_3var_obs[var][
'hist_nbins'],
293 xmin=allowed_3var_obs[var][
'hist_min'],
294 xmax=allowed_3var_obs[var][
'hist_max'])
295 log.debug(
"[Trig3VarComboHypoToolFromDict] tool configured for hypo name: %s, topoInfo = %s", chainName, topoInfo)
296 log.debug(
"[Trig3VarComboHypoToolFromDict] histName = %s", histNameTag)
298 if len(chainDict[
'extraComboHypos'])==1:
299 monTool.HistPath = f
'ComboHypo/{chainName}'
301 subDirNameTag = f
"{var}leg{i_legA:03d}leg{i_legB:03d}leg{i_legC:03d}"
302 monTool.HistPath = f
'ComboHypo/{chainName}/detail_{subDirNameTag}'
307 "UseMinVec" : use_min,
308 "UseMaxVec" : use_max,
309 "LowerCutVec" : cut_min,
310 "UpperCutVec" : cut_max,
311 "LegAVec" : legInfo[0][
"HLTId"],
312 "LegBVec" : legInfo[1][
"HLTId"],
313 "LegCVec" : legInfo[2][
"HLTId"],
314 "IsLegA_METVec": legInfo[0][
"isMET"],
315 "IsLegB_METVec": legInfo[1][
"isMET"],
316 "IsLegC_METVec": legInfo[2][
"isMET"],
317 "MonTools" : monTool,
319 topoDefs.append(singleTopoDef)
322 log.debug(
"[Trig3VarComboHypoToolFromDict] tool configured for hypo name: %s, topoInfo = %s", chainName, topoInfo)
323 log.debug(
"[Trig3VarComboHypoToolFromDict] var = %s", singleTopoDef[
'Variables'])
324 log.debug(
"[Trig3VarComboHypoToolFromDict] legA = %s", singleTopoDef[
'LegAVec'])
325 log.debug(
"[Trig3VarComboHypoToolFromDict] legB = %s", singleTopoDef[
'LegBVec'])
326 log.debug(
"[Trig3VarComboHypoToolFromDict] legC = %s", singleTopoDef[
'LegCVec'])
328 log.debug(
"[Trig3VarComboHypoToolFromDict] min = %10.3f", singleTopoDef[
'LowerCutVec'])
330 log.debug(
"[Trig3VarComboHypoToolFromDict] max = %10.3f", singleTopoDef[
'UpperCutVec'])
335 toolProps = {k:[thedef[k]
for thedef
in topoDefs]
for k
in topoDefs[0]}
336 tool = CompFactory.Trig3VarComboHypoTool(chainName, **toolProps)
340 comboConfigurator = {
341 'dR':TrigComboHypoToolFromDict,
342 'dphi':TrigComboHypoToolFromDict,
343 'deta':TrigComboHypoToolFromDict,
344 'invm':TrigComboHypoToolFromDict,
345 'mT':TrigComboHypoToolFromDict,
346 'afpdijet':TrigAFPDijetComboHypoToolCfg,
347 'anomdet':TrigADComboHypoToolCfg,
348 'masswiso':Trig3VarComboHypoToolFromDict,
349 'idZmumu':TrigMuonEFIdtpInvMassHypoToolCfg,
350 'idJpsimumu':TrigMuonEFIdtpInvMassHypoToolCfg,
353 def addTopoInfo(theChainConfig, mainChainDict, listOfChainDefs, lengthOfChainConfigs):
354 log.debug(
"[addTopoInfo] Adding topo info to chain %s", theChainConfig)
356 def findStepIndexInChain(chain, step):
357 for istep,chainstep
in enumerate(chain.steps):
358 if chainstep.name==step:
362 for step,(topoCfg,topoExpr)
in theChainConfig.topoMap.items():
363 thestep = theChainConfig.steps[-1]
if step==
"last" else theChainConfig.steps[findStepIndexInChain(theChainConfig,step)]
364 log.debug(
"[addTopoInfo] Adding %s to step %s",topoExpr,thestep)
367 log.error(
"Failed to find step %s in Chain! ChainDict follows:", step)
368 log.error(mainChainDict)
369 raise RuntimeError(
"Step not found when adding topo to chain")
374 log.debug(
"[addTopoInfo] theChainConfig %s", theChainConfig)
375 log.debug(
"[addTopoInfo] listOfChainDefs %s", listOfChainDefs)
376 log.debug(
"[addTopoInfo] theTopoInfo being added is %s",topoExpr)
380 if topoCfg
not in thestep.comboToolConfs:
381 if len(thestep.comboToolConfs) > 0:
382 log.warning(
"[addTopoInfo] step %s already has ComboHypo tools %s",thestep,thestep.comboToolConfs)
383 log.warning(
"[addTopoInfo] these will be added to, make sure this is the behaviour you want.")
385 thestep.name = thestep.name+
'_combo_'+topoExpr
386 thestep.addComboHypoTools(topoCfg)
390 log.debug(
"[addTopoInfo] new theChainConfig %s", theChainConfig)