ATLAS Offline Software
JetCommonConfig.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2025 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  ghostdefs = AntiKt4EMPFlow.ghostdefs+["UnAssocMuonSegment"],
41  modifiers = AntiKt4EMPFlow.modifiers+("JetPtAssociation","QGTagging","fJVT","NNJVT","CaloEnergiesClus","JetPileupLabel","qgtransformer")
42  )
43 
44  AntiKt10UFOCSSKSoftDrop_deriv = AntiKt10UFOCSSKSoftDrop.clone(
45  modifiers = AntiKt10UFOCSSKSoftDrop.modifiers+("toptransformer","wtransformer","wtransformer_massdec")
46  )
47 
48  jetList = [AntiKt4EMTopo_deriv, AntiKt4EMPFlow_deriv,
49  AntiKtVR30Rmax4Rmin02PV0Track,
50  AntiKt10UFOCSSKSoftDrop_deriv]
51 
52  for jd in jetList:
53  acc.merge(JetRecCfg(ConfigFlags,jd))
54 
55  return acc
56 
57 def AddBadBatmanCfg(ConfigFlags):
58  """Add bad batman decoration for events with large EMEC-IW noise"""
59 
60  acc = ComponentAccumulator()
61 
62  CommonAugmentation = CompFactory.DerivationFramework.CommonAugmentation
63  from DerivationFrameworkJetEtMiss.JetToolConfig import BadBatmanToolCfg
64  badBatmanTool = acc.getPrimaryAndMerge(BadBatmanToolCfg(ConfigFlags))
65  acc.addEventAlgo(CommonAugmentation("BadBatmanAugmentation", AugmentationTools = [badBatmanTool]))
66 
67  return acc
68 
69 def AddDistanceInTrainCfg(ConfigFlags):
70  """Add distance in train information to EventInfo"""
71  from DerivationFrameworkJetEtMiss.JetToolConfig import DistanceInTrainToolCfg
72 
73  acc = ComponentAccumulator()
74 
75  CommonAugmentation = CompFactory.DerivationFramework.CommonAugmentation
76  distanceInTrainTool = acc.getPrimaryAndMerge(DistanceInTrainToolCfg(ConfigFlags))
77  acc.addEventAlgo(CommonAugmentation("DistanceInTrainAugmentation", AugmentationTools = [distanceInTrainTool]))
78 
79  return acc
80 
81 def AddSidebandEventShapeCfg(ConfigFlags):
82  """Special rho definitions for PFlow jets"""
83  from JetRecConfig.JetRecConfig import getInputAlgs,getConstitPJGAlg,reOrderAlgs
84  from JetRecConfig.StandardJetConstits import stdConstitDic as cst
85  from JetRecConfig.JetInputConfig import buildEventShapeAlg
86 
87  acc = ComponentAccumulator()
88 
89  constit_algs = getInputAlgs(cst.GPFlow, flags=ConfigFlags)
90  constit_algs, ca = reOrderAlgs( [a for a in constit_algs if a is not None])
91 
92  acc.merge(ca)
93  for a in constit_algs:
94  acc.addEventAlgo(a)
95 
96  #Sideband definition
97  acc.addEventAlgo(getConstitPJGAlg(cst.GPFlow, suffix='PUSB'))
98  acc.addEventAlgo(buildEventShapeAlg(cst.GPFlow, '', suffix = 'PUSB' ))
99 
100  #New "sideband" definition when using CHS based on TTVA
101  acc.addEventAlgo(getConstitPJGAlg(cst.GPFlow, suffix='Neut'))
102  acc.addEventAlgo(buildEventShapeAlg(cst.GPFlow, '', suffix = 'Neut' ))
103 
104  return acc
105 
106 def AddJvtDecorationAlgCfg(ConfigFlags, algName = "JvtPassDecorAlg", jetContainer='AntiKt4EMTopo', **kwargs):
107  acc = ComponentAccumulator()
108  # Decorate if jet passed JVT criteria
109  from JetJvtEfficiency.JetJvtEfficiencyToolConfig import getJvtEffToolCfg
110 
111  passJvtTool = acc.popToolsAndMerge(getJvtEffToolCfg(ConfigFlags, jetContainer))
112  passJvtTool.PassJVTKey = "{}Jets.DFCommonJets_passJvt".format(jetContainer)
113  passJvtTool.SuppressOutputDependence = False
114  kwargs.setdefault("Decorators", [passJvtTool])
115  kwargs.setdefault("JetContainer", "{}Jets".format(jetContainer))
116  acc.addEventAlgo(CompFactory.JetDecorationAlg(algName, **kwargs), primary = True)
117  return acc
118 
119 def AddEventCleanFlagsCfg(ConfigFlags, workingPoints = ['Loose', 'Tight', 'LooseLLP']):
120  """Add event cleaning flags"""
121 
122  acc = ComponentAccumulator()
123  acc.merge(AddJvtDecorationAlgCfg(ConfigFlags, algName="JvtPassDecorAlg_EMTopo", jetContainer='AntiKt4EMTopo'))
124  acc.merge(AddJvtDecorationAlgCfg(ConfigFlags, algName="JvtPassDecorAlg", jetContainer='AntiKt4EMPFlow'))
125 
126  from DerivationFrameworkTau.TauCommonConfig import AddTauAugmentationCfg
127  acc.merge(AddTauAugmentationCfg(ConfigFlags, prefix="JetCommon", doRNNLoose=True))
128  acc.addSequence(CompFactory.AthSequencer('EventCleanSeq', Sequential=True))
129 
130  # Overlap for EMTopo
131  from AssociationUtils.AssociationUtilsConfig import OverlapRemovalToolCfg
132  inputLabel_legacy = 'selected_eventClean_EMTopo'
133  outputLabel_legacy = 'DFCommonJets_passOR_EMTopo'
134  bJetLabel = '' #default
135  tauLabel = 'DFTauRNNLoose'
136  orTool_legacy = acc.popToolsAndMerge(OverlapRemovalToolCfg(ConfigFlags,inputLabel=inputLabel_legacy,outputLabel=outputLabel_legacy,bJetLabel=bJetLabel))
137  algOR_legacy = CompFactory.OverlapRemovalGenUseAlg('OverlapRemovalGenUseAlg_EMTopo',
138  JetKey="AntiKt4EMTopoJets",
139  SelectionLabel=inputLabel_legacy,
140  OverlapLabel=outputLabel_legacy,
141  OverlapRemovalTool=orTool_legacy,
142  TauLabel=tauLabel,
143  BJetLabel=bJetLabel
144  )
145  acc.addEventAlgo(algOR_legacy, 'EventCleanSeq')
146 
147  # Overlap for EMPFlow
148  inputLabel = 'selected_eventClean_EMPFlow'
149  outputLabel = 'DFCommonJets_passOR_EMPFlow'
150  orTool = acc.popToolsAndMerge(OverlapRemovalToolCfg(ConfigFlags,inputLabel=inputLabel,outputLabel=outputLabel,bJetLabel=bJetLabel))
151  algOR = CompFactory.OverlapRemovalGenUseAlg('OverlapRemovalGenUseAlg',
152  SelectionLabel=inputLabel,
153  OverlapLabel=outputLabel,
154  OverlapRemovalTool=orTool,
155  TauLabel=tauLabel,
156  BJetLabel=bJetLabel)
157  acc.addEventAlgo(algOR, 'EventCleanSeq')
158 
159  CommonAugmentation = CompFactory.DerivationFramework.CommonAugmentation
160  from DerivationFrameworkMuons.MuonsToolsConfig import MuonJetDrToolCfg
161  muonJetDrTool = acc.getPrimaryAndMerge(MuonJetDrToolCfg(ConfigFlags, "MuonJetDrTool"))
162  acc.addEventAlgo(CommonAugmentation("DFCommonMuonsKernel2", AugmentationTools = [muonJetDrTool]), 'EventCleanSeq')
163 
164  from JetSelectorTools.JetSelectorToolsConfig import EventCleaningToolCfg,JetCleaningToolCfg
165 
166  supportedWPs = ['Loose', 'Tight', 'LooseLLP', 'VeryLooseLLP', 'SuperLooseLLP']
167  prefix = "DFCommonJets_"
168  evt_lvl_suppWPs_PFlow = ['LooseBad', 'TightBad']
169 
170  for wp in workingPoints:
171  if wp not in supportedWPs:
172  continue
173 
174  cleaningLevel = wp + 'Bad'
175  # LLP WPs have a slightly different name format
176  if 'LLP' in wp:
177  cleaningLevel = wp.replace('LLP', 'BadLLP')
178 
179  # Add support for TightBad event flag as well
180  doEvent_PFlow=False
181  for evt_swp in evt_lvl_suppWPs_PFlow:
182  if evt_swp == cleaningLevel:
183  doEvent_PFlow=True
184  break
185 
186  doEvent_EMTopo=False
187  if 'Loose' in cleaningLevel:
188  doEvent_EMTopo=True
189 
190 
191  if doEvent_EMTopo:
192  jetCleaningTool_legacy = acc.popToolsAndMerge(JetCleaningToolCfg(
193  ConfigFlags, 'JetCleaningTool_'+cleaningLevel+'_EMTopo',
194  'AntiKt4EMTopo', cleaningLevel, False))
195  acc.addPublicTool(jetCleaningTool_legacy)
196  ecTool_legacy = acc.popToolsAndMerge(EventCleaningToolCfg(
197  ConfigFlags,'EventCleaningTool_'+wp+'_EMTopo', cleaningLevel))
198  ecTool_legacy.JetCleanPrefix = prefix
199  ecTool_legacy.OrDecorator = "passOR_EMTopo"
200  ecTool_legacy.JetContainer = "AntiKt4EMTopoJets"
201  ecTool_legacy.JetCleaningTool = jetCleaningTool_legacy
202  acc.addPublicTool(ecTool_legacy)
203 
204  eventCleanAlg_legacy = CompFactory.EventCleaningTestAlg('EventCleaningTestAlg_'+wp+'_EMTopo',
205  EventCleaningTool=ecTool_legacy,
206  JetCollectionName="AntiKt4EMTopoJets",
207  EventCleanPrefix=prefix,
208  CleaningLevel=cleaningLevel,
209  doEvent=True) # Only store event-level flags for Loose and LooseLLP
210  acc.addEventAlgo(eventCleanAlg_legacy, 'EventCleanSeq')
211 
212 
213  if doEvent_PFlow:
214  jetCleaningTool = acc.popToolsAndMerge(JetCleaningToolCfg(
215  ConfigFlags, 'JetCleaningTool_'+cleaningLevel,
216  'AntiKt4EMPFlowJets', cleaningLevel, False))
217  acc.addPublicTool(jetCleaningTool)
218 
219  ecTool = acc.popToolsAndMerge(EventCleaningToolCfg(ConfigFlags,'EventCleaningTool_' + wp, cleaningLevel))
220  ecTool.JetCleanPrefix = prefix
221  ecTool.OrDecorator = "passOR_EMPFlow"
222  ecTool.JetContainer = "AntiKt4EMPFlowJets"
223  ecTool.JetCleaningTool = jetCleaningTool
224  acc.addPublicTool(ecTool)
225 
226  eventCleanAlg = CompFactory.EventCleaningTestAlg('EventCleaningTestAlg_'+wp,
227  EventCleaningTool=ecTool,
228  JetCollectionName="AntiKt4EMPFlowJets",
229  EventCleanPrefix=prefix,
230  CleaningLevel=cleaningLevel,
231  doEvent=True) # for PFlow we use Loose and Tight
232  acc.addEventAlgo(eventCleanAlg, 'EventCleanSeq')
233 
234  return acc
235 
236 
237 def addJetsToSlimmingTool(slimhelper,contentlist,smartlist=[]):
238  for item in contentlist:
239  if item not in slimhelper.AppendToDictionary:
240  slimhelper.AppendToDictionary.update({item:'xAOD::JetContainer',
241  item+"Aux":'xAOD::JetAuxContainer'})
242  if item in smartlist:
243  slimhelper.SmartCollections.append(item)
244  else:
245  slimhelper.AllVariables.append(item)
246 
247 
248 
251 def addOriginCorrectedClustersToSlimmingTool(slimhelper,writeLC=False,writeEM=False):
252 
253  slimhelper.ExtraVariables.append('CaloCalTopoClusters.calE.calEta.calPhi.calM')
254 
255  if writeLC:
256  if "LCOriginTopoClusters" not in slimhelper.AppendToDictionary:
257  slimhelper.AppendToDictionary.update({"LCOriginTopoClusters":'xAOD::CaloClusterContainer',
258  "LCOriginTopoClustersAux":'xAOD::ShallowAuxContainer'})
259  slimhelper.ExtraVariables.append('LCOriginTopoClusters.calEta.calPhi.originalObjectLink')
260 
261  if writeEM:
262  if "EMOriginTopoClusters" not in slimhelper.AppendToDictionary:
263  slimhelper.AppendToDictionary.update({"EMOriginTopoClusters":'xAOD::CaloClusterContainer',
264  "EMOriginTopoClustersAux":'xAOD::ShallowAuxContainer'})
265  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:81
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:251
python.JetRecConfig.reOrderAlgs
def reOrderAlgs(algs)
Definition: JetRecConfig.py:806
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:152
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:237
python.JetToolConfig.DistanceInTrainToolCfg
def DistanceInTrainToolCfg(ConfigFlags)
Definition: JetToolConfig.py:13
python.JetCommonConfig.AddJvtDecorationAlgCfg
def AddJvtDecorationAlgCfg(ConfigFlags, algName="JvtPassDecorAlg", jetContainer='AntiKt4EMTopo', **kwargs)
Definition: JetCommonConfig.py:106
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:57
python.JetJvtEfficiencyToolConfig.getJvtEffToolCfg
def getJvtEffToolCfg(flags, jetalg)
Definition: JetJvtEfficiencyToolConfig.py:17
python.JetCommonConfig.AddDistanceInTrainCfg
def AddDistanceInTrainCfg(ConfigFlags)
Definition: JetCommonConfig.py:69
python.JetToolConfig.BadBatmanToolCfg
def BadBatmanToolCfg(ConfigFlags)
Definition: JetToolConfig.py:6
python.JetCommonConfig.AddEventCleanFlagsCfg
def AddEventCleanFlagsCfg(ConfigFlags, workingPoints=['Loose', 'Tight', 'LooseLLP'])
Definition: JetCommonConfig.py:119