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 );
69 /** not a valid copy constructor, defined according to effective C++ style */
70 AliHLTTPCDigitReaderRaw(const AliHLTTPCDigitReaderRaw& src);
71 /** not a valid assignment op, but defined according to effective C++ style */
72 AliHLTTPCDigitReaderRaw& operator=(const AliHLTTPCDigitReaderRaw& src);
74 virtual ~AliHLTTPCDigitReaderRaw();
77 * Init the reader with a data block.
78 * The function fetches the first and last row for the readout partition
79 * from @ref AliHLTTPCTransform.
80 * @param ptr pointer to data buffer
81 * @param size size of the data buffer
82 * @param patch patch (readout partition) number within the slice
83 * @param slice sector no (0 to 35)
85 virtual int InitBlock(void* ptr,unsigned long size, Int_t patch, Int_t slice);
89 * <b>Note:</b> This method is for backward compatibility only, not for further
90 * use. The <i>firstrow</i> and <i>lastrow</i> parameters are fetched from
91 * @ref AliHLTTPCTransform. The method is implemented in the raw reader base class
92 * but is defined here to keep the signature of the library interface.
94 * @param ptr pointer to data buffer
95 * @param size size of the data buffer
96 * @param firstrow first row occuring in the data
97 * @param lastrow last row occuring in the data
98 * @param patch patch (readout partition) number within the slice
99 * @param slice sector no (0 to 35)
101 int InitBlock(void* ptr,unsigned long size,Int_t firstrow,Int_t lastrow, Int_t patch, Int_t slice);
103 // Deliver values sorted for format 0, otherwise pass through to corresponding *Real* method
105 virtual int GetRow();
106 virtual int GetPad();
107 virtual int GetSignal();
108 virtual int GetTime();
110 bool Verify( bool verify )
117 bool GetVerify() const
123 // Deliver values unsorted
125 /** unsorted next value */
127 /** row of current value */
128 int GetRealRow() const;
129 /** pad of current value */
130 int GetRealPad() const;
131 /** signal of current value */
133 /** time of current value */
134 int GetRealTime() const;
137 // Low level methods for accessing the data
139 /** get rcu trailer word of the raw data */
140 AliHLTUInt32_t GetRCUTrailer( unsigned offset=0 ) const;
142 /** move to next altro block and set internal variables */
143 bool NextAltroBlock();
145 /** hardware address of the current altro block */
146 AliHLTUInt32_t GetAltroBlockHWaddr() const;
148 /** get no of 10bit words in the current altro block */
149 unsigned GetAltroBlock10BitWordCnt() const;
151 /** ndx counts from end, 0 is last */
152 AliHLTUInt64_t GetAltroBlock40BitWord( unsigned long ndx ) const;
154 /** ndx counts from end, 0 is last */
155 AliHLTUInt16_t GetAltroBlock10BitWord( unsigned long ndx );
157 /** ndx counts from end, 0 is last */
158 AliHLTUInt16_t GetAltroBlockReal10BitWord( unsigned long ndx );
160 unsigned GetAltroBlockPositionBytes() const
161 {return fAltroBlockPositionBytes;}
162 unsigned GetAltroBlockLengthBytes() const
163 {return fAltroBlockLengthBytes;}
165 /** Return length of trailing RCU data block in bytes */
166 unsigned GetRCUDataBlockLength() const;
167 unsigned GetCommonDataHeaderSize() const;
169 Bool_t ApplyMapping();
171 Int_t GetRow( unsigned patch, unsigned hwAddr );
172 Int_t GetPad( unsigned patch, unsigned hwAddr );
173 unsigned GetMaxHWA( unsigned patch ) const;
176 * This function decodes the rawreadermode set in HLT***Components
177 * or the AliHLTGUI and returns the integer value of @ref RawReaderMode.
178 * @param mode const Char_t * argument <br>
179 * sorted_3_trailerword -> @ref kSorted3Trailerword <br>
180 * sorted_2_trailerword -> @ref kSorted2Trailerword <br>
181 * sorted_1_trailerword -> @ref kSorted1Trailerword <br>
182 * unsorted_3_trailerword -> @ref kUnsorted3Trailerword <br>
183 * unsorted_2_trailerword -> @ref kUnsorted2Trailerword <br>
184 * unsorted_1_trailerword -> @ref kUnsorted1Trailerword <br>
185 * @return rawreadermode @ref RawReaderMode and -1 if decoding fails
187 static Int_t DecodeMode(const Char_t *mode);
190 * This function sets the rawreadermode from an enum.
191 * The name was chosen in order to use the two methods with either
192 * a Char_t array or an Int_t.
193 * @param mode mode enum @ref RawReaderMode
194 * @return rawreadermode @ref RawReaderMode and -1 if decoding fails
196 static Int_t DecodeMode(Int_t mode);
200 /** the raw data buffer (external buffer) */
201 AliHLTUInt8_t* fBuffer; //! transient
202 /** size of the raw data buffer */
203 unsigned long fBufferSize; // see above
209 /** patch (readout partition) specification of the raw data buffer */
210 Int_t fPatch; // see above
212 /** slice (sector) specification of the raw data buffer */
213 Int_t fSlice; // see above
215 /** the current row no */
216 Int_t fRow; // see above
218 /** the current pad no */
219 Int_t fPad; // see above
222 /** position of the current ALTRO block*/
223 unsigned fAltroBlockPositionBytes; // see above
225 /** length of the current ALTRO block*/
226 unsigned fAltroBlockLengthBytes; // see above
228 /** hardware of the current ALTRO block*/
229 AliHLTUInt16_t fAltroBlockHWAddress; // see above
231 /** no of 10 bit words in the current ALTRO block*/
232 AliHLTUInt16_t fAltroBlock10BitWordCnt; // see above
234 /** no of additional 10 bit fill words in the current ALTRO block*/
235 AliHLTUInt16_t fAltroBlock10BitFillWordCnt; // see above
237 /** version of data format */
238 unsigned fDataFormatVersion; // see above
240 /** position of the current bunch of timebins */
241 unsigned fBunchPosition; // see above
242 /** first timebin of current bunch */
243 unsigned fBunchTimebinStart; // see above
244 /** length of current bunch */
245 unsigned fBunchLength; // see above
246 /** word counter in bunch */
247 unsigned fWordInBunch; // see above
249 /** verify the consistency of the Altro blocks */
250 bool fVerify; // see above
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)