ATLAS Offline Software
Loading...
Searching...
No Matches
TileDQFragMonitorAlgorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
10
13
14
16
18
19 ATH_MSG_INFO("in initialize()");
20
21 ATH_CHECK( detStore()->retrieve(m_tileID) );
22 ATH_CHECK( detStore()->retrieve(m_tileHWID) );
23
24 ATH_CHECK( m_badChannelsKey.initialize() );
25
26 ATH_CHECK( m_cablingSvc.retrieve() );
27 m_cabling = m_cablingSvc->cablingService();
28
29 ATH_CHECK( m_DQstatusKey.initialize() );
30 ATH_CHECK( m_DCSStateKey.initialize(m_checkDCS) );
31 ATH_CHECK( m_emScaleKey.initialize() );
34 ATH_CHECK( m_eventInfoTileStatusKey.initialize() );
35
36 using Tile = TileCalibUtils;
37
39 Tile::MAX_ROS - 1, Tile::MAX_DRAWER);
42 Tile::MAX_ROS - 1, Tile::MAX_DRAWER);
43 }
44
46 Tile::MAX_ROS - 1, Tile::MAX_DRAWER);
47
48 m_badChannelJumpGroups = Monitored::buildToolMap<int>(m_tools, "TileBadChannelsJumpMap", Tile::MAX_ROS - 1);
49 m_badChannelJumpNotMaskGroups = Monitored::buildToolMap<int>(m_tools, "TileBadChannelsJumpNotMaskMap", Tile::MAX_ROS - 1);
50
51 m_badChannelNegGroups = Monitored::buildToolMap<int>(m_tools, "TileBadChannelsNegMap", Tile::MAX_ROS - 1);
52 m_badChannelNegNotMaskGroups = Monitored::buildToolMap<int>(m_tools, "TileBadChannelsNegNotMaskMap", Tile::MAX_ROS - 1);
53
54 m_badPulseQualityGroups = Monitored::buildToolMap<int>(m_tools, "TileBadPulseQualityMap", Tile::MAX_ROS - 1);
55 m_negativeEnergyGroups = Monitored::buildToolMap<int>(m_tools, "TileNegativeEnergyMap", Tile::MAX_ROS - 1);
56
57 ATH_CHECK( detStore()->retrieve(m_tileInfo, m_infoName) );
58 m_ADCmaxMinusEps = m_tileInfo->ADCmax() - 0.01;
59 m_ADCmaskValueMinusEps = m_tileInfo->ADCmaskValue() - 0.01; // indicates channels which were masked in background dataset
60
61 return StatusCode::SUCCESS;
62}
63
64
65StatusCode TileDQFragMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const {
66
67 using Tile = TileCalibUtils;
68
69 // In case you want to measure the execution time
70 auto timer = Monitored::Timer("TIME_execute");
71
72 const xAOD::EventInfo* eventInfo = GetEventInfo(ctx).get();
73
74 const TileDQstatus* dqStatus = SG::makeHandle (m_DQstatusKey, ctx).get();
75 const TileDCSState* dcsState = m_checkDCS ? SG::ReadCondHandle(m_DCSStateKey, ctx).cptr() : nullptr;
77 ATH_CHECK( emScale.isValid() );
78
80 ATH_CHECK( badChannels.isValid() );
81
82 auto lumiBlock = Monitored::Scalar<int>("lumiBlock", eventInfo->lumiBlock());
83
84 auto monitoredROS = Monitored::Scalar<int>("ROS", -1);
85 auto monitoredModule = Monitored::Scalar<int>("module", -1);
86 auto monitoredChannel = Monitored::Scalar<int>("channel", -1);
87
88 std::vector<int> dmus;
89 auto drawerDMUs = Monitored::Collection("DMU", dmus);
90
91 std::vector<int> errors;
92 auto errorsInDMUs = Monitored::Collection("Error", errors);
93
94 const int Trig_b7(7);
95
96 unsigned int tileEventInfoFlag = eventInfo->eventFlags(xAOD::EventInfo::Tile);
97 bool isTileErrorState = (eventInfo->errorState(xAOD::EventInfo::Tile) == xAOD::EventInfo::Error);
98 int nBadConsecutiveModules = isTileErrorState ? MAX_DMU : ((tileEventInfoFlag >> MAX_DMU) & 0xF);
99
100 auto monitoredConsecutiveBad = Monitored::Scalar<int>("TileConsecutiveBad", nBadConsecutiveModules);
101
102 if (isTileErrorState) {
103 fill("TileEventsWithErrEventInfoLB", lumiBlock);
104 }
105
106 fill("TileConsecutiveBadModules", monitoredConsecutiveBad);
107 fill("TileConsecutiveBadModulesLB", monitoredConsecutiveBad, lumiBlock);
108
109 const TileDigitsContainer* digitsContainer{nullptr};
110 if (!m_digitsContainerKey.empty()) {
111 digitsContainer = SG::makeHandle(m_digitsContainerKey, ctx).get();
112 }
113
114 uint32_t l1TriggerType(eventInfo->level1TriggerType());
115
116 bool physicRun = (l1TriggerType == 0) || (((l1TriggerType >> Trig_b7) & 1) == 1);
117 if (physicRun && !m_rawChannelContainerKey.empty()) {
118
119 const TileRawChannelContainer* rawChannelContainer = SG::makeHandle(m_rawChannelContainerKey, ctx).get();
120
121 TileRawChannelUnit::UNIT rawChannelUnit = rawChannelContainer->get_unit();
122 if (rawChannelUnit != TileRawChannelUnit::ADCcounts
123 && rawChannelUnit != TileRawChannelUnit::OnlineADCcounts ) {
124
125 ATH_MSG_WARNING( "Tile raw channel units are not ADC counts => will not check neagative amplitudes!" );
126 } else {
127
128 for (const TileRawChannelCollection* rawChannelCollection : *rawChannelContainer) {
129
130 int fragId = rawChannelCollection->identify();
131 int drawer = (fragId & 0x3F); // range 0-63
132 int ros = fragId >> 8; // range 1-4
133 unsigned int drawerIdx = TileCalibUtils::getDrawerIdx(ros, drawer);
134
135 monitoredModule = drawer;
136 clearDigiError(dmus, errors);
137 for (const TileRawChannel* rawChannel : *rawChannelCollection) {
138
139 HWIdentifier adcId = rawChannel->adc_HWID();
140 int channel = m_tileHWID->channel(adcId);
141 int gain = m_tileHWID->adc(adcId);
142
143 // By convetion errors are saved in pedestal as 100000 + 10000*error
144 float pedestal = rawChannel->pedestal();
145 float quality = std::abs(rawChannel->quality());
146 float amplitude = rawChannel->amplitude();
147 float time = rawChannel->uncorrTime(); // take uncorrected time (if available)
148
149 monitoredChannel = channel;
150
151 if (dqStatus->isChanDQgood(ros, drawer, channel)
152 && !(badChannels->getAdcStatus(adcId).isBad()
153 || (m_checkDCS && dcsState->isStatusBad(ros, drawer, channel)))) {
154
155 if (pedestal > 80000. || quality > m_qualityCut) {
156 fill(m_tools[m_badPulseQualityGroups[ros - 1]], monitoredModule, monitoredChannel);
157 }
158
159 int pmt;
160 int index;
161 Identifier cell_id = m_cabling->h2s_cell_id_index (ros, drawer, channel, index, pmt);
162 if (index >= 0) { // connected channel, exluding MBTS and E4'
163
164 if (quality > m_qualityCut) {
165 bool overflow = (pedestal > 10000. + m_ADCmaskValueMinusEps);
166 if (!(overflow && gain == TileID::LOWGAIN && amplitude > 0.
167 && time > m_timeMinThresh && time < m_timeMaxThresh)) { // overflow in low gain is not masked
168 int dmu = channel / 3;
169 setDigiError(dmus, errors, dmu, MAX_DIGI_ERROR + BAD_QUALITY);
170 }
171 }
172
173 float minEnergy = (m_tileID->sample(cell_id) == TileID::SAMP_E) ? m_minGapEnergy : m_minChannelEnergy;
174 float energy = emScale->calibrateChannel(drawerIdx, channel, gain, amplitude, rawChannelUnit, TileRawChannelUnit::MegaElectronVolts);
175 if (energy < minEnergy) {
176 int dmu = channel / 3;
178
179 fill(m_tools[m_negativeEnergyGroups[ros - 1]], monitoredModule, monitoredChannel);
180 }
181 }
182 }
183
184 if (amplitude < ((gain) ? m_negativeAmplitudeCutHG : m_negativeAmplitudeCutLG)) {
185
186 // Channel number divided by 2
187 int channelDividedBy2 = channel >> 1;
188
189 if (!(m_skipGapCells && ros > 2 // Choose extended barrel and channels: 0,1, 12,13, 18,19
190 && (channelDividedBy2 == 0 || channelDividedBy2 == 6 || channelDividedBy2 == 9))
191 && !(m_skipMasked && badChannels->getAdcStatus(adcId).isBad())) {
192
193 fill(m_tools[m_badChannelNegGroups[ros - 1]], monitoredModule, monitoredChannel);
194
195 if (!(m_checkDCS && !dcsState->isStatusBad(ros, drawer))
196 && dqStatus->isChanDQgood(ros, drawer, channel)) {
197
198 fill(m_tools[m_badChannelNegNotMaskGroups[ros - 1]], monitoredModule, monitoredChannel);
199
200 if (pedestal > 100000. && digitsContainer) {
201
202 IdentifierHash hash = static_cast<IdentifierHash>(rawChannelContainer->hashFunc()(fragId));
203 const TileDigitsCollection* digitsCollection = digitsContainer->indexFindPtr(hash);
204
205 if (digitsCollection) {
206
207 for (const TileDigits* tile_digits : *digitsCollection) {
208
209 if (m_tileHWID->channel(tile_digits->adc_HWID()) == channel) {
210
211 msg(MSG::INFO) << "LB " << eventInfo->lumiBlock()
212 << " Evt " << eventInfo->eventNumber()
213 << " " << Tile::getDrawerString(ros, drawer)
214 << std::setfill(' ') << std::setw(3) << channel
215 << ((gain) ? " HG" : " LG") << " negative amplitude: "
216 << std::setprecision(2) << std::fixed << std::setw(7)
217 << amplitude << " Samples: " << std::setprecision(0);
218
219 std::vector<float> samples = tile_digits->samples();
220 for (float sample : samples) {
221 msg(MSG::INFO) << sample << " ";
222 }
223
224 msg(MSG::INFO) << " error = " << TileRawChannelBuilder::BadPatternName(pedestal) << endmsg;
225 }
226 }
227 }
228 }
229 }
230 }
231 }
232 }
233 if (!errors.empty()) {
234 fill(m_tools[m_errorsGroups[ros - 1][drawer]], drawerDMUs, errorsInDMUs);
235 }
236 }
237 }
238 }
239
240
241 if (digitsContainer) {
242
243
244 for (const TileDigitsCollection* digitsCollection : *digitsContainer) {
245
246 int fragId = digitsCollection->identify();
247 int drawer = (fragId & 0x3F); // range 0-63
248 int ros = fragId >> 8; // range 1-4
249
250 monitoredROS = ros;
251 monitoredModule = drawer;
252
253 if (l1TriggerType != digitsCollection->getLvl1Type()) {
254 fill("TileMismatchedL1TriggerType", monitoredModule, monitoredROS);
255 }
256
257 if (l1TriggerType == 0x82) {
258
259 unsigned int nBadOrDisconnectedChannels(0);
260 for (unsigned int channel = 0; channel < Tile::MAX_CHAN; ++channel) {
261 HWIdentifier channel_id = m_tileHWID->channel_id(ros, drawer, channel);
262 if (badChannels->getChannelStatus(channel_id).isBad()
263 || (m_cabling->isDisconnected(ros, drawer, channel)) ) {
264 ++nBadOrDisconnectedChannels;
265 }
266 }
267
268 unsigned int nRequiredChannels(Tile::MAX_CHAN - nBadOrDisconnectedChannels);
269 if (digitsCollection->size() < nRequiredChannels) {
270 fill("TileNoAllDigits", monitoredModule, monitoredROS);
271 ATH_MSG_VERBOSE("No All channels with digits (Trigger Type: 0x82) in module "
272 << Tile::getDrawerString(ros, drawer)
273 << ", present channels: " << digitsCollection->size()
274 << ", required channels: " << nRequiredChannels);
275 }
276
277 }
278
279 int error;
280 float minSample;
281 float maxSample;
282
283 for (const TileDigits* tile_digits : *digitsCollection) {
284
285 clearDigiError(dmus, errors);
286 uint16_t corruptedData[MAX_CORRUPTED_ERROR] = {0u};
287
288 HWIdentifier adcId = tile_digits->adc_HWID();
289 int channel = m_tileHWID->channel(adcId);
290 int gain = m_tileHWID->adc(adcId);
291
292 monitoredChannel = channel;
293
294 error = TileRawChannelBuilder::CorruptedData(ros, drawer, channel, gain, tile_digits->samples(), minSample, maxSample, m_ADCmaxMinusEps, m_ADCmaskValueMinusEps);
295
296 if ( (error > 0) &&
297 !(m_cabling->isDisconnected(ros, drawer, channel) || badChannels->getAdcStatus(adcId).isBad()) ) {
298
299 if (msgLvl(MSG::DEBUG)) {
300 msg(MSG::DEBUG) << "LB " << eventInfo->lumiBlock()
301 << " Evt " << eventInfo->eventNumber()
302 << " " << Tile::getDrawerString(ros, drawer)
303 << std::setfill(' ') << std::setw(3) << channel
304 << ((gain) ? " HG" : " LG")
305 << " Samples: ";
306
307 std::vector<float> samples = tile_digits->samples();
308 for (float sample : samples) {
309 msg(MSG::DEBUG) << sample << " ";
310 }
311 msg(MSG::DEBUG) << " error = " << TileRawChannelBuilder::BadPatternName(100000. + error * 10000) << endmsg;
312 }
313
314 fill(m_tools[m_badChannelJumpGroups[ros - 1]], monitoredModule, monitoredChannel);
315
316 if (!(m_checkDCS && dcsState->isStatusBad(ros, drawer)) && dqStatus->isChanDQgood(ros, drawer, channel)) {
317
318 fill(m_tools[m_badChannelJumpNotMaskGroups[ros - 1]], monitoredModule, monitoredChannel);
319
320 if (error <= MAX_CORRUPTED_ERROR) {
321 corruptedData[error - 1] |= 1u << (unsigned int) (channel / 3);
322 }
323 }
324 }
325
326 bool fillCorruptedData(false);
327 for (int error = 0; error < MAX_CORRUPTED_ERROR; ++error) {
328 if (corruptedData[error] > 0u) {
329 fillCorruptedData = true;
330 for (unsigned int dmu = 0u; dmu < 16u; ++dmu) {
331 if (corruptedData[error] & (1u << dmu)) {
332 setDigiError(dmus, errors, dmu, MAX_DIGI_ERROR + error);
333 }
334 }
335 }
336 }
337
338 if (fillCorruptedData) {
339 fill(m_tools[m_errorsGroups[ros - 1][drawer]], drawerDMUs, errorsInDMUs);
340 }
341 }
342 }
343 }
344
345 std::vector<int> rosWithGloblaCRC;
346 std::vector<int> drawerWithGlobalCRC;
347 auto fractionOfBadDMUs = Monitored::Scalar<float>("fractionOfBadDMUs", 0.0);
348
349 for (unsigned int ros = 1; ros < Tile::MAX_ROS; ++ros) {
350 for (unsigned int drawer = 0; drawer < Tile::MAX_DRAWER; ++drawer) {
351
352 clearDigiError(dmus, errors);
353 bool isGoodModuleDCS(true);
354
355 if (m_checkDCS && dcsState->isStatusBad(ros, drawer)) {
356 // Check if this module is completely masked
357 int frag_id = m_tileHWID->frag(ros, drawer);
358 const std::vector<int>& maskedDrawers = badChannels->getMaskedDrawers();
359 if (!std::binary_search(maskedDrawers.begin(), maskedDrawers.end(), frag_id)) {
360 fractionOfBadDMUs = -1.0; // By convention
361 }
362 isGoodModuleDCS = false;
363 }
364
365 int status = dqStatus->checkGlobalErr(ros, drawer, 0);
369 } else if (status & (TileFragStatus::NO_FRAG | TileFragStatus::NO_ROB)) {
371 }
372
373 float nBadNotMaskedDMUs = 0;
374
375 for (int dmu = 0; dmu < MAX_DMU; ++dmu) { // loop over dmus
376 int channel = 3 * dmu;
377
378 bool isMaskedDMU = m_ignoreNoRecoFragError ? (error == NO_RECO_FRAG) : false;
379
380 TileBchStatus channelStatus0 = badChannels->getChannelStatus( m_tileHWID->channel_id(ros, drawer, channel) );
381 TileBchStatus channelStatus1 = badChannels->getChannelStatus( m_tileHWID->channel_id(ros, drawer, channel + 1) );
382 TileBchStatus channelStatus2 = badChannels->getChannelStatus( m_tileHWID->channel_id(ros, drawer, channel + 2) );
383
384 bool specialEB; // special treatment of EBA15, EBC18
385
386 if ((ros == 3 && drawer == 14) || (ros == 4 && drawer == 17)) {
387 specialEB = true; // EBA15, EBC18
388 } else {
389 specialEB = false;
390 }
391
392 if ((channelStatus0.isBad() && channelStatus1.isBad() && channelStatus2.isBad())
393 // Check disconnected channels for EBs
394 || ((ros > 2 && ((channel == 18 && !specialEB) || channel == 33)) && channelStatus2.isBad())
395 // Check disconnected channels for LBs
396 || ((ros < 3 && channel == 30) && channelStatus2.isBad())
397 // Check disconnected channels for LBs
398 || ((ros < 3 && channel == 42) && channelStatus0.isBad() && channelStatus2.isBad())
399 // Check void DMUs for EBs
400 || (ros > 2 && (channel == 24 || channel == 27 || channel == 42 || channel == 45))
401 || (specialEB && channel == 0) // Check void DMU 0 for EBA15, EBC18
402 // Check disconnected PMT of DMU 1 for EBA15, EBC18
403 || ((specialEB && channel == 3) && channelStatus1.isBad() && channelStatus2.isBad())) {
404
405 setDigiError(dmus, errors, dmu, MASKED);
406 isMaskedDMU = true;
407 }
408
409 if (isGoodModuleDCS) {
410
411 if (m_checkDCS
412 && ((dcsState->isStatusBad(ros, drawer, channel)
413 && !channelStatus0.contains(TileBchPrbs::NoHV) && !channelStatus0.contains(TileBchPrbs::WrongHV))
414 || (dcsState->isStatusBad(ros, drawer, channel + 1)
415 && !channelStatus1.contains(TileBchPrbs::NoHV) && !channelStatus1.contains(TileBchPrbs::WrongHV))
416 || (dcsState->isStatusBad(ros, drawer, channel + 2)
417 && !channelStatus2.contains(TileBchPrbs::NoHV) && !channelStatus2.contains(TileBchPrbs::WrongHV)))) {
418
419 setDigiError(dmus, errors, dmu, ANY_CH_BAD_HV);
420 }
421
422 if (dqStatus->isChanDQgood(ros, drawer, channel)) {
423 setDigiError(dmus, errors, dmu, OK);
424 } else {
425
426 if (!(isMaskedDMU
427 || (ros > 2 && (dmu == 8 || dmu == 9 || dmu == 14 || dmu == 15))
428 || (specialEB && dmu == 0))) {
429
430 ++nBadNotMaskedDMUs;
431 }
432
433 if (error != OK) {
434 setDigiError(dmus, errors, dmu, error);
435 } else if (dqStatus->checkHeaderFormatErr(ros, drawer, dmu, 0) != 0) {
436 // In case of format errors, we only fill this one
437 setDigiError(dmus, errors, dmu, HEADER_FORM);
438 } else {
439 if (dqStatus->checkHeaderParityErr(ros, drawer, dmu, 0) != 0) {
440 setDigiError(dmus, errors, dmu, HEADER_PAR);
441 }
442 if (dqStatus->checkMemoryParityErr(ros, drawer, dmu, 0) != 0) {
443 setDigiError(dmus, errors, dmu, MEMO_PAR);
444 }
445 if (dqStatus->checkFE_CRCErr(ros, drawer, dmu, 0) != 0) {
446 setDigiError(dmus, errors, dmu, FE_CRC);
447 }
448 if (dqStatus->checkROD_CRCErr(ros, drawer, dmu, 0) != 0) {
449 setDigiError(dmus, errors, dmu, ROD_CRC);
450 }
451 if (dqStatus->checkBCIDErr(ros, drawer, dmu, 0) != 0) {
452 setDigiError(dmus, errors, dmu, BCID);
453 }
454 if (dqStatus->checkSampleFormatErr(ros, drawer, dmu, 0) != 0) {
455 setDigiError(dmus, errors, dmu, SAMPLE_FORM);
456 }
457 if (dqStatus->checkSampleParityErr(ros, drawer, dmu, 0) != 0) {
458 setDigiError(dmus, errors, dmu, SAMPLE_PAR);
459 }
460 if (dqStatus->checkDoubleStrobeErr(ros, drawer, dmu, 0) != 0) {
461 setDigiError(dmus, errors, dmu, DOUBLE_STB);
462 }
463 if (dqStatus->checkSingleStrobeErr(ros, drawer, dmu, 0) != 0) {
464 setDigiError(dmus, errors, dmu, SINGLE_STB);
465 }
466 if (dqStatus->checkGlobalCRCErr(ros, drawer, 0) != 0) {
467 setDigiError(dmus, errors, dmu, GLOBAL_CRC);
468 }
469 }
470 }
471 } else {
472 setDigiError(dmus, errors, dmu, ALL_M_BAD_DCS);
473 }
474 } // loop over DMUs
475
476 if (isGoodModuleDCS) {
477 fractionOfBadDMUs = nBadNotMaskedDMUs / MAX_DMU;
478 }
479
480 // Keep the number of processed events in underflow
481 // in histograms with DMU header errors
482 setDigiError(dmus, errors, -1, OK);
483 fill(m_tools[m_errorsGroups[ros - 1][drawer]], drawerDMUs, errorsInDMUs);
485 fill(m_tools[m_errorsInLBGroups[ros - 1][drawer]], drawerDMUs, errorsInDMUs);
486 }
487
488 fill(m_tools[m_errorsVsLBGroups[ros - 1][drawer]], lumiBlock, fractionOfBadDMUs);
489
490 if (dqStatus->checkGlobalCRCErr(ros, drawer, 0) != 0) {
491 rosWithGloblaCRC.push_back(ros);
492 drawerWithGlobalCRC.push_back(drawer);
493 }
494 }
495 }
496
497 if (!rosWithGloblaCRC.empty()) {
498 auto monModule = Monitored::Collection("module", drawerWithGlobalCRC);
499 auto monROS = Monitored::Collection("ROS", rosWithGloblaCRC);
500 fill("TileBadGlobalCRC", monModule, monROS);
501 }
502
503 fill("TileDQFragMonExecuteTime", timer);
504
505 return StatusCode::SUCCESS;
506}
507
508
509void TileDQFragMonitorAlgorithm::setDigiError(std::vector<int>& dmus, std::vector<int>& errors,
510 int dmu, int error) const {
511 dmus.push_back(dmu);
512 errors.push_back(error);
513}
514
515
516void TileDQFragMonitorAlgorithm::clearDigiError(std::vector<int>& dmus, std::vector<int>& errors) const {
517 dmus.clear();
518 errors.clear();
519}
520
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Handle class for reading from StoreGate.
const ServiceHandle< StoreGateSvc > & detStore() const
bool msgLvl(const MSG::Level lvl) const
virtual StatusCode initialize() override
initialize
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.)
ToolHandleArray< GenericMonitoringTool > m_tools
Array of Generic Monitoring Tools.
virtual const T * indexFindPtr(IdentifierHash hashId) const override final
return pointer on the found entry or null if out of range using hashed index - fast version,...
This is a "hash" representation of an Identifier.
Declare a monitored scalar variable.
A monitored timer.
const_pointer_type cptr()
Class holding bad channel problems.
bool contains(const Prb &prb) const
bool isBad() const
Static class providing several utility functions and constants.
static unsigned int getDrawerIdx(unsigned int ros, unsigned int drawer)
Returns a drawer hash.
Condition object to keep Tile DCS status from DB.
bool isStatusBad(unsigned int ros, unsigned int drawer) const
Return true if given Tile drawer considered as bad by summary drawer states per LVPS otherwise return...
SG::ReadHandleKey< TileDigitsContainer > m_digitsContainerKey
float m_ADCmaskValueMinusEps
indicates channels which were masked in background dataset
std::vector< std::vector< int > > m_errorsInLBGroups
Gaudi::Property< float > m_negativeAmplitudeCutLG
void setDigiError(std::vector< int > &dmus, std::vector< int > &errors, int dmu, int error) const
Gaudi::Property< float > m_timeMaxThresh
ServiceHandle< TileCablingSvc > m_cablingSvc
Name of Tile cabling service.
SG::ReadDecorHandleKey< xAOD::EventInfo > m_eventInfoTileStatusKey
Gaudi::Property< float > m_qualityCut
SG::ReadHandleKey< TileRawChannelContainer > m_rawChannelContainerKey
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Gaudi::Property< bool > m_ignoreNoRecoFragError
const TileCablingService * m_cabling
SG::ReadCondHandleKey< TileEMScale > m_emScaleKey
Name of TileEMScale in condition store.
Gaudi::Property< float > m_timeMinThresh
SG::ReadCondHandleKey< TileBadChannels > m_badChannelsKey
Name of TileBadChannels in condition store.
Gaudi::Property< float > m_negativeAmplitudeCutHG
SG::ReadCondHandleKey< TileDCSState > m_DCSStateKey
Name of TileDCSState object in condition store.
std::vector< std::vector< int > > m_errorsVsLBGroups
virtual StatusCode initialize() override
initialize
void clearDigiError(std::vector< int > &dmus, std::vector< int > &errors) const
SG::ReadHandleKey< TileDQstatus > m_DQstatusKey
Gaudi::Property< bool > m_skipGapCells
Gaudi::Property< float > m_minGapEnergy
std::vector< std::vector< int > > m_errorsGroups
Gaudi::Property< bool > m_fillDigiErrorsInLB
Gaudi::Property< float > m_minChannelEnergy
Class that holds Data Quality fragment information and provides functions to extract the data quality...
int checkHeaderFormatErr(int partition, int drawer, int dmu, int gain) const
returns 1 if DMU has header word format error
bool isChanDQgood(int partition, int drawer, int ch) const
returns status of single channel (if bigain, returns AND of ADCs' status
int checkBCIDErr(int partition, int drawer, int dmu, int gain) const
returns 1 if DMU has BCID mismatch between DMU and ROD Since BCID errors in the DQ fragment are det...
int checkGlobalErr(int partition, int drawer, int gain) const
returns 1 if adc channel has any global error
int checkDoubleStrobeErr(int partition, int drawer, int dmu, int gain) const
returns 1 if DMU has double strobe error
int checkGlobalCRCErr(int partition, int drawer, int gain) const
returns 1 if adc channel has global CRC error
int checkSampleFormatErr(int partition, int drawer, int dmu, int gain) const
returns 1 if DMU has data word format error
int checkSingleStrobeErr(int partition, int drawer, int dmu, int gain) const
returns 1 if DMU has single strobe error
int checkROD_CRCErr(int partition, int drawer, int dmu, int gain) const
returns 1 if DMU has CRC error originating in ROD
int checkHeaderParityErr(int partition, int drawer, int dmu, int gain) const
returns 1 if DMU has header word parity error
int checkFE_CRCErr(int partition, int drawer, int dmu, int gain) const
returns 1 if DMU has CRC error originating in FE electronics
int checkMemoryParityErr(int partition, int drawer, int dmu, int gain) const
returns 1 if DMU has memory parity error
int checkSampleParityErr(int partition, int drawer, int dmu, int gain) const
returns 1 if DMU has data word parity error
static const char * BadPatternName(float ped)
static int CorruptedData(int ros, int drawer, int channel, int gain, const std::vector< float > &digits, float &dmin, float &dmax, float ADCmaxMinusEps, float ADCmaskValueMinusEps)
uint32_t lumiBlock() const
The current event's luminosity block number.
@ Tile
The Tile calorimeter.
uint16_t level1TriggerType() const
The Level-1 trigger type.
@ Error
The sub-detector issued an error.
uint32_t eventFlags(EventFlagSubDet subDet) const
Get the event flags for a particular sub-detector.
EventFlagErrorState errorState(EventFlagSubDet subDet) const
Get the error state for a particular sub-detector.
uint64_t eventNumber() const
The current event's event number.
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())
Definition index.py:1
EventInfo_v1 EventInfo
Definition of the latest event info version.
void fill(H5::Group &out_file, size_t iterations)
MsgStream & msg
Definition testRead.cxx:32