ATLAS Offline Software
JepCmxMonitorAlgorithm.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 JepCmxMonitorAlgorithm::JepCmxMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
8  : AthMonitorAlgorithm(name, pSvcLocator)
9 {
10 }
11 
13 {
14 
15  ATH_MSG_DEBUG("JepCmxMonitorAlgorith::initialize");
16  ATH_MSG_DEBUG("Package Name " << m_packageName);
17 
18  // container names
19  ATH_MSG_DEBUG("m_CMXJetTobLocation " << m_CMXJetTobLocation);
20  ATH_MSG_DEBUG("m_CMXJetHitsLocation " << m_CMXJetHitsLocation);
21  ATH_MSG_DEBUG("m_CMXEtSumsLocation " << m_CMXEtSumsLocation);
22  ATH_MSG_DEBUG("m_CMXRoILocation " << m_CMXJetHitsLocation);
23 
24  // steering parameters
25  ATH_MSG_DEBUG("m_crates" << m_crates);
26  ATH_MSG_DEBUG("m_modules" << m_modules);
27  ATH_MSG_DEBUG("m_tobsPerJem" << m_tobsPerJem);
28  ATH_MSG_DEBUG("m_maxTobsPerCmx" << m_maxTobsPerCmx);
29 
30  // we initialise all the containers that we need
31  ATH_CHECK(m_CMXJetTobLocation.initialize());
32  ATH_CHECK(m_CMXJetHitsLocation.initialize());
33  ATH_CHECK(m_CMXEtSumsLocation.initialize());
34  ATH_CHECK(m_CMXRoILocation.initialize());
35 
37 }
38 
39 StatusCode JepCmxMonitorAlgorithm::fillHistograms(const EventContext &ctx) const
40 {
41 
42  ATH_MSG_DEBUG("JepCmxMonitorAlgorithm::fillHistograms");
43 
44  // total error summary
45  auto cmxErrorSummary = Monitored::Scalar<int>("cmxErrorSummary", 0);
46 
47  // triggered slice numbers
48  int j_num_slice = -1;
49  int e_num_slice = -1;
50 
51  // Error vector for global overview
52  std::vector<int> overview(2);
53 
54  using LVL1::DataError;
55 
56  // =========================================================================
57  // ================= Container: CMX Jet TOBs ===============================
58  // =========================================================================
59 
60  // retrieve CMX Jet TOBs from Storegate
62  if (!CMXJetTob.isValid())
63  {
64  ATH_MSG_ERROR("No CMX JetTob found in TES at " << m_CMXJetTobLocation);
65  return StatusCode::FAILURE;
66  }
67 
68  ATH_MSG_DEBUG("-------------- CMX Jet TOBs ---------------");
69 
70  auto jetTobEnergyLg = Monitored::Scalar<int>("jetTobEnergyLg", 0.);
71  auto jetTobEnergySm = Monitored::Scalar<int>("jetTobEnergySm", 0.);
72  auto jetTobHitmap_x = Monitored::Scalar<int>("jetTobHitmap_x", 0.);
73  auto jetTobHitmap_y = Monitored::Scalar<int>("jetTobHitmap_y", 0.);
74 
75  auto tobsPerJem = Monitored::Scalar<int>("tobsPerJem", 0.);
76  auto tobsPerCmx = Monitored::Scalar<int>("tobsPerCmx", 0.);
77 
78  auto threshParityTobJem = Monitored::Scalar<int>("threshParityTobJem", 0.);
79  auto threshParityTobCrate = Monitored::Scalar<int>("threshParityTobCrate", 0.);
80 
81  std::vector<int> tobCount(m_crates * m_modules);
82  std::vector<int> cmxCount(m_crates);
83 
84  // Step over all cells
85  xAOD::CMXJetTobContainer::const_iterator it_CMXJetTob = (*CMXJetTob).begin();
86  xAOD::CMXJetTobContainer::const_iterator it_CMXJetTob_end = (*CMXJetTob).end();
87  for (; it_CMXJetTob != it_CMXJetTob_end; ++it_CMXJetTob)
88  {
89  const int crate = (*it_CMXJetTob)->crate();
90  const int jem = (*it_CMXJetTob)->jem();
91  const int frame = (*it_CMXJetTob)->frame();
92  const int location = (*it_CMXJetTob)->location();
93  const int energyLg = (*it_CMXJetTob)->energyLarge();
94  const int energySm = (*it_CMXJetTob)->energySmall();
95  const int error = (*it_CMXJetTob)->error();
96  const int x = crate * m_modules + jem;
97  const int y = frame * 4 + location;
98 
99  if (energyLg) {
100  jetTobEnergyLg = energyLg;
101  fill(m_packageName, jetTobEnergyLg);
102  jetTobHitmap_x = x;
103  jetTobHitmap_y = y;
104  fill(m_packageName, jetTobHitmap_x, jetTobHitmap_y);
105  }
106  if (energySm) {
107  jetTobEnergySm = energySm;
108  fill(m_packageName, jetTobEnergySm);
109  }
110  if (error) {
111  const LVL1::DataError err(error);
112  int parity = err.get(LVL1::DataError::Parity);
113  if (parity) {
114  threshParityTobJem = jem;
115  threshParityTobCrate = crate;
116  fill(m_packageName, threshParityTobJem, threshParityTobCrate);
117  cmxErrorSummary = JetParity;
118  fill(m_packageName, cmxErrorSummary);
119  overview[crate] |= (1 << JetParity);
120  }
121  }
122  if (energyLg || energySm || error) {
123  ++tobCount[x];
124  ++cmxCount[crate];
125  }
126  }
127 
128  // step over crates
129  for (int crate = 0; crate < m_crates; ++crate) {
130  for (int jem = 0; jem < m_modules; ++jem) {
131  int val = tobCount[crate * m_modules + jem];
132  if (val) {
133  if (val > m_tobsPerJem)
134  val = m_tobsPerJem + 1;
135  tobsPerJem = val;
136  fill(m_packageName, tobsPerJem);
137  }
138  }
139  int val = cmxCount[crate];
140  if (val) {
141  if (val >= m_maxTobsPerCmx)
142  val = m_maxTobsPerCmx - 1;
143  tobsPerCmx = val;
144  fill(m_packageName, tobsPerCmx);
145  }
146  }
147 
148  // =========================================================================
149  // ================= Container: CMX Jet Hits ===============================
150  // =========================================================================
151 
152  // retrieve CMX Jet Hits from Storegate
154  if (!CMXJetHits.isValid()) {
155  ATH_MSG_ERROR("No CMX JetHits found in TES at " << m_CMXJetHitsLocation);
156  return StatusCode::FAILURE;
157  }
158 
159  ATH_MSG_DEBUG("-------------- CMX Jet Hits ---------------");
160 
161  auto threshTotalMainVals = Monitored::Scalar<int>("threshTotalMainVals", 0.);
162  auto threshTotalMainHits = Monitored::Scalar<int>("threshTotalMainHits", 0.);
163 
164  auto threshRoiOverflow = Monitored::Scalar<int>("threshRoiOverflow", 0.);
165  auto topoDataChecksum = Monitored::Scalar<int>("topoDataChecksum", 0.);
166  auto topoTobsPerJem = Monitored::Scalar<int>("topoTobsPerJem", 0.);
167  auto topoTobsPerCmx = Monitored::Scalar<int>("topoTobsPerCmx", 0.);
168 
169  auto topoJemOccMap_mod = Monitored::Scalar<int>("topoJemOccMap_mod", 0.);
170  auto topoJemOccMap_cra = Monitored::Scalar<int>("topoJemOccMap_cra", 0.);
171  auto topoJemOccMap_hit = Monitored::Scalar<int>("topoJemOccMap_hit", 0.);
172 
173  auto topoJemOccCount_mod = Monitored::Scalar<int>("topoJemOccCount_mod", 0.);
174  auto topoJemOccCount_cra = Monitored::Scalar<int>("topoJemOccCount_cra", 0.);
175  auto topoJemOccCount_hit = Monitored::Scalar<int>("topoJemOccCount_hit", 0.);
176 
177  auto cmxThreshStatusErr_bit = Monitored::Scalar<int>("cmxThreshStatusErr_bit", 0.);
178  auto cmxThreshStatusErr_crate = Monitored::Scalar<int>("cmxThreshStatusErr_crate", 0.);
179 
180  auto cmxThreshParityErr = Monitored::Scalar<int>("cmxThreshParityErr", 0.);
181 
182  cmxCount.assign(m_crates, 0);
183 
184  // Step over all cells
185  xAOD::CMXJetHitsContainer::const_iterator it_CMXJetHits = (*CMXJetHits).begin();
186  xAOD::CMXJetHitsContainer::const_iterator it_CMXJetHitsEnd = (*CMXJetHits).end();
187  for (; it_CMXJetHits != it_CMXJetHitsEnd; ++it_CMXJetHits) {
188  const int crate = (*it_CMXJetHits)->crate();
189  const int source = (*it_CMXJetHits)->sourceComponent();
190  const unsigned int hits0 = (*it_CMXJetHits)->hits0();
191  const unsigned int hits1 = (*it_CMXJetHits)->hits1();
192  const DataError err0((*it_CMXJetHits)->error0());
193  const DataError err1((*it_CMXJetHits)->error1());
194 
195  // -----------------------------------------------------------------------
196  // --------- Histos with distribution of CMX Hit Multiplicities ----------
197  // -----------------------------------------------------------------------
198 
199  if (source == xAOD::CMXJetHits::TOTAL_MAIN) {
200  fillThresholds(threshTotalMainVals, threshTotalMainHits, hits0, 5, 3);
201  fillThresholds(threshTotalMainVals, threshTotalMainHits, hits1, 5, 3, 5);
202  }
203  // RoI overflow
204  if (crate == m_crates - 1 && err0.get(DataError::Overflow)) {
205  const int x = (source == xAOD::CMXJetHits::REMOTE_MAIN)
206  ? 0
207  : (source == xAOD::CMXJetHits::LOCAL_MAIN)
208  ? 1
209  : (source == xAOD::CMXJetHits::TOTAL_MAIN) ? 2
210  : 3;
211  if (x < 3) {
212  threshRoiOverflow = x;
213  fill(m_packageName, threshRoiOverflow);
214  }
215  }
216 
217  // -----------------------------------------------------------------------
218  // ------------------- Histos with Topo information ----------------------
219  // -----------------------------------------------------------------------
220 
221  else if (source == xAOD::CMXJetHits::TOPO_CHECKSUM) {
222  if (hits0) {
223  topoDataChecksum = crate;
224  fill(m_packageName, topoDataChecksum);
225  }
226  }
227  else if (source == xAOD::CMXJetHits::TOPO_OCCUPANCY_MAP) {
228  if (hits0)
229  {
230  fillThresholdsVsY(topoJemOccMap_mod, topoJemOccMap_cra, topoJemOccMap_hit,
231  hits0, crate, m_modules, 1);
232  }
233  }
234  else if (source == xAOD::CMXJetHits::TOPO_OCCUPANCY_COUNTS) {
235  if (hits0)
236  {
237  fillThresholdsVsY(topoJemOccCount_mod, topoJemOccCount_cra, topoJemOccCount_hit,
238  hits0, crate, m_modules / 2, 3);
239  for (int mod = 0; mod < m_modules / 2; ++mod) {
240  const int val = (hits0 >> (mod * 3)) & 0x7;
241  if (val) {
242  topoTobsPerJem = val;
243  fill(m_packageName, topoTobsPerJem);
244  cmxCount[crate] += val;
245  }
246  }
247  }
248  if (hits1) {
249  fillThresholdsVsY(topoJemOccCount_mod, topoJemOccCount_cra, topoJemOccCount_hit,
250  hits1, crate, m_modules / 2, 3, m_modules / 2);
251  for (int mod = 0; mod < m_modules / 2; ++mod) {
252  const int val = (hits1 >> (mod * 3)) & 0x7;
253  if (val) {
254  topoTobsPerJem = val;
255  fill(m_packageName, topoTobsPerJem);
256  cmxCount[crate] += val;
257  }
258  }
259  }
260  }
261 
262  // -----------------------------------------------------------------------
263  // ----------------- Histos with SubStatus Word errors -------------------
264  // -----------------------------------------------------------------------
265 
266  if (j_num_slice < 0) j_num_slice = (*it_CMXJetHits)->peak();
267 
268  // Error summary plots
269  // substatus word
270  const int status = (err0.error() >> LVL1::DataError::GLinkParity) & 0xff;
271  if (status) {
272  for (int bit = 0; bit < 8; ++bit) {
273  if ((status >> bit) & 0x1) {
274  cmxThreshStatusErr_bit = bit;
275  cmxThreshStatusErr_crate = crate;
276  fill(m_packageName, cmxThreshStatusErr_bit, cmxThreshStatusErr_crate);
277  }
278  }
279  cmxErrorSummary = JetStatus;
280  fill(m_packageName, cmxErrorSummary);
281  overview[crate] |= (1 << JetStatus);
282  }
283 
284  if (source == xAOD::CMXJetHits::REMOTE_MAIN ||
286  {
287  // Parity
288  const int p0 = err0.get(DataError::Parity);
289  const int p1 = err1.get(DataError::Parity);
290  if (p0 || p1) {
291  if (p0) { // cable 0/phase 0 or cable 1/phase 0
292  const int xpos = (source == xAOD::CMXJetHits::REMOTE_MAIN) ? 0 : 2;
293  cmxThreshParityErr = xpos;
294  fill(m_packageName, cmxThreshParityErr);
295  }
296  if (p1) { // cable 0/phase 1 or cable 1/phase 1
297  const int xpos = (source == xAOD::CMXJetHits::REMOTE_MAIN) ? 1 : 3;
298  cmxThreshParityErr = xpos;
299  fill(m_packageName, cmxThreshParityErr);
300  }
301  cmxErrorSummary = JetParity;
302  fill(m_packageName, cmxErrorSummary);
303  overview[crate] |= (1 << JetParity);
304  }
305  }
306  }
307 
308  for (int crate = 0; crate < m_crates; ++crate) {
309  int val = cmxCount[crate];
310  if (val) {
311  if (val >= m_maxTobsPerCmx)
312  val = m_maxTobsPerCmx - 1;
313  topoTobsPerCmx = val;
314  fill(m_packageName, topoTobsPerCmx);
315  }
316  }
317 
318  // =========================================================================
319  // ================= Container: CMX Et Sums ================================
320  // =========================================================================
321 
322  // retrieve CMX Jet TOBs from Storegate
324  if (!CMXEtSums.isValid()) {
325  ATH_MSG_ERROR("No CMXEtSums found in TES at " << m_CMXEtSumsLocation);
326  return StatusCode::FAILURE;
327  }
328 
329  ATH_MSG_DEBUG("-------------- CMX Et Sums ---------------");
330 
331  auto eSubSumsEx = Monitored::Scalar<int>("eSubSumsEx", 0.);
332  auto eSubSumsEy = Monitored::Scalar<int>("eSubSumsEy", 0.);
333  auto eSubSumsEt = Monitored::Scalar<int>("eSubSumsEt", 0.);
334 
335  auto cmxTotalEx = Monitored::Scalar<int>("cmxTotalEx", 0.);
336  auto cmxTotalEy = Monitored::Scalar<int>("cmxTotalEy", 0.);
337  auto cmxTotalEt = Monitored::Scalar<int>("cmxTotalEt", 0.);
338  auto cmxTotalExRes = Monitored::Scalar<int>("cmxTotalExRes", 0.);
339  auto cmxTotalEyRes = Monitored::Scalar<int>("cmxTotalEyRes", 0.);
340  auto cmxTotalEtRes = Monitored::Scalar<int>("cmxTotalEtRes", 0.);
341 
342  auto cmxMissingEt_vals = Monitored::Scalar<int>("cmxMissingEt_vals", 0.);
343  auto cmxMissingEt_hits = Monitored::Scalar<int>("cmxMissingEt_hits", 0.);
344  auto cmxMissingEtSig_vals = Monitored::Scalar<int>("cmxMissingEtSig_vals", 0.);
345  auto cmxMissingEtSig_hits = Monitored::Scalar<int>("cmxMissingEtSig_hits", 0.);
346  auto cmxMissingEtHitsRes_vals = Monitored::Scalar<int>("cmxMissingEtHitsRes_vals", 0.);
347  auto cmxMissingEtHitsRes_hits = Monitored::Scalar<int>("cmxMissingEtHitsRes_hits", 0.);
348 
349  auto cmxSumEt_vals = Monitored::Scalar<int>("cmxSumEt_vals", 0.);
350  auto cmxSumEt_hits = Monitored::Scalar<int>("cmxSumEt_hits", 0.);
351  auto cmxSumEtHitsWt_vals = Monitored::Scalar<int>("cmxSumEtHitsWt_vals", 0.);
352  auto cmxSumEtHitsWt_hits = Monitored::Scalar<int>("cmxSumEtHitsWt_hits", 0.);
353 
354  auto cmxTriggeredSlice = Monitored::Scalar<int>("cmxTriggeredSlice", 0.);
355 
356  auto cmxEnergyStatus_bit = Monitored::Scalar<int>("cmxEnergyStatus_bit", 0.);
357  auto cmxEnergyStatus_cra = Monitored::Scalar<int>("cmxEnergyStatus_cra", 0.);
358 
359  auto cmxEnergyParityModx = Monitored::Scalar<int>("cmxEnergyParityModx", 0.);
360  auto cmxEnergyParityMody = Monitored::Scalar<int>("cmxEnergyParityMody", 0.);
361 
362  auto cmxParityRem = Monitored::Scalar<int>("cmxParityRem", 0.);
363 
364  auto cmxEnergyOverflowx = Monitored::Scalar<int>("cmxEnergyOverflowx", 0.);
365  auto cmxEnergyOverflowy = Monitored::Scalar<int>("cmxEnergyOverflowy", 0.);
366  auto cmxEnergyOverflowz = Monitored::Scalar<int>("cmxEnergyOverflowz", 0.);
367 
368  auto cmxEnergyOverflowResx = Monitored::Scalar<int>("cmxEnergyOverflowResx", 0.);
369  auto cmxEnergyOverflowResy = Monitored::Scalar<int>("cmxEnergyOverflowResy", 0.);
370  auto cmxEnergyOverflowResz = Monitored::Scalar<int>("cmxEnergyOverflowResz", 0.);
371 
372  // Step over all cells
373  xAOD::CMXEtSumsContainer::const_iterator it_CMXEtSums = CMXEtSums->begin();
374  xAOD::CMXEtSumsContainer::const_iterator it_CMXEtSums_end = CMXEtSums->end();
375  for (; it_CMXEtSums != it_CMXEtSums_end; ++it_CMXEtSums) {
376  const int crate = (*it_CMXEtSums)->crate();
377  const int source = (*it_CMXEtSums)->sourceComponent();
378  const unsigned int rawEx = (*it_CMXEtSums)->ex();
379  const unsigned int rawEy = (*it_CMXEtSums)->ey();
380  const unsigned int rawEt = (*it_CMXEtSums)->et();
381  const int exError = (*it_CMXEtSums)->exError();
382  const int eyError = (*it_CMXEtSums)->eyError();
383  const int etError = (*it_CMXEtSums)->etError();
384 
385  // -----------------------------------------------------------------------
386  // -------------- Histos with distribution of JEM Energies ---------------
387  // -----------------------------------------------------------------------
388  // JEM energy sums
389  if (source < m_modules) {
390  const int ex = rawEx;
391  const int ey = rawEy;
392  const int et = rawEt;
393 
394  if (ex) {
395  eSubSumsEx = ex;
396  fill(m_packageName, eSubSumsEx);
397  }
398  if (ey) {
399  eSubSumsEy = ey;
400  fill(m_packageName, eSubSumsEy);
401  }
402  if (et) {
403  eSubSumsEt = et;
404  fill(m_packageName, eSubSumsEt);
405  }
406  }
407 
408  // -----------------------------------------------------------------------
409  // ---------- Histos with distribution of total Energy per system --------
410  // -----------------------------------------------------------------------
411  // total energy sums
412  else if (source == xAOD::CMXEtSums::TOTAL_STANDARD ||
414  // Use CrateEnergy object to decode 15-bit twos-complement format
415  LVL1::CrateEnergy cen(crate, rawEt, rawEx, rawEy, etError & 0x1, exError & 0x1, eyError & 0x1);
416  const int ex = cen.ex();
417  const int ey = cen.ey();
418  const int et = rawEt;
419 
420  if (source == xAOD::CMXEtSums::TOTAL_STANDARD) {
421  if (ex && !cen.exOverflow()) {
422  cmxTotalEx = ex;
423  fill(m_packageName, cmxTotalEx);
424  }
425  if (ey && !cen.eyOverflow()) {
426  cmxTotalEy = ey;
427  fill(m_packageName, cmxTotalEy);
428  }
429  if (et && !cen.etOverflow()) {
430  cmxTotalEt = et;
431  fill(m_packageName, cmxTotalEt);
432  }
433  }
434  else {
435  if (ex && !cen.exOverflow()) {
436  cmxTotalExRes = ex;
437  fill(m_packageName, cmxTotalExRes);
438  }
439  if (ey && !cen.eyOverflow()) {
440  cmxTotalEyRes = ey;
441  fill(m_packageName, cmxTotalEyRes);
442  }
443  if (et && !cen.etOverflow()) {
444  cmxTotalEtRes = et;
445  fill(m_packageName, cmxTotalEtRes);
446  }
447  }
448  }
449  // MissingEt/SumEt/MissingEtSig Hitmaps
450  else if (source == xAOD::CMXEtSums::MISSING_ET_STANDARD ||
453  const int nHits = 8;
454  if (source == xAOD::CMXEtSums::MISSING_ET_STANDARD) {
455  fillThresholds(cmxMissingEt_vals, cmxMissingEt_hits, rawEt, nHits, 1);
456  }
457  else if (source == xAOD::CMXEtSums::SUM_ET_STANDARD) {
458  fillThresholds(cmxSumEt_vals, cmxSumEt_hits, rawEt, nHits, 1);
459  }
460  else if (source == xAOD::CMXEtSums::MISSING_ET_SIG_STANDARD) {
461  fillThresholds(cmxMissingEtSig_vals, cmxMissingEtSig_hits, rawEt, nHits, 1);
462  }
463  }
464  else if (source == xAOD::CMXEtSums::MISSING_ET_RESTRICTED ||
466  const int nHits = 8;
468  fillThresholds(cmxMissingEtHitsRes_vals, cmxMissingEtHitsRes_hits, rawEt, nHits, 1);
469  }
470  else fillThresholds(cmxSumEtHitsWt_vals, cmxSumEtHitsWt_hits, rawEt, nHits, 1);
471  }
472 
473  if (e_num_slice < 0) {
474  e_num_slice = (*it_CMXEtSums)->peak();
475  if (j_num_slice >= 0) {
476  cmxTriggeredSlice = std::abs(e_num_slice - j_num_slice);
477  fill(m_packageName, cmxTriggeredSlice);
478  }
479  }
480 
481  // -----------------------------------------------------------------------
482  // --------------- Histos with SubStatus Word errors ---------------------
483  // -----------------------------------------------------------------------
484  //Error summary plots
485  //substatus word
486  const DataError exerr(exError);
487  const DataError eyerr(eyError);
488  const DataError eterr(etError);
489  const int status = (eterr.error() >> LVL1::DataError::GLinkParity) & 0xff;
490  if (status) {
491  for (int bit = 0; bit < 8; ++bit) {
492  if ((status >> bit) & 0x1) {
493  cmxEnergyStatus_bit = bit;
494  cmxEnergyStatus_cra = crate;
495  fill(m_packageName, cmxEnergyStatus_bit, cmxEnergyStatus_cra);
496  }
497  }
498  cmxErrorSummary = JetParity;
499  fill(m_packageName, cmxErrorSummary);
500  overview[crate] |= (1 << EnergyStatus);
501  }
502 
503  if (source < m_modules || source == xAOD::CMXEtSums::REMOTE_STANDARD ||
505  // Parity
506  const int p0 = exerr.get(DataError::Parity);
507  const int p1 = eyerr.get(DataError::Parity);
508  const int p2 = eterr.get(DataError::Parity);
509  if (p0 || p1 || p2) {
510  // backplane parity
511  if (source < m_modules) {
512  const int xpos = crate * m_modules + source;
513  cmxEnergyParityModx = xpos;
514  if (p0) cmxEnergyParityMody = 0.;
515  if (p1) cmxEnergyParityMody = 1.;
516  if (p2) cmxEnergyParityMody = 2.;
517  fill(m_packageName, cmxEnergyParityModx, cmxEnergyParityMody);
518  }
519  // cable transmission parity
520  else if (source == xAOD::CMXEtSums::REMOTE_STANDARD) {
521  if (p0) cmxParityRem = 0.; // cable 0, phase 0
522  if (p1) cmxParityRem = 1.; // cable 0, phase 1
523  }
524  else {
525  if (p0) cmxParityRem = 2.; // cable 1, phase 0
526  if (p1) cmxParityRem = 3.; // cable 1, phase 1
527  }
528  fill(m_packageName, cmxParityRem);
529  cmxErrorSummary = EnergyParity;
530  fill(m_packageName, cmxErrorSummary);
531  overview[crate] |= (1 << EnergyParity);
532  }
533  }
534 
535  // Overflow - not an error, plot rate
536  if (crate == 1) {
537  if (source == xAOD::CMXEtSums::REMOTE_STANDARD ||
540  const double ypos = (source == xAOD::CMXEtSums::REMOTE_STANDARD) ? 0.
541  : (source == xAOD::CMXEtSums::LOCAL_STANDARD) ? 1.
542  : 2.;
543  cmxEnergyOverflowy = ypos;
544 
545  cmxEnergyOverflowx = 0.;
546  cmxEnergyOverflowz = exerr.get(DataError::Overflow);
547  fill(m_packageName, cmxEnergyOverflowx, cmxEnergyOverflowy, cmxEnergyOverflowz);
548 
549  cmxEnergyOverflowx = 1.;
550  cmxEnergyOverflowz = eyerr.get(DataError::Overflow);
551  fill(m_packageName, cmxEnergyOverflowx, cmxEnergyOverflowy, cmxEnergyOverflowz);
552 
553  cmxEnergyOverflowx = 2.;
554  cmxEnergyOverflowz = eterr.get(DataError::Overflow);
555  fill(m_packageName, cmxEnergyOverflowx, cmxEnergyOverflowy, cmxEnergyOverflowz);
556  }
557  else if (source == xAOD::CMXEtSums::REMOTE_RESTRICTED ||
560  const double ypos = (source == xAOD::CMXEtSums::REMOTE_RESTRICTED) ? 0.
561  : (source == xAOD::CMXEtSums::LOCAL_RESTRICTED) ? 1.
562  : 2.;
563  cmxEnergyOverflowResy = ypos;
564 
565  cmxEnergyOverflowResx = 0.;
566  cmxEnergyOverflowResz = exerr.get(DataError::Overflow);
567  fill(m_packageName, cmxEnergyOverflowResx, cmxEnergyOverflowResy, cmxEnergyOverflowResz);
568 
569  cmxEnergyOverflowResx = 1.;
570  cmxEnergyOverflowResz = eyerr.get(DataError::Overflow);
571  fill(m_packageName, cmxEnergyOverflowResx, cmxEnergyOverflowResy, cmxEnergyOverflowResz);
572 
573  cmxEnergyOverflowResx = 2.;
574  cmxEnergyOverflowResz = eterr.get(DataError::Overflow);
575  fill(m_packageName, cmxEnergyOverflowResx, cmxEnergyOverflowResy, cmxEnergyOverflowResz);
576  }
577  }
578  }
579 
580  // =========================================================================
581  // ================= Container: CMX RoI ====================================
582  // =========================================================================
583 
584  // retrieve RoI information from Storegate
586  if (!CRCon.isValid()) {
587  ATH_MSG_ERROR("No CMX RoI found in TES at " << m_CMXRoILocation);
588  return StatusCode::FAILURE;
589  }
590 
591  const xAOD::CMXRoI *CR = *CRCon->begin();
592 
593  ATH_MSG_DEBUG("-------------- CMX RoI ---------------");
594 
595  auto roiSumEtHits_var = Monitored::Scalar<int>("roiSumEtHits_var", 0.);
596  auto roiSumEtHits_hit = Monitored::Scalar<int>("roiSumEtHits_hit", 0.);
597 
598  auto roiMissingEtHits_var = Monitored::Scalar<int>("roiMissingEtHits_var", 0.);
599  auto roiMissingEtHits_hit = Monitored::Scalar<int>("roiMissingEtHits_hit", 0.);
600 
601  auto roiMissingEtSigHits_var = Monitored::Scalar<int>("roiMissingEtSigHits_var");
602  auto roiMissingEtSigHits_hit = Monitored::Scalar<int>("roiMissingEtSigHits_hit");
603 
604  auto roiSumEtHitsMask_var = Monitored::Scalar<int>("roiSumEtHitsMask_var");
605  auto roiSumEtHitsMask_hit = Monitored::Scalar<int>("roiSumEtHitsMask_hit");
606 
607  auto roiMissingEtHitsMask_var = Monitored::Scalar<int>("roiMissingEtHitsMask_var");
608  auto roiMissingEtHitsMask_hit = Monitored::Scalar<int>("roiMissingEtHitsMask_hit");
609 
610  auto cmxRoiEx = Monitored::Scalar<int>("cmxRoiEx", 0.);
611  auto cmxRoiEy = Monitored::Scalar<int>("cmxRoiEy", 0.);
612  auto cmxRoiEt = Monitored::Scalar<int>("cmxRoiEt", 0.);
613 
614  auto cmxRoiExMask = Monitored::Scalar<int>("cmxRoiExMask", 0.);
615  auto cmxRoiEyMask = Monitored::Scalar<int>("cmxRoiEyMask", 0.);
616  auto cmxRoiEtMask = Monitored::Scalar<int>("cmxRoiEtMask", 0.);
617 
618  // -------------------------------------------------------------------------
619  // -------------- Histos filled with CMX RoI information -------------------
620  // -------------------------------------------------------------------------
621 
622  const int rawEx = CR->ex();
623  const int rawEy = CR->ey();
624  const int et = CR->et();
625  const int exError = CR->exError();
626  const int eyError = CR->eyError();
627  const int etError = CR->etError();
628  const int sumEtHits = CR->sumEtHits();
629  const int missingEtHits = CR->missingEtHits();
630  const int missingEtSigHits = CR->missingEtSigHits();
631  const int rawExM = CR->ex(xAOD::CMXRoI::MASKED);
632  const int rawEyM = CR->ey(xAOD::CMXRoI::MASKED);
633  const int etM = CR->et(xAOD::CMXRoI::MASKED);
634  const int exErrorM = CR->exError(xAOD::CMXRoI::MASKED);
635  const int eyErrorM = CR->eyError(xAOD::CMXRoI::MASKED);
636  const int etErrorM = CR->etError(xAOD::CMXRoI::MASKED);
637  const int sumEtHitsM = CR->sumEtHits(xAOD::CMXRoI::MASKED);
638  const int missingEtHitsM = CR->missingEtHits(xAOD::CMXRoI::MASKED);
639 
640  fillThresholds(roiSumEtHits_var, roiSumEtHits_hit, sumEtHits, 8, 1);
641  fillThresholds(roiMissingEtHits_var, roiMissingEtHits_hit, missingEtHits, 8, 1);
642  fillThresholds(roiMissingEtSigHits_var, roiMissingEtSigHits_hit, missingEtSigHits, 8, 1);
643  fillThresholds(roiSumEtHitsMask_var, roiSumEtHitsMask_hit, sumEtHitsM, 8, 1);
644  fillThresholds(roiMissingEtHitsMask_var, roiMissingEtHitsMask_hit, missingEtHitsM, 8, 1);
645 
646  // Use CrateEnergy object to decode 15-bit twos-complement format
647  LVL1::CrateEnergy cen(1, et, rawEx, rawEy, etError & 0x1, exError & 0x1, eyError & 0x1);
648  const int ex = cen.ex();
649  const int ey = cen.ey();
650 
651  if (ex && !cen.exOverflow()) {
652  cmxRoiEx = ex;
653  fill(m_packageName, cmxRoiEx);
654  }
655  if (ey && !cen.eyOverflow()) {
656  cmxRoiEy = ey;
657  fill(m_packageName, cmxRoiEy);
658  }
659  if (et && !cen.etOverflow()) {
660  cmxRoiEt = et;
661  fill(m_packageName, cmxRoiEt);
662  }
663 
664  LVL1::CrateEnergy cen2(1, etM, rawExM, rawEyM, etErrorM & 0x1, exErrorM & 0x1, eyErrorM & 0x1);
665  const int exM = cen2.ex();
666  const int eyM = cen2.ey();
667 
668  if (exM && !cen2.exOverflow()) {
669  cmxRoiExMask = exM;
670  fill(m_packageName, cmxRoiExMask);
671  }
672  if (eyM && !cen2.eyOverflow()) {
673  cmxRoiEyMask = eyM;
674  fill(m_packageName, cmxRoiEyMask);
675  }
676  if (etM && !cen2.etOverflow()) {
677  cmxRoiEtMask = etM;
678  fill(m_packageName, cmxRoiEtMask);
679  }
680 
681  return StatusCode::SUCCESS;
682 }
683 
685  Monitored::Scalar<int> &hitVar,
686  int val, int nThresh,
687  int nBits, int offset) const {
688  const int mask = (1 << nBits) - 1;
689  for (int thr = 0; thr < nThresh; ++thr) {
690  const int hit = (val >> (nBits * thr)) & mask;
691  if (hit) {
692  monVar = thr + offset;
693  hitVar = hit;
694  fill(m_packageName, monVar, hitVar);
695  }
696  }
697 }
698 
700  Monitored::Scalar<int> &monVarY,
701  Monitored::Scalar<int> &hitVar,
702  int val, int y, int nThresh,
703  int nBits, int offset) const {
704  const int mask = (1 << nBits) - 1;
705  for (int thr = 0; thr < nThresh; ++thr) {
706  const int hit = (val >> (nBits * thr)) & mask;
707  if (hit) {
708  monVarX = thr + offset;
709  monVarY = y;
710  hitVar = hit;
711  fill(m_packageName, monVarX, monVarY, hitVar);
712  }
713  }
714 }
xAOD::CMXRoI_v1::etError
int etError(SumType type=NORMAL) const
Return Et error flags (bit 0 Overflow)
Definition: CMXRoI_v1.cxx:117
JepCmxMonitorAlgorithm::m_CMXJetHitsLocation
SG::ReadHandleKey< xAOD::CMXJetHitsContainer > m_CMXJetHitsLocation
Definition: JepCmxMonitorAlgorithm.h:38
xAOD::CMXJetHits_v1::TOPO_CHECKSUM
@ TOPO_CHECKSUM
Definition: CMXJetHits_v1.h:39
xAOD::CMXEtSums_v1::LOCAL_RESTRICTED
@ LOCAL_RESTRICTED
Definition: CMXEtSums_v1.h:31
xAOD::CMXJetHits_v1::TOPO_OCCUPANCY_MAP
@ TOPO_OCCUPANCY_MAP
Definition: CMXJetHits_v1.h:40
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:216
et
Extra patterns decribing particle interation process.
JepCmxMonitorAlgorithm::m_modules
Gaudi::Property< int > m_modules
Definition: JepCmxMonitorAlgorithm.h:30
xAOD::CMXJetHits_v1::REMOTE_MAIN
@ REMOTE_MAIN
Definition: CMXJetHits_v1.h:33
LVL1::CrateEnergy::exOverflow
unsigned int exOverflow() const
Overflow bits.
Definition: CrateEnergy.cxx:238
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
xAOD::CMXEtSums_v1::MISSING_ET_RESTRICTED
@ MISSING_ET_RESTRICTED
Definition: CMXEtSums_v1.h:34
LVL1::CrateEnergy::eyOverflow
unsigned int eyOverflow() const
return Ey overflow bit
Definition: CrateEnergy.cxx:243
LVL1::DataError
Error data.
Definition: DataError.h:27
JepCmxMonitorAlgorithm::EnergyStatus
@ EnergyStatus
Definition: JepCmxMonitorAlgorithm.h:34
xAOD::CMXRoI_v1::missingEtSigHits
unsigned int missingEtSigHits() const
Return Missing-ET-Sig hits.
Definition: CMXRoI_v1.cxx:130
LVL1::CrateEnergy::etOverflow
unsigned int etOverflow() const
return Et overflow bit
Definition: CrateEnergy.cxx:233
xAOD::et
et
Definition: TrigEMCluster_v1.cxx:25
JepCmxMonitorAlgorithm::EnergyParity
@ EnergyParity
Definition: JepCmxMonitorAlgorithm.h:34
xAOD::CMXRoI_v1::eyError
int eyError(SumType type=NORMAL) const
Return Ey error flags (bit 0 Overflow)
Definition: CMXRoI_v1.cxx:113
JepCmxMonitorAlgorithm::m_CMXJetTobLocation
SG::ReadHandleKey< xAOD::CMXJetTobContainer > m_CMXJetTobLocation
Definition: JepCmxMonitorAlgorithm.h:37
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
xAOD::CMXJetHits_v1::TOTAL_MAIN
@ TOTAL_MAIN
Definition: CMXJetHits_v1.h:35
xAOD::CMXRoI_v1::ex
unsigned int ex(SumType type=NORMAL) const
Return Ex.
Definition: CMXRoI_v1.cxx:97
LVL1::CrateEnergy
CrateEnergy class declaration Simulates behaviour of the Crate-CMM System CMM logic is done in Energy...
Definition: CrateEnergy.h:34
xAOD::CMXEtSums_v1::TOTAL_RESTRICTED
@ TOTAL_RESTRICTED
Definition: CMXEtSums_v1.h:32
xAOD::CMXRoI_v1::et
unsigned int et(SumType type=NORMAL) const
Return Et.
Definition: CMXRoI_v1.cxx:105
LVL1::DataError::GLinkParity
@ GLinkParity
Definition: DataError.h:40
JepCmxMonitorAlgorithm::JepCmxMonitorAlgorithm
JepCmxMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Definition: JepCmxMonitorAlgorithm.cxx:7
x
#define x
JepCmxMonitorAlgorithm::m_maxTobsPerCmx
Gaudi::Property< int > m_maxTobsPerCmx
Definition: JepCmxMonitorAlgorithm.h:32
python.utils.AtlRunQueryLookup.mask
string mask
Definition: AtlRunQueryLookup.py:460
xAOD::CMXEtSums_v1::REMOTE_STANDARD
@ REMOTE_STANDARD
Definition: CMXEtSums_v1.h:30
JepCmxMonitorAlgorithm::JetParity
@ JetParity
Definition: JepCmxMonitorAlgorithm.h:34
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
JepCmxMonitorAlgorithm::m_crates
Gaudi::Property< int > m_crates
Definition: JepCmxMonitorAlgorithm.h:29
xAOD::CMXJetTob
CMXJetTob_v1 CMXJetTob
Define the latest version of the CMXJetTob class.
Definition: Event/xAOD/xAODTrigL1Calo/xAODTrigL1Calo/CMXJetTob.h:17
JepCmxMonitorAlgorithm::m_CMXRoILocation
SG::ReadHandleKey< xAOD::CMXRoIContainer > m_CMXRoILocation
Definition: JepCmxMonitorAlgorithm.h:40
xAOD::rawEt
rawEt
Definition: TrigCaloCluster_v1.cxx:25
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
xAOD::CMXJetHits_v1::TOPO_OCCUPANCY_COUNTS
@ TOPO_OCCUPANCY_COUNTS
Definition: CMXJetHits_v1.h:41
maskDeadModules.mod
mod
Definition: maskDeadModules.py:36
dqt_zlumi_pandas.err
err
Definition: dqt_zlumi_pandas.py:193
xAOD::CMXRoI_v1::sumEtHits
unsigned int sumEtHits(SumType type=NORMAL) const
Return Sum-ET hits.
Definition: CMXRoI_v1.cxx:121
xAOD::CMXEtSums_v1::MISSING_ET_STANDARD
@ MISSING_ET_STANDARD
Definition: CMXEtSums_v1.h:34
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
python.sizes.location
string location
Definition: sizes.py:11
xAOD::CMXEtSums_v1::crate
uint8_t crate() const
get crate
xAOD::CMXEtSums_v1::TOTAL_STANDARD
@ TOTAL_STANDARD
Definition: CMXEtSums_v1.h:32
xAOD::CMXJetHits_v1::LOCAL_MAIN
@ LOCAL_MAIN
Definition: CMXJetHits_v1.h:34
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
JepCmxMonitorAlgorithm::m_CMXEtSumsLocation
SG::ReadHandleKey< xAOD::CMXEtSumsContainer > m_CMXEtSumsLocation
Definition: JepCmxMonitorAlgorithm.h:39
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.
xAOD::CMXRoI_v1::exError
int exError(SumType type=NORMAL) const
Return Ex error flags (bit 0 Overflow)
Definition: CMXRoI_v1.cxx:109
xAOD::CMXEtSums_v1::MISSING_ET_SIG_STANDARD
@ MISSING_ET_SIG_STANDARD
Definition: CMXEtSums_v1.h:35
LVL1::DataError::Parity
@ Parity
Definition: DataError.h:31
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
xAOD::CMXEtSums_v1::REMOTE_RESTRICTED
@ REMOTE_RESTRICTED
Definition: CMXEtSums_v1.h:30
xAOD::CMXRoI_v1::ey
unsigned int ey(SumType type=NORMAL) const
Return Ey.
Definition: CMXRoI_v1.cxx:101
xAOD::CMXEtSums
CMXEtSums_v1 CMXEtSums
Define the latest version of the CMXEtSums class.
Definition: Event/xAOD/xAODTrigL1Calo/xAODTrigL1Calo/CMXEtSums.h:20
xAOD::CMXJetHits_v1::REMOTE_FORWARD
@ REMOTE_FORWARD
Definition: CMXJetHits_v1.h:36
JepCmxMonitorAlgorithm::fillThresholds
void fillThresholds(Monitored::Scalar< int > &monVar, Monitored::Scalar< int > &hitVar, int val, int nThresh, int nBits, int offset=0) const
Definition: JepCmxMonitorAlgorithm.cxx:684
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
xAOD::CMXEtSums_v1::SUM_ET_STANDARD
@ SUM_ET_STANDARD
Definition: CMXEtSums_v1.h:33
LVL1::CrateEnergy::ex
int ex() const
return crate Ex
Definition: CrateEnergy.cxx:223
JepCmxMonitorAlgorithm::JetStatus
@ JetStatus
Definition: JepCmxMonitorAlgorithm.h:34
JepCmxMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: JepCmxMonitorAlgorithm.cxx:12
JepCmxMonitorAlgorithm::fillThresholdsVsY
void fillThresholdsVsY(Monitored::Scalar< int > &monVarX, Monitored::Scalar< int > &monVarY, Monitored::Scalar< int > &hitVar, int val, int y, int nThresh, int nBits, int offset=0) const
Definition: JepCmxMonitorAlgorithm.cxx:699
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
LVL1::CrateEnergy::ey
int ey() const
return crate Ey
Definition: CrateEnergy.cxx:228
JepCmxMonitorAlgorithm::m_tobsPerJem
Gaudi::Property< int > m_tobsPerJem
Definition: JepCmxMonitorAlgorithm.h:31
y
#define y
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
xAOD::CMXRoI_v1::missingEtHits
unsigned int missingEtHits(SumType type=NORMAL) const
Return Missing-ET hits.
Definition: CMXRoI_v1.cxx:125
convertTimingResiduals.offset
offset
Definition: convertTimingResiduals.py:71
xAOD::CMXRoI_v1::MASKED
@ MASKED
Definition: CMXRoI_v1.h:30
merge.status
status
Definition: merge.py:17
xAOD::CMXEtSums_v1::LOCAL_STANDARD
@ LOCAL_STANDARD
Definition: CMXEtSums_v1.h:31
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
JepCmxMonitorAlgorithm::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Definition: JepCmxMonitorAlgorithm.cxx:39
xAOD::CMXEtSums_v1::SUM_ET_RESTRICTED
@ SUM_ET_RESTRICTED
Definition: CMXEtSums_v1.h:33
error
Definition: IImpactPoint3dEstimator.h:70
xAOD::CMXRoI_v1
Description of CMXRoI_v1.
Definition: CMXRoI_v1.h:27
JepCmxMonitorAlgorithm::m_packageName
StringProperty m_packageName
Definition: JepCmxMonitorAlgorithm.h:27
JepCmxMonitorAlgorithm.h
xAOD::CMXJetHits
CMXJetHits_v1 CMXJetHits
Define the latest version of the CMXJetHits class.
Definition: Event/xAOD/xAODTrigL1Calo/xAODTrigL1Calo/CMXJetHits.h:20
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.