Belle II Software development
KLMChannelIndex.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9/* Own header. */
10#include <klm/dataobjects/KLMChannelIndex.h>
11
12/* KLM headers. */
13#include <klm/dataobjects/bklm/BKLMElementNumbers.h>
14#include <klm/dataobjects/eklm/EKLMElementNumbers.h>
15
16using namespace Belle2;
17
19 m_IndexLevel(indexLevel),
21 m_Section(0),
22 m_Sector(1),
23 m_Layer(1),
24 m_Plane(0),
25 m_Strip(1),
26 m_ElementNumbers(&(KLMElementNumbers::Instance())),
28{
30}
31
33 int subdetector, int section, int sector, int layer, int plane, int strip,
34 enum IndexLevel indexLevel) :
35 m_IndexLevel(indexLevel),
36 m_Subdetector(subdetector),
37 m_Section(section),
38 m_Sector(sector),
39 m_Layer(layer),
40 m_Plane(plane),
41 m_Strip(strip),
42 m_ElementNumbers(&(KLMElementNumbers::Instance())),
44{
46}
47
51
64
66{
67 if (indexLevel > m_IndexLevel) {
69 switch (m_IndexLevel) {
71 m_Section = 0;
72 [[fallthrough]];
74 m_Sector = 1;
75 [[fallthrough]];
77 m_Layer = 1;
78 [[fallthrough]];
80 m_Plane = 0;
81 [[fallthrough]];
83 m_Strip = 1;
84 [[fallthrough]];
86 break;
87 }
88 } else {
89 switch (m_IndexLevel) {
91 m_Section = 1;
92 [[fallthrough]];
94 m_Sector = 1;
95 [[fallthrough]];
97 m_Layer = 1;
98 [[fallthrough]];
100 m_Plane = 1;
101 [[fallthrough]];
103 m_Strip = 1;
104 [[fallthrough]];
106 break;
107 }
108 }
109 }
110 m_IndexLevel = indexLevel;
111 if (indexLevel == c_IndexLevelStrip)
113}
114
116{
117 m_UseEKLMSegments = useSegments;
119}
120
122{
123 m_ElementNumbers->moduleNumberToElementNumbers(
124 module, &m_Subdetector, &m_Section, &m_Sector, &m_Layer);
126 m_Plane = 0;
127 else
128 m_Plane = 1;
129 m_Strip = 1;
130 useEKLMSegments(false);
132}
133
135{
136 m_eklmElementNumbers->segmentNumberToElementNumbers(
137 segment, &m_Section, &m_Sector, &m_Layer, &m_Plane, &m_Strip);
141}
142
144{
146 return m_ElementNumbers->channelNumberBKLM(
148 } else {
149 return m_ElementNumbers->channelNumberEKLM(
151 }
152}
153
155{
157 return m_ElementNumbers->planeNumberBKLM(
159 } else {
160 return m_ElementNumbers->planeNumberEKLM(
162 }
163}
164
166{
168 return m_ElementNumbers->moduleNumberBKLM(m_Section, m_Sector, m_Layer);
169 else
170 return m_ElementNumbers->moduleNumberEKLM(m_Section, m_Sector, m_Layer);
171}
172
174{
176 return m_ElementNumbers->sectorNumberBKLM(m_Section, m_Sector);
177 else
178 return m_ElementNumbers->sectorNumberEKLM(m_Section, m_Sector);
179}
180
182{
183 return m_eklmElementNumbers->segmentNumber(
185}
186
192
194{
195 /*
196 * The index level does not matter for end check, thus,
197 * the object can be created once.
198 */
199 static KLMChannelIndex index(KLMElementNumbers::c_EKLM, 1, 1, 1, 1, 1);
200 return index;
201}
202
208
210{
211 /*
212 * The index level does not matter for end check, thus,
213 * the object can be created once.
214 */
215 static KLMChannelIndex index(KLMElementNumbers::c_EKLM + 1, 1, 1, 1, 1, 1);
216 return index;
217}
218
220{
222 switch (indexLevel) {
224 m_Strip++;
225 if (m_Strip > m_NStripsPlane) {
226 m_Strip = 1;
229 }
230 break;
232 m_Plane++;
234 m_Plane = 0;
236 }
237 break;
239 m_Layer++;
241 m_Layer = 1;
243 }
244 break;
246 m_Sector++;
248 m_Sector = 1;
250 }
251 break;
253 m_Section++;
255 m_Section = 0;
257 }
258 break;
260 *this = beginEKLM();
261 break;
262 }
263 } else {
264 switch (indexLevel) {
266 m_Strip++;
267 if (m_Strip > m_NStripsPlane) {
268 m_Strip = 1;
271 }
272 break;
274 m_Plane++;
276 m_Plane = 1;
278 }
279 break;
281 m_Layer++;
282 if (m_Layer > m_eklmElementNumbers->getMaximalDetectorLayerNumber(m_Section)) {
283 m_Layer = 1;
285 }
286 break;
288 m_Sector++;
290 m_Sector = 1;
292 }
293 break;
295 m_Section++;
297 m_Section = 1;
299 }
300 break;
303 break;
304 }
305 }
306}
307
313
319
321{
322 switch (m_IndexLevel) {
324 if (m_Strip != index.getStrip())
325 return false;
326 [[fallthrough]];
328 if (m_Plane != index.getPlane())
329 return false;
330 [[fallthrough]];
332 if (m_Layer != index.getLayer())
333 return false;
334 [[fallthrough]];
336 if (m_Sector != index.getSector())
337 return false;
338 [[fallthrough]];
340 if (m_Section != index.getSection())
341 return false;
342 [[fallthrough]];
344 if (m_Subdetector != index.getSubdetector())
345 return false;
346 }
347 return true;
348}
349
351{
352 switch (m_IndexLevel) {
354 if (m_Strip != index.getStrip())
355 return true;
356 [[fallthrough]];
358 if (m_Plane != index.getPlane())
359 return true;
360 [[fallthrough]];
362 if (m_Layer != index.getLayer())
363 return true;
364 [[fallthrough]];
366 if (m_Sector != index.getSector())
367 return true;
368 [[fallthrough]];
370 if (m_Section != index.getSection())
371 return true;
372 [[fallthrough]];
374 if (m_Subdetector != index.getSubdetector())
375 return true;
376 }
377 return false;
378}
379
381{
382 return *this;
383}
static constexpr int getMaximalLayerNumber()
Get maximal layer number (1-based).
static constexpr int getMaximalSectorNumber()
Get maximal sector number (1-based).
static constexpr int getMaximalSectionNumber()
Get maximal section number (0-based).
static constexpr int getMaximalPlaneNumber()
Get maximal plane number (0-based).
static int getNStrips(int section, int sector, int layer, int plane)
Get number of strips.
static constexpr int getMaximalStripNumber()
Get maximal strip number.
static constexpr int getMaximalSectorNumber()
Get maximal sector number.
static constexpr int getMaximalSectionNumber()
Get maximal section number.
static constexpr int getMaximalPlaneNumber()
Get maximal plane number.
static constexpr int getMaximalSegmentNumber()
Get maximal segment number.
KLMChannelIndex & endEKLM()
Last channel for EKLM.
KLMChannelIndex beginBKLM()
First channel for BKLM.
const KLMElementNumbers * m_ElementNumbers
KLM element numbers.
KLMChannelIndex & operator*()
Operator *.
KLMChannelIndex & operator++()
Operator ++.
const EKLMElementNumbers * m_eklmElementNumbers
EKLM element numbers.
int getEKLMSegmentNumber() const
Get EKLM segment number.
KLMModuleNumber getKLMModuleNumber() const
Get KLM module number.
IndexLevel
Index level (loop over KLM elements at the specified level).
@ c_IndexLevelSubdetector
Subdetector (BKLM or EKLM).
KLMChannelIndex & increment()
Increment (to use in Python).
void setEKLMSegment(int segment)
Set EKLM segment.
KLMChannelNumber getKLMChannelNumber() const
Get KLM channel number.
bool operator==(const KLMChannelIndex &index) const
Operator ==.
int m_NStripsPlane
Number of strips in current plane.
bool operator!=(const KLMChannelIndex &index) const
Operator !=.
bool m_UseEKLMSegments
Iterate over EKLM segments instead of strips.
void setIndexLevel(enum IndexLevel indexLevel)
Set index level.
KLMSectorNumber getKLMSectorNumber() const
Get KLM sector number.
void useEKLMSegments(bool useSegments=true)
Iterate over EKLM segments instead of strips.
int m_Subdetector
Subdetector.
KLMChannelIndex & endBKLM()
Last channel for BKLM.
KLMChannelIndex(enum IndexLevel indexLevel=c_IndexLevelStrip)
Constructor.
void setNStripsPlane()
Set number of strips in the current plane.
KLMChannelIndex beginEKLM()
First channel for EKLM.
enum IndexLevel m_IndexLevel
Index level.
void setKLMModule(KLMModuleNumber module)
Set KLM module.
KLMPlaneNumber getKLMPlaneNumber() const
Get KLM plane number.
uint16_t KLMSectorNumber
Sector number.
uint16_t KLMChannelNumber
Channel number.
uint16_t KLMModuleNumber
Module number.
uint16_t KLMPlaneNumber
Plane number.
Abstract base class for different kinds of events.