Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
TriggerAPI.py 5.77 KiB
# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
__author__  = 'Javier Montejo'
__version__="$Revision: 1.01 $"
__doc__="Interface to retrieve lists of unprescaled triggers according to types and periods"

import sys, pickle
from TriggerMenu.api.TriggerInfo import TriggerInfo
from TriggerMenu.api.TriggerEnums import TriggerPeriod, TriggerType

class TriggerAPI:
    centralPickleFile = "/afs/cern.ch/user/j/jmontejo/public/TriggerInfo.pickle" #FIXME
    privatePickleFile = "TriggerInfo.pickle"
    try:
        with open(centralPickleFile, 'r') as f:
            print "Reading cached information"
            dbQueries = pickle.load(f)
    except Exception as e:
        print "Reading cached information failed, please report to jmontejo@cern.ch"
        dbQueries = {}
    try:
        with open(privatePickleFile, 'r') as f:
            print "DEBUG OPEN:",centralPickleFile
            tmpdbQueries = pickle.load(f)
            dbQueries.update(tmpdbQueries)
    except Exception as e:
        pass

    @classmethod
    def getLowestUnprescaled(cls, period, triggerType=TriggerType.ALL, additionalTriggerType=TriggerType.UNDEFINED, matchPattern="", reparse=False):
        ''' Returns a list of the lowest-pt-threshold HLT chains that were always unprescaled in the given period.
            period: see TriggerEnums.TriggerPeriod for all possibilities, recommeded TriggerPeriod.y2017
            triggerType: see TriggerEnums.TriggerType for all possibilities, example TriggerType.el_single
            additionalTriggerType: can request additional types, use TriggerType.ALL to show combined triggers of any kind
            matchPattern: provide additionally a regex-like expression to be applied
        '''
        cls._loadTriggerPeriod(period,reparse)
        return cls.dbQueries[period]._getLowestUnprescaled(triggerType, additionalTriggerType, matchPattern)
    
    @classmethod
    def getLowestUnprescaledAnyPeriod(cls, period, triggerType=TriggerType.ALL, additionalTriggerType=TriggerType.UNDEFINED, matchPattern="", reparse=False):
        ''' Returns a list of the lowest-pt-threshold HLT chains that were unprescaled in at least one of 
            the subperiods within the given period. The lowest granularity can be seen in TriggerEnums.TriggerPeriod
            period: see TriggerEnums.TriggerPeriod for all possibilities, recommeded TriggerPeriod.y2017
            triggerType: see TriggerEnums.TriggerType for all possibilities, example TriggerType.el_single
            additionalTriggerType: can request additional types to match, use TriggerType.ALL to show combined triggers of any kind
                                   accepts also a list as input in that case all types have to match
            matchPattern: provide additionally a regex-like expression to be applied
        '''
        lowset = set()
        for i, ibin in enumerate(reversed(bin(period)[2:])): #to binary
            ibin = int(ibin)
            if not ibin: continue
            subperiod = 2**i
            cls._loadTriggerPeriod(subperiod, reparse)
            subperiodset = set( cls.dbQueries[subperiod]._getLowestUnprescaled(triggerType, additionalTriggerType, matchPattern) )
            lowset |= subperiodset
        return list(lowset)
    
    @classmethod
    def getUnprescaled(cls, period, triggerType=TriggerType.ALL, additionalTriggerType=TriggerType.UNDEFINED, matchPattern="", reparse=False):
        ''' Returns a list of always-unprescaled HLT chains, including backup items with higher thresholds.
            period: see TriggerEnums.TriggerPeriod for all possibilities, recommeded TriggerPeriod.y2017
            triggerType: see TriggerEnums.TriggerType for all possibilities, example TriggerType.el_single
            additionalTriggerType: can request additional types, use TriggerType.ALL to show combined triggers of any kind
            matchPattern: provide additionally a regex-like expression to be applied
        '''
        cls._loadTriggerPeriod(period,reparse)
        return cls.dbQueries[period]._getUnprescaled(triggerType, additionalTriggerType, matchPattern)
        
    @classmethod
    def getAllHLT(cls, period, triggerType=TriggerType.ALL, additionalTriggerType=TriggerType.UNDEFINED, matchPattern="", reparse=False):
        ''' Returns a map of {HLT chains: average live fraction} for a given period.
            The average live fraction is an approximation weighting the number of lumiblocks by prescale.
            *** Don't use this number in analysis!!! ***
            period: see TriggerEnums.TriggerPeriod for all possibilities, recommeded TriggerPeriod.y2017
            triggerType: see TriggerEnums.TriggerType for all possibilities, example TriggerType.el_single
            additionalTriggerType: can request additional types, use TriggerType.ALL to show combined triggers of any kind
            matchPattern: provide additionally a regex-like expression to be applied
        '''
        cls._loadTriggerPeriod(period,reparse)
        return cls.dbQueries[period]._getAllHLT(triggerType, additionalTriggerType, matchPattern)

    @classmethod
    def _loadTriggerPeriod(cls, period, reparse):
        if period not in cls.dbQueries:
            cls.dbQueries[period] = TriggerInfo(period)
            if not period & TriggerPeriod.future or period >= TriggerPeriod.runNumber: 
                #Don't pickle TM information since it can change, very cheap to retrieve anyway
                with open(cls.privatePickleFile, 'w') as f:
                    pickle.dump( cls.dbQueries , f)
        if reparse: cls.dbQueries[period].reparse()

def main():
    ''' Run some tests '''
    for triggerType in TriggerType:
        unprescaled = TriggerAPI.getLowestUnprescaled(332303,triggerType)
        print triggerType
        print sorted(unprescaled)

if __name__ == "__main__":
        sys.exit(main())