def setupxAODWriting( self ): """ Method setting up the writing of the ROOT-readable trigger configuration metadata. """ # Get a logger: log = logging.getLogger( "TriggerConfigGetter.py" ) log.info( "ESD/AOD writing enabled, will set up xAOD trigger " "configuration metadata writing" ) # Get the algorithm sequence: from AthenaCommon.AlgSequence import AlgSequence from .TriggerFlags import TriggerFlags topAlgs = AlgSequence() # Add the algorithm creating the trigger configuration metadata for # the output: try: if TriggerFlags.EDMDecodingVersion() <= 2: from TrigConfxAOD.TrigConfxAODConf import TrigConf__xAODMenuWriter topAlgs += TrigConf__xAODMenuWriter( OverwriteEventObj = True ) else: from TrigConfxAOD.TrigConfxAODConf import TrigConf__xAODMenuWriterMT menuwriter = TrigConf__xAODMenuWriterMT() menuwriter.IsHLTJSONConfig = True menuwriter.IsL1JSONConfig = True topAlgs += menuwriter # The metadata objects to add to the output: metadataItems = [ "xAOD::TriggerMenuContainer#TriggerMenu", "xAOD::TriggerMenuAuxContainer#TriggerMenuAux." ] # Set up the metadata for the output ESD and AOD: from RecExConfig.ObjKeyStore import objKeyStore objKeyStore.addManyTypesMetaData( metadataItems ) except ImportError: # don't want to branch in rel 18 pass # Return gracefully: return
def configure(self): from AthenaCommon.AlgSequence import AlgSequence topSequence = AlgSequence() #schedule xAOD conversions here from TrigBSExtraction.TrigBSExtractionConf import TrigHLTtoxAODConversion xaodconverter = TrigHLTtoxAODConversion() from TrigNavigation.TrigNavigationConfig import HLTNavigationOffline xaodconverter.Navigation = HLTNavigationOffline() from TrigEDMConfig.TriggerEDM import getPreregistrationList from TrigEDMConfig.TriggerEDM import getEFRun1BSList, getEFRun2EquivalentList, getL2Run1BSList, getL2Run2EquivalentList xaodconverter.Navigation.ClassesToPreregister = getPreregistrationList( TriggerFlags.EDMDecodingVersion()) ## if TriggerFlags.EDMDecodingVersion() == 2: ## # if TriggerFlags.doMergedHLTResult(): ## #if EDMDecodingVersion() =='Run2': #FPP ## xaodconverter.Navigation.ClassesToPreregister = getHLTPreregistrationList() ## else: ## xaodconverter.Navigation.ClassesToPreregister = list(set(getL2PreregistrationList()+getEFPreregistrationList()+getHLTPreregistrationList())) #we attempt to convert the entire old navigation (L2+EF) #xaodconverter.BStoxAOD.ContainersToConvert = list(set(getL2PreregistrationList()+getEFPreregistrationList())) # we want only containers from Run 1 with the BS tag xaodconverter.BStoxAOD.ContainersToConvert = getL2Run1BSList( ) + getEFRun1BSList() xaodconverter.BStoxAOD.NewContainers = getL2Run2EquivalentList( ) + getEFRun2EquivalentList() xaodconverter.HLTResultKey = "HLTResult_EF" topSequence += xaodconverter # define list of HLT xAOD containers to be written to the output root file # (previously this was defined in HLTTriggerResultGetter def configure) from TrigEDMConfig.TriggerEDM import getTriggerEDMList self.xaodlist = {} self.xaodlist.update(getTriggerEDMList(TriggerFlags.ESDEDMSet(), 2)) return True
if hasattr(runArgs,"skipEvents"): svcMgr.EventSelector.SkipEvents=runArgs.skipEvents if hasattr(runArgs,"maxEvents"): theApp.EvtMax=runArgs.maxEvents from TriggerJobOpts.TriggerConfigGetter import TriggerConfigGetter cfg = TriggerConfigGetter() from TrigDecisionTool.TrigDecisionToolConf import Trig__TrigDecisionTool from AthenaCommon.AppMgr import ToolSvc ToolSvc += Trig__TrigDecisionTool( "TrigDecisionTool" ) from TrigEDMConfig.TriggerEDM import EDMLibraries ToolSvc.TrigDecisionTool.Navigation.Dlls = [e for e in EDMLibraries if 'TPCnv' not in e] from TriggerJobOpts.TriggerFlags import TriggerFlags if TriggerFlags.doMT() or TriggerFlags.EDMDecodingVersion() == 3: ToolSvc.TrigDecisionTool.NavigationFormat="TrigComposite" if hasattr(runArgs,"useDB") and runArgs.useDB: ToolSvc.TrigDecisionTool.TrigConfigSvc = "Trig::TrigConfigSvc/TrigConfigSvc" else: log.info("Configure TrigConfigSvc by default") if not hasattr(svcMgr, 'xAODConfigSvc'): from TrigConfxAOD.TrigConfxAODConf import TrigConf__xAODConfigSvc svcMgr += TrigConf__xAODConfigSvc('xAODConfigSvc') ToolSvc.TrigDecisionTool.TrigConfigSvc = svcMgr.xAODConfigSvc # enable slices for monitoring # otherwise enable slices via monFlags HLTMonFlags.doMonTier0 = True if not hasattr(runArgs,"monFlags"):
topSequence.TrigDecMaker.doHLT=False elif TriggerFlags.dataTakingConditions()=='HltOnly': from AthenaCommon.AlgSequence import AlgSequence topSequence.TrigDecMaker.doL1=False # Decide based on the run number whether to assume a merged, or a # split HLT: if not TriggerFlags.doMergedHLTResult(): topSequence.TrigDecMaker.doHLT = False else: topSequence.TrigDecMaker.doL2 = False topSequence.TrigDecMaker.doEF = False _TriggerESDList = {} _TriggerAODList = {} from TrigEDMConfig.TriggerEDM import getTriggerEDMList _TriggerESDList.update( getTriggerEDMList(TriggerFlags.ESDEDMSet(), TriggerFlags.EDMDecodingVersion()) ) _TriggerAODList.update( getTriggerEDMList(TriggerFlags.AODEDMSet(), TriggerFlags.EDMDecodingVersion()) ) def preplist(input): triglist = [] for k,val in input.iteritems(): for j in val: triglist.append(k + "#" + j) return triglist StreamRDO.ItemList += ["HLT::HLTResult#HLTResult_HLT"] StreamRDO.ItemList += ["TrigDec::TrigDecision#TrigDecision"] StreamRDO.ItemList += ["TrigInDetTrackTruthMap#*"] StreamRDO.ItemList += preplist(_TriggerESDList) StreamRDO.ItemList += preplist(_TriggerAODList) from TrigEDMConfig.TriggerEDM import getLvl1ESDList
def configure(self): log = logging.getLogger("HLTTriggerResultGetter.py") from RecExConfig.ObjKeyStore import objKeyStore # set EDMDecodingVersion EDMDecodingVersion() # Set AODFULL for data unless it was set explicitly already if TriggerFlags.AODEDMSet.isDefault() and globalflags.DataSource( ) == 'data': TriggerFlags.AODEDMSet = 'AODFULL' from AthenaCommon.AlgSequence import AlgSequence topSequence = AlgSequence() log.info("BS unpacking (TF.readBS): %d", TriggerFlags.readBS()) if TriggerFlags.readBS(): if TriggerFlags.EDMDecodingVersion() <= 2: bs = ByteStreamUnpackGetterRun2() # noqa: F841 else: bs = ByteStreamUnpackGetter() # noqa: F841 xAODContainers = {} # if not recAlgs.doTrigger(): #only convert when running on old data if TriggerFlags.EDMDecodingVersion() == 1: xaodcnvrt = xAODConversionGetter() xAODContainers = xaodcnvrt.xaodlist if recAlgs.doTrigger() or TriggerFlags.doTriggerConfigOnly(): if TriggerFlags.EDMDecodingVersion() <= 2: tdt = TrigDecisionGetterRun2() # noqa: F841 else: tdt = TrigDecisionGetter() # noqa: F841 # Temporary hack to add Run-3 navigation to ESD and AOD if (rec.doESD() or rec.doAOD()) and TriggerFlags.EDMDecodingVersion() == 3: # The hack with wildcards is needed for BS->ESD because we don't know the exact keys # of HLT navigation containers before unpacking them from the BS event. objKeyStore._store['streamESD'].allowWildCard(True) objKeyStore._store['streamAOD'].allowWildCard(True) objKeyStore.addManyTypesStreamESD([ 'xAOD::TrigCompositeContainer#HLTNav*', 'xAOD::TrigCompositeAuxContainer#HLTNav*' ]) objKeyStore.addManyTypesStreamAOD([ 'xAOD::TrigCompositeContainer#HLTNav*', 'xAOD::TrigCompositeAuxContainer#HLTNav*' ]) # TrigJetRec additions if rec.doWriteESD(): objKeyStore.addStreamESD("JetKeyDescriptor", "JetKeyMap") objKeyStore.addStreamESD("JetMomentMap", "TrigJetRecMomentMap") if rec.doWriteAOD(): objKeyStore.addStreamAOD("JetKeyDescriptor", "JetKeyMap") objKeyStore.addStreamAOD("JetMomentMap", "TrigJetRecMomentMap") # ID truth if not rec.readESD() and (not rec.readAOD()) and TriggerFlags.doID() \ and rec.doTruth(): try: from TrigInDetTruthAlgs.TrigInDetTruthAlgsConfig import \ TrigIDTruthMaker topSequence += TrigIDTruthMaker() except Exception: log.warning("Couldn't set up the trigger ID truth maker") pass if rec.doESD() or rec.doAOD(): from TrigEDMConfig.TriggerEDM import getTrigIDTruthList objKeyStore.addManyTypesStreamESD( getTrigIDTruthList(TriggerFlags.ESDEDMSet())) objKeyStore.addManyTypesStreamAOD( getTrigIDTruthList(TriggerFlags.AODEDMSet())) if (rec.doESD() or rec.doAOD()) and TriggerFlags.writeL1TopoValData(): objKeyStore.addManyTypesStreamESD([ 'xAOD::TrigCompositeContainer#HLT_xAOD__TrigCompositeContainer_L1TopoValData', 'xAOD::TrigCompositeAuxContainer#HLT_xAOD__TrigCompositeContainer_L1TopoValDataAux.' ]) objKeyStore.addManyTypesStreamAOD([ 'xAOD::TrigCompositeContainer#HLT_xAOD__TrigCompositeContainer_L1TopoValData', 'xAOD::TrigCompositeAuxContainer#HLT_xAOD__TrigCompositeContainer_L1TopoValDataAux.' ]) log.debug( "HLT_xAOD__TrigCompositeContainer_L1TopoValData(Aux.) for L1Topo validation added to the data." ) if rec.doAOD() or rec.doWriteAOD(): # schedule the RoiDescriptorStore conversion # log.warning( "HLTTriggerResultGetter - setting up RoiWriter" ) roiWriter = RoiWriter() # Add fictional input to ensure data dependency in AthenaMT roiWriter.ExtraInputs += [("TrigBSExtractionOutput", "StoreGateSvc+TrigBSExtractionOutput")] topSequence += roiWriter # write out the RoiDescriptorStores from TrigEDMConfig.TriggerEDMRun2 import TriggerRoiList objKeyStore.addManyTypesStreamAOD(TriggerRoiList) #Are we adding operational info objects in ESD? added = self._AddOPIToESD() if added: log.debug( "Operational Info object HLT_EXPRESS_OPI_HLT with extra information about express stream prescaling added to the data." ) # ESD objects definitions _TriggerESDList = {} from TrigEDMConfig.TriggerEDM import getTriggerEDMList # we have to store xAOD containers in the root file, NOT AOD, # if the xAOD container list is not empty if (xAODContainers): _TriggerESDList.update(xAODContainers) else: _TriggerESDList.update( getTriggerEDMList(TriggerFlags.ESDEDMSet(), TriggerFlags.EDMDecodingVersion())) log.info( "ESD content set according to the ESDEDMSet flag: %s and EDM version %d", TriggerFlags.ESDEDMSet(), TriggerFlags.EDMDecodingVersion()) # AOD objects choice _TriggerAODList = {} #from TrigEDMConfig.TriggerEDM import getAODList _TriggerAODList.update( getTriggerEDMList(TriggerFlags.AODEDMSet(), TriggerFlags.EDMDecodingVersion())) log.info( "AOD content set according to the AODEDMSet flag: %s and EDM version %d", TriggerFlags.AODEDMSet(), TriggerFlags.EDMDecodingVersion()) log.debug("ESD EDM list: %s", _TriggerESDList) log.debug("AOD EDM list: %s", _TriggerAODList) # Highlight what is in AOD list but not in ESD list, as this can cause # the "different number of entries in branch" problem, when it is in the # AOD list but the empty container per event is not created # Just compares keys of dicts, which are the class names, not their string keys in StoreGate not_in = [ element for element in _TriggerAODList if element not in _TriggerESDList ] if (len(not_in) > 0): log.warning("In AOD list but not in ESD list: ") log.warning(not_in) else: log.info("AOD list is subset of ESD list - good.") def _addSlimming(stream, edm): from TrigNavTools.TrigNavToolsConfig import navigationThinningSvc edmlist = list(y.split('-')[0] for x in edm.values() for y in x) #flatten names svc = navigationThinningSvc({ 'name': 'HLTNav_%s' % stream, 'mode': 'cleanup', 'result': 'HLTResult_HLT', 'features': edmlist }) from OutputStreamAthenaPool.CreateOutputStreams import registerTrigNavThinningSvc registerTrigNavThinningSvc(stream, svc) log.info("Configured slimming of HLT for %s", stream) print(svc) # noqa: ATL901 del edmlist if TriggerFlags.doNavigationSlimming() and rec.readRDO( ) and rec.doWriteAOD(): _addSlimming('StreamAOD', _TriggerESDList) #Use ESD item list also for AOD! log.info("configured navigation slimming for AOD output") if TriggerFlags.doNavigationSlimming() and rec.readRDO( ) and rec.doWriteESD(): _addSlimming('StreamESD', _TriggerESDList) log.info("configured navigation slimming for ESD output") objKeyStore.addManyTypesStreamESD(_TriggerESDList) objKeyStore.addManyTypesStreamAOD(_TriggerAODList) return True
def configure(self): log = logging.getLogger("ByteStreamUnpackGetterRun2") from AthenaCommon.AlgSequence import AlgSequence topSequence = AlgSequence() #if TriggerFlags.readBS(): log.info("TriggerFlags.dataTakingConditions: %s", TriggerFlags.dataTakingConditions()) # in MC this is always FullTrigger hasHLT = TriggerFlags.dataTakingConditions( ) == 'HltOnly' or TriggerFlags.dataTakingConditions() == 'FullTrigger' if hasHLT: # Decide based on the run number whether to assume a merged, or a # split HLT: if not TriggerFlags.doMergedHLTResult(): ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "HLT::HLTResult/HLTResult_L2", "HLT::HLTResult/HLTResult_EF" ] else: ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "HLT::HLTResult/HLTResult_HLT" ] pass pass # BS unpacking from TrigBSExtraction.TrigBSExtractionConf import TrigBSExtraction extr = TrigBSExtraction() # Add fictional output to ensure data dependency in AthenaMT extr.ExtraOutputs += [("TrigBSExtractionOutput", "StoreGateSvc+TrigBSExtractionOutput")] if hasHLT: from TrigNavigation.TrigNavigationConfig import HLTNavigationOffline extr.Navigation = HLTNavigationOffline() from TrigEDMConfig.TriggerEDM import getEDMLibraries extr.Navigation.Dlls = getEDMLibraries() from TrigEDMConfig.TriggerEDM import getPreregistrationList extr.Navigation.ClassesToPreregister = getPreregistrationList( TriggerFlags.EDMDecodingVersion()) if TriggerFlags.doMergedHLTResult(): extr.L2ResultKey = "" extr.EFResultKey = "" else: extr.HLTResultKey = "" # # Configure DataScouting # from PyUtils.MetaReaderPeeker import metadata if 'stream' in metadata: stream_local = metadata['stream'] if stream_local.startswith( 'calibration_DataScouting_' ) or TriggerFlags.doAlwaysUnpackDSResult(): if 'calibration' in stream_local and 'DataScouting_' in stream_local: ds_tag = stream_local[12:27] ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "HLT::HLTResult/" + ds_tag ] extr.DSResultKeys += [ds_tag] else: #if data doesn't have HLT info set HLTResult keys as empty strings to avoid warnings # but the extr alg must run extr.L2ResultKey = "" extr.EFResultKey = "" extr.HLTResultKey = "" extr.DSResultKeys = [] topSequence += extr from TrigSerializeTP.TrigSerializeTPConf import TrigSerTPTool TrigSerToolTP = TrigSerTPTool('TrigSerTPTool') from AthenaCommon.AppMgr import ToolSvc ToolSvc += TrigSerToolTP from TrigEDMConfig.TriggerEDM import getTPList TrigSerToolTP.TPMap = getTPList((TriggerFlags.EDMDecodingVersion())) from TrigSerializeCnvSvc.TrigSerializeCnvSvcConf import TrigSerializeConvHelper TrigSerializeConvHelper = TrigSerializeConvHelper(doTP=True) ToolSvc += TrigSerializeConvHelper # # Configure L1Topo validation data algorithm # if hasHLT and TriggerFlags.doMergedHLTResult( ) and TriggerFlags.writeL1TopoValData(): # make sure that CTP_RDO is known (see also ATR-14683) ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "CTP_RDO/CTP_RDO" ] from L1TopoValDataCnv.L1TopoValDataCnvConf import xAODMaker__L1TopoValDataCnvAlg L1TopoValDataCvnAlg = xAODMaker__L1TopoValDataCnvAlg() topSequence += L1TopoValDataCvnAlg return True
def EDMDecodingVersion(): log = logging.getLogger("EDMDecodingVersion") # BYTESTREAM: decide Run3 or later based on ROD version, decide Run1/Run2 based on run number if globalflags.InputFormat.is_bytestream(): # Check HLT ROD version in first event of first input file from AthenaCommon.AthenaCommonFlags import athenaCommonFlags inputFileName = athenaCommonFlags.FilesInput()[0] if not inputFileName and athenaCommonFlags.isOnline(): log.info( "Online reconstruction mode, no input file available. Leaving default TriggerFlags.EDMDecodingVersion=%d", TriggerFlags.EDMDecodingVersion()) return import eformat from libpyeformat_helper import SubDetector bs = eformat.istream(inputFileName) rodVersionM = -1 rodVersionL = -1 # Find the first HLT ROBFragment in the first event for robf in bs[0]: if robf.rob_source_id().subdetector_id() == SubDetector.TDAQ_HLT: rodVersionM = robf.rod_minor_version() >> 8 rodVersionL = robf.rod_minor_version() & 0xFF log.debug("HLT ROD minor version from input file is %d.%d", rodVersionM, rodVersionL) break if rodVersionM < 0 or rodVersionL < 0: log.warning( "Cannot determine HLT ROD version from input file, falling back to runNumber-based decision" ) elif rodVersionM >= 1: TriggerFlags.EDMDecodingVersion = 3 log.info( "Decoding version set to 3, because running on BS file with HLT ROD version %d.%d", rodVersionM, rodVersionL) return # Use run number to determine decoding version from RecExConfig.AutoConfiguration import GetRunNumber runNumber = GetRunNumber() boundary_run12 = 230000 boundary_run23 = 368000 if runNumber <= 0: log.error( "Cannot determine decoding version because run number %d is invalid. Leaving the default version %d", runNumber, TriggerFlags.EDMDecodingVersion()) elif runNumber < boundary_run12: # Run-1 data TriggerFlags.EDMDecodingVersion = 1 TriggerFlags.doMergedHLTResult = False log.info( "Decoding version set to 1 based on BS file run number (runNumber < %d)", boundary_run12) elif runNumber < boundary_run23: # Run-2 data TriggerFlags.EDMDecodingVersion = 2 log.info( "Decoding version set to 2 based on BS file run number (%d < runNumber < %d)", boundary_run12, boundary_run23) else: # Run-3 data TriggerFlags.EDMDecodingVersion = 3 log.info( "Decoding version set to 3 based on BS file run number (runNumber > %d)", boundary_run23) else: # POOL files: decide based on HLT output type present in file from RecExConfig.ObjKeyStore import cfgKeyStore from PyUtils.MetaReaderPeeker import convert_itemList cfgKeyStore.addManyTypesInputFile(convert_itemList(layout='#join')) TriggerFlags.doMergedHLTResult = True if cfgKeyStore.isInInputFile("HLT::HLTResult", "HLTResult_EF"): TriggerFlags.EDMDecodingVersion = 1 TriggerFlags.doMergedHLTResult = False log.info( "Decoding version set to 1, because HLTResult_EF found in POOL file" ) elif cfgKeyStore.isInInputFile("xAOD::TrigNavigation", "TrigNavigation"): TriggerFlags.EDMDecodingVersion = 2 log.info( "Decoding version set to 2, because TrigNavigation found in POOL file" ) elif cfgKeyStore.isInInputFile("xAOD::TrigCompositeContainer", "HLTNav_Summary"): TriggerFlags.EDMDecodingVersion = 3 log.info( "Decoding version set to 3, because HLTNav_Summary found in POOL file" ) elif rec.readRDO(): # If running Trigger on RDO input (without previous trigger result), choose Run-2 or Run-3 based on doMT if TriggerFlags.doMT(): TriggerFlags.EDMDecodingVersion = 3 log.info( "Decoding version set to 3, because running Trigger with doMT=True" ) else: TriggerFlags.EDMDecodingVersion = 2 log.info( "Decoding version set to 2, because running Trigger with doMT=False" ) else: log.warning( "Cannot recognise HLT EDM format, leaving default TriggerFlags.EDMDecodingVersion=%d", TriggerFlags.EDMDecodingVersion())
alg = xAODMaker__TrigDecisionCnvAlg() alg.AODKey = "TrigDecision" alg.xAODKey = "xTrigDecision" topSequence.insert(idx + 1, alg) from xAODTriggerCnv.xAODTriggerCnvConf import xAODMaker__TrigNavigationCnvAlg trigNavCnv = xAODMaker__TrigNavigationCnvAlg() trigNavCnv.doL2 = False trigNavCnv.doEF = False trigNavCnv.doHLT = True topSequence.insert(idx + 2, trigNavCnv) _TriggerESDList = {} _TriggerAODList = {} from TrigEDMConfig.TriggerEDM import getTriggerEDMList _TriggerESDList.update( getTriggerEDMList(TriggerFlags.ESDEDMSet(), TriggerFlags.EDMDecodingVersion())) _TriggerAODList.update( getTriggerEDMList(TriggerFlags.AODEDMSet(), TriggerFlags.EDMDecodingVersion())) _streamRDO.ItemList += ["HLT::HLTResult#HLTResult_HLT"] _streamRDO.ItemList += ["TrigDec::TrigDecision#TrigDecision"] _streamRDO.ItemList += ["TrigInDetTrackTruthMap#*"] _streamRDO.ItemList += preplist(_TriggerESDList) _streamRDO.ItemList += preplist(_TriggerAODList) from TrigEDMConfig.TriggerEDM import getLvl1ESDList _streamRDO.ItemList += preplist(getLvl1ESDList()) from TrigEDMConfig.TriggerEDM import getLvl1AODList _streamRDO.ItemList += preplist(getLvl1AODList()) _streamRDO.MetadataItemList += [ "xAOD::TriggerMenuContainer#*", "xAOD::TriggerMenuAuxContainer#*"
def configure(self): log = logging.getLogger("HLTTriggerResultGetter.py") from RecExConfig.ObjKeyStore import objKeyStore # set EDMDecodingVersion EDMDecodingVersion() # Set AODFULL for data unless it was set explicitly already if TriggerFlags.AODEDMSet.isDefault() and globalflags.DataSource()=='data': TriggerFlags.AODEDMSet = 'AODFULL' from AthenaCommon.AlgSequence import AlgSequence topSequence = AlgSequence() log.info("BS unpacking (TF.readBS): %d" % TriggerFlags.readBS() ) if TriggerFlags.readBS(): bs = ByteStreamUnpackGetter() xAODContainers = {} # if not recAlgs.doTrigger(): #only convert when running on old data if TriggerFlags.EDMDecodingVersion()==1: xaodcnvrt = xAODConversionGetter() xAODContainers = xaodcnvrt.xaodlist if recAlgs.doTrigger() or TriggerFlags.doTriggerConfigOnly(): tdt = TrigDecisionGetter() # TrigJetRec additions if rec.doWriteESD(): objKeyStore.addStreamESD("JetKeyDescriptor","JetKeyMap") objKeyStore.addStreamESD("JetMomentMap","TrigJetRecMomentMap") if rec.doWriteAOD(): objKeyStore.addStreamAOD("JetKeyDescriptor","JetKeyMap") objKeyStore.addStreamAOD("JetMomentMap","TrigJetRecMomentMap") # ID truth if not rec.readESD() and (not rec.readAOD()) and TriggerFlags.doID() \ and rec.doTruth(): try: from TrigInDetTruthAlgs.TrigInDetTruthAlgsConfig import \ TrigIDTruthMaker topSequence += TrigIDTruthMaker() except Exception: log.warning( "Couldn't set up the trigger ID truth maker" ) pass if rec.doESD() or rec.doAOD(): from TrigEDMConfig.TriggerEDM import getTrigIDTruthList objKeyStore.addManyTypesStreamESD(getTrigIDTruthList(TriggerFlags.ESDEDMSet())) objKeyStore.addManyTypesStreamAOD(getTrigIDTruthList(TriggerFlags.AODEDMSet())) if (rec.doESD() or rec.doAOD()) and TriggerFlags.writeL1TopoValData(): objKeyStore.addManyTypesStreamESD(['xAOD::TrigCompositeContainer#HLT_xAOD__TrigCompositeContainer_L1TopoValData', 'xAOD::TrigCompositeAuxContainer#HLT_xAOD__TrigCompositeContainer_L1TopoValDataAux.']) objKeyStore.addManyTypesStreamAOD(['xAOD::TrigCompositeContainer#HLT_xAOD__TrigCompositeContainer_L1TopoValData', 'xAOD::TrigCompositeAuxContainer#HLT_xAOD__TrigCompositeContainer_L1TopoValDataAux.']) log.debug("HLT_xAOD__TrigCompositeContainer_L1TopoValData(Aux.) for L1Topo validation added to the data.") if rec.doAOD() or rec.doWriteAOD(): # schedule the RoiDescriptorStore conversion # log.warning( "HLTTriggerResultGetter - setting up RoiWriter" ) topSequence += RoiWriter() # write out the RoiDescriptorStores from TrigEDMConfig.TriggerEDM import TriggerRoiList objKeyStore.addManyTypesStreamAOD( TriggerRoiList ) #Are we adding operational info objects in ESD? added=self._AddOPIToESD() if added: log.debug("Operational Info object HLT_EXPRESS_OPI_HLT with extra information about express stream prescaling added to the data.") # ESD objects definitions _TriggerESDList = {} from TrigEDMConfig.TriggerEDM import getTriggerEDMList # we have to store xAOD containers in the root file, NOT AOD, # if the xAOD container list is not empty if(xAODContainers): _TriggerESDList.update( xAODContainers ) else: _TriggerESDList.update( getTriggerEDMList(TriggerFlags.ESDEDMSet(), TriggerFlags.EDMDecodingVersion()) ) log.info("ESD content set according to the ESDEDMSet flag: %s and EDM version %d" % (TriggerFlags.ESDEDMSet() ,TriggerFlags.EDMDecodingVersion()) ) # AOD objects choice _TriggerAODList = {} #from TrigEDMConfig.TriggerEDM import getAODList _TriggerAODList.update( getTriggerEDMList(TriggerFlags.AODEDMSet(), TriggerFlags.EDMDecodingVersion()) ) log.info("AOD content set according to the AODEDMSet flag: %s and EDM version %d" % (TriggerFlags.AODEDMSet(),TriggerFlags.EDMDecodingVersion()) ) log.debug("ESD EDM list: %s", _TriggerESDList) log.debug("AOD EDM list: %s", _TriggerAODList) # Highlight what is in AOD list but not in ESD list, as this can cause # the "different number of entries in branch" problem, when it is in the # AOD list but the empty container per event is not created # Just compares keys of dicts, which are the class names, not their string keys in StoreGate not_in = [ element for element in _TriggerAODList if element not in _TriggerESDList ] if (len(not_in)>0): log.warning("In AOD list but not in ESD list: ") log.warning(not_in) else: log.info("AOD list is subset of ESD list - good.") def _addSlimming(stream, thinningSvc, edm): from AthenaCommon.AlgSequence import AlgSequence topSequence = AlgSequence() from TrigNavTools.TrigNavToolsConf import HLT__StreamTrigNavSlimming, HLT__TrigNavigationSlimming from TrigNavTools.TrigNavToolsConfig import navigationSlimming edmlist = list(y.split('-')[0] for x in edm.values() for y in x) #flatten names # from HLT result drop unrecorded features # slimmerHLT = HLT__StreamTrigNavSlimming('HLTNavSlimmer_%s'%stream) slimmerHLT = HLT__TrigNavigationSlimming('TrigNavigationSlimmer_%s'%stream) tHLT = navigationSlimming({'name':'HLTNav_%s'%stream, 'mode':'cleanup', 'ThinningSvc':thinningSvc, 'result':'HLTResult_HLT', 'features':edmlist}) #tHLT.SlimmingTool.OutputLevel=DEBUG tHLT.ActInPlace=True slimmerHLT.ThinningTool = tHLT print slimmerHLT.ThinningTool topSequence += slimmerHLT log.info("Configured slimming of HLT") del edmlist from AthenaCommon.AppMgr import ServiceMgr as svcMgr from AthenaServices.Configurables import ThinningSvc, createThinningSvc _doSlimming = True if _doSlimming and rec.readRDO() and rec.doWriteAOD(): if not hasattr(svcMgr, 'ThinningSvc'): # if the default is there it is configured for AODs svcMgr += ThinningSvc(name='ThinningSvc', Streams=['StreamAOD']) _addSlimming('StreamAOD', svcMgr.ThinningSvc, _TriggerESDList ) #Use ESD item list also for AOD! log.info("configured navigation slimming for AOD output") if _doSlimming and rec.readRDO() and rec.doWriteESD(): #rec.doWriteESD() and not rec.readESD(): if not hasattr(svcMgr, 'ESDThinningSvc'): svcMgr += ThinningSvc(name='ESDThinningSvc', Streams=['StreamESD']) # the default is configured for AODs _addSlimming('StreamESD', svcMgr.ESDThinningSvc, _TriggerESDList ) log.info("configured navigation slimming for ESD output") objKeyStore.addManyTypesStreamESD( _TriggerESDList ) objKeyStore.addManyTypesStreamAOD( _TriggerAODList ) return True
def configure(self): log = logging.getLogger("ByteStreamUnpackGetter.py") from AthenaCommon.AlgSequence import AlgSequence topSequence = AlgSequence() #if TriggerFlags.readBS(): log.info( "TriggerFlags.dataTakingConditions: %s" % TriggerFlags.dataTakingConditions() ) # in MC this is always FullTrigger hasHLT = TriggerFlags.dataTakingConditions()=='HltOnly' or TriggerFlags.dataTakingConditions()=='FullTrigger' if hasHLT: from AthenaCommon.AppMgr import ServiceMgr # Decide based on the run number whether to assume a merged, or a # split HLT: if not TriggerFlags.doMergedHLTResult(): ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "HLT::HLTResult/HLTResult_L2", "HLT::HLTResult/HLTResult_EF" ] else: ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "HLT::HLTResult/HLTResult_HLT" ] pass pass # BS unpacking from TrigBSExtraction.TrigBSExtractionConf import TrigBSExtraction extr = TrigBSExtraction() if hasHLT: from TrigNavigation.TrigNavigationConfig import HLTNavigationOffline extr.Navigation = HLTNavigationOffline() from TrigEDMConfig.TriggerEDM import getEDMLibraries extr.Navigation.Dlls = getEDMLibraries() from TrigEDMConfig.TriggerEDM import getPreregistrationList extr.Navigation.ClassesToPreregister = getPreregistrationList(TriggerFlags.EDMDecodingVersion()) if TriggerFlags.doMergedHLTResult(): extr.L2ResultKey="" extr.EFResultKey="" else: extr.HLTResultKey="" # # Configure DataScouting # from RecExConfig.InputFilePeeker import inputFileSummary if inputFileSummary['bs_metadata']['Stream'].startswith('calibration_DataScouting_') or TriggerFlags.doAlwaysUnpackDSResult(): for stag in inputFileSummary['stream_tags']: if (stag['stream_type'] == 'calibration') and (stag['stream_name'].startswith('DataScouting_')): ds_tag = stag['stream_name'][0:15] ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "HLT::HLTResult/"+ds_tag ] extr.DSResultKeys += [ ds_tag ] else: #if data doesn't have HLT info set HLTResult keys as empty strings to avoid warnings # but the extr alg must run extr.L2ResultKey="" extr.EFResultKey="" extr.HLTResultKey="" extr.DSResultKeys=[] topSequence += extr from TrigSerializeTP.TrigSerializeTPConf import TrigSerTPTool TrigSerToolTP = TrigSerTPTool('TrigSerTPTool') from AthenaCommon.AppMgr import ToolSvc ToolSvc += TrigSerToolTP from TrigEDMConfig.TriggerEDM import getTPList TrigSerToolTP.TPMap = getTPList((TriggerFlags.EDMDecodingVersion())) from TrigSerializeCnvSvc.TrigSerializeCnvSvcConf import TrigSerializeConvHelper TrigSerializeConvHelper = TrigSerializeConvHelper(doTP = True) ToolSvc += TrigSerializeConvHelper # # Configure L1Topo validation data algorithm # if hasHLT and TriggerFlags.doMergedHLTResult() and TriggerFlags.writeL1TopoValData() : # make sure that CTP_RDO is known (see also ATR-14683) ServiceMgr.ByteStreamAddressProviderSvc.TypeNames += [ "CTP_RDO/CTP_RDO" ] from L1TopoValDataCnv.L1TopoValDataCnvConf import xAODMaker__L1TopoValDataCnvAlg L1TopoValDataCvnAlg = xAODMaker__L1TopoValDataCnvAlg() topSequence += L1TopoValDataCvnAlg return True
def configure(self): log = logging.getLogger( "TriggerConfigGetter.py" ) from PyUtils.MetaReaderPeekerFull import metadata # first check the input if "HIT2RDO" in self._environment: TriggerFlags.doLVL2 = False TriggerFlags.doEF = False log.info("For simulation jobs the following flags are set:") log.info("globalflags.InputFormat : %s", globalflags.InputFormat()) log.info("globalflags.DataSource : %s", globalflags.DataSource()) log.info("TriggerFlags.configForStartup : %s", TriggerFlags.configForStartup()) log.info("TriggerFlags.dataTakingConditions : %s", TriggerFlags.dataTakingConditions()) log.info("TriggerFlags.doLVL2 : %s", TriggerFlags.doLVL2()) log.info("TriggerFlags.doEF : %s", TriggerFlags.doEF()) else: if not self.checkInput(): log.error("Could not determine job input. Can't setup trigger configuration and will return!") return # self.checkInput() may call TriggerConfigCheckMetadata, this can in turn set "rec.doTrigger.set_Value_and_Lock(False)" # but TriggerConfigGetter might have only been called in the first place due to this flag having been true, # so re-check that we're still OK to be executing here if not (recAlgs.doTrigger() or rec.doTrigger() or TriggerFlags.doTriggerConfigOnly()): log.info("Aborting TriggerConfigGetter as the trigger flags were switched to false in checkInput()") return True self.readPool = globalflags.InputFormat() == 'pool' self.readRDO = rec.readRDO() self.writeESDAOD = rec.doWriteESD() or rec.doWriteAOD() or rec.doWriteDPD() self.writeAOD = rec.doWriteAOD() or rec.doWriteDPD() self.ConfigSrcList = TriggerFlags.configurationSourceList() self.readMC = globalflags.DataSource()=='geant3' or globalflags.DataSource()=='geant4' self.readTriggerDB = TriggerFlags.readMenuFromTriggerDb() and self.readRDO self.isCommisioning = globalflags.DataSource()=='data' and globalflags.DetGeo()=='commis' self.l1Folders = TriggerFlags.dataTakingConditions()=='FullTrigger' or TriggerFlags.dataTakingConditions()=='Lvl1Only' self.hltFolders = TriggerFlags.dataTakingConditions()=='FullTrigger' or TriggerFlags.dataTakingConditions()=='HltOnly' self.isRun1Data = False self.hasxAODMeta = ("metadata_items" in metadata and any(('TriggerMenu' in key) for key in metadata["metadata_items"].keys())) if globalflags.DataSource()=='data': from RecExConfig.AutoConfiguration import GetRunNumber runNumber = GetRunNumber() if runNumber is not None and runNumber > 0 and runNumber < 230000 : self.isRun1Data = True self.isTriggerReprocessing = False # the TriggerFlags.readMenuFromTriggerDb() tells us that we read the trigger menu from the database # the connection itself is defined in TriggerFlags.triggerDbConnection() # reading from the TriggerDB can mean different things: # a) TriggerFlags doLVL2() and doEF() are both False: # - create a tmp sqlite file with the conditions (menu) # - use DSConfigSvc # b) TriggerFlags doLVL2() or doEF() is True: # - use HLTConfigSvc if self.readTriggerDB and (TriggerFlags.doLVL2() or TriggerFlags.doEF() or TriggerFlags.doHLT()): self.ConfigSrcList = ['xml'] # to use L1/HLTConfigSvc and not DSConfigSvc, but only if we are running the HLT if self._environment: # I don't think anyone calls TriggerConfigGetter with an argument self.readPool = False self.writeESDAOD = False self.readHits = False if "ReadPoolRDO" in self._environment: self.readPool = True self.readRDO = True elif "ReadPool" in self._environment: self.readPool = True self.readRDO = False if "WritePool" in self._environment: self.writeESDAOD = True if "HIT2RDO" in self._environment: self.readRDO = False self.readHits = True # define ConfigSvc if not self.ConfigSrcList: if (self.readPool and not self.readRDO) or (self.readRDO and not self.readPool): # (ESD, AOD, DPD) or (RDO-BS) self.ConfigSrcList = ['ds'] elif (self.readRDO and self.readPool) or rec.readTAG() or self.readHits: # (RDO-MC) or TAG self.ConfigSrcList = ['xml'] else: # should not get here: should be found by checkInput log.fatal('no reading of BS, RDO, AOD, ESD, or TAG specified') # we need the temporary COOL database, if we read the configuration from XML and write ESD/AOD (or have 'ds' set for some reason) self.makeTempCool = self.readRDO and \ ( self.writeESDAOD or 'ds' in self.ConfigSrcList ) and \ ( self.readMC \ or (self.isCommisioning and (TriggerFlags.readLVL1configFromXML() and TriggerFlags.readHLTconfigFromXML())) \ or TriggerFlags.readMenuFromTriggerDb() ) log.info("Need to create temporary cool file? : %r", self.makeTempCool) log.info('Creating the Trigger Configuration Services') from AthenaCommon.AppMgr import ServiceMgr as svcMgr ######################################################################## # START OF TEMPORARY SOLUTION FOR RUN-3 TRIGGER DEVELOPMENT ######################################################################## from TriggerJobOpts.HLTTriggerResultGetter import EDMDecodingVersion EDMDecodingVersion() # In most use cases this needs to be called much earlier than in HLTTriggerResultGetter if TriggerFlags.EDMDecodingVersion() >= 3: if self.hasxAODMeta: if not hasattr(svcMgr, 'xAODConfigSvc'): from TrigConfxAOD.TrigConfxAODConf import TrigConf__xAODConfigSvc svcMgr += TrigConf__xAODConfigSvc('xAODConfigSvc') else: # Does not have xAODMeta # Run-3 Trigger Configuration Services from TrigConfigSvc.TrigConfigSvcCfg import getL1ConfigSvc, getHLTConfigSvc from AthenaConfiguration.AllConfigFlags import ConfigFlags svcMgr += getL1ConfigSvc(ConfigFlags) svcMgr += getHLTConfigSvc(ConfigFlags) # Needed for TrigConf::xAODMenuWriterMT from TrigConfigSvc.TrigConfigSvcConfig import TrigConfigSvc svcMgr += TrigConfigSvc("TrigConfigSvc") svcMgr.TrigConfigSvc.PriorityList = ["none", "ds", "xml"] else: # non-MT (Run-2) Trigger Configuration self.svc = SetupTrigConfigSvc() if 'xml' in self.ConfigSrcList or self.makeTempCool: # sets them if plain XML reading is to be used self.svc.l1topoXmlFile = TriggerFlags.outputL1TopoConfigFile() # generated in python self.svc.l1XmlFile = TriggerFlags.outputLVL1configFile() # generated in python self.svc.hltXmlFile = TriggerFlags.outputHLTconfigFile() # generated in python if TriggerFlags.readL1TopoConfigFromXML(): self.svc.l1topoXmlFile = TriggerFlags.inputL1TopoConfigFile() # given XML if TriggerFlags.readLVL1configFromXML(): self.svc.l1XmlFile = TriggerFlags.inputLVL1configFile() # given XML if TriggerFlags.readHLTconfigFromXML(): self.svc.hltXmlFile = TriggerFlags.inputHLTconfigFile() # given XML try: self.svc.SetStates( self.ConfigSrcList ) except Exception: log.error( 'Failed to set state of TrigConfigSvc to %r', self.ConfigSrcList ) else: log.info('The following configuration services will be tried: %r', self.ConfigSrcList ) try: self.svc.InitialiseSvc() except Exception as ex: log.error( 'Failed to activate TrigConfigSvc: %r', ex ) ######################################################################## # END OF TEMPORARY SOLUTION FOR RUN-3 TRIGGER DEVELOPMENT ######################################################################## if self.readTriggerDB: log.info( "Using TriggerDB connection '%s'", TriggerFlags.triggerDbConnection() ) self.trigDbConnectionParameters = interpretConnection(TriggerFlags.triggerDbConnection(), resolveAlias=False) self.setConfigSvcConnParams(self.trigDbConnectionParameters) log.info("TriggerFlags.triggerCoolDbConnection is '%s' [default: '']", TriggerFlags.triggerCoolDbConnection()) TrigCoolDbConnection = TriggerFlags.triggerCoolDbConnection() if self.makeTempCool: TrigCoolDbConnection = self.setupTempCOOLWriting(TrigCoolDbConnection) if ('ds' in self.ConfigSrcList) and not self.hasxAODMeta: self.setupCOOLReading(TrigCoolDbConnection) if hasattr(svcMgr, 'DSConfigSvc'): db = 'TRIGGERDB' if self.isRun1Data: db = 'TRIGGERDB_RUN1' elif self.readMC: db = 'TRIGGERDBMC' elif self.isTriggerReprocessing: db = 'TRIGGERDBREPR' svcMgr.DSConfigSvc.ConfigSource = 'dblookup' svcMgr.DSConfigSvc.DBServer = db log.info("DSConfigSvc trigger database is '%s'", db) if not self.hasxAODMeta: self.setupxAODWriting() # all went fine we are configured return True