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();
107 * Get pointer and size of the data of the current ALTRO channel.
108 * @param pTgt target to receive the pointer to the buffer
109 * @param hwAddress target to receive the hardware address
110 * @return size of the buffer set to pTgt in bytes on success,
111 * neg error code if failed
113 int GetAltroChannelRawData(void* &pTgt, AliHLTUInt16_t &hwAddress);
115 bool Verify( bool verify )
122 bool GetVerify() const
128 // Deliver values unsorted
130 /** unsorted next value */
132 /** row of current value */
133 int GetRealRow() const;
134 /** pad of current value */
135 int GetRealPad() const;
136 /** signal of current value */
138 /** time of current value */
139 int GetRealTime() const;
142 // Low level methods for accessing the data
144 /** get rcu trailer word of the raw data */
145 AliHLTUInt32_t GetRCUTrailer( unsigned offset=0 ) const;
147 /** move to next altro block and set internal variables */
148 bool NextAltroBlock();
150 /** hardware address of the current altro block */
151 AliHLTUInt32_t GetAltroBlockHWaddr() const;
153 /** get no of 10bit words in the current altro block */
154 unsigned GetAltroBlock10BitWordCnt() const;
156 /** ndx counts from end, 0 is last */
157 AliHLTUInt64_t GetAltroBlock40BitWord( unsigned long ndx ) const;
159 /** ndx counts from end, 0 is last */
160 AliHLTUInt16_t GetAltroBlock10BitWord( unsigned long ndx );
162 /** ndx counts from end, 0 is last */
163 AliHLTUInt16_t GetAltroBlockReal10BitWord( unsigned long ndx );
165 unsigned GetAltroBlockPositionBytes() const
166 {return fAltroBlockPositionBytes;}
167 unsigned GetAltroBlockLengthBytes() const
168 {return fAltroBlockLengthBytes;}
170 /** Return length of trailing RCU data block in bytes */
171 unsigned GetRCUDataBlockLength() const;
172 unsigned GetCommonDataHeaderSize() const;
174 Bool_t ApplyMapping();
176 Int_t GetRow( unsigned patch, unsigned hwAddr );
177 Int_t GetPad( unsigned patch, unsigned hwAddr );
178 unsigned GetMaxHWA( unsigned patch ) const;
181 * This function decodes the rawreadermode set in HLT***Components
182 * or the AliHLTGUI and returns the integer value of @ref RawReaderMode.
183 * @param mode const Char_t * argument <br>
184 * sorted_3_trailerword -> @ref kSorted3Trailerword <br>
185 * sorted_2_trailerword -> @ref kSorted2Trailerword <br>
186 * sorted_1_trailerword -> @ref kSorted1Trailerword <br>
187 * unsorted_3_trailerword -> @ref kUnsorted3Trailerword <br>
188 * unsorted_2_trailerword -> @ref kUnsorted2Trailerword <br>
189 * unsorted_1_trailerword -> @ref kUnsorted1Trailerword <br>
190 * @return rawreadermode @ref RawReaderMode and -1 if decoding fails
192 static Int_t DecodeMode(const Char_t *mode);
195 * This function sets the rawreadermode from an enum.
196 * The name was chosen in order to use the two methods with either
197 * a Char_t array or an Int_t.
198 * @param mode mode enum @ref RawReaderMode
199 * @return rawreadermode @ref RawReaderMode and -1 if decoding fails
201 static Int_t DecodeMode(Int_t mode);
205 /** the raw data buffer (external buffer) */
206 AliHLTUInt8_t* fBuffer; //! transient
207 /** size of the raw data buffer */
208 unsigned long fBufferSize; // see above
214 /** patch (readout partition) specification of the raw data buffer */
215 Int_t fPatch; // see above
217 /** slice (sector) specification of the raw data buffer */
218 Int_t fSlice; // see above
220 /** the current row no */
221 Int_t fRow; // see above
223 /** the current pad no */
224 Int_t fPad; // see above
227 /** position of the current ALTRO block*/
228 unsigned fAltroBlockPositionBytes; // see above
230 /** length of the current ALTRO block*/
231 unsigned fAltroBlockLengthBytes; // see above
233 /** hardware of the current ALTRO block*/
234 AliHLTUInt16_t fAltroBlockHWAddress; // see above
236 /** no of 10 bit words in the current ALTRO block*/
237 AliHLTUInt16_t fAltroBlock10BitWordCnt; // see above
239 /** no of additional 10 bit fill words in the current ALTRO block*/
240 AliHLTUInt16_t fAltroBlock10BitFillWordCnt; // see above
242 /** version of data format */
243 unsigned fDataFormatVersion; // see above
245 /** position of the current bunch of timebins */
246 unsigned fBunchPosition; // see above
247 /** first timebin of current bunch */
248 unsigned fBunchTimebinStart; // see above
249 /** length of current bunch */
250 unsigned fBunchLength; // see above
251 /** word counter in bunch */
252 unsigned fWordInBunch; // see above
254 /** verify the consistency of the Altro blocks */
255 bool fVerify; // see above
258 /** copy constructor prohibited */
259 AliHLTTPCDigitReaderRaw(const AliHLTTPCDigitReaderRaw& src);
260 /** assignment operator prohibited */
261 AliHLTTPCDigitReaderRaw& operator=(const AliHLTTPCDigitReaderRaw& src);
262 /** number of patches */
263 static const Int_t fgkNofPatches=6; // see above
264 /** dimension of each mapping array */
265 static const Int_t fgkMappingDimension=2; // see above
267 /** size of mapping arrays */
268 static const Int_t fgkMapping0Size=3200; // see above
269 /** size of mapping array for patch 1 */
270 static const Int_t fgkMapping1Size=3584; // see above
271 /** size of mapping array for patch 2 */
272 static const Int_t fgkMapping2Size=3200; // see above
273 /** size of mapping array for patch 3 */
274 static const Int_t fgkMapping3Size=3328; // see above
275 /** size of mapping array for patch 4 */
276 static const Int_t fgkMapping4Size=3328; // see above
277 /** size of mapping array for patch 5 */
278 static const Int_t fgkMapping5Size=3328; // see above
280 /** mapping array for patch 0 */
281 static Int_t fgMapping0[fgkMapping0Size][fgkMappingDimension]; // see above
282 /** mapping array for patch 1 */
283 static Int_t fgMapping1[fgkMapping1Size][fgkMappingDimension]; // see above
284 /** mapping array for patch 2 */
285 static Int_t fgMapping2[fgkMapping2Size][fgkMappingDimension]; // see above
286 /** mapping array for patch 3 */
287 static Int_t fgMapping3[fgkMapping3Size][fgkMappingDimension]; // see above
288 /** mapping array for patch 4 */
289 static Int_t fgMapping4[fgkMapping4Size][fgkMappingDimension]; // see above
290 /** mapping array for patch 5 */
291 static Int_t fgMapping5[fgkMapping5Size][fgkMappingDimension]; // see above
293 static unsigned fgMaxHWA[fgkNofPatches]; // see above
297 Int_t fCurrentRow; // see above
299 Int_t fCurrentPad; // see above
301 Int_t fCurrentBin; // see above
303 /** ofsset of the first row */
304 Int_t fRowOffset; // see above
305 /** nimber of rows */
306 Int_t fNRows; // see above
308 /** max number of rows */
309 Int_t fNMaxRows; // see above
310 /** max number of pads */
311 Int_t fNMaxPads; // see above
312 /** number of time bins */
313 Int_t fNTimeBins; // see above
315 Int_t *fData; //! transient
317 /** indicate a virgin object and throw the warnig only once */
318 Int_t fMapErrThrown; //! transient
320 ClassDef(AliHLTTPCDigitReaderRaw, 1)