158 ATH_MSG_DEBUG(
"===> start " << name() <<
"::fillHistograms() <=== ");
166 return StatusCode::SUCCESS;
169 const bool is_atlas_ready = std::all_of(
172 [&ctx](
auto &f) { return f->accept(ctx); });
175 int bcid{0}, lumi_block{0};
176 bool larNoisyROAlg_flag{
false};
177 bool larNoisyROAlgInTimeW_flag{
false};
178 bool larNoisyROAlg_W_flag{
false};
179 bool noisy_event{
false};
181 auto checkEventFlag = [&](
auto bitinfo,
const char *txt) {
182 bool flag = event_info->isEventFlagBitSet(
184 if (flag)
ATH_MSG_DEBUG(
" !!! Noisy event found " << txt <<
" !!!");
186 larNoisyROAlg_flag = checkEventFlag(
188 larNoisyROAlg_W_flag = checkEventFlag(
190 larNoisyROAlgInTimeW_flag = checkEventFlag(
191 3,
"by LArNoisyROAlg in Time window of 500ms");
192 bcid = event_info->bcid();
193 lumi_block = event_info->lumiBlock();
195 const auto &
tags = event_info->streamTags();
198 || std::any_of(
tags.begin(),
tags.end(), inSet);
203 std::array<uint32_t, ::NDETECTORS> det_n_noisy_channels{};
204 std::array<uint32_t, ::NDETECTORS> det_n_noisy_channels_Neg{};
205 std::array<uint32_t, ::NDETECTORS> det_n_badQ_channels{};
206 using wsum_t = std::complex<double>;
207 wsum_t event_mean_time{};
208 std::array<wsum_t, ::NDETECTORS> mean_detector_times{};
210 std::array<double, ::NDETECTORS> per_detector_total_energy{};
211 int8_t lastdet{::UNDEF};
212 ToolHandle<GenericMonitoringTool> monitoring{
nullptr};
236 int slot_number{-1}, feedthrough_number{-1};
238 float energy, time, noise, significance;
243 if (!cablingH->isOnlineConnected(hardware_id))
continue;
245 if (
m_bcMask.cellShouldBeMasked(*bcContH, hardware_id))
continue;
260 if (det != lastdet) {
261 if (det >= 0 && det < ::NDETECTORS) {
264 monitoring =
nullptr;
272 energy = chan.energy() * Athena::Units::MeV;
273 time = chan.time() * Athena::Units::picosecond;
275 noise = noiseH->getNoise(offline_id, gain);
276 significance = energy / noise;
277 bad_quality = (energy > 0.1 * Athena::Units::MeV)
283 catch (
const std::out_of_range &err) {
292 if ( det <0 or det >= NDETECTORS)[[
unlikely]]{
293 ATH_MSG_WARNING(std::format(
"Subdetector index {} out of range of the arrays.", det));
300 per_detector_total_energy[det] += energy;
301 det_n_noisy_channels[det] += noisy_pos;
302 det_n_noisy_channels_Neg[det] += noisy_neg;
303 det_n_badQ_channels[det] += bad_quality;
304 dqm_superslot = feedthrough_number * ::numberOfSlotsPerFeedthrough(det)
306 dqm_channel = channel;
309 && is_atlas_ready && !larNoisyROAlgInTimeW_flag;
312 dqm_posn = 100 * (noisy_event && !larNoisyROAlgInTimeW_flag
313 && noisy_pos && is_atlas_ready);
314 dqm_negn = 100 * (noisy_event && !larNoisyROAlgInTimeW_flag
315 && noisy_neg && is_atlas_ready);
316 dqm_qual = 100 * (bad_quality && is_atlas_ready
317 && !larNoisyROAlgInTimeW_flag);
318 fill(monitoring, dqm_superslot, dqm_channel,
319 dqmf_occ, dqmf_sig, dqm_energy, dqm_gain,
320 dqm_posn, dqm_negn, dqm_qual);
326 if (significance != 0.) {
327 double weight = 1. + 900. / std::pow(significance, 2);
330 wsum_t datapoint{weight * (double(time) + 1i)};
331 event_mean_time += datapoint;
332 mean_detector_times[det] += datapoint;
333 mean_feb_times[feb_hash] += datapoint;
351 "quietITW", !larNoisyROAlgInTimeW_flag};
352 for (int8_t det : ::partitions()) {
354 float percent_noisy = scaling * det_n_noisy_channels[det];
355 float percent_bad_quality = scaling * det_n_badQ_channels[det];
357 dqmf_burst_timevetoed = dqmf_burst && !larNoisyROAlgInTimeW_flag;
358 dqm_percent_noisy = percent_noisy;
359 dqm_percent_neg_noisy = scaling * det_n_noisy_channels_Neg[det];
360 dqm_qnChan = det_n_badQ_channels[det];
362 dqm_total_energy = per_detector_total_energy[det];
366 dqm_percent_noisy, dqm_percent_neg_noisy,
367 dqmf_noNoisyRO, dqmf_noNoisyRO_W, dqmf_noNoisyRO_ITW,
368 dqmf_burst, dqmf_burst_timevetoed, dqmf_qburst,
373 dqmf_noNoisyRO_W, dqm_total_energy);
380 double t{event_mean_time.real() / event_mean_time.imag()};
381 for (uint32_t
h = 0;
h < mean_feb_times.size(); ++
h) {
382 wsum_t w{mean_feb_times[
h]};
383 if (w.imag() == 0.)
continue;
385 double t_feb = w.real() / w.imag();
386 dqm_time = (t_feb - t) / Athena::Units::nanosecond;
391 return StatusCode::SUCCESS;