ATLAS Offline Software
Loading...
Searching...
No Matches
HIGG1D1CustomJetsConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2
3#==============================================================================
4# Contains the configuration for customs jet reconstruction + decorations
5# used in analysis DAODs
6#==============================================================================
7
8from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
9from AthenaConfiguration.ComponentFactory import CompFactory
10from AthenaConfiguration.Enums import LHCPeriod
11
13 jetContextName = 'CustomVtx'
14 PrefixForHggCollection = "Hgg"
15 HggVertexContainerName = PrefixForHggCollection+"PrimaryVertices"
16 def customVtxContext(prevflags):
17 context = prevflags.Jet.Context.default.clone(
18 Vertices = HggVertexContainerName,
19 GhostTracks = "PseudoJetGhostTrack",
20 GhostTracksLabel = "GhostTrack",
21 TVA = "JetTrackVtxAssoc"+jetContextName,
22 JetTracks = "JetSelectedTracks"+jetContextName,
23 JetTracksQualityCuts = "JetSelectedTracks"+jetContextName+"_trackSelOpt"
24 )
25 return context
26 flags.addFlag(f"Jet.Context.{jetContextName}", customVtxContext)
27
28def HIGG1D1CustomJetsCfg(ConfigFlags):
29 """Jet reconstruction needed for HIGG1D1"""
30
31 acc = ComponentAccumulator()
32
33 # Ideally there would be a nice way to configure the PFlowCustomVtx jets but at the moment
34 # all tools need to be configured manually to ensure that the track to vertex association is done correctly.
35 PrefixForHggCollection = "Hgg"
36 HggVertexContainerName = PrefixForHggCollection+"PrimaryVertices"
37 CustomPFJetContainerName = "AntiKt4EMPFlowCustomVtxJets"
38
39 from JetRecConfig.StandardJetConstits import stdInputExtDic, JetInputExternal,JetInputConstit, JetInputConstitSeq, JetConstitModifier, xAODType
40 from JetRecConfig.StandardSmallRJets import AntiKt4EMPFlow
41 from JetRecConfig.JetDefinition import JetDefinition
42 from JetRecTools import JetRecToolsConfig as jrtcfg
43 from JetMomentTools import JetMomentToolsConfig
44 from JetRecConfig.StandardJetConstits import stdConstitDic, stdContitModifDic
45 from JetRecConfig.StandardJetContext import propFromContext, inputsFromContext
46 from JetRecConfig.JetInputConfig import buildEventShapeAlg
47
48 # Get custom jet context
49 jetContextName = 'CustomVtx'
50 context = ConfigFlags.Jet.Context[jetContextName]
51
52 def replaceItems(tup,orgName,newName):
53 newList = list(tup)
54 for i, item in enumerate(newList):
55 if orgName in item:
56 newList[i] = item.replace(orgName,newName)
57 print( "Updated ", orgName, " to ", newName )
58 return tuple(newList)
59 print( "Failed to update ", orgName, " to ", newName )
60 return tuple(newList)
61
62 def updateCalibSequence(tup):
63 newList = list(tup)
64 if ConfigFlags.GeoModel.Run is LHCPeriod.Run3:
65 rhoname = "Kt4EMPFlowNeutEventShape"
66 else:
67 rhoname = "Kt4EMPFlowCustomVtxEventShape"
68
69 for i, item in enumerate(newList):
70 if "Calib" in item:
71 calibspecs = item.split(":")
72 calib, calibcontext, data_type = calibspecs[:3]
73 calibseq=""
74 if len(calibspecs)>3:
75 calibseq = calibspecs[3]
76 pvname = HggVertexContainerName
77 finalCalibString = f"CalibCustomVtx:{calibcontext}:{data_type}:{calibseq}:{rhoname}:{pvname}"
78 if len(calibspecs)>6: finalCalibString = f"{finalCalibString}:{calibspecs[6]}"
79 newList[i] = finalCalibString
80 print(finalCalibString)
81 return tuple(newList)
82 print( "Failed to update calib sequence" )
83 return tuple(newList)
84
85
86 # Create modifier list and JetDefinition
87 modsCustomVtx = AntiKt4EMPFlow.modifiers
88 modsCustomVtx = updateCalibSequence(modsCustomVtx)
89 modsCustomVtx = replaceItems(modsCustomVtx,"TrackMoments","TrackMomentsCustomVtx")
90 modsCustomVtx = replaceItems(modsCustomVtx,"TrackSumMoments","TrackSumMomentsCustomVtx")
91 modsCustomVtx = replaceItems(modsCustomVtx,"JVF","JVFCustomVtx")
92 modsCustomVtx = replaceItems(modsCustomVtx,"JVT","JVTCustomVtx")
93 modsCustomVtx = replaceItems(modsCustomVtx,"Charge","ChargeCustomVtx")
94
95 ghostCustomVtx = AntiKt4EMPFlow.ghostdefs
96
97 # GPFlow are the same than EMPFlow except they have pflow linked to elec or muons filtered out.
98 stdConstitDic["TrackCustomVtx"] = JetInputConstit("TrackCustomVtx", xAODType.TrackParticle,"JetSelectedTracksCustomVtx" )
99
100
101 stdConstitDic["GPFlowCustomVtx"] = JetInputConstitSeq("GPFlowCustomVtx", xAODType.FlowElement,["CorrectPFOCustomVtx", "CHSCustomVtx"] , 'GlobalParticleFlowObjects', 'CHSGCustomVtxParticleFlowObjects',
102 label='EMPFlowCustomVtx')
103
104 stdContitModifDic["CorrectPFOCustomVtx"] = JetConstitModifier("CorrectPFOCustomVtx", "CorrectPFOTool",
105 prereqs=[inputsFromContext("Vertices")],
106 properties=dict(VertexContainerKey=propFromContext("Vertices"),
107 WeightPFOTool= CompFactory.getComp("CP::WeightPFOTool")("weightPFO") )
108 )
109
110 stdContitModifDic["CHSCustomVtx"] = JetConstitModifier("CHSCustomVtx", "ChargedHadronSubtractionTool",
111 prereqs= [inputsFromContext("Vertices"),inputsFromContext("TVA")],
112 properties=dict(VertexContainerKey=propFromContext("Vertices"),
113 TrackVertexAssociation=propFromContext("TVA"),
114 UseTrackToVertexTool=True,
115 ))
116
117
118
119 AntiKt4EMPFlowCustomVtx = JetDefinition("AntiKt",0.4,stdConstitDic.GPFlowCustomVtx,
120 context = jetContextName,
121 ghostdefs = ghostCustomVtx,
122 modifiers = modsCustomVtx+("JetPtAssociation","QGTaggingCustomVtx","BoostedQGTaggingCustomVtx","fJVTCustomVtx","NNJVTCustomVtx","CaloEnergiesClus","JetPileupLabel"),
123 ptmin = 10000,
124 )
125
126 def getUsedInVertexFitTrackDecoratorAlgCustomVtx(jetdef, jetmod):
127 """ Create the alg to decorate the used-in-fit information for AMVF """
128 context = jetdef._contextDic
129
130 from InDetUsedInFitTrackDecoratorTool.UsedInVertexFitTrackDecoratorConfig import getUsedInVertexFitTrackDecoratorAlg
131 alg = getUsedInVertexFitTrackDecoratorAlg(context['Tracks'], context['Vertices'],
132 vertexDeco='TTVA_AMVFVertices_forHiggs',
133 weightDeco='TTVA_AMVFWeights_forHiggs')
134 return alg
135
136
137 # Define new input variables for jet configuration
138 stdInputExtDic[context['Vertices']] = JetInputExternal( context['Vertices'], xAODType.Vertex )
139
140 stdInputExtDic["JetSelectedTracksCustomVtx"] = JetInputExternal("JetSelectedTracksCustomVtx", xAODType.TrackParticle,
141 prereqs= [ f"input:{context['Tracks']}" ], # in std context, this is InDetTrackParticles (see StandardJetContext)
142 algoBuilder = lambda jdef,_ : jrtcfg.getTrackSelAlg(jdef, trackSelOpt=False,
143 DecorDeps=["TTVA_AMVFWeights_forHiggs", "TTVA_AMVFVertices_forHiggs"] )
144 )
145
146 stdInputExtDic["JetTrackUsedInFitDecoCustomVtx"] = JetInputExternal("JetTrackUsedInFitDecoCustomVtx", xAODType.TrackParticle,
147 prereqs= [ f"input:{context['Tracks']}" , # in std context, this is InDetTrackParticles (see StandardJetContext)
148 f"input:{context['Vertices']}"],
149 algoBuilder = getUsedInVertexFitTrackDecoratorAlgCustomVtx
150 )
151
152 stdInputExtDic["JetTrackVtxAssocCustomVtx"] = JetInputExternal("JetTrackVtxAssocCustomVtx", xAODType.TrackParticle,
153 algoBuilder = lambda jdef,_ : jrtcfg.getJetTrackVtxAlg(jdef._contextDic, algname="jetTVACustomVtx",
154 WorkingPoint="Nonprompt_All_MaxWeight",
155 AMVFVerticesDeco='TTVA_AMVFVertices_forHiggs',
156 AMVFWeightsDeco='TTVA_AMVFWeights_forHiggs'),
157 prereqs = [ "input:JetTrackUsedInFitDecoCustomVtx", f"input:{context['Vertices']}" ] )
158
159 stdInputExtDic["EventDensityCustomVtx"] = JetInputExternal("EventDensityCustomVtx", "EventShape", algoBuilder = buildEventShapeAlg,
160 containername = lambda jetdef, _ : "Kt4"+jetdef.inputdef.label+"CustomVtxEventShape",
161 prereqs = lambda jetdef : ["input:"+jetdef.inputdef.name] )
162
163 from JetRecConfig.StandardJetMods import stdJetModifiers
164 from JetRecConfig.JetDefinition import JetModifier
165 from JetCalibTools import JetCalibToolsConfig
166
167 stdJetModifiers.update(
168
169 CalibCustomVtx = JetModifier("JetCalibrationTool","jetcalib_jetcoll_calibseqCustomVtx",
170 createfn=JetCalibToolsConfig.getJetCalibToolFromString,
171 prereqs=lambda mod,jetdef : JetCalibToolsConfig.getJetCalibToolPrereqs(mod,jetdef)+[f"input:{context['Vertices']}"]),
172
173
174 JVFCustomVtx = JetModifier("JetVertexFractionTool", "jvfCustomVtx",
175 createfn= lambda jdef,_ : JetMomentToolsConfig.getJVFTool(jdef,"CustomVtx"),
176 modspec = "CustomVtx",
177 prereqs = ["input:JetTrackVtxAssocCustomVtx", "mod:TrackMomentsCustomVtx", f"input:{context['Vertices']}"] ,
178 JetContainer = CustomPFJetContainerName),
179
180 JVTCustomVtx = JetModifier("JetVertexTaggerTool", "jvtCustomVtx",
181 createfn= lambda jdef,_ : JetMomentToolsConfig.getJVTTool(jdef,"CustomVtx"),
182 modspec = "CustomVtx",
183 prereqs = [ "mod:JVFCustomVtx" ],JetContainer = CustomPFJetContainerName),
184
185 NNJVTCustomVtx = JetModifier("JetVertexNNTagger", "nnjvtCustomVtx",
186 createfn=lambda jdef,_ :JetMomentToolsConfig.getNNJvtTool(jdef,"CustomVtx"),
187 prereqs = [ "mod:JVFCustomVtx" ],JetContainer = CustomPFJetContainerName),
188
189 OriginSetPVCustomVtx = JetModifier("JetOriginCorrectionTool", "origin_setpvCustomVtx",
190 modspec = "CustomVtx",
191 prereqs = [ "mod:JVFCustomVtx" ],JetContainer = CustomPFJetContainerName, OnlyAssignPV=True),
192
193 TrackMomentsCustomVtx = JetModifier("JetTrackMomentsTool", "trkmomsCustomVtx",
194 createfn= lambda jdef,_ : JetMomentToolsConfig.getTrackMomentsTool(jdef,"CustomVtx"),
195 modspec = "CustomVtx",
196 prereqs = [ "input:JetTrackVtxAssocCustomVtx","ghost:Track" ],JetContainer = CustomPFJetContainerName),
197
198 TrackSumMomentsCustomVtx = JetModifier("JetTrackSumMomentsTool", "trksummomsCustomVtx",
199 createfn=lambda jdef,_ :JetMomentToolsConfig.getTrackSumMomentsTool(jdef,"CustomVtx"),
200 modspec = "CustomVtx",
201 prereqs = [ "input:JetTrackVtxAssocCustomVtx","ghost:Track" ],JetContainer = CustomPFJetContainerName),
202
203 ChargeCustomVtx = JetModifier("JetChargeTool", "jetchargeCustomVtx",
204 prereqs = [ "ghost:Track" ]),
205
206
207 QGTaggingCustomVtx = JetModifier("JetQGTaggerVariableTool", "qgtaggingCustomVtx",
208 createfn=lambda jdef,_ :JetMomentToolsConfig.getQGTaggingTool(jdef,"CustomVtx"),
209 modspec = "CustomVtx",
210 prereqs = lambda _,jdef :
211 ["input:JetTrackVtxAssocCustomVtx","mod:TrackMomentsCustomVtx"] +
212 (["mod:JetPtAssociation"] if not jdef._cflags.Input.isMC else []),
213 JetContainer = CustomPFJetContainerName),
214
215 BoostedQGTaggingCustomVtx = JetModifier("BoostedJetTaggerTool", "boostedqgtaggingCustomVtx",
216 createfn=lambda jdef,_ :JetMomentToolsConfig.getBoostedJetTaggerToolQG(jdef,"CustomVtx"),
217 modspec = "CustomVtx",
218 prereqs = lambda _,jdef :
219 ["input:JetTrackVtxAssocCustomVtx","mod:TrackMomentsCustomVtx"] +
220 (["mod:JetPtAssociation"] if not jdef._cflags.Input.isMC else []),
221 JetContainer = CustomPFJetContainerName),
222
223
224 fJVTCustomVtx = JetModifier("JetForwardPFlowJvtTool", "fJVTCustomVtx",
225 createfn=lambda jdef,_ :JetMomentToolsConfig.getPFlowfJVTTool(jdef,"CustomVtx"),
226 modspec = "CustomVtx",
227 prereqs = ["input:JetTrackVtxAssocCustomVtx","input:EventDensityCustomVtx",f"input:{context['Vertices']}","mod:NNJVTCustomVtx"],
228 JetContainer = CustomPFJetContainerName),
229 )
230
231 from JetRecConfig.JetRecConfig import JetRecCfg
232
233 acc.merge(JetRecCfg(ConfigFlags,AntiKt4EMPFlowCustomVtx))
234
235 return acc
236
238 """Event cleaning and jet cleaning for HIGG1D1"""
239
240 acc = ComponentAccumulator()
241
242 from DerivationFrameworkJetEtMiss.JetCommonConfig import AddJvtDecorationAlgCfg
243 acc.merge(AddJvtDecorationAlgCfg(ConfigFlags, algName = "JvtPassDecorCustomVtxAlg", jetContainer='AntiKt4EMPFlowCustomVtx'))
244
245 from DerivationFrameworkTau.TauCommonConfig import AddTauAugmentationCfg
246 acc.merge(AddTauAugmentationCfg(ConfigFlags, wp="GNTauLoose"))
247
248 # Decorate if jet passes OR and save decoration DFCommonJets_passOR
249 # Use modified OR that does not check overlaps with tauls
250 from AssociationUtils.AssociationUtilsConfig import OverlapRemovalToolCfg
251
252 outputLabel = 'DFCommonJets_passOR_EMPFlowCustomVtx'
253 bJetLabel = '' #default
254 tauLabel = 'DFTauGNTauLoose'
255 orTool = acc.popToolsAndMerge(OverlapRemovalToolCfg(ConfigFlags, outputLabel=outputLabel, bJetLabel=bJetLabel))
256 algOR = CompFactory.OverlapRemovalGenUseAlg('OverlapRemovalGenUseAlg_CustomVtx',
257 JetKey="AntiKt4EMPFlowCustomVtxJets",
258 OverlapLabel=outputLabel,
259 OverlapRemovalTool=orTool,
260 TauLabel=tauLabel,
261 BJetLabel=bJetLabel)
262 acc.addEventAlgo(algOR)
263
264 from JetSelectorTools.JetSelectorToolsConfig import EventCleaningToolCfg, JetCleaningToolCfg
265 workingPoints = ['Loose', 'Tight']
266
267 for wp in workingPoints:
268 cleaningLevel = wp + "Bad"
269
270 jetCleaningTool = acc.popToolsAndMerge(
271 JetCleaningToolCfg(
272 ConfigFlags,
273 name="JetCleaningCustomVtxTool_" + cleaningLevel,
274 jetdef="AntiKt4EMPFlowCustomVtxJets",
275 cleaningLevel=cleaningLevel,
276 useDecorations=False,
277 )
278 )
279 acc.addPublicTool(jetCleaningTool)
280
281 ecTool = acc.popToolsAndMerge(
282 EventCleaningToolCfg(ConfigFlags, "EventCleaningCustomVtxTool_" + wp, cleaningLevel)
283 )
284 ecTool.JetCleanPrefix = "DFCommonJets_"
285 ecTool.OrDecorator = "passOR_EMPFlowCustomVtx"
286 ecTool.JetContainer = "AntiKt4EMPFlowCustomVtxJets"
287 ecTool.JetCleaningTool = jetCleaningTool
288 acc.addPublicTool(ecTool)
289
290 # Alg to calculate event-level and jet-level cleaning variables
291 # Only store event-level flags for Loose* WPs
292 eventCleanAlg = CompFactory.EventCleaningTestAlg(
293 "EventCleaningCustomVtxTestAlg_" + wp,
294 EventCleaningTool=ecTool,
295 JetCollectionName="AntiKt4EMPFlowCustomVtxJets",
296 EventCleanPrefix="DFCommonJetsCustomVtx_",
297 CleaningLevel=cleaningLevel,
298 doEvent=True,
299 )
300 acc.addEventAlgo(eventCleanAlg)
301
302 return acc
void print(char *figname, TCanvas *c1)
getJetCalibToolPrereqs(modspec, jetdef)
getPFlowfJVTTool(jetdef, modspec)
getTrackMomentsTool(jetdef, modspec)
getJVFTool(jetdef, modspec)
getBoostedJetTaggerToolQG(jetdef, modspec)
getTrackSumMomentsTool(jetdef, modspec)
getNNJvtTool(jetdef, modspec)
getQGTaggingTool(jetdef, modspec)