]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDRawStream.h
Avoid some overlaps.
[u/mrichter/AliRoot.git] / TRD / AliTRDRawStream.h
index 9a8e112e7cd7302bb07faba678545c233e169ffe..9d0164c77f882c5876e577caaede9e7c34a76a28 100644 (file)
 
 /* $Id$ */
 
-///////////////////////////////////////////////////////////////////////////////
-//                                                                           //
-// This class provides access to TRD digits in raw data.                     //
-//                                                                           //
-///////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////
+//                                                                        //
+// This class provides access to TRD digits in raw data.                  //
+//                                                                        //
+////////////////////////////////////////////////////////////////////////////
 
 #include <TObject.h>
+#include "AliTRDrawStreamBase.h"
 
-class AliTRDgeometry;
 class AliRawReader;
+
+class AliTRDgeometry;
 class AliTRDdigitsManager;
-class AliTRDdataArrayI;
 
 // Some constants:
-const UInt_t endoftrackletmarker = 0xAAAAAAAA; /*This marks the end of tracklet data words*/
-const UInt_t endofeventmarker    = 0x00000000; /*This marks the end of half-chamber-data*/
+const UInt_t kEndoftrackletmarker = 0xAAAAAAAA; /*This marks the end of tracklet data words*/
+const UInt_t kEndofrawdatamarker  = 0x00000000; /*This marks the end of half-chamber-data*/
+const UInt_t kSizeWord            = sizeof(UInt_t);
 
-class AliTRDRawStream: public TObject {
+//class AliTRDRawStream: public TObject {
+class AliTRDRawStream: public AliTRDrawStreamBase {
 
   public :
 
     AliTRDRawStream();
     AliTRDRawStream(AliRawReader *rawReader);
-    AliTRDRawStream(AliRawReader *rawReader, AliTRDdigitsManager *man, AliTRDdataArrayI *dig);
     virtual ~AliTRDRawStream();
 
-    virtual Bool_t       Next();              // Next function (for fRawVersion = 0 (Bogdans first version))
-    virtual Bool_t       ReadAll();           // Read function (for fRawVersion > 0)
-
-    Int_t                GetDetector() const                        { return fDetector;       };
-    Int_t                GetPrevDetector() const                    { return fPrevDetector;   };
-    Bool_t               IsNewDetector() const                      { return fDetector != fPrevDetector; };
-    Int_t                GetNPads() const                           { return fNPads;          };
-    Int_t                GetRow() const                             { return fRow;            };
-    Int_t                GetPrevRow() const                         { return fPrevRow;        };
-    Bool_t               IsNewRow() const                           { return (fRow != fPrevRow) || IsNewDetector();  };
-    Int_t                GetColumn() const                          { return fColumn;         };
-    Int_t                GetPrevColumn() const                      { return fPrevColumn;     };
-    Bool_t               IsNewColumn() const                        { return (fColumn != fPrevColumn) || IsNewRow(); };
-    Int_t                GetTime() const                            { return fTime-1;         };
-    Int_t                GetSignal() const                          { return fSignal;         };
-
-    enum { kDDLOffset = 0x400 };              // Offset for DDL numbers
+    virtual Bool_t       Next();                                // Read the next data
+    virtual Int_t        NextChamber(AliTRDdigitsManager *man); // Read next chamber data
+    virtual Bool_t        Init();                                // Init for the fRawVersion > 1
 
-    void                 SetDigitsManager(AliTRDdigitsManager *man) { fDigitsManager   = man; };
-    void                 SetDigits(AliTRDdataArrayI *dig)           { fDigits          = dig; };
-
-    AliTRDdigitsManager *GetDigitsManager() const                   { return fDigitsManager;  };
+    enum { kDDLOffset = 0x400 };                                // Offset for DDL numbers
 
     Bool_t               SetRawVersion(Int_t rv);
     Int_t                GetRawVersion() const                      { return fRawVersion;     };
+    void                 SetRawReader(AliRawReader *rawReader);
 
-    // Get Filter settings:
+    // Get Filter settings (does not make a lot of sense):
     Int_t                TRAPfilterTCon() const                     { return fTCon;           };
     Int_t                TRAPfilterPEDon() const                    { return fPEDon;          };
     Int_t                TRAPfilterGAINon() const                   { return fGAINon;         };
-    Int_t                TRAPsendsFilterdData() const               { return fFiltered;       };
+    Int_t                TRAPsendsUnfilteredData() const            { return fBypass;         };
 
-    // Get Tracklet parameters:
+    // Get Tracklet parameters (does not make a lot of sense):
     Float_t              GetTrackletPID() const                     { return fTracklPID;      };
     Float_t              GetTrackletDeflLength() const              { return fTracklDefL;     };
     Float_t              GetTrackletPadPos() const                  { return fTracklPadPos;   };
-    Int_t                getTrackletPadRow() const                  { return fTracklPadRow;   };
+    Int_t                GetTrackletPadRow() const                  { return fTracklPadRow;   };
 
     // Check if the link has optical power (HC sends data)
     Bool_t               IsGTULinkActive(Int_t sm, Int_t la, Int_t sta, Int_t side)
       { return ( ((fGTUlinkMask[sm][sta]) >> (2*la+side)) & 0x1 ); };
 
+    Int_t *GetSignals() const          { return (Int_t*)fSig;     } // Signals in the three time bins from Data Word
+    Int_t  GetADC() const              { return fADC;     } // MCM ADC channel and Time Bin of word 1
+    Int_t  GetTimeBin() const          { return fTB - 3;  } // MCM ADC channel and Time Bin of word 1
+    Int_t  GetEventNumber() const      { return fEv;      } // MCM Event number and position of current MCM
+    Int_t  GetROB() const              { return fROB;     } // MCM Event number and position of current MCM
+    Int_t  GetMCM() const              { return fMCM;     } // MCM Event number and position of current MCM
+    Int_t  GetSM() const               { return fSM;      } // Position of CURRENT half chamber in full TRD
+    Int_t  GetLayer() const            { return fLAYER;   } // PLANE = Position of CURRENT half chamber in full TRD
+    Int_t  GetStack() const            { return fSTACK;   } // CHAMBER = Position of CURRENT half chamber in full TRD
+    Int_t  GetROC() const              { return fROC;     } // Position of CURRENT half chamber in full TRD
+    Int_t  GetSide() const             { return fSIDE;    } // Position of CURRENT half chamber in full TRD
+    Int_t  GetDCS() const              { return fDCS;     } // DCS board number read from data (HC header)
+    Int_t  GetRow() const              { return fROW;     }
+    Int_t  GetCol() const              { return fCOL;     } // Detector Pad coordinates
+    Int_t  GetDet() const              { return fDET;     } // Helper
+    Int_t  GetLastDet() const          { return fLastDET; } // Helper
+    Int_t  GetMaxRow() const           { return fRowMax;  }
+    Int_t  GetMaxCol() const           { return fColMax;  }
+    Int_t  GetNumberOfTimeBins() const { return fTBins;   }
+
+ protected:
+
+    AliTRDgeometry *fGeo;                                   // TRD geometry
+
+    void   DecodeHCheader(Int_t timeBins);
+    void   DecodeMCMheader();
+    void   DecodeTracklet();
+    void   DecodeGTUlinkMask();
+    Int_t  DecodeDataWord();
+    Int_t  DecodeDataWordV1V2();                            // Valid for fRawversion = 1, 2, ... 
+    Int_t  DecodeDataWordV3();                              // Valid for fRawversion = 3, ... 
+
+    Int_t  NextData();                                      // Get the next piece of memory
+
+    enum { kStart
+         , kStop
+         , kWordOK
+         , kNoMoreData
+         , kNextSM
+         , kNextHC
+         , kSeekNonEoTracklet
+         , kDecodeHC
+         , kNextMCM
+         , kNextData
+         , kReading };
 
   private :
 
@@ -88,8 +119,10 @@ class AliTRDRawStream: public TObject {
     Int_t    fROC;                            //  Position of CURRENT half chamber in full TRD
     Int_t    fSIDE;                           //  Position of CURRENT half chamber in full TRD
     Int_t    fDCS;                            //  DCS board number read from data (HC header)
-    Int_t    fROW;
+    Int_t    fROW;                            //  Detector Row coordinates
     Int_t    fCOL;                            //  Detector Pad coordinates
+    Int_t    fDET;                            //  Current detector - version > 1
+    Int_t    fLastDET;                        //  Previous detector - version > 1
 
     Int_t    fBCctr;                          //  Counters from HC header (>=V2)
     Int_t    fPTctr;                          //  Counters from HC header (>=V2)
@@ -98,10 +131,15 @@ class AliTRDRawStream: public TObject {
     Int_t    fRVminor;                        //  Raw version numbers and number of additional HC headerwords (>=V2)
     Int_t    fHCHWords;                       //  Raw version numbers and number of additional HC headerwords (>=V2)
     Int_t    fTBins;                          //  Number of time bins read from HC header (>=V2)
-    Int_t    fTCon;                           //  Filter settings read from HC header (>=V2)
-    Int_t    fPEDon;                          //  Filter settings read from HC header (>=V2)
-    Int_t    fGAINon;                         //  Filter settings read from HC header (>=V2)
-    Int_t    fFiltered;                       //  Filter settings read from HC header (>=V2)
+    Bool_t   fTCon;                           //  Filter settings read from HC header (>=V2)
+    Bool_t   fPEDon;                          //  Filter settings read from HC header (>=V2)
+    Bool_t   fGAINon;                         //  Filter settings read from HC header (>=V2)
+    Bool_t   fXTon;                           //  Filter settings read from HC header (>=V2)
+    Bool_t   fNonLinOn;                       //  Filter settings read from HC header (>=V2)
+    Bool_t   fBypass;                         //  Filter settings read from HC header (>=V2)
+    Int_t    fCommonAdditive;                 //  Common baseline additive read from HC header (>=V2)
+
+    Bool_t   fZeroSuppressed;                 // Data is zero suppressed
 
     Int_t    fHCHctr1;                        //  HC and MCM Header counter
     Int_t    fHCHctr2;                        //  HC and MCM Header counter
@@ -109,6 +147,7 @@ class AliTRDRawStream: public TObject {
     Int_t    fMCMHctr2;                       //  HC and MCM Header counter
     Int_t    fGTUctr1;                        //  GTU LinkMask Counter
     Int_t    fGTUctr2;                        //  GTU LinkMask Counter
+    Int_t    fHCdataCtr;                      //  Data Counter for half chamber
 
     Float_t  fTracklPID;                      //  Tracklet parameters
     Float_t  fTracklDefL;                     //  Tracklet parameters
@@ -122,51 +161,48 @@ class AliTRDRawStream: public TObject {
 
     AliRawReader *fRawReader;              //  Object for reading the raw data
 
-    // The following is used for v0:
-    Int_t    fCount;                       //  Counter of bytes to be read for current detector
-    Int_t    fDetector;                    //  Index of current detector
-    Int_t    fPrevDetector;                //  Index of previous detector
-    Int_t    fNPads;                       //  Number of active pads
-    Int_t    fRow;                         //  Index of current pad row
-    Int_t    fPrevRow;                     //  Index of previous pad row
-    Int_t    fColumn;                      //  Index of current pad column
-    Int_t    fPrevColumn;                  //  Index of previous pad column
-    Int_t    fTime;                        //  Index of current time bin
-    Int_t    fSignal;                      //  Signal in ADC counts
-
-    // This is again new:
     Int_t    fRawVersion;                  //  Which version of raw data decoding is used
-    UInt_t   fDataWord;                    //  The current 32 bit data word
-    Int_t    fStatus;                      //  Status of Raw data Reading
+
+    Int_t    fNextStatus;                  //  Navigation in raw versions > 1
+    UInt_t   fTbSwitch;                    //  Time Bin Switch for internal use
+    UInt_t   fTbSwitchCtr;                 //  Counter for internal use
+    UInt_t   fTimeWords;                   //  Number of Words needed to store the data of 1 ADC ch.
+    UInt_t   fWordCtr;                     //  Word Counter
 
     Int_t    fRowMax;                      //  Maximum number of pad rows and columns
     Int_t    fColMax;                      //  Maximum number of pad rows and columns
-    Bool_t   fChamberDone[540];            //  Chamber was processed already?
-
- protected:
-
-    AliTRDgeometry *fGeo;                  //  TRD geometry
-
-    AliTRDdigitsManager *fDigitsManager;   //! Manager for the output digits
-    AliTRDdataArrayI    *fDigits;          //! Output digits
-    AliTRDdataArrayI    *fTrack0;          //! Track dictionary
-    AliTRDdataArrayI    *fTrack1;          //! Track dictionary
-    AliTRDdataArrayI    *fTrack2;          //! Track dictionary
-
-    void  DecodeHCheader(Int_t timeBins);
-    void  DecodeHCheaderV1();              // Valid for fRawversion = 1
-    void  DecodeHCheaderV2(Int_t imeBins); // Valid for fRawversion = 2,3,4
-
-    void  DecodeMCMheader();
-    void  DecodeMCMheaderV1();             // Valid for fRawversion = 1,2,3,4
-
-    void  DecodeTracklet();
-    void  DecodeTrackletV1();              // Valid for fRawversion = 1,2,3,4
-
-    void  DecodeGTUlinkMask();
-    void  DecodeGTUlinkMaskV1();           // Valid for fRawversion = 1,2,3,4
 
-    ClassDef(AliTRDRawStream, 2)           // Class for reading TRD raw digits
+    Bool_t   fADCmask[21];                 //  Mask of active ADCs for zero suppression
+    UShort_t fChamberDone[540];            //  Chamber was processed already (1=1HC, 2=full chamber)
+
+    Int_t    fRetVal;                      //  Datadecode return
+    Int_t    fEqID;                        //  Equipment id
+    UInt_t   fDataSize;                    //  Size of the data available in the current buffer
+    Bool_t   fSizeOK;                      //  Did we read anything
+    UInt_t   fCountBytes;                  //  Bytes traversed in the buffer
+    UInt_t   fBufSize;                     //  Size of the current RawReader buffer
+    Bool_t   fBufferSet;                   //  Is the RawReader buffer available
+    UChar_t *fPos;                         //  Position in the buffer of the RawReader
+    UInt_t  *fDataWord;                    //  The pointer to the current 32 bit data word
+    UInt_t   fTimeBinsCalib;               //  N of time bins retrieved from calibration
+
+    enum ETRDzRawStreamError {
+       kHCWordMissing = 1                  //
+      ,kMCMADCMaskMissing = 2              //
+      ,kWrongMCMorROB = 3                  //
+      ,kGTULinkMaskMissing = 4             //
+      ,kHCHeaderCorrupt = 5                //
+      ,kHCHeaderMissing = 6                //
+      ,kROBSideMismatch = 7                //
+      ,kWrongPadrow = 8                    //
+      ,kWrongPadcolumn = 9                 //
+      ,kTrackletRowMismatch = 10           //
+      ,kDataMaskError = 11                 //
+      ,kADCNumberOverflow = 12             //
+      ,kADCChannelOverflow = 13            //
+    };
+    
+    ClassDef(AliTRDRawStream, 6)           // Class for reading TRD raw digits
 
 };
 #endif