ATLAS Offline Software
Loading...
Searching...
No Matches
LArDigitizationConfig.py
Go to the documentation of this file.
1"""Define functions for LAr Digitization with ComponentAccumulator
2
3Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
4"""
5# utilities
6from AthenaCommon.Logging import logging
7from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
8from AthenaConfiguration.ComponentFactory import CompFactory
9from AthenaConfiguration.Enums import BeamType, LHCPeriod, ProductionStep
10from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
11# for PileUpTool
12from LArGeoAlgsNV.LArGMConfig import LArGMCfg
13from LArRecUtils.LArADC2MeVCondAlgConfig import LArADC2MeVCondAlgCfg
14from LArRecUtils.LArXTalkWeightCondAlgConfig import LArXTalkWeightCondAlgCfg
15from LArRecUtils.LArRecUtilsConfig import LArAutoCorrNoiseCondAlgCfg
16from LArBadChannelTool.LArBadChannelConfig import LArBadFebCfg,LArBadChannelCfg
17from LArConfiguration.LArElecCalibDBConfig import LArElecCalibDBCfg
18from DigitizationConfig.PileUpToolsConfig import PileUpToolsCfg
19from DigitizationConfig.PileUpMergeSvcConfig import PileUpMergeSvcCfg, PileUpXingFolderCfg
20# for Digitization
21from LArROD.LArRawChannelBuilderAlgConfig import LArRawChannelBuilderAlgCfg
22from LArROD.LArDigitThinnerConfig import LArDigitThinnerCfg
23from LArROD.LArNNChannelBuilder import LArNNRawChannelBuilderCfg
24from LArROD.LArOFFCChannelBuilder import LArOFFCRawChannelBuilderCfg
25
26from LArROD.LArRODBCIDCorrAlgConfig import LArRODBCIDCorrAlgCfg
27
28from DigitizationConfig.TruthDigitizationOutputConfig import TruthDigitizationOutputCfg
29# for Trigger Tower
30from CaloConditions.CaloConditionsConfig import CaloTriggerTowerCfg
31from SGComps.AddressRemappingConfig import InputOverwriteCfg
32
33
34# Enum of CaloGains
35from ROOT.CaloGain import CaloGain
36
37
38
39def useLArFloat(flags):
40 """Return bool for simplified transient LArHit with float E,time"""
41 # temporary, remapping to LArHitFloat does not seeem to work
42 # with this scheme... => larger memory usage
43 if flags.Digitization.DoXingByXingPileUp or flags.Common.isOverlay:
44 return False
45 # check for fast chain, running digitisation from hits in memory
46 if flags.Sim.DoFullChain:
47 return False
48 return False
49
50
51def LArRangeEMCfg(flags, name="LArRangeEM", **kwargs):
52 """Return a PileUpXingFoldertool for ElectroMagnetic calorimeter"""
53 # bunch crossing range in ns
54 kwargs.setdefault("FirstXing", -751)
55 kwargs.setdefault("LastXing", 101)
56 if useLArFloat(flags):
57 kwargs.setdefault("ItemList", ["LArHitFloatContainer#LArHitEMB",
58 "LArHitFloatContainer#LArHitEMEC"])
59 else:
60 kwargs.setdefault("ItemList", ["LArHitContainer#LArHitEMB",
61 "LArHitContainer#LArHitEMEC"])
62 return PileUpXingFolderCfg(flags, name, **kwargs)
63
64
65def LArRangeHECCfg(flags, name="LArRangeHEC", **kwargs):
66 """Return a PileUpXingFoldertool for Hadronic End-Cap"""
67 # bunch crossing range in ns
68 kwargs.setdefault("FirstXing", -676)
69 kwargs.setdefault("LastXing", 101)
70 if useLArFloat(flags):
71 kwargs.setdefault("ItemList", ["LArHitFloatContainer#LArHitHEC"])
72 else:
73 kwargs.setdefault("ItemList", ["LArHitContainer#LArHitHEC"])
74 return PileUpXingFolderCfg(flags, name, **kwargs)
75
76
77def LArRangeFCALCfg(flags, name="LArRangeFCAL", **kwargs):
78 """Return a PileUpXingFoldertool for Forward Calorimeters"""
79 # bunch crossing range in ns
80 kwargs.setdefault("FirstXing", -551)
81 kwargs.setdefault("LastXing", 101)
82 if useLArFloat(flags):
83 kwargs.setdefault("ItemList", ["LArHitFloatContainer#LArHitFCAL"])
84 else:
85 kwargs.setdefault("ItemList", ["LArHitContainer#LArHitFCAL"])
86 return PileUpXingFolderCfg(flags, name, **kwargs)
87
88
89def LArPileUpToolCfg(flags, name="LArPileUpTool", **kwargs):
90 """Return ComponentAccumulator with configured LArPileUpTool"""
91 acc = LArGMCfg(flags)
92
93 # add new conditions for LArXTalkWeight
94 acc.merge(LArXTalkWeightCondAlgCfg(flags))
95
96 # defaults
97 if flags.Common.isOverlay:
98 # Some noise needs to be added during MC Overlay
99 # No noise should be added during Data Overlay
100 kwargs.setdefault("NoiseOnOff", not flags.Overlay.DataOverlay)
101 kwargs.setdefault("NoiseOnOff", flags.Digitization.DoCaloNoise) # For other jobs go with the noise flag setting.
102 kwargs.setdefault("DoDigiTruthReconstruction", flags.Digitization.EnableCaloHSTruthRecoInputs)
103 kwargs.setdefault("RandomSeedOffset", flags.Digitization.RandomSeedOffset)
104 if flags.Digitization.PileUp:
105 intervals = []
106 if flags.Digitization.DoXingByXingPileUp:
107 kwargs.setdefault("FirstXing", -751)
108 kwargs.setdefault("LastXing", 101)
109 else:
110 intervals += [acc.popToolsAndMerge(LArRangeEMCfg(flags))]
111 intervals += [acc.popToolsAndMerge(LArRangeHECCfg(flags))]
112 intervals += [acc.popToolsAndMerge(LArRangeFCALCfg(flags))]
113 kwargs.setdefault("PileUpMergeSvc", acc.getPrimaryAndMerge(PileUpMergeSvcCfg(flags, Intervals=intervals)))
114 else:
115 kwargs.setdefault("PileUpMergeSvc", '')
116 kwargs.setdefault("RndmEvtOverlay", flags.Common.isOverlay)
117 # if doing MC+MC overlay
118 if flags.Common.isOverlay and flags.Input.isMC:
119 kwargs.setdefault("isMcOverlay", True)
120
121 # cosmics digitization
122 if flags.Beam.Type is BeamType.Cosmics:
123 kwargs.setdefault("UseTriggerTime", True)
124 acc.addEventAlgo(CompFactory.CosTriggerTimeAlg())
125 if flags.Digitization.PileUp or flags.Common.isOverlay:
126 kwargs.setdefault("PileUp", True)
127 kwargs.setdefault("useLArFloat", useLArFloat(flags))
128 if useLArFloat(flags):
129 acc.merge(InputOverwriteCfg("LArHitContainer","LArHitEMB","LArHitFloatContainer","LArHitEMB"))
130 acc.merge(InputOverwriteCfg("LArHitContainer","LArHitEMEC","LArHitFloatContainer","LArHitEMEC"))
131 acc.merge(InputOverwriteCfg("LArHitContainer","LArHitHEC","LArHitFloatContainer","LArHitHEC"))
132 acc.merge(InputOverwriteCfg("LArHitContainer","LArHitFCAL","LArHitFloatContainer","LArHitFCAL"))
133 if flags.Common.isOverlay:
134 from SGComps.SGInputLoaderConfig import SGInputLoaderCfg
135 acc.merge(SGInputLoaderCfg(flags, [
136 "LArHitFloatContainer#LArHitEMB",
137 "LArHitFloatContainer#LArHitEMEC",
138 "LArHitFloatContainer#LArHitFCAL",
139 "LArHitFloatContainer#LArHitHEC",
140 ]))
141 else:
142 if flags.Common.isOverlay and not flags.Sim.DoFullChain:
143 from SGComps.SGInputLoaderConfig import SGInputLoaderCfg
144 acc.merge(SGInputLoaderCfg(flags, [
145 "LArHitContainer#LArHitEMB",
146 "LArHitContainer#LArHitEMEC",
147 "LArHitContainer#LArHitFCAL",
148 "LArHitContainer#LArHitHEC",
149 ]))
150
151 if flags.Common.isOverlay:
152 kwargs.setdefault("OnlyUseContainerName", False)
153 if flags.Overlay.IgnoreBkgInputs:
154 kwargs.setdefault("InputDigitContainer", "")
155 elif flags.Input.isMC:
156 kwargs.setdefault("InputDigitContainer", f"{flags.Overlay.BkgPrefix}LArDigitContainer_MC")
157 else:
158 kwargs.setdefault("InputDigitContainer", f"{flags.Overlay.BkgPrefix}LArDigitContainer_data")
159
160 if kwargs["InputDigitContainer"]:
161 from SGComps.SGInputLoaderConfig import SGInputLoaderCfg
162 acc.merge(SGInputLoaderCfg(flags, [f'LArDigitContainer#{kwargs["InputDigitContainer"]}']))
163 else:
164 kwargs.setdefault("OnlyUseContainerName", flags.Digitization.PileUp)
165 LArPileUpTool = CompFactory.LArPileUpTool
166 acc.setPrivateTools(LArPileUpTool(name, **kwargs))
167 return acc
168
169def LArHitEMapToDigitAlgCfg(flags, name="LArHitEMapToDigitAlg", **kwargs):
170 """Return ComponentAccumulator with configured LArHitEMapToDigitAlg"""
171 acc = LArGMCfg(flags)
172
173 #The LArHitEMapToDigit needs: Noise, fSampl, Pedestal,Shape ADC2MeV
174 # AutoCorrNoise, the list of bad FEBs and the cabling
175 acc.merge(LArADC2MeVCondAlgCfg(flags))
176 acc.merge(LArBadFebCfg(flags))
177 acc.merge(LArBadChannelCfg(flags))
178 if flags.Overlay.DataOverlay:
179 kwargs.setdefault("ShapeKey", "LArShape")
180 #kwargs.setdefault("AutoCorrNoiseKey", "LArAutoCorr")
181 if not flags.Digitization.DoCaloNoise:
182 requiredConditons=["fSampl", "Pedestal", "Shape"]
183 else:
184 requiredConditons=["Noise", "fSampl", "Pedestal", "Shape"]
185 acc.merge(LArElecCalibDBCfg(flags,requiredConditons))
186
187 if not flags.Common.isOverlay:
188 acc.merge(LArAutoCorrNoiseCondAlgCfg(flags))
189 #kwargs.setdefault('AutoCorrNoiseKey','LArAutoCorr')
190
191 if "ProblemsToMask" not in kwargs:
192 kwargs["ProblemsToMask"] = ["deadReadout", "deadPhys"]
193 # defaults
194 if flags.Common.isOverlay:
195 # Some noise needs to be added during MC Overlay
196 # No noise should be added during Data Overlay
197 kwargs.setdefault("NoiseOnOff", not flags.Overlay.DataOverlay)
198 else :
199 kwargs.setdefault("NoiseOnOff", flags.Digitization.DoCaloNoise)
200 kwargs.setdefault("DoDigiTruthReconstruction", flags.Digitization.EnableCaloHSTruthRecoInputs)
201 kwargs.setdefault("RandomSeedOffset", flags.Digitization.RandomSeedOffset)
202
203 if flags.GeoModel.Run==LHCPeriod.Run4 and flags.IOVDb.UseCREST:
204 #The run 4 readout electronics has only 2 gains
205 for subdet in ("EM","HEC","FCAL","EMECIW"):
206 kwargs.setdefault("GainRange"+subdet,(0,1))
207 kwargs.setdefault("LowGainThresh"+subdet,0xFFFFFFFF) #Low gains doesn't exist any more in R 4
208 #Gain switching threshold in the lower gain (aka MEDIUM)
209 #Assume gain switch at 80% of pre-amp saturation in HG. -> 9000 ADC counts in the lower gain
210 kwargs.setdefault("HighGainThresh"+subdet,9000)
211 kwargs.setdefault("maxADC",32767)
212 else:
213 #Run 1/2/3 case:
214 if (not flags.Digitization.HighGainFCal) and (not flags.Common.isOverlay):
215 kwargs.setdefault("HighGainThreshFCAL", 0)
216 kwargs.setdefault("GainRangeFCAL",[int(CaloGain.LARMEDIUMGAIN),int(CaloGain.LARLOWGAIN)])
217 if (not flags.Digitization.HighGainEMECIW) and (not flags.Common.isOverlay):
218 kwargs.setdefault("HighGainThreshEMECIW", 0)
219 kwargs.setdefault("GainRangeEMECIW",[int(CaloGain.LARMEDIUMGAIN),int(CaloGain.LARLOWGAIN)])
220
221
222 kwargs.setdefault("RndmEvtOverlay", flags.Common.isOverlay)
223 if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
224 kwargs.setdefault("DigitContainer", flags.Overlay.BkgPrefix + "LArDigitContainer_MC")
225 else:
226 kwargs.setdefault("DigitContainer", "LArDigitContainer_MC") # FIXME - should not be hard-coded
227 # if doing MC+MC overlay
228 if flags.Common.isOverlay and flags.Input.isMC:
229 kwargs.setdefault("isMcOverlay", True)
230 kwargs.setdefault("Nsamples", flags.LAr.ROD.nSamples)
231 kwargs.setdefault("firstSample", #Need to set a negative value to include preceeding samples
232 -flags.LAr.ROD.nPreceedingSamples if flags.LAr.ROD.nPreceedingSamples!=0 else flags.LAr.ROD.FirstSample)
233
234
235 LArHitEMapToDigitAlg = CompFactory.LArHitEMapToDigitAlg
236 acc.addEventAlgo(LArHitEMapToDigitAlg(name, **kwargs))
237 return acc
238
239def LArOutputCfg(flags):
240 """Return ComponentAccumulator with Output for LAr. Not standalone."""
241 acc = ComponentAccumulator()
242 if flags.Output.doWriteRDO:
243 ItemList = []
244 if flags.Digitization.AddCaloDigi:
245 ItemList.append("LArDigitContainer#*")
246 elif flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
247 ItemList.append("LArDigitContainer#" + flags.Overlay.BkgPrefix + "LArDigitContainer_MC")
248 elif flags.Digitization.AddCaloDigiThinned:
249 ItemList.append("LArDigitContainer#LArDigitContainer_MC_Thinned")
250 if flags.Common.ProductionStep != ProductionStep.PileUpPresampling:
251 ItemList.append("LArRawChannelContainer#LArRawChannels")
252 if flags.Digitization.EnableCaloHSTruthRecoInputs:
253 ItemList.append("LArRawChannelContainer#LArRawChannels_DigiHSTruth")
254 if flags.Overlay.DataOverlay:
255 ItemList.append("LArFebHeaderContainer#LArFebHeader")
256 if flags.Digitization.EnableTruth:
257 ItemList.append("CaloCalibrationHitContainer#*")
258 acc.merge(TruthDigitizationOutputCfg(flags))
259 acc.merge(OutputStreamCfg(flags, "RDO", ItemList))
260 return acc
261
262
263def LArDigitizationBasicCfg(flags, **kwargs):
264 """Return ComponentAccumulator with LAr digitization configuration"""
265 acc = ComponentAccumulator()
266 if "PileUpTools" not in kwargs:
267 PileUpTools = acc.popToolsAndMerge(LArPileUpToolCfg(flags))
268 kwargs["PileUpTools"] = PileUpTools
269 acc.merge(PileUpToolsCfg(flags, **kwargs))
270
271 acc.merge(LArHitEMapToDigitAlgCfg(flags))
272
273 if flags.LAr.ROD.ApplyRODBCIDCorr:
274 mlog = logging.getLogger('LArDigitizationBasicCfg')
275 mlog.info('LAr.ROD.ApplyRODBCIDCorr is set: scheduling LArRODBCIDCorrAlg '
276 'to subtract the BCID-dependent pile-up offset from the digits')
277 if (flags.hasFlag('Calo.Cell.doPileupOffsetBCIDCorr')
278 and flags.Calo.Cell.doPileupOffsetBCIDCorr):
279 mlog.warning('Calo.Cell.doPileupOffsetBCIDCorr is also enabled: the '
280 'pile-up offset will be subtracted twice')
281 acc.merge(LArRODBCIDCorrAlgCfg(flags))
282
283 if flags.LAr.ROD.NNRawChannelBuilding:
284 acc.merge(LArNNRawChannelBuilderCfg(flags))
285 elif flags.LAr.ROD.OFFCRawChannelBuilding:
286 acc.merge(LArOFFCRawChannelBuilderCfg(flags))
287 else:
288 acc.merge(LArRawChannelBuilderAlgCfg(flags))
289
290 # Build the second instance with digi truth
291 if flags.Digitization.EnableCaloHSTruthRecoInputs:
292 acc.merge(LArRawChannelBuilderAlgCfg(flags, doDigiTruth=True))
293
294 if flags.Digitization.AddCaloDigiThinned:
295 acc.merge(LArDigitThinnerCfg(flags))
296 return acc
297
298
299def LArDigitizationCfg(flags, **kwargs):
300 """Return ComponentAccumulator with LAr digitization and Output"""
301 acc = LArDigitizationBasicCfg(flags, **kwargs)
302 acc.merge(LArOutputCfg(flags))
303 return acc
304
305
306def LArOverlayDigitizationBasicCfg(flags, name="digitmaker1", **kwargs):
307 """Return ComponentAccumulator with LAr Overlay digitization configuration"""
308 acc = ComponentAccumulator()
309
310 if "LArPileUpTool" not in kwargs:
311 kwargs["LArPileUpTool"] = acc.popToolsAndMerge(LArPileUpToolCfg(flags))
312
313 if flags.Concurrency.NumThreads > 0:
314 kwargs.setdefault('Cardinality', flags.Concurrency.NumThreads)
315
316 LArHitEMapMaker = CompFactory.LArHitEMapMaker
317 acc.addEventAlgo(LArHitEMapMaker(name, **kwargs))
318 acc.merge(LArHitEMapToDigitAlgCfg(flags))
319
320 acc.merge(LArRawChannelBuilderAlgCfg(flags))
321
322 if flags.Digitization.EnableCaloHSTruthRecoInputs:
323 acc.merge(LArRawChannelBuilderAlgCfg(flags, doDigiTruth=True))
324
325 if flags.Digitization.AddCaloDigiThinned:
326 acc.merge(LArDigitThinnerCfg(flags))
327 return acc
328
329
330def LArOverlayCfg(flags, **kwargs):
331 """Return ComponentAccumulator with LAr overlay and Output"""
332 acc = LArOverlayDigitizationBasicCfg(flags, **kwargs)
333 acc.merge(LArOutputCfg(flags))
334 return acc
335
336
337def LArAutoCorrNoiseCondSCAlgCfg(flags, **kwargs):
338 acc = ComponentAccumulator()
339
340 requiredConditions=["AutoCorrSC"]
341 from LArConfiguration.LArElecCalibDBConfig import LArElecCalibDBMCSCCfg
342 acc.merge(LArElecCalibDBMCSCCfg(flags,requiredConditions))
343 kwargs.setdefault("LArAutoCorrObjKey", "LArAutoCorrSC") # Provided by LArFlatConditionsAlg<LArAutoCorrSC>
344
345 from LArCabling.LArCablingConfig import LArOnOffIdMappingSCCfg
346 acc.merge(LArOnOffIdMappingSCCfg(flags))
347 kwargs.setdefault("LArOnOffIdMappingObjKey", 'LArOnOffIdMapSC')
348 kwargs.setdefault("nSampl", flags.LAr.ROD.nSamples + 2) # See ATLASSIM-5483
349 kwargs.setdefault("isSuperCell", True)
350 kwargs.setdefault("LArAutoCorrNoiseObjKey", "LArAutoCorrNoiseSC") # output
351 acc.addCondAlgo(CompFactory.LArAutoCorrNoiseCondAlg(name="LArAutoCorrNoiseSCCondAlg", **kwargs))
352 return acc
353
354
355def LArSCL1MakerCfg(flags, **kwargs):
356 """Return ComponentAccumulator for LArSCL1Maker"""
357 acc = ComponentAccumulator()
358 if flags.Common.isOverlay:
359 acc.merge(LArOverlayDigitizationBasicCfg(flags))
360 else:
361 acc.merge(LArDigitizationBasicCfg(flags))
362
363 kwargs.setdefault("LArHitEMapKey", "StoreGateSvc+LArHitEMap") # Provided by LArPileUpTool
364
365 from LArRecUtils.LArADC2MeVSCCondAlgConfig import LArADC2MeVSCCondAlgCfg
366 acc.merge(LArADC2MeVSCCondAlgCfg(flags))
367 kwargs.setdefault("LArADC2MeVKey", "ConditionStore+LArADC2MeVSC") # Provided by LArADC2MeVSCCondAlg
368
369 from LArCabling.LArCablingConfig import LArOnOffIdMappingSCCfg
370 acc.merge(LArOnOffIdMappingSCCfg(flags))
371 # '<prefix>/LAR/IdentifierOfl/OnOffIdMap_SC</prefix> <tag>LARIdentifierOflOnOffIdMap_SC-000</tag>' Do we need to add this override in the IOVDbSvc or just add the conditions properly in the Run3 conditions global tag???
372 kwargs.setdefault("ScCablingKey", "ConditionStore+LArOnOffIdMapSC") # Provided by LArOnOffMappingAlgSC
373
374 requiredConditions=["fSamplSC","ShapeSC","PedestalSC","NoiseSC"]
375 from LArConfiguration.LArElecCalibDBConfig import LArElecCalibDBMCSCCfg
376 acc.merge(LArElecCalibDBMCSCCfg(flags,requiredConditions))
377 kwargs.setdefault("FracSKey", "ConditionStore+LArfSamplSC") # Provided by LArFlatConditionsAlg<LArfSamplSC>
378 kwargs.setdefault("ShapeKey", "ConditionStore+LArShapeSC") # Provided by LArFlatConditionsAlg<LArShapeSC>
379 kwargs.setdefault("PedestalKey", "ConditionStore+LArPedestalSC") # Provided by LArFlatConditionsAlg<LArPedestalSC>
380 kwargs.setdefault("LArNoiseKey", "ConditionStore+LArNoiseSC") # Provided by LArFlatConditionsAlg<LArNoiseSC>
381
382 acc.merge(LArAutoCorrNoiseCondSCAlgCfg(flags))
383 kwargs.setdefault("LArAutoCorrKey", "ConditionStore+LArAutoCorrNoiseSC") # Provided by LArAutoCorrNoiseCondAlg/LArAutoCorrNoiseSCCondAlg
384 kwargs.setdefault("NSamples", flags.LAr.ROD.nSamples + 2) # For consistency with LArAutoCorrNoiseSC - see ATLASSIM-5483
385 from RngComps.RngCompsConfig import AthRNGSvcCfg
386 kwargs.setdefault("RndmSvc",
387 acc.getPrimaryAndMerge(AthRNGSvcCfg(flags)))
388 if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
389 kwargs.setdefault("SCL1ContainerName", f"{flags.Overlay.BkgPrefix}LArDigitSCL2") # Output - why L2??
390 if flags.Common.isOverlay:
391 kwargs.setdefault("BkgDigitKey", f"{flags.Overlay.BkgPrefix}LArDigitSCL2")
392
393 from SGComps.SGInputLoaderConfig import SGInputLoaderCfg
394 acc.merge(SGInputLoaderCfg(flags, [f'LArDigitContainer#{kwargs["BkgDigitKey"]}']))
395 kwargs.setdefault("SCL1ContainerName","LArDigitSCL2") # Output - why L2??
396 acc.addEventAlgo(CompFactory.LArSCL1Maker(**kwargs))
397 return acc
398
399
400def LArTriggerDigitizationBasicCfg(flags, **kwargs):
401 """Return ComponentAccumulator for LAr Trigger Tower"""
402 acc = LArDigitizationBasicCfg(flags)
403 acc.merge(CaloTriggerTowerCfg(flags))
404
405 kwargs.setdefault("NoiseOnOff", flags.Digitization.DoCaloNoise)
406 kwargs.setdefault("RandomSeedOffset", flags.Digitization.RandomSeedOffset)
407 kwargs.setdefault("PileUp", flags.Digitization.PileUp)
408 if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
409 kwargs.setdefault("EmTTL1ContainerName", flags.Overlay.BkgPrefix + "LArTTL1EM")
410 kwargs.setdefault("HadTTL1ContainerName", flags.Overlay.BkgPrefix + "LArTTL1HAD")
411 acc.addEventAlgo(CompFactory.LArTTL1Maker(**kwargs))
412 if flags.GeoModel.Run >= LHCPeriod.Run3:
413 acc.merge(LArSCL1MakerCfg(flags))
414 if flags.Common.ProductionStep is not ProductionStep.PileUpPresampling:
415 from LArROD.LArSuperCellBuilderConfig import LArSuperCellBuilderAlgCfg, LArSuperCellBCIDAlgCfg
416 acc.merge(LArSuperCellBuilderAlgCfg(flags))
417 acc.merge(LArSuperCellBCIDAlgCfg(flags))
418 return acc
419
420
421def LArTriggerDigitizationCfg(flags, **kwargs):
422 """Return ComponentAccumulator for LAr Trigger Tower and Output"""
423 acc = LArTriggerDigitizationBasicCfg(flags)
424 acc.merge(LArOutputCfg(flags))
425 acc.merge(OutputStreamCfg(flags, "RDO", ["LArTTL1Container#*"]))
426 if flags.GeoModel.Run >= LHCPeriod.Run3:
427 if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
428 acc.merge(OutputStreamCfg(flags, "RDO", ["LArDigitContainer#" + flags.Overlay.BkgPrefix + "LArDigitSCL2"]))
429 else:
430 acc.merge(OutputStreamCfg(flags, "RDO", ["CaloCellContainer#SCell"]))
431 return acc
432
433
434def LArOverlayTriggerDigitizationBasicCfg(flags, **kwargs):
435 """Return ComponentAccumulator with LAr Overlay Trigger Tower"""
436 acc = LArOverlayDigitizationBasicCfg(flags)
437 acc.merge(CaloTriggerTowerCfg(flags))
438
439 kwargs.setdefault("NoiseOnOff", flags.Digitization.DoCaloNoise)
440 kwargs.setdefault("RandomSeedOffset", flags.Digitization.RandomSeedOffset)
441 kwargs.setdefault("PileUp", True)
442 kwargs.setdefault("EmTTL1ContainerName", flags.Overlay.SigPrefix + "LArTTL1EM")
443 kwargs.setdefault("HadTTL1ContainerName", flags.Overlay.SigPrefix + "LArTTL1HAD")
444
445 if flags.Concurrency.NumThreads > 0:
446 kwargs.setdefault('Cardinality', flags.Concurrency.NumThreads)
447
448 acc.addEventAlgo(CompFactory.LArTTL1Maker(**kwargs))
449 return acc
450
451
452def LArSuperCellOverlayCfg(flags, **kwargs):
453 acc = LArSCL1MakerCfg(flags)
454 from LArROD.LArSuperCellBuilderConfig import LArSuperCellBuilderAlgCfg, LArSuperCellBCIDAlgCfg
455 acc.merge(LArSuperCellBuilderAlgCfg(flags))
456 acc.merge(LArSuperCellBCIDAlgCfg(flags))
457 acc.merge(OutputStreamCfg(flags, "RDO", ["CaloCellContainer#SCell"]))
458 return acc
LArRangeEMCfg(flags, name="LArRangeEM", **kwargs)