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.Overlay.DataOverlay:
253 ItemList.append("LArFebHeaderContainer#LArFebHeader")
254 if flags.Digitization.EnableTruth:
255 ItemList.append("CaloCalibrationHitContainer#*")
256 acc.merge(TruthDigitizationOutputCfg(flags))
257 acc.merge(OutputStreamCfg(flags, "RDO", ItemList))
258 return acc
259
260
261def LArDigitizationBasicCfg(flags, **kwargs):
262 """Return ComponentAccumulator with LAr digitization configuration"""
263 acc = ComponentAccumulator()
264 if "PileUpTools" not in kwargs:
265 PileUpTools = acc.popToolsAndMerge(LArPileUpToolCfg(flags))
266 kwargs["PileUpTools"] = PileUpTools
267 acc.merge(PileUpToolsCfg(flags, **kwargs))
268
269 acc.merge(LArHitEMapToDigitAlgCfg(flags))
270
271 if flags.LAr.ROD.ApplyRODBCIDCorr:
272 mlog = logging.getLogger('LArDigitizationBasicCfg')
273 mlog.info('LAr.ROD.ApplyRODBCIDCorr is set: scheduling LArRODBCIDCorrAlg '
274 'to subtract the BCID-dependent pile-up offset from the digits')
275 if (flags.hasFlag('Calo.Cell.doPileupOffsetBCIDCorr')
276 and flags.Calo.Cell.doPileupOffsetBCIDCorr):
277 mlog.warning('Calo.Cell.doPileupOffsetBCIDCorr is also enabled: the '
278 'pile-up offset will be subtracted twice')
279 acc.merge(LArRODBCIDCorrAlgCfg(flags))
280
281 if flags.LAr.ROD.NNRawChannelBuilding:
282 acc.merge(LArNNRawChannelBuilderCfg(flags))
283 elif flags.LAr.ROD.OFFCRawChannelBuilding:
284 acc.merge(LArOFFCRawChannelBuilderCfg(flags))
285 else:
286 acc.merge(LArRawChannelBuilderAlgCfg(flags))
287
288 if flags.Digitization.AddCaloDigiThinned:
289 acc.merge(LArDigitThinnerCfg(flags))
290 return acc
291
292
293def LArDigitizationCfg(flags, **kwargs):
294 """Return ComponentAccumulator with LAr digitization and Output"""
295 acc = LArDigitizationBasicCfg(flags, **kwargs)
296 acc.merge(LArOutputCfg(flags))
297 return acc
298
299
300def LArOverlayDigitizationBasicCfg(flags, name="digitmaker1", **kwargs):
301 """Return ComponentAccumulator with LAr Overlay digitization configuration"""
302 acc = ComponentAccumulator()
303
304 if "LArPileUpTool" not in kwargs:
305 kwargs["LArPileUpTool"] = acc.popToolsAndMerge(LArPileUpToolCfg(flags))
306
307 if flags.Concurrency.NumThreads > 0:
308 kwargs.setdefault('Cardinality', flags.Concurrency.NumThreads)
309
310 LArHitEMapMaker = CompFactory.LArHitEMapMaker
311 acc.addEventAlgo(LArHitEMapMaker(name, **kwargs))
312 acc.merge(LArHitEMapToDigitAlgCfg(flags))
313
314 acc.merge(LArRawChannelBuilderAlgCfg(flags))
315 if flags.Digitization.AddCaloDigiThinned:
316 acc.merge(LArDigitThinnerCfg(flags))
317 return acc
318
319
320def LArOverlayCfg(flags, **kwargs):
321 """Return ComponentAccumulator with LAr overlay and Output"""
322 acc = LArOverlayDigitizationBasicCfg(flags, **kwargs)
323 acc.merge(LArOutputCfg(flags))
324 return acc
325
326
327def LArAutoCorrNoiseCondSCAlgCfg(flags, **kwargs):
328 acc = ComponentAccumulator()
329
330 requiredConditions=["AutoCorrSC"]
331 from LArConfiguration.LArElecCalibDBConfig import LArElecCalibDBMCSCCfg
332 acc.merge(LArElecCalibDBMCSCCfg(flags,requiredConditions))
333 kwargs.setdefault("LArAutoCorrObjKey", "LArAutoCorrSC") # Provided by LArFlatConditionsAlg<LArAutoCorrSC>
334
335 from LArCabling.LArCablingConfig import LArOnOffIdMappingSCCfg
336 acc.merge(LArOnOffIdMappingSCCfg(flags))
337 kwargs.setdefault("LArOnOffIdMappingObjKey", 'LArOnOffIdMapSC')
338 kwargs.setdefault("nSampl", flags.LAr.ROD.nSamples + 2) # See ATLASSIM-5483
339 kwargs.setdefault("isSuperCell", True)
340 kwargs.setdefault("LArAutoCorrNoiseObjKey", "LArAutoCorrNoiseSC") # output
341 acc.addCondAlgo(CompFactory.LArAutoCorrNoiseCondAlg(name="LArAutoCorrNoiseSCCondAlg", **kwargs))
342 return acc
343
344
345def LArSCL1MakerCfg(flags, **kwargs):
346 """Return ComponentAccumulator for LArSCL1Maker"""
347 acc = ComponentAccumulator()
348 if flags.Common.isOverlay:
349 acc.merge(LArOverlayDigitizationBasicCfg(flags))
350 else:
351 acc.merge(LArDigitizationBasicCfg(flags))
352
353 kwargs.setdefault("LArHitEMapKey", "StoreGateSvc+LArHitEMap") # Provided by LArPileUpTool
354
355 from LArRecUtils.LArADC2MeVSCCondAlgConfig import LArADC2MeVSCCondAlgCfg
356 acc.merge(LArADC2MeVSCCondAlgCfg(flags))
357 kwargs.setdefault("LArADC2MeVKey", "ConditionStore+LArADC2MeVSC") # Provided by LArADC2MeVSCCondAlg
358
359 from LArCabling.LArCablingConfig import LArOnOffIdMappingSCCfg
360 acc.merge(LArOnOffIdMappingSCCfg(flags))
361 # '<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???
362 kwargs.setdefault("ScCablingKey", "ConditionStore+LArOnOffIdMapSC") # Provided by LArOnOffMappingAlgSC
363
364 requiredConditions=["fSamplSC","ShapeSC","PedestalSC","NoiseSC"]
365 from LArConfiguration.LArElecCalibDBConfig import LArElecCalibDBMCSCCfg
366 acc.merge(LArElecCalibDBMCSCCfg(flags,requiredConditions))
367 kwargs.setdefault("FracSKey", "ConditionStore+LArfSamplSC") # Provided by LArFlatConditionsAlg<LArfSamplSC>
368 kwargs.setdefault("ShapeKey", "ConditionStore+LArShapeSC") # Provided by LArFlatConditionsAlg<LArShapeSC>
369 kwargs.setdefault("PedestalKey", "ConditionStore+LArPedestalSC") # Provided by LArFlatConditionsAlg<LArPedestalSC>
370 kwargs.setdefault("LArNoiseKey", "ConditionStore+LArNoiseSC") # Provided by LArFlatConditionsAlg<LArNoiseSC>
371
372 acc.merge(LArAutoCorrNoiseCondSCAlgCfg(flags))
373 kwargs.setdefault("LArAutoCorrKey", "ConditionStore+LArAutoCorrNoiseSC") # Provided by LArAutoCorrNoiseCondAlg/LArAutoCorrNoiseSCCondAlg
374 kwargs.setdefault("NSamples", flags.LAr.ROD.nSamples + 2) # For consistency with LArAutoCorrNoiseSC - see ATLASSIM-5483
375 from RngComps.RngCompsConfig import AthRNGSvcCfg
376 kwargs.setdefault("RndmSvc",
377 acc.getPrimaryAndMerge(AthRNGSvcCfg(flags)))
378 if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
379 kwargs.setdefault("SCL1ContainerName", f"{flags.Overlay.BkgPrefix}LArDigitSCL2") # Output - why L2??
380 if flags.Common.isOverlay:
381 kwargs.setdefault("BkgDigitKey", f"{flags.Overlay.BkgPrefix}LArDigitSCL2")
382
383 from SGComps.SGInputLoaderConfig import SGInputLoaderCfg
384 acc.merge(SGInputLoaderCfg(flags, [f'LArDigitContainer#{kwargs["BkgDigitKey"]}']))
385 kwargs.setdefault("SCL1ContainerName","LArDigitSCL2") # Output - why L2??
386 acc.addEventAlgo(CompFactory.LArSCL1Maker(**kwargs))
387 return acc
388
389
390def LArTriggerDigitizationBasicCfg(flags, **kwargs):
391 """Return ComponentAccumulator for LAr Trigger Tower"""
392 acc = LArDigitizationBasicCfg(flags)
393 acc.merge(CaloTriggerTowerCfg(flags))
394
395 kwargs.setdefault("NoiseOnOff", flags.Digitization.DoCaloNoise)
396 kwargs.setdefault("RandomSeedOffset", flags.Digitization.RandomSeedOffset)
397 kwargs.setdefault("PileUp", flags.Digitization.PileUp)
398 if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
399 kwargs.setdefault("EmTTL1ContainerName", flags.Overlay.BkgPrefix + "LArTTL1EM")
400 kwargs.setdefault("HadTTL1ContainerName", flags.Overlay.BkgPrefix + "LArTTL1HAD")
401 acc.addEventAlgo(CompFactory.LArTTL1Maker(**kwargs))
402 if flags.GeoModel.Run >= LHCPeriod.Run3:
403 acc.merge(LArSCL1MakerCfg(flags))
404 if flags.Common.ProductionStep is not ProductionStep.PileUpPresampling:
405 from LArROD.LArSuperCellBuilderConfig import LArSuperCellBuilderAlgCfg, LArSuperCellBCIDAlgCfg
406 acc.merge(LArSuperCellBuilderAlgCfg(flags))
407 acc.merge(LArSuperCellBCIDAlgCfg(flags))
408 return acc
409
410
411def LArTriggerDigitizationCfg(flags, **kwargs):
412 """Return ComponentAccumulator for LAr Trigger Tower and Output"""
413 acc = LArTriggerDigitizationBasicCfg(flags)
414 acc.merge(LArOutputCfg(flags))
415 acc.merge(OutputStreamCfg(flags, "RDO", ["LArTTL1Container#*"]))
416 if flags.GeoModel.Run >= LHCPeriod.Run3:
417 if flags.Common.ProductionStep == ProductionStep.PileUpPresampling:
418 acc.merge(OutputStreamCfg(flags, "RDO", ["LArDigitContainer#" + flags.Overlay.BkgPrefix + "LArDigitSCL2"]))
419 else:
420 acc.merge(OutputStreamCfg(flags, "RDO", ["CaloCellContainer#SCell"]))
421 return acc
422
423
424def LArOverlayTriggerDigitizationBasicCfg(flags, **kwargs):
425 """Return ComponentAccumulator with LAr Overlay Trigger Tower"""
426 acc = LArOverlayDigitizationBasicCfg(flags)
427 acc.merge(CaloTriggerTowerCfg(flags))
428
429 kwargs.setdefault("NoiseOnOff", flags.Digitization.DoCaloNoise)
430 kwargs.setdefault("RandomSeedOffset", flags.Digitization.RandomSeedOffset)
431 kwargs.setdefault("PileUp", True)
432 kwargs.setdefault("EmTTL1ContainerName", flags.Overlay.SigPrefix + "LArTTL1EM")
433 kwargs.setdefault("HadTTL1ContainerName", flags.Overlay.SigPrefix + "LArTTL1HAD")
434
435 if flags.Concurrency.NumThreads > 0:
436 kwargs.setdefault('Cardinality', flags.Concurrency.NumThreads)
437
438 acc.addEventAlgo(CompFactory.LArTTL1Maker(**kwargs))
439 return acc
440
441
442def LArSuperCellOverlayCfg(flags, **kwargs):
443 acc = LArSCL1MakerCfg(flags)
444 from LArROD.LArSuperCellBuilderConfig import LArSuperCellBuilderAlgCfg, LArSuperCellBCIDAlgCfg
445 acc.merge(LArSuperCellBuilderAlgCfg(flags))
446 acc.merge(LArSuperCellBCIDAlgCfg(flags))
447 acc.merge(OutputStreamCfg(flags, "RDO", ["CaloCellContainer#SCell"]))
448 return acc
LArRangeEMCfg(flags, name="LArRangeEM", **kwargs)