Belle II Software  release-05-02-19
KLMChannelIndex.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/KLMChannelIndex.h>
13 
14 /* KLM headers. */
15 #include <klm/dataobjects/bklm/BKLMElementNumbers.h>
16 #include <klm/dataobjects/eklm/EKLMElementNumbers.h>
17 
18 using namespace Belle2;
19 
21  m_IndexLevel(indexLevel),
22  m_Subdetector(KLMElementNumbers::c_BKLM),
23  m_Section(0),
24  m_Sector(1),
25  m_Layer(1),
26  m_Plane(0),
27  m_Strip(1),
28  m_ElementNumbers(&(KLMElementNumbers::Instance())),
29  m_eklmElementNumbers(&(EKLMElementNumbers::Instance()))
30 {
32 }
33 
35  int subdetector, int section, int sector, int layer, int plane, int strip,
36  enum IndexLevel indexLevel) :
37  m_IndexLevel(indexLevel),
38  m_Subdetector(subdetector),
39  m_Section(section),
40  m_Sector(sector),
41  m_Layer(layer),
42  m_Plane(plane),
43  m_Strip(strip),
44  m_ElementNumbers(&(KLMElementNumbers::Instance())),
45  m_eklmElementNumbers(&(EKLMElementNumbers::Instance()))
46 {
48 }
49 
51 {
52 }
53 
55 {
59  } else {
62  else
64  }
65 }
66 
68 {
69  if (indexLevel > m_IndexLevel) {
71  switch (m_IndexLevel) {
73  m_Section = 0;
74  [[fallthrough]];
76  m_Sector = 1;
77  [[fallthrough]];
78  case c_IndexLevelSector:
79  m_Layer = 1;
80  [[fallthrough]];
81  case c_IndexLevelLayer:
82  m_Plane = 0;
83  [[fallthrough]];
84  case c_IndexLevelPlane:
85  m_Strip = 1;
86  [[fallthrough]];
87  case c_IndexLevelStrip:
88  break;
89  }
90  } else {
91  switch (m_IndexLevel) {
93  m_Section = 1;
94  [[fallthrough]];
96  m_Sector = 1;
97  [[fallthrough]];
98  case c_IndexLevelSector:
99  m_Layer = 1;
100  [[fallthrough]];
101  case c_IndexLevelLayer:
102  m_Plane = 1;
103  [[fallthrough]];
104  case c_IndexLevelPlane:
105  m_Strip = 1;
106  [[fallthrough]];
107  case c_IndexLevelStrip:
108  break;
109  }
110  }
111  }
112  m_IndexLevel = indexLevel;
113  if (indexLevel == c_IndexLevelStrip)
114  setNStripsPlane();
115 }
116 
117 void KLMChannelIndex::useEKLMSegments(bool useSegments)
118 {
119  m_UseEKLMSegments = useSegments;
120  setNStripsPlane();
121 }
122 
123 void KLMChannelIndex::setKLMModule(uint16_t module)
124 {
126  module, &m_Subdetector, &m_Section, &m_Sector, &m_Layer);
128  m_Plane = 0;
129  else
130  m_Plane = 1;
131  m_Strip = 1;
132  useEKLMSegments(false);
134 }
135 
137 {
139  segment, &m_Section, &m_Sector, &m_Layer, &m_Plane, &m_Strip);
141  useEKLMSegments();
143 }
144 
146 {
150  } else {
153  }
154 }
155 
157 {
161  } else {
164  }
165 }
166 
168 {
171  else
173 }
174 
176 {
179  else
181 }
182 
184 {
187 }
188 
190 {
191  return KLMChannelIndex(KLMElementNumbers::c_BKLM, 0, 1, 1, 0, 1,
192  m_IndexLevel);
193 }
194 
196 {
197  /*
198  * The index level does not matter for end check, thus,
199  * the object can be created once.
200  */
201  static KLMChannelIndex index(KLMElementNumbers::c_EKLM, 1, 1, 1, 1, 1);
202  return index;
203 }
204 
206 {
207  return KLMChannelIndex(KLMElementNumbers::c_EKLM, 1, 1, 1, 1, 1,
208  m_IndexLevel);
209 }
210 
212 {
213  /*
214  * The index level does not matter for end check, thus,
215  * the object can be created once.
216  */
217  static KLMChannelIndex index(KLMElementNumbers::c_EKLM + 1, 1, 1, 1, 1, 1);
218  return index;
219 }
220 
222 {
224  switch (indexLevel) {
225  case c_IndexLevelStrip:
226  m_Strip++;
227  if (m_Strip > m_NStripsPlane) {
228  m_Strip = 1;
230  setNStripsPlane();
231  }
232  break;
233  case c_IndexLevelPlane:
234  m_Plane++;
236  m_Plane = 0;
238  }
239  break;
240  case c_IndexLevelLayer:
241  m_Layer++;
243  m_Layer = 1;
245  }
246  break;
247  case c_IndexLevelSector:
248  m_Sector++;
250  m_Sector = 1;
252  }
253  break;
254  case c_IndexLevelSection:
255  m_Section++;
257  m_Section = 0;
259  }
260  break;
262  *this = beginEKLM();
263  break;
264  }
265  } else {
266  switch (indexLevel) {
267  case c_IndexLevelStrip:
268  m_Strip++;
269  if (m_Strip > m_NStripsPlane) {
270  m_Strip = 1;
272  setNStripsPlane();
273  }
274  break;
275  case c_IndexLevelPlane:
276  m_Plane++;
278  m_Plane = 1;
280  }
281  break;
282  case c_IndexLevelLayer:
283  m_Layer++;
285  m_Layer = 1;
287  }
288  break;
289  case c_IndexLevelSector:
290  m_Sector++;
292  m_Sector = 1;
294  }
295  break;
296  case c_IndexLevelSection:
297  m_Section++;
299  m_Section = 1;
301  }
302  break;
304  m_Subdetector++;
305  break;
306  }
307  }
308 }
309 
311 {
313  return *this;
314 }
315 
317 {
319  return *this;
320 }
321 
323 {
324  switch (m_IndexLevel) {
325  case c_IndexLevelStrip:
326  if (m_Strip != index.getStrip())
327  return false;
328  [[fallthrough]];
329  case c_IndexLevelPlane:
330  if (m_Plane != index.getPlane())
331  return false;
332  [[fallthrough]];
333  case c_IndexLevelLayer:
334  if (m_Layer != index.getLayer())
335  return false;
336  [[fallthrough]];
337  case c_IndexLevelSector:
338  if (m_Sector != index.getSector())
339  return false;
340  [[fallthrough]];
341  case c_IndexLevelSection:
342  if (m_Section != index.getSection())
343  return false;
344  [[fallthrough]];
346  if (m_Subdetector != index.getSubdetector())
347  return false;
348  }
349  return true;
350 }
351 
353 {
354  switch (m_IndexLevel) {
355  case c_IndexLevelStrip:
356  if (m_Strip != index.getStrip())
357  return true;
358  [[fallthrough]];
359  case c_IndexLevelPlane:
360  if (m_Plane != index.getPlane())
361  return true;
362  [[fallthrough]];
363  case c_IndexLevelLayer:
364  if (m_Layer != index.getLayer())
365  return true;
366  [[fallthrough]];
367  case c_IndexLevelSector:
368  if (m_Sector != index.getSector())
369  return true;
370  [[fallthrough]];
371  case c_IndexLevelSection:
372  if (m_Section != index.getSection())
373  return true;
374  [[fallthrough]];
376  if (m_Subdetector != index.getSubdetector())
377  return true;
378  }
379  return false;
380 }
381 
383 {
384  return *this;
385 }
Belle2::KLMChannelIndex::endEKLM
KLMChannelIndex & endEKLM()
Last channel for EKLM.
Definition: KLMChannelIndex.cc:211
Belle2::KLMElementNumbers::sectorNumberBKLM
uint16_t sectorNumberBKLM(int section, int sector) const
Get sector number for BKLM.
Definition: KLMElementNumbers.cc:222
Belle2::EKLMElementNumbers::getMaximalSegmentNumber
static constexpr int getMaximalSegmentNumber()
Get maximal segment number.
Definition: EKLMElementNumbers.h:321
Belle2::EKLMElementNumbers::segmentNumberToElementNumbers
void segmentNumberToElementNumbers(int segmentGlobal, int *section, int *layer, int *sector, int *plane, int *segment) const
Get element numbers by segment global number.
Definition: EKLMElementNumbers.cc:199
Belle2::KLMChannelIndex::operator*
KLMChannelIndex & operator*()
Operator *.
Definition: KLMChannelIndex.cc:382
Belle2::KLMChannelIndex::endBKLM
KLMChannelIndex & endBKLM()
Last channel for BKLM.
Definition: KLMChannelIndex.cc:195
Belle2::KLMChannelIndex::operator!=
bool operator!=(const KLMChannelIndex &index)
Operator !=.
Definition: KLMChannelIndex.cc:352
Belle2::EKLMElementNumbers::getMaximalSectionNumber
static constexpr int getMaximalSectionNumber()
Get maximal section number.
Definition: EKLMElementNumbers.h:283
Belle2::EKLMElementNumbers
EKLM element numbers.
Definition: EKLMElementNumbers.h:34
Belle2::KLMChannelIndex::c_IndexLevelSection
@ c_IndexLevelSection
Section.
Definition: KLMChannelIndex.h:46
Belle2::KLMChannelIndex::operator==
bool operator==(const KLMChannelIndex &index)
Operator ==.
Definition: KLMChannelIndex.cc:322
Belle2::KLMChannelIndex::c_IndexLevelLayer
@ c_IndexLevelLayer
Layer.
Definition: KLMChannelIndex.h:52
Belle2::KLMChannelIndex::m_IndexLevel
enum IndexLevel m_IndexLevel
Index level.
Definition: KLMChannelIndex.h:260
Belle2::KLMChannelIndex::KLMChannelIndex
KLMChannelIndex(enum IndexLevel indexLevel=c_IndexLevelStrip)
Constructor.
Definition: KLMChannelIndex.cc:20
Belle2::KLMElementNumbers::planeNumberBKLM
uint16_t planeNumberBKLM(int section, int sector, int layer, int plane) const
Get plane number for BKLM.
Definition: KLMElementNumbers.cc:128
Belle2::KLMChannelIndex::beginEKLM
KLMChannelIndex beginEKLM()
First channel for EKLM.
Definition: KLMChannelIndex.cc:205
Belle2::KLMChannelIndex::getKLMSectorNumber
uint16_t getKLMSectorNumber() const
Get KLM sector number.
Definition: KLMChannelIndex.cc:175
Belle2::KLMElementNumbers::c_EKLM
@ c_EKLM
EKLM.
Definition: KLMElementNumbers.h:50
Belle2::KLMElementNumbers::moduleNumberToElementNumbers
void moduleNumberToElementNumbers(uint16_t module, int *subdetector, int *section, int *sector, int *layer) const
Get element numbers by module number.
Definition: KLMElementNumbers.cc:186
Belle2::KLMChannelIndex::increment
KLMChannelIndex & increment()
Increment (to use in Python).
Definition: KLMChannelIndex.cc:316
Belle2::KLMElementNumbers::channelNumberBKLM
uint16_t channelNumberBKLM(int section, int sector, int layer, int plane, int strip) const
Get channel number for BKLM.
Definition: KLMElementNumbers.cc:50
Belle2::KLMChannelIndex::~KLMChannelIndex
~KLMChannelIndex()
Destructor.
Definition: KLMChannelIndex.cc:50
Belle2::KLMChannelIndex::getKLMChannelNumber
uint16_t getKLMChannelNumber() const
Get KLM channel number.
Definition: KLMChannelIndex.cc:145
Belle2::BKLMElementNumbers::getMaximalSectorNumber
static constexpr int getMaximalSectorNumber()
Get maximal sector number (1-based).
Definition: BKLMElementNumbers.h:243
Belle2::KLMChannelIndex::beginBKLM
KLMChannelIndex beginBKLM()
First channel for BKLM.
Definition: KLMChannelIndex.cc:189
Belle2::KLMChannelIndex::c_IndexLevelSector
@ c_IndexLevelSector
Sector.
Definition: KLMChannelIndex.h:49
Belle2::EKLMElementNumbers::getMaximalSectorNumber
static constexpr int getMaximalSectorNumber()
Get maximal sector number.
Definition: EKLMElementNumbers.h:305
Belle2::KLMChannelIndex::IndexLevel
IndexLevel
Index level (loop over KLM elements at the specified level).
Definition: KLMChannelIndex.h:40
Belle2::KLMChannelIndex::c_IndexLevelPlane
@ c_IndexLevelPlane
Plane.
Definition: KLMChannelIndex.h:55
Belle2::KLMChannelIndex::setNStripsPlane
void setNStripsPlane()
Set number of strips in the current plane.
Definition: KLMChannelIndex.cc:54
Belle2::EKLMElementNumbers::getMaximalStripNumber
static constexpr int getMaximalStripNumber()
Get maximal strip number.
Definition: EKLMElementNumbers.h:329
Belle2::KLMChannelIndex::operator++
KLMChannelIndex & operator++()
Operator ++.
Definition: KLMChannelIndex.cc:310
Belle2::BKLMElementNumbers::getMaximalLayerNumber
static constexpr int getMaximalLayerNumber()
Get maximal layer number (1-based).
Definition: BKLMElementNumbers.h:251
Belle2::KLMChannelIndex::c_IndexLevelSubdetector
@ c_IndexLevelSubdetector
Subdetector (BKLM or EKLM).
Definition: KLMChannelIndex.h:43
Belle2::KLMElementNumbers::sectorNumberEKLM
uint16_t sectorNumberEKLM(int section, int sector) const
Get sector number for EKLM.
Definition: KLMElementNumbers.cc:229
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::EKLMElementNumbers::segmentNumber
int segmentNumber(int section, int layer, int sector, int plane, int segment) const
Get segment number.
Definition: EKLMElementNumbers.cc:191
Belle2::KLMChannelIndex::m_Strip
int m_Strip
Strip.
Definition: KLMChannelIndex.h:278
Belle2::KLMElementNumbers::moduleNumberEKLM
uint16_t moduleNumberEKLM(int section, int sector, int layer) const
Get module number for EKLM.
Definition: KLMElementNumbers.cc:166
Belle2::KLMElementNumbers::c_BKLM
@ c_BKLM
BKLM.
Definition: KLMElementNumbers.h:47
Belle2::KLMChannelIndex::useEKLMSegments
void useEKLMSegments(bool useSegments=true)
Iterate over EKLM segments instead of strips.
Definition: KLMChannelIndex.cc:117
Belle2::KLMChannelIndex::setKLMModule
void setKLMModule(uint16_t module)
Set KLM module.
Definition: KLMChannelIndex.cc:123
Belle2::KLMChannelIndex::m_eklmElementNumbers
const EKLMElementNumbers * m_eklmElementNumbers
EKLM element numbers.
Definition: KLMChannelIndex.h:290
Belle2::KLMChannelIndex::getEKLMSegmentNumber
int getEKLMSegmentNumber() const
Get EKLM segment number.
Definition: KLMChannelIndex.cc:183
Belle2::EKLMElementNumbers::getMaximalPlaneNumber
static constexpr int getMaximalPlaneNumber()
Get maximal plane number.
Definition: EKLMElementNumbers.h:313
Belle2::KLMElementNumbers::planeNumberEKLM
uint16_t planeNumberEKLM(int section, int sector, int layer, int plane) const
Get channel number for EKLM.
Definition: KLMElementNumbers.cc:136
Belle2::KLMElementNumbers::moduleNumberBKLM
uint16_t moduleNumberBKLM(int section, int sector, int layer) const
Get module number for BKLM.
Definition: KLMElementNumbers.cc:158
Belle2::KLMChannelIndex::m_Section
int m_Section
Section.
Definition: KLMChannelIndex.h:266
Belle2::KLMElementNumbers::channelNumberEKLM
uint16_t channelNumberEKLM(int section, int sector, int layer, int plane, int strip) const
Get channel number for EKLM.
Definition: KLMElementNumbers.cc:64
Belle2::BKLMElementNumbers::getMaximalPlaneNumber
static constexpr int getMaximalPlaneNumber()
Get maximal plane number (0-based).
Definition: BKLMElementNumbers.h:259
Belle2::KLMChannelIndex::m_UseEKLMSegments
bool m_UseEKLMSegments
Iterate over EKLM segments instead of strips.
Definition: KLMChannelIndex.h:281
Belle2::KLMChannelIndex
KLM channel index.
Definition: KLMChannelIndex.h:33
Belle2::BKLMElementNumbers::getMaximalSectionNumber
static constexpr int getMaximalSectionNumber()
Get maximal section number (0-based).
Definition: BKLMElementNumbers.h:235
Belle2::KLMChannelIndex::getKLMModuleNumber
uint16_t getKLMModuleNumber() const
Get KLM module number.
Definition: KLMChannelIndex.cc:167
Belle2::KLMChannelIndex::m_NStripsPlane
int m_NStripsPlane
Number of strips in current plane.
Definition: KLMChannelIndex.h:284
Belle2::KLMElementNumbers
KLM element numbers.
Definition: KLMElementNumbers.h:37
Belle2::KLMChannelIndex::m_Subdetector
int m_Subdetector
Subdetector.
Definition: KLMChannelIndex.h:263
Belle2::KLMChannelIndex::m_Sector
int m_Sector
Sector.
Definition: KLMChannelIndex.h:269
Belle2::KLMChannelIndex::m_Plane
int m_Plane
Plane.
Definition: KLMChannelIndex.h:275
Belle2::KLMChannelIndex::setIndexLevel
void setIndexLevel(enum IndexLevel indexLevel)
Set index level.
Definition: KLMChannelIndex.cc:67
Belle2::BKLMElementNumbers::getNStrips
static int getNStrips(int section, int sector, int layer, int plane)
Get number of strips.
Definition: BKLMElementNumbers.cc:108
Belle2::KLMChannelIndex::m_Layer
int m_Layer
Layer.
Definition: KLMChannelIndex.h:272
Belle2::KLMChannelIndex::m_ElementNumbers
const KLMElementNumbers * m_ElementNumbers
KLM element numbers.
Definition: KLMChannelIndex.h:287
Belle2::KLMChannelIndex::setEKLMSegment
void setEKLMSegment(int segment)
Set EKLM segment.
Definition: KLMChannelIndex.cc:136
Belle2::EKLMElementNumbers::getMaximalDetectorLayerNumber
int getMaximalDetectorLayerNumber(int section) const
Get maximal detector layer number.
Definition: EKLMElementNumbers.cc:279
Belle2::KLMChannelIndex::getKLMPlaneNumber
uint16_t getKLMPlaneNumber() const
Get KLM plane number.
Definition: KLMChannelIndex.cc:156
Belle2::KLMChannelIndex::c_IndexLevelStrip
@ c_IndexLevelStrip
Strip.
Definition: KLMChannelIndex.h:58