ATLAS Offline Software
Loading...
Searching...
No Matches
PLR_DigitizationConfig.py
Go to the documentation of this file.
1"""Define methods to construct configured PLR Digitization tools and algorithms
2
3Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
4"""
5from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
6from AthenaConfiguration.ComponentFactory import CompFactory
7from AthenaConfiguration.Enums import ProductionStep
8from DigitizationConfig.PileUpMergeSvcConfig import PileUpMergeSvcCfg, PileUpXingFolderCfg
9from DigitizationConfig.PileUpToolsConfig import PileUpToolsCfg
10from DigitizationConfig.TruthDigitizationOutputConfig import TruthDigitizationOutputCfg
11from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
12
13from PixelConditionsAlgorithms.PLR_ConditionsConfig import (
14 PLR_ConfigCondAlgCfg, PLR_ChargeCalibCondAlgCfg,
15 PLR_DistortionAlgCfg
16)
17from PixelConditionsTools.PLR_ConditionsSummaryConfig import PLR_ConditionsSummaryCfg
18from PLRGeoModelXml.PLR_GeoModelConfig import PLR_ReadoutGeometryCfg
19from PixelReadoutGeometry.PixelReadoutGeometryConfig import PLR_ReadoutManagerCfg
20from SiLorentzAngleTool.PLR_LorentzAngleConfig import PLR_LorentzAngleToolCfg
21from SiPropertiesTool.PLR_SiPropertiesConfig import PLR_SiPropertiesToolCfg
22from SimulationConfig.SimEnums import PixelRadiationDamageSimulationType
23
24
25# The earliest and last bunch crossing times for which interactions will be sent
26# to the PLR Digitization code
27def PLR_FirstXing(flags):
28 return -25
29
30
31def PLR_LastXing(flags):
32 if flags.Beam.BunchSpacing > 50:
33 return 75
34 else:
35 return 25
36
37
38def PLR_EnergyDepositionToolCfg(flags, name="PLR_EnergyDepositionTool", **kwargs):
39 """Return a configured EnergyDepositionTool"""
40 acc = PLR_DistortionAlgCfg(flags)
41 kwargs.setdefault("DeltaRayCut", 117.)
42 kwargs.setdefault("nCols", 5)
43 kwargs.setdefault("LoopLimit", 100000)
44 kwargs.setdefault("doBichsel", True)
45 kwargs.setdefault("doBichselBetaGammaCut", 0.7) # dEdx not quite consistent below this
46 kwargs.setdefault("doDeltaRay", False) # needs validation
47 kwargs.setdefault("doPU", True)
48 kwargs.setdefault("PixelDistortionData", "PLR_DistortionData")
49 acc.setPrivateTools(CompFactory.EnergyDepositionTool(name, **kwargs))
50 return acc
51
52
53def PLR_RD53SimToolCfg(flags, name="PLR_RD53SimTool", **kwargs):
54 """Return a RD53SimTool configured for PLR"""
55 acc = PLR_ReadoutManagerCfg(flags)
56 acc.merge(PLR_ConfigCondAlgCfg(flags))
57 acc.merge(PLR_ChargeCalibCondAlgCfg(flags))
58 kwargs.setdefault("BarrelEC", 4)
59 kwargs.setdefault("DoNoise", flags.Digitization.DoInnerDetectorNoise)
60 kwargs.setdefault("PixelReadoutManager", acc.getPrimary())
61 kwargs.setdefault("PixelChargeCalibCondData", "PLR_ChargeCalibCondData")
62 kwargs.setdefault("PixelConditionsSummaryTool", acc.popToolsAndMerge(PLR_ConditionsSummaryCfg(flags)))
63 kwargs.setdefault("DoTimeWalk", False)
64 acc.setPrivateTools(CompFactory.RD53SimTool(name, **kwargs))
65 return acc
66
67
68def PLR_SensorSimPlanarToolCfg(flags, name="PLR_SensorSimPlanarTool", **kwargs):
69 """Return ComponentAccumulator with configured SensorSimPlanarTool for PLR"""
70 acc = PLR_ConfigCondAlgCfg(flags)
71 kwargs.setdefault("SiPropertiesTool", acc.popToolsAndMerge(PLR_SiPropertiesToolCfg(flags)))
72 kwargs.setdefault("LorentzAngleTool", acc.popToolsAndMerge(PLR_LorentzAngleToolCfg(flags)))
73 kwargs.setdefault("PixelModuleData", "PLR_ModuleData")
74 kwargs.setdefault("RadiationDamageSimulationType", flags.Digitization.PixelPlanarRadiationDamageSimulationType.value)
75 kwargs.setdefault("DigitizeITk3Das3D", False)
76 if flags.Digitization.PixelPlanarRadiationDamageSimulationType is not PixelRadiationDamageSimulationType.NoRadiationDamage:
77 # acc.merge(PLR_RadSimFluenceMapAlgCfg(flags)) # TODO: not supported yet
78 pass
79 acc.setPrivateTools(CompFactory.SensorSimPlanarTool(name, **kwargs))
80 return acc
81
82
83def PLR_SensorSim3DToolCfg(flags, name="PLR_SensorSim3DTool", **kwargs):
84 """Return ComponentAccumulator with configured SensorSim3DTool for PLR"""
85 acc = PLR_ConfigCondAlgCfg(flags)
86 kwargs.setdefault("SiPropertiesTool", acc.popToolsAndMerge(PLR_SiPropertiesToolCfg(flags)))
87 kwargs.setdefault("PixelModuleData", "PLR_ModuleData")
88 kwargs.setdefault("RadiationDamageSimulationType", flags.Digitization.Pixel3DRadiationDamageSimulationType.value)
89 kwargs.setdefault("DigitizeITk3Das3D", False)
90 if flags.Digitization.Pixel3DRadiationDamageSimulationType is not PixelRadiationDamageSimulationType.NoRadiationDamage:
91 # acc.merge(PLR_RadSimFluenceMapAlgCfg(flags)) # TODO: not supported yet
92 pass
93 acc.setPrivateTools(CompFactory.SensorSim3DTool(name, **kwargs))
94 return acc
95
96
97def PLR_DigitizationBasicToolCfg(flags, name="PLR_DigitizationBasicTool", **kwargs):
98 """Return ComponentAccumulator with configured PixelDigitizationTool for PLR"""
99 acc = PLR_ReadoutGeometryCfg(flags)
100 # set up tool handle lists
101 chargeTools = []
102 feSimTools = []
103 chargeTools.append(acc.popToolsAndMerge(PLR_SensorSimPlanarToolCfg(flags)))
104 # chargeTools.append(acc.popToolsAndMerge(PLR_SensorSim3DToolCfg(flags)))
105 feSimTools.append(acc.popToolsAndMerge(PLR_RD53SimToolCfg(flags)))
106 kwargs.setdefault("PixelIDName", "PLR_ID")
107 kwargs.setdefault("ChargeTools", chargeTools)
108 kwargs.setdefault("EnergyDepositionTool", acc.popToolsAndMerge(PLR_EnergyDepositionToolCfg(flags)))
109 kwargs.setdefault("FrontEndSimTools", feSimTools)
110 kwargs.setdefault("InputObjectName", "PLR_Hits")
111 kwargs.setdefault("PixelDetEleCollKey", "PLR_DetectorElementCollection")
112 if flags.Digitization.DoXingByXingPileUp:
113 kwargs.setdefault("FirstXing", PLR_FirstXing(flags))
114 kwargs.setdefault("LastXing", PLR_LastXing(flags))
115 from RngComps.RngCompsConfig import AthRNGSvcCfg
116 kwargs.setdefault("RndmSvc", acc.getPrimaryAndMerge(AthRNGSvcCfg(flags)))
117
118 acc.setPrivateTools(CompFactory.PixelDigitizationTool(name, **kwargs, ))
119 return acc
120
121
122def PLR_DigitizationToolCfg(flags, name="PLR_DigitizationTool", **kwargs):
123 """Return ComponentAccumulator with configured PLR_DigitizationBasicTool"""
124 acc = ComponentAccumulator()
125 if flags.Digitization.PileUp:
126 intervals = []
127 if not flags.Digitization.DoXingByXingPileUp:
128 intervals += [acc.popToolsAndMerge(PLR_RangeCfg(flags))]
129 kwargs.setdefault("PileUpMergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=intervals)))
130 else:
131 kwargs.setdefault("PileUpMergeSvc", "")
132 kwargs.setdefault("OnlyUseContainerName", flags.Digitization.PileUp)
133 kwargs.setdefault("HardScatterSplittingMode", 0)
134 if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
135 kwargs.setdefault("RDOCollName", flags.Overlay.BkgPrefix + "PLR_RDOs")
136 kwargs.setdefault("SDOCollName", flags.Overlay.BkgPrefix + "PLR_SDO_Map")
137 else:
138 kwargs.setdefault("RDOCollName", "PLR_RDOs")
139 kwargs.setdefault("SDOCollName", "PLR_SDO_Map")
140 tool = acc.popToolsAndMerge(PLR_DigitizationBasicToolCfg(flags, name, **kwargs))
141 acc.setPrivateTools(tool)
142 return acc
143
144
145def PLR_DigitizationHSToolCfg(flags, name="PLR_DigitizationHSTool", **kwargs):
146 """Return ComponentAccumulator with PixelDigitizationTool configured for Hard Scatter"""
147 acc = ComponentAccumulator()
148 rangetool = acc.popToolsAndMerge(PLR_RangeCfg(flags))
149 acc.merge(PileUpMergeSvcCfg(flags, Intervals=rangetool))
150 kwargs.setdefault("HardScatterSplittingMode", 1)
151 tool = acc.popToolsAndMerge(PLR_DigitizationBasicToolCfg(flags, name, **kwargs))
152 acc.setPrivateTools(tool)
153 return acc
154
155
156def PLR_DigitizationPUToolCfg(flags, name="PLR_DigitizationPUTool", **kwargs):
157 """Return ComponentAccumulator with PixelDigitizationTool configured for PileUp"""
158 acc = ComponentAccumulator()
159 rangetool = acc.popToolsAndMerge(PLR_RangeCfg(flags))
160 acc.merge(PileUpMergeSvcCfg(flags, Intervals=rangetool))
161 kwargs.setdefault("HardScatterSplittingMode", 2)
162 kwargs.setdefault("RDOCollName", "PLR_PU_RDOs")
163 kwargs.setdefault("SDOCollName", "PLR_PU_SDO_Map")
164 tool = acc.popToolsAndMerge(PLR_DigitizationBasicToolCfg(flags, name, **kwargs))
165 acc.setPrivateTools(tool)
166 return acc
167
168
169def PLR_DigitizationSplitNoMergePUToolCfg(flags, name="PLR_DigitizationSplitNoMergePUTool", **kwargs):
170 """Return ComponentAccumulator with PixelDigitizationTool configured for PileUpPLR_Hits"""
171 acc = ComponentAccumulator()
172 rangetool = acc.popToolsAndMerge(PLR_RangeCfg(flags))
173 acc.merge(PileUpMergeSvcCfg(flags, Intervals=rangetool))
174 kwargs.setdefault("HardScatterSplittingMode", 0)
175 kwargs.setdefault("InputObjectName", "PileupPLR_Hits")
176 kwargs.setdefault("RDOCollName", "PLR_PU_RDOs")
177 kwargs.setdefault("SDOCollName", "PLR_PU_SDO_Map")
178 tool = acc.popToolsAndMerge(PLR_DigitizationBasicToolCfg(flags, name, **kwargs))
179 acc.setPrivateTools(tool)
180 return acc
181
182
183def PLR_OverlayDigitizationToolCfg(flags, name="PLR_OverlayDigitizationTool", **kwargs):
184 """Return ComponentAccumulator with PixelDigitizationTool configured for overlay"""
185 kwargs.setdefault("OnlyUseContainerName", False)
186 kwargs.setdefault("RDOCollName", flags.Overlay.SigPrefix + "PLR_RDOs")
187 kwargs.setdefault("SDOCollName", flags.Overlay.SigPrefix + "PLR_SDO_Map")
188 kwargs.setdefault("HardScatterSplittingMode", 0)
189 return PLR_DigitizationBasicToolCfg(flags, name, **kwargs)
190
191
192def PLR_RangeCfg(flags, name="PLR_Range", **kwargs):
193 """Return a configured PileUpXingFolder tool"""
194 kwargs.setdefault("FirstXing", PLR_FirstXing(flags))
195 kwargs.setdefault("LastXing", PLR_LastXing(flags))
196 kwargs.setdefault("CacheRefreshFrequency", 1.0) # default 0 no dataproxy reset
197 kwargs.setdefault("ItemList", ["SiHitCollection#PLR_Hits"])
198 return PileUpXingFolderCfg(flags, name, **kwargs)
199
200
201def PLR_OutputCfg(flags):
202 """Return ComponentAccumulator with Output for PLR. Not standalone."""
203 acc = ComponentAccumulator()
204 if flags.Output.doWriteRDO:
205 ItemList = ["PixelRDO_Container#*"]
206 if flags.Digitization.EnableTruth:
207 ItemList += ["InDetSimDataCollection#*"]
208 acc.merge(TruthDigitizationOutputCfg(flags))
209 acc.merge(OutputStreamCfg(flags, "RDO", ItemList))
210 return acc
211
212
213def PLR_DigitizationBasicCfg(flags, **kwargs):
214 """Return ComponentAccumulator for PLR digitization"""
215 acc = ComponentAccumulator()
216 if "PileUpTools" not in kwargs:
217 PileUpTools = acc.popToolsAndMerge(PLR_DigitizationToolCfg(flags))
218 kwargs["PileUpTools"] = PileUpTools
219 acc.merge(PileUpToolsCfg(flags, **kwargs))
220 return acc
221
222
223def PLR_OverlayDigitizationBasicCfg(flags, **kwargs):
224 """Return ComponentAccumulator with PLR Overlay digitization"""
225 acc = ComponentAccumulator()
226 if flags.Common.ProductionStep != ProductionStep.FastChain:
227 from SGComps.SGInputLoaderConfig import SGInputLoaderCfg
228 acc.merge(SGInputLoaderCfg(flags, ["SiHitCollection#PLR_Hits"]))
229
230 if "DigitizationTool" not in kwargs:
231 tool = acc.popToolsAndMerge(PLR_OverlayDigitizationToolCfg(flags))
232 kwargs["DigitizationTool"] = tool
233
234 if flags.Concurrency.NumThreads > 0:
235 kwargs.setdefault("Cardinality", flags.Concurrency.NumThreads)
236
237 # Set common overlay extra inputs
238 kwargs.setdefault("ExtraInputs", flags.Overlay.ExtraInputs)
239 acc.addEventAlgo(CompFactory.PixelDigitization(name="PLR_OverlayDigitization", **kwargs))
240 return acc
241
242
243# with output defaults
244def PLR_DigitizationCfg(flags, **kwargs):
245 """Return ComponentAccumulator for PLR digitization and Output"""
246 acc = PLR_DigitizationBasicCfg(flags, **kwargs)
247 acc.merge(PLR_OutputCfg(flags))
248 return acc
249
250
251# additional specialisations
252def PLR_DigitizationHSCfg(flags, **kwargs):
253 """Return ComponentAccumulator for Hard-Scatter-only PLR digitization and Output"""
254 acc = ComponentAccumulator()
255 tool = acc.popToolsAndMerge(PLR_DigitizationHSToolCfg(flags))
256 kwargs["PileUpTools"] = tool
257 acc.merge(PileUpToolsCfg(flags, **kwargs))
258 acc.merge(PLR_OutputCfg(flags))
259 return acc
260
261
262def PLR_DigitizationPUCfg(flags, **kwargs):
263 """Return ComponentAccumulator with Pile-up-only PLR digitization and Output"""
264 acc = ComponentAccumulator()
265 tool = acc.popToolsAndMerge(PLR_DigitizationPUToolCfg(flags))
266 kwargs["PileUpTools"] = tool
267 acc.merge(PileUpToolsCfg(flags, **kwargs))
268 acc.merge(PLR_OutputCfg(flags))
269 return acc
PLR_EnergyDepositionToolCfg(flags, name="PLR_EnergyDepositionTool", **kwargs)
PLR_RD53SimToolCfg(flags, name="PLR_RD53SimTool", **kwargs)