]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSRawStreamSDD.h
Another histos for lumi
[u/mrichter/AliRoot.git] / ITS / AliITSRawStreamSDD.h
index 29308c7a08acd64b7f7f8cd5d9be61f6d67bf96a..d9ec48d8a5855a961b66492821bf9486eeb470d6 100644 (file)
@@ -7,11 +7,12 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 ///
-/// This class provides access to ITS SDD digits in raw data.
-///
+/// This class provides access to ITS SDD digits in raw data 
+/// (default=simulated data).
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "AliITSRawStream.h"
+#include "AliITSDDLModuleMapSDD.h"
 
 class AliRawReader;
 
@@ -19,26 +20,86 @@ class AliRawReader;
 class AliITSRawStreamSDD: public AliITSRawStream {
   public :
     AliITSRawStreamSDD(AliRawReader* rawReader);
-    virtual ~AliITSRawStreamSDD() {};
+    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();
 
-    Int_t            GetAnode() const {return fCoord1;};
-    Int_t            GetTime() const {return fCoord2;};
+    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;}  
+
 
-    enum {kDDLOffset = 0x200};    // offset for DDL numbers
-    enum {kDDLsNumber = 12};      // number of DDLs in SDD
-    enum {kModulesPerDDL = 22};   // number of modules in each DDL 
+    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(); 
 
-    static Int_t     GetModuleNumber(UInt_t iDDL, UInt_t iModule)
-      {return fgkDDLModuleMap[iDDL][iModule];}
+    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;
 
-  private :
-    static const Int_t fgkDDLModuleMap[kDDLsNumber][kModulesPerDDL];  // mapping DDL/module -> module number
+    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, 0) // class for reading ITS SDD raw digits
+    ClassDef(AliITSRawStreamSDD, 14) // class for reading ITS SDD raw digits
 };
 
 #endif