CbmRoot
Loading...
Searching...
No Matches
CbmMvdAddress.cxx
Go to the documentation of this file.
1/* Copyright (C) 2025 IKF Frankfurt University, Frankfurt am Main
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Ajit Kumar [committer], Jan Michel*/
4
5#include "CbmMvdAddress.h"
6
7#include "AlgoFairloggerCompat.h" // for Logger, LOG
8#include "CbmDefs.h" // for kMvd
9
10#include <iomanip>
11#include <ios>
12
13// ---- Bit shifts for the different levels ----
14const int32_t CbmMvdAddress::fgkShift[] = {
15 0, // system
16 fgkShift[0] + fgkBits[0], // station
17 fgkShift[1] + fgkBits[1], // side up/down
18 fgkShift[2] + fgkBits[2], // side left/right
19 fgkShift[3] + fgkBits[3], // side TB
20 fgkShift[4] + fgkBits[4], // ladder
21 fgkShift[5] + fgkBits[5], // sensor
22 fgkShift[6] + fgkBits[6], // sensor Y
23 fgkShift[7] + fgkBits[7], // sensor X
24};
25
26
27// ---- Bit masks for the different levels ----
28const int32_t CbmMvdAddress::fgkMask[] = {
29 (1 << fgkBits[0]) - 1, // System (4 bits)
30 (1 << fgkBits[1]) - 1, // Station (2 bits)
31 (1 << fgkBits[2]) - 1, // SideUD (1 bit)
32 (1 << fgkBits[3]) - 1, // SideLR (1 bit)
33 (1 << fgkBits[4]) - 1, // SideTB (1 bit)
34 (1 << fgkBits[5]) - 1, // Ladder (2 bits)
35 (1 << fgkBits[6]) - 1, // Sensor (2 bits)
36 (1 << fgkBits[7]) - 1, // SensorY (9 bits)
37 (1 << fgkBits[8]) - 1, // SensorX (10 bits)
38};
39
40const int32_t CbmMvdAddress::fgkShiftSensorNr = fgkShift[kMvdStation]; // SensorNr starts at Station position
41const int32_t CbmMvdAddress::fgkMaskSensorNr = (1 << fgkBitsSensorNr) - 1;
42
43// ---- Unique element address ---------------------------------
44uint32_t CbmMvdAddress::GetAddress(int32_t station, int32_t sideUD, int32_t sideLR, int32_t sideTB, int32_t ladder,
45 int32_t sensor, int32_t sensorY, int32_t sensorX)
46{
47 if (station >= (1 << fgkBits[kMvdStation])) {
48 LOG(error) << "Station Id " << station << " exceeds maximum (" << (1 << fgkBits[kMvdStation]) - 1 << ")";
49 return 0;
50 }
51 if (sideUD >= (1 << fgkBits[kMvdSideUD])) {
52 LOG(error) << "SideUD Id " << sideUD << " exceeds maximum (" << (1 << fgkBits[kMvdSideUD]) - 1 << ")";
53 return 0;
54 }
55 if (sideLR >= (1 << fgkBits[kMvdSideLR])) {
56 LOG(error) << "SideLR Id " << sideLR << " exceeds maximum (" << (1 << fgkBits[kMvdSideLR]) - 1 << ")";
57 return 0;
58 }
59 if (sideTB >= (1 << fgkBits[kMvdSideTB])) {
60 LOG(error) << "SideTB Id " << sideTB << " exceeds maximum (" << (1 << fgkBits[kMvdSideTB]) - 1 << ")";
61 return 0;
62 }
63 if (ladder >= (1 << fgkBits[kMvdLadder])) {
64 LOG(error) << "Ladder Id " << ladder << " exceeds maximum (" << (1 << fgkBits[kMvdLadder]) - 1 << ")";
65 return 0;
66 }
67 if (sensor >= (1 << fgkBits[kMvdSensor])) {
68 LOG(error) << "Sensor Id " << sensor << " exceeds maximum (" << (1 << fgkBits[kMvdSensor]) - 1 << ")";
69 return 0;
70 }
71 if (sensorY >= (1 << fgkBits[kMvdSensorY])) {
72 LOG(error) << "SensorY " << sensorY << " exceeds maximum (" << (1 << fgkBits[kMvdSensorY]) - 1 << ")";
73 return 0;
74 }
75 if (sensorX >= (1 << fgkBits[kMvdSensorX])) {
76 LOG(error) << "SensorX " << sensorX << " exceeds maximum (" << (1 << fgkBits[kMvdSensorX]) - 1 << ")";
77 return 0;
78 }
79
81 | sideUD << fgkShift[kMvdSideUD] | sideLR << fgkShift[kMvdSideLR] | sideTB << fgkShift[kMvdSideTB]
82 | ladder << fgkShift[kMvdLadder] | sensor << fgkShift[kMvdSensor] | sensorY << fgkShift[kMvdSensorY]
83 | sensorX << fgkShift[kMvdSensorX];
84}
85
86uint32_t CbmMvdAddress::GetAddress(int32_t* elementId)
87{
89 for (int32_t level = 1; level < kMvdNofLevels; level++) {
90 if (elementId[level] >= (1 << fgkBits[level])) {
91 LOG(error) << "Id " << elementId[level] << " for MVD level " << level << " exceeds maximum ("
92 << (1 << fgkBits[level]) - 1 << ")";
93 return 0;
94 }
95 address |= elementId[level] << fgkShift[level];
96 }
97 return address;
98}
99
100uint32_t CbmMvdAddress::GetAddressFromSensorNrAndPixelXY(int32_t sensorNr, int32_t sensorY, int32_t sensorX)
101{
102 if (sensorNr >= (1 << fgkBitsSensorNr)) {
103 LOG(fatal) << "Sensor Nr " << sensorNr << " exceeds maximum (" << (1 << fgkBits[fgkBitsSensorNr]) - 1 << ")";
104 return 0;
105 }
106 if (sensorY >= (1 << fgkBits[kMvdSensorY])) {
107 LOG(fatal) << "SensorY " << sensorY << " exceeds maximum (" << (1 << fgkBits[kMvdSensorY]) - 1 << ")";
108 return 0;
109 }
110 if (sensorX >= (1 << fgkBits[kMvdSensorX])) {
111 LOG(fatal) << "SensorX " << sensorX << " exceeds maximum (" << (1 << fgkBits[kMvdSensorX]) - 1 << ")";
112 return 0;
113 }
114
116 | sensorY << fgkShift[kMvdSensorY] | sensorX << fgkShift[kMvdSensorX];
117};
118
120{
121 LOG(info) << "Number of MVD levels is " << kMvdNofLevels;
122 for (int32_t level = 0; level < kMvdNofLevels; level++) {
123 LOG(info) << "Level " << std::setw(2) << std::right << level << ": bits " << std::setw(2) << fgkBits[level]
124 << ", max. range " << std::setw(6) << fgkMask[level];
125 }
126}
127
128uint32_t CbmMvdAddress::SetElementId(uint32_t address, int32_t level, int32_t newId)
129{
130 if (level < 0 || level >= kMvdNofLevels) return address;
131 if (newId >= (1 << fgkBits[level])) {
132 LOG(error) << "Id " << newId << " for MVD level " << level << " exceeds maximum (" << (1 << fgkBits[level]) - 1
133 << ")";
134 return 0;
135 }
136 return (address & (~(fgkMask[level] << fgkShift[level]))) | (newId << fgkShift[level]);
137}
XPU_D constexpr auto ToIntegralType(T enumerator) -> typename std::underlying_type< T >::type
Converts an element of enum class to its underlying integral type.
Definition CbmDefs.h:33
@ kMvd
Micro-Vertex Detector.
Definition CbmDefs.h:47
@ kMvdSensor
Sensor.
@ kMvdSensorX
Sensor X (row)
@ kMvdSideLR
Left/Right.
@ kMvdStation
Station.
@ kMvdSideTB
Top/Bottom.
@ kMvdSideUD
Upstream/Downstream.
@ kMvdLadder
Ladder.
@ kMvdSensorY
Sensor Y (column)
@ kMvdSystem
System = MVD.
@ kMvdNofLevels
Number of MVD levels.
static uint32_t GetAddressFromSensorNrAndPixelXY(int32_t sensorNr, int32_t sensorY, int32_t sensorX)
static const int32_t fgkMask[kMvdNofLevels]
static constexpr int32_t fgkBits[kMvdNofLevels]
static uint32_t SetElementId(uint32_t address, int32_t level, int32_t newId)
static const int32_t fgkShiftSensorNr
static const int32_t fgkShift[kMvdNofLevels]
static void Print()
static const int32_t fgkMaskSensorNr
static constexpr int32_t fgkBitsSensorNr
static uint32_t GetAddress(int32_t station=0, int32_t sideUD=0, int32_t sideLR=0, int32_t sideTB=0, int32_t ladder=0, int32_t sensor=0, int32_t sensorY=0, int32_t sensorX=0)