ATLAS Offline Software
Loading...
Searching...
No Matches
TileTBBeamMonitorAlgorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
9
11
13
14#include <algorithm>
15
17
18 ATH_MSG_INFO("in initialize()");
20
21 ATH_CHECK( m_beamElemContainerKey.initialize() );
23
24 ATH_CHECK( m_cablingSvc.retrieve() );
25 ATH_CHECK( detStore()->retrieve(m_tileID) );
26 ATH_CHECK( detStore()->retrieve(m_tileHWID) );
27
28 std::vector<std::string> modules;
29 for (int fragID : m_fragIDs) {
30 int ros = fragID >> 8;
31 int drawer = fragID & 0x3F;
32 modules.push_back(TileCalibUtils::getDrawerString(ros, drawer));
34 }
35
36 std::ostringstream os;
37 if ( m_fragIDs.size() != 0) {
38 std::sort(m_fragIDs.begin(), m_fragIDs.end());
39 for (int fragID : m_fragIDs) {
40 unsigned int ros = fragID >> 8;
41 unsigned int drawer = fragID & 0xFF;
42 std::string module = TileCalibUtils::getDrawerString(ros, drawer);
43 os << " " << module << "/0x" << std::hex << fragID << std::dec;
44 }
45 } else {
46 os << "NONE";
47 }
48
49 ATH_MSG_INFO("Monitored modules/frag ID:" << os.str());
50
51
52 std::map<std::string, unsigned int> roses = { {"AUX", 0}, {"LBA", 1}, {"LBC", 2}, {"EBA", 3}, {"EBC", 4} };
53 for (const std::string& maskedModuleChannels : m_masked) {
54
55 std::string module = maskedModuleChannels.substr(0, 5);
56 std::string partition = module.substr(0, 3);
57 if (roses.count(partition) != 1) {
58 ATH_MSG_WARNING("There no such partition: " << partition << " in module: " << module
59 << " => skip because of bad format: " << maskedModuleChannels);
60 continue;
61 }
62
63 unsigned int drawer = std::stoi(module.substr(3, 2)) - 1;
64 if (drawer >= TileCalibUtils::MAX_DRAWER) {
65 ATH_MSG_WARNING("There no such drawer: " << drawer + 1 << " in module: " << module
66 << " => skip because of bad format: " << maskedModuleChannels);
67 continue;
68 }
69
70 unsigned int ros = roses.at(partition);
71 unsigned int drawerIdx = TileCalibUtils::getDrawerIdx(ros, drawer);
72
73 std::string gain = maskedModuleChannels.substr(5,7);
74 unsigned int adc = std::stoi(gain);
75
76 if (adc >= TileCalibUtils::MAX_GAIN) {
77 ATH_MSG_WARNING("There no such gain: " << gain << " => skip because of bad format: " << maskedModuleChannels);
78 continue;
79 }
80
81 std::stringstream channels(maskedModuleChannels.substr(7));
82 std::string channel;
83 while (std::getline(channels, channel, ',')) {
84 if (!channel.empty()) {
85 unsigned int chan = std::stoi(channel);
86 if (chan >= TileCalibUtils::MAX_CHAN) {
87 ATH_MSG_WARNING("There no such channel: " << chan << " in channels: " << channels.str()
88 << " => skip because of bad format: " << maskedModuleChannels);
89 continue;
90 }
91 m_maskedChannels[drawerIdx][chan] |= (1U << adc);
92 ATH_MSG_INFO(TileCalibUtils::getDrawerString(ros, drawer) << " ch" << chan << (adc ? " HG" : " LG") << ": masked!");
93 }
94 }
95
96 }
97
98 for (unsigned int pmt : m_maskMuonPMTs) {
99 if (pmt < m_maskedMuPMTs.size()) {
100 m_maskedMuPMTs[pmt] = true;
101 ATH_MSG_INFO("Masking Muon Wall PMT: " << pmt);
102 }
103 }
104
105 using namespace Monitored;
106
113
115
116 std::vector<std::string> beamChambers{"BC1", "BC2"};
117 m_beamChamberGroups = buildToolMap<int>(m_tools, "BeamChamber", beamChambers);
118
119 if (!m_caloCellContainerKey.empty()) {
121 }
122
123 return StatusCode::SUCCESS;
124}
125
126
127StatusCode TileTBBeamMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const {
128
129 // In case you want to measure the execution time
130 auto timer = Monitored::Timer("TIME_execute");
131
132 uint32_t run = GetEventInfo(ctx)->runNumber();
133
134 // TDC/BEAM Items
135 int muTag = 0;
136 int muHalo = 0;
137 int muVeto = 0;
138
139 std::vector<std::reference_wrapper<int>> mu{muTag, muHalo, muVeto};
140
141 int sCounter[N_S_COUNTER] = {0};
142 int cherenkov[N_CHERENKOV] = {0};
143 int scaler[N_SCALER] = {0};
144 int scaler12 = 0;
145
146 // MUON/MuWall
147 float muonWall[N_MUON_WALL_PMT] = {0};
148
149 int tof[N_TDC_CHANNELS] = {0};
150 int btdc[N_TDC_CHANNELS] = {0};
151 for (int i = 0; i < N_TDC_CHANNELS; i += 2) {
152 btdc[i] = +0xFFFF;
153 btdc[i+1] = -0xFFFF;
154 }
155 int btdcHitsN[N_TDC_CHANNELS] = {0};
156
157 double totalMuonWallEnergy = 0;
158
160 ATH_CHECK( beamElemContainer.isValid() );
161
162 ATH_MSG_VERBOSE("TileRawDataContainer of TileRawDataCollection of TileBeamElem size = " << beamElemContainer->size());
163
164 for (const TileBeamElemCollection* beamElemCollection : *beamElemContainer) {
165
166 // Retreive frag identifiers
167 int frag = beamElemCollection->identify();
168 ATH_MSG_VERBOSE("TileRawDataCollection of TileBeamElem Id = 0x" << MSG::hex << frag << MSG::dec
169 << " size = " << beamElemCollection->size());
170
171 for (const TileBeamElem* beamElement : *beamElemCollection) {
172
173 ATH_MSG_VERBOSE((std::string) *beamElement);
174
175 HWIdentifier id = beamElement->adc_HWID();
176 std::vector<uint32_t> digits = beamElement->get_digits();
177 int channel = m_tileHWID->channel(id);
178 int nDigits = digits.size();
179
180 if ( nDigits <= 0 ) {
181 ATH_MSG_ERROR("Wrong no. of samples (" << nDigits
182 << ") for channel " << channel
183 << " in frag 0x"<< MSG::hex << frag << MSG::dec
184 << " - " << BeamFragName[frag & 0x1F]);
185 } else {
186
187 int amplitude = digits[0];
188
189 ATH_MSG_DEBUG("Found channel " << channel
190 << " in frag 0x" << MSG::hex << frag << MSG::dec
191 << " - " << BeamFragName[frag & 0x1F]
192 << " with amp=" << amplitude);
193
194 switch (frag) {
195
196 case MUON_ADC_FRAG:
197
198 if(channel >= 0 && channel < 8) {
199 muonWall[channel] = amplitude;
200 if (!m_maskedMuPMTs[channel]) {
201 totalMuonWallEnergy += amplitude;
202 }
203 } else {
204 errorWrongChannel(frag, channel);
205 }
206
207 break;
208
209 case ADDR_ADC_FRAG:
210
211 if(channel >= 0 && channel < 6) {
212 if (8 + channel < N_MUON_WALL_PMT) {
213 muonWall[8 + channel] = amplitude;
214 if (!m_maskedMuPMTs[8 + channel]) {
215 totalMuonWallEnergy += amplitude;
216 }
217 }
218 } else {
219 errorWrongChannel(frag, channel);
220 }
221
222 break;
223
224 case COMMON_TOF_FRAG:
225 if (m_TBperiod >= 2022) {
226 // The first channels are connected to BC1 and BC2, the last 4 channels are supposed to be TOF
227 if (channel > 11) {
228 if(channel < 16) {
229 tof[channel] = amplitude;
230 ATH_MSG_VERBOSE( "TOF: " << channel << " amp: " << amplitude);
231 } else {
232 errorWrongChannel(frag, channel);
233 }
234 break;
235 }
236 // Fall through to case COMMON_TDC1_FRAG to unpack the first channels of BC1 and BC2
237 [[fallthrough]]; // silent the warning on fall through
238 } else {
239 break;
240 }
241 case COMMON_TDC1_FRAG:
242
243 if ((channel > 11) && (channel < 16) && (run > 2211136)) {
244 tof[channel] = amplitude;
245 ATH_MSG_VERBOSE( "TOF: " << channel << " amp: " << amplitude);
246 } else if (channel < 16) {
247 if (m_TBperiod >= 2021) {
248 if (btdcHitsN[channel] == 0) {
249 btdc[channel] = amplitude;
250 ++(btdcHitsN[channel]);
251 }
252 } else {
253 btdc[channel] = amplitude;
254 }
255 } else errorWrongChannel(frag, channel);
256 break;
257
258 case BEAM_ADC_FRAG:
259
260 if (channel >= 0 && channel < 8) {
261 if (channel < 3) {
262 sCounter[channel] = amplitude;
263 } else if (channel < 5) {
264 cherenkov[channel - 3] = amplitude;
265 } else {
266 mu[channel - 5] = amplitude;
267 }
268 } else {
269 errorWrongChannel(frag, channel);
270 }
271 break;
272
273
274 case COMMON_ADC1_FRAG:
275
276 if (run > 2211444) {
277
278 if (channel >= 0 && channel < 16) {
279 if (channel < 2) {
280 sCounter[channel] = amplitude;
281 } else if (channel == 2) {
282 // Before run #2310000 channel 2 was connected to PMT11 of muon wall.
283 // After this run this channel was connected to S3 scintillator.
284 if (run < 2310000) {
285 muonWall[10] = amplitude;
286 if (!m_maskedMuPMTs[10]) {
287 totalMuonWallEnergy += amplitude;
288 }
289 } else {
290 sCounter[2] = amplitude;
291 }
292 } else if (channel < 6) {
293 cherenkov[channel - 3] = amplitude;
294 } else {
295 muonWall[channel - 6] = amplitude;
296 if (!m_maskedMuPMTs[channel - 6]) {
297 totalMuonWallEnergy += amplitude;
298 }
299 }
300 } else {
301 errorWrongChannel(frag, channel);
302 }
303
304 break;
305
306 } else {
307
308 if (channel >= 0 && channel < 16) {
309 if (channel < 3) {
310 sCounter[channel] = amplitude;
311 } else if (channel < 6) {
312 cherenkov[channel - 3] = amplitude;
313 }
314 } else {
315 errorWrongChannel(frag, channel);
316 }
317
318 break;
319 }
320
321
322 case COMMON_ADC2_FRAG:
323
324 if (run < 2211445) {
325
326 if(channel >= 0 && channel < N_MUON_WALL_PMT) {
327 muonWall[channel] = amplitude;
328 if (!m_maskedMuPMTs[channel]) {
329 totalMuonWallEnergy += amplitude;
330 }
331 } else if (channel > 31) {
332 errorWrongChannel(frag, channel);
333 }
334 }
335 break;
336
337 case COMMON_PTN_FRAG:
338 if (run > 2310000 && channel < 16) {
339 if (channel < N_SCALER) {
340 scaler[channel] = amplitude;
341 } else if (channel == N_SCALER) {
342 scaler12 = amplitude;
343 }
344 } else {
345 errorWrongChannel(frag, channel);
346 }
347 break;
348 }
349 }
350 }
351 }
352
353 auto monTotalMuonEnergy = Monitored::Scalar<double>("TotalMuonEnergy", totalMuonWallEnergy);
354 fill("TileTBTotalMuonEnergy", monTotalMuonEnergy);
355
356 std::vector<int> counterToTOF{14,15,13};
357 for (int counter = 0; counter < N_TOF; ++counter) {
358 auto monAmplitude = Monitored::Scalar<double>("amplitude", tof[counterToTOF[counter]]);
359 fill(m_tools[m_tofGroups[counter]], monAmplitude);
360 }
361
362 for (unsigned int pairIdx = 0; pairIdx < m_tofPairs.size(); ++pairIdx) {
363 const std::pair<int, int>& tofPair = m_tofPairs[pairIdx];
364 int tof1 = tof[counterToTOF[tofPair.first - 1]];
365 int tof2 = tof[counterToTOF[tofPair.second - 1]];
366 if (tof1 != 0 && tof2 != 0) {
367 auto monTOFDiff = Monitored::Scalar<double>("TOFDiff", tof1 - tof2);
368 fill(m_tools[m_tofDiffGroups[pairIdx]], monTOFDiff);
369 }
370 }
371
372 for (int counter = 0; counter < N_S_COUNTER; ++counter) {
373 auto monAmplitude = Monitored::Scalar<double>("amplitude", sCounter[counter]);
374 fill(m_tools[m_sCounterGroups[counter]], monAmplitude);
375 }
376
377 for (int counter = 0; counter < N_CHERENKOV; ++counter) {
378 auto monAmplitude = Monitored::Scalar<double>("amplitude", cherenkov[counter]);
379 fill(m_tools[m_cherenkovGroups[counter]], monAmplitude);
380 }
381
382 auto monCherenkovAmplitude1 = Monitored::Scalar<double>("amplitude1", cherenkov[0]);
383 auto monCherenkovAmplitude2 = Monitored::Scalar<double>("amplitude2", cherenkov[1]);
384 fill("CherCompare", monCherenkovAmplitude1, monCherenkovAmplitude2);
385
386 for (int tofCounter = 0; tofCounter < N_TOF; ++tofCounter) {
387 auto monAmplitudeTOF = Monitored::Scalar<double>("amplitudeTOF", tof[counterToTOF[tofCounter]]);
388 for (int cherenkovCounter = 0; cherenkovCounter < N_CHERENKOV; ++cherenkovCounter) {
389 auto monAmplitudeCherenkov = Monitored::Scalar<double>("amplitudeCherenkov", cherenkov[cherenkovCounter]);
390 fill(m_tools[m_cherenkovVsTOFGroups[tofCounter][cherenkovCounter]], monAmplitudeTOF, monAmplitudeCherenkov);
391 }
392 }
393
394
395 if (run > 2310000) {
396 for (int counter = 0; counter < N_SCALER; ++counter) {
397 auto monCounts = Monitored::Scalar<double>("counts", scaler[counter]);
398 fill(m_tools[m_scalerGroups[counter]], monCounts);
399 }
400 auto monCounts12 = Monitored::Scalar<double>("counts12", scaler12);
401 fill("Scaler12", monCounts12);
402 }
403
404 for (int pmt = 0; pmt < N_MUON_WALL_PMT; ++pmt) {
405 auto monAmplitude = Monitored::Scalar<double>("amplitude", muonWall[pmt]);
406 fill(m_tools[m_muonWallGroups[pmt]], monAmplitude);
407 }
408
409 for (int row = 0; row < 2; ++row) {
410 for (int column = 0; column < 4; ++column) {
411 auto monRow = Monitored::Scalar<double>("row", row);
412 auto monColumn = Monitored::Scalar<double>("column", column);
413 auto monAmplitude = Monitored::Scalar<double>("amplitude", muonWall[7 - (row * 4 + column)]);
414 fill("PMTHitMap", monColumn, monRow, monAmplitude);
415 }
416 }
417
418 // Beam Chamber Coordinates
419 // For BC1
420 auto bc1X = Monitored::Scalar<double>("BC1X", 0.);
421 auto bc1Y = Monitored::Scalar<double>("BC1Y", 0.);
422 if (run > 2211444) {
423 bc1X = (btdc[8] - btdc[0]) * m_bc1HorizontalSlope + m_bc1HorizontalOffset; // (right - left)
424 bc1Y = (btdc[9] - btdc[3]) * m_bc1VerticalSlope + m_bc1VerticalOffset; // (up - down)
425 } else {
426 bc1X = (btdc[1] - btdc[0]) * m_bc1HorizontalSlope + m_bc1HorizontalOffset; // (right - left)
427 bc1Y = (btdc[2] - btdc[3]) * m_bc1VerticalSlope + m_bc1VerticalOffset; // (up - down)
428 }
429 fill(m_tools[m_beamChamberGroups.at("BC1")], bc1X, bc1Y);
430
431 // For BC2:
432 auto bc2X = Monitored::Scalar<double>("BC2X", (btdc[5] - btdc[4]) * m_bc2HorizontalSlope + m_bc2HorizontalOffset); // (right - left)
433 auto bc2Y = Monitored::Scalar<double>("BC2Y", (btdc[6] - btdc[7]) * m_bc2VerticalSlope + m_bc2VerticalOffset); // (up - down)
434 fill(m_tools[m_beamChamberGroups.at("BC2")], bc2X, bc2Y);
435
436 // Sum Plots
437 // For BC1
438 auto bc1Xsum = Monitored::Scalar<double>("BC1Xsum", 0.);
439 auto bc1Ysum = Monitored::Scalar<double>("BC1Ysum", 0.);;
440 if (run > 2211444) {
441 bc1Xsum =(btdc[8] + btdc[0]) * m_bc1HorizontalSlope + m_bc1HorizontalOffset;
442 bc1Ysum = (btdc[9] + btdc[3]) * m_bc1VerticalSlope + m_bc1VerticalOffset;
443 } else {
444 bc1Xsum = (btdc[1] + btdc[0]) * m_bc1HorizontalSlope + m_bc1HorizontalOffset;
445 bc1Ysum = (btdc[2] + btdc[3]) * m_bc1VerticalSlope + m_bc1VerticalOffset;
446 }
447 fill(m_tools[m_beamChamberGroups.at("BC1")], bc1Xsum, bc1Ysum);
448
449 //For BC2
450 auto bc2Xsum = Monitored::Scalar<double>("BC2Xsum", (btdc[5] + btdc[4]) * m_bc2HorizontalSlope + m_bc2HorizontalOffset);
451 auto bc2Ysum = Monitored::Scalar<double>("BC2Ysum", (btdc[6] + btdc[7]) * m_bc2VerticalSlope + m_bc2VerticalOffset);
452 fill(m_tools[m_beamChamberGroups.at("BC2")], bc2Xsum, bc2Ysum);
453
454 //Impact Coordinates
455 // For one cell, plot energy total as a function of x Impact -- (xImp, cell_energy)...
456 auto xImp = Monitored::Scalar<double>("Ximp", bc2X + (bc2X - bc1X) * m_beamBC2Z / (m_beamBC1Z - m_beamBC2Z));
457 auto yImp = Monitored::Scalar<double>("Yimp", bc2Y + (bc2Y - bc1Y) * m_beamBC2Z / (m_beamBC1Z - m_beamBC2Z));
458 fill("ImpactProfile", xImp, yImp);
459
460
461 if (!m_caloCellContainerKey.empty()) {
462
464 ATH_CHECK( caloCellContainer.isValid() );
465
466 if (!caloCellContainer->empty()) {
467
468 double cellEnergy = 0;
469 double totalEnergy(0.0);
470
471 for (const CaloCell* cell : *caloCellContainer) {
472 if (m_tileID->is_tile(cell->ID())) {
473 const TileCell* tile_cell = dynamic_cast<const TileCell*>(cell);
474 if (!tile_cell) continue;
475
476 const CaloDetDescrElement* caloDDE = cell->caloDDE();
477
478 IdentifierHash hash1 = caloDDE->onl1();
479 IdentifierHash hash2 = caloDDE->onl2();
480
481 double energy = 0.0;
482
483 int gain1 = tile_cell->gain1();
484
485 HWIdentifier channelId1 = m_tileHWID->channel_id(hash1);
486
487 int ros1 = m_tileHWID->ros(channelId1);
488 int drawer1 = m_tileHWID->drawer(channelId1);
489 int channel1 = m_tileHWID->channel(channelId1);
490 int drawerIdx1 = TileCalibUtils::getDrawerIdx(ros1, drawer1);
491
492 if (hash2 == TileHWID::NOT_VALID_HASH) {
493 if (m_monitoredDrawerIdx[drawerIdx1]) {
494 if (gain1 >= 0 && !((m_maskedChannels[drawerIdx1][channel1] >> gain1) & 1U)) {
495 energy = cell->energy();
496 }
497 }
498 } else {
499
500 int gain2 = tile_cell->gain2();
501
502 HWIdentifier channelId2 = m_tileHWID->channel_id(hash2);
503
504 int ros2 = m_tileHWID->ros(channelId2);
505 int drawer2 = m_tileHWID->drawer(channelId2);
506 int channel2 = m_tileHWID->channel(channelId2);
507 int drawerIdx2 = TileCalibUtils::getDrawerIdx(ros2, drawer2);
508
509 if (m_monitoredDrawerIdx[drawerIdx1] || m_monitoredDrawerIdx[drawerIdx2]) {
510 if (gain1 < 0 || ((m_maskedChannels[drawerIdx1][channel1] >> gain1) & 1U)) {
511 if (gain2 >= 0 && !((m_maskedChannels[drawerIdx2][channel2] >> gain2) & 1U)) {
512 energy = tile_cell->ene2() * 2;
513 }
514 } else if (gain2 >= 0 && ((m_maskedChannels[drawerIdx2][channel2] >> gain2) & 1U)) {
515 if (gain1 >= 0 && !((m_maskedChannels[drawerIdx1][channel1] >> gain1) & 1U)) {
516 energy = tile_cell->ene1() * 2;
517 }
518 } else {
519 energy = cell->energy();
520 }
521 }
522 }
523
524 double energy_pC = energy * 0.001; // keep energy in pC;
525 totalEnergy += energy_pC;
526
527 if (energy_pC > cellEnergy) {
528 cellEnergy = energy_pC;
529 }
530 }
531 }
532
533 auto monCellEnergy = Monitored::Scalar<double>("cellEnergy", cellEnergy);
534 auto monTotalEnergy = Monitored::Scalar<double>("totalEnergy", totalEnergy);
535
536 for (int counter = 0; counter < N_CHERENKOV; ++counter) {
537 auto monAmplitude = Monitored::Scalar<double>("amplitude", cherenkov[counter]);
538 fill(m_tools[m_cherenkovVsEnergyGroups[counter]], monTotalEnergy, monAmplitude);
539 }
540
541 fill("CellEnergyImpactX", xImp, monCellEnergy);
542 fill("CellEnergyImpactY", yImp, monCellEnergy);
543 fill("TotalEnergyImpactX", xImp, monTotalEnergy);
544 fill("TotalEnergyImpactY", yImp, monTotalEnergy);
545
546 auto monAmplitudeS1 = Monitored::Scalar<double>("amplitude", sCounter[0]);
547 fill("ScinCalEnergy", monAmplitudeS1, monTotalEnergy);
548 }
549 }
550
551 fill("TileTBBeamMonExecuteTime", timer);
552
553 return StatusCode::SUCCESS;
554}
555
556
557void TileTBBeamMonitorAlgorithm::errorWrongChannel(int frag, int channel) const {
558 ATH_MSG_ERROR("Wrong channel " << channel
559 << " in frag 0x" << MSG::hex << frag << MSG::dec
560 << " - " << BeamFragName[frag & 0x1F]);
561}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Handle class for reading from StoreGate.
#define MUON_ADC_FRAG
Definition TileTBFrag.h:25
#define COMMON_PTN_FRAG
Definition TileTBFrag.h:48
#define COMMON_ADC1_FRAG
Definition TileTBFrag.h:43
#define COMMON_ADC2_FRAG
Definition TileTBFrag.h:44
#define COMMON_TDC1_FRAG
Definition TileTBFrag.h:46
#define COMMON_TOF_FRAG
Definition TileTBFrag.h:45
#define ADDR_ADC_FRAG
Definition TileTBFrag.h:26
#define BEAM_ADC_FRAG
Definition TileTBFrag.h:24
static const std::string BeamFragName[32]
Definition TileTBFrag.h:58
const ServiceHandle< StoreGateSvc > & detStore() 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.
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
This class groups all DetDescr information related to a CaloCell.
IdentifierHash onl2() const
cell online identifier 2
IdentifierHash onl1() const
cell online identifier 1
This is a "hash" representation of an Identifier.
Declare a monitored scalar variable.
A monitored timer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
static std::string getDrawerString(unsigned int ros, unsigned int drawer)
Return the drawer name, e.g.
static const unsigned int MAX_GAIN
Number of gains per channel.
static const unsigned int MAX_DRAWER
Number of drawers in ROS 1-4.
static unsigned int getDrawerIdx(unsigned int ros, unsigned int drawer)
Returns a drawer hash.
static const unsigned int MAX_CHAN
Number of channels in drawer.
int gain2(void) const
get gain of second PMT
Definition TileCell.cxx:175
int gain1(void) const
get gain of first PMT
Definition TileCell.cxx:168
float ene1(void) const
get energy of first PMT
Definition TileCell.h:187
float ene2(void) const
get energy of second PMT
Definition TileCell.h:189
@ NOT_VALID_HASH
Definition TileHWID.h:314
virtual StatusCode initialize() override
initialize
std::array< bool, N_MUON_WALL_PMT > m_maskedMuPMTs
Gaudi::Property< double > m_beamBC1Z
Gaudi::Property< std::vector< int > > m_fragIDs
Gaudi::Property< double > m_beamBC2Z
std::array< std::array< unsigned char, TileCalibUtils::MAX_CHAN >, TileCalibUtils::MAX_DRAWERIDX > m_maskedChannels
Gaudi::Property< double > m_bc2VerticalOffset
std::map< std::string, int > m_beamChamberGroups
ServiceHandle< TileCablingSvc > m_cablingSvc
Name of Tile cabling service.
Gaudi::Property< double > m_bc1VerticalSlope
Gaudi::Property< std::vector< unsigned int > > m_maskMuonPMTs
Gaudi::Property< double > m_bc2HorizontalSlope
std::vector< std::vector< int > > m_cherenkovVsTOFGroups
std::array< bool, TileCalibUtils::MAX_DRAWERIDX > m_monitoredDrawerIdx
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
void errorWrongChannel(int frag, int channel) const
Gaudi::Property< double > m_bc2HorizontalOffset
Gaudi::Property< std::vector< std::string > > m_masked
Gaudi::Property< double > m_bc1HorizontalOffset
SG::ReadHandleKey< TileBeamElemContainer > m_beamElemContainerKey
Gaudi::Property< double > m_bc1HorizontalSlope
SG::ReadHandleKey< CaloCellContainer > m_caloCellContainerKey
Gaudi::Property< std::vector< std::pair< int, int > > > m_tofPairs
Gaudi::Property< double > m_bc1VerticalOffset
Gaudi::Property< double > m_bc2VerticalSlope
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)
Definition run.py:1
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
void fill(H5::Group &out_file, size_t iterations)