File indexing completed on 2024-04-06 12:11:00
0001 #include "EventFilter/SiPixelRawToDigi/interface/ErrorCheckerBase.h"
0002
0003 #include "CondFormats/SiPixelObjects/interface/SiPixelFrameConverter.h"
0004
0005 #include "DataFormats/DetId/interface/DetId.h"
0006 #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h"
0007 #include "DataFormats/FEDRawData/interface/FEDHeader.h"
0008 #include "DataFormats/FEDRawData/interface/FEDTrailer.h"
0009
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011
0012 #include <bitset>
0013 #include <sstream>
0014 #include <iostream>
0015
0016 using namespace std;
0017 using namespace edm;
0018 using namespace sipixelobjects;
0019 using namespace sipixelconstants;
0020
0021 ErrorCheckerBase::ErrorCheckerBase() : includeErrors_(false) {}
0022
0023 void ErrorCheckerBase::setErrorStatus(bool ErrorStatus) { includeErrors_ = ErrorStatus; }
0024
0025 void ErrorCheckerBase::addErrorToCollectionDummy(int errorType,
0026 int fedId,
0027 Word64 word,
0028 SiPixelFormatterErrors& errors) const {
0029 if (includeErrors_) {
0030 SiPixelRawDataError error(word, errorType, fedId);
0031 errors[sipixelconstants::dummyDetId].push_back(error);
0032 }
0033 }
0034
0035 bool ErrorCheckerBase::checkCRC(bool& errorsInEvent,
0036 int fedId,
0037 const Word64* trailer,
0038 SiPixelFormatterErrors& errors) const {
0039 const int CRC_BIT = (*trailer >> CRC_shift) & CRC_mask;
0040 const bool isCRCcorrect = (CRC_BIT == 0);
0041 if (!isCRCcorrect)
0042 addErrorToCollectionDummy(39, fedId, *trailer, errors);
0043 errorsInEvent = (errorsInEvent || !isCRCcorrect);
0044 return isCRCcorrect;
0045 }
0046
0047 bool ErrorCheckerBase::checkHeader(bool& errorsInEvent,
0048 int fedId,
0049 const Word64* header,
0050 SiPixelFormatterErrors& errors) const {
0051 FEDHeader fedHeader(reinterpret_cast<const unsigned char*>(header));
0052 const bool fedHeaderCorrect = fedHeader.check();
0053
0054 if (fedHeaderCorrect && (fedHeader.sourceID() != fedId)) {
0055 int errorType = 32;
0056 addErrorToCollectionDummy(errorType, fedId, *header, errors);
0057 LogDebug("PixelDataFormatter::interpretRawData, fedHeader.sourceID() != fedId")
0058 << ", sourceID = " << fedHeader.sourceID() << ", fedId = " << fedId << ", errorType = " << errorType;
0059 errorsInEvent = true;
0060 }
0061 return fedHeaderCorrect && fedHeader.moreHeaders();
0062 }
0063
0064 bool ErrorCheckerBase::checkTrailer(
0065 bool& errorsInEvent, int fedId, unsigned int nWords, const Word64* trailer, SiPixelFormatterErrors& errors) const {
0066 FEDTrailer fedTrailer(reinterpret_cast<const unsigned char*>(trailer));
0067 const bool fedTrailerCorrect = fedTrailer.check();
0068 if (!fedTrailerCorrect) {
0069 int errorType = 33;
0070 addErrorToCollectionDummy(errorType, fedId, *trailer, errors);
0071 LogError("FedTrailerCheck") << "fedTrailer.check failed, Fed: " << fedId << ", errorType = " << errorType;
0072 errorsInEvent = true;
0073 } else if (fedTrailer.fragmentLength() != nWords) {
0074 int errorType = 34;
0075 addErrorToCollectionDummy(errorType, fedId, *trailer, errors);
0076 LogError("FedTrailerLenght") << "fedTrailer.fragmentLength()!= nWords !! Fed: " << fedId
0077 << ", errorType = " << errorType;
0078 errorsInEvent = true;
0079 }
0080 return fedTrailerCorrect && fedTrailer.moreTrailers();
0081 }
0082
0083 void ErrorCheckerBase::conversionError(int fedId,
0084 const SiPixelFrameConverter* converter,
0085 int status,
0086 Word32& errorWord,
0087 SiPixelFormatterErrors& errors) const {
0088 const int errorType = getConversionErrorTypeAndIssueLogMessage(status, fedId);
0089
0090 if (errorType && includeErrors_) {
0091 SiPixelRawDataError error(errorWord, errorType, fedId);
0092 cms_uint32_t detId = errorDetId(converter, errorType, errorWord);
0093 errors[detId].push_back(error);
0094 }
0095 }
0096
0097 int ErrorCheckerBase::getConversionErrorTypeAndIssueLogMessage(int status, int fedId) const {
0098 int errorType = 0;
0099 std::string debugMessage;
0100 switch (status) {
0101 case (1): {
0102 debugMessage = "invalid channel Id";
0103 errorType = 35;
0104 break;
0105 }
0106 case (2): {
0107 debugMessage = "invalid ROC Id";
0108 errorType = 36;
0109 break;
0110 }
0111 case (3): {
0112 debugMessage = "invalid dcol/pixel value";
0113 errorType = 37;
0114 break;
0115 }
0116 case (4): {
0117 debugMessage = "dcol/pixel read out of order";
0118 errorType = 38;
0119 break;
0120 }
0121 };
0122 if (errorType) {
0123 LogDebug("ErrorChecker::conversionError") << "Fed:" << fedId << debugMessage << "(errorType =" << errorType << ")";
0124 } else {
0125 LogDebug("ErrorChecker::conversionError") << "cabling check returned unexpected result, status =" << status;
0126 }
0127 return errorType;
0128 }