FMD module
[u/mrichter/AliRoot.git] / FMD / FMDbase / AliFMDAltroMapping.h
1 #ifndef ALIFMDALTROMAPPING_H
2 #define ALIFMDALTROMAPPING_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights
4  * reserved. 
5  *
6  * Latest changes by Christian Holm Christensen <cholm@nbi.dk>
7  *
8  * See cxx source for full Copyright notice                               
9  */
10 /** @file    AliFMDAltroMapping.h
11     @author  Christian Holm Christensen <cholm@nbi.dk>
12     @date    Sun Mar 26 18:28:11 2006
13     @brief   Map HW address to detector coordinates and back again. 
14 */
15 #ifndef ALIALTROMAPPING_H
16 # include <AliAltroMapping.h>
17 #endif
18 //
19 // Map hardware address to detector coordinates. 
20 //
21 //    The hardware address consist of a DDL number and 12bits of ALTRO
22 //    addresses.  The ALTRO address are formatted as follows. 
23 //
24 //    12              7         4            0
25 //    |---------------|---------|------------|
26 //    | Board #       | ALTRO # | Channel #  |
27 //    +---------------+---------+------------+
28 //
29 //
30 //____________________________________________________________________
31 /** @class AliFMDAltroMapping 
32     @brief Class that encodes a map to/from ALTRO hardware address to
33     FMD detector coordinates.  
34     
35     The hardware address consist of a DDL number and 12bits of ALTRO
36     addresses.  The ALTRO address are formatted as follows. 
37     @verbatim 
38     12              7         4            0
39     |---------------|---------|------------|
40     | Board #       | ALTRO # | Channel #  |
41     +---------------+---------+------------+
42     @endverbatim 
43
44     @ingroup FMD_base
45  */
46 class AliFMDAltroMapping : public AliAltroMapping
47 {
48 public:
49   /**
50    * Constructor 
51    */
52   AliFMDAltroMapping();
53   /**
54    * Destructor 
55    */
56   virtual ~AliFMDAltroMapping() {}
57   /**
58    * Return detector number corresponding to given DDL number 
59    * 
60    * @param ddl DDL number 
61    * @return Detector number 
62    */ 
63   Short_t DDL2Detector(UInt_t ddl) const 
64   { 
65     return (ddl<=2 ? Short_t(ddl + 1) : -1); 
66   }
67   /**
68    * Return the ring identifier corresponding to a board number 
69    * 
70    * @param board Board number 
71    * @return Ring identifier 
72    */ 
73   Char_t Board2Ring(UShort_t board) const { return (board%2)?'O':'I'; }
74
75   /**
76    * Return the strip base number corresponding to a channel address 
77    * 
78    * @param board   Board number
79    * @param altro   Altro number 
80    * @param channel Channel number 
81    * @param ring    On return, the ring ID 
82    * @param sec     On return, the sector number 
83    * @param strip   On return, the strip base offset 
84    * @return @c true on success 
85    */ 
86   Bool_t Channel2StripBase(UShort_t  board, UShort_t  altro, 
87                            UShort_t  chan,  Char_t&   ring, 
88                            UShort_t& sec,   Short_t&  str) const;
89   /**
90    * Return the strip, sample corresponding to a timebin 
91    * 
92    * @param sec        Sector
93    * @param timebin    Time bin 
94    * @param preSamples Number of pre-samples 
95    * @param sampleRate Oversampling rate 
96    * @param strip      On return, the strip number in this channel
97    * @param sam        On return, the sample number 
98    */ 
99   void Timebin2Strip(UShort_t sec,        UShort_t  timebin,
100                      UShort_t preSamples, UShort_t  sampleRate, 
101                      Short_t& strip,      UShort_t& sample) const;
102
103   /**
104    * Map a hardware address into a detector index. 
105    * 
106    * @param ddl        Hardware DDL number 
107    * @param hwaddr     Hardware address.  
108    * @param timebin    Timebin 
109    * @param preSamples # of pre samples 
110    * @param sampleRate Over sampling rate 
111    * @param det        On return, the detector #
112    * @param ring       On return, the ring ID
113    * @param sec        On return, the sector #
114    * @param str        On return, the base of strip #
115    * @param sam        On return, the sample number for this strip
116    * @return @c true on success, false otherwise 
117    */
118   Bool_t Hardware2Detector(UShort_t  ddl,        UShort_t hwaddr, 
119                            UShort_t  timebin,    UShort_t preSamples, 
120                            UShort_t  sampleRate,
121                            UShort_t& det,        Char_t&   ring, 
122                            UShort_t& sec,        Short_t&  str,
123                            UShort_t& sam) const;
124   /**
125    * Map a hardware address into a detector index. 
126    * 
127    * @param ddl        Hardware DDL number 
128    * @param board      FEC number
129    * @param altro      ALTRO number 
130    * @param channel    Channel number 
131    * @param timebin    Timebin 
132    * @param preSamples # of pre samples 
133    * @param sampleRate Over sampling rate 
134    * @param det        On return, the detector #
135    * @param ring       On return, the ring ID
136    * @param sec        On return, the sector #
137    * @param str        On return, the base of strip #
138    * @param sam        On return, the sample number for this strip
139    * @return @c true on success, false otherwise 
140    */
141   Bool_t Hardware2Detector(UShort_t  ddl,        UShort_t  board, 
142                            UShort_t  altro,      UShort_t  chan,
143                            UShort_t  timebin,    UShort_t  preSamples,
144                            UShort_t  sampleRate,
145                            UShort_t& det,        Char_t&   ring, 
146                            UShort_t& sec,        Short_t&  str,
147                            UShort_t& sam) const;
148
149
150
151   /**
152    * Return DDL number corresponding to given detector number 
153    * 
154    * @param det Detector number 
155    * @return DDL number 
156    */ 
157   UShort_t Detector2DDL(UShort_t det) const { return det - 1; }
158   /**
159    * Return board address corresponding to a sector 
160    * 
161    * @param ring  Ring identifier 
162    * @param sec   Sector number 
163    * @return The board number, or negative number in case of failure 
164    */
165   Short_t Sector2Board(Char_t ring, UShort_t sec) const;
166     /**
167    * Convert strip address to a channel address. 
168    * 
169    * @param ring  Ring identifier 
170    * @param sec   Sector number 
171    * @param str   Strip number 
172    * @param board On return, contains the board number 
173    * @param altro On return, contains the altro number 
174    * @param chan  On return, contains the channel number 
175    * @return @c true on success. 
176    */
177   Bool_t Strip2Channel(Char_t    ring,  UShort_t  sec,   
178                        UShort_t  str,   UShort_t& board,
179                        UShort_t& altro, UShort_t& chan) const;
180   /**
181    * Get the timebin correspoding to a strip and sample 
182    * 
183    * @param sec        Sector number 
184    * @param str        Strip number 
185    * @param sam        Sample number 
186    * @param preSamples Number of pre-samples. 
187    * @param sampleRate The over-sampling rate 
188    * @return the timebin corresponding to the passed strip 
189    */
190   UShort_t Strip2Timebin(UShort_t sec, UShort_t strip, 
191                          UShort_t sam, UShort_t preSamples, 
192                          UShort_t sampleRate) const;
193   
194   /**
195    * Map a detector index into a hardware address. 
196    * 
197    * @param det         The detector #
198    * @param ring        The ring ID
199    * @param sec         The sector #
200    * @param str         The strip #
201    * @param sam         The sample number 
202    * @param preSamples  Number of pre-samples
203    * @param sampleRate  The oversampling rate 
204    * @param ddl         On return, hardware DDL number 
205    * @param board       On return, the FEC board address (local to DDL)
206    * @param altro       On return, the ALTRO number (local to FEC)
207    * @param channel     On return, the channel number (local to ALTRO)
208    * @param timebin     On return, the timebin number (local to ALTRO)
209    * @return @c true on success, false otherwise 
210    */
211   Bool_t Detector2Hardware(UShort_t  det,        Char_t    ring, 
212                            UShort_t  sec,        UShort_t  str,
213                            UShort_t  sam, 
214                            UShort_t  preSamples, UShort_t  sampleRate,
215                            UShort_t& ddl,        UShort_t& board, 
216                            UShort_t& altro,      UShort_t& channel, 
217                            UShort_t& timebin) const;
218   /**
219    * Map a detector index into a hardware address. 
220    * 
221    * @param det         The detector #
222    * @param ring        The ring ID
223    * @param sec         The sector #
224    * @param str         The strip #
225    * @param sam         The sample number 
226    * @param preSamples  Number of pre-samples
227    * @param sampleRate  The oversampling rate 
228    * @param ddl         On return, hardware DDL number 
229    * @param hwaddr      On return, hardware address.  
230    * @param timebin     On return, the timebin number (local to ALTRO)
231    * @return @c true on success, false otherwise 
232    */
233   Bool_t Detector2Hardware(UShort_t  det,        Char_t    ring, 
234                            UShort_t  sec,        UShort_t  str,
235                            UShort_t  sam, 
236                            UShort_t  preSamples, UShort_t  sampleRate,
237                            UShort_t& ddl,        UShort_t& hwaddr, 
238                            UShort_t& timebin) const;
239   /**
240    * Convert board, chip, channel to a hardware address 
241    * 
242    * @param board   Board number 
243    * @param altro   Altro number 
244    * @param channel Channel number 
245    * @return hardware address of a channel 
246    */ 
247   UInt_t ChannelAddress(UShort_t board, UShort_t altro, UShort_t channel) const;
248   /**
249    * Convert a channel address to board, altro, channel fields 
250    * 
251    * @param hwaddr  Channel address
252    * @param board   On return, the Board number 
253    * @param altro   On return, the Altro number 
254    * @param channel On return, the Channel number 
255    */
256   void ChannelAddress(UShort_t hwaddr, UShort_t& board, UShort_t& altro, 
257                       UShort_t& channel) const;
258   /**
259    * convert a partial detector index into a hardware address
260    * 
261    * @param sector Sector number
262    * @param str    Strip number
263    * @param ring   Ring ID as an integer 
264    * @return Hardware address 
265    */
266   Int_t  GetHWAddress(Int_t sector, Int_t str, Int_t ring);
267   /**
268    * Get the pad-row (or sector) corresponding to hardware address
269    * 
270    * @param hwaddr hardware address
271    * @return Sector number 
272    */
273   Int_t  GetPadRow(Int_t hwaddr) const;
274   /**
275    * Get the pad (or strip) corresponding to hardware address
276    * 
277    * @param hwaddr hardware address
278    * @return Strip number 
279    */
280   Int_t  GetPad(Int_t hwaddr) const;
281   /**
282    * Get the sector (or ring) corresponding to hardware address
283    * 
284    * @param hwaddr hardware address
285    * @return Ring ID as an integer 
286    */
287   Int_t  GetSector(Int_t hwaddr) const;
288   /**
289    * Print map to standard out 
290    * 
291    * @param option Option string (hw, or det) 
292    */
293   void Print(Option_t* option="hw") const;
294 protected:
295   /**
296    * Read map from file - not used 
297    * 
298    * @return @c true on success 
299    */
300   virtual Bool_t ReadMapping();
301   /**
302    * Create the inverse mapping arrays 
303    */ 
304   virtual Bool_t CreateInvMapping();
305   
306   ClassDef(AliFMDAltroMapping, 2) // Read raw FMD Altro data 
307 };
308
309 #endif
310 //____________________________________________________________________
311 //
312 // Local Variables:
313 //   mode: C++
314 // End:
315 //
316 // EOF
317 //