File indexing completed on 2024-04-06 12:10:30
0001 #include "EventFilter/CTPPSRawToDigi/interface/RPixErrorChecker.h"
0002
0003 #include "DataFormats/FEDRawData/interface/FEDHeader.h"
0004 #include "DataFormats/FEDRawData/interface/FEDTrailer.h"
0005
0006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0007
0008 using namespace edm;
0009
0010 constexpr RPixErrorChecker::Word32 RPixErrorChecker::dummyDetId;
0011
0012 RPixErrorChecker::RPixErrorChecker() { includeErrors_ = false; }
0013
0014 void RPixErrorChecker::setErrorStatus(bool errorStatus) { includeErrors_ = errorStatus; }
0015
0016 bool RPixErrorChecker::checkCRC(bool& errorsInEvent, int fedId, const Word64* trailer, Errors& errors) const {
0017 int CRC_BIT = (*trailer >> CRC_shift) & CRC_mask;
0018 if (CRC_BIT == 0)
0019 return true;
0020 errorsInEvent = true;
0021 LogDebug("CRCCheck") << "CRC check failed, errorType = 39";
0022 if (includeErrors_) {
0023 int errorType = 39;
0024 errors[dummyDetId].emplace_back(*trailer, errorType, fedId);
0025 }
0026 return false;
0027 }
0028
0029 bool RPixErrorChecker::checkHeader(bool& errorsInEvent, int fedId, const Word64* header, Errors& errors) const {
0030 FEDHeader fedHeader(reinterpret_cast<const unsigned char*>(header));
0031 if (!fedHeader.check())
0032 return false;
0033 if (fedHeader.sourceID() != fedId) {
0034 LogDebug("CTPPSPixelDataFormatter::interpretRawData, fedHeader.sourceID() != fedId")
0035 << ", sourceID = " << fedHeader.sourceID() << ", fedId = " << fedId << ", errorType = 32";
0036 errorsInEvent = true;
0037 if (includeErrors_) {
0038 int errorType = 32;
0039 errors[dummyDetId].emplace_back(*header, errorType, fedId);
0040 }
0041 }
0042 return fedHeader.moreHeaders();
0043 }
0044
0045 bool RPixErrorChecker::checkTrailer(
0046 bool& errorsInEvent, int fedId, unsigned int nWords, const Word64* trailer, Errors& errors) const {
0047 FEDTrailer fedTrailer(reinterpret_cast<const unsigned char*>(trailer));
0048 if (!fedTrailer.check()) {
0049 if (includeErrors_) {
0050 int errorType = 33;
0051 errors[dummyDetId].emplace_back(*trailer, errorType, fedId);
0052 }
0053 errorsInEvent = true;
0054 LogDebug("FedTrailerCheck") << "fedTrailer.check failed, Fed: " << fedId << ", errorType = 33";
0055 return false;
0056 }
0057 if (fedTrailer.fragmentLength() != nWords) {
0058 LogDebug("FedTrailerLenght") << "fedTrailer.fragmentLength()!= nWords !! Fed: " << fedId << ", errorType = 34";
0059 errorsInEvent = true;
0060 if (includeErrors_) {
0061 int errorType = 34;
0062 errors[dummyDetId].emplace_back(*trailer, errorType, fedId);
0063 }
0064 }
0065 return fedTrailer.moreTrailers();
0066 }
0067
0068 bool RPixErrorChecker::checkROC(
0069 bool& errorsInEvent, int fedId, uint32_t iD, const Word32& errorWord, Errors& errors) const {
0070 int errorType = (errorWord >> ROC_shift) & ERROR_mask;
0071 if LIKELY (errorType < 25)
0072 return true;
0073
0074 switch (errorType) {
0075 case (25): {
0076 LogDebug("") << " invalid ROC=25 found (errorType=25)";
0077 errorsInEvent = true;
0078 break;
0079 }
0080 case (26): {
0081 LogDebug("") << " gap word found (errorType=26)";
0082 return false;
0083 }
0084 case (27): {
0085 LogDebug("") << " dummy word found (errorType=27)";
0086 return false;
0087 }
0088 case (28): {
0089 LogDebug("") << " error fifo nearly full (errorType=28)";
0090 errorsInEvent = true;
0091 break;
0092 }
0093 case (29): {
0094 LogDebug("") << " timeout on a channel (errorType=29)";
0095 errorsInEvent = true;
0096 if ((errorWord >> OMIT_ERR_shift) & OMIT_ERR_mask) {
0097 LogDebug("") << " ...first errorType=29 error, this gets masked out";
0098 return false;
0099 }
0100 break;
0101 }
0102 case (30): {
0103 LogDebug("") << " TBM error trailer (errorType=30)";
0104 errorsInEvent = true;
0105 break;
0106 }
0107 case (31): {
0108 LogDebug("") << " event number error (errorType=31)";
0109 errorsInEvent = true;
0110 break;
0111 }
0112 default:
0113 return true;
0114 };
0115
0116 if (includeErrors_) {
0117
0118 if (errorType == 30) {
0119 uint32_t stateMach_bits = 4;
0120 uint32_t stateMach_shift = 8;
0121 uint32_t stateMach_mask = ~(~uint32_t(0) << stateMach_bits);
0122 uint32_t stateMach = (errorWord >> stateMach_shift) & stateMach_mask;
0123 if (stateMach == 4 || stateMach == 9)
0124 errorType = 40;
0125 }
0126
0127
0128 errors[iD].emplace_back(errorWord, errorType, fedId);
0129 }
0130
0131 return false;
0132 }
0133
0134 void RPixErrorChecker::conversionError(
0135 int fedId, uint32_t iD, const State& state, const Word32& errorWord, Errors& errors) const {
0136 int errorType = 0;
0137
0138 switch (state) {
0139 case (InvalidLinkId): {
0140 LogDebug("ErrorChecker::conversionError") << " Fed: " << fedId << " invalid channel Id (errorType=35)";
0141 errorType = 35;
0142 break;
0143 }
0144 case (InvalidROCId): {
0145 LogDebug("ErrorChecker::conversionError") << " Fed: " << fedId << " invalid ROC Id (errorType=36)";
0146 errorType = 36;
0147 break;
0148 }
0149 case (InvalidPixelId): {
0150 LogDebug("ErrorChecker::conversionError") << " Fed: " << fedId << " invalid dcol/pixel value (errorType=37)";
0151 errorType = 37;
0152 break;
0153 }
0154
0155 default:
0156 LogDebug("ErrorChecker::conversionError") << " cabling check returned unexpected result, status = " << state;
0157 };
0158
0159 if (includeErrors_ && errorType > 0)
0160 errors[iD].emplace_back(errorWord, errorType, fedId);
0161 }