187 std::string trace_buf{};
188 auto trace = std::back_inserter(trace_buf);
190 const auto& evtID = ctx.eventID();
197 std::unique_ptr<const xAOD::EventInfo> hsEvt =
nullptr;
198 std::unique_ptr<xAOD::EventAuxInfo> hsEvtAux =
nullptr;
204 std::make_unique<xAOD::EventAuxInfo>()));
205 *overlaidEvt = *hsEvt;
207 overlaidEvt->clearSubEvents();
211 overlaidEvt->setRunNumber(evtID.run_number());
212 overlaidEvt->setLumiBlock(evtID.lumi_block());
213 overlaidEvt->setEventNumber(evtID.event_number());
214 overlaidEvt->setBCID(evtID.bunch_crossing_id());
215 overlaidEvt->setTimeStamp(evtID.time_stamp());
216 overlaidEvt->setTimeStampNSOffset(evtID.time_stamp_ns_offset());
219 if (!beamSpotHandle.
isValid()) {
221 return StatusCode::FAILURE;
224 overlaidEvt->setBeamPos(beamSpotHandle->beamPos()[
Amg::x],
225 beamSpotHandle->beamPos()[
Amg::y],
226 beamSpotHandle->beamPos()[
Amg::z]);
227 overlaidEvt->setBeamPosSigma(beamSpotHandle->beamSigma(0),
228 beamSpotHandle->beamSigma(1),
229 beamSpotHandle->beamSigma(2));
230 overlaidEvt->setBeamPosSigmaXY(beamSpotHandle->beamSigmaXY());
231 overlaidEvt->setBeamTiltXZ(beamSpotHandle->beamTilt(0));
232 overlaidEvt->setBeamTiltYZ(beamSpotHandle->beamTilt(1));
233 overlaidEvt->setBeamStatus(beamSpotHandle->beamStatus());
238 std::make_unique<xAOD::EventInfoAuxContainer>()));
242 overlaidEvt->setBCID(
m_beamInt->getCurrentT0BunchCrossing());
245 overlaidEvt->setEventTypeBitmask(hsEvt->eventTypeBitmask() |
249 bool sf_updated =
false;
250 float lumi_sf =
m_beamLumi->scaleFactor(evtID.run_number(),
251 evtID.lumi_block(), sf_updated);
252 float cur_avg_mu = lumi_sf *
m_avgMu;
253 overlaidEvt->setAverageInteractionsPerCrossing(cur_avg_mu);
254 overlaidEvt->setActualInteractionsPerCrossing(
m_beamInt->normFactor(0) *
259 std::format_to(trace,
260 "Idx: {} Run: {} LB: {} EVT: {} "
262 ctx.evt(), evtID.run_number(), evtID.lumi_block(),
267 [
this](
int bc) {
return int(
m_beamInt->normFactor(bc)); }) |
268#
if RANGE_V3_VERSION >= 1200
269 rv::chunk_by(std::equal_to{}) |
271 rv::group_by(std::equal_to{}) |
273 rv::transform([](
const auto& rng) {
274 return std::format(
"{}{}", rng.size(), rng[0] == 0 ?
'E' :
'F');
276 ranges::to<std::vector<std::string>>;
278 std::string joined_pattern;
279 for (
size_t i = 0; i < bunch_pattern.size(); ++i) {
280 joined_pattern += bunch_pattern[i];
281 if (i + 1 < bunch_pattern.size()) {
282 joined_pattern +=
" ";
286 std::format_to(trace,
287 "mu = {}, central BCID = {}, bunch pattern = [{}]\n",
288 cur_avg_mu,
m_beamInt->getCurrentT0BunchCrossing(),
292 if (!hsEvt->subEvents().empty()) {
293 for (
const SubEvent& se : hsEvt->subEvents()) {
320 std::uint32_t central_bcid = overlaidEvt->bcid();
321 std::vector<std::uint32_t> bcid{};
325 bcid.push_back(
get_BCID(bc, central_bcid));
335 std::uint64_t low_pt_count = 0;
336 std::uint64_t high_pt_count = 0;
337 std::uint64_t cavern_count = 0;
338 std::uint64_t beam_halo_count = 0;
339 std::uint64_t beam_gas_count = 0;
340 auto now = std::chrono::high_resolution_clock::now();
346 std::vector<std::uint64_t> subevts_vec{};
349 std::format_to(trace,
"\tBC {:03} : LOW PT {} ", bc,
352 for (std::size_t i = 0; i <
m_lowptMBSvc->getNumForBunch(ctx, bc); ++i) {
354 PUType::MinimumBias, bc, ctx, low_pt_count,
361 std::format_to(trace,
"HIGH PT {} | ",
364 for (std::size_t i = 0; i <
m_highptMBSvc->getNumForBunch(ctx, bc); ++i) {
366 PUType::HighPtMinimumBias, bc, ctx, high_pt_count,
373 std::format_to(trace,
"CAVERN {} | ",
376 for (std::size_t i = 0; i <
m_cavernMBSvc->getNumForBunch(ctx, bc); ++i) {
378 PUType::Cavern, bc, ctx, cavern_count,
385 std::format_to(trace,
"BEAM HALO {} | ",
391 PUType::HaloGas, bc, ctx, beam_halo_count,
398 std::format_to(trace,
"BEAM GAS {} | ",
401 for (std::size_t i = 0; i <
m_beamgasMBSvc->getNumForBunch(ctx, bc);
404 PUType::HaloGas, bc, ctx, beam_gas_count,
410 std::format_to(trace,
"TOTAL {} | HASH {:08X}\n", subevts_vec.size(),
415 std::format_to(trace,
"\n");
416 m_pileupTrace.print(trace_buf);
421 ATH_CHECK(tool->processAllSubEvents(ctx));
422 }
catch (
const std::exception& e) {
423 ATH_MSG_ERROR(
"Caught exception running " << tool.name() <<
": "
425 return StatusCode::FAILURE;
428 if (!tool->filterPassed()) {
432 ATH_MSG_DEBUG(std::format(
"***** Took {:%OMm %OSs} to process all subevents",
433 std::chrono::high_resolution_clock::now() - now));
443 overlaidEvt->setPileUpMixtureID(
445 ATH_MSG_DEBUG(
"PileUpMixtureID = " << overlaidEvt->pileUpMixtureID());
463 return StatusCode::SUCCESS;