#ifndef ALIALTRORAWSTREAM_H
#define ALIALTRORAWSTREAM_H
#include <TObject.h>
class AliRawReader;
class AliAltroRawStream: public TObject {
public :
AliAltroRawStream(AliRawReader* rawReader);
virtual ~AliAltroRawStream();
virtual void Reset();
virtual Bool_t Next();
virtual Bool_t NextDDL(UChar_t* data = NULL);
virtual Bool_t NextChannel();
virtual Bool_t NextBunch(UShort_t *bunchData,
Int_t &bunchLength,
Int_t &startTimeBin);
Int_t GetDDLNumber() const { return fDDLNumber; }
Int_t GetPrevDDLNumber() const { return fPrevDDLNumber; }
Bool_t IsNewDDLNumber() const {return (fDDLNumber != fPrevDDLNumber);};
Int_t GetRCUId() const { return fRCUId; }
Int_t GetPrevRCUId() const { return fPrevRCUId; }
Bool_t IsNewRCUId() const {return (fRCUId != fPrevRCUId);};
Int_t GetHWAddress() const { return fHWAddress; }
Int_t GetPrevHWAddress() const { return fPrevHWAddress; }
Bool_t IsNewHWAddress() const {return (fHWAddress != fPrevHWAddress) || IsNewDDLNumber();};
Int_t GetTime() const { return fTime; }
Int_t GetPrevTime() const { return fPrevTime; }
Bool_t IsNewTime() const {return (fTime != fPrevTime) || IsNewHWAddress();};
Int_t GetSignal() const { return fSignal; }
Int_t GetTimeLength() const { return fTimeBunch; }
Int_t GetChannelPayloadSize() const { return fChannelPayloadSize; }
Int_t GetRCUPayloadSizeInSOD() const;
Int_t GetBranch() const;
Int_t GetFEC() const;
Int_t GetAltro() const;
Int_t GetChannel() const;
Bool_t GetRCUTrailerData(UChar_t*& data) const;
Int_t GetRCUTrailerSize() const { return fRCUTrailerSize; }
UInt_t GetFECERRA() const { return fFECERRA; }
UInt_t GetFECERRB() const { return fFECERRB; }
UShort_t GetERRREG2() const { return fERRREG2; }
UShort_t GetNChAddrMismatch() const { return fERRREG3; }
UShort_t GetNChLengthMismatch() const { return fERRREG4; }
UShort_t GetActiveFECsA() const { return fActiveFECsA; }
UShort_t GetActiveFECsB() const { return fActiveFECsB; }
UInt_t GetAltroCFG1() const { return fAltroCFG1; }
UChar_t GetBaselineCorr() const { return fAltroCFG1 & 0xF; }
Bool_t GetPolarity() const { return (fAltroCFG1 >> 4) & 0x1; }
UChar_t GetNPresamples() const { return (fAltroCFG1 >> 5) & 0x3; }
UChar_t GetNPostsamples() const { return (fAltroCFG1 >> 7) & 0xF; }
Bool_t GetSecondBaselineCorr() const { return (fAltroCFG1 >> 11) & 0x1; }
UChar_t GetGlitchFilter() const { return (fAltroCFG1 >> 12) & 0x3; }
UChar_t GetNNonZSPostsamples() const { return (fAltroCFG1 >> 14) & 0x7; }
UChar_t GetNNonZSPresamples() const { return (fAltroCFG1 >> 17) & 0x3; }
Bool_t GetZeroSupp() const { return (fAltroCFG1 >> 19) & 0x1; }
UInt_t GetAltroCFG2() const { return fAltroCFG2; }
Bool_t GetNAltroBuffers() const { return (fAltroCFG2 >> 24) & 0x1; }
UChar_t GetNPretriggerSamples() const{ return (fAltroCFG2 >> 20) & 0xF; }
UShort_t GetNSamplesPerCh() const { return (fAltroCFG2 >> 10) & 0x3FF; }
Bool_t GetSparseRO() const { return (fAltroCFG2 >> 9) & 0x1; }
Double_t GetTSample() const;
Double_t GetL1Phase() const;
void PrintRCUTrailer() const;
void SelectRawData(Int_t detId);
void SelectRawData(const char *detName);
void SetShortDataHeader(Bool_t flag) { fIsShortDataHeader = flag; }
void PrintDebug() const;
void AddMappingErrorLog(const char *message = NULL);
enum EAltroRawStreamError {
kRCUTrailerSizeErr = 1,
kAltroTrailerErr = 2,
kBunchLengthReadErr = 3,
kTimeBinReadErr = 4,
kAmplitudeReadErr = 5,
k32bitWordReadErr = 6,
kBadAltroMapping = 7,
kRCUTrailerErr = 8
};
AliAltroRawStream& operator = (const AliAltroRawStream& stream);
AliAltroRawStream(const AliAltroRawStream& stream);
protected:
Bool_t fIsShortDataHeader;
private :
UShort_t GetNextWord();
Bool_t ReadTrailer();
void ReadBunch();
void ReadAmplitude();
Int_t GetPosition();
UInt_t Get32bitWord(Int_t &index);
Int_t ReadRCUTrailer(Int_t &index, Int_t trailerSize);
Int_t fDDLNumber;
Int_t fPrevDDLNumber;
Int_t fRCUId;
Int_t fPrevRCUId;
Short_t fHWAddress;
Short_t fPrevHWAddress;
Int_t fTime;
Int_t fPrevTime;
Int_t fSignal;
Int_t fTimeBunch;
AliRawReader* fRawReader;
UChar_t* fData;
Int_t fPosition;
Int_t fCount;
Int_t fChannelPayloadSize;
Int_t fBunchLength;
UChar_t* fRCUTrailerData;
Int_t fRCUTrailerSize;
UInt_t fFECERRA;
UInt_t fFECERRB;
UShort_t fERRREG2;
UShort_t fERRREG3;
UShort_t fERRREG4;
UShort_t fActiveFECsA;
UShort_t fActiveFECsB;
UInt_t fAltroCFG1;
UInt_t fAltroCFG2;
ClassDef(AliAltroRawStream, 0)
};
#endif