ATLAS Offline Software
Loading...
Searching...
No Matches
PFHLTConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
3from AthenaConfiguration.ComponentFactory import CompFactory
4from AthenaCommon.CFElements import parOR
5from eflowRec import PFOnlineMon
6
7
8#---------------------------------------------------------------------------------#
9# Tracking geometry & conditions
10def TrackingGeoCfg(inputFlags):
11 result = ComponentAccumulator()
12
13 from MagFieldServices.MagFieldServicesConfig import AtlasFieldCacheCondAlgCfg
14 result.merge(AtlasFieldCacheCondAlgCfg(inputFlags))
15
16 return result
17
18#---------------------------------------------------------------------------------#
19# Calo geometry & conditions
20def CaloGeoAndNoiseCfg(inputFlags):
21 result = ComponentAccumulator()
22 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
23 from TileGeoModel.TileGMConfig import TileGMCfg
24
25 result.merge(LArGMCfg(inputFlags))
26 result.merge(TileGMCfg(inputFlags))
27
28 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
29 # Schedule total noise cond alg
30 result.merge(CaloNoiseCondAlgCfg(inputFlags,"totalNoise"))
31
32 return result
33
34def PFTrackExtensionCfg(flags, tracktype, tracksin):
35 """ Get the track-to-calo extension after a preselection
36
37 Returns the component accumulator, the preselected track collection and the extension cache
38 """
39 result = ComponentAccumulator()
40 pretracks_name = f"HLTPFPreselTracks_{tracktype}"
41 cache_name = f"HLTPFTrackExtensionCache_{tracktype}"
42
43 from InDetTrackSelectionTool.InDetTrackSelectionToolConfig import (
44 PFTrackSelectionToolCfg)
45 result.addEventAlgo(CompFactory.PFTrackPreselAlg(
46 f"HLTPFTrackPresel_{tracktype}",
47 InputTracks=tracksin,
48 OutputTracks=pretracks_name,
49 TrackSelTool=result.popToolsAndMerge(PFTrackSelectionToolCfg(flags))
50 ))
51
52
53 monTool_trackExtrap = PFOnlineMon.getMonTool_ParticleCaloExtensionTool(flags)
54 monTool_trackExtrap.HistPath = 'TrackCaloExtrapolation_general'
55
56 from TrackToCalo.TrackToCaloConfig import HLTPF_ParticleCaloExtensionToolCfg
57 result.addEventAlgo(CompFactory.Trk.PreselCaloExtensionBuilderAlg(
58 f"HLTPFTrackExtension_{tracktype}",
59 ParticleCaloExtensionTool=result.popToolsAndMerge(
60 HLTPF_ParticleCaloExtensionToolCfg(flags, MonTool=monTool_trackExtrap)),
61 InputTracks=pretracks_name,
62 OutputCache=cache_name,
63 ))
64
65 return result, pretracks_name, cache_name
66
67def MuonCaloTagCfg(flags, tracktype, tracksin, extcache, cellsin):
68 """ Create the muon calo tagging configuration
69
70 Return the component accumulator and the tracks with muons removed
71 """
72 from TrkConfig.AtlasExtrapolatorConfig import TrigPFlowExtrapolatorCfg
73 result = ComponentAccumulator()
74 extrapolator = result.popToolsAndMerge(TrigPFlowExtrapolatorCfg(flags))
75 output_tracks = f"PFMuonCaloTagTracks_{tracktype}"
76
77 from TrackToCalo.TrackToCaloConfig import (
78 HLTPF_ParticleCaloExtensionToolCfg,
79 HLTPF_ParticleCaloCellAssociationToolCfg)
80
81 caloext = result.popToolsAndMerge(HLTPF_ParticleCaloExtensionToolCfg(flags))
82 calocellassoc = result.popToolsAndMerge(HLTPF_ParticleCaloCellAssociationToolCfg(
83 flags,
84 ParticleCaloExtensionTool=caloext,
85 CaloCellContainer="",
86 ))
87
88 result.addEventAlgo(
89 CompFactory.PFTrackMuonCaloTaggingAlg(
90 f"PFTrackMuonCaloTaggingAlg_{tracktype}",
91 InputTracks = tracksin,
92 InputCaloExtension = extcache,
93 InputCells = cellsin,
94 OutputTracks = output_tracks,
95 MinPt = flags.Trigger.FSHad.PFOMuonRemovalMinPt,
96 MuonScoreTool = CompFactory.CaloMuonScoreTool(
97 CaloMuonEtaCut=3,
98 ParticleCaloCellAssociationTool = calocellassoc
99 ),
100 LooseTagTool=CompFactory.CaloMuonTag("LooseCaloMuonTag", TagMode="Loose"),
101 TightTagTool=CompFactory.CaloMuonTag("TightCaloMuonTag", TagMode="Tight"),
102 DepositInCaloTool=CompFactory.TrackDepositInCaloTool(
103 ExtrapolatorHandle=extrapolator,
104 ParticleCaloCellAssociationTool = calocellassoc,
105 ParticleCaloExtensionTool = caloext
106 )
107 ),
108 primary=True,
109 )
110 return result, output_tracks
111
112def MuonIsoTagCfg(flags, tracktype, tracksin, verticesin, extcache, clustersin):
113 """ Create the muon iso tagging configuration
114
115 Return the component accumulator and the tracks with muons removed
116 """
117 result = ComponentAccumulator()
118 output_tracks = f"PFMuonIsoTagTracks_{tracktype}"
119
120 from TrackToCalo.TrackToCaloConfig import HLTPF_ParticleCaloExtensionToolCfg
121
122 result.addEventAlgo(
123 CompFactory.PFTrackMuonIsoTaggingAlg(
124 f"PFTrackMuonIsoTaggingalg_{tracktype}",
125 InputTracks = tracksin,
126 InputClusters = clustersin,
127 InputVertices = verticesin,
128 OutputTracks = output_tracks,
129 MinPt = flags.Trigger.FSHad.PFOMuonRemovalMinPt,
130 TrackIsoTool = CompFactory.xAOD.TrackIsolationTool(
131 TrackParticleLocation=tracksin,
132 VertexLocation="",
133 ),
134 CaloIsoTool = CompFactory.xAOD.CaloIsolationTool(
135 ParticleCaloExtensionTool=result.popToolsAndMerge(
136 HLTPF_ParticleCaloExtensionToolCfg(flags)),
137 InputCaloExtension=extcache,
138 ParticleCaloCellAssociationTool="",
139 saveOnlyRequestedCorrections=True,
140 )
141 ),
142 primary=True,
143 )
144 return result, output_tracks
145
146#---------------------------------------------------------------------------------#
147# PFlow track selection
148def HLTPFTrackSelectorCfg(inputFlags,tracktype,tracksin,verticesin,clustersin,cellsin=None):
149 result = ComponentAccumulator()
150
151 muon_mode = inputFlags.Trigger.FSHad.PFOMuonRemoval
152 if muon_mode == "None":
153 tracks = tracksin
154 extension_cache=""
155 else:
156 ext_acc, pretracks, extension_cache = PFTrackExtensionCfg(
157 inputFlags, tracktype, tracksin
158 )
159 result.merge(ext_acc)
160 if muon_mode == "Calo":
161 if cellsin is None:
162 raise ValueError("Cells must be provided for the 'Calo' muon mode!")
163 tag_acc, tracks = MuonCaloTagCfg(
164 inputFlags, tracktype, pretracks, extension_cache, cellsin
165 )
166 elif muon_mode == "Iso":
167 tag_acc, tracks = MuonIsoTagCfg(
168 inputFlags, tracktype, pretracks, verticesin, extension_cache, clustersin
169 )
170 else:
171 raise ValueError(f"Invalid muon removal mode '{muon_mode}'")
172 result.merge(tag_acc)
173
174 from InDetTrackSelectionTool.InDetTrackSelectionToolConfig import (
175 PFTrackSelectionToolCfg)
176 from TrackToCalo.TrackToCaloConfig import HLTPF_ParticleCaloExtensionToolCfg
177
178
179 from eflowRec import PFOnlineMon
180 monTool_extrapolator = PFOnlineMon.getMonTool_eflowTrackCaloExtensionTool(inputFlags)
181 monTool_extrapolator.HistPath = 'TrackExtrapolator'
182
183 result.addEventAlgo(
184 CompFactory.PFTrackSelector(
185 f"PFTrackSelector_{tracktype}",
186 trackExtrapolatorTool = CompFactory.eflowTrackCaloExtensionTool(
187 "HLTPF_eflowTrkCaloExt",
188 TrackCaloExtensionTool=result.popToolsAndMerge(
189 HLTPF_ParticleCaloExtensionToolCfg(inputFlags)),
190 PFParticleCache = extension_cache,
191 MonTool_TrackCaloExtension = monTool_extrapolator
192 ),
193 trackSelectionTool = result.popToolsAndMerge(PFTrackSelectionToolCfg(inputFlags)),
194 electronsName="",
195 muonsName="",
196 tracksName=tracks,
197 VertexContainer=verticesin,
198 eflowRecTracksOutputName=f"eflowRecTracks_{tracktype}",
199 MonTool = PFOnlineMon.getMonTool_PFTrackSelector(inputFlags),
200 ),
201 primary=True,
202 )
203
204 return result
205
207 result = ComponentAccumulator()
208 from eflowRec.PFCfg import getPFMomentCalculatorTool
209
210 if inputFlags.PF.useClusterMoments:
211 MomentsNames = [
212 "FIRST_PHI"
213 ,"FIRST_ETA"
214 ,"SECOND_R"
215 ,"SECOND_LAMBDA"
216 ,"DELTA_PHI"
217 ,"DELTA_THETA"
218 ,"DELTA_ALPHA"
219 ,"CENTER_X"
220 ,"CENTER_Y"
221 ,"CENTER_Z"
222 ,"CENTER_MAG"
223 ,"CENTER_LAMBDA"
224 ,"LATERAL"
225 ,"LONGITUDINAL"
226 ,"FIRST_ENG_DENS"
227 ,"ENG_FRAC_EM"
228 ,"ENG_FRAC_MAX"
229 ,"ENG_FRAC_CORE"
230 ,"FIRST_ENG_DENS"
231 ,"SECOND_ENG_DENS"
232 ,"ISOLATION"
233 ,"EM_PROBABILITY"
234 ,"ENG_POS"
235 ,"ENG_BAD_CELLS"
236 ,"N_BAD_CELLS"
237 ,"BADLARQ_FRAC"
238 ,"AVG_LAR_Q"
239 ,"AVG_TILE_Q"
240 ,"SIGNIFICANCE"
241 ]
242 else:
243 MomentsNames = ["CENTER_MAG"]
244 PFMomentCalculatorTool = result.popToolsAndMerge(getPFMomentCalculatorTool(inputFlags,MomentsNames))
245 result.setPrivateTools(PFMomentCalculatorTool)
246 return result
247
248def PFCfg(inputFlags, tracktype="", clustersin=None, calclustersin=None, tracksin=None, verticesin=None, cellsin=None):
249
250 result=ComponentAccumulator()
251 seqname = f'HLTPFlow_{tracktype}'
252 result.addSequence(parOR(seqname))
253
254 # Set defaults for the inputs
255 if clustersin is None:
256 clustersin=inputFlags.eflowRec.RawClusterColl
257 if calclustersin is None:
258 calclustersin=inputFlags.eflowRec.CalClusterColl
259 if tracksin is None:
260 tracksin = inputFlags.eflowRec.TrackColl
261 if verticesin is None:
262 verticesin = inputFlags.eflowRec.VertexColl
263
264 result.merge(TrackingGeoCfg(inputFlags))
265 calogeocfg = CaloGeoAndNoiseCfg(inputFlags)
266 result.merge(calogeocfg)
267
268 selcfg = HLTPFTrackSelectorCfg(inputFlags, tracktype, tracksin, verticesin, clustersin, cellsin)
269 PFTrackSelector = selcfg.getPrimary()
270
271 # Add monitoring tool
272 monTool = PFOnlineMon.getMonTool_PFTrackSelector(inputFlags)
273 PFTrackSelector.MonTool = monTool
274
275 result.merge( selcfg, seqname )
276
277 #---------------------------------------------------------------------------------#
278 # PFlowAlgorithm -- subtraction steps
279
280
281 from eflowRec.PFCfg import getPFClusterSelectorTool
282 from eflowRec.PFCfg import getPFCellLevelSubtractionTool,getPFRecoverSplitShowersTool
283
284 PFTrackClusterMatchingTool_1 = CompFactory.PFTrackClusterMatchingTool("CalObjBldMatchingTool")
285 monTool_matching = PFOnlineMon.getMonTool_PFTrackClusterMatching(inputFlags)
286 monTool_matching.HistPath = 'PFTrackClusterMatchingTool_1'
287 PFTrackClusterMatchingTool_1.MonTool_ClusterMatching = monTool_matching
288
289 cellSubtractionTool = getPFCellLevelSubtractionTool(
290 inputFlags,
291 "PFCellLevelSubtractionTool",
292 )
293 cellSubtractionTool.PFTrackClusterMatchingTool=PFTrackClusterMatchingTool_1
294
295 recoverSplitShowersTool = getPFRecoverSplitShowersTool(
296 inputFlags,
297 "PFRecoverSplitShowersTool",
298 )
299 recoverSplitShowersTool.PFTrackClusterMatchingTool = PFTrackClusterMatchingTool_1
300
301 result.addEventAlgo(
302 CompFactory.PFAlgorithm(
303 f"PFAlgorithm_{tracktype}",
304 PFClusterSelectorTool = getPFClusterSelectorTool(
305 inputFlags,
306 clustersin,
307 calclustersin,
308 "PFClusterSelectorTool",
309 ),
310 SubtractionToolList = [
311 cellSubtractionTool,
312 recoverSplitShowersTool,
313 ],
314 BaseToolList = [
315 result.popToolsAndMerge(getHLTPFMomentCalculatorTool(inputFlags)),
316 ],
317 MonTool = PFOnlineMon.getMonTool_PFAlgorithm(inputFlags),
318 eflowRecTracksInputName = PFTrackSelector.eflowRecTracksOutputName,
319 eflowRecClustersOutputName = f"eflowRecClusters_{tracktype}",
320 PFCaloClustersOutputName = f"PFCaloCluster_{tracktype}",
321 eflowCaloObjectsOutputName = f"eflowCaloObjects_{tracktype}",
322 ),
323 seqname
324 )
325
326 #---------------------------------------------------------------------------------#
327 # PFO creators here
328
329 chargedPFOArgs = dict(
330 inputFlags=inputFlags,
331 nameSuffix=f"_{tracktype}",
332 chargedFlowElementOutputName=f"HLT_{tracktype}ChargedParticleFlowObjects",
333 eflowCaloObjectContainerName=f"eflowCaloObjects_{tracktype}"
334 )
335 neutralPFOArgs = dict(
336 inputFlags=inputFlags,
337 nameSuffix=f"_{tracktype}",
338 neutralFlowElementOutputName=f"HLT_{tracktype}NeutralParticleFlowObjects",
339 eflowCaloObjectContainerName=f"eflowCaloObjects_{tracktype}"
340 )
341 from eflowRec.PFCfg import getChargedFlowElementCreatorAlgorithm,getNeutralFlowElementCreatorAlgorithm
342 result.addEventAlgo(getNeutralFlowElementCreatorAlgorithm(**neutralPFOArgs), seqname)
343 result.addEventAlgo(getChargedFlowElementCreatorAlgorithm(**chargedPFOArgs), seqname)
344
345
346 return result
347
348if __name__=="__main__":
349
350 from AthenaConfiguration.AllConfigFlags import initConfigFlags
351 cfgFlags = initConfigFlags()
352 #cfgFlags.Input.Files=["myESD.pool.root"]
353 cfgFlags.Input.Files=["/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecExRecoTest/mc16_13TeV.361022.Pythia8EvtGen_A14NNPDF23LO_jetjet_JZ2W.recon.ESD.e3668_s3170_r10572_homeMade.pool.root"]
354 #
355 cfgFlags.addFlag("eflowRec.TrackColl","InDetTrackParticles")
356 cfgFlags.addFlag("eflowRec.VertexColl","PrimaryVertices")
357 cfgFlags.addFlag("eflowRec.RawClusterColl","CaloTopoClusters")
358 cfgFlags.addFlag("eflowRec.CalClusterColl","CaloCalTopoClustersNew")
359
360 #PF flags
361 cfgFlags.PF.addClusterMoments = False
362 cfgFlags.PF.useClusterMoments = False
363
364 #
365 # Try to get around TRT alignment folder problem in MC
366 cfgFlags.GeoModel.Align.Dynamic = False
367 #
368 cfgFlags.lock()
369
370 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
371 cfg=MainServicesCfg(cfgFlags)
372
373 from CaloRec.CaloTopoClusterConfig import CaloTopoClusterCfg
374 tccfg = CaloTopoClusterCfg(cfgFlags)
375 tcalg = tccfg.getPrimary()
376 tcalg.ClustersOutputName = "CaloCalTopoClustersNew"
377 cfg.merge(tccfg)
378 cfg.addEventAlgo(tcalg,sequenceName="AthAlgSeq")
379
380 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
381 cfg.merge(PoolReadCfg(cfgFlags))
382
383 cfg.merge(PFCfg(cfgFlags))
384
385 cfg.printConfig()# (summariseProps=True)
386
387 outputlist = [
388 "xAOD::CaloClusterContainer#CaloCalTopoClusters*",
389 "xAOD::CaloClusterAuxContainer#*CaloCalTopoClusters*Aux.",
390 "xAOD::PFOContainer#*ParticleFlowObjects",
391 "xAOD::PFOAuxContainer#*ParticleFlowObjectsAux."
392 ]
393 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg, outputStreamName
394 cfg.merge(OutputStreamCfg(cfgFlags,"xAOD",ItemList=outputlist))
395 from pprint import pprint
396 pprint( cfg.getEventAlgo(outputStreamName("xAOD")).ItemList )
397
398 histSvc = CompFactory.THistSvc(Output = ["EXPERT DATAFILE='expert-monitoring.root', OPT='RECREATE'"])
399 cfg.addService(histSvc)
400
401 cfg.getService("StoreGateSvc").Dump = True
402
403 cfg.run(10)
Definition PFCfg.py:1
CaloGeoAndNoiseCfg(inputFlags)
MuonIsoTagCfg(flags, tracktype, tracksin, verticesin, extcache, clustersin)
getHLTPFMomentCalculatorTool(inputFlags)
TrackingGeoCfg(inputFlags)
MuonCaloTagCfg(flags, tracktype, tracksin, extcache, cellsin)
HLTPFTrackSelectorCfg(inputFlags, tracktype, tracksin, verticesin, clustersin, cellsin=None)
PFTrackExtensionCfg(flags, tracktype, tracksin)
getMonTool_PFAlgorithm(flags)
getMonTool_ParticleCaloExtensionTool(flags)
getMonTool_PFTrackClusterMatching(flags)
getMonTool_PFTrackSelector(flags)
getMonTool_eflowTrackCaloExtensionTool(flags)
Definition PFOnlineMon.py:3