ATLAS Offline Software
Loading...
Searching...
No Matches
PileUpConfig.py
Go to the documentation of this file.
1"""ComponentAccumulator confguration for pileup digitization
2
3Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
4"""
5from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
6from AthenaConfiguration.ComponentFactory import CompFactory
7from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
8from RngComps.RngCompsConfig import dSFMT, AthRNGSvcCfg
9from DigitizationConfig import PileUpEventType
10from DigitizationConfig.RunDependentConfig import (
11 maxNevtsPerXing,
12 LumiProfileSvcCfg, NoProfileSvcCfg,
13)
14from BeamEffects.BeamEffectsAlgConfig import BeamSpotFixerAlgCfg
15
16
18 """Local wrapper for dSFMT RNG service"""
19 seedOffset = " OFFSET 340 123 345"
20 if name=="PileUpCollXingStream":
21 seedOffset = " OFFSET 340 123 345"
22 if name=="BEAMINT":
23 seedOffset = " OFFSET 340 678 91011"
24 return dSFMT(name + seedOffset)
25
26
27def StepArrayBMCfg(flags, name="StepArrayBM", **kwargs):
28 acc = ComponentAccumulator()
29 kwargs.setdefault("IntensityPattern", flags.Digitization.PU.BeamIntensityPattern)
30 kwargs.setdefault("SignalPattern", flags.Digitization.PU.SignalPatternForSteppingCache)
31 acc.addService(CompFactory.StepArrayBM(name, **kwargs), primary=True)
32 return acc
33
34
35def FixedArrayBMCfg(flags, name="FixedArrayBM", **kwargs):
36 acc = ComponentAccumulator()
37 kwargs.setdefault("IntensityPattern", flags.Digitization.PU.BeamIntensityPattern)
38 kwargs.setdefault("T0Offset", flags.Digitization.PU.FixedT0BunchCrossing)
39 acc.addService(CompFactory.FixedArrayBM(name, **kwargs), primary=True)
40 return acc
41
42
43def ArrayBMCfg(flags, name="ArrayBM", **kwargs):
44 acc = ComponentAccumulator()
45 kwargs.setdefault("IntensityPattern", flags.Digitization.PU.BeamIntensityPattern)
46 kwargs.setdefault("RandomSvc", acc.getPrimaryAndMerge(AthRNGSvcCfg(flags)))
47 acc.addService(CompFactory.ArrayBM(name, **kwargs), primary=True)
48 return acc
49
50
51def GenericBackgroundEventSelectorCfg(flags, name="GenericBackgroundEventSelector", **kwargs):
52 acc = ComponentAccumulator()
53 kwargs.setdefault("KeepInputFilesOpen", True)
54 kwargs.setdefault("ProcessMetadata", False)
55 acc.addService(CompFactory.EventSelectorAthenaPool(name, **kwargs), primary=True)
56 return acc
57
58
59def LowPtMinBiasEventSelectorCfg(flags, name="LowPtMinBiasEventSelector", **kwargs):
60 kwargs.setdefault("InputCollections", flags.Digitization.PU.LowPtMinBiasInputCols)
61 return GenericBackgroundEventSelectorCfg(flags, name, **kwargs)
62
63
64def HighPtMinBiasEventSelectorCfg(flags, name="HighPtMinBiasEventSelector", **kwargs):
65 kwargs.setdefault("InputCollections", flags.Digitization.PU.HighPtMinBiasInputCols)
66 kwargs.setdefault('SkipEvents', flags.Digitization.PU.HighPtMinBiasInputColOffset)
67 return GenericBackgroundEventSelectorCfg(flags, name, **kwargs)
68
69
70def CavernEventSelectorCfg(flags, name="cavernEventSelector", **kwargs):
71 kwargs.setdefault("InputCollections", flags.Digitization.PU.CavernInputCols)
72 return GenericBackgroundEventSelectorCfg(flags, name, **kwargs)
73
74
75def BeamGasEventSelectorCfg(flags, name="BeamGasEventSelector", **kwargs):
76 kwargs.setdefault("InputCollections", flags.Digitization.PU.BeamGasInputCols)
77 return GenericBackgroundEventSelectorCfg(flags, name, **kwargs)
78
79
80def BeamHaloEventSelectorCfg(flags, name="BeamHaloEventSelector", **kwargs):
81 kwargs.setdefault("InputCollections", flags.Digitization.PU.BeamHaloInputCols)
82 return GenericBackgroundEventSelectorCfg(flags, name, **kwargs)
83
84
85def MinBiasCacheCfg(flags, name="MinBiasCache", **kwargs):
86 acc = ComponentAccumulator()
87 kwargs.setdefault("CollPerXing", flags.Digitization.PU.NumberOfLowPtMinBias + flags.Digitization.PU.NumberOfHighPtMinBias)
88 kwargs.setdefault("FractionOfCache1Collisions", (flags.Digitization.PU.NumberOfLowPtMinBias/
89 (flags.Digitization.PU.NumberOfLowPtMinBias + flags.Digitization.PU.NumberOfHighPtMinBias)))
90 # may need to have a separate type in the future
91 kwargs.setdefault("PileUpEventType", PileUpEventType.MinimumBias)
92 if flags.Digitization.DoXingByXingPileUp or flags.Digitization.PU.SignalPatternForSteppingCache:
93 kwargs.setdefault("Cache1ReadDownscaleFactor", 1)
94 kwargs.setdefault("Cache1EventSelector", acc.getPrimaryAndMerge(LowPtMinBiasEventSelectorCfg(flags)))
95 kwargs.setdefault("Cache2ReadDownscaleFactor", 1)
96 kwargs.setdefault("Cache2EventSelector", acc.getPrimaryAndMerge(HighPtMinBiasEventSelectorCfg(flags)))
97
98 kwargs.setdefault("OccupationFraction", (float(flags.Digitization.PU.BunchSpacing)/
99 float(flags.Beam.BunchSpacing)))
100
101 RndmStreamName = "PileUpCollXingStream"
102 acc.merge(PileUpConfigdSFMT(RndmStreamName))
103 kwargs.setdefault("RndmGenSvc", acc.getService("AtDSFMTGenSvc"))
104 kwargs.setdefault("RndmStreamName", RndmStreamName)
105
106 # FIXME migrated, but SplitBkgStreamsCache does not exist
107 acc.setPrivateTools(CompFactory.SplitBkgStreamsCache(name, **kwargs))
108 return acc
109
110
111def LowPtMinBiasCacheCfg(flags, name="LowPtMinBiasCache", **kwargs):
112 acc = ComponentAccumulator()
113 kwargs.setdefault("CollPerXing", flags.Digitization.PU.NumberOfLowPtMinBias)
114 # may need to have a separate type in the future
115 kwargs.setdefault("PileUpEventType", PileUpEventType.MinimumBias)
116 if flags.Digitization.DoXingByXingPileUp or flags.Digitization.PU.SignalPatternForSteppingCache:
117 kwargs.setdefault("ReadDownscaleFactor", 1)
118 kwargs.setdefault("EventSelector", acc.getPrimaryAndMerge(LowPtMinBiasEventSelectorCfg(flags)))
119 kwargs.setdefault("OccupationFraction", (float(flags.Digitization.PU.BunchSpacing)/
120 float(flags.Beam.BunchSpacing)))
121
122 RndmStreamName = "PileUpCollXingStream"
123 acc.merge(PileUpConfigdSFMT(RndmStreamName))
124 kwargs.setdefault("RndmGenSvc", acc.getService("AtDSFMTGenSvc"))
125 kwargs.setdefault("RndmStreamName", RndmStreamName)
126
127 # Use BkgStreamsStepCaches when using the StepArrayBM and BkgStreamsCache otherwise
128 if flags.Digitization.PU.SignalPatternForSteppingCache:
129 # FIXME migrated, but BkgStreamsStepCache does not exist
130 tool = CompFactory.BkgStreamsStepCache(name, **kwargs)
131 else:
132 tool = CompFactory.BkgStreamsCache(name, **kwargs)
133
134 acc.setPrivateTools(tool)
135 return acc
136
137
138def HighPtMinBiasCacheCfg(flags, name="HighPtMinBiasCache", **kwargs):
139 acc = ComponentAccumulator()
140 kwargs.setdefault("CollPerXing", flags.Digitization.PU.NumberOfHighPtMinBias)
141 # may need to have a separate type in the future
142 kwargs.setdefault("PileUpEventType", PileUpEventType.HighPtMinimumBias)
143 kwargs.setdefault("ReadDownscaleFactor", 1)
144 kwargs.setdefault("EventSelector", acc.getPrimaryAndMerge(HighPtMinBiasEventSelectorCfg(flags)))
145 kwargs.setdefault("OccupationFraction", (float(flags.Digitization.PU.BunchSpacing)/
146 float(flags.Beam.BunchSpacing)))
147
148 RndmStreamName = "PileUpCollXingStream"
149 acc.merge(PileUpConfigdSFMT(RndmStreamName))
150 kwargs.setdefault("RndmGenSvc", acc.getService("AtDSFMTGenSvc"))
151 kwargs.setdefault("RndmStreamName", RndmStreamName)
152
153 # Use BkgStreamsStepCaches when using the StepArrayBM and BkgStreamsCache otherwise
154 if flags.Digitization.PU.SignalPatternForSteppingCache:
155 # FIXME migrated, but BkgStreamsStepCache does not exist
156 tool = CompFactory.BkgStreamsStepCache(name, **kwargs)
157 else:
158 tool = CompFactory.BkgStreamsCache(name, **kwargs)
159
160 acc.setPrivateTools(tool)
161 return acc
162
163
164def CavernCacheCfg(flags, name="CavernCache", **kwargs):
165 acc = ComponentAccumulator()
166 kwargs.setdefault("CollPerXing", flags.Digitization.PU.NumberOfCavern)
167 kwargs.setdefault("CollDistribution", "Fixed")
168 kwargs.setdefault("PileUpEventType", PileUpEventType.Cavern)
169 if flags.Digitization.DoXingByXingPileUp or flags.Digitization.PU.SignalPatternForSteppingCache:
170 kwargs.setdefault("ReadDownscaleFactor", 1)
171 # Cavern Background Cache Should Ignore Bunch Structure
172 OccupationFraction = (float(flags.Digitization.PU.BunchSpacing)/
173 float(flags.Beam.BunchSpacing))
174 if flags.Digitization.PU.BeamIntensityPattern:
175 kwargs.setdefault("IgnoreBeamInt", flags.Digitization.PU.CavernIgnoresBeamInt)
176 if flags.Digitization.PU.CavernIgnoresBeamInt:
177 OccupationFraction = 1.0
178 kwargs.setdefault("OccupationFraction", OccupationFraction)
179 kwargs.setdefault("EventSelector", acc.getPrimaryAndMerge(CavernEventSelectorCfg(flags)))
180
181 RndmStreamName = "PileUpCollXingStream"
182 acc.merge(PileUpConfigdSFMT(RndmStreamName))
183 kwargs.setdefault("RndmGenSvc", acc.getService("AtDSFMTGenSvc"))
184 kwargs.setdefault("RndmStreamName", RndmStreamName)
185
186 # Use BkgStreamsStepCaches when using the StepArrayBM and BkgStreamsCache otherwise
187 if flags.Digitization.PU.SignalPatternForSteppingCache:
188 # FIXME migrated, but BkgStreamsStepCache does not exist
189 tool = CompFactory.BkgStreamsStepCache(name, **kwargs)
190 else:
191 tool = CompFactory.BkgStreamsCache(name, **kwargs)
192 acc.setPrivateTools(tool)
193 return acc
194
195
196def BeamGasCacheCfg(flags, name="BeamGasCache", **kwargs):
197 acc = ComponentAccumulator()
198 kwargs.setdefault("IgnoreBeamLumi", True)
199 kwargs.setdefault("CollPerXing", flags.Digitization.PU.NumberOfBeamGas)
200 kwargs.setdefault("PileUpEventType", PileUpEventType.HaloGas)
201 kwargs.setdefault("CollDistribution", "Poisson")
202 kwargs.setdefault("ReadDownscaleFactor", 1)
203
204 kwargs.setdefault("EventSelector", acc.getPrimaryAndMerge(BeamGasEventSelectorCfg(flags)))
205
206 RndmStreamName = "PileUpCollXingStream"
207 acc.merge(PileUpConfigdSFMT(RndmStreamName))
208 kwargs.setdefault("RndmGenSvc", acc.getService("AtDSFMTGenSvc"))
209 kwargs.setdefault("RndmStreamName", RndmStreamName)
210
211 # Use BkgStreamsStepCaches when using the StepArrayBM and BkgStreamsCache otherwise
212 if flags.Digitization.PU.SignalPatternForSteppingCache:
213 # FIXME migrated, but BkgStreamsStepCache does not exist
214 tool = CompFactory.BkgStreamsStepCache(name, **kwargs)
215 else:
216 tool = CompFactory.BkgStreamsCache(name, **kwargs)
217
218 acc.setPrivateTools(tool)
219 return acc
220
221
222def BeamHaloCacheCfg(flags, name="BeamHaloCache", **kwargs):
223 acc = ComponentAccumulator()
224 kwargs.setdefault("IgnoreBeamLumi", True)
225 kwargs.setdefault("CollPerXing", flags.Digitization.PU.NumberOfBeamHalo)
226 kwargs.setdefault("PileUpEventType", PileUpEventType.HaloGas)
227 kwargs.setdefault("CollDistribution", "Poisson")
228 kwargs.setdefault("ReadDownscaleFactor", 1)
229
230 kwargs.setdefault("EventSelector", acc.getPrimaryAndMerge(BeamHaloEventSelectorCfg(flags)))
231
232 RndmStreamName = "PileUpCollXingStream"
233 acc.merge(PileUpConfigdSFMT(RndmStreamName))
234 kwargs.setdefault("RndmGenSvc", acc.getService("AtDSFMTGenSvc"))
235 kwargs.setdefault("RndmStreamName", RndmStreamName)
236
237 #Use BkgStreamsStepCaches when using the StepArrayBM and BkgStreamsCache otherwise
238 if flags.Digitization.PU.SignalPatternForSteppingCache:
239 # FIXME migrated, but BkgStreamsStepCache does not exist
240 tool = CompFactory.BkgStreamsStepCache(name, **kwargs)
241 else:
242 tool = CompFactory.BkgStreamsCache(name, **kwargs)
243
244 acc.setPrivateTools(tool)
245 return acc
246
247
248def PileUpEventLoopMgrCfg(flags, name="PileUpEventLoopMgr", **kwargs):
249 acc = BeamSpotFixerAlgCfg(flags) # Needed currently for running on 21.0 HITS
250
251 # SubDet By SubDet (default) or Xing By Xing Pile-up?
252 kwargs.setdefault("XingByXing", flags.Digitization.DoXingByXingPileUp)
253 # Bunch Structure
254 if flags.Digitization.PU.BeamIntensityPattern:
255 if flags.Digitization.PU.SignalPatternForSteppingCache:
256 # Simulate Bunch Structure with events sliding backwards on a conveyor belt
257 kwargs.setdefault("BeamInt", acc.getPrimaryAndMerge(StepArrayBMCfg(flags)))
258 elif flags.Digitization.PU.FixedT0BunchCrossing:
259 # Simulate Bunch Structure using a fixed point for the central bunch crossing
260 kwargs.setdefault("BeamInt", acc.getPrimaryAndMerge(FixedArrayBMCfg(flags)))
261 else:
262 # Simulate Bunch Structure and allow the central bunch crossing to vary
263 kwargs.setdefault("BeamInt", acc.getPrimaryAndMerge(ArrayBMCfg(flags)))
264
265 # define inputs
266 assert not flags.Input.SecondaryFiles, ("Found ConfigFlags.Input.SecondaryFiles = %r; "
267 "double event selection is not supported "
268 "by PileUpEventLoopMgr" % (not flags.Input.SecondaryFiles))
269 acc.merge(PoolReadCfg(flags))
270 kwargs.setdefault("OrigSelector", acc.getService("EventSelector"))
271 BackgroundCaches = []
272 # Note: experimentalDigi not migrated
273 if flags.Digitization.PU.LowPtMinBiasInputCols:
274 BackgroundCaches += [acc.popToolsAndMerge(LowPtMinBiasCacheCfg(flags))]
275 if flags.Digitization.PU.HighPtMinBiasInputCols:
276 BackgroundCaches += [acc.popToolsAndMerge(HighPtMinBiasCacheCfg(flags))]
277 if flags.Digitization.PU.CavernInputCols:
278 BackgroundCaches += [acc.popToolsAndMerge(CavernCacheCfg(flags))]
279 if flags.Digitization.PU.BeamGasInputCols:
280 BackgroundCaches += [acc.popToolsAndMerge(BeamGasCacheCfg(flags))]
281 if flags.Digitization.PU.BeamHaloInputCols:
282 BackgroundCaches += [acc.popToolsAndMerge(BeamHaloCacheCfg(flags))]
283 kwargs.setdefault("bkgCaches", BackgroundCaches)
284 # xing frequency in ns
285 kwargs.setdefault("XingFrequency", flags.Digitization.PU.BunchSpacing)
286 # define time range to be studied. t0 at t" ,0, xing" ,0
287 kwargs.setdefault("firstXing", flags.Digitization.PU.InitialBunchCrossing)
288 kwargs.setdefault("lastXing", flags.Digitization.PU.FinalBunchCrossing)
289
290 if flags.Input.RunAndLumiOverrideList:
291 kwargs.setdefault("MaxMinBiasCollPerXing", maxNevtsPerXing(flags))
292 kwargs.setdefault("BeamLuminosity", acc.getPrimaryAndMerge(LumiProfileSvcCfg(flags)))
293 else:
294 kwargs.setdefault("MaxMinBiasCollPerXing", flags.Digitization.PU.NumberOfCollisions)
295 kwargs.setdefault("BeamLuminosity", acc.getPrimaryAndMerge(NoProfileSvcCfg(flags)))
296
297 from AthenaKernel.EventIdOverrideConfig import EvtIdModifierSvcCfg
298 kwargs.setdefault("EvtIdModifierSvc", acc.getPrimaryAndMerge(EvtIdModifierSvcCfg(flags))) # TODO make configurable?
299 kwargs.setdefault("EventInfoName", "Input_EventInfo")
300 # Note that this is a hack. It is needed to fix beam spot information
301 # as original xAOD::EventInfo is created before conditions data could
302 # be read. Only the "EventInfoName" should change.
303
304 if flags.Input.MCChannelNumber > 0:
305 kwargs.setdefault("MCChannelNumber", flags.Input.MCChannelNumber)
306
307 # write PileUpEventInfo
308 if flags.Output.doWriteRDO:
309 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
310 acc.merge(OutputStreamCfg(flags, "RDO", ItemList=[
311 "xAOD::EventInfoContainer#PileUpEventInfo",
312 "xAOD::EventInfoAuxContainer#PileUpEventInfo*",
313 ]))
314
315 acc.addService(CompFactory.PileUpEventLoopMgr(name, **kwargs))
316 return acc
317
318
319def NoPileUpMuWriterCfg(flags, name="NoPileUpMuWriter", **kwargs):
320 """NoPileUpMuWriter configuration."""
321 acc = ComponentAccumulator()
322 acc.addEventAlgo(CompFactory.NoPileUpMuWriter(name, **kwargs))
323 return acc
CavernCacheCfg(flags, name="CavernCache", **kwargs)
CavernEventSelectorCfg(flags, name="cavernEventSelector", **kwargs)
BeamHaloEventSelectorCfg(flags, name="BeamHaloEventSelector", **kwargs)
ArrayBMCfg(flags, name="ArrayBM", **kwargs)
BeamGasEventSelectorCfg(flags, name="BeamGasEventSelector", **kwargs)
MinBiasCacheCfg(flags, name="MinBiasCache", **kwargs)
BeamGasCacheCfg(flags, name="BeamGasCache", **kwargs)
GenericBackgroundEventSelectorCfg(flags, name="GenericBackgroundEventSelector", **kwargs)
PileUpEventLoopMgrCfg(flags, name="PileUpEventLoopMgr", **kwargs)
NoPileUpMuWriterCfg(flags, name="NoPileUpMuWriter", **kwargs)
LowPtMinBiasEventSelectorCfg(flags, name="LowPtMinBiasEventSelector", **kwargs)
FixedArrayBMCfg(flags, name="FixedArrayBM", **kwargs)
HighPtMinBiasEventSelectorCfg(flags, name="HighPtMinBiasEventSelector", **kwargs)
BeamHaloCacheCfg(flags, name="BeamHaloCache", **kwargs)
StepArrayBMCfg(flags, name="StepArrayBM", **kwargs)
LowPtMinBiasCacheCfg(flags, name="LowPtMinBiasCache", **kwargs)
HighPtMinBiasCacheCfg(flags, name="HighPtMinBiasCache", **kwargs)