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
0009 blockLength_ = SRP_BLOCKLENGTH;
0010
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
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
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
0038
0039 return STOP_EVENT_UNPACKING;
0040 }
0041
0042
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
0054
0055 updateEventPointers();
0056 return SKIP_BLOCK_UNPACKING;
0057 }
0058
0059
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
0074
0075
0076 updateEventPointers();
0077 return SKIP_BLOCK_UNPACKING;
0078 }
0079 }
0080
0081
0082 for (int dccCh = 0; dccCh < SRP_NUMBFLAGS; dccCh++)
0083 srFlags_[dccCh] = 0;
0084
0085
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 }