ROOT logo
#ifndef ALIITSRAWSTREAMSDD_H
#define ALIITSRAWSTREAMSDD_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */

///////////////////////////////////////////////////////////////////////////////
///
/// This class provides access to ITS SDD digits in raw data 
/// (default=simulated data).
///////////////////////////////////////////////////////////////////////////////

#include "AliITSRawStream.h"
#include "AliITSDDLModuleMapSDD.h"

class AliRawReader;


class AliITSRawStreamSDD: public AliITSRawStream {
  public :
    AliITSRawStreamSDD(AliRawReader* rawReader);
    AliITSRawStreamSDD(const AliITSRawStreamSDD& rs);
    AliITSRawStreamSDD& operator=(const AliITSRawStreamSDD& rs);
    virtual ~AliITSRawStreamSDD();

    static UChar_t ReadBlockAttributes(AliRawReader* rawReader);
    static UInt_t  ReadAMSamplFreqFromCDH(UChar_t cdhAttr){
      if(cdhAttr&0x10) return 40;
      else return 20;
    }
    static AliITSRawStream* CreateRawStreamSDD(AliRawReader* rawReader, UChar_t attributes);
    static AliITSRawStream* CreateRawStreamSDD(AliRawReader* rawReader);

    virtual Bool_t   Next();

    virtual Int_t    GetAnode() const {return fCoord1;}
    virtual Int_t    GetTime() const {return fCoord2;}
    virtual Int_t    GetChannel() const {return fChannel;}
    virtual Int_t    GetEightBitSignal() const {return fEightBitSignal;}
    virtual Int_t    GetCarlosId() const {return fCarlosId;}
    virtual Int_t    GetEventId() const {return fEventId;}
    virtual Int_t    GetJitter() const {return fJitter;}  


    virtual void     SetDecompressAmbra(Bool_t deco=kTRUE){
      fDecompressAmbra=deco;
    }
    virtual void SetDDLModuleMap(AliITSDDLModuleMapSDD* ddlsdd){
      if(!fDDLModuleMap) fDDLModuleMap=new AliITSDDLModuleMapSDD();
      fDDLModuleMap->SetDDLMap(ddlsdd);
    }
    virtual void     SetZeroSuppLowThreshold(Int_t iMod, Int_t iSid, Int_t th) 
      {fLowThresholdArray[iMod][iSid]=th;}
    Int_t   GetModuleNumber(UInt_t iDDL, UInt_t iModule) const {
      if(!fDDLModuleMap) return kSPDModules+1; // dummy module number if the DDL map is not set (case of DAs)
      return fDDLModuleMap->GetModuleNumber(iDDL,iModule);
    }
    virtual void     Reset(); 

    enum {kSDDModules = 260};      // number of SDD modules
    enum {kSPDModules = 240};      // number of SPD modules (used as offset)
    enum {kDDLsNumber = 24};       // number of DDLs in SDD
    enum {kModulesPerDDL = 12};    // number of modules in each DDL 
    enum {kCarlosWords = 12};      // number of FIFOCARLOS Words
    enum {kFifoWords =  4};        // number of FIFO Words
    enum ESDDRawStreamError { 
      kDataError = 1,
      kDataFormatErr = 2
    };
  protected:
    virtual Bool_t   SkipHeaderWord(); 
    virtual UInt_t   ReadBits();
    virtual Int_t    DecompAmbra(Int_t value) const;

    static const UInt_t fgkCodeLength[8]; //code length

    AliITSDDLModuleMapSDD* fDDLModuleMap; // mapping DDL/module -> module number 
    UInt_t           fData;         // data read for file
    Bool_t           fResetSkip;    // flag for end of DDL data

    Int_t            fEventId;      // event ID from header
    Int_t            fCarlosId;     // carlos ID
    Int_t            fChannel;      // current channel
    Int_t            fJitter;          // jitter between L0 and pascal stop (x25ns)
    ULong64_t        fChannelData[kModulesPerDDL][2];// packed data for the 2 channels
    UInt_t           fLastBit[kModulesPerDDL][2];    // last filled bit in fChannelData
    UInt_t           fChannelCode[kModulesPerDDL][2];// current channel code
    Bool_t           fReadCode[kModulesPerDDL][2];   // next bits are code or data
    UInt_t           fReadBits[kModulesPerDDL][2];   // number of bits to read
    Int_t            fLowThresholdArray[kSDDModules][2]; // array with low thresholds for all modules

    Int_t            fNfifo[kFifoWords];  // FIFO number
    Int_t            fTimeBin[kModulesPerDDL][2];  // current timebin [ncarlos][nchannels]
    Int_t            fAnode[kModulesPerDDL][2]; // current anode [ncarlos][nchannels]
    UInt_t           fICarlosWord[kCarlosWords]; // Carlos words
    UInt_t           fIFifoWord[kFifoWords];     // FIFO words
    Int_t            fICountFoot[kModulesPerDDL]; // counter for carlos footer words
    Int_t            fEightBitSignal;    // signal at 8 bit
    Bool_t           fDecompressAmbra; //flag to switch off decompression

    ClassDef(AliITSRawStreamSDD, 14) // class for reading ITS SDD raw digits
};

#endif
 AliITSRawStreamSDD.h:1
 AliITSRawStreamSDD.h:2
 AliITSRawStreamSDD.h:3
 AliITSRawStreamSDD.h:4
 AliITSRawStreamSDD.h:5
 AliITSRawStreamSDD.h:6
 AliITSRawStreamSDD.h:7
 AliITSRawStreamSDD.h:8
 AliITSRawStreamSDD.h:9
 AliITSRawStreamSDD.h:10
 AliITSRawStreamSDD.h:11
 AliITSRawStreamSDD.h:12
 AliITSRawStreamSDD.h:13
 AliITSRawStreamSDD.h:14
 AliITSRawStreamSDD.h:15
 AliITSRawStreamSDD.h:16
 AliITSRawStreamSDD.h:17
 AliITSRawStreamSDD.h:18
 AliITSRawStreamSDD.h:19
 AliITSRawStreamSDD.h:20
 AliITSRawStreamSDD.h:21
 AliITSRawStreamSDD.h:22
 AliITSRawStreamSDD.h:23
 AliITSRawStreamSDD.h:24
 AliITSRawStreamSDD.h:25
 AliITSRawStreamSDD.h:26
 AliITSRawStreamSDD.h:27
 AliITSRawStreamSDD.h:28
 AliITSRawStreamSDD.h:29
 AliITSRawStreamSDD.h:30
 AliITSRawStreamSDD.h:31
 AliITSRawStreamSDD.h:32
 AliITSRawStreamSDD.h:33
 AliITSRawStreamSDD.h:34
 AliITSRawStreamSDD.h:35
 AliITSRawStreamSDD.h:36
 AliITSRawStreamSDD.h:37
 AliITSRawStreamSDD.h:38
 AliITSRawStreamSDD.h:39
 AliITSRawStreamSDD.h:40
 AliITSRawStreamSDD.h:41
 AliITSRawStreamSDD.h:42
 AliITSRawStreamSDD.h:43
 AliITSRawStreamSDD.h:44
 AliITSRawStreamSDD.h:45
 AliITSRawStreamSDD.h:46
 AliITSRawStreamSDD.h:47
 AliITSRawStreamSDD.h:48
 AliITSRawStreamSDD.h:49
 AliITSRawStreamSDD.h:50
 AliITSRawStreamSDD.h:51
 AliITSRawStreamSDD.h:52
 AliITSRawStreamSDD.h:53
 AliITSRawStreamSDD.h:54
 AliITSRawStreamSDD.h:55
 AliITSRawStreamSDD.h:56
 AliITSRawStreamSDD.h:57
 AliITSRawStreamSDD.h:58
 AliITSRawStreamSDD.h:59
 AliITSRawStreamSDD.h:60
 AliITSRawStreamSDD.h:61
 AliITSRawStreamSDD.h:62
 AliITSRawStreamSDD.h:63
 AliITSRawStreamSDD.h:64
 AliITSRawStreamSDD.h:65
 AliITSRawStreamSDD.h:66
 AliITSRawStreamSDD.h:67
 AliITSRawStreamSDD.h:68
 AliITSRawStreamSDD.h:69
 AliITSRawStreamSDD.h:70
 AliITSRawStreamSDD.h:71
 AliITSRawStreamSDD.h:72
 AliITSRawStreamSDD.h:73
 AliITSRawStreamSDD.h:74
 AliITSRawStreamSDD.h:75
 AliITSRawStreamSDD.h:76
 AliITSRawStreamSDD.h:77
 AliITSRawStreamSDD.h:78
 AliITSRawStreamSDD.h:79
 AliITSRawStreamSDD.h:80
 AliITSRawStreamSDD.h:81
 AliITSRawStreamSDD.h:82
 AliITSRawStreamSDD.h:83
 AliITSRawStreamSDD.h:84
 AliITSRawStreamSDD.h:85
 AliITSRawStreamSDD.h:86
 AliITSRawStreamSDD.h:87
 AliITSRawStreamSDD.h:88
 AliITSRawStreamSDD.h:89
 AliITSRawStreamSDD.h:90
 AliITSRawStreamSDD.h:91
 AliITSRawStreamSDD.h:92
 AliITSRawStreamSDD.h:93
 AliITSRawStreamSDD.h:94
 AliITSRawStreamSDD.h:95
 AliITSRawStreamSDD.h:96
 AliITSRawStreamSDD.h:97
 AliITSRawStreamSDD.h:98
 AliITSRawStreamSDD.h:99
 AliITSRawStreamSDD.h:100
 AliITSRawStreamSDD.h:101
 AliITSRawStreamSDD.h:102
 AliITSRawStreamSDD.h:103
 AliITSRawStreamSDD.h:104
 AliITSRawStreamSDD.h:105