ATLAS Offline Software
PprMonitorAlgorithm.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // L1 objects
11 // xAOD
13 // =============================================
14 
15 #include "PprMonitorAlgorithm.h"
16 
17 
18 PprMonitorAlgorithm::PprMonitorAlgorithm( const std::string& name, ISvcLocator* pSvcLocator )
19  : AthMonitorAlgorithm(name,pSvcLocator)
20 {
21 }
22 
24 
25  ATH_MSG_DEBUG("PprMonitorAlgorithm::initialize");
26  ATH_MSG_DEBUG("Package Name "<< m_packageName);
27  ATH_MSG_DEBUG("m_xAODTriggerTowerContainerName "<< m_xAODTriggerTowerContainerName);
28  ATH_MSG_DEBUG("m_TT_ADC_HitMap_Thresh " << m_TT_ADC_HitMap_Thresh);
29 
30  // We initialise all the containers that we need
34 
35  // Initialize the groups for GenericMonitoringArrays
36  std::vector<std::string> partitionsEM = {"LArFCAL1C", "LArEMECC", "LArOverlapC", "LArEMBC", "LArEMBA", "LArOverlapA", "LArEMECA", "LArFCAL1A"};
37  m_groupTimeslice_EM = Monitored::buildToolMap<int>(m_tools, "groupTimeslice_EM", partitionsEM);
38 
39  std::vector<std::string> partitionsHAD = {"LArFCAL23C", "LArHECC", "TileEBC", "TileLBC", "TileLBA", "TileEBA", "LArHECA", "LArFCAL23A"};
40  m_groupTimeslice_HAD = Monitored::buildToolMap<int>(m_tools, "groupTimeslice_HAD", partitionsHAD);
41 
42  return StatusCode::SUCCESS;
43 }
44 
45 StatusCode PprMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const {
46 
47  ATH_MSG_DEBUG("PprMonitorAlgorithm::fillHistograms");
48 
49  // Retrieve event info from SG
50 
51  uint32_t bunchCrossing = 0;
52  bunchCrossing = ctx.eventID().bunch_crossing_id();
53  ATH_MSG_DEBUG("BCID: " << bunchCrossing);
54  const long long eventNumber = ctx.eventID().event_number();
55  ATH_MSG_DEBUG("Event Number" << eventNumber);
56 
57 
58  // Retrieve Trigger Towers from SG
60  if(!triggerTowerTES.isValid()){
61  ATH_MSG_ERROR("No Trigger Tower container found in TES "<< m_xAODTriggerTowerContainerName);
62  return StatusCode::FAILURE;
63  }
64 
65  // Create a vector of trigger towers with quantities to be monitored
66  std::vector<MonitorTT> vecMonTT; // All towers
67 
68  // Loop over trigger tower container
69  // Create the trigger tower objects and calculate scaled phi
70  for (const xAOD::TriggerTower* tt : *triggerTowerTES) {
71  ATH_CHECK( makePPMTower(tt, vecMonTT) );
72  }
73 
74  // Error vector for global overview
75  ErrorVector overview(8);
76  // Trigger tower error flag
77  bool triggerTowerHasError = false;
78 
79  // Loop over the trigger tower objects and fill the histograms
80 
81  for (auto& myTower : vecMonTT) {
82  ATH_MSG_DEBUG("PprMonitorAlgorithm looping over TTs");
83  // -------- LUT --------
84  int cpET = (myTower.tower)->cpET();
85  int jepET = myTower.jepET;
86  int layer = (myTower.tower)->layer();
87  bool isEM = (layer == 0);
88  bool isHAD = (layer == 1);
89  std::string layerName = (layer == 0) ? "EM" : "HAD";
90 
91  ATH_MSG_DEBUG("isEM " << isEM << " isHAD " << isHAD << " layerName " << layerName);
92  ATH_MSG_DEBUG("cpET: " << cpET << " jepET: " << jepET);
93 
94  // The variables to plot
95  auto eta_TT = Monitored::Scalar<double>("eta_TT", myTower.tower->eta());
96  auto cpET_TT = Monitored::Scalar<int>("cpET_TT", cpET);
97  auto jepET_TT = Monitored::Scalar<int>("jepET_TT", jepET);
98  auto BCID = Monitored::Scalar<uint32_t>("BCID", bunchCrossing);
99 
100  // The cutmasks
101  auto mask_EM = Monitored::Scalar<bool>("mask_EM", isEM);
102  auto mask_HAD = Monitored::Scalar<bool>("mask_HAD", isHAD);
103  auto mask_cpET_0 = Monitored::Scalar<bool>("mask_cpET_0", cpET > 0 );
104  auto mask_jepET_0 = Monitored::Scalar<bool>("mask_jepET_0", jepET > 0 );
105  auto mask_cpET_5 = Monitored::Scalar<bool>("mask_cpET_5", cpET > 5);
106  auto mask_jepET_5 = Monitored::Scalar<bool>("mask_jepET_5", jepET > 5);
107 
108  // Fill LUT histograms (layer-independent)
109  std::string groupName = "groupLUTCP";
110  fill(groupName, BCID, mask_cpET_5); // ppm_1d_tt_lutcp_LutPerBCN
111 
112  groupName = "groupLUTJEP";
113  fill(groupName, BCID, mask_jepET_5); // ppm_1d_tt_lutjep_LutPerBCN
114 
115  // Layer-dependent LUT-CP plots (EM or HAD)
116  groupName = "groupLUTCP_";
117  groupName.append(layerName);
118 
119  // Fill LUT-CP eta and ET distributions
120  // ppm_em_1d_tt_lutcp_Eta, ppm_had_1d_tt_lutcp_Eta
121  // ppm_em_1d_tt_lutcp_Et, ppm_had_1d_tt_lutcp_Et
122  fill(groupName, eta_TT, cpET_TT, mask_cpET_0);
123 
124  // Fill LUT-CP phi distributions
125  // ppm_em_1d_tt_lutcp_Phi, ppm_had_1d_tt_lutcp_Phi
126  if (cpET > 0) {
127  ATH_CHECK( fillPPMPhi(myTower, groupName) );
128 
129  // Fill LUT-CP eta-phi maps
130  // ppm_em_2d_etaPhi_tt_lutcp_AverageEt, ppm_had_2d_etaPhi_tt_lutcp_AverageEt
131  if (cpET > 5) {
132  ATH_CHECK( fillPPMEtaPhi(myTower, groupName, "cpET_TT_2D", cpET) );
133  }
134  }
135 
136  // LUT hitmaps per threshold
137  // ppm_em_2d_etaPhi_tt_lutcp_Threshold, ppm_had_2d_etaPhi_tt_lutcp_Threshold
138 
139  for (int th : m_TT_HitMap_ThreshVec) {
140  groupName = "groupLUTCP_"+layerName+"_"+std::to_string(th)+"_LB";
141  ATH_MSG_DEBUG("Filling group " << groupName);
142  ATH_MSG_DEBUG("cpET > " << th << " ? " << (cpET > th));
143  if (cpET > th) {
144  ATH_CHECK( fillPPMEtaPhi(myTower, groupName, "", 1.) );
145  }
146  }
147 
148  // LUT-JEP
149  groupName = "groupLUTJEP_";
150  groupName.append(layerName);
151 
152  // Fill LUT-JEP eta and ET distributions
153  // ppm_em_1d_tt_lutjep_Eta, ppm_had_1d_tt_lutjep_Eta
154  // ppm_em_1d_tt_lutjep_Et, ppm_had_1d_tt_lutjep_Et
155  fill(groupName, eta_TT, jepET_TT, mask_jepET_0); // LUT-JEP eta and ET distributions
156 
157  // Fill LUT-JEP phi distributions
158  // ppm_em_1d_tt_lutjep_Phi, ppm_had_1d_tt_lutjep_Phi
159  if (jepET > 0) {
160  ATH_CHECK( fillPPMPhi(myTower, groupName) );
161 
162  // Fill LUT-JEP eta-phi maps
163  // ppm_em_2d_etaPhi_tt_lutjep_AverageEt, ppm_had_2d_etaPhi_tt_lutjep_AverageEt
164  if (jepET > 5) {
165  ATH_CHECK( fillPPMEtaPhi(myTower, groupName, "jepET_TT_2D", jepET) );
166  }
167  }
168 
169  // LUT hitmaps per threshold
170  // ppm_em_2d_etaPhi_tt_lutjep_Threshold, ppm_had_2d_etaPhi_tt_lutcp_Threshold
171 
172  for (int th : m_TT_HitMap_ThreshVec) {
173  groupName = "groupLUTJEP_"+layerName+"_"+std::to_string(th)+"_LB";
174  ATH_MSG_DEBUG("Filling group " << groupName);
175  ATH_MSG_DEBUG("jepET > " << th << " ? " << (jepET > th));
176  if (jepET > th) {
177  ATH_CHECK( fillPPMEtaPhi(myTower, groupName, "", 1.) );
178  }
179 
180  }
181 
182  // -------- ADC hitmaps per timeslice --------
183  unsigned int tslice = (myTower.tower)->adcPeak();
184  unsigned int adcSize = ((myTower.tower)->adc()).size();
185 
186  // Number of triggered timeslice
187  groupName = "groupTimeslice_";
188  groupName.append(layerName);
189 
190  auto adcPeak = Monitored::Scalar<unsigned int>("adcPeak", tslice);
191  fill(groupName, adcPeak);
192 
193  if (tslice < adcSize) {
194  groupName = "groupADC_";
195  groupName.append(layerName);
196  const int ADC = ((myTower.tower)->adc())[tslice];
197  if (ADC > m_TT_ADC_HitMap_Thresh) {
198  // Fills both ppm_em_2d_etaPhi_tt_adc_HitMap (unweighted) and ppm_em_2d_etaPhi_tt_adc_ProfileHitMap (weighted) at the same time
199  ATH_CHECK(fillPPMEtaPhi(myTower, groupName, "adcTT", ADC));
200  }
201  }
202 
203  // -------- Timing of FADC signal --------
204 
205  int max = myTower.maxADC;
206  int maxADCPlus1 = max + 1;
207  auto maxADC = Monitored::Scalar<unsigned int>("maxADC", max);
208 
209  groupName = "groupTimeslice_";
210  groupName.append(layerName);
211 
212  if (max >= 0.) {
213  fill(groupName, maxADC);
214  ATH_CHECK(fillPPMEtaPhi(myTower, groupName, "maxADCPlus1", maxADCPlus1));
215  }
216 
217  // -------- Bits of BCID logic word --------
218 
219  // ppm_2d_tt_adc_BcidBits
220  groupName = "groupTimeslice";
221 
222  auto bcidBits = Monitored::Scalar<int>("bcidBits", 0);
223  auto adcBCID = Monitored::Scalar<int>("adcBCID", 0);
224 
225  short unsigned int peak = (myTower.tower)->peak();
226 
227  if (cpET > 0 && tslice < adcSize) { // Defined above in ADC hitmaps per timeslice block
228 
229  adcBCID = ((myTower.tower)->adc())[tslice];
230  uint8_t bcidWord = (myTower.tower)->bcidVec()[peak];
231 
232  if (bcidWord == char(0) || bcidWord == char(1)) { // None (40 MHz)
233  bcidBits = 0;
234  fill(groupName, bcidBits, adcBCID);
235  }
236  else if (bcidWord == char(2) || bcidWord == char(3)) { // satBC only
237  bcidBits = 1;
238  fill(groupName, bcidBits, adcBCID);
239  }
240  else if (bcidWord == char(4) || bcidWord == char(5)) { // PF only
241  bcidBits = 2;
242  fill(groupName, bcidBits, adcBCID);
243  }
244  else if (bcidWord == char(6) || bcidWord == char(7)) { // satBC & PF
245  bcidBits = 3;
246  fill(groupName, bcidBits, adcBCID);
247  }
248  if (bcidWord == char(5) || bcidWord == char(7)) { // sat80BC & PF
249  bcidBits = 4;
250  fill(groupName, bcidBits, adcBCID);
251  }
252  if (bcidWord == char(3) || bcidWord == char(7)) { // sat80BC & sat40BC
253  bcidBits = 5;
254  fill(groupName, bcidBits, adcBCID);
255  }
256  if (bcidWord == char(1)) { // sat80BC only
257  bcidBits = 6;
258  fill(groupName, bcidBits, adcBCID);
259  }
260  }
261 
262 
263  // -------- High/low threshold pass cases (Sat80) --------
264  // ppm_1d_tt_adc_HLCase
265 
266  if (cpET > 0 && tslice < adcSize && peak < (myTower.tower)->sat80Vec().size()) {
267  auto sat80Word = Monitored::Scalar<int>("sat80Word", (myTower.tower)->sat80Vec()[peak]);
268  for(unsigned int i = 0; i < 8; i++) {
269  if (sat80Word == char(i)) fill(groupName, sat80Word);
270  }
271  }
272 
273 
274  // -------- Signal shape profile --------
275  // ppm_1d_tt_adc_SignalProfile
276 
277  const std::vector<short unsigned int> &vADC((myTower.tower)->adc());
278 
279  if (cpET > 0) {
280 
281  const std::string part = getPartition(layer, myTower.tower->eta());
282  std::vector<short unsigned int>::const_iterator it = vADC.begin();
283  std::vector<short unsigned int>::const_iterator itE = vADC.end();
284 
285  for (int s = 0; it!= itE && s < m_SliceNo; ++it, ++s) {
286  auto slice = Monitored::Scalar<int>("slice", s);
287  auto wADC = Monitored::Scalar<int>("wADC", *it);
288  if (isEM) fill(m_tools[m_groupTimeslice_EM.at(part)], slice, wADC);
289  else fill(m_tools[m_groupTimeslice_HAD.at(part)], slice, wADC);
290  }
291  } // End if cpeT > 0 (signal shape block)
292 
293 
294 
295  // -------- Pedestal correction over-/underflow --------
296 
297  // ppm_em_1d_pedOverflow_Eta, ppm_had_1d_pedOverflow_Eta
298  // ppm_em_1d_pedUnderflow_Eta, ppm_had_1d_pedUnderflow_Eta
299 
300  groupName = "groupErrors_";
301  groupName.append(layerName);
302 
303  bool isPedCorrOverflow = false;
304  bool isPedCorrUnderflow = false;
305 
306  for (auto pedCorr : (myTower.tower)->correction()) {
307  if ( pedCorr >= 511 ) isPedCorrOverflow = true;
308  else if ( pedCorr <= -512 ) isPedCorrUnderflow = true;
309  }
310 
311  auto mask_PedCorrOverflow = Monitored::Scalar<bool>("mask_PedCorrOverflow", isPedCorrOverflow);
312  auto mask_PedCorrUnderflow = Monitored::Scalar<bool>("mask_PedCorrUnderflow", isPedCorrUnderflow);
313 
314  fill(groupName, eta_TT, mask_PedCorrOverflow, mask_PedCorrUnderflow);
315 
316 
317  //------------ SubStatus Word errors ----------------
318 
319  // set maximum number of error events per lumiblock(per type) to avoid histograms with many x-bins
320  // Inspired by https://gitlab.cern.ch/atlas/athena/-/blob/22.0/Trigger/TrigT1/TrigT1CaloMonitoring/src/CpmSimMonitorAlgorithm.cxx#L267
321  const int maxErrorsPerLB = 10;
322  auto currentLumiblock = GetEventInfo(ctx)->lumiBlock();
323 
324  using LVL1::DataError;
325  if ( (myTower.tower)->errorWord()) {
326  const LVL1::DataError err((myTower.tower)->errorWord());
327  const L1CaloCoolChannelId coolId((myTower.tower)->coolId());
328  const int crate = coolId.crate();
329  const int module = coolId.module();
330  const int ypos = (crate < 4) ? module + crate * 16 : module + (crate - 4) * 16;
331 
332  auto eventMonitor= Monitored::Scalar<std::string>("eventMonitor", std::to_string(eventNumber));
333  auto y_2D = Monitored::Scalar<int>("y_2D", ypos);
334 
335  {
336  std::lock_guard<std::mutex> lock(m_mutex);
337 
338 
339  for (int bit = 0; bit < 8; ++bit) {
340  auto bit_2D = Monitored::Scalar<int>("bit_2D", bit);
341 
342  if (err.get(bit + DataError::ChannelDisabled)) {
343  if (crate < 4) fill("groupErrorField03", bit_2D, y_2D );
344  else fill("groupErrorField47", bit_2D, y_2D );
345  if (m_errorLB_tt_counter[currentLumiblock]<maxErrorsPerLB && (!triggerTowerHasError)) {
346  fill("groupASICErrorEventNumbers", eventMonitor, bit_2D );
347  m_errorLB_tt_counter[currentLumiblock]+=1;
348  triggerTowerHasError = true;
349  }
350  }
351 
352  if (err.get(bit + DataError::GLinkParity)) {
353  if (crate < 4) fill("groupStatus03", bit_2D, y_2D );
354  else fill("groupStatus47", bit_2D, y_2D );
355  fill("group1DErrorSummary", bit_2D);
356 
357  if ((m_errorLB_tt_counter[currentLumiblock]<maxErrorsPerLB) && (!triggerTowerHasError)) {
358  fill("groupErrorEventNumbers", eventMonitor, bit_2D );
359  m_errorLB_tt_counter[currentLumiblock]+=1;
360  triggerTowerHasError = true;
361  }
362 
363  }
364  }
365 
366  if (err.get(DataError::ChannelDisabled) ||
367  err.get(DataError::MCMAbsent))
368  overview[crate] |= 1;
369 
370  if (err.get(DataError::Timeout) || err.get(DataError::ASICFull) ||
371  err.get(DataError::EventMismatch) ||
372  err.get(DataError::BunchMismatch) ||
373  err.get(DataError::FIFOCorrupt) || err.get(DataError::PinParity))
374  overview[crate] |= (1 << 1);
375 
376  if (err.get(DataError::GLinkParity) ||
377  err.get(DataError::GLinkProtocol) ||
378  err.get(DataError::FIFOOverflow) ||
379  err.get(DataError::ModuleError) || err.get(DataError::GLinkDown) ||
380  err.get(DataError::GLinkTimeout) || err.get(DataError::BCNMismatch))
381  overview[crate] |= (1 << 2);
382 
383  }
384 
385  }
386 
387 
388 
389 
390  } // End loop over tower objects
391 
392  // Save error vector for global summary
393  {
394  auto save = std::make_unique<ErrorVector>(overview);
395  auto* result = SG::makeHandle(m_errorLocation, ctx).put(std::move(save));
396  if (!result) {
397  ATH_MSG_ERROR("Error recording PPM vector in TES");
398  return StatusCode::FAILURE;
399  }
400  }
401 
402 
403 
404 
405  return StatusCode::SUCCESS;
406 }
407 
409  std::vector<MonitorTT> &vecMonTT) const
410 {
411  // Geometry
412  const double phi = tt->phi();
413  double phiMod = phi * m_phiScaleTT;
414 
415  // LUT JEP
416  int jepET = 0;
417  const std::vector<uint_least8_t>& jepETvec = tt->lut_jep();
418  if (jepETvec.size() > 0) jepET = tt->jepET();
419 
420  // ADC timeslice
421  const std::vector<short unsigned int> &ADC( tt->adc() );
422  double max = recTime(ADC, m_EMFADCCut);
423 
424  // Fill TT quantities
425  MonitorTT monTT;
426  monTT.tower = tt;
427  monTT.phiScaled = phiMod;
428  monTT.jepET = jepET;
429  monTT.maxADC = max;
430  vecMonTT.push_back(monTT);
431 
432  return StatusCode::SUCCESS;
433 }
434 
435 
436 double PprMonitorAlgorithm::recTime(const std::vector<short unsigned int> &vFADC, int cut) const {
437 
438  int max = -1;
439  const int slices = vFADC.size();
440  if (slices > 0) {
441  max = 0.;
442  int maxAdc = vFADC[0];
443  for (int sl = 1; sl < slices; ++sl) {
444  if (vFADC[sl] > maxAdc) {
445  maxAdc = vFADC[sl];
446  max = sl;
447  } else if (vFADC[sl] == maxAdc)
448  max = -1;
449  }
450  if (maxAdc == 0)
451  max = -1;
452  }
453  if (max >= 0) {
454  int slbeg = max - 2;
455  if (slbeg < 0)
456  slbeg = 0;
457  int slend = max + 3;
458  if (slend > slices)
459  slend = slices;
460  int sum = 0;
461  int min = 999999;
462  for (int sl = slbeg; sl < slend; ++sl) {
463  int val = vFADC[sl];
464  if (val < m_TT_ADC_Pedestal)
466  sum += val;
467  if (val < min)
468  min = val;
469  }
470  sum -= (slend - slbeg) * min;
471  if (sum <= cut)
472  max = -1;
473  }
474 
475  return double(max);
476 }
477 
478 
479 std::string PprMonitorAlgorithm::getPartition(int layer, double eta) const {
480 
481  std::string part = "";
482  if (layer == 0) { // EM layer
483  if (eta < -3.2)
484  part = "LArFCAL1C";
485  else if (eta < -1.5)
486  part = "LArEMECC";
487  else if (eta < -1.4)
488  part = "LArOverlapC";
489  else if (eta < 0.0)
490  part = "LArEMBC";
491  else if (eta < 1.4)
492  part = "LArEMBA";
493  else if (eta < 1.5)
494  part = "LArOverlapA";
495  else if (eta < 3.2)
496  part = "LArEMECA";
497  else
498  part = "LArFCAL1A";
499  } else { // HAD layer
500  if (eta < -3.2)
501  part = "LArFCAL23C";
502  else if (eta < -1.5)
503  part = "LArHECC";
504  else if (eta < -0.9)
505  part = "TileEBC";
506  else if (eta < 0.0)
507  part = "TileLBC";
508  else if (eta < 0.9)
509  part = "TileLBA";
510  else if (eta < 1.5)
511  part = "TileEBA";
512  else if (eta < 3.2)
513  part = "LArHECA";
514  else
515  part = "LArFCAL23A";
516  }
517  return part;
518 }
519 
520 
522  const std::string& groupName,
523  const std::string& weightName,
524  double weight/*=1.*/) const {
525 
526  // Number of bins filled in phi depends on eta due to electronics coverage
527 
528  // KW to do: fill in shrinkEtaBins part
529  double phiMod = monTT.phiScaled; // Integer binning for 2D plots
530  double etaMod = monTT.tower->eta();
531  const double absEta = std::abs(etaMod);
532 
533  const std::vector<double> offset32 = {1.5, 0.5, -0.5, -1.5};
534  const std::vector<double> offset25 = {0.5, -0.5};
535  std::vector<double> offset = {};
536 
537  if (absEta > 3.2) {
538  // Fill four bins in phi
539  phiMod = std::floor(phiMod/4)*4. + 2.;
540  offset = offset32;
541  }
542  else if (absEta > 2.5) {
543  // Fill two bins in phi
544  phiMod = std::floor(phiMod/2)*2. + 1.;
545  offset = offset25;
546  }
547  else {
548  offset = {0.};
549  }
550 
551  // Fill the histograms
552  for (auto phiOffset : offset) {
553 
554  auto etaTT_2D = Monitored::Scalar<double>("etaTT_2D", etaMod);
555  auto phiTT_2D = Monitored::Scalar<double>("phiTT_2D", phiMod + phiOffset);
556  auto weight_2D = Monitored::Scalar<double>(weightName, weight); // Weight for filling 2D profile histograms; name must be included in python histogram definition
557  ATH_MSG_DEBUG("etaTT_2D: " << etaTT_2D << " phiTT_2D: " << phiTT_2D << " weight_2D: " << weight_2D);
558  ATH_MSG_DEBUG("groupName: " << groupName);
559  fill(groupName, etaTT_2D, phiTT_2D, weight_2D);
560 
561  }
562 
563  return StatusCode::SUCCESS;
564 }
565 
567  const std::string& groupName) const {
568 
569  // Number of bins filled in phi depends on eta due to electronics coverage
570 
571  const double phi = monTT.tower->phi(); // Using the actual phi value for 1D plots
572  const double absEta = std::abs(monTT.tower->eta());
573 
574  const std::vector<double> offset32 = {1.5, 0.5, -0.5, -1.5};
575  const std::vector<double> offset25 = {0.5, -0.5};
576  std::vector<double> offset = {};
577 
578  double phi1d = phi;
579 
580  if (absEta > 3.2) {
581  // Fill four bins in phi
582  offset = offset32;
583  }
584  else if (absEta > 2.5) {
585  // Fill two bins in phi
586  offset = offset25;
587  }
588  else {
589  // Fill one phi bin
590  offset = {0.};
591  }
592 
593  // Fill the histogram
594  for (auto phiOffset : offset) {
595  phi1d = phi + phiOffset/m_phiScaleTT;
596  auto phiTT_1D = Monitored::Scalar<double>("phiTT_1D", phi1d);
597  fill(groupName, phiTT_1D);
598  }
599 
600  return StatusCode::SUCCESS;
601 
602 }
603 
604 
LArG4FSStartPointFilter.part
part
Definition: LArG4FSStartPointFilter.py:21
L1CaloCoolChannelId.h
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
MonDataType::ADC
@ ADC
LVL1::DataError
Error data.
Definition: DataError.h:27
get_generator_info.result
result
Definition: get_generator_info.py:21
max
#define max(a, b)
Definition: cfImp.cxx:41
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:575
xAOD::TriggerTower_v2::phi
virtual double phi() const final
The azimuthal angle ( ) of the particle.
Definition: TriggerTower_v2.cxx:222
PprMonitorAlgorithm::m_TT_ADC_HitMap_Thresh
Gaudi::Property< int > m_TT_ADC_HitMap_Thresh
Definition: PprMonitorAlgorithm.h:37
PprMonitorAlgorithm::MonitorTT::jepET
int jepET
max ADC timeslice
Definition: PprMonitorAlgorithm.h:23
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
PprMonitorAlgorithm::m_TT_ADC_Pedestal
Gaudi::Property< int > m_TT_ADC_Pedestal
Definition: PprMonitorAlgorithm.h:40
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
RunTileMonitoring.groupName
groupName
Definition: RunTileMonitoring.py:158
xAOD::char
char
Definition: TrigDecision_v1.cxx:38
TriggerTowerContainer.h
skel.it
it
Definition: skel.GENtoEVGEN.py:423
PprMonitorAlgorithm::makePPMTower
StatusCode makePPMTower(const xAOD::TriggerTower_v2 *tt, std::vector< MonitorTT > &vecMonTT) const
Helper functions.
Definition: PprMonitorAlgorithm.cxx:408
L1CaloCoolChannelId::crate
unsigned int crate() const
Definition: L1CaloCoolChannelId.h:25
PprMonitorAlgorithm::m_xAODTriggerTowerContainerName
SG::ReadHandleKey< xAOD::TriggerTowerContainer > m_xAODTriggerTowerContainerName
container keys including steering parameter and description
Definition: PprMonitorAlgorithm.h:32
PprMonitorAlgorithm::MonitorTT::tower
const xAOD::TriggerTower_v2 * tower
Definition: PprMonitorAlgorithm.h:20
PprMonitorAlgorithm::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Definition: PprMonitorAlgorithm.cxx:45
PprMonitorAlgorithm::MonitorTT
Struct to contain PPM trigger tower info.
Definition: PprMonitorAlgorithm.h:19
TruthTest.itE
itE
Definition: TruthTest.py:25
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:200
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
PixelByteStreamErrors::BCID
@ BCID
Definition: PixelByteStreamErrors.h:13
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:270
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
python.PyAthena.module
module
Definition: PyAthena.py:134
PprMonitorAlgorithm::recTime
double recTime(const std::vector< short unsigned int > &vFADC, int cut) const
Definition: PprMonitorAlgorithm.cxx:436
PprMonitorAlgorithm.h
checkTP.save
def save(self, fileName="./columbo.out")
Definition: checkTP.py:178
PprMonitorAlgorithm::m_TT_HitMap_ThreshVec
Gaudi::Property< std::vector< int > > m_TT_HitMap_ThreshVec
Definition: PprMonitorAlgorithm.h:41
python.TriggerHandler.th
th
Definition: TriggerHandler.py:296
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
convertTimingResiduals.sum
sum
Definition: convertTimingResiduals.py:55
dqt_zlumi_pandas.err
err
Definition: dqt_zlumi_pandas.py:193
perfmonmt-refit.slice
slice
Definition: perfmonmt-refit.py:52
lumiFormat.i
int i
Definition: lumiFormat.py:92
PprMonitorAlgorithm::fillPPMPhi
StatusCode fillPPMPhi(MonitorTT &monTT, const std::string &groupName) const
Definition: PprMonitorAlgorithm.cxx:566
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
PprMonitorAlgorithm::m_mutex
std::mutex m_mutex
Definition: PprMonitorAlgorithm.h:71
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
xAOD::TriggerTower_v2
Description of TriggerTower_v2.
Definition: TriggerTower_v2.h:49
PprMonitorAlgorithm::m_packageName
StringProperty m_packageName
Definition: PprMonitorAlgorithm.h:29
BindingsTest.cut
cut
This script demonstrates how to call a C++ class from Python Also how to use PyROOT is shown.
Definition: BindingsTest.py:13
xAOD::TriggerTower_v2::eta
virtual double eta() const final
The pseudorapidity ( ) of the particle.
Definition: TriggerTower_v2.cxx:210
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
PprMonitorAlgorithm::getPartition
std::string getPartition(int layer, double eta) const
Definition: PprMonitorAlgorithm.cxx:479
xAOD::eventNumber
eventNumber
Definition: EventInfo_v1.cxx:124
AthMonitorAlgorithm::fill
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable >> &&variables) const
Fills a vector of variables to a group by reference.
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
AthMonitorAlgorithm::GetEventInfo
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.)
Definition: AthMonitorAlgorithm.cxx:107
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
DataError.h
min
#define min(a, b)
Definition: cfImp.cxx:40
PprMonitorAlgorithm::m_EMFADCCut
Gaudi::Property< int > m_EMFADCCut
Definition: PprMonitorAlgorithm.h:39
AthMonitorAlgorithm::m_tools
ToolHandleArray< GenericMonitoringTool > m_tools
Array of Generic Monitoring Tools.
Definition: AthMonitorAlgorithm.h:338
PprMonitorAlgorithm::m_groupTimeslice_HAD
std::map< std::string, int > m_groupTimeslice_HAD
Definition: PprMonitorAlgorithm.h:45
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
TriggerTower_ClassDEF.h
PprMonitorAlgorithm::ErrorVector
std::vector< int > ErrorVector
Definition: PprMonitorAlgorithm.h:51
TrigT1CaloDefs.h
PprMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: PprMonitorAlgorithm.cxx:23
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
PprMonitorAlgorithm::m_phiScaleTT
Gaudi::Property< double > m_phiScaleTT
Properties.
Definition: PprMonitorAlgorithm.h:36
L1CaloCoolChannelId
Definition: L1CaloCoolChannelId.h:10
PprMonitorAlgorithm::fillPPMEtaPhi
StatusCode fillPPMEtaPhi(MonitorTT &monTT, const std::string &groupName, const std::string &weightName, double weight=1.) const
Definition: PprMonitorAlgorithm.cxx:521
ReadFloatFromCool.adc
adc
Definition: ReadFloatFromCool.py:48
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
PprMonitorAlgorithm::m_groupTimeslice_EM
std::map< std::string, int > m_groupTimeslice_EM
Groups for GenericMonitoringArrays.
Definition: PprMonitorAlgorithm.h:44
PprMonitorAlgorithm::MonitorTT::maxADC
double maxADC
phi for 2d maps with integer bins (taking into account granularity in eta)
Definition: PprMonitorAlgorithm.h:22
PprMonitorAlgorithm::PprMonitorAlgorithm
PprMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Definition: PprMonitorAlgorithm.cxx:18
convertTimingResiduals.offset
offset
Definition: convertTimingResiduals.py:71
TauGNNUtils::Variables::absEta
bool absEta(const xAOD::TauJet &tau, double &out)
Definition: TauGNNUtils.cxx:232
TriggerTowerCollection.h
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
fillSCTHists.etaMod
etaMod
Definition: fillSCTHists.py:23
StateLessPT_NewConfig.Timeout
Timeout
Definition: StateLessPT_NewConfig.py:297
PprMonitorAlgorithm::m_errorLocation
SG::WriteHandleKey< std::vector< int > > m_errorLocation
Definition: PprMonitorAlgorithm.h:49
TileDCSDataPlotter.tt
tt
Definition: TileDCSDataPlotter.py:874
PprMonitorAlgorithm::MonitorTT::phiScaled
double phiScaled
Definition: PprMonitorAlgorithm.h:21
keylayer_zslicemap.slices
slices
Definition: keylayer_zslicemap.py:112
PprMonitorAlgorithm::m_SliceNo
Gaudi::Property< int > m_SliceNo
Definition: PprMonitorAlgorithm.h:38
L1CaloCoolChannelId::module
unsigned int module(bool logical=true) const