ATLAS Offline Software
Loading...
Searching...
No Matches
StripDigitizationConfig.py
Go to the documentation of this file.
1"""Define methods to construct configured SCT Digitization tools and algorithms
2
3Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
4"""
5from AthenaCommon.Logging import logging
6from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
7from AthenaConfiguration.ComponentFactory import CompFactory
8from AthenaConfiguration.Enums import BeamType, ProductionStep
9from DigitizationConfig.PileUpMergeSvcConfig import PileUpMergeSvcCfg, PileUpXingFolderCfg
10from DigitizationConfig.PileUpToolsConfig import PileUpToolsCfg
11from DigitizationConfig.TruthDigitizationOutputConfig import TruthDigitizationOutputCfg
12from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
13from SCT_ConditionsTools.ITkStripConditionsToolsConfig import ITkStripSiliconConditionsCfg
14#from SCT_ConditionsTools.ITkStripConditionsToolsConfig import ItkStripReadCalibChipDataCfg
15from SiLorentzAngleTool.ITkStripLorentzAngleConfig import ITkStripLorentzAngleToolCfg
16from SiPropertiesTool.ITkStripSiPropertiesConfig import ITkStripSiPropertiesToolCfg
17from StripGeoModelXml.ITkStripGeoModelConfig import ITkStripReadoutGeometryCfg
18
19import AthenaCommon.SystemOfUnits as Units
20
21# The earliest and last bunch crossing times for which interactions will be sent
22# to the SCT Digitization code
24 return -50
25
26
28 return 25
29
30
31def ITkStripDigitizationCommonCfg(flags, name="ITkStripDigitizationToolCommon", **kwargs):
32 """Return ComponentAccumulator with common ITkStrip digitization tool config"""
33 acc = ITkStripReadoutGeometryCfg(flags)
34 if not flags.Digitization.DoInnerDetectorNoise:
35 kwargs.setdefault("OnlyHitElements", True)
36 kwargs.setdefault("InputObjectName", "ITkStripHits")
37 kwargs.setdefault("EnableHits", True)
38 kwargs.setdefault("BarrelOnly", False)
39 # Set FixedTime for cosmics for use in SurfaceChargesGenerator
40 if flags.Beam.Type is BeamType.Cosmics:
41 kwargs.setdefault("CosmicsRun", True)
42 kwargs.setdefault("FixedTime", 10)
43 if flags.Digitization.DoXingByXingPileUp:
44 kwargs.setdefault("FirstXing", ITkStripFirstXing())
45 kwargs.setdefault("LastXing", ITkStripLastXing() )
46
47 ITkStripDigitizationTool = CompFactory.ITk.StripDigitizationTool
48 tool = ITkStripDigitizationTool(name, **kwargs)
49 # attach ToolHandles
50 tool.FrontEnd = acc.popToolsAndMerge(ITkStripFrontEndCfg(flags))
51 tool.SurfaceChargesGenerator = acc.popToolsAndMerge(ITkStripSurfaceChargesGeneratorCfg(flags))
52 tool.RandomDisabledCellGenerator = ITkStripRandomDisabledCellGeneratorCfg(flags)
53 acc.setPrivateTools(tool)
54 return acc
55
56
57def ITkStripDigitizationToolCfg(flags, name="ITkStripDigitizationTool", **kwargs):
58 """Return ComponentAccumulator with configured ITkStrip digitization tool"""
59 acc = ComponentAccumulator()
60 if flags.Digitization.PileUp:
61 intervals = []
62 if not flags.Digitization.DoXingByXingPileUp:
63 intervals += [acc.popToolsAndMerge(ITkStripRangeCfg(flags))]
64 kwargs.setdefault("MergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=intervals)))
65 else:
66 kwargs.setdefault("MergeSvc", '')
67 kwargs.setdefault("OnlyUseContainerName", flags.Digitization.PileUp)
68 if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
69 kwargs.setdefault("OutputObjectName", flags.Overlay.BkgPrefix + "ITkStripRDOs")
70 kwargs.setdefault("OutputSDOName", flags.Overlay.BkgPrefix + "ITkStripSDO_Map")
71 else:
72 kwargs.setdefault("OutputObjectName", "ITkStripRDOs")
73 kwargs.setdefault("OutputSDOName", "ITkStripSDO_Map")
74 kwargs.setdefault("HardScatterSplittingMode", 0)
75 tool = acc.popToolsAndMerge(ITkStripDigitizationCommonCfg(flags, name, **kwargs))
76 acc.setPrivateTools(tool)
77 return acc
78
79
80def ITkStripDigitizationHSToolCfg(flags, name="ITkStripDigitizationHSTool", **kwargs):
81 """Return ComponentAccumulator with hard scatter configured SCT digitization tool"""
82 acc = ComponentAccumulator()
83 rangetool = acc.popToolsAndMerge(ITkStripRangeCfg(flags))
84 kwargs.setdefault("MergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=rangetool)))
85 kwargs.setdefault("OutputObjectName", "ITkStripRDOs")
86 kwargs.setdefault("OutputSDOName", "ITkStripSDO_Map")
87 kwargs.setdefault("HardScatterSplittingMode", 1)
88 tool = acc.popToolsAndMerge(ITkStripDigitizationCommonCfg(flags, name, **kwargs))
89 acc.setPrivateTools(tool)
90 return acc
91
92
93def ITkStripDigitizationPUToolCfg(flags, name="ITkStripDigitizationPUTool",**kwargs):
94 """Return ComponentAccumulator with pileup configured SCT digitization tool"""
95 acc = ComponentAccumulator()
96 rangetool = acc.popToolsAndMerge(ITkStripRangeCfg(flags))
97 kwargs.setdefault("MergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=rangetool)))
98 kwargs.setdefault("OutputObjectName", "ITkStrip_PU_RDOs")
99 kwargs.setdefault("OutputSDOName", "ITkStrip_PU_SDO_Map")
100 kwargs.setdefault("HardScatterSplittingMode", 2)
101 tool = acc.popToolsAndMerge(ITkStripDigitizationCommonCfg(flags, name, **kwargs))
102 acc.setPrivateTools(tool)
103 return acc
104
105
106def ITkStripOverlayDigitizationToolCfg(flags, name="ITkStripOverlayDigitizationTool",**kwargs):
107 """Return ComponentAccumulator with overlay configured SCT digitization tool"""
108 acc = ComponentAccumulator()
109 kwargs.setdefault("OnlyUseContainerName", False)
110 kwargs.setdefault("OutputObjectName", flags.Overlay.SigPrefix + "ITkStripRDOs")
111 kwargs.setdefault("OutputSDOName", flags.Overlay.SigPrefix + "ITkStripSDO_Map")
112 kwargs.setdefault("HardScatterSplittingMode", 0)
113 tool = acc.popToolsAndMerge(ITkStripDigitizationCommonCfg(flags, name, **kwargs))
114 acc.setPrivateTools(tool)
115 return acc
116
117
118def ITkStripDigitizationToolSplitNoMergePUCfg(flags, name="ITkStripDigitizationToolSplitNoMergePU",**kwargs):
119 """Return ComponentAccumulator with merged pileup configured SCT digitization tool"""
120 acc = ComponentAccumulator()
121 rangetool = acc.popToolsAndMerge(ITkStripRangeCfg(flags))
122 kwargs.setdefault("MergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=rangetool)))
123 kwargs.setdefault("InputObjectName", "PileupITkStripHits")
124 kwargs.setdefault("HardScatterSplittingMode", 0)
125 kwargs.setdefault("OutputObjectName", "ITkStrip_PU_RDOs")
126 kwargs.setdefault("OutputSDOName", "ITkStrip_PU_SDO_Map")
127 kwargs.setdefault("OnlyHitElements", True)
128 kwargs.setdefault("FrontEnd", "PileupITkStripFrontEnd")
129 tool = acc.popToolsAndMerge(ITkStripDigitizationCommonCfg(flags, name, **kwargs))
130 acc.setPrivateTools(tool)
131 return acc
132
133
134def ITkStripDigitizationToolGeantinoTruthCfg(flags, name="ITkStripGeantinoTruthDigitizationTool", **kwargs):
135 """Return Geantino truth configured digitization tool"""
136 kwargs.setdefault("VetoPileUpTruthLinks", False)
137 return ITkStripDigitizationToolCfg(flags, name, **kwargs)
138
139
140def ITkStripRandomDisabledCellGeneratorCfg(flags, name="ITkStripRandomDisabledCellGenerator", **kwargs):
141 """Return configured random cell disabling tool"""
142 kwargs.setdefault("TotalBadChannels", 0.01)
143 ITkStripRandomDisabledCellGenerator = CompFactory.SCT_RandomDisabledCellGenerator
144 return ITkStripRandomDisabledCellGenerator(name, **kwargs)
145
146
147def ITkStripAmpCfg(flags, name="ITkStripAmp", **kwargs):
148 """Return configured amplifier and shaper tool"""
149 acc = ComponentAccumulator()
150 kwargs.setdefault("CrossFactor2sides", 0.1)
151 kwargs.setdefault("CrossFactorBack", 0.07)
152 kwargs.setdefault("PeakTime", 21)
153 kwargs.setdefault("deltaT", 1.0)
154 kwargs.setdefault("Tmin", -25.0)
155 kwargs.setdefault("Tmax", 150.0)
156 acc.setPrivateTools(CompFactory.SCT_Amp(name, **kwargs))
157 return acc
158
159
160def ITkStripSurfaceChargesGeneratorCfg(flags, name="ITkStripSurfaceChargesGenerator", **kwargs):
161 """Return ComponentAccumulator with configured surface charges tool"""
162 acc = ComponentAccumulator()
163 kwargs.setdefault("FixedTime", -999)
164 kwargs.setdefault("SubtractTime", -999)
165 kwargs.setdefault("SurfaceDriftTime", 10*Units.ns)
166 kwargs.setdefault("NumberOfCharges", 1)
167 kwargs.setdefault("SmallStepLength", 5*Units.micrometer)
168 kwargs.setdefault("DepletionVoltage", 70)
169 kwargs.setdefault("BiasVoltage", 150)
170 kwargs.setdefault("isOverlay", flags.Common.isOverlay)
171 # kwargs.setdefault("doTrapping", True) # ATL-INDET-INT-2016-019
172 # experimental ITkStripDetailedSurfaceChargesGenerator config dropped here
173 tool = CompFactory.ITk.StripSurfaceChargesGenerator(name, **kwargs)
174 tool.RadDamageSummaryTool = CompFactory.SCT_RadDamageSummaryTool(name="ITkStripRadDamageSummaryTool")
175 tool.SiConditionsTool = acc.popToolsAndMerge(ITkStripSiliconConditionsCfg(flags))
176 tool.SiPropertiesTool = acc.popToolsAndMerge(ITkStripSiPropertiesToolCfg(flags, SiConditionsTool=tool.SiConditionsTool))
177 tool.LorentzAngleTool = acc.popToolsAndMerge(ITkStripLorentzAngleToolCfg(flags))
178 acc.setPrivateTools(tool)
179 return acc
180
181
182def ITkStripFrontEndCfg(flags, name="ITkStripFrontEnd", **kwargs):
183 """Return ComponentAccumulator with configured front-end electronics tool"""
184 # Setup noise treament in ITkStripFrontEnd
185 # To set the mean noise values for the different module types
186 # These are SCT values, kept for reference
187 #kwargs.setdefault("NoiseBarrel", 1500.0)
188 #kwargs.setdefault("NoiseBarrel3", 1541.0)
189 #kwargs.setdefault("NoiseInners", 1090.0)
190 #kwargs.setdefault("NoiseMiddles", 1557.0)
191 #kwargs.setdefault("NoiseShortMiddles", 940.0)
192 #kwargs.setdefault("NoiseOuters", 1618.0)
193 #kwargs.setdefault("NOBarrel", 1.5e-5)
194 #kwargs.setdefault("NOBarrel3", 2.1e-5)
195 #kwargs.setdefault("NOInners", 5.0e-9)
196 #kwargs.setdefault("NOMiddles", 2.7e-5)
197 #kwargs.setdefault("NOShortMiddles", 2.0e-9)
198 #kwargs.setdefault("NOOuters", 3.5e-5)
199 kwargs.setdefault("DetectorManager","ITkStrip")
200 #Always turn off noise for ITkStrip, since implementation is SCT specific
201 #ITkStrip noise treatment would be done in dedicated FrontEnd
202 #if not flags.Digitization.DoInnerDetectorNoise:
203 log = logging.getLogger("ITkStripFrontEndCfg")
204 log.info("ITkStripDigitization:::: Turned off Noise in ITkStripFrontEnd")
205 log.info("ITkStripDigitization:::: Overriding Digitization.DoInnerDetectorNoise flag")
206 kwargs.setdefault("NoiseOn", flags.Digitization.DoITkStripDetectorNoise)
207 kwargs.setdefault("AnalogueNoiseOn", flags.Digitization.DoITkStripDetectorNoise)
208 #else:
209 # kwargs.setdefault("NoiseOn", True)
210 # kwargs.setdefault("AnalogueNoiseOn", True)
211 # In overlay MC, only analogue noise is on (off for data). Noise hits are not added.
212 # Currently disabled for ITk
213 if flags.Common.isOverlay:
214 kwargs["NoiseOn"] = False
215 # kwargs["AnalogueNoiseOn"] = flags.Input.isMC
216 kwargs["AnalogueNoiseOn"] = False
217 # Use Calibration data from Conditions DB, still for testing purposes only
218 #This doesn't work yet for ITk - need specific version
219 kwargs.setdefault("UseCalibData", False)
220 # Setup the ReadCalibChip folders and Svc
221 #acc = SCT_ReadCalibChipDataCfg(flags)
222 #kwargs.setdefault("SCT_ReadCalibChipDataTool", acc.popPrivateTools())
223 acc = ComponentAccumulator()
224
225 # DataCompressionMode: 1 is level mode X1X (default), 2 is edge mode 01X, 3 is any hit mode (1XX|X1X|XX1)
226 if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
227 kwargs.setdefault("DataCompressionMode", 3)
228 else:
229 kwargs.setdefault("DataCompressionMode", 2)
230 # DataReadOutMode: 0 is condensed mode and 1 is expanded mode
231 if flags.Common.isOverlay:
232 kwargs.setdefault("DataReadOutMode", 0)
233 else:
234 kwargs.setdefault("DataReadOutMode", 1)
235
236 kwargs.setdefault("SCT_Amp", acc.popToolsAndMerge(ITkStripAmpCfg(flags)))
237
238 acc.setPrivateTools(CompFactory.SCT_FrontEnd(name, **kwargs))
239 return acc
240
241
242def ITkStripFrontEndPileupCfg(flags, name="PileupITkStripFrontEnd", **kwargs):
243 """Return ComponentAccumulator with pileup-configured front-end electronics tool"""
244 kwargs.setdefault("NoiseBarrel", 0.0)
245 kwargs.setdefault("NoiseBarrel3", 0.0)
246 kwargs.setdefault("NoiseInners", 0.0)
247 kwargs.setdefault("NoiseMiddles", 0.0)
248 kwargs.setdefault("NoiseShortMiddles", 0.0)
249 kwargs.setdefault("NoiseOuters", 0.0)
250 kwargs.setdefault("NOBarrel", 0.0)
251 kwargs.setdefault("NOBarrel3", 0.0)
252 kwargs.setdefault("NOInners", 0.0)
253 kwargs.setdefault("NOMiddles", 0.0)
254 kwargs.setdefault("NOShortMiddles", 0.0)
255 kwargs.setdefault("NOOuters", 0.0)
256 kwargs.setdefault("NoiseOn", False)
257 return ITkStripFrontEndCfg(flags, name, **kwargs)
258
259
260def ITkStripRangeCfg(flags, name="SiliconRange", **kwargs):
261 """Return an SCT configured PileUpXingFolder tool"""
262 kwargs.setdefault("FirstXing", ITkStripFirstXing())
263 kwargs.setdefault("LastXing", ITkStripLastXing())
264 kwargs.setdefault("CacheRefreshFrequency", 1.0) # default 0 no dataproxy reset
265 kwargs.setdefault("ItemList", ["SiHitCollection#ITkStripHits"] )
266 return PileUpXingFolderCfg(flags, name, **kwargs)
267
268
270 """Return ComponentAccumulator with Output for SCT. Not standalone."""
271 acc = ComponentAccumulator()
272 if flags.Output.doWriteRDO:
273 ItemList = ["SCT_RDO_Container#*"]
274 if flags.Digitization.EnableTruth:
275 ItemList += ["InDetSimDataCollection#*"]
276 acc.merge(TruthDigitizationOutputCfg(flags))
277 if flags.ITk.saveStripSiHits:
278 ItemList += ["SiHitCollection#ITkStripHits"]
279 acc.merge(OutputStreamCfg(flags, "RDO", ItemList))
280 return acc
281
282
283def ITkStripDigitizationBasicCfg(flags, **kwargs):
284 """Return ComponentAccumulator for SCT digitization"""
285 acc = ComponentAccumulator()
286 if "PileUpTools" not in kwargs:
287 PileUpTools = acc.popToolsAndMerge(ITkStripDigitizationToolCfg(flags))
288 kwargs["PileUpTools"] = PileUpTools
289 acc.merge(PileUpToolsCfg(flags, **kwargs))
290 return acc
291
292
294 """Return ComponentAccumulator with SCT Overlay digitization"""
295 acc = ComponentAccumulator()
296 if flags.Common.ProductionStep != ProductionStep.FastChain:
297 from SGComps.SGInputLoaderConfig import SGInputLoaderCfg
298 acc.merge(SGInputLoaderCfg(flags, ["SiHitCollection#ITkStripHits"]))
299
300 if "DigitizationTool" not in kwargs:
301 tool = acc.popToolsAndMerge(ITkStripOverlayDigitizationToolCfg(flags))
302 kwargs["DigitizationTool"] = tool
303
304 if flags.Concurrency.NumThreads > 0:
305 kwargs.setdefault('Cardinality', flags.Concurrency.NumThreads)
306
307 # Set common overlay extra inputs
308 kwargs.setdefault("ExtraInputs", flags.Overlay.ExtraInputs)
309
310 acc.addEventAlgo(CompFactory.SCT_Digitization(name="ITkStripOverlayDigitization", **kwargs))
311 return acc
312
313
314# with output defaults
315def ITkStripDigitizationCfg(flags, **kwargs):
316 """Return ComponentAccumulator for SCT digitization and Output"""
317 acc = ITkStripDigitizationBasicCfg(flags, **kwargs)
318 acc.merge(ITkStripOutputCfg(flags))
319 return acc
320
321
323 """Return ComponentAccumulator with SCT Overlay digitization and Output"""
324 acc = ITkStripOverlayDigitizationBasicCfg(flags, **kwargs)
325 acc.merge(ITkStripOutputCfg(flags))
326 return acc
327
328
329# additional specialisations
330def ITkStripDigitizationHSCfg(flags, name="ITkStripDigitizationHS", **kwargs):
331 """Return ComponentAccumulator for Hard-Scatter-only SCT digitization and Output"""
333 kwargs["PileUpTools"] = acc.popPrivateTools()
334 acc = ITkStripDigitizationBasicCfg(flags, name=name, **kwargs)
335 acc.merge(ITkStripOutputCfg(flags))
336 return acc
337
338
339def ITkStripDigitizationPUCfg(flags, name="ITkStripDigitizationPU", **kwargs):
340 """Return ComponentAccumulator with Pile-up-only SCT digitization and Output"""
342 kwargs["PileUpTools"] = acc.popPrivateTools()
343 acc = ITkStripDigitizationBasicCfg(flags, name=name, **kwargs)
344 acc.merge(ITkStripOutputCfg(flags))
345 return acc
ITkStripOverlayDigitizationCfg(flags, **kwargs)
ITkStripFrontEndPileupCfg(flags, name="PileupITkStripFrontEnd", **kwargs)
ITkStripOverlayDigitizationBasicCfg(flags, **kwargs)
ITkStripDigitizationToolSplitNoMergePUCfg(flags, name="ITkStripDigitizationToolSplitNoMergePU", **kwargs)
ITkStripRangeCfg(flags, name="SiliconRange", **kwargs)
ITkStripDigitizationPUToolCfg(flags, name="ITkStripDigitizationPUTool", **kwargs)
ITkStripDigitizationCommonCfg(flags, name="ITkStripDigitizationToolCommon", **kwargs)
ITkStripOverlayDigitizationToolCfg(flags, name="ITkStripOverlayDigitizationTool", **kwargs)
ITkStripSurfaceChargesGeneratorCfg(flags, name="ITkStripSurfaceChargesGenerator", **kwargs)
ITkStripRandomDisabledCellGeneratorCfg(flags, name="ITkStripRandomDisabledCellGenerator", **kwargs)
ITkStripDigitizationHSToolCfg(flags, name="ITkStripDigitizationHSTool", **kwargs)
ITkStripFrontEndCfg(flags, name="ITkStripFrontEnd", **kwargs)
ITkStripDigitizationPUCfg(flags, name="ITkStripDigitizationPU", **kwargs)
ITkStripAmpCfg(flags, name="ITkStripAmp", **kwargs)
ITkStripDigitizationBasicCfg(flags, **kwargs)
ITkStripDigitizationHSCfg(flags, name="ITkStripDigitizationHS", **kwargs)
ITkStripDigitizationToolGeantinoTruthCfg(flags, name="ITkStripGeantinoTruthDigitizationTool", **kwargs)
ITkStripDigitizationToolCfg(flags, name="ITkStripDigitizationTool", **kwargs)