diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/data/example_config.yaml b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/data/example_config.yaml index 0e2e9eaf1d721a02a69b305e958b166f06b9d234..43233db3275c938a1465537466beb1f311773148 100644 --- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/data/example_config.yaml +++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/data/example_config.yaml @@ -58,6 +58,21 @@ TauJets: WorkingPoint: - selectionName: 'tight' quality: 'Tight' + TriggerSF: + tauID: 'Tight' + triggerChainsPerYear: + '2015': + - 'HLT_tau25_medium1_tracktwo' + - 'HLT_tau35_medium1_tracktwo' + '2016': + - 'HLT_tau25_medium1_tracktwo' + - 'HLT_tau35_medium1_tracktwo' + '2017': + - 'HLT_tau25_medium1_tracktwo' + - 'HLT_tau35_medium1_tracktwo' + '2018': + - 'HLT_tau25_medium1_tracktwoEF_OR_mediumRNN_tracktwoMVA' + - 'HLT_tau35_medium1_tracktwoEF_OR_mediumRNN_tracktwoMVA' PtEtaSelection: {} GeneratorLevelAnalysis: {} diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/ConfigFactory.py b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/ConfigFactory.py index 6829656c7abef2f016a849b86cd4a098b2891dc4..c598dc45b70c978540c328db4c6fa96a0046fa64 100644 --- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/ConfigFactory.py +++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/ConfigFactory.py @@ -271,6 +271,9 @@ class ConfigFactory(): from TauAnalysisAlgorithms.TauAnalysisConfig import TauWorkingPointConfig self.addAlgConfigBlock(algName="WorkingPoint", alg=TauWorkingPointConfig, superBlocks="TauJets") + from TauAnalysisAlgorithms.TauAnalysisConfig import TauTriggerAnalysisSFBlock + self.addAlgConfigBlock(algName="TriggerSF", alg=TauTriggerAnalysisSFBlock, + superBlocks="TauJets") # SystObjectLink from AsgAnalysisAlgorithms.SystObjectLinkConfig import SystObjectLinkBlock diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py index 0c4dc6fd91c0ef3d08b2ab99795327a85717170e..d712a324ebb162505a8b6766274bf5cf51516840 100644 --- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py +++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py @@ -21,6 +21,12 @@ triggerChains = [ 'HLT_mu20_mu8noL1', 'HLT_2e17_lhvloose_nod0' ] +tauTriggerChainsSF = { + '2015': ['HLT_tau25_medium1_tracktwo', 'HLT_tau35_medium1_tracktwo'], + '2016': ['HLT_tau25_medium1_tracktwo', 'HLT_tau35_medium1_tracktwo'], + '2017': ['HLT_tau25_medium1_tracktwo', 'HLT_tau35_medium1_tracktwo'], + '2018': ['HLT_tau25_medium1_tracktwoEF_OR_mediumRNN_tracktwoMVA', 'HLT_tau35_medium1_tracktwoEF_OR_mediumRNN_tracktwoMVA'], +} # Example cuts used for event selection algorithm test exampleSelectionCuts = { @@ -855,6 +861,12 @@ def makeSequenceBlocks (dataType, algSeq, forCompare, isPhyslite, selectionName='tight') configSeq.setOptionValue ('.quality', 'Tight') + if not forCompare: + configSeq += config.makeConfig('TauJets.TriggerSF') + configSeq.setOptionValue('.containerName', 'AnaTauJets') + configSeq.setOptionValue('.tauID', 'Tight') + configSeq.setOptionValue('.triggerChainsPerYear', tauTriggerChainsSF) + configSeq += config.makeConfig ('TauJets.PtEtaSelection', containerName='AnaTauJets') configSeq.setOptionValue ('.selectionDecoration', 'selectPtEta') diff --git a/PhysicsAnalysis/Algorithms/TauAnalysisAlgorithms/python/TauAnalysisConfig.py b/PhysicsAnalysis/Algorithms/TauAnalysisAlgorithms/python/TauAnalysisConfig.py index 644b1470c7b85d6edde50633c324f918566ab62d..f09e60d4fdebcd9ad74ab7b5650d655ee71f0fb6 100644 --- a/PhysicsAnalysis/Algorithms/TauAnalysisAlgorithms/python/TauAnalysisConfig.py +++ b/PhysicsAnalysis/Algorithms/TauAnalysisAlgorithms/python/TauAnalysisConfig.py @@ -3,6 +3,7 @@ # AnaAlgorithm import(s): from AnalysisAlgorithmsConfig.ConfigBlock import ConfigBlock from AnalysisAlgorithmsConfig.ConfigAccumulator import DataType +from Campaigns.Utils import Campaign class TauCalibrationConfig (ConfigBlock): @@ -228,3 +229,67 @@ def makeTauWorkingPointConfig( seq, containerName, workingPoint, selectionName, config.setOptionValue ('legacyRecommendations', legacyRecommendations) config.setOptionValue ('noEffSF', noEffSF) seq.append (config) + + +class TauTriggerAnalysisSFBlock (ConfigBlock): + + def __init__ (self, configName='') : + super (TauTriggerAnalysisSFBlock, self).__init__ () + + self.addOption ('triggerChainsPerYear', {}, type=None, + info="a dictionary with key (string) the year and value (list of " + "strings) the trigger chains. The default is {} (empty dictionary).") + self.addOption ('tauID', '', type=str, + info="the tau quality WP (string) to use.") + self.addOption ('containerName', '', type=str, + info="the input tau container, with a possible selection, in " + "the format container or container.selection.") + + def makeAlgs (self, config) : + + if config.dataType() is not DataType.Data: + if config.campaign() is Campaign.MC20a: + triggers = self.triggerChainsPerYear.get('2015',[]) + triggers += self.triggerChainsPerYear.get('2016',[]) + # Remove potential duplicates + triggers = list(set(triggers)) + elif config.campaign() is Campaign.MC20d: + triggers = self.triggerChainsPerYear.get('2017',[]) + elif config.campaign() is Campaign.MC20e: + triggers = self.triggerChainsPerYear.get('2018',[]) + elif config.campaign() in [Campaign.MC21a, Campaign.MC23a]: + triggers = self.triggerChainsPerYear.get('2022',[]) + elif config.campaign() is Campaign.MC23c: + triggers = self.triggerChainsPerYear.get('2023',[]) + + for trig in triggers: + alg = config.createAlgorithm( 'CP::TauEfficiencyCorrectionsAlg', + 'TauTrigEfficiencyCorrectionsAlg' + trig ) + config.addPrivateTool( 'efficiencyCorrectionsTool', + 'TauAnalysisTools::TauEfficiencyCorrectionsTool' ) + # SFTriggerHadTau correction type from + # https://gitlab.cern.ch/atlas/athena/-/blob/main/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h#L79 + alg.efficiencyCorrectionsTool.EfficiencyCorrectionTypes = [12] + alg.efficiencyCorrectionsTool.TriggerName = trig + + # JetIDLevel from + # https://gitlab.cern.ch/atlas/athena/-/blob/main/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h#L79 + if self.tauID=="Loose": + JetIDLevel = 7 + elif self.tauID=="Medium": + JetIDLevel = 8 + elif self.tauID=="Tight": + JetIDLevel = 9 + else: + raise ValueError ("invalid tauID: \"" + self.tauID + "\". Allowed values are loose, medium, tight") + alg.efficiencyCorrectionsTool.JetIDLevel = JetIDLevel + alg.efficiencyCorrectionsTool.TriggerSFMeasurement = "combined" + + alg.scaleFactorDecoration = 'tau_trigEffSF_' + trig + '_%SYS%' + alg.outOfValidity = 2 #silent + alg.outOfValidityDeco = 'bad_eff_tautrig_' + trig + alg.taus = config.readName (self.containerName) + alg.preselection = config.getPreselection (self.containerName, self.tauID) + config.addOutputVar (self.containerName, alg.scaleFactorDecoration, 'trigEffSF_' + trig) + + return