150def PileUpMTAlgCfg(flags, **kwargs):
151 from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
152 acc = ComponentAccumulator()
153 acc.addService(CompFactory.SkipEventIdxSvc("SkipEventIdxSvc"))
154 kwargs.setdefault("Cardinality", flags.Concurrency.NumThreads)
155
156 assert (
157 not flags.Digitization.DoXingByXingPileUp
158 ), "PileUpMTAlg does not support XingByXing pile-up!"
159 acc.merge(BeamSpotCondAlgCfg(flags))
160
161
162
163 if flags.Digitization.PU.BeamIntensityPattern:
164 if flags.Digitization.PU.SignalPatternForSteppingCache:
165
166 acc.merge(StepArrayBMCfg(flags))
167 kwargs.setdefault("BeamIntSvc", acc.getService("StepArrayBM"))
168 elif flags.Digitization.PU.FixedT0BunchCrossing:
169
170 acc.merge(FixedArrayBMCfg(flags))
171 kwargs.setdefault("BeamIntSvc", acc.getService("FixedArrayBM"))
172 else:
173
174 acc.merge(ArrayBMCfg(flags))
175 kwargs.setdefault("BeamIntSvc", acc.getService("ArrayBM"))
176
177 kwargs.setdefault("SkippedHSEvents", flags.Exec.SkipEvents)
178 kwargs.setdefault("BCSpacing", flags.Digitization.PU.BunchSpacing)
179 kwargs.setdefault("EarliestDeltaBC", flags.Digitization.PU.InitialBunchCrossing)
180 kwargs.setdefault("LatestDeltaBC", flags.Digitization.PU.FinalBunchCrossing)
181 if flags.Input.RunAndLumiOverrideList:
182 acc.merge(LumiProfileSvcCfg(flags))
183 kwargs.setdefault("BeamLumiSvc", acc.getService("LumiProfileSvc"))
184 kwargs.setdefault("AverageMu", maxNevtsPerXing(flags))
185 else:
186 acc.merge(NoProfileSvcCfg(flags))
187 kwargs.setdefault("BeamLumiSvc", acc.getService("NoProfileSvc"))
188 kwargs.setdefault("AverageMu", flags.Digitization.PU.NumberOfCollisions)
189
190
191 assert not flags.Input.SecondaryFiles, (
192 "Found ConfigFlags.Input.SecondaryFiles = %r; "
193 "double event selection is not supported "
194 "by PileUpMTAlg" % (not flags.Input.SecondaryFiles)
195 )
196 acc.merge(HSInputRenameCfg())
197 acc.merge(PoolReadCfg(flags))
198
199 mbKwargs = {
200 k: kwargs[k]
201 for k in (
202 "SkippedHSEvents",
203 "EarliestDeltaBC",
204 "LatestDeltaBC",
205 "BeamIntSvc",
206 "BeamLumiSvc",
207 )
208 }
209 if flags.Digitization.PU.LowPtMinBiasInputCols:
210 svc = acc.getPrimaryAndMerge(
211 BatchedMinbiasSvcCfg(
212 flags, name="LowPtMinBiasSvc", kind=PUBkgKind.LOWPT, **mbKwargs
213 )
214 )
215 kwargs.setdefault("LowPtMinbiasSvc", svc)
216 kwargs.setdefault(
217 "FracLowPt",
218 flags.Digitization.PU.NumberOfLowPtMinBias
219 / flags.Digitization.PU.NumberOfCollisions,
220 )
221 if flags.Digitization.PU.HighPtMinBiasInputCols:
222 svc = acc.getPrimaryAndMerge(
223 BatchedMinbiasSvcCfg(
224 flags, name="HighPtMinBiasSvc", kind=PUBkgKind.HIGHPT, **mbKwargs
225 )
226 )
227 kwargs.setdefault("HighPtMinbiasSvc", svc)
228 kwargs.setdefault(
229 "FracHighPt",
230 flags.Digitization.PU.NumberOfHighPtMinBias
231 / flags.Digitization.PU.NumberOfCollisions,
232 )
233 if flags.Digitization.PU.CavernInputCols:
234 svc = acc.getPrimaryAndMerge(
235 BatchedMinbiasSvcCfg(
236 flags, name="CavernMinBiasSvc", kind=PUBkgKind.CAVERN, **mbKwargs
237 )
238 )
239 kwargs.setdefault("CavernMinbiasSvc", svc)
240 kwargs.setdefault("NumCavern", flags.Digitization.PU.NumberOfCavern)
241 if flags.Digitization.PU.BeamGasInputCols:
242 svc = acc.getPrimaryAndMerge(
243 BatchedMinbiasSvcCfg(
244 flags, name="BeamGasMinBiasSvc", kind=PUBkgKind.BEAMGAS, **mbKwargs
245 )
246 )
247 kwargs.setdefault("BeamGasMinbiasSvc", svc)
248 kwargs.setdefault("NumBeamGas", flags.Digitization.PU.NumberOfBeamGas)
249 if flags.Digitization.PU.BeamHaloInputCols:
250 svc = acc.getPrimaryAndMerge(
251 BatchedMinbiasSvcCfg(
252 flags, name="BeamHaloMinBiasSvc", kind=PUBkgKind.BEAMHALO, **mbKwargs
253 )
254 )
255 kwargs.setdefault("BeamHaloMinbiasSvc", svc)
256 kwargs.setdefault("NumBeamHalo", flags.Digitization.PU.NumberOfBeamHalo)
257 presampling = flags.Common.ProductionStep == ProductionStep.PileUpPresampling
258 if presampling:
259 kwargs.setdefault("EventInfoKey", flags.Overlay.BkgPrefix + "EventInfo")
260 else:
261 kwargs.setdefault("EventInfoKey", "EventInfo")
262
263 acc.addEventAlgo(
264 CompFactory.PileUpMTAlg(flags.Digitization.DigiSteeringConf, **kwargs)
265 )
266
267
268 if flags.Output.doWriteRDO:
269 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
270
271 acc.merge(
272 OutputStreamCfg(
273 flags,
274 "RDO",
275 ItemList=[
276 "xAOD::EventInfoContainer#PileUpEventInfo",
277 "xAOD::EventInfoAuxContainer#PileUpEventInfo*",
278 ],
279 )
280 )
281
282 return acc