4 #ifndef ALIHLTTPCDIGITREADERRAW_H
5 #define ALIHLTTPCDIGITREADERRAW_H
7 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
8 * See cxx source for full Copyright notice */
10 /** @file AliHLTTPCDigitReaderRaw.h
11 @author Timm Steinbeck, Jochen Thaeder, Matthias Richter
13 @brief A digit reader implementation for the RAW data coming from the RCU.
18 #include "AliHLTTPCDigitReader.h"
19 #include "AliHLTDataTypes.h"
22 * @class AliHLTTPCDigitReaderRaw
23 * A digit reader implementation for the RAW data coming from the RCU.
24 * The reader decodes the data package to the level of the ALtro 10 bit words.
26 * The reader supports the following data format modes:
27 * - 0: RCU Data format as delivered during TPC commissioning, pads/padrows
28 * are sorted, RCU trailer is one 32 bit word.
29 * - 1: As 0, but pads/padrows are delivered "as is", without sorting
30 * - 2: As 0, but RCU trailer is 3 32 bit words.
31 * - 3: As 1, but RCU trailer is 3 32 bit words.
32 * - 4: As 0, but RCU trailer is 2 32 bit words.
33 * - 5: As 1, but RCU trailer is 2 32 bit words.
36 class AliHLTTPCDigitReaderRaw : public AliHLTTPCDigitReader {
39 /** decode mode of the reader */
41 /** 0: RCU Data format as delivered during TPC commissioning, pads/padrows
42 * are sorted, RCU trailer is one 32 bit word. */
43 kSorted1Trailerword=0,
44 /** 1: As 0, but pads/padrows are delivered "as is", without sorting */
45 kUnsorted1Trailerword,
46 /** 2: As 0, but RCU trailer is 3 32 bit words. */
48 /** 3: As 1, but RCU trailer is 3 32 bit words. */
49 kUnsorted3Trailerword,
50 /** 4: As 0, but RCU trailer is 2 32 bit words. */
52 /** 5: As 1, but RCU trailer is 2 32 bit words. */
53 kUnsorted2Trailerword,
54 /** number of modes */
58 /** standard constructor
59 * @param formatVersion Data Format version numbers:
60 * - 0: RCU Data format as delivered during TPC commissioning, pads/padrows
61 * are sorted, RCU trailer is one 32 bit word.
62 * - 1: As 0, but pads/padrows are delivered "as is", without sorting
63 * - 2: As 0, but RCU trailer is 3 32 bit words.
64 * - 3: As 1, but RCU trailer is 3 32 bit words.
65 * - 4: As 0, but RCU trailer is 2 32 bit words.
66 * - 5: As 1, but RCU trailer is 2 32 bit words.
68 AliHLTTPCDigitReaderRaw( unsigned formatVersion );
70 virtual ~AliHLTTPCDigitReaderRaw();
73 * Init the reader with a data block.
74 * The function fetches the first and last row for the readout partition
75 * from @ref AliHLTTPCTransform.
76 * @param ptr pointer to data buffer
77 * @param size size of the data buffer
78 * @param patch patch (readout partition) number within the slice
79 * @param slice sector no (0 to 35)
81 virtual int InitBlock(void* ptr,unsigned long size, Int_t patch, Int_t slice);
85 * <b>Note:</b> This method is for backward compatibility only, not for further
86 * use. The <i>firstrow</i> and <i>lastrow</i> parameters are fetched from
87 * @ref AliHLTTPCTransform. The method is implemented in the raw reader base class
88 * but is defined here to keep the signature of the library interface.
90 * @param ptr pointer to data buffer
91 * @param size size of the data buffer
92 * @param firstrow first row occuring in the data
93 * @param lastrow last row occuring in the data
94 * @param patch patch (readout partition) number within the slice
95 * @param slice sector no (0 to 35)
97 int InitBlock(void* ptr,unsigned long size,Int_t firstrow,Int_t lastrow, Int_t patch, Int_t slice);
99 // Deliver values sorted for format 0, otherwise pass through to corresponding *Real* method
100 virtual bool NextSignal();
101 virtual int GetRow();
102 virtual int GetPad();
103 virtual int GetSignal();
104 virtual int GetTime();
106 bool Verify( bool verify )
113 bool GetVerify() const
119 // Deliver values unsorted
121 /** unsorted next value */
123 /** row of current value */
124 int GetRealRow() const;
125 /** pad of current value */
126 int GetRealPad() const;
127 /** signal of current value */
129 /** time of current value */
130 int GetRealTime() const;
133 // Low level methods for accessing the data
135 /** get rcu trailer word of the raw data */
136 AliHLTUInt32_t GetRCUTrailer( unsigned offset=0 ) const;
138 /** move to next altro block and set internal variables */
139 bool NextAltroBlock();
141 /** hardware address of the current altro block */
142 AliHLTUInt32_t GetAltroBlockHWaddr() const;
144 /** get no of 10bit words in the current altro block */
145 unsigned GetAltroBlock10BitWordCnt() const;
147 /** ndx counts from end, 0 is last */
148 AliHLTUInt64_t GetAltroBlock40BitWord( unsigned long ndx ) const;
150 /** ndx counts from end, 0 is last */
151 AliHLTUInt16_t GetAltroBlock10BitWord( unsigned long ndx );
153 /** ndx counts from end, 0 is last */
154 AliHLTUInt16_t GetAltroBlockReal10BitWord( unsigned long ndx );
156 unsigned GetAltroBlockPositionBytes() const
157 {return fAltroBlockPositionBytes;}
158 unsigned GetAltroBlockLengthBytes() const
159 {return fAltroBlockLengthBytes;}
161 /** Return length of trailing RCU data block in bytes */
162 unsigned GetRCUDataBlockLength() const;
163 unsigned GetCommonDataHeaderSize() const;
165 Bool_t ApplyMapping();
167 Int_t GetRow( unsigned patch, unsigned hwAddr );
168 Int_t GetPad( unsigned patch, unsigned hwAddr );
169 unsigned GetMaxHWA( unsigned patch ) const;
172 * This function decodes the rawreadermode set in HLT***Components
173 * or the AliHLTGUI and returns the integer value of @ref RawReaderMode.
174 * @param mode const Char_t * argument <br>
175 * sorted_3_trailerword -> @ref kSorted3Trailerword <br>
176 * sorted_2_trailerword -> @ref kSorted2Trailerword <br>
177 * sorted_1_trailerword -> @ref kSorted1Trailerword <br>
178 * unsorted_3_trailerword -> @ref kUnsorted3Trailerword <br>
179 * unsorted_2_trailerword -> @ref kUnsorted2Trailerword <br>
180 * unsorted_1_trailerword -> @ref kUnsorted1Trailerword <br>
181 * @return rawreadermode @ref RawReaderMode and -1 if decoding fails
183 static Int_t DecodeMode(const Char_t *mode);
186 * This function sets the rawreadermode from an enum.
187 * The name was chosen in order to use the two methods with either
188 * a Char_t array or an Int_t.
189 * @param mode mode enum @ref RawReaderMode
190 * @return rawreadermode @ref RawReaderMode and -1 if decoding fails
192 static Int_t DecodeMode(Int_t mode);
196 /** the raw data buffer (external buffer) */
197 AliHLTUInt8_t* fBuffer; //! transient
198 /** size of the raw data buffer */
199 unsigned long fBufferSize; // see above
205 /** patch (readout partition) specification of the raw data buffer */
206 Int_t fPatch; // see above
208 /** slice (sector) specification of the raw data buffer */
209 Int_t fSlice; // see above
211 /** the current row no */
212 Int_t fRow; // see above
214 /** the current pad no */
215 Int_t fPad; // see above
218 /** position of the current ALTRO block*/
219 unsigned fAltroBlockPositionBytes; // see above
221 /** length of the current ALTRO block*/
222 unsigned fAltroBlockLengthBytes; // see above
224 /** hardware of the current ALTRO block*/
225 AliHLTUInt16_t fAltroBlockHWAddress; // see above
227 /** no of 10 bit words in the current ALTRO block*/
228 AliHLTUInt16_t fAltroBlock10BitWordCnt; // see above
230 /** no of additional 10 bit fill words in the current ALTRO block*/
231 AliHLTUInt16_t fAltroBlock10BitFillWordCnt; // see above
233 /** version of data format */
234 unsigned fDataFormatVersion; // see above
236 /** position of the current bunch of timebins */
237 unsigned fBunchPosition; // see above
238 /** first timebin of current bunch */
239 unsigned fBunchTimebinStart; // see above
240 /** length of current bunch */
241 unsigned fBunchLength; // see above
242 /** word counter in bunch */
243 unsigned fWordInBunch; // see above
245 /** verify the consistency of the Altro blocks */
246 bool fVerify; // see above
249 /** copy constructor prohibited */
250 AliHLTTPCDigitReaderRaw(const AliHLTTPCDigitReaderRaw& src);
251 /** assignment operator prohibited */
252 AliHLTTPCDigitReaderRaw& operator=(const AliHLTTPCDigitReaderRaw& src);
253 /** number of patches */
254 static const Int_t fgkNofPatches=6; // see above
255 /** dimension of each mapping array */
256 static const Int_t fgkMappingDimension=2; // see above
258 /** size of mapping arrays */
259 static const Int_t fgkMapping0Size=3200; // see above
260 /** size of mapping array for patch 1 */
261 static const Int_t fgkMapping1Size=3584; // see above
262 /** size of mapping array for patch 2 */
263 static const Int_t fgkMapping2Size=3200; // see above
264 /** size of mapping array for patch 3 */
265 static const Int_t fgkMapping3Size=3328; // see above
266 /** size of mapping array for patch 4 */
267 static const Int_t fgkMapping4Size=3328; // see above
268 /** size of mapping array for patch 5 */
269 static const Int_t fgkMapping5Size=3328; // see above
271 /** mapping array for patch 0 */
272 static Int_t fgMapping0[fgkMapping0Size][fgkMappingDimension]; // see above
273 /** mapping array for patch 1 */
274 static Int_t fgMapping1[fgkMapping1Size][fgkMappingDimension]; // see above
275 /** mapping array for patch 2 */
276 static Int_t fgMapping2[fgkMapping2Size][fgkMappingDimension]; // see above
277 /** mapping array for patch 3 */
278 static Int_t fgMapping3[fgkMapping3Size][fgkMappingDimension]; // see above
279 /** mapping array for patch 4 */
280 static Int_t fgMapping4[fgkMapping4Size][fgkMappingDimension]; // see above
281 /** mapping array for patch 5 */
282 static Int_t fgMapping5[fgkMapping5Size][fgkMappingDimension]; // see above
284 static unsigned fgMaxHWA[fgkNofPatches]; // see above
288 Int_t fCurrentRow; // see above
290 Int_t fCurrentPad; // see above
292 Int_t fCurrentBin; // see above
294 /** ofsset of the first row */
295 Int_t fRowOffset; // see above
296 /** nimber of rows */
297 Int_t fNRows; // see above
299 /** max number of rows */
300 Int_t fNMaxRows; // see above
301 /** max number of pads */
302 Int_t fNMaxPads; // see above
303 /** number of time bins */
304 Int_t fNTimeBins; // see above
306 Int_t *fData; //! transient
308 /** indicate a virgin object and throw the warnig only once */
309 Int_t fMapErrThrown; //! transient
311 ClassDef(AliHLTTPCDigitReaderRaw, 1)