ATLAS Offline Software
Loading...
Searching...
No Matches
EGammaToolsConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3# ==============================================================================
4# Provides configs for the tools used for e-gamma decorations used in DAOD
5# building
6# ==============================================================================
7
8from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
9from AthenaConfiguration.ComponentFactory import CompFactory
10
11
12# PhotonsDirectionTool
13def PhotonsDirectionToolCfg(flags, name, **kwargs):
14 """Configure the PhotonsDirectionTool"""
15 acc = ComponentAccumulator()
16 acc.setPrivateTools(CompFactory.DerivationFramework.PhotonsDirectionTool(name, **kwargs))
17 return acc
18
19
20# E-gamma selection tool wrapper
21def EGSelectionToolWrapperCfg(flags, name, **kwargs):
22 """Configure the E-gamma selection tool wrapper"""
23 acc = ComponentAccumulator()
24 sgName = kwargs.pop("StoreGateEntryName", "")
25 if not sgName:
26 raise AttributeError("StoreGateEntryName not set")
27 kwargs.setdefault("decoratorPass", sgName)
28 kwargs.setdefault("decoratorIsEM", sgName + "IsEMValue")
29 acc.setPrivateTools(CompFactory.DerivationFramework.EGSelectionToolWrapper(name, **kwargs))
30 return acc
31
32
33# Electron likelihood tool wrapper
34def EGElectronLikelihoodToolWrapperCfg(flags, name, **kwargs):
35 """Configure the electron likelihood tool wrapper"""
36 acc = ComponentAccumulator()
37 sgName = kwargs.pop("StoreGateEntryName", "")
38 containerName = kwargs.setdefault("ContainerName", "")
39 if not sgName:
40 raise AttributeError("StoreGateEntryName not set")
41 if not containerName:
42 raise AttributeError("ContainerName empty string")
43 storeTResult = kwargs.setdefault("StoreTResult", False)
44 storeMultipleOutputs = kwargs.setdefault("StoreMultipleOutputs", False)
45 sgMultipleNames = kwargs.pop("StoreGateEntryMultipleNames", [])
46 # Write decoration handle keys
47 kwargs.setdefault("decoratorPass", sgName)
48 kwargs.setdefault("decoratorIsEM", sgName + "IsEMValue")
49 kwargs.setdefault("decoratorResult", sgName + "Result" if storeTResult else "")
50 kwargs.setdefault("decoratorMultipleOutputs", sgMultipleNames if storeMultipleOutputs else [])
51 acc.setPrivateTools(CompFactory.DerivationFramework.EGElectronLikelihoodToolWrapper(name, **kwargs))
52 return acc
53
54# Photon BDT decrotation tool
55def EGPhotonBDTToolDecoratorCfg(flags, name, **kwargs):
56 """Configure the E-gamma selection tool decorator"""
57 acc = ComponentAccumulator()
58 sgName = kwargs.pop("StoreGateEntryName", "")
59 if not sgName:
60 raise AttributeError("StoreGateEntryName not set")
61 kwargs.setdefault("decoratorScore", sgName + "Score")
62 acc.setPrivateTools(CompFactory.DerivationFramework.EGPhotonBDTToolDecorator(name, **kwargs))
63 return acc
64
65# Photon BDT selection tool wrapper
66def EGPhotonBDTToolWrapperCfg(flags, name, **kwargs):
67 """Configure the E-gamma selection tool wrapper"""
68 acc = ComponentAccumulator()
69 sgName = kwargs.pop("StoreGateEntryName", "")
70 if not sgName:
71 raise AttributeError("StoreGateEntryName not set")
72 wpName = kwargs.pop("WorkingPointName", "")
73 if not wpName:
74 raise AttributeError("WorkingPointName not set")
75 kwargs.setdefault("decoratorPass", sgName+wpName)
76 kwargs.setdefault("decoratorIsEM", sgName+wpName + "IsEMValue")
77 acc.setPrivateTools(CompFactory.DerivationFramework.EGPhotonBDTToolWrapper(name, **kwargs))
78 return acc
79
80# Photon cleaning tool wrapper
81def EGPhotonCleaningWrapperCfg(flags, name, **kwargs):
82 """Configure the photon cleaning tool wrapper"""
83 acc = ComponentAccumulator()
84 sgName = kwargs.pop("StoreGateEntryName", "DFCommonPhotonsCleaning")
85 # Write decoration handle keys
86 kwargs.setdefault("decoratorPass", sgName)
87 kwargs.setdefault("decoratorPassDelayed", sgName + "NoTime")
88 acc.setPrivateTools(CompFactory.DerivationFramework.EGPhotonCleaningWrapper(name, **kwargs))
89 return acc
90
91
92# Electron ambiguity tool
93def EGElectronAmbiguityToolCfg(flags, name, **kwargs):
94 """Configure the electron ambiguity tool"""
95 acc = ComponentAccumulator()
96 EGElectronAmbiguityTool = CompFactory.DerivationFramework.EGElectronAmbiguityTool
97 acc.setPrivateTools(EGElectronAmbiguityTool(name, **kwargs))
98 return acc
99
100
101# Background electron classification tool
102def BkgElectronClassificationCfg(flags, name, **kwargs):
103 """Configure the background electron classification tool"""
104 acc = ComponentAccumulator()
105 from MCTruthClassifier.MCTruthClassifierConfig import DFCommonMCTruthClassifierCfg
106 kwargs.setdefault("MCTruthClassifierTool", acc.popToolsAndMerge(
107 DFCommonMCTruthClassifierCfg(flags)))
108 acc.setPrivateTools(CompFactory.DerivationFramework.BkgElectronClassification(name, **kwargs))
109 return acc
110
111
112# Standard + LRT electron collection merger
113def ElectronMergerCfg(flags, name, **kwargs): # TODO Remove as, no clients??
114 """Configure the track particle merger tool"""
115 acc = ComponentAccumulator()
116 ElectronMerger = CompFactory.DerivationFramework.ElectronMergerTool
117 acc.setPrivateTools(ElectronMerger(name, **kwargs))
118 return acc
119
120
121def PhotonVertexSelectionWrapperCfg(
122 flags, name="PhotonVertexSelectionWrapper", **kwargs):
123 acc = ComponentAccumulator()
124 prefix = kwargs.pop("DecorationPrefix", "")
125 if prefix: prefix += "_"
126 kwargs.setdefault("pt", prefix + "pt")
127 kwargs.setdefault("eta", prefix + "eta")
128 kwargs.setdefault("phi", prefix + "phi")
129 kwargs.setdefault("sumPt", prefix + "sumPt")
130 kwargs.setdefault("sumPt2", prefix + "sumPt2")
131
132 if "PhotonPointingTool" not in kwargs:
133 from PhotonVertexSelection.PhotonVertexSelectionConfig import (
134 PhotonPointingToolCfg)
135 kwargs.setdefault("PhotonPointingTool", acc.popToolsAndMerge(
136 PhotonPointingToolCfg(flags)))
137
138 acc.setPrivateTools(
139 CompFactory.DerivationFramework.PhotonVertexSelectionWrapper(
140 name, **kwargs))
141 return acc
142
143
144def PhotonVertexSelectionWrapperKernelCfg(
145 flags, name="PhotonVertexSelectionWrapperKernel", **kwargs):
146 acc = ComponentAccumulator()
147
148 augmentationTools = [
149 acc.addPublicTool(acc.popToolsAndMerge(PhotonVertexSelectionWrapperCfg(flags)))
150 ]
151 kwargs.setdefault("AugmentationTools", augmentationTools)
152
153 acc.addEventAlgo(
154 CompFactory.DerivationFramework.DerivationKernel(name, **kwargs))
155 return acc
156
157
158def EGammaCookieCutClusterToolCfg(flags, name = 'EGCookieCutTool', **kwargs):
159 acc = ComponentAccumulator()
160 # needed for reading cells, do not rely on other config to do that
161 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
162 acc.merge(LArGMCfg(flags))
163 from TileGeoModel.TileGMConfig import TileGMCfg
164 acc.merge(TileGMCfg(flags))
165
166 clusterKey = kwargs.setdefault("ClusterContainerName", "ForwardElectronCookieCutClusters")
167 kwargs.setdefault("ClusterContainerLinksName", clusterKey + "_links")
168 #These two properties need to be in sync
169 if kwargs["ClusterContainerLinksName"] != (clusterKey + "_links"):
170 raise AttributeError("ClusterContainerLinksName ({}) is not syncrhonised with ClusterContainerName ({})".format(kwargs["ClusterContainerLinksName"], clusterKey))
171 kwargs.setdefault('StoreCookedMoments', False)
172 kwargs.setdefault('StoreInputMoments', False)
173 kwargs.setdefault("SGKey_electrons", flags.Egamma.Keys.Output.ForwardElectrons)
174 momentNames = [
175 "CENTER_X", "CENTER_Y", "CENTER_Z",
176 "SECOND_LAMBDA", "LATERAL", "LONGITUDINAL", "ENG_FRAC_MAX",
177 "SECOND_R", "CENTER_LAMBDA", "SECOND_ENG_DENS", "SIGNIFICANCE" ]
178 import ROOT
179 moments = [
180 ROOT.xAOD.CaloCluster.CENTER_X, ROOT.xAOD.CaloCluster.CENTER_Y, ROOT.xAOD.CaloCluster.CENTER_Z,
181 ROOT.xAOD.CaloCluster.SECOND_LAMBDA, ROOT.xAOD.CaloCluster.LATERAL, ROOT.xAOD.CaloCluster.LONGITUDINAL, ROOT.xAOD.CaloCluster.ENG_FRAC_MAX,
182 ROOT.xAOD.CaloCluster.SECOND_R, ROOT.xAOD.CaloCluster.CENTER_LAMBDA, ROOT.xAOD.CaloCluster.SECOND_ENG_DENS, ROOT.xAOD.CaloCluster.SIGNIFICANCE ]
183 kwargs.setdefault("MomentNames", momentNames)
184 kwargs.setdefault("Moments", moments)
185 cookedMoments = [ "cookiecut" + moment for moment in momentNames] if kwargs['StoreCookedMoments'] else []
186 originalMoments = [ "original" + moment for moment in momentNames] if kwargs['StoreInputMoments'] else []
187 electronDecorations = [i for sublist in zip(cookedMoments, originalMoments) for i in sublist]
188 electronDecorations += ["cookiecutClusterLink"]
189 kwargs.setdefault("SGKey_electrons_decorations", electronDecorations)
190
191 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
192 acc.merge(CaloNoiseCondAlgCfg(flags,"totalNoise"))
193 from CaloRec.CaloTopoClusterConfig import getTopoMoments
194 momentsMaker = acc.popToolsAndMerge(getTopoMoments(flags))
195 kwargs.setdefault("ClusterMomentMaker",[momentsMaker])
196
197 acc.setPrivateTools(
198 CompFactory.DerivationFramework.EGammaCookieCutClusterTool(
199 name, **kwargs))
200 return acc
201
202def EGammaEnergyCalibrationWrapperCfg(
203 flags,
204 name="TransformerEnergyCalibration",
205 **kwargs):
206 acc = ComponentAccumulator()
207
208 from egammaMVACalib.egammaMVACalibConfig import egammaTransformerSvcCfg
209
210 kwargs.setdefault("decoratorTransformerEnergy", "TransformerEnergy")
211 kwargs.setdefault("decoratorTransformerEnergyPhoton", "TransformerEnergy")
212 kwargs.setdefault("TransformerCalibSvc", acc.getPrimaryAndMerge(egammaTransformerSvcCfg(flags)))
213
214 acc.setPrivateTools(CompFactory.DerivationFramework.EGammaEnergyCalibrationWrapper(name, **kwargs))
215
216 return acc
EGSelectionToolWrapperCfg(flags, name, **kwargs)
PhotonsDirectionToolCfg(flags, name, **kwargs)