ATLAS Offline Software
Loading...
Searching...
No Matches
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
8from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
9from AthenaConfiguration.ComponentFactory import CompFactory
10
11def 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
26def 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
57def 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
69def 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
81def 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 #New "sideband" definition when using CHS based on TTVA
97 acc.addEventAlgo(getConstitPJGAlg(cst.GPFlow, suffix='Neut'))
98 acc.addEventAlgo(buildEventShapeAlg(cst.GPFlow, '', suffix = 'Neut' ))
99
100 return acc
101
102def AddJvtDecorationAlgCfg(ConfigFlags, algName = "JvtPassDecorAlg", jetContainer='AntiKt4EMPFlow', **kwargs):
103 acc = ComponentAccumulator()
104 # Decorate if jet passed JVT criteria
105 from JetJvtEfficiency.JetJvtEfficiencyToolConfig import getJvtSelToolCfg
106
107 passJvtTool = acc.popToolsAndMerge(getJvtSelToolCfg(ConfigFlags, "{}Jets".format(jetContainer)))
108 passJvtTool.PassFlagName = "DFCommonJets_passJvt"
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
114def 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, wp="GNTauLoose"))
123 acc.addSequence(CompFactory.AthSequencer('EventCleanSeq', Sequential=True))
124
125 # Overlap for EMTopo
126 from AssociationUtils.AssociationUtilsConfig import OverlapRemovalToolCfg
127 inputLabel_legacy = 'selected_eventClean_EMTopo'
128 outputLabel_legacy = 'DFCommonJets_passOR_EMTopo'
129 bJetLabel = '' #default
130 tauLabel = 'DFTauGNTauLoose'
131 orTool_legacy = acc.popToolsAndMerge(OverlapRemovalToolCfg(ConfigFlags,inputLabel=inputLabel_legacy,outputLabel=outputLabel_legacy,bJetLabel=bJetLabel))
132 algOR_legacy = CompFactory.OverlapRemovalGenUseAlg('OverlapRemovalGenUseAlg_EMTopo',
133 JetKey="AntiKt4EMTopoJets",
134 SelectionLabel=inputLabel_legacy,
135 OverlapLabel=outputLabel_legacy,
136 OverlapRemovalTool=orTool_legacy,
137 TauLabel=tauLabel,
138 BJetLabel=bJetLabel
139 )
140 acc.addEventAlgo(algOR_legacy, 'EventCleanSeq')
141
142 # Overlap for EMPFlow
143 inputLabel = 'selected_eventClean_EMPFlow'
144 outputLabel = 'DFCommonJets_passOR_EMPFlow'
145 orTool = acc.popToolsAndMerge(OverlapRemovalToolCfg(ConfigFlags,inputLabel=inputLabel,outputLabel=outputLabel,bJetLabel=bJetLabel))
146 algOR = CompFactory.OverlapRemovalGenUseAlg('OverlapRemovalGenUseAlg',
147 SelectionLabel=inputLabel,
148 OverlapLabel=outputLabel,
149 OverlapRemovalTool=orTool,
150 TauLabel=tauLabel,
151 BJetLabel=bJetLabel)
152 acc.addEventAlgo(algOR, 'EventCleanSeq')
153
154 CommonAugmentation = CompFactory.DerivationFramework.CommonAugmentation
155 from DerivationFrameworkMuons.MuonsToolsConfig import MuonJetDrToolCfg
156 muonJetDrTool = acc.getPrimaryAndMerge(MuonJetDrToolCfg(ConfigFlags, "MuonJetDrTool"))
157 acc.addEventAlgo(CommonAugmentation("DFCommonMuonsKernel2", AugmentationTools = [muonJetDrTool]), 'EventCleanSeq')
158
159 from JetSelectorTools.JetSelectorToolsConfig import EventCleaningToolCfg,JetCleaningToolCfg
160
161 supportedWPs = ['Loose', 'Tight', 'LooseLLP', 'VeryLooseLLP', 'SuperLooseLLP']
162 prefix = "DFCommonJets_"
163 evt_lvl_suppWPs_PFlow = ['LooseBad', 'TightBad']
164
165 for wp in workingPoints:
166 if wp not in supportedWPs:
167 continue
168
169 cleaningLevel = wp + 'Bad'
170 # LLP WPs have a slightly different name format
171 if 'LLP' in wp:
172 cleaningLevel = wp.replace('LLP', 'BadLLP')
173
174 # Add support for TightBad event flag as well
175 doEvent_PFlow=False
176 for evt_swp in evt_lvl_suppWPs_PFlow:
177 if evt_swp == cleaningLevel:
178 doEvent_PFlow=True
179 break
180
181 doEvent_EMTopo=False
182 if 'Loose' in cleaningLevel:
183 doEvent_EMTopo=True
184
185
186 if doEvent_EMTopo:
187 jetCleaningTool_legacy = acc.popToolsAndMerge(JetCleaningToolCfg(
188 ConfigFlags, 'JetCleaningTool_'+cleaningLevel+'_EMTopo',
189 'AntiKt4EMTopoJets', cleaningLevel, False))
190 acc.addPublicTool(jetCleaningTool_legacy)
191 ecTool_legacy = acc.popToolsAndMerge(EventCleaningToolCfg(
192 ConfigFlags,'EventCleaningTool_'+wp+'_EMTopo', cleaningLevel))
193 ecTool_legacy.JetCleanPrefix = prefix
194 ecTool_legacy.OrDecorator = "passOR_EMTopo"
195 ecTool_legacy.JetContainer = "AntiKt4EMTopoJets"
196 ecTool_legacy.JetCleaningTool = jetCleaningTool_legacy
197 acc.addPublicTool(ecTool_legacy)
198
199 eventCleanAlg_legacy = CompFactory.EventCleaningTestAlg('EventCleaningTestAlg_'+wp+'_EMTopo',
200 EventCleaningTool=ecTool_legacy,
201 JetCollectionName="AntiKt4EMTopoJets",
202 EventCleanPrefix=prefix,
203 CleaningLevel=cleaningLevel,
204 doEvent=True) # Only store event-level flags for Loose and LooseLLP
205 acc.addEventAlgo(eventCleanAlg_legacy, 'EventCleanSeq')
206
207
208 if doEvent_PFlow:
209 jetCleaningTool = acc.popToolsAndMerge(JetCleaningToolCfg(
210 ConfigFlags, 'JetCleaningTool_'+cleaningLevel,
211 'AntiKt4EMPFlowJets', cleaningLevel, False))
212 acc.addPublicTool(jetCleaningTool)
213
214 ecTool = acc.popToolsAndMerge(EventCleaningToolCfg(ConfigFlags,'EventCleaningTool_' + wp, cleaningLevel))
215 ecTool.JetCleanPrefix = prefix
216 ecTool.OrDecorator = "passOR_EMPFlow"
217 ecTool.JetContainer = "AntiKt4EMPFlowJets"
218 ecTool.JetCleaningTool = jetCleaningTool
219 acc.addPublicTool(ecTool)
220
221 eventCleanAlg = CompFactory.EventCleaningTestAlg('EventCleaningTestAlg_'+wp,
222 EventCleaningTool=ecTool,
223 JetCollectionName="AntiKt4EMPFlowJets",
224 EventCleanPrefix=prefix,
225 CleaningLevel=cleaningLevel,
226 doEvent=True) # for PFlow we use Loose and Tight
227 acc.addEventAlgo(eventCleanAlg, 'EventCleanSeq')
228
229 return acc
230
231
232def addJetsToSlimmingTool(slimhelper,contentlist,smartlist=[]):
233 for item in contentlist:
234 if item not in slimhelper.AppendToDictionary:
235 slimhelper.AppendToDictionary.update({item:'xAOD::JetContainer',
236 item+"Aux":'xAOD::JetAuxContainer'})
237 if item in smartlist:
238 slimhelper.SmartCollections.append(item)
239 else:
240 slimhelper.AllVariables.append(item)
241
242
243
246def addOriginCorrectedClustersToSlimmingTool(slimhelper,writeLC=False,writeEM=False):
247
248 slimhelper.ExtraVariables.append('CaloCalTopoClusters.calE.calEta.calPhi.calM')
249
250 if writeLC:
251 if "LCOriginTopoClusters" not in slimhelper.AppendToDictionary:
252 slimhelper.AppendToDictionary.update({"LCOriginTopoClusters":'xAOD::CaloClusterContainer',
253 "LCOriginTopoClustersAux":'xAOD::ShallowAuxContainer'})
254 slimhelper.ExtraVariables.append('LCOriginTopoClusters.calEta.calPhi.originalObjectLink')
255
256 if writeEM:
257 if "EMOriginTopoClusters" not in slimhelper.AppendToDictionary:
258 slimhelper.AppendToDictionary.update({"EMOriginTopoClusters":'xAOD::CaloClusterContainer',
259 "EMOriginTopoClustersAux":'xAOD::ShallowAuxContainer'})
260 slimhelper.ExtraVariables.append('EMOriginTopoClusters.calE.calEta.calPhi.originalObjectLink')
addJetsToSlimmingTool(slimhelper, contentlist, smartlist=[])
AddEventCleanFlagsCfg(ConfigFlags, workingPoints=['Loose', 'Tight', 'LooseLLP'])
AddSidebandEventShapeCfg(ConfigFlags)
StandardJetsInDerivCfg(ConfigFlags)
AddJvtDecorationAlgCfg(ConfigFlags, algName="JvtPassDecorAlg", jetContainer='AntiKt4EMPFlow', **kwargs)
AddDistanceInTrainCfg(ConfigFlags)
addOriginCorrectedClustersToSlimmingTool(slimhelper, writeLC=False, writeEM=False)
Helper to add origin corrected clusters to output.