diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py b/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py index 3e90c9a187209c941ee7ff24bff0e2a23e45813a..7fb58271d707592a7a8eb2ca9167f6daf8cf65bd 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py @@ -182,14 +182,6 @@ print L1UnpackingSeq ########################## L1 ################################################# -# Cati's menu code -#print "=============== MEOW ================" -#include("TrigUpgradeTest/TriggerMenuMT.py") -#genMenu = GenerateMenu() -#genMenu.generate() -#print "=============== WOOF ================" - - # steps: sequential AND of 1=Filter 2=Processing # chainstep=single chain step # global step=joint for all chains diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/CombinedSliceFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/CombinedSliceFlags.py index 8d9879af3a6eb0a87b8619c710bbe8287e28067c..0f0fe9cfa2bcd2870b0e0eada358b87c8aa85c0d 100755 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/CombinedSliceFlags.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/CombinedSliceFlags.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration """ Combined slices specific flags """ diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/CommonSignatureFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/CommonSignatureFlags.py index 9e3b0d84be02c57af1ad683198defffc6c3158e1..f4136ef3e4229ccaa516df0e5d96973b9b3a4e64 100755 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/CommonSignatureFlags.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/CommonSignatureFlags.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration """ Common signature flags """ diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/EgammaSliceFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/EgammaSliceFlags.py index cca7d203f9bb0201fa7886d86fce24aca0bc9508..508225e48207d0e284d70fbb42ab13b194e0d677 100755 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/EgammaSliceFlags.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/EgammaSliceFlags.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration """ Egamma slice specific flags """ @@ -107,7 +107,7 @@ from TriggerJobOpts.TriggerFlags import TriggerFlags TriggerFlags.add_Container(EgammaSlice) # add common slice flags -TriggerFlags.EgammaSlice.import_JobProperties('TriggerMenu.menu.CommonSliceFlags') +#TriggerFlags.EgammaSlice.import_JobProperties('TriggerJobOpts.CommonSingatureFlags') for flag in _flags: TriggerFlags.EgammaSlice.add_JobProperty(flag) diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/JetSliceFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/JetSliceFlags.py index 59a60e1e293e54abb0c15e35c32c944863d98d85..d6d4220bd35731373e3b62973c330d9503c73560 100644 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/JetSliceFlags.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/JetSliceFlags.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration """ Jet slice specific flags """ @@ -27,7 +27,7 @@ from TriggerJobOpts.TriggerFlags import TriggerFlags TriggerFlags.add_Container(JetSlice) # add add common slice flags -TriggerFlags.JetSlice.import_JobProperties('TriggerJobOpts.CommonSignatureFlags') +#TriggerFlags.JetSlice.import_JobProperties('TriggerJobOpts.CommonSignatureFlags') for flag in _flags: TriggerFlags.JetSlice.add_JobProperty(flag) diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/MuonSliceFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/MuonSliceFlags.py index 16f08fa34212ab2b7e1d139e0c36a00cacccd6f6..2e7362ef4ac62f20e9f7e1a21a35a5a5d78f38bb 100755 --- a/Trigger/TriggerCommon/TriggerJobOpts/python/MuonSliceFlags.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/MuonSliceFlags.py @@ -1,8 +1,8 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration """ Muon slice specific flags """ -from AthenaCommon.JobProperties import JobProperty, JobPropertyContainer, jobproperties +from AthenaCommon.JobProperties import JobProperty, JobPropertyContainer, jobproperties from TriggerJobOpts.CommonSignatureHelper import CommonSignatureHelper @@ -53,7 +53,7 @@ from TriggerJobOpts.TriggerFlags import TriggerFlags TriggerFlags.add_Container(MuonSlice) # add add common slice flags -TriggerFlags.MuonSlice.import_JobProperties('TriggerMenu.menu.CommonSliceFlags') +#TriggerFlags.MuonSlice.import_JobProperties('TriggerJobOpts.CommonSignatureFlags') for flag in _flags: TriggerFlags.MuonSlice.add_JobProperty(flag) diff --git a/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt b/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt index e659e3f28db8952155114291fa46ba4ebe1b6bf7..9f3f3365f844b0d1a8a3a54ae4f14b5ae1f91c2f 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt +++ b/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt @@ -110,7 +110,7 @@ atlas_install_scripts( scripts/generateL1TopoMenuMT.py ) atlas_install_xmls( data/*.dtd data/*.xml ) -#atlas_add_test( generateMenuMT SCRIPT scripts/testMenuMT.sh +#atlas_add_test( generateMenuMT SCRIPT scripts/generateMenuMT.sh # PROPERTIES TIMEOUT 500 # POST_EXEC_SCRIPT "check_log.pl --config checklogTriggerTest.conf generateMenuMT.log" # ) @@ -122,6 +122,16 @@ atlas_add_test( generateMenuMT_newJO SCRIPT python -m TriggerMenuMT.HLTMenuConfi +#file( MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unitTestRun_generateMenu ) +#atlas_add_test( generateMenu +# SCRIPT scripts/test_HLTmenu.sh +# EXTRA_PATTERNS "-s TriggerSummaryStep.*HLT_.*|TriggerMonitorFinal.*HLT_.*|TrigSignatureMoniMT.*HLT_.*" +# PROPERTIES TIMEOUT 500 +# PROPERTIES WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unitTestRun_generateMenu +# ) + + + #---------------------------------- # List of menus to be created: atlas_build_lvl1_trigger_menu( LS2_v1 ) diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/ElectronDef.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/ElectronDef.py new file mode 100644 index 0000000000000000000000000000000000000000..a5b804e581b4a485d21b34a75c4dfb4ac7b605c2 --- /dev/null +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/ElectronDef.py @@ -0,0 +1,74 @@ +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + +from AthenaCommon.Logging import logging +logging.getLogger().info("Importing %s",__name__) +log = logging.getLogger("TriggerMenuMT.HLTMenuConfig.Egamma.ElectronDef") + + +from TrigUpgradeTest.electronMenuDefs import fastCaloSequence, electronSequence +from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import Chain, ChainStep +from TriggerMenuMT.HLTMenuConfig.Menu.TriggerConfigHLT import TriggerConfigHLT + +class Chain_electron: + + def __init__(self, chainDict): + + self.chainSteps = [] + + self.chainPart = chainDict['chainParts'] + self.chainName = chainDict['chainName'] + self.chainL1Item = chainDict['L1item'] + self.chainPartL1Item = self.chainPart['L1item'] + self.mult = int(self.chainPart['multiplicity']) + self.chainPartName = self.chainPart['chainPartName'] + self.chainPartNameNoMult = self.chainPartName[1:] if self.mult > 1 else self.chainPartName + self.chainPartNameNoMult += "_"+self.chainL1Item + + + def assembleChain(self): + myStepNames = [] + chainSteps = [] + if 'etcut' in self.chainName: + myStepNames += ["Step1_etcut"] + myStepNames += ["Step2_etcut"] + + for step in myStepNames: + chainSteps += [self.getStep(step)] + + + self.chainSteps = chainSteps + myChain = Chain(name = 'HLT_'+self.chainName, + Seed = self.chainL1Item, + ChainSteps = self.chainSteps) + return myChain + + + def getFastCaloStep(self, stepName): + fastCaloStep= fastCaloSequence() + step1=ChainStep(stepName, [fastCaloStep]) + return step1 + + def getElectronStep(self, stepName): + electronStep= electronSequence() + step2=ChainStep(stepName, [electronStep]) + return step2 + + def getStep(self, name): + myTriggerConfigHLT = TriggerConfigHLT.currentTriggerConfig() + if name in myTriggerConfigHLT.allChainSteps: + return myTriggerConfigHLT.allChainSteps[name] + log.debug("ChainStep has not been configured so far, add to the list!") + if name == "Step1_etcut": + chainStep = self.getFastCaloStep(name) + elif name == "Step2_etcut": + chainStep = self.getElectronStep(name) + else: + raise RuntimeError("chainStepName unknown: " + name ) + + myTriggerConfigHLT.allChainSteps[name]= chainStep + return chainStep + + + + + diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/generateElectronChainDefs.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/generateElectronChainDefs.py new file mode 100644 index 0000000000000000000000000000000000000000..84bc075d92fd3e27c397d09085fa13fddbe58a1d --- /dev/null +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/generateElectronChainDefs.py @@ -0,0 +1,46 @@ +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + +from TriggerMenuMT.HLTMenuConfig.Egamma.ElectronDef import Chain_electron as Chain_electron +from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import Chain +from TriggerMenuMT.HLTMenuConfig.Menu.MenuUtils import splitChainDict + +from AthenaCommon.Logging import logging +log = logging.getLogger( 'TriggerMenuMT.HLTMenuConfig.Egamma.generateChainConfigs' ) +log.info("Importing %s",__name__) + + + +def generateChainConfigs( chainDict ): + import pprint + pprint.pprint( chainDict ) + + + listOfChainDicts = splitChainDict(chainDict) + listOfChainDefs = [] + + for subChainDict in listOfChainDicts: + log.debug("IN ELECTRON GENERATION CODE") + Electron = Chain_electron(subChainDict).assembleChain() + log.debug('Electron object: type name of class: %s', Electron.__class__.__name__) + + listOfChainDefs += [Electron] + log.debug('length of chaindefs %s', len(listOfChainDefs) ) + + + if len(listOfChainDefs)>1: + log.warning("Implement case for multi-electron chain!!") + theChainDef = listOfChainDefs[0] #needs to be implemented properly + else: + theChainDef = listOfChainDefs[0] + + log.debug("theChainDef.name: %s" , theChainDef.name) + log.debug("theChainDef.seed: %s" , theChainDef.seed) + log.debug("theChainDef.ChainSteps: %s" , theChainDef.steps) + + return theChainDef + + + + + + diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/__init__.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d0cb751d0f336e3ac36673d3352ecaed8478e92f --- /dev/null +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/__init__.py @@ -0,0 +1 @@ +#Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py index 8e31999aa6b961d5d016522b4665bfad400b808f..41581a8626d3a37e90ecb2bf252f26b483ec4693 100755 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py @@ -1,10 +1,10 @@ # Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration -from TriggerJobOpts.TriggerFlags import TriggerFlags -from TriggerJobOpts.MuonSliceFlags import MuonSliceFlags -from TriggerJobOpts.EgammaSliceFlags import EgammaSliceFlags +from TriggerJobOpts.TriggerFlags import TriggerFlags +from TriggerJobOpts.MuonSliceFlags import MuonSliceFlags +from TriggerJobOpts.EgammaSliceFlags import EgammaSliceFlags from TriggerJobOpts.JetSliceFlags import JetSliceFlags -from TriggerJobOpts.CombinedSliceFlags import CombinedSliceFlags +from TriggerJobOpts.CombinedSliceFlags import CombinedSliceFlags # Configure the scheduler from AthenaCommon.AlgScheduler import AlgScheduler @@ -14,9 +14,14 @@ AlgScheduler.ShowDataFlow( True ) from AthenaCommon.CFElements import parOR, seqAND, stepSeq from AthenaCommon.AlgSequence import AlgSequence, AthSequencer +from TriggerMenuMT.HLTMenuConfig.Menu.TriggerConfigHLT import TriggerConfigHLT from TriggerMenuMT.HLTMenuConfig.Menu.HLTCFConfig import * from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import * -from TriggerMenuMT.HLTMenuConfig.Menu.HLTSignatureConfig import * +from TriggerMenuMT.HLTMenuConfig.Menu import DictFromChainName +from TriggerMenuMT.HLTMenuConfig.Menu.MenuUtils import splitInterSignatureChainDict +from TriggerMenuMT.HLTMenuConfig.Menu.Lumi import lumi + +from TriggerMenuMT.HLTMenuConfig.Menu.HLTCFConfig import makeHLTTree import os, traceback, operator, commands, time @@ -29,11 +34,14 @@ _func_to_modify_signatures = None class GenerateMenuMT: def __init__(self): - self.triggerMTConfig = None + self.triggerConfigHLT = None self.chains = [] self.chainDefs = [] self.listOfErrorChainDefs = [] self.signaturesOverwritten = False + self.L1Prescales = None + self.HLTPrescales = None + # flags self.doEgammaChains = True self.doJetChains = True @@ -41,176 +49,199 @@ class GenerateMenuMT: self.doCombinedChains = True + def setTriggerConfigHLT(self): + # setting the hlt menu configuration + (HLTPrescales) = self.setupMenu() + self.triggerConfigHLT = TriggerConfigHLT(TriggerFlags.outputHLTconfigFile()) + self.triggerConfigHLT.menuName = TriggerFlags.triggerMenuSetup() + log.debug("Working with menu: %s", self.triggerConfigHLT.menuName) - def getChainDef(self,chainDicts): - # get the Chain object from each signature of the form Chain(chainname, L1seed, ChainSteps - if self.doMuonChains: + + def getChainConfig(self, chainDicts): + """ + == Assembles the chain configuration and returns a chain object with (name, L1see and list of ChainSteps) + """ + if self.doEgammaChains: try: - import TriggerMenu.muon.generateMuonChainDefs + import TriggerMenuMT.HLTMenuConfig.Egamma.generateElectronChainDefs except: - log.error('Problems when importing MuonDef.py, disabling muon chains.') + log.error('Problems when importing generateElectronChainDefs, disabling egamma chains.') log.info(traceback.print_exc()) - self.doMuonChains = False + self.doEgammaChains = False - - allowedSignatures = ["jet","egamma","muon", "electron", "photon","met","tau", - "minbias", "heavyion", "cosmic", "calibration", "streaming", "monitoring", "ht", 'bjet','eb'] - - listOfChainDefs = [] - chainDicts = TriggerMenuMT.HLTMenuConfig.Menu.MenuUtils.splitInterSignatureChainDict(chainDicts) - log.debug("\n chainDicts2 %s", chainDicts) + listOfChainConfigs = [] + chainDicts = splitInterSignatureChainDict(chainDicts) + if log.isEnabledFor(logging.DEBUG): + import pprint + pp = pprint.PrettyPrinter(indent=4, depth=8) + log.debug('dictionary is: %s', pp.pformat(chainDicts)) for chainDict in chainDicts: - chainDef = None - print 'checking chainDict for chain %s %s %r' %(chainDict['chainName'],chainDict["signature"], self.doEnhancedBiasChains) + chainConfigs = None + log.debug('Checking chainDict for chain %s' , chainDict['chainName']) - if chainDict["signature"] == "Muon" and self.doMuonChains: + + if chainDict["signature"] == "Electron" and self.doEgammaChains: try: - chainDef = TriggerMenuMT.HLTMenuConfig.Muon.generateMuonChainDefs.generateChainDefs(chainDict) + log.debug("Try to get chain config") + chainConfigs = TriggerMenuMT.HLTMenuConfig.Egamma.generateElectronChainDefs.generateChainConfigs(chainDict) except: log.error('Problems creating ChainDef for chain %s ' % (chainDict['chainName'])) log.info(traceback.print_exc()) continue - else: - log.error('Chain %s ignored - either because the trigger signature ("slice") has been turned off or because the corresponding chain dictionary cannot be read.' %(chainDict['chainName'])) + log.error('Chain %s ignored - either trigger signature is turned off or the corresponding chain dictionary cannot be read.' %(chainDict['chainName'])) log.debug('Chain dictionary of failed chain is %s.', chainDict) - log.debug(' ChainDef %s ' % chainDef) + log.debug('ChainConfigs %s ' % chainConfigs) + + log.debug('type of chainconfigs %s' % (type(chainConfigs))) + #for chainConfig in chainConfigs: + listOfChainConfigs.append(chainConfigs) - if len(listOfChainDefs) == 0: + if len(listOfChainConfigs) == 0: + log.error('No Chain Configuration found ') return False + elif len(listOfChainConfigs)>1: + if ("mergingStrategy" in chainDicts[0].keys()): + log.warning("Need to define merging strategy, returning only first chain part configuration") + theChainConfig = listOfChainConfigs[0] + else: + log.error("No merging strategy specified for combined chain %s" % chainDicts[0]['chainName']) else: - theChainDef = listOfChainDefs[0] + theChainConfig = listOfChainConfigs[0] - return theChainDef + return theChainConfig - def writeLvl1EmuFiles(self): - data = {'noreco': [';', ';', ';']} # in the lists there are the events - data['emclusters'] = ['eta:1,phi:1,et:180000; eta:1,phi:-1.2,et:35000;', - 'eta:0.5,phi:0,et:120000; eta:1,phi:-1.2,et:65000;', - 'eta:-0.6,phi:1.7,et:9000;'] - data['msmu'] = [';', - 'eta:-1.2,phi:0.7,pt:6500; eta:-1.1,phi:0.6,pt:8500;', - 'eta:-1.7,phi:-0.2,pt:9500;'] - - data['ctp'] = [ 'HLT_g100', 'HLT_2g50 HLT_e20', 'HLT_mu20 HLT_mu8 HLT_2mu8 HLT_mu8_e8' ] - - data['l1emroi'] = ['1,1,0,EM3,EM7,EM15,EM20,EM50,EM100; 1,-1.2,0,EM3,EM7', - '-0.6,0.2,0,EM3,EM7,EM15,EM20,EM50,EM100; 1,-1.1,0,EM3,EM7,EM15,EM20,EM50', - '-0.6,1.5,0,EM3,EM7,EM7'] - - data['l1muroi'] = ['0,0,0,MU0;', - '-1,0.5,0,MU6,MU8; -1,0.5,0,MU6,MU8,MU10', - '-1.5,-0.1,0,MU6,MU8'] - - data['tracks'] = ['eta:1,phi:1,pt:120000; eta:1,phi:-1.2,et:32000;', - 'eta:0.5,phi:0,pt:130000; eta:1,phi:-1.2,pt:60000;eta:-1.2,phi:0.7,pt:6700; eta:-1.1,phi:0.6,pt:8600;', - 'eta:-0.6,phi:1.7,et:9000;'] # no MU track for MS candidate 'eta:-1.7,phi:-0.2,pt:9500;' - - data['mucomb'] = [';', - 'eta:-1.2,phi:0.7,pt:6600; eta:-1.1,phi:0.6,pt:8600;', - ';'] - - data['electrons'] = ['eta:1,phi:1,pt:120000; eta:1,phi:-1.2,et:32000;', - ';', - ';'] - data['photons'] = ['eta:1,phi:1,pt:130000;', - ';', - ';'] - from TrigUpgradeTest.TestUtils import writeEmulationFiles - writeEmulationFiles(data) - + def getChainsFromMenu(self): + """ + == returns the list of chain names that are in the menu + """ + log.debug('Setting TriggerConfigHLT to get the right menu') + self.setTriggerConfigHLT() - def Lvl1Decoder(self): - #_L1UnpackingSeq = parOR("L1UnpackingSeq") - from L1Decoder.L1DecoderConf import CTPUnpackingEmulationTool, RoIsUnpackingEmulationTool, L1Decoder - l1Decoder = L1Decoder( OutputLevel=DEBUG, RoIBResult="" ) - l1Decoder.prescaler.EventInfo="" - - ctpUnpacker = CTPUnpackingEmulationTool( OutputLevel = DEBUG, ForceEnableAllChains=False , InputFilename="ctp.dat" ) - #ctpUnpacker.CTPToChainMapping = [ "0:HLT_g100", "1:HLT_e20", "2:HLT_mu20", "3:HLT_2mu8", "3:HLT_mu8", "33:HLT_2mu8", "15:HLT_mu8_e8" ] - l1Decoder.ctpUnpacker = ctpUnpacker - - emUnpacker = RoIsUnpackingEmulationTool("EMRoIsUnpackingTool", OutputLevel=DEBUG, InputFilename="l1emroi.dat", OutputTrigRoIs="L1EMRoIs", Decisions="L1EM" ) - emUnpacker.ThresholdToChainMapping = ["EM7 : HLT_mu8_e8", "EM20 : HLT_e20", "EM50 : HLT_2g50", "EM100 : HLT_g100" ] - - muUnpacker = RoIsUnpackingEmulationTool("MURoIsUnpackingTool", OutputLevel=DEBUG, InputFilename="l1muroi.dat", OutputTrigRoIs="L1MURoIs", Decisions="L1MU" ) - muUnpacker.ThresholdToChainMapping = ["MU6 : HLT_mu6", "MU8 : HLT_mu8", "MU8 : HLT_2mu8", "MU8 : HLT_mu8_e8", "MU10 : HLT_mu20", "EM100 : HLT_g100" ] + log.debug('Creating one big list of of enabled signatures and chains') + chains = [] - l1Decoder.roiUnpackers = [emUnpacker, muUnpacker] - - #print l1Decoder - #_L1UnpackingSeq += l1Decoder - print l1Decoder - - return l1Decoder - - - def allChains(self): - # muon chains - muStep1 = muStep1Sequence() - muStep2 = muStep2Sequence() - MuChains = [ - Chain(name='HLT_mu20', Seed="L1_MU10", ChainSteps=[ChainStep("Step1_mu20", [SequenceHypoTool(muStep1,step1mu20())]), - ChainStep("Step2_mu20", [SequenceHypoTool(muStep2,step2mu20())]) ] ), - Chain(name='HLT_mu8', Seed="L1_MU6", ChainSteps=[ChainStep("Step1_mu8", [SequenceHypoTool(muStep1,step1mu8())] ), - ChainStep("Step2_mu8", [SequenceHypoTool(muStep2,step2mu8())]) ] ) - ] - #electron chains - elStep1 = elStep1Sequence() - elStep2 = elStep2Sequence() - ElChains = [ - Chain(name='HLT_e20' , Seed="L1_EM10", ChainSteps=[ ChainStep("Step1_e20", [SequenceHypoTool(elStep1,step1e20())]), - ChainStep("Step2_e20", [SequenceHypoTool(elStep2,step2e20())]) ] ) - ] - # combined chain - muelStep1 = combStep1Sequence() - muelStep2 = combStep2Sequence() - CombChains =[ - Chain(name='HLT_mu8_e8' , Seed="L1_EM6_MU6", ChainSteps=[ ChainStep("Step1_mu8_e8", [SequenceHypoTool(muelStep1, step1mu8_e8())]), - ChainStep("Step2_mu8_e8", [SequenceHypoTool(muelStep2, step2mu8_e8())]) ] ) - ] - - _allChains = MuChains + ElChains + CombChains - return _allChains + if (TriggerFlags.CombinedSlice.signatures() or TriggerFlags.EgammaSlice.signatures()) and self.doEgammaChains: + chains += TriggerFlags.EgammaSlice.signatures() + else: + self.doEgammaChains = False + + if len(chains) == 0: + log.warning("There seem to be no chains in the menu - please check") + else: + log.debug("The following chains were found in the menu %s", chains) + + return chains + + + + def generateL1Topo(self): + """ + == Generates the L1Topo menu + """ + if not TriggerFlags.readL1TopoConfigFromXML() and not TriggerFlags.readMenuFromTriggerDb(): + log.info('Generating L1 topo configuration for %s' % TriggerFlags.triggerMenuSetup()) + from TriggerMenuMT.LVL1MenuConfig.TriggerConfigL1Topo import TriggerConfigL1Topo + self.trigConfL1Topo = TriggerConfigL1Topo( outputFile = TriggerFlags.outputL1TopoConfigFile() ) + # build the menu structure + self.trigConfL1Topo.generateMenu() + log.info('Topo Menu has %i trigger lines' % len(self.trigConfL1Topo.menu) ) + # write xml file + self.trigConfL1Topo.writeXML() + elif TriggerFlags.readLVL1configFromXML(): + log.info("ReadingL1TopocofnigFromXML currently not implemented") + else: + log.info("Doing nothing with L1Topo menu configuration...") + + def generateLVL1(self): + """ + == Generates the LVL1 menu + """ + if not TriggerFlags.readLVL1configFromXML() and not TriggerFlags.readMenuFromTriggerDb(): + log.info('Generating L1 configuration for %s' % TriggerFlags.triggerMenuSetup() ) + from TriggerMenuMT.LVL1MenuConfig.TriggerConfigLVL1 import TriggerConfigLVL1 + self.trigConfL1 = TriggerConfigLVL1( outputFile = TriggerFlags.outputLVL1configFile()) + # build the menu structure + self.trigConfL1.generateMenu() + log.info('Menu has %i items' % len(self.trigConfL1.menu.items) ) + # write xml file + self.trigConfL1.writeXML() + elif TriggerFlags.readLVL1configFromXML(): + log.info("ReadingLVL1cofnigFromXML currently not implemented") + else: + log.info("Doing nothing with L1 menu configuration...") + + + + def setupMenu(self): + # go over the slices and put together big list of signatures requested + #(L1Prescales, HLTPrescales, streamConfig) = lumi(self.triggerPythonConfig) + (self.L1Prescales, self.HLTPrescales) = lumi(self.triggerConfigHLT) + return (self.HLTPrescales) + + + def generateChainConfigs(self): + + # get all chain names from menu + log.debug ("getting chains from Menu") + chainsInMenu = self.getChainsFromMenu() + + # decoding of the chain name + decodeChainName = DictFromChainName.DictFromChainName() + + chainCounter = 0 + for chain in chainsInMenu: + log.debug("Currently processing chain: %s ", chain) + chainDict = decodeChainName.getChainDict(chain) + chainCounter += 1 + chainDict['chainCounter'] = chainCounter + + log.debug("Next: getting chain configuration for chain %s ", chain) + chainConfig= self.getChainConfig(chainDict) + + log.debug("Finished with retrieving chain configuration for chain %s", chain) + self.triggerConfigHLT.allChainConfigs.append(chainConfig) + + return self.triggerConfigHLT.allChainConfigs #----------------------# # Menu generation # #----------------------# def generateMT(self): + """ + == Generates L1, L1Topo and HLT menu + """ log.info('GenerateMenuMT.py:generateMT ') - - topSequence = AlgSequence() - TopHLTRootSeq = seqAND("TopHLTRootSeq") - topSequence += TopHLTRootSeq - #----------------------# - # L1 menu generation # - #----------------------# - self.writeLvl1EmuFiles() - Lvl1UnpackingSeq = parOR("L1UnpackingSeq") - Lvl1UnpackingSeq += Lvl1Decoder() - log.info('Lvl1UnpackingSeq: %s', Lvl1UnpackingSeq ) - TopHLTRootSeq += L1UnpackingSeq - - #----------------------# - # HLT menu generation # - #----------------------# - nsetps = 2 - - HLTAllStepsSeq = seqAND("HLTAllStepsSeq") - TopHLTRootSeq += HLTAllStepsSeq - - group_of_chains = allChains() - print 'all Chains ', allChains() - decisionTree_From_Chains(HLTAllStepsSeq, group_of_chains, NSTEPS=nsteps) - - + # -------------------------------------------------------------------- + # L1 menu generation + # - from the code, from DB and from xmls (if we want to maintain this) + # currently implementing the generation from configuration code + # -------------------------------------------------------------------- + #generateL1Topo() + #generateLVL1() - + + # -------------------------------------------------------------------- + # HLT menu generation + # -------------------------------------------------------------------- + finalListOfChainConfigs = self.generateChainConfigs() + log.debug("Length of FinalListofChainConfigs %s", len(finalListOfChainConfigs)) + + log.debug("finalListOfChainConfig %s", finalListOfChainConfigs) + for cc in finalListOfChainConfigs: + log.debug('ChainName %s', cc.name) + log.debug(' L1Seed %s', cc.seed) + log.debug(' ChainSteps %s', cc.steps) + for step in cc.steps: + print step + + makeHLTTree(finalListOfChainConfigs) + diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py index dbea176363edb0347cc8d4d2185f4a3a79a8cff6..ae2dc35fc7e66a893ea9955419130e6c4a77ae34 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py @@ -134,7 +134,6 @@ def addChainToHypoAlg(hypoAlg, chain): def makeHLTTree(HLTChains): """ creates the full HLT tree""" - # TopHLTRootSeq = seqAND("TopHLTRoot") # Root # main HLT top sequence hltTop = seqOR("hltTop") @@ -194,28 +193,32 @@ def decisionTree_From_Chains(HLTNode, chains): from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import CFSequence, RoRSequenceFilterNode, ComboMaker HLTNodeName= HLTNode.name() + # find nsteps chainWithMaxSteps = max(chains, key=lambda chain: len(chain.steps)) NSTEPS = len(chainWithMaxSteps.steps) #loop over chains to configure hypotools # must be done after all chains are created, to avoid conflicts + log.debug("Loop over chains to decode hypo tools") for chain in chains: chain.decodeHypoToolConfs() finalDecisions = [] # needed for monitor allSeq_list = [] + for nstep in range(0, NSTEPS): finalDecisions.append([]) # list of final deciisons per step stepCF_name = "Step%i"%(nstep+1) CFseq_list = [] step_decisions = [] + for chain in chains: # skip this step if missing if len(chain.steps) <= nstep: continue chain_step=chain.steps[nstep] - log.debug("\n************* Start step %d %s for chain %s", nstep+1, stepCF_name, chain.name) + log.debug("\n************* Start step %d %s for chain %s", nstep+1, stepCF_name, chain.name) # one filter per ChainStep - same name indeed # one filter input per previous menusequence output (the L1Seed for first step) @@ -235,14 +238,10 @@ def decisionTree_From_Chains(HLTNode, chains): previous_seeds=[] for seq in prev: filter_input.extend(seq.outputs) - previous_seeds.append( seq.seed ) - + previous_seeds.append(seq.seed) log.debug("Connect to previous sequence through these filter inputs: %s" %str( filter_input) ) if len(filter_input) != len(previous_seeds): log.error("found %d filter inputs and %d seeds", len(filter_input), len(previous_seeds)) - sys.exit("ERROR, in size") - - # get the filter: filter_name = "Filter_%s" % chain_step.name @@ -253,17 +252,20 @@ def decisionTree_From_Chains(HLTNode, chains): CFseq_list.append(CF_seq) for sequence in chain_step.sequences: step_decisions.extend(sequence.outputs) + else: + log.debug("foundFilter %s", filter_name) sfilter.setChains(chain.name) log.debug("Adding chain %s to %s", chain.name,sfilter.Alg.name()) log.debug(sfilter.getChains()) - + if len(chain.steps) == nstep+1: log.debug("Adding finalDecisions for chain %s at step %d:"%(chain.name, nstep+1)) for seq in chain_step.sequences: finalDecisions[nstep].extend(seq.outputs) log.debug(seq.outputs) - + else: + log.debug("len(chain.steps) != nstep+1") #end of loop over menu sequences #end of loop over chains for this step, now implement CF: diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTSignatureConfig.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTSignatureConfig.py deleted file mode 100644 index 35a9f9c872f9017bfa92361df69dde01e663f686..0000000000000000000000000000000000000000 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTSignatureConfig.py +++ /dev/null @@ -1,158 +0,0 @@ -from TrigUpgradeTest.TrigUpgradeTestConf import HLTTest__TestRecoAlg -from TrigUpgradeTest.TrigUpgradeTestConf import HLTTest__TestHypoAlg -from TrigUpgradeTest.TrigUpgradeTestConf import HLTTest__TestHypoTool -from TrigUpgradeTest.TrigUpgradeTestConf import HLTTest__TestComboHypoAlg - -def TestHypoTool(name, prop, threshold_value): -# threshold_value=''.join(filter(lambda x: x.isdigit(), name)) - value = int(threshold_value)*1000 - h = HLTTest__TestHypoTool(name, OutputLevel=DEBUG, Threshold=value, Property=prop) - return h - -from TrigUpgradeTest.TrigUpgradeTestConf import HLTTest__TestInputMaker -def InputMakerAlg(name): - return HLTTest__TestInputMaker(name, OutputLevel = DEBUG, LinkName="initialRoI") - - - -# here define the sequences from the signatures -# signatures do this: -# - declare all the RecoAlg and the HypoAlg -> create the Sequence -# - creates the InputMaker, without the inputs - - -#muon signatures - -def muMSRecAlg(name, FileName="noreco.dat"): - return HLTTest__TestRecoAlg(name=name, FileName=FileName, OutputLevel = DEBUG) - -def MuHypo(name): - return HLTTest__TestHypoAlg(name=name, OutputLevel = DEBUG) - -def step1mu20(): - return TestHypoTool("step1mu20", "pt",20) - -def step1mu8(): - return TestHypoTool("step1mu8", "pt",8) - -def step2mu20(): - return TestHypoTool("step2mu20", "pt", 20) - -def step2mu8(): - return TestHypoTool("step2mu8", "pt", 8) - - -muIM= InputMakerAlg(name="Step1MuInputMaker") -step1_mu_inputMaker = AlgNode(Alg=muIM, inputProp='Inputs', outputProp='Output') - -muAlg = muMSRecAlg(name="muMSRecAlg", FileName="msmu.dat") -step1_mu_recoAlg = AlgNode( Alg=muAlg,inputProp='Input', outputProp='Output') - -muHypo = MuHypo(name="Step1MuHypo") - -step1_mu_HypoAlg = HypoAlgNode( Alg=muHypo,inputProp='Input', outputProp='Output') -nodeSequence_mu = NodeSequence("muNodeSeq1", Algs=[step1_mu_inputMaker, step1_mu_recoAlg], Hypo=step1_mu_HypoAlg, Seed="L1MU") - -def muStep1Sequence(): - return MenuSequence("muStep1Seq", nodeSeqList=[nodeSequence_mu]) - -# mu step2 -muIM2= InputMakerAlg(name="Step2MuInputMaker") -step2_mu_inputMaker = AlgNode(Alg=muIM2, inputProp='Inputs', outputProp='Output') - -muAlg2 = muMSRecAlg(name="muMSRecAlg2", FileName="msmu.dat") -step2_mu_recoAlg = AlgNode( Alg=muAlg2,inputProp='Input', outputProp='Output') - -muHypo2 = MuHypo(name="Step2MuHypo2") -step2_mu_HypoAlg = HypoAlgNode( Alg=muHypo2,inputProp='Input', outputProp='Output') -nodeSequence2_mu = NodeSequence("muNodeSeq2", Algs=[step2_mu_inputMaker, step2_mu_recoAlg], Hypo=step2_mu_HypoAlg, Seed="") - -def muStep2Sequence(): - return MenuSequence("muStep2Seq", nodeSeqList=[nodeSequence2_mu]) - - - -#electron signatures - -def CaloClustering(name, FileName="noreco.dat"): - return HLTTest__TestRecoAlg(name=name, FileName=FileName, OutputLevel = DEBUG) - -def ElGamHypo(name): - return HLTTest__TestHypoAlg(name=name, OutputLevel = DEBUG) - - -def step1e20(): - return TestHypoTool("step1e20", "et",20) - -def step1e8(): - return TestHypoTool("step1e8", "et",8) - -def step2e20(): - return TestHypoTool("step2e20", "et",20) - -def step2e8(): - return TestHypoTool("step2e8", "et",8) - -elIM= InputMakerAlg(name="Step1ElInputMaker") -step1_el_inputMaker = AlgNode(Alg=elIM, inputProp='Inputs', outputProp='Output') - -elAlg = CaloClustering(name="CaloClustering", FileName="emclusters.dat") -step1_el_recoAlg = AlgNode( Alg=elAlg,inputProp='Input', outputProp='Output') - -elHypo = ElGamHypo(name="Step1ElHypo") -step1_el_HypoAlg = HypoAlgNode( Alg=elHypo,inputProp='Input', outputProp='Output') - -nodeSequence_el = NodeSequence("elNodeSeq1", Algs=[step1_el_inputMaker, step1_el_recoAlg], Hypo=step1_el_HypoAlg, Seed="L1EM") -def elStep1Sequence(): - return MenuSequence("elStep1Seq", nodeSeqList=[nodeSequence_el]) - -#step2 -elIM2= InputMakerAlg(name="Step2ElInputMaker") -step2_el_inputMaker = AlgNode(Alg=elIM2, inputProp='Inputs', outputProp='Output') - -elAlg2 = CaloClustering(name="CaloClustering2", FileName="emclusters.dat") -step2_el_recoAlg = AlgNode( Alg=elAlg2,inputProp='Input', outputProp='Output') - -elHypo2 = ElGamHypo(name="Step2ElHypo") -step2_el_HypoAlg = HypoAlgNode( Alg=elHypo2,inputProp='Input', outputProp='Output') - -nodeSequence2_el = NodeSequence("elNodeSeq2", Algs=[step2_el_inputMaker, step2_el_recoAlg], Hypo=step2_el_HypoAlg, Seed="") -def elStep2Sequence(): - return MenuSequence("elStep2Seq", nodeSeqList=[nodeSequence2_el]) - - -# combined Hypo # -################# - -def ComboMuEHypo(name): - return HLTTest__TestComboHypoAlg(name=name, OutputLevel = DEBUG, Property1="pt", Property2="et") - -def step1mu8_e8(): - return TestHypoTool("step1mu8_e8", "pt",8) - -def step2mu8_e8(): - return TestHypoTool("step2mu8_e8", "pt",8) - -comboAlg = ComboMuEHypo("Step1ComboMuElHypo") -step1_comb_HypoAlgMu = HypoAlgNode( Alg=comboAlg,inputProp='Input1', outputProp='Output1') -step1_comb_HypoAlgEl = HypoAlgNode( Alg=comboAlg,inputProp='Input2', outputProp='Output2') - -nodeSequence_muComb = NodeSequence("CombmuNodeSeq1", Algs=[step1_mu_inputMaker, step1_mu_recoAlg], Hypo=step1_comb_HypoAlgMu, Seed="L1MU") -nodeSequence_elComb = NodeSequence("CombelNodeSeq1", Algs=[step1_el_inputMaker, step1_el_recoAlg], Hypo=step1_comb_HypoAlgEl, Seed="L1EM") - - -def combStep1Sequence(): - return MenuSequence("combStep1Seq", nodeSeqList=[nodeSequence_muComb,nodeSequence_elComb]) - -# step2 - -comboAlg2 = ComboMuEHypo("Step2ComboMuElHypo") -step2_comb_HypoAlgMu = HypoAlgNode( Alg=comboAlg2,inputProp='Input1', outputProp='Output1') -step2_comb_HypoAlgEl = HypoAlgNode( Alg=comboAlg2,inputProp='Input2', outputProp='Output2') - -nodeSequence2_muComb = NodeSequence("CombmuNodeSeq2", Algs=[step2_mu_inputMaker, step2_mu_recoAlg], Hypo=step2_comb_HypoAlgMu, Seed="") -nodeSequence2_elComb = NodeSequence("CombelNodeSeq2", Algs=[step2_el_inputMaker, step2_el_recoAlg], Hypo=step2_comb_HypoAlgEl, Seed="") - - -def combStep2Sequence(): - return MenuSequence("combStep2Seq", nodeSeqList=[nodeSequence2_muComb,nodeSequence2_elComb]) diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py index 46348f929e201bc7d1fded34a736955508659582..d66aaff44fcb48e652fcf88adb65c53320dec5d9 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py @@ -32,15 +32,19 @@ def setupMenu(): TriggerFlags.TestSlice.signatures = [] TriggerFlags.MuonSlice.signatures = [ - ['mu20', 'L1_MU10', [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1], - ['mu8', 'L1_MU6', [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1], + #['mu20', 'L1_MU10', [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1], + #['mu8', 'L1_MU6', [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1], ] TriggerFlags.EgammaSlice.signatures = [ - ['e20', 'L1_EM10', [], [PhysicsStream], ['RATE:SingleElectron', 'BW:Electron'], -1], + ['e3_etcut1step', 'L1_EM3', [], [PhysicsStream], ['RATE:SingleElectron', 'BW:Electron'], -1], + ['e3_etcut', 'L1_EM3', [], [PhysicsStream], ['RATE:SingleElectron', 'BW:Electron'], -1], + ['e5_etcut', 'L1_EM3', [], [PhysicsStream], ['RATE:SingleElectron', 'BW:Electron'], -1], + ['e7_etcut', 'L1_EM3', [], [PhysicsStream], ['RATE:SingleElectron', 'BW:Electron'], -1], + #['e20', 'L1_EM10', [], [PhysicsStream], ['RATE:SingleElectron', 'BW:Electron'], -1], ] TriggerFlags.CombinedSlice.signatures = [ - ['e8_mu8', 'L1_EM6_MU6', [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1], + #['e8_mu8', 'L1_EM6_MU6', [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1], ] TriggerFlags.JetSlice.signatures = [ ] TriggerFlags.BjetSlice.signatures = [] diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Lumi.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Lumi.py index 6359a5f403e0f6d1863ed8a5164bec09e73b0317..b9619579f19c96b0228e9fb93c69f89b2483dfed 100755 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Lumi.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Lumi.py @@ -1,171 +1,27 @@ # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration from TriggerJobOpts.TriggerFlags import TriggerFlags -from TriggerMenu.menu.MenuUtil import applyHLTPrescale, resetAllPrescales +#from TriggerMenu.menu.MenuUtil import applyHLTPrescale, resetAllPrescales from AthenaCommon.Logging import logging log = logging.getLogger( 'TriggerMenu.menu.Lumi' ) -def lumi(triggerPythonConfig): +def lumi(triggerConfigHLT): L1Prescales = {} HLTPrescales = {} menu_name = TriggerFlags.triggerMenuSetup() ## Do some aliasing here - if menu_name == 'Physics_default': menu_name = 'Physics_pp_v6' - elif menu_name == 'MC_loose_default': menu_name = 'MC_pp_v6_loose_mc_prescale' - elif menu_name == 'MC_tight_default': menu_name = 'MC_pp_v6_tight_mc_prescale' - elif menu_name == 'default_loose': menu_name = 'MC_pp_v6_loose_mc_prescale' - elif menu_name == 'default_tight': menu_name = 'MC_pp_v6_tight_mc_prescale' + if menu_name == 'Physics_default': menu_name = 'LS2_v1' + elif menu_name == 'MC_loose_default': menu_name = 'LS2_v1' + elif menu_name == 'MC_tight_default': menu_name = 'LS2_v1' log.info( 'Menu name: '+ menu_name) - - if menu_name.startswith('Physics_pp_v7') : - log.info('In physics pp v7 menu setup') - from TriggerMenu.menu.Physics_pp_v7 import setupMenu, Prescales - setupMenu() - if 'cosmics_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_cosmics - HLTPrescales = Prescales.HLTPrescales_cosmics - elif 'tight' in menu_name: - L1Prescales = Prescales.L1Prescales_tight_physics_prescale - HLTPrescales = Prescales.HLTPrescales_tight_physics_prescale - else: - L1Prescales = Prescales.L1Prescales - HLTPrescales = Prescales.HLTPrescales - - - elif menu_name.startswith('MC_pp_v7'): - from TriggerMenu.menu.MC_pp_v7 import setupMenu, Prescales - setupMenu() - if 'tight_mc_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_tight_mc_prescale - HLTPrescales = Prescales.HLTPrescales_tight_mc_prescale - elif 'tightperf_mc_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_tightperf_mc_prescale - HLTPrescales = Prescales.HLTPrescales_tightperf_mc_prescale - log.info(" HLTPrescales %s" % HLTPrescales) - elif 'loose_mc_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_loose_mc_prescale - HLTPrescales = Prescales.HLTPrescales_loose_mc_prescale - log.info(" HLTPrescales %s" % HLTPrescales) - elif 'special_mc_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_special_mc_prescale - HLTPrescales = Prescales.HLTPrescales_special_mc_prescale - log.info(" HLTPrescales %s" % HLTPrescales) - elif 'no_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_no_prescale - HLTPrescales = Prescales.HLTPrescales_no_prescale - log.info(" HLTPrescales %s" % HLTPrescales) - elif 'upgrade_mc_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_upgrade_mc_prescale - HLTPrescales = Prescales.HLTPrescales_upgrade_mc_prescale - log.info(" HLTPrescales %s" % HLTPrescales) - else: - L1Prescales = Prescales.L1Prescales - HLTPrescales = Prescales.HLTPrescales - elif menu_name.startswith('Physics_pp_v6') : - log.info('In physics pp v6 menu setup') - from TriggerMenu.menu.Physics_pp_v6 import setupMenu, Prescales - setupMenu() - if 'cosmics_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_cosmics - HLTPrescales = Prescales.HLTPrescales_cosmics - elif 'tight' in menu_name: - L1Prescales = Prescales.L1Prescales_tight_physics_prescale - HLTPrescales = Prescales.HLTPrescales_tight_physics_prescale - else: - L1Prescales = Prescales.L1Prescales - HLTPrescales = Prescales.HLTPrescales - - - elif menu_name.startswith('MC_pp_v6'): - from TriggerMenu.menu.MC_pp_v6 import setupMenu, Prescales - setupMenu() - if 'tight_mc_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_tight_mc_prescale - HLTPrescales = Prescales.HLTPrescales_tight_mc_prescale - elif 'tightperf_mc_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_tightperf_mc_prescale - HLTPrescales = Prescales.HLTPrescales_tightperf_mc_prescale - log.info(" HLTPrescales %s" % HLTPrescales) - elif 'loose_mc_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_loose_mc_prescale - HLTPrescales = Prescales.HLTPrescales_loose_mc_prescale - log.info(" HLTPrescales %s" % HLTPrescales) - elif 'special_mc_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_special_mc_prescale - HLTPrescales = Prescales.HLTPrescales_special_mc_prescale - log.info(" HLTPrescales %s" % HLTPrescales) - elif 'no_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_no_prescale - HLTPrescales = Prescales.HLTPrescales_no_prescale - log.info(" HLTPrescales %s" % HLTPrescales) - elif 'upgrade_mc_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_upgrade_mc_prescale - HLTPrescales = Prescales.HLTPrescales_upgrade_mc_prescale - log.info(" HLTPrescales %s" % HLTPrescales) - else: - L1Prescales = Prescales.L1Prescales - HLTPrescales = Prescales.HLTPrescales - - elif menu_name.startswith('Physics_HI_v3') : - log.info('Physics_HI_v3 menu setup') - from TriggerMenu.menu.Physics_HI_v3 import setupMenu, Prescales - setupMenu() - if 'cosmics_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_cosmics - HLTPrescales = Prescales.HLTPrescales_cosmics - else: - L1Prescales = Prescales.L1Prescales - HLTPrescales = Prescales.HLTPrescales - - - elif menu_name.startswith('MC_HI_v3') : - log.info('MC_HI_v3 menu setup') - from TriggerMenu.menu.MC_HI_v3 import setupMenu, Prescales - setupMenu() - if 'cosmics_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_cosmics - HLTPrescales = Prescales.HLTPrescales_cosmics - elif 'tight_mc_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_tight_mc_prescale - HLTPrescales = Prescales.HLTPrescales_tight_mc_prescale - else: - L1Prescales = Prescales.L1Prescales - HLTPrescales = Prescales.HLTPrescales - - elif menu_name.startswith('Physics_HI_v4') : - log.info('Physics_HI_v4 menu setup') - from TriggerMenu.menu.Physics_HI_v4 import setupMenu, Prescales - setupMenu() - if 'cosmics_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_cosmics - HLTPrescales = Prescales.HLTPrescales_cosmics - else: - L1Prescales = Prescales.L1Prescales - HLTPrescales = Prescales.HLTPrescales - - - elif menu_name.startswith('MC_HI_v4') : - log.info('MC_HI_v4 menu setup') - from TriggerMenu.menu.MC_HI_v4 import setupMenu, Prescales - setupMenu() - if 'cosmics_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_cosmics - HLTPrescales = Prescales.HLTPrescales_cosmics - elif 'tight_mc_prescale' in menu_name: - L1Prescales = Prescales.L1Prescales_tight_mc_prescale - HLTPrescales = Prescales.HLTPrescales_tight_mc_prescale - else: - L1Prescales = Prescales.L1Prescales - HLTPrescales = Prescales.HLTPrescales - - elif menu_name.startswith('LS2_v1') : + if menu_name.startswith('LS2_v1') : log.info('LS2_v1 menu setup') - from TriggerMenu.menu.MC_HI_v4 import setupMenu, Prescales + from TriggerMenuMT.HLTMenuConfig.Menu.LS2_v1 import setupMenu, Prescales setupMenu() if 'cosmics_prescale' in menu_name: L1Prescales = Prescales.L1Prescales_cosmics @@ -186,38 +42,34 @@ def lumi(triggerPythonConfig): -def applyPrescales(triggerPythonConfig, HLTPrescales): - no_prescale = False - if 'no_prescale' in TriggerFlags.triggerMenuSetup() or \ - TriggerFlags.triggerMenuSetup() == 'default': no_prescale = True +# def applyPrescales(triggerPythonConfig, HLTPrescales): +# no_prescale = False +# if 'no_prescale' in TriggerFlags.triggerMenuSetup() or \ +# TriggerFlags.triggerMenuSetup() == 'default': no_prescale = True - #if L1Prescales==None and TriggerFlags.L1PrescaleSet()!='': - # log.warning('Cannot find L1 prescale set %s, not explicitly setting them' % \ - # TriggerFlags.L1PrescaleSet()) - # L1Prescales = {} - if HLTPrescales==None and TriggerFlags.HLTPrescaleSet()!='': - log.warning('Cannot find HLT prescale set %s, not explicitly setting them' % \ - TriggerFlags.HLTPrescaleSet()) - HLTPrescales = {} +# if HLTPrescales==None and TriggerFlags.HLTPrescaleSet()!='': +# log.warning('Cannot find HLT prescale set %s, not explicitly setting them' % \ +# TriggerFlags.HLTPrescaleSet()) +# HLTPrescales = {} - if TriggerFlags.doHLT(): - applyHLTPrescale(triggerPythonConfig, HLTPrescales) - - if TriggerFlags.L1PrescaleSet() == 'None': - for item in triggerPythonConfig.allItems.values(): - item.prescale = '1' - if TriggerFlags.HLTPrescaleSet() == 'None': - for sig in triggerPythonConfig.allChains.values(): - for chain in sig: - chain.prescale = '1' - chain.pass_through = '0' - tmp_stag = chain.stream_tag - chain.stream_tag = [] - for s in tmp_stag: - chain.addStreamTag(s[0], s[1], s[2], 1) - - if no_prescale: - resetAllPrescales(triggerPythonConfig) +# if TriggerFlags.doHLT(): +# applyHLTPrescale(triggerPythonConfig, HLTPrescales) + +# if TriggerFlags.L1PrescaleSet() == 'None': +# for item in triggerPythonConfig.allItems.values(): +# item.prescale = '1' +# if TriggerFlags.HLTPrescaleSet() == 'None': +# for sig in triggerPythonConfig.allChains.values(): +# for chain in sig: +# chain.prescale = '1' +# chain.pass_through = '0' +# tmp_stag = chain.stream_tag +# chain.stream_tag = [] +# for s in tmp_stag: +# chain.addStreamTag(s[0], s[1], s[2], 1) + +# if no_prescale: +# resetAllPrescales(triggerPythonConfig) diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py index e718d619b999d959936b6e0a6ce72808dd218a32..01f5da3ac5d8ba11511ae1573fdf01a8904be8c1 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py @@ -323,13 +323,15 @@ class MenuSequence(): input_maker_output="%s_from_%s"%(self.maker.Alg.name(),line) self.maker.addOutput(input_maker_output) self.hypo.setPreviousDecision(input_maker_output) - log.debug("MenuSequence.connectToFilter: connecting InputMaker and HypoAlg, adding: InputMaker::%s.output=%s, \ - HypoAlg::%s.previousDecision=%s, HypoAlg::%s.output=%s",\ - self.maker.Alg.name(), input_maker_output, self.hypo.Alg.name(), input_maker_output, self.hypo.Alg.name(), ) - + log.debug("MenuSequence.connectToFilter: connecting InputMaker and HypoAlg, adding: \ + InputMaker::%s.output=%s, \ + HypoAlg::%s.previousDecision=%s, \ + HypoAlg::%s.output=%s",\ + self.maker.Alg.name(), input_maker_output, self.hypo.Alg.name(), input_maker_output, self.hypo.Alg.name(), new_output ) def __str__(self): - return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s"%(self.name, self.hypo, self.maker, self.sequence, new_output) + #return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s"%(self.name, self.hypo, self.maker, self.sequence, new_output) + return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s"%(self.name, self.hypo, self.maker, self.sequence) class Chain: @@ -460,9 +462,6 @@ class CFSequence(): self.filter, self.step ) - - - class ChainStep: """Class to describe one step of a chain; if more than one menuSequence, then the step is combo""" def __init__(self, name, Sequences=[]): @@ -475,8 +474,6 @@ class ChainStep: else: self.sequences = Sequences - - def replaceSequence(self, old, new): # maybe obsolete? idx=self.sequences.index(old) # this raise exception diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtil.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtil.py index 68c966865d93f2aa6b5920593e37c910437889de..f63afb226bc379ae32182455bffbcfb62515ee33 100755 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtil.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtil.py @@ -55,6 +55,8 @@ def applyHLTPrescale(triggerPythonConfig, HLTPrescale): log.info('Applied HLTPS to the item '+item+': PS'+ hltchain.prescale+" PT"+hltchain.pass_through+" RerunPS"+hltchain.rerun_prescale) + + def checkGroups(triggerPythonConfig): """ Make sure the groups used in Physics and MC menu exists """ diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtils.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtils.py index 41c6d631ae91c07f55444b07c36a980000ad58ea..12112c2bd9d139f4b75f06ce5122fa01e629f1e1 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtils.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtils.py @@ -96,305 +96,6 @@ def splitChainDict(chainDict): return listOfChainDicts -def _addSequence(chainDef,sequenceToAdd): - """ - Check if sequence is already in chainDef, if not add it - """ - for chainDefSequence in chainDef.sequenceList: - if chainDefSequence['output'] == sequenceToAdd['output']: - return chainDef - chainDef.sequenceList += [sequenceToAdd] - return chainDef - - -def _getSigList(chainDef,sigType="HLT"): - """ - Little helper function to get the list of signatures associated to a trigger level (L2/EF/HLT) - """ - sigList = [] - for signature in chainDef.signatureList: - if signature['listOfTriggerElements'][0][0:len(sigType)] == sigType: - sigList += [signature] - return sigList - - -def _replicateMissingSignatures(listOfChainDefs,unevenSigs,level): - """ - Loops over the listOfChainDefs, and fills up those ChainDefs that have a shorter signature list at a given level than the largest one with dummy signatures - """ - - for chainDef in listOfChainDefs: - - # if this is already the chainDef with the longest signatureList nothing has to be done - if len(_getSigList(chainDef,level)) == max(unevenSigs): - continue - else: - maxSignatureCounter = -1 - numberOfSignatures = 0 - maxSignatureIndex = -1 - for signatureIndex,signature in enumerate(chainDef.signatureList): - if signature['listOfTriggerElements'][0][0:len(level)] == level: - maxSignatureCounter = max(maxSignatureCounter,signature['signature_counter']) - numberOfSignatures += 1 - maxSignatureIndex = signatureIndex - - if maxSignatureIndex == -1: - log.error('maxSignatureIndex has not been set. Maybe there is no sequence at this level? CHECK IN CODE - fix in work. ') - - listOfLastTEs = chainDef.signatureList[maxSignatureIndex]['listOfTriggerElements'] - - for i in range(maxSignatureCounter+1, maxSignatureCounter+1+max(unevenSigs)-numberOfSignatures): - if level in ["EF","HLT"]: - chainDef.signatureList += deepcopy([{'signature_counter': i, 'listOfTriggerElements': listOfLastTEs}]) - elif level == "L2": - chainDef.addSignatureL2(deepcopy(listOfLastTEs)) - log.info("Added %s signature with TEs %s to ChainDef of chain %s in preparation for parallel merging." % (level,str(listOfLastTEs),chainDef.chain_name)) - log.debug("ChainDef with replicated signatures at %s: %s", level, chainDef) - - - - -def mergeChainDefs(listOfChainDefs, strategy="parallel", offset=-1, - preserveL2EFOrder=True, removeDuplicateTEs=False, doTopo=True, - chainDicts='', noTEreplication=False, noMergeBJet=False): - - log.debug("Combine using %s merging", strategy) - - if strategy=="parallel": - return _mergeChainDefsParallel(listOfChainDefs,offset,removeDuplicateTEs,noMergeBJet=noMergeBJet) - elif strategy=="serial": - return _mergeChainDefsSerial(chainDicts,listOfChainDefs,offset,preserveL2EFOrder=preserveL2EFOrder,doTopo=doTopo,noTEreplication=noTEreplication) - else: - log.error("Merging failed for %s. Merging strategy '%s' not known.", (listOfChainDefs, strategy)) - return -1 - - - -def _mergeChainDefsSerial(ChainDicts,listOfChainDefs,offset,preserveL2EFOrder=True,doTopo=True,noTEreplication=False): - - """ - serial merging of chain def objects for combined chains - """ - - - #noTEreplication=False - #Add few exception to the replication of the TE - jet_count=0 - met_count=0 - ht_count=0 - other_count=0 - try: - if 'upc' in ChainDicts[0]['chainName'] : - noTEreplication=True - - if 'hi' in ChainDicts[0]['chainName'] and 'v2' in ChainDicts[1]['chainName'] : - noTEreplication=True - - for chainDict in ChainDicts: - if (chainDict["signature"] == "Jet"): - jet_count+=1 - elif (chainDict["signature"] == "HT"): - ht_count+=1 - elif (chainDict["signature"] == "MET"): - for chainpart in chainDict["chainParts"]: - if 'xe' in chainpart['trigType'] and 'cell' not in chainpart['EFrecoAlg']: - met_count+=1 - else: - other_count+=1 - - #print "BETTA Total count: jet-", jet_count, " HT-", ht_count, " xe-", met_count, "other:-", other_count, " in: ",ChainDicts[0]['chainName'] - - except: - pass - - - if jet_count > 0 and met_count > 0: - noTEreplication=True - if jet_count > 1: - noTEreplication=True - if met_count > 1: - noTEreplication=True - if jet_count > 0 and ht_count > 0: - noTEreplication=True - - - listOfChainDefs = deepcopy(listOfChainDefs) - - # copy the chaindef into which we want to merge the other chaindefs - mergedChainDef = deepcopy(listOfChainDefs[0]) - - #remove the first chaindef from the list - listOfChainDefs.pop(0) - - # Loop remaining chain defs to be merged - #doTopo=False - #preserveL2EFOrder=False - - - for chainDef in listOfChainDefs: - currentLastTEs = mergedChainDef.signatureList[-1]['listOfTriggerElements'] - - for sequence in chainDef.sequenceList: - mergedChainDef = _addSequence(mergedChainDef,sequence) - - for signatureIdx,signature in enumerate(chainDef.signatureList): - # if a topo is appended after the chain merging, or in same special cases, the replication of the last TEs is not necessary - if noTEreplication: - log.info("Removing replication of the TE for chain: %s", chainDef.chain_name) - signatureToAdd = signature['listOfTriggerElements'] - else: - signatureToAdd = signature['listOfTriggerElements'] if doTopo else signature['listOfTriggerElements'] + currentLastTEs - #signatureToAdd = signature['listOfTriggerElements'] - if preserveL2EFOrder: - if not offset == -1: - log.error("L2/EF preserving serial merging with offset not yet implemented.") - else: - if signature['listOfTriggerElements'][0].startswith("L2"): - mergedChainDef.addSignatureL2(signatureToAdd) - elif signature['listOfTriggerElements'][0].startswith("EF") or signature['listOfTriggerElements'][0].startswith("HLT"): - mergedChainDef.appendSignature(signatureToAdd) - - else: - log.error("Unknown TE naming :",str(signature['listOfTriggerElements'][0])) - else: - if offset ==-1: - mergedChainDef.appendSignature(signatureToAdd) - else: - if offset+signatureIdx > len(mergedChainDef.signatureList): - mergedChainDef.signatureList[offset+signatureIdx]['listOfTriggerElements'] += signatureToAdd - else: - mergedChainDef.appendSignature(signatureToAdd) - - return mergedChainDef - - - -def _mergeChainDefsParallel(listOfChainDefs,offset=-1,removeDuplicateTEs=False, noMergeBJet=False): - - """ - merge chain def objects for combined chains - the order of signatures corresponds to the signature counters in the constituent chainDefs - """ - - listOfChainDefs = deepcopy(listOfChainDefs) - - for chainDef in listOfChainDefs: - log.debug("List of ChainDefs to be merged %s ", chainDef) - - if offset!=-1: - log.warning("Parallel merging with offset has been tested only for EF-only chains. If you're doing something different, check it works ok!!") - - # check length of signature list in each chain def - # if not even, take measures as the sig of the short chain - # needs to be propagated to the end - - nL2sigs = [] - nEFsigs = [] - nHLTsigs = [] - - for cD in listOfChainDefs: - - nL2sigs += [len(_getSigList(cD,"L2"))] - nEFsigs += [len(_getSigList(cD,"EF"))] - nHLTsigs += [len(_getSigList(cD,"HLT"))] - - ##Hardocode that the offset is only applied to the second chain in the list - if cD==listOfChainDefs[1] and offset!=-1: - nL2sigs[-1] = nL2sigs[-1]+offset if nL2sigs[-1]!=0 else nL2sigs[-1] - nEFsigs[-1] = nEFsigs[-1]+offset if nEFsigs[-1]!=0 else nEFsigs[-1] - nHLTsigs[-1]= nHLTsigs[-1]+offset if nHLTsigs[-1]!=0 else nHLTsigs[-1] - - countsL2 = Counter(nL2sigs) - unevenL2Sigs = [val for val, count in countsL2.items() if count <= 1] - countsEF = Counter(nEFsigs) - unevenEFSigs = [val for val, count in countsEF.items() if count <= 1] - countsHLT = Counter(nHLTsigs) - unevenHLTSigs = [val for val, count in countsHLT.items() if count <= 1] - - log.debug("nL2sigs %s", nL2sigs) - log.debug("countsL2 %s", countsL2) - log.debug("unevenL1Sigs %s", unevenL2Sigs) - log.debug("nEFsigs %s", nEFsigs) - log.debug("countsEF %s", countsEF) - log.debug("unevenEFSigs %s", unevenEFSigs) - log.debug("nHLTsigs %s", nHLTsigs) - log.debug("countsHLT %s", countsHLT) - log.debug("unevenHLTSigs %s", unevenHLTSigs) - - nL2sigs = [] - nEFsigs = [] - nHLTsigs = [] - - if unevenL2Sigs: - _replicateMissingSignatures(listOfChainDefs,unevenL2Sigs,"L2") - if unevenEFSigs: - _replicateMissingSignatures(listOfChainDefs,unevenEFSigs,"EF") - if unevenHLTSigs: - _replicateMissingSignatures(listOfChainDefs,unevenHLTSigs,"HLT") - - # Now check if the replication of missing signatures worked and all chains have same length signature list - - for cD in listOfChainDefs: - nL2sigs += [len(_getSigList(cD,"L2"))] - nEFsigs += [len(_getSigList(cD,"EF"))] - nHLTsigs += [len(_getSigList(cD,"HLT"))] - - if cD==listOfChainDefs[1] and offset!=-1: - #print "Second Chain ",cD.chain_name, _getSigList(cD,"EF") - nL2sigs[-1] = nL2sigs[-1]+offset if nL2sigs[-1]!=0 else nL2sigs[-1] - nEFsigs[-1] = nEFsigs[-1]+offset if nEFsigs[-1]!=0 else nEFsigs[-1] - nHLTsigs[-1]= nHLTsigs[-1]+offset if nHLTsigs[-1]!=0 else nHLTsigs[-1] - - countsL2 = Counter(nL2sigs) - unevenL2Sigs = [val for val, count in countsL2.items() if count <= 1] - countsEF = Counter(nEFsigs) - unevenEFSigs = [val for val, count in countsEF.items() if count <= 1] - countsHLT = Counter(nHLTsigs) - unevenHLTSigs = [val for val, count in countsHLT.items() if count <= 1] - - - if unevenL2Sigs or unevenEFSigs or unevenHLTSigs: - log.error("Replication of trigger elements failed. There is still an uneven number of signatures in the ChainDefs of this combined chain.") - - - # Loop over all chain defs to be merged - - - - mergedChainDef = listOfChainDefs[0] - listOfChainDefs.pop(0) - - log.debug("mergedChainDef prior to merging: %s", mergedChainDef) - - - for chainDef in listOfChainDefs: - for sequence in chainDef.sequenceList: - mergedChainDef = _addSequence(mergedChainDef,sequence) - - for chainDefSignature in chainDef.signatureList: - for mergedChainDefSignature in mergedChainDef.signatureList: - if int(chainDefSignature['signature_counter']) == int(mergedChainDefSignature['signature_counter']): - log.debug("mergedChainDef signatureList before a step: %s", mergedChainDef.signatureList) - mergedChainDefSignature['listOfTriggerElements'] += chainDefSignature['listOfTriggerElements'] - log.debug("mergedChainDef signatureList after a step: %s", mergedChainDef.signatureList) - - - - if removeDuplicateTEs: - for signature in mergedChainDef.signatureList: - - if noMergeBJet: - hasBJetTE = False - for TE in set(signature['listOfTriggerElements']): - if not (TE.find("bjet") == -1): hasBJetTE = True - - if not hasBJetTE: - signature['listOfTriggerElements'] = list(set(signature['listOfTriggerElements'])) - else: - signature['listOfTriggerElements'] = list(set(signature['listOfTriggerElements'])) - - return mergedChainDef - def setupTopoStartFrom(topoThresholds, theChainDef): @@ -426,19 +127,3 @@ def setupTopoStartFrom(topoThresholds, theChainDef): return te0 - # if ntopoTes ==1: - # topoStartFrom = str(chainDict['topoThreshold'][0]) - # elif ntoppoTes == 2: - - - # te1= str(topoThresholds[0]) - # te2=str(topoThresholds[1]) - # from TrigGenericAlgs import MergeTopoStarts - # theMergeTopoStarts = MergeTopoStarts("MergeTopoStarts_"+te1+"_"+te2) - # theChainDef.addSequence([te1,te2], theMergeTopoStarts, "merged_"+te1+"_"+te2) - # topoStartFrom = "merged_"+te1+"_"+te2 - # else: - # log.error('3 topo Tes to merge not implemented (can be done though!') - - - diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py index fac6245ac727e4c667bb0b2043549dc3814c16ac..1b40a67b3f13225ed6842fc9cc9623850bdb7972 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py @@ -29,6 +29,8 @@ SliceIDDict = { 'Test' : 'TestChain', } +AllowedSignatures = ["jet","egamma","muon", "electron", "photon","met","tau", "minbias", "heavyion", "cosmic", "calibration", "streaming", "monitoring", "ht", 'bjet','eb'] + #========================================================== # ---- Generic Template for all chains ---- # ---- chainParts specific information given in ---- @@ -358,7 +360,7 @@ ElectronChainParts = { 'signature' : ['Electron'], 'chainPartName' : '', 'L1item' : '', - 'extra' : 'ion', + 'extra' : '', 'multiplicity' : '', 'trigType' : ['e'], 'threshold' : '', @@ -370,7 +372,7 @@ ElectronChainParts = { 'lhInfo' : ['cutd0dphideta','nod0','nodphires','nodeta','smooth'], 'L2IDAlg' : ['L2StarA','L2StarB','L2StarC','FTK','TRT','SiTrack','IdScan'], 'addInfo' : ['etcut','ringer','conv','etisem','gsf','trkcut', - 'L2Star','perf','IdTest'], + 'L2Star','perf','IdTest', 'etcut1step'], } # ---- Egamma Dictinary of default Values ---- ElectronChainParts_Default = { diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/TriggerConfigHLT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/TriggerConfigHLT.py new file mode 100644 index 0000000000000000000000000000000000000000..5d44149900cb95038dd9b1670009695b5cd45154 --- /dev/null +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/TriggerConfigHLT.py @@ -0,0 +1,57 @@ +######################################################################################### +# +# TriggerConfigHLT class, providing basic functionality for assembling the menu +# +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +# +######################################################################################### + +from AthenaCommon.Logging import logging +log = logging.getLogger( 'TriggerConfigHLT' ) + +class TriggerConfigHLT: + sCurrentTriggerConfig = None + def currentTriggerConfig(): + return TriggerConfigHLT.sCurrentTriggerConfig + currentTriggerConfig = staticmethod(currentTriggerConfig) + + + def __init__(self, hltfile=None): + self.menuName = 'TestMenu' + self.__HLTFile = hltfile + + self.allChainConfigs = [] + + self.allThresholds = {} + self.allItems = {} + self.allChains = {} + self.allChainSteps = {} + + self.theHLTChains = [] + self.theSeqLists = [] + self.theSeqDict = {} # dict by Seq output TE + + TriggerConfigHLT.sCurrentTriggerConfig = self + + + def registerHLTChain(self, chainName, chainConfig): + """ Adds chain to the set of self.allChains which are registered for further use """ + if logical_name in self.allChains: + self.allChains[chainName].append( chainConfig ) + else: + self.allChains[chainName] = [ chainConfig ] + + + def getHLTConfigFile(self): + return self.__HLTFile + + + def writeHLTConfigFile(self,smkPskName): + """ Writes HLT config file""" + if self.__HLTFile is None: + return + + log.info("Writing of config files needs to be implemented") + + + diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/TriggerMTConfig.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/TriggerMTConfig.py deleted file mode 100755 index 4d7ed0d12e2f9428bc8bb9f0c481e56ae8e6acbd..0000000000000000000000000000000000000000 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/TriggerMTConfig.py +++ /dev/null @@ -1,628 +0,0 @@ -# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration - -######################################################################################### -# User interface for the configuration, nothing beneath this class need to be studied -# -import re -import string -from collections import defaultdict -import xml.dom.minidom as minidom -import xml.etree.cElementTree as etree - -from AthenaCommon.CFElements import parOR, seqAND, stepSeq - - -from AthenaCommon.Logging import logging -log = logging.getLogger( 'TriggerMTConfig' ) - - - -class TriggerMTConfig: - sCurrentTriggerConfig = None - def currentTriggerConfig(): - return TriggerMTConfig.sCurrentTriggerConfig - currentTriggerConfig = staticmethod(currentTriggerConfig) - - def __init__(self, hltfile=None, signaturesOverwritten=False): - self.menuName = 'TestMenu' - self.__HLTFile = hltfile - self.allThresholds = {} - self.allItems = {} - self.allChains = {} - - self.theHLTChains = [] - self.theSeqLists = [] - self.theSeqDict = {} - self.theTopoStartFrom = [] - - # Sanity check since the second argument in __init__ used to be the l1 xml file name - if type(signaturesOverwritten)!=bool: - log.error('Wrong type for signaturesOverwritten. Received %s but expected bool', signaturesOverwritten) - - self.signaturesOverwritten = signaturesOverwritten - TriggerMTConfig.sCurrentTriggerConfig = self - - def printIt(self): - log.debug("self.theSeqLists: %s", self.theSeqLists) - log.debug("self.theSeqDict: %s", self.theSeqDict) - log.debug("self.theTopoStartFrom: %s", self.theTopoStartFrom) - - - -######################################################################################### -######################################################################################### -##### From HLTCFConfig.py -######################################################################################### -######################################################################################### - - -# Classes to configure the CF graph, via Nodes -from AthenaCommon.CFElements import parOR, seqAND, stepSeq - - -allAlgs={} -def useExisting(name): - global allAlgs - return allAlgs[name] - -def AlgExisting(name): - global allAlgs - return name in allAlgs - - -def remember(name, instance): - global allAlgs - allAlgs[name] = instance - return instance - - -class AlgNode(): - def __init__(self, Alg, inputProp, outputProp): - self.name = ("%s_%s_%s")%( Alg.name(), inputProp, outputProp) - self.algname = Alg.name() - self.outputProp=outputProp - self.inputProp=inputProp - self.configureAlg(Alg) - - def configureAlg(self, Alg): - alg_name = Alg.getName() - if AlgExisting(alg_name): - print "AlgNode::%s: found already Alg %s"%(self.name,alg_name) - self.Alg = useExisting(alg_name) - else: - print "AlgNode::%s: new Alg %s"%(self.name,alg_name) - self.Alg=Alg - remember(alg_name, self.Alg) - - if self.Alg is None: - return - - self.addDefaultOutput() - - def addDefaultOutput(self): - print "This is main addDefaultOutput" - self.setOutput(("%s_%s_out"%(self.algname,self.outputProp))) - #self.setOutput(("%s_out"%(self.name))) - - - def setPar(self, prop, name): - cval = self.Alg.getProperties()[prop] - try: - if type(cval) == type(list()): - cval.append(name) - setattr(self.Alg, prop, cval) - else: - setattr(self.Alg, prop, name) - except: - pass - - def setParArray(self, prop, name): - cval = self.Alg.getProperties()[prop] - try: - cval.append(name) - setattr(self.Alg, prop, cval) - except: - pass - - def getPar(self, prop): - try: - return getattr(self.Alg, prop) - except: - return self.Alg.getDefaultProperty(prop) - raise "Error in reading property " + prop + " from " + self.Alg - - - def setOutput(self, name): - return self.setPar(self.outputProp,name) - - def getOutput(self): - return self.getPar(self.outputProp) - - def getOutputList(self): - outputs = [] - cval = self.getOutput() - if type(cval) == type(list()): - outputs.extend(cval) - else: - outputs.append(cval) - return outputs - - def setInput(self, name): - return self.setPar(self.inputProp,name) - - def addInput(self, name): - return self.setParArray(self.inputProp,name) - - def getInput(self): - return self.getPar(self.inputProp) - - def getInputList(self): - inputs = [] - cval = self.getInput() - if type(cval) == type(list()): - inputs.extend(cval) - else: - inputs.append(cval) - return inputs - - def __str__(self): - return "Alg::%s [%s] -> [%s]"%(self.name,' '.join(map(str, self.getInputList())), ' '.join(map(str, self.getOutputList()))) - - - -class HypoAlgNode(AlgNode): - def __init__(self, Alg, inputProp, outputProp): - AlgNode.__init__(self, Alg, inputProp, outputProp) - self.tools = [] - self.previous=[] - - - def addHypoTool(self, hypotool): - if "Comb" in self.name: ###TMP combo, only one threshold - import re - thresholds = map(int, re.findall(r'\d+', hypotool.getName())) - self.setPar('Threshold1', thresholds[0]) - self.setPar('Threshold2', thresholds[1]) - status=self.setPar('DecisionLabel', hypotool.getName()) - else: - self.tools.append(hypotool.getName()) - status= self.setParArray('HypoTools',hypotool) - return status - - def addPreviousDecision(self,prev): - self.previous.append(prev) - status= self.setParArray('previousDecisions',prev) - return status - - def setPreviousDecision(self,prev): - if "Comb" in self.name: ###TMP combo: how handle previous decisions in combo? - self.previous.append(prev) - if "from_L1MU" in prev: - if "pt" in self.getPar("Property1"): - status= self.setPar('previousDecisions1',prev) - if "pt" in self.getPar("Property2"): - status= self.setPar('previousDecisions2',prev) - - if "from_L1EM" in prev: - if "et" in self.getPar("Property1"): - status= self.setPar('previousDecisions1',prev) - if "et" in self.getPar("Property2"): - status= self.setPar('previousDecisions2',prev) - - if "Output1" in prev: - status= self.setPar('previousDecisions1',prev) - if "Output2" in prev: - status= self.setPar('previousDecisions2',prev) - - else: - self.previous.append(prev) - status= self.setPar('previousDecisions',prev) - return status - - def __str__(self): - return "HypoAlg::%s [%s] -> [%s], previous = [%s], HypoTools=[%s] --> Alg %s"%(self.name,' '.join(map(str, self.getInputList())), - ' '.join(map(str, self.getOutputList())), - ' '.join(map(str, self.previous)), - ' '.join(map(str, self.tools)), self.Alg) - - - -class SequenceFilterNode(AlgNode): - def __init__(self, Alg, inputProp, outputProp): - AlgNode.__init__(self, Alg, inputProp, outputProp) - - def addDefaultOutput(self): - print "This is SequenceFilter addDefaultOutput" - return #do nothing - - def setChains(self, name): - return self.setPar("Chains", name) - - def getChains(self): - return self.getPar("Chains") - - -from TrigUpgradeTest.TrigUpgradeTestConf import HLTTest__TestRoRSeqFilter -class TestRoRSequenceFilterNode(SequenceFilterNode): - def __init__(self, name): - Alg= HLTTest__TestRoRSeqFilter(name, OutputLevel = 2) - inputProp='Inputs' - outputProp='Outputs' - SequenceFilterNode.__init__(self, Alg, inputProp, outputProp) - if "Step1" in self.name: # so that we see events running through, will be gone once L1 emulation is included - self.Alg.AlwaysPass = True - - - -from DecisionHandling.DecisionHandlingConf import RoRSeqFilter, DumpDecisions -class RoRSequenceFilterNode(SequenceFilterNode): - def __init__(self, name): - Alg= RoRSeqFilter(name, OutputLevel = 2) - inputProp='Input' - outputProp='Output' - SequenceFilterNode.__init__(self, Alg, inputProp, outputProp) - - - - -#### Here functions to create the CF tree from CF configuration objects - - -from AthenaCommon.AlgSequence import dumpSequence -def create_step_reco_node(name, seq_list, dump=0): - print "Create reco step %s with %d sequences"%(name, len(seq_list)) - stepCF = parOR(name+"_reco") - for seq in seq_list: - step_seq = create_CFSequence(seq) - stepCF += step_seq - - if dump: dumpSequence (stepCF, indent=0) - return stepCF - - -def create_step_filter_node(name, seq_list, dump=0): - print "Create filter step %s with %d filters"%(name, len(seq_list)) - stepCF = parOR(name+"_filter") - for seq in seq_list: - filterAlg=seq.filter.Alg - print "Add %s to filter node %s"%(filterAlg.name(),name) - stepCF += filterAlg - - if dump: dumpSequence (stepCF, indent=0) - return stepCF - - -def create_CFSequence(CFseq): - print "\n * Create CFSequence %s"%(CFseq.name) - filterAlg=CFseq.filter.Alg - - nodes = CFseq.getAllNodes() - algos = [] - for node in nodes: - algos.append(node.Alg) - - algos=list(set(algos)) - - step_seq = create_step_sequence( CFseq.name, filterAlg=filterAlg, rest=algos) - return step_seq - -def create_step_sequence(name, filterAlg, rest): - """ elementary HLT step sequencer, filterAlg is gating, rest is anything that needs to happe within the step """ - stepReco = parOR(name+"_reco", rest) - stepAnd = seqAND(name, [ filterAlg, stepReco ]) - return stepAnd - - -def find_stepCF_algs(step_list): - algos = [] - for step in step_list: - #print "Finding algos of step %s"%step - step_algs = [] - step_algs.append(step.filter) - for seq in step.menuSeq.nodeSeqList: - step_algs.extend(seq.algs ) - step_algs.append(seq.hypo) - algos.extend(step_algs) - return algos - - - -def addChainToHypoTool(hypotool, chain): - prop="Chains" - cval = hypotool.getProperties()[prop] - try: - cval.append(chain) - setattr(hypotool, prop, cval) - except: - pass - - -def addChainToHypoAlg(hypoAlg, chain): - if "Comb" in hypoAlg.algname: - prop="Chains" - cval = hypoAlg.Alg.getProperties()[prop] - try: - cval.append(chain) - setattr(hypoAlg.Alg, prop, cval) - except: - pass - - -####################################### -def decisionTree_From_Chains(HLTAllStepsSeq, chains, NSTEPS=1): - - testRoR=False - from TrigUpgradeTest.MenuComponents import CFSequence - #loop over chains to configure - count_steps=0 - for nstep in range(0, NSTEPS): - stepCF_name = "Step%i"%(nstep+1) - CFseq_list = [] - - for chain in chains: - chain_step_name= "%s:%s"%(stepCF_name, chain.name) - print "\n*******Filling step %s for chain %s"%(stepCF_name, chain.name) - - chain_step=chain.steps[count_steps] - sequenceHypoTools=chain_step.sequenceHypoTools - countseq=0 - for st in sequenceHypoTools: - sequence=st.sequence - hypotool=st.hypotool - addChainToHypoTool(hypotool, chain.name) - cfseq_name= sequence.name - - print "Going through sequence %s with threshold %s"%(sequence.name, hypotool.getName()) - #define sequence input - if count_steps == 0: # seeding - sequence_input= [nodeSeq.seed for nodeSeq in sequence.nodeSeqList] - print "Seeds from this chain: %s"%(sequence_input) - previous_sequence="".join(chain.group_seed) - else: - # from previous step, map the seuqence in the same order? - previous_sequence=chain.steps[count_steps-1].sequences[countseq].name #menu sequence - sequence_input=chain.steps[count_steps-1].sequences[countseq].outputs - print "Connect to previous sequence:" - print sequence_input - # add hypotools - for nodeSeq in sequence.nodeSeqList: - hypoAlg= nodeSeq.hypo - print "Adding %s to %s"%(hypotool.getName(),hypoAlg.algname) - hypoAlg.addHypoTool(hypotool) - addChainToHypoAlg(hypoAlg, chain.name) # only for TMP Combo - - - - #### FILTER - # one filter per previous sequence at the start of the sequence: check if it exists or create a new one - # if the previous hypo has more than one output, try to get all of them - # one filter per previous sequence: 1 input/previous seq, 1 output/next seq - filter_name="Filter%s_on_%s"%(stepCF_name,previous_sequence) - filter_out=["%s_from_%s_out"%(filter_name,i) for i in sequence_input] - filter_already_exists=False - findFilter= [cfseq.filter for cfseq in CFseq_list if filter_name in cfseq.filter.algname] - if len(findFilter): - print "Filter %s already exists"%(filter_name) - filter_already_exists=True - sfilter=findFilter[0] - print "Adding chain %s to %s"%(chain.name,sfilter.algname) - sfilter.setChains(chain.name) - continue - else: - if (testRoR): - sfilter = TestRoRSequenceFilterNode(name=filter_name) - else: - sfilter = RoRSequenceFilterNode(name=filter_name) - for o in filter_out: sfilter.setOutput(o) - for i in sequence_input: sfilter.addInput(i) - sfilter.setChains(chain.name) - print "Filter Done: %s"%(sfilter) - - #loop over NodeSequences of this sequence to add inputs to InputMaker and send decisions to HypoAlg - for nodeSeq in sequence.nodeSeqList: - seed=nodeSeq.seed - input_maker_input= [inp for inp in sfilter.getOutputList() if ("from_"+seed) in inp] - print "Adding %d inputs to sequence::%s from Filter::%s (from seed %s)"%(len(input_maker_input), nodeSeq.name, sfilter.algname, seed) - for i in input_maker_input: print i - if len(input_maker_input) == 0: -# print "ERROR, no inputs to sequence are set!" - sys.exit("ERROR, no inputs to sequence are set!") -# return - for i in input_maker_input: nodeSeq.addInput(i) - - hypoAlg= nodeSeq.hypo - #node = AlgNode(Alg=hypoAlg.Alg,inputProp='', outputProp='Output1') - for i in input_maker_input: hypoAlg.setPreviousDecision(i) # works for one - #for i in input_maker_input: hypoAlg.addPreviousDecision(i) - - print hypoAlg - - - CF_seq = CFSequence( cfseq_name, FilterAlg=sfilter, MenuSequence=sequence) - #for node in otherNodes: CF_seq.addNode(node) - print CF_seq - CFseq_list.append(CF_seq) - countseq+=1 - - #end of sequence/threshold - - #end of loop over chains for this step, now implement CF: - print "\n******** Create CF Tree %s with AthSequencers",stepCF_name - #first make the filter step - stepFilter = create_step_filter_node(stepCF_name, CFseq_list, dump=0) - HLTAllStepsSeq += stepFilter - - stepCF = create_step_reco_node(stepCF_name, CFseq_list, dump=0) - HLTAllStepsSeq += stepCF - - print "Now Draw..." - stepCF_DataFlow_to_dot(stepCF_name, CFseq_list) - stepCF_ControlFlow_to_dot(stepCF) - - - print "Added stepCF %s to the root"%stepCF_name - count_steps+=1 - print "************* End of step %s"%stepCF_name - # end of steps - - #stepCF_ControlFlow_to_dot(HLTAllStepsSeq) - dumpSequence (HLTAllStepsSeq, indent=0) - return -##### - - - - -###### Here some graphical methods - - -from ViewAlgsTest.connectAlgorithmsIO import connectAlgorithmsIO, graph_generator -from AthenaCommon.AlgSequence import AthSequencer - - -def algColor(alg): - if "Hypo" in alg: return "darkorchid1" - if "Filter" in alg: return "chartreuse3" - if "InputMaker" in alg: return "cyan3" - return "cadetblue1" - -def stepCF_ControlFlow_to_dot(stepCF): - def _dump (seq, indent): - o = list() - for c in seq.getChildren(): - if "AthSequencer" in c.getFullName(): - o.append( ("%s[color=%s, shape=circle, width=.5, fixedsize=true ,style=filled]\n"%(c.name(),_seqColor(c)), indent) ) - else: - o.append( ("%s[fillcolor=%s,style=filled]\n"%(c.name(),algColor(c.name())), indent) ) - o.append( ("%s -> %s\n"%(seq.name(), c.name()), indent)) - o.extend( _dump (c, indent+1) ) - return o - - def _parOR (seq): - if seq.ModeOR is True: - if seq.Sequential is False: - if seq.StopOverride is True: - return True - return False - - def _seqAND(seq): - if seq.ModeOR is False: - if seq.Sequential is True: - if seq.StopOverride is False: - return True - return False - - def _seqColor(seq): - if _parOR(seq): return "red" - if _seqAND(seq): return "blue" - return "black" - - - - # to visualize: dot -T pdf Step1.dot > Step1.pdf - file = open( '%s.CF.dot'%stepCF.name(), mode="wt" ) - #strict - file.write( 'digraph step {\n'\ - +'\n'\ - +' node [ shape=polygon, fontname=Helvetica ]\n'\ - +' edge [ fontname=Helvetica ]\n' - +' %s [shape=Mdiamond]\n'%stepCF.name()) - - indent=0 - out = [("%s[color=%s shape=circle]\n"%(stepCF.name(),_seqColor(stepCF)), indent)] - - out.extend( _dump( stepCF, indent=indent+1 ) ) - for n,i in out: - line= " "*i+ n - file.write(line) - - file.write( '}\n') - - - - - -def stepCF_DataFlow_to_dot(name, cfseq_list): - # to visualize: dot -T pdf Step1.dot > Step1.pdf - file = open( '%s.DF.dot'%name, mode="wt" ) - #strict - file.write( 'digraph step {\n'\ - +'\n'\ - +' node [ shape=polygon, fontname=Helvetica ]\n'\ - +' edge [ fontname=Helvetica ]\n' - +' %s [shape=Mdiamond]\n'%name) - - - for cfseq in cfseq_list: - print cfseq.name - file.write(" %s[fillcolor=%s style=filled]\n"%(cfseq.filter.algname,algColor(cfseq.filter.algname))) - for inp in cfseq.filter.getInputList(): - file.write(addConnection(name, cfseq.filter.algname, inp)) - - file.write( '\n subgraph cluster_%s {\n'%(cfseq.name)\ - +' node [color=white style=filled]\n'\ - +' style=filled\n'\ - +' color=lightgrey\n'\ - +' fontname=Helvetica\n'\ - +' label = %s\n'%(cfseq.name)) - - cfseq_algs = [] - cfseq_algs.append(cfseq.filter) - - for seq in cfseq.menuSeq.nodeSeqList: - # cfseq_algs.append(seq.inputMaker) - cfseq_algs.extend(seq.algs ) - if seq.reuse==False: - # file.write(" %s[fillcolor=%s]\n"%(seq.inputMaker.algname, algColor(seq.inputMaker.algname))) - for alg in seq.algs: file.write(" %s[fillcolor=%s]\n"%(alg.algname, algColor(alg.algname))) - seq.reuse=True - cfseq_algs.append(seq.hypo) - - file.write(" %s[color=%s]\n"%(seq.hypo.algname, algColor(seq.hypo.algname))) - file.write(' }\n') - file.write(findConnections(cfseq_algs)) - file.write('\n') - - file.write( '}') - file.close() - - -def findConnections(alg_list): - lineconnect='' - for nodeA in alg_list: - for nodeB in alg_list: - if nodeA is nodeB: - continue - dataIntersection = list(set(nodeA.getOutputList()) & set(nodeB.getInputList())) - if len(dataIntersection) > 0: - for line in dataIntersection: - lineconnect+=addConnection(nodeA.algname,nodeB.algname, line) - print 'Data connections between %s and %s: %s'%(nodeA.algname, nodeB.algname, line) - return lineconnect - -def addConnection(nodeA, nodeB, label): - line = " %s -> %s [label=%s]\n"%(nodeA,nodeB,label) - # print line - return line - - - - - - - - - - - - - - - - - - - - - - diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Photon/__init__.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Photon/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d0cb751d0f336e3ac36673d3352ecaed8478e92f --- /dev/null +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Photon/__init__.py @@ -0,0 +1 @@ +#Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration diff --git a/Trigger/TriggerCommon/TriggerMenuMT/scripts/generateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/scripts/generateMenuMT.py index f8f6a7dd08cb76985cdb25c368024bf20967c6c3..0c3ffce84b7b42a900403d32138f2c59c8787d08 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/scripts/generateMenuMT.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/scripts/generateMenuMT.py @@ -1,20 +1,65 @@ #!/bin/env python -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration -def generateMenu(menu): - from TriggerMenu import setUseNewTriggerMenu - setUseNewTriggerMenu() - from TriggerMenu.menu import GenerateMenu - from TriggerJobOpts.TriggerFlags import TriggerFlags +# import flags +include("TrigUpgradeTest/testHLT_MT.py") + +################################# +# Configure L1Decoder +################################# + +# provide a minimal menu information +if globalflags.InputFormat.is_bytestream(): + topSequence.L1DecoderTest.ctpUnpacker.OutputLevel=DEBUG + topSequence.L1DecoderTest.roiUnpackers[0].OutputLevel=DEBUG + +# map L1 decisions for menu +for unpack in topSequence.L1DecoderTest.roiUnpackers: + if unpack.name() is "EMRoIsUnpackingTool": + unpack.Decisions="L1EM" + emUnpacker=unpack + if unpack.name() is "MURoIsUnpackingTool": + unpack.Decisions="L1MU" + +for unpack in topSequence.L1DecoderTest.rerunRoiUnpackers: + if unpack.name() is "EMRerunRoIsUnpackingTool": + unpack.Decisions="RerunL1EM" + unpack.SourceDecisions="L1EM" + +for unpack in topSequence.L1DecoderTest.rerunRoiUnpackers: + if unpack.name() is "EMRerunRoIsUnpackingTool": + unpack.SourceDecisions="L1EM" + if unpack.name() is "MURerunRoIsUnpackingTool": + unpack.SourceDecisions="L1MU" + + + +# this is a temporary hack to include new test chains +# very hacky indeed, the L1 part should be in in the GenerateMenuMT part + +from TriggerJobOpts.TriggerFlags import TriggerFlags +TriggerFlags.triggerMenuSetup = "LS2_v1" + +from TriggerMenuMT.HLTMenuConfig.Menu.GenerateMenuMT import GenerateMenuMT +g = GenerateMenuMT() +#allChainConfigs = g.generateChainConfigs() +allChainConfigs = g.getChainsFromMenu() + +EnabledChainNamesToCTP = dict([ (c[0], c[1]) for c in allChainConfigs]) +topSequence.L1DecoderTest.ChainToCTPMapping = EnabledChainNamesToCTP + + + +########################################## +# Menu and CF construction +########################################## +g.generateMT() + + - # what menu to build - TriggerFlags.triggerMenuSetup = menu - GenerateMenu.generateMenu() -if __name__=="__main__": - generateMenu(menu="Physics_pp_v6") diff --git a/Trigger/TriggerCommon/TriggerMenuMT/scripts/testMenuMT.sh b/Trigger/TriggerCommon/TriggerMenuMT/scripts/testMenuMT.sh index 8a937e1b3b54b80fc462cd62af44d2fa461a1516..a1701f22b7bed224529e4ab19a9c0384dce497b8 100755 --- a/Trigger/TriggerCommon/TriggerMenuMT/scripts/testMenuMT.sh +++ b/Trigger/TriggerCommon/TriggerMenuMT/scripts/testMenuMT.sh @@ -1,2 +1,82 @@ #!/usr/bin/env sh -athena.py -c "TriggerMenuSetup='MC_pp_v7'" TriggerMenuXML/runHLT_forXMLgeneration.py + +help() { + echo "Syntax: testMenuMT.sh [-r VERSION] MENU [DEST]" +} + +if [ $# -lt 1 ]; then + help + exit 0 +fi + +while true; do + case "$1" in + -r) + release=$2 + shift 2 + ;; + -h) + help + exit 0 + ;; + -*) + echo "Invalid parameter" + exit 1 + ;; + *) + break + esac +done + +menu=$1 +dest=$2 +if [ -z "$dest" ]; then + dest=$PWD +fi + +# Get absolute path name +dest=`cd $dest; pwd` + +if [ -z "$release" ]; then + release=${AtlasVersion} # for interactive use +fi + +# Temporary run directroy and cleanup traps in case of termination +rundir=`mktemp -t -d tmxml.${menu}.XXXXXXXXXX` +TRAPINT() { + rm -rf $rundir + return 130 # 128+SIGINT +} +TRAPTERM() { + rm -rf $rundir + return 143 # 128+SIGTERM +} + + +## menu generation starts here +echo "generateHLTMenuMT: Building menu: ${menu} for ${release}" +logfiletopo=topo${menu}.log +logfilelvl1=lvl1${menu}.log +logfilehlt=hlt${menu}.log +cd $rundir + +generateLVL1MenuMT.py $menu >&! logfiletopo +generateL1TopoMenuMT.py $menu >&! logfilelvl1 +generateMenuMT.py $menu >&! logfilehlt + +cp L1Topoconfig_*.xml ${dest} +cp LVL1config_*.xml ${dest} +#cp $logfilelvl1 $logfiletopo ${dest} + +if [[ -e outputLVL1config.xml ]]; then + cp outputLVL1config.xml ${dest}/LVL1config_${menu}_${release}.xml +fi + +#this gives some more sensitivity to hidden problems +grep --colour ERROR ${dest}/$logfile +grep --colour -A 100 "Shortened traceback" ${dest}/$logfile + +rm -rf $rundir + +# Do not return real athena exit code as we want to pretend everything was fine +#unset PYTHONDONTWRITEBYTECODE diff --git a/Trigger/TriggerCommon/TriggerMenuMT/scripts/test_HLTmenu.sh b/Trigger/TriggerCommon/TriggerMenuMT/scripts/test_HLTmenu.sh new file mode 100644 index 0000000000000000000000000000000000000000..53f5e39704237e68106cd72259ebff280268f04b --- /dev/null +++ b/Trigger/TriggerCommon/TriggerMenuMT/scripts/test_HLTmenu.sh @@ -0,0 +1,3 @@ +#!bin/sh + +athena -l DEBUG --threads=1 --skipEvents=10 --evtMax=20 --filesInput="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1" TriggerMenuMT/generateMenuMT.py diff --git a/Trigger/TriggerCommon/TriggerMenuMT/share/generateMT.py b/Trigger/TriggerCommon/TriggerMenuMT/share/generateMT.py index 642777fb25ae7953f86d72e5822e39c5f1cb1f05..e2af3b1baa4c8b0094a4eab27a94a9ea91a99c6d 100755 --- a/Trigger/TriggerCommon/TriggerMenuMT/share/generateMT.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/share/generateMT.py @@ -1,16 +1,46 @@ -#!/bin/env python +# import flags +include("TrigUpgradeTest/testHLT_MT.py") -from AthenaCommon.AthenaCommonFlags import jobproperties -from AthenaCommon.GlobalFlags import jobproperties +################################# +# Configure L1Decoder +################################# -jobproperties.print_JobProperties('tree&value') +# provide a minimal menu information +if globalflags.InputFormat.is_bytestream(): + topSequence.L1DecoderTest.ctpUnpacker.OutputLevel=DEBUG + topSequence.L1DecoderTest.roiUnpackers[0].OutputLevel=DEBUG +# map L1 decisions for menu +for unpack in topSequence.L1DecoderTest.roiUnpackers: + if unpack.name() is "EMRoIsUnpackingTool": + unpack.Decisions="L1EM" + emUnpacker=unpack + if unpack.name() is "MURoIsUnpackingTool": + unpack.Decisions="L1MU" + +for unpack in topSequence.L1DecoderTest.rerunRoiUnpackers: + if unpack.name() is "EMRerunRoIsUnpackingTool": + unpack.Decisions="RerunL1EM" + unpack.SourceDecisions="L1EM" -from TriggerMenuMT.HLTMenuConfig.Menu.GenerateMenu import GenerateMenuMT +for unpack in topSequence.L1DecoderTest.rerunRoiUnpackers: + if unpack.name() is "EMRerunRoIsUnpackingTool": + unpack.SourceDecisions="L1EM" + if unpack.name() is "MURerunRoIsUnpackingTool": + unpack.SourceDecisions="L1MU" + + + +########################################## +# Menu and CF construction +########################################## + +from TriggerMenuMT.HLTMenuConfig.Menu.GenerateMenuMT import GenerateMenuMT g = GenerateMenuMT() g.generateMT() -jobproperties.AthenaCommonFlags.EvtMax=0 -jobproperties.print_JobProperties('tree&value') + + +