]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/AliITSRawStreamSPD.h
Added a protection against bad (wrt pedestal values) channels, and removed an inadequ...
[u/mrichter/AliRoot.git] / ITS / AliITSRawStreamSPD.h
1 #ifndef ALIITSRAWSTREAMSPD_H
2 #define ALIITSRAWSTREAMSPD_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 /* $Id$ */
7
8 ///////////////////////////////////////////////////////////////////////////////
9 ///
10 /// This class provides access to ITS SPD digits in raw data.
11 ///
12 ///////////////////////////////////////////////////////////////////////////////
13
14 #include "AliITSRawStream.h"
15 #include "AliITSRawStreamSPDErrorLog.h"
16
17 class AliITSRawStreamSPD: public AliITSRawStream {
18   public :
19     AliITSRawStreamSPD(AliRawReader* rawReader);
20     AliITSRawStreamSPD(const AliITSRawStreamSPD& rstream);
21     AliITSRawStreamSPD& operator=(const AliITSRawStreamSPD& rstream);
22     virtual ~AliITSRawStreamSPD() {};
23
24     virtual Bool_t  Next();
25     virtual Int_t   ReadCalibHeader();
26
27     // the 2 methods below are equivalent to AliITSRawStream::GetCoord1 and GetCoord2
28     // together with the AliITSRawStream::GetModuleID these are the "offline" coordinates
29     Int_t    GetColumn() const {return fCoord1;};
30     Int_t    GetRow() const {return fCoord2;};
31
32     // together with the AliRawReader::GetDDLID() these are the "online" coordinates
33     UShort_t GetHalfStaveNr() const {return fHalfStaveNr;}
34     UShort_t GetChipAddr() const {return fChipAddr;}
35     Int_t    GetChipCol() const {return fCol;};
36     Int_t    GetChipRow() const {return fRow;};
37
38     // module mapping
39     static Int_t GetModuleNumber(UInt_t iDDL, UInt_t iModule);
40     static Int_t GetModuleNumber(UInt_t iDDL, UInt_t iHS, UInt_t iChip) 
41       {return GetOfflineModuleFromOnline(iDDL,iHS,iChip);}
42
43     // coordinate conversions:
44     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);
45     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);
46     // coordinate conversions - offline->online
47     static UInt_t GetOnlineEqIdFromOffline(UInt_t module);
48     static UInt_t GetOnlineHSFromOffline(UInt_t module);
49     static UInt_t GetOnlineChipFromOffline(UInt_t module, UInt_t colM);
50     static UInt_t GetOnlineColFromOffline(UInt_t module, UInt_t colM);
51     static UInt_t GetOnlineRowFromOffline(UInt_t module, UInt_t rowM);
52     // coordinate conversions - online->offline
53     static UInt_t GetOfflineModuleFromOnline(UInt_t eqId, UInt_t hs, UInt_t chip);
54     static UInt_t GetOfflineColFromOnline(UInt_t eqId, UInt_t hs, UInt_t chip, UInt_t col);
55     static UInt_t GetOfflineRowFromOnline(UInt_t eqId, UInt_t hs, UInt_t chip, UInt_t row);
56
57     Bool_t  GetFastOrSignal(UInt_t eq, UInt_t hs, UInt_t chip);
58
59     Int_t   GetEventCounter() const {return fEventCounter;}    // get last read event counter value
60     Short_t GetEventCounterFullEq(UInt_t eq) const;
61     Short_t GetEventCounterFullHS(UInt_t eq, UInt_t hs) const;
62     Short_t GetEventCounterFullChip(UInt_t eq, UInt_t hs, UInt_t chip) const;
63     Bool_t  IsEventCounterFullConsistent() const;
64
65     Bool_t IsActiveEq(UInt_t eq) const;
66     Bool_t IsActiveHS(UInt_t eq, UInt_t hs) const;
67     Bool_t IsActiveChip(UInt_t eq, UInt_t hs, UInt_t chip) const;
68
69     Bool_t GetHalfStavePresent(UInt_t hs);
70
71     // use the methods below to extract the information from the calibration header
72     UInt_t GetHrouterNr() const {return (fCalHeadWord[0] & 0x0000003f);}
73     Bool_t GetHhalfStaveScanned(UInt_t hs) const;
74     UInt_t GetHtype() const {return (Int_t)((fCalHeadWord[1]) & 0x000000ff);}
75     Bool_t GetHdataFormat() const {return (Bool_t)(((fCalHeadWord[1]) & 0x00000100)>>8);}
76     UInt_t GetHtriggers() const {return fCalHeadWord[2];}
77     Bool_t GetHchipPresent(UInt_t hs, UInt_t chip) const;
78     UInt_t GetHdacStart() const {return ((fCalHeadWord[5]>>24) & 0x000000ff);}
79     UInt_t GetHdacEnd() const {return ((fCalHeadWord[5]>>16) & 0x000000ff);}
80     UInt_t GetHdacStep() const {return ((fCalHeadWord[5]>>8) & 0x000000ff);}
81     UInt_t GetHdacId() const {return ((fCalHeadWord[5]) & 0x000000ff);}
82     UInt_t GetHrowStart() const {return (UInt_t) ((fCalHeadWord[6]>>24) & 0x000000ff);}
83     UInt_t GetHrowEnd() const {return (UInt_t) ((fCalHeadWord[6]>>16) & 0x000000ff);}
84     UInt_t GetHrowValue() const {return (UInt_t) ((fCalHeadWord[6]>> 8) & 0x000000ff);}
85     UInt_t GetHdacValue() const {return (Int_t) ((fCalHeadWord[6]) & 0x000000ff);}
86     UInt_t GetHdacHigh(UInt_t hs) const;
87     UInt_t GetHdacLow(UInt_t hs) const;
88     UInt_t GetHTPAmp(UInt_t hs) const;
89     Bool_t GetHminTHchipPresent(UInt_t chip) const;
90     void   ActivateAdvancedErrorLog(Bool_t activate, AliITSRawStreamSPDErrorLog* advLogger = NULL);
91     static const Char_t* GetErrorName(UInt_t errorCode);
92
93
94     enum {kDDLsNumber = 20};      // number of DDLs in SPD
95     enum {kModulesPerDDL = 12};   // number of modules in each DDL
96     enum {kCalHeadLenMax = 16};   // maximum number of calib header words
97     enum ESPDRawStreamError {
98       kTotal,
99       kHeaderMissingErr,
100       kTrailerMissingErr,
101       kTrailerWithoutHeaderErr,
102       kHeaderCountErr,
103       kTrailerCountErr,
104       kFillUnexpectErr,
105       kFillMissingErr,
106       kWrongFillWordErr,
107       kNumberHitsErr,
108       kEventCounterErr,
109       kDDLNumberErr,
110       kHSNumberErr,
111       kChipAddrErr,
112       kCalHeaderLengthErr,
113       kAdvEventCounterErr,     // used by SPDmood
114       kAdvEventCounterOrderErr,// used by SPDmood
115       kTrailerErrorBitErr
116     };
117
118   private :
119     static const Int_t fgkDDLModuleMap[kDDLsNumber][kModulesPerDDL];  // mapping DDL/module -> module number
120
121     Bool_t      ReadNextShort();
122     Bool_t      ReadNextInt();
123     void        NewEvent();
124     void        CheckHeaderAndTrailerCount(Int_t ddlID);
125
126     Int_t       fEventCounter;                // chip event counter
127     Short_t     fEventCounterFull[20][6][10]; // chip event counter
128
129     UShort_t    fChipAddr;                    // chip nr
130     UShort_t    fHalfStaveNr;                 // half stave nr
131     UInt_t      fCol;                         // chip column nr
132     UInt_t      fRow;                         // chip row nr
133     UInt_t      fCalHeadWord[kCalHeadLenMax]; // calibration header words
134                 
135     UShort_t    fData;            // 16 bit data word read
136     UInt_t      fOffset;          // offset for cell column
137     UInt_t      fHitCount;        // counter of hits
138     UChar_t     fDataChar1, fDataChar2, fDataChar3, fDataChar4; // temps part of a 32bit word
139     Bool_t      fFirstWord;       // keeps track of which of the two 16bit words out of the 32bit word to read when ReadNextShort is called
140     Bool_t      fCalHeadRead[20];            // calibration header read flags (reset at new event)
141     UInt_t      fPrevEventId;                // previous event id (needed to know if there is a new event)
142
143     UInt_t      fEqPLBytesRead;              // bytes read for current equipment payload
144     UInt_t      fEqPLChipHeadersRead;        // number of chip headers found in current equipment payload
145     UInt_t      fEqPLChipTrailersRead;       // number of chip trailers found in current equipment payload
146     Bool_t      fHeaderOrTrailerReadLast;    // in previous words, was a header (true) or a trailer (false) read last
147     UInt_t      fExpectedHeaderTrailerCount; // expected number of headers and trailers for the current equipment payload
148     Bool_t      fFillOutOfSynch;             // has a fill word been put in the wrong place?
149     Int_t       fDDLID;                      // ddl id 
150     Int_t       fLastDDLID;                  // ddl id for equipment read in previous words
151
152     Bool_t      fAdvancedErrorLog;           // is the advanced error logging activated?
153     AliITSRawStreamSPDErrorLog *fAdvLogger;  // pointer to special error logger object
154
155     Bool_t      fFastOrSignal[20][6][10];    // fastor signal bit (one per chip)
156
157     Bool_t      fActiveEq[20];               // which equipments are active (found in data)
158     Bool_t      fActiveHS[20][6];            // which half-staves are active (blockattribute bits)
159     Bool_t      fActiveChip[20][6][10];      // which chips are active (found in data)
160
161     ClassDef(AliITSRawStreamSPD, 0) // class for reading ITS SPD raw digits
162 };
163
164 #endif