File indexing completed on 2023-03-17 10:59:45
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <unistd.h>
0012 #include <cstdlib>
0013 #include <fstream>
0014 #include <vector>
0015 #include <iostream>
0016 #include <iomanip>
0017 #include <ctime>
0018 #include <limits>
0019 #include <stdexcept>
0020 #include "EventFilter/EcalTBRawToDigi/src/MatacqRawEvent.h"
0021
0022 const MatacqTBRawEvent::field32spec_t MatacqTBRawEvent::fov32 = {0, 0x000000F0};
0023 const MatacqTBRawEvent::field32spec_t MatacqTBRawEvent::fedId32 = {0, 0x000FFF00};
0024 const MatacqTBRawEvent::field32spec_t MatacqTBRawEvent::bxId32 = {0, 0xFFF00000};
0025 const MatacqTBRawEvent::field32spec_t MatacqTBRawEvent::lv132 = {1, 0x00FFFFFF};
0026 const MatacqTBRawEvent::field32spec_t MatacqTBRawEvent::triggerType32 = {1, 0x0F000000};
0027 const MatacqTBRawEvent::field32spec_t MatacqTBRawEvent::boeType32 = {1, 0xF0000000};
0028 const MatacqTBRawEvent::field32spec_t MatacqTBRawEvent::dccLen32 = {2, 0x00FFFFFF};
0029 const MatacqTBRawEvent::field32spec_t MatacqTBRawEvent::dccErrors32 = {2, 0xFF000000};
0030 const MatacqTBRawEvent::field32spec_t MatacqTBRawEvent::runNum32 = {3, 0x00FFFFFF};
0031 const MatacqTBRawEvent::field32spec_t MatacqTBRawEvent::h1Marker32 = {3, 0xF0000000};
0032
0033 void MatacqTBRawEvent::setRawData(const unsigned char* pData, size_t maxSize) {
0034 error = 0;
0035 const int16le_t* begin16 = (const int16le_t*)pData;
0036 const int16le_t* pData16 = begin16;
0037 daqHeader = (const uint32le_t*)pData16;
0038 const int daqHeaderLen = 16;
0039 pData16 += daqHeaderLen / sizeof(pData16[0]);
0040 matacqHeader = (const matacqHeader_t*)pData16;
0041 pData16 += sizeof(matacqHeader_t) / sizeof(pData16[0]);
0042 if (getMatacqDataFormatVersion() >= 2) {
0043 tTrigPs = *((const int32_t*)pData16);
0044 pData16 += 2;
0045 } else {
0046 tTrigPs = std::numeric_limits<int>::max();
0047 }
0048 const int nCh = getChannelCount();
0049 channelData.resize(nCh);
0050 for (int iCh = 0; iCh < nCh; ++iCh) {
0051
0052 channelData[iCh].chId = *(pData16++);
0053
0054 channelData[iCh].nSamples = *(pData16++);
0055
0056 channelData[iCh].samples = pData16;
0057
0058 pData16 += channelData[iCh].nSamples;
0059 }
0060
0061
0062
0063 int padding = (4 - (pData16 - begin16)) % 4;
0064 if (padding < 0)
0065 padding += 4;
0066 pData16 += padding;
0067 const uint32le_t* trailer32 = (const uint32le_t*)(pData16);
0068 fragLen = trailer32[1] & 0xFFFFFF;
0069
0070
0071
0072
0073
0074
0075 const int nHeaders = 3;
0076 if (fragLen != read32(daqHeader, dccLen32) + nHeaders && fragLen != read32(daqHeader, dccLen32)) {
0077
0078
0079 error |= errorLengthConsistency;
0080 }
0081
0082
0083 const int trailerLen = 4;
0084 pData16 += trailerLen;
0085
0086 parsedLen = (pData16 - begin16) / 4;
0087
0088 if ((pData16 - begin16) != (4 * fragLen)) {
0089 error |= errorLength;
0090 }
0091
0092 if ((size_t)(pData16 - begin16) > maxSize) {
0093 throw std::runtime_error(std::string("Corrupted or truncated data"));
0094 }
0095
0096
0097 if (getBoe() != 0x5) {
0098 error |= errorWrongBoe;
0099 }
0100 }
0101
0102 int MatacqTBRawEvent::read32(const uint32le_t* pData, field32spec_t spec32) const {
0103 int result = pData[spec32.offset] & spec32.mask;
0104 int mask = spec32.mask;
0105 while ((mask & 0x1) == 0) {
0106 mask >>= 1;
0107 result >>= 1;
0108 }
0109 return result;
0110 }