17#include <fairlogger/Logger.h>
30 mRawMemoryBuffer = rawmemory;
37 if (headerversion < RDHDecoder::getVersion<o2::header::RDHLowest>() || headerversion > RDHDecoder::getVersion<o2::header::RDHHighest>()) {
38 LOG(error) <<
"Wrong header version " << headerversion;
47 mRawHeaderInitialized =
false;
48 mPayloadInitialized =
false;
50 mNumData = mRawMemoryBuffer.size() / 8192;
60 mCurrentTrailer.
reset();
61 bool isDataTerminated =
false;
66 auto nextheader =
decodeRawHeader(mRawMemoryBuffer.data() + mCurrentPosition);
69 auto currentbc = RDHDecoder::getTriggerBC(mRawHeader),
70 nextbc = RDHDecoder::getTriggerBC(nextheader);
71 auto currentorbit = RDHDecoder::getTriggerOrbit(mRawHeader),
72 nextorbit = RDHDecoder::getTriggerOrbit(nextheader);
73 if (currentbc != nextbc || currentorbit != nextorbit) {
74 isDataTerminated =
true;
76 auto nextpagecounter = RDHDecoder::getPageCounter(nextheader);
77 if (nextpagecounter == 0) {
78 isDataTerminated =
true;
80 isDataTerminated =
false;
87 isDataTerminated =
true;
90 }
while (!isDataTerminated);
99 LOG(warn) <<
"Trailer decoding error: " << e.
what();
101 LOG(error) <<
"Trailer decoding error: " << e.
what();
113 if (doResetPayload) {
116 mRawHeaderInitialized =
false;
117 mPayloadInitialized =
false;
121 mRawHeader =
decodeRawHeader(mRawMemoryBuffer.data() + mCurrentPosition);
122 while (RDHDecoder::getOffsetToNext(mRawHeader) == RDHDecoder::getHeaderSize(mRawHeader) &&
123 mCurrentPosition + RDHDecoder::getHeaderSize(mRawHeader) < mRawMemoryBuffer.size()) {
126 mCurrentPosition += RDHDecoder::getHeaderSize(mRawHeader);
127 mRawHeader =
decodeRawHeader(mRawMemoryBuffer.data() + mCurrentPosition);
129 mRawHeaderInitialized =
true;
133 if (mCurrentPosition + RDHDecoder::getMemorySize(mRawHeader) > mRawMemoryBuffer.size()) {
138 mRawBuffer.
readFromMemoryBuffer(gsl::span<const char>(mRawMemoryBuffer.data() + mCurrentPosition + RDHDecoder::getHeaderSize(mRawHeader),
139 RDHDecoder::getMemorySize(mRawHeader) - RDHDecoder::getHeaderSize(mRawHeader)));
144 mCurrentPosition += RDHDecoder::getOffsetToNext(mRawHeader);
149 if (!mRawHeaderInitialized) {
150 LOG(error) <<
"Raw header not initialized";
@ DECODING_INVALID
Invalid words during decoding.
ErrorType_t getErrorType() const noexcept
Access to error code.
const char * what() const noexcept override
Access to the error message.
void reset()
Reset the RCU trailer.
static RCUTrailer constructFromPayloadWords(const gsl::span< const uint32_t > payloadwords)
void readFromMemoryBuffer(const gsl::span< const char > rawmemory)
Read page from raw memory buffer.
const gsl::span< const uint32_t > getDataWords() const
Get all data words from the raw buffer.
void flush()
Flush the buffer Does not overwrite the word buffer but just resets the counter and iterator.
int getNDataWords() const
Get the number of data words read for the superpage.
@ HEADER_DECODING
Header cannot be decoded (format incorrect)
@ HEADER_INVALID
Header in memory not belonging to requested superpage.
@ PAYLOAD_DECODING
Payload cannot be decoded (format incorrect)
void reset()
Resetting payload words and page counter.
void increasePageCount()
Increase the page counter of the current payload.
void appendPayloadWords(const gsl::span< const uint32_t > payloadwords)
Append many words to the current payload (usually of a given DMA page)
const o2::header::RDHAny & getRawHeader() const
access to the raw header of the current page
RawReaderMemory(const gsl::span< const char > rawmemory)
Constructor.
void setRawMemory(const gsl::span< const char > rawmemory)
set new raw memory chunk
void init()
Initialize the raw stream.
void next()
Read next payload from the stream.
void nextPage(bool resetPayload=true)
Read the next page from the stream (single DMA page)
o2::header::RDHAny decodeRawHeader(const void *headerwords)
bool hasNext() const
check if more pages are available in the raw file
static constexpr int getVersion()
get numeric version of the RDH
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"