4 #ifndef ALIHLTTPCDIGITREADER_H
5 #define ALIHLTTPCDIGITREADER_H
7 //* This file is property of and copyright by the ALICE HLT Project *
8 //* ALICE Experiment at CERN, All rights reserved. *
9 //* See cxx source for full Copyright notice *
11 /** @file AliHLTTPCDigitReader.h
12 @author Timm Steinbeck, Jochen Thaeder, Matthias Richter, Kenneth Aamodt
14 @brief An abstract reader class for TPC data.
17 #include "AliHLTLogging.h"
21 * @class AliHLTTPCDigitReader
22 * An abstract reader class for the TPC data. The Data is treated as a stream
23 * of data points, each containing row number, pad number, time bin and ADC
24 * value. The class hides the actual encoding of the data stream for the sub-
25 * sequent components like the cluster finder.
27 * Some of the data decoders allow random access of the data within one channel.
28 * This functionality is available for all readers if caching is enabled (see
29 * @ref EnableCaching).
31 * The digit reader can be locked for the current channel. If locked, function
32 * @ref Next will return false if data of the current channel is finnished.
35 class AliHLTTPCDigitReader : public AliHLTLogging {
37 /** standard constructor
39 AliHLTTPCDigitReader();
41 virtual ~AliHLTTPCDigitReader();
44 * Init the reader with a data block.
45 * The function fetches the first and last row for the readout partition
46 * from @ref AliHLTTPCTransform. The method is pure virtual and must be implemented
48 * @param ptr pointer to data buffer
49 * @param size size of the data buffer
50 * @param patch patch (readout partition) number within the slice
51 * @param slice sector no (0 to 35)
53 virtual int InitBlock(void* ptr,unsigned long size, Int_t patch, Int_t slice)=0;
57 * <b>Note:</b> This method is for backward compatibility only, not for further
58 * use. The <i>firstrow</i> and <i>lastrow</i> parameters are fetched from
59 * @ref AliHLTTPCTransform.
61 * @param ptr pointer to data buffer
62 * @param size size of the data buffer
63 * @param firstrow first row occuring in the data
64 * @param lastrow last row occuring in the data
65 * @param patch patch (readout partition) number within the slice
66 * @param slice sector no (0 to 35)
68 virtual int InitBlock(void* ptr,unsigned long size,Int_t firstrow,Int_t lastrow, Int_t patch, Int_t slice);
78 * Set the reader position to the next value.
79 * If the reader was not yet initialized, initialization is carried out and
80 * the position set to the beginning of the stream (which is in essence the
81 * end of the data block due to the back-linked list).
83 * The modifiers determine the unit of the positioning:
84 * - @ref kNextSignal set to the next signal value
85 * - @ref kNextChannel set at the beginning of the next channel
86 * - @ref kNextBunch set at the beginning of the next bunch within the
89 * If the reader is locked for a pad/channel, Next operates only on the data
90 * belonging to the current channel and returns false at the end of the
93 * The function does some basic stuff and forwards to @ref NextSignal, @ref
94 * NextBunch or @ref NextChannel depending on the modifer. This function is
95 * also necessary if the common sorting is going to be used (not yet implemented)
96 * @return true if data is available, false if not
98 bool Next(int type=kNextSignal);
101 * Set stream position to the next Pad (ALTRO channel).
102 * This is the direct entry to data access on a channel/bunch basis suited
103 * for fast data access.
104 * @return true if data is available, false if not
106 virtual bool NextChannel();
109 * Set stream to the next ALTRO bunch within the current pad.
110 * This is the direct entry to data access on a channel/bunch basis suited
111 * for fast data access.
112 * @return bunch length, 0 if no data bunch available in the current pad
114 virtual int NextBunch();
117 * Get current hardware address.
119 virtual AliHLTUInt32_t GetAltroBlockHWaddr() const;
122 * Get current hardware address from row and pad number.
124 virtual AliHLTUInt32_t GetAltroBlockHWaddr(Int_t row, Int_t pad) const;
127 * Get the row number of the current value.
129 virtual int GetRow()=0;
132 * Get the pad number of the current value.
134 virtual int GetPad()=0;
137 * Get the current ADC value.
139 virtual int GetSignal()=0;
142 * Get pointer to the the current ADC value.
144 virtual const UInt_t* GetSignals();
147 * Get the time bin of the current value.
148 * If @ref NextBunch has been used the function returns the
149 * first time bin of the bunch.
151 virtual int GetTime()=0;
154 * Method to use old rcu fomat.
156 virtual void SetOldRCUFormat(Bool_t oldrcuformat);
159 * Method to set read unsorted flag.
161 virtual void SetUnsorted(Bool_t unsorted);
164 * Enable chaching of the current channel.
165 * Some of the readers allow random data access within one channel.
166 * The others have the possibility to cache the data in order to support
167 * this functionality. Caching is off by default.
168 * @param bCache the current channel is cached
170 void EnableCaching(bool bCache=false);
173 * Rewind the current channel to the beginning.
174 * The function uses the reader methods @ref RewindCurrentChannel or
175 * @ref RewindToPrevChannel to set the stream position to the beginning of the
176 * current channel. If the reader is locked for a channel, the function
177 * rewinds to the begnning of that channel.
182 * Returns the bunch size. Used by the fast decoder.
184 virtual int GetBunchSize();
187 * Returns the row offset. Used by the fast decoder.
189 virtual int GetRowOffset() const;
192 * Access operator to the data of a specific time bin.
193 * Not clear if we can manage this.
195 //int operator[](int timebin);
199 /** constructor, locks reader for the current pad */
200 LockGuard(AliHLTTPCDigitReader& reader)
202 {reader.fLckRow=reader.GetRow(); reader.fLckPad=reader.GetPad(); reader.SetFlag(kLocked);}
203 /** destructor, unlocks reader */
205 {fReader.ClearFlag(kLocked|kChannelOverwrap); fReader.fLckRow=-1; fReader.fLckPad=-1;}
208 /** instance of the controlled reader */
209 AliHLTTPCDigitReader& fReader; //!transient
213 /** reader locked for the current channel */
215 /** stream position already at the next channel */
216 kChannelOverwrap = 0x2,
217 /** reader doe not allow channel rewind */
219 /** warning missing fast access methods */
220 kWarnMissFastAccess = 0x8,
221 /** channel caching enabled */
222 kChannelCaching = 0x100
226 * Set the reader position to the next value.
227 * This is the reader specific method called by @ref Next.
228 * @return true if data is available, false if not
230 virtual bool NextSignal()=0;
233 * Set a status flag of the reader.
234 * @return current value of the status flags
236 unsigned int SetFlag(unsigned int flag);
239 * Clear a status flag of the reader.
240 * @return current value of the status flags
242 unsigned int ClearFlag(unsigned int flag);
245 * Check a status flag of the reader.
247 int CheckFlag(unsigned int flag) const {return (fFlags&flag)!=0;}
250 * Rewind to the beginning.of the current channel.
252 virtual int RewindCurrentChannel();
255 * Rewind to the beginning of the previous channel.
257 virtual int RewindToPrevChannel();
261 * Print a warning on the missing fast access methods.
262 * Set corresponding flag to avoid repetitive warnings.
264 void PrintMissingFastAccessWarning();
266 /** pad/channel is locked */
267 unsigned int fFlags; //!transient
269 /** row the reader is locked to */
270 int fLckRow; //!transient
272 /** pad the reader is locked to */
273 int fLckPad; //!transient
275 ClassDef(AliHLTTPCDigitReader, 0)