  | 
  
    ATLAS Offline Software
    
   | 
 
 
 
 
#include <L1CaloBsDecoderRun3.h>
 | 
| class   | Logging | 
|   | Interface class for logging, can be overriden to e.g.  More...
  | 
|   | 
 | 
|   | L1CaloBsDecoderRun3 () | 
|   | 
| void  | setVerbosity (bool verbosity) | 
|   | 
| void  | setLogger (std::unique_ptr< Logging > &&logger) | 
|   | 
| 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.  More...
  | 
|   | 
| 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.  More...
  | 
|   | 
| 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.  More...
  | 
|   | 
| 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.  More...
  | 
|   | 
| 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.  More...
  | 
|   | 
| void  | decodeGfexTobs (const uint32_t *beg, const uint32_t *end, std::list< L1CaloRdoGfexTob > &dat, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo) | 
|   | Decode gFEX TOBs.  More...
  | 
|   | 
| 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.  More...
  | 
|   | 
| void  | decodePh1TopoHits (const uint32_t *beg, const uint32_t *end, std::list< L1CaloRdoPh1TopoHit > &hit, std::list< L1CaloRdoRodInfo >::const_iterator rodInfo) | 
|   | Decode Ph1Topo hit results.  More...
  | 
|   | 
 | 
| 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.  More...
  | 
|   | 
| 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).  More...
  | 
|   | 
| 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.  More...
  | 
|   | 
| 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).  More...
  | 
|   | 
| 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.  More...
  | 
|   | 
| 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).  More...
  | 
|   | 
| 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.  More...
  | 
|   | 
| bool  | checkFibreCRC (std::vector< uint32_t > &data) const | 
|   | Check the CRC in an input fibre block of words.  More...
  | 
|   | 
Decoder for Run 3 data formats: eFEX, jFEX, gFEX and phase 1 Topo. Utility methods shared with Runs 1 & 2 are now in L1CaloBsDecoderUtil. 
Definition at line 22 of file L1CaloBsDecoderRun3.h.
 
◆ L1CaloBsDecoderRun3()
      
        
          | L1CaloBsDecoderRun3::L1CaloBsDecoderRun3  | 
          ( | 
           | ) | 
           | 
        
      
 
Definition at line 48 of file L1CaloBsDecoderRun3.cxx.
   54   if (!dummyEfexMapping.getDetectorRegion().getValidity()) {
 
   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!?",
"");
 
 
 
 
◆ checkFibreCRC()
  
  
      
        
          | bool L1CaloBsDecoderRun3::checkFibreCRC  | 
          ( | 
          std::vector< uint32_t > &  | 
          data | ) | 
           const | 
         
       
   | 
  
private   | 
  
 
Check the CRC in an input fibre block of words. 
The CRC field should be the top 9 bits in the 7 word block. This means we calculate the CRC over the remaining 215 bits. 
- Parameters
 - 
  
    | data | vector of 7 input fibre words  | 
  
   
- Returns
 - true if the CRC is valid 
 
Definition at line 669 of file L1CaloBsDecoderRun3.cxx.
  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);
 
 
 
 
◆ decodeEfexData()
Decode eFEX input fibre data. 
For the EM layer we have up to 10 supercell values per tower though there is still just a single hadronic value. It seemed overkill to have an RDO per supercell, so instead the main RDO "Value" is set to the sum of 10 EM supercells with the individual supercell Ets saved in a separate vector. These are always stored in 1441 order (PS, F0-F3, M0-M3, BK) even in regions where some supercells are missing. The flag field is used for status/error bits. 
- Parameters
 - 
  
    | beg | pointer to start of rod data payload  | 
    | end | pointer to end of rod data payload  | 
    | tower | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
Definition at line 85 of file L1CaloBsDecoderRun3.cxx.
   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");
 
  113       const uint32_t ctrlErrors  =  ctrlTrailer2 & 0x3f;
 
  114       const uint32_t efexNumber  = (ctrlTrailer1 >> 12) & 0xf;
 
  115       const uint32_t shelfNumber = (ctrlTrailer1 >> 16) & 0
x1;  
 
  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;
 
  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)");
 
  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;
 
 
 
 
◆ decodeEfexDataChan()
Decode the data from one eFEX input fibre (only ever one slice). 
- Parameters
 - 
  
    | payload | payload vector starting at this 8 word block  | 
    | efexNumber | number of this eFEX in its shelf  | 
    | shelfNumber | shelf number (here 0 or 1)  | 
    | errorMask | global error bits set for this ROD fragment  | 
    | tower | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
- Returns
 - whether decoding succeeded (false to abort decoding) 
 
Definition at line 187 of file L1CaloBsDecoderRun3.cxx.
  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 );
 
  255          for (
size_t i = 0; 
i < 10; 
i++) {
 
  260             towerCells[
i] = 
cells[iCell];
 
  261             towerSumEt += towerCells[
i];
 
  273             if ( region.
getValidity() && hwInfo.getValidity() ) {
 
  274                int localEta = region.
getEtaIndex() - moduleEta + 1;
 
  279                newOne.setRodInfo( rodInfo );
 
  283                                     hwInfo.getMpodNumber(), hwInfo.getFibreNumber(),
 
  284                                     hwInfo.getOverlap() );
 
  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 );
 
  316             if ( region.
getValidity() && hwInfo.getValidity() ) {
 
  322                   towerVals[wordNumber] &= 0xff;
 
  325                int localEta = region.
getEtaIndex() - moduleEta + 1;
 
  330                newOne.setRodInfo( rodInfo );
 
  334                                     hwInfo.getMpodNumber(), hwInfo.getFibreNumber(),
 
  335                                     hwInfo.getOverlap() );
 
  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;
 
 
 
 
◆ decodeEfexTobs()
Decode eFEX TOBs and XTOBs. 
The RDO value encodes the cluster Et in the value field and the isolation bits and other information in the flag. 
- Parameters
 - 
  
    | beg | pointer to start of rod data payload  | 
    | end | pointer to end of rod data payload  | 
    | tob | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
Definition at line 363 of file L1CaloBsDecoderRun3.cxx.
  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;
 
  384    const uint32_t rodErrors = rodTrailer2 & 0x7f;
 
  385    const size_t payloadSize = rodTrailer1 & 0xffff;
 
  386    if ( (rodErrors >> 6) & 0
x1 ) {
 
  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;
 
  410        const uint32_t corrective  = (efexTrailer2 >> 5) & 0
x1;
 
  413            size_t corrBlockSize = (efexTrailer1) & 0xffff;
 
  414            const uint32_t efexNumber  = (efexTrailer1 >> 16) & 0xf;
 
  415            const uint32_t shelfNumber = (efexTrailer1 >> 20) & 0
x1;
 
  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) & 0
x1;   
 
  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;
 
 
 
 
◆ decodeEfexTobSlice()
  
  
      
        
          | bool L1CaloBsDecoderRun3::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 | 
         
       
   | 
  
private   | 
  
 
Decode one eFEX FPGA block of TOBs and XTOBs for one slice. 
- Parameters
 - 
  
    | payload | entire ROD fragment payload vector  | 
    | index | just past end of block for this slice (this method updates it to the start of the block)  | 
    | efexNumber | number of this eFEX in its shelf  | 
    | shelfNumber | shelf number  | 
    | numSlices | number of TOB slices read out in this event  | 
    | errorMask | global error bits set for this ROD fragment  | 
    | tob | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
- Returns
 - whether decoding succeeded (false to abort decoding in which case the returned index is not valid) 
 
Definition at line 487 of file L1CaloBsDecoderRun3.cxx.
  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) &   0
x1;
 
  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) &   0
x1;
 
  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) {
 
  571                fexTobSource = L1CaloRdoFexTob::TobSource::EfexXtob;
 
  572                fexTobType = (iTOB < (numTobs + numEmXtobs))
 
  577                                      errorMask, numSlices, sliceNumber, fexTobType, fexTobSource,
 
  580             sliceIndex += (fexTobSource == L1CaloRdoFexTob::TobSource::EfexTob) ? 1 : 2;
 
 
 
 
◆ decodeGfexData()
      
        
          | void L1CaloBsDecoderRun3::decodeGfexData  | 
          ( | 
          const uint32_t *  | 
          beg,  | 
        
        
           | 
           | 
          const uint32_t *  | 
          end,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoGfexTower > &  | 
          tower,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoRodInfo >::const_iterator  | 
          rodInfo  | 
        
        
           | 
          ) | 
           |  | 
        
      
 
Decode gFEX input fibre data. 
We create one RDO per tower using the value field for its Et. The flag field is used for status/error bits. 
- Parameters
 - 
  
    | beg | pointer to start of rod data payload  | 
    | end | pointer to end of rod data payload  | 
    | tower | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
Definition at line 1184 of file L1CaloBsDecoderRun3.cxx.
 1194    size_t numTowers = tower.size();
 
 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) & 0
x1;
 
 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;
 
 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;
 
 
 
 
◆ decodeGfexDataChan()
  
  
      
        
          | uint32_t L1CaloBsDecoderRun3::decodeGfexDataChan  | 
          ( | 
          const uint32_t  | 
          payload[],  | 
         
        
           | 
           | 
          const uint32_t  | 
          fpgaNumber,  | 
         
        
           | 
           | 
          const uint32_t  | 
          chanNumber,  | 
         
        
           | 
           | 
          const uint32_t  | 
          errorMask,  | 
         
        
           | 
           | 
          std::list< L1CaloRdoGfexTower > &  | 
          tower,  | 
         
        
           | 
           | 
          std::list< L1CaloRdoRodInfo >::const_iterator  | 
          rodInfo  | 
         
        
           | 
          ) | 
           |  | 
         
       
   | 
  
private   | 
  
 
Decode the data from one gFEX input fibre (only ever one slice). 
- Parameters
 - 
  
    | payload | payload vector starting at this 7 word block  | 
    | fpgaNumber | FPGA number (0-2 for A-C)  | 
    | errorMask | global error bits set for this ROD fragment  | 
    | tower | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
- Returns
 - whether decoding succeeded (false to abort decoding) 
 
Definition at line 1260 of file L1CaloBsDecoderRun3.cxx.
 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;
 
 
 
 
◆ decodeGfexTobs()
      
        
          | void L1CaloBsDecoderRun3::decodeGfexTobs  | 
          ( | 
          const uint32_t *  | 
          beg,  | 
        
        
           | 
           | 
          const uint32_t *  | 
          end,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoGfexTob > &  | 
          tob,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoRodInfo >::const_iterator  | 
          rodInfo  | 
        
        
           | 
          ) | 
           |  | 
        
      
 
Decode gFEX TOBs. 
We create one RDO per TOB using the value field for its Et. The flag field is used for status/error bits. FIXME We also create one RDO for the energy TOBs. 
- Parameters
 - 
  
    | beg | pointer to start of rod data payload  | 
    | end | pointer to end of rod data payload  | 
    | tob | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
Definition at line 1393 of file L1CaloBsDecoderRun3.cxx.
 1399    const size_t fragmentSize = 
end - 
beg;
 
 1410    while ( 
index < fragmentSize ) {
 
 1414       const uint32_t headerSize = (headerWord >> 22) &    0x3;
 
 1415       const uint32_t errorFlags = (headerWord >> 12) &    0
x1;
 
 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
 
 1427       index += headerSize;
 
 1431       if ( numSlices * wordsPerSlice != 
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;
 
 
 
 
◆ decodeGfexTobSlice()
  
  
      
        
          | bool L1CaloBsDecoderRun3::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  | 
         
        
           | 
          ) | 
           |  | 
         
       
   | 
  
private   | 
  
 
Decode one gFEX FPGA block of TOBs for one slice. 
See https://edms.cern.ch/ui/file/1492098/1/L1CaloTOBFormats_v010.pdf 
- Parameters
 - 
  
    | payload | pointer to this slice in ROD fragment payload  | 
    | blockType | code for Jet or MET TOB  | 
    | sliceNumber | number of this readout slice  | 
    | numSlices | total number of TOB slices read out in this event  | 
    | errorFlags | global error bits set for this subblock (or ROD fragment?)  | 
    | tob | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
- Returns
 - whether decoding succeeded (false to abort decoding) 
 
Definition at line 1463 of file L1CaloBsDecoderRun3.cxx.
 1473    if ( !isJet && !isMet ) {
 
 1474       LOG_ERROR(
"decodeGfexTobSlice",
"",
": invalid block type " 
 1482    for ( 
size_t iFibre = 0; iFibre < 2; iFibre++ ) {
 
 1495             if ( tobID >= 1 && tobID <= 4 ) {
 
 1496                fexTobType = L1CaloRdoFexTob::TobType::SmallJet;
 
 1498             else if ( tobID >= 5 && tobID <= 6 ) {
 
 1499                fexTobType = L1CaloRdoFexTob::TobType::LargeJet;
 
 1502             if ( ( etValue || 
saturated || errorMask ) && tobID ) {
 
 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;
 
 
 
 
◆ decodeJfexData()
      
        
          | void L1CaloBsDecoderRun3::decodeJfexData  | 
          ( | 
          const uint32_t *  | 
          beg,  | 
        
        
           | 
           | 
          const uint32_t *  | 
          end,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoJfexTower > &  | 
          tower,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoRodInfo >::const_iterator  | 
          rodInfo  | 
        
        
           | 
          ) | 
           |  | 
        
      
 
Decode jFEX input fibre data. 
We create one RDO per tower using the value field for its Et. The flag field is used for status/error bits. 
- Parameters
 - 
  
    | beg | pointer to start of rod data payload  | 
    | end | pointer to end of rod data payload  | 
    | tower | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
Definition at line 695 of file L1CaloBsDecoderRun3.cxx.
  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");
 
  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;
 
 
 
 
◆ decodeJfexDataChan()
  
  
      
        
          | uint32_t L1CaloBsDecoderRun3::decodeJfexDataChan  | 
          ( | 
          const uint32_t  | 
          payload[],  | 
         
        
           | 
           | 
          const uint32_t  | 
          jfexNumber,  | 
         
        
           | 
           | 
          const uint32_t  | 
          fpgaNumber,  | 
         
        
           | 
           | 
          const uint32_t  | 
          errorMask,  | 
         
        
           | 
           | 
          std::list< L1CaloRdoJfexTower > &  | 
          tower,  | 
         
        
           | 
           | 
          std::list< L1CaloRdoRodInfo >::const_iterator  | 
          rodInfo  | 
         
        
           | 
          ) | 
           |  | 
         
       
   | 
  
private   | 
  
 
Decode the data from one jFEX input fibre (only ever one slice). 
- Parameters
 - 
  
    | payload | payload vector starting at this 8 word block  | 
    | jfexNumber | number of this jFEX in its shelf  | 
    | fpgaNumber | FPGA number  | 
    | errorMask | global error bits set for this ROD fragment  | 
    | tower | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
- Returns
 - whether decoding succeeded (false to abort decoding) 
 
Definition at line 766 of file L1CaloBsDecoderRun3.cxx.
  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++ ) {
 
  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;
 
 
 
 
◆ decodeJfexTobs()
      
        
          | void L1CaloBsDecoderRun3::decodeJfexTobs  | 
          ( | 
          const uint32_t *  | 
          beg,  | 
        
        
           | 
           | 
          const uint32_t *  | 
          end,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoJfexTob > &  | 
          tob,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoRodInfo >::const_iterator  | 
          rodInfo  | 
        
        
           | 
          ) | 
           |  | 
        
      
 
Decode jFEX TOBs and XTOBs. 
The RDO value encodes the cluster Et in the value field and the isolation bits and other information in the flag. 
- Parameters
 - 
  
    | beg | pointer to start of rod data payload  | 
    | end | pointer to end of rod data payload  | 
    | tob | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
Definition at line 905 of file L1CaloBsDecoderRun3.cxx.
  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;
 
  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;
 
  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);
 
  965                                             sliceNumber, numSlices, errorMask, tob, rodInfo );
 
 
 
 
◆ decodeJfexTobSlice()
  
  
      
        
          | bool L1CaloBsDecoderRun3::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  | 
         
        
           | 
          ) | 
           |  | 
         
       
   | 
  
private   | 
  
 
Decode one jFEX FPGA block of TOBs and XTOBs for one slice. 
- Parameters
 - 
  
    | payload | entire ROD fragment payload vector  | 
    | index | just past end of block for this slice (this method updates it to the start of the block)  | 
    | jfexNumber | number of this jFEX in its shelf  | 
    | fpgaNumber | FPGA number  | 
    | sliceNumber | number of this readout slice  | 
    | numSlices | total number of TOB slices read out in this event  | 
    | errorMask | global error bits set for this ROD fragment  | 
    | tob | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
- Returns
 - whether decoding succeeded (false to abort decoding in which case the returned index is not valid) 
 
Definition at line 988 of file L1CaloBsDecoderRun3.cxx.
 1000    if ( jfexNumber == 0 || jfexNumber == 5 ) {
 
 1013       const uint32_t safeMode      = (countTrailer1      ) & 0
x1;
 
 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) & 0
x1;
 
 1019       const uint32_t numMissEtTobs = (countTrailer1 >> 26) & 0
x1;
 
 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++) {
 
 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)
 
 1088                       ? L1CaloRdoFexTob::TobSource::JfexTob
 
 1089                       : L1CaloRdoFexTob::TobSource::JfexXtob;
 
 1090          if        (iTOB < 
end[1]) {
 
 1091             fexTobType = L1CaloRdoFexTob::TobType::SmallJet;
 
 1092          } 
else if (iTOB < 
end[2]) {
 
 1093             fexTobType = L1CaloRdoFexTob::TobType::LargeJet;
 
 1094          } 
else if (iTOB < 
end[3]) {
 
 1096          } 
else if (iTOB < 
end[4]) {
 
 1098          } 
else if (iTOB < 
end[6]) {
 
 1100          } 
else if (iTOB < 
end[7]) {
 
 1101             fexTobType = L1CaloRdoFexTob::TobType::SmallJet;
 
 1102          } 
else if (iTOB < 
end[8]) {
 
 1103             fexTobType = L1CaloRdoFexTob::TobType::LargeJet;
 
 1104          } 
else if (iTOB < 
end[9]) {
 
 1106          } 
else if (iTOB < 
end[10]) {
 
 1113          if        (fexTobType == L1CaloRdoFexTob::TobType::SmallJet) {
 
 1115          } 
else if (fexTobType == L1CaloRdoFexTob::TobType::LargeJet) {
 
 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;
 
 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;
 
 
 
 
◆ decodeOneEfexTob()
  
  
      
        
          | void L1CaloBsDecoderRun3::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 | 
         
       
   | 
  
private   | 
  
 
Decode word(s) for one eFEX TOB (or xTOB) and create one RDO. 
FIXME Document other parameters when stable! 
- Parameters
 - 
  
    | tob | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
Definition at line 594 of file L1CaloBsDecoderRun3.cxx.
  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;
 
  610     if (tobSource == L1CaloRdoFexTob::TobSource::EfexXtob) {
 
  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 );
 
  640         newOne.setRodInfo( rodInfo );
 
  643         rdo.
setFlag( flagMask, sliceNum );
 
  644 #ifdef OFFLINE_DECODER 
  646        rdo.setWord0( word[0], sliceNum );
 
  647       if(tobSource == L1CaloRdoFexTob::TobSource::EfexXtob) rdo.setWord1(word[1], 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;
 
 
 
 
◆ decodePh1TopoData()
      
        
          | void L1CaloBsDecoderRun3::decodePh1TopoData  | 
          ( | 
          const uint32_t *  | 
          beg,  | 
        
        
           | 
           | 
          const uint32_t *  | 
          end,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoEfexTob > &  | 
          etob,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoJfexTob > &  | 
          jtob,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoGfexTob > &  | 
          gtob,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoMuonTob > &  | 
          mtob,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoRodInfo >::const_iterator  | 
          rodInfo  | 
        
        
           | 
          ) | 
           |  | 
        
      
 
Decode Ph1Topo input data: these are TOBs from FEXes and MuCTPI. 
We create one RDO per TOB using the value field for its Et. The flag field is used for status/error bits. 
- Parameters
 - 
  
    | beg | pointer to start of rod data payload  | 
    | end | pointer to end of rod data payload  | 
    | etob | list of eFEX TOB RDOs to be filled  | 
    | jtob | list of jFEX TOB RDOs to be filled  | 
    | gtob | list of gFEX TOB RDOs to be filled  | 
    | mtob | list of muon TOB RDOs to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
Definition at line 1549 of file L1CaloBsDecoderRun3.cxx.
 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");
 
 1586       const uint32_t fpgaErrors  =  fpgaTrailer2 & 0x3f;
 
 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;
 
 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)");
 
 1631          if (fibreType == TopoInputFibreTypes::J1 || fibreType == TopoInputFibreTypes::JF ||
 
 1632              fibreType == TopoInputFibreTypes::J2 || fibreType == TopoInputFibreTypes::JFXE) {
 
 1636          for (
size_t iTob = 0; iTob < numTobs; iTob++) {
 
 1645                                        fpgaErrors, numSlices, sliceNum, tobType, tobSource,
 
 
 
 
◆ decodePh1TopoHits()
      
        
          | void L1CaloBsDecoderRun3::decodePh1TopoHits  | 
          ( | 
          const uint32_t *  | 
          beg,  | 
        
        
           | 
           | 
          const uint32_t *  | 
          end,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoPh1TopoHit > &  | 
          hit,  | 
        
        
           | 
           | 
          std::list< L1CaloRdoRodInfo >::const_iterator  | 
          rodInfo  | 
        
        
           | 
          ) | 
           |  | 
        
      
 
Decode Ph1Topo hit results. 
The format is common to jFEX TOBs (and much like eFEX TOBs). So there could be better code reuse than this cut & paste job. 
- Parameters
 - 
  
    | beg | pointer to start of rod data payload  | 
    | end | pointer to end of rod data payload  | 
    | tob | list of RDO to be filled  | 
    | rodInfo | iterator to ROD information for this block  | 
  
   
Definition at line 1674 of file L1CaloBsDecoderRun3.cxx.
 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;
 
 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;
 
 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);
 
 1743       const int idFlag = 0;  
 
 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++ ) {
 
 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;
 
 
 
 
◆ setLogger()
  
  
      
        
          | void L1CaloBsDecoderRun3::setLogger  | 
          ( | 
          std::unique_ptr< Logging > &&  | 
          logger | ) | 
           | 
         
       
   | 
  
inline   | 
  
 
 
◆ setVerbosity()
      
        
          | void L1CaloBsDecoderRun3::setVerbosity  | 
          ( | 
          bool  | 
          verbosity | ) | 
           | 
        
      
 
 
◆ m_logger
  
  
      
        
          | std::unique_ptr<Logging> L1CaloBsDecoderRun3::m_logger | 
         
       
   | 
  
private   | 
  
 
 
◆ m_verbosity
  
  
      
        
          | int L1CaloBsDecoderRun3::m_verbosity | 
         
       
   | 
  
private   | 
  
 
 
The documentation for this class was generated from the following files:
 
static int num32BitWordsPerFibre()
 
char data[hepevt_bytes_allocation_ATLAS]
 
std::unique_ptr< Logging > m_logger
 
LayerTypeEnum getLayer() const
 
std::vector< double > Energy
 
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).
 
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
 
#define LOG_ERROR(location, title, detail)
 
void setSupercells(std::vector< uint32_t > &supercells)
 
void setValue(int val, size_t slice)
 
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.
 
setScaleOne setStatusOne saturated
 
void setHardwareInfo(uint32_t fpga, uint32_t mgt, uint32_t word, uint32_t mpod, uint32_t fibre, uint32_t overlap)
 
ICscStripFitter::Result Result
 
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.
 
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.
 
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.
 
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.
 
size_t dataSize(TDA::PayloadIterator start)
Size in bytes of the buffer that is needed to decode next fragment data content.
 
InputDataFrameType
type of input data frame
 
bool checkFibreCRC(std::vector< uint32_t > &data) const
Check the CRC in an input fibre block of words.
 
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 crc9fibre(const std::vector< uint32_t > &inwords, size_t num_bits) const
Functions calculating CRC over input data.
 
void setFlag(int flag, size_t slice)
 
@ Tau
The object is a tau (jet)
 
static Tar & findRdo(const Tar &target, Dat &data, Iter begin, Iter end)
 
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).
 
static unsigned int numAtcaFexSlots()
 
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.
 
@ Normal
Standard data frame.
 
static int numInputFibresPerFpga()