#include "AliAltroRawStreamV3.h"
#include "AliRawReader.h"
#include "AliLog.h"
+#include "AliAltroRawStream.h"
ClassImp(AliAltroRawStreamV3)
fFECERRB(0),
fERRREG2(0),
fERRREG3(0),
- fERRREG4(0),
fActiveFECsA(0),
fActiveFECsB(0),
fAltroCFG1(0),
- fAltroCFG2(0)
+ fAltroCFG2(0),
+ fOldStream(NULL)
{
// Constructor
// Create an object to read Altro raw digits in
AliAltroRawStreamV3::~AliAltroRawStreamV3()
{
// destructor
-// nothing to do
+// delete old stream object if one exists
+ if (fOldStream) delete fOldStream;
}
//_____________________________________________________________________________
fFECERRB(stream.fFECERRB),
fERRREG2(stream.fERRREG2),
fERRREG3(stream.fERRREG3),
- fERRREG4(stream.fERRREG4),
fActiveFECsA(stream.fActiveFECsA),
fActiveFECsB(stream.fActiveFECsB),
fAltroCFG1(stream.fAltroCFG1),
- fAltroCFG2(stream.fAltroCFG2)
+ fAltroCFG2(stream.fAltroCFG2),
+ fOldStream(NULL)
{
// Copy constructor
// Copy the bunch data array
for(Int_t i = 0; i < kMaxNTimeBins; i++) fBunchData[i] = stream.fBunchData[i];
+
+ if (stream.fOldStream)
+ fOldStream = new AliAltroRawStream(*stream.fOldStream);
}
//_____________________________________________________________________________
fFECERRB = stream.fFECERRB;
fERRREG2 = stream.fERRREG2;
fERRREG3 = stream.fERRREG3;
- fERRREG4 = stream.fERRREG4;
fActiveFECsA = stream.fActiveFECsA;
fActiveFECsB = stream.fActiveFECsB;
fAltroCFG1 = stream.fAltroCFG1;
for(Int_t i = 0; i < kMaxNTimeBins; i++) fBunchData[i] = stream.fBunchData[i];
+ if (stream.fOldStream) {
+ if (fOldStream) delete fOldStream;
+ fOldStream = new AliAltroRawStream(stream.fRawReader);
+ *fOldStream = *stream.fOldStream;
+ }
+
return *this;
}
fRCUTrailerData = NULL;
fRCUTrailerSize = 0;
- fFECERRA = fFECERRB = fERRREG2 = fERRREG3 = fERRREG4 = fActiveFECsA = fActiveFECsB = fAltroCFG1 = fAltroCFG2 = 0;
+ fFECERRA = fFECERRB = fERRREG2 = fERRREG3 = fActiveFECsA = fActiveFECsB = fAltroCFG1 = fAltroCFG2 = 0;
if (fRawReader) fRawReader->Reset();
+ if (fOldStream) fOldStream->Reset();
}
//_____________________________________________________________________________
UChar_t rcuVer = fRawReader->GetBlockAttributes();
- if (!ReadRCUTrailer(rcuVer)) return kFALSE;
+ if (rcuVer < 2) {
+ // old altro format data
+ if (!fOldStream) {
+ fOldStream = new AliAltroRawStream(fRawReader);
+ AliInfo(Form("RCU firmware verion %d detected. Using AliAltroRawStream to decode the data.",
+ rcuVer));
+ }
+ Bool_t status = fOldStream->NextDDL(fData);
+ if (status) {
+ fRCUId = fOldStream->GetRCUId();
+ fRCUTrailerSize = fOldStream->GetRCUTrailerSize();
+ fOldStream->GetRCUTrailerData(fRCUTrailerData);
+ fFECERRA = fOldStream->GetFECERRA();
+ fFECERRB = fOldStream->GetFECERRB();
+ fERRREG2 = fOldStream->GetERRREG2();
+ fERRREG3 = ((UInt_t)fOldStream->GetNChAddrMismatch()) |
+ (((UInt_t)fOldStream->GetNChLengthMismatch()) << 12);
+ fActiveFECsA = fOldStream->GetActiveFECsA();
+ fActiveFECsB = fOldStream->GetActiveFECsB();
+ fAltroCFG1 = fOldStream->GetAltroCFG1();
+ fAltroCFG2 = fOldStream->GetAltroCFG2();
+ }
+ return status;
+ }
- return kTRUE;
+ return ReadRCUTrailer(rcuVer);
}
//_____________________________________________________________________________
// Updates the channel hardware address member and
// channel data size. Sets the error flag in case
// RCU signals readout error in this channel
+ if (fOldStream) {
+ Bool_t status = fOldStream->NextChannel();
+ if (status) fHWAddress = fOldStream->GetHWAddress();
+ return status;
+ }
+
fCount = -1;
fBadChannel = kFALSE;
fBunchDataIndex = 0;
// raw-data stream.
// Updates the start/end time-bins
// and the array with altro samples
+ if (fOldStream) {
+ Bool_t status = fOldStream->NextBunch(fBunchData,fBunchLength,fStartTimeBin);
+ if (status) fBunchDataPointer = &fBunchData[0];
+ else fBunchDataPointer = NULL;
+ return status;
+ }
+
fBunchLength = fStartTimeBin = -1;
fBunchDataPointer = NULL;
break;
case 3:
// ERR_REG3
- fERRREG3 = parData & 0xFFF;
+ fERRREG3 = parData & 0x1FFFFFF;
break;
case 4:
- // ERR_REG4
- fERRREG4 = parData & 0xFFF;
- break;
- case 5:
// FEC_RO_A
fActiveFECsA = parData & 0xFFFF;
break;
- case 6:
+ case 5:
// FEC_RO_B
fActiveFECsB = parData & 0xFFFF;
break;
- case 7:
+ case 6:
// RDO_CFG1
fAltroCFG1 = parData & 0xFFFFF;
break;
- case 8:
+ case 7:
// RDO_CFG2
fAltroCFG2 = parData & 0x1FFFFFF;
break;