File indexing completed on 2023-03-17 11:00:10
0001 #ifndef UCTDAQRawData_hh
0002 #define UCTDAQRawData_hh
0003
0004 #include <cstdint>
0005 #include <iostream>
0006 #include <iomanip>
0007
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "FWCore/MessageLogger/interface/MessageDrop.h"
0010
0011 class UCTDAQRawData {
0012 public:
0013 UCTDAQRawData(const uint64_t *d) : myDataPtr(d) {
0014 if (d != nullptr) {
0015 if ((d[0] & 0x5000000000000000) != 0x5000000000000000) {
0016 edm::LogError("UCTDAQRawData") << "CDF Header does not seem to be correct" << std::showbase << std::internal
0017 << std::setfill('0') << std::setw(10) << std::hex << d[0] << "; but continuing!"
0018 << std::endl;
0019 }
0020 }
0021 }
0022
0023
0024 UCTDAQRawData(const UCTDAQRawData &) = delete;
0025 const UCTDAQRawData &operator=(const UCTDAQRawData &i) = delete;
0026
0027 virtual ~UCTDAQRawData() { ; }
0028
0029
0030
0031 const uint64_t *dataPtr() const { return myDataPtr; }
0032
0033 const uint64_t *cdfHeader() const { return &myDataPtr[0]; }
0034
0035 uint32_t FOV() { return ((myDataPtr[0] & 0x00000000000000F0) >> 4); }
0036 uint32_t sourceID() { return ((myDataPtr[0] & 0x00000000000FFF00) >> 8); }
0037 uint32_t BXID() { return ((myDataPtr[0] & 0x00000000FFF00000) >> 20); }
0038 uint32_t L1ID() { return ((myDataPtr[0] & 0x00FFFFFF00000000) >> 32); }
0039 uint32_t eventType() { return ((myDataPtr[0] & 0x0F00000000000000) >> 56); }
0040 uint32_t orbitNumber() { return ((myDataPtr[1] & 0x0000000FFFFFFFF0) >> 4); }
0041 uint32_t nAMCs() { return ((myDataPtr[1] & 0x00F0000000000000) >> 52); }
0042 uint32_t uFOV() { return ((myDataPtr[1] & 0xF000000000000000) >> 60); }
0043
0044 uint32_t boardID(uint32_t amc = 0) {
0045 if (amc < nAMCs()) {
0046 return myDataPtr[2 + amc] & 0x000000000000FFFF;
0047 }
0048 edm::LogError("UCTDAQRawData") << "UCTDAQRawData: Failed to fetch board ID for AMC = " << amc
0049 << "; Max AMC = " << nAMCs() << std::endl;
0050 return 0xDEADBEEF;
0051 }
0052
0053 uint32_t amcNo(uint32_t amc = 0) {
0054 if (amc < nAMCs()) {
0055 return ((myDataPtr[2 + amc] & 0x00000000000F0000) >> 16);
0056 }
0057 edm::LogError("UCTDAQRawData") << "UCTDAQRawData: Failed to fetch amc no for AMC = " << amc
0058 << "; Max AMC = " << nAMCs() << std::endl;
0059 return 0xDEADBEEF;
0060 }
0061
0062 uint32_t amcBlkNo(uint32_t amc = 0) {
0063 if (amc < nAMCs()) {
0064 return ((myDataPtr[2 + amc] & 0x000000000FF00000) >> 20);
0065 }
0066 edm::LogError("UCTDAQRawData") << "UCTDAQRawData: Failed to fetch amc block no for AMC = " << amc
0067 << "; Max AMC = " << nAMCs() << std::endl;
0068 return 0xDEADBEEF;
0069 }
0070
0071 uint32_t amcSize(uint32_t amc = 0) {
0072 if (amc < nAMCs()) {
0073 return ((myDataPtr[2 + amc] & 0x00FFFFFF00000000) >> 32);
0074 }
0075 edm::LogError("UCTDAQRawData") << "UCTDAQRawData: Failed to fetch amc size for AMC = " << amc
0076 << "; Max AMC = " << nAMCs() << std::endl;
0077 return 0xDEADBEEF;
0078 }
0079
0080 bool crcError(uint32_t amc = 0) {
0081 if (amc < nAMCs()) {
0082 return ((myDataPtr[2 + amc] & 0x0100000000000000) != 0);
0083 }
0084 edm::LogError("UCTDAQRawData") << "UCTDAQRawData: Failed to fetch crcError-bit for AMC = " << amc
0085 << "; Max AMC = " << nAMCs() << std::endl;
0086 return false;
0087 }
0088
0089 bool isValid(uint32_t amc = 0) {
0090 if (amc < nAMCs()) {
0091 return ((myDataPtr[2 + amc] & 0x0200000000000000) != 0);
0092 }
0093 edm::LogError("UCTDAQRawData") << "UCTDAQRawData: Failed to fetch isValid-bit for AMC = " << amc
0094 << "; Max AMC = " << nAMCs() << std::endl;
0095 return false;
0096 }
0097
0098 bool isPresent(uint32_t amc = 0) {
0099 if (amc < nAMCs()) {
0100 return ((myDataPtr[2 + amc] & 0x0400000000000000) != 0);
0101 }
0102 edm::LogError("UCTDAQRawData") << "UCTDAQRawData: Failed to fetch isPresent-bit for AMC = " << amc
0103 << "; Max AMC = " << nAMCs() << std::endl;
0104 return false;
0105 }
0106
0107 bool isEnabled(uint32_t amc = 0) {
0108 if (amc < nAMCs()) {
0109 return ((myDataPtr[2 + amc] & 0x0800000000000000) != 0);
0110 }
0111 edm::LogError("UCTDAQRawData") << "UCTDAQRawData: Failed to fetch isEnabled-bit for AMC = " << amc
0112 << "; Max AMC = " << nAMCs() << std::endl;
0113 return false;
0114 }
0115
0116 bool isSegmented(uint32_t amc = 0) {
0117 if (amc < nAMCs()) {
0118 return ((myDataPtr[2 + amc] & 0x1000000000000000) != 0);
0119 }
0120 edm::LogError("UCTDAQRawData") << "UCTDAQRawData: Failed to fetch isSegmented-bit for AMC = " << amc
0121 << "; Max AMC = " << nAMCs() << std::endl;
0122 return false;
0123 }
0124
0125 bool more(uint32_t amc = 0) {
0126 if (amc < nAMCs()) {
0127 return ((myDataPtr[2 + amc] & 0x2000000000000000) != 0);
0128 }
0129 edm::LogError("UCTDAQRawData") << "UCTDAQRawData: Failed to fetch more-bit for AMC = " << amc
0130 << "; Max AMC = " << nAMCs() << std::endl;
0131 return false;
0132 }
0133
0134 bool lengthError(uint32_t amc = 0) {
0135 if (amc < nAMCs()) {
0136 return ((myDataPtr[2 + amc] & 0x4000000000000000) != 0);
0137 }
0138 edm::LogError("UCTDAQRawData") << "UCTDAQRawData: Failed to fetch length error bit for AMC = " << amc
0139 << "; Max AMC = " << nAMCs() << std::endl;
0140 return false;
0141 }
0142
0143 const uint32_t *amcPayload(uint32_t amc) {
0144 if (amc < nAMCs()) {
0145
0146 uint32_t skip = 2 + nAMCs();
0147 for (uint32_t i = 0; i < amc; i++) {
0148 skip += amcSize(i);
0149 }
0150 return (uint32_t *)&myDataPtr[skip];
0151 }
0152 edm::LogError("UCTDAQRawData") << "UCTDAQRawData: Failed to fetch payload location for AMC = " << amc
0153 << "; Max AMC = " << nAMCs() << std::endl;
0154 return nullptr;
0155 }
0156
0157 const uint64_t *amc13TrailerPtr() {
0158 uint32_t skip = 2;
0159 for (uint32_t i = 0; i < nAMCs(); i++) {
0160 skip += (1 + amcSize(i));
0161 }
0162 return &myDataPtr[skip];
0163 }
0164
0165 uint32_t amc13BXID() {
0166 const uint64_t *data = amc13TrailerPtr();
0167 return (data[0] & 0x0000000000000FFF);
0168 }
0169
0170 uint32_t amc13L1ID() {
0171 const uint64_t *data = amc13TrailerPtr();
0172 return ((data[0] & 0x00000000000FF000) >> 12);
0173 }
0174
0175 uint32_t amc13BlockNo() {
0176 const uint64_t *data = amc13TrailerPtr();
0177 return ((data[0] & 0x000000000FF00000) >> 20);
0178 }
0179
0180 uint32_t amc13CRC32() {
0181 const uint64_t *data = amc13TrailerPtr();
0182 return ((data[0] & 0xFFFFFFFF00000000) >> 32);
0183 }
0184
0185 const uint64_t *cdfTrailerPtr() {
0186 uint32_t skip = 2;
0187 for (uint32_t i = 0; i < nAMCs(); i++) {
0188 skip += (1 + amcSize(i));
0189 }
0190 skip++;
0191 const uint64_t *data = &myDataPtr[skip];
0192 if ((data[0] & 0xF000000000000000) != 0xA000000000000000) {
0193 edm::LogError("UCTDAQRawData") << "CDF Trailer seems to be wrong : " << std::showbase << std::internal
0194 << std::setfill('0') << std::setw(10) << std::hex << data[1] << std::endl;
0195 }
0196 return data;
0197 }
0198
0199 bool crcModified() {
0200 const uint64_t *data = cdfTrailerPtr();
0201 return ((data[0] & 0x0000000000000004) != 0);
0202 }
0203
0204 bool isLastTrailerWord() {
0205 const uint64_t *data = cdfTrailerPtr();
0206 return ((data[0] & 0x0000000000000008) != 0);
0207 }
0208
0209 uint32_t ttsBits() {
0210 const uint64_t *data = cdfTrailerPtr();
0211 return ((data[0] & 0x00000000000000F0) >> 4);
0212 }
0213
0214 uint32_t eventStatus() {
0215 const uint64_t *data = cdfTrailerPtr();
0216 return ((data[0] & 0x0000000000000F00) >> 8);
0217 }
0218
0219 bool isWrongFEDID() {
0220 const uint64_t *data = cdfTrailerPtr();
0221 return ((data[0] & 0x0000000000004000) != 0);
0222 }
0223
0224 bool isSLinkErrorDetectedByFRL() {
0225 const uint64_t *data = cdfTrailerPtr();
0226 return ((data[0] & 0x0000000000008000) != 0);
0227 }
0228
0229 uint32_t crc16() {
0230 const uint64_t *data = cdfTrailerPtr();
0231 return ((data[0] & 0x00000000FFFF0000) >> 16);
0232 }
0233
0234 uint32_t eventLength() {
0235 const uint64_t *data = cdfTrailerPtr();
0236 return ((data[0] & 0x00FFFFFF00000000) >> 32);
0237 }
0238
0239 void print() {
0240 using namespace std;
0241 LogDebug("UCTDAQRawData") << "Common cDAQ/AMC13 Data Header:" << endl;
0242 LogDebug("UCTDAQRawData") << "Framework Version = " << internal << setfill('0') << setw(3) << hex << FOV() << endl;
0243 LogDebug("UCTDAQRawData") << "sourceID......... = " << dec << sourceID() << endl;
0244 LogDebug("UCTDAQRawData") << "BXID............. = " << dec << BXID() << endl;
0245 LogDebug("UCTDAQRawData") << "L1ID............. = " << internal << setfill('0') << setw(8) << hex << L1ID() << endl;
0246 LogDebug("UCTDAQRawData") << "eventType........ = " << internal << setfill('0') << setw(3) << hex << eventType()
0247 << endl;
0248 LogDebug("UCTDAQRawData") << "orbitNo.......... = " << dec << orbitNumber() << endl;
0249 LogDebug("UCTDAQRawData") << "uFOV............. = " << internal << setfill('0') << setw(8) << hex << uFOV() << endl;
0250 LogDebug("UCTDAQRawData") << "# of CTP7s....... = " << dec << nAMCs() << endl;
0251 LogDebug("UCTDAQRawData")
0252 << "Phi SlotNo BlockNo Size CRC? Valid? Present? Enabled? Segmented? More? LengthError?" << endl;
0253 for (uint32_t i = 0; i < nAMCs(); i++) {
0254 LogDebug("UCTDAQRawData") << dec << setfill(' ') << setw(3) << boardID(i) << " " << dec << setfill(' ') << setw(6)
0255 << amcNo(i) << " " << dec << setfill(' ') << setw(7) << amcBlkNo(i) << " " << dec
0256 << setfill(' ') << setw(8) << amcSize(i) << " "
0257 << " " << crcError(i) << " "
0258 << " " << isValid(i) << " "
0259 << " " << isPresent(i) << " "
0260 << " " << isEnabled(i) << " "
0261 << " " << isSegmented(i) << " "
0262 << " " << more(i) << " "
0263 << " " << lengthError(i) << endl;
0264 }
0265 LogDebug("UCTDAQRawData") << "AMC13 Trailer:" << endl;
0266 LogDebug("UCTDAQRawData") << "AMC13 BXID....... = " << dec << amc13BXID() << endl;
0267 LogDebug("UCTDAQRawData") << "AMC13 L1ID....... = " << dec << amc13L1ID() << endl;
0268 LogDebug("UCTDAQRawData") << "AMC13 BlockNo.... = " << dec << amc13BlockNo() << endl;
0269 LogDebug("UCTDAQRawData") << "AMC13 CRC32...... = " << internal << setfill('0') << setw(10) << hex << amc13BXID()
0270 << endl;
0271 LogDebug("UCTDAQRawData") << "Common DAQ Trailer:" << endl;
0272 LogDebug("UCTDAQRawData") << "CRC Modified?.... = " << crcModified() << endl;
0273 LogDebug("UCTDAQRawData") << "Last Trailer Word?= " << isLastTrailerWord() << endl;
0274 LogDebug("UCTDAQRawData") << "ttsBits.......... = " << internal << setfill('0') << setw(3) << hex << ttsBits()
0275 << endl;
0276 LogDebug("UCTDAQRawData") << "Event Status..... = " << internal << setfill('0') << setw(3) << hex << eventStatus()
0277 << endl;
0278 LogDebug("UCTDAQRawData") << "Wrong FED ID?.... = " << isWrongFEDID() << endl;
0279 LogDebug("UCTDAQRawData") << "SLink Error?..... = " << isSLinkErrorDetectedByFRL() << endl;
0280 LogDebug("UCTDAQRawData") << "CRC 16........... = " << internal << setfill('0') << setw(6) << hex << crc16()
0281 << endl;
0282 LogDebug("UCTDAQRawData") << "Event Length..... = " << dec << eventLength() << endl;
0283 }
0284
0285 private:
0286
0287
0288 const uint64_t *myDataPtr;
0289 };
0290
0291 #endif