11 const std::ios_base::fmtflags originalFormatFlags = os.flags();
12 os << std::hex << std::setfill(
'0') << std::setw(2);
13 os << uint16_t(value);
14 os.flags(originalFormatFlags);
17 void printHexWord(
const uint8_t* pointer,
const size_t lengthInBytes, std::ostream& os) {
18 size_t i = lengthInBytes - 1;
26 void printHex(
const void* pointer,
const size_t lengthInBytes, std::ostream& os) {
27 const uint8_t* bytePointer =
reinterpret_cast<const uint8_t*
>(pointer);
29 if (lengthInBytes <= 8) {
35 os <<
"word\tbyte\t \t\tbyte" << std::endl;
37 const size_t words = lengthInBytes / 8;
38 const size_t extraBytes = lengthInBytes - 8 * words;
40 for (
size_t w = 0;
w < words;
w++) {
41 const size_t startByte =
w * 8;
42 os <<
w <<
'\t' << startByte + 8 <<
'\t';
44 os <<
"\t\t" << startByte << std::endl;
48 const size_t startByte = words * 8;
49 os << words <<
'\t' << startByte + 8 <<
'\t';
52 while (p-- > extraBytes) {
56 os <<
"\t\t" << startByte << std::endl;
63 uint16_t crc = 0xFFFF;
64 for (
size_t i = 0;
i < lengthInBytes - 8;
i++) {
67 for (
size_t i = lengthInBytes - 8;
i < lengthInBytes;
i++) {
70 if (
i == lengthInBytes - 4 ||
i == lengthInBytes - 3)
118 os <<
"Unrecognized";
130 os <<
"(L) Scope mode";
133 os <<
"(L) Virgin raw (real)";
136 os <<
"(L) Virgin raw (fake)";
139 os <<
"(L) Processed raw (real)";
142 os <<
"(L) Processed raw (fake)";
145 os <<
"(L) Zero suppressed (real)";
148 os <<
"(L) Zero suppressed (fake)";
151 os <<
"(L) Zero suppressed lite (real)";
154 os <<
"(L) Zero suppressed lite (fake)";
157 os <<
"(L) Spy channel";
160 os <<
"(L) PreMix raw";
166 os <<
"(L) Unrecognized";
184 os <<
"Processed raw";
187 os <<
"Zero suppressed";
190 os <<
"Zero suppressed (fake)";
193 os <<
"Zero suppressed lite";
202 os <<
"Zero suppressed lite CM Override";
205 os <<
"Zero suppressed lite (8 bit, top-stripped)";
208 os <<
"Zero suppressed lite CM Override (8 bit, top-stripped)";
211 os <<
"Zero suppressed lite (8 bit, bottom-stripped)";
214 os <<
"Zero suppressed lite CM Override (8 bit, bottom-stripped)";
217 os <<
"Zero suppressed lite (8 bit, top/bottom-stripped)";
220 os <<
"Zero suppressed lite CM Override (8 bit, top/bottom-stripped)";
229 os <<
"Unrecognized";
241 os <<
"Physics trigger";
244 os <<
"Calibration trigger";
247 os <<
"Test trigger";
250 os <<
"Technical trigger";
253 os <<
"Simulated event";
256 os <<
"Traced event";
265 os <<
"Unrecognized";
277 os <<
"Disconected 0";
280 os <<
"Warning overflow";
298 os <<
"Disconected 1";
301 os <<
"Unrecognized";
319 os <<
"Partial Full";
325 os <<
"Unrecognized";
338 os <<
"Out-of-sync ";
340 os <<
"APV 1 bad address ";
342 os <<
"APV 1 error ";
344 os <<
"APV 0 bad address ";
346 os <<
"APV 0 error ";
353 if ((bufferFormatString ==
"OLD_VME") || (bufferFormatString ==
"BUFFER_FORMAT_OLD_VME") ||
354 (bufferFormatString ==
"Old VME")) {
357 if ((bufferFormatString ==
"OLD_SLINK") || (bufferFormatString ==
"BUFFER_FORMAT_OLD_SLINK") ||
358 (bufferFormatString ==
"Old S-Link")) {
361 if ((bufferFormatString ==
"NEW") || (bufferFormatString ==
"BUFFER_FORMAT_NEW") || (bufferFormatString ==
"New")) {
369 if ((headerTypeString ==
"FULL_DEBUG") || (headerTypeString ==
"HEADER_TYPE_FULL_DEBUG") ||
370 (headerTypeString ==
"Full debug")) {
373 if ((headerTypeString ==
"APV_ERROR") || (headerTypeString ==
"HEADER_TYPE_APV_ERROR") ||
374 (headerTypeString ==
"APV error")) {
377 if ((headerTypeString ==
"None") || (headerTypeString ==
"none")) {
385 if ((readoutModeString ==
"READOUT_MODE_SCOPE") || (readoutModeString ==
"SCOPE") ||
386 (readoutModeString ==
"SCOPE_MODE") || (readoutModeString ==
"Scope mode")) {
389 if ((readoutModeString ==
"READOUT_MODE_VIRGIN_RAW") || (readoutModeString ==
"VIRGIN_RAW") ||
390 (readoutModeString ==
"Virgin raw")) {
393 if ((readoutModeString ==
"READOUT_MODE_PROC_RAW") || (readoutModeString ==
"PROC_RAW") ||
394 (readoutModeString ==
"PROCESSED_RAW") || (readoutModeString ==
"Processed raw")) {
397 if ((readoutModeString ==
"READOUT_MODE_ZERO_SUPPRESSED") || (readoutModeString ==
"ZERO_SUPPRESSED") ||
398 (readoutModeString ==
"Zero suppressed")) {
401 if ((readoutModeString ==
"READOUT_MODE_ZERO_SUPPRESSED_LITE8") || (readoutModeString ==
"ZERO_SUPPRESSED_LITE8") ||
402 (readoutModeString ==
"Zero suppressed lite8")) {
405 if ((readoutModeString ==
"READOUT_MODE_ZERO_SUPPRESSED_LITE8_TOPBOT") ||
406 (readoutModeString ==
"ZERO_SUPPRESSED_LITE8_TOPBOT") ||
407 (readoutModeString ==
"Zero suppressed lite8 TopBot")) {
410 if ((readoutModeString ==
"READOUT_MODE_ZERO_SUPPRESSED_LITE8_BOTBOT") ||
411 (readoutModeString ==
"ZERO_SUPPRESSED_LITE8_BOTBOT") ||
412 (readoutModeString ==
"Zero suppressed lite8 BotBot")) {
415 if ((readoutModeString ==
"READOUT_MODE_ZERO_SUPPRESSED_LITE10") ||
416 (readoutModeString ==
"ZERO_SUPPRESSED_LITE10") || (readoutModeString ==
"Zero suppressed lite10")) {
419 if ((readoutModeString ==
"READOUT_MODE_PREMIX_RAW") || (readoutModeString ==
"PREMIX_RAW") ||
420 (readoutModeString ==
"PreMix Raw")) {
423 if ((readoutModeString ==
"READOUT_MODE_SPY") || (readoutModeString ==
"SPY") ||
424 (readoutModeString ==
"Spy channel")) {
432 if (packetCode ==
"ZERO_SUPPRESSED" || packetCode ==
"Zero suppressed") {
434 }
else if (packetCode ==
"ZERO_SUPPRESSED10" || packetCode ==
"Zero suppressed 10") {
436 }
else if (packetCode ==
"ZERO_SUPPRESSED8_BOTBOT" || packetCode ==
"Zero suppressed 8 BOTBOT") {
438 }
else if (packetCode ==
"ZERO_SUPPRESSED8_TOPBOT" || packetCode ==
"Zero suppressed 8 TOPBOT") {
442 <<
"'" << packetCode <<
"' cannot be converted into a valid packet code for FEDReadoutMode ZERO_SUPPRESSED";
445 if (packetCode ==
"VIRGIN_RAW" || packetCode ==
"Virgin raw") {
447 }
else if (packetCode ==
"VIRGIN_RAW10" || packetCode ==
"Virgin raw 10") {
449 }
else if (packetCode ==
"VIRGIN_RAW8_BOTBOT" || packetCode ==
"Virgin raw 8 BOTBOT") {
451 }
else if (packetCode ==
"VIRGIN_RAW8_TOPBOT" || packetCode ==
"Virgin raw 8 TOPBOT") {
455 <<
"'" << packetCode <<
"' cannot be converted into a valid packet code for FEDReadoutMode VIRGIN_RAW";
458 if (packetCode ==
"PROC_RAW" || packetCode ==
"Processed raw") {
460 }
else if (packetCode ==
"PROC_RAW10" || packetCode ==
"Processed raw 10") {
462 }
else if (packetCode ==
"PROC_RAW8_BOTBOT" || packetCode ==
"Processed raw 8 BOTBOT") {
464 }
else if (packetCode ==
"PROC_RAW8_TOPBOT" || packetCode ==
"Processed raw 8 TOPBOT") {
468 <<
"'" << packetCode <<
"' cannot be converted into a valid packet code for FEDReadoutMode PROC_RAW";
471 if (packetCode ==
"SCOPE" || packetCode ==
"Scope" || packetCode.empty()) {
475 <<
"'" << packetCode <<
"' cannot be converted into a valid packet code for FEDReadoutMode SCOPE";
478 if (!packetCode.empty()) {
479 throw cms::Exception(
"FEDBuffer") <<
"Packet codes are only needed for zero-suppressed (non-lite), virgin raw, " 480 "processed raw and spy data. FEDReadoutMode=" 481 << mode <<
" and packetCode='" << packetCode <<
"'";
488 if ((daqEventTypeString ==
"PHYSICS") || (daqEventTypeString ==
"DAQ_EVENT_TYPE_PHYSICS") ||
489 (daqEventTypeString ==
"Physics trigger")) {
492 if ((daqEventTypeString ==
"CALIBRATION") || (daqEventTypeString ==
"DAQ_EVENT_TYPE_CALIBRATION") ||
493 (daqEventTypeString ==
"Calibration trigger")) {
496 if ((daqEventTypeString ==
"TEST") || (daqEventTypeString ==
"DAQ_EVENT_TYPE_TEST") ||
497 (daqEventTypeString ==
"Test trigger")) {
500 if ((daqEventTypeString ==
"TECHNICAL") || (daqEventTypeString ==
"DAQ_EVENT_TYPE_TECHNICAL") ||
501 (daqEventTypeString ==
"Technical trigger")) {
504 if ((daqEventTypeString ==
"SIMULATED") || (daqEventTypeString ==
"DAQ_EVENT_TYPE_SIMULATED") ||
505 (daqEventTypeString ==
"Simulated trigger")) {
508 if ((daqEventTypeString ==
"TRACED") || (daqEventTypeString ==
"DAQ_EVENT_TYPE_TRACED") ||
509 (daqEventTypeString ==
"Traced event")) {
512 if ((daqEventTypeString ==
"ERROR") || (daqEventTypeString ==
"DAQ_EVENT_TYPE_ERROR") ||
513 (daqEventTypeString ==
"Error")) {
524 os <<
"HEADER_MONITOR_READY ";
528 os <<
"QDR_PARTIAL_FULL ";
534 os <<
"L1A_PARTIAL_FULL ";
539 os <<
"FEUNIT" << uint16_t(iFE) <<
"MISSING ";
566 const uint16_t mask = (0x0001 <<
num);
581 std::ostringstream
ss;
582 ss <<
"Invalid buffer state: ";
600 std::ostringstream
ss;
601 ss <<
"Invalid buffer state: ";
612 if (internalFreezeFlag())
613 os <<
"INTERNAL_FREEZE ";
618 if (backpressureFlag())
619 os <<
"BACKPRESSURE ";
623 os <<
"HEADER_MONITOR_READY ";
625 printFlagsForBuffer(frameAddressFIFOState(),
"FRAME_ADDRESS", os);
626 printFlagsForBuffer(totalLengthFIFOState(),
"TOTAL_LENGTH", os);
627 printFlagsForBuffer(trackerHeaderFIFOState(),
"TRACKER_HEADER", os);
629 printFlagsForBuffer(feEventLengthFIFOState(),
"FE_LENGTH", os);
630 printFlagsForBuffer(feFPGABufferState(),
"FE", os);
635 std::ostream& os)
const {
637 os << name <<
"_EMPTY ";
639 os << name <<
"_PARTIAL_FULL ";
641 os << name <<
"_FULL ";
643 os << name <<
"_UNSET ";
648 if (
getBit(bufferPosition + STATE_OFFSET_EMPTY))
650 if (
getBit(bufferPosition + STATE_OFFSET_PARTIAL_FULL))
652 if (
getBit(bufferPosition + STATE_OFFSET_FULL))
665 std::ostringstream
ss;
666 ss <<
"Invalid buffer state: ";
676 const uint32_t mask = (0x00000001 <<
num);
690 const bool backpressure,
691 const bool slinkFull,
692 const bool slinkDown,
693 const bool internalFreeze,
694 const bool trackerHeaderMonitorDataReady,
714 const bool validFormatByteWhenNotWordSwapped = ((headerPointer[BUFFERFORMAT] ==
BUFFER_FORMAT_CODE_NEW) ||
719 if (validFormatByteWhenNotWordSwapped || (!validFormatByteWhenNotWordSwapped && !validFormatByteWhenWordSwapped)) {
720 memcpy(specialHeader_, headerPointer, 8);
721 wordSwapped_ =
false;
723 memcpy(specialHeader_, headerPointer + 4, 4);
724 memcpy(specialHeader_ + 4, headerPointer, 4);
750 const uint8_t eventTypeNibble = trackerEventTypeNibble();
751 const uint8_t
mode = (eventTypeNibble & 0xF);
768 const uint8_t eventTypeNibble = trackerEventTypeNibble();
777 const uint8_t
mode = (eventTypeNibble & 0xF);
804 wordSwapped_ = !wordSwapped_;
807 setBufferFormatByte(newBufferFormat);
812 switch (newBufferFormat) {
821 std::ostringstream
ss;
822 ss <<
"Invalid buffer format: ";
829 switch (headerType) {
833 setHeaderTypeNibble(headerType);
836 std::ostringstream
ss;
837 ss <<
"Invalid header type: ";
844 switch (readoutMode) {
860 setReadoutModeBits(readoutMode);
863 std::ostringstream
ss;
864 ss <<
"Invalid readout mode: ";
873 const uint8_t mask = 0x1 << internalFEUnitNum;
874 const uint8_t
result = ((apvAddressErrorRegister() & (~mask)) | (error ? mask : 0x00));
875 setAPVEAddressErrorRegister(result);
881 const uint8_t mask = 0x1 << internalFEUnitNum;
882 const uint8_t
result = ((feEnableRegister() & (~mask)) | (enabled ? mask : 0x00));
883 setFEEnableRegister(result);
888 const bool overflow) {
889 const uint8_t mask = 0x1 << internalFEUnitNum;
890 const uint8_t
result = ((feOverflowRegister() & (~mask)) | (overflow ? mask : 0x00));
891 setFEEnableRegister(result);
898 const uint8_t address,
899 const uint8_t addressErrorRegister,
900 const uint8_t feEnableRegister,
901 const uint8_t feOverflowRegister,
903 memset(specialHeader_, 0x00, 8);
907 setBufferFormatByte(bufferFormat);
908 setReadoutMode(readoutMode);
909 setHeaderType(headerType);
910 setAPVEAddress(address);
911 setAPVEAddressErrorRegister(addressErrorRegister);
912 setFEEnableRegister(feEnableRegister);
913 setFEOverflowRegister(feOverflowRegister);
914 setFEDStatusRegister(fedStatusRegister);
918 switch (eventTypeNibble()) {
933 header_[7] = ((header_[7] & 0xF0) | evtType);
938 header_[4] = (l1ID & 0x000000FF);
939 header_[5] = ((l1ID & 0x0000FF00) >> 8);
940 header_[6] = ((l1ID & 0x00FF0000) >> 16);
945 header_[3] = ((bxID & 0x0FF0) >> 4);
946 header_[2] = ((header_[2] & 0x0F) | ((bxID & 0x000F) << 4));
951 header_[2] = ((header_[2] & 0xF0) | ((sourceID & 0x0F00) >> 8));
952 header_[1] = (sourceID & 0x00FF);
958 const uint16_t sourceID,
961 memset(header_, 0x0, 8);
965 setEventType(evtType);
968 setSourceID(sourceID);
972 switch (ttsNibble()) {
989 const bool slinkTransmissionError,
991 const bool slinkCRCError,
992 const uint8_t eventStatusNibble) {
994 memset(trailer_, 0x0, 8);
998 setEventLengthIn64BitWords(eventLengthIn64BitWords);
999 setEventStatusNibble(eventStatusNibble);
1000 setTTSBits(ttsBits);
1002 setSLinkTransmissionErrorBit(slinkTransmissionError);
1003 setBadSourceIDBit(badFEDID);
1004 setSLinkCRCErrorBit(slinkCRCError);
1008 trailer_[4] = (eventLengthIn64BitWords & 0x000000FF);
1009 trailer_[5] = ((eventLengthIn64BitWords & 0x0000FF00) >> 8);
1010 trailer_[6] = ((eventLengthIn64BitWords & 0x00FF0000) >> 16);
1015 trailer_[2] = (crc & 0x00FF);
1016 trailer_[3] = ((crc >> 8) & 0x00FF);
1022 trailer_[1] |= 0x80;
1024 trailer_[1] &= (~0x80);
1030 trailer_[1] |= 0x40;
1032 trailer_[1] &= (~0x40);
1038 trailer_[0] |= 0x04;
1040 trailer_[0] &= (~0x40);
1045 trailer_[1] = ((trailer_[1] & 0xF0) | (eventStatusNibble & 0x0F));
1050 trailer_[0] = ((trailer_[0] & 0x0F) | (ttsBits & 0xF0));
1067 return (header_[bitNumber / 8] & (0x01 << (bitNumber % 8)));
1071 return (checkStatusBits(internalFEDChannelNum, 0) && checkStatusBits(internalFEDChannelNum, 1));
1077 memset(header_, 0x00, APV_ERROR_HEADER_SIZE_IN_BYTES);
1079 setAPVStatusBit(iCh, 0, apvsGood[iCh * 2]);
1080 setAPVStatusBit(iCh, 1, apvsGood[iCh * 2 + 1]);
1085 const uint8_t apvNum,
1086 const bool apvGood) {
1090 const uint8_t byteNumber = bitNumber / 8;
1091 const uint8_t bitInByte = bitNumber % 8;
1092 const uint8_t mask = (0x01 << bitInByte);
1093 header_[byteNumber] = ((header_[byteNumber] & (~mask)) | (apvGood ? mask : 0x00));
1100 setAPVStatusBit(internalFEDChannelNum, 0,
false);
1101 setAPVStatusBit(internalFEDChannelNum, 1,
false);
1105 setAPVStatusBit(internalFEDChannelNum, 0,
true);
1107 setAPVStatusBit(internalFEDChannelNum, 0,
false);
1110 setAPVStatusBit(internalFEDChannelNum, 1,
true);
1112 setAPVStatusBit(internalFEDChannelNum, 1,
false);
1137 return (!unlockedFromBit(internalFEDChannelNum) && !outOfSyncFromBit(internalFEDChannelNum) &&
1138 !apvError(internalFEDChannelNum, apvNum) && !apvAddressError(internalFEDChannelNum, apvNum));
1154 const uint8_t startByteInFEWord = (
FEDCH_PER_FEUNIT - 1 - feUnitChanNum) * 6 / 8;
1160 ((pFEWord[startByteInFEWord + 1] & 0x0F) << 2));
1163 ((pFEWord[startByteInFEWord + 1] & 0x03) << 4));
1195 const std::vector<uint8_t>& feMajorityAddresses,
1196 const std::vector<FEDChannelStatus>& channelStatus,
1198 const uint32_t daqRegister,
1199 const uint32_t daqRegister2) {
1200 memset(header_, 0x00, FULL_DEBUG_HEADER_SIZE_IN_BYTES);
1201 setBEStatusRegister(beStatusRegister);
1202 setDAQRegister(daqRegister);
1203 setDAQRegister2(daqRegister2);
1205 setFEUnitLength(iFE, feUnitLengths[iFE]);
1206 setFEUnitMajorityAddress(iFE, feMajorityAddresses[iFE]);
1209 setChannelStatus(iCh, channelStatus[iCh]);
1223 feWord(internalFEUnitNum)[9] = address;
1227 set32BitWordAt(feWord(0) + 10, beStatusRegister);
1233 set32BitWordAt(feWord(6) + 10, daqRegister2);
1238 set32BitWordAt(feWord(internalFEUnitNum) + 10, reservedRegister);
1242 feWord(internalFEUnitNum)[15] = ((length & 0xFF00) >> 8);
1243 feWord(internalFEUnitNum)[14] = (length & 0x00FF);
1248 uint8_t& byte = *(feWord(internalFEDChannelNum /
FEDCH_PER_FEUNIT) + (bitInFeWord / 8));
1249 const uint8_t mask = (0x1 << bitInFeWord % 8);
1250 byte = ((byte & (~mask)) | (value ? mask : 0x0));
1257 init(fedBuffer, fedBufferSize, allowUnrecognizedFormat);
1261 const size_t fedBufferSize,
1262 const bool allowUnrecognizedFormat,
1263 const bool fillChannelVector)
1265 init(fedBuffer, fedBufferSize, allowUnrecognizedFormat);
1266 if (fillChannelVector)
1270 void FEDBufferBase::init(
const uint8_t* fedBuffer,
const size_t fedBufferSize,
const bool allowUnrecognizedFormat) {
1272 static const size_t MIN_BUFFER_SIZE = 8 + 8 + 8;
1277 std::ostringstream
ss;
1278 ss <<
"Buffer is too small. " 1279 <<
"Min size is " << MIN_BUFFER_SIZE <<
". " 1290 std::ostringstream
ss;
1291 ss <<
"Buffer format not recognized. " 1298 const uint32_t* originalU32 =
reinterpret_cast<const uint32_t*
>(
originalBuffer_);
1300 uint32_t* newU32 =
reinterpret_cast<uint32_t*
>(newBuffer);
1303 for (
size_t i = 0;
i < sizeU32;
i += 2) {
1304 newU32[
i] = originalU32[
i + 1];
1305 newU32[
i + 1] = originalU32[
i];
1310 memcpy(newU32, originalU32, 8);
1312 memcpy(newU32 + sizeU32 - 2, originalU32 + sizeU32 - 2, 8);
1314 for (
size_t i = 2;
i < sizeU32 - 2;
i += 2) {
1315 newU32[
i] = originalU32[
i + 1];
1316 newU32[
i + 1] = originalU32[
i];
1338 os <<
"buffer format: " <<
bufferFormat() << std::endl;
1339 os <<
"Buffer size: " <<
bufferSize() <<
" bytes" << std::endl;
1341 os <<
"Source ID: " <<
daqSourceID() << std::endl;
1342 os <<
"Header type: " <<
headerType() << std::endl;
1343 os <<
"Readout mode: " <<
readoutMode() << std::endl;
1344 os <<
"DAQ event type: " <<
daqEventType() << std::endl;
1345 os <<
"TTS state: " <<
daqTTSState() << std::endl;
1346 os <<
"L1 ID: " <<
daqLvl1ID() << std::endl;
1347 os <<
"BX ID: " <<
daqBXID() << std::endl;
1348 os <<
"FED status register flags: ";
1351 os <<
"APVe Address: " << uint16_t(
apveAddress()) << std::endl;
1352 os <<
"Enabled FE units: " << uint16_t(
nFEUnitsEnabled()) << std::endl;
1387 summary <<
"Check buffer type valid: " << (
checkBufferFormat() ?
"passed" :
"FAILED") << std::endl;
1388 summary <<
"Check header format valid: " << (
checkHeaderType() ?
"passed" :
"FAILED") << std::endl;
1389 summary <<
"Check readout mode valid: " << (
checkReadoutMode() ?
"passed" :
"FAILED") << std::endl;
1391 summary <<
"Check FE unit majority addresses: " << (
checkMajorityAddresses() ?
"passed" :
"FAILED") << std::endl;
1393 summary <<
"FEs with majority address error: ";
1394 unsigned int badFEs = 0;
1399 summary << uint16_t(iFE) <<
" ";
1403 summary << std::endl;
1404 summary <<
"Number of FE Units with bad addresses: " << badFEs << std::endl;
1406 summary <<
"Check for FE unit buffer overflows: " << (
checkNoFEOverflows() ?
"passed" :
"FAILED") << std::endl;
1408 summary <<
"FEs which overflowed: ";
1409 unsigned int badFEs = 0;
1412 summary << uint16_t(iFE) <<
" ";
1416 summary << std::endl;
1417 summary <<
"Number of FE Units which overflowed: " << badFEs << std::endl;
1419 summary <<
"Check for S-Link CRC errors: " << (
checkNoSlinkCRCError() ?
"passed" :
"FAILED") << std::endl;
1422 summary <<
"Check CRC: " << (
checkCRC() ?
"passed" :
"FAILED") << std::endl;
1423 summary <<
"Check source ID is FED ID: " << (
checkSourceIDs() ?
"passed" :
"FAILED") << std::endl;
1426 summary <<
"Check there are no extra headers or trailers: " 1428 summary <<
"Check length from trailer: " << (
checkLengthFromTrailer() ?
"passed" :
"FAILED") << std::endl;
1429 return summary.str();
1436 std::ostringstream
ss;
1437 ss <<
"Request for CM median from channel with non-ZS packet code. " 1438 <<
"Packet code is " << uint16_t(
packetCode()) <<
"." << std::endl;
1442 std::ostringstream
ss;
1443 ss <<
"Channel APV index out of range when requesting CM median for APV. " 1444 <<
"Channel APV index is " << uint16_t(apvIndex) <<
"." << std::endl;
1449 result |= data_[(offset_ + 3 + 2 * apvIndex) ^ 7];
1450 result |= (((data_[(offset_ + 4 + 2 * apvIndex) ^ 7]) << 8) & 0x300);
bool checkNoUnexpectedSourceID() const
FEDBackendStatusRegister & setFEFPGABufferState(const FEDBufferState state)
FEDBackendStatusRegister & setQDRMemoryState(const FEDBufferState state)
FEDBackendStatusRegister & setL1ABXFIFOState(const FEDBufferState state)
bool checkNoExtraHeadersOrTrailers() const
virtual bool doChecks() const
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED8_BOTBOT
bool feDataMissingFlag(const uint8_t internalFEUnitNum) const
bool qdrMemoryPartialFullFlag() const
void printHexValue(const uint8_t value, std::ostream &os)
bool checkSourceIDs() const
void printFlags(std::ostream &os) const
void setBit(const uint8_t num, const bool bitSet)
static const uint16_t FED_ID_MIN
uint8_t nFEUnitsEnabled() const
bool checkReadoutMode() const
bool getBit(const uint8_t num) const
void setQDRMemoryEmptyFlag(const bool bitSet)
virtual std::string checkSummary() const
uint8_t apveAddress() const
FEDBackendStatusRegister & setFrameAddressFIFOState(const FEDBufferState state)
uint32_t daqEventLengthInBytes() const
static const uint8_t PACKET_CODE_SCOPE
FEDBackendStatusRegister & setTrackerHeaderFIFOState(const FEDBufferState state)
bool l1aBxFIFOPartialFullFlag() const
static const uint8_t PACKET_CODE_PROC_RAW10
bool checkHeaderType() const
bool doDAQHeaderAndTrailerChecks() const
FEDDAQTrailer & setSLinkCRCErrorBit(const bool bitSet)
FEDDAQTrailer & setTTSBits(const FEDTTSBits ttsBits)
FEDReadoutMode readoutMode() const
uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum)
bool checkNoFEOverflows() const
FEDDAQTrailer & setSLinkTransmissionErrorBit(const bool bitSet)
FEDHeaderType fedHeaderTypeFromString(const std::string &headerTypeString)
void printFlags(std::ostream &os) const
uint16_t calculateFEDBufferCRC(const uint8_t *buffer, const size_t lengthInBytes)
uint8_t packetCodeFromString(const std::string &packetCodeString, FEDReadoutMode mode)
std::ostream & operator<<(std::ostream &os, const FEDBufferFormat &value)
FEDBufferFormat fedBufferFormatFromString(const std::string &bufferFormatString)
void setBit(const uint8_t num, const bool bitSet)
FEDDAQEventType daqEventType() const
const uint8_t * orderedBuffer_
FEDTTSBits daqTTSState() const
bool checkNoSlinkCRCError() const
bool checkNoSLinkTransmissionError() const
FEDReadoutMode fedReadoutModeFromString(const std::string &readoutModeString)
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED8_TOPBOT
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED10
FEDBackendStatusRegister(const uint32_t backendStatusRegister)
uint16_t cmMedian(const uint8_t apvIndex) const
FEDDAQTrailer daqTrailer_
static const uint8_t PACKET_CODE_VIRGIN_RAW10
bool slinkFullFlag() const
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED
FEDBackendStatusRegister & setTotalLengthFIFOState(const FEDBufferState state)
FEDDAQTrailer & setEventLengthIn64BitWords(const uint32_t eventLengthIn64BitWords)
bool qdrMemoryEmptyFlag() const
FEDDAQTrailer & setEventStatusNibble(const uint8_t eventStatusNibble)
bool majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const
FEDBackendStatusRegister & setTTCReadyFlag(const bool bitSet)
FEDDAQTrailer & setCRC(const uint16_t crc)
FEDStatusRegister & setL1ABXFIFOBufferState(const FEDBufferState state)
static const uint16_t FEUNITS_PER_FED
FEDBufferState qdrMemoryState() const
void setQDRMemoryFullFlag(const bool bitSet)
bool feEnabled(const uint8_t internalFEUnitNum) const
void setL1ABXFIFOFullFlag(const bool bitSet)
static const uint8_t BUFFER_FORMAT_CODE_NEW
FEDBufferBase(const uint8_t *fedBuffer, const size_t fedBufferSize, const bool allowUnrecognizedFormat=false)
bool qdrMemoryFullFlag() const
FEDHeaderType headerType() const
const uint8_t * originalBuffer_
void printFlagsForBuffer(const FEDBufferState bufferState, const std::string name, std::ostream &os) const
uint8_t packetCode(bool legacy=false, const uint8_t internalFEDChannelNum=0) const
void setL1ABXFIFOPartialFullFlag(const bool bitSet)
FEDBufferState l1aBxFIFOState() const
FEDTTSBits ttsBits() const
static const uint8_t PACKET_CODE_VIRGIN_RAW8_TOPBOT
FEDDAQEventType fedDAQEventTypeFromString(const std::string &daqEventTypeString)
std::vector< FEDChannel > channels_
FEDBufferState getBufferState(const uint8_t bufferPosition) const
FEDDAQTrailer & setBadSourceIDBit(const bool bitSet)
bool l1aBxFIFOFullFlag() const
bool l1aBxFIFOEmptyFlag() const
static const uint8_t PACKET_CODE_PROC_RAW
static const uint8_t PACKET_CODE_VIRGIN_RAW8_BOTBOT
void printHex(const void *pointer, const size_t length, std::ostream &os)
bool checkBufferFormat() const
static const uint16_t FEDCH_PER_FEUNIT
bool trackerHeaderMonitorDataReadyFlag() const
FEDBackendStatusRegister & setTrackerHeaderMonitorDataReadyFlag(const bool bitSet)
size_t bufferSize() const
unsigned short compute_crc_8bit(unsigned short crc, unsigned char data)
FEDBackendStatusRegister & setSLinkFullFlag(const bool bitSet)
uint32_t daqLvl1ID() const
void setBufferSate(const uint8_t bufferPosition, const FEDBufferState state)
void init(const uint8_t *fedBuffer, const size_t fedBufferSize, const bool allowUnrecognizedFormat)
TrackerSpecialHeader specialHeader_
virtual void print(std::ostream &os) const
bool doTrackerSpecialHeaderChecks() const
static const uint16_t FEDCH_PER_FED
bool checkLengthFromTrailer() const
virtual bool channelGood(const uint8_t internalFEDChannelNum) const
FEDBackendStatusRegister & setFEEventLengthFIFOState(const FEDBufferState state)
static const uint8_t PACKET_CODE_PROC_RAW8_BOTBOT
void printHexWord(const uint8_t *pointer, const size_t lengthInBytes, std::ostream &os)
static const uint16_t FED_ID_MAX
static const uint8_t BUFFER_FORMAT_CODE_OLD
uint16_t daqSourceID() const
FEDStatusRegister & setQDRMemoryBufferState(const FEDBufferState state)
FEDBackendStatusRegister & setInternalFreezeFlag(const bool bitSet)
static const uint8_t PACKET_CODE_PROC_RAW8_TOPBOT
void setL1ABXFIFOEmptyFlag(const bool bitSet)
FEDBackendStatusRegister & setBackpressureFlag(const bool bitSet)
bool checkMajorityAddresses() const
static const uint8_t PACKET_CODE_VIRGIN_RAW
bool feOverflow(const uint8_t internalFEUnitNum) const
FEDStatusRegister fedStatusRegister() const
void setQDRMemoryPartialFullFlag(const bool bitSet)
FEDBackendStatusRegister & setSLinkDownFlag(const bool bitSet)
FEDBufferFormat bufferFormat() const