Belle II Software  release-05-02-19
KLMElementNumbers.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/KLMElementNumbers.h>
13 
14 /* KLM headers. */
15 #include <klm/dataobjects/bklm/BKLMElementNumbers.h>
16 
17 /* Belle 2 headers. */
18 #include <framework/logging/Logger.h>
19 
20 using namespace Belle2;
21 
23  m_eklmElementNumbers(&(EKLMElementNumbers::Instance()))
24 {
25 }
26 
28 {
29 }
30 
32 {
33  static KLMElementNumbers klmElementNumbers;
34  return klmElementNumbers;
35 }
36 
38  int subdetector, int section, int sector, int layer, int plane,
39  int strip) const
40 {
41  switch (subdetector) {
42  case c_BKLM:
43  return channelNumberBKLM(section, sector, layer, plane, strip);
44  case c_EKLM:
45  return channelNumberEKLM(section, sector, layer, plane, strip);
46  }
47  B2FATAL("Incorrect subdetector number: " << subdetector);
48 }
49 
51  int section, int sector, int layer, int plane, int strip) const
52 {
53  uint16_t channel;
55  section, sector, layer, plane, strip);
56  return channel + m_BKLMOffset;
57 }
58 
59 uint16_t KLMElementNumbers::channelNumberBKLM(int bklmChannel) const
60 {
61  return bklmChannel + m_BKLMOffset;
62 }
63 
65  int section, int sector, int layer, int plane, int strip) const
66 {
67  uint16_t channel;
68  /*
69  * Note that the default order of elements is different
70  * for EKLM-specific code!
71  */
73  section, layer, sector, plane, strip);
74  return channel;
75 }
76 
77 uint16_t KLMElementNumbers::channelNumberEKLM(int eklmStrip) const
78 {
79  return eklmStrip;
80 }
81 
82 bool KLMElementNumbers::isBKLMChannel(uint16_t channel) const
83 {
84  return (channel >= m_BKLMOffset);
85 }
86 
87 bool KLMElementNumbers::isEKLMChannel(uint16_t channel) const
88 {
89  return (channel < m_BKLMOffset);
90 }
91 
92 int KLMElementNumbers::localChannelNumberBKLM(uint16_t channel) const
93 {
94  if (!isBKLMChannel(channel))
95  B2FATAL("Cannot get BKLM local channel number for non-BKLM channel.");
96  return channel - m_BKLMOffset;
97 }
98 
99 int KLMElementNumbers::localChannelNumberEKLM(uint16_t channel) const
100 {
101  if (!isEKLMChannel(channel))
102  B2FATAL("Cannot get EKLM local channel number for non-EKLM channel.");
103  return channel;
104 }
105 
107  uint16_t channel, int* subdetector, int* section, int* sector, int* layer,
108  int* plane, int* strip) const
109 {
110  int localChannel;
111  if (isBKLMChannel(channel)) {
112  *subdetector = c_BKLM;
113  localChannel = localChannelNumberBKLM(channel);
115  localChannel, section, sector, layer, plane, strip);
116  } else {
117  *subdetector = c_EKLM;
118  localChannel = localChannelNumberEKLM(channel);
119  /*
120  * Note that the default order of elements is different
121  * for EKLM-specific code!
122  */
124  localChannel, section, layer, sector, plane, strip);
125  }
126 }
127 
129  int section, int sector, int layer, int plane) const
130 {
131  uint16_t planeGlobal;
132  planeGlobal = BKLMElementNumbers::planeNumber(section, sector, layer, plane);
133  return planeGlobal + m_BKLMOffset;
134 }
135 
137  int section, int sector, int layer, int plane) const
138 {
139  uint16_t planeGlobal;
140  /*
141  * Note that the default order of elements is different
142  * for EKLM-specific code!
143  */
144  planeGlobal = m_eklmElementNumbers->planeNumber(
145  section, layer, sector, plane);
146  return planeGlobal;
147 }
148 
150  int subdetector, int section, int sector, int layer) const
151 {
152  if (subdetector == c_BKLM)
153  return moduleNumberBKLM(section, sector, layer);
154  else
155  return moduleNumberEKLM(section, sector, layer);
156 }
157 
159  int section, int sector, int layer) const
160 {
161  uint16_t module;
162  module = BKLMElementNumbers::moduleNumber(section, sector, layer);
163  return module + m_BKLMOffset;
164 }
165 
167  int section, int sector, int layer) const
168 {
169  uint16_t module;
170  /*
171  * Note that the default order of elements is different
172  * for EKLM-specific code!
173  */
174  module = m_eklmElementNumbers->sectorNumber(section, layer, sector);
175  return module;
176 }
177 
178 uint16_t KLMElementNumbers::moduleNumberByChannel(uint16_t channel) const
179 {
180  int subdetector, section, sector, layer, plane, strip;
181  channelNumberToElementNumbers(channel, &subdetector, &section, &sector,
182  &layer, &plane, &strip);
183  return moduleNumber(subdetector, section, sector, layer);
184 }
185 
187  uint16_t module, int* subdetector, int* section, int* sector,
188  int* layer) const
189 {
190  int localModule;
191  if (isBKLMChannel(module)) {
192  *subdetector = c_BKLM;
193  localModule = localChannelNumberBKLM(module);
195  localModule, section, sector, layer);
196  } else {
197  *subdetector = c_EKLM;
198  localModule = localChannelNumberEKLM(module);
199  /*
200  * Note that the default order of elements is different
201  * for EKLM-specific code!
202  */
204  localModule, section, layer, sector);
205  }
206 }
207 
208 unsigned int KLMElementNumbers::getNChannelsModule(uint16_t module) const
209 {
210  if (isBKLMChannel(module)) {
211  int localModule = localChannelNumberBKLM(module);
212  int section, sector, layer;
214  localModule, &section, &sector, &layer);
215  return BKLMElementNumbers::getNStrips(section, sector, layer, 0) +
216  BKLMElementNumbers::getNStrips(section, sector, layer, 1);
217  } else {
219  }
220 }
221 
222 uint16_t KLMElementNumbers::sectorNumberBKLM(int section, int sector) const
223 {
224  uint16_t sect;
225  sect = BKLMElementNumbers::sectorNumber(section, sector);
226  return sect + m_BKLMOffset;
227 }
228 
229 uint16_t KLMElementNumbers::sectorNumberEKLM(int section, int sector) const
230 {
231  uint16_t sect;
232  sect = m_eklmElementNumbers->sectorNumberKLMOrder(section, sector);
233  return sect;
234 }
235 
236 int KLMElementNumbers::getExtrapolationLayer(int subdetector, int layer) const
237 {
238  if (subdetector == c_BKLM)
239  return layer;
240  else
242 }
243 
245 {
246  if (subdetector == c_BKLM)
247  return 0;
248  else
249  return 1;
250 }
251 
252 std::string KLMElementNumbers::getSectorDAQName(int subdetector, int section, int sector) const
253 {
254  std::string name;
255  if (subdetector == c_BKLM) {
258  name = "BB" + std::to_string(sector - 1);
260  name = "BF" + std::to_string(sector - 1);
261  }
262  if (subdetector == c_EKLM) {
265  name = "EB" + std::to_string(sector - 1);
267  name = "EF" + std::to_string(sector - 1);
268  }
269  if (name.empty())
270  B2FATAL("Invalid KLM sector."
271  << LogVar("Subdetector", subdetector)
272  << LogVar("Section", section)
273  << LogVar("Sector", sector));
274  return name;
275 }
Belle2::KLMElementNumbers::sectorNumberBKLM
uint16_t sectorNumberBKLM(int section, int sector) const
Get sector number for BKLM.
Definition: KLMElementNumbers.cc:222
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::KLMElementNumbers::isEKLMChannel
bool isEKLMChannel(uint16_t channel) const
Determine whether a given channel is in EKLM.
Definition: KLMElementNumbers.cc:87
Belle2::EKLMElementNumbers::getNStripsSector
static constexpr int getNStripsSector()
Get number of strips in a sector.
Definition: EKLMElementNumbers.h:393
Belle2::KLMElementNumbers::isBKLMChannel
bool isBKLMChannel(uint16_t channel) const
Determine whether a given channel is in BKLM.
Definition: KLMElementNumbers.cc:82
Belle2::KLMElementNumbers::moduleNumberByChannel
uint16_t moduleNumberByChannel(uint16_t channel) const
Get module number by channel number.
Definition: KLMElementNumbers.cc:178
Belle2::KLMElementNumbers::localChannelNumberBKLM
int localChannelNumberBKLM(uint16_t channel) const
Get local BKLM channel number.
Definition: KLMElementNumbers.cc:92
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::planeNumber
int planeNumber(int section, int layer, int sector, int plane) const
Get plane number.
Definition: EKLMElementNumbers.cc:171
Belle2::KLMElementNumbers::getMinimalPlaneNumber
int getMinimalPlaneNumber(int subdetector) const
Get minimal plane number.
Definition: KLMElementNumbers.cc:244
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::KLMElementNumbers::localChannelNumberEKLM
int localChannelNumberEKLM(uint16_t channel) const
Get local EKLM channel number.
Definition: KLMElementNumbers.cc:99
Belle2::KLMElementNumbers::c_EKLM
@ c_EKLM
EKLM.
Definition: KLMElementNumbers.h:50
Belle2::BKLMElementNumbers::c_ForwardSection
@ c_ForwardSection
Forward.
Definition: BKLMElementNumbers.h:47
Belle2::KLMElementNumbers::channelNumber
uint16_t channelNumber(int subdetector, int section, int sector, int layer, int plane, int strip) const
Get channel number.
Definition: KLMElementNumbers.cc:37
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::KLMElementNumbers::Instance
static const KLMElementNumbers & Instance()
Instantiation.
Definition: KLMElementNumbers.cc:31
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::KLMElementNumbers::~KLMElementNumbers
~KLMElementNumbers()
Destructor.
Definition: KLMElementNumbers.cc:27
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::EKLMElementNumbers::c_BackwardSection
@ c_BackwardSection
Backward.
Definition: EKLMElementNumbers.h:44
Belle2::KLMElementNumbers::KLMElementNumbers
KLMElementNumbers()
Constructor.
Definition: KLMElementNumbers.cc:22
Belle2::EKLMElementNumbers::sectorNumber
int sectorNumber(int section, int layer, int sector) const
Get sector number.
Definition: EKLMElementNumbers.cc:145
Belle2::BKLMElementNumbers::c_BackwardSection
@ c_BackwardSection
Backward.
Definition: BKLMElementNumbers.h:44
Belle2::KLMElementNumbers::getNChannelsModule
unsigned int getNChannelsModule(uint16_t module) const
Get number of channels in module.
Definition: KLMElementNumbers.cc:208
Belle2::BKLMElementNumbers::getMaximalLayerNumber
static constexpr int getMaximalLayerNumber()
Get maximal layer number (1-based).
Definition: BKLMElementNumbers.h:251
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::sectorNumberToElementNumbers
void sectorNumberToElementNumbers(int sectorGlobal, int *section, int *layer, int *sector) const
Get element numbers by sector global number.
Definition: EKLMElementNumbers.cc:159
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
LogVar
Class to store variables with their name which were sent to the logging service.
Definition: LogVariableStream.h:24
Belle2::BKLMElementNumbers::checkSector
static bool checkSector(int sector, bool fatalError=true)
Check if sector number is correct.
Definition: BKLMElementNumbers.cc:154
Belle2::KLMElementNumbers::moduleNumberEKLM
uint16_t moduleNumberEKLM(int section, int sector, int layer) const
Get module number for EKLM.
Definition: KLMElementNumbers.cc:166
Belle2::EKLMElementNumbers::stripNumber
int stripNumber(int section, int layer, int sector, int plane, int strip) const
Get strip number.
Definition: EKLMElementNumbers.cc:212
Belle2::KLMElementNumbers::c_BKLM
@ c_BKLM
BKLM.
Definition: KLMElementNumbers.h:47
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::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::KLMElementNumbers::m_BKLMOffset
static constexpr uint16_t m_BKLMOffset
BKLM offset.
Definition: KLMElementNumbers.h:293
Belle2::KLMElementNumbers
KLM element numbers.
Definition: KLMElementNumbers.h:37
Belle2::EKLMElementNumbers::c_ForwardSection
@ c_ForwardSection
Forward.
Definition: EKLMElementNumbers.h:47
Belle2::KLMElementNumbers::moduleNumber
uint16_t moduleNumber(int subdetector, int section, int sector, int layer) const
Get module number.
Definition: KLMElementNumbers.cc:149
Belle2::KLMElementNumbers::m_eklmElementNumbers
const EKLMElementNumbers * m_eklmElementNumbers
EKLM element numbers.
Definition: KLMElementNumbers.h:296
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::KLMElementNumbers::getSectorDAQName
std::string getSectorDAQName(int subdetector, int section, int sector) const
Get DAQ name for a given sector.
Definition: KLMElementNumbers.cc:252
Belle2::BKLMElementNumbers::getNStrips
static int getNStrips(int section, int sector, int layer, int plane)
Get number of strips.
Definition: BKLMElementNumbers.cc:108
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::KLMElementNumbers::getExtrapolationLayer
int getExtrapolationLayer(int subdetector, int layer) const
Get extrapolation layer number (BKLM - from 1 to 15, EKLM - from 16 to 29).
Definition: KLMElementNumbers.cc:236
Belle2::BKLMElementNumbers::moduleNumber
static uint16_t moduleNumber(int section, int sector, int layer, bool fatalError=true)
Get module number.
Definition: BKLMElementNumbers.cc:71
Belle2::KLMElementNumbers::channelNumberToElementNumbers
void channelNumberToElementNumbers(uint16_t channel, int *subdetector, int *section, int *sector, int *layer, int *plane, int *strip) const
Get element numbers by channel number.
Definition: KLMElementNumbers.cc:106