Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:10:35

0001 #include "EventFilter/EcalRawToDigi/interface/DCCSRPBlock.h"
0002 #include "EventFilter/EcalRawToDigi/interface/DCCEventBlock.h"
0003 #include "EventFilter/EcalRawToDigi/interface/EcalElectronicsMapper.h"
0004 #include "EventFilter/EcalRawToDigi/interface/DCCDataUnpacker.h"
0005 
0006 DCCSRPBlock::DCCSRPBlock(DCCDataUnpacker* u, EcalElectronicsMapper* m, DCCEventBlock* e, bool unpack)
0007     : DCCDataBlockPrototype(u, m, e, unpack) {
0008   // Todo : include data integrity collections
0009   blockLength_ = SRP_BLOCKLENGTH;
0010   // Set SR flags to zero
0011   for (unsigned int i = 0; i < SRP_NUMBFLAGS; i++) {
0012     srFlags_[i] = 0;
0013   }
0014 }
0015 
0016 int DCCSRPBlock::unpack(const uint64_t** data, unsigned int* dwToEnd, unsigned int numbFlags) {
0017   // Set SR flags to zero
0018   for (unsigned int i = 0; i < SRP_NUMBFLAGS; i++) {
0019     srFlags_[i] = 0;
0020   }
0021 
0022   expNumbSrFlags_ = numbFlags;
0023   error_ = false;
0024   datap_ = data;
0025   data_ = *data;
0026   dwToEnd_ = dwToEnd;
0027 
0028   // Check SRP Length
0029   if ((*dwToEnd_) < blockLength_) {
0030     if (!DCCDataUnpacker::silentMode_) {
0031       edm::LogWarning("IncorrectEvent") << "\n Event " << l1_ << "\n Unable to unpack SRP block for event "
0032                                         << event_->l1A() << " in fed <<" << mapper_->getActiveDCC() << "\n Only "
0033                                         << ((*dwToEnd_) * 8) << " bytes are available while " << (blockLength_ * 8)
0034                                         << " are needed!";
0035     }
0036 
0037     //Note : add to error collection
0038 
0039     return STOP_EVENT_UNPACKING;
0040   }
0041 
0042   // Point to begin of block
0043   data_++;
0044 
0045   srpId_ = (*data_) & SRP_ID_MASK;
0046   bx_ = (*data_ >> SRP_BX_B) & SRP_BX_MASK;
0047   l1_ = (*data_ >> SRP_L1_B) & SRP_L1_MASK;
0048   nSRFlags_ = (*data_ >> SRP_NFLAGS_B) & SRP_NFLAGS_MASK;
0049 
0050   event_->setSRPSyncNumbers(l1_, bx_);
0051 
0052   if (!checkSrpIdAndNumbSRFlags()) {
0053     //// SRP flags are required to check FE data
0054     //return  STOP_EVENT_UNPACKING;
0055     updateEventPointers();
0056     return SKIP_BLOCK_UNPACKING;
0057   }
0058 
0059   // Check synchronization
0060   if (sync_) {
0061     const unsigned int dccL1 = (event_->l1A()) & SRP_L1_MASK;
0062     const unsigned int dccBx = (event_->bx()) & SRP_BX_MASK;
0063     const unsigned int fov = (event_->fov()) & H_FOV_MASK;
0064 
0065     if (!isSynced(dccBx, bx_, dccL1, l1_, TCC_SRP, fov)) {
0066       if (!DCCDataUnpacker::silentMode_) {
0067         edm::LogWarning("IncorrectEvent")
0068             << "Synchronization error for SRP block"
0069             << " (L1A " << event_->l1A() << " bx " << event_->bx() << " fed " << mapper_->getActiveDCC() << ")\n"
0070             << "  dccBx = " << dccBx << " bx_ = " << bx_ << " dccL1 = " << dccL1 << " l1_ = " << l1_ << "\n"
0071             << "  => Stop event unpacking";
0072       }
0073       //Note : add to error collection ?
0074       //// SRP flags are required to check FE , better using synchronized data...
0075       //       return STOP_EVENT_UNPACKING;
0076       updateEventPointers();
0077       return SKIP_BLOCK_UNPACKING;
0078     }
0079   }
0080 
0081   // initialize array, protecting in case of inconsistently formatted data
0082   for (int dccCh = 0; dccCh < SRP_NUMBFLAGS; dccCh++)
0083     srFlags_[dccCh] = 0;
0084 
0085   //display(cout);
0086   addSRFlagToCollection();
0087 
0088   updateEventPointers();
0089 
0090   return true;
0091 }
0092 
0093 void DCCSRPBlock::display(std::ostream& o) {
0094   o << "\n Unpacked Info for SRP Block"
0095     << "\n DW1 ============================="
0096     << "\n SRP Id " << srpId_ << "\n Numb Flags " << nSRFlags_ << "\n Bx " << bx_ << "\n L1 " << l1_;
0097 
0098   for (unsigned int i = 0; i < SRP_NUMBFLAGS; i++) {
0099     o << "\n SR flag " << (i + 1) << " = " << (srFlags_[i]);
0100   }
0101 }