ATLAS Offline Software
Loading...
Searching...
No Matches
L1CaloL1TopoMonitorAlgorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include <map>
6#include <utility>
7#include <set>
8#include <tuple>
9#include <algorithm>
10#include <vector>
11#include <iomanip>
12#include <sstream>
13
15
17#include "L1TopoRDO/Helpers.h"
18#include "L1TopoRDO/Fibre.h"
19#include "L1TopoRDO/Status.h"
21
25
27 ISvcLocator* pSvcLocator )
28 : AthMonitorAlgorithm(name,pSvcLocator)
29{
30}
31
33
34 ATH_MSG_DEBUG("L1CaloL1TopoMonitorAlgorith::initialize");
35 ATH_MSG_DEBUG("Package Name "<< m_packageName);
36
37 // we initialise all the containers that we need
38 ATH_CHECK(m_ctpRdoKey.initialize());
39 ATH_CHECK(m_cmxJetTobLocation.initialize());
40 ATH_CHECK(m_cmxCpTobLocation.initialize());
41 ATH_CHECK(m_l1TopoKey.initialize());
42
44}
45
46StatusCode L1CaloL1TopoMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const {
47
48 ATH_MSG_DEBUG("L1CaloL1TopoMonitorAlgorithm::fillHistograms");
49 ATH_MSG_DEBUG("m_ctpRdoKey=" << m_ctpRdoKey);
50 ATH_MSG_DEBUG("m_cmxCpTobLocation=" << m_cmxCpTobLocation);
51 ATH_MSG_DEBUG("m_cmxJetTobLocation=" << m_cmxJetTobLocation);
52 ATH_MSG_DEBUG("m_l1TopoKey=" << m_l1TopoKey);
53
54 typedef std::tuple<int,int,int,int,int,int> TobKey;
55 std::set<TobKey> cmxKeys[TOB_TYPES],topoKeys[TOB_TYPES],
56 keyDiff[TOB_TYPES],keyIntersect[TOB_TYPES];
57
58 const int LUMI_BLOCK=GetEventInfo(ctx)->lumiBlock();
59 const int NFPGA=4;
60 const int MAXTOBS=20;
61
62 // monitored variables
63 std::vector<int> errors;
64 std::vector<std::reference_wrapper<Monitored::IMonitoredVariable>> variables;
65
66 // 1D
67 auto run = Monitored::Scalar<int>("run",GetEventInfo(ctx)->runNumber());
68 auto nJetTobs = Monitored::Scalar<int>("nJetTobs",0);
69 auto nTauTobs = Monitored::Scalar<int>("nTauTobs",0);
70 auto nEMTobs = Monitored::Scalar<int>("nEMTobs",0);
71 auto nMuonTobs = Monitored::Scalar<int>("nMuonTobs",0);
72
73 variables.push_back(run);
74 variables.push_back(nJetTobs);
75 variables.push_back(nTauTobs);
76 variables.push_back(nEMTobs);
77 variables.push_back(nMuonTobs);
78
79 auto jetTobsEnergyL = Monitored::Scalar<int>("jetTobsEnergyL",0);
80 auto wFPGA = Monitored::Scalar<float>("wFPGA",1.0/NFPGA);
81 auto lbErrors = Monitored::Scalar<int>("lbErrors",0);
82 auto sumErrors = Monitored::Collection("sumErrors",errors,[](const auto &_e){return _e;});
83
84 // 2D Hitmaps
85 auto etaJetSTobs_match = Monitored::Scalar<double>("etaJetSTobs_match", 0.);
86 auto phiJetSTobs_match = Monitored::Scalar<double>("phiJetSTobs_match", 0.);
87 auto etaJetLTobs_match = Monitored::Scalar<double>("etaJetLTobs_match", 0.);
88 auto phiJetLTobs_match = Monitored::Scalar<double>("phiJetLTobs_match", 0.);
89 auto etaTauTobs_match = Monitored::Scalar<double>("etaTauTobs_match", 0.);
90 auto phiTauTobs_match = Monitored::Scalar<double>("phiTauTobs_match", 0.);
91 auto etaEMTobs_match = Monitored::Scalar<double>("etaEMTobs_match", 0.);
92 auto phiEMTobs_match = Monitored::Scalar<double>("phiEMTobs_match", 0.);
93 auto xJetSTobs_match = Monitored::Scalar<double>("xJetSTobs_match", 0.);
94 auto yJetSTobs_match = Monitored::Scalar<double>("yJetSTobs_match", 0.);
95 auto xJetLTobs_match = Monitored::Scalar<double>("xJetLTobs_match", 0.);
96 auto yJetLTobs_match = Monitored::Scalar<double>("yJetLTobs_match", 0.);
97 auto xTauTobs_match = Monitored::Scalar<double>("xTauTobs_match", 0.);
98 auto yTauTobs_match = Monitored::Scalar<double>("yTauTobs_match", 0.);
99 auto xEMTobs_match = Monitored::Scalar<double>("xEMTobs_match", 0.);
100 auto yEMTobs_match = Monitored::Scalar<double>("yEMTobs_match", 0.);
101
102 auto etaJetSTobs_mismatch = Monitored::Scalar<double>("etaJetSTobs_mismatch", 0.);
103 auto phiJetSTobs_mismatch = Monitored::Scalar<double>("phiJetSTobs_mismatch", 0.);
104 auto etaJetLTobs_mismatch = Monitored::Scalar<double>("etaJetLTobs_mismatch", 0.);
105 auto phiJetLTobs_mismatch = Monitored::Scalar<double>("phiJetLTobs_mismatch", 0.);
106 auto etaTauTobs_mismatch = Monitored::Scalar<double>("etaTauTobs_mismatch", 0.);
107 auto phiTauTobs_mismatch = Monitored::Scalar<double>("phiTauTobs_mismatch", 0.);
108 auto etaEMTobs_mismatch = Monitored::Scalar<double>("etaEMTobs_mismatch", 0.);
109 auto phiEMTobs_mismatch = Monitored::Scalar<double>("phiEMTobs_mismatch", 0.);
110 auto xJetSTobs_mismatch = Monitored::Scalar<double>("xJetSTobs_mismatch", 0.);
111 auto yJetSTobs_mismatch = Monitored::Scalar<double>("yJetSTobs_mismatch", 0.);
112 auto xJetLTobs_mismatch = Monitored::Scalar<double>("xJetLTobs_mismatch", 0.);
113 auto yJetLTobs_mismatch = Monitored::Scalar<double>("yJetLTobs_mismatch", 0.);
114 auto xTauTobs_mismatch = Monitored::Scalar<double>("xTauTobs_mismatch", 0.);
115 auto yTauTobs_mismatch = Monitored::Scalar<double>("yTauTobs_mismatch", 0.);
116 auto xEMTobs_mismatch = Monitored::Scalar<double>("xEMTobs_mismatch", 0.);
117 auto yEMTobs_mismatch = Monitored::Scalar<double>("yEMTobs_mismatch", 0.);
118
119 // 2D Topo items vs BC
120 auto item0 = Monitored::Scalar<int>("item0", 0.);
121 auto item1 = Monitored::Scalar<int>("item1", 0.);
122 auto item2 = Monitored::Scalar<int>("item2", 0.);
123 auto item3 = Monitored::Scalar<int>("item3", 0.);
124 auto bc0 = Monitored::Scalar<int>("bc0", 0.);
125 auto bc1 = Monitored::Scalar<int>("bc1", 0.);
126 auto bc2 = Monitored::Scalar<int>("bc2", 0.);
127 auto bc3 = Monitored::Scalar<int>("bc3", 0.);
128
129 // read all objects needed
130 ATH_MSG_DEBUG("Begin to fetch store gate objects ..");
131 SG::ReadHandle<CTP_RDO> const_ctpRdo(m_ctpRdoKey,ctx);
132 ATH_CHECK(const_ctpRdo.isValid());
134 ATH_CHECK(cmxCpTob.isValid());
136 ATH_CHECK(cmxJetTob.isValid());
138 if (!l1TopoRawData.isValid()) {
139 ATH_MSG_DEBUG ("L1Topo DAQ raw data collection not valid");
140 errors.push_back(static_cast<int>(SummaryErrors::NO_DAQ));
141 lbErrors=LUMI_BLOCK;
142 fill(m_packageName,lbErrors,sumErrors);
143 return StatusCode::SUCCESS;
144 }
145 if (l1TopoRawData->empty()) {
146 ATH_MSG_DEBUG ("L1Topo DAQ raw data collection empty");
147 errors.push_back(static_cast<int>(SummaryErrors::NO_DAQ));
148 lbErrors=LUMI_BLOCK;
149 fill(m_packageName,lbErrors,sumErrors);
150 return StatusCode::SUCCESS;
151 }
152 ATH_MSG_DEBUG("Done fetching from store gate.");
153
154 // Make a writable copy and Set CTP version number to 4 when reading persistified data
155 std::vector<uint32_t> ctp_data=const_ctpRdo->getDataWords();
156 CTP_RDO ctpRdo(4,std::move(ctp_data));
157 ctpRdo.setL1AcceptBunchPosition(const_ctpRdo->getL1AcceptBunchPosition());
158 ctpRdo.setTurnCounter(const_ctpRdo->getTurnCounter());
159
160 // Approximate timing test of L1Topo by comparing TIP bits to L1A
161 if (ctpRdo.getCTPVersionNumber()==0) {
162 ATH_MSG_DEBUG("CTP version number not set, skipping CTP test");
163 }
164 else {
165 CTP_Decoder ctp;
166 ctp.setRDO(&ctpRdo);
167 const uint16_t l1aPos = ctpRdo.getL1AcceptBunchPosition();
168 const uint32_t bx=ctp.getBunchCrossings().size();
169 const int dbx=bx/2;
170 if (l1aPos >= bx) {
171 ATH_MSG_DEBUG( "CTP_RDO gave invalid l1aPos." );
172 }
173 else {
174 ATH_MSG_DEBUG( "CTP l1aPos, size : " << l1aPos << ", " << bx );
175 if ( bx>=3 && l1aPos>0) {
176 for (int bc=-dbx; bc<=dbx; ++bc) {
177 const CTP_BC& ctp_bc = ctp.getBunchCrossings().at(l1aPos+bc);
178 std::bitset<512> tip = ctp_bc.getTIP();
179 ATH_MSG_DEBUG( "got CTP TIP bits: " << tip.to_string() );
180 const unsigned int topoTipStart(384);
181 const unsigned int nTopoCTPOutputs(128);
182 for (unsigned int item=0; item<nTopoCTPOutputs;++item) {
183 // Check if algorithms fired
184 if (tip.test(item+topoTipStart)) {
185 if (item/32==0) {item0=item; bc0=bc; fill(m_packageName,item0,bc0);}
186 else if (item/32==1) {item1=item; bc1=bc; fill(m_packageName,item1,bc1);}
187 else if (item/32==2) {item2=item; bc2=bc; fill(m_packageName,item2,bc2);}
188 else if (item/32==3) {item3=item; bc3=bc; fill(m_packageName,item3,bc3);}
189 ATH_MSG_DEBUG(" Fired (item, bc) =" << item << ", " << bc);
190 }
191 }
192 }
193 }
194 }
195 }
196
197 // Retrieve CMX CP tobs
198 if (cmxCpTob->empty()) {
199 ATH_MSG_DEBUG ("No CMX CP TOBs found");
200 }
201 else {
202 ATH_MSG_DEBUG( "Found CMXCPTobCollection, looping on TOBs ..." );
203 for (const xAOD::CMXCPTob* t : *cmxCpTob) {
204 if (t->energy()) {
205 for (int clone=0;clone<4;++clone) {
206 if (t->cmx()==0)
207 cmxKeys[TAU_TOB].insert(std::make_tuple(t->crate(),t->cpm(),
208 t->chip(),t->location(),
209 t->energy(),clone));
210 else
211 cmxKeys[EM_TOB].insert(std::make_tuple(t->crate(),t->cpm(),
212 t->chip(),t->location(),
213 t->energy(),clone));
214 }
215 }
216 }
217 }
218
219 // Retrieve CMX jet tobs
220 if (cmxJetTob->empty()) {
221 ATH_MSG_DEBUG ("No CMX jet TOBs found");
222 }
223 else {
224 ATH_MSG_DEBUG( "Found CMXJetTobCollection, looping on TOBs ..." );
225 for (const xAOD::CMXJetTob* t : *cmxJetTob) {
226 for (int clone=0;clone<4;++clone) {
227 if (t->energyLarge())
228 cmxKeys[JETL_TOB].insert(std::make_tuple(t->crate(),t->jem(),
229 t->frame(),t->location(),
230 t->energyLarge(),clone));
231 if (t->energySmall())
232 cmxKeys[JETS_TOB].insert(std::make_tuple(t->crate(),t->jem(),
233 t->frame(),t->location(),
234 t->energySmall(),clone));
235 }
236 }
237 }
238
239 // analyse and register the L1Topo DAQ TOBs
240 int daqJetTobs=0;
241 int daqTauTobs=0;
242 int daqEMTobs=0;
243 int daqMuonTobs=0;
244 for (const xAOD::L1TopoRawData* rawdata : *l1TopoRawData) {
245 ATH_MSG_DEBUG("Found L1Topo raw DAQ data with source ID "
246 << L1Topo::formatHex8(rawdata->sourceID()));
247 //rdo.setStatusWords(rawdata->statusWords());
248 if (rawdata->errorWord()) {
249 ATH_MSG_INFO("DAQ Converter errors reported: " << rawdata->errorWord());
250 errors.push_back(static_cast<int>(SummaryErrors::DAQ_CONV));
251 }
252 if (rawdata->dataWords().empty()) {
253 ATH_MSG_INFO("L1Topo raw data DAQ payload is empty");
254 errors.push_back(static_cast<int>(SummaryErrors::NO_DAQ));
255 }
256 else {
257 std::vector<L1Topo::L1TopoTOB> daqTobs;
258
259 // initialise header: beware, this can make a valid-looking header
260 // set version 15, BCN -7, which is unlikely:
261 L1Topo::Header header(0xf, 0, 0, 0, 0, 1, 0x7);
262 int i_fpga=-1;
263 for (auto word : rawdata->dataWords()) {
264 switch (L1Topo::blockType(word)) {
265
267 {
268 header = L1Topo::Header(word);
269 if (header.payload_crc()!=0) {
270 errors.push_back(static_cast<int>(SummaryErrors::PAYL_CRC));
271 }
272 i_fpga=(((rawdata->sourceID())>>3)&2)+header.fpga();
273 break;
274 }
276 {
277 auto fibreBlock = L1Topo::Fibre(word);
278 break;
279 }
281 {
282 auto status = L1Topo::Status(word);
283 ATH_MSG_WARNING( "fibre overflow: " << status.overflow()
284 << " fibre crc: " << status.crc() );
285 if (status.crc()) {
286 errors.push_back(static_cast<int>(SummaryErrors::F_CRC));
287 }
288 break;
289 }
291 {
292 if (header.bcn_offset()==0){
293 auto tob = L1Topo::L1TopoTOB(word);
294 ATH_MSG_DEBUG(tob);
295 daqTobs.push_back(tob);
296 // not reimplemented yet
297 //auto index = L1Topo::triggerBitIndex(rawdata->sourceID(),tob);
298 for (unsigned int i=0; i<8; ++i){
299 if ((tob.trigger_bits() >>i)&1) {
300 //m_h_l1topo_1d_DAQTriggerBits->Fill(index+i);
301 }
302 if ((tob.overflow_bits()>>i)&1) {
303 //m_h_l1topo_1d_DAQOverflowBits->Fill(index+i);
304 }
305 }
306 }
307 break;
308 }
311 {
312 if (header.bcn_offset()==0) {
313 const int crate = (word >> 28) & 0x1;
314 const int jem = (word >> 24) & 0xF;
315 const int frame = (word >> 21) & 0x7;
316 const int location = (word >> 19) & 0x3;
317 const int energyS = (word >> 10) & 0x1FF;
318 const int energyL = (word & 0x3FF);
319 if (energyL) {
320 topoKeys[JETL_TOB].
321 insert(std::make_tuple(crate,jem,frame,
322 location,energyL,i_fpga));
323 ++daqJetTobs;
324 jetTobsEnergyL=energyL;
325 fill(m_packageName,jetTobsEnergyL,wFPGA);
326 }
327 if (energyS) {
328 topoKeys[JETS_TOB].
329 insert(std::make_tuple(crate,jem,frame,
330 location,energyS,i_fpga));
331 }
332 }
333 break;
334 }
336 {
337 if (header.bcn_offset()==0) {
338 ++daqTauTobs;
339 const int crate = (word >> 26) & 0x3;
340 const int cpm = (word >> 20) & 0xF;
341 const int chip = (word >> 15) & 0xF;
342 const int location = (word >> 13) & 0x3;
343 const int energy = (word & 0xFF);
344 if (energy)
345 topoKeys[TAU_TOB].
346 insert(std::make_tuple(crate,cpm,chip,
347 location,energy,i_fpga));
348 }
349 break;
350 }
352 {
353 if (header.bcn_offset()==0) {
354 ++daqEMTobs;
355 const int crate = (word >> 26) & 0x3;
356 const int cpm = (word >> 20) & 0xF;
357 const int chip = (word >> 15) & 0xF;
358 const int location = (word >> 13) & 0x3;
359 const int energy = (word & 0xFF);
360 if (energy)
361 topoKeys[EM_TOB].
362 insert(std::make_tuple(crate,cpm,chip,
363 location,energy,i_fpga));
364 }
365 break;
366 }
368 {
369 if (header.bcn_offset()==0){
370 ++daqMuonTobs;
371 }
372 break;
373 }
375 {
376 if (header.bcn_offset()==0){
377 }
378 break;
379 }
380 default:
381 {
382 break;
383 }
384
385 }
386 } // for word
387 } // L1Topo raw data
388 } // L1 Topo collection
389
390
391 // look in both directions for CMX and Topo TOBs (mis)matches
392 bool mismatch=false;
393 for (int t=0; t<TOB_TYPES; ++t) {
394 // create set of mismatches
395 set_symmetric_difference(cmxKeys[t].begin(),cmxKeys[t].end(),
396 topoKeys[t].begin(),topoKeys[t].end(),
397 inserter(keyDiff[t],keyDiff[t].begin()));
398 if (keyDiff[t].size()>0) {
399 ATH_MSG_DEBUG("Error: CMX <-> L1Topo TOB mismatches = "
400 << keyDiff[t].size());
401 mismatch=true;
402 }
403 for (auto& tob : keyDiff[t]) {
404 int x,y;
405 double eta,phi;
406 if (t==JETS_TOB || t==JETL_TOB) {
407 jem2Coord(std::get<0>(tob),std::get<1>(tob),
408 std::get<2>(tob),std::get<3>(tob),x,y,eta,phi);
409 if (t==JETS_TOB) {
410 xJetSTobs_mismatch=x; yJetSTobs_mismatch=y;
411 etaJetSTobs_mismatch=eta; phiJetSTobs_mismatch=phi;
412 fill(m_packageName, xJetSTobs_mismatch, yJetSTobs_mismatch,
413 etaJetSTobs_mismatch, phiJetSTobs_mismatch);
414 }
415 else { // JETL_TOB
416 xJetLTobs_mismatch=x; yJetLTobs_mismatch=y;
417 etaJetLTobs_mismatch=eta; phiJetLTobs_mismatch=phi;
418 fill(m_packageName, xJetLTobs_mismatch, yJetLTobs_mismatch,
419 etaJetLTobs_mismatch, phiJetLTobs_mismatch);
420 }
421 }
422 else {
423 cpm2Coord(std::get<0>(tob),std::get<1>(tob),
424 std::get<2>(tob),std::get<3>(tob),x,y,eta,phi);
425 if (t==TAU_TOB) {
426 xTauTobs_mismatch=x; yTauTobs_mismatch=y;
427 etaTauTobs_mismatch=eta; phiTauTobs_mismatch=phi;
428 fill(m_packageName, xTauTobs_mismatch, yTauTobs_mismatch,
429 etaTauTobs_mismatch, phiTauTobs_mismatch);
430 }
431 else { // EM_TOB
432 xEMTobs_mismatch=x; yEMTobs_mismatch=y;
433 etaEMTobs_mismatch=eta; phiEMTobs_mismatch=phi;
434 fill(m_packageName, xEMTobs_mismatch, yEMTobs_mismatch,
435 etaEMTobs_mismatch, phiEMTobs_mismatch);
436 }
437 }
438 }
439 // create set of matches
440 set_intersection(cmxKeys[t].begin(),cmxKeys[t].end(),
441 topoKeys[t].begin(),topoKeys[t].end(),
442 inserter(keyIntersect[t],keyIntersect[t].begin()));
443 for (auto& tob : keyIntersect[t]) {
444 int x,y;
445 double eta,phi;
446 if (t==JETS_TOB || t==JETL_TOB) {
447 jem2Coord(std::get<0>(tob),std::get<1>(tob),
448 std::get<2>(tob),std::get<3>(tob),x,y,eta,phi);
449 if (t==JETS_TOB) {
450 xJetSTobs_match=x; yJetSTobs_match=y;
451 etaJetSTobs_match=eta; phiJetSTobs_match=phi;
452 fill(m_packageName, xJetSTobs_match, yJetSTobs_match,
453 etaJetSTobs_match, phiJetSTobs_match);
454 }
455 else { // JETL_TOB
456 xJetLTobs_match=x; yJetLTobs_match=y;
457 etaJetLTobs_match=eta; phiJetLTobs_match=phi;
458 fill(m_packageName, xJetLTobs_match, yJetLTobs_match,
459 etaJetLTobs_match, phiJetLTobs_match);
460 }
461 }
462 else {
463 cpm2Coord(std::get<0>(tob),std::get<1>(tob),
464 std::get<2>(tob),std::get<3>(tob),x,y,eta,phi);
465 if (t==TAU_TOB) {
466 xTauTobs_match=x; yTauTobs_match=y;
467 etaTauTobs_match=eta; phiTauTobs_match=phi;
468 fill(m_packageName, xTauTobs_match, yTauTobs_match,
469 etaTauTobs_match, phiTauTobs_match);
470 }
471 else { // EM_TOB
472 xEMTobs_match=x; yEMTobs_match=y;
473 etaEMTobs_match=eta; phiEMTobs_match=phi;
474 fill(m_packageName, xEMTobs_match, yEMTobs_match,
475 etaEMTobs_match, phiEMTobs_match);
476 }
477 }
478 }
479 }
480
481 if (mismatch) {
482 errors.push_back(static_cast<int>(SummaryErrors::CMX_MATCH));
483 }
484 if (!errors.empty()) {
485 lbErrors=LUMI_BLOCK;
486 fill(m_packageName,lbErrors,sumErrors);
487 }
488
489 nJetTobs=std::min(daqJetTobs/NFPGA,MAXTOBS-1);
490 nTauTobs=std::min(daqTauTobs/NFPGA,MAXTOBS-1);
491 nEMTobs=std::min(daqEMTobs/NFPGA,MAXTOBS-1);
492 nMuonTobs=std::min(daqMuonTobs/NFPGA,MAXTOBS-1);
493
494 fill(m_packageName,variables);
495 return StatusCode::SUCCESS;
496}
497
498void L1CaloL1TopoMonitorAlgorithm::jem2Coord(const int crate, const int jem,
499 const int frame, const int location,
500 int &x, int &y, double &eta, double &phi) const
501{
502 x = crate*16 + jem;
503 y = frame*4 + location;
504 const uint32_t roiWord = // formula from JEPSimMon
505 ((((((crate << 4) + jem) << 3) + frame) << 2) + location) << 19;
506 LVL1::JEPRoIDecoder decoder;
507 const LVL1::CoordinateRange coord(decoder.coordinate(roiWord));
508 eta = coord.eta();
509 phi = coord.phi();
510}
511
512void L1CaloL1TopoMonitorAlgorithm::cpm2Coord(const int crate, const int cpm,
513 const int chip, const int location,
514 int &x, int &y, double &eta, double &phi) const
515{
516 x = crate*14 + cpm - 1;
517 y = chip*4 + location;
518 const uint32_t roiWord = // formula from CPSimMon
519 ((((((crate << 4) + cpm) << 4) + chip) << 2)
520 + location) << 18;
521 LVL1::CPRoIDecoder decoder;
522 const LVL1::CoordinateRange coord(decoder.coordinate(roiWord));
523 eta = coord.eta();
524 phi = coord.phi();
525}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double coord
Type of coordination system.
#define y
#define x
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 > & getTIP() const
get bitset of TIP words
Definition CTP_Decoder.h:80
void setL1AcceptBunchPosition(const uint8_t)
Definition CTP_RDO.cxx:141
unsigned int getCTPVersionNumber() const
Definition CTP_RDO.h:64
uint32_t getL1AcceptBunchPosition() const
Definition CTP_RDO.cxx:94
void setTurnCounter(const uint32_t)
Definition CTP_RDO.cxx:148
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
virtual StatusCode initialize() override
initialize
SG::ReadHandleKey< CTP_RDO > m_ctpRdoKey
void cpm2Coord(const int crate, const int cpm, const int chip, const int location, int &x, int &y, double &eta, double &phi) const
L1CaloL1TopoMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< xAOD::L1TopoRawDataContainer > m_l1TopoKey
void jem2Coord(const int crate, const int jem, const int frame, const int location, int &x, int &y, double &eta, double &phi) const
SG::ReadHandleKey< xAOD::CMXJetTobContainer > m_cmxJetTobLocation
SG::ReadHandleKey< xAOD::CMXCPTobContainer > m_cmxCpTobLocation
Represents the L1Topo fibre word of the L1Topo DAQ header, with decoder and encoder.
Definition Fibre.h:22
Represents the L1Topo header word of the L1Topo DAQ data, with decoder and encoder.
Represents the L1Topo TOB word of the L1Topo ROI data, with decode and encoder.
Definition L1TopoTOB.h:17
Represents the L1Topo status word of the L1Topo DAQ header, with decoder and encoder.
Definition Status.h:19
A level 1 calorimeter trigger conversion service: returns the Coordinate represented by a RoI word.
CoordinateRange class declaration.
A level 1 calorimeter trigger conversion service: returns the Coordinate represented by a RoI word.
Declare a monitored scalar variable.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
L1Topo::BlockTypes blockType(const uint32_t word, uint32_t offset=28, uint32_t size=0x0f)
Function to return the block type of a data word from L1Topo.
Definition BlockTypes.cxx:9
std::string formatHex8(uint32_t word)
Helper function to format a 32-bit integer as an 8-digit hex number for printing.
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Definition run.py:1
L1TopoRawData_v1 L1TopoRawData
Define the latest version of the L1TopoRawData class.
CMXJetTob_v1 CMXJetTob
Define the latest version of the CMXJetTob class.
CMXCPTob_v1 CMXCPTob
Define the latest version of the CMXCPTob class.
Set * set_intersection(Set *set1, Set *set2)
Perform an intersection of two sets.
void fill(H5::Group &out_file, size_t iterations)