ATLAS Offline Software
L1TopoOnlineMonitor.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // Local includes
6 #include "L1TopoOnlineMonitor.h"
7 
8 // Trigger includes
12 #include "L1TopoRDO/Helpers.h"
13 #include "L1TopoRDO/L1TopoROD.h"
14 #include "L1TopoRDO/L1TopoFPGA.h"
15 #include "L1TopoRDO/L1TopoResult.h"
16 
17 // System includes
18 #include <utility>
19 
20 
21 // Local helper constants and functions
22 namespace {
24  template<size_t N>
25  std::vector<size_t> bitsetIndices(const std::bitset<N>& bits) {
26  std::vector<size_t> indices;
27  indices.reserve(bits.count());
28  for (size_t i=0; i<bits.size(); ++i) {
29  if (bits[i]) indices.push_back(i);
30  }
31  return indices;
32  }
33 }
34 
35 // =============================================================================
36 // Standard constructor
37 // =============================================================================
38 L1TopoOnlineMonitor::L1TopoOnlineMonitor(const std::string& name, ISvcLocator* svcLoc)
39  : AthMonitorAlgorithm(name, svcLoc),
40  m_ctpIds(0)
41 {}
42 
43 // =============================================================================
44 // Implementation of AthReentrantAlgorithm::initialize
45 // =============================================================================
47 
48  m_rateHdwNotSim.reset(new float[s_nTopoCTPOutputs]);
49  m_rateSimNotHdw.reset(new float[s_nTopoCTPOutputs]);
50  m_rateHdwAndSim.reset(new float[s_nTopoCTPOutputs]);
51  m_rateHdwSim.reset(new float[s_nTopoCTPOutputs]);
52  m_countHdwNotSim.reset(new float[s_nTopoCTPOutputs]);
53  m_countSimNotHdw.reset(new float[s_nTopoCTPOutputs]);
54  m_countHdwSim.reset(new float[s_nTopoCTPOutputs]);
55  m_countHdw.reset(new float[s_nTopoCTPOutputs]);
56  m_countSim.reset(new float[s_nTopoCTPOutputs]);
57  m_countAny.reset(new float[s_nTopoCTPOutputs]);
61  m_overflow_rateHdwSim.reset(new float[s_nTopoCTPOutputs]);
64  m_overflow_countHdwSim.reset(new float[s_nTopoCTPOutputs]);
65  m_overflow_countHdw.reset(new float[s_nTopoCTPOutputs]);
66  m_overflow_countSim.reset(new float[s_nTopoCTPOutputs]);
67  m_overflow_countAny.reset(new float[s_nTopoCTPOutputs]);
68 
69  m_currentHdwBit.reset(new float[s_nTopoCTPOutputs]);
70  m_currentSimBit.reset(new float[s_nTopoCTPOutputs]);
71 
72  for (size_t i=0;i<s_nTopoCTPOutputs;i++){
73  m_rateHdwNotSim[i] = 0;
74  m_rateSimNotHdw[i] = 0;
75  m_rateHdwAndSim[i] = 0;
76  m_rateHdwSim[i] = 0;
77  m_countHdwNotSim[i] = 0;
78  m_countSimNotHdw[i] = 0;
79  m_countHdwSim[i] = 0;
80  m_countHdw[i] = 0;
81  m_countSim[i] = 0;
82  m_countAny[i] = 0;
93 
94  m_currentHdwBit[i] = 0;
95  m_currentSimBit[i] = 0;
96  }
97 
98  ATH_CHECK(m_l1topoKey.initialize());
101  ATH_CHECK(m_monTool.retrieve(DisableTool{m_monTool.name().empty()}));
102  ATH_CHECK(m_errorFlagsKey.initialize());
103 
104  const TrigConf::L1Menu * l1menu = nullptr;
105  ATH_CHECK( m_detStore->retrieve(l1menu) );
106 
107  auto & conn2EL = l1menu->connector("Topo2El");
108  auto & conn3EL = l1menu->connector("Topo3El");
109 
110  auto & connOpt0 = l1menu->connector("Topo1Opt0");
111  auto & connOpt1 = l1menu->connector("Topo1Opt1");
112  auto & connOpt2 = l1menu->connector("Topo1Opt2");
113  auto & connOpt3 = l1menu->connector("Topo1Opt3");
114 
115  m_TopoAlgTriggerNames.reserve(32*4);
116  m_TopoAlgTriggerNotVetoed.resize(32*4);
117  m_TopoMultTriggerNames.reserve(64*4);
118  m_TopoMultTriggerNotVetoed.resize(64*4);
119 
120  //TopoOpt
121  auto & tlopt0 = connOpt0.triggerLines();
122  auto & tlopt1 = connOpt1.triggerLines();
123  auto & tlopt2 = connOpt2.triggerLines();
124  auto & tlopt3 = connOpt3.triggerLines();
125 
126  long unsigned int size_tlopt0 = tlopt0.size();
127  long unsigned int size_tlopt1 = tlopt1.size();
128  long unsigned int size_tlopt2 = tlopt2.size();
129  long unsigned int size_tlopt3 = tlopt3.size();
130 
131  long unsigned int total_size_opt = size_tlopt0+size_tlopt1+size_tlopt2+size_tlopt3;
132 
133  for (size_t j = 0; j < size_tlopt0; ++j) m_TopoMultTriggerNames.push_back(tlopt0[j].name());
134  for (size_t j = 0; j < size_tlopt1; ++j) m_TopoMultTriggerNames.push_back(tlopt1[j].name());
135  for (size_t j = 0; j < size_tlopt2; ++j) m_TopoMultTriggerNames.push_back(tlopt2[j].name());
136  for (size_t j = 0; j < size_tlopt3; ++j) m_TopoMultTriggerNames.push_back(tlopt3[j].name());
137 
138  //Topo2a
139  auto & tl2a0 = conn2EL.triggerLines(0, 0); //clock 0
140  auto & tl2a1 = conn2EL.triggerLines(0, 1); //clock 1
141  long unsigned int size_tl2a0 = tl2a0.size();
142  long unsigned int size_tl2a1 = tl2a1.size();
143  //Topo2b
144  auto & tl2b0 = conn2EL.triggerLines(1, 0); //clock 0
145  auto & tl2b1 = conn2EL.triggerLines(1, 1); //clock 1
146  long unsigned int size_tl2b0 = tl2b0.size();
147  long unsigned int size_tl2b1 = tl2b1.size();
148  //Topo3a
149  auto & tl3a0 = conn3EL.triggerLines(0, 0); //clock 0
150  auto & tl3a1 = conn3EL.triggerLines(0, 1); //clock 1
151  long unsigned int size_tl3a0 = tl3a0.size();
152  long unsigned int size_tl3a1 = tl3a1.size();
153  //Topo3b
154  auto & tl3b0 = conn3EL.triggerLines(1, 0); //clock 0
155  auto & tl3b1 = conn3EL.triggerLines(1, 1); //clock 1
156  long unsigned int size_tl3b0 = tl3b0.size();
157  long unsigned int size_tl3b1 = tl3b1.size();
158 
159  for (size_t i = 0; i < 16; ++i) {
160  if (i < size_tl2a0) m_TopoAlgTriggerNames.push_back(tl2a0[i].name());
161  else m_TopoAlgTriggerNames.push_back("Empty");
162  if (i < size_tl2a1) m_TopoAlgTriggerNames.push_back(tl2a1[i].name());
163  else m_TopoAlgTriggerNames.push_back("Empty");
164  }
165 
166  for (size_t i = 0; i < 16; ++i) {
167  if (i < size_tl2b0) m_TopoAlgTriggerNames.push_back(tl2b0[i].name());
168  else m_TopoAlgTriggerNames.push_back("Empty");
169  if (i < size_tl2b1) m_TopoAlgTriggerNames.push_back(tl2b1[i].name());
170  else m_TopoAlgTriggerNames.push_back("Empty");
171  }
172 
173  for (size_t i = 0; i < 16; ++i) {
174  if (i < size_tl3a0) m_TopoAlgTriggerNames.push_back(tl3a0[i].name());
175  else m_TopoAlgTriggerNames.push_back("Empty");
176  if (i < size_tl3a1) m_TopoAlgTriggerNames.push_back(tl3a1[i].name());
177  else m_TopoAlgTriggerNames.push_back("Empty");
178  }
179 
180  for (size_t i = 0; i < 16; ++i) {
181  if (i < size_tl3b0) m_TopoAlgTriggerNames.push_back(tl3b0[i].name());
182  else m_TopoAlgTriggerNames.push_back("Empty");
183  if (i < size_tl3b1) m_TopoAlgTriggerNames.push_back(tl3b1[i].name());
184  else m_TopoAlgTriggerNames.push_back("Empty");
185  }
186 
187  //Fill Vector of booleans to fill corresponding triggers
188  //Only elements with a corresponding Veto are set to false
189 
190  for (size_t j = 0; j < total_size_opt; ++j) {
191  m_TopoMultTriggerNotVetoed[j] = true;
192  for (const std::string& VetoedElement : m_MultiplicityVetoList) {
193  if ( !m_TopoMultTriggerNotVetoed[j] || m_TopoMultTriggerNames[j].find(VetoedElement)!= std::string::npos) m_TopoMultTriggerNotVetoed[j] = false;
194  else m_TopoMultTriggerNotVetoed[j] = true;
195  }
196  }
197 
198  for (int j =0; j<128;j++){
199  m_TopoAlgTriggerNotVetoed[j] = true;
200  for (const std::string& VetoedElement : m_AlgorithmVetoList) {
201  if ( !m_TopoAlgTriggerNotVetoed[j] || m_TopoAlgTriggerNames[j].find(VetoedElement)!= std::string::npos) m_TopoAlgTriggerNotVetoed[j] = false;
202  else m_TopoAlgTriggerNotVetoed[j] = true;
203  }
204  }
205 
207 }
208 
210 
211  const TrigConf::L1Menu * l1menu = nullptr;
212  ATH_CHECK( m_detStore->retrieve(l1menu) );
213 
215 
217 
218  return StatusCode::SUCCESS;
219 }
220 
221 
222 StatusCode L1TopoOnlineMonitor::fillHistograms( const EventContext& ctx ) const {
223 
224  // Create and record the ErrorFlags container
226  ATH_CHECK(errorFlagsCont.record(std::make_unique<xAOD::TrigCompositeContainer>(),
227  std::make_unique<xAOD::TrigCompositeAuxContainer>()));
228  ATH_MSG_DEBUG("Recorded TrigCompositeContainer with key " << m_errorFlagsKey.key());
229 
230  // Create the ErrorFlags object
231  errorFlagsCont->push_back(new xAOD::TrigComposite);
232  xAOD::TrigComposite& errorFlags = *(errorFlagsCont->back());
233  resetFlags(errorFlags);
234 
235 
236  DecisionBits decisionBits{};
237  enum class MonFunction : uint8_t {doSimMon=0, doHwMonCTP, doHwMon, doComp, doMultComp};
238  std::vector<uint8_t> failedMonFunctions;
239  std::vector<std::vector<unsigned>> multWeightsSim;
240  std::vector<std::vector<unsigned>> multWeightsHdw;
241 
242  if (m_doHwMon) {
243  StatusCode sc = doHwMon(decisionBits,multWeightsHdw,ctx);
244  ATH_MSG_DEBUG("Executed doHWMon: " << (sc.isFailure() ? "failed" : "ok"));
245  if (sc.isFailure()) {
246  failedMonFunctions.push_back(static_cast<uint8_t>(MonFunction::doHwMon));
247  }
248  }
249 
250  if (m_doHwMonCTP) {
251  StatusCode sc = doHwMonCTP(decisionBits,ctx);
252  ATH_MSG_DEBUG("Executed doHWMonCTP: " << (sc.isFailure() ? "failed" : "ok"));
253  if (sc.isFailure()) {
254  failedMonFunctions.push_back(static_cast<uint8_t>(MonFunction::doHwMonCTP));
255  }
256  }
257 
258  if (m_doSimMon) {
259  StatusCode sc = doSimMon(decisionBits,multWeightsSim,ctx);
260  ATH_MSG_DEBUG("Executed doSimMon: " << (sc.isFailure() ? "failed" : "ok"));
261  if (sc.isFailure()) {
262  failedMonFunctions.push_back(static_cast<uint8_t>(MonFunction::doSimMon));
263  }
264  }
265 
266  if (m_doComp) {
267  StatusCode sc = doComp(decisionBits,ctx);
268  ATH_MSG_DEBUG("Executed doComp: " << (sc.isFailure() ? "failed" : "ok"));
269  if (sc.isFailure()) {
270  failedMonFunctions.push_back(static_cast<uint8_t>(MonFunction::doComp));
271  }
272  }
273 
274  if (m_doMultComp) {
275  StatusCode sc = doMultComp(multWeightsSim,multWeightsHdw,ctx);
276  ATH_MSG_DEBUG("Executed doMultComp: " << (sc.isFailure() ? "failed" : "ok"));
277  if (sc.isFailure()) {
278  failedMonFunctions.push_back(static_cast<uint8_t>(MonFunction::doMultComp));
279  }
280  }
281 
282  auto monFailedMonFunctions = Monitored::Collection("MonitoringFailures", failedMonFunctions);
283  Monitored::Group(m_monTool, monFailedMonFunctions);
284 
285  return StatusCode::SUCCESS;
286 }
287 
288 
289 StatusCode L1TopoOnlineMonitor::doSimMon( DecisionBits& decisionBits, std::vector<std::vector<unsigned>> &multWeights, const EventContext& ctx ) const {
290 
291 
293  if(!cont.isValid()){
294  ATH_MSG_FATAL("Could not retrieve L1Topo EDM Container from the Simulation.");
295  return StatusCode::FAILURE;
296  }
297 
298  ATH_MSG_DEBUG("----got L1Topo container: " << cont.key());
299 
300  std::bitset<s_nTopoCTPOutputs>& triggerBitsSim = DecisionBits::createBits(decisionBits.triggerBitsSim);
301  std::bitset<s_nTopoCTPOutputs>& overflowBitsSim = DecisionBits::createBits(decisionBits.overflowBitsSim);
302  std::bitset<s_nTopoCTPOutputs>& ambiguityBitsSim = DecisionBits::createBits(decisionBits.ambiguityBitsSim);
303  std::unordered_map<unsigned,std::bitset<s_nTopoCTPOutputs>> multWeightsMap;
304  for(const auto l1topo_dec : * cont){
305  ATH_MSG_DEBUG( "Reading L1Topo EDM:: Connection ID: " << l1topo_dec->connectionId() << " Clock: " << l1topo_dec->clock() << " Bit-length: " << l1topo_dec->bitWidth() << " Word: " << l1topo_dec->topoWord() << " Word64: " << l1topo_dec->topoWord64() );
306 
307  if (l1topo_dec->bitWidth() == 32) {
308  std::vector<unsigned> topoword;
309  std::vector<unsigned> topowordOverflow;
310  for(unsigned int i=0; i<32; ++i) {
311  uint32_t mask = 0x1; mask <<= i;
312  if ((l1topo_dec->topoWord() & mask) !=0) {
313  if (l1topo_dec->connectionId()==2 || l1topo_dec->connectionId()==3) { // TOPO2EL and TOPO3EL (L1TopoCommon/Types.h)
314  topoword.push_back(32*l1topo_dec->clock()+i);
315  uint32_t pos = 32*(l1topo_dec->clock()+(l1topo_dec->connectionId()==2 ? 0 : 2))+i;
316  triggerBitsSim[pos] = ((!decisionBits.triggerBits.has_value() || m_forceCTPasHdw) && m_ctpIds[pos]>=512) ? false : true;
317  }
318  if (l1topo_dec->connectionId()==22 || l1topo_dec->connectionId()==23) { // AMBIGUITYTOPO2EL and AMBIGUITYTOPO3EL
319  uint32_t pos_ambiguity = 32*(l1topo_dec->clock()+(l1topo_dec->connectionId()==22 ? 0 : 2))+i;
320  ambiguityBitsSim[pos_ambiguity] = ((!decisionBits.ambiguityBitsSim.has_value() || m_forceCTPasHdw) && m_ctpIds[pos_ambiguity]>=512) ? false : true;
321  }
322  }
323  if ((l1topo_dec->topoWordOverflow() & mask) !=0) {
324  topowordOverflow.push_back(32*l1topo_dec->clock()+i);
325  uint32_t pus = 32*(l1topo_dec->clock()+(l1topo_dec->connectionId()==12 ? 0 : 2))+i;
326  overflowBitsSim[pus] = ((!decisionBits.overflowBitsSim.has_value() || m_forceCTPasHdw) && m_ctpIds[pus]>=512) ? false : true;
327  }
328  }
329  std::string name = "CableElec_";
330  name += std::to_string(l1topo_dec->connectionId());
331  auto monTopoDec = Monitored::Collection(name, topoword);
332  Monitored::Group(m_monTool,monTopoDec);
333  }
334  else if (l1topo_dec->bitWidth() == 64) {
335  for (size_t i=0;i<64;i++) {
336  unsigned index = i+l1topo_dec->clock()*64;
337  uint64_t mask = 0x1; mask <<= i;
338  if ((l1topo_dec->topoWord64() & mask) !=0) {
339  multWeightsMap[static_cast<unsigned>(l1topo_dec->connectionId() - 4)].set(index);
340  }
341  }
342  }
343  else {
344  ATH_MSG_DEBUG( "Unknown Bit-length: " << l1topo_dec->bitWidth() );
345  return StatusCode::FAILURE;
346  }
347  }
348 
349  for (unsigned key=0;key<4;key++) {
350  std::vector<unsigned> vecCount, vecIndices;
351  unsigned indices = 0;
352  for (auto startbit : m_startbit[key]) {
353  unsigned count = 0;
354  for (size_t i=0;i<startbit.second;i++){
355  if (multWeightsMap[key][startbit.first+i]) {
356  count += 1 * pow(2,i);
357  }
358  }
359  vecCount.push_back(count);
360  vecIndices.push_back(indices);
361  indices++;
362  }
363  multWeights.push_back(vecCount);
364  std::string name = "CableOpti_"+std::to_string(key);
365  auto monMult = Monitored::Collection(name, vecIndices);
366  auto monMultWeight = Monitored::Collection(name+"_weight", vecCount);
367  Monitored::Group(m_monTool,monMult,monMultWeight);
368  }
369 
370  std::vector<size_t> triggerBitIndicesSim = bitsetIndices(triggerBitsSim);
371  std::vector<size_t> overflowBitIndicesSim = bitsetIndices(overflowBitsSim);
372  std::vector<size_t> ambiguityBitIndicesSim = bitsetIndices(ambiguityBitsSim);
373  auto monTopoSim = Monitored::Collection("TopoSim", triggerBitIndicesSim);
374  auto monTopoSimOverflow = Monitored::Collection("TopoSim_overflows", overflowBitIndicesSim);
375  auto monTopoSimAmbiguity = Monitored::Collection("TopoSim_ambiguity", ambiguityBitIndicesSim);
376  Monitored::Group(m_monTool,monTopoSim);
377  Monitored::Group(m_monTool,monTopoSimOverflow);
378  Monitored::Group(m_monTool,monTopoSimAmbiguity);
379 
380  return StatusCode::SUCCESS;
381 }
382 
383 StatusCode L1TopoOnlineMonitor::doHwMonCTP( DecisionBits& decisionBits, const EventContext& ctx ) const {
384 
385  // Retrieve CTP DAQ data for comparison
387  if (!ctpRdo.isValid()) {
388  ATH_MSG_DEBUG("Failed to retrieve CTP_RDO object (converted from CTP DAQ ROB) with key \""
389  << m_ctpRdoKey.key() << "\". Skipping CTP hardware comparison");
390  return StatusCode::FAILURE;
391  }
392 
393  // CTP RDO contains 17 TBP words for a number of BCs, so use CTP_Decoder to access accepted BC
395  ctp.setRDO(ctpRdo.cptr());
396  const uint32_t l1aPos = ctpRdo->getL1AcceptBunchPosition();
397  if (l1aPos >= ctp.getBunchCrossings().size()) {
398  ATH_MSG_DEBUG("CTP_RDO gave invalid l1aPos. Skipping CTP hardware comparison");
399  return StatusCode::FAILURE;
400  }
401  ATH_MSG_DEBUG("CTP l1aPos, size: " << l1aPos << ", " << ctp.getBunchCrossings().size());
402  const CTP_BC& ctpL1a = ctp.getBunchCrossings().at(l1aPos);
403 
404  // Fill decision bits from CTP RDO
405  std::bitset<s_nTopoCTPOutputs>& triggerBitsCtp = DecisionBits::createBits(decisionBits.triggerBitsCtp);
406  static constexpr size_t ctpTBPSize{512};
407  const std::bitset<ctpTBPSize>& tbp = ctpL1a.getTBP();
408  ATH_MSG_VERBOSE("CTP TBP bits: " << tbp.to_string());
409 
410  for (size_t i=0; i<s_nTopoCTPOutputs; ++i) {
411  if (m_ctpIds[i] < 512)
412  {triggerBitsCtp[i] = tbp.test(m_ctpIds[i]);}
413  else
414  {triggerBitsCtp[i] = false;}
415  }
416 
417  std::vector<size_t> triggerBitIndicesCtp = bitsetIndices(triggerBitsCtp);
418  auto monTopoCtp = Monitored::Collection("TopoCTP", triggerBitIndicesCtp);
419  Monitored::Group(m_monTool,monTopoCtp);
420 
421  return StatusCode::SUCCESS;
422 }
423 
424 StatusCode L1TopoOnlineMonitor::doHwMon( DecisionBits& decisionBits, std::vector<std::vector<unsigned>> &multWeights, const EventContext& ctx ) const {
425 
427  if(!cont.isValid()){
428  ATH_MSG_WARNING("Could not retrieve L1Topo RAW Data Container from the BS data.");
429  return StatusCode::FAILURE;
430  }
431 
432  ATH_MSG_DEBUG("----got L1Topo Raw Data container: " << cont.key());
433 
434  std::bitset<s_nTopoCTPOutputs>& triggerBits = DecisionBits::createBits(decisionBits.triggerBits);
435  std::bitset<s_nTopoCTPOutputs>& overflowBits = DecisionBits::createBits(decisionBits.overflowBits);
436 
437  std::unique_ptr<L1Topo::L1TopoResult> l1topoResult = std::make_unique<L1Topo::L1TopoResult>(*cont);
438  if (!l1topoResult->getStatus()) {
439  ATH_MSG_WARNING("Decoding L1Topo results failed!!");
440  return StatusCode::FAILURE;
441  }
442 
443  if (m_doHwErrorMon){
444  // Error monitoring ---------------------------------------------------------
445  enum class MonFunction : uint8_t {doRODct, doRODpc, doRODhc, doRODpe, doRODlm, doRODhm, doRODpt};
446  std::vector<uint8_t> rodErrors;
447  if (l1topoResult->getROD(0)->ct() != 0) { rodErrors.push_back(static_cast<uint8_t>(MonFunction::doRODct)); }
448  if (l1topoResult->getROD(0)->pc() != 0) { rodErrors.push_back(static_cast<uint8_t>(MonFunction::doRODpc)); }
449  if (l1topoResult->getROD(0)->hc() != 0) { rodErrors.push_back(static_cast<uint8_t>(MonFunction::doRODhc)); }
450  if (l1topoResult->getROD(0)->pe() != 0) { rodErrors.push_back(static_cast<uint8_t>(MonFunction::doRODpe)); }
451  if (l1topoResult->getROD(0)->lm() != 0) { rodErrors.push_back(static_cast<uint8_t>(MonFunction::doRODlm)); }
452  if (l1topoResult->getROD(0)->hm() != 0) { rodErrors.push_back(static_cast<uint8_t>(MonFunction::doRODhm)); }
453  if (l1topoResult->getROD(0)->pt() != 0) { rodErrors.push_back(static_cast<uint8_t>(MonFunction::doRODpt)); }
454  auto monErrorsROD = Monitored::Collection("ROD_Errors", rodErrors);
455  Monitored::Group(m_monTool, monErrorsROD);
456  }
457 
458  for (unsigned i=0;i<l1topoResult->getFPGASize();i++) {
459  unsigned topoNumber = l1topoResult->getFPGA(i)->topoNumber();
460  unsigned fpgaNumber = l1topoResult->getFPGA(i)->fpgaNumber();
461 
462  auto mon_fpga_error = Monitored::Scalar<unsigned>("FPGA_Errors");
463  auto mon_fpga_labels = Monitored::Scalar("FPGA_Labels", (topoNumber*2)-fpgaNumber-1);
464 
465  if (l1topoResult->getFPGA(i)->ct() != 0) {
466  mon_fpga_error = 0;
467  Monitored::Group(m_monTool, mon_fpga_error, mon_fpga_labels);
468  }
469  if (l1topoResult->getFPGA(i)->sm() != 0) {
470  mon_fpga_error = 1;
471  Monitored::Group(m_monTool, mon_fpga_error, mon_fpga_labels);
472  }
473  if (l1topoResult->getFPGA(i)->pe() != 0) {
474  mon_fpga_error = 2;
475  Monitored::Group(m_monTool, mon_fpga_error, mon_fpga_labels);
476  }
477  if (l1topoResult->getFPGA(i)->lm() != 0) {
478  mon_fpga_error = 3;
479  Monitored::Group(m_monTool, mon_fpga_error, mon_fpga_labels);
480  }
481  if (l1topoResult->getFPGA(i)->hm() != 0) {
482  mon_fpga_error = 4;
483  Monitored::Group(m_monTool, mon_fpga_error, mon_fpga_labels);
484  }
485  if (l1topoResult->getFPGA(i)->pt() != 0) {
486  mon_fpga_error = 5;
487  Monitored::Group(m_monTool, mon_fpga_error, mon_fpga_labels);
488  }
489  }
490 
491  // Multiplicities ---------------------------------------------------------
492  std::vector<unsigned> topo1Opt0,topo1Opt1,topo1Opt2,topo1Opt3;
493  std::vector<unsigned> topo1Opt0Indices,topo1Opt1Indices,topo1Opt2Indices,topo1Opt3Indices;
494 
495  unsigned indices=0;
496  for (auto startbit : m_startbit[0]) {
497  unsigned count = 0;
498  for (size_t i=0;i<startbit.second;i++){
499  if (l1topoResult->getTopo1Opt0()[startbit.first+i]) {
500  count += 1 * pow(2,i);
501  }
502  }
503  topo1Opt0.push_back(count);
504  topo1Opt0Indices.push_back(indices);
505  indices++;
506  }
507  indices=0;
508  for (auto startbit : m_startbit[1]) {
509  unsigned count = 0;
510  for (size_t i=0;i<startbit.second;i++){
511  if (l1topoResult->getTopo1Opt1()[startbit.first+i]) {
512  count += 1 * pow(2,i);
513  }
514  }
515  topo1Opt1.push_back(count);
516  topo1Opt1Indices.push_back(indices);
517  indices++;
518  }
519  indices=0;
520  for (auto startbit : m_startbit[2]) {
521  unsigned count = 0;
522  for (size_t i=0;i<startbit.second;i++){
523  if (l1topoResult->getTopo1Opt2()[startbit.first+i]) {
524  count += 1 * pow(2,i);
525  }
526  }
527  topo1Opt2.push_back(count);
528  topo1Opt2Indices.push_back(indices);
529  indices++;
530  }
531  indices=0;
532  for (auto startbit : m_startbit[3]) {
533  unsigned count = 0;
534  for (size_t i=0;i<startbit.second;i++){
535  if (l1topoResult->getTopo1Opt3()[startbit.first+i]) {
536  count += 1 * pow(2,i);
537  }
538  }
539  topo1Opt3.push_back(count);
540  topo1Opt3Indices.push_back(indices);
541  indices++;
542  }
543 
544  auto monTopo1Opt0 = Monitored::Collection("HdwTopo1Opt0", topo1Opt0Indices);
545  auto monTopo1Opt0Weight = Monitored::Collection("HdwTopo1Opt0_weight", topo1Opt0);
546  Monitored::Group(m_monTool, monTopo1Opt0, monTopo1Opt0Weight);
547  multWeights.push_back(topo1Opt0);
548 
549  auto monTopo1Opt1 = Monitored::Collection("HdwTopo1Opt1", topo1Opt1Indices);
550  auto monTopo1Opt1Weight = Monitored::Collection("HdwTopo1Opt1_weight", topo1Opt1);
551  Monitored::Group(m_monTool, monTopo1Opt1, monTopo1Opt1Weight);
552  multWeights.push_back(topo1Opt1);
553 
554  auto monTopo1Opt2 = Monitored::Collection("HdwTopo1Opt2", topo1Opt2Indices);
555  auto monTopo1Opt2Weight = Monitored::Collection("HdwTopo1Opt2_weight", topo1Opt2);
556  Monitored::Group(m_monTool, monTopo1Opt2, monTopo1Opt2Weight);
557  multWeights.push_back(topo1Opt2);
558 
559  auto monTopo1Opt3 = Monitored::Collection("HdwTopo1Opt3", topo1Opt3Indices);
560  auto monTopo1Opt3Weight = Monitored::Collection("HdwTopo1Opt3_weight", topo1Opt3);
561  Monitored::Group(m_monTool, monTopo1Opt3, monTopo1Opt3Weight);
562  multWeights.push_back(topo1Opt3);
563 
564  // Decisions ---------------------------------------------------------------
565  triggerBits = l1topoResult->getDecisions();
566  overflowBits = l1topoResult->getOverflows();
567 
568  const std::vector<size_t> triggerBitIndicesHdw = bitsetIndices(triggerBits);
569  const std::vector<size_t> overflowBitIndicesHdw = bitsetIndices(overflowBits);
570 
571  ATH_MSG_VERBOSE("trigger bits: " << triggerBits.to_string() );
572  ATH_MSG_VERBOSE("overflow bits: " << overflowBits.to_string() );
573 
574  auto monHdw = Monitored::Collection("HdwResults", triggerBitIndicesHdw);
575  auto monOverflow = Monitored::Collection("OverflowResults", overflowBitIndicesHdw);
576 
577  Monitored::Group(m_monTool, monHdw, monOverflow);
578 
579  return StatusCode::SUCCESS;
580 }
581 
582 StatusCode L1TopoOnlineMonitor::doComp( DecisionBits& decisionBits, const EventContext& ctx ) const {
583  if (!decisionBits.triggerBitsSim.has_value()) {
584  ATH_MSG_DEBUG("Simulation bits not set. Skipping simulation to hardware comparison");
585  return StatusCode::FAILURE;
586  }
587 
588  std::bitset<s_nTopoCTPOutputs> triggerBitsSim = decisionBits.triggerBitsSim.value(); // Alias
589  std::bitset<s_nTopoCTPOutputs> triggerBitsHdw;
590 
591  if (decisionBits.triggerBits.has_value() && !m_forceCTPasHdw)
592  {triggerBitsHdw = decisionBits.triggerBits.value();}
593  else if (decisionBits.triggerBitsCtp.has_value())
594  {triggerBitsHdw = decisionBits.triggerBitsCtp.value();}
595  else {
596  ATH_MSG_DEBUG("Hardware bits not set. Skipping simulation to hardware comparison");
597  return StatusCode::FAILURE;
598  }
599 
600  std::bitset<s_nTopoCTPOutputs> triggerBitsSimNotHdw = triggerBitsSim & (~triggerBitsHdw);
601  std::bitset<s_nTopoCTPOutputs> triggerBitsHdwNotSim = triggerBitsHdw & (~triggerBitsSim);
602  std::bitset<s_nTopoCTPOutputs> triggerBitsHdwSim = triggerBitsHdw & triggerBitsSim;
603  std::bitset<s_nTopoCTPOutputs> triggerBitsAny = triggerBitsHdw | triggerBitsSim;
604 
605  std::bitset<s_nTopoCTPOutputs>& overflowBitsSim = decisionBits.overflowBitsSim.value();
606  std::bitset<s_nTopoCTPOutputs>& overflowBitsHdw = decisionBits.overflowBits.value();
607  std::bitset<s_nTopoCTPOutputs> overflowBitsSimNotHdw = overflowBitsSim & (~overflowBitsHdw);
608  std::bitset<s_nTopoCTPOutputs> overflowBitsHdwNotSim = overflowBitsHdw & (~overflowBitsSim);
609  std::bitset<s_nTopoCTPOutputs> overflowBitsHdwSim = overflowBitsHdw & overflowBitsSim;
610  std::bitset<s_nTopoCTPOutputs> overflowBitsAny = overflowBitsHdw | overflowBitsSim;
611 
612  std::bitset<s_nTopoCTPOutputs>& ambiguityBitsSim = decisionBits.ambiguityBitsSim.value();
613  std::bitset<s_nTopoCTPOutputs> ambiguitySimANDHdw = ambiguityBitsSim & triggerBitsHdwSim;
614  std::bitset<s_nTopoCTPOutputs> ambiguityMismatch = ambiguityBitsSim & (triggerBitsSimNotHdw | triggerBitsHdwNotSim);
615 
616  std::vector<size_t> triggerBitIndicesSimNotHdw = bitsetIndices(triggerBitsSimNotHdw);
617  std::vector<size_t> triggerBitIndicesHdwNotSim = bitsetIndices(triggerBitsHdwNotSim);
618  std::vector<size_t> ambiguitySimANDHdwBitIndices = bitsetIndices(ambiguitySimANDHdw);
619  std::vector<size_t> ambiguityMismatchBitIndices = bitsetIndices(ambiguityMismatch);
620  auto monSimNotHdw = Monitored::Collection("SimNotHdwL1TopoResult", triggerBitIndicesSimNotHdw);
621  auto monHdwNotSim = Monitored::Collection("HdwNotSimL1TopoResult", triggerBitIndicesHdwNotSim);
622  auto monAmbiguitySimANDHdw = Monitored::Collection("Ambiguity_SimANDHdwDecisions", ambiguitySimANDHdwBitIndices);
623  auto monAmbiguityMismatch = Monitored::Collection("Ambiguity_DecisionMismatches", ambiguityMismatchBitIndices);
624 
625  Monitored::Group(m_monTool, monSimNotHdw, monHdwNotSim, monAmbiguitySimANDHdw, monAmbiguityMismatch);
626 
627  float rate=0;
628  float rate_overflow=0;
629 
630  auto lbn = Monitored::Scalar<int>("LBN",GetEventInfo(ctx)->lumiBlock());
631  auto mon_trig_allboards = Monitored::Scalar<unsigned>("L1TopoAlgorithmAllBoards");
632  auto mon_matchVsLumi_DQ = Monitored::Scalar<unsigned>("L1TopoAlgorithmMissMatchVsLumi");
633 
634  for (size_t i=0;i<4;i++) {
635 
636  auto mon_trig = Monitored::Scalar<unsigned>("Phase1TopoTrigger_"+std::to_string(i));
637  auto mon_match = Monitored::Scalar<unsigned>("Phase1TopoMissMatch_"+std::to_string(i));
638  auto mon_match_DQ = Monitored::Scalar<unsigned>("L1TopoAlgorithmMissMatch_"+std::to_string(i));
639  auto mon_match_OF_DQ = Monitored::Scalar<unsigned>("L1TopoAlgorithmOverflowMissMatch_"+std::to_string(i));
640  auto mon_weight = Monitored::Scalar<float>("Phase1TopoWeight_"+std::to_string(i));
641  auto mon_OFweight = Monitored::Scalar<float>("Phase1TopoOFWeight_"+std::to_string(i));
642 
643  for (size_t j=0;j<32;j++) {
644 
645  if (ambiguityBitsSim[32*i+j] == 0) {
646  mon_trig = static_cast<unsigned>(j);
647  mon_trig_allboards = static_cast<unsigned>(32*i+j);
648  if (overflowBitsHdw[32*i+j] == 1 || overflowBitsSim[32*i+j] == 1) {
649  m_overflow_countHdwNotSim[32*i+j]+=overflowBitsHdwNotSim[32*i+j];
650  m_overflow_countSimNotHdw[32*i+j]+=overflowBitsSimNotHdw[32*i+j];
651  m_overflow_countHdwSim[32*i+j]+=overflowBitsHdwSim[32*i+j];
652  m_overflow_countHdw[32*i+j]+=overflowBitsHdw[32*i+j];
653  m_overflow_countSim[32*i+j]+=overflowBitsSim[32*i+j];
654  m_overflow_countAny[32*i+j]+=overflowBitsAny[32*i+j];
655  }
656  else {
657  m_countHdwNotSim[32*i+j]+=triggerBitsHdwNotSim[32*i+j];
658  m_countSimNotHdw[32*i+j]+=triggerBitsSimNotHdw[32*i+j];
659  m_countHdwSim[32*i+j]+=triggerBitsHdwSim[32*i+j];
660  m_countHdw[32*i+j]+=triggerBitsHdw[32*i+j];
661  m_countSim[32*i+j]+=triggerBitsSim[32*i+j];
662  m_countAny[32*i+j]+=triggerBitsAny[32*i+j];
663  m_currentHdwBit[32*i+j]=triggerBitsHdw[32*i+j];
664  m_currentSimBit[32*i+j]=triggerBitsSim[32*i+j];
665  }
666 
667  //Simplified plot for L1Calo DQ
668  if ( m_currentSimBit[32*i+j] < m_currentHdwBit[32*i+j] ){ mon_match_DQ = 0; mon_matchVsLumi_DQ = 1;}
669  if ( m_currentSimBit[32*i+j] > m_currentHdwBit[32*i+j] ){ mon_match_DQ = 1; mon_matchVsLumi_DQ = 1;}
670  if ( m_currentSimBit[32*i+j] == m_currentHdwBit[32*i+j] ){ mon_match_DQ = 2; mon_matchVsLumi_DQ = 0;}
671  if ( (m_currentSimBit[32*i+j] > 0 || m_currentHdwBit[32*i+j] > 0 ) && m_TopoAlgTriggerNotVetoed[32*i+j] ){
672  Monitored::Group(m_monTool, mon_trig, mon_match_DQ);
673  Monitored::Group(m_monTool, lbn, mon_trig_allboards, mon_matchVsLumi_DQ);
674  }
675 
676  if (m_overflow_countSim[32*i+j] <m_overflow_countHdw[32*i+j] ) mon_match_OF_DQ = 0;
677  if (m_overflow_countSim[32*i+j] >m_overflow_countHdw[32*i+j] ) mon_match_OF_DQ = 1;
678  if (m_overflow_countSim[32*i+j] ==m_overflow_countHdw[32*i+j] ) mon_match_OF_DQ = 2;
679  if ( (m_overflow_countSim[32*i+j] > 0 || m_overflow_countHdw[32*i+j] > 0 ) && m_TopoAlgTriggerNotVetoed[32*i+j] ) Monitored::Group(m_monTool, mon_trig, mon_match_OF_DQ);
680 
681  rate = m_countHdw[32*i+j]>0 ? m_countHdwNotSim[32*i+j]/m_countHdw[32*i+j] : 0;
682  if (rate != m_rateHdwNotSim[32*i+j]) {
683  mon_match = 0;
684  mon_weight = rate-m_rateHdwNotSim[32*i+j];
685  m_rateHdwNotSim[32*i+j] = rate;
686  Monitored::Group(m_monTool, mon_trig, mon_match, mon_weight);
687  }
688  rate_overflow = m_overflow_countHdw[32*i+j]>0 ? m_overflow_countHdwNotSim[32*i+j]/m_overflow_countHdw[32*i+j] : 0;
689  if (rate_overflow != m_overflow_rateHdwNotSim[32*i+j]) {
690  mon_match = 0;
691  mon_OFweight = rate_overflow-m_overflow_rateHdwNotSim[32*i+j];
692  m_overflow_rateHdwNotSim[32*i+j] = rate_overflow;
693  Monitored::Group(m_monTool, mon_trig, mon_match, mon_OFweight);
694  }
695  rate = m_countSim[32*i+j]>0 ? m_countSimNotHdw[32*i+j]/m_countSim[32*i+j] : 0;
696  if (rate != m_rateSimNotHdw[32*i+j]) {
697  mon_match = 1;
698  mon_weight = rate-m_rateSimNotHdw[32*i+j];
699  m_rateSimNotHdw[32*i+j] = rate;
700  Monitored::Group(m_monTool, mon_trig, mon_match, mon_weight);
701  }
702  rate_overflow = m_overflow_countSim[32*i+j]>0 ? m_overflow_countSimNotHdw[32*i+j]/m_overflow_countSim[32*i+j] : 0;
703  if (rate_overflow != m_overflow_rateSimNotHdw[32*i+j]) {
704  mon_match = 1;
705  mon_OFweight = rate_overflow-m_overflow_rateSimNotHdw[32*i+j];
706  m_overflow_rateSimNotHdw[32*i+j] = rate_overflow;
707  Monitored::Group(m_monTool, mon_trig, mon_match, mon_OFweight);
708  }
709  rate = m_countAny[32*i+j]>0 ? m_countHdwSim[32*i+j]/m_countAny[32*i+j] : 0;
710  if (rate != m_rateHdwAndSim[32*i+j]) {
711  mon_match = 2;
712  mon_weight = rate-m_rateHdwAndSim[32*i+j];
713  m_rateHdwAndSim[32*i+j] = rate;
714  Monitored::Group(m_monTool, mon_trig, mon_match, mon_weight);
715  }
716  rate_overflow = m_overflow_countAny[32*i+j]>0 ? m_overflow_countHdwSim[32*i+j]/m_overflow_countAny[32*i+j] : 0;
717  if (rate_overflow != m_overflow_rateHdwAndSim[32*i+j]) {
718  mon_match = 2;
719  mon_OFweight = rate_overflow-m_overflow_rateHdwAndSim[32*i+j];
720  m_overflow_rateHdwAndSim[32*i+j] = rate_overflow;
721  Monitored::Group(m_monTool, mon_trig, mon_match, mon_OFweight);
722  }
723  rate = m_countSim[32*i+j]>0 ? m_countHdw[32*i+j]/m_countSim[32*i+j] : 0;
724  if (rate != m_rateHdwSim[32*i+j]) {
725  mon_match = 3;
726  mon_weight = rate-m_rateHdwSim[32*i+j];
727  m_rateHdwSim[32*i+j] = rate;
728  Monitored::Group(m_monTool, mon_trig, mon_match, mon_weight);
729  }
730  rate_overflow = m_overflow_countSim[32*i+j]>0 ? m_overflow_countHdw[32*i+j]/m_overflow_countSim[32*i+j] : 0;
731  if (rate_overflow != m_overflow_rateHdwSim[32*i+j]) {
732  mon_match = 3;
733  mon_OFweight = rate_overflow-m_overflow_rateHdwSim[32*i+j];
734  m_overflow_rateHdwSim[32*i+j] = rate_overflow;
735  Monitored::Group(m_monTool, mon_trig, mon_match, mon_OFweight);
736  }
737  }
738  }
739  }
740  return StatusCode::SUCCESS;
741 }
742 
743 StatusCode L1TopoOnlineMonitor::doMultComp( std::vector<std::vector<unsigned>> &multWeightsSim, std::vector<std::vector<unsigned>> &multWeightsHdw, const EventContext& ctx ) const {
744  if (multWeightsSim.size() == 0 or multWeightsHdw.size() == 0) {
745  ATH_MSG_DEBUG("Multiplicities not set, skipping multiplicities comparison");
746  return StatusCode::FAILURE;
747  }
748 
749  auto lbn = Monitored::Scalar<int>("LBN",GetEventInfo(ctx)->lumiBlock());
750  auto mon_multiplicity_allboards = Monitored::Scalar<unsigned>("MultiplicityAllBoards");
751  auto mon_multVsLumi_DQ = Monitored::Scalar<unsigned>("L1TopoMultiplicityMissMatchVsLumi");
752  int AccumulatedPosition=0;
753  for (size_t i=0;i<multWeightsSim.size();i++) {
754  auto mon_multiplicity = Monitored::Scalar<unsigned>("MultiplicityTopo1Opt" + std::to_string(i));
755  auto mon_mult = Monitored::Scalar<unsigned>("MultiplicityMatchTopo1Opt" + std::to_string(i));
756  for (size_t k=0;k<multWeightsSim[i].size();k++) {
757  std::string colName = "Topo1Opt" + std::to_string(i) + "_" + std::to_string(k);
758  auto monMultSim = Monitored::Scalar<unsigned>(colName+"_Sim", multWeightsSim[i][k]);
759  auto monMultHdw = Monitored::Scalar<unsigned>(colName+"_Hdw", multWeightsHdw[i][k]);
760  Monitored::Group(m_monTool, monMultSim, monMultHdw);
761  if (monMultSim < monMultHdw) {mon_mult = 0; mon_multVsLumi_DQ = 1;}
762  if (monMultSim > monMultHdw) {mon_mult = 1; mon_multVsLumi_DQ = 1;}
763  if (monMultSim == monMultHdw){mon_mult = 2; mon_multVsLumi_DQ = 0;}
764  mon_multiplicity = static_cast<unsigned>(k);
765  mon_multiplicity_allboards = static_cast<unsigned>(k+AccumulatedPosition);
766  if (( monMultSim > 0 || monMultHdw > 0) && m_TopoMultTriggerNotVetoed[k+AccumulatedPosition]) {
767  Monitored::Group(m_monTool, mon_multiplicity, mon_mult);
768  Monitored::Group(m_monTool, lbn, mon_multiplicity_allboards, mon_multVsLumi_DQ);
769  }
770  }
771  AccumulatedPosition=AccumulatedPosition+multWeightsSim[i].size();
772  }
773  return StatusCode::SUCCESS;
774 }
775 
776 std::vector<std::vector<std::pair<unsigned,unsigned>>> L1TopoOnlineMonitor::getStartBits( const TrigConf::L1Menu& l1menu ) {
777 
778  std::vector<std::vector<std::pair<unsigned,unsigned>>> startbit_vec;
779  std::vector<std::string> connNames = l1menu.connectorNames();
780  for( const std::string connName : {"Topo1Opt0", "Topo1Opt1", "Topo1Opt2", "Topo1Opt3"}) {
781  if( find(connNames.begin(), connNames.end(), connName) == connNames.end() ) {
782  continue;
783  }
784  std::vector<std::pair<unsigned,unsigned>> startbit;
785  for(auto & t1 : l1menu.connector(connName).triggerLines()) {
786  startbit.push_back(std::make_pair(t1.startbit(),t1.nbits()));
787  }
788  startbit_vec.push_back(startbit);
789  }
790  return startbit_vec;
791 }
792 //
793 
794 std::vector<unsigned> L1TopoOnlineMonitor::getCtpIds( const TrigConf::L1Menu& l1menu ) {
795 
796  // Topo
797  std::vector<std::string> connNames = l1menu.connectorNames();
798  std::vector<std::string> labelsTopoEl(s_nTopoCTPOutputs);
799  for( const std::string connName : {"Topo2El", "Topo3El"}) {
800  if( find(connNames.begin(), connNames.end(), connName) == connNames.end() ) {
801  continue;
802  }
803  for(uint fpga : {0,1}) {
804  for(uint clock : {0,1}) {
805  for(auto & tl : l1menu.connector(connName).triggerLines(fpga,clock)) {
806  uint flatIndex = tl.flatindex() + 64 * (connName == "Topo3El");
807  labelsTopoEl[flatIndex] = tl.name();
808  }
809  }
810  }
811  }
812 
813  ATH_MSG_DEBUG("Obtaining CTPIds for Phase1 L1Topo Monitoring");
814  std::vector<unsigned> ctpIds(s_nTopoCTPOutputs,999);
815  for( const auto & item : l1menu ) {
816  std::string definition = item.definition();
817  if (definition.substr(0,5) == "TOPO_" &&
818  definition.find(' ') == std::string::npos) {
819  std::string trigger = definition.substr(0, definition.find('['));
820  auto pos = std::find(labelsTopoEl.begin(),labelsTopoEl.end(),trigger);
821  if (pos != labelsTopoEl.end()) {
822  ATH_MSG_DEBUG("Found one CTP; ,CTPId: " << item.ctpId() << " ,Name: " << item.name() << " ,Definition: " << definition);
823  unsigned index = std::distance(labelsTopoEl.begin(),pos);
824  ctpIds[index]=item.ctpId();
825  }
826  }
827  }
828 
829  return ctpIds;
830 }
831 
833  errorFlags.setDetail("hasTrivialFlag", true);
834 }
L1TopoOnlineMonitor::m_l1topoKey
SG::ReadHandleKey< xAOD::L1TopoSimResultsContainer > m_l1topoKey
Definition: L1TopoOnlineMonitor.h:130
L1TopoROD.h
L1TopoOnlineMonitor::m_MultiplicityVetoList
Gaudi::Property< std::vector< std::string > > m_MultiplicityVetoList
Definition: L1TopoOnlineMonitor.h:124
CTP_Decoder.h
L1TopoOnlineMonitor::doHwMonCTP
StatusCode doHwMonCTP(DecisionBits &decisionBits, const EventContext &ctx) const
Monitor the Hw bits from CTP.
Definition: L1TopoOnlineMonitor.cxx:383
xAOD::TrigComposite_v1::setDetail
bool setDetail(const std::string &name, const TYPE &value)
Set an TYPE detail on the object.
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
TrigDefs::Group
Group
Properties of a chain group.
Definition: GroupProperties.h:13
L1TopoOnlineMonitor::m_overflow_rateHdwNotSim
std::unique_ptr< float[]> m_overflow_rateHdwNotSim
Definition: L1TopoOnlineMonitor.h:82
L1TopoOnlineMonitor::DecisionBits::overflowBits
std::optional< std::bitset< s_nTopoCTPOutputs > > overflowBits
Definition: L1TopoOnlineMonitor.h:55
L1TopoOnlineMonitor::m_countSimNotHdw
std::unique_ptr< float[]> m_countSimNotHdw
Definition: L1TopoOnlineMonitor.h:77
L1TopoOnlineMonitor::DecisionBits::createBits
static std::bitset< s_nTopoCTPOutputs > & createBits(std::optional< std::bitset< s_nTopoCTPOutputs >> &opt)
Helper method to create a new bitset and get a reference to it.
Definition: L1TopoOnlineMonitor.h:61
L1TopoOnlineMonitor::m_doHwMonCTP
Gaudi::Property< bool > m_doHwMonCTP
Definition: L1TopoOnlineMonitor.h:110
L1TopoOnlineMonitor::getStartBits
std::vector< std::vector< std::pair< unsigned, unsigned > > > getStartBits(const TrigConf::L1Menu &l1menu)
Definition: L1TopoOnlineMonitor.cxx:776
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:558
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
L1Topo::L1TopoResult::getFPGASize
unsigned getFPGASize()
Definition: L1Topo/L1TopoRDO/L1TopoRDO/L1TopoResult.h:53
L1TopoOnlineMonitor::start
virtual StatusCode start() override
Definition: L1TopoOnlineMonitor.cxx:209
L1TopoOnlineMonitor::m_AlgorithmVetoList
Gaudi::Property< std::vector< std::string > > m_AlgorithmVetoList
Definition: L1TopoOnlineMonitor.h:122
L1TopoOnlineMonitor::resetFlags
void resetFlags(xAOD::TrigComposite &errorFlags) const
Definition: L1TopoOnlineMonitor.cxx:832
L1TopoOnlineMonitor::m_doHwErrorMon
Gaudi::Property< bool > m_doHwErrorMon
Definition: L1TopoOnlineMonitor.h:114
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
index
Definition: index.py:1
L1TopoSimResults.h
Trk::indices
std::pair< long int, long int > indices
Definition: AlSymMatBase.h:24
L1Topo::L1TopoResult::getTopo1Opt0
const std::bitset< s_nTopoOutputs > & getTopo1Opt0() const
Definition: L1Topo/L1TopoRDO/L1TopoRDO/L1TopoResult.h:47
L1TopoOnlineMonitor::m_overflow_countHdwNotSim
std::unique_ptr< float[]> m_overflow_countHdwNotSim
Definition: L1TopoOnlineMonitor.h:86
ALFA_EventTPCnv_Dict::t1
std::vector< ALFA_RawDataCollection_p1 > t1
Definition: ALFA_EventTPCnvDict.h:43
L1TopoOnlineMonitor::m_doSimMon
Gaudi::Property< bool > m_doSimMon
Definition: L1TopoOnlineMonitor.h:108
L1TopoOnlineMonitor::m_startbit
std::vector< std::vector< std::pair< unsigned, unsigned > > > m_startbit
Definition: L1TopoOnlineMonitor.h:98
L1TopoOnlineMonitor::m_currentHdwBit
std::unique_ptr< float[]> m_currentHdwBit
Definition: L1TopoOnlineMonitor.h:93
TrigConf::L1Menu
L1 menu configuration.
Definition: L1Menu.h:28
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
MuonR4::to_string
std::string to_string(const SectorProjector proj)
Definition: MsTrackSeeder.cxx:74
L1TopoOnlineMonitor::m_overflow_countHdwSim
std::unique_ptr< float[]> m_overflow_countHdwSim
Definition: L1TopoOnlineMonitor.h:88
XMLtoHeader.count
count
Definition: XMLtoHeader.py:84
python.utils.AtlRunQueryLookup.mask
string mask
Definition: AtlRunQueryLookup.py:459
L1TopoOnlineMonitor::m_countSim
std::unique_ptr< float[]> m_countSim
Definition: L1TopoOnlineMonitor.h:80
CTP_Decoder
Definition: CTP_Decoder.h:141
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
L1TopoOnlineMonitor::m_monTool
ToolHandle< GenericMonitoringTool > m_monTool
Definition: L1TopoOnlineMonitor.h:102
Monitored::Collection
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Definition: MonitoredCollection.h:38
L1TopoOnlineMonitor::m_overflow_countHdw
std::unique_ptr< float[]> m_overflow_countHdw
Definition: L1TopoOnlineMonitor.h:89
L1TopoOnlineMonitor::initialize
virtual StatusCode initialize() override
initialize
Definition: L1TopoOnlineMonitor.cxx:46
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
L1TopoOnlineMonitor::DecisionBits::triggerBits
std::optional< std::bitset< s_nTopoCTPOutputs > > triggerBits
Definition: L1TopoOnlineMonitor.h:54
L1TopoOnlineMonitor::m_rateHdwSim
std::unique_ptr< float[]> m_rateHdwSim
Definition: L1TopoOnlineMonitor.h:75
PyPoolBrowser.item
item
Definition: PyPoolBrowser.py:129
uint
unsigned int uint
Definition: LArOFPhaseFill.cxx:20
L1TopoOnlineMonitor::m_rateHdwAndSim
std::unique_ptr< float[]> m_rateHdwAndSim
Definition: L1TopoOnlineMonitor.h:74
L1TopoOnlineMonitor::m_countAny
std::unique_ptr< float[]> m_countAny
Definition: L1TopoOnlineMonitor.h:81
L1TopoOnlineMonitor::m_ctpIds
std::vector< unsigned > m_ctpIds
Definition: L1TopoOnlineMonitor.h:96
lumiFormat.i
int i
Definition: lumiFormat.py:85
L1Topo::L1TopoResult::getTopo1Opt2
const std::bitset< s_nTopoOutputs > & getTopo1Opt2() const
Definition: L1Topo/L1TopoRDO/L1TopoRDO/L1TopoResult.h:49
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
L1TopoOnlineMonitor::m_rateSimNotHdw
std::unique_ptr< float[]> m_rateSimNotHdw
Definition: L1TopoOnlineMonitor.h:73
CTP_BC
Definition: CTP_Decoder.h:17
L1TopoOnlineMonitor::s_nTopoCTPOutputs
static constexpr size_t s_nTopoCTPOutputs
Number of CTP outputs, used for histogram ranges and loops.
Definition: L1TopoOnlineMonitor.h:50
L1TopoOnlineMonitor::m_overflow_rateSimNotHdw
std::unique_ptr< float[]> m_overflow_rateSimNotHdw
Definition: L1TopoOnlineMonitor.h:83
L1TopoOnlineMonitor::DecisionBits::triggerBitsSim
std::optional< std::bitset< s_nTopoCTPOutputs > > triggerBitsSim
Definition: L1TopoOnlineMonitor.h:56
L1TopoFPGA.h
L1TopoOnlineMonitor::doHwMon
StatusCode doHwMon(DecisionBits &decisionBits, std::vector< std::vector< unsigned >> &multWeights, const EventContext &ctx) const
Monitor the Hw bits from RAW data.
Definition: L1TopoOnlineMonitor.cxx:424
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
L1TopoOnlineMonitor::m_doMultComp
Gaudi::Property< bool > m_doMultComp
Definition: L1TopoOnlineMonitor.h:118
L1TopoOnlineMonitor::m_rateHdwNotSim
std::unique_ptr< float[]> m_rateHdwNotSim
Definition: L1TopoOnlineMonitor.h:72
L1TopoOnlineMonitor::doSimMon
StatusCode doSimMon(DecisionBits &decisionBits, std::vector< std::vector< unsigned >> &multWeights, const EventContext &ctx) const
Monitor the simulated bits.
Definition: L1TopoOnlineMonitor.cxx:289
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
L1TopoOnlineMonitor::m_countHdwNotSim
std::unique_ptr< float[]> m_countHdwNotSim
Definition: L1TopoOnlineMonitor.h:76
L1TopoOnlineMonitor::m_detStore
ServiceHandle< StoreGateSvc > m_detStore
Definition: L1TopoOnlineMonitor.h:127
xAOD::TrigComposite_v1
Class used to describe composite objects in the HLT.
Definition: TrigComposite_v1.h:49
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
DataVector::back
const T * back() const
Access the last element in the collection as an rvalue.
L1TopoOnlineMonitor::doComp
StatusCode doComp(DecisionBits &decisionBits, const EventContext &ctx) const
Compare hardware and simulation.
Definition: L1TopoOnlineMonitor.cxx:582
L1Topo::L1TopoResult::getDecisions
const std::bitset< s_nTopoOutputs > & getDecisions() const
Definition: L1Topo/L1TopoRDO/L1TopoRDO/L1TopoResult.h:45
TrigCompositeAuxContainer.h
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
L1Topo::L1TopoResult::getOverflows
const std::bitset< s_nTopoOutputs > & getOverflows() const
Definition: L1Topo/L1TopoRDO/L1TopoRDO/L1TopoResult.h:46
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:232
L1Topo::L1TopoResult::getTopo1Opt1
const std::bitset< s_nTopoOutputs > & getTopo1Opt1() const
Definition: L1Topo/L1TopoRDO/L1TopoRDO/L1TopoResult.h:48
L1TopoOnlineMonitor::m_overflow_countSim
std::unique_ptr< float[]> m_overflow_countSim
Definition: L1TopoOnlineMonitor.h:90
L1TopoOnlineMonitor::m_overflow_countSimNotHdw
std::unique_ptr< float[]> m_overflow_countSimNotHdw
Definition: L1TopoOnlineMonitor.h:87
L1TopoOnlineMonitor::m_currentSimBit
std::unique_ptr< float[]> m_currentSimBit
Definition: L1TopoOnlineMonitor.h:94
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
L1TopoOnlineMonitor::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Definition: L1TopoOnlineMonitor.cxx:222
CTP_BC::getTBP
const std::bitset< 512 > & getTBP() const
get bitset of TBP words
Definition: CTP_Decoder.h:92
L1Topo::L1TopoResult::getFPGA
const std::shared_ptr< L1Topo::L1TopoFPGA > & getFPGA(unsigned index) const
Definition: L1Topo/L1TopoRDO/L1TopoRDO/L1TopoResult.h:44
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
L1TopoOnlineMonitor::m_overflow_rateHdwAndSim
std::unique_ptr< float[]> m_overflow_rateHdwAndSim
Definition: L1TopoOnlineMonitor.h:84
L1TopoOnlineMonitor::DecisionBits::ambiguityBitsSim
std::optional< std::bitset< s_nTopoCTPOutputs > > ambiguityBitsSim
Definition: L1TopoOnlineMonitor.h:58
SG::VarHandleBase::key
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx:64
L1TopoOnlineMonitor::m_forceCTPasHdw
Gaudi::Property< bool > m_forceCTPasHdw
Definition: L1TopoOnlineMonitor.h:120
TriggerTest.ctp
ctp
Retrieve trigger EDM objects.
Definition: TriggerTest.py:14
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:16
L1TopoOnlineMonitor::DecisionBits
Helper structure holding decision bitsets, passed between the monitoring methods.
Definition: L1TopoOnlineMonitor.h:53
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
L1TopoOnlineMonitor::m_doComp
Gaudi::Property< bool > m_doComp
Definition: L1TopoOnlineMonitor.h:116
L1TopoOnlineMonitor::DecisionBits::overflowBitsSim
std::optional< std::bitset< s_nTopoCTPOutputs > > overflowBitsSim
Definition: L1TopoOnlineMonitor.h:57
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:73
DeMoScan.index
string index
Definition: DeMoScan.py:362
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
L1TopoOnlineMonitor::m_TopoMultTriggerNames
std::vector< std::string > m_TopoMultTriggerNames
Definition: L1TopoOnlineMonitor.h:69
L1TopoOnlineMonitor::m_overflow_countAny
std::unique_ptr< float[]> m_overflow_countAny
Definition: L1TopoOnlineMonitor.h:91
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
L1TopoOnlineMonitor::m_TopoAlgTriggerNotVetoed
std::vector< bool > m_TopoAlgTriggerNotVetoed
Definition: L1TopoOnlineMonitor.h:68
L1TopoOnlineMonitor::m_TopoMultTriggerNotVetoed
std::vector< bool > m_TopoMultTriggerNotVetoed
Definition: L1TopoOnlineMonitor.h:70
L1TopoOnlineMonitor::m_TopoAlgTriggerNames
std::vector< std::string > m_TopoAlgTriggerNames
Definition: L1TopoOnlineMonitor.h:67
python.XMLReader.l1menu
l1menu
Definition: XMLReader.py:73
L1TopoOnlineMonitor::L1TopoOnlineMonitor
L1TopoOnlineMonitor(const std::string &name, ISvcLocator *svcLoc)
Definition: L1TopoOnlineMonitor.cxx:38
L1Topo::L1TopoResult::getStatus
bool getStatus()
Definition: L1Topo/L1TopoRDO/L1TopoRDO/L1TopoResult.h:51
L1TopoOnlineMonitor::DecisionBits::triggerBitsCtp
std::optional< std::bitset< s_nTopoCTPOutputs > > triggerBitsCtp
Definition: L1TopoOnlineMonitor.h:59
L1TopoOnlineMonitor.h
L1Topo::L1TopoResult::getROD
const std::shared_ptr< L1Topo::L1TopoROD > & getROD(unsigned index) const
Definition: L1Topo/L1TopoRDO/L1TopoRDO/L1TopoResult.h:43
dqt_zlumi_alleff_HIST.tl
tl
Definition: dqt_zlumi_alleff_HIST.py:73
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
L1TopoOnlineMonitor::getCtpIds
std::vector< unsigned > getCtpIds(const TrigConf::L1Menu &l1menu)
Get CTP ids from menu.
Definition: L1TopoOnlineMonitor.cxx:794
L1TopoOnlineMonitor::m_ctpRdoKey
SG::ReadHandleKey< CTP_RDO > m_ctpRdoKey
Definition: L1TopoOnlineMonitor.h:137
L1TopoOnlineMonitor::m_l1topoRawDataKey
SG::ReadHandleKey< xAOD::L1TopoRawDataContainer > m_l1topoRawDataKey
Definition: L1TopoOnlineMonitor.h:133
xAOD::lumiBlock
setTeId lumiBlock
Definition: L2StandAloneMuon_v1.cxx:328
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
L1TopoResult.h
L1TopoOnlineMonitor::m_countHdw
std::unique_ptr< float[]> m_countHdw
Definition: L1TopoOnlineMonitor.h:79
L1Topo::L1TopoResult::getTopo1Opt3
const std::bitset< s_nTopoOutputs > & getTopo1Opt3() const
Definition: L1Topo/L1TopoRDO/L1TopoRDO/L1TopoResult.h:50
L1TopoOnlineMonitor::doMultComp
StatusCode doMultComp(std::vector< std::vector< unsigned >> &multWeightsSim, std::vector< std::vector< unsigned >> &multWeightsHdw, const EventContext &ctx) const
Compare hardware and simulation for the multiplicity algorithms.
Definition: L1TopoOnlineMonitor.cxx:743
Helpers.h
L1TopoOnlineMonitor::m_doHwMon
Gaudi::Property< bool > m_doHwMon
Definition: L1TopoOnlineMonitor.h:112
L1TopoOnlineMonitor::m_countHdwSim
std::unique_ptr< float[]> m_countHdwSim
Definition: L1TopoOnlineMonitor.h:78
fitman.k
k
Definition: fitman.py:528
L1TopoOnlineMonitor::m_overflow_rateHdwSim
std::unique_ptr< float[]> m_overflow_rateHdwSim
Definition: L1TopoOnlineMonitor.h:85
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
L1TopoOnlineMonitor::m_errorFlagsKey
SG::WriteHandleKey< xAOD::TrigCompositeContainer > m_errorFlagsKey
Definition: L1TopoOnlineMonitor.h:105