1"""Define methods to construct configured Pixel Digitization tools and algorithms
3Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
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
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
26 if flags.Beam.estimatedLuminosity > 0.5e33:
33 if flags.Beam.estimatedLuminosity > 0.5e33:
34 if flags.Beam.BunchSpacing > 50:
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)
49 RadDamageUtil = CompFactory.RadDamageUtil
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)
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))
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))
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))
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))
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))
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))
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))
162def PixelDigitizationBasicToolCfg(flags, name="PixelDigitizationBasicTool", **kwargs):
163 """Return ComponentAccumulator with configured PixelDigitizationTool"""
164 acc = PixelReadoutGeometryCfg(flags)
165 # set up tool handle lists
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)))
184 PixelDigitizationTool = CompFactory.PixelDigitizationTool
185 acc.setPrivateTools(PixelDigitizationTool(name, **kwargs))
189def PixelDigitizationToolCfg(flags, name="PixelDigitizationTool", **kwargs):
190 """Return ComponentAccumulator with configured BasicPixelDigitizationTool"""
191 acc = ComponentAccumulator()
192 if flags.Digitization.PileUp:
194 if not flags.Digitization.DoXingByXingPileUp:
195 intervals += [acc.popToolsAndMerge(PixelRangeCfg(flags))]
196 kwargs.setdefault("PileUpMergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=intervals)))
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")
205 kwargs.setdefault("RDOCollName", "PixelRDOs")
206 kwargs.setdefault("SDOCollName", "PixelSDO_Map")
207 tool = acc.popToolsAndMerge(PixelDigitizationBasicToolCfg(flags, name, **kwargs))
208 acc.setPrivateTools(tool)
212def PixelGeantinoTruthDigitizationToolCfg(flags, name="PixelGeantinoTruthDigitizationTool", **kwargs):
213 """Return configured PixelDigitizationTool"""
214 acc = ComponentAccumulator()
215 if flags.Digitization.PileUp:
217 if not flags.Digitization.DoXingByXingPileUp:
218 intervals += [acc.popToolsAndMerge(PixelRangeCfg(flags))]
219 kwargs.setdefault("PileUpMergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=intervals)))
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))
231def PixelDigitizationHSToolCfg(flags, name="PixelDigitizationHSTool", **kwargs):
232 """Return ComponentAccumulator with PixelDigitizationTool configured for Hard Scatte
r"""
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)
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)
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)
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)
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)
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))
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))
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"]))
319 if "DigitizationTool" not in kwargs:
320 tool = acc.popToolsAndMerge(PixelOverlayDigitizationToolCfg(flags))
321 kwargs["DigitizationTool"] = tool
323 if flags.Concurrency.NumThreads > 0:
324 kwargs.setdefault("Cardinality", flags.Concurrency.NumThreads)
326 # Set common overlay extra inputs
327 kwargs.setdefault("ExtraInputs", flags.Overlay.ExtraInputs)
328 PixelDigitization = CompFactory.PixelDigitization
329 acc.addEventAlgo(PixelDigitization(name="PixelOverlayDigitization", **kwargs))
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))
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))
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))
RadDamageUtilCfg(flags, name="RadDamageUtil", **kwargs)
EfieldInterpolatorCfg(flags, name="EfieldInterpolator", **kwargs)