157 ATH_MSG_DEBUG(
"===> start " << name() <<
"::fillHistograms() <=== ");
165 return StatusCode::SUCCESS;
168 const bool is_atlas_ready = std::all_of(
171 [](
auto &
f) { return f->accept(); });
174 int bcid{0}, lumi_block{0};
175 bool larNoisyROAlg_flag{
false};
176 bool larNoisyROAlgInTimeW_flag{
false};
177 bool larNoisyROAlg_W_flag{
false};
178 bool noisy_event{
false};
180 auto checkEventFlag = [&](
auto bitinfo,
const char *txt) {
181 bool flag = event_info->isEventFlagBitSet(
183 if (flag)
ATH_MSG_DEBUG(
" !!! Noisy event found " << txt <<
" !!!");
185 larNoisyROAlg_flag = checkEventFlag(
187 larNoisyROAlg_W_flag = checkEventFlag(
189 larNoisyROAlgInTimeW_flag = checkEventFlag(
190 3,
"by LArNoisyROAlg in Time window of 500ms");
191 bcid = event_info->bcid();
192 lumi_block = event_info->lumiBlock();
194 const auto &
tags = event_info->streamTags();
197 || std::any_of(
tags.begin(),
tags.end(), inSet);
202 std::array<uint32_t, ::NDETECTORS> det_n_noisy_channels{};
203 std::array<uint32_t, ::NDETECTORS> det_n_noisy_channels_Neg{};
204 std::array<uint32_t, ::NDETECTORS> det_n_badQ_channels{};
205 using wsum_t = std::complex<double>;
206 wsum_t event_mean_time{};
207 std::array<wsum_t, ::NDETECTORS> mean_detector_times;
209 std::array<double, ::NDETECTORS> per_detector_total_energy{};
210 int8_t lastdet{::UNDEF};
211 ToolHandle<GenericMonitoringTool> monitoring{
nullptr};
235 int slot_number{-1}, feedthrough_number{-1};
237 float energy, time, noise, significance;
242 if (!cablingH->isOnlineConnected(hardware_id))
continue;
244 if (
m_bcMask.cellShouldBeMasked(*bcContH, hardware_id))
continue;
259 if (det != lastdet) {
260 if (det >= 0 && det < ::NDETECTORS) {
263 monitoring =
nullptr;
271 energy = chan.energy() * Athena::Units::MeV;
272 time = chan.time() * Athena::Units::picosecond;
274 noise = noiseH->getNoise(offline_id, gain);
275 significance = energy / noise;
276 bad_quality = (energy > 0.1 * Athena::Units::MeV)
282 catch (
const std::out_of_range &err) {
296 per_detector_total_energy[det] += energy;
297 det_n_noisy_channels[det] += noisy_pos;
298 det_n_noisy_channels_Neg[det] += noisy_neg;
299 det_n_badQ_channels[det] += bad_quality;
300 dqm_superslot = feedthrough_number * ::numberOfSlotsPerFeedthrough(det)
302 dqm_channel = channel;
305 && is_atlas_ready && !larNoisyROAlgInTimeW_flag;
308 dqm_posn = 100 * (noisy_event && !larNoisyROAlgInTimeW_flag
309 && noisy_pos && is_atlas_ready);
310 dqm_negn = 100 * (noisy_event && !larNoisyROAlgInTimeW_flag
311 && noisy_neg && is_atlas_ready);
312 dqm_qual = 100 * (bad_quality && is_atlas_ready
313 && !larNoisyROAlgInTimeW_flag);
314 fill(monitoring, dqm_superslot, dqm_channel,
315 dqmf_occ, dqmf_sig, dqm_energy, dqm_gain,
316 dqm_posn, dqm_negn, dqm_qual);
322 if (significance != 0.) {
323 double weight = 1. + 900. / std::pow(significance, 2);
326 wsum_t datapoint{weight * (double(time) + 1i)};
327 event_mean_time += datapoint;
328 mean_detector_times[det] += datapoint;
329 mean_feb_times[feb_hash] += datapoint;
347 "quietITW", !larNoisyROAlgInTimeW_flag};
348 for (int8_t det : ::partitions()) {
350 float percent_noisy = scaling * det_n_noisy_channels[det];
351 float percent_bad_quality = scaling * det_n_badQ_channels[det];
353 dqmf_burst_timevetoed = dqmf_burst && !larNoisyROAlgInTimeW_flag;
354 dqm_percent_noisy = percent_noisy;
355 dqm_percent_neg_noisy = scaling * det_n_noisy_channels_Neg[det];
356 dqm_qnChan = det_n_badQ_channels[det];
358 dqm_total_energy = per_detector_total_energy[det];
362 dqm_percent_noisy, dqm_percent_neg_noisy,
363 dqmf_noNoisyRO, dqmf_noNoisyRO_W, dqmf_noNoisyRO_ITW,
364 dqmf_burst, dqmf_burst_timevetoed, dqmf_qburst,
369 dqmf_noNoisyRO_W, dqm_total_energy);
376 double t{event_mean_time.real() / event_mean_time.imag()};
377 for (uint32_t
h = 0;
h < mean_feb_times.size(); ++
h) {
378 wsum_t w{mean_feb_times[
h]};
379 if (w.imag() == 0.)
continue;
381 double t_feb = w.real() / w.imag();
382 dqm_time = (t_feb - t) / Athena::Units::nanosecond;
387 return StatusCode::SUCCESS;