Belle II Software  release-05-01-25
BKLMElementNumbers.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2019 Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Kirill Chilikin *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 /* Own header. */
12 #include <klm/dataobjects/bklm/BKLMElementNumbers.h>
13 
14 /* Belle 2 headers. */
15 #include <rawdata/dataobjects/RawCOPPERFormat.h>
16 
17 using namespace Belle2;
18 
20 {
21 }
22 
24 {
25 }
26 
28  int section, int sector, int layer, int plane, int strip)
29 {
30  checkChannelNumber(section, sector, layer, plane, strip);
31  return (section << BKLM_SECTION_BIT)
32  | ((sector - 1) << BKLM_SECTOR_BIT)
33  | ((layer - 1) << BKLM_LAYER_BIT)
34  | ((plane) << BKLM_PLANE_BIT)
35  | ((strip - 1) << BKLM_STRIP_BIT);
36 }
37 
39  uint16_t channel, int* section, int* sector, int* layer, int* plane,
40  int* strip)
41 {
42  *section = ((channel & BKLM_SECTION_MASK) >> BKLM_SECTION_BIT);
43  *sector = ((channel & BKLM_SECTOR_MASK) >> BKLM_SECTOR_BIT) + 1;
44  *layer = ((channel & BKLM_LAYER_MASK) >> BKLM_LAYER_BIT) + 1;
45  *plane = ((channel & BKLM_PLANE_MASK) >> BKLM_PLANE_BIT);
46  *strip = ((channel & BKLM_STRIP_MASK) >> BKLM_STRIP_BIT) + 1;
47 }
48 
50  int section, int sector, int layer, int plane)
51 {
52  checkSection(section);
53  checkSector(sector);
54  checkLayer(layer);
55  checkPlane(plane);
56  return (section << BKLM_SECTION_BIT)
57  | ((sector - 1) << BKLM_SECTOR_BIT)
58  | ((layer - 1) << BKLM_LAYER_BIT)
59  | ((plane) << BKLM_PLANE_BIT);
60 }
61 
63  uint16_t planeGlobal, int* section, int* sector, int* layer, int* plane)
64 {
65  *section = ((planeGlobal & BKLM_SECTION_MASK) >> BKLM_SECTION_BIT);
66  *sector = ((planeGlobal & BKLM_SECTOR_MASK) >> BKLM_SECTOR_BIT) + 1;
67  *layer = ((planeGlobal & BKLM_LAYER_MASK) >> BKLM_LAYER_BIT) + 1;
68  *plane = ((planeGlobal & BKLM_PLANE_MASK) >> BKLM_PLANE_BIT);
69 }
70 
71 uint16_t BKLMElementNumbers::moduleNumber(int section, int sector, int layer, bool fatalError)
72 {
73  checkSection(section);
74  checkSector(sector, fatalError);
75  checkLayer(layer, fatalError);
76  return (section << BKLM_SECTION_BIT)
77  | ((sector - 1) << BKLM_SECTOR_BIT)
78  | ((layer - 1) << BKLM_LAYER_BIT);
79 }
80 
82  uint16_t module, int* section, int* sector, int* layer)
83 {
84  *section = ((module & BKLM_SECTION_MASK) >> BKLM_SECTION_BIT);
85  *sector = ((module & BKLM_SECTOR_MASK) >> BKLM_SECTOR_BIT) + 1;
86  *layer = ((module & BKLM_LAYER_MASK) >> BKLM_LAYER_BIT) + 1;
87 }
88 
89 uint16_t BKLMElementNumbers::sectorNumber(int section, int sector)
90 {
91  checkSection(section);
92  checkSector(sector);
93  return (section ? BKLM_SECTION_MASK : 0)
94  | ((sector - 1) << BKLM_SECTOR_BIT);
95 }
96 
97 int BKLMElementNumbers::layerGlobalNumber(int section, int sector, int layer)
98 {
99  checkSection(section);
100  checkSector(sector);
101  checkLayer(layer);
102  int layerGlobal = layer;
103  layerGlobal += (sector - 1) * m_MaximalLayerNumber;
104  layerGlobal += section * m_MaximalSectorNumber * m_MaximalLayerNumber;
105  return layerGlobal;
106 }
107 
109  int section, int sector, int layer, int plane)
110 {
111  checkSection(section);
112  checkSector(sector);
113  checkLayer(layer);
114  checkPlane(plane);
115  int strips = 0;
116  if (section == BKLMElementNumbers::c_BackwardSection &&
118  plane == BKLMElementNumbers::c_ZPlane) {
119  /* Chimney sector. */
120  if (layer < 3)
121  strips = 38;
122  if (layer > 2)
123  strips = 34;
124  } else {
125  /* Other sectors. */
126  if (layer == 1 && plane == BKLMElementNumbers::c_PhiPlane)
127  strips = 37;
128  if (layer == 2 && plane == BKLMElementNumbers::c_PhiPlane)
129  strips = 42;
130  if (layer > 2 && layer < 7 && plane == BKLMElementNumbers::c_PhiPlane)
131  strips = 36;
132  if (layer > 6 && plane == BKLMElementNumbers::c_PhiPlane)
133  strips = 48;
134  if (layer == 1 && plane == BKLMElementNumbers::c_ZPlane)
135  strips = 54;
136  if (layer == 2 && plane == BKLMElementNumbers::c_ZPlane)
137  strips = 54;
138  if (layer > 2 && plane == BKLMElementNumbers::c_ZPlane)
139  strips = 48;
140  }
141  return strips;
142 }
143 
144 bool BKLMElementNumbers::checkSection(int section, bool fatalError)
145 {
146  if (section < BKLMElementNumbers::c_BackwardSection || section > BKLMElementNumbers::c_ForwardSection) {
147  if (fatalError)
148  B2FATAL("Invalid BKLM section number: " << section << ".");
149  return false;
150  }
151  return true;
152 }
153 
154 bool BKLMElementNumbers::checkSector(int sector, bool fatalError)
155 {
156  if (sector < 1 || sector > m_MaximalSectorNumber) {
157  if (fatalError)
158  B2FATAL("Invalid BKLM sector number: " << sector << ".");
159  return false;
160  }
161  return true;
162 }
163 
164 bool BKLMElementNumbers::checkLayer(int layer, bool fatalError)
165 {
166  if (layer < 1 || layer > m_MaximalLayerNumber) {
167  if (fatalError)
168  B2FATAL("Invalid BKLM layer number: " << layer << ".");
169  return false;
170  }
171  return true;
172 }
173 
174 bool BKLMElementNumbers::checkPlane(int plane, bool fatalError)
175 {
176  if (plane < 0 || plane > m_MaximalPlaneNumber) {
177  if (fatalError)
178  B2FATAL("Invalid BKLM plane number: " << plane << ".");
179  return false;
180  }
181  return true;
182 }
183 
185  int section, int sector, int layer, int plane, int strip, bool fatalError)
186 {
187  if (strip < 1 || strip > getNStrips(section, sector, layer, plane)) {
188  if (fatalError)
189  B2FATAL("Invalid BKLM channel number: section = " << section << ", sector = " << sector << ", layer = " << layer << ", plane = " <<
190  plane << ", strip = " << strip << ".");
191  return false;
192  }
193  return true;
194 }
195 
196 void BKLMElementNumbers::layerGlobalNumberToElementNumbers(int layerGlobal, int* section, int* sector, int* layer)
197 {
198  *section = ((layerGlobal / m_MaximalLayerNumber) / m_MaximalSectorNumber) % (m_MaximalLayerNumber + 1);
199  *sector = ((layerGlobal / m_MaximalLayerNumber) % m_MaximalSectorNumber) + 1;
200  *layer = (layerGlobal % m_MaximalLayerNumber) + 1;
201 }
202 
203 std::string BKLMElementNumbers::getHSLBName(int copper, int slot)
204 {
205  char hslb = 'a' + slot - 1;
206  return "700" + std::to_string(copper - BKLM_ID) + hslb;
207 }
Belle2::BKLMElementNumbers::m_MaximalSectorNumber
static constexpr int m_MaximalSectorNumber
Maximal sector number (1-based).
Definition: BKLMElementNumbers.h:427
Belle2::BKLMElementNumbers::planeNumber
static uint16_t planeNumber(int section, int sector, int layer, int plane)
Get plane number.
Definition: BKLMElementNumbers.cc:49
Belle2::BKLMElementNumbers::sectorNumber
static uint16_t sectorNumber(int section, int sector)
Get sector number.
Definition: BKLMElementNumbers.cc:89
Belle2::BKLMElementNumbers::BKLM_STRIP_BIT
static constexpr int BKLM_STRIP_BIT
Bit position for strip-1 [0..47].
Definition: BKLMElementNumbers.h:436
Belle2::BKLMElementNumbers::checkChannelNumber
static bool checkChannelNumber(int section, int sector, int layer, int plane, int strip, bool fatalError=true)
Check channel number.
Definition: BKLMElementNumbers.cc:184
Belle2::BKLMElementNumbers::checkLayer
static bool checkLayer(int layer, bool fatalError=true)
Check if layer number is correct.
Definition: BKLMElementNumbers.cc:164
Belle2::BKLMElementNumbers::BKLM_PLANE_BIT
static constexpr int BKLM_PLANE_BIT
Bit position for plane-1 [0..1].
Definition: BKLMElementNumbers.h:442
Belle2::BKLMElementNumbers::c_ZPlane
@ c_ZPlane
Z.
Definition: BKLMElementNumbers.h:81
Belle2::BKLMElementNumbers::getHSLBName
static std::string getHSLBName(int copper, int slot)
Get HSLB name.
Definition: BKLMElementNumbers.cc:203
Belle2::BKLMElementNumbers::c_ForwardSection
@ c_ForwardSection
Forward.
Definition: BKLMElementNumbers.h:47
Belle2::BKLMElementNumbers::BKLM_LAYER_BIT
static constexpr int BKLM_LAYER_BIT
Bit position for layer-1 [0..14]; 0 is innermost.
Definition: BKLMElementNumbers.h:445
Belle2::BKLMElementNumbers::c_ChimneySector
@ c_ChimneySector
Chimney sector: BB3 in 1-based notation; BB2 in 0-based notation.
Definition: BKLMElementNumbers.h:61
Belle2::BKLMElementNumbers::BKLM_SECTOR_MASK
static constexpr int BKLM_SECTOR_MASK
Bit mask for sector-1 [0..7].
Definition: BKLMElementNumbers.h:469
Belle2::BKLMElementNumbers::layerGlobalNumberToElementNumbers
static void layerGlobalNumberToElementNumbers(int layerGlobal, int *section, int *sector, int *layer)
Get element numbers by layer global number (0-based).
Definition: BKLMElementNumbers.cc:196
Belle2::BKLMElementNumbers::BKLM_PLANE_MASK
static constexpr int BKLM_PLANE_MASK
Bit mask for plane-1 [0..1]; 0 is inner-plane and phiReadout plane,.
Definition: BKLMElementNumbers.h:460
Belle2::BKLMElementNumbers::BKLM_SECTION_BIT
static constexpr int BKLM_SECTION_BIT
Bit position for detector end [0..1]; forward is 0.
Definition: BKLMElementNumbers.h:454
Belle2::BKLMElementNumbers::~BKLMElementNumbers
~BKLMElementNumbers()
Destructor.
Definition: BKLMElementNumbers.cc:23
Belle2::BKLMElementNumbers::c_BackwardSection
@ c_BackwardSection
Backward.
Definition: BKLMElementNumbers.h:44
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::BKLMElementNumbers::BKLM_LAYER_MASK
static constexpr int BKLM_LAYER_MASK
Bit mask for layer-1 [0..15]; 0 is innermost and 14 is outermost.
Definition: BKLMElementNumbers.h:463
Belle2::BKLMElementNumbers::BKLMElementNumbers
BKLMElementNumbers()
Constructor.
Definition: BKLMElementNumbers.cc:19
Belle2::BKLMElementNumbers::channelNumberToElementNumbers
static void channelNumberToElementNumbers(uint16_t channel, int *section, int *sector, int *layer, int *plane, int *strip)
Get element numbers by channel number.
Definition: BKLMElementNumbers.cc:38
Belle2::BKLMElementNumbers::checkSector
static bool checkSector(int sector, bool fatalError=true)
Check if sector number is correct.
Definition: BKLMElementNumbers.cc:154
Belle2::BKLMElementNumbers::m_MaximalLayerNumber
static constexpr int m_MaximalLayerNumber
Maximal layer number (1-based).
Definition: BKLMElementNumbers.h:430
Belle2::BKLMElementNumbers::checkPlane
static bool checkPlane(int plane, bool fatalError=true)
Check if plane number is correct.
Definition: BKLMElementNumbers.cc:174
Belle2::BKLMElementNumbers::BKLM_SECTION_MASK
static constexpr int BKLM_SECTION_MASK
Bit mask for detector end [0..1]; forward is 0.
Definition: BKLMElementNumbers.h:472
Belle2::BKLMElementNumbers::layerGlobalNumber
static int layerGlobalNumber(int section, int sector, int layer)
Get layer global number.
Definition: BKLMElementNumbers.cc:97
Belle2::BKLMElementNumbers::checkSection
static bool checkSection(int section, bool fatalError=true)
Check if section number is correct.
Definition: BKLMElementNumbers.cc:144
Belle2::BKLMElementNumbers::BKLM_SECTOR_BIT
static constexpr int BKLM_SECTOR_BIT
Bit position for sector-1 [0..7].
Definition: BKLMElementNumbers.h:451
Belle2::BKLMElementNumbers::BKLM_STRIP_MASK
static constexpr int BKLM_STRIP_MASK
Bit mask for strip-1 [0..47].
Definition: BKLMElementNumbers.h:457
Belle2::BKLMElementNumbers::moduleNumberToElementNumbers
static void moduleNumberToElementNumbers(uint16_t module, int *section, int *sector, int *layer)
Get element numbers by module number.
Definition: BKLMElementNumbers.cc:81
Belle2::BKLMElementNumbers::channelNumber
static uint16_t channelNumber(int section, int sector, int layer, int plane, int strip)
Get channel number.
Definition: BKLMElementNumbers.cc:27
Belle2::BKLMElementNumbers::m_MaximalPlaneNumber
static constexpr int m_MaximalPlaneNumber
Maximal plane number (0-based).
Definition: BKLMElementNumbers.h:433
Belle2::BKLMElementNumbers::getNStrips
static int getNStrips(int section, int sector, int layer, int plane)
Get number of strips.
Definition: BKLMElementNumbers.cc:108
Belle2::BKLMElementNumbers::c_PhiPlane
@ c_PhiPlane
Phi.
Definition: BKLMElementNumbers.h:84
Belle2::BKLMElementNumbers::planeNumberToElementNumbers
static void planeNumberToElementNumbers(uint16_t planeGlobal, int *section, int *sector, int *layer, int *plane)
Get element numbers by plane number.
Definition: BKLMElementNumbers.cc:62
Belle2::BKLMElementNumbers::moduleNumber
static uint16_t moduleNumber(int section, int sector, int layer, bool fatalError=true)
Get module number.
Definition: BKLMElementNumbers.cc:71