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']
in [
'ion',
'ionp']:
49 return jetRecoDict[
'recoAlg'] +
"_" + jetRecoDict[
'ionopt']
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':
137 if _jetDef.context ==
'hi': constitstr =
'ion'
138 else: constitstr =
'ionp'
140 clusterCalib =
'lcw' if 'LC' in constitdef.label
else 'em'
141 constittype =
'pf' if 'PFlow' in constitdef.label
else 'tc'
143 if isinstance(constitdef,JetInputConstitSeq):
144 ignore = [
'EM',
'LC',
'CHS',
'CorrectPFO']
145 for mod
in constitdef.modifiers:
146 if mod
not in ignore:
147 constitmods += str.lower(mod)
148 constitstr = f
'{constitmods}{constittype}_{clusterCalib}'
149 jetdefstr = f
'{algstr}_{constitstr}{jetDef.suffix}'
154 jetCalib = jetDef.suffix[1:]
155 if jetCalib.endswith(
'_ftf'):
156 jetCalib = jetCalib[:-4]
169 jetalg, jetradius, jetextra = re.split(
r'(\d+)',recoAlg)
170 return jetalg,
int(jetradius), jetextra
176 return jetRecoDict[
"trkopt"]!=
"notrk" and (jetRecoDict[
"constitType"]!=
"tc" or jetRecoDict[
"recoAlg"]
in [
'a2',
'a4',
'a10'])
180 return jetRecoDict[
"trkopt"]!=
"notrk"
183 return jetRecoDict[
"trkopt"]==
"ftf"
187 isPFlow = jetRecoDict[
"constitType"] ==
"pf"
189 raise ValueError(
"This is a PFlow chain but an incompatible tracking option is given!")
194 return {
"a2":4000,
"a4":4000,
"a10":50000,
"a10r": 50000,
"a10t":50000,
"a10sd":50000}[recoAlg]
198 flags.addFlag(
"Jet.Context.notrk",
lambda prevFlags : prevFlags.Jet.Context.default )
201 def _buildContextDic(prevFlags, trkopt):
203 idFlags = prevFlags.Trigger.InDetTracking
204 (tracksname,verticesname) = {
205 'ftf': (idFlags.fullScan.tracks_FTF,
206 idFlags.fullScan.vertex),
207 'roiftf': (idFlags.jetSuper.tracks_FTF,
208 idFlags.jetSuper.vertex),
211 tvaname = f
"JetTrackVtxAssoc_{trkopt}"
212 label = f
"GhostTrack_{trkopt}"
213 ghosttracksname = f
"PseudoJet{label}"
215 contextDic = prevFlags.Jet.Context.default.clone(
217 Vertices = verticesname,
219 GhostTracks = ghosttracksname,
220 GhostTracksLabel = label ,
221 JetTracks = f
'JetSelectedTracks_{trkopt}',
226 from JetRecConfig.StandardJetConstits
import stdInputExtDic
227 if tracksname
not in stdInputExtDic:
228 from JetRecConfig.JetDefinition
import JetInputExternal
229 from xAODBase.xAODType
import xAODType
230 stdInputExtDic[tracksname] = JetInputExternal( tracksname, xAODType.TrackParticle )
231 stdInputExtDic[verticesname] = JetInputExternal( verticesname, xAODType.Vertex )
238 flags.addFlag(
"Jet.Context.ftf",
lambda prevFlags : _buildContextDic(prevFlags,
"ftf") )
239 flags.addFlag(
"Jet.Context.roiftf",
lambda prevFlags : _buildContextDic(prevFlags,
"roiftf") )
252 if recoDict[
'ionopt']
in [
'ion',
'ionp']:
253 return "HLT_HICaloClustersFS"
254 clusterCalib = recoDict[
"clusterCalib"]
255 if clusterCalib ==
"em":
256 from ..CommonSequences.FullScanDefs
import em_clusters
258 elif clusterCalib ==
"lcw":
259 from ..CommonSequences.FullScanDefs
import lc_clusters
262 raise ValueError(
"Invalid value for calib: '{}'".
format(clusterCalib))
265 if recoAlg ==
'a4' or recoAlg ==
'a2':
266 if constitType ==
'tc':
267 return 'subresjesgscIS' if trkopt ==
'ftf' else 'subjesIS'
268 elif constitType ==
'pf':
269 return 'subresjesgscIS'
270 elif recoAlg ==
'a10':
272 elif recoAlg ==
'a10t':
274 elif recoAlg ==
'a10sd':
276 elif recoAlg ==
'a10r':
279 raise RuntimeError(f
'No default calibration is defined for {recoAlg}, {constitType}, {trkopt}')
282 'CLEANlb':
'LooseBad',
283 'CLEANllp':
'LooseBadLLP',
287 found_cleanings= [ci
for ck, ci
in cleaningDict.items()
if ck
in prefilters_list]
288 if len(found_cleanings) <= 1:
289 return 'noCleaning' if len(found_cleanings) == 0
else found_cleanings[0]
292 'Multijet jet cleanings found in jet trigger reco dictionary {}. Multiple jet cleanings are currently unsupported'.
format(found_cleanings))
304 jetalg = jetRecoDict[
"recoAlg"]
305 if jetRecoDict[
"jetCalib"] ==
"nojcalib" or jetalg==
"a10r":
309 if not dotracking
and "gsc" in jetRecoDict[
"jetCalib"]:
310 raise ValueError(
"Track GSC requested but no track source provided!")
312 if not dotracking
and "subres" in jetRecoDict[
"jetCalib"]:
313 raise ValueError(
"Pileup residual calibration requested but no track source provided!")
315 if jetRecoDict[
"constitType"] ==
"tc":
316 calibKey = flags.Trigger.Jet.emtopoCalibKey
317 calibContext,calibSeq = {
318 (
"a4",
"subjes"): (calibKey,
"JetArea_EtaJES_GSC"),
319 (
"a4",
"subjesIS"): (calibKey,
"JetArea_EtaJES_GSC"),
320 (
"a4",
"subjesgscIS"): (calibKey,
"JetArea_EtaJES_GSC"),
321 (
"a4",
"subresjesgscIS"): (calibKey,
"JetArea_Residual_EtaJES_GSC"),
322 (
"a4",
"subjesgsc"): (calibKey,
"JetArea_EtaJES_GSC"),
323 (
"a4",
"subresjesgsc"): (calibKey,
"JetArea_Residual_EtaJES_GSC"),
324 (
"a10",
"subjes"): (
"TrigUngroomed",
"JetArea_EtaJES"),
325 (
"a10t",
"jes"): (
"TrigTrimmed",
"EtaJES_JMS"),
326 }[(jetRecoDict[
"recoAlg"],jetRecoDict[
"jetCalib"])]
330 if "gsc" in jetRecoDict[
"jetCalib"]:
331 gscDepth =
"trackWIDTH"
332 pvname = flags.Trigger.InDetTracking.fullScan.vertex_jet
334 elif jetRecoDict[
"constitType"] ==
"pf":
336 if 'sd' in jetRecoDict[
"recoAlg"]:
337 calibContext = flags.Trigger.Jet.pflowLJCalibKey
338 calibSeq =
"EtaJES_JMS"
340 calibKey = flags.Trigger.Jet.pflowCalibKey
341 gscDepth =
"trackWIDTH"
342 if "gsc" not in jetRecoDict[
"jetCalib"]:
344 calibContext,calibSeq = {
345 (
"a4",
"jes"): (calibKey,
"EtaJES_GSC"),
346 (
"a4",
"subjesgsc"): (calibKey,
"JetArea_EtaJES_GSC"),
347 (
"a4",
"subresjesgsc"): (calibKey,
"JetArea_Residual_EtaJES_GSC"),
348 (
"a4",
"subjesgscIS"): (calibKey,
"JetArea_EtaJES_GSC"),
349 (
"a4",
"subresjesgscIS"): (calibKey,
"JetArea_Residual_EtaJES_GSC"),
350 }[(jetRecoDict[
"recoAlg"],jetRecoDict[
"jetCalib"])]
351 pvname = flags.Trigger.InDetTracking.fullScan.vertex_jet
352 if jetRecoDict[
"jetCalib"].endswith(
"IS")
and (
not flags.Input.isMC):
353 calibSeq +=
"_Insitu"
355 dataSource =
"mc" if flags.Input.isMC
else "data"
356 calibSpec =
":".
join( [calibContext, dataSource, calibSeq, rhoKey, pvname, gscDepth] )
359 calibMods = [
"EMScaleMom",
360 "ConstitFourMom_copy",
364 calibMods = [
"ConstitFourMom_copy",
372 return (TriggerJetMods.stdJetModifiers[modname],
str(modspec))
382 decorlist += [
'AlgorithmType',
'InputType',
383 'ActiveArea',
'ActiveArea4vec_eta',
'ActiveArea4vec_m',
384 'ActiveArea4vec_phi',
'ActiveArea4vec_pt',
385 'EMFrac',
'HECFrac',
'EnergyPerSampling',
'N90Constituents',
'constit',
'Tile0Frac']
387 if jetDef.context ==
'ftf':
388 decorlist += [
"GhostTrack_ftf",
389 "NumTrkPt500",
"NumTrkPt1000",
390 "SumPtTrkPt500",
"SumPtTrkPt1000",
392 "JVFCorr",
"JvtRpt",
"Jvt",
393 'NNJvtTrkAugV1',
'NNJvtTrkAugV1Pass',
'RPtTrkPt500',
'DTrackWidthPt1000',
'DNumTrkPt1000',
'DRPtTrkPt500',
'SumPtTrkOrderedTrackWidthPt1000',
'SumPtTrkOrderedNumTrkPt1000']
394 if 'PFlow' in jetDef.basename:
395 decorlist += [
"SumPtChargedPFOPt500"]
411 if jetRecoDict[
"constitType"] ==
"pf":
412 if pfoPrefix
is None:
413 raise RuntimeError(
"JetRecoCommon: Cannot define PF jets without pfo prefix!")
415 constitMods = [
"CorrectPFO"]
417 if "vs" in jetRecoDict[
"constitMod"]:
418 constitMods.append(
"Vor")
419 if "cs" in jetRecoDict[
"constitMod"]:
420 constitMods.append(
"CS")
421 if "sk" in jetRecoDict[
"constitMod"]:
422 constitMods.append(
"SK")
423 constitMods += [
"CHS"]
425 inputPFO = pfoPrefix+
"ParticleFlowObjects"
426 modstring =
''.
join(constitMods[1:-1])
430 inputxAODType = xAODType.FlowElement
432 jetConstit = JetInputConstitSeq(
"HLT_EMPFlow", inputxAODType, constitMods, inputname=inputPFO, outputname=pfoPrefix+
"CHSParticleFlowObjects", label=
"EMPFlow", jetinputtype=
"EMPFlow")
434 jetConstit = JetInputConstitSeq(
"HLT_EMPFlow"+modstring, inputxAODType, constitMods, inputname=inputPFO, outputname=pfoPrefix+modstring+
"ParticleFlowObjects",label=
'EMPFlow'+(modstring
if modstring!=
'CHS' else ''), jetinputtype=
"EMPFlow" )
437 if jetRecoDict[
"constitType"] ==
"tc":
439 if "vs" in jetRecoDict[
"constitMod"]:
440 constitMods.append(
"Vor")
441 if "cs" in jetRecoDict[
"constitMod"]:
442 constitMods.append(
"CS")
443 if "sk" in jetRecoDict[
"constitMod"]:
444 constitMods.append(
"SK")
446 modstring =
''.
join(constitMods)
448 if jetRecoDict[
"clusterCalib"] ==
"em":
449 constitMods = [
"EM"] + constitMods
450 elif jetRecoDict[
"clusterCalib"] ==
"lcw":
451 constitMods = [
"LC"] + constitMods
453 log.error(
"cluster calib state not recognised : %s",jetRecoDict[
"clusterCalib"])
455 raise ValueError(
"cluster key must be provided for topocluster jets.")
459 jetConstit = JetInputConstitSeq(
"HLT_EMTopo",xAODType.CaloCluster, constitMods, inputname=clustersKey, outputname=clustersKey+modstring,label=
'EMTopo'+modstring)
461 jetConstit = JetInputConstitSeq(
"HLT_"+constitMods[0]+
"Topo",xAODType.CaloCluster, constitMods, inputname=clustersKey, outputname=clustersKey+modstring,label=constitMods[0]+
'Topo'+modstring)
464 from JetRecConfig.StandardJetConstits
import stdConstitDic
465 stdConstitDic.setdefault(jetConstit.name, jetConstit)
472 def defineJets(flags,jetRecoDict,clustersKey=None,prefix='',suffix='',pfoPrefix=None):
482 filter_type =
"lowpt" if flags.Trigger.Jet.LowPtFilter
else "default"
484 actualradius =
float(jetradius)/10
487 suffix=
"_"+jetRecoDict[
"jetCalib"]+
'_'*(suffix.strip()!=
'')+suffix
489 suffix +=
"_"+jetRecoDict[
"trkopt"]
491 jetDef = JetDefinition(
"AntiKt", actualradius, jetConstit, ptmin=minpt[filter_type][jetradius], prefix=prefix, suffix=suffix, context=jetRecoDict[
"trkopt"])
495 rcJetConstit = JetInputConstit(
"RCJet", xAODType.Jet, smallRjets, label=inputlabel+
'RC', lock=
True)
496 rcJetDef = JetDefinition(
"AntiKt", 1.0, rcJetConstit, prefix=prefix, suffix=suffix, context=jetRecoDict[
'trkopt'])
500 from JetRecConfig.JetGrooming
import JetTrimming, JetSoftDrop
501 groomAlg = jetRecoDict[
"recoAlg"][3:]
if 'sd' in jetRecoDict[
"recoAlg"]
else jetRecoDict[
"recoAlg"][-1]
502 suffix =
"_"+ jetRecoDict[
"jetCalib"]
504 suffix +=
"_"+jetRecoDict[
"trkopt"]
507 "sd":
JetSoftDrop(ungroomedDef,ZCut=0.1,Beta=1.0,suffix=suffix,context=jetRecoDict[
'trkopt']),
508 "t" :JetTrimming(ungroomedDef,RClus=0.2,PtFrac=0.04,suffix=suffix,context=jetRecoDict[
'trkopt']),
514 jetconstit = JetInputConstit(
"PV0Track", xAODType.TrackParticle,
"PV0JetSelectedTracks_ftf")
515 VRTrackJetDef = JetDefinition(
"AntiKt", Rmax, jetconstit, ptmin=Ptmin, VRMinR=Rmin, VRMassSc=VRMassScale, prefix=prefix, suffix=suffix, lock=
True)
520 minpt = {2:7000, 3:7000, 4:7000, 6:7000, 10:50000}
522 actualradius =
float(jetradius)/10
523 context =
"hip" if jetRecoDict[
"ionopt"] ==
"ionp" else "hi"
526 jetConstit = JetInputConstitSeq(
"HLT_HIConstit",xAODType.CaloCluster, constitMods, inputname=clustersKey, outputname=clustersKey,label=
'HI')
527 from JetRecConfig.StandardJetConstits
import stdConstitDic
528 stdConstitDic.setdefault(jetConstit.name, jetConstit)
530 jetDef = JetDefinition(
"AntiKt", actualradius, jetConstit, ptmin=minpt[jetradius], prefix=prefix, suffix=suffix, context = context)