Back to home page

Project CMSSW displayed by LXR

 
 

    


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

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   // No copy constructor and equality operator are needed
0024   UCTDAQRawData(const UCTDAQRawData &) = delete;
0025   const UCTDAQRawData &operator=(const UCTDAQRawData &i) = delete;
0026 
0027   virtual ~UCTDAQRawData() { ; }
0028 
0029   // Access functions for convenience
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       // Number of 64-bit words to skip
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   // RawData data
0287 
0288   const uint64_t *myDataPtr;
0289 };
0290 
0291 #endif