Belle II Software  release-05-02-19
EKLMElementNumbers.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2016 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/eklm/EKLMElementNumbers.h>
13 
14 /* Belle 2 headers. */
15 #include <framework/logging/Logger.h>
16 #include <rawdata/dataobjects/RawCOPPERFormat.h>
17 
18 using namespace Belle2;
19 
21 {
22  static EKLMElementNumbers ens;
23  return ens;
24 }
25 
27 {
28 }
29 
31 {
32 }
33 
34 bool EKLMElementNumbers::checkSection(int section, bool fatalError) const
35 {
36  if (section <= 0 || section > m_MaximalSectionNumber) {
37  if (fatalError) {
38  B2FATAL("Number of section must be 1 (backward) or 2 (forward).");
39  }
40  return false;
41  }
42  return true;
43 }
44 
45 bool EKLMElementNumbers::checkLayer(int layer, bool fatalError) const
46 {
47  if (layer <= 0 || layer > m_MaximalLayerNumber) {
48  if (fatalError) {
49  B2FATAL("Number of layer must be from 1 to " << m_MaximalLayerNumber <<
50  ".");
51  }
52  return false;
53  }
54  return true;
55 }
56 
57 bool EKLMElementNumbers::checkDetectorLayer(int section, int layer,
58  bool fatalError) const
59 {
60  /* cppcheck-suppress variableScope */
61  const char* sectionName[2] = {"backward", "forward"};
62  if (layer < 0 || layer > m_MaximalDetectorLayerNumber[section - 1]) {
63  if (fatalError) {
64  B2FATAL("Number of layer must be from 1 to the maximal number of "
65  "detector layers in the " << sectionName[section - 1] << " section ("
66  << m_MaximalDetectorLayerNumber[section - 1] << ").");
67  }
68  return false;
69  }
70  return true;
71 }
72 
73 bool EKLMElementNumbers::checkSector(int sector, bool fatalError) const
74 {
75  if (sector <= 0 || sector > m_MaximalSectorNumber) {
76  if (fatalError) {
77  B2FATAL("Number of sector must be from 1 to " << m_MaximalSectorNumber <<
78  ".");
79  }
80  return false;
81  }
82  return true;
83 }
84 
85 bool EKLMElementNumbers::checkPlane(int plane, bool fatalError) const
86 {
87  if (plane <= 0 || plane > m_MaximalPlaneNumber) {
88  if (fatalError) {
89  B2FATAL("Number of plane must be from 1 to " << m_MaximalPlaneNumber <<
90  ".");
91  }
92  return false;
93  }
94  return true;
95 }
96 
97 bool EKLMElementNumbers::checkSegment(int segment, bool fatalError) const
98 {
99  if (segment <= 0 || segment > m_MaximalSegmentNumber) {
100  if (fatalError) {
101  B2FATAL("Number of segment must be from 1 to " <<
102  m_MaximalSegmentNumber << ".");
103  }
104  return false;
105  }
106  return true;
107 }
108 
109 bool EKLMElementNumbers::checkStrip(int strip, bool fatalError) const
110 {
111  if (strip <= 0 || strip > m_MaximalStripNumber) {
112  if (fatalError) {
113  B2FATAL("Number of strip must be from 1 to " << m_MaximalStripNumber <<
114  ".");
115  }
116  return false;
117  }
118  return true;
119 }
120 
121 int EKLMElementNumbers::detectorLayerNumber(int section, int layer) const
122 {
123  checkSection(section);
124  checkDetectorLayer(section, layer);
125  if (section == 1)
126  return layer;
127  return m_MaximalDetectorLayerNumber[0] + layer;
128 }
129 
131  int layerGlobal, int* section, int* layer) const
132 {
133  static int maxLayer = getMaximalLayerGlobalNumber();
134  if (layerGlobal <= 0 || layerGlobal > maxLayer)
135  B2FATAL("Number of segment must be from 1 to " << maxLayer << ".");
136  if (layerGlobal <= m_MaximalDetectorLayerNumber[0]) {
137  *section = 1;
138  *layer = layerGlobal;
139  } else {
140  *section = 2;
141  *layer = layerGlobal - m_MaximalDetectorLayerNumber[0];
142  }
143 }
144 
145 int EKLMElementNumbers::sectorNumber(int section, int layer, int sector) const
146 {
147  checkSector(sector);
148  return m_MaximalSectorNumber * (detectorLayerNumber(section, layer) - 1) +
149  sector;
150 }
151 
152 int EKLMElementNumbers::sectorNumberKLMOrder(int section, int sector) const
153 {
154  checkSection(section);
155  checkSector(sector);
156  return m_MaximalSectorNumber * (section - 1) + sector;
157 }
158 
160  int sectorGlobal, int* section, int* layer, int* sector) const
161 {
162  static int maxSector = getMaximalSectorGlobalNumber();
163  int layerGlobal;
164  if (sectorGlobal <= 0 || sectorGlobal > maxSector)
165  B2FATAL("Number of segment must be from 1 to " << maxSector << ".");
166  *sector = (sectorGlobal - 1) % m_MaximalSectorNumber + 1;
167  layerGlobal = (sectorGlobal - 1) / m_MaximalSectorNumber + 1;
168  layerNumberToElementNumbers(layerGlobal, section, layer);
169 }
170 
171 int EKLMElementNumbers::planeNumber(int section, int layer, int sector,
172  int plane) const
173 {
174  checkPlane(plane);
175  return m_MaximalPlaneNumber * (sectorNumber(section, layer, sector) - 1) +
176  plane;
177 }
178 
180  int planeGlobal, int* section, int* layer, int* sector, int* plane) const
181 {
182  static int maxPlane = getMaximalPlaneGlobalNumber();
183  int sectorGlobal;
184  if (planeGlobal <= 0 || planeGlobal > maxPlane)
185  B2FATAL("Number of segment must be from 1 to " << maxPlane << ".");
186  *plane = (planeGlobal - 1) % m_MaximalPlaneNumber + 1;
187  sectorGlobal = (planeGlobal - 1) / m_MaximalPlaneNumber + 1;
188  sectorNumberToElementNumbers(sectorGlobal, section, layer, sector);
189 }
190 
191 int EKLMElementNumbers::segmentNumber(int section, int layer, int sector,
192  int plane, int segment) const
193 {
194  checkSegment(segment);
195  return m_MaximalSegmentNumber * (planeNumber(section, layer, sector, plane) -
196  1) + segment;
197 }
198 
200  int segmentGlobal, int* section, int* layer, int* sector, int* plane,
201  int* segment) const
202 {
203  static int maxSegment = getMaximalSegmentGlobalNumber();
204  int planeGlobal;
205  if (segmentGlobal <= 0 || segmentGlobal > maxSegment)
206  B2FATAL("Number of segment must be from 1 to " << maxSegment << ".");
207  *segment = (segmentGlobal - 1) % m_MaximalSegmentNumber + 1;
208  planeGlobal = (segmentGlobal - 1) / m_MaximalSegmentNumber + 1;
209  planeNumberToElementNumbers(planeGlobal, section, layer, sector, plane);
210 }
211 
212 int EKLMElementNumbers::stripNumber(int section, int layer, int sector,
213  int plane, int strip) const
214 {
215  checkStrip(strip);
216  return m_MaximalStripNumber * (planeNumber(section, layer, sector, plane) - 1)
217  + strip;
218 }
219 
221  int stripGlobal, int* section, int* layer, int* sector, int* plane,
222  int* strip) const
223 {
224  static int maxStrip = getMaximalStripGlobalNumber();
225  int planeGlobal;
226  if (stripGlobal <= 0 || stripGlobal > maxStrip)
227  B2FATAL("Number of strip must be from 1 to " << maxStrip << ".");
228  *strip = (stripGlobal - 1) % m_MaximalStripNumber + 1;
229  planeGlobal = (stripGlobal - 1) / m_MaximalStripNumber + 1;
230  planeNumberToElementNumbers(planeGlobal, section, layer, sector, plane);
231 }
232 
234 {
235  int section, layer, sector, plane, strip;
236  stripNumberToElementNumbers(stripGlobal,
237  &section, &layer, &sector, &plane, &strip);
238  return section;
239 }
240 
242 {
243  int section, layer, sector, plane, strip;
244  stripNumberToElementNumbers(stripGlobal,
245  &section, &layer, &sector, &plane, &strip);
246  return layer;
247 }
248 
250 {
251  int section, layer, sector, plane, strip;
252  stripNumberToElementNumbers(stripGlobal,
253  &section, &layer, &sector, &plane, &strip);
254  return sector;
255 }
256 
258 {
259  int section, layer, sector, plane, strip;
260  stripNumberToElementNumbers(stripGlobal,
261  &section, &layer, &sector, &plane, &strip);
262  return plane;
263 }
264 
266 {
267  static int maxStrip = getMaximalStripGlobalNumber();
268  if (stripGlobal <= 0 || stripGlobal > maxStrip)
269  B2FATAL("Number of strip must be from 1 to " << maxStrip << ".");
270  return (stripGlobal - 1) % m_MaximalStripNumber + 1;
271 }
272 
273 std::string EKLMElementNumbers::getHSLBName(int copper, int slot)
274 {
275  char hslb = 'a' + slot - 1;
276  return "800" + std::to_string(copper - EKLM_ID) + hslb;
277 }
278 
280 {
281  checkSection(section);
282  return m_MaximalDetectorLayerNumber[section - 1];
283 }
Belle2::EKLMElementNumbers::EKLMElementNumbers
EKLMElementNumbers()
Constructor.
Definition: EKLMElementNumbers.cc:26
Belle2::EKLMElementNumbers::m_MaximalPlaneNumber
static constexpr int m_MaximalPlaneNumber
Maximal plane number.
Definition: EKLMElementNumbers.h:441
Belle2::EKLMElementNumbers::getSectorByGlobalStrip
int getSectorByGlobalStrip(int stripGlobal)
Get sector number by global strip number.
Definition: EKLMElementNumbers.cc:249
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::EKLMElementNumbers::m_MaximalSectionNumber
static constexpr int m_MaximalSectionNumber
Maximal section number.
Definition: EKLMElementNumbers.h:429
Belle2::EKLMElementNumbers
EKLM element numbers.
Definition: EKLMElementNumbers.h:34
Belle2::EKLMElementNumbers::stripNumberToElementNumbers
void stripNumberToElementNumbers(int stripGlobal, int *section, int *layer, int *sector, int *plane, int *strip) const
Get element numbers by strip global number.
Definition: EKLMElementNumbers.cc:220
Belle2::EKLMElementNumbers::checkStrip
bool checkStrip(int strip, bool fatalError=true) const
Check if strip number is correct (fatal error if not).
Definition: EKLMElementNumbers.cc:109
Belle2::EKLMElementNumbers::getHSLBName
static std::string getHSLBName(int copper, int slot)
Get HSLB name.
Definition: EKLMElementNumbers.cc:273
Belle2::EKLMElementNumbers::planeNumber
int planeNumber(int section, int layer, int sector, int plane) const
Get plane number.
Definition: EKLMElementNumbers.cc:171
Belle2::EKLMElementNumbers::m_MaximalStripNumber
static constexpr int m_MaximalStripNumber
Maximal strip number.
Definition: EKLMElementNumbers.h:447
Belle2::EKLMElementNumbers::getPlaneByGlobalStrip
int getPlaneByGlobalStrip(int stripGlobal)
Get plane number by global strip number.
Definition: EKLMElementNumbers.cc:257
Belle2::EKLMElementNumbers::sectorNumberKLMOrder
int sectorNumberKLMOrder(int section, int sector) const
Get sector number (KLM order of elements: section, sector, layer).
Definition: EKLMElementNumbers.cc:152
Belle2::EKLMElementNumbers::getSectionByGlobalStrip
int getSectionByGlobalStrip(int stripGlobal)
Get section number by global strip number.
Definition: EKLMElementNumbers.cc:233
Belle2::EKLMElementNumbers::getLayerByGlobalStrip
int getLayerByGlobalStrip(int stripGlobal)
Get layer number by global strip number.
Definition: EKLMElementNumbers.cc:241
Belle2::EKLMElementNumbers::getMaximalLayerGlobalNumber
static constexpr int getMaximalLayerGlobalNumber()
Get maximal detector layer global number.
Definition: EKLMElementNumbers.h:337
Belle2::EKLMElementNumbers::detectorLayerNumber
int detectorLayerNumber(int section, int layer) const
Get detector layer number.
Definition: EKLMElementNumbers.cc:121
Belle2::EKLMElementNumbers::sectorNumber
int sectorNumber(int section, int layer, int sector) const
Get sector number.
Definition: EKLMElementNumbers.cc:145
Belle2::EKLMElementNumbers::getMaximalStripGlobalNumber
static constexpr int getMaximalStripGlobalNumber()
Get maximal strip global number.
Definition: EKLMElementNumbers.h:377
Belle2::EKLMElementNumbers::m_MaximalSectorNumber
static constexpr int m_MaximalSectorNumber
Maximal sector number.
Definition: EKLMElementNumbers.h:438
Belle2::EKLMElementNumbers::planeNumberToElementNumbers
void planeNumberToElementNumbers(int planeGlobal, int *section, int *layer, int *sector, int *plane) const
Get element numbers by plane global number.
Definition: EKLMElementNumbers.cc:179
Belle2::EKLMElementNumbers::m_MaximalDetectorLayerNumber
static constexpr int m_MaximalDetectorLayerNumber[2]
Maximal detector layer number.
Definition: EKLMElementNumbers.h:435
Belle2::EKLMElementNumbers::layerNumberToElementNumbers
void layerNumberToElementNumbers(int layerGlobal, int *section, int *layer) const
Get element numbers by detector layer global number.
Definition: EKLMElementNumbers.cc:130
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::EKLMElementNumbers::checkDetectorLayer
bool checkDetectorLayer(int section, int layer, bool fatalError=true) const
Check if detector layer number is correct (fatal error if not).
Definition: EKLMElementNumbers.cc:57
Belle2::EKLMElementNumbers::sectorNumberToElementNumbers
void sectorNumberToElementNumbers(int sectorGlobal, int *section, int *layer, int *sector) const
Get element numbers by sector global number.
Definition: EKLMElementNumbers.cc:159
Belle2::EKLMElementNumbers::checkSection
bool checkSection(int section, bool fatalError=true) const
Check if section number is correct.
Definition: EKLMElementNumbers.cc:34
Belle2::EKLMElementNumbers::checkPlane
bool checkPlane(int plane, bool fatalError=true) const
Check if plane number is correct (fatal error if not).
Definition: EKLMElementNumbers.cc:85
Belle2::EKLMElementNumbers::segmentNumber
int segmentNumber(int section, int layer, int sector, int plane, int segment) const
Get segment number.
Definition: EKLMElementNumbers.cc:191
Belle2::EKLMElementNumbers::getMaximalSegmentGlobalNumber
static constexpr int getMaximalSegmentGlobalNumber()
Get maximal segment global number.
Definition: EKLMElementNumbers.h:369
Belle2::EKLMElementNumbers::Instance
static const EKLMElementNumbers & Instance()
Instantiation.
Definition: EKLMElementNumbers.cc:20
Belle2::EKLMElementNumbers::stripNumber
int stripNumber(int section, int layer, int sector, int plane, int strip) const
Get strip number.
Definition: EKLMElementNumbers.cc:212
Belle2::EKLMElementNumbers::checkSegment
bool checkSegment(int segment, bool fatalError=true) const
Check if segment number is correct (fatal error if not).
Definition: EKLMElementNumbers.cc:97
Belle2::EKLMElementNumbers::m_MaximalLayerNumber
static constexpr int m_MaximalLayerNumber
Maximal layer number.
Definition: EKLMElementNumbers.h:432
Belle2::EKLMElementNumbers::getMaximalSectorGlobalNumber
static constexpr int getMaximalSectorGlobalNumber()
Get maximal sector global number.
Definition: EKLMElementNumbers.h:345
Belle2::EKLMElementNumbers::getStripByGlobalStrip
int getStripByGlobalStrip(int stripGlobal)
Get strip number by global strip number.
Definition: EKLMElementNumbers.cc:265
Belle2::EKLMElementNumbers::~EKLMElementNumbers
~EKLMElementNumbers()
Destructor.
Definition: EKLMElementNumbers.cc:30
Belle2::EKLMElementNumbers::checkLayer
bool checkLayer(int layer, bool fatalError=true) const
Check if layer number is correct.
Definition: EKLMElementNumbers.cc:45
Belle2::EKLMElementNumbers::m_MaximalSegmentNumber
static constexpr int m_MaximalSegmentNumber
Maximal segment number.
Definition: EKLMElementNumbers.h:444
Belle2::EKLMElementNumbers::getMaximalPlaneGlobalNumber
static constexpr int getMaximalPlaneGlobalNumber()
Get maximal plane global number.
Definition: EKLMElementNumbers.h:361
Belle2::EKLMElementNumbers::checkSector
bool checkSector(int sector, bool fatalError=true) const
Check if sector number is correct (fatal error if not).
Definition: EKLMElementNumbers.cc:73
Belle2::EKLMElementNumbers::getMaximalDetectorLayerNumber
int getMaximalDetectorLayerNumber(int section) const
Get maximal detector layer number.
Definition: EKLMElementNumbers.cc:279