diff --git a/DataFormats/Detectors/TOF/include/DataFormatsTOF/CompressedDataFormat.h b/DataFormats/Detectors/TOF/include/DataFormatsTOF/CompressedDataFormat.h index 5ff98b7cb8368..eff565c36c04b 100644 --- a/DataFormats/Detectors/TOF/include/DataFormatsTOF/CompressedDataFormat.h +++ b/DataFormats/Detectors/TOF/include/DataFormatsTOF/CompressedDataFormat.h @@ -86,27 +86,27 @@ union Union_t { } // namespace tof } // namespace o2 -#define DIAGNOSTIC_DRM_HEADER 0x80000000 -#define DIAGNOSTIC_DRM_TRAILER 0x40000000 +#define DIAGNOSTIC_DRM_HEADER_MISSING 0x80000000 +#define DIAGNOSTIC_DRM_TRAILER_MISSING 0x40000000 #define DIAGNOSTIC_DRM_CRC 0x20000000 -#define DIAGNOSTIC_DRM_ENABLEMASK 0x08000000 -#define DIAGNOSTIC_DRM_CBIT 0x04000000 -#define DIAGNOSTIC_DRM_FAULTID 0x02000000 -#define DIAGNOSTIC_DRM_RTOBIT 0x01000000 +#define DIAGNOSTIC_DRM_ENAPARTMASK_DIFFER 0x08000000 +#define DIAGNOSTIC_DRM_CLOCKSTATUS_WRONG 0x04000000 +#define DIAGNOSTIC_DRM_FAULTSLOTMASK_NOTZERO 0x02000000 +#define DIAGNOSTIC_DRM_READOUTTIMEOUT_NOTZERO 0x01000000 -#define DIAGNOSTIC_TRM_HEADER 0x80000000 -#define DIAGNOSTIC_TRM_TRAILER 0x40000000 +#define DIAGNOSTIC_TRM_HEADER_MISSING 0x80000000 +#define DIAGNOSTIC_TRM_TRAILER_MISSING 0x40000000 #define DIAGNOSTIC_TRM_CRC 0x20000000 -#define DIAGNOSTIC_TRM_UNEXPECTED 0x20000000 -#define DIAGNOSTIC_TRM_EVENTCOUNTER 0x08000000 -#define DIAGNOSTIC_TRM_EBIT 0x06000000 +#define DIAGNOSTIC_TRM_HEADER_UNEXPECTED 0x20000000 +#define DIAGNOSTIC_TRM_EVENTCNT_MISMATCH 0x08000000 +#define DIAGNOSTIC_TRM_EMPTYBIT_NOTZERO 0x06000000 #define DIAGNOSTIC_TRM_LBIT 0x02000000 -#define DIAGNOSTIC_TRMCHAIN_HEADER(x) (0x00080000 << (8 * x)) -#define DIAGNOSTIC_TRMCHAIN_TRAILER(x) (0x00040000 << (8 * x)) -#define DIAGNOSTIC_TRMCHAIN_STATUS(x) (0x00020000 << (8 * x)) -#define DIAGNOSTIC_TRMCHAIN_EVENTCOUNTER(x) (0x00008000 << (8 * x)) -#define DIAGNOSTIC_TRMCHAIN_TDCERRORS(x) (0x00004000 << (8 * x)) -#define DIAGNOSTIC_TRMCHAIN_BUNCHID(x) (0x00002000 << (8 * x)) +#define DIAGNOSTIC_TRMCHAIN_HEADER_MISSING(x) (0x00080000 << (8 * x)) +#define DIAGNOSTIC_TRMCHAIN_TRAILER_MISSING(x) (0x00040000 << (8 * x)) +#define DIAGNOSTIC_TRMCHAIN_STATUS_NOTZERO(x) (0x00020000 << (8 * x)) +#define DIAGNOSTIC_TRMCHAIN_EVENTCNT_MISMATCH(x) (0x00008000 << (8 * x)) +#define DIAGNOSTIC_TRMCHAIN_TDCERROR_DETECTED(x) (0x00004000 << (8 * x)) +#define DIAGNOSTIC_TRMCHAIN_BUNCHCNT_MISMATCH(x) (0x00002000 << (8 * x)) #endif /** O2_TOF_CMPDATAFORMAT **/ diff --git a/Detectors/TOF/compression/include/TOFCompression/Compressor.h b/Detectors/TOF/compression/include/TOFCompression/Compressor.h index 56eefcec7f605..adf86d6e5b814 100644 --- a/Detectors/TOF/compression/include/TOFCompression/Compressor.h +++ b/Detectors/TOF/compression/include/TOFCompression/Compressor.h @@ -38,10 +38,7 @@ class Compressor inline bool run() { rewind(); - if (processRDH()) - return false; - for (int i = 0; i < 3 && !processDRM(); ++i) - ; + while (!processHBF()); return false; }; @@ -56,9 +53,8 @@ class Compressor }; inline bool write() { return encoderWrite(); }; - bool processRDH(); - bool processDRM(); void checkSummary(); + void resetCounters(); void setDecoderVerbose(bool val) { mDecoderVerbose = val; }; void setEncoderVerbose(bool val) { mEncoderVerbose = val; }; @@ -77,29 +73,48 @@ class Compressor double mIntegratedTime = 0.; protected: + + bool processSave(); + bool processHBF(); + bool processHBFsave(); + bool processRDH(); + bool processDRM(); + /** decoder private functions and data members **/ bool decoderInit(); bool decoderOpen(std::string name); bool decoderRead(); bool decoderClose(); - void decoderClear(); + bool decoderParanoid(); inline void decoderRewind() { mDecoderPointer = reinterpret_cast(mDecoderBuffer); }; inline void decoderNext() { mDecoderPointer += mDecoderNextWord; - mDecoderNextWord = (mDecoderNextWord + 2) % 4; + // mDecoderNextWord = mDecoderNextWord == 1 ? 3 : 1; + // mDecoderNextWord = (mDecoderNextWord + 2) % 4; + mDecoderNextWord = (mDecoderNextWord + 2) & 0x3; }; + int mJumpRDH = 0; + std::ifstream mDecoderFile; char* mDecoderBuffer = nullptr; bool mOwnDecoderBuffer = false; long mDecoderBufferSize = 8192; + // long mDecoderBufferSize = 1048576; uint32_t* mDecoderPointer = nullptr; - uint32_t mDecoderNextWord = 1; + uint32_t* mDecoderPointerMax = nullptr; + uint32_t* mDecoderPointerNext = nullptr; + uint8_t mDecoderNextWord = 1; o2::header::RAWDataHeader* mDecoderRDH; bool mDecoderVerbose = false; - + bool mDecoderError = false; + bool mDecoderFatal = false; + char mDecoderSaveBuffer[1048576]; + uint32_t mDecoderSaveBufferDataSize = 0; + uint32_t mDecoderSaveBufferDataLeft = 0; + /** encoder private functions and data members **/ bool encoderInit(); @@ -113,9 +128,11 @@ class Compressor std::ofstream mEncoderFile; char* mEncoderBuffer = nullptr; bool mOwnEncoderBuffer = false; - long mEncoderBufferSize = 8192; + long mEncoderBufferSize = 1048576; uint32_t* mEncoderPointer = nullptr; - uint32_t mEncoderNextWord = 1; + uint32_t* mEncoderPointerMax = nullptr; + uint32_t* mEncoderPointerStart = nullptr; + uint8_t mEncoderNextWord = 1; o2::header::RAWDataHeader* mEncoderRDH; bool mEncoderVerbose = false; @@ -123,13 +140,15 @@ class Compressor bool checkerCheck(); - uint32_t mCounter; + uint32_t mEventCounter; + uint32_t mFatalCounter; + uint32_t mErrorCounter; bool mCheckerVerbose = false; struct DRMCounters_t { uint32_t Headers; uint32_t EventWordsMismatch; - uint32_t CBit; + uint32_t clockStatus; uint32_t Fault; uint32_t RTOBit; } mDRMCounters = {0}; diff --git a/Detectors/TOF/compression/include/TOFCompression/RawDataFrame.h b/Detectors/TOF/compression/include/TOFCompression/RawDataFrame.h index d305fa9a5b2bc..8156345e57947 100644 --- a/Detectors/TOF/compression/include/TOFCompression/RawDataFrame.h +++ b/Detectors/TOF/compression/include/TOFCompression/RawDataFrame.h @@ -25,13 +25,35 @@ class RawDataFrame { public: - RawDataFrame() = default; - ~RawDataFrame() = default; + RawDataFrame(int size = 1048576) + : mSize(size), mBuffer(new char[size]){}; + RawDataFrame(const RawDataFrame& other) + : mSize(other.mSize), mBuffer(new char[other.mSize]) + { + for (int i = 0; i < mSize; ++i) + mBuffer[i] = other.mBuffer[i]; + }; + RawDataFrame& operator=(const RawDataFrame& other) + { + if (&other == this) + return *this; + if (mSize != other.mSize) { + delete[] mBuffer; + mSize = other.mSize; + mBuffer = new char[mSize]; + } + for (int i = 0; i < mSize; ++i) + mBuffer[i] = other.mBuffer[i]; + return *this; + }; + ~RawDataFrame() { delete[] mBuffer; }; + int getSize() const { return mSize; }; + char* getBuffer() const { return mBuffer; }; // private: - char mBuffer[8192]; // [mSize] - long mSize = 8192; + int mSize; + char* mBuffer; // [mSize] ClassDef(RawDataFrame, 1); }; diff --git a/Detectors/TOF/compression/include/TOFCompression/RawReaderTask.h b/Detectors/TOF/compression/include/TOFCompression/RawReaderTask.h index 4f1042cbc4fcb..8c7d842295cdb 100644 --- a/Detectors/TOF/compression/include/TOFCompression/RawReaderTask.h +++ b/Detectors/TOF/compression/include/TOFCompression/RawReaderTask.h @@ -41,7 +41,7 @@ class RawReaderTask : public Task private: bool mStatus = false; std::ifstream mFile; - RawDataFrame mDataFrame; + std::string mBuffer; }; } // namespace tof diff --git a/Detectors/TOF/compression/src/CompressedWriterTask.cxx b/Detectors/TOF/compression/src/CompressedWriterTask.cxx index 1cdd9ae846ed7..ce0f1adabe120 100644 --- a/Detectors/TOF/compression/src/CompressedWriterTask.cxx +++ b/Detectors/TOF/compression/src/CompressedWriterTask.cxx @@ -77,7 +77,7 @@ DataProcessorSpec CompressedWriterTask::getSpec() Outputs{}, // outputs AlgorithmSpec{adaptFromTask()}, // call constructor + execute init (check) Options{ - {"tof-compressed-filename", VariantType::String, "", {"Name of the compressed output file"}}}}; + {"tof-compressed-filename", VariantType::String, "/dev/null", {"Name of the compressed output file"}}}}; } } // namespace tof diff --git a/Detectors/TOF/compression/src/Compressor.cxx b/Detectors/TOF/compression/src/Compressor.cxx index 6361b331bf8bb..054ef9d1fd915 100644 --- a/Detectors/TOF/compression/src/Compressor.cxx +++ b/Detectors/TOF/compression/src/Compressor.cxx @@ -1,12 +1,19 @@ #include "TOFCompression/Compressor.h" #include "TOFBase/Geo.h" +#include "CommonUtils/HBFUtils.h" #include #include -#define DECODER_VERBOSE -#define ENCODER_VERBOSE +//#define DECODER_PARANOID +//#define DECODER_VERBOSE +//#define ENCODER_VERBOSE +//#define CHECKER_VERBOSE +//#define CHECKER_COUNTER +#ifdef DECODER_PARANOID +#warning "Building code with DecoderParanoid option. This may limit the speed." +#endif #ifdef DECODER_VERBOSE #warning "Building code with DecoderVerbose option. This may limit the speed." #endif @@ -43,33 +50,34 @@ #define IS_TDC_HIT(x) ((x & 0x80000000) == 0x80000000) // DRM getters -#define GET_DRMGLOBALHEADER_DRMID(x) ((x & 0x0FE00000) >> 21) -#define GET_DRMSTATUSHEADER1_PARTICIPATINGSLOTID(x) ((x & 0x00007FF0) >> 4) -#define GET_DRMSTATUSHEADER1_CBIT(x) ((x & 0x00008000) >> 15) -#define GET_DRMSTATUSHEADER2_SLOTENABLEMASK(x) ((x & 0x00007FF0) >> 4) -#define GET_DRMSTATUSHEADER2_FAULTID(x) ((x & 0x07FF0000) >> 16) -#define GET_DRMSTATUSHEADER2_RTOBIT(x) ((x & 0x08000000) >> 27) -#define GET_DRMSTATUSHEADER3_L0BCID(x) ((x & 0x0000FFF0) >> 4) -#define GET_DRMGLOBALTRAILER_LOCALEVENTCOUNTER(x) ((x & 0x0000FFF0) >> 4) +//#define GET_DRMDATAHEADER_DRMID(x) ((x & 0x0FE00000) >> 21) +#define GET_DRMDATAHEADER_DRMID(x) ((x >> 21) & 0x7F) +#define GET_DRMHEADW1_PARTSLOTMASK(x) ((x & 0x00007FF0) >> 4) +#define GET_DRMHEADW1_CLOCKSTATUS(x) ((x & 0x00018000) >> 15) +#define GET_DRMHEADW2_ENASLOTMASK(x) ((x & 0x00007FF0) >> 4) +#define GET_DRMHEADW2_FAULTSLOTMASK(x) ((x & 0x07FF0000) >> 16) +#define GET_DRMHEADW2_READOUTTIMEOUT(x) ((x & 0x08000000) >> 27) +#define GET_DRMHEADW3_GBTBUNCHCNT(x) ((x & 0x0000FFF0) >> 4) +#define GET_DRMDATATRAILER_LOCEVCNT(x) ((x & 0x0000FFF0) >> 4) // TRM getter -#define GET_TRMGLOBALHEADER_SLOTID(x) ((x & 0x0000000F)) -#define GET_TRMGLOBALHEADER_EVENTNUMBER(x) ((x & 0x07FE0000) >> 17) -#define GET_TRM_EVENTWORDS(x) ((x & 0x0001FFF0) >> 4) -#define GET_TRMGLOBALHEADER_EBIT(x) ((x & 0x08000000) >> 27) +#define GET_TRMDATAHEADER_SLOTID(x) ((x & 0x0000000F)) +#define GET_TRMDATAHEADER_EVENTCNT(x) ((x & 0x07FE0000) >> 17) +#define GET_TRMDATAHEADER_EVENTWORDS(x) ((x & 0x0001FFF0) >> 4) +#define GET_TRMDATAHEADER_EMPTYBIT(x) ((x & 0x08000000) >> 27) // TRM Chain getters #define GET_TRMCHAINHEADER_SLOTID(x) ((x & 0x0000000F)) -#define GET_TRMCHAINHEADER_BUNCHID(x) ((x & 0x0000FFF0) >> 4) -#define GET_TRMCHAINTRAILER_EVENTCOUNTER(x) ((x & 0x0FFF0000) >> 16) +#define GET_TRMCHAINHEADER_BUNCHCNT(x) ((x & 0x0000FFF0) >> 4) +#define GET_TRMCHAINTRAILER_EVENTCNT(x) ((x & 0x0FFF0000) >> 16) #define GET_TRMCHAINTRAILER_STATUS(x) ((x & 0x0000000F)) // TDC getters -#define GET_TDCHIT_HITTIME(x) ((x & 0x001FFFFF)) -#define GET_TDCHIT_CHAN(x) ((x & 0x00E00000) >> 21) -#define GET_TDCHIT_TDCID(x) ((x & 0x0F000000) >> 24) -#define GET_TDCHIT_EBIT(x) ((x & 0x10000000) >> 28) -#define GET_TDCHIT_PSBITS(x) ((x & 0x60000000) >> 29) +#define GET_TRMDATAHIT_TIME(x) ((x & 0x001FFFFF)) +#define GET_TRMDATAHIT_CHANID(x) ((x & 0x00E00000) >> 21) +#define GET_TRMDATAHIT_TDCID(x) ((x & 0x0F000000) >> 24) +#define GET_TRMDATAHIT_EBIT(x) ((x & 0x10000000) >> 28) +#define GET_TRMDATAHIT_PSBITS(x) ((x & 0x60000000) >> 29) namespace o2 { @@ -79,7 +87,7 @@ namespace tof Compressor::Compressor() { } - + Compressor::~Compressor() { if (mDecoderBuffer && mOwnDecoderBuffer) @@ -120,16 +128,16 @@ bool Compressor::decoderInit() #ifdef DECODER_VERBOSE if (mDecoderVerbose) { std::cout << colorBlue - << "--- INITIALISE DECODER BUFFER: " << mDecoderBufferSize << " bytes" - << colorReset - << std::endl; + << "--- INITIALISE DECODER BUFFER: " << mDecoderBufferSize << " bytes" + << colorReset + << std::endl; } #endif if (mDecoderBuffer && mOwnDecoderBuffer) { std::cout << colorYellow - << "-W- a buffer was already allocated, cleaning" - << colorReset - << std::endl; + << "--- a buffer was already allocated, cleaning" + << colorReset + << std::endl; delete[] mDecoderBuffer; } mDecoderBuffer = new char[mDecoderBufferSize]; @@ -142,16 +150,16 @@ bool Compressor::encoderInit() #ifdef ENCODER_VERBOSE if (mEncoderVerbose) { std::cout << colorBlue - << "--- INITIALISE ENCODER BUFFER: " << mEncoderBufferSize << " bytes" - << colorReset - << std::endl; + << "--- INITIALISE ENCODER BUFFER: " << mEncoderBufferSize << " bytes" + << colorReset + << std::endl; } #endif if (mEncoderBuffer && mOwnEncoderBuffer) { std::cout << colorYellow - << "-W- a buffer was already allocated, cleaning" - << colorReset - << std::endl; + << "-W- a buffer was already allocated, cleaning" + << colorReset + << std::endl; delete[] mEncoderBuffer; } mEncoderBuffer = new char[mEncoderBufferSize]; @@ -164,17 +172,17 @@ bool Compressor::decoderOpen(std::string name) { if (mDecoderFile.is_open()) { std::cout << colorYellow - << "-W- a file was already open, closing" - << colorReset - << std::endl; + << "-W- a file was already open, closing" + << colorReset + << std::endl; mDecoderFile.close(); } mDecoderFile.open(name.c_str(), std::fstream::in | std::fstream::binary); if (!mDecoderFile.is_open()) { std::cerr << colorRed - << "-E- Cannot open input file: " << name - << colorReset - << std::endl; + << "-E- Cannot open input file: " << name + << colorReset + << std::endl; return true; } return false; @@ -184,21 +192,21 @@ bool Compressor::encoderOpen(std::string name) { if (mEncoderFile.is_open()) { std::cout << colorYellow - << "-W- a file was already open, closing" - << colorReset - << std::endl; + << "-W- a file was already open, closing" + << colorReset + << std::endl; mEncoderFile.close(); } mEncoderFile.open(name.c_str(), std::fstream::out | std::fstream::binary); if (!mEncoderFile.is_open()) { std::cerr << colorRed << "-E- Cannot open output file: " << name - << colorReset - << std::endl; + << colorReset + << std::endl; return true; } return false; } - + bool Compressor::decoderClose() { if (mDecoderFile.is_open()) { @@ -218,38 +226,53 @@ bool Compressor::encoderClose() bool Compressor::decoderRead() { if (!mDecoderFile.is_open()) { - std::cout << colorRed << "-E- no input file is open" - << colorReset - << std::endl; + std::cout << colorRed << "--- no input file is open" + << colorReset + << std::endl; return true; } - mDecoderFile.read(mDecoderBuffer, mDecoderBufferSize); - decoderRewind(); - if (!mDecoderFile) { + + char* inputPointer = mDecoderBuffer; + mDecoderFile.read(inputPointer, 64); + mDecoderBufferSize = 64; + auto rdh = reinterpret_cast(inputPointer); + while (!rdh->stop) { + mDecoderFile.read(inputPointer + rdh->headerSize, rdh->offsetToNext - rdh->headerSize); + mDecoderBufferSize += (rdh->offsetToNext - rdh->headerSize); + inputPointer += rdh->offsetToNext; + mDecoderFile.read(inputPointer, 64); + mDecoderBufferSize += 64; + rdh = reinterpret_cast(inputPointer); + } + + /** check end of file **/ + if (mDecoderFile.eof()) { std::cout << colorRed << "--- Nothing else to read" - << colorReset - << std::endl; + << colorReset + << std::endl; return true; } + #ifdef DECODER_VERBOSE if (mDecoderVerbose) { std::cout << colorBlue - << "--- DECODER READ PAGE: " << mDecoderBufferSize << " bytes" - << colorReset - << std::endl; + << "--- DECODER READ HBF: " << mDecoderBufferSize << " bytes" + << colorReset + << std::endl; } #endif + return false; } - + bool Compressor::encoderWrite() { #ifdef ENCODER_VERBOSE if (mEncoderVerbose) { std::cout << colorBlue - << "--- ENCODER WRITE BUFFER: " << getEncoderByteCounter() << " bytes" - << colorReset - << std::endl; + << "--- ENCODER WRITE BUFFER: " << getEncoderByteCounter() << " bytes" + << colorReset + << std::endl; } #endif mEncoderFile.write(mEncoderBuffer, getEncoderByteCounter()); @@ -257,1032 +280,1217 @@ bool Compressor::encoderWrite() return false; } -void Compressor::decoderClear() +bool Compressor::decoderParanoid() { - mDecoderSummary.tofDataHeader = 0x0; - mDecoderSummary.drmDataHeader = 0x0; - mDecoderSummary.drmDataTrailer = 0x0; - for (int itrm = 0; itrm < 10; itrm++) { - mDecoderSummary.trmDataHeader[itrm] = 0x0; - mDecoderSummary.trmDataTrailer[itrm] = 0x0; - for (int ichain = 0; ichain < 2; ichain++) { - mDecoderSummary.trmChainHeader[itrm][ichain] = 0x0; - mDecoderSummary.trmChainTrailer[itrm][ichain] = 0x0; - } + if (mDecoderPointer >= mDecoderPointerMax) { + printf("%s %08x [ERROR] fatal error: beyond memory size %s \n", colorRed, *mDecoderPointer, colorReset); + mDecoderFatal = true; + return true; } + return false; } -bool Compressor::processRDH() +bool Compressor::processHBF() { #ifdef DECODER_VERBOSE if (mDecoderVerbose) { std::cout << colorBlue - << "--- DECODE RDH" - << colorReset - << std::endl; + << "--- PROCESS HBF" + << colorReset + << std::endl; } #endif + + mDecoderRDH = reinterpret_cast(mDecoderPointer); + mEncoderRDH = reinterpret_cast(mEncoderPointer); + auto rdh = mDecoderRDH; + + /** loop until RDH close **/ + while (!rdh->stop) { - mDecoderRDH = reinterpret_cast(mDecoderBuffer); - mEncoderRDH = reinterpret_cast(mEncoderBuffer); - uint64_t HeaderSize = mDecoderRDH->headerSize; - uint64_t MemorySize = mDecoderRDH->memorySize; +#ifdef DECODER_VERBOSE + if (mDecoderVerbose) { + std::cout << colorBlue + << "--- RDH open/continue detected" + << colorReset + << std::endl; + o2::utils::HBFUtils::printRDH(*rdh); + } +#endif - /** copy RDH to encoder buffer **/ - std::memcpy(mEncoderRDH, mDecoderRDH, HeaderSize); + auto headerSize = rdh->headerSize; + auto memorySize = rdh->memorySize; + auto offsetToNext = rdh->offsetToNext; + auto drmPayload = memorySize - headerSize; + + /** copy DRM payload to save buffer **/ + std::memcpy(mDecoderSaveBuffer + mDecoderSaveBufferDataSize, reinterpret_cast(rdh) + headerSize, drmPayload); + mDecoderSaveBufferDataSize += drmPayload; + + /** move to next RDH **/ + rdh = reinterpret_cast(reinterpret_cast(rdh) + offsetToNext); - /** move pointers after RDH **/ - mDecoderPointer = reinterpret_cast(mDecoderBuffer + HeaderSize); - mEncoderPointer = reinterpret_cast(mEncoderBuffer + HeaderSize); + /** check next RDH is within buffer **/ + if (reinterpret_cast(rdh) < mDecoderBuffer + mDecoderBufferSize) + continue; + /** otherwise return **/ + return true; + } + #ifdef DECODER_VERBOSE if (mDecoderVerbose) { - printf(" %016lx RDH Word0 (HeaderSize=%d, BlockLength=%d) \n", mDecoderRDH->word0, - mDecoderRDH->headerSize, mDecoderRDH->blockLength); - - printf(" %016lx RDH Word1 (OffsetToNext=%d, MemorySize=%d, LinkID=%d, PacketCounter=%d) \n", mDecoderRDH->word1, - mDecoderRDH->offsetToNext, mDecoderRDH->memorySize, mDecoderRDH->linkID, mDecoderRDH->packetCounter); - - printf(" %016lx RDH Word2 (TriggerOrbit=%d, HeartbeatOrbit=%d) \n", mDecoderRDH->word2, - mDecoderRDH->triggerOrbit, mDecoderRDH->heartbeatOrbit); - - printf(" %016lx RDH Word3 \n", mDecoderRDH->word3); - - printf(" %016lx RDH Word4 (TriggerBC=%d, HeartbeatBC=%d, TriggerType=%d) \n", mDecoderRDH->word4, - mDecoderRDH->triggerBC, mDecoderRDH->heartbeatBC, mDecoderRDH->triggerType); - - printf(" %016lx RDH Word5 \n", mDecoderRDH->word5); - - printf(" %016lx RDH Word6 \n", mDecoderRDH->word6); + std::cout << colorBlue + << "--- RDH close detected" + << colorReset + << std::endl; + o2::utils::HBFUtils::printRDH(*rdh); + } +#endif + + /** copy RDH open to encoder buffer **/ + std::memcpy(mEncoderPointer, mDecoderRDH, mDecoderRDH->headerSize); + mEncoderPointer = reinterpret_cast(reinterpret_cast(mEncoderPointer) + rdh->headerSize); + + /** process DRM data **/ + mDecoderPointer = reinterpret_cast(mDecoderSaveBuffer); + mDecoderPointerMax = reinterpret_cast(mDecoderSaveBuffer + mDecoderSaveBufferDataSize); + while (mDecoderPointer < mDecoderPointerMax) { + mEventCounter++; + if (processDRM()) + break; + } + mDecoderSaveBufferDataSize = 0; + + /** bring encoder pointer back if fatal error **/ + if (mDecoderFatal) { + mFatalCounter++; + mEncoderPointer = mEncoderPointerStart; + } - printf(" %016lx RDH Word7 \n", mDecoderRDH->word7); + if (mDecoderError) + mErrorCounter++; + + /** updated encoder RDH open **/ + mEncoderRDH->memorySize = reinterpret_cast(mEncoderPointer) - reinterpret_cast(mEncoderRDH); + mEncoderRDH->offsetToNext = mEncoderRDH->memorySize; + + /** copy RDH close to encoder buffer **/ + /** CAREFUL WITH THE PAGE COUNTER **/ + std::memcpy(mEncoderPointer, rdh, rdh->headerSize); + mEncoderPointer = reinterpret_cast(reinterpret_cast(mEncoderPointer) + rdh->headerSize); + +#ifdef DECODER_VERBOSE + if (mDecoderVerbose) { + std::cout << colorBlue + << "--- END PROCESS HBF" + << colorReset + << std::endl; } #endif - if (MemorySize <= HeaderSize) - return true; - return false; + /** move to next RDH **/ + mDecoderPointer = reinterpret_cast(reinterpret_cast(rdh) + rdh->offsetToNext); + + /** check next RDH is within buffer **/ + if (reinterpret_cast(mDecoderPointer) < mDecoderBuffer + mDecoderBufferSize) + return false; + + /** otherwise return **/ + return true; } bool Compressor::processDRM() { - /** check if we have memory to decode **/ - if (getDecoderByteCounter() >= mDecoderRDH->memorySize) { + #ifdef DECODER_VERBOSE if (mDecoderVerbose) { - std::cout << colorYellow - << "-W- decode request exceeds memory size: " - << (void*)mDecoderPointer << " | " << (void*)mDecoderBuffer << " | " << mDecoderRDH->memorySize - << colorReset - << std::endl; + std::cout << colorBlue << "--- PROCESS DRM" + << colorReset + << std::endl; } #endif - return true; - } - -#ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - std::cout << colorBlue << "--- DECODE EVENT" - << colorReset - << std::endl; - } -#endif - /** init decoder **/ - mDecoderNextWord = 1; - decoderClear(); - - /** check TOF Data Header **/ - if (!IS_DRM_COMMON_HEADER(*mDecoderPointer)) { + /** init decoder **/ + mDecoderNextWord = 1; + mDecoderError = false; + mDecoderFatal = false; + mEncoderPointerStart = mEncoderPointer; + + /** check TOF Data Header **/ + if (!IS_DRM_COMMON_HEADER(*mDecoderPointer)) { #ifdef DECODER_VERBOSE - printf("%s %08x [ERROR] fatal error %s \n", colorRed, *mDecoderPointer, colorReset); + printf("%s %08x [ERROR] fatal error %s \n", colorRed, *mDecoderPointer, colorReset); #endif - return true; - } - mDecoderSummary.tofDataHeader = *mDecoderPointer; + mDecoderFatal = true; + return true; + } + mDecoderSummary.tofDataHeader = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto tofDataHeader = reinterpret_cast(mDecoderPointer); - auto bytePayload = tofDataHeader->bytePayload; - printf(" %08x TOF Data Header (bytePayload=%d) \n", *mDecoderPointer, bytePayload); - } + if (mDecoderVerbose) { + auto tofDataHeader = reinterpret_cast(mDecoderPointer); + auto bytePayload = tofDataHeader->bytePayload; + printf(" %08x TOF Data Header (bytePayload=%d) \n", *mDecoderPointer, bytePayload); + } #endif - decoderNext(); - - /** TOF Orbit **/ - mDecoderSummary.tofOrbit = *mDecoderPointer; +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + + /** TOF Orbit **/ + mDecoderSummary.tofOrbit = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto tofOrbit = reinterpret_cast(mDecoderPointer); - auto orbit = tofOrbit->orbit; - printf(" %08x TOF Orbit (orbit=%d) \n", *mDecoderPointer, orbit); - } + if (mDecoderVerbose) { + auto tofOrbit = reinterpret_cast(mDecoderPointer); + auto orbit = tofOrbit->orbit; + printf(" %08x TOF Orbit (orbit=%d) \n", *mDecoderPointer, orbit); + } #endif - decoderNext(); +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); - /** check DRM Data Header **/ - if (!IS_DRM_GLOBAL_HEADER(*mDecoderPointer)) { + /** check DRM Data Header **/ + if (!IS_DRM_GLOBAL_HEADER(*mDecoderPointer)) { #ifdef DECODER_VERBOSE - printf("%s %08x [ERROR] fatal error %s \n", colorRed, *mDecoderPointer, colorReset); + printf("%s %08x [ERROR] fatal error %s \n", colorRed, *mDecoderPointer, colorReset); #endif - return true; - } - mDecoderSummary.drmDataHeader = *mDecoderPointer; + mDecoderFatal = true; + return true; + } + mDecoderSummary.drmDataHeader = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto drmDataHeader = reinterpret_cast(mDecoderPointer); - auto drmId = drmDataHeader->drmId; - printf(" %08x DRM Data Header (drmId=%d) \n", *mDecoderPointer, drmId); - } + if (mDecoderVerbose) { + auto drmDataHeader = reinterpret_cast(mDecoderPointer); + auto drmId = drmDataHeader->drmId; + printf(" %08x DRM Data Header (drmId=%d) \n", *mDecoderPointer, drmId); + } #endif - decoderNext(); +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); - /** DRM Header Word 1 **/ - mDecoderSummary.drmHeadW1 = *mDecoderPointer; + /** DRM Header Word 1 **/ + mDecoderSummary.drmHeadW1 = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto drmHeadW1 = reinterpret_cast(mDecoderPointer); - auto partSlotMask = drmHeadW1->partSlotMask; - auto clockStatus = drmHeadW1->clockStatus; - auto drmHSize = drmHeadW1->drmHSize; - printf(" %08x DRM Header Word 1 (partSlotMask=0x%03x, clockStatus=%d, drmHSize=%d) \n", *mDecoderPointer, partSlotMask, clockStatus, drmHSize); - } + if (mDecoderVerbose) { + auto drmHeadW1 = reinterpret_cast(mDecoderPointer); + auto partSlotMask = drmHeadW1->partSlotMask; + auto clockStatus = drmHeadW1->clockStatus; + auto drmHSize = drmHeadW1->drmHSize; + printf(" %08x DRM Header Word 1 (partSlotMask=0x%03x, clockStatus=%d, drmHSize=%d) \n", *mDecoderPointer, partSlotMask, clockStatus, drmHSize); + } #endif - decoderNext(); +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); - /** DRM Header Word 2 **/ - mDecoderSummary.drmHeadW2 = *mDecoderPointer; + /** DRM Header Word 2 **/ + mDecoderSummary.drmHeadW2 = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto drmHeadW2 = reinterpret_cast(mDecoderPointer); - auto enaSlotMask = drmHeadW2->enaSlotMask; - auto faultSlotMask = drmHeadW2->faultSlotMask; - auto readoutTimeOut = drmHeadW2->readoutTimeOut; - printf(" %08x DRM Header Word 2 (enaSlotMask=0x%03x, faultSlotMask=%d, readoutTimeOut=%d) \n", *mDecoderPointer, enaSlotMask, faultSlotMask, readoutTimeOut); - } + if (mDecoderVerbose) { + auto drmHeadW2 = reinterpret_cast(mDecoderPointer); + auto enaSlotMask = drmHeadW2->enaSlotMask; + auto faultSlotMask = drmHeadW2->faultSlotMask; + auto readoutTimeOut = drmHeadW2->readoutTimeOut; + printf(" %08x DRM Header Word 2 (enaSlotMask=0x%03x, faultSlotMask=%d, readoutTimeOut=%d) \n", *mDecoderPointer, enaSlotMask, faultSlotMask, readoutTimeOut); + } #endif - decoderNext(); +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); - /** DRM Header Word 3 **/ - mDecoderSummary.drmHeadW3 = *mDecoderPointer; + /** DRM Header Word 3 **/ + mDecoderSummary.drmHeadW3 = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto drmHeadW3 = reinterpret_cast(mDecoderPointer); - auto gbtBunchCnt = drmHeadW3->gbtBunchCnt; - auto locBunchCnt = drmHeadW3->locBunchCnt; - printf(" %08x DRM Header Word 3 (gbtBunchCnt=%d, locBunchCnt=%d) \n", *mDecoderPointer, gbtBunchCnt, locBunchCnt); - } + if (mDecoderVerbose) { + auto drmHeadW3 = reinterpret_cast(mDecoderPointer); + auto gbtBunchCnt = drmHeadW3->gbtBunchCnt; + auto locBunchCnt = drmHeadW3->locBunchCnt; + printf(" %08x DRM Header Word 3 (gbtBunchCnt=%d, locBunchCnt=%d) \n", *mDecoderPointer, gbtBunchCnt, locBunchCnt); + } #endif - decoderNext(); +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); - /** DRM Header Word 4 **/ - mDecoderSummary.drmHeadW4 = *mDecoderPointer; + /** DRM Header Word 4 **/ + mDecoderSummary.drmHeadW4 = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - printf(" %08x DRM Header Word 4 \n", *mDecoderPointer); - } + if (mDecoderVerbose) { + printf(" %08x DRM Header Word 4 \n", *mDecoderPointer); + } #endif - decoderNext(); +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); - /** DRM Header Word 5 **/ - mDecoderSummary.drmHeadW5 = *mDecoderPointer; + /** DRM Header Word 5 **/ + mDecoderSummary.drmHeadW5 = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - printf(" %08x DRM Header Word 5 \n", *mDecoderPointer); - } + if (mDecoderVerbose) { + printf(" %08x DRM Header Word 5 \n", *mDecoderPointer); + } #endif - decoderNext(); +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); - /** encode Crate Header **/ - *mEncoderPointer = 0x80000000; - *mEncoderPointer |= GET_DRMSTATUSHEADER2_SLOTENABLEMASK(mDecoderSummary.drmHeadW2) << 12; - *mEncoderPointer |= GET_DRMGLOBALHEADER_DRMID(mDecoderSummary.drmDataHeader) << 24; - *mEncoderPointer |= GET_DRMSTATUSHEADER3_L0BCID(mDecoderSummary.drmHeadW3); + /** encode Crate Header **/ + *mEncoderPointer = 0x80000000; + *mEncoderPointer |= GET_DRMHEADW2_ENASLOTMASK(mDecoderSummary.drmHeadW2) << 12; + *mEncoderPointer |= GET_DRMDATAHEADER_DRMID(mDecoderSummary.drmDataHeader) << 24; + *mEncoderPointer |= GET_DRMHEADW3_GBTBUNCHCNT(mDecoderSummary.drmHeadW3); #ifdef ENCODER_VERBOSE - if (mEncoderVerbose) { - auto crateHeader = reinterpret_cast(mEncoderPointer); - auto bunchID = crateHeader->bunchID; - auto drmID = crateHeader->drmID; - auto slotEnableMask = crateHeader->slotEnableMask; - printf("%s %08x Crate header (drmID=%d, bunchID=%d, slotEnableMask=0x%x) %s \n", colorGreen, *mEncoderPointer, drmID, bunchID, slotEnableMask, colorReset); - } + if (mEncoderVerbose) { + auto crateHeader = reinterpret_cast(mEncoderPointer); + auto bunchID = crateHeader->bunchID; + auto drmID = crateHeader->drmID; + auto slotEnableMask = crateHeader->slotEnableMask; + printf("%s %08x Crate header (drmID=%d, bunchID=%d, slotEnableMask=0x%x) %s \n", colorGreen, *mEncoderPointer, drmID, bunchID, slotEnableMask, colorReset); + } #endif - encoderNext(); + encoderNext(); - /** encode Crate Orbit **/ - *mEncoderPointer = mDecoderSummary.tofOrbit; + /** encode Crate Orbit **/ + *mEncoderPointer = mDecoderSummary.tofOrbit; #ifdef ENCODER_VERBOSE - if (mEncoderVerbose) { - auto crateOrbit = reinterpret_cast(mEncoderPointer); - auto orbitID = crateOrbit->orbitID; - printf("%s %08x Crate orbit (orbitID=%d) %s \n", colorGreen, *mEncoderPointer, orbitID, colorReset); - } + if (mEncoderVerbose) { + auto crateOrbit = reinterpret_cast(mEncoderPointer); + auto orbitID = crateOrbit->orbitID; + printf("%s %08x Crate orbit (orbitID=%d) %s \n", colorGreen, *mEncoderPointer, orbitID, colorReset); + } #endif - encoderNext(); - - /** loop over DRM payload **/ - while (true) { + encoderNext(); - /** LTM global header detected **/ - if (IS_LTM_GLOBAL_HEADER(*mDecoderPointer)) { + /** loop over DRM payload **/ + while (true) { + /** LTM global header detected **/ + if (IS_LTM_GLOBAL_HEADER(*mDecoderPointer)) { #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - printf(" %08x LTM Global Header \n", *mDecoderPointer); - } -#endif - decoderNext(); - - /** loop over LTM payload **/ - while (true) { - - /** LTM global trailer detected **/ - if (IS_LTM_GLOBAL_TRAILER(*mDecoderPointer)) { + if (mDecoderVerbose) { + printf(" %08x LTM Global Header \n", *mDecoderPointer); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + + /** loop over LTM payload **/ + while (true) { + /** LTM global trailer detected **/ + if (IS_LTM_GLOBAL_TRAILER(*mDecoderPointer)) { #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - printf(" %08x LTM Global Trailer \n", *mDecoderPointer); - } -#endif - decoderNext(); - break; - } + if (mDecoderVerbose) { + printf(" %08x LTM Global Trailer \n", *mDecoderPointer); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + break; + } #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - printf(" %08x LTM data \n", *mDecoderPointer); - } -#endif - decoderNext(); + if (mDecoderVerbose) { + printf(" %08x LTM data \n", *mDecoderPointer); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + } } - } - /** TRM Data Header detected **/ - if (IS_TRM_GLOBAL_HEADER(*mDecoderPointer) && GET_TRMGLOBALHEADER_SLOTID(*mDecoderPointer) > 2) { - uint32_t slotID = GET_TRMGLOBALHEADER_SLOTID(*mDecoderPointer); - int itrm = slotID - 3; - mDecoderSummary.trmDataHeader[itrm] = *mDecoderPointer; + /** TRM Data Header detected **/ + if (IS_TRM_GLOBAL_HEADER(*mDecoderPointer) && GET_TRMDATAHEADER_SLOTID(*mDecoderPointer) > 2) { + uint32_t slotId = GET_TRMDATAHEADER_SLOTID(*mDecoderPointer); + int itrm = slotId - 3; + mDecoderSummary.trmDataHeader[itrm] = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto trmDataHeader = reinterpret_cast(mDecoderPointer); - auto eventWords = trmDataHeader->eventWords; - auto eventCnt = trmDataHeader->eventCnt; - auto emptyBit = trmDataHeader->emptyBit; - printf(" %08x TRM Data Header (slotID=%d, eventWords=%d, eventCnt=%d, emptyBit=%01x) \n", *mDecoderPointer, slotID, eventWords, eventCnt, emptyBit); - } -#endif - decoderNext(); - - /** loop over TRM payload **/ - while (true) { - - /** TRM Chain-A Header detected **/ - if (IS_TRM_CHAINA_HEADER(*mDecoderPointer) && GET_TRMCHAINHEADER_SLOTID(*mDecoderPointer) == slotID) { - mDecoderSummary.trmChainHeader[itrm][0] = *mDecoderPointer; - mDecoderSummary.hasHits[itrm][0] = false; - mDecoderSummary.hasErrors[itrm][0] = false; + if (mDecoderVerbose) { + auto trmDataHeader = reinterpret_cast(mDecoderPointer); + auto eventWords = trmDataHeader->eventWords; + auto eventCnt = trmDataHeader->eventCnt; + auto emptyBit = trmDataHeader->emptyBit; + printf(" %08x TRM Data Header (slotId=%d, eventWords=%d, eventCnt=%d, emptyBit=%01x) \n", *mDecoderPointer, slotId, eventWords, eventCnt, emptyBit); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + + /** loop over TRM payload **/ + while (true) { + /** TRM Chain-A Header detected **/ + if (IS_TRM_CHAINA_HEADER(*mDecoderPointer) && GET_TRMCHAINHEADER_SLOTID(*mDecoderPointer) == slotId) { + mDecoderSummary.trmChainHeader[itrm][0] = *mDecoderPointer; + mDecoderSummary.hasHits[itrm][0] = false; + mDecoderSummary.hasErrors[itrm][0] = false; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto trmChainHeader = reinterpret_cast(mDecoderPointer); - auto bunchCnt = trmChainHeader->bunchCnt; - printf(" %08x TRM Chain-A Header (slotID=%d, bunchCnt=%d) \n", *mDecoderPointer, slotID, bunchCnt); - } -#endif - decoderNext(); - - /** loop over TRM Chain-A payload **/ - while (true) { - - /** TDC hit detected **/ - if (IS_TDC_HIT(*mDecoderPointer)) { - mDecoderSummary.hasHits[itrm][0] = true; - auto itdc = GET_TDCHIT_TDCID(*mDecoderPointer); - auto ihit = mDecoderSummary.trmDataHits[0][itdc]; - mDecoderSummary.trmDataHit[0][itdc][ihit] = *mDecoderPointer; - mDecoderSummary.trmDataHits[0][itdc]++; + if (mDecoderVerbose) { + auto trmChainHeader = reinterpret_cast(mDecoderPointer); + auto bunchCnt = trmChainHeader->bunchCnt; + printf(" %08x TRM Chain-A Header (slotId=%d, bunchCnt=%d) \n", *mDecoderPointer, slotId, bunchCnt); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + + /** loop over TRM Chain-A payload **/ + while (true) { + /** TDC hit detected **/ + if (IS_TDC_HIT(*mDecoderPointer)) { + mDecoderSummary.hasHits[itrm][0] = true; + auto itdc = GET_TRMDATAHIT_TDCID(*mDecoderPointer); + auto ihit = mDecoderSummary.trmDataHits[0][itdc]; + mDecoderSummary.trmDataHit[0][itdc][ihit] = *mDecoderPointer; + mDecoderSummary.trmDataHits[0][itdc]++; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto trmDataHit = reinterpret_cast(mDecoderPointer); - auto time = trmDataHit->time; - auto chanId = trmDataHit->chanId; - auto tdcId = trmDataHit->tdcId; - auto dataId = trmDataHit->dataId; - printf(" %08x TRM Data Hit (time=%d, chanId=%d, tdcId=%d, dataId=%d \n", *mDecoderPointer, time, chanId, tdcId, dataId); - } -#endif - decoderNext(); - continue; - } - - /** TDC error detected **/ - if (IS_TDC_ERROR(*mDecoderPointer)) { - mDecoderSummary.hasErrors[itrm][0] = true; + if (mDecoderVerbose) { + auto trmDataHit = reinterpret_cast(mDecoderPointer); + auto time = trmDataHit->time; + auto chanId = trmDataHit->chanId; + auto tdcId = trmDataHit->tdcId; + auto dataId = trmDataHit->dataId; + printf(" %08x TRM Data Hit (time=%d, chanId=%d, tdcId=%d, dataId=0x%x) \n", *mDecoderPointer, time, chanId, tdcId, dataId); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + continue; + } + + /** TDC error detected **/ + if (IS_TDC_ERROR(*mDecoderPointer)) { + mDecoderSummary.hasErrors[itrm][0] = true; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - printf("%s %08x TDC error %s \n", colorRed, *mDecoderPointer, colorReset); - } -#endif - decoderNext(); - continue; - } - - /** TRM Chain-A Trailer detected **/ - if (IS_TRM_CHAINA_TRAILER(*mDecoderPointer)) { - mDecoderSummary.trmChainTrailer[itrm][0] = *mDecoderPointer; + if (mDecoderVerbose) { + printf("%s %08x TDC error %s \n", colorRed, *mDecoderPointer, colorReset); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + continue; + } + + /** TRM Chain-A Trailer detected **/ + if (IS_TRM_CHAINA_TRAILER(*mDecoderPointer)) { + mDecoderSummary.trmChainTrailer[itrm][0] = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto trmChainTrailer = reinterpret_cast(mDecoderPointer); - auto eventCnt = trmChainTrailer->eventCnt; - printf(" %08x TRM Chain-A Trailer (slotID=%d, eventCnt=%d) \n", *mDecoderPointer, slotID, eventCnt); - } -#endif - decoderNext(); - break; - } - + if (mDecoderVerbose) { + auto trmChainTrailer = reinterpret_cast(mDecoderPointer); + auto eventCnt = trmChainTrailer->eventCnt; + printf(" %08x TRM Chain-A Trailer (slotId=%d, eventCnt=%d) \n", *mDecoderPointer, slotId, eventCnt); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + break; + } + + /** decode error **/ + mDecoderError = true; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - printf("%s %08x [ERROR] breaking TRM Chain-A decode stream %s \n", colorRed, *mDecoderPointer, colorReset); - } -#endif - decoderNext(); - break; - } - } /** end of loop over TRM chain-A payload **/ - - /** TRM Chain-B Header detected **/ - if (IS_TRM_CHAINB_HEADER(*mDecoderPointer) && GET_TRMCHAINHEADER_SLOTID(*mDecoderPointer) == slotID) { - mDecoderSummary.hasHits[itrm][1] = false; - mDecoderSummary.hasErrors[itrm][1] = false; - mDecoderSummary.trmChainHeader[itrm][1] = *mDecoderPointer; + if (mDecoderVerbose) { + printf("%s %08x [ERROR] breaking TRM Chain-A decode stream %s \n", colorRed, *mDecoderPointer, colorReset); + } +#endif + /** decode error detected, be paranoid **/ + if (decoderParanoid()) + return true; + + decoderNext(); + break; + } + } /** end of loop over TRM chain-A payload **/ + + /** TRM Chain-B Header detected **/ + if (IS_TRM_CHAINB_HEADER(*mDecoderPointer) && GET_TRMCHAINHEADER_SLOTID(*mDecoderPointer) == slotId) { + mDecoderSummary.hasHits[itrm][1] = false; + mDecoderSummary.hasErrors[itrm][1] = false; + mDecoderSummary.trmChainHeader[itrm][1] = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto trmChainHeader = reinterpret_cast(mDecoderPointer); - auto bunchCnt = trmChainHeader->bunchCnt; - printf(" %08x TRM Chain-B Header (slotID=%d, bunchCnt=%d) \n", *mDecoderPointer, slotID, bunchCnt); - } -#endif - decoderNext(); - - /** loop over TRM Chain-B payload **/ - while (true) { - - /** TDC hit detected **/ - if (IS_TDC_HIT(*mDecoderPointer)) { - mDecoderSummary.hasHits[itrm][1] = true; - auto itdc = GET_TDCHIT_TDCID(*mDecoderPointer); - auto ihit = mDecoderSummary.trmDataHits[1][itdc]; - mDecoderSummary.trmDataHit[1][itdc][ihit] = *mDecoderPointer; - mDecoderSummary.trmDataHits[1][itdc]++; + if (mDecoderVerbose) { + auto trmChainHeader = reinterpret_cast(mDecoderPointer); + auto bunchCnt = trmChainHeader->bunchCnt; + printf(" %08x TRM Chain-B Header (slotId=%d, bunchCnt=%d) \n", *mDecoderPointer, slotId, bunchCnt); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + + /** loop over TRM Chain-B payload **/ + while (true) { + /** TDC hit detected **/ + if (IS_TDC_HIT(*mDecoderPointer)) { + mDecoderSummary.hasHits[itrm][1] = true; + auto itdc = GET_TRMDATAHIT_TDCID(*mDecoderPointer); + auto ihit = mDecoderSummary.trmDataHits[1][itdc]; + mDecoderSummary.trmDataHit[1][itdc][ihit] = *mDecoderPointer; + mDecoderSummary.trmDataHits[1][itdc]++; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto trmDataHit = reinterpret_cast(mDecoderPointer); - auto time = trmDataHit->time; - auto chanId = trmDataHit->chanId; - auto tdcId = trmDataHit->tdcId; - auto dataId = trmDataHit->dataId; - printf(" %08x TRM Data Hit (time=%d, chanId=%d, tdcId=%d, dataId=%d \n", *mDecoderPointer, time, chanId, tdcId, dataId); - } -#endif - decoderNext(); - continue; - } - - /** TDC error detected **/ - if (IS_TDC_ERROR(*mDecoderPointer)) { - mDecoderSummary.hasErrors[itrm][1] = true; + if (mDecoderVerbose) { + auto trmDataHit = reinterpret_cast(mDecoderPointer); + auto time = trmDataHit->time; + auto chanId = trmDataHit->chanId; + auto tdcId = trmDataHit->tdcId; + auto dataId = trmDataHit->dataId; + printf(" %08x TRM Data Hit (time=%d, chanId=%d, tdcId=%d, dataId=0x%x \n", *mDecoderPointer, time, chanId, tdcId, dataId); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + continue; + } + + /** TDC error detected **/ + if (IS_TDC_ERROR(*mDecoderPointer)) { + mDecoderSummary.hasErrors[itrm][1] = true; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - printf("%s %08x TDC error %s \n", colorRed, *mDecoderPointer, colorReset); - } -#endif - decoderNext(); - continue; - } - - /** TRM Chain-B trailer detected **/ - if (IS_TRM_CHAINB_TRAILER(*mDecoderPointer)) { - mDecoderSummary.trmChainTrailer[itrm][1] = *mDecoderPointer; + if (mDecoderVerbose) { + printf("%s %08x TDC error %s \n", colorRed, *mDecoderPointer, colorReset); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + continue; + } + + /** TRM Chain-B trailer detected **/ + if (IS_TRM_CHAINB_TRAILER(*mDecoderPointer)) { + mDecoderSummary.trmChainTrailer[itrm][1] = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto trmChainTrailer = reinterpret_cast(mDecoderPointer); - auto eventCnt = trmChainTrailer->eventCnt; - printf(" %08x TRM Chain-B Trailer (slotID=%d, eventCnt=%d) \n", *mDecoderPointer, slotID, eventCnt); - } -#endif - decoderNext(); - break; - } - + if (mDecoderVerbose) { + auto trmChainTrailer = reinterpret_cast(mDecoderPointer); + auto eventCnt = trmChainTrailer->eventCnt; + printf(" %08x TRM Chain-B Trailer (slotId=%d, eventCnt=%d) \n", *mDecoderPointer, slotId, eventCnt); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + break; + } + + /** decode error **/ + mDecoderError = true; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - printf("%s %08x [ERROR] breaking TRM Chain-B decode stream %s \n", colorRed, *mDecoderPointer, colorReset); - } -#endif - decoderNext(); - break; - } - } /** end of loop over TRM chain-A payload **/ - - /** TRM Data Trailer detected **/ - if (IS_TRM_GLOBAL_TRAILER(*mDecoderPointer)) { - mDecoderSummary.trmDataTrailer[itrm] = *mDecoderPointer; + if (mDecoderVerbose) { + printf("%s %08x [ERROR] breaking TRM Chain-B decode stream %s \n", colorRed, *mDecoderPointer, colorReset); + } +#endif + /** decode error detected, be paranoid **/ + if (decoderParanoid()) + return true; + + decoderNext(); + break; + } + } /** end of loop over TRM chain-A payload **/ + + /** TRM Data Trailer detected **/ + if (IS_TRM_GLOBAL_TRAILER(*mDecoderPointer)) { + mDecoderSummary.trmDataTrailer[itrm] = *mDecoderPointer; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto trmDataTrailer = reinterpret_cast(mDecoderPointer); - auto eventCRC = trmDataTrailer->eventCRC; - auto lutErrorBit = trmDataTrailer->lutErrorBit; - printf(" %08x TRM Data Trailer (slotID=%d, eventCRC=%d, lutErrorBit=%d) \n", *mDecoderPointer, slotID, eventCRC, lutErrorBit); - } -#endif - decoderNext(); - - /** encoder Spider **/ - if (mDecoderSummary.hasHits[itrm][0] || mDecoderSummary.hasHits[itrm][1]) - encoderSpider(itrm); - - /** filler detected **/ - if (IS_FILLER(*mDecoderPointer)) { + if (mDecoderVerbose) { + auto trmDataTrailer = reinterpret_cast(mDecoderPointer); + auto eventCRC = trmDataTrailer->eventCRC; + auto lutErrorBit = trmDataTrailer->lutErrorBit; + printf(" %08x TRM Data Trailer (slotId=%d, eventCRC=%d, lutErrorBit=%d) \n", *mDecoderPointer, slotId, eventCRC, lutErrorBit); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + + /** encoder Spider **/ + if (mDecoderSummary.hasHits[itrm][0] || mDecoderSummary.hasHits[itrm][1]) + encoderSpider(itrm); + + /** filler detected **/ + if (IS_FILLER(*mDecoderPointer)) { #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - printf(" %08x Filler \n", *mDecoderPointer); - } -#endif - decoderNext(); - } - - break; - } - + if (mDecoderVerbose) { + printf(" %08x Filler \n", *mDecoderPointer); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + } + + break; + } + + /** decode error **/ + mDecoderError = true; #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - printf("%s %08x [ERROR] breaking TRM decode stream %s \n", colorRed, *mDecoderPointer, colorReset); - } + if (mDecoderVerbose) { + printf("%s %08x [ERROR] breaking TRM decode stream %s \n", colorRed, *mDecoderPointer, colorReset); + } #endif - decoderNext(); - break; + /** decode error detected, be paranoid **/ + if (decoderParanoid()) + return true; + + decoderNext(); + break; - } /** end of loop over TRM payload **/ + } /** end of loop over TRM payload **/ - continue; - } - - /** DRM Data Trailer detected **/ - if (IS_DRM_GLOBAL_TRAILER(*mDecoderPointer)) { - mDecoderSummary.drmDataTrailer = *mDecoderPointer; -#ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - auto drmDataTrailer = reinterpret_cast(mDecoderPointer); - auto locEvCnt = drmDataTrailer->locEvCnt; - printf(" %08x DRM Data Trailer (locEvCnt=%d) \n", *mDecoderPointer, locEvCnt); + continue; } -#endif - decoderNext(); - /** filler detected **/ - if (IS_FILLER(*mDecoderPointer)) { + /** DRM Data Trailer detected **/ + if (IS_DRM_GLOBAL_TRAILER(*mDecoderPointer)) { + mDecoderSummary.drmDataTrailer = *mDecoderPointer; +#ifdef DECODER_VERBOSE + if (mDecoderVerbose) { + auto drmDataTrailer = reinterpret_cast(mDecoderPointer); + auto locEvCnt = drmDataTrailer->locEvCnt; + printf(" %08x DRM Data Trailer (locEvCnt=%d) \n", *mDecoderPointer, locEvCnt); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + + /** filler detected **/ + if (IS_FILLER(*mDecoderPointer)) { #ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - printf(" %08x Filler \n", *mDecoderPointer); - } + if (mDecoderVerbose) { + printf(" %08x Filler \n", *mDecoderPointer); + } +#endif +#ifdef DECODER_PARANOID + if (decoderParanoid()) + return true; +#endif + decoderNext(); + } + + /** check event **/ + checkerCheck(); + + /** encode Crate Trailer **/ + *mEncoderPointer = 0x80000000; + *mEncoderPointer |= mCheckerSummary.nDiagnosticWords; + *mEncoderPointer |= GET_DRMDATATRAILER_LOCEVCNT(mDecoderSummary.drmDataTrailer) << 4; +#ifdef ENCODER_VERBOSE + if (mEncoderVerbose) { + auto CrateTrailer = reinterpret_cast(mEncoderPointer); + auto EventCounter = CrateTrailer->eventCounter; + auto NumberOfDiagnostics = CrateTrailer->numberOfDiagnostics; + printf("%s %08x Crate trailer (EventCounter=%d, NumberOfDiagnostics=%d) %s \n", colorGreen, *mEncoderPointer, EventCounter, NumberOfDiagnostics, colorReset); + } +#endif + encoderNext(); + + /** encode Diagnostic Words **/ + for (int iword = 0; iword < mCheckerSummary.nDiagnosticWords; ++iword) { + *mEncoderPointer = mCheckerSummary.DiagnosticWord[iword]; +#ifdef ENCODER_VERBOSE + if (mEncoderVerbose) { + auto Diagnostic = reinterpret_cast(mEncoderPointer); + auto slotId = Diagnostic->slotID; + auto FaultBits = Diagnostic->faultBits; + printf("%s %08x Diagnostic (slotId=%d, FaultBits=0x%x) %s \n", colorGreen, *mEncoderPointer, slotId, FaultBits, colorReset); + } #endif - decoderNext(); - } + encoderNext(); + } - /** check event **/ - checkerCheck(); + mCheckerSummary.nDiagnosticWords = 0; - /** encode Crate Trailer **/ - *mEncoderPointer = 0x80000000; - *mEncoderPointer |= mCheckerSummary.nDiagnosticWords; - *mEncoderPointer |= GET_DRMGLOBALTRAILER_LOCALEVENTCOUNTER(mDecoderSummary.drmDataTrailer) << 4; -#ifdef ENCODER_VERBOSE - if (mEncoderVerbose) { - auto CrateTrailer = reinterpret_cast(mEncoderPointer); - auto EventCounter = CrateTrailer->eventCounter; - auto NumberOfDiagnostics = CrateTrailer->numberOfDiagnostics; - printf("%s %08x Crate trailer (EventCounter=%d, NumberOfDiagnostics=%d) %s \n", colorGreen, *mEncoderPointer, EventCounter, NumberOfDiagnostics, colorReset); + break; } -#endif - encoderNext(); - /** encode Diagnostic Words **/ - for (int iword = 0; iword < mCheckerSummary.nDiagnosticWords; ++iword) { - *mEncoderPointer = mCheckerSummary.DiagnosticWord[iword]; -#ifdef ENCODER_VERBOSE - if (mEncoderVerbose) { - auto Diagnostic = reinterpret_cast(mEncoderPointer); - auto slotID = Diagnostic->slotID; - auto FaultBits = Diagnostic->faultBits; - printf("%s %08x Diagnostic (slotID=%d, FaultBits=0x%x) %s \n", colorGreen, *mEncoderPointer, slotID, FaultBits, colorReset); - } -#endif - encoderNext(); +#ifdef DECODER_VERBOSE + if (mDecoderVerbose) { + printf("%s %08x [ERROR] trying to recover DRM decode stream %s \n", colorRed, *mDecoderPointer, colorReset); } +#endif - mCheckerSummary.nDiagnosticWords = 0; + /** decode error detected, be paranoid **/ + if (decoderParanoid()) + return true; + + decoderNext(); - break; - } + } /** end of loop over DRM payload **/ + + mIntegratedBytes += getDecoderByteCounter(); #ifdef DECODER_VERBOSE if (mDecoderVerbose) { - printf("%s %08x [ERROR] trying to recover DRM decode stream %s \n", colorRed, *mDecoderPointer, colorReset); + std::cout << colorBlue + << "--- END PROCESS DRM" + << colorReset + << std::endl; } #endif - decoderNext(); - - } /** end of loop over DRM payload **/ - - mIntegratedBytes += getDecoderByteCounter(); - /** updated encoder RDH **/ - mEncoderRDH->memorySize = getEncoderByteCounter(); - mEncoderRDH->offsetToNext = getEncoderByteCounter(); - -#ifdef DECODER_VERBOSE - if (mDecoderVerbose) { - std::cout << colorBlue - << "--- END DECODE EVENT: " << getDecoderByteCounter() << " bytes" - << colorReset - << std::endl; + return false; } -#endif - - return false; -} -void Compressor::encoderSpider(int itrm) -{ - int slotID = itrm + 3; + void Compressor::encoderSpider(int itrm) + { + int slotId = itrm + 3; - /** reset packed hits counter **/ - int firstFilledFrame = 255; - int lastFilledFrame = 0; + /** reset packed hits counter **/ + int firstFilledFrame = 255; + int lastFilledFrame = 0; - /** loop over TRM chains **/ - for (int ichain = 0; ichain < 2; ++ichain) { + /** loop over TRM chains **/ + for (int ichain = 0; ichain < 2; ++ichain) { - if (!mDecoderSummary.hasHits[itrm][ichain]) - continue; + if (!mDecoderSummary.hasHits[itrm][ichain]) + continue; - /** loop over TDCs **/ - for (int itdc = 0; itdc < 15; ++itdc) { - - auto nhits = mDecoderSummary.trmDataHits[ichain][itdc]; - if (nhits == 0) - continue; - - /** loop over hits **/ - for (int ihit = 0; ihit < nhits; ++ihit) { - - auto lhit = mDecoderSummary.trmDataHit[ichain][itdc][ihit]; - if (GET_TDCHIT_PSBITS(lhit) != 0x1) - continue; // must be a leading hit - - auto chan = GET_TDCHIT_CHAN(lhit); - auto hitTime = GET_TDCHIT_HITTIME(lhit); - auto eBit = GET_TDCHIT_EBIT(lhit); - uint32_t totWidth = 0; - - // check next hits for packing - for (int jhit = ihit + 1; jhit < nhits; ++jhit) { - auto thit = mDecoderSummary.trmDataHit[ichain][itdc][jhit]; - if (GET_TDCHIT_PSBITS(thit) == 0x2 && GET_TDCHIT_CHAN(thit) == chan) { // must be a trailing hit from same channel - totWidth = (GET_TDCHIT_HITTIME(thit) - hitTime) / Geo::RATIO_TOT_TDC_BIN; // compute TOT - lhit = 0x0; // mark as used - break; - } - } - - auto iframe = hitTime >> 13; - auto phit = mSpiderSummary.nFramePackedHits[iframe]; - - mSpiderSummary.FramePackedHit[iframe][phit] = 0x00000000; - mSpiderSummary.FramePackedHit[iframe][phit] |= (totWidth & 0x7FF) << 0; - mSpiderSummary.FramePackedHit[iframe][phit] |= (hitTime & 0x1FFF) << 11; - mSpiderSummary.FramePackedHit[iframe][phit] |= chan << 24; - mSpiderSummary.FramePackedHit[iframe][phit] |= itdc << 27; - mSpiderSummary.FramePackedHit[iframe][phit] |= ichain << 31; - mSpiderSummary.nFramePackedHits[iframe]++; - - if (iframe < firstFilledFrame) - firstFilledFrame = iframe; - if (iframe > lastFilledFrame) - lastFilledFrame = iframe; - } + /** loop over TDCs **/ + for (int itdc = 0; itdc < 15; ++itdc) { + + auto nhits = mDecoderSummary.trmDataHits[ichain][itdc]; + if (nhits == 0) + continue; + + /** loop over hits **/ + for (int ihit = 0; ihit < nhits; ++ihit) { + + auto lhit = mDecoderSummary.trmDataHit[ichain][itdc][ihit]; + if (GET_TRMDATAHIT_PSBITS(lhit) != 0x1) // must be a leading hit + continue; + + auto chan = GET_TRMDATAHIT_CHANID(lhit); + auto hitTime = GET_TRMDATAHIT_TIME(lhit); + auto eBit = GET_TRMDATAHIT_EBIT(lhit); + uint32_t totWidth = 0; + + // check next hits for packing + for (int jhit = ihit + 1; jhit < nhits; ++jhit) { + auto thit = mDecoderSummary.trmDataHit[ichain][itdc][jhit]; + if (GET_TRMDATAHIT_PSBITS(thit) == 0x2 && GET_TRMDATAHIT_CHANID(thit) == chan) { // must be a trailing hit from same channel + totWidth = (GET_TRMDATAHIT_TIME(thit) - hitTime) / Geo::RATIO_TOT_TDC_BIN; // compute TOT + lhit = 0x0; // mark as used + break; + } + } + + auto iframe = hitTime >> 13; + auto phit = mSpiderSummary.nFramePackedHits[iframe]; + + mSpiderSummary.FramePackedHit[iframe][phit] = 0x00000000; + mSpiderSummary.FramePackedHit[iframe][phit] |= (totWidth & 0x7FF) << 0; + mSpiderSummary.FramePackedHit[iframe][phit] |= (hitTime & 0x1FFF) << 11; + mSpiderSummary.FramePackedHit[iframe][phit] |= chan << 24; + mSpiderSummary.FramePackedHit[iframe][phit] |= itdc << 27; + mSpiderSummary.FramePackedHit[iframe][phit] |= ichain << 31; + mSpiderSummary.nFramePackedHits[iframe]++; + + if (iframe < firstFilledFrame) + firstFilledFrame = iframe; + if (iframe > lastFilledFrame) + lastFilledFrame = iframe; + } - mDecoderSummary.trmDataHits[ichain][itdc] = 0; + mDecoderSummary.trmDataHits[ichain][itdc] = 0; + } } - } - /** loop over frames **/ - for (int iframe = firstFilledFrame; iframe < lastFilledFrame + 1; iframe++) { + /** loop over frames **/ + for (int iframe = firstFilledFrame; iframe < lastFilledFrame + 1; iframe++) { - /** check if frame is empty **/ - if (mSpiderSummary.nFramePackedHits[iframe] == 0) - continue; + /** check if frame is empty **/ + if (mSpiderSummary.nFramePackedHits[iframe] == 0) + continue; - // encode Frame Header - *mEncoderPointer = 0x00000000; - *mEncoderPointer |= slotID << 24; - *mEncoderPointer |= iframe << 16; - *mEncoderPointer |= mSpiderSummary.nFramePackedHits[iframe]; -#ifdef ENCODER_VERBOSE - if (mEncoderVerbose) { - auto FrameHeader = reinterpret_cast(mEncoderPointer); - auto NumberOfHits = FrameHeader->numberOfHits; - auto FrameID = FrameHeader->frameID; - auto TRMID = FrameHeader->trmID; - printf("%s %08x Frame header (TRMID=%d, FrameID=%d, NumberOfHits=%d) %s \n", colorGreen, *mEncoderPointer, TRMID, FrameID, NumberOfHits, colorReset); - } -#endif - encoderNext(); - - // packed hits - for (int ihit = 0; ihit < mSpiderSummary.nFramePackedHits[iframe]; ++ihit) { - *mEncoderPointer = mSpiderSummary.FramePackedHit[iframe][ihit]; + // encode Frame Header + *mEncoderPointer = 0x00000000; + *mEncoderPointer |= slotId << 24; + *mEncoderPointer |= iframe << 16; + *mEncoderPointer |= mSpiderSummary.nFramePackedHits[iframe]; #ifdef ENCODER_VERBOSE if (mEncoderVerbose) { - auto PackedHit = reinterpret_cast(mEncoderPointer); - auto Chain = PackedHit->chain; - auto TDCID = PackedHit->tdcID; - auto Channel = PackedHit->channel; - auto Time = PackedHit->time; - auto TOT = PackedHit->tot; - printf("%s %08x Packed hit (Chain=%d, TDCID=%d, Channel=%d, Time=%d, TOT=%d) %s \n", colorGreen, *mEncoderPointer, Chain, TDCID, Channel, Time, TOT, colorReset); + auto FrameHeader = reinterpret_cast(mEncoderPointer); + auto NumberOfHits = FrameHeader->numberOfHits; + auto FrameID = FrameHeader->frameID; + auto TRMID = FrameHeader->trmID; + printf("%s %08x Frame header (TRMID=%d, FrameID=%d, NumberOfHits=%d) %s \n", colorGreen, *mEncoderPointer, TRMID, FrameID, NumberOfHits, colorReset); } #endif encoderNext(); - } - mSpiderSummary.nFramePackedHits[iframe] = 0; - } + // packed hits + for (int ihit = 0; ihit < mSpiderSummary.nFramePackedHits[iframe]; ++ihit) { + *mEncoderPointer = mSpiderSummary.FramePackedHit[iframe][ihit]; +#ifdef ENCODER_VERBOSE + if (mEncoderVerbose) { + auto PackedHit = reinterpret_cast(mEncoderPointer); + auto Chain = PackedHit->chain; + auto TDCID = PackedHit->tdcID; + auto Channel = PackedHit->channel; + auto Time = PackedHit->time; + auto TOT = PackedHit->tot; + printf("%s %08x Packed hit (Chain=%d, TDCID=%d, Channel=%d, Time=%d, TOT=%d) %s \n", colorGreen, *mEncoderPointer, Chain, TDCID, Channel, Time, TOT, colorReset); + } +#endif + encoderNext(); + } + + mSpiderSummary.nFramePackedHits[iframe] = 0; + } -} + } -bool Compressor::checkerCheck() -{ - mCheckerSummary.nDiagnosticWords = 0; - mCheckerSummary.DiagnosticWord[0] = 0x00000001; -#ifdef CHECKER_COUNTER - mCounter++; -#endif + bool Compressor::checkerCheck() + { + mCheckerSummary.nDiagnosticWords = 0; + mCheckerSummary.DiagnosticWord[0] = 0x00000001; #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - std::cout << colorBlue - << "--- CHECK EVENT" - << colorReset - << std::endl; - } + if (mCheckerVerbose) { + std::cout << colorBlue + << "--- CHECK EVENT" + << colorReset + << std::endl; + } #endif - /** increment check counter **/ - // mCheckerCounter++; + /** increment check counter **/ + // mCheckerCounter++; - /** check TOF Data Header **/ - - /** check DRM Data Header **/ - if (!mDecoderSummary.drmDataHeader) { - mCheckerSummary.DiagnosticWord[0] |= DIAGNOSTIC_DRM_HEADER; + /** check TOF Data Header **/ + + /** check DRM Data Header **/ + if (!mDecoderSummary.drmDataHeader) { + mCheckerSummary.DiagnosticWord[0] |= DIAGNOSTIC_DRM_HEADER_MISSING; #ifdef CHECKER_COUNTER - mCheckerSummary.nDiagnosticWords++; + mCheckerSummary.nDiagnosticWords++; #endif #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" Missing DRM Data Header \n"); - } + if (mCheckerVerbose) { + printf(" Missing DRM Data Header \n"); + } #endif - return true; - } + mDecoderSummary.tofDataHeader = 0x0; + return true; + } - /** check DRM Data Trailer **/ - if (!mDecoderSummary.drmDataTrailer) { - mCheckerSummary.DiagnosticWord[0] |= DIAGNOSTIC_DRM_TRAILER; + /** check DRM Data Trailer **/ + if (!mDecoderSummary.drmDataTrailer) { + mCheckerSummary.DiagnosticWord[0] |= DIAGNOSTIC_DRM_TRAILER_MISSING; #ifdef CHECKER_COUNTER - mCheckerSummary.nDiagnosticWords++; + mCheckerSummary.nDiagnosticWords++; #endif #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" Missing DRM Data Trailer \n"); - } + if (mCheckerVerbose) { + printf(" Missing DRM Data Trailer \n"); + } #endif - return true; - } + mDecoderSummary.tofDataHeader = 0x0; + mDecoderSummary.drmDataHeader = 0x0; + mDecoderSummary.drmDataTrailer = 0x0; + return true; + } - /** increment DRM header counter **/ + /** increment DRM header counter **/ #ifdef CHECKER_COUNTER - mDRMCounters.Headers++; + mDRMCounters.Headers++; #endif - /** get DRM relevant data **/ - uint32_t partSlotMask = GET_DRMSTATUSHEADER1_PARTICIPATINGSLOTID(mDecoderSummary.drmHeadW1); - uint32_t enaSlotMask = GET_DRMSTATUSHEADER2_SLOTENABLEMASK(mDecoderSummary.drmHeadW2); - uint32_t gbtBunchCnt = GET_DRMSTATUSHEADER3_L0BCID(mDecoderSummary.drmHeadW3); - uint32_t locEvCnt = GET_DRMGLOBALTRAILER_LOCALEVENTCOUNTER(mDecoderSummary.drmDataTrailer); + /** get DRM relevant data **/ + uint32_t partSlotMask = GET_DRMHEADW1_PARTSLOTMASK(mDecoderSummary.drmHeadW1); + uint32_t enaSlotMask = GET_DRMHEADW2_ENASLOTMASK(mDecoderSummary.drmHeadW2); + uint32_t gbtBunchCnt = GET_DRMHEADW3_GBTBUNCHCNT(mDecoderSummary.drmHeadW3); + uint32_t locEvCnt = GET_DRMDATATRAILER_LOCEVCNT(mDecoderSummary.drmDataTrailer); - if (partSlotMask != enaSlotMask) { + if (partSlotMask != enaSlotMask) { #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" Warning: enable/participating mask differ: %03x/%03x \n", enaSlotMask, partSlotMask); - } + if (mCheckerVerbose) { + printf(" Warning: enable/participating mask differ: %03x/%03x \n", enaSlotMask, partSlotMask); + } #endif - mCheckerSummary.DiagnosticWord[0] |= DIAGNOSTIC_DRM_ENABLEMASK; - } + mCheckerSummary.DiagnosticWord[0] |= DIAGNOSTIC_DRM_ENAPARTMASK_DIFFER; + } - /** check DRM clock status **/ - if (GET_DRMSTATUSHEADER1_CBIT(mDecoderSummary.drmHeadW1)) { - mCheckerSummary.DiagnosticWord[0] |= DIAGNOSTIC_DRM_CBIT; + /** check DRM clock status **/ + if (GET_DRMHEADW1_CLOCKSTATUS(mDecoderSummary.drmHeadW1) != 2) { + mCheckerSummary.DiagnosticWord[0] |= DIAGNOSTIC_DRM_CLOCKSTATUS_WRONG; #ifdef CHECKER_COUNTER - mDRMCounters.clockStatus++; + mDRMCounters.clockStatus++; #endif #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" DRM CBit is on \n"); - } + if (mCheckerVerbose) { + printf("%s DRM wrong clock status: %d %s\n", colorRed, GET_DRMHEADW1_CLOCKSTATUS(mDecoderSummary.drmHeadW1), colorReset); + } #endif - } + } - /** check DRM fault mask **/ - if (GET_DRMSTATUSHEADER2_FAULTID(mDecoderSummary.drmHeadW2)) { - mCheckerSummary.DiagnosticWord[0] |= DIAGNOSTIC_DRM_FAULTID; + /** check DRM fault mask **/ + if (GET_DRMHEADW2_FAULTSLOTMASK(mDecoderSummary.drmHeadW2)) { + mCheckerSummary.DiagnosticWord[0] |= DIAGNOSTIC_DRM_FAULTSLOTMASK_NOTZERO; #ifdef CHECKER_COUNTER - mDRMCounters.Fault++; + mDRMCounters.Fault++; #endif #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" DRM FaultID: %x \n", GET_DRMSTATUSHEADER2_FAULTID(mDecoderSummary.DRMHeadW2)); - } + if (mCheckerVerbose) { + printf(" DRM fault slot mask: %x \n", GET_DRMHEADW2_FAULTSLOTMASK(mDecoderSummary.drmHeadW2)); + } #endif - } + } - /** check DRM readout timeout **/ - if (GET_DRMSTATUSHEADER2_RTOBIT(mDecoderSummary.drmHeadW2)) { - mCheckerSummary.DiagnosticWord[0] |= DIAGNOSTIC_DRM_RTOBIT; + /** check DRM readout timeout **/ + if (GET_DRMHEADW2_READOUTTIMEOUT(mDecoderSummary.drmHeadW2)) { + mCheckerSummary.DiagnosticWord[0] |= DIAGNOSTIC_DRM_READOUTTIMEOUT_NOTZERO; #ifdef CHECKER_COUNTER - mDRMCounters.RTOBit++; + mDRMCounters.RTOBit++; #endif #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" DRM RTOBit is on \n"); - } + if (mCheckerVerbose) { + printf(" DRM readout timeout \n"); + } #endif - } + } - /** loop over TRMs **/ - for (int itrm = 0; itrm < 10; ++itrm) { - uint32_t slotID = itrm + 3; + /** loop over TRMs **/ + for (int itrm = 0; itrm < 10; ++itrm) { + uint32_t slotId = itrm + 3; - /** check current diagnostic word **/ - auto iword = mCheckerSummary.nDiagnosticWords; - if (mCheckerSummary.DiagnosticWord[iword] & 0xFFFFFFF0) { - mCheckerSummary.nDiagnosticWords++; - iword++; - } + /** check current diagnostic word **/ + auto iword = mCheckerSummary.nDiagnosticWords; + if (mCheckerSummary.DiagnosticWord[iword] & 0xFFFFFFF0) { + mCheckerSummary.nDiagnosticWords++; + iword++; + } - /** set current slot id **/ - mCheckerSummary.DiagnosticWord[iword] = slotID; + /** set current slot id **/ + mCheckerSummary.DiagnosticWord[iword] = slotId; - /** check participating TRM **/ - if (!(partSlotMask & 1 << (itrm + 1))) { - if (mDecoderSummary.trmDataHeader[itrm] != 0x0) { - mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRM_UNEXPECTED; + /** check participating TRM **/ + if (!(partSlotMask & 1 << (itrm + 1))) { + if (mDecoderSummary.trmDataHeader[itrm] != 0x0) { + mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRM_HEADER_UNEXPECTED; #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" Non-participating header found (slotID=%d) \n", slotID); - } + if (mCheckerVerbose) { + printf(" Non-participating header found (slotId=%d) \n", slotId); + } #endif + } + continue; } - continue; - } - /** check TRM Data Header **/ - if (!mDecoderSummary.trmDataHeader[itrm]) { - mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRM_HEADER; + /** check TRM Data Header **/ + if (!mDecoderSummary.trmDataHeader[itrm]) { + mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRM_HEADER_MISSING; #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" Missing TRM Data Header (slotID=%d) \n", slotID); - } + if (mCheckerVerbose) { + printf(" Missing TRM Data Header (slotId=%d) \n", slotId); + } #endif - continue; - } + continue; + } - /** check TRM Data Trailer **/ - if (!mDecoderSummary.trmDataTrailer[itrm] ) { - mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRM_TRAILER; + /** check TRM Data Trailer **/ + if (!mDecoderSummary.trmDataTrailer[itrm] ) { + mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRM_TRAILER_MISSING; #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" Missing TRM Trailer (slotID=%d) \n", slotID); - } + if (mCheckerVerbose) { + printf(" Missing TRM Trailer (slotId=%d) \n", slotId); + } #endif - continue; - } + mDecoderSummary.trmDataHeader[itrm] = 0x0; + continue; + } - /** increment TRM header counter **/ + /** increment TRM header counter **/ #ifdef CHECKER_COUNTER - mTRMCounters[itrm].Headers++; + mTRMCounters[itrm].Headers++; #endif - /** check TRM empty flag **/ + /** check TRM empty flag **/ #ifdef CHECKER_COUNTER - if (!mDecoderSummary.hasHits[itrm][0] && !mDecoderSummary.hasHits[itrm][1]) - mTRMCounters[itrm].Empty++; + if (!mDecoderSummary.hasHits[itrm][0] && !mDecoderSummary.hasHits[itrm][1]) + mTRMCounters[itrm].Empty++; #endif - /** check TRM EventCounter **/ - uint32_t eventCnt = GET_TRMGLOBALHEADER_EVENTNUMBER(mDecoderSummary.trmDataHeader[itrm]); - if (eventCnt != locEvCnt % 1024) { - mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRM_EVENTCOUNTER; + /** check TRM EventCounter **/ + uint32_t eventCnt = GET_TRMDATAHEADER_EVENTCNT(mDecoderSummary.trmDataHeader[itrm]); + if (eventCnt != locEvCnt % 1024) { + mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRM_EVENTCNT_MISMATCH; #ifdef CHECKER_COUNTER - mTRMCounters[itrm].EventCounterMismatch++; + mTRMCounters[itrm].EventCounterMismatch++; #endif #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" TRM EventCounter / DRM LocalEventCounter mismatch: %d / %d (slotID=%d) \n", eventCnt, locEvCnt, slotID); - } + if (mCheckerVerbose) { + printf(" TRM EventCounter / DRM LocalEventCounter mismatch: %d / %d (slotId=%d) \n", eventCnt, locEvCnt, slotId); + } #endif - continue; - } + } - /** check TRM empty bit **/ - if (GET_TRMGLOBALHEADER_EBIT(mDecoderSummary.trmDataHeader[itrm])) { - mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRM_EBIT; + /** check TRM empty bit **/ + if (GET_TRMDATAHEADER_EMPTYBIT(mDecoderSummary.trmDataHeader[itrm])) { + mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRM_EMPTYBIT_NOTZERO; #ifdef CHECKER_COUNTER - mTRMCounters[itrm].EBit++; + mTRMCounters[itrm].EBit++; #endif #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" TRM empty bit is on (slotID=%d) \n", slotID); - } + if (mCheckerVerbose) { + printf(" TRM empty bit is on (slotId=%d) \n", slotId); + } #endif - } + } - /** loop over TRM chains **/ - for (int ichain = 0; ichain < 2; ichain++) { + /** loop over TRM chains **/ + for (int ichain = 0; ichain < 2; ichain++) { - /** check TRM Chain Header **/ - if (!mDecoderSummary.trmChainHeader[itrm][ichain]) { - mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRMCHAIN_HEADER(ichain); + /** check TRM Chain Header **/ + if (!mDecoderSummary.trmChainHeader[itrm][ichain]) { + mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRMCHAIN_HEADER_MISSING(ichain); #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" Missing TRM Chain Header (slotID=%d, chain=%d) \n", slotID, ichain); - } + if (mCheckerVerbose) { + printf(" Missing TRM Chain Header (slotId=%d, chain=%d) \n", slotId, ichain); + } #endif - continue; - } + continue; + } - /** check TRM Chain Trailer **/ - if (!mDecoderSummary.trmChainTrailer[itrm][ichain]) { - mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRMCHAIN_TRAILER(ichain); + /** check TRM Chain Trailer **/ + if (!mDecoderSummary.trmChainTrailer[itrm][ichain]) { + mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRMCHAIN_TRAILER_MISSING(ichain); #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" Missing TRM Chain Trailer (slotID=%d, chain=%d) \n", slotID, ichain); - } + if (mCheckerVerbose) { + printf(" Missing TRM Chain Trailer (slotId=%d, chain=%d) \n", slotId, ichain); + } #endif - continue; - } + mDecoderSummary.trmChainHeader[itrm][ichain] = 0x0; + continue; + } - /** increment TRM Chain header counter **/ + /** increment TRM Chain header counter **/ #ifdef CHECKER_COUNTER - mTRMChainCounters[itrm][ichain].Headers++; + mTRMChainCounters[itrm][ichain].Headers++; #endif - /** check TDC errors **/ - if (mDecoderSummary.hasErrors[itrm][ichain]) { - mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRMCHAIN_TDCERRORS(ichain); + /** check TDC errors **/ + if (mDecoderSummary.hasErrors[itrm][ichain]) { + mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRMCHAIN_TDCERROR_DETECTED(ichain); #ifdef CHECKER_COUNTER - mTRMChainCounters[itrm][ichain].TDCerror++; + mTRMChainCounters[itrm][ichain].TDCerror++; #endif #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" TDC error detected (slotID=%d, chain=%d) \n", slotID, ichain); - } + if (mCheckerVerbose) { + printf(" TDC error detected (slotId=%d, chain=%d) \n", slotId, ichain); + } #endif - } + } - /** check TRM Chain event counter **/ - uint32_t eventCnt = GET_TRMCHAINTRAILER_EVENTCOUNTER(mDecoderSummary.trmChainTrailer[itrm][ichain]); - if (eventCnt != locEvCnt) { - mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRMCHAIN_EVENTCOUNTER(ichain); + /** check TRM Chain event counter **/ + uint32_t eventCnt = GET_TRMCHAINTRAILER_EVENTCNT(mDecoderSummary.trmChainTrailer[itrm][ichain]); + if (eventCnt != locEvCnt) { + mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRMCHAIN_EVENTCNT_MISMATCH(ichain); #ifdef CHECKER_COUNTER - mTRMChainCounters[itrm][ichain].EventCounterMismatch++; + mTRMChainCounters[itrm][ichain].EventCounterMismatch++; #endif #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" TRM Chain EventCounter / DRM LocalEventCounter mismatch: %d / %d (slotID=%d, chain=%d) \n", eventCnt, locEvCnt, slotID, ichain); - } + if (mCheckerVerbose) { + printf(" TRM Chain EventCounter / DRM LocalEventCounter mismatch: %d / %d (slotId=%d, chain=%d) \n", eventCnt, locEvCnt, slotId, ichain); + } #endif - } + } - /** check TRM Chain Status **/ - uint32_t status = GET_TRMCHAINTRAILER_STATUS(mDecoderSummary.trmChainTrailer[itrm][ichain]); - if (status != 0) { - mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRMCHAIN_STATUS(ichain); + /** check TRM Chain Status **/ + uint32_t status = GET_TRMCHAINTRAILER_STATUS(mDecoderSummary.trmChainTrailer[itrm][ichain]); + if (status != 0) { + mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRMCHAIN_STATUS_NOTZERO(ichain); #ifdef CHECKER_COUNTER - mTRMChainCounters[itrm][ichain].BadStatus++; + mTRMChainCounters[itrm][ichain].BadStatus++; #endif #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" TRM Chain bad Status: %d (slotID=%d, chain=%d) \n", Status, slotID, ichain); - } + if (mCheckerVerbose) { + printf(" TRM Chain bad Status: %d (slotId=%d, chain=%d) \n", status, slotId, ichain); + } #endif - } + } - /** check TRM Chain BunchID **/ - uint32_t bunchCnt = GET_TRMCHAINHEADER_BUNCHID(mDecoderSummary.trmChainHeader[itrm][ichain]); - if (bunchCnt != gbtBunchCnt) { - mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRMCHAIN_BUNCHID(ichain); + /** check TRM Chain BunchID **/ + uint32_t bunchCnt = GET_TRMCHAINHEADER_BUNCHCNT(mDecoderSummary.trmChainHeader[itrm][ichain]); + if (bunchCnt != gbtBunchCnt) { + mCheckerSummary.DiagnosticWord[iword] |= DIAGNOSTIC_TRMCHAIN_BUNCHCNT_MISMATCH(ichain); #ifdef CHECKER_COUNTER - mTRMChainCounters[itrm][ichain].BunchIDMismatch++; + mTRMChainCounters[itrm][ichain].BunchIDMismatch++; #endif #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - printf(" TRM Chain BunchID / DRM L0BCID mismatch: %d / %d (slotID=%d, chain=%d) \n", bunchCnt, gbtBunchCnt, slotID, ichain); - } + if (mCheckerVerbose) { + printf(" TRM Chain BunchID / DRM L0BCID mismatch: %d / %d (slotId=%d, chain=%d) \n", bunchCnt, gbtBunchCnt, slotId, ichain); + } #endif - } + } - } /** end of loop over TRM chains **/ - } /** end of loop over TRMs **/ + /** clear TRM chain summary data **/ + mDecoderSummary.trmChainHeader[itrm][ichain] = 0x0; + mDecoderSummary.trmChainTrailer[itrm][ichain] = 0x0; + + } /** end of loop over TRM chains **/ - /** check current diagnostic word **/ - auto iword = mCheckerSummary.nDiagnosticWords; - if (mCheckerSummary.DiagnosticWord[iword] & 0xFFFFFFF0) - mCheckerSummary.nDiagnosticWords++; + /** clear TRM summary data **/ + mDecoderSummary.trmDataHeader[itrm] = 0x0; + mDecoderSummary.trmDataTrailer[itrm] = 0x0; + + } /** end of loop over TRMs **/ + + /** check current diagnostic word **/ + auto iword = mCheckerSummary.nDiagnosticWords; + if (mCheckerSummary.DiagnosticWord[iword] & 0xFFFFFFF0) + mCheckerSummary.nDiagnosticWords++; #ifdef CHECKER_VERBOSE - if (mCheckerVerbose) { - std::cout << colorBlue - << "--- END CHECK EVENT: " << mDecoderSummary.nDiagnosticWords << " diagnostic words" - << colorReset - << std::endl; - } + if (mCheckerVerbose) { + std::cout << colorBlue + << "--- END CHECK EVENT: " << mCheckerSummary.nDiagnosticWords << " diagnostic words" + << colorReset + << std::endl; + } #endif - return false; -} + /** clear DRM summary data **/ + mDecoderSummary.tofDataHeader = 0x0; + mDecoderSummary.drmDataHeader = 0x0; + mDecoderSummary.drmDataTrailer = 0x0; -void Compressor::checkSummary() -{ - char chname[2] = {'a', 'b'}; - - std::cout << colorBlue - << "--- SUMMARY COUNTERS: " << mCounter << " events " - << colorReset - << std::endl; - if (mCounter == 0) - return; - printf("\n"); - printf(" DRM "); - float drmheaders = 100. * (float)mDRMCounters.Headers / (float)mCounter; - printf(" \033%sheaders: %5.1f %%\033[0m ", drmheaders < 100. ? "[1;31m" : "[0m", drmheaders); - if (mDRMCounters.Headers == 0) - return; - float cbit = 100. * (float)mDRMCounters.CBit / float(mDRMCounters.Headers); - printf(" \033%sCbit: %5.1f %%\033[0m ", cbit > 0. ? "[1;31m" : "[0m", cbit); - float fault = 100. * (float)mDRMCounters.Fault / float(mDRMCounters.Headers); - printf(" \033%sfault: %5.1f %%\033[0m ", fault > 0. ? "[1;31m" : "[0m", cbit); - float rtobit = 100. * (float)mDRMCounters.RTOBit / float(mDRMCounters.Headers); - printf(" \033%sRTObit: %5.1f %%\033[0m ", rtobit > 0. ? "[1;31m" : "[0m", cbit); - printf("\n"); - // std::cout << "-----------------------------------------------------------" << std::endl; - // printf(" LTM | headers: %5.1f %% \n", 0.); - for (int itrm = 0; itrm < 10; ++itrm) { + return false; + } + + void Compressor::resetCounters() + { + mEventCounter = 0; + mFatalCounter = 0; + mErrorCounter = 0; + mDRMCounters = {0}; + for (int itrm = 0; itrm < 10; ++itrm) { + mTRMCounters[itrm] = {0}; + for (int ichain = 0; ichain < 2; ++ichain) { + mTRMChainCounters[itrm][ichain] = {0}; + }} + } + + void Compressor::checkSummary() + { + char chname[2] = {'a', 'b'}; + + std::cout << colorBlue + << "--- SUMMARY COUNTERS: " << mEventCounter << " events " + << " | " << mFatalCounter << " decode fatals " + << " | " << mErrorCounter << " decode errors " + << colorReset + << std::endl; + if (mEventCounter == 0) + return; + printf("\n"); + printf(" DRM "); + float drmheaders = 100. * (float)mDRMCounters.Headers / (float)mEventCounter; + printf(" \033%sheaders: %5.1f %%\033[0m ", drmheaders < 100. ? "[1;31m" : "[0m", drmheaders); + if (mDRMCounters.Headers == 0) + return; + float cbit = 100. * (float)mDRMCounters.clockStatus / float(mDRMCounters.Headers); + printf(" \033%sCbit: %5.1f %%\033[0m ", cbit > 0. ? "[1;31m" : "[0m", cbit); + float fault = 100. * (float)mDRMCounters.Fault / float(mDRMCounters.Headers); + printf(" \033%sfault: %5.1f %%\033[0m ", fault > 0. ? "[1;31m" : "[0m", cbit); + float rtobit = 100. * (float)mDRMCounters.RTOBit / float(mDRMCounters.Headers); + printf(" \033%sRTObit: %5.1f %%\033[0m ", rtobit > 0. ? "[1;31m" : "[0m", cbit); printf("\n"); - printf(" %2d TRM ", itrm + 3); - float trmheaders = 100. * (float)mTRMCounters[itrm].Headers / float(mDRMCounters.Headers); - printf(" \033%sheaders: %5.1f %%\033[0m ", trmheaders < 100. ? "[1;31m" : "[0m", trmheaders); - if (mTRMCounters[itrm].Headers == 0.) { + // std::cout << "-----------------------------------------------------------" << std::endl; + // printf(" LTM | headers: %5.1f %% \n", 0.); + for (int itrm = 0; itrm < 10; ++itrm) { printf("\n"); - continue; - } - float empty = 100. * (float)mTRMCounters[itrm].Empty / (float)mTRMCounters[itrm].Headers; - printf(" \033%sempty: %5.1f %%\033[0m ", empty > 0. ? "[1;31m" : "[0m", empty); - float evCount = 100. * (float)mTRMCounters[itrm].EventCounterMismatch / (float)mTRMCounters[itrm].Headers; - printf(" \033%sevCount: %5.1f %%\033[0m ", evCount > 0. ? "[1;31m" : "[0m", evCount); - float ebit = 100. * (float)mTRMCounters[itrm].EBit / (float)mTRMCounters[itrm].Headers; - printf(" \033%sEbit: %5.1f %%\033[0m ", ebit > 0. ? "[1;31m" : "[0m", ebit); - printf(" \n"); - for (int ichain = 0; ichain < 2; ++ichain) { - printf(" %c ", chname[ichain]); - float chainheaders = 100. * (float)mTRMChainCounters[itrm][ichain].Headers / (float)mTRMCounters[itrm].Headers; - printf(" \033%sheaders: %5.1f %%\033[0m ", chainheaders < 100. ? "[1;31m" : "[0m", chainheaders); - if (mTRMChainCounters[itrm][ichain].Headers == 0) { - printf("\n"); - continue; + printf(" %2d TRM ", itrm + 3); + float trmheaders = 100. * (float)mTRMCounters[itrm].Headers / float(mDRMCounters.Headers); + printf(" \033%sheaders: %5.1f %%\033[0m ", trmheaders < 100. ? "[1;31m" : "[0m", trmheaders); + if (mTRMCounters[itrm].Headers == 0.) { + printf("\n"); + continue; + } + float empty = 100. * (float)mTRMCounters[itrm].Empty / (float)mTRMCounters[itrm].Headers; + printf(" \033%sempty: %5.1f %%\033[0m ", empty > 0. ? "[1;31m" : "[0m", empty); + float evCount = 100. * (float)mTRMCounters[itrm].EventCounterMismatch / (float)mTRMCounters[itrm].Headers; + printf(" \033%sevCount: %5.1f %%\033[0m ", evCount > 0. ? "[1;31m" : "[0m", evCount); + float ebit = 100. * (float)mTRMCounters[itrm].EBit / (float)mTRMCounters[itrm].Headers; + printf(" \033%sEbit: %5.1f %%\033[0m ", ebit > 0. ? "[1;31m" : "[0m", ebit); + printf(" \n"); + for (int ichain = 0; ichain < 2; ++ichain) { + printf(" %c ", chname[ichain]); + float chainheaders = 100. * (float)mTRMChainCounters[itrm][ichain].Headers / (float)mTRMCounters[itrm].Headers; + printf(" \033%sheaders: %5.1f %%\033[0m ", chainheaders < 100. ? "[1;31m" : "[0m", chainheaders); + if (mTRMChainCounters[itrm][ichain].Headers == 0) { + printf("\n"); + continue; + } + float status = 100. * mTRMChainCounters[itrm][ichain].BadStatus / (float)mTRMChainCounters[itrm][ichain].Headers; + printf(" \033%sstatus: %5.1f %%\033[0m ", status > 0. ? "[1;31m" : "[0m", status); + float bcid = 100. * mTRMChainCounters[itrm][ichain].BunchIDMismatch / (float)mTRMChainCounters[itrm][ichain].Headers; + printf(" \033%sbcID: %5.1f %%\033[0m ", bcid > 0. ? "[1;31m" : "[0m", bcid); + float tdcerr = 100. * mTRMChainCounters[itrm][ichain].TDCerror / (float)mTRMChainCounters[itrm][ichain].Headers; + printf(" \033%sTDCerr: %5.1f %%\033[0m ", tdcerr > 0. ? "[1;31m" : "[0m", tdcerr); + printf("\n"); } - float status = 100. * mTRMChainCounters[itrm][ichain].BadStatus / (float)mTRMChainCounters[itrm][ichain].Headers; - printf(" \033%sstatus: %5.1f %%\033[0m ", status > 0. ? "[1;31m" : "[0m", status); - float bcid = 100. * mTRMChainCounters[itrm][ichain].BunchIDMismatch / (float)mTRMChainCounters[itrm][ichain].Headers; - printf(" \033%sbcID: %5.1f %%\033[0m ", bcid > 0. ? "[1;31m" : "[0m", bcid); - float tdcerr = 100. * mTRMChainCounters[itrm][ichain].TDCerror / (float)mTRMChainCounters[itrm][ichain].Headers; - printf(" \033%sTDCerr: %5.1f %%\033[0m ", tdcerr > 0. ? "[1;31m" : "[0m", tdcerr); - printf("\n"); } + printf("\n"); } - printf("\n"); -} } // namespace tof } // namespace o2 diff --git a/Detectors/TOF/compression/src/CompressorTask.cxx b/Detectors/TOF/compression/src/CompressorTask.cxx index 7674c6541ccd5..8653e824f7691 100644 --- a/Detectors/TOF/compression/src/CompressorTask.cxx +++ b/Detectors/TOF/compression/src/CompressorTask.cxx @@ -16,6 +16,7 @@ #include "TOFCompression/CompressorTask.h" #include "Framework/ControlService.h" #include "Framework/ConfigParamRegistry.h" +#include "Framework/WorkflowSpec.h" using namespace o2::framework; @@ -38,6 +39,12 @@ void CompressorTask::init(InitContext& ic) mCompressor.setDecoderVerbose(decoderVerbose); mCompressor.setEncoderVerbose(encoderVerbose); mCompressor.setCheckerVerbose(checkerVerbose); + + auto finishFunction = [this]() { + LOG(INFO) << "Compressor finish"; + mCompressor.checkSummary(); + }; + ic.services().get().set(CallbackService::Id::Stop, finishFunction); } void CompressorTask::run(ProcessingContext& pc) @@ -45,15 +52,21 @@ void CompressorTask::run(ProcessingContext& pc) LOG(DEBUG) << "Compressor run"; /** receive input **/ - auto dataFrame = pc.inputs().get("dataframe"); - mCompressor.setDecoderBuffer(const_cast(dataFrame->mBuffer)); - - /** run **/ - mCompressor.run(); + for (auto& input : pc.inputs()) { + const auto* header = DataRefUtils::getHeader(input); + auto payload = const_cast(input.payload); + auto payloadSize = header->payloadSize; + mCompressor.setDecoderBuffer(payload); + mCompressor.setDecoderBufferSize(payloadSize); + + /** run **/ + mCompressor.run(); + + /** push output **/ + mDataFrame.mSize = mCompressor.getEncoderByteCounter(); + pc.outputs().snapshot(Output{"TOF", "CMPDATAFRAME", 0, Lifetime::Timeframe}, mDataFrame); - /** push output **/ - mDataFrame.mSize = mCompressor.getEncoderByteCounter(); - pc.outputs().snapshot(Output{"TOF", "CMPDATAFRAME", 0, Lifetime::Timeframe}, mDataFrame); + } } DataProcessorSpec CompressorTask::getSpec() @@ -63,9 +76,9 @@ DataProcessorSpec CompressorTask::getSpec() return DataProcessorSpec{ "tof-compressor", - Inputs{InputSpec("dataframe", "TOF", "RAWDATAFRAME", 0, Lifetime::Timeframe)}, // inputs - Outputs{OutputSpec("TOF", "CMPDATAFRAME", 0, Lifetime::Timeframe)}, // outputs - AlgorithmSpec{adaptFromTask()}, // call constructor + execute init (check) + select("x:TOF/RAWDATA"), + Outputs{OutputSpec("TOF", "CMPDATAFRAME", 0, Lifetime::Timeframe)}, + AlgorithmSpec{adaptFromTask()}, Options{ {"tof-compressor-decoder-verbose", VariantType::Bool, false, {"Decoder verbose flag"}}, {"tof-compressor-encoder-verbose", VariantType::Bool, false, {"Encoder verbose flag"}}, diff --git a/Detectors/TOF/compression/src/RawReaderTask.cxx b/Detectors/TOF/compression/src/RawReaderTask.cxx index 707795c18735c..30be6cc779a71 100644 --- a/Detectors/TOF/compression/src/RawReaderTask.cxx +++ b/Detectors/TOF/compression/src/RawReaderTask.cxx @@ -16,6 +16,7 @@ #include "TOFCompression/RawReaderTask.h" #include "Framework/ControlService.h" #include "Framework/ConfigParamRegistry.h" +#include "Headers/RAWDataHeader.h" using namespace o2::framework; @@ -28,7 +29,8 @@ void RawReaderTask::init(InitContext& ic) { LOG(INFO) << "RawReader init"; auto filename = ic.options().get("tof-raw-filename"); - + mBuffer.reserve(1048576); + /** open file **/ if (mFile.is_open()) { LOG(WARNING) << "a file was already open, closing"; @@ -53,12 +55,25 @@ void RawReaderTask::run(ProcessingContext& pc) return; } - /** read file **/ - mFile.read(mDataFrame.mBuffer, mDataFrame.mSize); - - /** push the data **/ - pc.outputs().snapshot(Output{"TOF", "RAWDATAFRAME", 0, Lifetime::Timeframe}, mDataFrame); + /** read full HBF **/ + int headerSize = sizeof(o2::header::RAWDataHeader); + char* inputPointer = mBuffer.data(); + mFile.read(inputPointer, headerSize); + inputPointer += headerSize; + auto rdh = reinterpret_cast(inputPointer); + while (!rdh->stop) { + auto dataSize = rdh->offsetToNext - headerSize; + mFile.read(inputPointer, dataSize); + inputPointer += dataSize; + mFile.read(inputPointer, headerSize); + rdh = reinterpret_cast(inputPointer); + inputPointer += headerSize; + } + mBuffer.resize(inputPointer - mBuffer.data()); + auto freefct = [](void* data, void* hint) {}; // simply ignore the cleanup for the test + pc.outputs().adoptChunk(Output{"TOF", "RAWDATAFRAME", 0, Lifetime::Timeframe}, mBuffer.data(), mBuffer.size(), freefct, nullptr); + /** check eof **/ if (mFile.eof()) { LOG(WARNING) << "nothig else to read"; diff --git a/Detectors/TOF/compression/src/tof-compressor.cxx b/Detectors/TOF/compression/src/tof-compressor.cxx index 4b83d1f21d98a..e55a25bcb89e9 100644 --- a/Detectors/TOF/compression/src/tof-compressor.cxx +++ b/Detectors/TOF/compression/src/tof-compressor.cxx @@ -39,7 +39,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) // add devices (Spec) to the workflow WorkflowSpec specs; - specs.emplace_back(o2::tof::RawReaderTask::getSpec()); + // specs.emplace_back(o2::tof::RawReaderTask::getSpec()); specs.emplace_back(o2::tof::CompressorTask::getSpec()); specs.emplace_back(o2::tof::CompressedWriterTask::getSpec());