ATLAS Offline Software
PpmByteStreamReadV1V2Tool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // ===========================================================================
6 // Includes
7 // ===========================================================================
8 // STD:
9 // ===========================================================================
10 #include <stdexcept>
11 #include <bitset>
12 // ===========================================================================
13 #include "eformat/SourceIdentifier.h"
17 
18 #include "CaloUserHeader.h"
19 #include "SubBlockHeader.h"
20 #include "SubBlockStatus.h"
21 #include "WordDecoder.h"
22 
23 #include "../L1CaloSubBlock.h" // Only for error codes
24 #include "../L1CaloSrcIdMap.h"
25 
27 
29 // ===========================================================================
30 
31 namespace {
32 uint32_t bitFieldSize(uint32_t word, uint8_t offset, uint8_t size) {
33  return (word >> offset) & ((1U << size) - 1);
34 }
35 
36 uint32_t crateModuleMask(uint8_t crate, uint8_t module) {
37  return (crate << 8) | (1 << 4) | module;
38 }
39 
40 uint32_t coolId(uint8_t crate, uint8_t module, uint8_t channel) {
41  const uint8_t pin = channel % 16;
42  const uint8_t asic = channel / 16;
43  return (crateModuleMask(crate, module) << 16) | (pin << 8) | asic;
44 }
45 
46 int16_t pedCorrection(uint16_t twoBytePedCor) {
47  return twoBytePedCor > 511? (twoBytePedCor - 1024): twoBytePedCor;
48 }
49 
50 #if 0
51 std::string noAuxSuffix(const std::string& name) {
52  if ((name.size() > 4) && (name.substr(name.size()-4, 4) == "Aux.")) {
53  return name.substr(0, name.size() - 4);
54  }
55  return name;
56 }
57 #endif
58 }
59 // ===========================================================================
60 namespace LVL1BS {
61 // ===========================================================================
62 // Constructor
64  "PpmByteStreamxAODReadTool"*/) :
65  AsgTool(name),
66  m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"),
67  m_ppmMaps("LVL1::PpmMappingTool/PpmMappingTool"),
68  m_robDataProvider("ROBDataProviderSvc", name),
69  m_srcIdMap(nullptr),
70  m_maxSizeSeen(0)
71 {
72  declareInterface<PpmByteStreamReadV1V2Tool>(this);
73  declareProperty("PpmMappingTool", m_ppmMaps,
74  "Crate/Module/Channel to Eta/Phi/Layer mapping tool");
75  declareProperty("ROBDataProviderSvc", m_robDataProvider,
76  "Get ROB source IDs service");
77 }
78 
79 // ===========================================================================
80 // Initialize
81 
82 
84  ATH_MSG_DEBUG("Initializing " << name());
85 
86  m_srcIdMap = new L1CaloSrcIdMap();
87  CHECK(m_errorTool.retrieve());
88  CHECK(m_ppmMaps.retrieve());
89  CHECK(m_robDataProvider.retrieve());
90 
91  initSourceIDs();
92 
93  return StatusCode::SUCCESS;
94 }
95 // ===========================================================================
96 // Finalize
97 
99  delete m_srcIdMap;
100 
101  return StatusCode::SUCCESS;
102 }
103 
104 // Conversion bytestream to trigger towers
106  State& state,
107  const IROBDataProviderSvc::VROBFRAG& robFrags) const
108 {
109  if (m_maxSizeSeen > state.m_triggerTowers->capacity()){
111  }
112 
113  state.m_subDetectorID = eformat::TDAQ_CALO_PREPROC;
114 
115  ROBIterator rob = robFrags.begin();
116  ROBIterator robEnd = robFrags.end();
117 
118  int robCounter = 1;
119  for (; rob != robEnd; ++rob, ++robCounter) {
120 
122  if (!sc.isSuccess()) {
123 
124  }
125  }
126 
128  return StatusCode::SUCCESS;
129 }
130 
131 
133  xAOD::TriggerTowerContainer* const ttCollection) const
134 {
136 }
137 
139  xAOD::TriggerTowerContainer* const ttCollection) const
140 {
141  State state;
142  state.m_triggerTowers = ttCollection;
143  const std::vector<uint32_t>& vID(ppmSourceIDs(state, sgKey));
144  // // get ROB fragments
146  m_robDataProvider->getROBData(vID, robFrags, "PpmByteStreamxAODReadTool");
147  ATH_MSG_DEBUG("Number of ROB fragments:" << robFrags.size());
148 
149  CHECK(convert(state, robFrags));
150  return StatusCode::SUCCESS;
151 }
152 
153 // ===========================================================================
155  State& state,
156  const ROBIterator& robIter, const RequestType& /*requestedType*/) const
157 {
158  auto rob = **robIter;
159 
161  "Treating ROB fragment source id #" << MSG::hex << rob.rob_source_id());
162 
163 
164  state.m_rodSourceId = rob.rod_source_id();
165  state.m_robSourceId = rob.source_id();
166  const auto sourceID = (state.m_rodSourceId >> 16) & 0xff;
167  const auto rodCrate = m_srcIdMap->crate(state.m_rodSourceId);
168  const auto rodSlink = m_srcIdMap->slink(state.m_rodSourceId);
169  // -------------------------------------------------------------------------
170  // Check Rob status
171  if (rob.nstatus() > 0) {
172  ROBPointer robData;
173  rob.status(robData);
174  if (*robData != 0) {
175  ATH_MSG_WARNING("ROB status error - skipping fragment");
176  m_errorTool->robError(state.m_rodSourceId, *robData);
177  return StatusCode::FAILURE;
178  }
179  }
180  // -------------------------------------------------------------------------
181  RODPointer payloadBeg;
182  RODPointer payloadEnd;
184 
185  rob.rod_data(payloadBeg);
186  payloadEnd = payloadBeg + rob.rod_ndata();
187  payload = payloadBeg;
188  // -------------------------------------------------------------------------
189  if (payload == payloadEnd) {
190  ATH_MSG_DEBUG("ROB fragment empty");
191  return StatusCode::FAILURE;
192  }
193  // -------------------------------------------------------------------------
194 
195 
196  uint16_t rodVer = rob.rod_version() & 0xffff;
197  uint32_t rodRunNumber = rob.rod_run_no() & 0xffffff;
198  state.m_verCode = ((rodVer & 0xfff) << 4) | 1;
199 
200 
201  if (sourceID != state.m_subDetectorID) {
202  ATH_MSG_ERROR("Wrong subdetector source id for requested objects: " << state.m_rodSourceId);
203  return StatusCode::FAILURE;
204  }
205 
206  ATH_MSG_DEBUG("Treating crate " << rodCrate << " slink " << rodSlink);
208  if (!state.m_caloUserHeader.isValid()) {
209  ATH_MSG_ERROR("Invalid or missing user header");
210  return StatusCode::FAILURE;
211  }
212 
214  "Run number: " << MSG::dec << rodRunNumber << endmsg
215  << "Version code: 0x" << MSG::hex << int(state.m_verCode) << MSG::dec
216  << endmsg << "LUT triggered slice offset: "
217  << int(state.m_caloUserHeader.lut()) << endmsg
218  << "FADC triggered slice offset: " << int(state.m_caloUserHeader.ppFadc())
219  << endmsg << "FADC baseline lower bound: "
220  << int(state.m_caloUserHeader.ppLowerBound()));
221 
222  int indata = 0;
223  uint8_t blockType = 0;
224  int subBlock = 0;
225 
226  for (; payload != payloadEnd; ++payload) {
227  if (CaloUserHeader::isValid(*payload) && (subBlock == 0)) {
228 
230  indata = 0;
231  CHECK(processPpmBlock_(state));
232 
233  state.m_ppLuts.clear();
234  state.m_ppFadcs.clear();
235  state.m_ppBlock.clear();
236 
237  blockType = (*payload >> 28) & 0xf;
238 
239  if ((blockType & 0xd) == 0xc) {
242  "SubBlock version #" << int(state.m_subBlockHeader.version())
243  << " format #" << int(state.m_subBlockHeader.format())
244  << " seqNum (compVer) #" << int(state.m_subBlockHeader.seqNum())
245  << " nslice1 #" << int(state.m_subBlockHeader.nSlice1())
246  << " nslice2 #" << int(state.m_subBlockHeader.nSlice2())
247  );
248  subBlock = blockType & 0xe;
249  } else if (blockType == (subBlock | 1)) {
251  subBlock = 0;
252  }
253  } else {
254  switch(state.m_subDetectorID){
255  case eformat::TDAQ_CALO_PREPROC:
256  CHECK(processPpmWord_(state, *payload, indata));
257  break;
258  default:
259  break;
260  }
261  indata++;
262  }
263  }
264  CHECK(processPpmBlock_(state));
265  state.m_ppLuts.clear();
266  state.m_ppFadcs.clear();
267  state.m_ppBlock.clear();
268  return StatusCode::SUCCESS;
269 }
270 
272  uint32_t word,
273  int indata) const
274 {
275  if ( (state.m_subBlockHeader.format() == 0)
276  || (state.m_subBlockHeader.format() >= 2)
277  || (state.m_verCode >= 0x41)) {
278  state.m_ppBlock.push_back(word);
279  } else if ((state.m_verCode == 0x21) || (state.m_verCode == 0x31)) {
280  return processPpmStandardR3V1_(state, word, indata);
281  } else {
282  ATH_MSG_ERROR("Unsupported PPM version:format ("
283  << state.m_verCode << ":" << state.m_subBlockHeader.format()
284  <<") combination");
285  return StatusCode::FAILURE;
286  }
287  return StatusCode::SUCCESS;
288 }
289 
290 
292 {
293  if (state.m_ppBlock.size() > 0) {
294  if (state.m_subBlockHeader.format() == 0) {
296  CHECK(sc);
297  return sc;
298  }
299 
300  if (state.m_verCode == 0x31) {
302  CHECK(sc);
303  return sc;
304  }
305 
306  if (state.m_verCode == 0x41 || state.m_verCode == 0x42) {
308  CHECK(sc);
309  return sc;
310  }
311  }
312 
313  if (state.m_ppLuts.size() > 0) {
314  if (state.m_verCode == 0x21 || state.m_verCode == 0x31) {
316  CHECK(sc);
317  return sc;
318  }
319  ATH_MSG_ERROR("Unknown PPM subheader format '"
320  << int(state.m_subBlockHeader.format())
321  << "' for rob version '"
322  << MSG::hex << int(state.m_verCode)
323  << MSG::dec << "'" );
324  return StatusCode::FAILURE;
325  }
326  return StatusCode::SUCCESS;
327 }
328 
330 {
331  uint8_t numLut = state.m_subBlockHeader.nSlice1();
332  uint8_t numFadc = state.m_subBlockHeader.nSlice2();
333  uint8_t totSlice = 3 * numLut + numFadc;
334 
335  uint8_t channel = 0;
336  for ( int asic = 0 ; asic < 4 ; ++asic ) {
337  for ( int mcm = 0 ; mcm < 16 ; ++mcm ) {
338  // ----------------------------------------------------------------------
339  std::vector<uint32_t> rotated(totSlice);
340 
341  for ( uint8_t slice = 0 ; slice < totSlice ; ++slice ) {
342  for ( uint8_t bit = 0 ; bit < 11 ; ++bit ) {
343  if ( state.m_ppBlock[slice * 11 + asic * (11 * totSlice) + bit + 1] & (1 << mcm))
344  rotated[slice] |= (1 << bit);
345  }
346  }
347 
348  bool nonZeroData = false;
349  for (uint8_t slice = 0; slice < numLut; ++slice) {
350  if (rotated[slice]
351  || rotated[slice + numLut]
352  || rotated[slice + 2 * numLut + numFadc]) { // CP, JET
353  nonZeroData = true;
354  break;
355  }
356  }
357 
358  std::vector<uint8_t> lcpVal;
359  std::vector<uint8_t> lcpBcidVec;
360  std::vector<uint8_t> ljeVal;
361  std::vector<uint8_t> ljeSat80Vec;
362  std::vector<int16_t> pedCor;
363  std::vector<uint8_t> pedEn;
364 
365  std::vector<uint16_t> adcVal;
366  std::vector<uint8_t> adcExt;
367 
368  if (nonZeroData) {
369  for (uint8_t slice = 0; slice < numLut; ++slice) {
370  lcpVal.push_back(rotated[slice] & 0xff);
371  ljeVal.push_back(rotated[slice + numLut] & 0xff);
372  pedCor.push_back(::pedCorrection(rotated[slice + 2 * numLut + numFadc] & 0x3ff));
373 
374  lcpBcidVec.push_back((rotated[slice] >> 8) & 0x7);
375  ljeSat80Vec.push_back((rotated[slice + numLut] >> 8) & 0x7);
376  pedEn.push_back((rotated[slice + 2 * numLut + numFadc] >> 10) & 0x1);
377  }
378  }
379 
380  for (uint8_t slice = 0; slice < numFadc; ++slice) {
381  if (rotated[slice + numLut]) { // CP, JET
382  nonZeroData = true;
383  break;
384  }
385  }
386 
387  if (nonZeroData) {
388  for (uint8_t slice = 0; slice < numFadc; ++ slice) {
389  adcVal.push_back(rotated[slice + 2 * numLut] & 0x3ff);
390  adcExt.push_back((rotated[slice + 2 * numLut] >> 10 & 0x1) & 0x3ff);
391  }
392  }
393 
395  state,
396  state.m_subBlockHeader.crate(),
397  state.m_subBlockHeader.module(),
398  channel,
399  std::move(lcpVal),
400  std::move(lcpBcidVec),
401  std::move(ljeVal),
402  std::move(ljeSat80Vec),
403  std::move(adcVal),
404  std::move(adcExt),
405  std::move(pedCor),
406  std::move(pedEn)));
407  // ---------------------------------------------------------------------
408  channel++;
409  }
410  }
411  return StatusCode::SUCCESS;
412 }
413 
415 {
416  BitReader br (state.m_ppBlock);
417  uint8_t chan = 0;
418  try{
419  while (chan < 64) {
420  uint8_t present = 1;
421  if (state.m_subBlockHeader.format() == 3) {
422  present = br.getField(1);
423  }
424 
425  if (present == 1) {
426  uint8_t lutVal = 0;
427  uint8_t fmt = 6;
428  uint8_t lutSat=0;
429  uint8_t lutExt=0;
430  uint8_t lutPeak=0;
431 
432  std::vector<uint16_t> adcVal = {0 , 0, 0, 0, 0};
433  std::vector<uint8_t> adcExt = {0 , 0, 0, 0, 0};
434 
435  uint8_t minHeader = br.getField(4);
436  uint8_t minIndex = minHeader % 5;
437  if (minHeader < 15) { // Formats 0-5
438  if (minHeader < 10) { // Formats 0-1
439  fmt = minHeader / 5;
440  } else { // Formats 2-5
441  fmt = 2 + br.getField( 2);
442  uint8_t haveLut = br.getField(1);
443  if (fmt == 2) {
444  if (haveLut == 1) {
445  lutVal = br.getField(3);
446  lutPeak = 1; // Even if LutVal==0 it seems
447  }
448  } else {
449  uint8_t haveExt = br.getField(1);
450  if (haveLut == 1) {
451  lutVal = br.getField(8);
452  lutExt = br.getField(1);
453  lutSat = br.getField(1);
454  lutPeak = br.getField(1);
455  }
456 
457  if (haveExt == 1){
458  for(uint8_t i = 0; i < 5; ++i) {
459  adcExt[i] = br.getField(1);
460  }
461  } else {
462  adcExt[2] = lutExt;
463  }
464  }
465  }
466  adcVal = getPpmAdcSamplesR3_(state, br, fmt, minIndex);
467  } else {
468  uint8_t haveAdc = br.getField(1);
469  if (haveAdc == 1) {
470  uint16_t val = br.getField(10);
471  for(uint8_t i = 0; i < 5; ++i) {
472  adcVal[i] = val;
473  }
474  }
475  }
476  // Add Trigger Tower
477  //std::vector<uint8_t> luts = {lutVal};
479  state,
480  state.m_subBlockHeader.crate(),
481  state.m_subBlockHeader.module(),
482  chan,
483  std::vector<uint8_t> {lutVal},
484  std::vector<uint8_t> {uint8_t(lutExt | (lutSat << 1) | (lutPeak << 2))},
485  std::move(adcVal),
486  std::move(adcExt)
487  ));
488  }
489  chan++;
490  }
491  }catch (const std::out_of_range& ex) {
492  ATH_MSG_WARNING("Excess Data in Sub-block");
494  }
495  return StatusCode::SUCCESS;
496 }
497 
499  State& state,
500  BitReader& br, uint8_t format, uint8_t minIndex) const
501 {
502  std::vector<uint16_t> adc = {0, 0, 0, 0, 0};
503  uint8_t minAdc = 0;
504 
505  for(uint8_t i = 0; i <5; ++i) {
506  uint8_t longField = 0;
507  uint8_t numBits = 0;
508  if (format > 2) {
509  longField = br.getField(1);
510  numBits = longField == 0? 4: (format * 2);
511  } else {
512  numBits = i == 0? 4: (format + 2);
513  }
514 
515  if (i == 0) {
516  minAdc = br.getField(numBits);
517  if (longField == 0) {
518  minAdc += state.m_caloUserHeader.ppLowerBound();
519  }
520  } else {
521  adc[i] = minAdc + br.getField(numBits);
522  }
523  }
524 
525  if (minIndex == 0) {
526  adc[0] = minAdc;
527  } else {
528  adc[0] = adc[minIndex];
529  adc[minIndex] = minAdc;
530  }
531  return adc;
532 }
533 
534 
535 
537  uint32_t word,
538  int inData) const
539 {
540 
541  StatusCode sc = StatusCode::SUCCESS;
542  if (state.m_subBlockHeader.seqNum() == 63) { // Error block
543  ATH_MSG_DEBUG("Error PPM subblock");
544  //TODO: errorTool
545  } else {
546  const uint8_t numAdc = state.m_subBlockHeader.nSlice2();
547  const uint8_t numLut = state.m_subBlockHeader.nSlice1();
548  const uint8_t nTotal = numAdc + numLut;
549  const uint8_t wordsPerBlock = 8; // 16 towers (4 MCMs) / 2 per word
550  const uint8_t iBlk = inData / wordsPerBlock;
551  uint8_t iChan = state.m_subBlockHeader.seqNum() + 2 * (inData % wordsPerBlock);
552 
553  if (iBlk < numLut) { // First all LUT values
554  for(uint8_t i = 0; i < 2; ++i) {
555  uint16_t subword = (word >> 16 * i) & 0x7ff;
556  state.m_ppLuts[iChan].push_back(subword);
557  iChan++;
558  }
559  } else if (iBlk < nTotal) { // Next all FADC values
560  for(uint8_t i = 0; i < 2; ++i) {
561  uint16_t subword = (word >> (16 * i)) & 0x7ff;
562  state.m_ppFadcs[iChan].push_back(subword);
563  iChan++;
564  }
565 
566  } else{
567  ATH_MSG_WARNING("Error decoding Ppm word (run1)");
568  sc = StatusCode::FAILURE;
569  }
570 
571  }
572  return sc;
573 }
574 
576 {
577  if (state.m_subBlockHeader.format() == 1) {
579  return StatusCode::SUCCESS;
580  } else if (state.m_subBlockHeader.format() >= 2) {
582  return StatusCode::SUCCESS;
583  }
584  return StatusCode::FAILURE;
585 }
586 
588 {
589  BitReader br (state.m_ppBlock);
590  uint8_t numAdc = state.m_subBlockHeader.nSlice2();
591  uint8_t numLut = state.m_subBlockHeader.nSlice1();
592  int16_t pedCorBase = -20;
593 
594 
595  try{
596  for(uint8_t chan = 0; chan < s_channels; ++chan) {
597  uint8_t present = 1;
598 
599  std::vector<uint8_t> haveLut(numLut, 0);
600  std::vector<uint8_t> lcpVal(numLut, 0);
601 
602  std::vector<uint8_t> lcpExt(numLut, 0);
603  std::vector<uint8_t> lcpSat(numLut, 0);
604  std::vector<uint8_t> lcpPeak(numLut, 0);
605  std::vector<uint8_t> lcpBcidVec(numLut, 0);
606 
607  std::vector<uint8_t> ljeVal(numLut, 0);
608 
609  std::vector<uint8_t> ljeLow(numLut, 0);
610  std::vector<uint8_t> ljeHigh(numLut, 0);
611  std::vector<uint8_t> ljeRes(numLut, 0);
612  std::vector<uint8_t> ljeSat80Vec(numLut, 0);
613 
614  std::vector<uint16_t> adcVal(numAdc, 0);
615  std::vector<uint8_t> adcExt(numAdc, 0);
616  std::vector<int16_t> pedCor(numLut, 0);
617  std::vector<uint8_t> pedEn(numLut, 0);
618 
619  int8_t encoding = -1;
620  int8_t minIndex = -1;
621 
622  if (state.m_subBlockHeader.format() == 3) {
623  present = br.getField(1);
624  }
625  if (present == 1) {
626  interpretPpmHeaderR4V1_(br, numAdc, encoding, minIndex);
627  CHECK((encoding != -1) && (minIndex != -1));
628  // First get the LIT related quantities
629  if (encoding < 3) {
630  // Get the peal finder bits
631  for(uint i=0; i < numLut; ++i) {
632  lcpPeak[i] = br.getField(1);
633  }
634  // Get Sat80 low bits
635  if (encoding > 0) {
636  for (uint8_t i = 0; i < numLut; ++i) {
637  ljeLow[i] = br.getField(1);
638  }
639  }
640  // Get LutCP and LutJEP values (these are
641  // only present if the peak finder is set).
642  if (encoding == 2) {
643  for (uint8_t i = 0; i < numLut; ++i) {
644  if (lcpPeak[i] == 1) {
645  lcpVal[i] = br.getField(4);
646  }
647  }
648  for(uint8_t i = 0; i < numLut; ++i) {
649  if (lcpPeak[i] == 1){
650  ljeVal[i] = br.getField(3);
651  }
652  }
653  }
654  } else if (encoding < 6) {
655  // Get LUT presence flag for each LUT slice.
656  for(uint8_t i = 0; i < numLut; ++i){
657  haveLut[i] = br.getField(1);
658  }
659 
660  // Get external BCID bits (if block is present).
661  uint8_t haveExt = br.getField(1);
662 
663  if (haveExt == 1) {
664  for (uint8_t i = 0; i < numAdc; ++i) {
665  adcExt[i] = br.getField(1);
666  }
667  }
668 
669  for(uint8_t i = 0; i < numLut; ++i){
670  if (haveLut[i] == 1) {
671  lcpVal[i] = br.getField(8);
672  lcpExt[i] = br.getField(1);
673  lcpSat[i] = br.getField(1);
674  lcpPeak[i] = br.getField(1);
675  }
676  }
677  // Get JEP LUT values and corresponding bits.
678  for(uint8_t i = 0; i < numLut; ++i){
679  if (haveLut[i] == 1) {
680  ljeVal[i] = br.getField(8);
681  ljeLow[i] = br.getField(1);
682  ljeHigh[i] = br.getField(1);
683  ljeRes[i] = br.getField(1);
684  }
685  }
686 
687  }
688 
689  }
690  // Next get the ADC related quantities (all encodings).
691  adcVal = getPpmAdcSamplesR4_(state, br, encoding, minIndex);
692  // Finally get the pedestal correction.
693  if ((encoding < 3) || (encoding == 6)) {
694  for (uint8_t i = 0; i < numLut; ++i)
695  {
696  pedCor[i] = br.getField(6) + pedCorBase;
697  if (state.m_subBlockHeader.compVer() > 0) {
698  pedEn[i] = 1;
699  }
700  }
701  } else {
702  // At the moment there is an enabled bit for every LUT slice
703  // (even though its really a global flag).
704  // The correction values is a twos complement signed value.
705  for (uint8_t i = 0; i < numLut; ++i)
706  {
707  uint16_t val = br.getField(10);
708  pedCor[i] = ::pedCorrection(val);
709  pedEn[i] = br.getField(1);
710  }
711  }
712 
713  for(uint8_t i=0; i < numLut; ++i){
714  lcpBcidVec[i] = uint8_t((lcpPeak[i] << 2) | (lcpSat[i] << 1) | lcpExt[i]);
715  ljeSat80Vec[i] = uint8_t((ljeRes[i] << 2) | (ljeHigh[i] << 1) | ljeLow[i]);
716  }
719  chan,
720  std::move(lcpVal), std::move(lcpBcidVec),
721  std::move(ljeVal), std::move(ljeSat80Vec),
722  std::move(adcVal), std::move(adcExt),
723  std::move(pedCor), std::move(pedEn)));
724  } // for
725  } catch (const std::out_of_range& ex) {
726  ATH_MSG_WARNING("Excess Data in Sub-block");
728  }
729  //Check status workd
730  return StatusCode::SUCCESS;
731 
732 }
733 
735  uint8_t numAdc,
736  int8_t& encoding, int8_t& minIndex) const
737 {
738  uint8_t minHeader = 0;
739 
740  if (numAdc == 5) {
741  minHeader = br.getField(4);
742 
743  minIndex = minHeader % 5;
744  if (minHeader < 15){ // Encodings 0-5
745  if (minHeader < 10) {
746  encoding = minHeader / 5;
747  } else {
748  encoding = 2 + br.getField(2);
749  }
750  } else {
751  encoding = 6;
752  }
753  } else {
754  uint8_t numBits = 0;
755  if (numAdc ==3 ) {
756  numBits = 2;
757  } else if (numAdc == 7) {
758  numBits = 3;
759  } else if (numAdc < 16) {
760  numBits = 4;
761  }
762 
763  if (numBits > 0) {
764  uint8_t fieldSize = 1 << numBits;
765  minHeader = br.getField(numBits);
766  uint8_t encValue = fieldSize - 1;
767  if (minHeader == encValue) { // Encoding 6
768  encoding = 6;
769  minIndex = 0;
770  } else {
771  minHeader += br.getField(2) << numBits;
772  minIndex = minHeader % fieldSize;
773  encValue = 3 * fieldSize;
774 
775  if (minHeader < encValue) { // Encodings 0-2
776  encoding = minHeader / fieldSize;
777  } else {
778  encoding = 3 + br.getField(2);
779  }
780  }
781  }
782  }
783 }
784 
786  State& state,
787  BitReader& br,
788  uint8_t encoding, uint8_t minIndex) const
789 {
790  uint8_t numAdc = state.m_subBlockHeader.nSlice2();
791 
792  if (encoding == 6) {
793  uint16_t val = br.getField(6);
794  return std::vector<uint16_t>(numAdc, val);
795  } else if ( encoding < 3) {
796  std::vector<uint16_t> adc(numAdc, 0);
797  uint16_t minAdc = br.getField(5) + state.m_caloUserHeader.ppLowerBound();
798  adc[minIndex] = minAdc;
799  for(uint8_t i = 1; i < numAdc; ++i) {
800  adc[i == minIndex? 0: i] = br.getField(encoding + 2) + minAdc;
801  }
802  return adc;
803  } else {
804  std::vector<uint16_t> adc(numAdc, 0);
805  uint16_t minAdc = br.getField(1)
806  ? br.getField(encoding * 2)
807  : (br.getField(5) +
809 
810  adc[minIndex] = minAdc;
811  for (uint8_t i = 1; i < numAdc; ++i) {
812  adc[minIndex == i? 0: i] = br.getField(
813  br.getField(1)? encoding * 2: 4
814  ) + minAdc;
815  }
816  return adc;
817  }
818 }
819 
821 {
822  if (state.m_subBlockHeader.format() == 1) {
824  return StatusCode::SUCCESS;
825  } else if (state.m_subBlockHeader.format() >= 2) {
826  // TODO: convert compressed
827  return StatusCode::FAILURE;
828  }
829  return StatusCode::FAILURE;
830 }
831 
833 {
834  BitReader br (state.m_ppBlock);
835  uint8_t numAdc = state.m_subBlockHeader.nSlice2();
836  uint8_t numLut = state.m_subBlockHeader.nSlice1();
837  uint8_t crate = state.m_subBlockHeader.crate();
839 
840  for (uint8_t chan = 0; chan < 64; ++chan) {
841 
842  //for (uint8_t k = 0; k < 4; ++k) {
843  std::vector<uint8_t> lcpVal;
844  std::vector<uint8_t> lcpBcidVec;
845 
846  std::vector<uint8_t> ljeVal;
847  std::vector<uint8_t> ljeSat80Vec;
848 
849 
850 
851  std::vector<uint16_t> adcVal;
852  std::vector<uint8_t> adcExt;
853  std::vector<int16_t> pedCor;
854  std::vector<uint8_t> pedEn;
855  try {
856  for (int i = 0; i < numLut; ++i) {
857  lcpVal.push_back(br.getField(8));
858  lcpBcidVec.push_back(br.getField(3));
859  }
860 
861  for (int i = 0; i < numLut; ++i) {
862  ljeVal.push_back(br.getField(8));
863  ljeSat80Vec.push_back(br.getField(3));
864  }
865 
866  for (int i = 0; i < numAdc; ++i) {
867  adcVal.push_back(br.getField(10));
868  adcExt.push_back(br.getField(1));
869  }
870 
871  for (int i = 0; i < numLut; ++i) {
872  uint16_t pc = br.getField(10);
873  pedCor.push_back(pedCorrection(pc));
874  pedEn.push_back(br.getField(1));
875  }
876  } catch (const std::out_of_range& ex) {
877  ATH_MSG_WARNING("Excess Data in Sub-block");
879  }
880  CHECK(
881  addTriggerTowerV2_(state,
882  crate, module, chan,
883  std::move(lcpVal), std::move(lcpBcidVec),
884  std::move(ljeVal), std::move(ljeSat80Vec),
885  std::move(adcVal), std::move(adcExt),
886  std::move(pedCor), std::move(pedEn)));
887  }
888 
889  return StatusCode::SUCCESS;
890 }
891 
893 {
894  for(auto lut : state.m_ppLuts) {
896  state,
897  state.m_subBlockHeader.crate(),
898  state.m_subBlockHeader.module(),
899  lut.first,
900  lut.second,
901  state.m_ppFadcs[lut.first]));
902  }
903  return StatusCode::SUCCESS;
904 }
905 
907  uint8_t crate, uint8_t module, uint32_t payload) const
908 {
909  LVL1::DataError errorBits(0);
911 
912  const uint32_t error = errorBits.error();
913  int curr = state.m_triggerTowers->size() - 1;
914  for(int i=0; i < s_channels; ++i){
915  if (curr < 0){
916  break;
917  }
918  auto tt = (*state.m_triggerTowers)[curr--];
919  if (tt->coolId() >> 16 & crateModuleMask(crate, module)){
920  tt->setErrorWord(error);
921  }else{
922  break;
923  }
924  }
925 }
926 
927 
929  State& state,
930  uint8_t crate,
931  uint8_t module,
933  std::vector<uint8_t>&& lcpVal,
934  std::vector<uint8_t>&& lcpBcidVec,
935  std::vector<uint8_t>&& ljeVal,
936  std::vector<uint8_t>&& ljeSat80Vec,
937  std::vector<uint16_t>&& adcVal,
938  std::vector<uint8_t>&& adcExt,
939  std::vector<int16_t>&& pedCor,
940  std::vector<uint8_t>&& pedEn) const
941 {
942  uint32_t coolId = ::coolId(crate, module, channel);
943 
944  int layer = 0;
945  double eta = 0.;
946  double phi = 0.;
947 
948  bool isData = m_ppmMaps->mapping(crate, module, channel, eta, phi, layer);
949 
950  if (!isData && !state.m_ppmIsRetSpare && !state.m_ppmIsRetMuon){
951  return StatusCode::SUCCESS;
952  }
953 
954  if (!isData) {
955  const int pin = channel % 16;
956  const int asic = channel / 16;
957  eta = 16 * crate + module;
958  phi = 4 * pin + asic;
959  }
960 
962  state.m_triggerTowers->push_back(tt);
963 
964  tt->initialize(coolId, eta, phi,
965  std::move(lcpVal), std::move(ljeVal),
966  std::move(pedCor), std::move(pedEn),
967  std::move(lcpBcidVec), std::move(adcVal),
968  std::move(adcExt), std::move(ljeSat80Vec),
969  0, state.m_caloUserHeader.lut(),
970  state.m_caloUserHeader.ppFadc());
971  return StatusCode::SUCCESS;
972 }
973 
975  State& state,
976  uint8_t crate,
977  uint8_t module,
979  std::vector<uint8_t>&& luts,
980  std::vector<uint8_t>&& lcpBcidVec,
981  std::vector<uint16_t>&& fadc,
982  std::vector<uint8_t>&& bcidExt
983  ) const
984 {
985  std::vector<uint8_t> ljeSat80Vec;
986 
987  std::vector<int16_t> pedCor;
988  std::vector<uint8_t> pedEn;
989 
991  crate, module, channel,
992  std::move(luts), std::move(lcpBcidVec),
993  std::move(luts) , std::move(ljeSat80Vec),
994  std::move(fadc), std::move(bcidExt),
995  std::move(pedCor), std::move(pedEn))
996  );
997 
998  return StatusCode::SUCCESS;
999 }
1000 
1002  State& state,
1003  uint8_t crate,
1004  uint8_t module,
1005  uint8_t channel,
1006  const std::vector<uint16_t>& luts,
1007  const std::vector<uint16_t>& fadc
1008  ) const
1009 {
1010  std::vector<uint8_t> lcpVal;
1011  std::vector<uint8_t> lcpBcidVec;
1012 
1013  std::vector<uint16_t> adcVal;
1014  std::vector<uint8_t> adcExt;
1015 
1016  for(auto lut: luts) {
1017  lcpVal.push_back(BitField::get<uint8_t>(lut, 0, 8));
1018  lcpBcidVec.push_back(BitField::get<uint8_t>(lut, 8, 3));
1019  }
1020 
1021  for(auto f: fadc) {
1022  adcExt.push_back(BitField::get<uint8_t>(f, 0, 1));
1023  adcVal.push_back(BitField::get<uint16_t>(f, 1, 10));
1024  }
1025 
1026  CHECK(addTriggerTowerV1_(state,
1027  crate, module, channel,
1028  std::move(lcpVal), std::move(lcpBcidVec),
1029  std::move(adcVal), std::move(adcExt)));
1030 
1031  return StatusCode::SUCCESS;
1032 }
1033 
1034 
1035 // Return reference to vector with all possible Source Identifiers
1036 
1038 {
1039  const int crates = 8;
1040 
1041  m_ppmSourceIDs.clear();
1042  m_ppmSourceIDsSpare.clear();
1043  m_ppmSourceIDsMuon.clear();
1044 
1045  for (int crate = 0; crate < crates; ++crate) {
1046  for (int slink = 0; slink < m_srcIdMap->maxSlinks(); ++slink) {
1047  const uint32_t rodId = m_srcIdMap->getRodID(crate, slink, 0,
1048  eformat::TDAQ_CALO_PREPROC);
1049  const uint32_t robId = m_srcIdMap->getRobID(rodId);
1050  m_ppmSourceIDs.push_back(robId);
1051  if (crate > 1 && crate < 6) {
1052  m_ppmSourceIDsSpare.push_back(robId);
1053  if (crate < 4 && slink == 0) {
1054  m_ppmSourceIDsMuon.push_back(robId);
1055  }
1056  }
1057  }
1058  }
1059 }
1060 
1061 
1062 
1063 const std::vector<uint32_t>& PpmByteStreamReadV1V2Tool::ppmSourceIDs(
1064  State& state,
1065  const std::string& sgKey) const
1066 {
1067  state.m_ppmIsRetMuon = false;
1068  state.m_ppmIsRetSpare = false;
1069 
1070  if (sgKey.find("Muon") != std::string::npos) {
1071  state.m_ppmIsRetMuon = true;
1072  } else if (sgKey.find("Spare") != std::string::npos) {
1073  state.m_ppmIsRetSpare = true;
1074  }
1075 
1076  if (state.m_ppmIsRetSpare) {
1077  return m_ppmSourceIDsSpare;
1078  }
1079 
1080  if (state.m_ppmIsRetMuon) {
1081  return m_ppmSourceIDsMuon;
1082  }
1083 
1084  return m_ppmSourceIDs;
1085 }
1086 
1087 
1088 
1090  (const uint8_t numBits)
1091 {
1092  if ((m_ppPointer + numBits) <= m_ppMaxBit) {
1093  uint32_t iWord = m_ppPointer / 31;
1094  uint8_t iBit = m_ppPointer % 31;
1095  m_ppPointer += numBits;
1096 
1097  uint32_t result;
1098  if ((iBit + numBits) <= 31) {
1099  result = ::bitFieldSize(m_ppBlock[iWord], iBit, numBits);
1100  } else {
1101  uint8_t nb1 = 31 - iBit;
1102  uint8_t nb2 = numBits - nb1;
1103  uint32_t field1 = ::bitFieldSize(m_ppBlock[iWord], iBit, nb1);
1104  uint32_t field2 = ::bitFieldSize(m_ppBlock[iWord + 1], 0, nb2);
1105  result = field1 | (field2 << nb1);
1106  }
1107 
1108  return result;
1109  }
1110 
1111  throw std::out_of_range("Requested too much bits from ppm block");
1112 }
1113 // ===========================================================================
1114 } // end namespace
1115 // ===========================================================================
DataVector::reserve
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
LVL1BS::SubBlockHeader::seqNum
uint8_t seqNum() const
Definition: SubBlockHeader.cxx:41
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:216
CxxUtils::atomic_fetch_max
T atomic_fetch_max(std::atomic< T > *a, T v, std::memory_order memorder=std::memory_order_seq_cst)
Atomically calculate maximum.
Definition: atomic_fetch_minmax.h:42
LVL1BS::L1CaloSrcIdMap::slink
int slink(uint32_t code) const
Return slink from unpacked moduleID.
Definition: L1CaloSrcIdMap.cxx:68
LVL1BS::SubBlockHeader::format
uint8_t format() const
Definition: SubBlockHeader.cxx:38
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
LVL1BS::PpmByteStreamReadV1V2Tool::processPpmBlock_
StatusCode processPpmBlock_(State &state) const
Definition: PpmByteStreamReadV1V2Tool.cxx:291
LVL1BS::PpmByteStreamReadV1V2Tool::ROBIterator
IROBDataProviderSvc::VROBFRAG::const_iterator ROBIterator
Definition: PpmByteStreamReadV1V2Tool.h:77
LVL1BS::PpmByteStreamReadV1V2Tool::State::m_caloUserHeader
CaloUserHeader m_caloUserHeader
Definition: PpmByteStreamReadV1V2Tool.h:111
LVL1::DataError
Error data.
Definition: DataError.h:27
get_generator_info.result
result
Definition: get_generator_info.py:21
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:28
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
LVL1BS::PpmByteStreamReadV1V2Tool::State::m_subBlockHeader
SubBlockHeader m_subBlockHeader
Definition: PpmByteStreamReadV1V2Tool.h:112
vtune_athena.format
format
Definition: vtune_athena.py:14
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:575
LVL1BS::PpmByteStreamReadV1V2Tool::m_maxSizeSeen
std::atomic< size_t > m_maxSizeSeen
Definition: PpmByteStreamReadV1V2Tool.h:213
LVL1BS::PpmByteStreamReadV1V2Tool::BitReader
Definition: PpmByteStreamReadV1V2Tool.h:82
SubBlockHeader.h
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
LVL1BS::L1CaloSrcIdMap
This class provides conversion between Lower level Source ID to higher level source ID for L1Calo Byt...
Definition: L1CaloSrcIdMap.h:22
LVL1BS::SubBlockHeader::crate
uint8_t crate() const
Definition: SubBlockHeader.cxx:44
LVL1BS::PpmByteStreamReadV1V2Tool::processPpmBlockR4V1_
StatusCode processPpmBlockR4V1_(State &state) const
Definition: PpmByteStreamReadV1V2Tool.cxx:575
LVL1BS::PpmByteStreamReadV1V2Tool::BitReader::m_ppPointer
uint32_t m_ppPointer
Definition: PpmByteStreamReadV1V2Tool.h:94
LVL1BS::PpmByteStreamReadV1V2Tool::m_errorTool
ToolHandle< LVL1BS::L1CaloErrorByteStreamTool > m_errorTool
Definition: PpmByteStreamReadV1V2Tool.h:201
L1Topo::blockType
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
LVL1BS::SubBlockHeader::nSlice1
uint8_t nSlice1() const
Definition: SubBlockHeader.cxx:53
LVL1BS::L1CaloSrcIdMap::getRobID
uint32_t getRobID(uint32_t rod_id) const
Make a ROB Source ID from a ROD source ID.
Definition: L1CaloSrcIdMap.cxx:27
LVL1BS::PpmByteStreamReadV1V2Tool::addTriggerTowerV1_
StatusCode addTriggerTowerV1_(State &state, uint8_t crate, uint8_t module, uint8_t channel, const std::vector< uint16_t > &luts, const std::vector< uint16_t > &fadc) const
Definition: PpmByteStreamReadV1V2Tool.cxx:1001
LVL1BS::CaloUserHeader
L1Calo User Header class.
Definition: CaloUserHeader.h:22
LVL1BS::PpmByteStreamReadV1V2Tool::processRobFragment_
StatusCode processRobFragment_(State &state, const ROBIterator &robFrag, const RequestType &requestedType) const
Definition: PpmByteStreamReadV1V2Tool.cxx:154
LVL1BS::PpmByteStreamReadV1V2Tool::convert
StatusCode convert(xAOD::TriggerTowerContainer *const ttCollection) const
Convert ROB fragments to trigger towers.
Definition: PpmByteStreamReadV1V2Tool.cxx:132
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
LVL1BS::PpmByteStreamReadV1V2Tool::BitReader::m_ppMaxBit
uint32_t m_ppMaxBit
Definition: PpmByteStreamReadV1V2Tool.h:95
LVL1BS::PpmByteStreamReadV1V2Tool::processPpmCompressedR3V1_
StatusCode processPpmCompressedR3V1_(State &state) const
Definition: PpmByteStreamReadV1V2Tool.cxx:414
LVL1BS::SubBlockHeader
L1Calo User Header class.
Definition: SubBlockHeader.h:20
LVL1BS::PpmByteStreamReadV1V2Tool::getPpmAdcSamplesR3_
std::vector< uint16_t > getPpmAdcSamplesR3_(State &state, BitReader &br, uint8_t format, uint8_t minIndex) const
Definition: PpmByteStreamReadV1V2Tool.cxx:498
LVL1BS::SubBlockHeader::isSubBlockHeader
bool isSubBlockHeader() const
Definition: SubBlockHeader.cxx:57
atomic_fetch_minmax.h
Atomic min/max functions.
xAOD::int16_t
setScaleOne setStatusOne setSaturated int16_t
Definition: gFexGlobalRoI_v1.cxx:55
LVL1BS::PpmByteStreamReadV1V2Tool::m_srcIdMap
L1CaloSrcIdMap * m_srcIdMap
Definition: PpmByteStreamReadV1V2Tool.h:211
LVL1BS::PpmByteStreamReadV1V2Tool::m_robDataProvider
ServiceHandle< IROBDataProviderSvc > m_robDataProvider
Service for reading bytestream.
Definition: PpmByteStreamReadV1V2Tool.h:205
SubBlockStatus.h
LVL1BS::PpmByteStreamReadV1V2Tool::finalize
virtual StatusCode finalize() override
Definition: PpmByteStreamReadV1V2Tool.cxx:98
LVL1BS::SubBlockHeader::version
uint8_t version() const
Definition: SubBlockHeader.cxx:35
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
LVL1BS::PpmByteStreamReadV1V2Tool::processSubBlockStatus_
void processSubBlockStatus_(State &state, uint8_t crate, uint8_t module, uint32_t word) const
Definition: PpmByteStreamReadV1V2Tool.cxx:906
LVL1BS::PpmByteStreamReadV1V2Tool::m_ppmMaps
ToolHandle< LVL1::IL1CaloMappingTool > m_ppmMaps
Channel mapping tool.
Definition: PpmByteStreamReadV1V2Tool.h:203
LVL1::DataError::SubStatusWord
@ SubStatusWord
Definition: DataError.h:44
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
python.PyAthena.module
module
Definition: PyAthena.py:134
LVL1BS::SubBlockHeader::nSlice2
uint8_t nSlice2() const
Definition: SubBlockHeader.cxx:50
LVL1BS::PpmByteStreamReadV1V2Tool::m_ppmSourceIDs
std::vector< uint32_t > m_ppmSourceIDs
Definition: PpmByteStreamReadV1V2Tool.h:208
LVL1BS::CaloUserHeader::isValid
bool isValid() const
Definition: CaloUserHeader.cxx:46
uint
unsigned int uint
Definition: LArOFPhaseFill.cxx:20
LVL1BS::PpmByteStreamReadV1V2Tool::s_channels
static const uint8_t s_channels
Definition: PpmByteStreamReadV1V2Tool.h:219
LVL1BS::PpmByteStreamReadV1V2Tool::processPpmStandardR4V1_
StatusCode processPpmStandardR4V1_(State &state) const
Definition: PpmByteStreamReadV1V2Tool.cxx:832
LVL1BS::SubBlockHeader::compVer
uint8_t compVer() const
Definition: SubBlockHeader.h:34
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
LVL1BS::SubBlockHeader::module
uint8_t module() const
Definition: SubBlockHeader.cxx:47
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
perfmonmt-refit.slice
slice
Definition: perfmonmt-refit.py:52
lumiFormat.i
int i
Definition: lumiFormat.py:92
ReadCellNoiseFromCool.chan
chan
Definition: ReadCellNoiseFromCool.py:52
LVL1BS::PpmByteStreamReadV1V2Tool::interpretPpmHeaderR4V1_
void interpretPpmHeaderR4V1_(BitReader &br, uint8_t numAdc, int8_t &encoding, int8_t &minIndex) const
Definition: PpmByteStreamReadV1V2Tool.cxx:734
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
LVL1BS::PpmByteStreamReadV1V2Tool::State::m_ppmIsRetSpare
bool m_ppmIsRetSpare
Definition: PpmByteStreamReadV1V2Tool.h:110
CaloUserHeader.h
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
generateReferenceFile.encoding
encoding
Definition: generateReferenceFile.py:15
LVL1::DataError::set
void set(ErrorBit bit, int value=1)
Set an error bit or data.
Definition: DataError.cxx:28
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
LVL1BS::L1CaloSrcIdMap::crate
int crate(uint32_t code) const
Return crate from unpacked moduleID.
Definition: L1CaloSrcIdMap.cxx:52
LVL1BS::PpmByteStreamReadV1V2Tool::State::m_robSourceId
uint32_t m_robSourceId
Definition: PpmByteStreamReadV1V2Tool.h:106
LVL1BS::PpmByteStreamReadV1V2Tool::addTriggerTowerV2_
StatusCode addTriggerTowerV2_(State &state, uint8_t crate, uint8_t module, uint8_t channel, std::vector< uint8_t > &&lcpVal, std::vector< uint8_t > &&lcpBcidVec, std::vector< uint8_t > &&ljeVal, std::vector< uint8_t > &&ljeSat80Vec, std::vector< uint16_t > &&adcVal, std::vector< uint8_t > &&adcExt, std::vector< int16_t > &&pedCor, std::vector< uint8_t > &&pedEn) const
Definition: PpmByteStreamReadV1V2Tool.cxx:928
LVL1BS::PpmByteStreamReadV1V2Tool::State
Definition: PpmByteStreamReadV1V2Tool.h:104
xAOD::TriggerTower_v2
Description of TriggerTower_v2.
Definition: TriggerTower_v2.h:49
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
IROBDataProviderSvc::VROBFRAG
std::vector< const ROBF * > VROBFRAG
Definition: IROBDataProviderSvc.h:29
LVL1BS::CaloUserHeader::ppLowerBound
uint8_t ppLowerBound() const
Definition: CaloUserHeader.cxx:43
LVL1BS::CaloUserHeader::ppFadc
uint8_t ppFadc() const
Definition: CaloUserHeader.cxx:31
LVL1BS::PpmByteStreamReadV1V2Tool::PpmByteStreamReadV1V2Tool
PpmByteStreamReadV1V2Tool(const std::string &name)
Definition: PpmByteStreamReadV1V2Tool.cxx:63
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
plotBeamSpotCompare.xd
xd
Definition: plotBeamSpotCompare.py:220
LVL1BS::PpmByteStreamReadV1V2Tool::processPpmNeutral_
StatusCode processPpmNeutral_(State &state) const
Definition: PpmByteStreamReadV1V2Tool.cxx:329
WordDecoder.h
DataError.h
DataVector::capacity
size_type capacity() const noexcept
Returns the total number of elements that the collection can hold before needing to allocate more mem...
LVL1BS::PpmByteStreamReadV1V2Tool::m_ppmSourceIDsSpare
std::vector< uint32_t > m_ppmSourceIDsSpare
Definition: PpmByteStreamReadV1V2Tool.h:210
LVL1::DataError::error
int error() const
Return the full error word.
Definition: DataError.h:78
PpmByteStreamReadV1V2Tool.h
LVL1BS::PpmByteStreamReadV1V2Tool::BitReader::getField
uint32_t getField(const uint8_t numBits)
Definition: PpmByteStreamReadV1V2Tool.cxx:1090
LVL1BS::PpmByteStreamReadV1V2Tool::State::m_subDetectorID
uint8_t m_subDetectorID
Definition: PpmByteStreamReadV1V2Tool.h:108
LVL1BS::PpmByteStreamReadV1V2Tool::State::m_ppFadcs
FadcsMap m_ppFadcs
Definition: PpmByteStreamReadV1V2Tool.h:115
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
LVL1BS::PpmByteStreamReadV1V2Tool::processPpmBlockR3V1_
StatusCode processPpmBlockR3V1_(State &state) const
Definition: PpmByteStreamReadV1V2Tool.cxx:820
LVL1BS::CaloUserHeader::lut
uint8_t lut() const
Definition: CaloUserHeader.cxx:34
LVL1::TrigT1CaloDefs::xAODTriggerTowerLocation
static const std::string xAODTriggerTowerLocation
Definition: TrigT1CaloDefs.h:36
TrigT1CaloDefs.h
PixelModuleFeMask_create_db.payload
string payload
Definition: PixelModuleFeMask_create_db.py:69
LVL1BS::L1CaloSubBlock::UNPACK_EXCESS_DATA
@ UNPACK_EXCESS_DATA
Definition: L1CaloSubBlock.h:41
LVL1BS::PpmByteStreamReadV1V2Tool::RequestType
RequestType
Definition: PpmByteStreamReadV1V2Tool.h:76
LVL1BS::PpmByteStreamReadV1V2Tool::initSourceIDs
void initSourceIDs()
Definition: PpmByteStreamReadV1V2Tool.cxx:1037
LVL1BS::PpmByteStreamReadV1V2Tool::RODPointer
OFFLINE_FRAGMENTS_NAMESPACE::PointerType RODPointer
Definition: PpmByteStreamReadV1V2Tool.h:79
LVL1BS::PpmByteStreamReadV1V2Tool::State::m_rodSourceId
uint32_t m_rodSourceId
Definition: PpmByteStreamReadV1V2Tool.h:105
fmt
LVL1BS::PpmByteStreamReadV1V2Tool::processPpmWord_
StatusCode processPpmWord_(State &state, uint32_t word, int indata) const
Definition: PpmByteStreamReadV1V2Tool.cxx:271
LVL1BS::PpmByteStreamReadV1V2Tool::RequestType::PPM
@ PPM
LVL1BS::PpmByteStreamReadV1V2Tool::State::m_triggerTowers
xAOD::TriggerTowerContainer * m_triggerTowers
Definition: PpmByteStreamReadV1V2Tool.h:113
ReadFloatFromCool.adc
adc
Definition: ReadFloatFromCool.py:48
LVL1BS::PpmByteStreamReadV1V2Tool::m_ppmSourceIDsMuon
std::vector< uint32_t > m_ppmSourceIDsMuon
Definition: PpmByteStreamReadV1V2Tool.h:209
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
LVL1BS::PpmByteStreamReadV1V2Tool::State::m_ppLuts
LutsMap m_ppLuts
Definition: PpmByteStreamReadV1V2Tool.h:114
LVL1BS
Definition: ZdcByteStreamReadV1V2Tool.h:47
convertTimingResiduals.offset
offset
Definition: convertTimingResiduals.py:71
LVL1BS::PpmByteStreamReadV1V2Tool::State::m_ppmIsRetMuon
bool m_ppmIsRetMuon
Definition: PpmByteStreamReadV1V2Tool.h:109
LVL1BS::PpmByteStreamReadV1V2Tool::processPpmCompressedR4V1_
StatusCode processPpmCompressedR4V1_(State &state) const
Definition: PpmByteStreamReadV1V2Tool.cxx:587
LVL1BS::PpmByteStreamReadV1V2Tool::initialize
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
Definition: PpmByteStreamReadV1V2Tool.cxx:83
python.grid.isData
def isData(dataset)
Definition: grid.py:491
LVL1BS::L1CaloSrcIdMap::getRodID
uint32_t getRodID(int crate, int slink, int daqOrRoi, eformat::SubDetector subdet) const
Make a ROD Source ID.
Definition: L1CaloSrcIdMap.cxx:16
LVL1BS::PpmByteStreamReadV1V2Tool::processPpmStandardR3V1_
StatusCode processPpmStandardR3V1_(State &state) const
Definition: PpmByteStreamReadV1V2Tool.cxx:892
LVL1BS::PpmByteStreamReadV1V2Tool::getPpmAdcSamplesR4_
std::vector< uint16_t > getPpmAdcSamplesR4_(State &state, BitReader &br, uint8_t encoding, uint8_t minIndex) const
Definition: PpmByteStreamReadV1V2Tool.cxx:785
LVL1BS::PpmByteStreamReadV1V2Tool::ROBPointer
OFFLINE_FRAGMENTS_NAMESPACE::PointerType ROBPointer
Definition: PpmByteStreamReadV1V2Tool.h:78
LVL1BS::L1CaloSrcIdMap::maxSlinks
int maxSlinks() const
Return the maximum possible number of slinks.
Definition: L1CaloSrcIdMap.cxx:77
LVL1BS::PpmByteStreamReadV1V2Tool::BitReader::m_ppBlock
const std::vector< uint32_t > & m_ppBlock
Definition: PpmByteStreamReadV1V2Tool.h:96
LVL1BS::PpmByteStreamReadV1V2Tool::State::m_verCode
uint8_t m_verCode
Definition: PpmByteStreamReadV1V2Tool.h:107
error
Definition: IImpactPoint3dEstimator.h:70
TileDCSDataPlotter.tt
tt
Definition: TileDCSDataPlotter.py:874
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
LVL1BS::PpmByteStreamReadV1V2Tool::State::m_ppBlock
std::vector< uint32_t > m_ppBlock
Definition: PpmByteStreamReadV1V2Tool.h:116
python.SystemOfUnits.pc
float pc
Definition: SystemOfUnits.py:99
xAOD::TriggerTower
TriggerTower_v2 TriggerTower
Define the latest version of the TriggerTower class.
Definition: Event/xAOD/xAODTrigL1Calo/xAODTrigL1Calo/TriggerTower.h:16
PlotCalibFromCool.br
br
Definition: PlotCalibFromCool.py:355
LVL1BS::PpmByteStreamReadV1V2Tool::ppmSourceIDs
const std::vector< uint32_t > & ppmSourceIDs(State &state, const std::string &sgKey) const
Return reference to vector with all possible Source Identifiers.
Definition: PpmByteStreamReadV1V2Tool.cxx:1063
TriggerTowerAuxContainer.h