From d7866b3aacb414d3720272c21bc8e4a9c0b3a524 Mon Sep 17 00:00:00 2001 From: Baptiste Ravina <baptiste.ravina@cern.ch> Date: Wed, 20 Mar 2024 15:31:43 +0100 Subject: [PATCH] CPAlgorithms: an easier way to disable global trigger matching and efficiency CPAlgorithms: an easier way to disable global trigger matching and efficiency --- .../python/TriggerAnalysisConfig.py | 65 ++----------------- 1 file changed, 6 insertions(+), 59 deletions(-) diff --git a/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/python/TriggerAnalysisConfig.py b/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/python/TriggerAnalysisConfig.py index 60c02eb58854..5262d3de6f37 100644 --- a/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/python/TriggerAnalysisConfig.py +++ b/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/python/TriggerAnalysisConfig.py @@ -25,8 +25,9 @@ class TriggerAnalysisBlock (ConfigBlock): self.addOption ('muons', '', type=str) self.addOption ('photons', '', type=str) self.addOption ('noEffSF', False, type=bool) + self.addOption ('noGlobalTriggerEff', False, type=bool) - def makeTriggerDecisionAlg(self, config): + def makeTriggerDecisionTool(self, config): # Create public trigger tools xAODConfTool = config.createPublicTool( 'TrigConf::xAODConfigTool', 'xAODConfigTool' ) @@ -39,7 +40,7 @@ class TriggerAnalysisBlock (ConfigBlock): return decisionTool - def makeTriggerMatchingAlg(self, config, decisionTool): + def makeTriggerMatchingTool(self, config, decisionTool): # Create public trigger tools drScoringTool = config.createPublicTool( 'Trig::DRScoringTool', 'DRScoringTool' ) @@ -154,70 +155,16 @@ class TriggerAnalysisBlock (ConfigBlock): self.triggerChainsForSelection = list(triggers) # Create the decision algorithm, keeping track of the decision tool for later - decisionTool = self.makeTriggerDecisionAlg(config) + decisionTool = self.makeTriggerDecisionTool(config) # Now pass it to the matching algorithm, keeping track of the matching tool for later - matchingTool = self.makeTriggerMatchingAlg(config, decisionTool) + matchingTool = self.makeTriggerMatchingTool(config, decisionTool) if self.triggerChainsForSelection: self.makeTriggerSelectionAlg(config, decisionTool) # Calculate multi-lepton (electron/muon/photon) trigger efficiencies and SFs - if self.triggerChainsPerYear: + if self.triggerChainsPerYear and not self.noGlobalTriggerEff: self.makeTriggerGlobalEffCorrAlg(config, decisionTool, matchingTool, self.noEffSF) return - - -def makeTriggerAnalysisConfig( seq, - triggerChainsPerYear = None, - triggerChainsForSelection = None, - prescaleLumiCalcFiles = None, - noFilter = None, - noL1 = None, - electronWorkingPoint = None, - muonWorkingPoint = None, - photonWorkingPoint = None, - electrons = None, - muons = None, - photons = None, - noEffSF = None, - configName = 'Trigger'): - """Create a basic trigger analysis algorithm sequence - - Keyword arguments: - triggerChainsPerYear -- a dictionary with key (str) the year and value (list of strings) the trigger chains - triggerChainsForSelection -- a list of trigger chains to be used for trigger selection, only set it if you need a different setup than for SFs! - prescaleLumiCalcFiles -- a list of lumicalc files to calculate trigger prescales - noFilter -- do not apply an event filter (i.e. don't skip any events) - noL1 -- do not check the L1 decision - noEffSF -- Disables the calculation of efficiencies and scale factors (just matching) - """ - - config = TriggerAnalysisBlock (configName) - config.setOptionValue ('triggerChainsPerYear', triggerChainsPerYear) - config.setOptionValue ('triggerChainsForSelection', triggerChainsForSelection) - config.setOptionValue ('prescaleLumiCalcFiles', prescaleLumiCalcFiles) - config.setOptionValue ('noFilter', noFilter) - config.setOptionValue ('noL1', noL1) - if electronWorkingPoint is not None: - splitWP = electronWorkingPoint.split ('.') - if len (splitWP) != 2 : - raise ValueError (f'electron working point should be of format "likelihood.isolation", not {electronWorkingPoint}') - config.setOptionValue ('electronID', splitWP[0]) - config.setOptionValue ('electronIsol', splitWP[1]) - if muonWorkingPoint is not None: - splitWP = muonWorkingPoint.split ('.') - if len (splitWP) != 2 : - raise ValueError (f'muon working point should be of format "likelihood.isolation", not {muonWorkingPoint}') - config.setOptionValue ('muonID', splitWP[0]) - if photonWorkingPoint is not None: - splitWP = photonWorkingPoint.split ('.') - if len (splitWP) != 2 : - raise ValueError (f'photon working point should be of format "likelihood.isolation", not {photonWorkingPoint}') - config.setOptionValue ('photonIsol', splitWP[1]) - config.setOptionValue('electrons', electrons) - config.setOptionValue('muons', muons) - config.setOptionValue('photons', photons) - config.setOptionValue('noEffSF', noEffSF) - seq.append (config) -- GitLab