Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
#include "EventFilter/EcalRawToDigi/interface/DCCTCCBlock.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "EventFilter/EcalRawToDigi/interface/EcalElectronicsMapper.h"
#include "EventFilter/EcalRawToDigi/interface/DCCDataUnpacker.h"
#include "EventFilter/EcalRawToDigi/interface/DCCEventBlock.h"

DCCTCCBlock::DCCTCCBlock(DCCDataUnpacker* u, EcalElectronicsMapper* m, DCCEventBlock* e, bool unpack)
    : DCCDataBlockPrototype(u, m, e, unpack) {}

int DCCTCCBlock::unpack(const uint64_t** data, unsigned int* dwToEnd, short tccChId) {
  dwToEnd_ = dwToEnd;
  datap_ = data;
  data_ = *data;

  // Need at least 1 dw to findout if pseudo-strips readout is enabled
  if (*dwToEnd == 1) {
    if (!DCCDataUnpacker::silentMode_) {
      edm::LogWarning("IncorrectEvent") << "EcalRawToDigi@SUB=DCCTCCBlock:unpack"
                                        << "\n Unable to unpack TCC block for event " << event_->l1A() << " in fed "
                                        << mapper_->getActiveDCC()
                                        << "\n Only 8 bytes are available until the end of event ..."
                                        << "\n => Skipping to next fed block...";
    }

    //todo : add this to error colection

    return STOP_EVENT_UNPACKING;
  }

  blockLength_ = getLength();

  if ((*dwToEnd_) < blockLength_) {
    if (!DCCDataUnpacker::silentMode_) {
      edm::LogWarning("IncorrectEvent") << "EcalRawToDigi@SUB=DCCTCCBlock:unpack"
                                        << "\n Unable to unpack TCC block for event " << event_->l1A() << " in fed "
                                        << mapper_->getActiveDCC() << "\n Only " << ((*dwToEnd_) * 8)
                                        << " bytes are available until the end of event while " << (blockLength_ * 8)
                                        << " are needed!"
                                        << "\n => Skipping to next fed block...";
    }

    //todo : add this to error colection

    return STOP_EVENT_UNPACKING;
  }

  if (unpackInternalData_) {
    //  Go to the begining of the tcc block
    data_++;

    tccId_ = (*data_) & TCC_ID_MASK;
    ps_ = (*data_ >> TCC_PS_B) & B_MASK;
    bx_ = (*data_ >> TCC_BX_B) & TCC_BX_MASK;
    l1_ = (*data_ >> TCC_L1_B) & TCC_L1_MASK;
    nTTs_ = (*data_ >> TCC_TT_B) & TCC_TT_MASK;
    nTSamples_ = (*data_ >> TCC_TS_B) & TCC_TS_MASK;

    event_->setTCCSyncNumbers(l1_, bx_, tccChId);

    if (!checkTccIdAndNumbTTs()) {
      updateEventPointers();
      return SKIP_BLOCK_UNPACKING;
    }

    // Check synchronization
    if (sync_) {
      const unsigned int dccBx = (event_->bx()) & TCC_BX_MASK;
      const unsigned int dccL1 = (event_->l1A()) & TCC_L1_MASK;
      const unsigned int fov = (event_->fov()) & H_FOV_MASK;

      if (!isSynced(dccBx, bx_, dccL1, l1_, TCC_SRP, fov)) {
        if (!DCCDataUnpacker::silentMode_) {
          edm::LogWarning("IncorrectBlock")
              << "Synchronization error for TCC block"
              << " (L1A " << event_->l1A() << " bx " << event_->bx() << " fed " << mapper_->getActiveDCC() << ")\n"
              << "  dccBx = " << dccBx << " bx_ = " << bx_ << " dccL1 = " << dccL1 << " l1_ = " << l1_ << "\n"
              << "  => TCC block skipped";
        }

        //Note : add to error collection ?
        updateEventPointers();
        return SKIP_BLOCK_UNPACKING;
      }
    }

    //check numb of samples
    /*  
    unsigned int expTriggerTSamples(mapper_->numbTriggerTSamples());
    
    if( nTSamples_ != expTriggerTSamples ){
      edm::LogWarning("IncorrectBlock")
        <<"Unable to unpack TCC block for event "<<event_->l1A()<<" in fed "<<mapper_->getActiveDCC()
        <<"\n Number of time samples is "<<nTSamples_<<" while "<<expTriggerTSamples<<" is expected"
        <<"\n TCC block skipped..."<<endl;
                
       //Note : add to error collection ?
           updateEventPointers();                 
      return SKIP_BLOCK_UNPACKING;
    }
    */

    // debugging
    // display(cout);

    addTriggerPrimitivesToCollection();
  }

  updateEventPointers();
  return BLOCK_UNPACKED;
}

void DCCTCCBlock::display(std::ostream& o) {
  o << "\n Unpacked Info for DCC TCC Block"
    << "\n DW1 ============================="
    << "\n TCC Id " << tccId_ << "\n Bx " << bx_ << "\n L1 " << l1_ << "\n Numb TT " << nTTs_ << "\n Numb Samp "
    << nTSamples_;
}