#ifndef ALIVZERORAWSTREAM_H
#define ALIVZERORAWSTREAM_H
#include <TObject.h>
#include <TMath.h>
class AliRawReader;
class AliVZEROTriggerData;
class AliVZERORawStream: public TObject {
public :
AliVZERORawStream(AliRawReader* rawReader);
virtual ~AliVZERORawStream();
virtual void Reset();
virtual Bool_t Next();
ULong64_t GetBBScalers(Int_t channel) const
{ return fBBScalers[channel]; }
ULong64_t GetBGScalers(Int_t channel) const
{ return fBGScalers[channel]; }
UInt_t GetTriggerScalers(Int_t num_scaler) const
{ return fScalers[num_scaler]; }
UInt_t GetBunchNumbersMB(Int_t num_bunch) const
{ return fBunchNumbers[num_bunch]; }
UShort_t GetChargeMB(Int_t channel, Int_t num_bunch) const
{ return fChargeMB[channel][num_bunch]; }
Bool_t GetIntMBFlag(Int_t channel, Int_t num_bunch) const
{ return fIsIntMB[channel][num_bunch]; }
Bool_t GetBBMBFlag(Int_t channel, Int_t num_bunch) const
{ return fIsBBMB[channel][num_bunch]; }
Bool_t GetBGMBFlag(Int_t channel, Int_t num_bunch) const
{ return fIsBGMB[channel][num_bunch]; }
Short_t GetADC(Int_t channel) const
{ return TMath::MaxElement(kNEvOfInt, fADC[channel]); }
Short_t GetPedestal(Int_t channel, Int_t event) const
{ return fADC[channel][event]; }
Bool_t GetIntegratorFlag(Int_t channel, Int_t event) const
{ return fIsInt[channel][event]; }
Bool_t GetBBFlag(Int_t channel, Int_t event) const
{ return fIsBB[channel][event]; }
Bool_t GetBGFlag(Int_t channel, Int_t event) const
{ return fIsBG[channel][event]; }
Short_t GetTime(Int_t channel) const
{ return fTime[channel]; }
Short_t GetWidth(Int_t channel) const
{ return fWidth[channel]; }
UShort_t GetTriggerInputs() const
{ return fTrigger; }
UShort_t GetTriggerInputsMask() const
{ return fTriggerMask; }
void CalculateChargeForCentrTriggers(AliVZEROTriggerData *triggerData,
UShort_t &chargeA, UShort_t &chargeC) const;
void CalculateBBandBGFlags(AliVZEROTriggerData *triggerData,
UChar_t &nBBA, UChar_t &nBBC,
UChar_t &nBGA, UChar_t &nBGC) const;
void FillTriggerBits(AliVZEROTriggerData *triggerData);
Int_t GetOfflineChannel(Int_t channel) const
{ Int_t fOfflineChannel[64] = {39, 38, 37, 36, 35, 34, 33, 32,
47, 46, 45, 44, 43, 42, 41, 40,
55, 54, 53, 52, 51, 50, 49, 48,
63, 62, 61, 60, 59, 58, 57, 56,
7, 6, 5, 4, 3, 2, 1, 0,
15, 14, 13, 12, 11, 10, 9, 8,
23, 22, 21, 20, 19, 18, 17, 16,
31, 30, 29, 28, 27, 26, 25, 24};
return fOfflineChannel[channel]; }
enum EVZERORawDataParams {
kNChannels = 64,
kNEvOfInt = 21,
kNScalers = 16,
kNBunches = 10
};
enum EVZERORawStreamError {
kRawDataSizeErr = 1
};
private:
AliVZERORawStream(const AliVZERORawStream& stream);
AliVZERORawStream& operator = (const AliVZERORawStream& stream);
UInt_t GetNextWord();
UShort_t GetNextShort();
ULong64_t fBBScalers[kNChannels];
ULong64_t fBGScalers[kNChannels];
UInt_t fScalers[kNScalers];
UInt_t fBunchNumbers[kNBunches];
UShort_t fChargeMB[kNChannels][kNBunches];
Bool_t fIsIntMB[kNChannels][kNBunches];
Bool_t fIsBBMB[kNChannels][kNBunches];
Bool_t fIsBGMB[kNChannels][kNBunches];
Short_t fADC[kNChannels][kNEvOfInt];
Bool_t fIsInt[kNChannels][kNEvOfInt];
Bool_t fIsBB[kNChannels][kNEvOfInt];
Bool_t fIsBG[kNChannels][kNEvOfInt];
Short_t fTime[kNChannels];
Short_t fWidth[kNChannels];
UShort_t fTrigger;
UShort_t fTriggerMask;
Int_t fPosition;
AliRawReader* fRawReader;
UChar_t* fData;
ClassDef(AliVZERORawStream, 0)
};
#endif