144 {
146 << ", lumi " << ctx.eventID().lumi_block()
147 << ", event " << ctx.eventID().event_number()
148 << "| hs_id " << hs_id);
150
152 num_mb_by_bunch.clear();
153 num_mb_by_bunch.resize(n_bunches);
154 FastReseededPRNG prng{
m_seed.value(), hs_id};
155
156
157 bool sf_updated_throwaway;
158 const float beam_lumi_sf =
160 ctx.eventID().lumi_block(),
161 sf_updated_throwaway)
162 : 1.F;
163 const float beam_lumi = beam_lumi_sf *
m_nPerBunch.value();
164 std::vector<float> avg_num_mb_by_bunch(n_bunches, beam_lumi);
165
167
168
173 avg_num_mb_by_bunch[
idx] *=
m_beamInt->normFactor(bunch);
174 }
175 }
176
178 std::transform(avg_num_mb_by_bunch.begin(), avg_num_mb_by_bunch.end(),
179 num_mb_by_bunch.begin(), [&prng](float avg) {
180 return std::poisson_distribution<std::uint64_t>(avg)(prng);
181 });
182 } else {
183 std::transform(avg_num_mb_by_bunch.begin(), avg_num_mb_by_bunch.end(),
184 num_mb_by_bunch.begin(), [](float f) {
185 return static_cast<std::uint64_t>(std::round(f));
186 });
187 }
188
189 std::uint64_t num_mb = ranges::accumulate(num_mb_by_bunch, 0UL);
190 if (!ctx.valid()) {
191 return num_mb;
192 }
193
194
195 std::vector<std::uint64_t>& index_array = *
m_idx_lists.get(ctx);
196 index_array.clear();
197 index_array.resize(num_mb);
198 std::iota(index_array.begin(), index_array.end(), 0);
199
200
201
202
203
204
205
206 return num_mb;
207}
Gaudi::Property< int > m_latestDeltaBC
Gaudi::Property< bool > m_useBeamLumi
SG::SlotSpecificObj< std::vector< std::uint64_t >, SG::InvalidSlot::Enabled > m_num_mb_by_bunch
SG::SlotSpecificObj< std::vector< std::uint64_t > > m_idx_lists
Gaudi::Property< bool > m_useBeamInt
Gaudi::Property< bool > m_usePoisson
Gaudi::Property< std::uint64_t > m_seed
ServiceHandle< IBeamIntensity > m_beamInt
Gaudi::Property< float > m_nPerBunch
ServiceHandle< IBeamLuminosity > m_beamLumi
Gaudi::Property< int > m_earliestDeltaBC