]> git.uio.no Git - u/mrichter/AliRoot.git/blame - FMD/AliFMDAltroMapping.cxx
RC and DQM wants to have t0 A vs C in the DQM shifter console.
[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 **************************************************************************/
57c3c593 15/* $Id$ */
c2fc1258 16/** @file AliFMDAltroMapping.cxx
17 @author Christian Holm Christensen <cholm@nbi.dk>
18 @date Sun Mar 26 18:27:56 2006
19 @brief Map HW to detector
20*/
57c3c593 21//____________________________________________________________________
22//
23// Mapping of ALTRO hardware channel to detector coordinates
24//
6169f936 25// The hardware address consist of a DDL number and 12bits of ALTRO
26// addresses. The ALTRO address are formatted as follows.
02a27b50 27//
28// 12 7 4 0
29// |---------------|---------|------------|
30// | Board # | ALTRO # | Channel # |
31// +---------------+---------+------------+
32//
6169f936 33// The mapping is done purely by calculations. In the future,
34// however, we may need some hard-coded stuff, or an external file to
35// read from.
02a27b50 36//
57c3c593 37#include "AliFMDAltroMapping.h" // ALIFMDALTROMAPPING_H
38#include "AliFMDParameters.h"
39#include "AliLog.h"
b995fc28 40#include "AliFMDDebug.h"
f6449cc0 41#include <iostream>
42#include <iomanip>
57c3c593 43
44//____________________________________________________________________
45ClassImp(AliFMDAltroMapping)
46#if 0
47 ; // This is here to keep Emacs for indenting the next line
48#endif
49
50//_____________________________________________________________________________
51AliFMDAltroMapping::AliFMDAltroMapping()
9f662337 52{
53 // Constructor
54}
57c3c593 55
56
57//_____________________________________________________________________________
58Bool_t
59AliFMDAltroMapping::ReadMapping()
60{
9f662337 61 // Read map from file - not used
57c3c593 62 return kTRUE;
63}
64
65//_____________________________________________________________________________
573322da 66Bool_t
67AliFMDAltroMapping::CreateInvMapping()
9f662337 68{
573322da 69 // Create inverse mapping - not used
70 return kTRUE;
9f662337 71}
57c3c593 72
f6449cc0 73
74//____________________________________________________________________
75Bool_t
b995fc28 76AliFMDAltroMapping::Channel2StripBase(UShort_t board, UShort_t altro,
77 UShort_t chan, Char_t& ring,
f38b1653 78 UShort_t& sec, Short_t& str) const
57c3c593 79{
80 // Translate a hardware address to detector coordinates.
81 // The detector is simply
82 //
362c9d61 83 // ddl + 1
57c3c593 84 //
85 // The ring number, sector, and strip number is given by the addr
86 // argument. The address argument, has the following format
87 //
88 // 12 7 4 0
89 // +-------------+----------+----------+
90 // | Board | ALTRO | Channel |
91 // +-------------+----------+----------+
92 //
93 // The board number identifier among other things the ring. There's
a9579262 94 // up to 4 boards per DDL, and the two first (0 and 16) corresponds
95 // to the inner rings, while the two last (1 and 17) corresponds to
57c3c593 96 // the outer rings.
97 //
98 // The board number and ALTRO number together identifies the sensor,
f38b1653 99 // and hence. The lower board number (0 or 16) are the first N / 2
57c3c593 100 // sensors (where N is the number of sensors in the ring).
101 //
102 // There are 3 ALTRO's per card, and each ALTRO serves up to 4
103 // sensors. Which of sensor is determined by the channel number.
104 // For the inner rings, the map is
105 //
106 // ALTRO 0, Channel 0 to 7 -> Sensor 0 or 5
107 // ALTRO 0, Channel 8 to 15 -> Sensor 1 or 6
108 // ALTRO 1, Channel 0 to 7 -> Sensor 2 or 7
109 // ALTRO 2, Channel 0 to 7 -> Sensor 3 or 8
110 // ALTRO 2, Channel 8 to 15 -> Sensor 4 or 9
111 //
112 // For the outer rings, the map is
113 //
114 // ALTRO 0, Channel 0 to 3 -> Sensor 0 or 10
115 // ALTRO 0, Channel 4 to 7 -> Sensor 1 or 11
116 // ALTRO 0, Channel 8 to 11 -> Sensor 2 or 12
117 // ALTRO 0, Channel 12 to 15 -> Sensor 3 or 13
118 // ALTRO 1, Channel 0 to 3 -> Sensor 4 or 14
119 // ALTRO 1, Channel 4 to 7 -> Sensor 5 or 15
120 // ALTRO 2, Channel 0 to 3 -> Sensor 6 or 16
121 // ALTRO 2, Channel 4 to 7 -> Sensor 7 or 17
122 // ALTRO 2, Channel 8 to 11 -> Sensor 8 or 18
123 // ALTRO 2, Channel 12 to 15 -> Sensor 9 or 19
124 //
125 // Which divison of the sensor we're in, depends on the channel
126 // number only. For the inner rings, the map is
127 //
128 // Channel 0 -> Sector 0, strips 0-127
f38b1653 129 // Channel 1 -> Sector 1, strips 127-0
57c3c593 130 // Channel 3 -> Sector 0, strips 128-255
f38b1653 131 // Channel 4 -> Sector 1, strips 255-128
57c3c593 132 // Channel 5 -> Sector 0, strips 256-383
f38b1653 133 // Channel 6 -> Sector 1, strips 383-256
57c3c593 134 // Channel 7 -> Sector 0, strips 384-511
f38b1653 135 // Channel 8 -> Sector 1, strips 511-384
57c3c593 136 //
137 // There are only half as many strips in the outer sensors, so there
138 // only 4 channels are used for a full sensor. The map is
139 //
140 // Channel 0 -> Sector 0, strips 0-127
f38b1653 141 // Channel 1 -> Sector 1, strips 127-0
57c3c593 142 // Channel 3 -> Sector 0, strips 128-255
f38b1653 143 // Channel 4 -> Sector 1, strips 255-128
57c3c593 144 //
145 // With this information, we can decode the hardware address to give
146 // us detector coordinates, unique at least up a 128 strips. We
f38b1653 147 // return the first strip, as seen by the ALTRO channel, in the
148 // given range.
57c3c593 149 //
5cf05dbb 150 ring = Board2Ring(board);
151 UShort_t fsec = board < 16 ? 1 : 0;
a9579262 152 switch (ring) {
153 case 'i':
154 case 'I':
5cf05dbb 155 sec = (fsec * 10 + (altro < 1 ? 0 : altro < 2 ? 4 : 6)
a9579262 156 + 2 * (chan / 8) + chan % 2);
157 str = ((chan % 8) / 2) * 128;
158 break;
159 case 'o':
160 case 'O':
5cf05dbb 161 sec = (fsec * 20 + (altro < 1 ? 0 : altro < 2 ? 8 : 12)
a9579262 162 + 2 * (chan / 4) + chan % 2);
163 str = ((chan % 4) / 2) * 128;
164 break;
57c3c593 165 }
f38b1653 166 if (sec % 2) str += 127;
b995fc28 167 // AliFMDDebug(1, ("%02x/%x/%x Base strip = %d", board, altro, chan, str));
57c3c593 168 return kTRUE;
169}
170
b995fc28 171//____________________________________________________________________
172void
173AliFMDAltroMapping::Timebin2Strip(UShort_t sec,
174 UShort_t timebin,
175 UShort_t preSamples,
176 UShort_t sampleRate,
177 Short_t& stripOff,
178 UShort_t& sample) const
179{
180 // Compute the strip off-set in the current channel from the sector
181 // and timebin. Also needed for this computation is the basic
182 // offset in timebins, as well as the sample rat.
183 UShort_t t = (timebin - preSamples);
184 sample = (t % sampleRate);
185 t -= sample;
186 stripOff = (sec % 2 ? -1 : 1) * t / sampleRate;
187}
188
f38b1653 189//____________________________________________________________________
190Bool_t
b995fc28 191AliFMDAltroMapping::Hardware2Detector(UShort_t ddl, UShort_t board,
192 UShort_t altro, UShort_t chan,
193 UShort_t timebin, UShort_t preSamples,
194 UShort_t sampleRate,
f38b1653 195 UShort_t& det, Char_t& ring,
196 UShort_t& sec, Short_t& str,
197 UShort_t& sam) const
198{
199 // Full conversion from hardware address, including timebin number,
200 // to detector coordinates and sample number. Note, that this
201 // conversion depends on the oversampling rate and the number of
202 // pre-samples
b995fc28 203 Short_t baseStrip, stripOffset, tdet = DDL2Detector(ddl);
204 if (tdet < 0) return kFALSE;
205 det = tdet;
206 if (!Channel2StripBase(board, altro, chan, ring, sec, baseStrip))
f38b1653 207 return kFALSE;
b995fc28 208 Timebin2Strip(sec, timebin, preSamples, sampleRate, stripOffset, sam);
f38b1653 209#if 0
b995fc28 210 AliFMDDebug(1, ("0x%x/0x%02x/0x%x/0x%x/%04d -> FMD%d%c[%2d,%3d]-%d "
211 "(pre=%d,rate=%d,base=%3d,off=%3d)",
212 ddl,
213 board,
214 altro,
215 chan,
216 timebin,
217 det,
218 ring,
219 sec,
220 str,
221 sam,
222 preSamples,
223 sampleRate,
224 baseStrip,
225 stripOffset));
f38b1653 226#endif
b995fc28 227 str = baseStrip + stripOffset;
f38b1653 228 return kTRUE;
229}
230
57c3c593 231//____________________________________________________________________
232Bool_t
b995fc28 233AliFMDAltroMapping::Hardware2Detector(UShort_t ddl, UShort_t addr,
234 UShort_t timebin, UShort_t preSamples,
235 UShort_t sampleRate,
236 UShort_t& det, Char_t& ring,
237 UShort_t& sec, Short_t& str,
238 UShort_t& sam) const
239{
240 // Translate a hardware address to detector coordinates.
241 //
242 // See also Hardware2Detector that accepts 4 inputs
243 UShort_t board, altro, chan;
244 ChannelAddress(addr, board, altro, chan);
245 return Hardware2Detector(ddl, board, altro, chan,
246 timebin, preSamples, sampleRate,
247 det, ring, sec, str, sam);
248}
249
250
251//____________________________________________________________________
252Short_t
253AliFMDAltroMapping::Sector2Board(Char_t ring, UShort_t sec) const
254{
09b6c804 255 //
256 // Return board address corresponding to a sector
257 //
258 // Parameters:
259 // ring Ring identifier
260 // sec Sector number
261 // Return:
262 // The board number, or negative number in case of failure
263 //
b995fc28 264 switch (ring) {
265 case 'I':
266 case 'i':
9324dfea 267 return (sec < 10 ? 16 : 0); // (sec / 10) * 16;
b995fc28 268 case 'O':
269 case 'o':
9324dfea 270 return (sec < 20 ? 16 : 0) + 1; // (sec / 20) * 16 + 1;
b995fc28 271 }
272 return -1;
273}
274
275//_____________________________________________ _______________________
276Bool_t
277AliFMDAltroMapping::Strip2Channel(Char_t ring, UShort_t sec,
278 UShort_t str, UShort_t& board,
279 UShort_t& altro, UShort_t& chan) const
57c3c593 280{
281 // Translate detector coordinates to a hardware address.
282 // The ddl is simply
283 //
362c9d61 284 // (det - 1)
57c3c593 285 //
286 // The ring number, sector, and strip number must be encoded into a
287 // hardware address. The address argument, will have the following
288 // format on output
289 //
290 // 12 7 4 0
291 // +-------------+----------+----------+
292 // | Board | ALTRO | Channel |
293 // +-------------+----------+----------+
294 //
295 // The board number is given by the ring and sector. The inner
a9579262 296 // rings board 0 and 16, while the outer are 1 and 17. Which of these
57c3c593 297 // depends on the sector. The map is
298 //
299 // Ring I, sector 0- 9 -> board 0
a9579262 300 // Ring I, sector 10-19 -> board 16
301 // Ring O, sector 0-19 -> board 1
302 // Ring O, sector 20-39 -> board 17
57c3c593 303 //
304 // There are 3 ALTRO's per board. The ALTRO number is given by the
305 // sector number. For the inner rings, these are given by
306 //
307 // Sector 0- 3 or 10-13 -> ALTRO 0
308 // Sector 4- 5 or 14-15 -> ALTRO 1
309 // Sector 6- 9 or 16-19 -> ALTRO 2
310 //
311 // For the outers, it's given by
312 //
313 // Sector 0- 7 or 20-27 -> ALTRO 0
314 // Sector 8-11 or 28-31 -> ALTRO 1
315 // Sector 12-19 or 32-39 -> ALTRO 2
316 //
317 // The channel number is given by the sector and strip number. For
318 // the inners, the map is
319 //
320 // Sector 0, strips 0-127 -> Channel 0
321 // Sector 0, strips 128-255 -> Channel 2
322 // Sector 0, strips 256-383 -> Channel 4
323 // Sector 0, strips 384-511 -> Channel 6
f38b1653 324 // Sector 1, strips 127- 0 -> Channel 1
325 // Sector 1, strips 255-128 -> Channel 3
326 // Sector 1, strips 383-256 -> Channel 5
327 // Sector 1, strips 511-384 -> Channel 7
57c3c593 328 // Sector 2, strips 0-127 -> Channel 8
329 // Sector 2, strips 128-255 -> Channel 10
330 // Sector 2, strips 256-383 -> Channel 12
331 // Sector 2, strips 384-511 -> Channel 14
f38b1653 332 // Sector 3, strips 127- 0 -> Channel 9
333 // Sector 3, strips 255-128 -> Channel 11
334 // Sector 3, strips 383-256 -> Channel 13
335 // Sector 3, strips 511-384 -> Channel 15
57c3c593 336 //
337 // and so on, up to sector 19. For the outer, the map is
338 //
339 // Sector 0, strips 0-127 -> Channel 0
340 // Sector 0, strips 128-255 -> Channel 2
f38b1653 341 // Sector 1, strips 127- 0 -> Channel 1
342 // Sector 1, strips 255-128 -> Channel 3
57c3c593 343 // Sector 2, strips 0-127 -> Channel 4
344 // Sector 2, strips 128-255 -> Channel 6
f38b1653 345 // Sector 3, strips 127- 0 -> Channel 5
346 // Sector 3, strips 255-128 -> Channel 7
57c3c593 347 // Sector 4, strips 0-127 -> Channel 8
348 // Sector 4, strips 128-255 -> Channel 10
f38b1653 349 // Sector 5, strips 127- 0 -> Channel 9
350 // Sector 5, strips 255-128 -> Channel 11
57c3c593 351 // Sector 6, strips 0-127 -> Channel 12
352 // Sector 6, strips 128-255 -> Channel 14
f38b1653 353 // Sector 7, strips 127- 0 -> Channel 13
354 // Sector 7, strips 255-128 -> Channel 15
57c3c593 355 //
356 // and so on upto sector 40.
357 //
358 // With this information, we can decode the detector coordinates to
359 // give us a unique hardware address
360 //
5cf05dbb 361 UInt_t tmp = 0;
362 UShort_t fboard = 0;
a9579262 363 switch (ring) {
364 case 'I':
365 case 'i':
5cf05dbb 366 fboard = sec < 10 ? 1 : 0;
367 board = fboard * 16;
368 altro = (sec % 10) < 4 ? 0 : (sec % 10) < 6 ? 1 : 2;
369 tmp = (sec % 10) - (altro == 0 ? 0 : altro == 1 ? 4 : 6);
370 chan = 2 * (str / 128) + (sec % 2) + ((tmp / 2) % 2) * 8;
a9579262 371 break;
372 case 'O':
373 case 'o':
5cf05dbb 374 fboard = sec < 20 ? 1 : 0;
375 board = fboard * 16 + 1;
376 altro = (sec % 20) < 8 ? 0 : (sec % 20) < 12 ? 1 : 2;
377 tmp = (sec % 20) - (altro == 0 ? 0 : altro == 1 ? 8 : 12);
378 chan = 2 * (str / 128) + (sec % 2) + ((tmp / 2) % 4) * 4;
a9579262 379 break;
380 }
f6449cc0 381 return kTRUE;
382}
383
b995fc28 384//_____________________________________________ _______________________
385UShort_t
386AliFMDAltroMapping::Strip2Timebin(UShort_t sec, UShort_t strip,
387 UShort_t sam, UShort_t preSamples,
388 UShort_t sampleRate) const
389{
09b6c804 390 //
391 // Get the timebin correspoding to a strip and sample
392 //
393 // Parameters:
394 // sec Sector number
395 // str Strip number
396 // sam Sample number
397 // preSamples Number of pre-samples.
398 // sampleRate The over-sampling rate
399 // Return:
400 // the timebin corresponding to the passed strip
401 //
b995fc28 402 UShort_t timebin = preSamples;
403 if (sec % 2) timebin += (127 - (strip % 128)) * sampleRate;
404 else timebin += (strip % 128) * sampleRate;
405 timebin += sam;
406 return timebin;
407}
408
57c3c593 409
f38b1653 410//____________________________________________________________________
411Bool_t
412AliFMDAltroMapping::Detector2Hardware(UShort_t det, Char_t ring,
413 UShort_t sec, UShort_t str,
414 UShort_t sam,
b995fc28 415 UShort_t preSamples,
416 UShort_t sampleRate,
417 UShort_t& ddl, UShort_t& board,
418 UShort_t& altro, UShort_t& channel,
f38b1653 419 UShort_t& timebin) const
420{
09b6c804 421 //
422 // Map a detector index into a hardware address.
423 //
424 // Parameters:
425 // det The detector #
426 // ring The ring ID
427 // sec The sector #
428 // str The strip #
429 // sam The sample number
430 // preSamples Number of pre-samples
431 // sampleRate The oversampling rate
432 // ddl On return, hardware DDL number
433 // board On return, the FEC board address (local to DDL)
434 // altro On return, the ALTRO number (local to FEC)
435 // channel On return, the channel number (local to ALTRO)
436 // timebin On return, the timebin number (local to ALTRO)
437 // Return:
438 // @c true on success, false otherwise
439 //
b995fc28 440 ddl = Detector2DDL(det);
441 if (!Strip2Channel(ring,sec,str,board,altro,channel)) return kFALSE;
442 timebin = Strip2Timebin(sec, str, sam, preSamples, sampleRate);
f38b1653 443 return kTRUE;
444}
445
446
447//____________________________________________________________________
448Bool_t
449AliFMDAltroMapping::Detector2Hardware(UShort_t det, Char_t ring,
450 UShort_t sec, UShort_t str,
451 UShort_t sam,
452 UShort_t preSamples, UShort_t sampleRate,
b995fc28 453 UShort_t& ddl, UShort_t& hwaddr,
f38b1653 454 UShort_t& timebin) const
455{
09b6c804 456 //
457 // Map a detector index into a hardware address.
458 //
459 // Parameters:
460 // det The detector #
461 // ring The ring ID
462 // sec The sector #
463 // str The strip #
464 // sam The sample number
465 // preSamples Number of pre-samples
466 // sampleRate The oversampling rate
467 // ddl On return, hardware DDL number
468 // hwaddr On return, hardware address.
469 // timebin On return, the timebin number (local to ALTRO)
470 // Return:
471 // @c true on success, false otherwise
472 //
b995fc28 473 UShort_t board = 0;
474 UShort_t altro = 0;
475 UShort_t chan = 0;
f38b1653 476 if (!Detector2Hardware(det, ring, sec, str, sam,
477 preSamples, sampleRate,
478 ddl, board, altro, chan, timebin)) return kFALSE;
b995fc28 479 hwaddr = ChannelAddress(board, altro, chan);
f38b1653 480 return kTRUE;
481}
482
483
b995fc28 484//____________________________________________________________________
485UInt_t
486AliFMDAltroMapping::ChannelAddress(UShort_t board, UShort_t altro,
487 UShort_t channel) const
488{
09b6c804 489 //
490 // Convert board, chip, channel to a hardware address
491 //
492 // Parameters:
493 // board Board number
494 // altro Altro number
495 // channel Channel number
496 // Return:
497 // hardware address of a channel
498 //
b995fc28 499 return (((board & 0x1F) << 7) | ((altro & 0x7) << 4) | (channel & 0xF));
500}
501
502//____________________________________________________________________
503void
504AliFMDAltroMapping::ChannelAddress(UShort_t hwaddr, UShort_t& board,
505 UShort_t& altro, UShort_t& channel) const
506{
09b6c804 507 //
508 // Convert a channel address to board, altro, channel fields
509 //
510 // Parameters:
511 // hwaddr Channel address
512 // board On return, the Board number
513 // altro On return, the Altro number
514 // channel On return, the Channel number
515 //
b995fc28 516 board = ((hwaddr >> 7) & 0x1F);
517 altro = ((hwaddr >> 4) & 0x07);
518 channel = ((hwaddr >> 0) & 0x0F);
519}
f38b1653 520
57c3c593 521//____________________________________________________________________
522Int_t
573322da 523AliFMDAltroMapping::GetHWAddress(Int_t sec, Int_t str, Int_t ring)
57c3c593 524{
525 // Return hardware address corresponding to sector sec, strip str,
526 // and ring ring. Mapping from TPC to FMD coordinates are
527 //
528 // TPC | FMD
529 // --------+------
530 // padrow | sector
531 // pad | strip
532 // sector | ring
533 //
57c3c593 534 Char_t r = Char_t(ring);
b995fc28 535 UShort_t board, altro, channel;
536 Strip2Channel(r, sec, str, board, altro, channel);
537 return ChannelAddress(board, altro, channel);
57c3c593 538}
539
540//____________________________________________________________________
541Int_t
542AliFMDAltroMapping::GetPadRow(Int_t hwaddr) const
543{
544 // Return sector corresponding to hardware address hwaddr. Mapping
545 // from TPC to FMD coordinates are
546 //
547 // TPC | FMD
548 // --------+------
549 // padrow | sector
550 // pad | strip
551 // sector | ring
552 //
57c3c593 553 Char_t ring;
b995fc28 554 UShort_t board, altro, channel, sector;
555 Short_t baseStrip;
556 ChannelAddress(hwaddr, board, altro, channel);
557 if (!Channel2StripBase(board, altro, channel, ring, sector, baseStrip))
558 return -1;
559 return Int_t(sector);
57c3c593 560}
561
562//____________________________________________________________________
563Int_t
564AliFMDAltroMapping::GetPad(Int_t hwaddr) const
565{
566 // Return strip corresponding to hardware address hwaddr. Mapping
567 // from TPC to FMD coordinates are
568 //
569 // TPC | FMD
570 // --------+------
571 // padrow | sector
572 // pad | strip
573 // sector | ring
574 //
57c3c593 575 Char_t ring;
b995fc28 576 UShort_t board, altro, channel, sector;
577 Short_t baseStrip;
578 ChannelAddress(hwaddr, board, altro, channel);
579 if (!Channel2StripBase(board, altro, channel, ring, sector, baseStrip))
580 return -1;
581 return Int_t(baseStrip);
57c3c593 582}
583
584//____________________________________________________________________
585Int_t
586AliFMDAltroMapping::GetSector(Int_t hwaddr) const
587{
588 // Return ring corresponding to hardware address hwaddr. Mapping
589 // from TPC to FMD coordinates are
590 //
591 // TPC | FMD
592 // --------+------
593 // padrow | sector
594 // pad | strip
595 // sector | ring
596 //
57c3c593 597 Char_t ring;
b995fc28 598 UShort_t board, altro, channel, sector;
599 Short_t baseStrip;
600 ChannelAddress(hwaddr, board, altro, channel);
601 if (!Channel2StripBase(board, altro, channel, ring, sector, baseStrip))
602 return -1;
57c3c593 603 return Int_t(ring);
604}
605
f6449cc0 606//____________________________________________________________________
607void
608AliFMDAltroMapping::Print(Option_t* option) const
609{
09b6c804 610 //
611 // Print map to standard out
612 //
613 // Parameters:
614 // option Option string (hw, or det)
615 //
f6449cc0 616 TString opt(option);
617 opt.ToLower();
b995fc28 618 UShort_t ddl, board, chip, chan, addr;
f38b1653 619 UShort_t det, sec;
b995fc28 620 Short_t strBase;
f6449cc0 621 Char_t rng;
622
623 if (opt.Contains("hw") || opt.Contains("hardware")) {
624 std::cout << " DDL | Board | Chip | Chan | Address | Detector\n"
625 << "=====+=======+======+======+=========+==============="
626 << std::endl;
627 for (ddl = 0; ddl <= 2; ddl++) {
628 Int_t boards[] = { 0, 16, (ddl == 0 ? 32 : 1), 17, 32};
629 Int_t* ptr = boards;
b995fc28 630 det = DDL2Detector(ddl);
f6449cc0 631 while ((board = *(ptr++)) < 32) {
632 for (chip = 0; chip <= 2; chip++) {
b995fc28 633 UShort_t nchan = (chip == 1 ? 8 : 16);
f6449cc0 634 for (chan = 0; chan < nchan; chan++) {
b995fc28 635 Channel2StripBase(board, chip, chan, rng, sec, strBase);
636 addr = ChannelAddress(board, chip, chan);
f6449cc0 637 std::cout << " "
b995fc28 638 << std::setw(3) << ddl << " | "
639 << std::setfill('0') << std::hex << " 0x"
640 << std::setw(2) << board << " | 0x"
641 << std::setw(1) << chip << " | 0x"
642 << std::setw(1) << chan << " | 0x"
643 << std::setw(3) << addr << " | "
644 << std::setfill(' ') << std::dec << " FMD"
645 << std::setw(1) << det << rng << "["
646 << std::setw(2) << sec << ","
647 << std::setw(3) << strBase << "]" << std::endl;
f6449cc0 648 } // for chan ...
649 if (chip == 2 && *ptr >= 32) continue;
650 std::cout << " + + + + + "
651 << std::endl;
652 } // for chip ...
653 } // while board
654 std::cout << "-----+-------+------+------+---------+---------------"
655 << std::endl;
656 } // for ddl ...
657 } // if hw
658 if (opt.Contains("det")) {
659 std::cout << " Detector | DDL | Board | Chip | Chan | Address\n"
660 << "===============+=====+=======+======+======+========"
661 << std::endl;
662 for (det = 1; det <= 3; det++) {
663 Char_t rings[] = { 'I', (det == 1 ? '\0' : 'O'),'\0' };
664 Char_t* ptr = rings;
b995fc28 665 ddl = Detector2DDL(det);
f6449cc0 666 while ((rng = *(ptr++)) != '\0') {
667 UShort_t nsec = (rng == 'I' ? 20 : 40);
668 UShort_t nstr = (rng == 'I' ? 512 : 256);
669 for (sec = 0; sec < nsec; sec++) {
b995fc28 670 for (strBase = 0; strBase < nstr; strBase += 128) {
671 Strip2Channel(rng, sec, strBase, board, chip, chan);
672 addr = ChannelAddress(board, chip, chan);
673 std::cout << std::setfill(' ') << std::dec << " FMD"
674 << std::setw(1) << det << rng << "["
675 << std::setw(2) << sec << ","
676 << std::setw(3) << strBase << "] | "
677 << std::setw(3) << ddl << " | 0x"
678 << std::setfill('0') << std::hex
679 << std::setw(2) << board << " | 0x"
680 << std::setw(1) << chip << " | 0x"
681 << std::setw(1) << chan << " | 0x"
682 << std::setw(3) << addr << std::endl;
f6449cc0 683 } // for str ...
684 } // for sec ...
685 if (*ptr == '\0') continue;
686 std::cout << " + + + + + "
687 << std::endl;
688 } // while rng ...
689 std::cout << "---------------+-----+-------+------+------+--------"
690 << std::endl;
691
692 } // for det ...
693 } // if det
694}
695
57c3c593 696//_____________________________________________________________________________
697//
698// EOF
699//