BmnRoot
Loading...
Searching...
No Matches
CbmStsAddress.cxx
Go to the documentation of this file.
1
7#include "CbmDetectorList.h"
9
10
11// ----- Definition of the address field -------------------------------
12const Int_t CbmStsAddress::fgkBits[] = { fgkSystemBits, // system = kSTS
13 4, // station
14 4, // ladder
15 1, // halfladder
16 3, // module
17 2, // sensor
18 1, // side
19 13 }; // channel
20// -------------------------------------------------------------------------
21
22
23
24// ----- Initialisation of bit shifts -----------------------------------
25const Int_t CbmStsAddress::fgkShift[] =
26 { 0,
27 CbmStsAddress::fgkShift[0] + CbmStsAddress::fgkBits[0],
28 CbmStsAddress::fgkShift[1] + CbmStsAddress::fgkBits[1],
29 CbmStsAddress::fgkShift[2] + CbmStsAddress::fgkBits[2],
30 CbmStsAddress::fgkShift[3] + CbmStsAddress::fgkBits[3],
31 CbmStsAddress::fgkShift[4] + CbmStsAddress::fgkBits[4],
32 CbmStsAddress::fgkShift[5] + CbmStsAddress::fgkBits[5],
33 CbmStsAddress::fgkShift[6] + CbmStsAddress::fgkBits[6] };
34// -------------------------------------------------------------------------
35
36
37
38// ----- Initialisation of bit masks -----------------------------------
39const Int_t CbmStsAddress::fgkMask[] = { ( 1 << fgkBits[0] ) -1,
40 ( 1 << fgkBits[1] ) -1,
41 ( 1 << fgkBits[2] ) -1,
42 ( 1 << fgkBits[3] ) -1,
43 ( 1 << fgkBits[4] ) -1,
44 ( 1 << fgkBits[5] ) -1,
45 ( 1 << fgkBits[6] ) -1,
46 ( 1 << fgkBits[7] ) -1 };
47// -------------------------------------------------------------------------
48
49
50
51// ----- Unique element address -----------------------------------------
52UInt_t CbmStsAddress::GetAddress(Int_t station,
53 Int_t ladder,
54 Int_t halfladder,
55 Int_t module,
56 Int_t sensor,
57 Int_t side,
58 Int_t channel) {
59
60 // Catch overrunning of allowed ranges
61 if ( station >= ( 1 << fgkBits[kStsStation] ) ) {
62 LOG(error) << "Station Id " << station << " exceeds maximum ("
63 << ( 1 << fgkBits[kStsStation] ) - 1 << ")";
64 return 0;
65 }
66 if ( ladder >= ( 1 << fgkBits[kStsLadder]) ) {
67 LOG(error) << "Ladder Id " << ladder << " exceeds maximum ("
68 << ( 1 << fgkBits[kStsLadder] ) - 1 << ")";
69 return 0;
70 }
71 if ( halfladder >= ( 1 << fgkBits[kStsHalfLadder]) ) {
72 LOG(error) << "HalfLadder Id " << halfladder << " exceeds maximum ("
73 << ( 1 << fgkBits[kStsHalfLadder] ) - 1 << ")";
74 return 0;
75 }
76 if ( module >= ( 1 << fgkBits[kStsModule]) ) {
77 LOG(error) << "Module Id " << module << " exceeds maximum ("
78 << ( 1 << fgkBits[kStsModule] ) - 1 << ")";
79 return 0;
80 }
81 if ( sensor >= ( 1 << fgkBits[kStsSensor]) ) {
82 LOG(error) << "Sensor Id " << sensor << " exceeds maximum ("
83 << ( 1 << fgkBits[kStsSensor] ) - 1 << ")";
84 return 0;
85 }
86 if ( side >= ( 1 << fgkBits[kStsSide]) ) {
87 LOG(error) << "Side Id " << side << " exceeds maximum ("
88 << ( 1 << fgkBits[kStsSide] ) - 1 << ")";
89 return 0;
90 }
91 if ( channel >= ( 1 << fgkBits[kStsChannel]) ) {
92 LOG(error) << "Channel Id " << channel << " exceeds maximum ("
93 << ( 1 << fgkBits[kStsChannel] ) - 1 << ")";
94 return 0;
95 }
96
97 return kSts << fgkShift[kStsSystem] |
98 station << fgkShift[kStsStation] |
99 ladder << fgkShift[kStsLadder] |
100 halfladder << fgkShift[kStsHalfLadder] |
101 module << fgkShift[kStsModule] |
102 sensor << fgkShift[kStsSensor] |
103 side << fgkShift[kStsSide] |
104 channel << fgkShift[kStsChannel];
105
106}
107// -------------------------------------------------------------------------
108
109
110
111// ----- Unique element address -----------------------------------------
112UInt_t CbmStsAddress::GetAddress(Int_t* elementId) {
113
114 UInt_t address = kSts << fgkShift[kStsSystem];
115 for (Int_t level = 1; level < kStsNofLevels; level++) {
116 if ( elementId[level] >= ( 1 << fgkBits[level] ) ) {
117 LOG(error) << "Id " << elementId[level] << " for STS level " << level
118 << " exceeds maximum (" << (1 << fgkBits[level]) - 1
119 << ")";
120 return 0;
121 }
122 address = address | ( elementId[level] << fgkShift[level] );
123 }
124
125 return address;
126}
127// -------------------------------------------------------------------------
128
129
130
131// ----- Print info ----------------------------------------------------
133 LOG(info) << "Number of STS levels is " << kStsNofLevels;
134 for (Int_t level = 0; level < kStsNofLevels; level++)
135 LOG(info) << "Level " << std::setw(2) << std::right << level
136 << ": bits " << std::setw(2) << fgkBits[level]
137 << ", max. range " << std::setw(6) << fgkMask[level];
138}
139// -------------------------------------------------------------------------
@ kStsModule
Module.
@ kStsStation
Station.
@ kStsLadder
Ladder.
@ kStsSystem
System = STS.
@ kStsSide
Side.
@ kStsNofLevels
Number of STS levels.
@ kStsHalfLadder
Halfladder.
@ kStsSensor
Sensor.
@ kStsChannel
Channel.
static UInt_t GetAddress(Int_t station=0, Int_t ladder=0, Int_t halfladder=0, Int_t module=0, Int_t sensor=0, Int_t side=0, Int_t channel=0)
static void Print()