ATLAS Offline Software
Loading...
Searching...
No Matches
PixelDigitizationConfig.py
Go to the documentation of this file.
1"""Define methods to construct configured Pixel Digitization tools and algorithms
2
3Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
4"""
5from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
6from AthenaConfiguration.ComponentFactory import CompFactory
7from AthenaConfiguration.Enums import LHCPeriod, ProductionStep
8from DigitizationConfig.PileUpMergeSvcConfig import PileUpMergeSvcCfg, PileUpXingFolderCfg
9from DigitizationConfig.PileUpToolsConfig import PileUpToolsCfg
10from DigitizationConfig.TruthDigitizationOutputConfig import TruthDigitizationOutputCfg
11from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
12from PixelConditionsAlgorithms.PixelConditionsConfig import (
13 PixelConfigCondAlgCfg, PixelChargeCalibCondCfg,
14 PixelDistortionAlgCfg, PixelRadSimFluenceMapAlgCfg
15)
16from PixelConditionsTools.PixelConditionsSummaryConfig import PixelConditionsSummaryCfg
17from PixelGeoModel.PixelGeoModelConfig import PixelReadoutGeometryCfg
18from PixelReadoutGeometry.PixelReadoutGeometryConfig import PixelReadoutManagerCfg
19from SiLorentzAngleTool.PixelLorentzAngleConfig import PixelLorentzAngleToolCfg
20from SiPropertiesTool.PixelSiPropertiesConfig import PixelSiPropertiesToolCfg
21from SimulationConfig.SimEnums import PixelRadiationDamageSimulationType
22from AthenaConfiguration.Enums import BeamType
23# The earliest and last bunch crossing times for which interactions will be sent
24# to the Pixel Digitization code
25def Pixel_FirstXing(flags):
26 if flags.Beam.estimatedLuminosity > 0.5e33:
27 return -25
28 else:
29 return -50
30
31
32def Pixel_LastXing(flags):
33 if flags.Beam.estimatedLuminosity > 0.5e33:
34 if flags.Beam.BunchSpacing > 50:
35 return 75
36 else:
37 return 25
38 else:
39 return 100
40
41
42def RadDamageUtilCfg(flags, name="RadDamageUtil", **kwargs):
43 """Return a configured RadDamageUtil"""
44 kwargs.setdefault("defaultRamo", 1)
45 kwargs.setdefault("betaElectrons", 4.5e-16)
46 kwargs.setdefault("betaHoles", 6.0e-16)
47 kwargs.setdefault("saveDebugMaps", False)
48 kwargs.setdefault("fieldScale", flags.BField.configuredSolenoidFieldScale) # to handle custom B field where nominal hardcoded
49 RadDamageUtil = CompFactory.RadDamageUtil
50 return RadDamageUtil(name, **kwargs)
51
52
53def EfieldInterpolatorCfg(flags, name="EfieldInterpolator", **kwargs):
54 """Return a configured EfieldInterpolator"""
55 kwargs.setdefault("initialized", False)
56 kwargs.setdefault("useSpline", True)
57 kwargs.setdefault("sensorDepth", 200)
58 EfieldInterpolator = CompFactory.EfieldInterpolator
59 return EfieldInterpolator(name, **kwargs)
60
61
62def EnergyDepositionToolCfg(flags, name="EnergyDepositionTool", **kwargs):
63 """Return a configured EnergyDepositionTool"""
64 acc = PixelDistortionAlgCfg(flags)
65 kwargs.setdefault("DeltaRayCut", 80.7687)
66 kwargs.setdefault("nCols", 5)
67 kwargs.setdefault("LoopLimit", 100000)
68 kwargs.setdefault("doBichsel", True)
69 kwargs.setdefault("doBichselBetaGammaCut", 0.7) # dEdx not quite consistent below this
70 kwargs.setdefault("doDeltaRay", False) # needs validation
71 kwargs.setdefault("doPU", False)
72 EnergyDepositionTool = CompFactory.EnergyDepositionTool
73 acc.setPrivateTools(EnergyDepositionTool(name, **kwargs))
74 return acc
75
76
77def SensorSimPlanarToolCfg(flags, name="SensorSimPlanarTool", **kwargs):
78 """Return ComponentAccumulator with configured SensorSimPlanarTool"""
79 acc = PixelConfigCondAlgCfg(flags)
80 kwargs.setdefault("SiPropertiesTool", acc.popToolsAndMerge(PixelSiPropertiesToolCfg(flags)))
81 kwargs.setdefault("LorentzAngleTool", acc.popToolsAndMerge(PixelLorentzAngleToolCfg(flags)))
82 SensorSimPlanarTool = CompFactory.SensorSimPlanarTool
83 kwargs.setdefault("RadiationDamageSimulationType", flags.Digitization.PixelPlanarRadiationDamageSimulationType.value)
84 if flags.Digitization.PixelPlanarRadiationDamageSimulationType is not PixelRadiationDamageSimulationType.NoRadiationDamage:
85 acc.merge(PixelRadSimFluenceMapAlgCfg(flags))
86 acc.setPrivateTools(SensorSimPlanarTool(name, **kwargs))
87 return acc
88
89
90def SensorSim3DToolCfg(flags, name="SensorSim3DTool", **kwargs):
91 """Return ComponentAccumulator with configured SensorSim3DTool"""
92 acc = PixelConfigCondAlgCfg(flags)
93 kwargs.setdefault("SiPropertiesTool", acc.popToolsAndMerge(PixelSiPropertiesToolCfg(flags)))
94 SensorSim3DTool = CompFactory.SensorSim3DTool
95 kwargs.setdefault("RadiationDamageSimulationType", flags.Digitization.Pixel3DRadiationDamageSimulationType.value)
96 if flags.Digitization.Pixel3DRadiationDamageSimulationType is not PixelRadiationDamageSimulationType.NoRadiationDamage:
97 acc.merge(PixelRadSimFluenceMapAlgCfg(flags))
98 acc.setPrivateTools(SensorSim3DTool(name, **kwargs))
99 return acc
100
101
102def BarrelFEI4SimToolCfg(flags, name="BarrelFEI4SimTool", **kwargs):
103 """Return a FEI4SimTool configured for Barrel"""
104 acc = PixelReadoutManagerCfg(flags)
105 acc.merge(PixelConfigCondAlgCfg(flags))
106 acc.merge(PixelChargeCalibCondCfg(flags))
107 kwargs.setdefault("BarrelEC", 0)
108 kwargs.setdefault("DoNoise", flags.Digitization.DoInnerDetectorNoise)
109 kwargs.setdefault("Cosmics", flags.Beam.Type is BeamType.Cosmics)
110 kwargs.setdefault("PixelReadoutManager", acc.getPrimary())
111 kwargs.setdefault("PixelConditionsSummaryTool", acc.popToolsAndMerge(PixelConditionsSummaryCfg(flags)))
112 FEI4SimTool = CompFactory.FEI4SimTool
113 acc.setPrivateTools(FEI4SimTool(name, **kwargs))
114 return acc
115
116
117def DBMFEI4SimToolCfg(flags, name="DBMFEI4SimTool", **kwargs):
118 """Return a FEI4SimTool configured for Endcap"""
119 acc = PixelReadoutManagerCfg(flags)
120 acc.merge(PixelConfigCondAlgCfg(flags))
121 acc.merge(PixelChargeCalibCondCfg(flags))
122 kwargs.setdefault("BarrelEC", 4)
123 kwargs.setdefault("DoNoise", flags.Digitization.DoInnerDetectorNoise)
124 kwargs.setdefault("Cosmics", flags.Beam.Type is BeamType.Cosmics)
125 kwargs.setdefault("PixelReadoutManager", acc.getPrimary())
126 kwargs.setdefault("PixelConditionsSummaryTool", acc.popToolsAndMerge(PixelConditionsSummaryCfg(flags)))
127 FEI4SimTool = CompFactory.FEI4SimTool
128 acc.setPrivateTools(FEI4SimTool(name, **kwargs))
129 return acc
130
131
132def BarrelFEI3SimToolCfg(flags, name="BarrelFEI3SimTool", **kwargs):
133 """Return a FEI3SimTool configured for Barrel"""
134 acc = PixelReadoutManagerCfg(flags)
135 acc.merge(PixelConfigCondAlgCfg(flags))
136 acc.merge(PixelChargeCalibCondCfg(flags))
137 kwargs.setdefault("BarrelEC", 0)
138 kwargs.setdefault("PixelReadoutManager", acc.getPrimary())
139 kwargs.setdefault("Cosmics", flags.Beam.Type is BeamType.Cosmics)
140 kwargs.setdefault("PixelConditionsSummaryTool", acc.popToolsAndMerge(PixelConditionsSummaryCfg(flags)))
141 kwargs.setdefault("HitDuplication", (flags.GeoModel.Run is LHCPeriod.Run1))
142 FEI3SimTool = CompFactory.FEI3SimTool
143 acc.setPrivateTools(FEI3SimTool(name, **kwargs))
144 return acc
145
146
147def EndcapFEI3SimToolCfg(flags, name="EndcapFEI3SimTool", **kwargs):
148 """Return a FEI3SimTool configured for Endcap"""
149 acc = PixelReadoutManagerCfg(flags)
150 acc.merge(PixelConfigCondAlgCfg(flags))
151 acc.merge(PixelChargeCalibCondCfg(flags))
152 kwargs.setdefault("BarrelEC", 2)
153 kwargs.setdefault("PixelReadoutManager", acc.getPrimary())
154 kwargs.setdefault("Cosmics", flags.Beam.Type is BeamType.Cosmics)
155 kwargs.setdefault("PixelConditionsSummaryTool", acc.popToolsAndMerge(PixelConditionsSummaryCfg(flags)))
156 kwargs.setdefault("HitDuplication", (flags.GeoModel.Run is LHCPeriod.Run1))
157 FEI3SimTool = CompFactory.FEI3SimTool
158 acc.setPrivateTools(FEI3SimTool(name, **kwargs))
159 return acc
160
161
162def PixelDigitizationBasicToolCfg(flags, name="PixelDigitizationBasicTool", **kwargs):
163 """Return ComponentAccumulator with configured PixelDigitizationTool"""
164 acc = PixelReadoutGeometryCfg(flags)
165 # set up tool handle lists
166 chargeTools = []
167 feSimTools = []
168 chargeTools.append(acc.popToolsAndMerge(SensorSimPlanarToolCfg(flags)))
169 chargeTools.append(acc.popToolsAndMerge(SensorSim3DToolCfg(flags)))
170 feSimTools.append(acc.popToolsAndMerge(BarrelFEI4SimToolCfg(flags)))
171 feSimTools.append(acc.popToolsAndMerge(DBMFEI4SimToolCfg(flags)))
172 feSimTools.append(acc.popToolsAndMerge(BarrelFEI3SimToolCfg(flags)))
173 feSimTools.append(acc.popToolsAndMerge(EndcapFEI3SimToolCfg(flags)))
174 kwargs.setdefault("InputObjectName", "PixelHits")
175 kwargs.setdefault("ChargeTools", chargeTools)
176 kwargs.setdefault("FrontEndSimTools", feSimTools)
177 kwargs.setdefault("EnergyDepositionTool", acc.popToolsAndMerge(EnergyDepositionToolCfg(flags)))
178 if flags.Digitization.DoXingByXingPileUp:
179 kwargs.setdefault("FirstXing", Pixel_FirstXing(flags))
180 kwargs.setdefault("LastXing", Pixel_LastXing(flags))
181 from RngComps.RngCompsConfig import AthRNGSvcCfg
182 kwargs.setdefault("RndmSvc", acc.getPrimaryAndMerge(AthRNGSvcCfg(flags)))
183
184 PixelDigitizationTool = CompFactory.PixelDigitizationTool
185 acc.setPrivateTools(PixelDigitizationTool(name, **kwargs))
186 return acc
187
188
189def PixelDigitizationToolCfg(flags, name="PixelDigitizationTool", **kwargs):
190 """Return ComponentAccumulator with configured BasicPixelDigitizationTool"""
191 acc = ComponentAccumulator()
192 if flags.Digitization.PileUp:
193 intervals = []
194 if not flags.Digitization.DoXingByXingPileUp:
195 intervals += [acc.popToolsAndMerge(PixelRangeCfg(flags))]
196 kwargs.setdefault("PileUpMergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=intervals)))
197 else:
198 kwargs.setdefault("PileUpMergeSvc", '')
199 kwargs.setdefault("OnlyUseContainerName", flags.Digitization.PileUp)
200 kwargs.setdefault("HardScatterSplittingMode", 0)
201 if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
202 kwargs.setdefault("RDOCollName", flags.Overlay.BkgPrefix + "PixelRDOs")
203 kwargs.setdefault("SDOCollName", flags.Overlay.BkgPrefix + "PixelSDO_Map")
204 else:
205 kwargs.setdefault("RDOCollName", "PixelRDOs")
206 kwargs.setdefault("SDOCollName", "PixelSDO_Map")
207 tool = acc.popToolsAndMerge(PixelDigitizationBasicToolCfg(flags, name, **kwargs))
208 acc.setPrivateTools(tool)
209 return acc
210
211
212def PixelGeantinoTruthDigitizationToolCfg(flags, name="PixelGeantinoTruthDigitizationTool", **kwargs):
213 """Return configured PixelDigitizationTool"""
214 acc = ComponentAccumulator()
215 if flags.Digitization.PileUp:
216 intervals = []
217 if not flags.Digitization.DoXingByXingPileUp:
218 intervals += [acc.popToolsAndMerge(PixelRangeCfg(flags))]
219 kwargs.setdefault("PileUpMergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=intervals)))
220 else:
221 kwargs.setdefault("PileUpMergeSvc", '')
222 kwargs.setdefault("OnlyUseContainerName", flags.Digitization.PileUp)
223 kwargs.setdefault("VetoPileUpTruthLinks", False)
224 from RngComps.RngCompsConfig import AthRNGSvcCfg
225 kwargs.setdefault("RndmSvc", acc.getPrimaryAndMerge(AthRNGSvcCfg(flags)))
226 PixelDigitizationTool = CompFactory.PixelDigitizationTool
227 acc.setPrivateTools(PixelDigitizationTool(name, **kwargs))
228 return acc
229
230
231def PixelDigitizationHSToolCfg(flags, name="PixelDigitizationHSTool", **kwargs):
232 """Return ComponentAccumulator with PixelDigitizationTool configured for Hard Scatter"""
233 acc = ComponentAccumulator()
234 rangetool = acc.popToolsAndMerge(PixelRangeCfg(flags))
235 kwargs.setdefault("PileUpMergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=rangetool)))
236 kwargs.setdefault("HardScatterSplittingMode", 1)
237 tool = acc.popToolsAndMerge(PixelDigitizationBasicToolCfg(flags, name, **kwargs))
238 acc.setPrivateTools(tool)
239 return acc
240
241
242def PixelDigitizationPUToolCfg(flags, name="PixelDigitizationPUTool", **kwargs):
243 """Return ComponentAccumulator with PixelDigitizationTool configured for PileUp"""
244 acc = ComponentAccumulator()
245 rangetool = acc.popToolsAndMerge(PixelRangeCfg(flags))
246 kwargs.setdefault("PileUpMergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=rangetool)))
247 kwargs.setdefault("HardScatterSplittingMode", 2)
248 kwargs.setdefault("RDOCollName", "Pixel_PU_RDOs")
249 kwargs.setdefault("SDOCollName", "Pixel_PU_SDO_Map")
250 tool = acc.popToolsAndMerge(PixelDigitizationBasicToolCfg(flags, name, **kwargs))
251 acc.setPrivateTools(tool)
252 return acc
253
254
255def PixelDigitizationSplitNoMergePUToolCfg(flags, name="PixelDigitizationSplitNoMergePUTool", **kwargs):
256 """Return ComponentAccumulator with PixelDigitizationTool configured for PileUpPixelHits"""
257 acc = ComponentAccumulator()
258 rangetool = acc.popToolsAndMerge(PixelRangeCfg(flags))
259 kwargs.setdefault("PileUpMergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=rangetool)))
260 kwargs.setdefault("HardScatterSplittingMode", 0)
261 kwargs.setdefault("InputObjectName", "PileupPixelHits")
262 kwargs.setdefault("RDOCollName", "Pixel_PU_RDOs")
263 kwargs.setdefault("SDOCollName", "Pixel_PU_SDO_Map")
264 tool = acc.popToolsAndMerge(PixelDigitizationBasicToolCfg(flags, name, **kwargs))
265 acc.setPrivateTools(tool)
266 return acc
267
268
269def PixelOverlayDigitizationToolCfg(flags, name="PixelOverlayDigitizationTool", **kwargs):
270 """Return ComponentAccumulator with PixelDigitizationTool configured for overlay"""
271 kwargs.setdefault("OnlyUseContainerName", False)
272 kwargs.setdefault("RDOCollName", flags.Overlay.SigPrefix + "PixelRDOs")
273 kwargs.setdefault("SDOCollName", flags.Overlay.SigPrefix + "PixelSDO_Map")
274 kwargs.setdefault("HardScatterSplittingMode", 0)
275 kwargs.setdefault("PileUpMergeSvc", '')
276 return PixelDigitizationBasicToolCfg(flags, name, **kwargs)
277
278
279def PixelRangeCfg(flags, name="PixelRange", **kwargs):
280 """Return a configured PileUpXingFolder tool"""
281 kwargs.setdefault("FirstXing", Pixel_FirstXing(flags))
282 kwargs.setdefault("LastXing", Pixel_LastXing(flags))
283 kwargs.setdefault("CacheRefreshFrequency", 1.0) # default 0 no dataproxy reset
284 kwargs.setdefault("ItemList", ["SiHitCollection#PixelHits"])
285 return PileUpXingFolderCfg(flags, name, **kwargs)
286
287
288def PixelOutputCfg(flags):
289 """Return ComponentAccumulator with Output for Pixel. Not standalone."""
290 acc = ComponentAccumulator()
291 if flags.Output.doWriteRDO:
292 ItemList = ["PixelRDO_Container#*"]
293 if flags.Digitization.EnableTruth:
294 ItemList += ["InDetSimDataCollection#*"]
295 acc.merge(TruthDigitizationOutputCfg(flags))
296 if flags.InDet.savePixelSiHits:
297 ItemList += ["SiHitCollection#PixelHits"]
298 acc.merge(OutputStreamCfg(flags, "RDO", ItemList))
299 return acc
300
301
302def PixelDigitizationBasicCfg(flags, **kwargs):
303 """Return ComponentAccumulator for Pixel digitization"""
304 acc = ComponentAccumulator()
305 if "PileUpTools" not in kwargs:
306 PileUpTools = acc.popToolsAndMerge(PixelDigitizationToolCfg(flags))
307 kwargs["PileUpTools"] = PileUpTools
308 acc.merge(PileUpToolsCfg(flags, **kwargs))
309 return acc
310
311
312def PixelOverlayDigitizationBasicCfg(flags, **kwargs):
313 """Return ComponentAccumulator with Pixel Overlay digitization"""
314 acc = ComponentAccumulator()
315 if flags.Common.ProductionStep != ProductionStep.FastChain:
316 from SGComps.SGInputLoaderConfig import SGInputLoaderCfg
317 acc.merge(SGInputLoaderCfg(flags, ["SiHitCollection#PixelHits"]))
318
319 if "DigitizationTool" not in kwargs:
320 tool = acc.popToolsAndMerge(PixelOverlayDigitizationToolCfg(flags))
321 kwargs["DigitizationTool"] = tool
322
323 if flags.Concurrency.NumThreads > 0:
324 kwargs.setdefault("Cardinality", flags.Concurrency.NumThreads)
325
326 # Set common overlay extra inputs
327 kwargs.setdefault("ExtraInputs", flags.Overlay.ExtraInputs)
328 PixelDigitization = CompFactory.PixelDigitization
329 acc.addEventAlgo(PixelDigitization(name="PixelOverlayDigitization", **kwargs))
330 return acc
331
332
333# with output defaults
334def PixelDigitizationCfg(flags, **kwargs):
335 """Return ComponentAccumulator for Pixel digitization and Output"""
336 acc = PixelDigitizationBasicCfg(flags, **kwargs)
337 acc.merge(PixelOutputCfg(flags))
338 return acc
339
340
341# additional specialisations
342def PixelDigitizationHSCfg(flags, **kwargs):
343 """Return ComponentAccumulator for Hard-Scatter-only Pixel digitization and Output"""
344 acc = ComponentAccumulator()
345 tool = acc.popToolsAndMerge(PixelDigitizationHSToolCfg(flags))
346 kwargs["PileUpTools"] = tool
347 acc.merge(PileUpToolsCfg(flags, **kwargs))
348 acc.merge(PixelOutputCfg(flags))
349 return acc
350
351
352def PixelDigitizationPUCfg(flags, **kwargs):
353 """Return ComponentAccumulator with Pile-up-only Pixel digitization and Output"""
354 acc = ComponentAccumulator()
355 tool = acc.popToolsAndMerge(PixelDigitizationPUToolCfg(flags))
356 kwargs["PileUpTools"] = tool
357 acc.merge(PileUpToolsCfg(flags, **kwargs))
358 acc.merge(PixelOutputCfg(flags))
359 return acc
RadDamageUtilCfg(flags, name="RadDamageUtil", **kwargs)
EfieldInterpolatorCfg(flags, name="EfieldInterpolator", **kwargs)