Belle II Software  release-05-02-19
GeoTools.h
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2010 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Peter Kodys, Peter Kvasnicka *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #pragma once
12 
13 #include <vxd/dataobjects/VxdID.h>
14 #include <vector>
15 #include <algorithm>
16 
17 namespace Belle2 {
22  namespace VXD {
23 
27  class GeoTools {
28 
29  public:
34  GeoTools();
35 
36  /*********************************************************************
37  * General geometry parameters
38  ********************************************************************/
39 
43  unsigned short getNumberOfLayers() const { return m_listOfLayers.size(); }
44 
48  unsigned short getNumberOfPXDLayers() const { return m_firstSVDLayer; }
49 
53  unsigned short getNumberOfSVDLayers() const
54  { return m_listOfLayers.size() - m_firstSVDLayer; }
55 
59  std::vector<unsigned short> getLayers() const { return m_listOfLayers; }
60 
64  std::vector<unsigned short> getPXDLayers() const
65  {
66  std::vector<unsigned short> pxdLayers;
67  std::copy_if(m_listOfLayers.begin(), m_listOfLayers.end(),
68  std::back_inserter(pxdLayers),
69  [](unsigned short l)->bool {return l < 3;});
70  return pxdLayers;
71  }
72 
76  std::vector<unsigned short> getSVDLayers() const
77  {
78  std::vector<unsigned short> svdLayers;
79  std::copy_if(m_listOfLayers.begin(), m_listOfLayers.end(),
80  std::back_inserter(svdLayers),
81  [](unsigned short l)->bool {return l > 2;});
82  return svdLayers;
83  }
84 
88  unsigned short getFirstLayer() const { return *m_listOfLayers.begin(); }
89 
93  unsigned short getLastLayer() const { return *m_listOfLayers.rbegin(); }
94 
98  short getFirstPXDLayer() const
99  {
100  return (m_firstSVDLayer > 0 ? *m_listOfLayers.begin() : -1);
101  }
102 
106  short getLastPXDLayer() const
107  {
108  return (m_firstSVDLayer > 0 ? m_listOfLayers[m_firstSVDLayer - 1] : -1);
109  }
110 
114  short getFirstSVDLayer() const
115  {
117  }
118 
122  short getLastSVDLayer() const
123  {
124  return (m_firstSVDLayer < m_listOfLayers.size() ? *m_listOfLayers.rbegin() : -1);
125  }
126 
130  unsigned short getNumberOfSensors() const { return m_listOfSensors.size(); }
131 
135  unsigned short getNumberOfPXDSensors() const { return m_firstSVDIndex; }
136 
140  unsigned short getNumberOfSVDSensors() const
141  { return m_listOfSensors.size() - m_firstSVDIndex; }
142 
143  /*********************************************************************
144  * Chip-related parameters
145  *********************************************************************/
149  size_t getTotalPXDChips() const { return m_listOfPXDChips.size(); }
150 
155  unsigned short getNumberOfPXDUSideChips(unsigned short = 0) const
156  { return c_nPXDChipsU; }
157 
162  unsigned short getNumberOfPXDVSideChips(unsigned short = 0) const
163  { return c_nPXDChipsV; }
164 
169  unsigned short getNumberOfPXDReadoutGates(unsigned short = 0) const
170  { return c_nPXDReadoutGates; }
171 
175  size_t getTotalSVDChips() const { return m_listOfSVDChips.size(); }
176 
181  unsigned short getNumberOfSVDUSideChips(unsigned short = 0) const
182  { return c_nSVDChipsLu; }
183 
188  unsigned short getNumberOfSVDVSideChips(unsigned short layer) const
189  { return (layer == 3 ? c_nSVDChipsL3 : c_nSVDChipsLv); }
190 
194  unsigned short getSVDChannelsPerChip() const
195  { return c_nSVDChannelsPerChip; }
196 
197  /*********************************************************************
198  * General sensor indexing
199  *********************************************************************/
204  int getSensorIndex(VxdID sensorID) const
205  {
206  return std::distance(
207  m_listOfSensors.begin(),
208  find(m_listOfSensors.begin(), m_listOfSensors.end(), sensorID)
209  );
210  }
211 
217  VxdID getSensorIDFromIndex(int vxdIndex) const
218  {
219  return m_listOfSensors[vxdIndex];
220  }
221 
222  /*********************************************************************
223  * PXD sensor indexing
224  *********************************************************************/
230  int getPXDSensorIndex(VxdID sensorID) const
231  {
232  return getSensorIndex(sensorID);
233  }
241  int getPXDSensorIndex(int layer, int ladder, int sensor) const
242  {
243  return getSensorIndex(VxdID(layer, ladder, sensor));
244  }
245 
250  VxdID getSensorIDFromPXDIndex(int pxdIndex) const
251  {
252  return m_listOfSensors[pxdIndex];
253  }
254 
255  /*********************************************************************
256  * PXD chip indexing
257  ********************************************************************/
265  int getPXDChipIndex(VxdID sensorID, bool isU, int chip) const
266  {
267  VxdID chipID(sensorID);
268  chip = isU ? chip - 1 : chip - 1 + c_nPXDChipsU;
269  chipID.setSegmentNumber(static_cast<unsigned short>(chip));
270  return std::distance(
271  m_listOfPXDChips.begin(),
272  std::find(m_listOfPXDChips.begin(), m_listOfPXDChips.end(), chipID));
273  }
274 
283  int getPXDChipIndex(int layer, int ladder, int sensor, bool isU, int chip) const
284  {
285  return getPXDChipIndex(VxdID(layer, ladder, sensor), isU, chip);
286  }
287 
292  VxdID getChipIDFromPXDIndex(int pxdChipIndex) const
293  {
294  return m_listOfPXDChips[pxdChipIndex];
295  }
296 
301  bool isPXDSideU(VxdID chipID) const
302  {
303  return (chipID.getSegmentNumber() < c_nPXDChipsU);
304  }
305 
310  unsigned short getPXDChipNumber(VxdID chipID) const
311  {
312  unsigned short chipNo = chipID.getSegmentNumber();
313  return (chipNo < c_nPXDChipsU ? chipNo + 1 : (chipNo + 1 - c_nPXDChipsU));
314  }
315 
316  /*********************************************************************
317  * SVD sensor indexing
318  *********************************************************************/
324  int getSVDSensorIndex(VxdID sensorID) const
325  {
326  return (getSensorIndex(sensorID) - m_firstSVDIndex);
327  }
328 
336  int getSVDSensorIndex(int layer, int ladder, int sensor) const
337  {
338  return getSVDSensorIndex(VxdID(layer, ladder, sensor));
339  }
340 
345  VxdID getSensorIDFromSVDIndex(int svdIndex) const
346  {
347  return m_listOfSensors[m_firstSVDIndex + svdIndex];
348  }
349 
350  /*********************************************************************
351  * SVD chip indexing
352  ********************************************************************/
353 
360  int getSVDChipIndex(VxdID sensorID, bool isU, int chip) const
361  {
362  VxdID chipID(sensorID);
363  if (sensorID.getLayerNumber() == 3)
364  chip = isU ? chip - 1 : chip - 1 + c_nSVDChipsL3;
365  else
366  chip = isU ? chip - 1 : chip - 1 + c_nSVDChipsLu;
367  chipID.setSegmentNumber(static_cast<unsigned short>(chip));
368  return std::distance(
369  m_listOfSVDChips.begin(),
370  std::find(m_listOfSVDChips.begin(), m_listOfSVDChips.end(), chipID));
371  }
372 
381  int getSVDChipIndex(int layer, int ladder, int sensor, bool isU, int chip) const
382  {
383  return getSVDChipIndex(VxdID(layer, ladder, sensor), isU, chip);
384  }
385 
390  VxdID getChipIDFromSVDIndex(int svdChipIndex) const
391  {
392  return m_listOfSVDChips[svdChipIndex];
393  }
394 
399  bool isSVDSideU(VxdID chipID) const
400  {
401  /* cppcheck-suppress duplicateExpressionTernary */
402  return (chipID.getLayerNumber() == 3 ? chipID.getSegmentNumber() < c_nSVDChipsL3 : chipID.getSegmentNumber() < c_nSVDChipsLu);
403  }
404 
409  unsigned short getSVDChipNumber(VxdID chipID) const
410  {
411  unsigned short chipNo = chipID.getSegmentNumber();
412  if (chipID.getLayerNumber() == 3) {
413  if (chipNo < c_nSVDChipsL3)
414  return chipNo + 1;
415  else
416  return (chipNo + 1 - c_nSVDChipsL3);
417  } else {
418  if (chipNo < c_nSVDChipsLu)
419  return chipNo + 1;
420  else
421  return (chipNo + 1 - c_nSVDChipsLu);
422  }
423  }
424 
425  /*********************************************************************
426  * Layer indexing
427  ********************************************************************/
432  int getLayerIndex(unsigned short layer) const
433  {
434  return std::distance(
435  m_listOfLayers.begin(),
436  std::find(m_listOfLayers.begin(), m_listOfLayers.end(), layer)
437  );
438  }
439 
444  unsigned short getLayerNumberFromLayerIndex(int index) const
445  {
446  return m_listOfLayers[index];
447  }
448 
449 
450  private:
451 
453  void createListOfLayers();
454 
456  void createListOfPXDChips();
457 
459  void createListOfSVDChips();
460 
462  std::vector<VxdID> m_listOfSensors;
463 
465  size_t m_firstSVDIndex;
466 
468  std::vector<unsigned short> m_listOfLayers;
469 
471  unsigned short m_firstSVDLayer;
472 
474  std::vector<VxdID> m_listOfPXDChips;
475 
477  std::vector<VxdID> m_listOfSVDChips;
478 
480  const unsigned short c_nPXDChipsU = 4;
482  const unsigned short c_nPXDChipsV = 6;
484  const unsigned short c_nPXDReadoutGates = 192;
486  const unsigned short c_nSVDChipsL3 = 6;
488  const unsigned short c_nSVDChipsLu = 6;
490  const unsigned short c_nSVDChipsLv = 4;
492  const unsigned short c_nSVDChannelsPerChip = 128;
493  };
494  } // VXD namespace
496 } // Belle2 namespace
Belle2::VXD::GeoTools::getNumberOfPXDReadoutGates
unsigned short getNumberOfPXDReadoutGates(unsigned short=0) const
Get number of PXD readout gates.
Definition: GeoTools.h:177
Belle2::VXD::GeoTools::m_listOfSVDChips
std::vector< VxdID > m_listOfSVDChips
List of all SVD chips.
Definition: GeoTools.h:485
Belle2::VXD::GeoTools::getSensorIDFromIndex
VxdID getSensorIDFromIndex(int vxdIndex) const
Reverse lookup VxdID from list index.
Definition: GeoTools.h:225
Belle2::VxdID
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:43
Belle2::VXD::GeoTools::isSVDSideU
bool isSVDSideU(VxdID chipID) const
Decode sensor side from a SVD ChipID.
Definition: GeoTools.h:407
Belle2::VXD::GeoTools::c_nPXDChipsU
const unsigned short c_nPXDChipsU
Number of PXD chips per sensor in u (DCD) (=4) on Belle II.
Definition: GeoTools.h:488
Belle2::VXD::GeoTools::getNumberOfPXDUSideChips
unsigned short getNumberOfPXDUSideChips(unsigned short=0) const
Get number of u-side PXD chips.
Definition: GeoTools.h:163
Belle2::VXD::GeoTools::m_listOfSensors
std::vector< VxdID > m_listOfSensors
List of all VXD sesnros.
Definition: GeoTools.h:470
Belle2::VXD::GeoTools::getTotalPXDChips
size_t getTotalPXDChips() const
Get total number of chips in PXD.
Definition: GeoTools.h:157
Belle2::VXD::GeoTools::getNumberOfPXDSensors
unsigned short getNumberOfPXDSensors() const
Get number of PXD sensors.
Definition: GeoTools.h:143
Belle2::VXD::GeoTools::createListOfLayers
void createListOfLayers()
Create list of VXD layers.
Definition: GeoTools.cc:36
Belle2::VXD::GeoTools::getLayerIndex
int getLayerIndex(unsigned short layer) const
Return index of layer in plots.
Definition: GeoTools.h:440
Belle2::VXD::GeoTools::getNumberOfSVDUSideChips
unsigned short getNumberOfSVDUSideChips(unsigned short=0) const
Get number of u-side SVD chips.
Definition: GeoTools.h:189
Belle2::VXD::GeoTools::getPXDChipIndex
int getPXDChipIndex(VxdID sensorID, bool isU, int chip) const
Return PXD chip index in the list of PXD chips.
Definition: GeoTools.h:273
Belle2::VXD::GeoTools::getFirstPXDLayer
short getFirstPXDLayer() const
Get first (innermost) PXD layer number.
Definition: GeoTools.h:106
Belle2::VXD::GeoTools::createListOfPXDChips
void createListOfPXDChips()
Create list of PXD chips.
Definition: GeoTools.cc:54
Belle2::VXD::GeoTools::getChipIDFromPXDIndex
VxdID getChipIDFromPXDIndex(int pxdChipIndex) const
Return chipID (VxdID + side and chipNo) for index in the list.
Definition: GeoTools.h:300
Belle2::VXD::GeoTools::c_nPXDReadoutGates
const unsigned short c_nPXDReadoutGates
Number of PXD readout gates (or total number of Switcher channels) on Belle II.
Definition: GeoTools.h:492
Belle2::VXD::GeoTools::getLayerNumberFromLayerIndex
unsigned short getLayerNumberFromLayerIndex(int index) const
Return layer number for list index.
Definition: GeoTools.h:452
Belle2::VXD::GeoTools::m_listOfPXDChips
std::vector< VxdID > m_listOfPXDChips
List of all PXD chips.
Definition: GeoTools.h:482
Belle2::VXD::GeoTools::getSVDChipNumber
unsigned short getSVDChipNumber(VxdID chipID) const
Decode (1-based) chip number from a SVD ChipID.
Definition: GeoTools.h:417
Belle2::VXD::GeoTools::getNumberOfSVDLayers
unsigned short getNumberOfSVDLayers() const
Get number of SVD layers.
Definition: GeoTools.h:61
Belle2::VXD::GeoTools::getNumberOfSVDVSideChips
unsigned short getNumberOfSVDVSideChips(unsigned short layer) const
Get number of v-side SVD chips.
Definition: GeoTools.h:196
Belle2::VXD::GeoTools::getLastSVDLayer
short getLastSVDLayer() const
Get last (outermost) SVD layer number.
Definition: GeoTools.h:130
Belle2::VXD::GeoTools::c_nSVDChannelsPerChip
const unsigned short c_nSVDChannelsPerChip
Number of SVD strips per chip on Belle II.
Definition: GeoTools.h:500
Belle2::VXD::GeoTools::getPXDChipNumber
unsigned short getPXDChipNumber(VxdID chipID) const
Decode (1-based) chip number from a PXD ChipID.
Definition: GeoTools.h:318
Belle2::VXD::GeoTools::getSVDSensorIndex
int getSVDSensorIndex(VxdID sensorID) const
Return index of SVD sensor in plots.
Definition: GeoTools.h:332
Belle2::VXD::GeoTools::getPXDSensorIndex
int getPXDSensorIndex(VxdID sensorID) const
Return index of sensor in plots.
Definition: GeoTools.h:238
Belle2::VXD::GeoTools::getLayers
std::vector< unsigned short > getLayers() const
Get numbers of VXD layers.
Definition: GeoTools.h:67
Belle2::VXD::GeoTools::getSensorIDFromSVDIndex
VxdID getSensorIDFromSVDIndex(int svdIndex) const
Return VxdID for SVD index of sensor in plots.
Definition: GeoTools.h:353
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::VXD::GeoTools::c_nSVDChipsLu
const unsigned short c_nSVDChipsLu
Number of SVD chips per sensor in u in layers 4,5,6 (=6) on Belle II.
Definition: GeoTools.h:496
Belle2::VXD::GeoTools::c_nPXDChipsV
const unsigned short c_nPXDChipsV
Number of PXD chips per sensor in v (Switchers) (=6) on Belle II.
Definition: GeoTools.h:490
Belle2::VXD::GeoTools::getLastPXDLayer
short getLastPXDLayer() const
Get last (outermost) PXD layer number.
Definition: GeoTools.h:114
Belle2::VxdID::setSegmentNumber
void setSegmentNumber(baseType segment)
Set the sensor segment.
Definition: VxdID.h:123
Belle2::VXD::GeoTools::m_firstSVDIndex
size_t m_firstSVDIndex
Number of the first SVD sensor in the list.
Definition: GeoTools.h:473
Belle2::VXD::GeoTools::c_nSVDChipsL3
const unsigned short c_nSVDChipsL3
Number of SVD chips per sensor in u,v in layer 3 (=6) on Belle II.
Definition: GeoTools.h:494
Belle2::VXD::GeoTools::getLastLayer
unsigned short getLastLayer() const
Get last (outermost) layer number.
Definition: GeoTools.h:101
Belle2::VXD::GeoTools::getFirstLayer
unsigned short getFirstLayer() const
Get first (innermost) layer number.
Definition: GeoTools.h:96
Belle2::VXD::GeoTools::getSensorIDFromPXDIndex
VxdID getSensorIDFromPXDIndex(int pxdIndex) const
Return index of a PXD sensor in plots.
Definition: GeoTools.h:258
Belle2::VXD::GeoTools::getTotalSVDChips
size_t getTotalSVDChips() const
Get total number of chips in SVD.
Definition: GeoTools.h:183
Belle2::VXD::GeoTools::getNumberOfPXDLayers
unsigned short getNumberOfPXDLayers() const
Get number of PXD layers.
Definition: GeoTools.h:56
Belle2::VXD::GeoTools::getSVDChannelsPerChip
unsigned short getSVDChannelsPerChip() const
Get number of strips per APV chip in SVD.
Definition: GeoTools.h:202
Belle2::VXD::GeoTools::getNumberOfLayers
unsigned short getNumberOfLayers() const
Get number of VXD layers.
Definition: GeoTools.h:51
Belle2::VXD::GeoTools::c_nSVDChipsLv
const unsigned short c_nSVDChipsLv
Number of SVD chips per sensor in v in layers 4,5,6 (=4) on Belle II.
Definition: GeoTools.h:498
Belle2::VXD::GeoTools::getPXDLayers
std::vector< unsigned short > getPXDLayers() const
Get numbers of PXD layers.
Definition: GeoTools.h:72
Belle2::VXD::GeoTools::getSVDLayers
std::vector< unsigned short > getSVDLayers() const
Get numbers of SVD layers.
Definition: GeoTools.h:84
Belle2::VXD::GeoTools::getNumberOfPXDVSideChips
unsigned short getNumberOfPXDVSideChips(unsigned short=0) const
Get number of v-side PXD chips.
Definition: GeoTools.h:170
Belle2::VxdID::getLayerNumber
baseType getLayerNumber() const
Get the layer id.
Definition: VxdID.h:106
Belle2::VXD::GeoTools::getNumberOfSensors
unsigned short getNumberOfSensors() const
Get total number of sensors.
Definition: GeoTools.h:138
Belle2::VXD::GeoTools::m_listOfLayers
std::vector< unsigned short > m_listOfLayers
List of all VXD layers.
Definition: GeoTools.h:476
Belle2::VXD::GeoTools::getChipIDFromSVDIndex
VxdID getChipIDFromSVDIndex(int svdChipIndex) const
Return chipID (VxdID with side and chipNo) for index in the list.
Definition: GeoTools.h:398
Belle2::VXD::GeoTools::getSensorIndex
int getSensorIndex(VxdID sensorID) const
Return index of s VXD sensor for plotting.
Definition: GeoTools.h:212
Belle2::VXD::GeoTools::GeoTools
GeoTools()
Constructor builds lookup maps from GeoCache.
Definition: GeoTools.cc:19
Belle2::VXD::GeoTools::m_firstSVDLayer
unsigned short m_firstSVDLayer
List index of the first SVD layer.
Definition: GeoTools.h:479
Belle2::VXD::GeoTools::isPXDSideU
bool isPXDSideU(VxdID chipID) const
Decode sensor side from a PXD ChipID.
Definition: GeoTools.h:309
Belle2::VXD::GeoTools::createListOfSVDChips
void createListOfSVDChips()
Create list of SVD chips.
Definition: GeoTools.cc:75
Belle2::VXD::GeoTools::getNumberOfSVDSensors
unsigned short getNumberOfSVDSensors() const
Get number of SVD sensors.
Definition: GeoTools.h:148
Belle2::VXD::GeoTools::getSVDChipIndex
int getSVDChipIndex(VxdID sensorID, bool isU, int chip) const
Return SVD chip index in the list of SVD chips.
Definition: GeoTools.h:368
Belle2::VXD::GeoTools::getFirstSVDLayer
short getFirstSVDLayer() const
Get first (innermost) SVD layer number.
Definition: GeoTools.h:122