]> git.uio.no Git - u/mrichter/AliRoot.git/blame - FMD/AliFMDAltroMapping.cxx
Add optional seeding in the TRD (M.Ivanov)
[u/mrichter/AliRoot.git] / FMD / AliFMDAltroMapping.cxx
CommitLineData
57c3c593 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/* $Id$ */
17
18//____________________________________________________________________
19//
20// Mapping of ALTRO hardware channel to detector coordinates
21//
22#include "AliFMDAltroMapping.h" // ALIFMDALTROMAPPING_H
23#include "AliFMDParameters.h"
24#include "AliLog.h"
25
26//____________________________________________________________________
27ClassImp(AliFMDAltroMapping)
28#if 0
29 ; // This is here to keep Emacs for indenting the next line
30#endif
31
32//_____________________________________________________________________________
33AliFMDAltroMapping::AliFMDAltroMapping()
34 : AliAltroMapping(0)
35{}
36
37
38//_____________________________________________________________________________
39Bool_t
40AliFMDAltroMapping::ReadMapping()
41{
42 return kTRUE;
43}
44
45//_____________________________________________________________________________
46void
47AliFMDAltroMapping::DeleteMappingArrays()
48{}
49
50//____________________________________________________________________
51Bool_t
52AliFMDAltroMapping::Hardware2Detector(UInt_t ddl, UInt_t addr,
53 UShort_t& det, Char_t& ring,
54 UShort_t& sec, UShort_t& str) const
55{
56 // Translate a hardware address to detector coordinates.
57 // The detector is simply
58 //
59 // ddl - kBaseDDL + 1
60 //
61 // The ring number, sector, and strip number is given by the addr
62 // argument. The address argument, has the following format
63 //
64 // 12 7 4 0
65 // +-------------+----------+----------+
66 // | Board | ALTRO | Channel |
67 // +-------------+----------+----------+
68 //
69 // The board number identifier among other things the ring. There's
70 // up to 4 boards per DDL, and the two first (0 and 1) corresponds
71 // to the inner rings, while the two last (2 and 3) corresponds to
72 // the outer rings.
73 //
74 // The board number and ALTRO number together identifies the sensor,
75 // and hence. The lower board number (0 or 2) are the first N / 2
76 // sensors (where N is the number of sensors in the ring).
77 //
78 // There are 3 ALTRO's per card, and each ALTRO serves up to 4
79 // sensors. Which of sensor is determined by the channel number.
80 // For the inner rings, the map is
81 //
82 // ALTRO 0, Channel 0 to 7 -> Sensor 0 or 5
83 // ALTRO 0, Channel 8 to 15 -> Sensor 1 or 6
84 // ALTRO 1, Channel 0 to 7 -> Sensor 2 or 7
85 // ALTRO 2, Channel 0 to 7 -> Sensor 3 or 8
86 // ALTRO 2, Channel 8 to 15 -> Sensor 4 or 9
87 //
88 // For the outer rings, the map is
89 //
90 // ALTRO 0, Channel 0 to 3 -> Sensor 0 or 10
91 // ALTRO 0, Channel 4 to 7 -> Sensor 1 or 11
92 // ALTRO 0, Channel 8 to 11 -> Sensor 2 or 12
93 // ALTRO 0, Channel 12 to 15 -> Sensor 3 or 13
94 // ALTRO 1, Channel 0 to 3 -> Sensor 4 or 14
95 // ALTRO 1, Channel 4 to 7 -> Sensor 5 or 15
96 // ALTRO 2, Channel 0 to 3 -> Sensor 6 or 16
97 // ALTRO 2, Channel 4 to 7 -> Sensor 7 or 17
98 // ALTRO 2, Channel 8 to 11 -> Sensor 8 or 18
99 // ALTRO 2, Channel 12 to 15 -> Sensor 9 or 19
100 //
101 // Which divison of the sensor we're in, depends on the channel
102 // number only. For the inner rings, the map is
103 //
104 // Channel 0 -> Sector 0, strips 0-127
105 // Channel 1 -> Sector 1, strips 0-127
106 // Channel 3 -> Sector 0, strips 128-255
107 // Channel 4 -> Sector 1, strips 128-255
108 // Channel 5 -> Sector 0, strips 256-383
109 // Channel 6 -> Sector 1, strips 256-383
110 // Channel 7 -> Sector 0, strips 384-511
111 // Channel 8 -> Sector 1, strips 384-511
112 //
113 // There are only half as many strips in the outer sensors, so there
114 // only 4 channels are used for a full sensor. The map is
115 //
116 // Channel 0 -> Sector 0, strips 0-127
117 // Channel 1 -> Sector 1, strips 0-127
118 // Channel 3 -> Sector 0, strips 128-255
119 // Channel 4 -> Sector 1, strips 128-255
120 //
121 // With this information, we can decode the hardware address to give
122 // us detector coordinates, unique at least up a 128 strips. We
123 // return the first strip in the given range.
124 //
125 det = (ddl - AliFMDParameters::kBaseDDL) + 1;
126 UInt_t board = (addr >> 7) & 0x1F;
127 UInt_t altro = (addr >> 4) & 0x7;
128 UInt_t chan = (addr & 0xf);
129 if (board > 3) {
130 AliError(Form("Invalid board address %d for the FMD", board));
131 return kFALSE;
132 }
133 if (altro > 2) {
134 AliError(Form("Invalid ALTRO address %d for the FMD digitizer %d",
135 altro, board));
136 return kFALSE;
137 }
138 ring = (board > 1 ? 'O' : 'I');
139 UInt_t nsen = (ring == 'I' ? 10 : 20);
140 UInt_t nsa = (ring == 'I' ? 2 : 4); // Sensors per ALTRO
141 UInt_t ncs = (ring == 'I' ? 8 : 4); // Channels per sensor
142 UInt_t sen = (board % 2) * nsen / 2; // Base for half-ring
143 sen += chan / ncs + (altro == 0 ? 0 :
144 altro == 1 ? nsa : UInt_t(1.5 * nsa));
145 sec = 2 * sen + (chan % 2);
146 str = (chan % ncs) / 2 * 128;
147 return kTRUE;
148}
149
150//____________________________________________________________________
151Bool_t
152AliFMDAltroMapping::Detector2Hardware(UShort_t det, Char_t ring,
153 UShort_t sec, UShort_t str,
154 UInt_t& ddl, UInt_t& addr) const
155{
156 // Translate detector coordinates to a hardware address.
157 // The ddl is simply
158 //
159 // kBaseDDL + (det - 1)
160 //
161 // The ring number, sector, and strip number must be encoded into a
162 // hardware address. The address argument, will have the following
163 // format on output
164 //
165 // 12 7 4 0
166 // +-------------+----------+----------+
167 // | Board | ALTRO | Channel |
168 // +-------------+----------+----------+
169 //
170 // The board number is given by the ring and sector. The inner
171 // rings board 0 and 1, while the outer are 2 and 3. Which of these
172 // depends on the sector. The map is
173 //
174 // Ring I, sector 0- 9 -> board 0
175 // Ring I, sector 10-19 -> board 1
176 // Ring O, sector 0-19 -> board 2
177 // Ring O, sector 20-39 -> board 3
178 //
179 // There are 3 ALTRO's per board. The ALTRO number is given by the
180 // sector number. For the inner rings, these are given by
181 //
182 // Sector 0- 3 or 10-13 -> ALTRO 0
183 // Sector 4- 5 or 14-15 -> ALTRO 1
184 // Sector 6- 9 or 16-19 -> ALTRO 2
185 //
186 // For the outers, it's given by
187 //
188 // Sector 0- 7 or 20-27 -> ALTRO 0
189 // Sector 8-11 or 28-31 -> ALTRO 1
190 // Sector 12-19 or 32-39 -> ALTRO 2
191 //
192 // The channel number is given by the sector and strip number. For
193 // the inners, the map is
194 //
195 // Sector 0, strips 0-127 -> Channel 0
196 // Sector 0, strips 128-255 -> Channel 2
197 // Sector 0, strips 256-383 -> Channel 4
198 // Sector 0, strips 384-511 -> Channel 6
199 // Sector 1, strips 0-127 -> Channel 1
200 // Sector 1, strips 128-255 -> Channel 3
201 // Sector 1, strips 256-383 -> Channel 5
202 // Sector 1, strips 384-511 -> Channel 7
203 // Sector 2, strips 0-127 -> Channel 8
204 // Sector 2, strips 128-255 -> Channel 10
205 // Sector 2, strips 256-383 -> Channel 12
206 // Sector 2, strips 384-511 -> Channel 14
207 // Sector 3, strips 0-127 -> Channel 9
208 // Sector 3, strips 128-255 -> Channel 11
209 // Sector 3, strips 256-383 -> Channel 13
210 // Sector 3, strips 384-511 -> Channel 15
211 //
212 // and so on, up to sector 19. For the outer, the map is
213 //
214 // Sector 0, strips 0-127 -> Channel 0
215 // Sector 0, strips 128-255 -> Channel 2
216 // Sector 1, strips 0-127 -> Channel 1
217 // Sector 1, strips 128-255 -> Channel 3
218 // Sector 2, strips 0-127 -> Channel 4
219 // Sector 2, strips 128-255 -> Channel 6
220 // Sector 3, strips 0-127 -> Channel 5
221 // Sector 3, strips 128-255 -> Channel 7
222 // Sector 4, strips 0-127 -> Channel 8
223 // Sector 4, strips 128-255 -> Channel 10
224 // Sector 5, strips 0-127 -> Channel 9
225 // Sector 5, strips 128-255 -> Channel 11
226 // Sector 6, strips 0-127 -> Channel 12
227 // Sector 6, strips 128-255 -> Channel 14
228 // Sector 7, strips 0-127 -> Channel 13
229 // Sector 7, strips 128-255 -> Channel 15
230 //
231 // and so on upto sector 40.
232 //
233 // With this information, we can decode the detector coordinates to
234 // give us a unique hardware address
235 //
236 ddl = AliFMDParameters::kBaseDDL + (det - 1);
237 UInt_t nsen = (ring == 'I' ? 10 : 20);
238 UInt_t nsa = (ring == 'I' ? 2 : 4); // Sensors per ALTRO
239 UInt_t ncs = (ring == 'I' ? 8 : 4); // Channels per sensor
240 UInt_t bbase = (ring == 'I' ? 0 : 2);
241 UInt_t board = bbase + sec / nsen;
242 UInt_t lsen = (sec - (board - bbase) * nsen);
243 UInt_t altro = (lsen < 2 * nsa ? 0 : (lsen < 3 * nsa ? 1 : 2));
244 UInt_t sbase = (lsen < 2 * nsa ? 0 : (lsen < 3 * nsa ? 2*nsa : 3*nsa));
245 UInt_t chan = (sec % 2) + (lsen-sbase) / 2 * ncs + 2 * str / 128;
246 AliDebug(40, Form("\n"
247 " chan = (%d %% 2) + (%d-%d) / %d * %d + 2 * %d / 128\n"
248 " = %d + %d + %d = %d",
249 sec, lsen, sbase, 2, ncs, str,
250 (sec % 2), (lsen - sbase) / 2 * ncs,
251 2 * str / 128, chan));
252 addr = chan + (altro << 4) + (board << 7);
253
254 return kTRUE;
255}
256
257//____________________________________________________________________
258Int_t
259AliFMDAltroMapping::GetHWAddress(Int_t sec, Int_t str, Int_t ring) const
260{
261 // Return hardware address corresponding to sector sec, strip str,
262 // and ring ring. Mapping from TPC to FMD coordinates are
263 //
264 // TPC | FMD
265 // --------+------
266 // padrow | sector
267 // pad | strip
268 // sector | ring
269 //
270 UInt_t ddl, hwaddr;
271 Char_t r = Char_t(ring);
272 if (!Detector2Hardware(1, r, sec, str, ddl, hwaddr))
273 return -1;
274 return hwaddr;
275}
276
277//____________________________________________________________________
278Int_t
279AliFMDAltroMapping::GetPadRow(Int_t hwaddr) const
280{
281 // Return sector corresponding to hardware address hwaddr. Mapping
282 // from TPC to FMD coordinates are
283 //
284 // TPC | FMD
285 // --------+------
286 // padrow | sector
287 // pad | strip
288 // sector | ring
289 //
290 UShort_t det;
291 Char_t ring;
292 UShort_t sec;
293 UShort_t str;
294 Int_t ddl = AliFMDParameters::kBaseDDL;
295 if (!Hardware2Detector(ddl, hwaddr, det, ring, sec, str)) return -1;
296 return Int_t(sec);
297}
298
299//____________________________________________________________________
300Int_t
301AliFMDAltroMapping::GetPad(Int_t hwaddr) const
302{
303 // Return strip corresponding to hardware address hwaddr. Mapping
304 // from TPC to FMD coordinates are
305 //
306 // TPC | FMD
307 // --------+------
308 // padrow | sector
309 // pad | strip
310 // sector | ring
311 //
312 UShort_t det;
313 Char_t ring;
314 UShort_t sec;
315 UShort_t str;
316 Int_t ddl = AliFMDParameters::kBaseDDL;
317 if (!Hardware2Detector(ddl, hwaddr, det, ring, sec, str)) return -1;
318 return Int_t(str);
319}
320
321//____________________________________________________________________
322Int_t
323AliFMDAltroMapping::GetSector(Int_t hwaddr) const
324{
325 // Return ring corresponding to hardware address hwaddr. Mapping
326 // from TPC to FMD coordinates are
327 //
328 // TPC | FMD
329 // --------+------
330 // padrow | sector
331 // pad | strip
332 // sector | ring
333 //
334 UShort_t det;
335 Char_t ring;
336 UShort_t sec;
337 UShort_t str;
338 Int_t ddl = AliFMDParameters::kBaseDDL;
339 if (!Hardware2Detector(ddl, hwaddr, det, ring, sec, str)) return -1;
340 return Int_t(ring);
341}
342
343//_____________________________________________________________________________
344//
345// EOF
346//