ATLAS Offline Software
Loading...
Searching...
No Matches
TileDigitsMonitorAlgorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
8
11
13
14 ATH_MSG_DEBUG("in initialize()");
15
16 // initialize superclass
18
19 ATH_CHECK( m_digitsContainerKey.initialize() );
22
23 m_ADCmaxMinusEpsilon = m_tileInfo->ADCmax() - 0.01;
24 if (m_tileInfo->ADCmax() == 4095) {
25 m_is12bit = true;
26 }
27
28 using Tile = TileCalibUtils;
29 using namespace Monitored;
30
31
34 Tile::MAX_ROS - 1, Tile::MAX_DRAWER,
35 Tile::MAX_GAIN);
36
38 Tile::MAX_ROS - 1, Tile::MAX_DRAWER,
39 Tile::MAX_GAIN);
40
42 Tile::MAX_ROS - 1, Tile::MAX_DRAWER,
43 Tile::MAX_GAIN);
44
46 Tile::MAX_ROS - 1, Tile::MAX_DRAWER);
47
49 Tile::MAX_ROS - 1, Tile::MAX_DRAWER);
50
51 }
52
54 m_meanSampleGroups = buildToolMap<int>(m_tools, "TileDigitsMeanSample", Tile::MAX_GAIN);
55 m_meanSampleProdGroups = buildToolMap<int>(m_tools, "TileDigitsMeanSampleProd", Tile::MAX_GAIN);
56 }
57
60 Tile::MAX_ROS - 1, Tile::MAX_DRAWER);
61 }
62
65 Tile::MAX_ROS - 1, Tile::MAX_DRAWER);
66 }
67
70 Tile::MAX_ROS - 1, Tile::MAX_DRAWER);
71 }
72
75 Tile::MAX_ROS - 1, Tile::MAX_DRAWER);
76 }
77
80 Tile::MAX_ROS - 1, Tile::MAX_DRAWER);
81 }
82
83 return StatusCode::SUCCESS;
84}
85
86
87StatusCode TileDigitsMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const {
88
89 using Tile = TileCalibUtils;
90
91 // In case you want to measure the execution time
92 auto timer = Monitored::Timer("TIME_execute");
93
94 std::vector<float> meanSample[Tile::MAX_GAIN];
95 std::vector<float> meanSampleChannel[Tile::MAX_GAIN];
96
97 std::vector<float> meanSampleProd[Tile::MAX_GAIN];
98 std::vector<float> meanSampleProdChannel1[Tile::MAX_GAIN];
99 std::vector<float> meanSampleProdChannel2[Tile::MAX_GAIN];
100
101 const TileDQstatus* dqStatus = SG::makeHandle (m_dqStatusKey, ctx).get();
102
103 // array of CIS parameters
104 const uint32_t* cispar = dqStatus->cispar();
105
107 ATH_CHECK( digitsContainer.isValid() );
108
109 for (const TileDigitsCollection* digitsCollection : *digitsContainer) {
110 if (digitsCollection->empty() ) continue;
111
112 HWIdentifier adc_id = digitsCollection->front()->adc_HWID();
113 int ros = m_tileHWID->ros(adc_id);
114 int drawer = m_tileHWID->drawer(adc_id);
115 unsigned int drawerIdx = TileCalibUtils::getDrawerIdx(ros, drawer);
116 int partition = ros - 1;
117
118 const std::vector<uint32_t>& headerWordsLow = digitsCollection->getFragChipHeaderWords();
119 const std::vector<uint32_t>& headerWordsHigh = digitsCollection->getFragChipHeaderWordsHigh();
120 std::vector<std::reference_wrapper<const std::vector<uint32_t>>> headerWordsAll{headerWordsLow};
121 if (headerWordsHigh.empty()) {
122 // For mono gain run fill the plots with the same info for high gain
123 headerWordsAll.push_back(headerWordsLow);
124 } else {
125 headerWordsAll.push_back(headerWordsHigh);
126 }
127
128 std::vector<std::vector<bool>> corruptedData(Tile::MAX_GAIN, std::vector<bool>(MAX_DMU));
129 uint32_t fragStatus = digitsCollection->getFragStatus();
130 if (checkCorruptedData(headerWordsAll, fragStatus, ros, drawer, corruptedData)) {
131 continue; // Dummy fragment or no fragment => nothing to check
132 }
133
135 uint32_t rodBCID = digitsCollection->getRODBCID();
136 checkBCID(headerWordsAll, rodBCID, ros, drawer);
137
138 bool isCalibMode = (dqStatus->calibMode() == 1);
139 if (isCalibMode) {
140 // global and DMU CRC check
141 int nDMU = headerWordsLow.size();
142 uint32_t crc32 = digitsCollection->getFragCRC();
143 uint32_t crcMask = digitsCollection->getFragDMUMask();
144 checkCRC(isCalibMode, crc32, crcMask, nDMU, ros, drawer);
145 }
146 }
147
148
149 // Below, the charge conversion for 12 bit is just an approximation;
150 // 4095. can be changed later to gain precision if needed.
151 double charge = 0;
152 if (m_is12bit) { // if 12 bit ADCs
153 charge = cispar[6] * cispar[7] * (2. * 4.096 / 4095.);
154 } else {
155 charge = cispar[6] * cispar[7] * (2. * 4.096 / 1023.);
156 }
157
158 const TileDigits* moduleDigits[Tile::MAX_CHAN][Tile::MAX_GAIN] = {{nullptr}};
159
160 for (const TileDigits* tile_digits : *digitsCollection) {
161
162 adc_id = tile_digits->adc_HWID();
163 int channel = m_tileHWID->channel(adc_id);
164 int adc = m_tileHWID->adc(adc_id);
165
166 if (corruptedData[adc][channel / 3]) {
167 continue;
168 }
169
170 moduleDigits[channel][adc] = tile_digits;
171
172 std::string channelGainSuffix = "_" + std::to_string(channel) + "_" + std::to_string(adc);
173
174 const std::vector<float>& digits = tile_digits->samples();
175 unsigned int nSamples = digits.size();
176
177 if (nSamples > 1) {
178
180 double pedestal = digits[0];
181
183 pedestal -= m_tileCondToolNoiseSample->getPed(drawerIdx, channel, adc, TileRawChannelUnit::ADCcounts, ctx);
184 }
185
186 auto monSample0 = Monitored::Scalar<float>("sample0" + channelGainSuffix, pedestal);
187 fill(m_tools[m_pedGroups[partition][drawer]], monSample0);
188 }
189
190
192 double sampleMean = 0.0;
193 double sampleRMS = 0.0;
194
195 for (double sample : digits) {
196 sampleMean += sample;
197 sampleRMS += sample * sample;
198 if (adc == 1 && sample > m_ADCmaxMinusEpsilon) {// overflow in high gain, find charge is it
199 auto monCharge = Monitored::Scalar<float>("charge", charge);
200 fill("TileDigitsOverflow", monCharge);
201 }
202 }
203
204 sampleMean /= nSamples;
205 sampleRMS = sampleRMS / nSamples - sampleMean * sampleMean;
206 sampleRMS = (sampleRMS > 0.0) ? sqrt(sampleRMS * nSamples / (nSamples - 1)) : 0.0;
207
209 meanSample[adc].push_back(sampleMean);
210 meanSampleChannel[adc].push_back(channel);
211 }
212
213 auto monMeanRMS = Monitored::Scalar<float>("meanRMS" + channelGainSuffix, sampleRMS);
214 fill(m_tools[m_hfnGroups[partition][drawer]], monMeanRMS);
215 }
216
217 if ((m_runType != CIS_RUN)
218 || (cispar[6] > 0. && (adc < 1 || charge < 12.))) {
219 // LF If CIS run, Protection to avoid zero amplitudes due to 0 injected charge
220
222 auto monSamples = Monitored::Collection("samples" + channelGainSuffix, digits);
223 fill(m_tools[m_samplesGroups[partition][drawer]], monSamples);
224 }
225
227 auto monSamples = Monitored::Collection("samples" + channelGainSuffix, digits);
228 std::vector<int> sampleNumbers(nSamples);
229 std::iota(sampleNumbers.begin(), sampleNumbers.end(), 0);
230 auto monSampleNumbers = Monitored::Collection("sampleNumbers" + channelGainSuffix, sampleNumbers);
231 fill(m_tools[m_profGroups[partition][drawer]], monSampleNumbers, monSamples);
232 }
233 }
234
236 int evtMod32 = (ctx.evt() + 1) % 32;
237 auto monEvtMod32 = Monitored::Scalar<int>("evtn_mod32" + channelGainSuffix, evtMod32);
238 fill(m_tools[m_evtMod32Groups[partition][drawer]], monEvtMod32);
239 }
240
241 }
242 } // digits
243
245 for (unsigned int gain = 0; gain < Tile::MAX_GAIN; ++gain) {
246 if (!meanSampleChannel[gain].empty()) {
247 auto monChannel = Monitored::Collection("channel_" + Tile::getDrawerString(ros, drawer), meanSampleChannel[gain]);
248 auto monMeanSample = Monitored::Collection("meanSample_" + Tile::getDrawerString(ros, drawer), meanSample[gain]);
249 fill(m_tools[m_meanSampleGroups[gain]], monChannel, monMeanSample);
250
251 for (int channel1 : meanSampleChannel[gain]) {
252 const std::vector<float>& digits1 = moduleDigits[channel1][gain]->samples();
253 for (int channel2 : meanSampleChannel[gain]) {
254 const std::vector<float>& digits2 = moduleDigits[channel2][gain]->samples();
255 double sampleProdMean = 0.;
256 unsigned int nSamples = digits1.size();
257 for (unsigned int i = 0; i < nSamples; ++i) {
258 sampleProdMean += digits1[i] * digits2[i];
259 }
260 sampleProdMean /= nSamples;
261 meanSampleProd[gain].push_back(sampleProdMean);
262 meanSampleProdChannel1[gain].push_back(channel1);
263 meanSampleProdChannel2[gain].push_back(channel2);
264 }
265 }
266 auto monChannel1 = Monitored::Collection("channel1_" + Tile::getDrawerString(ros, drawer), meanSampleProdChannel1[gain]);
267 auto monChannel2 = Monitored::Collection("channel2_" + Tile::getDrawerString(ros, drawer), meanSampleProdChannel2[gain]);
268 auto monMeanSampleProd = Monitored::Collection("meanSampleProd_" + Tile::getDrawerString(ros, drawer), meanSampleProd[gain]);
269 fill(m_tools[m_meanSampleProdGroups[gain]], monChannel1, monChannel2, monMeanSampleProd);
270
271 meanSample[gain].clear();
272 meanSampleChannel[gain].clear();
273
274 meanSampleProd[gain].clear();
275 meanSampleProdChannel1[gain].clear();
276 meanSampleProdChannel2[gain].clear();
277
278 }
279 }
280 }
281 }
282
283 if (dqStatus->calibMode() == 0 && !m_rawChannelContainerKey.empty()) {
284 if (checkROD_CRC(dqStatus, ctx).isFailure()) {
285 ATH_MSG_WARNING("Not possible to check CRC from ROD");
286 }
287 }
288
289 fill("TileDigitsMonExecuteTime", timer);
290
291 return StatusCode::SUCCESS;
292}
293
294void TileDigitsMonitorAlgorithm::checkCRC(bool isCalibMode, uint32_t crc32, uint32_t crcMask,
295 int nDMU, int ros, int drawer) const {
296 /*
297 * Author: Luca. F. November 06
298 * This method provides CRC checks for Global and TileDMU chips.
299 * Global CRC is taken from the trailer and it is correct if
300 * the first 16 bits and the last 16 bits of the word match.
301 * TileDMU CRC is taken from the DMU mask filled in the FPGA.
302 * At the moment it makes sense only for monogain runs
303 * (Physics, LED, MonoCIS). The least significant 16 bits are the result of
304 * the CRC check in the FE (0xFFFF means all OK). The most significant 16 bits
305 * are the result of the CRC check in the ROD (0xFFFF means all OK).
306 */
307
308 int partition = ros - 1;
309
310 // array to adjust order of DMU's of EB* FE CRC status in DMU chip mask word
311 // this is needed because FE and ROD fill DMU mask word in different order
312 int dmuFE_EB[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 12, 13, 8, 9, 10, 11, 14, 15 };
313 int dmuFE_EB_special[16] = { 11, 0, 1, 2, 3, 4, 5, 6, 12, 13, 7, 8, 9, 10, 14, 15 };
314
315 // global CRC
316 uint32_t crc0 = crc32 & 0xFFFF;
317 uint32_t crc1 = crc32 >> 16;
318
319 int crcGlobal = (crc32 == 0) ? 0 : (crc0 == crc1) ? 1 : 2;
320 auto monGlobalCRC = Monitored::Scalar<int>("CRC_global", crcGlobal);
321 fill(m_tools[m_crcGlobalGroups[partition][drawer]], monGlobalCRC);
322
323 // CRC per TileDMU. For mono gain we have it from ROD and FE.
324 // In bi gain, it is just a placeholder with global CRC information.
325 if (isCalibMode) {
326 for (int dmu = 0; dmu < nDMU; ++dmu) {
327 auto monCRCErr = Monitored::Scalar<int>("CRC_err_" + std::to_string(dmu), crcGlobal);
328 fill(m_tools[m_crcErrGroups[partition][drawer]], monCRCErr);
329 }
330 } else {
331 /*
332 * monogain: meaningful information.
333 * Fill 0 if crc32 if 0
334 * Fill 1 if both FE and ROD crc is 1
335 * Fill 2 if DMU FE crc is 0
336 * Fill 3 if DMU ROD crc is 0
337 * Fill 4 is FE and ROD crc is 0
338 */
339 int crcError = -1;
340 if (crc32 == 0) {
341 crcError = 0;
342 for (int dmu = 0; dmu < nDMU; ++dmu) {
343 auto monCRCErr = Monitored::Scalar<int>("CRC_err_" + std::to_string(dmu), crcError);
344 fill(m_tools[m_crcErrGroups[partition][drawer]], monCRCErr);
345 }
346 } else if (crcMask == 0xFFFFFFFF) {
347 crcError = 1;
348 for (int dmu = 0; dmu < nDMU; ++dmu) {
349 auto monCRCErr = Monitored::Scalar<int>("CRC_err_" + std::to_string(dmu), crcError);
350 fill(m_tools[m_crcErrGroups[partition][drawer]], monCRCErr);
351 }
352 } else {
353 uint32_t fe_crc = crcMask & 0xFFFF;
354 uint32_t rod_crc = crcMask >> 16;
355 for (int dmu = 0; dmu < nDMU; ++dmu) {
356 crcError = 1; // TileDMU is fine
357 if (ros < 3) { // LB* use simple FE CRC map
358 if ((fe_crc >> dmu & 0x1) == 0x0) {
359 ++crcError; // add FE error
360 }
361 } else {
362 // EB* use different FECRC map
363 if ((ros == 3 && drawer == 14) || (ros == 4 && drawer == 17)) {
364 // Special EBA15, EBC18
365 if ((fe_crc >> dmuFE_EB_special[dmu] & 0x1) == 0x0) {
366 ++crcError; // add FE error
367 }
368 } else {
369 if ((fe_crc >> dmuFE_EB[dmu] & 0x1) == 0x0) {
370 ++crcError; // add FE error
371 }
372 }
373 }
374 if ((rod_crc >> dmu & 0x1) == 0x0) {
375 crcError += 2; // add ROD error
376 }
377
378 auto monCRCErr = Monitored::Scalar<int>("CRC_err_" + std::to_string(dmu), crcError);
379 fill(m_tools[m_crcErrGroups[partition][drawer]], monCRCErr);
380
381 }
382 }
383 }
384}
385
386
387StatusCode TileDigitsMonitorAlgorithm::checkROD_CRC(const TileDQstatus* dqStatus, const EventContext& ctx) const {
388
389 /*
390 * Author: Luca. F. Mar 08
391 * This method provides CRC checks for Global and TileDMU chips.
392 * They are taken from the the ROD RawChannel Container
393 * TileDMU CRC is taken from the DMU mask filled in the FPGA.
394 * It makes sense only for monogain runs
395 * (Physics, LED, MonoCIS). The least significant 16 bits are the result of
396 * the CRC check in the FE (0xFFFF means all OK). The most significant 16 bits
397 * are the result of the CRC check in the ROD (0xFFFF means all OK).
398 * Global CRC is taken also from the DQ Fragment. '0' means OK,
399 * '1' means mismatch.
400 */
401
403 ATH_CHECK( rawChannelContainer.isValid() );
404
405 for (const TileRawChannelCollection* rawChannelCollection : *rawChannelContainer) {
406 if (rawChannelCollection->empty()) continue;
407
408 HWIdentifier hwid = rawChannelCollection->front()->adc_HWID(); // take the first channel in the drawer
409 int ros = m_tileHWID->ros(hwid); // take the ros and drawer from the first channel
410 int drawer = m_tileHWID->drawer(hwid);
411 uint32_t crc32 = rawChannelCollection->getFragGlobalCRC() & 1;
412
413 if (crc32 == 0) {
414 crc32 = 0xFFFFFFFF;
415 } else { // means OK CRC match
416 crc32 = 0xFFFF;
417 } //means NOT OK, CRC mismatch
418
419 uint32_t maskCRC = rawChannelCollection->getFragRODChipMask();
420 maskCRC = maskCRC << 16; // ROD mask is stored in the 16 most significant bits ce
421 maskCRC += rawChannelCollection->getFragFEChipMask();
422 checkCRC(dqStatus, crc32, maskCRC, 16, ros, drawer); // reuse the same funcion used for digits
423 }
424
425 return StatusCode::SUCCESS;
426}
427
428
429bool TileDigitsMonitorAlgorithm::checkCorruptedData(const std::vector<std::reference_wrapper<const std::vector<uint32_t>>>& headerWordsAll,
430 uint32_t fragStatus, int ros, int drawer, std::vector<std::vector<bool>>& corruptedData) const {
431
432 using Tile = TileCalibUtils;
433 int partition = ros - 1;
434
435 std::vector<int> errors;
436 auto errorsInDMUs = Monitored::Collection("Error", errors);
437
438 std::vector<int> dmus;
439 auto drawerDMUs = Monitored::Collection("DMU", dmus);
440
442 if (fragStatus != TileFragStatus::ALL_OK) {
443 if (fragStatus & (TileFragStatus::ALL_FF | TileFragStatus::ALL_00)) {
445 } else if (fragStatus & (TileFragStatus::NO_FRAG | TileFragStatus::NO_ROB)) {
447 }
448 for (int dmu = 0; dmu < MAX_DMU; ++dmu) {
449 dmus.push_back(dmu);
450 errors.push_back(error);
451 }
453 for (unsigned int gain = 0; gain < Tile::MAX_GAIN; ++gain) {
454 fill(m_tools[m_errorsGroups[partition][drawer][gain]], drawerDMUs, errorsInDMUs);
455 }
456 }
457 return true;
458 }
459
460 /*
461 * DMU header format as defined in http://www.sysf.physto.se/~klere/tile-dmu/header.html
462 * Bits: 1pllllesdrvvvv0mmgggbbbbbbbbbbbb
463 *
464 * The header starts with bit 31 set to indicate a header. The other bits as follows:
465 * p - Parity (odd)
466 * l - Derandomizer length (number of samples).
467 * e - Parity error. A parity error was detected from the memory in the last readout.
468 * s - SEstr Single Error Strobe recieved from the ttc.
469 * d - DEstr Double Error Strobe recieved from the ttc.
470 * r - Register parity. Parity from the registers in the chip.
471 * v - Variable parity. Parity from the variables in the chip.
472 * 0 - Not used. (Set to 0)
473 * m - Mode. 00 - Normal mode
474 * 01 - Calibration mode
475 * 10 - Test mode
476 * 11 - Not used
477 * g - High/low gain. Indicates high(1) or low(0) amplification from the 3-in-1 cards.
478 * b - Bunch Crossing.
479 */
480
481 int gain = 0;
482 for (auto headerWords : headerWordsAll) {
483 int dmu = 0;
484 dmus.clear();
485 errors.clear();
486 for (uint32_t header : headerWords.get() ) {
487 error = OK;
489 corruptedData[gain][dmu] = true;
490 dmus.push_back(dmu);
491 errors.push_back(HEADER_FORM);
492 } else if (isHeaderParityError(header)) {
493 corruptedData[gain][dmu] = true;
494 dmus.push_back(dmu);
495 errors.push_back(HEADER_PAR);
496 } else {
497 if ((header >> 25) & 0x1) {
498 dmus.push_back(dmu);
499 error = MEMO_PAR;
500 errors.push_back(error);
501 }
502 if ((header >> 24) & 0x1) {
503 dmus.push_back(dmu);
505 errors.push_back(error);
506 }
507 if ((header >> 23) & 0x1) {
508 dmus.push_back(dmu);
510 errors.push_back(error);
511 }
512 if (error == OK) {
513 dmus.push_back(dmu);
514 errors.push_back(OK);
515 } else {
516 int fragId = m_tileHWID->frag(ros, drawer);
517 if (!std::binary_search(m_fragIDsToIgnoreDMUerrors.begin(), m_fragIDsToIgnoreDMUerrors.end(), fragId)) {
518 corruptedData[gain][dmu] = true;
519 }
520 }
521 }
522 ++dmu;
523 }
525 fill(m_tools[m_errorsGroups[partition][drawer][gain]], drawerDMUs, errorsInDMUs);
526 }
527 ++gain;
528 }
529 return false;
530}
531
532void TileDigitsMonitorAlgorithm::checkBCID(const std::vector<std::reference_wrapper<const std::vector<uint32_t>>>& headerWordsAll,
533 uint32_t rodBCID, int ros, int drawer) const {
534
535 int gain = 0;
536 int partition = ros - 1;
537 for (auto headerWords : headerWordsAll) {
538 int dmu = 0;
539 for (uint32_t header : headerWords.get() ) {
540 uint32_t dmuBCID = (header & 0xFFF);
541 auto monBCID = Monitored::Scalar<int>("BCID_" + std::to_string(dmu), dmuBCID);
542 fill(m_tools[m_bcidGroups[partition][drawer][gain]], monBCID);
543
544 if ((dmuBCID == rodBCID) || (rodBCID > 0 && dmuBCID == rodBCID - 1)
545 || ((rodBCID == 0) && ((dmuBCID == 3563) || (dmuBCID == 3564)))) {
546
547 auto monBCIDErr = Monitored::Scalar<int>("BCID_err_" + std::to_string(dmu), 1);
548 fill(m_tools[m_bcidErrGroups[partition][drawer][gain]], monBCIDErr);
549 }
550 ++dmu;
551 }
552 ++gain;
553 }
554}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double charge(const T &p)
Definition AtlasPID.h:997
Handle class for reading from StoreGate.
static const Attributes_t empty
ToolHandleArray< GenericMonitoringTool > m_tools
Array of Generic Monitoring Tools.
Declare a monitored scalar variable.
A monitored timer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
bool isHeaderParityError(uint32_t header) const
SG::ReadHandleKey< TileDQstatus > m_dqStatusKey
virtual StatusCode initialize() override
initialize
bool isHeaderFormatError(uint32_t header) const
Gaudi::Property< std::vector< int > > m_fragIDsToIgnoreDMUerrors
Static class providing several utility functions and constants.
static unsigned int getDrawerIdx(unsigned int ros, unsigned int drawer)
Returns a drawer hash.
Class that holds Data Quality fragment information and provides functions to extract the data quality...
uint32_t calibMode() const
Calibration mode.
const uint32_t * cispar() const
CIS parameters.
Gaudi::Property< bool > m_fillProfileHistograms
Gaudi::Property< bool > m_fillPedestalHistograms
std::vector< std::vector< int > > m_profGroups
virtual StatusCode initialize() override
initialize
SG::ReadHandleKey< TileRawChannelContainer > m_rawChannelContainerKey
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
std::vector< std::vector< int > > m_crcErrGroups
std::vector< std::vector< int > > m_samplesGroups
std::vector< std::vector< std::vector< int > > > m_bcidGroups
Gaudi::Property< bool > m_fillSamplesHistograms
Gaudi::Property< bool > m_fillHighFrequencyNoiseHistograms
void checkCRC(bool isCalibMode, uint32_t crc32, uint32_t crcMask, int nDMU, int ros, int drawer) const
std::vector< std::vector< int > > m_crcGlobalGroups
bool checkCorruptedData(const std::vector< std::reference_wrapper< const std::vector< uint32_t > > > &headerWordsAll, uint32_t fragStatus, int ros, int drawer, std::vector< std::vector< bool > > &corruptedData) const
Gaudi::Property< bool > m_fillPedestalDifference
std::vector< std::vector< int > > m_pedGroups
SG::ReadHandleKey< TileDigitsContainer > m_digitsContainerKey
ToolHandle< TileCondToolNoiseSample > m_tileCondToolNoiseSample
Gaudi::Property< bool > m_fillErrorsHistograms
Gaudi::Property< bool > m_fillEventModule32Histograms
std::vector< std::vector< int > > m_evtMod32Groups
Gaudi::Property< bool > m_fillCorrelationsHistograms
void checkBCID(const std::vector< std::reference_wrapper< const std::vector< uint32_t > > > &headerWordsAll, uint32_t rodBCID, int ros, int drawer) const
std::vector< std::vector< int > > m_hfnGroups
std::vector< std::vector< std::vector< int > > > m_errorsGroups
StatusCode checkROD_CRC(const TileDQstatus *dqStatus, const EventContext &ctx) const
std::vector< std::vector< std::vector< int > > > m_bcidErrGroups
const std::vector< float > & samples() const
Definition TileDigits.h:58
Generic monitoring tool for athena components.
std::vector< V > buildToolMap(const ToolHandleArray< GenericMonitoringTool > &tools, const std::string &baseName, int nHist)
Builds an array of indices (base case)
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
void fill(H5::Group &out_file, size_t iterations)