diff --git a/Trigger/TriggerCommon/TriggerJobOpts/CMakeLists.txt b/Trigger/TriggerCommon/TriggerJobOpts/CMakeLists.txt index a29d3c9b4be7a71c5eaeabe52d76e4163bc80737..83b7754a54917f67aa866998a7332b4ef0cf81b8 100644 --- a/Trigger/TriggerCommon/TriggerJobOpts/CMakeLists.txt +++ b/Trigger/TriggerCommon/TriggerJobOpts/CMakeLists.txt @@ -12,6 +12,7 @@ atlas_depends_on_subdirs( PUBLIC # Install files from the package: atlas_install_python_modules( python/*.py ) +atlas_install_scripts( test/*.py ) atlas_install_joboptions( share/*.py ) atlas_add_test( TriggerConfigFlagsTest diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py index 989f216b4f6e04d23a1c4433d3f883b2eff9c65d..ce120c44cc7bbf65c5b031af4ba5c991d406c199 100644 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerConfigFlags.py @@ -1,10 +1,12 @@ # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration from AthenaConfiguration.AthConfigFlags import AthConfigFlags +from AthenaCommon.Logging import logging +log=logging.getLogger('TriggerConfigFlags') def createTriggerFlags(): + flags = AthConfigFlags() - flags = AthConfigFlags() # enables L1 simulation flags.addFlag('Trigger.doLVL1', lambda prevFlags: prevFlags.Input.isMC) @@ -31,8 +33,70 @@ def createTriggerFlags(): flags.addFlag('Trigger.decodePhaseIL1', False) # if 1, Run1 decoding version is set; if 2, Run2; if 3, Run 3 - flags.addFlag('Trigger.EDMDecodingVersion', 3) - + def EDMDecodingVersion(flags): + log.debug("Attempting to determine EDMDecodingVersion.") + version = 3 + if flags.Input.Format=="BS": + log.debug("EDMDecodingVersion: Input format is ByteStream") + inputFileName = flags.Input.Files[0] + if not inputFileName and flags.Common.isOnline(): + log.debug("EDMDecodingVersion: Online reconstruction, no input file. Return default version, i.e. AthenaMT.") + return version + + log.debug("EDMDecodingVersion: Checking ROD version.") + 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("EDMDecodingVersion: HLT ROD minor version from input file is {:d}.{:d}".format(rodVersionM, rodVersionL)) + break + + if rodVersionM >= 1: + version = 3 + return version + log.info("EDMDecodingVersion: Could not determine ROD version -- falling back to run-number-based determination") + + # Use run number to determine decoding version + runNumber = flags.Input.RunNumber[0] + log.debug("EDMDecodingVersion: Read run number {}.".format(runNumber)) + + boundary_run12 = 230000 + boundary_run23 = 368000 + + if runNumber <= 0: + log.warning("EDMDecodingVersion: Cannot determine decoding version because run number {} is invalid. Leaving the default version.".format(runNumber)) + elif runNumber < boundary_run12: + # Run-1 data + version = 1 + elif runNumber < boundary_run23: + # Run-2 data + version = 2 + else: + # Run-3 data + version = 3 + else: + log.debug("EDMDecodingVersion: Input format is POOL -- determine from input file collections.") + # POOL files: decide based on HLT output type present in file + if "HLTResult_EF" in flags.Input.Collections: + version = 1 + elif "TrigNavigation" in flags.Input.Collections: + version = 2 + elif "HLTNav_Summary" in flags.Input.Collections: + version = 3 + elif flags.Input.Format == "RDO": + # If running Trigger on RDO input (without previous trigger result), choose Run-3 + version = 3 + log.info("Determined EDMDecodingVersion to be {}.".format({1:"Run 1", 2:"Run 2", 3:"AthenaMT"}[version])) + return version + flags.addFlag('Trigger.EDMDecodingVersion', lambda prevFlags: EDMDecodingVersion(prevFlags)) + # enables additional algorithms colecting MC truth infrmation (this is only used by IDso maybe we need Trigger.ID.doTruth only?) flags.addFlag('Trigger.doTruth', False) diff --git a/Trigger/TriggerCommon/TriggerJobOpts/test/test_TriggerFlags_autoconf.py b/Trigger/TriggerCommon/TriggerJobOpts/test/test_TriggerFlags_autoconf.py new file mode 100755 index 0000000000000000000000000000000000000000..3e422d56011b602ad80d8f7d1dec13fcde127855 --- /dev/null +++ b/Trigger/TriggerCommon/TriggerJobOpts/test/test_TriggerFlags_autoconf.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +# Test of Trigger config flags autoconfiguration +# Exercised on BS data and MC POOL file formats + +from AthenaCommon.Logging import logging +log=logging.getLogger('test_TriggerFlags_autoconf') + +import os, glob +artdir = "/eos/atlas/atlascerngroupdisk/data-art/build-output/master/Athena/x86_64-centos7-gcc8-opt/" +nightly = os.listdir(artdir)[-2] # don't take the latest; this may still be running +nightlydir = artdir+nightly+"/" + +def getRun2MCFile(): + filen = "myAOD.pool.root" + artdir_21 = "/eos/atlas/atlascerngroupdisk/data-art/grid-output/21.0/Athena/x86_64-slc6-gcc62-opt/" + nightly_21 = os.listdir(artdir_21)[-2] # don't take the latest; this may still be running + if not os.path.isfile(filen): + tarball = glob.glob(artdir_21+nightly_21+"/Tier0ChainTests/test_q220/user.artprod.*.EXT1.*.tar")[0] + os.system("tar -xf {} {}".format(tarball,filen)) + return filen + +inputfiles = { + "Run1_Data": "/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigAnalysisTest/data12_8TeV.00209109.physics_JetTauEtmiss.merge.RAW._lb0186._SFO-1._0001.1", + "Run2_Data": "/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data18_13TeV.00360026.physics_EnhancedBias.merge.RAW._lb0151._SFO-1._0001.1", + "Run3_Data": nightlydir+"/TrigP1Test/test_trigP1_v1PhysP1_T0Mon_build/data18_13TeV.00360026.physics_Main.unknown.RAW._lb0151._athenaHLT._0001.data", + # + "Run2_MC_r21": nightlydir+"TrigAnalysisTest/test_trigAna_RDOtoAOD_build/AOD.pool.root", + "Run2_MC_r21": getRun2MCFile(), + # + "Run3_MC": nightlydir+"TrigAnalysisTest/test_trigAna_RDOtoAOD_mt1_build/AOD.pool.root", +} + +from TriggerJobOpts.TriggerConfigFlags import createTriggerFlags + +from AthenaCommon.Constants import DEBUG +from TriggerJobOpts.TriggerConfigFlags import log as tcf_log +tcf_log.setLevel(DEBUG) + +def test_TriggerFlags(sample): + + from AthenaConfiguration.AllConfigFlags import ConfigFlags + acf = ConfigFlags.clone() + acf.Input.Files = [inputfiles[sample]] + acf.addFlagsCategory("Trigger", createTriggerFlags) + + # Test EDMDecodingVersion + EDMDecode_ref = { + "Run1": 1, + "Run2": 2, + "Run3": 3 + }[sample[:4]] + log.info("EDMDecodingVersion: expected {}, configured {}".format(EDMDecode_ref, acf.Trigger.EDMDecodingVersion)) + assert( acf.Trigger.EDMDecodingVersion == EDMDecode_ref ) + + return + +if __name__=="__main__": + log.info("Testing TriggerConfigFlags autoconfiguration") + import sys + for sample in sorted(inputfiles.keys()): + run, source = sample.split('_',1) + log.info("{} {} input file: {}".format(run, source, inputfiles[sample])) + try: + test_TriggerFlags(sample) + except AssertionError as e: + sys.exit(1) + + log.info("Done with test") + sys.exit(0)