10 from JetRecConfig.JetDefinition
import JetInputConstitSeq,JetInputConstit, xAODType, JetInputType, JetDefinition, formatRvalue
11 from JetRecConfig.JetGrooming
import GroomingDefinition
12 from ..Menu.SignatureDicts
import JetRecoKeys
as recoKeys
14 from .
import TriggerJetMods
18 from AthenaCommon.Logging
import logging
19 log = logging.getLogger(__name__)
37 if p[
'trigType'] ==
'j':
46 if jetRecoDict[
'ionopt']==
'ion':
49 return jetRecoDict[
'recoAlg'] +
"_ion"
50 strtemp =
"{recoAlg}_{constitMod}{constitType}_{clusterCalib}_{jetCalib}"
52 strtemp +=
"_{trkopt}"
53 return strtemp.format(**jetRecoDict)
65 if k
in recoDict.keys():
66 if p[k] != recoDict[k]:
67 raise RuntimeError(
'Inconsistent reco setting for %s' % k)
72 if recoDict[
'jetCalib'] ==
"default":
85 from TriggerMenuMT.HLT.Menu.SignatureDicts
import JetChainParts,JetChainParts_Default
89 for part
in jet_def_string.split(
'_'):
90 if part
in JetChainParts[tmp_key]:
91 jetRecoDict[key] = part
94 jetRecoDict[key] = JetChainParts_Default[key]
97 if jetRecoDict[
'jetCalib'] ==
"default":
98 jetRecoDict[
'jetCalib'] =
getJetCalibDefaultString(jetRecoDict[
'recoAlg'],jetRecoDict[
'constitType'],jetRecoDict[
'trkopt'])
107 newJetRecoDict = copy.copy(jetRecoDict)
108 newJetRecoDict.update(dict(**kwargs))
110 return newJetRecoDict
121 if isinstance(jetDef,GroomingDefinition):
122 _jetDef = jetDef.ungroomeddef
124 if jetDef.groomSpecAsStr().startswith(
'Trimmed'):
126 elif jetDef.groomSpecAsStr().startswith(
'SoftDrop'):
129 raise ValueError(
'Unsupported grooming type for HLT')
130 elif jetDef.inputdef.jetinputtype == JetInputType.Jet:
134 algstr = f
'{str.lower(_jetDef.algorithm[0])}{formatRvalue(_jetDef._radius)}{poststr}'
135 constitdef = _jetDef.inputdef
136 if constitdef.label ==
'HI':
139 clusterCalib =
'lcw' if 'LC' in constitdef.label
else 'em'
140 constittype =
'pf' if 'PFlow' in constitdef.label
else 'tc'
142 if isinstance(constitdef,JetInputConstitSeq):
143 ignore = [
'EM',
'LC',
'CHS',
'CorrectPFO']
144 for mod
in constitdef.modifiers:
145 if mod
not in ignore:
146 constitmods += str.lower(mod)
147 constitstr = f
'{constitmods}{constittype}_{clusterCalib}'
148 jetdefstr = f
'{algstr}_{constitstr}{jetDef.suffix}'
153 jetCalib = jetDef.suffix[1:]
154 if jetCalib.endswith(
'_ftf'):
155 jetCalib = jetCalib[:-4]
168 jetalg, jetradius, jetextra = re.split(
r'(\d+)',recoAlg)
169 return jetalg,
int(jetradius), jetextra
175 return jetRecoDict[
"trkopt"]!=
"notrk" and (jetRecoDict[
"constitType"]!=
"tc" or jetRecoDict[
"recoAlg"]
in [
'a2',
'a4',
'a10'])
179 return jetRecoDict[
"trkopt"]!=
"notrk"
182 return jetRecoDict[
"trkopt"]==
"ftf"
186 isPFlow = jetRecoDict[
"constitType"] ==
"pf"
188 raise ValueError(
"This is a PFlow chain but an incompatible tracking option is given!")
193 return {
"a2":4000,
"a4":4000,
"a10":50000,
"a10r": 50000,
"a10t":50000,
"a10sd":50000}[recoAlg]
197 flags.addFlag(
"Jet.Context.notrk",
lambda prevFlags : prevFlags.Jet.Context.default )
200 def _buildContextDic(prevFlags, trkopt):
202 idFlags = prevFlags.Trigger.InDetTracking
203 (tracksname,verticesname) = {
204 'ftf': (idFlags.fullScan.tracks_FTF,
205 idFlags.fullScan.vertex),
206 'roiftf': (idFlags.jetSuper.tracks_FTF,
207 idFlags.jetSuper.vertex),
210 tvaname = f
"JetTrackVtxAssoc_{trkopt}"
211 label = f
"GhostTrack_{trkopt}"
212 ghosttracksname = f
"PseudoJet{label}"
214 contextDic = prevFlags.Jet.Context.default.clone(
216 Vertices = verticesname,
218 GhostTracks = ghosttracksname,
219 GhostTracksLabel = label ,
220 JetTracks = f
'JetSelectedTracks_{trkopt}',
225 from JetRecConfig.StandardJetConstits
import stdInputExtDic
226 if tracksname
not in stdInputExtDic:
227 from JetRecConfig.JetDefinition
import JetInputExternal
228 from xAODBase.xAODType
import xAODType
229 stdInputExtDic[tracksname] = JetInputExternal( tracksname, xAODType.TrackParticle )
230 stdInputExtDic[verticesname] = JetInputExternal( verticesname, xAODType.Vertex )
237 flags.addFlag(
"Jet.Context.ftf",
lambda prevFlags : _buildContextDic(prevFlags,
"ftf") )
238 flags.addFlag(
"Jet.Context.roiftf",
lambda prevFlags : _buildContextDic(prevFlags,
"roiftf") )
251 if recoDict[
'ionopt'] ==
'ion':
252 return "HLT_HICaloClustersFS"
253 clusterCalib = recoDict[
"clusterCalib"]
254 if clusterCalib ==
"em":
255 from ..CommonSequences.FullScanDefs
import em_clusters
257 elif clusterCalib ==
"lcw":
258 from ..CommonSequences.FullScanDefs
import lc_clusters
261 raise ValueError(
"Invalid value for calib: '{}'".
format(clusterCalib))
264 if recoAlg ==
'a4' or recoAlg ==
'a2':
265 if constitType ==
'tc':
266 return 'subresjesgscIS' if trkopt ==
'ftf' else 'subjesIS'
267 elif constitType ==
'pf':
268 return 'subresjesgscIS'
269 elif recoAlg ==
'a10':
271 elif recoAlg ==
'a10t':
273 elif recoAlg ==
'a10sd':
275 elif recoAlg ==
'a10r':
278 raise RuntimeError(f
'No default calibration is defined for {recoAlg}, {constitType}, {trkopt}')
281 'CLEANlb':
'LooseBad',
282 'CLEANllp':
'LooseBadLLP',
286 found_cleanings= [ci
for ck, ci
in cleaningDict.items()
if ck
in prefilters_list]
287 if len(found_cleanings) <= 1:
288 return 'noCleaning' if len(found_cleanings) == 0
else found_cleanings[0]
291 'Multijet jet cleanings found in jet trigger reco dictionary {}. Multiple jet cleanings are currently unsupported'.
format(found_cleanings))
303 jetalg = jetRecoDict[
"recoAlg"]
304 if jetRecoDict[
"jetCalib"] ==
"nojcalib" or jetalg==
"a10r":
308 if not dotracking
and "gsc" in jetRecoDict[
"jetCalib"]:
309 raise ValueError(
"Track GSC requested but no track source provided!")
311 if not dotracking
and "subres" in jetRecoDict[
"jetCalib"]:
312 raise ValueError(
"Pileup residual calibration requested but no track source provided!")
314 if jetRecoDict[
"constitType"] ==
"tc":
315 calibKey = flags.Trigger.Jet.emtopoCalibKey
316 calibContext,calibSeq = {
317 (
"a4",
"subjes"): (calibKey,
"JetArea_EtaJES_GSC"),
318 (
"a4",
"subjesIS"): (calibKey,
"JetArea_EtaJES_GSC"),
319 (
"a4",
"subjesgscIS"): (calibKey,
"JetArea_EtaJES_GSC"),
320 (
"a4",
"subresjesgscIS"): (calibKey,
"JetArea_Residual_EtaJES_GSC"),
321 (
"a4",
"subjesgsc"): (calibKey,
"JetArea_EtaJES_GSC"),
322 (
"a4",
"subresjesgsc"): (calibKey,
"JetArea_Residual_EtaJES_GSC"),
323 (
"a10",
"subjes"): (
"TrigUngroomed",
"JetArea_EtaJES"),
324 (
"a10t",
"jes"): (
"TrigTrimmed",
"EtaJES_JMS"),
325 }[(jetRecoDict[
"recoAlg"],jetRecoDict[
"jetCalib"])]
329 if "gsc" in jetRecoDict[
"jetCalib"]:
330 gscDepth =
"trackWIDTH"
331 pvname = flags.Trigger.InDetTracking.fullScan.vertex_jet
333 elif jetRecoDict[
"constitType"] ==
"pf":
335 if 'sd' in jetRecoDict[
"recoAlg"]:
336 calibContext = flags.Trigger.Jet.pflowLJCalibKey
337 calibSeq =
"EtaJES_JMS"
339 calibKey = flags.Trigger.Jet.pflowCalibKey
340 gscDepth =
"trackWIDTH"
341 if "gsc" not in jetRecoDict[
"jetCalib"]:
343 calibContext,calibSeq = {
344 (
"a4",
"jes"): (calibKey,
"EtaJES_GSC"),
345 (
"a4",
"subjesgsc"): (calibKey,
"JetArea_EtaJES_GSC"),
346 (
"a4",
"subresjesgsc"): (calibKey,
"JetArea_Residual_EtaJES_GSC"),
347 (
"a4",
"subjesgscIS"): (calibKey,
"JetArea_EtaJES_GSC"),
348 (
"a4",
"subresjesgscIS"): (calibKey,
"JetArea_Residual_EtaJES_GSC"),
349 }[(jetRecoDict[
"recoAlg"],jetRecoDict[
"jetCalib"])]
350 pvname = flags.Trigger.InDetTracking.fullScan.vertex_jet
351 if jetRecoDict[
"jetCalib"].endswith(
"IS")
and (
not flags.Input.isMC):
352 calibSeq +=
"_Insitu"
354 dataSource =
"mc" if flags.Input.isMC
else "data"
355 calibSpec =
":".
join( [calibContext, dataSource, calibSeq, rhoKey, pvname, gscDepth] )
358 calibMods = [
"EMScaleMom",
359 "ConstitFourMom_copy",
363 calibMods = [
"ConstitFourMom_copy",
371 return (TriggerJetMods.stdJetModifiers[modname],
str(modspec))
381 decorlist += [
'AlgorithmType',
'InputType',
382 'ActiveArea',
'ActiveArea4vec_eta',
'ActiveArea4vec_m',
383 'ActiveArea4vec_phi',
'ActiveArea4vec_pt',
384 'EMFrac',
'HECFrac',
'EnergyPerSampling',
'N90Constituents',
'constit',
'Tile0Frac']
386 if jetDef.context ==
'ftf':
387 decorlist += [
"GhostTrack_ftf",
388 "NumTrkPt500",
"NumTrkPt1000",
389 "SumPtTrkPt500",
"SumPtTrkPt1000",
391 "JVFCorr",
"JvtRpt",
"Jvt"]
392 if 'PFlow' in jetDef.basename:
393 decorlist += [
"SumPtChargedPFOPt500"]
409 if jetRecoDict[
"constitType"] ==
"pf":
410 if pfoPrefix
is None:
411 raise RuntimeError(
"JetRecoCommon: Cannot define PF jets without pfo prefix!")
413 constitMods = [
"CorrectPFO"]
415 if "vs" in jetRecoDict[
"constitMod"]:
416 constitMods.append(
"Vor")
417 if "cs" in jetRecoDict[
"constitMod"]:
418 constitMods.append(
"CS")
419 if "sk" in jetRecoDict[
"constitMod"]:
420 constitMods.append(
"SK")
421 constitMods += [
"CHS"]
423 inputPFO = pfoPrefix+
"ParticleFlowObjects"
424 modstring =
''.
join(constitMods[1:-1])
428 inputxAODType = xAODType.FlowElement
430 jetConstit = JetInputConstitSeq(
"HLT_EMPFlow", inputxAODType, constitMods, inputname=inputPFO, outputname=pfoPrefix+
"CHSParticleFlowObjects", label=
"EMPFlow", jetinputtype=
"EMPFlow")
432 jetConstit = JetInputConstitSeq(
"HLT_EMPFlow"+modstring, inputxAODType, constitMods, inputname=inputPFO, outputname=pfoPrefix+modstring+
"ParticleFlowObjects",label=
'EMPFlow'+(modstring
if modstring!=
'CHS' else ''), jetinputtype=
"EMPFlow" )
435 if jetRecoDict[
"constitType"] ==
"tc":
437 if "vs" in jetRecoDict[
"constitMod"]:
438 constitMods.append(
"Vor")
439 if "cs" in jetRecoDict[
"constitMod"]:
440 constitMods.append(
"CS")
441 if "sk" in jetRecoDict[
"constitMod"]:
442 constitMods.append(
"SK")
444 modstring =
''.
join(constitMods)
446 if jetRecoDict[
"clusterCalib"] ==
"em":
447 constitMods = [
"EM"] + constitMods
448 elif jetRecoDict[
"clusterCalib"] ==
"lcw":
449 constitMods = [
"LC"] + constitMods
451 log.error(
"cluster calib state not recognised : ",jetRecoDict[
"clusterCalib"])
453 raise ValueError(
"cluster key must be provided for topocluster jets.")
457 jetConstit = JetInputConstitSeq(
"HLT_EMTopo",xAODType.CaloCluster, constitMods, inputname=clustersKey, outputname=clustersKey+modstring,label=
'EMTopo'+modstring)
459 jetConstit = JetInputConstitSeq(
"HLT_"+constitMods[0]+
"Topo",xAODType.CaloCluster, constitMods, inputname=clustersKey, outputname=clustersKey+modstring,label=constitMods[0]+
'Topo'+modstring)
462 from JetRecConfig.StandardJetConstits
import stdConstitDic
463 stdConstitDic.setdefault(jetConstit.name, jetConstit)
470 def defineJets(flags,jetRecoDict,clustersKey=None,prefix='',suffix='',pfoPrefix=None):
480 filter_type =
"lowpt" if flags.Trigger.Jet.LowPtFilter
else "default"
482 actualradius =
float(jetradius)/10
485 suffix=
"_"+jetRecoDict[
"jetCalib"]+
'_'*(suffix.strip()!=
'')+suffix
487 suffix +=
"_"+jetRecoDict[
"trkopt"]
489 jetDef = JetDefinition(
"AntiKt", actualradius, jetConstit, ptmin=minpt[filter_type][jetradius], prefix=prefix, suffix=suffix, context=jetRecoDict[
"trkopt"])
493 rcJetConstit = JetInputConstit(
"RCJet", xAODType.Jet, smallRjets, label=inputlabel+
'RC', lock=
True)
494 rcJetDef = JetDefinition(
"AntiKt", 1.0, rcJetConstit, prefix=prefix, suffix=suffix, context=jetRecoDict[
'trkopt'])
498 from JetRecConfig.JetGrooming
import JetTrimming, JetSoftDrop
499 groomAlg = jetRecoDict[
"recoAlg"][3:]
if 'sd' in jetRecoDict[
"recoAlg"]
else jetRecoDict[
"recoAlg"][-1]
500 suffix =
"_"+ jetRecoDict[
"jetCalib"]
502 suffix +=
"_"+jetRecoDict[
"trkopt"]
505 "sd":
JetSoftDrop(ungroomedDef,ZCut=0.1,Beta=1.0,suffix=suffix,context=jetRecoDict[
'trkopt']),
506 "t" :JetTrimming(ungroomedDef,RClus=0.2,PtFrac=0.04,suffix=suffix,context=jetRecoDict[
'trkopt']),
512 jetconstit = JetInputConstit(
"PV0Track", xAODType.TrackParticle,
"PV0JetSelectedTracks_ftf")
513 VRTrackJetDef = JetDefinition(
"AntiKt", Rmax, jetconstit, ptmin=Ptmin, VRMinR=Rmin, VRMassSc=VRMassScale, prefix=prefix, suffix=suffix, lock=
True)
518 minpt = {2:7000, 3:7000, 4:7000, 6:7000, 10:50000}
520 actualradius =
float(jetradius)/10
523 jetConstit = JetInputConstitSeq(
"HLT_HIConstit",xAODType.CaloCluster, constitMods, inputname=clustersKey, outputname=clustersKey,label=
'HI')
524 from JetRecConfig.StandardJetConstits
import stdConstitDic
525 stdConstitDic.setdefault(jetConstit.name, jetConstit)
527 jetDef = JetDefinition(
"AntiKt", actualradius, jetConstit, ptmin=minpt[jetradius], prefix=prefix, suffix=suffix)