ATLAS Offline Software
DiTauAnalysisConfig.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2 
3 # AnaAlgorithm import(s):
4 from AnalysisAlgorithmsConfig.ConfigBlock import ConfigBlock
5 from AnalysisAlgorithmsConfig.ConfigAccumulator import DataType
6 
7 
8 class DiTauCalibrationConfig (ConfigBlock):
9  """the ConfigBlock for the tau four-momentum correction"""
10 
11  def __init__ (self) :
12  super (DiTauCalibrationConfig, self).__init__ ()
13  self.setBlockName('DiTaus')
14  self.addOption ('inputContainer', '', type=str,
15  info="select ditau input container, by default set to DiTauJets")
16  self.addOption ('containerName', '', type=str,
17  noneAction='error',
18  info="the name of the output container after calibration.")
19  self.addOption ('postfix', '', type=str,
20  info="a postfix to apply to decorations and algorithm names. "
21  "Typically not needed here since the calibration is common to "
22  "all ditaus.")
23  self.addOption ('rerunTruthMatching', True, type=bool,
24  info="whether to rerun truth matching (sets up an instance of "
25  "CP::DiTauTruthMatchingAlg). The default is True.")
26 
27  def instanceName (self) :
28  """Return the instance name for this block"""
29  return self.containerName + self.postfix
30 
31  def makeAlgs (self, config) :
32 
33  postfix = self.postfix
34  if postfix != '' and postfix[0] != '_' :
35  postfix = '_' + postfix
36 
37  inputContainer = "DiTauJets"
38  if self.inputContainer:
39  inputContainer = self.inputContainer
40  config.setSourceName (self.containerName, inputContainer)
41 
42  # Set up the tau truth matching algorithm:
43  if self.rerunTruthMatching and config.dataType() is not DataType.Data:
44  alg = config.createAlgorithm( 'CP::DiTauTruthMatchingAlg',
45  'DiTauTruthMatchingAlg' )
46  config.addPrivateTool( 'matchingTool',
47  'TauAnalysisTools::DiTauTruthMatchingTool' )
48  alg.taus = config.readName (self.containerName)
49  alg.preselection = config.getPreselection (self.containerName, '')
50 
51  # Set up the tau 4-momentum smearing algorithm:
52  alg = config.createAlgorithm( 'CP::DiTauSmearingAlg', 'DiTauSmearingAlg' )
53  config.addPrivateTool( 'smearingTool', 'TauAnalysisTools::DiTauSmearingTool' )
54  alg.taus = config.readName (self.containerName)
55  alg.tausOut = config.copyName (self.containerName)
56  alg.preselection = config.getPreselection (self.containerName, '')
57 
58 
59 class DiTauWorkingPointConfig (ConfigBlock) :
60  """the ConfigBlock for the tau working point
61 
62  This may at some point be split into multiple blocks (16 Mar 22)."""
63 
64  def __init__ (self) :
65  super (DiTauWorkingPointConfig, self).__init__ ()
66  self.addOption ('containerName', '', type=str,
67  noneAction='error',
68  info="the name of the input container.")
69  self.addOption ('selectionName', '', type=str,
70  noneAction='error',
71  info="the name of the tau-jet selection to define (e.g. tight or "
72  "loose).")
73  self.addOption ('postfix', None, type=str,
74  info="a postfix to apply to decorations and algorithm names. "
75  "Typically not needed here as selectionName is used internally.")
76  self.addOption ('quality', None, type=str,
77  info="the ID WP (string) to use. Supported ID WPs: Tight, Medium, "
78  "Loose, VeryLoose, Baseline, BaselineForFakes.")
79  self.addOption ('addSelectionToPreselection', True, type=bool,
80  info="whether to retain only ditau-jets satisfying the working point "
81  "requirements. The default is True.")
82 
83  def instanceName (self) :
84  """Return the instance name for this block"""
85  if self.postfix is not None:
86  return self.containerName + '_' + self.selectionName + self.postfix
87  else:
88  return self.containerName + '_' + self.selectionName
89 
90  def makeAlgs (self, config) :
91 
92  selectionPostfix = self.selectionName
93  if selectionPostfix != '' and selectionPostfix[0] != '_' :
94  selectionPostfix = '_' + selectionPostfix
95 
96  postfix = self.postfix
97  if postfix is None :
98  postfix = self.selectionName
99  if postfix != '' and postfix[0] != '_' :
100  postfix = '_' + postfix
101 
102  # using enum value from: https://gitlab.cern.ch/atlas/athena/blob/21.2/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h
103  # the dictionary is missing in Athena, so hard-coding values here
104  if self.quality == 'Tight' :
105  IDLevel = 4 # ROOT.TauAnalysisTools.JETIDBDTTIGHT
106  elif self.quality == 'Medium' :
107  IDLevel = 3 # ROOT.TauAnalysisTools.JETIDBDTMEDIUM
108  elif self.quality == 'Loose' :
109  IDLevel = 2 # ROOT.TauAnalysisTools.JETIDBDTLOOSE
110  else :
111  raise ValueError ("invalid tau quality: \"" + self.quality +
112  "\", allowed values are Tight, Medium, Loose")
113 
114  inputfile = 'TauAnalysisAlgorithms/ditau_selection_highpt.conf'
115  if "DiTauJetsLowPt" in self.containerName:
116  inputfile = 'TauAnalysisAlgorithms/ditau_selection_lowpt.conf'
117 
118  # Set up the algorithm selecting taus:
119  alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'DiTauSelectionAlg' )
120  config.addPrivateTool( 'selectionTool', 'TauAnalysisTools::DiTauSelectionTool' )
121  alg.selectionTool.ConfigPath = inputfile
122  alg.selectionDecoration = 'selected_ditau' + selectionPostfix + ',as_char'
123  alg.particles = config.readName (self.containerName)
124  alg.preselection = config.getPreselection (self.containerName, self.selectionName)
125  config.addSelection (self.containerName, self.selectionName, alg.selectionDecoration,
126  preselection=self.addSelectionToPreselection)
127 
128 
129  # Set up the algorithm calculating the efficiency scale factors for the
130  # taus:
131  if config.dataType() is not DataType.Data:
132  alg = config.createAlgorithm( 'CP::DiTauEfficiencyCorrectionsAlg',
133  'DiTauEfficiencyCorrectionsAlg' )
134  config.addPrivateTool( 'efficiencyCorrectionsTool',
135  'TauAnalysisTools::DiTauEfficiencyCorrectionsTool' )
136  alg.efficiencyCorrectionsTool.JetIDLevel = IDLevel
137  alg.scaleFactorDecoration = 'tau_effSF' + postfix + '_%SYS%'
138  # alg.outOfValidity = 2 #silent
139  # alg.outOfValidityDeco = "bad_eff"
140  alg.taus = config.readName (self.containerName)
141  alg.preselection = config.getPreselection (self.containerName, self.selectionName)
142  config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
143  'effSF' + postfix)
144 
python.DiTauAnalysisConfig.DiTauWorkingPointConfig.quality
quality
Definition: DiTauAnalysisConfig.py:104
python.DiTauAnalysisConfig.DiTauWorkingPointConfig.instanceName
def instanceName(self)
Definition: DiTauAnalysisConfig.py:83
python.DiTauAnalysisConfig.DiTauWorkingPointConfig.makeAlgs
def makeAlgs(self, config)
Definition: DiTauAnalysisConfig.py:90
python.DiTauAnalysisConfig.DiTauWorkingPointConfig
Definition: DiTauAnalysisConfig.py:59
python.DiTauAnalysisConfig.DiTauCalibrationConfig.makeAlgs
def makeAlgs(self, config)
Definition: DiTauAnalysisConfig.py:31
python.DiTauAnalysisConfig.DiTauCalibrationConfig.instanceName
def instanceName(self)
Definition: DiTauAnalysisConfig.py:27
python.DiTauAnalysisConfig.DiTauCalibrationConfig
Definition: DiTauAnalysisConfig.py:8
python.DiTauAnalysisConfig.DiTauCalibrationConfig.__init__
def __init__(self)
Definition: DiTauAnalysisConfig.py:11
python.DiTauAnalysisConfig.DiTauWorkingPointConfig.__init__
def __init__(self)
Definition: DiTauAnalysisConfig.py:64