11#include "eformat/ROBFragment.h"
23#ifndef OFFLINE_DECODER
24#include "bytestreamDecoder/L1CaloRdoGfexTob.h"
25#include "bytestreamDecoder/L1CaloRdoGfexTower.h"
26#include "bytestreamDecoder/L1CaloRdoJfexTob.h"
27#include "bytestreamDecoder/L1CaloRdoJfexTower.h"
28#include "bytestreamDecoder/L1CaloRdoMuonTob.h"
29#include "bytestreamDecoder/L1CaloRdoPh1TopoHit.h"
30#include "channelMappings/GfexCellMapping.h"
31#include "channelMappings/JfexCellMapping.h"
33#include "infraL1Calo/GfexLatomeCentralFibrePacker.h"
34#include "infraL1Calo/GfexLatomeForwardFibrePacker.h"
35#include "infraL1Calo/GfexTrexFibrePacker.h"
36#include "infraL1Calo/JfexLatomeFibrePacker.h"
37#include "infraL1Calo/JfexTrexFibrePacker.h"
40#define LOG_ERROR(location,title,detail) { if(m_logger) { std::stringstream s; s << location; std::stringstream s2; s2<<title; std::stringstream s3; s3<<detail; m_logger->err(s.str(),s2.str(),s3.str().empty() ? s2.str() : s3.str()); } }
55 LOG_ERROR(
"ctor",
"unexpected invalid eFEX mapping!?",
"");
57#ifndef OFFLINE_DECODER
58 JfexCellMapping dummyJfexMapping(0,1,0,0);
59 if (!dummyJfexMapping.getDetectorRegion().getValidity()) {
60 LOG_ERROR(
"ctor",
"unexpected invalid jFEX mapping!?",
"");
62 GfexCellMapping dummyGfexMapping(0,0,0,0);
63 if (!dummyGfexMapping.getDetectorRegion().getValidity()) {
64 LOG_ERROR(
"ctor",
"unexpected invalid gFEX mapping!?",
"");
86 std::list<L1CaloRdoEfexTower>& tower,
87 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
const
89 const uint32_t* payload( beg );
90 const size_t fragmentSize = end - beg;
97 size_t numTowers = tower.size();
98 size_t index = fragmentSize;
101 while (
index > 0 ) {
103 LOG_ERROR(
"decodeEfexData",
"block size error",
104 "remaining block size " <<
index
105 <<
" is too small for the eFEX FPGA trailer");
108 const uint32_t ctrlTrailer2 = payload[--
index];
109 const uint32_t ctrlTrailer1 = payload[--
index];
110 const uint32_t fpgaTrailer2 = payload[--
index];
111 const uint32_t fpgaTrailer1 = payload[--
index];
113 const uint32_t ctrlErrors = ctrlTrailer2 & 0x3f;
114 const uint32_t efexNumber = (ctrlTrailer1 >> 12) & 0xf;
115 const uint32_t shelfNumber = (ctrlTrailer1 >> 16) & 0x1;
116 const size_t payloadSize = (ctrlTrailer1 & 0xfff) - 2;
118 if ( payloadSize >
index ) {
119 LOG_ERROR(
"decodeEfexData",
"block size error",
"remaining eFEX block size "
120 <<
index <<
" is too small for the claimed payload size "
126 LOG_ERROR(
"decodeEfexData",
"invalid eFEX number " << efexNumber,
134 index -= payloadSize;
135 size_t chanIndex = 0;
136 uint32_t chanErrorOR = 0;
137 std::bitset<49> chansWithError;
138 bool anyErrorBit =
false;
139 while ( chanIndex < payloadSize ) {
140 if ( (payloadSize - chanIndex) < 8 ) {
141 LOG_ERROR(
"decodeEfexData s" << shelfNumber <<
" e" << efexNumber,
"block size error",
142 (payloadSize - chanIndex)<<
" is too small for one eFEX input fibre block (8)");
145 const uint32_t chanNumber = payload[
index+chanIndex+7] & 0xff;
147 ctrlErrors, tower, rodInfo );
149 chanErrorOR |= ( chanErrors & 0x7 );
150 chansWithError[chanNumber] = 1;
158 const uint64_t fpgaErrorBits = ( (uint64_t)(fpgaTrailer2 & 0x1ffff) << 32 ) | fpgaTrailer1;
159 const uint64_t chanErrorBits = chansWithError.to_ullong();
160 const uint32_t fpgaErrorOR = ( fpgaTrailer2 >> 28 ) & 0xf;
161 if ( fpgaErrorBits != chanErrorBits || fpgaErrorOR != chanErrorOR ) {
162 LOG_ERROR(
"decodeEfexData: s" << shelfNumber <<
" e" << efexNumber,
"errorbit mismatch",
163 "mismatch between errors in FPGA trailer: "
164 << std::hex << fpgaErrorBits <<
" " << fpgaErrorOR
165 <<
" and those derived from channels: " << chanErrorBits <<
" " << chanErrorOR
171 std::cout <<
"L1CaloBsDecoderRun3::decodeEfexData: n.towers added="
172 << tower.size() - numTowers << std::endl;
188 const uint32_t efexNumber,
const uint32_t shelfNumber,
189 const uint32_t errorMask,
190 std::list<L1CaloRdoEfexTower>& tower,
191 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
const
196 const uint32_t chanNumber = ( payload[7] ) & 0xff;
197 const uint32_t fpgaNumber = ( payload[7] >> 8 ) & 0x3;
198 const uint32_t errorBits = ( payload[7] >> 28 ) & 0x7;
199 const uint32_t disabled = ( payload[7] >> 31 ) & 0x1;
201 LOG_ERROR(
"decodeEfexDataChan s" << shelfNumber <<
"e" << efexNumber <<
"f" << fpgaNumber,
"invalid channel",
219 int moduleEta = -24 + (efexNumber % 3) * 16;
220 int modulePhi = 2 + (shelfNumber * 32) + (efexNumber / 3) * 8;
223 std::vector<FibrePackerBase::myDataWord> encodedData;
224 for (
size_t i = 0; i < 7; i++ ) {
225 encodedData.push_back( payload[i] );
234 const uint32_t errorField = ( errorMask & 0x3f )
235 | ( rightCRC ? 0 : 0x80 )
236 | ( errorBits << 8 );
238 if (chanNumber < 40) {
242 std::vector<FibrePackerBase::myDataWord> cells = packer.
getUnpackedData( encodedData, frameType );
249 const std::vector<uint32_t> cellIndex = { 0, 1, 2, 3, 8, 9,10,11,12,13,
250 4, 5, 6, 7,14,15,16,17,18,19 };
251 for (
size_t k = 0; k < 2; k++ ) {
252 std::vector<uint32_t> towerCells( 10, 0 );
253 uint32_t towerSumEt( 0 );
254 uint32_t wordNumber = 0;
255 for (
size_t i = 0; i < 10; i++) {
256 uint32_t iCell = cellIndex[i+k*10];
260 towerCells[i] = cells[iCell];
261 towerSumEt += towerCells[i];
267 uint32_t towerFlag = errorField;
270 EfexCellMapping mapping( shelfNumber, efexNumber, fpgaNumber, chanNumber, wordNumber );
274 int localEta = region.
getEtaIndex() - moduleEta + 1;
277 const uint32_t layer = 0;
278 L1CaloRdoEfexTower newOne( shelfNumber, efexNumber, localEta, localPhi, layer, region );
290 std::cout <<
"L1CaloBsDecoderRun3::decodeEfexDataChan: EM"
291 <<
", shelf=" << shelfNumber <<
", module=" << efexNumber
292 << std::hex <<
", Et=0x" << towerSumEt <<
", flag=0x" << towerFlag
293 << std::dec << std::endl;
303 std::vector<FibrePackerBase::myDataWord> towerVals = packer.
getUnpackedData( encodedData, frameType );
304 size_t numHadTowers = std::min(towerVals.size(),(
size_t)16);
307 for (
size_t wordNumber = 0; wordNumber < numHadTowers; wordNumber++ ) {
308 const uint32_t towerEt = ( towerVals[wordNumber] == 0x3fe ) ? 0 : towerVals[wordNumber];
309 const uint32_t invalid = ( towerVals[wordNumber] == 0x3fe ) ? 1 : 0;
310 const uint32_t towerFlag = errorMask | ( invalid << 31 );
313 EfexCellMapping mapping( shelfNumber, efexNumber, fpgaNumber, chanNumber, wordNumber );
322 towerVals[wordNumber] &= 0xff;
325 int localEta = region.
getEtaIndex() - moduleEta + 1;
328 const uint32_t layer = 1;
329 L1CaloRdoEfexTower newOne( shelfNumber, efexNumber, localEta, localPhi, layer, region );
340 std::cout <<
"L1CaloBsDecoderRun3::decodeEfexDataChan: Had"
341 <<
", shelf=" << shelfNumber <<
", module=" << efexNumber
342 << std::hex <<
", Et=0x" << towerEt <<
", flag=0x" << towerFlag
343 << std::dec << std::endl;
364 std::list<L1CaloRdoEfexTob>& tob,
365 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
const
367 const uint32_t* payload( beg );
368 const size_t fragmentSize = end - beg;
374 if ( fragmentSize < 2 ) {
375 LOG_ERROR(
"decodeEfexTobs",
"ROD trailer fragment size", fragmentSize
376 <<
" is too small for the ROD trailer");
380 size_t index = fragmentSize;
381 const uint32_t rodTrailer2 = payload[--
index];
382 const uint32_t rodTrailer1 = payload[--
index];
384 const uint32_t rodErrors = rodTrailer2 & 0x7f;
385 const size_t payloadSize = rodTrailer1 & 0xffff;
386 if ( (rodErrors >> 6) & 0x1 ) {
387 LOG_ERROR(
"decodeEfexTobs",
"Unknown corrective trailer " << std::hex << rodErrors << std::dec,
"");
390 if ( (payloadSize + 2) != fragmentSize ) {
392 LOG_ERROR(
"decodeEfexTobs",
"inconsistent ROD fragment size",
"payload size " << payloadSize
393 <<
" vs ROD fragment size " << fragmentSize);
398 while (
index > 0 ) {
401 <<
" is too small for the eFEX trailer");
404 size_t efexIndex =
index;
405 const uint32_t efexTrailer2 = payload[--efexIndex];
406 const uint32_t efexTrailer1 = payload[--efexIndex];
410 const uint32_t corrective = (efexTrailer2 >> 5) & 0x1;
413 size_t corrBlockSize = (efexTrailer1) & 0xffff;
414 const uint32_t efexNumber = (efexTrailer1 >> 16) & 0xf;
415 const uint32_t shelfNumber = (efexTrailer1 >> 20) & 0x1;
416 const uint32_t ctrlErr = efexTrailer2 & 0x3f;
418 LOG_ERROR(
"decodeEfexTobs s" << shelfNumber <<
"e" << efexNumber,
419 "rod corrective trailer " << std::hex << ctrlErr << std::dec,
"");
421 if (corrBlockSize >
index) {
422 LOG_ERROR(
"decodeEfexTobs s" << shelfNumber <<
"e" << efexNumber,
"excessive rod corrective blocksize",
423 "rod corrective blocksize " << corrBlockSize <<
424 " > remaining blocksize ");
428 index -= corrBlockSize;
433 const size_t efexBlockSize = efexTrailer1 & 0xfff;
434 const uint32_t efexNumber = (efexTrailer1 >> 12) & 0xf;
435 const uint32_t shelfNumber = (efexTrailer1 >> 16) & 0x1;
437 const uint32_t numSlices = (efexTrailer1 >> 24) & 0xf;
439 const uint32_t efexErrors = efexTrailer2 & 0x3f;
440 if ( efexBlockSize >
index ) {
441 LOG_ERROR(
"decodeEfexTobs s" << shelfNumber <<
"e" << efexNumber,
"excessive block size", efexBlockSize
442 <<
" exceeds remaining data size " <<
index);
446 index = efexIndex - efexBlockSize;
449 const uint32_t errorMask = efexErrors | (rodErrors << 6);
454 while ( efexIndex >
index ) {
455 if ( (efexIndex -
index) < 2 ) {
456 LOG_ERROR(
"decodeEfexTobs s"<< shelfNumber <<
"e" << efexNumber,
458 (efexIndex -
index) <<
" is too small for the eFEX slice trailer");
461 size_t procIndex = efexIndex;
463 numSlices, errorMask, tob, rodInfo );
467 efexIndex = procIndex;
488 const uint32_t efexNumber,
const uint32_t shelfNumber,
489 const uint32_t numSlices,
const uint32_t errorMask,
490 std::list<L1CaloRdoEfexTob>& tob,
491 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
const
497 const uint32_t sliceTrailer = payload[
index-1];
498 const uint32_t corrective = (sliceTrailer >> 31) & 0x01;
504 size_t corrBlockSize = sliceTrailer & 0xfff;
506 const uint32_t fpgaNumber = (sliceTrailer >> 24) & 0x3;
507 const uint32_t plErr = (sliceTrailer >> 30) & 0x01;
508 const uint32_t bcnErr = (sliceTrailer >> 29) & 0x01;
509 LOG_ERROR(
"decodeEfexTobSlice s" << shelfNumber <<
"e" << efexNumber <<
"f" << fpgaNumber,
510 "ctrl corrective trailer " << std::hex << (plErr*2+bcnErr) << std::dec,
"error bits: PacketLength=" << plErr <<
", BCNMismatch=" << bcnErr);
514 corrBlockSize += ((corrBlockSize % 2) == 1) ? 1 : 2;
516 if (corrBlockSize >
index) {
517 LOG_ERROR(
"decodeEfexTobSlice s" << shelfNumber <<
"e" << efexNumber <<
"f" << fpgaNumber,
"excessive ctrl corrective blocksize",
518 "corrective blocksize " << corrBlockSize <<
519 " > remaining blocksize ");
523 index -= corrBlockSize;
527 const uint32_t tobType = (sliceTrailer >> 8) & 0x1;
528 const uint32_t numTobs = (sliceTrailer >> 9) & 0x7;
529 const uint32_t numEmXtobs = (sliceTrailer >> 12) & 0x3f;
530 const uint32_t numTauXtobs = (sliceTrailer >> 18) & 0x3f;
531 const uint32_t sliceNumber = (sliceTrailer >> 24) & 0x7;
532 const uint32_t safeMode = (sliceTrailer >> 27) & 0x1;
533 const uint32_t fpgaNumber = (sliceTrailer >> 28) & 0x3;
540 size_t tobSize = (safeMode == 0)
541 ? (1 + numTobs + 2 * (numEmXtobs + numTauXtobs))
543 tobSize += (tobSize % 2);
546 if (tobSize >
index) {
547 LOG_ERROR(
"decodeEfexTobSlice s" << shelfNumber <<
"e" << efexNumber <<
"f" << fpgaNumber,
548 "excessive blocksize",
549 "TOB blocksize " << tobSize <<
" > remaining blocksize " <<
index);
555 LOG_ERROR(
"decodeEfexTobSlice s" << shelfNumber <<
"e" << efexNumber <<
"f" << fpgaNumber,
557 "missed " << numTobs <<
" TOBs, " << numEmXtobs <<
" EM XTOBs, "
558 << numTauXtobs <<
" Tau XTOBs" );
563 const size_t totalTobs = numTobs + numEmXtobs + numTauXtobs;
568 size_t sliceIndex =
index;
569 for (
size_t iTOB = 0; iTOB < totalTobs; iTOB++) {
570 if (iTOB >= numTobs) {
572 fexTobType = (iTOB < (numTobs + numEmXtobs))
576 this->
decodeOneEfexTob ( &payload[sliceIndex], shelfNumber, efexNumber, fpgaNumber,
577 errorMask, numSlices, sliceNumber, fexTobType, fexTobSource,
595 const uint32_t efexNumber,
const uint32_t fpgaNumber,
596 const uint32_t errorMask,
597 const uint32_t numSlices,
const uint32_t sliceNum,
600 std::list<L1CaloRdoEfexTob>& tob,
601 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
const
603 const uint32_t tobWord = word[0];
604 const uint32_t isolInfo = (tobWord ) & 0xffc000;
605 const uint32_t tobPhi = (tobWord >> 24) & 0x7;
606 const uint32_t tobEta = (tobWord >> 27) & 0x7;
607 const uint32_t tobFpga = (tobWord >> 30) & 0x3;
612 etValue = word[1] & 0xffff;
616 etValue = tobWord & 0xfff;
619 if ( sliceNum >= numSlices ) {
620 LOG_ERROR(
"decodeOneEfexTob s" << shelfNumber <<
"e" << efexNumber <<
"f" << fpgaNumber,
621 "excessive sliceNum",
622 "TOB slice " << sliceNum <<
" exceeds number of slices " << numSlices <<
" in processor trailer");
624 else if ( etValue ) {
636 const uint32_t moduleEta = 1 + (tobEta - 1) + 4 * tobFpga;
637 const uint32_t flagMask = isolInfo | errorMask;
639 numSlices, tobType, tobSource );
643 rdo.
setFlag( flagMask, sliceNum );
644#ifdef OFFLINE_DECODER
646 rdo.setWord0( word[0], sliceNum );
651 std::cout <<
"L1CaloBsDecoderRun3::decodeOneEfexTob: tobType=" << tobType
652 <<
", tobSource=" << tobSource <<
", slice=" << sliceNum
653 <<
", shelf=" << shelfNumber <<
", module=" << efexNumber
654 <<
", eta=" << moduleEta <<
", phi=" << tobPhi
655 << std::hex <<
", Et=0x" << etValue <<
", flag=0x" << flagMask
656 << std::dec <<
", numSlices=" << numSlices << std::endl;
672 if (
data.size() != numWords ) {
676 const size_t numPayloadBits = ( 32 * numWords ) - 9;
677 unsigned int actualCRC = (
data[numWords-1] >> 23 ) & 0x1ff;
678 data[0] &= 0xffffff00;
679 unsigned int expectCRC = crc.
crc9fibre(
data, numPayloadBits );
681 return (actualCRC == expectCRC);
684#ifndef OFFLINE_DECODER
696 std::list<L1CaloRdoJfexTower>& tower,
697 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
699 const uint32_t* payload( beg );
700 const size_t fragmentSize = end - beg;
707 size_t numTowers = tower.size();
708 size_t index = fragmentSize;
711 while (
index > 0 ) {
714 <<
" is too small for the jFEX FPGA trailer");
717 const uint32_t fpgaTrailer2 = payload[--
index];
718 const uint32_t fpgaTrailer1 = payload[--
index];
720 const uint32_t fpgaErrors = fpgaTrailer2 & 0x3f;
721 const uint32_t jfexNumber = (fpgaTrailer1 >> 20) & 0x7;
722 const uint32_t fpgaNumber = (fpgaTrailer1 >> 18) & 0x3;
723 const size_t payloadSize = (fpgaTrailer1 & 0xffff);
725 if ( payloadSize >
index ) {
726 LOG_ERROR(
"decodeJfexData",
"",
"remaining jFEX block size "
727 <<
index <<
" is too small for the claimed payload size "
734 index -= payloadSize;
735 size_t chanIndex = 0;
736 while ( chanIndex < payloadSize ) {
737 if ( (payloadSize - chanIndex) < 8 ) {
738 LOG_ERROR(
"decodeJfexData",
"",
"decodeJfexData: remaining jFEX block size "
739 << (payloadSize - chanIndex)
740 <<
" is too small for one jFEX input fibre block (8)");
744 fpgaErrors, tower, rodInfo );
750 std::cout <<
"L1CaloBsDecoderRun3::decodeJfexData: n.towers added="
751 << tower.size() - numTowers << std::endl;
767 const uint32_t jfexNumber,
const uint32_t fpgaNumber,
768 const uint32_t errorMask,
769 std::list<L1CaloRdoJfexTower>& tower,
770 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
772 const uint32_t shelfNumber = 0x22;
779 const uint32_t chanNumber = ( payload[7] ) & 0xff;
780 const uint32_t errorBits = ( payload[7] >> 28 ) & 0xf;
783 if (chanNumber >= 24 &&
788 if (jfexNumber == 0 ||
796 int moduleEta = -24 + (jfexNumber % 6) * 8;
799 std::vector<FibrePackerBase::myDataWord> encodedData;
800 for (
size_t i = 0; i < 7; i++ ) {
801 encodedData.push_back( payload[i] );
812 std::vector<FibrePackerBase::myDataWord> towers;
814 JfexTrexFibrePacker packer;
815 towers = packer.getUnpackedData( encodedData, frameType );
819 JfexLatomeFibrePacker packer;
820 towers = packer.getUnpackedData( encodedData, frameType );
824 for (
size_t iTower = 0; iTower < towers.size(); iTower++ ) {
825 const uint32_t towerEt = towers[iTower];
827 if ( towerEt || errorMask ) {
842 int unitNumber = fpgaNumber + 1;
843 int procNumber = JfexDefs::processorNumberToUnitNumber(unitNumber) - 1;
844 JfexHardwareInfo hwInfoFpga( JfexCellMapping( unitNumber, chanNumber+60 ).getHardwareInfo() );
845 int mgtFibreNumber = hwInfoFpga.getFibreNumber();
846 JfexCellMapping mapping( jfexNumber, unitNumber, mgtFibreNumber, iTower );
848 JfexHardwareInfo hwInfo( mapping.getHardwareInfo() );
849 JfexTriggerTowerInfo ttInfo( mapping.getTriggerTowerInfo() );
851 if ( region.
getValidity() && hwInfo.getValidity() ) {
856 L1CaloRdoJfexTower newOne( shelfNumber, jfexNumber, localEta, localPhi, layer, region );
857 newOne.setRodInfo( rodInfo );
860 rdo.setHardwareInfo( procNumber, chanNumber, iTower,
861 hwInfo.getAvr(), hwInfo.getFibreNumber(),
863 rdo.setValue( towerEt );
864 rdo.setFlag( errorMask );
868 std::cout <<
"L1CaloBsDecoderRun3::decodeJfexDataChan: "
869 <<
"module=" << jfexNumber
870 << std::hex <<
", Et=0x" << towerEt <<
", flag=0x" << errorMask
871 << std::dec << std::endl;
906 std::list<L1CaloRdoJfexTob>& tob,
907 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
909 const uint32_t* payload( beg );
910 const size_t fragmentSize = end - beg;
916 if ( fragmentSize < 2 ) {
917 LOG_ERROR(
"decodeJfexTobs",
"",
": fragment size " << fragmentSize
918 <<
" is too small for the ROD trailer");
922 size_t index = fragmentSize;
923 const uint32_t rodTrailer2 = payload[--
index];
924 const uint32_t rodTrailer1 = payload[--
index];
926 const uint32_t rodErrors = rodTrailer2 & 0x7f;
927 const size_t payloadSize = rodTrailer1 & 0xffff;
928 if ( (payloadSize + 2) != fragmentSize ) {
930 LOG_ERROR(
"decodeJfexTobs",
"",
"payload size " << payloadSize
931 <<
" inconsistent with ROD fragment size " << fragmentSize);
937 while (
index > 0 ) {
940 <<
" is too small for the jFEX trailer");
943 size_t fpgaIndex =
index;
944 const uint32_t fpgaTrailer2 = payload[--fpgaIndex];
945 const uint32_t fpgaTrailer1 = payload[--fpgaIndex];
946 const size_t fpgaBlockSize = fpgaTrailer1 & 0xffff;
947 const uint32_t jfexNumber = (fpgaTrailer1 >> 20) & 0x7;
948 const uint32_t fpgaNumber = (fpgaTrailer1 >> 18) & 0x3;
949 const uint32_t numSlices = (fpgaTrailer1 >> 24) & 0xf;
950 const uint32_t sliceNumber = (fpgaTrailer1 >> 28) & 0xf;
951 const uint32_t fpgaErrors = fpgaTrailer2 & 0x3f;
952 if ( fpgaBlockSize >
index ) {
953 LOG_ERROR(
"decodeJfexTobs",
"",
"jFEX FPGA block size " <<
954 fpgaBlockSize <<
" exceeds remaining data size " <<
index
955 <<
" (jFEX " << jfexNumber <<
" FPGA " << fpgaNumber <<
")");
959 index = fpgaIndex - fpgaBlockSize;
962 const uint32_t errorMask = fpgaErrors | (rodErrors << 6);
964 bool ret = this->
decodeJfexTobSlice ( payload, fpgaBlockSize, fpgaIndex, jfexNumber, fpgaNumber,
965 sliceNumber, numSlices, errorMask, tob, rodInfo );
989 const uint32_t jfexNumber,
const uint32_t fpgaNumber,
990 const uint32_t sliceNumber,
const uint32_t numSlices,
991 const uint32_t errorMask,
992 std::list<L1CaloRdoJfexTob>& tob,
993 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
1000 if ( jfexNumber == 0 || jfexNumber == 5 ) {
1004 const uint32_t countTrailer1 = payload[
index-2];
1005 const uint32_t countTrailer2 = payload[
index-1];
1008 const uint32_t corrective = 0;
1013 const uint32_t safeMode = (countTrailer1 ) & 0x1;
1014 const uint32_t numSJetTobs = (countTrailer1 >> 1) & 0x3f;
1015 const uint32_t numLJetTobs = (countTrailer1 >> 7) & 0x3f;
1016 const uint32_t numTauTobs = (countTrailer1 >> 13) & 0x3f;
1017 const uint32_t numElecTobs = (countTrailer1 >> 19) & 0x3f;
1018 const uint32_t numSumEtTobs = (countTrailer1 >> 25) & 0x1;
1019 const uint32_t numMissEtTobs = (countTrailer1 >> 26) & 0x1;
1020 const uint32_t numSJetXtobs = (countTrailer2 >> 1) & 0x3f;
1021 const uint32_t numLJetXtobs = (countTrailer2 >> 7) & 0x3f;
1022 const uint32_t numTauXtobs = (countTrailer2 >> 13) & 0x3f;
1023 const uint32_t numElecXtobs = (countTrailer2 >> 19) & 0x3f;
1035 std::vector<size_t> end;
1036 end.push_back( 0 ) ;
1038 end.push_back( end.back() + numSJetTobs );
1039 end.push_back( end.back() + numLJetTobs );
1040 end.push_back( end.back() + numTauTobs );
1041 end.push_back( end.back() + numElecTobs );
1042 end.push_back( end.back() + numSumEtTobs );
1043 end.push_back( end.back() + numMissEtTobs );
1044 end.push_back( end.back() + numSJetXtobs );
1045 end.push_back( end.back() + numLJetXtobs );
1046 end.push_back( end.back() + numTauXtobs );
1047 end.push_back( end.back() + numElecXtobs );
1050 size_t tobSize = end.back();
1051 tobSize += (tobSize % 2);
1054 if ( tobSize != blockSize ) {
1055 LOG_ERROR(
"decodeJfexTobSlice",
"",
": TOB slice " << sliceNumber
1056 <<
" has block size " << blockSize <<
" expected TOBs+counts " << tobSize
1057 <<
" (jFEX " << jfexNumber <<
" FPGA " << fpgaNumber <<
")");
1059 if ( tobSize >
index ) {
1060 LOG_ERROR(
"decodeJfexTobSlice",
"",
": TOB size " << tobSize
1061 <<
" is larger than index " <<
index);
1065 size_t numTobs = (safeMode) ? 0 : end[6];
1066 size_t totalTobs = (safeMode) ? 0 : end.back();
1072 size_t sliceIndex =
index;
1075 for (
size_t iTOB = 0; iTOB < totalTobs; iTOB++) {
1082 const uint32_t tobWord = payload[sliceIndex++];
1083 uint32_t flagInfo = (tobWord >> 21) & 0xfff;
1084 uint32_t etValue = (tobWord >> 10) & 0x7ff;
1085 uint32_t tobPhi = (tobWord >> 1) & 0xf;
1086 uint32_t tobEta = (tobWord >> 5) & 0x1f;
1087 fexTobSource = (iTOB < numTobs)
1090 if (iTOB < end[1]) {
1092 }
else if (iTOB < end[2]) {
1094 }
else if (iTOB < end[3]) {
1096 }
else if (iTOB < end[4]) {
1098 }
else if (iTOB < end[6]) {
1100 }
else if (iTOB < end[7]) {
1102 }
else if (iTOB < end[8]) {
1104 }
else if (iTOB < end[9]) {
1106 }
else if (iTOB < end[10]) {
1117 etValue = (tobWord >> 10) & 0x1fff;
1120 flagInfo = (tobWord & 0x1) | (tobWord & 0x1000) >> 15;
1121 etValue = (tobWord & 0x7ffffffe) >> 1;
1128 uint32_t sliceNumberHacked = sliceNumber;
1129 if (numSlices == 1 && sliceNumber == 2) {
1130 sliceNumberHacked = 0;
1133 if ( sliceNumberHacked >= numSlices ) {
1134 LOG_ERROR(
"decodeJfexTobSlice",
"",
": TOB slice " << sliceNumber
1135 <<
" exceeds number of slices " << numSlices <<
" in processor trailer");
1137 else if ( etValue || flagInfo ) {
1147 const uint32_t procNumber = JfexDefs::processorNumberToUnitNumber(fpgaNumber+1) - 1;
1148 const uint32_t modulePhi = tobPhi + 16 * procNumber;
1149 const uint32_t flagMask = (flagInfo << 16) | errorMask;
1150 const uint32_t shelfNumber = 0x22;
1151 L1CaloRdoJfexTob newOne( shelfNumber, jfexNumber, tobEta, modulePhi,
1152 numSlices, fexTobType, fexTobSource );
1153 newOne.setRodInfo( rodInfo );
1157 rdo.setValue( etValue, sliceNumberHacked );
1158 rdo.setFlag( flagMask, sliceNumberHacked );
1161 std::cout <<
"L1CaloBsDecoderRun3::decodeJfexTobSlice: tobType=" << fexTobType
1162 <<
", tobSource=" << fexTobSource <<
", slice=" << sliceNumberHacked
1163 <<
", module=" << jfexNumber <<
", fpga=" << fpgaNumber
1164 <<
", proc=" << procNumber <<
", eta=" << tobEta <<
", phi=" << modulePhi
1165 << std::hex <<
", Et=0x" << etValue <<
", flag=0x" << flagMask
1166 << std::dec <<
", numSlices=" << numSlices << std::endl;
1185 std::list<L1CaloRdoGfexTower>& tower,
1186 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
1188 const uint32_t* payload( beg );
1194 size_t numTowers = tower.size();
1197 while ( payload < end ) {
1198 const uint32_t word = *payload++;
1202 const uint32_t fpgaCode = ( word >> 28 ) & 0xf;
1203 if ( fpgaCode < 0xa || fpgaCode > 0xc ) {
1204 LOG_ERROR(
"decodeGfexData",
"",
"invalid FPGA code 0x"
1205 << std::hex << fpgaCode << std::dec);
1208 const uint32_t fpgaNumber = fpgaCode - 0xa;
1209 const uint32_t headerVer = ( word >> 24 ) & 0xf;
1210 const uint32_t headerLen = ( word >> 22 ) & 0x3;
1211 if ( headerVer > 1 || headerLen > 1 ) {
1212 LOG_ERROR(
"decodeGfexData",
"",
": header version " << headerVer
1213 <<
" or length " << headerLen <<
" is not yet supported");
1216 const uint32_t truncatedFlag = (word >> 12) & 0x1;
1217 if ( truncatedFlag ) {
1218 LOG_ERROR(
"decodeGfexData",
"",
"WARNING data truncated");
1220 const uint32_t numFpgaWords = word & 0xfff;
1221 if ( ( numFpgaWords % 7 ) != 0 ) {
1222 LOG_ERROR(
"decodeGfexData",
"",
"input data size " << numFpgaWords
1223 <<
" is not a multiple of 7");
1226 const uint32_t numInputFibres = numFpgaWords / 7;
1232 const uint32_t fpgaErrors = 0;
1234 for (
size_t chanNumber = 0; chanNumber < numInputFibres; chanNumber++ ) {
1236 if ( chanNumber < 48 || chanNumber >= 52 ) {
1238 fpgaErrors, tower, rodInfo );
1245 std::cout <<
"L1CaloBsDecoderRun3::decodeGfexData: n.towers added="
1246 << tower.size() - numTowers << std::endl;
1261 const uint32_t fpgaNumber,
1262 const uint32_t chanNumber,
1263 const uint32_t errorMask,
1264 std::list<L1CaloRdoGfexTower>& tower,
1265 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
1267 const uint32_t shelfNumber = 0x23;
1268 const uint32_t gfexNumber = 0;
1271 if ( chanNumber >= 48 && chanNumber < 52 ) {
1276 if ( fpgaNumber >= 2 ) {
1281 std::vector<FibrePackerBase::myDataWord> encodedData;
1282 for (
size_t i = 0; i < 7; i++ ) {
1283 encodedData.push_back( payload[i] );
1296 GfexTrexFibrePacker trexPacker;
1297 GfexLatomeCentralFibrePacker clarPacker;
1298 GfexLatomeForwardFibrePacker flarPacker;
1299 std::vector<FibrePackerBase::myDataWord> trexTowers = trexPacker.getUnpackedData( encodedData, frameType );
1300 std::vector<FibrePackerBase::myDataWord> clarTowers = clarPacker.getUnpackedData( encodedData, frameType );
1301 std::vector<FibrePackerBase::myDataWord> flarTowers = flarPacker.getUnpackedData( encodedData, frameType );
1302 size_t numTowers = GfexDefs::maxGTowersPerFibre();
1303 size_t numCentral = numTowers / 2;
1306 for (
size_t iTower = 0; iTower < numTowers; iTower++ ) {
1307 GfexCellMapping mapping( 0, fpgaNumber, chanNumber, iTower );
1309 GfexHardwareInfo hwInfo( mapping.getHardwareInfo() );
1310 if ( !region.
getValidity() || !hwInfo.getValidity() ) {
1316 int globalEta = GfexDefs::localToGlobalEta(fpgaNumber,region.
getEtaIndex());
1317 if (globalEta < -49 || globalEta >= 49) {
1327 if ( layer == 1 && std::abs(globalEta) < 14 ) {
1329 towerEt = trexTowers[iTower];
1331 else if ( layer == 1 && std::abs(globalEta) >= 16 && std::abs(globalEta) < 24 ) {
1333 towerEt = flarTowers[iTower];
1335 else if ( layer == 0 && std::abs(globalEta) < 14 && iTower < numCentral ) {
1337 towerEt = clarTowers[iTower];
1339 else if ( layer == 0 && std::abs(globalEta) >= 16 && std::abs(globalEta) < 24 && iTower < numCentral ) {
1341 towerEt = clarTowers[iTower];
1347 if ( towerEt || errorMask ) {
1349 L1CaloRdoGfexTower newOne( shelfNumber, gfexNumber, globalEta, globalPhi, layer, region );
1350 newOne.setRodInfo( rodInfo );
1353 rdo.setHardwareInfo( hwInfo.getFpgaNumber(), chanNumber, iTower,
1354 GfexDefs::minipodNumFromName(hwInfo.getMpodName()),
1355 hwInfo.getMpodChannel() );
1356 rdo.setValue( towerEt );
1357 rdo.setFlag( errorMask );
1361 std::cout <<
"L1CaloBsDecoderRun3::decodeGfexDataChan: "
1362 <<
"FPGA=" << fpgaNumber
1363 << std::hex <<
", Et=0x" << towerEt <<
", flag=0x" << errorMask
1364 << std::dec << std::endl;
1394 std::list<L1CaloRdoGfexTob>& tob,
1395 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
1398 const uint32_t* payload( beg );
1399 const size_t fragmentSize = end - beg;
1410 while (
index < fragmentSize ) {
1411 const uint32_t headerWord = payload[
index];
1412 const uint32_t blockType = (headerWord >> 28) & 0xf;
1414 const uint32_t headerSize = (headerWord >> 22) & 0x3;
1415 const uint32_t errorFlags = (headerWord >> 12) & 0x1;
1416 const uint32_t dataSize = headerWord & 0xfff;
1418 const uint32_t blockSize = headerSize + dataSize;
1419 if ( (
index + blockSize) > fragmentSize ) {
1420 LOG_ERROR(
"decodeGfexTobs",
"",
"remaining block size "
1421 << (fragmentSize -
index)
1422 <<
" is too small for subblock of type " << blockType
1423 <<
" with headerSize " << headerSize
1424 <<
" and dataSize " << dataSize);
1427 index += headerSize;
1430 const uint32_t numSlices = dataSize / wordsPerSlice;
1431 if ( numSlices * wordsPerSlice != dataSize ) {
1432 LOG_ERROR(
"decodeGfexTobs",
"",
"subblock type " << blockType
1433 <<
" with dataSize " << dataSize
1434 <<
" is not a multiple of " << wordsPerSlice <<
" words");
1439 for (
size_t sliceNumber = 0; sliceNumber < numSlices; sliceNumber++) {
1441 errorFlags, tob, rodInfo );
1445 index += wordsPerSlice;
1464 const uint32_t sliceNumber,
const uint32_t numSlices,
1465 const uint32_t errorMask,
1466 std::list<L1CaloRdoGfexTob>& tob,
1467 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
1471 bool isMet = (blockType >= 0x1 && blockType <= 0x3);
1472 bool isJet = (blockType >= 0xA && blockType <= 0xC);
1473 if ( !isJet && !isMet ) {
1474 LOG_ERROR(
"decodeGfexTobSlice",
"",
": invalid block type "
1478 const uint32_t fpgaNumber = (isJet) ? (blockType - 0x1) : (blockType - 0xA);
1482 for (
size_t iFibre = 0; iFibre < 2; iFibre++ ) {
1486 const uint32_t tobID = payload[
index] & 0x1f;
1487 const uint32_t status = (payload[
index] >> 7) & 0x1;
1488 const uint32_t etValue = (payload[
index] >> 8) & 0xfff;
1489 const uint32_t tobEta = (payload[
index] >> 20) & 0x3f;
1490 const uint32_t tobPhi = (payload[
index] >> 26) & 0x1f;
1491 const uint32_t saturated = (payload[
index] >> 31) & 0x1;
1495 if ( tobID >= 1 && tobID <= 4 ) {
1498 else if ( tobID >= 5 && tobID <= 6 ) {
1502 if ( ( etValue || saturated || errorMask ) && tobID ) {
1507 const uint32_t flagMask = errorMask | (saturated << 31) | (status << 30);
1508 const uint32_t shelfNumber = 0x23;
1509 const uint32_t moduleNumber = 0;
1510 L1CaloRdoGfexTob newOne( shelfNumber, moduleNumber, tobEta, tobPhi,
1511 numSlices, fexTobType, fexTobSource );
1512 newOne.setRodInfo( rodInfo );
1514 rdo.setValue( etValue, sliceNumber );
1515 rdo.setFlag( flagMask, sliceNumber );
1518 std::cout <<
"L1CaloBsDecoderRun3::decodeGfexTobSlice: tobType=" << fexTobType
1519 <<
", tobSource=" << fexTobSource <<
", slice=" << sliceNumber
1520 <<
", fpga=" << fpgaNumber <<
", eta=" << tobEta <<
", phi=" << tobPhi
1521 << std::hex <<
", Et=0x" << etValue <<
", flag=0x" << flagMask
1522 << std::dec <<
", numSlices=" << numSlices << std::endl;
1550 std::list<L1CaloRdoEfexTob>& etob,
1551 std::list<L1CaloRdoJfexTob>& jtob,
1552 std::list<L1CaloRdoGfexTob>& gtob,
1553 std::list<L1CaloRdoMuonTob>& mtob,
1554 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
1556 const uint32_t* payload( beg );
1557 const size_t fragmentSize = end - beg;
1563 enum TopoInputFibreTypes {
Unknown=0x00, IPB=0x01, TTC=0x02, EM1=0x03, EM2=0x04,
1564 G1=0x05, G2=0x06, J1=0x07, J2=0x08, JF=0x09, JFXE=0x0a,
1565 M0A=0x0b, M0C=0x0c, M1A=0x0d, M1C=0x0e, M2A=0x0f, M2C=0x10,
1566 TAU1=0x11, TAU2=0x12, gJ1=0x13, gJ2=0x14 };
1574 size_t index = fragmentSize;
1577 while (
index > 0 ) {
1579 LOG_ERROR(
"decodePh1TopoData",
"",
"remaining block size " <<
index
1580 <<
" is too small for the Ph1Topo FPGA trailer");
1583 const uint32_t fpgaTrailer2 = payload[--
index];
1584 const uint32_t fpgaTrailer1 = payload[--
index];
1586 const uint32_t fpgaErrors = fpgaTrailer2 & 0x3f;
1589 const uint32_t sliceNum = 0;
1590 const uint32_t numSlices = 1;
1594 const size_t payloadSize = (fpgaTrailer1 & 0xffff);
1596 if ( payloadSize >
index ) {
1597 LOG_ERROR(
"decodePh1TopoData",
"",
"remaining Ph1Topo block size "
1598 <<
index <<
" is too small for the claimed payload size "
1610 index -= payloadSize;
1611 size_t chanIndex = 0;
1612 uint32_t fexShelf = 0;
1613 uint32_t fexModule = 0;
1614 uint32_t fexFpga = 0;
1615 while ( chanIndex < payloadSize ) {
1616 if ( (payloadSize - chanIndex) < 8 ) {
1617 LOG_ERROR(
"decodePh1TopoData",
"",
"remaining Ph1Topo block size "
1618 << (payloadSize - chanIndex)
1619 <<
" is too small for one Ph1Topo input fibre block (8)");
1623 const uint32_t fibreType = ( payload[7] >> 8 ) & 0x1f;
1631 if (fibreType == TopoInputFibreTypes::J1 || fibreType == TopoInputFibreTypes::JF ||
1632 fibreType == TopoInputFibreTypes::J2 || fibreType == TopoInputFibreTypes::JFXE) {
1636 for (
size_t iTob = 0; iTob < numTobs; iTob++) {
1638 if (fibreType == TopoInputFibreTypes::EM1 || fibreType == TopoInputFibreTypes::TAU1 ||
1639 fibreType == TopoInputFibreTypes::EM2 || fibreType == TopoInputFibreTypes::TAU2) {
1640 tobType = (fibreType <= TopoInputFibreTypes::EM2)
1645 fpgaErrors, numSlices, sliceNum, tobType, tobSource,
1675 std::list<L1CaloRdoPh1TopoHit>& hit,
1676 std::list<L1CaloRdoRodInfo>::const_iterator rodInfo )
1678 const uint32_t* payload( beg );
1679 const size_t fragmentSize = end - beg;
1685 if ( fragmentSize < 2 ) {
1686 LOG_ERROR(
"decodePh1TopoHits",
"",
"fragment size " << fragmentSize
1687 <<
" is too small for the ROD trailer");
1691 size_t index = fragmentSize;
1692 const uint32_t rodTrailer2 = payload[--
index];
1693 const uint32_t rodTrailer1 = payload[--
index];
1695 const uint32_t rodErrors = rodTrailer2 & 0x7f;
1696 const size_t payloadSize = rodTrailer1 & 0xffff;
1697 if ( (payloadSize + 2) != fragmentSize ) {
1699 LOG_ERROR(
"decodePh1TopoHits",
"",
"payload size " << payloadSize
1700 <<
" inconsistent with ROD fragment size " << fragmentSize);
1705 while (
index > 0 ) {
1707 LOG_ERROR(
"decodePh1TopoHits",
"",
"remaining block size " <<
index
1708 <<
" is too small for the Ph1Topo trailer");
1711 size_t fpgaIndex =
index;
1712 const uint32_t fpgaTrailer2 = payload[--fpgaIndex];
1713 const uint32_t fpgaTrailer1 = payload[--fpgaIndex];
1714 const size_t fpgaBlockSize = fpgaTrailer1 & 0xffff;
1715 const uint32_t topoNumber = (fpgaTrailer1 >> 20) & 0x7;
1716 const uint32_t fpgaNumber = (fpgaTrailer1 >> 18) & 0x3;
1717 const uint32_t numSlices = (fpgaTrailer1 >> 24) & 0xf;
1718 const uint32_t sliceNumber = (fpgaTrailer1 >> 28) & 0xf;
1719 const uint32_t fpgaErrors = fpgaTrailer2 & 0x3f;
1720 if ( fpgaBlockSize >
index ) {
1721 LOG_ERROR(
"decodePh1TopoHits",
"",
"Ph1Topo FPGA block size "
1722 << fpgaBlockSize <<
" exceeds remaining data size " <<
index
1723 <<
" (Ph1Topo " << topoNumber <<
" FPGA " << fpgaNumber <<
")");
1727 index = fpgaIndex - fpgaBlockSize;
1730 const uint32_t errorMask = fpgaErrors | (rodErrors << 6);
1736 const size_t expectedBlockSize = 6;
1737 if ( fpgaBlockSize != expectedBlockSize ) {
1738 LOG_ERROR(
"decodePh1TopoHits",
"",
"Ph1Topo FPGA block size "
1739 << fpgaBlockSize <<
" is not the expected " << expectedBlockSize);
1742 const uint32_t shelfNumber = 0x24;
1743 const int idFlag = 0;
1744 L1CaloRdoHit::HitSource hitSource( L1CaloRdoHit::Result );
1745 size_t numWordsUsedPerFPGA = (topoNumber == 1) ? 6 : 2;
1746 size_t numHitWordsPerFPGA = (topoNumber == 1) ? 6 : 1;
1747 size_t numHitWordsPerModule = numHitWordsPerFPGA * 2;
1749 L1CaloRdoPh1TopoHit newOne( shelfNumber, topoNumber, idFlag, hitSource, numHitWordsPerModule, numSlices );
1750 newOne.setRodInfo( rodInfo );
1752 rdo.setFlag( errorMask, sliceNumber );
1754 size_t sliceIndex =
index;
1755 for (
size_t k = 0; k < numWordsUsedPerFPGA; k++ ) {
1756 const uint32_t resultWord = payload[sliceIndex++];
1757 size_t wordNum = ( topoNumber == 1 ) ? k : 0;
1758 wordNum += fpgaNumber * numHitWordsPerFPGA;
1760 bool isOverflow = ( topoNumber != 1 ) && ( k != 0 );
1762 rdo.setOverflows( resultWord, wordNum, sliceNumber );
1765 rdo.setHits( resultWord, wordNum, sliceNumber );
1770 std::cout <<
"L1CaloBsDecoderRun3::decodePh1TopoHits: slice=" << sliceNumber
1771 <<
", module=" << topoNumber <<
", fpga=" << fpgaNumber
1772 << std::hex <<
", result=0x" << resultWord <<
", errors=0x" << errorMask
1773 << std::dec <<
", numSlices=" << numSlices <<
", numWords=" << numHitWordsPerModule
1774 <<
", isOverflow=" << isOverflow << std::endl;
char data[hepevt_bytes_allocation_ATLAS]
#define LOG_ERROR(location, title, detail)
static unsigned int numAtcaFexSlots()
New class for Efex Cell Mappings, constructs either from shared CSVTables instance.
L1CaloDetectorRegion getDetectorRegion() const
static int numInputFibresPerFpga()
int getMpodNumber() const
int getFibreNumber() const
virtual std::vector< myDataWord > getUnpackedData(const std::vector< myDataWord > &encodedData, InputDataFrameType frameType) const override
Function unpacking the data from LATOME format, either standard or alignement frame.
virtual std::vector< myDataWord > getUnpackedData(const std::vector< myDataWord > &encodedData, InputDataFrameType frameType) const override
Function unpacking the data from LATOME format, either standard or alignement frame.
static int num32BitWordsPerFibre()
InputDataFrameType
type of input data frame
@ Normal
Standard data frame.
uint32_t crc9fibre(const std::vector< uint32_t > &inwords, size_t num_bits) const
Functions calculating CRC over input data.
Interface class for logging, can be overriden to e.g.
bool decodeEfexTobSlice(const uint32_t payload[], size_t &index, const uint32_t efexNumber, const uint32_t shelfNumber, const uint32_t numSlices, const uint32_t errorMask, std::list< L1CaloRdoEfexTob > &tob, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo) const
Decode one eFEX FPGA block of TOBs and XTOBs for one slice.
uint32_t decodeGfexDataChan(const uint32_t payload[], const uint32_t fpgaNumber, const uint32_t chanNumber, const uint32_t errorMask, std::list< L1CaloRdoGfexTower > &dat, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo)
Decode the data from one gFEX input fibre (only ever one slice).
uint32_t decodeEfexDataChan(const uint32_t payload[], const uint32_t efexNumber, const uint32_t shelfNumber, const uint32_t errorMask, std::list< L1CaloRdoEfexTower > &dat, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo) const
Decode the data from one eFEX input fibre (only ever one slice).
void decodeJfexTobs(const uint32_t *beg, const uint32_t *end, std::list< L1CaloRdoJfexTob > &tob, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo)
Decode jFEX TOBs and XTOBs.
void decodePh1TopoHits(const uint32_t *beg, const uint32_t *end, std::list< L1CaloRdoPh1TopoHit > &hit, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo)
Decode Ph1Topo hit results.
void decodePh1TopoData(const uint32_t *beg, const uint32_t *end, std::list< L1CaloRdoEfexTob > &etob, std::list< L1CaloRdoJfexTob > &jtob, std::list< L1CaloRdoGfexTob > >ob, std::list< L1CaloRdoMuonTob > &mtob, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo)
Decode Ph1Topo input data: these are TOBs from FEXes and MuCTPI.
void decodeGfexData(const uint32_t *beg, const uint32_t *end, std::list< L1CaloRdoGfexTower > &dat, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo)
Decode gFEX input fibre data.
bool checkFibreCRC(std::vector< uint32_t > &data) const
Check the CRC in an input fibre block of words.
void decodeOneEfexTob(const uint32_t word[], const uint32_t shelfNumber, const uint32_t efexNumber, const uint32_t fpgaNumber, const uint32_t errorMask, const uint32_t numSlices, const uint32_t sliceNum, L1CaloRdoFexTob::TobType tobType, L1CaloRdoFexTob::TobSource tobSource, std::list< L1CaloRdoEfexTob > &tob, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo) const
Decode word(s) for one eFEX TOB (or xTOB) and create one RDO.
void decodeGfexTobs(const uint32_t *beg, const uint32_t *end, std::list< L1CaloRdoGfexTob > &dat, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo)
Decode gFEX TOBs.
void decodeJfexData(const uint32_t *beg, const uint32_t *end, std::list< L1CaloRdoJfexTower > &dat, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo)
Decode jFEX input fibre data.
bool decodeJfexTobSlice(const uint32_t payload[], size_t blockSize, size_t &index, const uint32_t jfexNumber, const uint32_t fpgaNumber, const uint32_t sliceNumber, const uint32_t numSlices, const uint32_t errorMask, std::list< L1CaloRdoJfexTob > &tob, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo)
Decode one jFEX FPGA block of TOBs and XTOBs for one slice.
void decodeEfexData(const uint32_t *beg, const uint32_t *end, std::list< L1CaloRdoEfexTower > &dat, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo) const
Decode eFEX input fibre data.
uint32_t decodeJfexDataChan(const uint32_t payload[], const uint32_t jfexNumber, const uint32_t fpgaNumber, const uint32_t errorMask, std::list< L1CaloRdoJfexTower > &dat, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo)
Decode the data from one jFEX input fibre (only ever one slice).
std::unique_ptr< Logging > m_logger
void decodeEfexTobs(const uint32_t *beg, const uint32_t *end, std::list< L1CaloRdoEfexTob > &tob, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo) const
Decode eFEX TOBs and XTOBs.
bool decodeGfexTobSlice(const uint32_t payload[], const uint32_t blockType, const uint32_t sliceNumber, const uint32_t numSlices, const uint32_t errorMask, std::list< L1CaloRdoGfexTob > &tob, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo)
Decode one gFEX FPGA block of TOBs for one slice.
static Tar & findRdo(const Tar &target, Dat &data, Iter begin, Iter end)
Simple class to mainly store eta/phi information (indices, granularity, trigger tower coordinates) as...
LayerTypeEnum getLayer() const
L1CaloRdoFexTob subclass for eFEX EM/Tau TOBs or XTOBs.
void setSupercells(std::vector< uint32_t > &supercells)
void setHardwareInfo(uint32_t fpga, uint32_t mgt, uint32_t word, uint32_t mpod, uint32_t fibre, uint32_t overlap)
void setRodInfo(std::list< L1CaloRdoRodInfo >::const_iterator &rodInfo)
void setFlag(int flag, size_t slice)
void setValue(int val, size_t slice)