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"
35 'n_MET_legs' : [0,1,2],
41 'n_MET_legs' : [0,1,2],
54 from TriggerMenuMT.HLT.MinBias.AFPMenuSequence
import TrigAFPDijetComboHypoToolCfg
55 from TriggerMenuMT.HLT.Muon.MuonChainConfiguration
import TrigMuonEFIdtpInvMassHypoToolCfg
56 from TriggerMenuMT.HLT.AnomalyDetection.AnomalyDetectionChainConfiguration
import TrigADComboHypoToolCfg
59 from AthenaMonitoringKernel.GenericMonitoringTool
import GenericMonitoringTool
61 chainName = chainDict[
'chainName']
62 log.debug(
"[TrigComboHypoToolFromDict] chain %s, combo hypos to be processed: %s, t", chainName, chainDict[
'extraComboHypos'])
70 theregex = fr
"(\d*)({'|'.join(allowed_obs.keys())})([{topoLegIndices}])([{topoLegIndices}])(\d*)"
71 matcher = re.compile(theregex)
73 for iTopo, topoInfo
in enumerate(chainDict[
'extraComboHypos']):
74 log.debug(
"[TrigComboHypoToolFromDict] new combo hypo for chain: %s, topoInfo = %s", chainName, topoInfo)
76 result = matcher.match(topoInfo)
78 log.error(
"[TrigComboHypoToolFromDict] Topo expression %s does not conform to format (min?)(var)(legA)(legB)(max?).",topoInfo)
79 log.error(
"[TrigComboHypoToolFromDict] Must use leg IDs in %s, vars in {allowed_obs.keys()}",topoLegIndices)
80 raise ValueError(f
"[TrigComboHypoToolFromDict] Invalid topo expression {topoInfo} received in 'extraComboHypos'!")
83 str_min, var, char_legA, char_legB, str_max = result.groups()
86 use_min =
bool(str_min)
87 use_max =
bool(str_max)
88 if not (use_min
or use_max):
89 log.error(
"[TrigComboHypoToolFromDict] Topo expression %s does not specify a min or max cut value.",topoInfo)
90 raise ValueError(f
"[TrigComboHypoToolFromDict] Invalid topo expression {topoInfo} received in 'extraComboHypos'!")
92 if var
in [
'dR',
'dphi',
'deta']:
93 cut_min =
float(str_min)/10.
if use_min
else float(
'nan')
94 cut_max =
float(str_max)/10.
if use_max
else float(
'nan')
96 cut_min =
float(str_min)
if use_min
else float(
'nan')
97 cut_max =
float(str_max)
if use_max
else float(
'nan')
100 i_legA = topoLegIndices.find(char_legA)
101 i_legB = topoLegIndices.find(char_legB)
106 for ileg
in [i_legA,i_legB]:
107 cpart = chainDict[
'chainParts'][ileg]
108 legname = f
"leg{ileg:03d}_{chainName}"
113 'isMET' : cpart[
'signature']==
'MET',
114 'multiplicity':
int(cpart[
'multiplicity'])
118 n_MET_legs = legInfo[0][
'isMET'] + legInfo[1][
'isMET']
125 if legInfo[0][
'multiplicity'] != 2:
126 log.error(
"[TrigComboHypoToolFromDict] Error configuring topo for chain %s!",chainName)
127 log.error(
"[TrigComboHypoToolFromDict] Topo selection %s requires multiplicity 2 on leg %d, found %d!",topoInfo,i_legA,legInfo[0][
'multiplicity'])
128 raise Exception(
"[TrigComboHypoToolFromDict] Invalid multiplicity")
130 log.error(
"[TrigComboHypoToolFromDict] Configured with the same MET leg on both sides -- impossible to satisfy!")
131 raise Exception(
"[TrigComboHypoToolFromDict] Identical MET legs for topo selection")
132 if len(chainDict[
'chainParts'])==1:
136 if li[
'multiplicity'] != 1:
137 log.error(
"[TrigComboHypoToolFromDict] Error configuring topo for chain %s!",chainName)
138 log.error(
"[TrigComboHypoToolFromDict] Topo selection %s requires multiplicity 1 on leg %d, found %d!",topoInfo,li[
'index'],li[
'multiplicity'])
139 raise Exception(
"[TrigComboHypoToolFromDict] Invalid multiplicity")
142 if n_MET_legs
not in allowed_obs[var][
'n_MET_legs']:
143 log.error(
"[TrigComboHypoToolFromDict] Attempting var %s with %d MET legs, %s allowed", var, n_MET_legs, allowed_obs[var][
'n_MET_legs'])
144 raise Exception(
"[TrigComboHypoToolFromDict] Attempting to use the MET leg in var")
146 if len(chainDict[
'extraComboHypos'])==1:
147 monToolName =
"MonTool_"+chainName
149 monToolName = f
"MonTool_{chainName}_{chainDict['extraComboHypos'][iTopo]}"
152 monTool.defineHistogram(histNameTag+
'OfAccepted', type=
'TH1F', path=
'EXPERT',
153 title=var+
" in accepted combinations; {}".
format(var),
154 xbins=allowed_obs[var][
'hist_nbins'],
155 xmin=allowed_obs[var][
'hist_min'],
156 xmax=allowed_obs[var][
'hist_max'])
157 monTool.defineHistogram(histNameTag+
'OfProcessed', type=
'TH1F', path=
'EXPERT',
158 title=var+
" in processed combinations; {}".
format(var),
159 xbins=allowed_obs[var][
'hist_nbins'],
160 xmin=allowed_obs[var][
'hist_min'],
161 xmax=allowed_obs[var][
'hist_max'])
162 log.debug(
"[TrigComboHypoToolFromDict] tool configured for hypo name: %s, topoInfo = %s", chainName, topoInfo)
163 log.debug(
"[TrigComboHypoToolFromDict] histName = %s", histNameTag)
165 if len(chainDict[
'extraComboHypos'])==1:
166 monTool.HistPath = f
'ComboHypo/{chainName}'
168 subDirNameTag = f
"{var}leg{i_legA:03d}leg{i_legB:03d}"
169 monTool.HistPath = f
'ComboHypo/{chainName}/detail_{subDirNameTag}'
174 "UseMinVec" : use_min,
175 "UseMaxVec" : use_max,
176 "LowerCutVec" : cut_min,
177 "UpperCutVec" : cut_max,
178 "LegAVec" : legInfo[0][
"HLTId"],
179 "LegBVec" : legInfo[1][
"HLTId"],
180 "IsLegA_METVec": legInfo[0][
"isMET"],
181 "IsLegB_METVec": legInfo[1][
"isMET"],
182 "MonTools" : monTool,
184 topoDefs.append(singleTopoDef)
187 log.debug(
"[TrigComboHypoToolFromDict] tool configured for hypo name: %s, topoInfo = %s", chainName, topoInfo)
188 log.debug(
"[TrigComboHypoToolFromDict] var = %s", singleTopoDef[
'Variables'])
189 log.debug(
"[TrigComboHypoToolFromDict] legA = %s", singleTopoDef[
'LegAVec'])
190 log.debug(
"[TrigComboHypoToolFromDict] legB = %s", singleTopoDef[
'LegBVec'])
192 log.debug(
"[TrigComboHypoToolFromDict] min = %10.3f", singleTopoDef[
'LowerCutVec'])
194 log.debug(
"[TrigComboHypoToolFromDict] max = %10.3f", singleTopoDef[
'UpperCutVec'])
199 toolProps = {k:[thedef[k]
for thedef
in topoDefs]
for k
in topoDefs[0]}
200 tool = CompFactory.TrigComboHypoTool(chainName, SkipLegCheck=skipLegCheck, **toolProps)
204 comboConfigurator = {
205 'dR':TrigComboHypoToolFromDict,
206 'dphi':TrigComboHypoToolFromDict,
207 'deta':TrigComboHypoToolFromDict,
208 'invm':TrigComboHypoToolFromDict,
209 'mT':TrigComboHypoToolFromDict,
210 'afpdijet':TrigAFPDijetComboHypoToolCfg,
211 'anomdet':TrigADComboHypoToolCfg,
212 'idZmumu':TrigMuonEFIdtpInvMassHypoToolCfg,
213 'idJpsimumu':TrigMuonEFIdtpInvMassHypoToolCfg,
216 def addTopoInfo(theChainConfig, mainChainDict, listOfChainDefs, lengthOfChainConfigs):
217 log.debug(
"[addTopoInfo] Adding topo info to chain %s", theChainConfig)
219 def findStepIndexInChain(chain, step):
220 for istep,chainstep
in enumerate(chain.steps):
221 if chainstep.name==step:
225 for step,(topoCfg,topoExpr)
in theChainConfig.topoMap.items():
226 thestep = theChainConfig.steps[-1]
if step==
"last" else theChainConfig.steps[findStepIndexInChain(theChainConfig,step)]
227 log.debug(
"[addTopoInfo] Adding %s to step %s",topoExpr,thestep)
230 log.error(
"Failed to find step %s in Chain! ChainDict follows:", step)
231 log.error(mainChainDict)
232 raise RuntimeError(
"Step not found when adding topo to chain")
237 log.debug(
"[addTopoInfo] theChainConfig %s", theChainConfig)
238 log.debug(
"[addTopoInfo] listOfChainDefs %s", listOfChainDefs)
239 log.debug(
"[addTopoInfo] theTopoInfo being added is %s",topoExpr)
243 if topoCfg
not in thestep.comboToolConfs:
244 if len(thestep.comboToolConfs) > 0:
245 log.warning(
"[addTopoInfo] step %s already has ComboHypo tools %s",thestep,thestep.comboToolConfs)
246 log.warning(
"[addTopoInfo] these will be added to, make sure this is the behaviour you want.")
248 thestep.name = thestep.name+
'_combo_'+topoExpr
249 thestep.addComboHypoTools(topoCfg)
253 log.debug(
"[addTopoInfo] new theChainConfig %s", theChainConfig)