Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
JetCommonConfig.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 
3 #==============================================================================
4 # Contains the configuration for common jet reconstruction + decorations
5 # used in analysis DAODs
6 #==============================================================================
7 
8 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
9 from AthenaConfiguration.ComponentFactory import CompFactory
10 
11 def JetCommonCfg(ConfigFlags):
12  """Main config for jet reconstruction and decorations"""
13 
14  acc = ComponentAccumulator()
15 
16  acc.merge(StandardJetsInDerivCfg(ConfigFlags))
17  if "McEventCollection#GEN_EVENT" not in ConfigFlags.Input.TypedCollections:
18  acc.merge(AddBadBatmanCfg(ConfigFlags))
19  acc.merge(AddDistanceInTrainCfg(ConfigFlags))
20  acc.merge(AddSidebandEventShapeCfg(ConfigFlags))
21  acc.merge(AddEventCleanFlagsCfg(ConfigFlags))
22 
23  return acc
24 
25 
26 def StandardJetsInDerivCfg(ConfigFlags):
27  """Jet reconstruction needed for PHYS/PHYSLITE"""
28 
29  from JetRecConfig.StandardSmallRJets import AntiKt4EMTopo,AntiKt4EMPFlow,AntiKtVR30Rmax4Rmin02PV0Track
30  from JetRecConfig.StandardLargeRJets import AntiKt10UFOCSSKSoftDrop
31  from JetRecConfig.JetRecConfig import JetRecCfg
32 
33  acc = ComponentAccumulator()
34 
35  AntiKt4EMTopo_deriv = AntiKt4EMTopo.clone(
36  modifiers = AntiKt4EMTopo.modifiers+("JetPtAssociation","QGTagging")
37  )
38 
39  AntiKt4EMPFlow_deriv = AntiKt4EMPFlow.clone(
40  modifiers = AntiKt4EMPFlow.modifiers+("JetPtAssociation","QGTagging","fJVT","NNJVT","CaloEnergiesClus","JetPileupLabel","qgtransformer")
41  )
42 
43  jetList = [AntiKt4EMTopo_deriv, AntiKt4EMPFlow_deriv,
44  AntiKtVR30Rmax4Rmin02PV0Track,
45  AntiKt10UFOCSSKSoftDrop]
46 
47  for jd in jetList:
48  acc.merge(JetRecCfg(ConfigFlags,jd))
49 
50  return acc
51 
52 def AddBadBatmanCfg(ConfigFlags):
53  """Add bad batman decoration for events with large EMEC-IW noise"""
54 
55  acc = ComponentAccumulator()
56 
57  CommonAugmentation = CompFactory.DerivationFramework.CommonAugmentation
58  from DerivationFrameworkJetEtMiss.JetToolConfig import BadBatmanToolCfg
59  badBatmanTool = acc.getPrimaryAndMerge(BadBatmanToolCfg(ConfigFlags))
60  acc.addEventAlgo(CommonAugmentation("BadBatmanAugmentation", AugmentationTools = [badBatmanTool]))
61 
62  return acc
63 
64 def AddDistanceInTrainCfg(ConfigFlags):
65  """Add distance in train information to EventInfo"""
66  from DerivationFrameworkJetEtMiss.JetToolConfig import DistanceInTrainToolCfg
67 
68  acc = ComponentAccumulator()
69 
70  CommonAugmentation = CompFactory.DerivationFramework.CommonAugmentation
71  distanceInTrainTool = acc.getPrimaryAndMerge(DistanceInTrainToolCfg(ConfigFlags))
72  acc.addEventAlgo(CommonAugmentation("DistanceInTrainAugmentation", AugmentationTools = [distanceInTrainTool]))
73 
74  return acc
75 
76 def AddSidebandEventShapeCfg(ConfigFlags):
77  """Special rho definitions for PFlow jets"""
78  from JetRecConfig.JetRecConfig import getInputAlgs,getConstitPJGAlg,reOrderAlgs
79  from JetRecConfig.StandardJetConstits import stdConstitDic as cst
80  from JetRecConfig.JetInputConfig import buildEventShapeAlg
81 
82  acc = ComponentAccumulator()
83 
84  constit_algs = getInputAlgs(cst.GPFlow, flags=ConfigFlags)
85  constit_algs, ca = reOrderAlgs( [a for a in constit_algs if a is not None])
86 
87  acc.merge(ca)
88  for a in constit_algs:
89  acc.addEventAlgo(a)
90 
91  #Sideband definition
92  acc.addEventAlgo(getConstitPJGAlg(cst.GPFlow, suffix='PUSB'))
93  acc.addEventAlgo(buildEventShapeAlg(cst.GPFlow, '', suffix = 'PUSB' ))
94 
95  #New "sideband" definition when using CHS based on TTVA
96  acc.addEventAlgo(getConstitPJGAlg(cst.GPFlow, suffix='Neut'))
97  acc.addEventAlgo(buildEventShapeAlg(cst.GPFlow, '', suffix = 'Neut' ))
98 
99  return acc
100 
101 def AddJvtDecorationAlgCfg(ConfigFlags, algName = "JvtPassDecorAlg", jetContainer='AntiKt4EMTopo', **kwargs):
102  acc = ComponentAccumulator()
103  # Decorate if jet passed JVT criteria
104  from JetJvtEfficiency.JetJvtEfficiencyToolConfig import getJvtEffToolCfg
105 
106  passJvtTool = acc.popToolsAndMerge(getJvtEffToolCfg(ConfigFlags, jetContainer))
107  passJvtTool.PassJVTKey = "{}Jets.DFCommonJets_passJvt".format(jetContainer)
108  passJvtTool.SuppressOutputDependence = False
109  kwargs.setdefault("Decorators", [passJvtTool])
110  kwargs.setdefault("JetContainer", "{}Jets".format(jetContainer))
111  acc.addEventAlgo(CompFactory.JetDecorationAlg(algName, **kwargs), primary = True)
112  return acc
113 
114 def AddEventCleanFlagsCfg(ConfigFlags, workingPoints = ['Loose', 'Tight', 'LooseLLP']):
115  """Add event cleaning flags"""
116 
117  acc = ComponentAccumulator()
118  acc.merge(AddJvtDecorationAlgCfg(ConfigFlags, algName="JvtPassDecorAlg_EMTopo", jetContainer='AntiKt4EMTopo'))
119  acc.merge(AddJvtDecorationAlgCfg(ConfigFlags, algName="JvtPassDecorAlg", jetContainer='AntiKt4EMPFlow'))
120 
121  from DerivationFrameworkTau.TauCommonConfig import AddTauAugmentationCfg
122  acc.merge(AddTauAugmentationCfg(ConfigFlags, prefix="JetCommon", doLoose=True))
123 
124  # The overlap removal algorithm presents difficulties.
125  # It leaves decorations unlocked.
126  # Further, configurations may schedule multiple overlap removal algorithms,
127  # sometimes outside of this file, which then overwrite each other's
128  # results. So to get decoration locking to work properly, we need
129  # to first group all the event cleaning algorithms together,
130  # immediately followed by LockDecorations algorithms to lock the
131  # decorations produced by overlap. To accomplish this, we create
132  # two sequences, one for event cleaning and one for decoration locking
133  # and add the algorithms there. By default, these sequences will
134  # be scheduled at the current point in the global algorithm sequence,
135  # but if another fragment adds additional overlap removal, it may need
136  # to move the sequences later.
137  # All this is of course not MT-safe.
138  acc.addSequence(CompFactory.AthSequencer('EventCleanSeq', Sequential=True))
139  acc.addSequence(CompFactory.AthSequencer('EventCleanLockSeq', Sequential=True))
140 
141  # Overlap for EMTopo
142  from AssociationUtils.AssociationUtilsConfig import OverlapRemovalToolCfg
143  outputLabel_legacy = 'DFCommonJets_passOR'
144  bJetLabel = '' #default
145  tauLabel = 'DFTauLoose'
146  orTool_legacy = acc.popToolsAndMerge(OverlapRemovalToolCfg(ConfigFlags,outputLabel=outputLabel_legacy,bJetLabel=bJetLabel))
147  algOR_legacy = CompFactory.OverlapRemovalGenUseAlg('OverlapRemovalGenUseAlg_EMTopo',
148  JetKey="AntiKt4EMTopoJets",
149  OverlapLabel=outputLabel_legacy,
150  OverlapRemovalTool=orTool_legacy,
151  TauLabel=tauLabel,
152  BJetLabel=bJetLabel
153  )
154  acc.addEventAlgo(algOR_legacy, 'EventCleanSeq')
155 
156  # Overlap for EMPFlow
157  outputLabel = 'DFCommonJets_passOR'
158  orTool = acc.popToolsAndMerge(OverlapRemovalToolCfg(ConfigFlags,outputLabel=outputLabel,bJetLabel=bJetLabel))
159  algOR = CompFactory.OverlapRemovalGenUseAlg('OverlapRemovalGenUseAlg',
160  OverlapLabel=outputLabel,
161  OverlapRemovalTool=orTool,
162  TauLabel=tauLabel,
163  BJetLabel=bJetLabel)
164  acc.addEventAlgo(algOR, 'EventCleanSeq')
165 
166  # Explictly lock the decorations produced by overlap removal.
167  lockOR = CompFactory.DerivationFramework.LockDecorations \
168  ('OverlapRemovalLockDecorAlg',
169  Decorations = [
170  'Electrons.selected',
171  'Electrons.' + outputLabel,
172  'Muons.selected',
173  'Muons.' + outputLabel,
174  'Photons.selected',
175  'Photons.' + outputLabel,
176  'AntiKt4EMPFlowJets.selected',
177  'AntiKt4EMPFlowJets.' + outputLabel,
178  'AntiKt4EMTopoJets.selected',
179  'AntiKt4EMTopoJets.' + outputLabel,
180  'TauJets.selected',
181  'TauJets.' + outputLabel,
182  ])
183  acc.addEventAlgo(lockOR, 'EventCleanLockSeq')
184 
185  CommonAugmentation = CompFactory.DerivationFramework.CommonAugmentation
186  from DerivationFrameworkMuons.MuonsToolsConfig import MuonJetDrToolCfg
187  muonJetDrTool = acc.getPrimaryAndMerge(MuonJetDrToolCfg(ConfigFlags, "MuonJetDrTool"))
188  acc.addEventAlgo(CommonAugmentation("DFCommonMuonsKernel2", AugmentationTools = [muonJetDrTool]), 'EventCleanSeq')
189 
190  from JetSelectorTools.JetSelectorToolsConfig import EventCleaningToolCfg,JetCleaningToolCfg
191 
192  supportedWPs = ['Loose', 'Tight', 'LooseLLP', 'VeryLooseLLP', 'SuperLooseLLP']
193  prefix = "DFCommonJets_"
194  evt_lvl_suppWPs_PFlow = ['LooseBad', 'TightBad']
195 
196  for wp in workingPoints:
197  if wp not in supportedWPs:
198  continue
199 
200  cleaningLevel = wp + 'Bad'
201  # LLP WPs have a slightly different name format
202  if 'LLP' in wp:
203  cleaningLevel = wp.replace('LLP', 'BadLLP')
204 
205  # Add support for TightBad event flag as well
206  doEvent_PFlow=False
207  for evt_swp in evt_lvl_suppWPs_PFlow:
208  if evt_swp == cleaningLevel:
209  doEvent_PFlow=True
210  break
211 
212  doEvent_EMTopo=False
213  if 'Loose' in cleaningLevel:
214  doEvent_EMTopo=True
215 
216 
217  if doEvent_EMTopo:
218  jetCleaningTool_legacy = acc.popToolsAndMerge(JetCleaningToolCfg(
219  ConfigFlags, 'JetCleaningTool_'+cleaningLevel+'_EMTopo',
220  'AntiKt4EMTopo', cleaningLevel, False))
221  acc.addPublicTool(jetCleaningTool_legacy)
222  ecTool_legacy = acc.popToolsAndMerge(EventCleaningToolCfg(
223  ConfigFlags,'EventCleaningTool_'+wp+'_EMTopo', cleaningLevel))
224  ecTool_legacy.JetCleanPrefix = prefix
225  ecTool_legacy.JetContainer = "AntiKt4EMTopoJets"
226  ecTool_legacy.JetCleaningTool = jetCleaningTool_legacy
227  acc.addPublicTool(ecTool_legacy)
228 
229  eventCleanAlg_legacy = CompFactory.EventCleaningTestAlg('EventCleaningTestAlg_'+wp+'_EMTopo',
230  EventCleaningTool=ecTool_legacy,
231  JetCollectionName="AntiKt4EMTopoJets",
232  EventCleanPrefix=prefix,
233  CleaningLevel=cleaningLevel,
234  doEvent=True) # Only store event-level flags for Loose and LooseLLP
235  acc.addEventAlgo(eventCleanAlg_legacy, 'EventCleanSeq')
236 
237 
238  if doEvent_PFlow:
239  jetCleaningTool = acc.popToolsAndMerge(JetCleaningToolCfg(
240  ConfigFlags, 'JetCleaningTool_'+cleaningLevel,
241  'AntiKt4EMPFlowJets', cleaningLevel, False))
242  acc.addPublicTool(jetCleaningTool)
243 
244  ecTool = acc.popToolsAndMerge(EventCleaningToolCfg(ConfigFlags,'EventCleaningTool_' + wp, cleaningLevel))
245  ecTool.JetCleanPrefix = prefix
246  ecTool.JetContainer = "AntiKt4EMPFlowJets"
247  ecTool.JetCleaningTool = jetCleaningTool
248  acc.addPublicTool(ecTool)
249 
250  eventCleanAlg = CompFactory.EventCleaningTestAlg('EventCleaningTestAlg_'+wp,
251  EventCleaningTool=ecTool,
252  JetCollectionName="AntiKt4EMPFlowJets",
253  EventCleanPrefix=prefix,
254  CleaningLevel=cleaningLevel,
255  doEvent=True) # for PFlow we use Loose and Tight
256  acc.addEventAlgo(eventCleanAlg, 'EventCleanSeq')
257 
258  return acc
259 
260 
261 def addJetsToSlimmingTool(slimhelper,contentlist,smartlist=[]):
262  for item in contentlist:
263  if item not in slimhelper.AppendToDictionary:
264  slimhelper.AppendToDictionary.update({item:'xAOD::JetContainer',
265  item+"Aux":'xAOD::JetAuxContainer'})
266  if item in smartlist:
267  slimhelper.SmartCollections.append(item)
268  else:
269  slimhelper.AllVariables.append(item)
270 
271 
272 
275 def addOriginCorrectedClustersToSlimmingTool(slimhelper,writeLC=False,writeEM=False):
276 
277  slimhelper.ExtraVariables.append('CaloCalTopoClusters.calE.calEta.calPhi.calM')
278 
279  if writeLC:
280  if "LCOriginTopoClusters" not in slimhelper.AppendToDictionary:
281  slimhelper.AppendToDictionary.update({"LCOriginTopoClusters":'xAOD::CaloClusterContainer',
282  "LCOriginTopoClustersAux":'xAOD::ShallowAuxContainer'})
283  slimhelper.ExtraVariables.append('LCOriginTopoClusters.calEta.calPhi.originalObjectLink')
284 
285  if writeEM:
286  if "EMOriginTopoClusters" not in slimhelper.AppendToDictionary:
287  slimhelper.AppendToDictionary.update({"EMOriginTopoClusters":'xAOD::CaloClusterContainer',
288  "EMOriginTopoClustersAux":'xAOD::ShallowAuxContainer'})
289  slimhelper.ExtraVariables.append('EMOriginTopoClusters.calE.calEta.calPhi.originalObjectLink')
AssociationUtilsConfig.OverlapRemovalToolCfg
def OverlapRemovalToolCfg(ConfigFlags, masterName='OverlapRemovalTool', inputLabel='selected', outputLabel='overlaps', bJetLabel='', maxElePtForBJetAwareOR=100. *1000, boostedLeptons=False, outputPassValue=False, linkOverlapObjects=False, doEleEleOR=False, doElectrons=True, doMuons=True, doJets=True, doTaus=True, doPhotons=True, doFatJets=False, **kwargs)
Definition: AssociationUtilsConfig.py:5
python.JetCommonConfig.JetCommonCfg
def JetCommonCfg(ConfigFlags)
Definition: JetCommonConfig.py:11
python.JetCommonConfig.AddSidebandEventShapeCfg
def AddSidebandEventShapeCfg(ConfigFlags)
Definition: JetCommonConfig.py:76
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
vtune_athena.format
format
Definition: vtune_athena.py:14
python.JetRecConfig.getInputAlgs
def getInputAlgs(jetOrConstitdef, flags, context="default", monTool=None)
Definition: JetRecConfig.py:279
python.JetSelectorToolsConfig.EventCleaningToolCfg
def EventCleaningToolCfg(ConfigFlags, name, cleaningLevel)
Definition: JetSelectorToolsConfig.py:14
python.JetCommonConfig.addOriginCorrectedClustersToSlimmingTool
def addOriginCorrectedClustersToSlimmingTool(slimhelper, writeLC=False, writeEM=False)
Helper to add origin corrected clusters to output.
Definition: JetCommonConfig.py:275
python.JetRecConfig.reOrderAlgs
def reOrderAlgs(algs)
Definition: JetRecConfig.py:796
python.MuonsToolsConfig.MuonJetDrToolCfg
def MuonJetDrToolCfg(ConfigFlags, name)
Definition: MuonsToolsConfig.py:6
python.JetInputConfig.buildEventShapeAlg
def buildEventShapeAlg(jetOrConstitdef, inputspec, voronoiRf=0.9, radius=0.4, suffix=None)
Definition: JetInputConfig.py:132
python.JetSelectorToolsConfig.JetCleaningToolCfg
def JetCleaningToolCfg(ConfigFlags, name, jetdef, cleaningLevel, useDecorations)
Definition: JetSelectorToolsConfig.py:6
python.TauCommonConfig.AddTauAugmentationCfg
def AddTauAugmentationCfg(flags, **kwargs)
Definition: TauCommonConfig.py:6
python.JetRecConfig.JetRecCfg
def JetRecCfg(flags, jetdef, returnConfiguredDef=False)
Top level functions returning ComponentAccumulator out of JetDefinition.
Definition: JetRecConfig.py:36
python.JetCommonConfig.addJetsToSlimmingTool
def addJetsToSlimmingTool(slimhelper, contentlist, smartlist=[])
Definition: JetCommonConfig.py:261
python.JetToolConfig.DistanceInTrainToolCfg
def DistanceInTrainToolCfg(ConfigFlags)
Definition: JetToolConfig.py:13
python.JetCommonConfig.AddJvtDecorationAlgCfg
def AddJvtDecorationAlgCfg(ConfigFlags, algName="JvtPassDecorAlg", jetContainer='AntiKt4EMTopo', **kwargs)
Definition: JetCommonConfig.py:101
python.JetRecConfig.getConstitPJGAlg
def getConstitPJGAlg(constitdef, suffix=None, flags=None, parent_jetdef=None)
Definition: JetRecConfig.py:350
python.JetCommonConfig.StandardJetsInDerivCfg
def StandardJetsInDerivCfg(ConfigFlags)
Definition: JetCommonConfig.py:26
python.JetCommonConfig.AddBadBatmanCfg
def AddBadBatmanCfg(ConfigFlags)
Definition: JetCommonConfig.py:52
python.JetJvtEfficiencyToolConfig.getJvtEffToolCfg
def getJvtEffToolCfg(flags, jetalg)
Definition: JetJvtEfficiencyToolConfig.py:17
python.JetCommonConfig.AddDistanceInTrainCfg
def AddDistanceInTrainCfg(ConfigFlags)
Definition: JetCommonConfig.py:64
python.JetToolConfig.BadBatmanToolCfg
def BadBatmanToolCfg(ConfigFlags)
Definition: JetToolConfig.py:6
python.JetCommonConfig.AddEventCleanFlagsCfg
def AddEventCleanFlagsCfg(ConfigFlags, workingPoints=['Loose', 'Tight', 'LooseLLP'])
Definition: JetCommonConfig.py:114