BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
CbmStsAddress.cxx
Go to the documentation of this file.
1/** @file CbmStsAddress.h
2 ** @author Volker Friese <v.friese@gsi.de>
3 ** @date 17.05.2013
4 **/
5
7
8#include "CbmDetectorList.h"
9
10// ----- Definition of the address field -------------------------------
11const Int_t CbmStsAddress::fgkBits[] = {fgkSystemBits, // system = kSTS
12 4, // station
13 4, // ladder
14 1, // halfladder
15 3, // module
16 2, // sensor
17 1, // side
18 13}; // channel
19// -------------------------------------------------------------------------
20
21// ----- Initialisation of bit shifts -----------------------------------
30// -------------------------------------------------------------------------
31
32// ----- Initialisation of bit masks -----------------------------------
33const Int_t CbmStsAddress::fgkMask[] = {(1 << fgkBits[0]) - 1, (1 << fgkBits[1]) - 1, (1 << fgkBits[2]) - 1,
34 (1 << fgkBits[3]) - 1, (1 << fgkBits[4]) - 1, (1 << fgkBits[5]) - 1,
35 (1 << fgkBits[6]) - 1, (1 << fgkBits[7]) - 1};
36// -------------------------------------------------------------------------
37
38// ----- Unique element address -----------------------------------------
40 Int_t ladder,
41 Int_t halfladder,
42 Int_t module,
43 Int_t sensor,
44 Int_t side,
45 Int_t channel)
46{
47
48 // Catch overrunning of allowed ranges
49 if (station >= (1 << fgkBits[kStsStation])) {
50 LOG(error) << "Station Id " << station << " exceeds maximum (" << (1 << fgkBits[kStsStation]) - 1 << ")";
51 return 0;
52 }
53 if (ladder >= (1 << fgkBits[kStsLadder])) {
54 LOG(error) << "Ladder Id " << ladder << " exceeds maximum (" << (1 << fgkBits[kStsLadder]) - 1 << ")";
55 return 0;
56 }
57 if (halfladder >= (1 << fgkBits[kStsHalfLadder])) {
58 LOG(error) << "HalfLadder Id " << halfladder << " exceeds maximum (" << (1 << fgkBits[kStsHalfLadder]) - 1
59 << ")";
60 return 0;
61 }
62 if (module >= (1 << fgkBits[kStsModule])) {
63 LOG(error) << "Module Id " << module << " exceeds maximum (" << (1 << fgkBits[kStsModule]) - 1 << ")";
64 return 0;
65 }
66 if (sensor >= (1 << fgkBits[kStsSensor])) {
67 LOG(error) << "Sensor Id " << sensor << " exceeds maximum (" << (1 << fgkBits[kStsSensor]) - 1 << ")";
68 return 0;
69 }
70 if (side >= (1 << fgkBits[kStsSide])) {
71 LOG(error) << "Side Id " << side << " exceeds maximum (" << (1 << fgkBits[kStsSide]) - 1 << ")";
72 return 0;
73 }
74 if (channel >= (1 << fgkBits[kStsChannel])) {
75 LOG(error) << "Channel Id " << channel << " exceeds maximum (" << (1 << fgkBits[kStsChannel]) - 1 << ")";
76 return 0;
77 }
78
79 return kSts << fgkShift[kStsSystem] | station << fgkShift[kStsStation] | ladder << fgkShift[kStsLadder]
80 | halfladder << fgkShift[kStsHalfLadder] | module << fgkShift[kStsModule] | sensor << fgkShift[kStsSensor]
81 | side << fgkShift[kStsSide] | channel << fgkShift[kStsChannel];
82}
83// -------------------------------------------------------------------------
84
85// ----- Unique element address -----------------------------------------
87{
88
89 UInt_t address = kSts << fgkShift[kStsSystem];
90 for (Int_t level = 1; level < kStsNofLevels; level++) {
91 if (elementId[level] >= (1 << fgkBits[level])) {
92 LOG(error) << "Id " << elementId[level] << " for STS level " << level << " exceeds maximum ("
93 << (1 << fgkBits[level]) - 1 << ")";
94 return 0;
95 }
96 address = address | (elementId[level] << fgkShift[level]);
97 }
98
99 return address;
100}
101// -------------------------------------------------------------------------
102
103// ----- Print info ----------------------------------------------------
105{
106 LOG(info) << "Number of STS levels is " << kStsNofLevels;
107 for (Int_t level = 0; level < kStsNofLevels; level++)
108 LOG(info) << "Level " << std::setw(2) << std::right << level << ": bits " << std::setw(2) << fgkBits[level]
109 << ", max. range " << std::setw(6) << fgkMask[level];
110}
111// -------------------------------------------------------------------------
@ kStsModule
Module.
@ kStsStation
Station.
@ kStsLadder
Ladder.
@ kStsSystem
System = STS.
@ kStsSide
Side.
@ kStsNofLevels
Number of STS levels.
@ kStsHalfLadder
Halfladder.
@ kStsSensor
Sensor.
@ kStsChannel
Channel.
int Int_t
unsigned int UInt_t
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)
Construct address.
static const Int_t fgkMask[kStsNofLevels]
Bit masks for the different levels.
static void Print()
Print information on the bit field.
static const Int_t fgkShift[kStsNofLevels]
Bit shifts for the different levels.
static const Int_t fgkBits[kStsNofLevels]
Number of bits for the different levels.