25 Configures trigger data decoding
27 HLTResultMTByteStreamDecoderAlg -> TriggerEDMDeserialiserAlg
30 TrigBSExtraction -> TrigDecisionMaker -> DecisionConv to xAOD -> NavigationConv to xAOD
33 as for Run 2 + Run 1 EDM to xAOD conversion
35 log.debug(
"TriggerRecoCfgData: Preparing the trigger handling of reconstruction of data")
36 acc = ComponentAccumulator()
37 acc.merge( ByteStreamReadCfg(flags) )
38 if flags.Trigger.L1.doMuon
or flags.Trigger.L1.doCalo
or flags.Trigger.L1.doTopo
or flags.Trigger.L1.doCTP:
39 acc.merge( L1TriggerByteStreamDecoderCfg(flags) )
42 acc.merge( metadataAcc )
45 if flags.Trigger.EDMVersion >= 3:
48 from TrigDecisionMaker.TrigDecisionMakerConfig
import Run3DecisionMakerCfg
49 acc.merge(Run3DecisionMakerCfg(flags))
51 if flags.Trigger.doNavigationSlimming:
52 from TrigNavSlimmingMT.TrigNavSlimmingMTConfig
import TrigNavSlimmingMTCfg
53 acc.merge(TrigNavSlimmingMTCfg(flags))
56 elif flags.Trigger.EDMVersion
in [1, 2]:
59 from TrigDecisionMaker.TrigDecisionMakerConfig
import Run1Run2DecisionMakerCfg
60 acc.merge (Run1Run2DecisionMakerCfg(flags) )
64 raise RuntimeError(
"Invalid EDMVersion=%s " % flags.Trigger.EDMVersion)
67 if flags.Trigger.enableL1CaloLegacy:
68 from AnalysisTriggerAlgs.AnalysisTriggerAlgsConfig
import RoIBResultToxAODCfg
69 xRoIBResultAcc, _ = RoIBResultToxAODCfg(flags)
70 acc.merge( xRoIBResultAcc )
72 if flags.Input.Format
is Format.BS
and flags.Input.DataYear < 2024:
73 from L1TopoByteStream.L1TopoByteStreamConfig
import L1TopoRawDataContainerBSCnvCfg
74 acc.merge( L1TopoRawDataContainerBSCnvCfg(flags) )
75 topoEDM = [
'xAOD::L1TopoRawDataContainer#L1TopoRawData',
76 'xAOD::L1TopoRawDataAuxContainer#L1TopoRawDataAux.']
77 acc.merge(addToESD(flags, topoEDM))
78 acc.merge(addToAOD(flags, topoEDM))
86 Configures trigger MC handing during reconstruction
87 Note that a lot of the T0 handling of the trigger output for data is bundled into
88 the RDO to RDO_TRIG sub-step for MC, hence there is much less to do here for MC.
89 Notably: the xAOD::TrigDecision and all metadata should already be in the RDO_TRIG.
92 Propagation of Run 3 HLT collections from input RDO_TRIG to output POOL files.
93 Execution of Run-3 reconstruction-level trigger navigation slimming.
96 Propagation of Run 2 HLT collections from input RDO_TRIG to output POOL files.
97 Execution of Run 2 style reconstruction-level trigger navigation slimming.
98 Optional conversion of Run 2 navigation to Run 3 navigation.
99 Optional execution of Run 3 reconstruction-level trigger navigation slimming on conversion output.
102 No current workflows are able to run the Run 1 trigger MC simulation. Unsupported.
103 Work would be needed here to do the xAOD conversion (see Run1xAODConversionCfg for how this is done for data)
107 if flags.Input.Format
is Format.BS:
108 log.warning(
"TriggerRecoCfgMC does not currently support MC files encoded as bytestream. Switching off handling of trigger inputs.")
109 return ComponentAccumulator()
110 if flags.Trigger.EDMVersion == 1:
111 log.warning(
"TriggerRecoCfgMC does not currently support MC files with Run 1 trigger payload. Switching off handling of trigger inputs.")
112 return ComponentAccumulator()
114 log.debug(
"TriggerRecoCfgMC: Preparing the trigger handling of reconstruction of MC")
115 acc = ComponentAccumulator()
121 from TrigNavTools.NavConverterConfig
import NavConverterCfg
122 acc.merge(NavConverterCfg(flags))
125 from TrigNavSlimmingMT.TrigNavSlimmingMTConfig
import TrigNavSlimmingMTCfg
126 acc.merge(TrigNavSlimmingMTCfg(flags))
133 """Sets up access to HLT, L1, BGRP, Monitoring, HLT PS and L1 PS JSON files from 'FILE' or 'DB', writes JSON to metaStore and keys to eventStore"""
134 acc = ComponentAccumulator()
136 if flags.Trigger.triggerConfig !=
'INFILE':
137 acc.merge( TrigConfigSvcCfg(flags) )
138 keyWriterTool = CompFactory.TrigConf.KeyWriterTool(
"KeyWriterToolOffline")
139 keyWriterOutput = str(keyWriterTool.ConfKeys)
140 acc.addEventAlgo( CompFactory.TrigConf.xAODMenuWriter(
"xAODMenuWriter", KeyWriterTool = keyWriterTool) )
141 return acc, keyWriterOutput
144 """Configures which trigger collections are recorded"""
145 acc = ComponentAccumulator()
148 if flags.Output.doWriteESD
is False and flags.Output.doWriteAOD
is False:
149 log.debug(
"TriggerEDMCfg: Nothing to do as both Output.doWriteAOD and Output.doWriteESD are False")
155 menuMetadata = [
"xAOD::TriggerMenuJsonContainer#*",
"xAOD::TriggerMenuJsonAuxContainer#*",]
156 if flags.Trigger.EDMVersion
in [1,2]:
157 menuMetadata += [
'xAOD::TriggerMenuAuxContainer#*',
'xAOD::TriggerMenuContainer#*',]
159 from TrigEDMConfig.TriggerEDM
import getLvl1ESDList, getLvl1AODList
160 acc.merge(addToESD(flags, edmDictToList(getLvl1ESDList())))
161 acc.merge(addToAOD(flags, edmDictToList(getLvl1AODList())))
163 edmVersion =
max(2, flags.Trigger.EDMVersion)
164 _TriggerESDList = getTriggerEDMList(flags, key=flags.Trigger.ESDEDMSet, runVersion=edmVersion)
165 _TriggerAODList = getTriggerEDMList(flags, key=flags.Trigger.AODEDMSet, runVersion=edmVersion)
166 log.debug(
"ESD EDM list: %s", _TriggerESDList)
167 log.debug(
"AOD EDM list: %s", _TriggerAODList)
173 not_in = [ element
for element
in _TriggerAODList
if element
not in _TriggerESDList ]
175 log.warning(
"In AOD list but not in ESD list: ")
178 log.info(
"AOD list is subset of ESD list - good.")
181 acc.merge(addToESD(flags, edmDictToList(_TriggerESDList), MetadataItemList = menuMetadata))
182 acc.merge(addToAOD(flags, edmDictToList(_TriggerAODList), MetadataItemList = menuMetadata))
184 log.info(
"AOD content set according to the AODEDMSet flag: %s and EDM version %d", flags.Trigger.AODEDMSet, flags.Trigger.EDMVersion)
186 if flags.Trigger.EDMVersion == 3
and not flags.Trigger.doOnlineNavigationCompactification
and not flags.Trigger.doNavigationSlimming:
187 nav = [
'xAOD::TrigCompositeContainer#HLTNav*',
'xAOD::TrigCompositeAuxContainer#HLTNav*',]
188 acc.merge(addToAOD(flags, nav))
189 acc.merge(addToESD(flags, nav))
191 jetSpecials = [
"JetKeyDescriptor#JetKeyMap",
"JetMomentMap#TrigJetRecMomentMap",]
192 acc.merge(addToESD(flags, jetSpecials))
193 acc.merge(addToAOD(flags, jetSpecials))
196 if flags.Output.doWriteAOD
and flags.Trigger.EDMVersion == 2:
197 from TrigRoiConversion.TrigRoiConversionConfig
import RoiWriterCfg
198 acc.merge(RoiWriterCfg(flags))
203 """Configures legacy Run1/2 navigation slimming"""
204 acc = ComponentAccumulator()
206 if flags.Trigger.decodeHLT
is False:
207 log.debug(
"Run2Run1NavigationSlimmingCfg: Nothing to do as Trigger.decodeHLT is False")
210 if flags.Trigger.doNavigationSlimming
is False:
211 log.debug(
"Run2Run1NavigationSlimmingCfg: Nothing to do as Trigger.doNavigationSlimming is False")
214 if flags.Trigger.EDMVersion >= 3:
215 log.debug(
"Run2Run1NavigationSlimmingCfg: Nothing to do for EDMVersion >= 3.")
218 if flags.Trigger.ExtraEDMList:
219 log.warning(
"Run2Run1NavigationSlimmingCfg: ExtraEDMList only works for Run 3 and beyond")
222 return list(y.split(
'-')[0]
for x
in edm.values()
for y
in x)
223 from TrigNavTools.TrigNavToolsConfig
import TrigNavigationThinningSvcCfg
225 from OutputStreamAthenaPool.OutputStreamConfig
import OutputStreamCfg
227 if flags.Output.doWriteAOD:
228 _TriggerAODList = getTriggerEDMList(flags, key=flags.Trigger.AODEDMSet)
229 thinningSvc = acc.getPrimaryAndMerge(TrigNavigationThinningSvcCfg(flags,
230 {
'name' :
'HLTNav_StreamAOD',
231 'mode' :
'cleanup_noreload',
232 'result' :
'HLTResult_HLT',
233 'features' : _flatten(_TriggerAODList)}))
234 acc.merge(OutputStreamCfg(flags,
"AOD", trigNavThinningSvc = thinningSvc))
236 if flags.Output.doWriteESD:
237 _TriggerESDList = getTriggerEDMList(flags, key=flags.Trigger.ESDEDMSet)
238 thinningSvc = acc.getPrimaryAndMerge(TrigNavigationThinningSvcCfg(flags,
239 {
'name' :
'HLTNav_StreamESD',
240 'mode' :
'cleanup_noreload',
241 'result' :
'HLTResult_HLT',
242 'features' : _flatten(_TriggerESDList)}))
243 acc.merge(OutputStreamCfg(flags,
"ESD", trigNavThinningSvc = thinningSvc))
249 """Configures Trigger data from BS extraction """
250 from SGComps.AddressRemappingConfig
import InputRenameCfg
252 acc = ComponentAccumulator()
253 extr = CompFactory.TrigBSExtraction()
257 extr.ExtraOutputs.add((
"TrigBSExtractionOutput",
"StoreGateSvc+TrigBSExtractionOutput"))
259 if flags.Trigger.decodeHLT:
261 if flags.Trigger.EDMVersion == 1
and flags.Trigger.doxAODConversion:
264 serialiserTool = CompFactory.TrigTSerializer()
265 acc.addPublicTool(serialiserTool)
266 extr.NavigationForL2 = CompFactory.HLT.Navigation(
"NavigationForL2",
267 ClassesFromPayloadIgnore = [
"TrigPassBits#passbits"])
269 extr.Navigation = CompFactory.HLT.Navigation(
"Navigation")
270 from TrigEDMConfig.TriggerEDM
import getEDMLibraries
271 extr.Navigation.Dlls = getEDMLibraries()
272 from TrigEDMConfig.TriggerEDM
import getPreregistrationList
273 extr.Navigation.ClassesToPreregister = getPreregistrationList(flags.Trigger.EDMVersion, flags.Trigger.doxAODConversion)
274 from eformat
import helper
as efh
276 if flags.Trigger.EDMVersion == 1:
277 acc.merge(InputRenameCfg(
"HLT::HLTResult",
"HLTResult_L2",
"HLTResult_L2_BS"))
278 acc.merge(InputRenameCfg(
"HLT::HLTResult",
"HLTResult_EF",
"HLTResult_EF_BS"))
279 robIDMap[
"HLTResult_L2_BS"] = efh.SourceIdentifier(efh.SubDetector.TDAQ_LVL2, 0).
code()
280 robIDMap[
"HLTResult_EF_BS"] = efh.SourceIdentifier(efh.SubDetector.TDAQ_EVENT_FILTER, 0).
code()
281 extr.L2ResultKeyIn =
"HLTResult_L2_BS"
282 extr.L2ResultKeyOut =
"HLTResult_L2"
283 extr.HLTResultKeyIn =
"HLTResult_EF_BS"
284 extr.HLTResultKeyOut =
"HLTResult_EF"
286 acc.merge(InputRenameCfg(
"HLT::HLTResult",
"HLTResult_HLT",
"HLTResult_HLT_BS"))
287 robIDMap[
"HLTResult_HLT_BS"] = efh.SourceIdentifier(efh.SubDetector.TDAQ_HLT, 0).
code()
288 extr.HLTResultKeyIn =
"HLTResult_HLT_BS"
289 extr.HLTResultKeyOut =
"HLTResult_HLT"
292 if flags.Trigger.EDMVersion == 2:
293 stream = flags.Input.TriggerStream
294 if stream.startswith(
'calibration_DataScouting_'):
295 ds_tag =
'_'.join(stream.split(
'_')[1:3])
296 ds_id = int(stream.split(
'_')[2])
297 acc.merge(InputRenameCfg(
"HLT::HLTResult", ds_tag, ds_tag+
"_BS"))
298 robIDMap[ds_tag+
"_BS"] = efh.SourceIdentifier(efh.SubDetector.TDAQ_HLT, ds_id).
code()
299 extr.DSResultKeysIn += [ ds_tag+
"_BS" ]
300 extr.DSResultKeysOut += [ ds_tag ]
303 log.info(
"Will not schedule real HLT bytestream extraction, instead EDM gap filling is running")
306 extr.HLTResultKeyIn =
""
307 extr.HLTResultKeyOut =
""
309 HLTResults = [ f
"HLT::HLTResult/{k}" for k
in robIDMap.keys() ]
310 acc.addService( CompFactory.ByteStreamAddressProviderSvc( TypeNames = HLTResults) )
312 from TrigEDMConfig.TriggerEDM
import getTPList
313 acc.addPublicTool( CompFactory.TrigSerTPTool(TPMap = getTPList((flags.Trigger.EDMVersion))) )
315 acc.addPublicTool( CompFactory.TrigSerializeConvHelper(doTP =
True) )
317 acc.addPublicTool( CompFactory.HLT.HLTResultByteStreamTool(HLTResultRobIdMap = robIDMap))
319 acc.addEventAlgo(extr)
324 """Convert Run 1 EDM collections to xAOD classes"""
325 acc = ComponentAccumulator()
327 log.info(
"Will configure Run 1 trigger EDM to xAOD conversion")
328 from TrigEDMConfig.TriggerEDM
import getEFRun1BSList,getEFRun2EquivalentList,getL2Run1BSList,getL2Run2EquivalentList
330 from TrkConfig.TrkParticleCreatorConfig
import TrackParticleCreatorToolCfg
331 partCreatorTool = acc.popToolsAndMerge(TrackParticleCreatorToolCfg(flags,
335 acc.addPublicTool(partCreatorTool)
337 from xAODTrackingCnv.xAODTrackingCnvConfig
import TrackCollectionCnvToolCfg,RecTrackParticleContainerCnvToolCfg
338 trackCollCnvTool = acc.popToolsAndMerge(TrackCollectionCnvToolCfg(flags,
339 name=
"TrackCollectionCnvTool",
340 TrackParticleCreator= partCreatorTool
344 recPartCnvTool = acc.popToolsAndMerge(RecTrackParticleContainerCnvToolCfg(flags,
345 name=
"RecParticleCnv",
346 TrackParticleCreator=partCreatorTool
350 bstoxaodTool = CompFactory.TrigBStoxAODTool(
"BStoxAOD",
351 ContainersToConvert = getL2Run1BSList() + getEFRun1BSList(),
352 NewContainers = getL2Run2EquivalentList() + getEFRun2EquivalentList(),
353 TrackCollectionCnvTool = trackCollCnvTool,
354 TrackParticleContainerCnvTool = recPartCnvTool
356 acc.setPrivateTools(bstoxaodTool)
359 acc.merge(addToESD(flags, edmDictToList(getTriggerEDMList(flags, key=flags.Trigger.ESDEDMSet, runVersion=2))))
360 acc.merge(addToAOD(flags, edmDictToList(getTriggerEDMList(flags, key=flags.Trigger.AODEDMSet, runVersion=2))))
365 """Configures conversions BS -> HLTResultMT -> Collections """
366 acc = ComponentAccumulator()
368 if flags.Trigger.decodeHLT
is False:
369 log.debug(
"Run3TriggerBSUnpackingCfg: Nothing to do as Trigger.decodeHLT is False")
372 from AthenaCommon.CFElements
import seqAND
373 from TrigEDMConfig.DataScoutingInfo
import (
374 getDataScoutingStreams, getDataScoutingTypeFromStream,
375 getFullHLTResultID, getDataScoutingResultID,
377 from TriggerJobOpts.TriggerConfig
import triggerEDMGapFillerCfg
378 from TrigDecisionTool.TrigDecisionToolConfig
import getRun3NavigationContainerFromInput
382 if flags.Input.TriggerStream
in getDataScoutingStreams():
383 dstype = getDataScoutingTypeFromStream(flags.Input.TriggerStream)
385 log.info(f
'Configuring BS decoding/deserialisation of HLT result for \'{dstype}\' only')
386 ids_to_decode = [getDataScoutingResultID(dstype)]
387 id_to_deserialise = {dstype: getDataScoutingResultID(dstype)}
390 ids_to_decode = [getFullHLTResultID()]
391 id_to_deserialise = {
'': getFullHLTResultID()}
394 log.debug(
'Configuring BS decoding of all HLT results and deserialisation of full HLT')
395 partialHLT_streams = [
396 stream
for stream
in getDataScoutingStreams()
if stream.split(
'_')[1]
in flags.Input.ProcessingTags
398 partialHLT_dstypes = [
399 getDataScoutingTypeFromStream(stream)
for stream
in partialHLT_streams
402 getDataScoutingResultID(dstype)
for dstype
in partialHLT_dstypes
404 log.debug(f
'Configuring BS decoding and deserialisation of all HLT results: full HLT + {partialHLT_dstypes}')
406 ids_to_decode += partialHLT_dsids
408 id_to_deserialise.update({
409 dstype:dsid
for dstype,dsid
in zip(partialHLT_dstypes, partialHLT_dsids)
412 decoder = CompFactory.HLTResultMTByteStreamDecoderAlg(ModuleIdsToDecode=ids_to_decode)
413 acc.addSequence(seqAND(
"HLTDecodingSeq"))
414 acc.addEventAlgo( decoder,
"HLTDecodingSeq")
415 for dstype, id
in id_to_deserialise.items():
416 deserialiser = CompFactory.TriggerEDMDeserialiserAlg(
417 f
"TrigDeserialiser{dstype}",
422 deserialiser.ExtraOutputs.add((
'xAOD::TrigCompositeContainer' ,
'StoreGateSvc+DummyForGapFiller'))
424 deserialiser.SkipDuplicateRecords =
True
425 deserialiser.PermitMissingModule =
True
426 acc.addEventAlgo( deserialiser,
"HLTDecodingSeq")
431 gapFiller = triggerEDMGapFillerCfg(
432 flags, edmSet=[
'BS'],
433 extraInputs=[(
'xAOD::TrigCompositeContainer' ,
'StoreGateSvc+DummyForGapFiller')],
435 'xAOD::TrigCompositeContainer',
436 'StoreGateSvc+'+getRun3NavigationContainerFromInput(flags)
440 gapFiller = triggerEDMGapFillerCfg(flags, edmSet=[dstype])
441 acc.merge( gapFiller,
"HLTDecodingSeq" )
443 log.debug(
"Configured HLT result BS decoding sequence")