diff --git a/Reconstruction/RecExample/RecExCond/share/RecExCommon_flags.py b/Reconstruction/RecExample/RecExCond/share/RecExCommon_flags.py index ce39b071cf73c03fa2ac9a8431cde4bd31c5a45b..ce6e4f47984bd84724813f558831cd42b936688e 100755 --- a/Reconstruction/RecExample/RecExCond/share/RecExCommon_flags.py +++ b/Reconstruction/RecExample/RecExCond/share/RecExCommon_flags.py @@ -236,12 +236,6 @@ if len(rec.AutoConfiguration())>0: #special commisioning job options if rec.Commissioning(): include("RecExCond/MinimalCommissioningSetup.py") - # setup trigger reading from COOL - if rec.doTrigger(): - from TriggerJobOpts.TriggerFlags import TriggerFlags as tf - tf.configForStartup="HLTonline" - tf.configForStartup.lock() - rec.ScopingLevel.set_Value_and_Lock(1) if rec.triggerStream().startswith('express'): diff --git a/Trigger/TrigConfiguration/TrigConfigSvc/python/TriggerConfigAccess.py b/Trigger/TrigConfiguration/TrigConfigSvc/python/TriggerConfigAccess.py index 985b34eee6de451e2f17eb2cc721f6a25371c5e9..37293f7c30e51c544482ca5c862d16db84386478 100644 --- a/Trigger/TrigConfiguration/TrigConfigSvc/python/TriggerConfigAccess.py +++ b/Trigger/TrigConfiguration/TrigConfigSvc/python/TriggerConfigAccess.py @@ -1,11 +1,11 @@ -# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration from .TrigConfigSvcCfg import getTrigConfigFromFlag, getL1MenuFileName, getHLTMenuFileName, getL1PrescalesSetFileName, getHLTPrescalesSetFileName, getBunchGroupSetFileName, getHLTJobOptionsFileName, getHLTMonitoringFileName from TrigConfIO.L1TriggerConfigAccess import L1MenuAccess, L1PrescalesSetAccess, BunchGroupSetAccess from TrigConfIO.HLTTriggerConfigAccess import HLTMenuAccess, HLTPrescalesSetAccess, HLTJobOptionsAccess, HLTMonitoringAccess -from PyUtils.Decorators import memoize +from functools import lru_cache """ Access to the trigger configuration in python is provided depending on @@ -40,9 +40,11 @@ are then loaded from the DB. """ -@memoize +@lru_cache(maxsize=None) def getKeysFromCool(runNr, lbNr = 0): - from TrigConfStorage import TriggerCoolUtil + """Return dictionary of trigger keys for given run and lumiblock number + """ + from TrigConfStorage.TriggerCoolUtil import TriggerCoolUtil condb = "CONDBR2" if runNr > 236108 else "COMP200" db = TriggerCoolUtil.GetConnection(condb) run_range = [[runNr,runNr]] @@ -64,7 +66,7 @@ def getKeysFromCool(runNr, lbNr = 0): dbaliasMapping = { "TRIGGERDBR2R" : "TRIGGERDB", "TRIGGERDBV2" : "TRIGGERDB_RUN1" } if d["DB"] in dbaliasMapping: - d["DB"] = dbaliasMapping[ db["DB"] ] + d["DB"] = dbaliasMapping[ d["DB"] ] return d @@ -220,4 +222,4 @@ def getHLTMonitoringAccess( flags = None ): raise NotImplementedError("Python access to the trigger configuration (HLT menu) from in-file metadata not yet implemented") else: raise RuntimeError("Unknown source of trigger configuration: %s" % tc["SOURCE"]) - return cfg \ No newline at end of file + return cfg diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerResultGetter.py b/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerResultGetter.py index 73c731f3a082e001f16a7b62e91223eb01211045..2d435e81b5bb6c14b2d688c0ee9e79d6c068b271 100644 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerResultGetter.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerResultGetter.py @@ -50,12 +50,6 @@ class ByteStreamUnpackGetter(Configured): def configure(self): log = logging.getLogger("ByteStreamUnpackGetter") - log.info( "TriggerFlags.dataTakingConditions: %s", TriggerFlags.dataTakingConditions() ) - hasHLT = TriggerFlags.dataTakingConditions()=='HltOnly' or TriggerFlags.dataTakingConditions()=='FullTrigger' - if not hasHLT: - log.info("Will not configure HLT BS unpacking because dataTakingConditions flag indicates HLT was disabled") - return True - # Define the decoding sequence from TrigHLTResultByteStream.TrigHLTResultByteStreamConf import HLTResultMTByteStreamDecoderAlg from TrigOutputHandling.TrigOutputHandlingConf import TriggerEDMDeserialiserAlg @@ -82,10 +76,6 @@ class ByteStreamUnpackGetterRun1or2(Configured): from AthenaCommon.AlgSequence import AlgSequence topSequence = AlgSequence() - log.info( "TriggerFlags.dataTakingConditions: %s", TriggerFlags.dataTakingConditions() ) - # in MC this is always FullTrigger - hasHLT = TriggerFlags.dataTakingConditions() in ('HltOnly', 'FullTrigger') - # BS unpacking from TrigBSExtraction.TrigBSExtractionConf import TrigBSExtraction extr = TrigBSExtraction() @@ -95,7 +85,7 @@ class ByteStreamUnpackGetterRun1or2(Configured): extr.ExtraInputs += [("xAOD::TrigNavigation", "StoreGateSvc+TrigNavigation")] extr.ExtraOutputs += [("TrigBSExtractionOutput", "StoreGateSvc+TrigBSExtractionOutput")] - if hasHLT: + if 'HLT' in ConfigFlags.Trigger.availableRecoMetadata: from TrigNavigation.TrigNavigationConfig import HLTNavigationOffline extr.NavigationForL2 = HLTNavigationOffline("NavigationForL2") # Ignore the L2 TrigPassBits to avoid clash with EF (ATR-23411) @@ -132,6 +122,7 @@ class ByteStreamUnpackGetterRun1or2(Configured): extr.DSResultKeys += [ds_tag] else: + log.info("Will not schedule HLT bytestream extraction") # if data doesn't have HLT info set HLTResult keys as empty strings to avoid warnings # but the extraction algorithm must run extr.L2ResultKey = "" @@ -210,14 +201,14 @@ class TrigDecisionGetterRun1or2(Configured): # WritexAODTrigDecision() is called within WriteTrigDecision() # inform TD maker that some parts may be missing - if TriggerFlags.dataTakingConditions()=='Lvl1Only': + if 'HLT' not in ConfigFlags.Trigger.availableRecoMetadata: topSequence.TrigDecMaker.doL2=False topSequence.TrigDecMaker.doEF=False topSequence.TrigDecMaker.doHLT=False topSequence.TrigNavigationCnvAlg.doL2 = False topSequence.TrigNavigationCnvAlg.doEF = False topSequence.TrigNavigationCnvAlg.doHLT = False - elif TriggerFlags.dataTakingConditions()=='HltOnly': + if 'L1' not in ConfigFlags.Trigger.availableRecoMetadata: from AthenaCommon.AlgSequence import AlgSequence topSequence.TrigDecMaker.doL1=False diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py index ced5770c01f5c5a916d1f82d9292dc2286a47c02..f81713b7403dca751774314f7831978afbc9236d 100644 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py @@ -1,5 +1,7 @@ # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +import os + from AthenaConfiguration.AthConfigFlags import AthConfigFlags from AthenaCommon.SystemOfUnits import GeV from AthenaCommon.Logging import logging @@ -67,7 +69,7 @@ def createTriggerFlags(): if flags.Input.Format=="BS": _log.debug("Input format is ByteStream") - if not flags.Input.Files and flags.Common.isOnline(): + if not any(flags.Input.Files) and flags.Common.isOnline: _log.info("Online reconstruction, no input file. Return default EDMVersion=%d", default_version) return default_version @@ -112,13 +114,13 @@ def createTriggerFlags(): # True if we have at least one input file, it is a POOL file, it has a metadata store, and the store has xAOD trigger configuration data # in either the run-2 or run-3 formats. - def _trigConfMeta(flags): + def __trigConfMeta(flags): from AthenaConfiguration.AutoConfigFlags import GetFileMD md = GetFileMD(flags.Input.Files) if any(flags.Input.Files) else {} return ("metadata_items" in md and any(('TriggerMenu' in key) for key in md["metadata_items"].keys())) - # Flag to sense if trigger confioguration POOL metadata is available on the job's input - flags.addFlag('Trigger.InputContainsConfigMetadata', lambda prevFlags: _trigConfMeta(prevFlags)) + # Flag to sense if trigger configuration POOL metadata is available on the job's input + flags.addFlag('Trigger.InputContainsConfigMetadata', lambda prevFlags: __trigConfMeta(prevFlags)) # only enable services for analysis and BS -> ESD processing (we need better name) flags.addFlag('Trigger.doTriggerConfigOnly', False) @@ -143,7 +145,6 @@ def createTriggerFlags(): flags.addFlag('Trigger.L1.doCTP', True) # partition name used to determine online vs offline BS result writing - import os flags.addFlag('Trigger.Online.partitionName', os.getenv('TDAQ_PARTITION') or '') # shortcut to check if job is running in a partition (i.e. partition name is not empty) @@ -170,13 +171,26 @@ def createTriggerFlags(): # geometry version used by HLT online flags.addFlag('Trigger.OnlineGeoTag', 'ATLAS-R2-2016-01-00-01') - # comissionig options - # one of: 'HltOnly', - # 'Lvl1Only', - # 'FullTrigger', - # 'NoTrigger' - flags.addFlag('Trigger.dataTakingConditions', 'FullTrigger') - + def __availableRecoMetadata(flags): + systems = ['L1','HLT'] + # Online reco without input files + if not any(flags.Input.Files) and flags.Common.isOnline: + return systems + # Makes no sense when running HLT + elif flags.Trigger.doHLT: + raise RuntimeError('Trigger.availableRecoMetadata is ill-defined if Trigger.doHLT==True') + # RAW: check if keys are in COOL + elif flags.Input.Format=="BS": + from TrigConfigSvc.TriggerConfigAccess import getKeysFromCool + keys = getKeysFromCool(flags.Input.RunNumber[0]) # currently only checking first file + return ( (['L1'] if 'L1PSK' in keys else []) + + (['HLT'] if 'HLTPSK' in keys else []) ) + # POOL: metadata (do not distinguish L1/HLT yet, see discussions on GitLab commit f83ae2bc) + else: + return systems if flags.Trigger.InputContainsConfigMetadata else [] + + # list of enabled trigger sub-systems in reconstruction: ['L1,'HLT'] + flags.addFlag('Trigger.availableRecoMetadata', lambda flags: __availableRecoMetadata(flags)) # use or not frontier proxies flags.addFlag('Trigger.triggerUseFrontier', False) @@ -227,7 +241,6 @@ def createTriggerFlags(): muonflags = createMuonConfigFlags() muonflags.Muon.useTGCPriorNextBC=True muonflags.Muon.MuonTrigger=True - return muonflags def __muonCombined(): @@ -270,10 +283,6 @@ def createTriggerFlags(): flags.addFlag("Trigger.Test.doDummyChainConfig", False) return flags - # for reference, this flags are skipped as never used or never set in fact, or set identical to de default or used in a very old JO: - # configForStartup - # the flags related to trigger DB are redundant of triggerConfig - need to decide if they are needed in this form - # also not defined the Prescale sets yet if __name__ == "__main__": diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigGetter.py b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigGetter.py index 7b21fb0c667f474aecaf375bc29d63263111c711..d26696a398085c05bda34a216edee2c937d5490f 100644 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigGetter.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigGetter.py @@ -8,9 +8,9 @@ from RecExConfig.Configured import Configured from AthenaCommon.GlobalFlags import globalflags from AthenaCommon.Logging import logging -from AthenaCommon.Resilience import protectedInclude from AthenaCommon.AppMgr import ServiceMgr as svcMgr +log = logging.getLogger( "TriggerConfigGetter.py" ) class TriggerConfigGetter(Configured): """ This class brings to the job Trigger Configuration. @@ -19,7 +19,7 @@ class TriggerConfigGetter(Configured): _environment="" def __init__(self, environment=""): - log = logging.getLogger( "TriggerConfigGetter.py" ) + if environment: log.info('Initialize (environment "%s")', environment) else: @@ -28,37 +28,6 @@ class TriggerConfigGetter(Configured): super(TriggerConfigGetter,self).__init__() # calls configure - def checkInput(self): - - log = logging.getLogger( "TriggerConfigGetter.py" ) - if "ReadPool" in self._environment or "WritePool" in self._environment: - log.info("Flags are ignored, since 'ReadPool' or 'WritePool' is specified") - return True - - if rec.readESD() or rec.readAOD(): # and globalflags.DataSource()=='data': # need this for MC as well - protectedInclude("TriggerJobOpts/TriggerConfigCheckMetadata.py") - - if rec.readRDO() and globalflags.InputFormat()=='bytestream' and globalflags.DataSource()=='data' and TriggerFlags.configForStartup()!='HLToffline': - protectedInclude("TriggerJobOpts/TriggerConfigCheckHLTpsk.py") - - log.info("The following flags are set:") - log.info("globalflags.InputFormat : %s", globalflags.InputFormat()) - log.info("rec.read.* : RDO: %s, ESD: %s, AOD: %s, TAG: %s", rec.readRDO(), rec.readESD(), rec.readAOD(), rec.readTAG()) - log.info("rec.doWrite.* : ESD: %s, AOD: %s, TAG: %s", rec.doWriteESD(), rec.doWriteAOD(), rec.doWriteTAG()) - log.info("globalflags.DataSource : %s", globalflags.DataSource()) - log.info("TriggerFlags.configForStartup : %s", TriggerFlags.configForStartup()) - log.info("TriggerFlags.dataTakingConditions : %s", TriggerFlags.dataTakingConditions()) - - count = len([1 for x in [rec.readRDO(),rec.readESD(),rec.readAOD()] if x ]) #readTAG is only set with another input - if count == 0: - log.warning("Don't know what the input format is.") - return False - if count >= 2: - log.warning("More than one input format specified, please set only the appropriate one.") - return False - return True - - def setConfigSvcConnParams(self,connectionParameters): sl = [] if hasattr(svcMgr,'LVL1ConfigSvc'): @@ -100,33 +69,28 @@ class TriggerConfigGetter(Configured): def configure(self): - log = logging.getLogger( "TriggerConfigGetter.py" ) - from PyUtils.MetaReaderPeekerFull import metadata - - # first check the input - if "HIT2RDO" in self._environment: - 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()) - 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 + + log.info("The following flags are set:") + log.info("globalflags.InputFormat : %s", globalflags.InputFormat()) + log.info("globalflags.DataSource : %s", globalflags.DataSource()) + log.info("rec.read.* : RDO: %s, ESD: %s, AOD: %s, TAG: %s", rec.readRDO(), rec.readESD(), rec.readAOD(), rec.readTAG()) + log.info("rec.doWrite.* : ESD: %s, AOD: %s, TAG: %s", rec.doWriteESD(), rec.doWriteAOD(), rec.doWriteTAG()) + + # first check the input (TODO: review these environments) + if self._environment not in ["HIT2RDO", "ReadPool", "WritePool"]: + + from AthenaConfiguration.AllConfigFlags import ConfigFlags + if not ConfigFlags.Trigger.availableRecoMetadata: + log.error("At least one run does not contain any trigger configuration data. " + "Turning off trigger [rec.doTrigger=False]") + rec.doTrigger = False + + # TODO: Review doTriggerConfigOnly if not (rec.doTrigger() or TriggerFlags.doTriggerConfigOnly()): - log.info("Aborting TriggerConfigGetter as the trigger flags were switched to false in checkInput()") + log.info("Aborting TriggerConfigGetter as the trigger flags were switched to false") return True self.readTriggerDB = TriggerFlags.readMenuFromTriggerDb() and self.readRDO - self.hasxAODMeta = ( - ("metadata_items" in metadata) - and - any((('TriggerMenu' or 'MenuJSON') in key) for key in metadata["metadata_items"].keys()) - ) log.info('Creating the Trigger Configuration Services') from AthenaConfiguration.AllConfigFlags import ConfigFlags @@ -134,7 +98,7 @@ class TriggerConfigGetter(Configured): log.info("ConfigFlags.Trigger.EDMVersion: %i", ConfigFlags.Trigger.EDMVersion) if ConfigFlags.Trigger.EDMVersion >= 3: - if self.hasxAODMeta: + if ConfigFlags.Trigger.InputContainsConfigMetadata: if not hasattr(svcMgr, 'xAODConfigSvc'): from TrigConfxAOD.TrigConfxAODConf import TrigConf__xAODConfigSvc svcMgr += TrigConf__xAODConfigSvc('xAODConfigSvc') @@ -151,7 +115,7 @@ class TriggerConfigGetter(Configured): log.info("TriggerFlags.triggerCoolDbConnection is '%s' [default: '']", TriggerFlags.triggerCoolDbConnection()) - if not self.hasxAODMeta: + if not ConfigFlags.Trigger.InputContainsConfigMetadata: self.setupxAODWriting() else: log.info("Input file already has xAOD trigger metadata. Will not re-create it.") @@ -166,8 +130,6 @@ class TriggerConfigGetter(Configured): metadata. """ - # Get a logger: - log = logging.getLogger( "TriggerConfigGetter.py" ) log.info( "ESD/AOD writing enabled, will set up xAOD trigger " "configuration metadata writing" ) @@ -216,17 +178,3 @@ class TriggerConfigGetter(Configured): acc.merge( HLTPrescaleCondAlgCfg( ConfigFlags ) ) appendCAtoAthena( acc ) - # Set up the metadata for the output ESD and AOD: - from RecExConfig.ObjKeyStore import objKeyStore - metadataItems = [ "xAOD::TriggerMenuJsonContainer#MenuJSON_HLT", - "xAOD::TriggerMenuJsonAuxContainer#MenuJSON_HLTAux.", - "xAOD::TriggerMenuJsonContainer#MenuJSON_L1", - "xAOD::TriggerMenuJsonAuxContainer#MenuJSON_L1Aux.", - "xAOD::TriggerMenuJsonContainer#MenuJSON_HLTPS", - "xAOD::TriggerMenuJsonAuxContainer#MenuJSON_HLTPSAux.", - "xAOD::TriggerMenuJsonContainer#MenuJSON_L1PS", - "xAOD::TriggerMenuJsonAuxContainer#MenuJSON_L1PSAux.", - # "xAOD::TriggerMenuJsonContainer#MenuJSON_BG", // TODO - # "xAOD::TriggerMenuJsonAuxContainer#MenuJSON_BGAux.", // TODO - ] - objKeyStore.addManyTypesMetaData( metadataItems ) diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerFlags.py index d76aca8cab140a747b6e6b37ad4c03e8f7589d13..f1aedfd3d129b24cdf70442315a6eee09c629866 100644 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerFlags.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerFlags.py @@ -64,31 +64,13 @@ class configForStartup(JobProperty): """ A temporary flag to determine the actions to be taken for the different cases of HLT running in the startup phase""" statusOn=True allowedType=['string'] - StoredValue = 'HLTonline' - - allowedValues = [ - 'HLTonline', - 'HLToffline' - ] + StoredValue = None + def _do_action(self): + log.warning("TriggerFlags.configForStartup is deprecated. Remove it from your configuration.") _flags.append(configForStartup) -class dataTakingConditions(JobProperty): - """ A flag that describes the conditions of the Trigger at data taking, and determines which part of it will be processed in reconstruction.""" - statusOn=True - allowedType=['string'] - StoredValue = 'FullTrigger' - - allowedValues = [ - 'HltOnly', - 'Lvl1Only', - 'FullTrigger', - 'NoTrigger' - ] - -_flags.append(dataTakingConditions) - class triggerUseFrontier(JobProperty): """Flag determines if frontier should be used to connect to the oracle database, current default is False""" statusOn=True diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerRecoGetter.py b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerRecoGetter.py index 103c3bc46da85df21451df7c45c5e8dd3796a959..4d97a03436f50522841571556aa7c7cda77b5d60 100644 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerRecoGetter.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerRecoGetter.py @@ -1,18 +1,9 @@ # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration -from TriggerJobOpts.TriggerFlags import TriggerFlags +from RecExConfig.Configured import Configured from AthenaCommon.Logging import logging - log = logging.getLogger( "TriggerRecoGetter.py" ) -from RecExConfig.Configured import Configured - -def withLVL1(): - return TriggerFlags.dataTakingConditions()=='Lvl1Only' or TriggerFlags.dataTakingConditions()=='FullTrigger' - -def withHLT(): - return TriggerFlags.dataTakingConditions()=='HltOnly' or TriggerFlags.dataTakingConditions()=='FullTrigger' - class TriggerRecoGetter(Configured): _configured=True @@ -39,12 +30,12 @@ class TriggerRecoGetter(Configured): from AthenaConfiguration.ComponentAccumulator import appendCAtoAthena appendCAtoAthena(tdtAcc) - if withLVL1(): + if 'L1' in ConfigFlags.Trigger.availableRecoMetadata: log.info("configuring lvl1") from TriggerJobOpts.Lvl1ResultBuilderGetter import Lvl1ResultBuilderGetter lvl1 = Lvl1ResultBuilderGetter() # noqa: F841 - if withHLT(): + if 'HLT' in ConfigFlags.Trigger.availableRecoMetadata: log.info("configuring hlt") from TriggerJobOpts.HLTTriggerResultGetter import HLTTriggerResultGetter hlt = HLTTriggerResultGetter() # noqa: F841 diff --git a/Trigger/TriggerCommon/TriggerJobOpts/share/TriggerConfigCheckHLTpsk.py b/Trigger/TriggerCommon/TriggerJobOpts/share/TriggerConfigCheckHLTpsk.py deleted file mode 100644 index 467d36e391b9f2c1f5acdf5c2f0b65c5ce318af7..0000000000000000000000000000000000000000 --- a/Trigger/TriggerCommon/TriggerJobOpts/share/TriggerConfigCheckHLTpsk.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration -from AthenaCommon.Include import include, printfunc -include.block("TriggerJobOpts/TriggerConfigCheckHLTpsk.py") - -from AthenaCommon.Logging import logging -mlog = logging.getLogger( 'TriggerConfigCheckHLTpsk' ) ## get the logger - -runNumbers=[] -from AthenaCommon.AthenaCommonFlags import athenaCommonFlags -if len(athenaCommonFlags.BSRDOInput()) > 0 : - from PyUtils.MetaReaderPeeker import metadata - if 'runNumbers' in metadata: # online monitoring does not provide a run_number in the file metadata (hence the rest of this program will be skipped) - runNumbers = metadata['runNumbers'] - -if len(runNumbers)>0: - - #from RecExConfig.RecAlgsFlags import recAlgs - #from RecExConfig.RecFlags import rec - from TriggerJobOpts.TriggerFlags import TriggerFlags - - ### Loop over the input files and find if a problematic one is there. - ### If so, turn off the trigger. - from PyCool import cool - from CoolConvUtilities.AtlCoolLib import indirectOpen - - # get connection to COOL and find the HLT ps key - - from IOVDbSvc.CondDB import conddb - coolDbConn = indirectOpen("COOLONL_TRIGGER/%s" % conddb.dbdata,oracle=True) - hltfolder=coolDbConn.getFolder('/TRIGGER/HLT/PrescaleKey') - lvl1folder=coolDbConn.getFolder('/TRIGGER/LVL1/Lvl1ConfigKey') - chansel = cool.ChannelSelection(0,0,cool.ChannelSelection.sinceBeforeChannel) - - needToTurnOffHLT = False - needToTurnOffLVL1 = False - for RunNumber in runNumbers: - # translate to begin and end IOV - iovmin=(RunNumber << 32)+0 - iovmax=((RunNumber+1) << 32)-1 - # read info from COOL - hltobjs = hltfolder.browseObjects( iovmin, iovmax, chansel) - allHltpsks = [] - while hltobjs.goToNext(): - obj=hltobjs.currentRef() - ch = obj.channelId() - hltpsk = int(obj.payloadValue("HltPrescaleKey")) # By default is a string - allHltpsks += [hltpsk] - mlog.info("HLT prescale keys for run %d are %r ", RunNumber, allHltpsks) - if len(allHltpsks) == 0: - needToTurnOffHLT = True - - # same thing for lvl1 - allLvl1psks = [] - lvl1objs = lvl1folder.browseObjects( iovmin, iovmax, chansel) - while lvl1objs.goToNext(): - obj=lvl1objs.currentRef() - ch = obj.channelId() - lvl1psk = int(obj.payloadValue("Lvl1PrescaleConfigurationKey")) - allLvl1psks += [lvl1psk] - mlog.info("LVL1 prescale keys for run %d are %r ", RunNumber, allLvl1psks) - if len(allLvl1psks) == 0: - needToTurnOffLVL1 = True - - if needToTurnOffHLT and needToTurnOffLVL1: - mlog.error("At least one run (%r) does not contain any trigger information in cool. " - "Turning off trigger [rec.doTrigger=False, and TriggerFlags.dataTakingConditions='NoTrigger']", - runNumbers) - TriggerFlags.dataTakingConditions='NoTrigger' - from RecExConfig.RecFlags import rec - rec.doTrigger=False - if 'DQMonFlags' not in dir(): - printfunc ("TriggerJobOpts/TriggerConfigCheckHLTpsk.py: DQMonFlags not yet imported - I import them now") - from AthenaMonitoring.DQMonFlags import DQMonFlags - DQMonFlags.doHLTMon.set_Value_and_Lock(False) - DQMonFlags.useTrigger.set_Value_and_Lock(False) - DQMonFlags.doLVL1CaloMon.set_Value_and_Lock(False) - DQMonFlags.doCTPMon.set_Value_and_Lock(False) - - elif needToTurnOffHLT: - mlog.warning("ERROR At least one run (%r) does not contain HLT information", runNumbers) - mlog.warning("turning off hlt [rec.doTrigger=True and TriggerFlags.dataTakingConditions='Lvl1Only'].") - TriggerFlags.dataTakingConditions='Lvl1Only' - if 'DQMonFlags' not in dir(): - printfunc ("TriggerJobOpts/TriggerConfigCheckHLTpsk.py: DQMonFlags not yet imported - I import them now") - from AthenaMonitoring.DQMonFlags import DQMonFlags - DQMonFlags.doHLTMon.set_Value_and_Lock(False) - DQMonFlags.useTrigger.set_Value_and_Lock(False) - - elif needToTurnOffLVL1: - mlog.warning("ERROR At least one run (%r) does not contain LVL1 information", runNumbers) - mlog.warning("turning off lvl1 [rec.doTrigger=True and TriggerFlags.dataTakingConditions='HltOnly'].") - TriggerFlags.dataTakingConditions='HltOnly' - if 'DQMonFlags' not in dir(): - printfunc ("TriggerJobOpts/TriggerConfigCheckHLTpsk.py: DQMonFlags not yet imported - I import them now") - from AthenaMonitoring.DQMonFlags import DQMonFlags -# DQMonFlags.doHLTMon.set_Value_and_Lock(False) - DQMonFlags.useTrigger.set_Value_and_Lock(False) - DQMonFlags.doLVL1CaloMon.set_Value_and_Lock(False) - DQMonFlags.doCTPMon.set_Value_and_Lock(False) - - - coolDbConn.closeDatabase() - diff --git a/Trigger/TriggerCommon/TriggerJobOpts/share/TriggerConfigCheckMetadata.py b/Trigger/TriggerCommon/TriggerJobOpts/share/TriggerConfigCheckMetadata.py deleted file mode 100644 index 1496a80e29639d37c4acef6e94501d1f59cb4fde..0000000000000000000000000000000000000000 --- a/Trigger/TriggerCommon/TriggerJobOpts/share/TriggerConfigCheckMetadata.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration - -from AthenaCommon.Include import include, printfunc -include.block("TriggerJobOpts/TriggerConfigCheckMetadata.py") - -from AthenaCommon.AthenaCommonFlags import athenaCommonFlags -from AthenaCommon.GlobalFlags import globalflags -from AthenaCommon.Logging import logging -from RecExConfig.RecFlags import rec -from TriggerJobOpts.TriggerFlags import TriggerFlags - -log = logging.getLogger( "TriggerConfigCheckMetadata.py" ) - -if len(athenaCommonFlags.PoolESDInput())>0 or len(athenaCommonFlags.PoolAODInput())>0 : - from PyUtils.MetaReaderPeekerFull import metadata - if 'DQMonFlags' not in dir(): - printfunc ("DataQualityMon_RecExCommon_Flags_jobOptions.py: DQMonFlags not yet imported - I import them now") - from AthenaMonitoring.DQMonFlags import DQMonFlags - - if len(metadata) > 0: - hasLVL1 = any(('/TRIGGER/LVL1/Lvl1ConfigKey' in key or 'TriggerMenu' in key) for key in metadata["metadata_items"].keys()) - hasHLT = any(('/TRIGGER/HLT/HltConfigKeys' in key or 'TriggerMenu' in key) for key in metadata["metadata_items"].keys()) - - if globalflags.DataSource()=='data': - if hasLVL1 and not hasHLT: - log.error("This pool file does not contain HLT trigger information ") - log.info("Disabling HLT monitoring, trigger aware DQMonitoring and trigger ntuples.") - TriggerFlags.dataTakingConditions.set_Value_and_Lock('Lvl1Only') - DQMonFlags.doHLTMon.set_Value_and_Lock(False) # now that some hltmon moved to ESDtoAOD - DQMonFlags.useTrigger.set_Value_and_Lock(False) - - if hasHLT and not hasLVL1: - log.error("This pool file does not contain LVL1 trigger information ") - log.info("Disabling trigger ntuples and trigger aware DQMonitoring but not HLT monitoring.") - TriggerFlags.dataTakingConditions.set_Value_and_Lock('HltOnly') - DQMonFlags.useTrigger.set_Value_and_Lock(False) - DQMonFlags.doLVL1CaloMon.set_Value_and_Lock(False) - DQMonFlags.doCTPMon.set_Value_and_Lock(False) - try: - from MuonDQAMonFlags.MuonDQAProperFlags import MuonDQADetFlags - MuonDQADetFlags.doTGCL1Mon.set_Value_and_Lock(False) - MuonDQADetFlags.doTGCMon.set_Value_and_Lock(False) - log.warning("Turning off TgcLv1RawMonitoring because lvl1 info is missing") - except Exception: - from AthenaCommon.Resilience import treatException - treatException("Could not import MuonDQADetFlags") - - if not hasHLT and not hasLVL1: - log.error("This pool file does not contain any trigger information ") - log.info("Disabling HLT monitoring and trigger aware DQMonitoring and trigger ntuples.") - TriggerFlags.dataTakingConditions.set_Value_and_Lock('NoTrigger') - rec.doTrigger.set_Value_and_Lock(False) - DQMonFlags.doHLTMon.set_Value_and_Lock(False) - DQMonFlags.useTrigger.set_Value_and_Lock(False) - DQMonFlags.doLVL1CaloMon.set_Value_and_Lock(False) - DQMonFlags.doCTPMon.set_Value_and_Lock(False) - try: - from MuonDQAMonFlags.MuonDQAProperFlags import MuonDQADetFlags - MuonDQADetFlags.doTGCL1Mon.set_Value_and_Lock(False) - MuonDQADetFlags.doTGCMon.set_Value_and_Lock(False) - log.warning("Turning off TgcLv1RawMonitoring because all trigger info is missing") - except Exception: - from AthenaCommon.Resilience import treatException - treatException("Could not import MuonDQADetFlags") - - else: - if hasLVL1 and not hasHLT: - log.info("This pool file does not contain HLT trigger information ") - TriggerFlags.dataTakingConditions.set_Value_and_Lock('Lvl1Only') - - if hasHLT and not hasLVL1: - log.info("This pool file does not contain LVL1 trigger information ") - TriggerFlags.dataTakingConditions.set_Value_and_Lock('HltOnly') - - if not hasHLT and not hasLVL1: - log.info("This pool file does not contain any trigger information, setting rec.doTrigger to False") - TriggerFlags.dataTakingConditions.set_Value_and_Lock('NoTrigger') - rec.doTrigger.set_Value_and_Lock(False) - - else: - log.warning("Either file(s) does not have key 'metadata' or something strange is happening.") -else: - log.warning("Wrong flags setting for pool input, try calling TriggerConfigGetter with 'ReadPool' or 'WritePool' as argument.")