141 {
143 << ", lumi " << ctx.eventID().lumi_block()
144 << ", event " << ctx.eventID().event_number()
145 << "| hs_id " << hs_id);
147
149 num_mb_by_bunch.clear();
150 num_mb_by_bunch.resize(n_bunches);
151 FastReseededPRNG prng{
m_seed.value(), hs_id};
152
153
154 bool sf_updated_throwaway;
155 const float beam_lumi_sf =
157 ctx.eventID().lumi_block(),
158 sf_updated_throwaway)
159 : 1.F;
160 const float beam_lumi = beam_lumi_sf *
m_nPerBunch.value();
161 std::vector<float> avg_num_mb_by_bunch(n_bunches, beam_lumi);
162
164
165
170 avg_num_mb_by_bunch[
idx] *=
m_beamInt->normFactor(bunch);
171 }
172 }
173
175 std::transform(avg_num_mb_by_bunch.begin(), avg_num_mb_by_bunch.end(),
176 num_mb_by_bunch.begin(), [&prng](float avg) {
177 return std::poisson_distribution<std::uint64_t>(avg)(prng);
178 });
179 } else {
180 std::transform(avg_num_mb_by_bunch.begin(), avg_num_mb_by_bunch.end(),
181 num_mb_by_bunch.begin(), [](float f) {
182 return static_cast<std::uint64_t>(std::round(f));
183 });
184 }
185
186 std::uint64_t num_mb = std::accumulate(num_mb_by_bunch.begin(), num_mb_by_bunch.end(), std::uint64_t{0});
187 if (!ctx.valid()) {
188 return num_mb;
189 }
190
191
192 std::vector<std::uint64_t>& index_array = *
m_idx_lists.get(ctx);
193 index_array.clear();
194 index_array.resize(num_mb);
195 std::iota(index_array.begin(), index_array.end(), 0);
196
197
198
199
200
201
202
203 return num_mb;
204}
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