ATLAS Offline Software
Loading...
Searching...
No Matches
PFCfg.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2from AthenaConfiguration.ComponentFactory import CompFactory
3from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
4from AthenaConfiguration.Enums import LHCPeriod
5
6def PFTrackSelectorAlgCfg(inputFlags,algName,useCaching=True):
7 PFTrackSelectorFactory=CompFactory.PFTrackSelector
8 PFTrackSelector=PFTrackSelectorFactory(algName)
9
10 result = ComponentAccumulator()
11
12 from TrackToCalo.TrackToCaloConfig import ParticleCaloExtensionToolCfg
13 pcExtensionTool = result.popToolsAndMerge(ParticleCaloExtensionToolCfg(inputFlags))
14
15 eflowTrackCaloExtensionTool=CompFactory.eflowTrackCaloExtensionTool
16 TrackCaloExtensionTool=eflowTrackCaloExtensionTool(TrackCaloExtensionTool=pcExtensionTool)
17 if (not useCaching):
18 TrackCaloExtensionTool.PFParticleCache = ""
19
20 PFTrackSelector.trackExtrapolatorTool = TrackCaloExtensionTool
21
22 from InDetTrackSelectionTool.InDetTrackSelectionToolConfig import (
23 PFTrackSelectionToolCfg)
24 PFTrackSelector.trackSelectionTool = result.popToolsAndMerge(PFTrackSelectionToolCfg(inputFlags))
25
26 # P->T conversion extra dependencies
27 if inputFlags.Detector.GeometryITk:
28 PFTrackSelector.ExtraInputs = {
29 ("InDetDD::SiDetectorElementCollection", "ConditionStore+ITkPixelDetectorElementCollection"),
30 ("InDetDD::SiDetectorElementCollection", "ConditionStore+ITkStripDetectorElementCollection"),
31 }
32 else:
33 PFTrackSelector.ExtraInputs = {
34 ("InDetDD::SiDetectorElementCollection", "ConditionStore+PixelDetectorElementCollection"),
35 ("InDetDD::SiDetectorElementCollection", "ConditionStore+SCT_DetectorElementCollection"),
36 ("InDetDD::TRT_DetElementContainer", "ConditionStore+TRT_DetElementContainer"),
37 }
38
39 result.addEventAlgo (PFTrackSelector, primary=True)
40
41 return result
42
43def getPFClusterSelectorTool(inputFlags,clustersin,calclustersin,algName):
44
45 PFClusterSelectorToolFactory = CompFactory.PFClusterSelectorTool
46 PFClusterSelectorTool = PFClusterSelectorToolFactory(algName)
47 if clustersin is not None:
48 PFClusterSelectorTool.clustersName = clustersin
49 if calclustersin is not None:
50 PFClusterSelectorTool.calClustersName = calclustersin
51
52 if inputFlags.PF.useTruthCheating:
53 if inputFlags.PF.useTrackClusterTruthMatching:
54 PFClusterSelectorTool.CaloClusterReadDecorHandleKey_NLeadingTruthParticles = "CaloTopoClusters." + inputFlags.Calo.TopoCluster.CalibrationHitDecorationName
55
56 if inputFlags.PF.useTopoTowers:
57 PFClusterSelectorTool.clustersName="CaloTopoSignal"
58 PFClusterSelectorTool.calClustersName="CaloCalTopoSignal"
59
60 return PFClusterSelectorTool
61
62def getPFTrackClusterMatchingTool(inputFlags,matchCut,distanceType,clusterPositionType,name):
63 PFTrackClusterMatchingTool = CompFactory.PFTrackClusterMatchingTool
64 MatchingTool = PFTrackClusterMatchingTool(name)
65 MatchingTool.ClusterPositionType = clusterPositionType
66 MatchingTool.DistanceType = distanceType
67 MatchingTool.MatchCut = matchCut*matchCut
68 return MatchingTool
69
70
71def getPFCellLevelSubtractionTool(inputFlags,toolName):
72 PFCellLevelSubtractionToolFactory = CompFactory.PFSubtractionTool
73 PFCellLevelSubtractionTool = PFCellLevelSubtractionToolFactory(toolName,useNNEnergy = inputFlags.PF.useMLEOverP)
74
75 if inputFlags.GeoModel.Run <= LHCPeriod.Run3:
76 eflowCellEOverPTool_Run2_mc20_JetETMiss = CompFactory.eflowCellEOverPTool_Run2_mc20_JetETMiss
77 PFCellLevelSubtractionTool.eflowCellEOverPTool = eflowCellEOverPTool_Run2_mc20_JetETMiss()
78 else:
79 if inputFlags.PF.useLegacyEOverPRun4:
80 eflowCellEOverPTool_mc12_HLLHC = CompFactory.eflowCellEOverPTool_mc12_HLLHC
81 PFCellLevelSubtractionTool.eflowCellEOverPTool = eflowCellEOverPTool_mc12_HLLHC ()
82 else:
83 PFCellEOverPTool = CompFactory.PFCellEOverPTool
84 PFCellLevelSubtractionTool.eflowCellEOverPTool = PFCellEOverPTool("PFCellEOverPTool", referenceFileLocation = inputFlags.PF.EOverP_CellOrdering_ReferenceLocation)
85 #this should always be false for any reference derived, except eflowCellEOverPTool_mc12_HLLHC.h or eflowCellEOverPTool_Run2_mc20_JetETMiss.h
86 PFCellLevelSubtractionTool.useLegacyEBinIndex=False
87
88 if(inputFlags.PF.EOverPMode):
89 PFCellLevelSubtractionTool.CalcEOverP = True
90 PFCellLevelSubtractionTool.nClusterMatchesToUse = -1
91 else:
92 PFCellLevelSubtractionTool.nClusterMatchesToUse = 1
93
94 if(inputFlags.PF.EOverPMode):
95 PFCellLevelSubtractionTool.PFTrackClusterMatchingTool = getPFTrackClusterMatchingTool(inputFlags,0.2,"EtaPhiSquareDistance","PlainEtaPhi","CalObjBldMatchingTool")
96 else:
97 PFCellLevelSubtractionTool.PFTrackClusterMatchingTool = getPFTrackClusterMatchingTool(inputFlags,1.64,"EtaPhiSquareSignificance","GeomCenterEtaPhi","CalObjBldMatchingTool")
98
99 PFCellLevelSubtractionTool.PFTrackClusterMatchingTool_015 = getPFTrackClusterMatchingTool(inputFlags,0.15,"EtaPhiSquareDistance","PlainEtaPhi","MatchingTool_Pull_015")
100 PFCellLevelSubtractionTool.PFTrackClusterMatchingTool_02 = getPFTrackClusterMatchingTool(inputFlags,0.2,"EtaPhiSquareDistance","PlainEtaPhi","MatchingTool_Pull_02")
101
102 if inputFlags.PF.useMLEOverP:
103 PFEnergyPredictorTool = CompFactory.PFEnergyPredictorTool("PFCellLevelEnergyPredcictorTool",ModelPath = inputFlags.PF.EOverP_NN_Model)
104 PFCellLevelSubtractionTool.NNEnergyPredictorTool = PFEnergyPredictorTool
105 PFCellLevelSubtractionTool.addCPData = inputFlags.PF.addCPData
106
107 if inputFlags.PF.useTruthCheating:
108 if inputFlags.PF.useTrackClusterTruthMatching:
109 PFCellLevelSubtractionTool.CaloClusterReadDecorHandleKey_NLeadingTruthParticles = "CaloTopoClusters." + inputFlags.Calo.TopoCluster.CalibrationHitDecorationName
110 PFCellLevelSubtractionTool.useTrackClusterTruthMatching=True
111
112 if inputFlags.PF.useTruthForChargedShowerSubtraction:
113 PFCellLevelSubtractionTool.useTruthForChargedShowerSubtraction = True
114 PFCellLevelSubtractionTool.PFSimulateTruthShowerTool = CompFactory.PFSimulateTruthShowerTool("PFSimulateTruthShowerTool")
115
116 return PFCellLevelSubtractionTool
117
118
119
120def getPFUnifiedCellLevelMatchingTool(inputFlags,toolName):
121 if inputFlags.PF.useTruthCheating and inputFlags.PF.useTrackClusterTruthMatching:
122 PFUnifiedCellLevelMatchingToolFactory = CompFactory.PFUnifiedMatchingTruthTool
123 PFUnifiedCellLevelMatchingTool = PFUnifiedCellLevelMatchingToolFactory(toolName+"_truthCheating")
124 PFUnifiedCellLevelMatchingTool.CaloClusterReadDecorHandleKey_NLeadingTruthParticles = "CaloTopoClusters." + inputFlags.Calo.TopoCluster.CalibrationHitDecorationName
125 else:
126 PFUnifiedCellLevelMatchingToolFactory = CompFactory.PFUnifiedMatchingTool
127 PFUnifiedCellLevelMatchingTool = PFUnifiedCellLevelMatchingToolFactory(toolName)
128
129 if inputFlags.GeoModel.Run <= LHCPeriod.Run3:
130 eflowCellEOverPTool_Run2_mc20_JetETMiss = CompFactory.eflowCellEOverPTool_Run2_mc20_JetETMiss
131 PFUnifiedCellLevelMatchingTool.eflowCellEOverPTool = eflowCellEOverPTool_Run2_mc20_JetETMiss()
132 else:
133 if inputFlags.PF.useLegacyEOverPRun4:
134 eflowCellEOverPTool_mc12_HLLHC = CompFactory.eflowCellEOverPTool_mc12_HLLHC
135 PFUnifiedCellLevelMatchingTool.eflowCellEOverPTool = eflowCellEOverPTool_mc12_HLLHC ()
136 else:
137 PFCellEOverPTool = CompFactory.PFCellEOverPTool
138 PFUnifiedCellLevelMatchingTool.eflowCellEOverPTool = PFCellEOverPTool("PFCellEOverPTool", referenceFileLocation = inputFlags.PF.EOverP_CellOrdering_ReferenceLocation)
139 #this should always be false for any reference derived, except eflowCellEOverPTool_mc12_HLLHC.h or eflowCellEOverPTool_Run2_mc20_JetETMiss.h
140 PFUnifiedCellLevelMatchingTool.useLegacyEBinIndex=False
141
142 if(inputFlags.PF.EOverPMode):
143 PFUnifiedCellLevelMatchingTool.nClusterMatchesToUse = -1
144 else:
145 PFUnifiedCellLevelMatchingTool.nClusterMatchesToUse = 1
146
147 if(inputFlags.PF.EOverPMode):
148 PFUnifiedCellLevelMatchingTool.PFTrackClusterMatchingTool = getPFTrackClusterMatchingTool(inputFlags,0.2,"EtaPhiSquareDistance","PlainEtaPhi","CalObjBldMatchingTool")
149 else:
150 PFUnifiedCellLevelMatchingTool.PFTrackClusterMatchingTool = getPFTrackClusterMatchingTool(inputFlags,1.64,"EtaPhiSquareSignificance","GeomCenterEtaPhi","CalObjBldMatchingTool")
151
152 PFUnifiedCellLevelMatchingTool.PFTrackClusterMatchingTool_015 = getPFTrackClusterMatchingTool(inputFlags,0.15,"EtaPhiSquareDistance","PlainEtaPhi","MatchingTool_Pull_015")
153 PFUnifiedCellLevelMatchingTool.PFTrackClusterMatchingTool_02 = getPFTrackClusterMatchingTool(inputFlags,0.2,"EtaPhiSquareDistance","PlainEtaPhi","MatchingTool_Pull_02")
154
155 PFUnifiedCellLevelMatchingTool.addCPData = inputFlags.PF.addCPData
156
157 return PFUnifiedCellLevelMatchingTool
158
159
161 if inputFlags.PF.useTruthCheating and inputFlags.PF.useTruthForChargedShowerSubtraction:
162 PFUnifiedCellLevelSubtractionOnlyToolFactory = CompFactory.PFUnifiedSubtractionOnlyTruthTool
163 PFUnifiedCellLevelSubtractionOnlyTool = PFUnifiedCellLevelSubtractionOnlyToolFactory(toolName+"_truthCheating", useNNEnergy = inputFlags.PF.useMLEOverP)
164 PFUnifiedCellLevelSubtractionOnlyTool.PFSimulateTruthShowerTool = CompFactory.PFSimulateTruthShowerTool("PFSimulateTruthShowerTool")
165 else:
166 PFUnifiedCellLevelSubtractionOnlyToolFactory = CompFactory.PFUnifiedSubtractionOnlyTool
167 PFUnifiedCellLevelSubtractionOnlyTool = PFUnifiedCellLevelSubtractionOnlyToolFactory(toolName, useNNEnergy = inputFlags.PF.useMLEOverP)
168
169 if inputFlags.GeoModel.Run <= LHCPeriod.Run3:
170 eflowCellEOverPTool_Run2_mc20_JetETMiss = CompFactory.eflowCellEOverPTool_Run2_mc20_JetETMiss
171 PFUnifiedCellLevelSubtractionOnlyTool.eflowCellEOverPTool = eflowCellEOverPTool_Run2_mc20_JetETMiss()
172 else:
173 if inputFlags.PF.useLegacyEOverPRun4:
174 eflowCellEOverPTool_mc12_HLLHC = CompFactory.eflowCellEOverPTool_mc12_HLLHC
175 PFUnifiedCellLevelSubtractionOnlyTool.eflowCellEOverPTool = eflowCellEOverPTool_mc12_HLLHC ()
176 else:
177 PFCellEOverPTool = CompFactory.PFCellEOverPTool
178 PFUnifiedCellLevelSubtractionOnlyTool.eflowCellEOverPTool = PFCellEOverPTool("PFCellEOverPTool", referenceFileLocation = inputFlags.PF.EOverP_CellOrdering_ReferenceLocation)
179 #this should always be false for any reference derived, except eflowCellEOverPTool_mc12_HLLHC.h or eflowCellEOverPTool_Run2_mc20_JetETMiss.h
180 PFUnifiedCellLevelSubtractionOnlyTool.useLegacyEBinIndex=False
181
182 if(inputFlags.PF.EOverPMode):
183 PFUnifiedCellLevelSubtractionOnlyTool.CalcEOverP = True
184
185 PFUnifiedCellLevelSubtractionOnlyTool.addCPData = inputFlags.PF.addCPData
186
187 if inputFlags.PF.useMLEOverP:
188 PFEnergyPredictorTool = CompFactory.PFEnergyPredictorTool("PFCellLevelEnergyPredcictorTool",ModelPath = inputFlags.PF.EOverP_NN_Model)
189 PFUnifiedCellLevelSubtractionOnlyTool.NNEnergyPredictorTool = PFEnergyPredictorTool
190
191
192 return PFUnifiedCellLevelSubtractionOnlyTool
193
194
195
196
197def getPFRecoverSplitShowersTool(inputFlags,toolName):
198 PFRecoverSplitShowersToolFactory = CompFactory.PFSubtractionTool
199 PFRecoverSplitShowersTool = PFRecoverSplitShowersToolFactory(toolName,useNNEnergy = inputFlags.PF.useMLEOverP)
200
201 if inputFlags.GeoModel.Run <= LHCPeriod.Run3:
202 eflowCellEOverPTool_Run2_mc20_JetETMiss = CompFactory.eflowCellEOverPTool_Run2_mc20_JetETMiss
203 PFRecoverSplitShowersTool.eflowCellEOverPTool = eflowCellEOverPTool_Run2_mc20_JetETMiss("eflowCellEOverPTool_Run2_mc20_JetETMiss_Recover")
204 else:
205 if inputFlags.PF.useLegacyEOverPRun4:
206 eflowCellEOverPTool_mc12_HLLHC = CompFactory.eflowCellEOverPTool_mc12_HLLHC
207 PFRecoverSplitShowersTool.eflowCellEOverPTool = eflowCellEOverPTool_mc12_HLLHC ()
208 else:
209 PFCellEOverPTool = CompFactory.PFCellEOverPTool
210 PFRecoverSplitShowersTool.eflowCellEOverPTool = PFCellEOverPTool("PFCellEOverPTool_Recover", referenceFileLocation = inputFlags.PF.EOverP_CellOrdering_ReferenceLocation)
211 #this should always be false for any reference derived, except eflowCellEOverPTool_mc12_HLLHC.h or eflowCellEOverPTool_Run2_mc20_JetETMiss.h
212 PFRecoverSplitShowersTool.useLegacyEBinIndex=False
213
214 PFRecoverSplitShowersTool.RecoverSplitShowers = True
215
216 if inputFlags.PF.useMLEOverP:
217 PFEnergyPredictorTool = CompFactory.PFEnergyPredictorTool("PFRecoverSplitShowersEnergyPredcictorTool",ModelPath = inputFlags.PF.EOverP_NN_Model)
218 PFRecoverSplitShowersTool.NNEnergyPredictorTool = PFEnergyPredictorTool
219
220 return PFRecoverSplitShowersTool
221
222
224 # RecoverSplitShowers is gated off when useTruthCheating is set (see getOfflinePFAlgorithm),
225 # so the truth-matching variant of this factory is unreachable by construction.
226 PFUnifiedRecoverSplitShowersMatchingToolFactory = CompFactory.PFUnifiedMatchingTool
227 PFUnifiedRecoverSplitShowersMatchingTool = PFUnifiedRecoverSplitShowersMatchingToolFactory(toolName)
228
229 if inputFlags.GeoModel.Run <= LHCPeriod.Run3:
230 eflowCellEOverPTool_Run2_mc20_JetETMiss = CompFactory.eflowCellEOverPTool_Run2_mc20_JetETMiss
231 PFUnifiedRecoverSplitShowersMatchingTool.eflowCellEOverPTool = eflowCellEOverPTool_Run2_mc20_JetETMiss("eflowCellEOverPTool_Run2_mc20_JetETMiss_Recover")
232 else:
233 if inputFlags.PF.useLegacyEOverPRun4:
234 eflowCellEOverPTool_mc12_HLLHC = CompFactory.eflowCellEOverPTool_mc12_HLLHC
235 PFUnifiedRecoverSplitShowersMatchingTool.eflowCellEOverPTool = eflowCellEOverPTool_mc12_HLLHC ()
236 else:
237 PFCellEOverPTool = CompFactory.PFCellEOverPTool
238 PFUnifiedRecoverSplitShowersMatchingTool.eflowCellEOverPTool = PFCellEOverPTool("PFCellEOverPTool_Recover", referenceFileLocation = inputFlags.PF.EOverP_CellOrdering_ReferenceLocation)
239 #this should always be false for any reference derived, except eflowCellEOverPTool_mc12_HLLHC.h or eflowCellEOverPTool_Run2_mc20_JetETMiss.h
240 PFUnifiedRecoverSplitShowersMatchingTool.useLegacyEBinIndex=False
241
242 PFUnifiedRecoverSplitShowersMatchingTool.RecoverSplitShowers = True
243
244 return PFUnifiedRecoverSplitShowersMatchingTool
245
246
247
249 # RecoverSplitShowers is gated off when useTruthCheating is set (see getOfflinePFAlgorithm),
250 # so the truth-cheating variant of this factory is unreachable by construction.
251 PFUnifiedRecoverSplitShowersSubtractionOnlyToolFactory = CompFactory.PFUnifiedSubtractionOnlyTool
252 PFUnifiedRecoverSplitShowersSubtractionOnlyTool = PFUnifiedRecoverSplitShowersSubtractionOnlyToolFactory(toolName, useNNEnergy = inputFlags.PF.useMLEOverP)
253
254 if inputFlags.GeoModel.Run <= LHCPeriod.Run3:
255 eflowCellEOverPTool_Run2_mc20_JetETMiss = CompFactory.eflowCellEOverPTool_Run2_mc20_JetETMiss
256 PFUnifiedRecoverSplitShowersSubtractionOnlyTool.eflowCellEOverPTool = eflowCellEOverPTool_Run2_mc20_JetETMiss("eflowCellEOverPTool_Run2_mc20_JetETMiss_Recover")
257 else:
258 if inputFlags.PF.useLegacyEOverPRun4:
259 eflowCellEOverPTool_mc12_HLLHC = CompFactory.eflowCellEOverPTool_mc12_HLLHC
260 PFUnifiedRecoverSplitShowersSubtractionOnlyTool.eflowCellEOverPTool = eflowCellEOverPTool_mc12_HLLHC ()
261 else:
262 PFCellEOverPTool = CompFactory.PFCellEOverPTool
263 PFUnifiedRecoverSplitShowersSubtractionOnlyTool.eflowCellEOverPTool = PFCellEOverPTool("PFCellEOverPTool_Recover", referenceFileLocation = inputFlags.PF.EOverP_CellOrdering_ReferenceLocation)
264 #this should always be false for any reference derived, except eflowCellEOverPTool_mc12_HLLHC.h or eflowCellEOverPTool_Run2_mc20_JetETMiss.h
265 PFUnifiedRecoverSplitShowersSubtractionOnlyTool.useLegacyEBinIndex=False
266
267 PFUnifiedRecoverSplitShowersSubtractionOnlyTool.RecoverSplitShowers = True
268
269 if inputFlags.PF.useMLEOverP:
270 PFEnergyPredictorTool = CompFactory.PFEnergyPredictorTool("PFRecoverSplitShowersEnergyPredcictorTool",ModelPath = inputFlags.PF.EOverP_NN_Model)
271 PFUnifiedRecoverSplitShowersSubtractionOnlyTool.NNEnergyPredictorTool = PFEnergyPredictorTool
272
273 return PFUnifiedRecoverSplitShowersSubtractionOnlyTool
274
275
276
277def getPFMomentCalculatorTool(inputFlags, momentsToCalculateList, use_unified = False):
278 result=ComponentAccumulator()
279 if use_unified:
280 PFMomentCalculatorToolFactory = CompFactory.PFUnifiedMomentCalculatorTool
281 else:
282 PFMomentCalculatorToolFactory = CompFactory.PFMomentCalculatorTool
283
284 PFMomentCalculatorTool = PFMomentCalculatorToolFactory("PFMomentCalculatorTool")
285
286 from CaloRec.CaloTopoClusterConfig import getTopoMoments
287 PFClusterMomentsMaker = result.popToolsAndMerge(getTopoMoments(inputFlags))
288 if (len(momentsToCalculateList) > 0):
289 PFClusterMomentsMaker.MomentsNames = momentsToCalculateList
290 PFMomentCalculatorTool.CaloClusterMomentsMaker = PFClusterMomentsMaker
291
292 PFClusterCollectionTool = CompFactory.PFClusterCollectionTool
293 PFMomentCalculatorTool.PFClusterCollectionTool = PFClusterCollectionTool("PFClusterCollectionTool")
294
295 if(inputFlags.PF.useCalibHitTruthClusterMoments):
296 PFMomentCalculatorTool.UseCalibHitTruth=True
297 from CaloRec.CaloTopoClusterConfig import getTopoCalibMoments
298 PFMomentCalculatorTool.CaloCalibClusterMomentsMaker2 = getTopoCalibMoments(inputFlags)
299
300 result.setPrivateTools(PFMomentCalculatorTool)
301 return result
302
303def getPFLCCalibTool(inputFlags,use_unified = False):
304
305 if use_unified:
306 PFLCCalibTool = CompFactory.PFUnifiedLCCalibTool
307 else:
308 PFLCCalibTool = CompFactory.PFLCCalibTool
309
310 PFLCCalibTool = PFLCCalibTool("PFLCCalibTool")
311
312 PFClusterCollectionTool = CompFactory.PFClusterCollectionTool
313 PFLCCalibTool.eflowRecClusterCollectionTool = PFClusterCollectionTool("PFClusterCollectionTool_LCCalib")
314 PFLCCalibTool.UseLocalWeight = False
315
316 from CaloRec.CaloTopoClusterConfig import getTopoClusterLocalCalibTools
317 lcCalibToolList = getTopoClusterLocalCalibTools(inputFlags)
318
319 PFLCCalibTool.CaloClusterLocalCalib=lcCalibToolList[0]
320 PFLCCalibTool.CaloClusterLocalCalibOOCC=lcCalibToolList[1]
321 PFLCCalibTool.CaloClusterLocalCalibOOCCPi0=lcCalibToolList[2]
322 PFLCCalibTool.CaloClusterLocalCalibDM=lcCalibToolList[3]
323
324 return PFLCCalibTool
325
326def getChargedFlowElementCreatorAlgorithm(inputFlags,chargedFlowElementOutputName,nameSuffix="",eflowCaloObjectContainerName="eflowCaloObjects"):
327 FlowElementChargedCreatorAlgorithmFactory = CompFactory.PFChargedFlowElementCreatorAlgorithm
328 FlowElementChargedCreatorAlgorithm = FlowElementChargedCreatorAlgorithmFactory("PFChargedFlowElementCreatorAlgorithm"+nameSuffix)
329 FlowElementChargedCreatorAlgorithm.eflowCaloObjectContainerName = eflowCaloObjectContainerName
330 if chargedFlowElementOutputName:
331 FlowElementChargedCreatorAlgorithm.FlowElementOutputName=chargedFlowElementOutputName
332 if(inputFlags.PF.EOverPMode):
333 FlowElementChargedCreatorAlgorithm.FlowElementOutputName="EOverPChargedParticleFlowObjects"
334 FlowElementChargedCreatorAlgorithm.EOverPMode = True
335 if inputFlags.PF.addCPData:
336 FlowElementChargedCreatorAlgorithm.addCPData = True
337
338 return FlowElementChargedCreatorAlgorithm
339
340def getNeutralFlowElementCreatorAlgorithm(inputFlags,neutralFlowElementOutputName,nameSuffix="",eflowCaloObjectContainerName="eflowCaloObjects"):
341 FlowElementNeutralCreatorAlgorithmFactory = CompFactory.PFNeutralFlowElementCreatorAlgorithm
342 FlowElementNeutralCreatorAlgorithm = FlowElementNeutralCreatorAlgorithmFactory("PFNeutralFlowElementCreatorAlgorithm"+nameSuffix)
343 FlowElementNeutralCreatorAlgorithm.eflowCaloObjectContainerName = eflowCaloObjectContainerName
344 if neutralFlowElementOutputName:
345 FlowElementNeutralCreatorAlgorithm.FlowElementOutputName=neutralFlowElementOutputName
346 if(inputFlags.PF.EOverPMode):
347 FlowElementNeutralCreatorAlgorithm.FlowElementOutputName="EOverPNeutralParticleFlowObjects"
348 if(inputFlags.PF.useCalibHitTruthClusterMoments and inputFlags.PF.addClusterMoments):
349 FlowElementNeutralCreatorAlgorithm.UseCalibHitTruth=True
350 if inputFlags.PF.addCPData:
351 FlowElementNeutralCreatorAlgorithm.addCPData = True
352
353 return FlowElementNeutralCreatorAlgorithm
354
355def getLCNeutralFlowElementCreatorAlgorithm(inputFlags,neutralFlowElementOutputName):
356 LCFlowElementNeutralCreatorAlgorithmFactory = CompFactory.PFLCNeutralFlowElementCreatorAlgorithm
357 LCFlowElementNeutralCreatorAlgorithm = LCFlowElementNeutralCreatorAlgorithmFactory("PFLCNeutralFlowElementCreatorAlgorithm")
358 if neutralFlowElementOutputName:
359 LCFlowElementNeutralCreatorAlgorithm.FELCOutputName=neutralFlowElementOutputName
360 if(inputFlags.PF.EOverPMode):
361 LCFlowElementNeutralCreatorAlgorithm.FEInputContainerName="EOverPNeutralParticleFlowObjects"
362 LCFlowElementNeutralCreatorAlgorithm.FELCOutputName="EOverPLCNeutralParticleFlowObjects"
363
364 return LCFlowElementNeutralCreatorAlgorithm
365
366# Factory function to create the ML-based neutral flow element creator algorithm
367def getPFOClusterMLCorrectionAlgorithmCfg(inputFlags, inputNameBase = "JetETMiss", outputNameBase = "JetETMissClusterMLCorrected"):
368 alg = CompFactory.PFOClusterMLCorrectionAlgorithm("PFOClusterMLCorrectionAlgorithm")
369 suffix = "ParticleFlowObjects"
370 alg.NeutralPFlowInputContainer = inputNameBase + "Neutral" + suffix
371 alg.ChargedPFlowInputContainer = inputNameBase + "Charged" + suffix
372 alg.NeutralPFlowOutputContainer = outputNameBase + "Neutral" + suffix
373 alg.ChargedPFlowOutputContainer = outputNameBase + "Charged" + suffix
374
375 return alg
376
377def getNeutralPFOClusterMLCorrectionToolCfg(inputFlags, toolName="NeutralPFOClusterMLCorrectionTool", **kwargs):
378 if toolName == "NeutralPFOClusterMLCorrectionTool":
379 tool = CompFactory.NeutralPFOClusterMLCorrectionTool(toolName, **kwargs)
380 else:
381 raise ValueError(f"Unknown tool name: {toolName}")
382
383 ca = ComponentAccumulator()
384 ca.setPrivateTools(tool)
385 return ca
386
387
388
389
390def getEGamFlowElementAssocAlgorithm(inputFlags, algName="", **kwargs):
391
392 kwargs.setdefault("neutral_FE_cont_name", "")
393 kwargs.setdefault("charged_FE_cont_name", "")
394 kwargs.setdefault("doTCC", False)
395 kwargs.setdefault("useGlobal", False)
396
397 PFEGamFlowElementLinkerAlgorithmFactory=CompFactory.PFEGamFlowElementAssoc
398 if not algName:
399 algName = "PFEGamFlowElementAssoc"
400 PFEGamFlowElementLinkerAlgorithm=PFEGamFlowElementLinkerAlgorithmFactory(algName)
401
402 #set an an alternate name if needed
403 #this uses some gaudi core magic, namely that you can change the name of the handle as it is a callable attribute, despite the attribute not being explicitly listed in the header
404 #for a key of type SG::WriteDecorHandle<xAOD::SomeCont>someKey{this,"SpecificContainerName","myContainerName","other-labels"}
405 #setting algorithm.SpecificContainerName="myNewContainerName" changes parameter "myContainerName"
406 #(also applies to ReadHandles)
407 if kwargs['neutral_FE_cont_name']:
408 PFEGamFlowElementLinkerAlgorithm.JetEtMissNeutralFlowElementContainer = kwargs['neutral_FE_cont_name']
409
410 if kwargs['charged_FE_cont_name']:
411 PFEGamFlowElementLinkerAlgorithm.JetEtMissChargedFlowElementContainer = kwargs['charged_FE_cont_name']
412
413 if kwargs['doTCC']:
414 # ReadHandles to change
415 PFEGamFlowElementLinkerAlgorithm.JetEtMissNeutralFlowElementContainer="TrackCaloClustersNeutral"
416 PFEGamFlowElementLinkerAlgorithm.JetEtMissChargedFlowElementContainer="TrackCaloClustersCharged"
417
418 #Now to change the writeHandles
419 # first the Electron -> FE links
420 EL_NFE_Link=str(PFEGamFlowElementLinkerAlgorithm.ElectronNeutralFEDecorKey)
421 PFEGamFlowElementLinkerAlgorithm.ElectronNeutralFEDecorKey=EL_NFE_Link.replace("FELinks","TCCLinks")
422 EL_CFE_Link=str(PFEGamFlowElementLinkerAlgorithm.ElectronChargedFEDecorKey)
423 PFEGamFlowElementLinkerAlgorithm.ElectronChargedFEDecorKey=EL_CFE_Link.replace("FELinks","TCCLinks")
424 #then the converse case (FE -> Electron)
425
426 PFEGamFlowElementLinkerAlgorithm.ChargedFEElectronDecorKey="TCC_ElectronLinks"
427 PFEGamFlowElementLinkerAlgorithm.NeutralFEElectronDecorKey="TCC_ElectronLinks"
428
429
430 # first the Photon -> FE links
431 PH_NFE_Link=str(PFEGamFlowElementLinkerAlgorithm.PhotonNeutralFEDecorKey)
432 PFEGamFlowElementLinkerAlgorithm.PhotonNeutralFEDecorKey=PH_NFE_Link.replace("FELinks","TCCLinks")
433 PH_CFE_Link=str(PFEGamFlowElementLinkerAlgorithm.PhotonChargedFEDecorKey)
434 PFEGamFlowElementLinkerAlgorithm.PhotonChargedFEDecorKey=PH_CFE_Link.replace("FELinks","TCCLinks")
435 #then the converse case (FE -> Photons)
436
437 PFEGamFlowElementLinkerAlgorithm.ChargedFEPhotonDecorKey="TCC_PhotonLinks"
438 PFEGamFlowElementLinkerAlgorithm.NeutralFEPhotonDecorKey="TCC_PhotonLinks"
439
440 if kwargs['useGlobal']:
441 # ReadHandles to change
442 PFEGamFlowElementLinkerAlgorithm.JetEtMissNeutralFlowElementContainer="GlobalNeutralParticleFlowObjects"
443 PFEGamFlowElementLinkerAlgorithm.JetEtMissChargedFlowElementContainer="GlobalChargedParticleFlowObjects"
444
445 #Now to change the writeHandles
446 # first the Electron -> FE links
447 EL_NFE_Link=str(PFEGamFlowElementLinkerAlgorithm.ElectronNeutralFEDecorKey)
448 PFEGamFlowElementLinkerAlgorithm.ElectronNeutralFEDecorKey=EL_NFE_Link.replace("FELinks","GlobalFELinks")
449 EL_CFE_Link=str(PFEGamFlowElementLinkerAlgorithm.ElectronChargedFEDecorKey)
450 PFEGamFlowElementLinkerAlgorithm.ElectronChargedFEDecorKey=EL_CFE_Link.replace("FELinks","GlobalFELinks")
451 #then the converse case (FE -> Electron)
452
453 PFEGamFlowElementLinkerAlgorithm.ChargedFEElectronDecorKey="GlobalFE_ElectronLinks"
454 PFEGamFlowElementLinkerAlgorithm.NeutralFEElectronDecorKey="GlobalFE_ElectronLinks"
455
456
457 # first the Photon -> FE links
458 PH_NFE_Link=str(PFEGamFlowElementLinkerAlgorithm.PhotonNeutralFEDecorKey)
459 PFEGamFlowElementLinkerAlgorithm.PhotonNeutralFEDecorKey=PH_NFE_Link.replace("FELinks","GlobalFELinks")
460 PH_CFE_Link=str(PFEGamFlowElementLinkerAlgorithm.PhotonChargedFEDecorKey)
461 PFEGamFlowElementLinkerAlgorithm.PhotonChargedFEDecorKey=PH_CFE_Link.replace("FELinks","GlobalFELinks")
462 #then the converse case (FE -> Photons)
463
464 PFEGamFlowElementLinkerAlgorithm.ChargedFEPhotonDecorKey="TCC_PhotonLinks"
465 PFEGamFlowElementLinkerAlgorithm.NeutralFEPhotonDecorKey="TCC_PhotonLinks"
466
467
468
469 return PFEGamFlowElementLinkerAlgorithm
470
471def getMuonFlowElementAssocAlgorithm(inputFlags, algName="", **kwargs):
472
473 kwargs.setdefault("neutral_FE_cont_name", "")
474 kwargs.setdefault("charged_FE_cont_name", "")
475 kwargs.setdefault("LinkNeutralFEClusters", True)
476 kwargs.setdefault("doTCC", False)
477 kwargs.setdefault("useGlobal", False)
478
479 useMuonTopoClusters = False
480 from AthenaConfiguration.Enums import ProductionStep
481 # set 'useMuonTopoClusters=True' if running on AOD, as do not have calorimeter cells for CaloCalTopoCluster
482 # Assumes that in production workflows this only happens in "Derivation" or if DQ environment is AOD
483 if inputFlags.Common.ProductionStep in [ProductionStep.Derivation] or inputFlags.DQ.Environment == "AOD":
484 useMuonTopoClusters = True
485
486
487 PFMuonFlowElementLinkerAlgorithmFactory=CompFactory.PFMuonFlowElementAssoc
488 if not algName:
489 algName="PFMuonFlowElementAssoc"
490 PFMuonFlowElementLinkerAlgorithm=PFMuonFlowElementLinkerAlgorithmFactory(algName)
491
492 #set an an alternate name if needed
493 #this uses some gaudi core magic, namely that you can change the name of the handle as it is a callable attribute, despite the attribute not being explicitly listed in the header as such
494 #for a key of type SG::WriteDecorHandle<xAOD::SomeCont>someKey{this,"SpecificContainerName","myContainerName","other-labels"}
495 #setting algorithm.SpecificContainerName="myNewContainerName" changes parameter "myContainerName" to "myNewContainerName"
496 if kwargs['neutral_FE_cont_name']:
497 #update the readhandle
498 PFMuonFlowElementLinkerAlgorithm.JetEtMissNeutralFlowElementContainer = kwargs['neutral_FE_cont_name']
499 #update the write handle for the link
500
501 if kwargs['charged_FE_cont_name']:
502 PFMuonFlowElementLinkerAlgorithm.JetEtMissChargedFlowElementContainer = kwargs['charged_FE_cont_name']
503
504 PFMuonFlowElementLinkerAlgorithm.LinkNeutralFEClusters = kwargs['LinkNeutralFEClusters']
505 PFMuonFlowElementLinkerAlgorithm.useMuonTopoClusters = useMuonTopoClusters
506
507 #prototype on AOD with the linkers already defined - so need to rename the output links to something besides their default name.
508
509 #Track Calo cluster (TCC) specific configuration. Input is differently named FE container, and in the AOD step specifically
510 if kwargs['doTCC']:
511 #input containers are TrackCaloClustersCharged and TrackCaloClustersNeutral, so rename them
512 #service_key="StoreGateSvc+"
513 service_key=""
514 PFMuonFlowElementLinkerAlgorithm.MuonContainer=service_key+"Muons"
515 PFMuonFlowElementLinkerAlgorithm.JetEtMissChargedFlowElementContainer=service_key+"TrackCaloClustersCharged"
516 PFMuonFlowElementLinkerAlgorithm.JetEtMissNeutralFlowElementContainer=service_key+"TrackCaloClustersNeutral"
517
518 #Output
519 #rename the FE_MuonLinks as TCC_MuonLinks
520 #rename output containers
521 PFMuonFlowElementLinkerAlgorithm.MuonContainer_chargedFELinks="chargedTCCLinks"
522 PFMuonFlowElementLinkerAlgorithm.MuonContainer_neutralFELinks="neutralTCCLinks"
523 PFMuonFlowElementLinkerAlgorithm.JetETMissNeutralFlowElementContainer_FE_MuonLinks="TCC_MuonLinks"
524 PFMuonFlowElementLinkerAlgorithm.JetETMissChargedFlowElements_FE_MuonLinks="TCC_MuonLinks"
525 PFMuonFlowElementLinkerAlgorithm.FlowElementContainer_ChargedFE_ennergy_matched_muon="TCC_efrac_matched_muon"
526 # several variables relating to Neutral Flow Elements/TCCs to Muons for debug. perhaps at some point these should be removed by default
527 PFMuonFlowElementLinkerAlgorithm.FlowElementContainer_nMatchedMuons="TCC_nMatchedMuons"
528 PFMuonFlowElementLinkerAlgorithm.FlowElementContainer_FE_efrac_matched_muon="TCC_efrac_matched_muon"
529
530 PFMuonFlowElementLinkerAlgorithm.MuonContainer_muon_efrac_matched_FE="muon_efrac_matched_TCC"
531 # this is because the algorithm adds this debug container which we don't need
532 PFMuonFlowElementLinkerAlgorithm.MuonContainer_ClusterInfo_deltaR="deltaR_muon_clus_TCCalg"
533
534 if kwargs['useGlobal']:
535 PFMuonFlowElementLinkerAlgorithm.JetEtMissChargedFlowElementContainer="GlobalChargedParticleFlowObjects"
536 PFMuonFlowElementLinkerAlgorithm.JetEtMissNeutralFlowElementContainer="GlobalNeutralParticleFlowObjects"
537
538 PFMuonFlowElementLinkerAlgorithm.MuonContainer_chargedFELinks="chargedGlobalFELinks"
539 PFMuonFlowElementLinkerAlgorithm.MuonContainer_neutralFELinks="neutralGlobalFELinks"
540
541 PFMuonFlowElementLinkerAlgorithm.JetETMissNeutralFlowElementContainer_FE_MuonLinks="GlobalFE_MuonLinks"
542 PFMuonFlowElementLinkerAlgorithm.JetETMissChargedFlowElements_FE_MuonLinks="GlobalFE_MuonLinks"
543 PFMuonFlowElementLinkerAlgorithm.FlowElementContainer_ChargedFE_ennergy_matched_muon="GlobalFE_efrac_matched_muon"
544
545 PFMuonFlowElementLinkerAlgorithm.FlowElementContainer_nMatchedMuons="GlobalFE_nMatchedMuons"
546 PFMuonFlowElementLinkerAlgorithm.FlowElementContainer_FE_efrac_matched_muon="GlobalFE_efrac_matched_muon"
547
548 PFMuonFlowElementLinkerAlgorithm.MuonContainer_muon_efrac_matched_FE="muon_efrac_matched_GlobalFE"
549 # this is because the algorithm adds this debug container which we don't need
550 PFMuonFlowElementLinkerAlgorithm.MuonContainer_ClusterInfo_deltaR="deltaR_muon_clus_GlobalFEalg"
551
552 if kwargs['LinkNeutralFEClusters'] and not useMuonTopoClusters:
553 # We dereference links to cells, so make sure we have the
554 # dependency.
555 PFMuonFlowElementLinkerAlgorithm.ExtraInputs.add(('CaloCellContainer', inputFlags.Egamma.Keys.Input.CaloCells))
556
557 if kwargs['LinkNeutralFEClusters']:
558 if kwargs['doTCC']:
559 # since the cells are deleted on AOD, if you try to run the link between NFE and Muon on AOD, it will crash. Terminate to catch this.
560 # This is a known bug to rectify soon
561 from AthenaCommon.Logging import logging
562 msg=logging.getLogger("PFCfg.py::getMuonFlowElementAssocAlgorithm")
563 msg.error("Neutral FE from AOD configured to be linked with Muon. This link will fail due to missing CaloCells in the AOD")
564 msg.info("Terminating job")
565 exit(0)
566
567
568 return PFMuonFlowElementLinkerAlgorithm
569
570def getTauFlowElementAssocAlgorithm(inputFlags, algName="", **kwargs):
571
572 kwargs.setdefault("neutral_FE_cont_name", "")
573 kwargs.setdefault("charged_FE_cont_name", "")
574 kwargs.setdefault("doTCC", False)
575 kwargs.setdefault("useGlobal", False)
576
577 PFTauFlowElementLinkerAlgorithmFactory=CompFactory.PFTauFlowElementAssoc
578 if not algName:
579 algName = "PFTauFlowElementAssoc"
580
581 PFTauFlowElementLinkerAlgorithm=PFTauFlowElementLinkerAlgorithmFactory(algName)
582
583 #set an an alternate name if needed
584 #this uses some gaudi core magic, namely that you can change the name of the handle as it is a callable attribute, despite the attribute not being explicitly listed in the header
585 #for a key of type SG::WriteDecorHandle<xAOD::SomeCont>someKey{this,"SpecificContainerName","myContainerName","other-labels"}
586 #setting algorithm.SpecificContainerName="myNewContainerName" changes parameter "myContainerName"
587 #(also applies to ReadHandles)
588 if kwargs['neutral_FE_cont_name']:
589 PFTauFlowElementLinkerAlgorithm.JetETMissNeutralFlowElementContainer = kwargs['neutral_FE_cont_name']
590
591 if kwargs['charged_FE_cont_name']:
592 PFTauFlowElementLinkerAlgorithm.JetETMissChargedFlowElementContainer = kwargs['charged_FE_cont_name']
593
594 if kwargs['doTCC']:
595 PFTauFlowElementLinkerAlgorithm.JetETMissNeutralFlowElementContainer="TrackCaloClustersNeutral"
596 PFTauFlowElementLinkerAlgorithm.JetETMissChargedFlowElementContainer="TrackCaloClustersCharged"
597
598 PFTauFlowElementLinkerAlgorithm.TauNeutralFEDecorKey="neutralTCCLinks"
599 PFTauFlowElementLinkerAlgorithm.TauChargedFEDecorKey="chargedTCCLinks"
600
601 PFTauFlowElementLinkerAlgorithm.NeutralFETauDecorKey="TCC_TauLinks"
602 PFTauFlowElementLinkerAlgorithm.ChargedFETauDecorKey="TCC_TauLinks"
603
604 #This allows to set the links on the global particle flow containers created by JetPFlowSelectionAlg in JetRecTools
605 if kwargs['useGlobal']:
606 PFTauFlowElementLinkerAlgorithm.JetETMissNeutralFlowElementContainer="GlobalNeutralParticleFlowObjects"
607 PFTauFlowElementLinkerAlgorithm.JetETMissChargedFlowElementContainer="GlobalChargedParticleFlowObjects"
608
609 PFTauFlowElementLinkerAlgorithm.TauNeutralFEDecorKey="neutralGlobalFELinks"
610 PFTauFlowElementLinkerAlgorithm.TauChargedFEDecorKey="chargedGlobalFELinks"
611
612 PFTauFlowElementLinkerAlgorithm.NeutralFETauDecorKey="GlobalFE_TauLinks"
613 PFTauFlowElementLinkerAlgorithm.ChargedFETauDecorKey="GlobalFE_TauLinks"
614
615 return PFTauFlowElementLinkerAlgorithm
616
617def getOfflinePFAlgorithm(inputFlags, **kwargs):
618 result=ComponentAccumulator()
619
620 PFAlgorithm=CompFactory.PFAlgorithm
621 PFAlgorithm = PFAlgorithm("PFAlgorithm")
622
623 if inputFlags.HeavyIon.Egamma.doSubtractedClusters:
624 PFAlgorithm.PFClusterSelectorTool = getPFClusterSelectorTool(inputFlags,inputFlags.HeavyIon.Egamma.UncalibCaloTopoCluster,inputFlags.HeavyIon.Egamma.CaloTopoCluster,"PFClusterSelectorTool")
625 else:
626 topoClustersName="CaloTopoClusters"
627 PFAlgorithm.PFClusterSelectorTool = getPFClusterSelectorTool(inputFlags,topoClustersName,"CaloCalTopoClusters","PFClusterSelectorTool")
628
629 if inputFlags.PF.useUnified:
630 PFAlgorithm.useUnified = True
631 PFAlgorithm.UnifiedBaseTools = [getPFUnifiedCellLevelMatchingTool(inputFlags, "PFUnifiedCellLevelMatchingTool")]
632 PFAlgorithm.UnifiedBaseTools += [getPFUnifiedCellLevelSubtractionOnlyTool(inputFlags, "PFUnifiedCellLevelSubtractionOnlyTool")]
633 if not inputFlags.PF.EOverPMode and not inputFlags.PF.useTruthCheating:
634 PFAlgorithm.UnifiedBaseTools += [getPFUnifiedRecoverSplitShowersMatchingTool(inputFlags, "PFUnifiedRecoverSplitShowersMatchingTool")]
635 PFAlgorithm.UnifiedBaseTools += [getPFUnifiedRecoverSplitShowersSubtractionOnlyTool(inputFlags, "PFUnifiedRecoverSplitShowersSubtractionOnlyTool")]
636
637 PFUnifiedMomentCalculatorTools=result.popToolsAndMerge(getPFMomentCalculatorTool(inputFlags,[], use_unified = True))
638 PFAlgorithm.UnifiedBaseTools += [PFUnifiedMomentCalculatorTools]
639 PFAlgorithm.UnifiedBaseTools += [getPFLCCalibTool(inputFlags, use_unified = True)]
640 if inputFlags.PF.EOverPMode:
641 PFAlgorithm.UnifiedBaseTools += [CompFactory.PFUnifiedRadialEnergyCalculatorTool()]
642
643 else:
644 PFAlgorithm.SubtractionToolList = [getPFCellLevelSubtractionTool(inputFlags,"PFCellLevelSubtractionTool")]
645
646 if not inputFlags.PF.EOverPMode and not inputFlags.PF.useTruthCheating:
647 PFAlgorithm.SubtractionToolList += [getPFRecoverSplitShowersTool(inputFlags,"PFRecoverSplitShowersTool")]
648
649 PFMomentCalculatorTools=result.popToolsAndMerge(getPFMomentCalculatorTool(inputFlags,[]))
650 PFAlgorithm.BaseToolList = [PFMomentCalculatorTools]
651 PFAlgorithm.BaseToolList += [getPFLCCalibTool(inputFlags)]
652 if inputFlags.PF.EOverPMode:
653 PFAlgorithm.BaseToolList += [CompFactory.PFRadialEnergyCalculatorTool()]
654
655 result.addEventAlgo(PFAlgorithm)
656 return result
657
658
659
660def PFGlobalFlowElementLinkingCfg(inputFlags, **kwargs):
661 result=ComponentAccumulator()
662
663 kwargs.setdefault("useGlobal", True)
664
665 result.addEventAlgo(getTauFlowElementAssocAlgorithm(inputFlags, algName="PFTauGlobalFlowElementAssoc", **kwargs))
666 result.addEventAlgo(getMuonFlowElementAssocAlgorithm(inputFlags, algName="PFMuonGlobalFlowElementAssoc", **kwargs))
667 result.addEventAlgo(getEGamFlowElementAssocAlgorithm(inputFlags, algName="PFEGamGlobalFlowElementAssoc", **kwargs))
668 return result
if(pathvar)
Class to store reference e/p mean and widths, as well as reference energy density radial profile fit ...
Inherits from IPFClusterCollectionTool and AthAlgTool.
This tool can either use a series of CaloClusterProcessor to calibrate the modified xAOD::CaloCluster...
This is the tool, which inherits from AthAlgTool, which clients can use for track-cluster matching.
Class to store reference e/p mean and widths, as well as reference energy density radial profile fit ...
Inherits from eflowTrackExtrapolatorBaseAlgTool and AthAlgTool.
getEGamFlowElementAssocAlgorithm(inputFlags, algName="", **kwargs)
Definition PFCfg.py:390
getPFUnifiedRecoverSplitShowersMatchingTool(inputFlags, toolName)
Definition PFCfg.py:223
getTauFlowElementAssocAlgorithm(inputFlags, algName="", **kwargs)
Definition PFCfg.py:570
getPFRecoverSplitShowersTool(inputFlags, toolName)
Definition PFCfg.py:197
getPFCellLevelSubtractionTool(inputFlags, toolName)
Definition PFCfg.py:71
PFTrackSelectorAlgCfg(inputFlags, algName, useCaching=True)
Definition PFCfg.py:6
getOfflinePFAlgorithm(inputFlags, **kwargs)
Definition PFCfg.py:617
getPFTrackClusterMatchingTool(inputFlags, matchCut, distanceType, clusterPositionType, name)
Definition PFCfg.py:62
getPFUnifiedRecoverSplitShowersSubtractionOnlyTool(inputFlags, toolName)
Definition PFCfg.py:248
getLCNeutralFlowElementCreatorAlgorithm(inputFlags, neutralFlowElementOutputName)
Definition PFCfg.py:355
getPFOClusterMLCorrectionAlgorithmCfg(inputFlags, inputNameBase="JetETMiss", outputNameBase="JetETMissClusterMLCorrected")
Definition PFCfg.py:367
getPFClusterSelectorTool(inputFlags, clustersin, calclustersin, algName)
Definition PFCfg.py:43
getMuonFlowElementAssocAlgorithm(inputFlags, algName="", **kwargs)
Definition PFCfg.py:471
getPFUnifiedCellLevelSubtractionOnlyTool(inputFlags, toolName)
Definition PFCfg.py:160
getPFLCCalibTool(inputFlags, use_unified=False)
Definition PFCfg.py:303
getNeutralFlowElementCreatorAlgorithm(inputFlags, neutralFlowElementOutputName, nameSuffix="", eflowCaloObjectContainerName="eflowCaloObjects")
Definition PFCfg.py:340
getPFMomentCalculatorTool(inputFlags, momentsToCalculateList, use_unified=False)
Definition PFCfg.py:277
PFGlobalFlowElementLinkingCfg(inputFlags, **kwargs)
Definition PFCfg.py:660
getChargedFlowElementCreatorAlgorithm(inputFlags, chargedFlowElementOutputName, nameSuffix="", eflowCaloObjectContainerName="eflowCaloObjects")
Definition PFCfg.py:326
getNeutralPFOClusterMLCorrectionToolCfg(inputFlags, toolName="NeutralPFOClusterMLCorrectionTool", **kwargs)
Definition PFCfg.py:377
getPFUnifiedCellLevelMatchingTool(inputFlags, toolName)
Definition PFCfg.py:120