#include "AliRawReader.h"
#include "AliLog.h"
#include "AliAltroRawStream.h"
+#include "AliRawEventHeaderBase.h"
ClassImp(AliAltroRawStreamV3)
fBunchLength(-1),
fBadChannel(kFALSE),
fPayloadSize(-1),
+ fChannelPayloadSize(-1),
fBunchDataPointer(NULL),
fBunchDataIndex(-1),
fRCUTrailerData(NULL),
fActiveFECsB(0),
fAltroCFG1(0),
fAltroCFG2(0),
- fOldStream(NULL)
+ fOldStream(NULL),
+ fCheckAltroPayload(kTRUE)
{
// Constructor
// Create an object to read Altro raw digits in
fBunchLength(stream.fBunchLength),
fBadChannel(stream.fBadChannel),
fPayloadSize(stream.fPayloadSize),
+ fChannelPayloadSize(stream.fChannelPayloadSize),
fBunchDataPointer(stream.fBunchDataPointer),
fBunchDataIndex(stream.fBunchDataIndex),
fRCUTrailerData(stream.fRCUTrailerData),
fActiveFECsB(stream.fActiveFECsB),
fAltroCFG1(stream.fAltroCFG1),
fAltroCFG2(stream.fAltroCFG2),
- fOldStream(NULL)
+ fOldStream(NULL),
+ fCheckAltroPayload(stream.fCheckAltroPayload)
{
// Copy constructor
// Copy the bunch data array
fBunchLength = stream.fBunchLength;
fBadChannel = stream.fBadChannel;
fPayloadSize = stream.fPayloadSize;
+ fChannelPayloadSize= stream.fChannelPayloadSize;
fBunchDataPointer = stream.fBunchDataPointer;
fBunchDataIndex = stream.fBunchDataIndex;
fRCUTrailerData = stream.fRCUTrailerData;
*fOldStream = *stream.fOldStream;
}
+ fCheckAltroPayload = stream.fCheckAltroPayload;
+
return *this;
}
fBunchLength = fStartTimeBin = -1;
fBadChannel = kFALSE;
fPayloadSize = -1;
+ fChannelPayloadSize = -1;
fBunchDataPointer = NULL;
fBunchDataIndex = -1;
} while (fRawReader->GetDataSize() == 0);
fDDLNumber = fRawReader->GetDDLID();
+ fChannelPayloadSize = -1;
UChar_t rcuVer = fRawReader->GetBlockAttributes();
fActiveFECsB = fOldStream->GetActiveFECsB();
fAltroCFG1 = fOldStream->GetAltroCFG1();
fAltroCFG2 = fOldStream->GetAltroCFG2();
+ if (fRawReader->GetType() == AliRawEventHeaderBase::kStartOfData)
+ fPayloadSize = fOldStream->GetRCUPayloadSizeInSOD();
}
return status;
}
// RCU signals readout error in this channel
if (fOldStream) {
Bool_t status = fOldStream->NextChannel();
- if (status) fHWAddress = fOldStream->GetHWAddress();
+ if (status) {
+ fHWAddress = fOldStream->GetHWAddress();
+ fChannelPayloadSize = fOldStream->GetChannelPayloadSize();
+ }
return status;
}
fCount = -1;
fBadChannel = kFALSE;
fBunchDataIndex = 0;
+ fBunchLength = -1;
UInt_t word = 0;
do {
// extract channel payload and hw address
fCount = (word >> 16) & 0x3FF;
+ fChannelPayloadSize = fCount;
fHWAddress = word & 0xFFF;
// Now unpack the altro data
return status;
}
+ Int_t prevTimeBin = (fBunchLength > 0) ? fStartTimeBin-fBunchLength+1 : 1024;
fBunchLength = fStartTimeBin = -1;
fBunchDataPointer = NULL;
if ((fBunchDataIndex >= fCount) || fBadChannel) return kFALSE;
fBunchLength = fBunchData[fBunchDataIndex];
+ if (fBunchLength <= 2) {
+ // Invalid bunch size
+ AliWarning(Form("Too short bunch length (%d) in Address=0x%x !",
+ fBunchLength,fHWAddress));
+ fRawReader->AddMinorErrorLog(kAltroBunchHeadErr,Form("hw=0x%x",fHWAddress));
+ fCount = fBunchLength = -1;
+ return kFALSE;
+ }
if ((fBunchDataIndex + fBunchLength) > fCount) {
// Too long bunch detected
AliWarning(Form("Too long bunch detected in Address=0x%x ! Expected <= %d 10-bit words, found %d !",
fBunchLength -= 2;
fStartTimeBin = fBunchData[fBunchDataIndex++];
+ if (fCheckAltroPayload) {
+ if ((fStartTimeBin-fBunchLength+1) < 0) {
+ AliWarning(Form("Invalid start time-bin in Address=0x%x ! (%d-%d+1) < 0",
+ fHWAddress,fStartTimeBin,fBunchLength));
+ fRawReader->AddMinorErrorLog(kAltroPayloadErr,Form("hw=0x%x",fHWAddress));
+ fCount = fBunchLength = -1;
+ return kFALSE;
+ }
+ if (fStartTimeBin >= prevTimeBin) {
+ AliWarning(Form("Invalid start time-bin in Address=0x%x ! (%d>=%d)",
+ fHWAddress,fStartTimeBin,prevTimeBin));
+ fRawReader->AddMinorErrorLog(kAltroPayloadErr,Form("hw=0x%x",fHWAddress));
+ fCount = fBunchLength = -1;
+ return kFALSE;
+ }
+ }
fBunchDataPointer = &fBunchData[fBunchDataIndex];
if (fRawReader) fRawReader->AddMinorErrorLog(kBadAltroMapping,message);
}
+
+//_____________________________________________________________________________
+UChar_t *AliAltroRawStreamV3::GetRCUPayloadInSOD() const
+{
+ // Get a pointer to the data in case
+ // of SOD events
+ if (fRawReader) {
+ if (fRawReader->GetType() == AliRawEventHeaderBase::kStartOfData) {
+ return fData;
+ }
+ }
+ return NULL;
+}
+
+//_____________________________________________________________________________
+Int_t AliAltroRawStreamV3::GetRCUPayloadSizeInSOD() const
+{
+ // Get the size of the RCU data in case
+ // of SOD events
+ if (fRawReader) {
+ if (fRawReader->GetType() == AliRawEventHeaderBase::kStartOfData) {
+ return fPayloadSize;
+ }
+ }
+ return -1;
+}