ATLAS Offline Software
Loading...
Searching...
No Matches
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
7
8// Trigger includes
12#include "L1TopoRDO/Helpers.h"
13#include "L1TopoRDO/L1TopoROD.h"
16
17// System includes
18#include <utility>
19
20
21// Local helper constants and functions
22namespace {
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// =============================================================================
38L1TopoOnlineMonitor::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]);
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) {
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++){
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
214 m_ctpIds = getCtpIds(*l1menu);
215
216 m_startbit = getStartBits(*l1menu);
217
218 return StatusCode::SUCCESS;
219}
220
221
222StatusCode 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
289StatusCode 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(std::move(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
383StatusCode 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
394 CTP_Decoder ctp;
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
424StatusCode 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(std::move(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(std::move(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(std::move(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(std::move(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
582StatusCode 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
743StatusCode 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
776std::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(std::move(startbit));
789 }
790 return startbit_vec;
791}
792//
793
794std::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}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
unsigned int uint
static Double_t sc
constexpr int pow(int base, int exp) noexcept
virtual StatusCode initialize() override
initialize
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.)
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
const std::bitset< 512 > & getTBP() const
get bitset of TBP words
Definition CTP_Decoder.h:92
SG::WriteHandleKey< xAOD::TrigCompositeContainer > m_errorFlagsKey
Gaudi::Property< bool > m_doHwMonCTP
std::unique_ptr< float[]> m_countHdwNotSim
std::vector< std::string > m_TopoAlgTriggerNames
std::vector< std::string > m_TopoMultTriggerNames
std::unique_ptr< float[]> m_overflow_countSimNotHdw
std::unique_ptr< float[]> m_countHdwSim
ServiceHandle< StoreGateSvc > m_detStore
StatusCode doComp(DecisionBits &decisionBits, const EventContext &ctx) const
Compare hardware and simulation.
std::unique_ptr< float[]> m_currentHdwBit
std::vector< std::vector< std::pair< unsigned, unsigned > > > getStartBits(const TrigConf::L1Menu &l1menu)
std::vector< unsigned > getCtpIds(const TrigConf::L1Menu &l1menu)
Get CTP ids from menu.
Gaudi::Property< bool > m_doMultComp
std::vector< bool > m_TopoAlgTriggerNotVetoed
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
ToolHandle< GenericMonitoringTool > m_monTool
StatusCode doHwMon(DecisionBits &decisionBits, std::vector< std::vector< unsigned > > &multWeights, const EventContext &ctx) const
Monitor the Hw bits from RAW data.
std::vector< std::vector< std::pair< unsigned, unsigned > > > m_startbit
std::unique_ptr< float[]> m_overflow_rateSimNotHdw
std::unique_ptr< float[]> m_rateSimNotHdw
void resetFlags(xAOD::TrigComposite &errorFlags) const
StatusCode doHwMonCTP(DecisionBits &decisionBits, const EventContext &ctx) const
Monitor the Hw bits from CTP.
std::vector< bool > m_TopoMultTriggerNotVetoed
static constexpr size_t s_nTopoCTPOutputs
Number of CTP outputs, used for histogram ranges and loops.
std::unique_ptr< float[]> m_countSimNotHdw
Gaudi::Property< bool > m_doSimMon
std::unique_ptr< float[]> m_countHdw
Gaudi::Property< bool > m_doHwMon
Gaudi::Property< std::vector< std::string > > m_AlgorithmVetoList
std::unique_ptr< float[]> m_rateHdwAndSim
std::unique_ptr< float[]> m_overflow_countHdw
std::unique_ptr< float[]> m_rateHdwNotSim
std::unique_ptr< float[]> m_countAny
L1TopoOnlineMonitor(const std::string &name, ISvcLocator *svcLoc)
std::unique_ptr< float[]> m_currentSimBit
Gaudi::Property< bool > m_forceCTPasHdw
std::unique_ptr< float[]> m_overflow_countSim
std::unique_ptr< float[]> m_overflow_rateHdwAndSim
std::vector< unsigned > m_ctpIds
std::unique_ptr< float[]> m_overflow_rateHdwSim
SG::ReadHandleKey< xAOD::L1TopoRawDataContainer > m_l1topoRawDataKey
std::unique_ptr< float[]> m_overflow_rateHdwNotSim
std::unique_ptr< float[]> m_countSim
Gaudi::Property< std::vector< std::string > > m_MultiplicityVetoList
SG::ReadHandleKey< CTP_RDO > m_ctpRdoKey
virtual StatusCode initialize() override
initialize
virtual StatusCode start() override
std::unique_ptr< float[]> m_overflow_countHdwNotSim
SG::ReadHandleKey< xAOD::L1TopoSimResultsContainer > m_l1topoKey
Gaudi::Property< bool > m_doComp
StatusCode doSimMon(DecisionBits &decisionBits, std::vector< std::vector< unsigned > > &multWeights, const EventContext &ctx) const
Monitor the simulated bits.
std::unique_ptr< float[]> m_rateHdwSim
std::unique_ptr< float[]> m_overflow_countAny
std::unique_ptr< float[]> m_overflow_countHdwSim
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.
Gaudi::Property< bool > m_doHwErrorMon
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
L1 menu configuration.
Definition L1Menu.h:28
bool setDetail(const std::string &name, const TYPE &value)
Set an TYPE detail on the object.
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:138
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
std::pair< long int, long int > indices
Definition index.py:1
TrigComposite_v1 TrigComposite
Declare the latest version of the class.
Helper structure holding decision bitsets, passed between the monitoring methods.
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.
std::optional< std::bitset< s_nTopoCTPOutputs > > triggerBits
std::optional< std::bitset< s_nTopoCTPOutputs > > ambiguityBitsSim
std::optional< std::bitset< s_nTopoCTPOutputs > > overflowBitsSim
std::optional< std::bitset< s_nTopoCTPOutputs > > triggerBitsSim
std::optional< std::bitset< s_nTopoCTPOutputs > > overflowBits
std::optional< std::bitset< s_nTopoCTPOutputs > > triggerBitsCtp