173 Configures an algorithm(s) that should be run after the selection process
174 Returns: ca, algorithm
176 acc = ComponentAccumulator()
177 from TrigOutputHandling.TrigOutputHandlingConfig
import DecisionSummaryMakerAlgCfg
178 decisionSummaryAlg = DecisionSummaryMakerAlgCfg(flags)
179 chainToLastCollection = {}
183 for stepName, stepHypos
in sorted( hypos.items(), key=
lambda x :
__stepNumber(x[0]) ):
190 orderedStepHypos = sorted(stepHypos, key=
lambda hypo:
not __isCombo(hypo))
192 chainToCollectionInStep = {}
193 for hypo
in orderedStepHypos:
195 for chain
in hypoChains:
196 if chain
not in chainToCollectionInStep:
197 chainToCollectionInStep[chain] = hypoOutputKeys
198 chainToLastCollection.update( chainToCollectionInStep )
200 from TriggerMenuMT.HLT.Config.Utility.HLTMenuConfig
import HLTMenuConfig
201 from HLTSeeding.HLTSeedingConfig
import mapThresholdToL1DecisionCollection
202 if len(HLTMenuConfig.dicts()) == 0:
203 __log.warning(
"No HLT menu, chains w/o algorithms are not handled")
205 for chainName, chainDict
in HLTMenuConfig.dicts().items():
206 if chainName
not in chainToLastCollection:
207 __log.debug(
"The chain %s is not mentioned in any step", chainName)
209 assert len(chainDict[
'chainParts']) == 1,
"Chains w/o the steps can not have multiple parts in chainDict, it makes no sense: %s"%chainName
210 chainToLastCollection[chainName] = [ mapThresholdToL1DecisionCollection( chainDict[
'chainParts'][0][
'L1threshold'] ) ]
212 for c, cont
in chainToLastCollection.items():
213 __log.debug(
"Final decision of chain %s will be read from %d %s", c, len(cont), str(cont))
215 collectionsWithFinalDecisions = []
216 for chain, collections
in chainToLastCollection.items():
217 for c
in collections:
218 if c
not in collectionsWithFinalDecisions:
219 collectionsWithFinalDecisions.append(c)
220 __log.debug(
"Final keys %s", collectionsWithFinalDecisions)
221 decisionSummaryAlg.FinalDecisionKeys = collectionsWithFinalDecisions
222 decisionSummaryAlg.FinalStepDecisions = dict(chainToLastCollection)
223 decisionSummaryAlg.DecisionsSummaryKey =
"HLTNav_Summary"
224 decisionSummaryAlg.SetFilterStatus = flags.Trigger.writeBS
225 return acc, decisionSummaryAlg
230 Configures components needed for monitoring chains
232 acc = ComponentAccumulator()
233 TrigSignatureMoni, DecisionCollectorTool=CompFactory.getComps(
"TrigSignatureMoni",
"DecisionCollectorTool",)
235 mon.L1Decisions =
"HLTSeedingSummary"
236 mon.FinalDecisionKey =
"HLTNav_Summary"
238 __log.warning(
"Menu is not configured")
244 for stepName, stepHypos
in sorted( hypos.items(), key=
lambda x :
__stepNumber(x[0])):
245 assert __stepNumber(stepName) == stepCounter,
"There are steps that have no hypos, decisions counting is not going to work"
247 stepDecisionKeys = []
248 stepFeatureDecisionKeys = []
249 for hypo
in stepHypos:
252 stepDecisionKeys.extend( hypoOutputKeys )
254 stepFeatureDecisionKeys.extend( hypoOutputKeys )
256 dcEventTool =
DecisionCollectorTool(
"EventDecisionCollector" + stepName, Decisions=list(dict.fromkeys(stepDecisionKeys)))
257 dcFeatureTool =
DecisionCollectorTool(
"FeatureDecisionCollector" + stepName, Decisions=list(dict.fromkeys(stepFeatureDecisionKeys)))
258 __log.debug(
"The step monitoring decisions in %s %s", dcEventTool.getName(), dcEventTool.Decisions)
259 __log.debug(
"The step monitoring decisions in %s %s", dcFeatureTool.getName(), dcFeatureTool.Decisions)
260 mon.DecisionCollectorTools += [ dcEventTool ]
261 mon.FeatureCollectorTools += [ dcFeatureTool ]
264 if flags.Trigger.Online.isPartition:
265 from TrigServices.TrigServicesConfig
import TrigServicesCfg
266 onlineServicesAcc = TrigServicesCfg(flags)
267 hltEventLoopMgr = onlineServicesAcc.getPrimary()
269 hltEventLoopMgr.TrigErrorMonTool.AlgToChainTool = CompFactory.TrigCompositeUtils.AlgToChainTool()
270 hltEventLoopMgr.TrigErrorMonTool.MonTool.defineHistogram(
271 'ErrorChainName,ErrorCode', path=
'EXPERT', type=
'TH2I',
272 title=
'Error StatusCodes per chain;Chain name;StatusCode',
273 xbins=1, xmin=0, xmax=1, ybins=1, ymin=0, ymax=1)
275 acc.merge(onlineServicesAcc)
277 mon.L1Decisions = hltSeeding.HLTSeedingSummaryKey
279 if flags.Trigger.doValidationMonitoring:
280 from DecisionHandling.DecisionHandlingConfig
import setupFilterMonitoring
281 for algs
in filters.values():
283 setupFilterMonitoring( flags, alg )
343 Returns CA with algorithms and/or tools required to do the serialisation
345 decObj - list of all navigation objects
346 decObjHypoOut - list of decisions produced by hypos
347 hypos - the {stepName: hypoList} dictionary with all hypo algorithms - used to find the PEB decision keys
348 offline - if true CA contains algorithms that need to be merged to output stream sequence,
349 if false the CA contains a tool that needs to be added to HltEventLoopMgr
351 from TrigEDMConfig
import DataScoutingInfo
352 from TrigEDMConfig.TriggerEDM
import getRun3BSList
353 from TrigEDMConfig.TriggerEDMDefs
import allowTruncation
354 from TrigOutputHandling.TrigOutputHandlingConfig
import TriggerEDMSerialiserToolCfg, StreamTagMakerToolCfg, TriggerBitsMakerToolCfg
357 collectionsToBS = getRun3BSList(flags, [
"BS"] + DataScoutingInfo.getAllDataScoutingIdentifiers())
360 serialiser = TriggerEDMSerialiserToolCfg(flags)
362 for typekey, bsfragments, props
in collectionsToBS:
364 moduleIDs = sorted(DataScoutingInfo.getFullHLTResultID()
if f ==
'BS' else
365 DataScoutingInfo.getDataScoutingResultID(f)
366 for f
in bsfragments)
368 __log.debug(
'adding to serialiser list: %s, modules: %s', typekey, moduleIDs)
369 serialiser.addCollection(typekey, moduleIDs, allowTruncation = allowTruncation
in props)
372 stmaker = StreamTagMakerToolCfg()
373 bitsmaker = TriggerBitsMakerToolCfg()
377 for hypoList
in hypos.values():
378 for hypo
in hypoList:
379 if hypo.getFullJobOptName().startswith(
'PEBInfoWriterAlg/'):
380 PEBKeys.append(str(hypo.HypoOutputDecisions))
382 PEBKeys = sorted(
set(PEBKeys))
383 __log.debug(
'Setting StreamTagMakerTool.PEBDecisionKeys = %s', PEBKeys)
384 stmaker.PEBDecisionKeys = PEBKeys
386 acc = ComponentAccumulator()
390 from TrigOutputHandling.TrigOutputHandlingConfig
import HLTResultMTMakerCfg
391 HLTResultMTMakerAlg=CompFactory.HLTResultMTMakerAlg
392 hltResultMakerTool = HLTResultMTMakerCfg(flags)
393 hltResultMakerTool.StreamTagMaker = stmaker
394 hltResultMakerTool.MakerTools = [bitsmaker, serialiser]
396 hltResultMakerAlg.ResultMaker = hltResultMakerTool
399 if flags.Input.Format
is Format.BS:
400 from TriggerJobOpts.TriggerByteStreamConfig
import ByteStreamReadCfg
401 readBSAcc = ByteStreamReadCfg(flags)
402 readBSAcc.getEventAlgo(
'SGInputLoader').Load.add(
403 (
'ByteStreamMetadataContainer',
'InputMetaDataStore+ByteStreamMetadata'))
407 hltResultMakerAlg.ResultMaker.ExtraROBs = []
408 hltResultMakerAlg.ResultMaker.ExtraSubDets = []
411 decmaker = CompFactory.getComp(
"TrigDec::TrigDecisionMakerMT")(
"TrigDecMakerMT")
415 from TrigConfigSvc.TrigConfigSvcCfg
import L1PrescaleCondAlgCfg
416 acc.merge(L1PrescaleCondAlgCfg(flags))
419 from TriggerJobOpts.TriggerByteStreamConfig
import ByteStreamWriteCfg
420 writingOutputs = [
"HLT::HLTResultMT#HLTResultMT"]
421 writingInputs = [(
"HLT::HLTResultMT",
"HLTResultMT"),
422 (
"xAOD::TrigDecision",
"xTrigDecision")]
425 if flags.Trigger.doLVL1:
426 if flags.Trigger.enableL1MuonPhase1
or flags.Trigger.enableL1CaloPhase1:
427 writingOutputs += [
'xAOD::TrigCompositeContainer#L1TriggerResult']
428 writingInputs += [(
'xAOD::TrigCompositeContainer',
'StoreGateSvc+L1TriggerResult')]
429 if flags.Trigger.enableL1CaloLegacy
or not flags.Trigger.enableL1MuonPhase1:
430 writingOutputs += [
'ROIB::RoIBResult#RoIBResult']
431 writingInputs += [(
'ROIB::RoIBResult',
'StoreGateSvc+RoIBResult')]
432 if flags.Trigger.CTP.UseEDMxAOD:
433 writingOutputs += [
'xAOD::CTPResult#CTPResult']
434 writingInputs += [(
'xAOD::CTPResult',
'StoreGateSvc+CTPResult')]
436 from TrigT1ResultByteStream.TrigT1ResultByteStreamConfig
import L1TriggerByteStreamEncoderCfg
437 acc.merge(L1TriggerByteStreamEncoderCfg(flags))
439 writingAcc = ByteStreamWriteCfg(flags, type_names=writingOutputs, extra_inputs=writingInputs)
440 writingAcc.addEventAlgo(hltResultMakerAlg)
441 writingAcc.addEventAlgo(decmaker)
442 acc.merge(writingAcc)
445 from TrigServices.TrigServicesConfig
import TrigServicesCfg
446 onlineServicesAcc = TrigServicesCfg(flags)
447 hltEventLoopMgr = onlineServicesAcc.getPrimary()
448 hltEventLoopMgr.ResultMaker.StreamTagMaker = stmaker
449 hltEventLoopMgr.ResultMaker.MakerTools = [serialiser, bitsmaker]
450 onlineServicesAcc.getEventAlgo(
'SGInputLoader').Load.add(
451 (
'ByteStreamMetadataContainer',
'InputMetaDataStore+ByteStreamMetadata'))
452 acc.merge(onlineServicesAcc)
458 acc = ComponentAccumulator()
460 from TrigEDMConfig.TriggerEDM
import getTriggerEDMList
463 bitsmaker = CompFactory.TriggerBitsMakerTool()
464 decmaker = CompFactory.TrigDec.TrigDecisionMakerMT(
"TrigDecMakerMT", BitsMakerTool = bitsmaker, UseEDMxAOD=flags.Trigger.CTP.UseEDMxAOD)
465 acc.addEventAlgo( decmaker )
468 from .TriggerRecoConfig
import TriggerMetadataWriterCfg
469 metadataAcc, metadataOutputs = TriggerMetadataWriterCfg(flags)
470 acc.merge( metadataAcc )
473 from AnalysisTriggerAlgs.AnalysisTriggerAlgsConfig
import RoIBResultToxAODCfg
474 xRoIBResultAcc, xRoIBResultOutputs = RoIBResultToxAODCfg(flags)
475 acc.merge(xRoIBResultAcc)
480 for doit, outputType, edmSet
in [( flags.Output.doWriteRDO,
'RDO', flags.Trigger.ESDEDMSet),
481 ( flags.Output.doWriteESD,
'ESD', flags.Trigger.ESDEDMSet),
482 ( flags.Output.doWriteAOD,
'AOD', flags.Trigger.AODEDMSet)]:
483 if not doit:
continue
485 edmList = getTriggerEDMList(flags, key=edmSet)
489 for edmType, edmKeys
in edmList.items():
490 itemsToRecord.extend([edmType+
'#'+collKey
for collKey
in edmKeys])
493 itemsToRecord.append(
'xAOD::EventInfo#EventInfo')
494 itemsToRecord.append(
'xAOD::EventAuxInfo#EventInfoAux.')
497 from OutputStreamAthenaPool.OutputStreamConfig
import OutputStreamCfg, outputStreamName
498 acc.merge(OutputStreamCfg(flags, outputType, ItemList=itemsToRecord,
499 disableEventTag=
True, takeItemsFromInput=(outputType ==
'RDO')))
500 from xAODMetaDataCnv.InfileMetaDataConfig
import SetupMetaDataForStreamCfg
501 acc.merge(SetupMetaDataForStreamCfg(flags, outputType,
502 createMetadata=[MetadataCategory.TriggerMenuMetaData]))
504 alg = acc.getEventAlgo(outputStreamName(outputType))
507 (
"xAOD::TrigDecision", str(decmaker.TrigDecisionKey)),
508 (
"xAOD::TrigConfKeys", metadataOutputs)} |
set(xRoIBResultOutputs)
514 """Configure the view merging algorithm"""
516 from TrigEDMConfig.TriggerEDMDefs
import InViews
517 from TrigEDMConfig.TriggerEDM
import getRawTriggerEDMList
519 acc = ComponentAccumulator()
520 mergingTool = CompFactory.HLTEDMCreator(
"ViewsMergingTool")
521 alg = CompFactory.HLTEDMCreatorAlg(
"EDMCreatorAlg",
522 OutputTools = [mergingTool])
525 needMerging = [x
for x
in getRawTriggerEDMList(flags)
if len(x) >= 4
and
526 any(isinstance(v, InViews)
for v
in x[3])]
527 __log.info(
"These collections need merging: %s",
" ".join([ c[0]
for c
in needMerging ]))
529 for coll
in needMerging:
530 collType, collName = coll[0].
split(
"#")
531 collType = collType.split(
":")[-1]
532 possibleViews = [ str(v)
for v
in coll[3]
if isinstance(v, InViews) ]
533 for viewsColl
in possibleViews:
534 attrView = getattr(mergingTool, collType+
"Views", [])
535 attrInView = getattr(mergingTool, collType+
"InViews", [])
536 attrName = getattr(mergingTool, collType, [])
537 attrView.append( viewsColl )
538 attrInView.append( collName )
539 attrName.append( collName )
541 setattr(mergingTool, collType+
"Views", attrView )
542 setattr(mergingTool, collType+
"InViews", attrInView )
543 setattr(mergingTool, collType, attrName )
544 producer = [ maker
for maker
in viewMakers
if maker.Views == viewsColl ]
545 if len(producer) == 0:
546 __log.warning(
"The producer of %s for %s not in the menu, its outputs won't ever make it out of the HLT", viewsColl, coll)
548 if len(producer) > 1:
549 for pr
in producer[1:]:
550 if pr != producer[0]:
551 __log.error(
"Several View making algorithms produce the same output collection %s: %s", viewsColl,
' '.join([p.getName()
for p
in producer ]))
554 acc.addEventAlgo(alg)
649def triggerRunCfg( flags, menu=None ):
651 top of the trigger config (for real triggering online or on MC)
654 acc = ComponentAccumulator()
656 # L1ConfigSvc needed for HLTSeeding
657 from TrigConfigSvc.TrigConfigSvcCfg import L1ConfigSvcCfg
659 acc.merge( L1ConfigSvcCfg(flags) )
661 acc.addSequence( seqOR( "HLTTop") )
663 # HLTPreSeq only used for CostMon so far, skip if CostMon disabled
664 if flags.Trigger.CostMonitoring.doCostMonitoring:
665 acc.addSequence( parOR("HLTPreSeq"), parentName="HLTTop" )
667 from TrigCostMonitor.TrigCostMonitorConfig import TrigCostMonitorCfg
668 acc.merge( TrigCostMonitorCfg( flags ), sequenceName="HLTPreSeq" )
671 acc.addSequence( parOR("HLTBeginSeq"), parentName="HLTTop" )
672 # bit of a hack as for "legacy" type JO a seq name for cache creators has to be given,
673 # in newJO realm the seqName will be removed as a comp fragment shoudl be unaware of where it will be attached
675 if flags.Trigger.doCFEmulationTest:
676 from TriggerMenuMT.CFtest.EmuStepProcessingConfig import emulateHLTSeedingCfg
677 hltSeedingAcc = emulateHLTSeedingCfg(flags)
679 acc.merge( triggerIDCCacheCreatorsCfg( flags, seqName="AthAlgSeq" ), sequenceName="HLTBeginSeq" )
681 if flags.Trigger.doRuntimeNaviVal: # Validate we can parse the menu with the standalone chain parser
682 acc.addEventAlgo( CompFactory.TrigChainNameParserChecker(), sequenceName="HLTBeginSeq" )
684 from HLTSeeding.HLTSeedingConfig import HLTSeedingCfg
685 hltSeedingAcc = HLTSeedingCfg( flags )
687 from AthenaConfiguration.Enums import LHCPeriod
688 if flags.GeoModel.Run > LHCPeriod.Run3:
689 from InDetConfig.TrackRecoConfig import SiDetectorElementStatusCfg
690 acc.merge(SiDetectorElementStatusCfg( flags), sequenceName="HLTBeginSeq")
692 # TODO, once moved to newJO the algorithm can be added to hltSeedingAcc and merging will be sufficient here
693 acc.merge( hltSeedingAcc, sequenceName="HLTBeginSeq" )
695 # detour to the menu here, (missing now, instead a temporary hack)
697 menuAcc = menu( flags )
698 HLTSteps = menuAcc.getSequence( "HLTAllSteps" )
699 __log.info( "Configured menu with %d steps", len(HLTSteps.Members))
700 acc.merge( menuAcc, sequenceName="HLTTop")
702 # collect hypothesis algorithms from all sequence
703 hypos = collectHypos( HLTSteps )
704 filters = collectFilters( HLTSteps )
705 acc.addSequence( parOR("HLTEndSeq"), parentName="HLTTop" )
706 acc.addSequence( seqAND("HLTFinalizeSeq"), parentName="HLTEndSeq" )
708 nfilters = sum(len(v) for v in filters.values())
709 nhypos = sum(len(v) for v in hypos.values())
710 __log.info( "Algorithms counting: Number of Filter algorithms: %d - Number of Hypo algoirthms: %d", nfilters , nhypos)
712 summaryAcc, summaryAlg = triggerSummaryCfg( flags, hypos )
713 acc.merge( summaryAcc, sequenceName="HLTFinalizeSeq" )
714 if flags.Trigger.doCFEmulationTest:
715 summaryAlg.Prescaler=CompFactory.PrescalingEmulationTool()
716 acc.addEventAlgo( summaryAlg, sequenceName="HLTFinalizeSeq" )
717 acc.merge( triggerEndOfEventCfg(flags), sequenceName="HLTFinalizeSeq" )
719 #once menu is included we should configure monitoring here as below
720 hltSeedingAlg = hltSeedingAcc.getEventAlgo("HLTSeeding")
722 monitoringAcc, monitoringAlg = triggerMonitoringCfg( flags, hypos, filters, hltSeedingAlg )
723 acc.merge( monitoringAcc, sequenceName="HLTEndSeq" )
724 acc.addEventAlgo( monitoringAlg, sequenceName="HLTEndSeq" )
726 decObj, decObjHypoOut = collectDecisionObjects( hypos, filters, hltSeedingAlg, summaryAlg )
729 # configure components need to normalise output before writing out
730 viewMakers = collectViewMakers( HLTSteps )
732 # Add HLT Navigation to EDM list
733 # TODO: DO NOT directly modify TriggerHLTListRun3
734 from TrigEDMConfig.TriggerEDMRun3 import TriggerHLTListRun3, addHLTNavigationToEDMList
735 __log.info( "Number of EDM items before adding navigation: %d", len(TriggerHLTListRun3))
736 addHLTNavigationToEDMList(flags, TriggerHLTListRun3, decObj, decObjHypoOut)
737 __log.info( "Number of EDM items after adding navigation: %d", len(TriggerHLTListRun3))
739 # Add Extra to EDM list
740 # TODO: DO NOT directly modify TriggerHLTListRun3
741 if flags.Trigger.ExtraEDMList:
742 from TrigEDMConfig.TriggerEDM import _addExtraCollectionsToEDMList
743 __log.info( "Adding extra collections to EDM: %s", str(flags.Trigger.ExtraEDMList))
744 _addExtraCollectionsToEDMList(TriggerHLTListRun3, flags.Trigger.ExtraEDMList)
746 # Configure output writing
747 outputAcc, edmSet = triggerOutputCfg( flags, hypos )
748 acc.merge( outputAcc, sequenceName="HLTTop" )
750 # Cost monitoring should be finished between acceptedEventTopSeq and EDMCreator
751 from TrigCostMonitor.TrigCostMonitorConfig import TrigCostMonitorFinalizeCfg
752 costFinalizeAlg = TrigCostMonitorFinalizeCfg(flags)
753 if costFinalizeAlg: # None if Cost Monitoring is turned off
754 acc.addEventAlgo(costFinalizeAlg, sequenceName="HLTFinalizeSeq" )
757 # The order is important: 1) view merging, 2) gap filling
758 acc.merge( triggerMergeViewsCfg(flags, viewMakers), sequenceName="HLTFinalizeSeq" )
759 # For BS output, the EDM gap-filling is done in Reco. Online we only ensure a
760 # consistent set of decision objects (TrigCompositeContainer):
761 acc.merge( triggerEDMGapFillerCfg(flags, [edmSet] if edmSet!='BS' else [],
762 decObj, decObjHypoOut), sequenceName="HLTFinalizeSeq" )
764 if flags.Trigger.doOnlineNavigationCompactification:
765 from TrigNavSlimmingMT.TrigNavSlimmingMTConfig import getTrigNavSlimmingMTOnlineConfig
766 onlineSlimAlg = getTrigNavSlimmingMTOnlineConfig(flags)
767 acc.addEventAlgo( onlineSlimAlg, sequenceName="HLTFinalizeSeq" )
769 # Cleanup menu config to allow garbage collection (ATR-28855)
770 from TriggerMenuMT.HLT.Config.Utility.HLTMenuConfig import HLTMenuConfig
771 HLTMenuConfig.destroy()
801def triggerEndOfEventCfg(flags):
802 from TriggerMenuMT.HLT.Config.Utility.HLTMenuConfig import HLTMenuConfig
804 acceptedEventChainDicts = [cd for cd in HLTMenuConfig.dictsList() \
805 if 'Calib' in cd['signatures'] \
806 and 'acceptedevts' in cd['chainParts'][0]['purpose']]
808 acc = ComponentAccumulator()
810 # If no relevant chains or just not desired, can shortcut and return empty CA
811 if not (flags.Trigger.enableEndOfEventProcessing and acceptedEventChainDicts):
814 # Add end-of-event sequences executed conditionally on the DecisionSummaryMakerAlg filter status
815 endOfEventRoIMaker = CompFactory.EndOfEventROIConfirmerAlg('EndOfEventROIConfirmerAlg')
816 acc.addEventAlgo( endOfEventRoIMaker )
817 acc.addSequence( parOR("acceptedEventTopSeq") )
818 acc.getSequence("acceptedEventTopSeq").IgnoreFilterPassed=True
820 # Define the alg configuration by purpose
821 def EndOfEventSeqCfg(flags, prescaleChain, purposes):
822 acc = ComponentAccumulator()
823 seqLabel = prescaleChain.replace('HLT_acceptedevts','')
824 seqName = 'acceptedEventSeq'+seqLabel
825 acc.addSequence( seqAND(seqName) )
827 endOfEventFilterAlg = CompFactory.EndOfEventFilterAlg('EndOfEventFilterAlg'+seqLabel, ChainName=prescaleChain)
828 acc.addEventAlgo(endOfEventFilterAlg, sequenceName=seqName)
829 # The LAr Noise Burst end-of-event sequence
830 if 'larnoiseburst' in purposes:
831 # Add stream filter to EndOfEventFilterAlg
832 # Only accept events going to streams that already do full calo reco
833 # CosmicCalo explicitly requested [ATR-26096]
834 endOfEventFilterAlg.StreamFilter = ['Main','VBFDelayed','TLA','DarkJetPEBTLA','FTagPEBTLA','CosmicCalo']
836 from TriggerMenuMT.HLT.CalibCosmicMon.CalibChainConfiguration import getLArNoiseBurstRecoCfg
837 acc.merge(getLArNoiseBurstRecoCfg(flags), sequenceName=seqName)
838 elif any(purpose.startswith("met") for purpose in purposes):
839 from TriggerMenuMT.HLT.MET.EndOfEvent import getMETRecoSequences
840 metcfg, rois, streams = getMETRecoSequences(flags, purposes)
841 endOfEventFilterAlg.StreamFilter = streams
842 endOfEventRoIMaker.RoIs = [x for x in rois if x not in endOfEventRoIMaker.RoIs]
843 acc.merge(metcfg, sequenceName=seqName)
848 for acceptedEventChainDict in acceptedEventChainDicts:
849 # Common config for each chain
850 prescaleChain = acceptedEventChainDict['chainName']
851 # Now add chain-specific end-of-event sequences executed conditionally on the prescale
852 purposes = acceptedEventChainDict['chainParts'][0]['purpose']
854 acc.merge(EndOfEventSeqCfg(flags, prescaleChain, purposes), sequenceName="acceptedEventTopSeq")