ROOT logo
#ifndef ALIITSRAWSTREAMSPD_H
#define ALIITSRAWSTREAMSPD_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 SPD digits in raw data.
///
///////////////////////////////////////////////////////////////////////////////

#include "AliRawReader.h"
#include "AliITSRawStream.h"
#include "AliITSRawStreamSPDErrorLog.h"

class AliITSRawStreamSPD: public AliITSRawStream {
  public :
    AliITSRawStreamSPD(AliRawReader* rawReader);
    AliITSRawStreamSPD(const AliITSRawStreamSPD& rstream);
    AliITSRawStreamSPD& operator=(const AliITSRawStreamSPD& rstream);
    virtual ~AliITSRawStreamSPD() {};

    virtual Bool_t  Next();
    virtual Int_t   ReadCalibHeader();

    // the 2 methods below are equivalent to AliITSRawStream::GetCoord1 and GetCoord2
    // together with the AliITSRawStream::GetModuleID these are the "offline" coordinates
    Int_t    GetColumn() const {return fCoord1;};
    Int_t    GetRow() const {return fCoord2;};

    // together with the AliRawReader::GetDDLID() these are the "online" coordinates
    UShort_t GetHalfStaveNr() const {return fHalfStaveNr;}
    UShort_t GetChipAddr() const {return fChipAddr;}
    Int_t    GetChipCol() const {return fCol;};
    Int_t    GetChipRow() const {return fRow;};

    // module mapping
    static Int_t GetModuleNumber(UInt_t iDDL, UInt_t iModule);
    static Int_t GetModuleNumber(UInt_t iDDL, UInt_t iHS, UInt_t iChip) 
      {return GetOfflineModuleFromOnline(iDDL,iHS,iChip);}

    // coordinate conversions:
    static Bool_t OfflineToOnline(UInt_t module, UInt_t colM, UInt_t RowM, UInt_t& eq, UInt_t& hs, UInt_t& chip, UInt_t& col, UInt_t& row);
    static Bool_t OnlineToOffline(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t col, UInt_t row, UInt_t& module, UInt_t& colM, UInt_t& rowM);
    // coordinate conversions - offline->online
    static UInt_t GetOnlineEqIdFromOffline(UInt_t module);
    static UInt_t GetOnlineHSFromOffline(UInt_t module);
    static UInt_t GetOnlineChipFromOffline(UInt_t module, UInt_t colM);
    static UInt_t GetOnlineColFromOffline(UInt_t module, UInt_t colM);
    static UInt_t GetOnlineRowFromOffline(UInt_t module, UInt_t rowM);
    // coordinate conversions - online->offline
    static UInt_t GetOfflineModuleFromOnline(UInt_t eqId, UInt_t hs, UInt_t chip);
    static UInt_t GetOfflineChipKeyFromOnline(UInt_t eqId, UInt_t hs, UInt_t chip);
    static UInt_t GetOfflineColFromOnline(UInt_t eqId, UInt_t hs, UInt_t chip, UInt_t col);
    static UInt_t GetOfflineRowFromOnline(UInt_t eqId, UInt_t hs, UInt_t chip, UInt_t row);

    Bool_t  GetFastOrSignal(UInt_t eq, UInt_t hs, UInt_t chip);

    Int_t   GetEventCounter() const {return fEventCounter;}    // get last read event counter value
    Short_t GetEventCounterFullEq(UInt_t eq) const;
    Short_t GetEventCounterFullHS(UInt_t eq, UInt_t hs) const;
    Short_t GetEventCounterFullChip(UInt_t eq, UInt_t hs, UInt_t chip) const;
    Bool_t  IsEventCounterFullConsistent() const;

    Bool_t IsActiveEq(UInt_t eq) const;
    Bool_t IsActiveHS(UInt_t eq, UInt_t hs) const;
    Bool_t IsActiveChip(UInt_t eq, UInt_t hs, UInt_t chip) const;

    Bool_t GetHalfStavePresent(UInt_t hs);

    Int_t  GetHword(UInt_t index);
    // use the methods below to extract the information from the scan calibration header:
    UInt_t GetHrouterNr() const {return (fCalHeadWord[0] & 0x0000003f);}
    Bool_t GetHhalfStaveScanned(UInt_t hs) const;
    UInt_t GetHtype() const {return (Int_t)((fCalHeadWord[1]) & 0x000000ff);}
    Bool_t GetHdataFormat() const {return (Bool_t)(((fCalHeadWord[1]) & 0x00000100)>>8);}
    UInt_t GetHtriggers() const {return fCalHeadWord[2];}
    Bool_t GetHchipPresent(UInt_t hs, UInt_t chip) const;
    UInt_t GetHdacStart() const {return ((fCalHeadWord[5]>>24) & 0x000000ff);}
    UInt_t GetHdacEnd() const {return ((fCalHeadWord[5]>>16) & 0x000000ff);}
    UInt_t GetHdacStep() const {return ((fCalHeadWord[5]>>8) & 0x000000ff);}
    UInt_t GetHdacId() const {return ((fCalHeadWord[5]) & 0x000000ff);}
    UInt_t GetHrowStart() const {return (UInt_t) ((fCalHeadWord[6]>>24) & 0x000000ff);}
    UInt_t GetHrowEnd() const {return (UInt_t) ((fCalHeadWord[6]>>16) & 0x000000ff);}
    UInt_t GetHrowValue() const {return (UInt_t) ((fCalHeadWord[6]>> 8) & 0x000000ff);}
    UInt_t GetHrowSpan() const {return (UInt_t) ((fCalHeadWord[6]) & 0x000000ff);}    
    UInt_t GetHdacValue() const {return (Int_t) ((fCalHeadWord[6]) & 0x000000ff);}
    UInt_t GetHdacHigh(UInt_t hs) const;
    UInt_t GetHdacLow(UInt_t hs) const;
    UInt_t GetHTPAmp(UInt_t hs) const;
    Bool_t GetHminTHchipPresent(UInt_t chip) const;
    UInt_t GetHglobalDBversion() const {return fCalHeadWord[16];}
    // use the methods below to extract the information from the fo calibration header:
    UInt_t GetFOHrouterNr() const {return GetHrouterNr();}
    UInt_t GetFOHtype() const {return GetHtype();}
    UInt_t GetFOHtriggers() const {return GetHtriggers();}
    Bool_t GetFOHchipPresent(UInt_t hs, UInt_t chip) const {return GetHchipPresent(hs,chip);}
    UInt_t GetFOHglobalDBversion() const {return fCalHeadWord[5];}
    UInt_t GetFOHMatrixID() const {return fCalHeadWord[6] & 0x0000000f;}
    UInt_t GetFOHpixelCol() const {return (fCalHeadWord[6] >> 20) & 0x0000001f;}
    UInt_t GetFOHpixelRow() const {return (fCalHeadWord[6] >> 10) & 0x000000ff;}
    UInt_t GetFOHnumDacs() const;
    UInt_t GetFOHdacIndex(UInt_t index) const;
    UInt_t GetFOHdacValue(UInt_t index) const;
    UInt_t GetFOHchipCount(UInt_t hs, UInt_t chip) const;

    void   ActivateAdvancedErrorLog(Bool_t activate, AliITSRawStreamSPDErrorLog* advLogger = NULL);
    AliITSRawStreamSPDErrorLog* GetAdvancedErrorLog() {return fAdvLogger;}

    static const Char_t* GetErrorName(UInt_t errorCode);

    enum {kDDLsNumber = 20};      // number of DDLs in SPD
    enum {kModulesPerDDL = 12};   // number of modules in each DDL
    enum {kCalHeadLenMax = 64};   // maximum number of calib header words
    enum ESPDRawStreamError {
      kTotal,
      kHeaderMissingErr,
      kTrailerMissingErr,
      kTrailerWithoutHeaderErr,
      kHeaderCountErr,
      kTrailerCountErr,
      kFillUnexpectErr,
      kFillMissingErr,
      kWrongFillWordErr,
      kNumberHitsErr,
      kEventCounterErr,
      kDDLNumberErr,
      kHSNumberErr,
      kChipAddrErr,
      kCalHeaderLengthErr,
      kAdvEventCounterErr,     // used by SPDmood
      kAdvEventCounterOrderErr,// used by SPDmood
      kTrailerErrorBitErr,
      kLinkRxDetectorFatalErr,
      kTSMtriggerErr,
      kHighMultiplicityFlag
    };

  private :
    static const Int_t fgkDDLModuleMap[kDDLsNumber][kModulesPerDDL];  // mapping DDL/module -> module number

    Bool_t      ReadNextShort();
    Bool_t      ReadNextInt();
    void        NewEvent();
    void	CheckHeaderAndTrailerCount(Int_t ddlID);

    Int_t       fEventCounter;                // chip event counter
    Short_t     fEventCounterFull[20][6][10]; // chip event counter

    UShort_t    fChipAddr;                    // chip nr
    UShort_t    fHalfStaveNr;                 // half stave nr
    UInt_t      fCol;                         // chip column nr
    UInt_t      fRow;                         // chip row nr
    UInt_t      fCalHeadWord[kCalHeadLenMax]; // calibration header words
    UInt_t      fCalHeadLen;                  // calibration header length

    UShort_t    fData;            // 16 bit data word read
    UInt_t      fOffset;          // offset for cell column
    UInt_t      fHitCount;        // counter of hits
    UChar_t     fDataChar1, fDataChar2, fDataChar3, fDataChar4; // temps part of a 32bit word
    Bool_t      fFirstWord;       // keeps track of which of the two 16bit words out of the 32bit word to read when ReadNextShort is called
    Bool_t      fCalHeadRead[20];            // calibration header read flags (reset at new event)
    UInt_t      fPrevEventId;                // previous event id (needed to know if there is a new event)

    UInt_t      fEqPLBytesRead;              // bytes read for current equipment payload
    UInt_t      fEqPLChipHeadersRead;        // number of chip headers found in current equipment payload
    UInt_t      fEqPLChipTrailersRead;       // number of chip trailers found in current equipment payload
    Bool_t      fHeaderOrTrailerReadLast;    // in previous words, was a header (true) or a trailer (false) read last
    UInt_t      fExpectedHeaderTrailerCount; // expected number of headers and trailers for the current equipment payload
    Bool_t      fFillOutOfSynch;             // has a fill word been put in the wrong place?
    Int_t       fDDLID;                      // ddl id 
    Int_t       fLastDDLID;                  // ddl id for equipment read in previous words

    Bool_t      fAdvancedErrorLog;           // is the advanced error logging activated?
    AliITSRawStreamSPDErrorLog *fAdvLogger;  // pointer to special error logger object

    Bool_t      fFastOrSignal[20][6][10];    // fastor signal bit (one per chip)

    Bool_t      fActiveEq[20];               // which equipments are active (found in data)
    Bool_t      fActiveHS[20][6];            // which half-staves are active (blockattribute bits)
    Bool_t      fActiveChip[20][6][10];      // which chips are active (found in data)

    ClassDef(AliITSRawStreamSPD, 0) // class for reading ITS SPD raw digits
};

#endif
 AliITSRawStreamSPD.h:1
 AliITSRawStreamSPD.h:2
 AliITSRawStreamSPD.h:3
 AliITSRawStreamSPD.h:4
 AliITSRawStreamSPD.h:5
 AliITSRawStreamSPD.h:6
 AliITSRawStreamSPD.h:7
 AliITSRawStreamSPD.h:8
 AliITSRawStreamSPD.h:9
 AliITSRawStreamSPD.h:10
 AliITSRawStreamSPD.h:11
 AliITSRawStreamSPD.h:12
 AliITSRawStreamSPD.h:13
 AliITSRawStreamSPD.h:14
 AliITSRawStreamSPD.h:15
 AliITSRawStreamSPD.h:16
 AliITSRawStreamSPD.h:17
 AliITSRawStreamSPD.h:18
 AliITSRawStreamSPD.h:19
 AliITSRawStreamSPD.h:20
 AliITSRawStreamSPD.h:21
 AliITSRawStreamSPD.h:22
 AliITSRawStreamSPD.h:23
 AliITSRawStreamSPD.h:24
 AliITSRawStreamSPD.h:25
 AliITSRawStreamSPD.h:26
 AliITSRawStreamSPD.h:27
 AliITSRawStreamSPD.h:28
 AliITSRawStreamSPD.h:29
 AliITSRawStreamSPD.h:30
 AliITSRawStreamSPD.h:31
 AliITSRawStreamSPD.h:32
 AliITSRawStreamSPD.h:33
 AliITSRawStreamSPD.h:34
 AliITSRawStreamSPD.h:35
 AliITSRawStreamSPD.h:36
 AliITSRawStreamSPD.h:37
 AliITSRawStreamSPD.h:38
 AliITSRawStreamSPD.h:39
 AliITSRawStreamSPD.h:40
 AliITSRawStreamSPD.h:41
 AliITSRawStreamSPD.h:42
 AliITSRawStreamSPD.h:43
 AliITSRawStreamSPD.h:44
 AliITSRawStreamSPD.h:45
 AliITSRawStreamSPD.h:46
 AliITSRawStreamSPD.h:47
 AliITSRawStreamSPD.h:48
 AliITSRawStreamSPD.h:49
 AliITSRawStreamSPD.h:50
 AliITSRawStreamSPD.h:51
 AliITSRawStreamSPD.h:52
 AliITSRawStreamSPD.h:53
 AliITSRawStreamSPD.h:54
 AliITSRawStreamSPD.h:55
 AliITSRawStreamSPD.h:56
 AliITSRawStreamSPD.h:57
 AliITSRawStreamSPD.h:58
 AliITSRawStreamSPD.h:59
 AliITSRawStreamSPD.h:60
 AliITSRawStreamSPD.h:61
 AliITSRawStreamSPD.h:62
 AliITSRawStreamSPD.h:63
 AliITSRawStreamSPD.h:64
 AliITSRawStreamSPD.h:65
 AliITSRawStreamSPD.h:66
 AliITSRawStreamSPD.h:67
 AliITSRawStreamSPD.h:68
 AliITSRawStreamSPD.h:69
 AliITSRawStreamSPD.h:70
 AliITSRawStreamSPD.h:71
 AliITSRawStreamSPD.h:72
 AliITSRawStreamSPD.h:73
 AliITSRawStreamSPD.h:74
 AliITSRawStreamSPD.h:75
 AliITSRawStreamSPD.h:76
 AliITSRawStreamSPD.h:77
 AliITSRawStreamSPD.h:78
 AliITSRawStreamSPD.h:79
 AliITSRawStreamSPD.h:80
 AliITSRawStreamSPD.h:81
 AliITSRawStreamSPD.h:82
 AliITSRawStreamSPD.h:83
 AliITSRawStreamSPD.h:84
 AliITSRawStreamSPD.h:85
 AliITSRawStreamSPD.h:86
 AliITSRawStreamSPD.h:87
 AliITSRawStreamSPD.h:88
 AliITSRawStreamSPD.h:89
 AliITSRawStreamSPD.h:90
 AliITSRawStreamSPD.h:91
 AliITSRawStreamSPD.h:92
 AliITSRawStreamSPD.h:93
 AliITSRawStreamSPD.h:94
 AliITSRawStreamSPD.h:95
 AliITSRawStreamSPD.h:96
 AliITSRawStreamSPD.h:97
 AliITSRawStreamSPD.h:98
 AliITSRawStreamSPD.h:99
 AliITSRawStreamSPD.h:100
 AliITSRawStreamSPD.h:101
 AliITSRawStreamSPD.h:102
 AliITSRawStreamSPD.h:103
 AliITSRawStreamSPD.h:104
 AliITSRawStreamSPD.h:105
 AliITSRawStreamSPD.h:106
 AliITSRawStreamSPD.h:107
 AliITSRawStreamSPD.h:108
 AliITSRawStreamSPD.h:109
 AliITSRawStreamSPD.h:110
 AliITSRawStreamSPD.h:111
 AliITSRawStreamSPD.h:112
 AliITSRawStreamSPD.h:113
 AliITSRawStreamSPD.h:114
 AliITSRawStreamSPD.h:115
 AliITSRawStreamSPD.h:116
 AliITSRawStreamSPD.h:117
 AliITSRawStreamSPD.h:118
 AliITSRawStreamSPD.h:119
 AliITSRawStreamSPD.h:120
 AliITSRawStreamSPD.h:121
 AliITSRawStreamSPD.h:122
 AliITSRawStreamSPD.h:123
 AliITSRawStreamSPD.h:124
 AliITSRawStreamSPD.h:125
 AliITSRawStreamSPD.h:126
 AliITSRawStreamSPD.h:127
 AliITSRawStreamSPD.h:128
 AliITSRawStreamSPD.h:129
 AliITSRawStreamSPD.h:130
 AliITSRawStreamSPD.h:131
 AliITSRawStreamSPD.h:132
 AliITSRawStreamSPD.h:133
 AliITSRawStreamSPD.h:134
 AliITSRawStreamSPD.h:135
 AliITSRawStreamSPD.h:136
 AliITSRawStreamSPD.h:137
 AliITSRawStreamSPD.h:138
 AliITSRawStreamSPD.h:139
 AliITSRawStreamSPD.h:140
 AliITSRawStreamSPD.h:141
 AliITSRawStreamSPD.h:142
 AliITSRawStreamSPD.h:143
 AliITSRawStreamSPD.h:144
 AliITSRawStreamSPD.h:145
 AliITSRawStreamSPD.h:146
 AliITSRawStreamSPD.h:147
 AliITSRawStreamSPD.h:148
 AliITSRawStreamSPD.h:149
 AliITSRawStreamSPD.h:150
 AliITSRawStreamSPD.h:151
 AliITSRawStreamSPD.h:152
 AliITSRawStreamSPD.h:153
 AliITSRawStreamSPD.h:154
 AliITSRawStreamSPD.h:155
 AliITSRawStreamSPD.h:156
 AliITSRawStreamSPD.h:157
 AliITSRawStreamSPD.h:158
 AliITSRawStreamSPD.h:159
 AliITSRawStreamSPD.h:160
 AliITSRawStreamSPD.h:161
 AliITSRawStreamSPD.h:162
 AliITSRawStreamSPD.h:163
 AliITSRawStreamSPD.h:164
 AliITSRawStreamSPD.h:165
 AliITSRawStreamSPD.h:166
 AliITSRawStreamSPD.h:167
 AliITSRawStreamSPD.h:168
 AliITSRawStreamSPD.h:169
 AliITSRawStreamSPD.h:170
 AliITSRawStreamSPD.h:171
 AliITSRawStreamSPD.h:172
 AliITSRawStreamSPD.h:173
 AliITSRawStreamSPD.h:174
 AliITSRawStreamSPD.h:175
 AliITSRawStreamSPD.h:176
 AliITSRawStreamSPD.h:177
 AliITSRawStreamSPD.h:178
 AliITSRawStreamSPD.h:179
 AliITSRawStreamSPD.h:180
 AliITSRawStreamSPD.h:181
 AliITSRawStreamSPD.h:182
 AliITSRawStreamSPD.h:183
 AliITSRawStreamSPD.h:184
 AliITSRawStreamSPD.h:185
 AliITSRawStreamSPD.h:186
 AliITSRawStreamSPD.h:187
 AliITSRawStreamSPD.h:188