#ifndef ALITOFDECODER_H
#define ALITOFDECODER_H
#define DRM_BIT 0x1
#define LTM_BIT 0x2
#define TRM_BIT 0x4
#define CHAIN_A_BIT 0x8
#define CHAIN_B_BIT 0x10
#define DRM_HEADER_STATUS 0x0
#define DRM_TRAILER_STATUS (DRM_BIT)
#define LTM_HEADER_STATUS (DRM_BIT)
#define LTM_TRAILER_STATUS (DRM_BIT|LTM_BIT)
#define TRM_HEADER_STATUS (DRM_BIT)
#define TRM_TRAILER_STATUS (DRM_BIT|TRM_BIT)
#define CHAIN_A_HEADER_STATUS (DRM_BIT|TRM_BIT)
#define CHAIN_A_TRAILER_STATUS (DRM_BIT|TRM_BIT|CHAIN_A_BIT)
#define CHAIN_B_HEADER_STATUS (DRM_BIT|TRM_BIT)
#define CHAIN_B_TRAILER_STATUS (DRM_BIT|TRM_BIT|CHAIN_B_BIT)
#define CHAIN_A_TDC_HIT_STATUS (DRM_BIT|TRM_BIT|CHAIN_A_BIT)
#define CHAIN_B_TDC_HIT_STATUS (DRM_BIT|TRM_BIT|CHAIN_B_BIT)
#define DRM_DATA_WORDS 5
#define LTM_DATA_WORDS 48
#define WORD_TYPE_MASK 0xf0000000
#define SLOT_ID_MASK 0x0000000f
#define GLOBAL_HEADER 0x40000000
#define GLOBAL_TRAILER 0x50000000
#define CHAIN_A_HEADER 0x00000000
#define CHAIN_A_TRAILER 0x10000000
#define CHAIN_B_HEADER 0x20000000
#define CHAIN_B_TRAILER 0x30000000
#define ERROR 0x60000000
#define FILLER 0x70000000
#define PACKING_ENABLED_ACQ 0x0
#define LEADING_ONLY_ACQ 0x1
#define TRAILING_ONLY_ACQ 0x2
#define PACKING_DISABLED_ACQ 0x3
#define PACKED_HIT_PS 0x0
#define LEADING_HIT_PS 0x1
#define TRAILING_HIT_PS 0x2
#define TOT_OVF_HIT_PS 0x3
#define N_EQUIPMENT 72
#define N_DDL N_EQUIPMENT
#define N_TRM 10
#define N_CHAIN 2
#define N_TDC 15
#define N_CHANNEL 8
#define TRM_FIRST_SLOT_ID 3
#define TRM_LAST_SLOT_ID 12
#define TIME_BIN_WIDTH 24.4e-3//ns
#define TOT_BIN_WIDTH 48.8e-3//ns
#define TIME_TO_TOT_BIN_WIDTH ( TIME_BIN_WIDTH / TOT_BIN_WIDTH )
#define TOT_TO_TIME_BIN_WIDTH ( TOT_BIN_WIDTH / TIME_BIN_WIDTH )
#define MAX_TDC_HIT_NUMBER 100
#define MAX_TDC_ERROR_NUMBER 1000
#define MAX_TRM_HIT_NUMBER 2400
#include "TObject.h"
#include "AliTOFRawDataFormat.h"
#include "AliTOFHitData.h"
class AliTOFHitDataBuffer;
struct AliRawDataHeader;
struct AliRawDataHeaderV3;
class AliTOFDecoder : public TObject
{
public:
AliTOFDecoder();
AliTOFDecoder(AliTOFHitDataBuffer *DB, AliTOFHitDataBuffer *PDB);
AliTOFDecoder(const AliTOFDecoder &source);
AliTOFDecoder &operator = (const AliTOFDecoder &source);
~AliTOFDecoder();
Bool_t Decode(const UInt_t *rawData, Int_t nWords, const AliRawDataHeader *cdh, const AliRawDataHeaderV3 *cdhV3=0);
void SetVerbose(Int_t Verbose = 1) {fVerbose = Verbose;};
void SetV2718Patch(Bool_t V2718Patch = kTRUE) {fV2718Patch = V2718Patch;};
void SetDataBuffer(AliTOFHitDataBuffer *DB) {fDataBuffer = DB;};
void SetPackedDataBuffer(AliTOFHitDataBuffer *PDB) {fPackedDataBuffer = PDB;};
void GetArrayDDL(Int_t* array, Int_t iDDL);
void PrintStack(const UInt_t *rawData, Int_t nWords, const AliRawDataHeader *cdh, const AliRawDataHeaderV3 *cdhV3=0);
enum {
kMinPlate0=0,kMaxPlate0=2,
kMinStrip0=0,kMaxStrip0=6,
kMinPadz0=0,kMaxPadz0=1,
kMinPadx0=0,kMaxPadx0=23,
kMinPlate1=0,kMaxPlate1=2,
kMinStrip1=0,kMaxStrip1=7,
kMinPadz1=0,kMaxPadz1=1,
kMinPadx1=24,kMaxPadx1=47,
kMinPlate2=2,kMaxPlate2=4,
kMinStrip2=8,kMaxStrip2=14,
kMinPadz2=0,kMaxPadz2=1,
kMinPadx2=24,kMaxPadx2=47,
kMinPlate3=2,kMaxPlate3=4,
kMinStrip3=7,kMaxStrip3=14,
kMinPadz3=0,kMaxPadz3=1,
kMinPadx3=0,kMaxPadx3=23
};
private:
Bool_t InitializeSpider();
Bool_t ResetSpider();
Bool_t Spider(AliTOFHitData &hitData);
Int_t fVerbose;
Bool_t fV2718Patch;
AliTOFHitDataBuffer *fDataBuffer;
AliTOFHitDataBuffer *fPackedDataBuffer;
Int_t fSpiderCurrentSlotID;
Int_t fSpiderCurrentChain;
Int_t fSpiderCurrentTDC;
Bool_t fSpiderLeadingFlag[8];
AliTOFHitData fSpiderLeadingHit[8];
ClassDef(AliTOFDecoder, 2)
};
#endif /* ALITOFDECODER_H */