diff --git a/Trigger/TriggerCommon/TriggerMenu/CMakeLists.txt b/Trigger/TriggerCommon/TriggerMenu/CMakeLists.txt index 3e6a1e8098c3b82b16d01f13198eb1ff4ead9cff..40b7e5e6d0d8aa352a65c4eea07203b958191743 100644 --- a/Trigger/TriggerCommon/TriggerMenu/CMakeLists.txt +++ b/Trigger/TriggerCommon/TriggerMenu/CMakeLists.txt @@ -54,11 +54,6 @@ function( atlas_run_lowestunprescaled ) ${CMAKE_CURRENT_BINARY_DIR}/LowestUnprescaledLists/unprescaled COMMAND ${CMAKE_BINARY_DIR}/atlas_build_run.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/generateUnprescaledLists.py ${CMAKE_CURRENT_BINARY_DIR}/LowestUnprescaledLists/unprescaled - COMMAND ${CMAKE_COMMAND} -E make_directory - ${CMAKE_PYTHON_OUTPUT_DIRECTORY}/TriggerMenu - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${CMAKE_CURRENT_BINARY_DIR}/LowestUnprescaledLists/unprescaled/ - ${CMAKE_PYTHON_OUTPUT_DIRECTORY}/TriggerMenu/api/ COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/unprescaled.stamp DEPENDS "Package_$<JOIN:$<TARGET_PROPERTY:ATLAS_PACKAGES_TARGET,ATLAS_PACKAGES>,;Package_>" ) diff --git a/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerAPI.py b/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerAPI.py index 88f82f294e977818ae88ddb07303d3c3b74c999b..574352a540db7030ca3b991da88034ca2bc47a30 100644 --- a/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerAPI.py +++ b/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerAPI.py @@ -17,6 +17,7 @@ class TriggerAPI: dbQueries = {} privatedbQueries = {} customGRL = None + release = None log = logging.getLogger( 'TriggerMenu.api.TriggerAPI.py' ) @classmethod @@ -41,6 +42,14 @@ class TriggerAPI: except IOError: pass + @classmethod + def setRelease(cls, release): + import re + if release and re.match('21\.1(\.[0-9]+)+$',release): + cls.release = release + else: + cls.log.warning("Release doesn't seem to be a well-formed 21.1 release, ignoring: "+release) + @classmethod def setCustomGRL(cls, grl): if TriggerInfo.testCustomGRL(grl): @@ -145,7 +154,7 @@ class TriggerAPI: if not period & TriggerPeriod.future: cls.init() if (period,cls.customGRL) not in cls.dbQueries: if TriggerPeriod.isRunNumber(period) or (isinstance(period,TriggerPeriod) and period.isBasePeriod()): - cls.dbQueries[(period,cls.customGRL)] = TriggerInfo(period,cls.customGRL) + cls.dbQueries[(period,cls.customGRL)] = TriggerInfo(period,cls.customGRL,cls.release) cls.privatedbQueries[(period,cls.customGRL)] = cls.dbQueries[(period,cls.customGRL)] if not period & TriggerPeriod.future or TriggerPeriod.isRunNumber(period): #Don't pickle TM information since it can change, very cheap to retrieve anyway diff --git a/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerDataAccess.py b/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerDataAccess.py index f8857c04a7b9e6f47b5e6de434a97ee5974f8f29..46d88ced6c74ff7743371f7581b91561d307e2ca 100644 --- a/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerDataAccess.py +++ b/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerDataAccess.py @@ -289,12 +289,20 @@ def getHLTmap_fromDB(period, customGRL): return hltMap, lbCount -def getHLTmap_fromTM(period): +def getHLTmap_fromTM(period, release): ''' Return a map of HLT chain: (L1 seed, active LBs, is-rerun) for a given period Only "Future" periods make sense here The format is the same as for TriggerDBAccess for compatibility but rerun is always false ''' - from TriggerMenu.menu import Physics_pp_v7 + + from os import getenv + asetupversion = getenv('AtlasVersion','') + forceRel21 = not (asetupversion.startswith("21.1") or asetupversion.startswith("22.")) + if forceRel21 or release: + sys.path.insert(0, getMenuPathFromRelease(release)) + import Physics_pp_v7 + else: + from TriggerMenu.menu import Physics_pp_v7 from TriggerJobOpts.TriggerFlags import TriggerFlags Physics_pp_v7.setupMenu() @@ -322,7 +330,14 @@ def getHLTmap_fromTM(period): return hltMap, dummyfutureLBs -def getHLTlist(period, customGRL): +def getMenuPathFromRelease(release): + if release: #already format-proofed in TriggerAPI + return "/cvmfs/atlas.cern.ch/repo/sw/software/21.1/AthenaP1/%s/InstallArea/x86_64-slc6-gcc62-opt/python/TriggerMenu/menu"%release + #21.1.43 contains the final menu, no need to find the last release + return "/cvmfs/atlas.cern.ch/repo/sw/software/21.1/AthenaP1/21.1.43/InstallArea/x86_64-slc6-gcc62-opt/python/TriggerMenu/menu" + + +def getHLTlist(period, customGRL, release): ''' For a given period it returns: [HLT chain, L1 seed, average livefraction, active LB, is-rerun], total LB The average livefraction is an approximation weighting the PS by number of lumiblocks. *** Don't use this number in analysis!!! *** @@ -331,7 +346,7 @@ def getHLTlist(period, customGRL): if not period & TriggerPeriod.future or TriggerPeriod.isRunNumber(period): hltmap, totalLB = getHLTmap_fromDB(period, customGRL) else: - hltmap, totalLB = getHLTmap_fromTM(period) + hltmap, totalLB = getHLTmap_fromTM(period, release) hltlist = cleanHLTmap(hltmap, totalLB) return (hltlist, totalLB) diff --git a/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerInfo.py b/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerInfo.py index 01ef36d206606805426fb29aed15647995165e04..6bf5236d1da820d5333fffa84137cedad07c72cb 100644 --- a/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerInfo.py +++ b/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerInfo.py @@ -10,14 +10,14 @@ class TriggerInfo: ''' Object containing all the HLT information related to a given period. Stores a list of TriggerChain objects and the functions to skim them ''' - def __init__(self,period=0, customGRL=None): + def __init__(self,period=0, customGRL=None, release=None): self.triggerChains = [] self.period = period self.totalLB = 0 if not period: return from TriggerDataAccess import getHLTlist - HLTlist, totalLB = getHLTlist(period, customGRL) + HLTlist, totalLB = getHLTlist(period, customGRL, release) self.totalLB = totalLB for hlt, l1, livefraction, activeLB, hasRerun in HLTlist: self.triggerChains.append( TriggerChain(hlt, l1, livefraction, activeLB, hasRerun)) @@ -95,8 +95,8 @@ class TriggerInfo: class TriggerLeg: types = ('e','j','mu','tau','xe','g','ht') legpattern = re.compile('([0-9]*)(%s)([0-9]+)' % '|'.join(types)) - detailpattern = re.compile('(?:-?\d+)|(?:[^0-9|-]+)') - bjetpattern = re.compile('bmv|btight|bmedium|bloose') + detailpattern = re.compile('(?:-?\d+)|(?:[^0-9 -]+)') #split into text-only vs number-only + bjetpattern = re.compile('bmv|bhmv|btight|bmedium|bloose') bphyspattern = re.compile('b[A-Z]') exoticspattern = re.compile('llp|LLP|muvtx|hiptrt|LATE|NOMATCH') afppattern = re.compile('afp|AFP') @@ -224,7 +224,7 @@ class TriggerLeg: return 1 return -9 compl1seed = self.compareTags(self.l1seed, other.l1seed, stringSubset=True, debug=debug) - compdetails = self.compareTags("".join(self.details), "".join(other.details), debug=debug ) + compdetails = self.compareTags(" ".join(self.details), " ".join(other.details), debug=debug ) if self.l1seed == other.l1seed: if self.details == other.details: return -1 if debug: print "compareTags 1:",compdetails diff --git a/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py b/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py index aa721712ba5c5757f158273e8ff7639342d4dcdc..8743141cb8b9d387b2e282deeb6bf55c0d329318 100644 --- a/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py +++ b/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py @@ -3117,11 +3117,11 @@ def setupMenu(): ['e25_mergedtight_g35_medium_icalovloose_Heg', 'L1_2EM20VH', [], [PhysicsStream], ['RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]], ['e25_mergedtight_g35_medium_icalotight_Heg', 'L1_2EM20VH', [], [PhysicsStream], ['RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]], ['e25_mergedtight_ivarloose_g35_medium_icalovloose_Heg', 'L1_2EM20VH', [], [PhysicsStream], ['Primary:20000','RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]], - ['e25_mergedtight_ivarloose_g35_medium_icalotight_Heg', 'L1_2EM20VH', [], [PhysicsStream], ['RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]], + ['e25_mergedtight_ivarloose_g35_medium_icalotight_Heg', 'L1_2EM20VH', [], [PhysicsStream], ['Primary:20000','RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]], ['e30_mergedtight_g35_medium_icalovloose_Heg', 'L1_2EM20VH', [], [PhysicsStream], ['RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]], ['e30_mergedtight_g35_medium_icalotight_Heg', 'L1_2EM20VH', [], [PhysicsStream], ['RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]], - ['e30_mergedtight_ivarloose_g35_medium_icalotight_Heg', 'L1_2EM20VH', [], [PhysicsStream], ['RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]], + ['e30_mergedtight_ivarloose_g35_medium_icalotight_Heg', 'L1_2EM20VH', [], [PhysicsStream], ['Primary:20000','RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]], # new chain for 2e34 backup (ATR-15225) ['e24_lhmedium_nod0_ivarloose_tau35_medium1_tracktwo', 'L1_EM20VHI_TAU20IM_2TAU20_J25_3J20',['L1_EM20VHI','L1_TAU20IM'], [PhysicsStream], ['Primary:20000','RATE:ElectronTau', 'BW:Tau', 'BW:Egamma'], -1,['serial',-1,["e24_lhmedium_nod0_ivarloose","tau35_medium1_tracktwo"]]], diff --git a/Trigger/TriggerCommon/TriggerMenu/scripts/generateUnprescaledLists.py b/Trigger/TriggerCommon/TriggerMenu/scripts/generateUnprescaledLists.py index c55787993d9b1cd9b60bccc4412d7f8bc3e87e76..9f474b74489a041c4ba6ad1d59717a07e8fe6f13 100755 --- a/Trigger/TriggerCommon/TriggerMenu/scripts/generateUnprescaledLists.py +++ b/Trigger/TriggerCommon/TriggerMenu/scripts/generateUnprescaledLists.py @@ -19,7 +19,7 @@ def main(outfolder): outfile.write( to_nice_list( TriggerAPI.getUnprescaled(TriggerPeriod.future2e34, triggerType), triggerType.name ) ) def to_nice_list( alist, name ): - thestr = "list_%s = [\n"%name + thestr = "%s = [\n"%name for i in alist: thestr += "\t'%s',\n"%i thestr += "]\n\n"