SiPixelCoordinates

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
#ifndef SiPixelCoordinates_h
#define SiPixelCoordinates_h
// -*- C++ -*-
//
// Class:      SiPixelCoordinates
//
// This class provides floating point numbers for
// digis, clusters and hits that can be used to
// easily plot various geometry related histograms
//
// Online and Offline conventions are kept for the variables
// An additional ]0, +1[ or ]-0.5, +0.5[ is added depending on
// the location of digi/cluster/hit on the module, so
// the variables provided are roughly monotonic vs. global
// coordinates (except that overlaps are removed), eg:
// global     z: module, disk, disk_ring (large division)
// global r-phi: ladder, blade, blade_panel
// global     r:         ring, disk_ring (small division)
//
// Original Author: Janos Karancsi

#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
#include "DataFormats/DetId/interface/DetId.h"
#include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
#include "DataFormats/SiPixelDigi/interface/PixelDigi.h"
#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
#include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHit.h"
#include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h"

#include <cstdint>
#include <unordered_map>
#include <utility>

class SiPixelCoordinates {
public:
  SiPixelCoordinates();
  SiPixelCoordinates(int);
  virtual ~SiPixelCoordinates();

  void init(const TrackerTopology*, const TrackerGeometry*, const SiPixelFedCablingMap*);

  // Integers
  int quadrant(const DetId&);
  int side(const DetId&);
  int module(const DetId&);
  // barrel specific
  int layer(const DetId&);
  int sector(const DetId&);
  int ladder(const DetId&);
  int signed_ladder(const DetId&);
  int signed_module(const DetId&);
  int half(const DetId&);
  int outer(const DetId&);
  int flipped(const DetId&);
  // endcap specific
  int disk(const DetId&);
  int signed_disk(const DetId&);
  int panel(const DetId&);
  int ring(const DetId&);
  int blade(const DetId&);
  int signed_blade(const DetId&);

  unsigned int fedid(const DetId&);

  int channel(const DetId&, const std::pair<int, int>&);
  int channel(const DetId&, const PixelDigi*);
  int channel(const DetId&, const SiPixelCluster*);
  int channel(const SiPixelRecHit*);
  int channel(const TrackingRecHit*);

  int roc(const DetId&, const std::pair<int, int>&);
  int roc(const DetId&, const PixelDigi*);
  int roc(const DetId&, const SiPixelCluster*);
  int roc(const SiPixelRecHit*);
  int roc(const TrackingRecHit*);

  // Floats (coordinates)
  float module_coord(const DetId&, const std::pair<int, int>&);
  float module_coord(const DetId&, const PixelDigi*);
  float module_coord(const DetId&, const SiPixelCluster*);
  float module_coord(const SiPixelRecHit*);
  float module_coord(const TrackingRecHit*);

  float signed_module_coord(const DetId&, const std::pair<int, int>&);
  float signed_module_coord(const DetId&, const PixelDigi*);
  float signed_module_coord(const DetId&, const SiPixelCluster*);
  float signed_module_coord(const SiPixelRecHit*);
  float signed_module_coord(const TrackingRecHit*);

  float ladder_coord(const DetId&, const std::pair<int, int>&);
  float ladder_coord(const DetId&, const PixelDigi*);
  float ladder_coord(const DetId&, const SiPixelCluster*);
  float ladder_coord(const SiPixelRecHit*);
  float ladder_coord(const TrackingRecHit*);

  float signed_ladder_coord(const DetId&, const std::pair<int, int>&);
  float signed_ladder_coord(const DetId&, const PixelDigi*);
  float signed_ladder_coord(const DetId&, const SiPixelCluster*);
  float signed_ladder_coord(const SiPixelRecHit*);
  float signed_ladder_coord(const TrackingRecHit*);

  float ring_coord(const DetId&, const std::pair<int, int>&);
  float ring_coord(const DetId&, const PixelDigi*);
  float ring_coord(const DetId&, const SiPixelCluster*);
  float ring_coord(const SiPixelRecHit*);
  float ring_coord(const TrackingRecHit*);

  float disk_coord(const DetId&, const std::pair<int, int>&);
  float disk_coord(const DetId&, const PixelDigi*);
  float disk_coord(const DetId&, const SiPixelCluster*);
  float disk_coord(const SiPixelRecHit*);
  float disk_coord(const TrackingRecHit*);

  float signed_disk_coord(const DetId&, const std::pair<int, int>&);
  float signed_disk_coord(const DetId&, const PixelDigi*);
  float signed_disk_coord(const DetId&, const SiPixelCluster*);
  float signed_disk_coord(const SiPixelRecHit*);
  float signed_disk_coord(const TrackingRecHit*);

  float disk_ring_coord(const DetId&, const std::pair<int, int>&);
  float disk_ring_coord(const DetId&, const PixelDigi*);
  float disk_ring_coord(const DetId&, const SiPixelCluster*);
  float disk_ring_coord(const SiPixelRecHit*);
  float disk_ring_coord(const TrackingRecHit*);

  float signed_disk_ring_coord(const DetId&, const std::pair<int, int>&);
  float signed_disk_ring_coord(const DetId&, const PixelDigi*);
  float signed_disk_ring_coord(const DetId&, const SiPixelCluster*);
  float signed_disk_ring_coord(const SiPixelRecHit*);
  float signed_disk_ring_coord(const TrackingRecHit*);

  float blade_coord(const DetId&, const std::pair<int, int>&);
  float blade_coord(const DetId&, const PixelDigi*);
  float blade_coord(const DetId&, const SiPixelCluster*);
  float blade_coord(const SiPixelRecHit*);
  float blade_coord(const TrackingRecHit*);

  float signed_blade_coord(const DetId&, const std::pair<int, int>&);
  float signed_blade_coord(const DetId&, const PixelDigi*);
  float signed_blade_coord(const DetId&, const SiPixelCluster*);
  float signed_blade_coord(const SiPixelRecHit*);
  float signed_blade_coord(const TrackingRecHit*);

  float blade_panel_coord(const DetId&, const std::pair<int, int>&);
  float blade_panel_coord(const DetId&, const PixelDigi*);
  float blade_panel_coord(const DetId&, const SiPixelCluster*);
  float blade_panel_coord(const SiPixelRecHit*);
  float blade_panel_coord(const TrackingRecHit*);

  float signed_blade_panel_coord(const DetId&, const std::pair<int, int>&);
  float signed_blade_panel_coord(const DetId&, const PixelDigi*);
  float signed_blade_panel_coord(const DetId&, const SiPixelCluster*);
  float signed_blade_panel_coord(const SiPixelRecHit*);
  float signed_blade_panel_coord(const TrackingRecHit*);

  float signed_shifted_blade_panel_coord(const DetId&, const std::pair<int, int>&);
  float signed_shifted_blade_panel_coord(const DetId&, const PixelDigi*);
  float signed_shifted_blade_panel_coord(const DetId&, const SiPixelCluster*);
  float signed_shifted_blade_panel_coord(const SiPixelRecHit*);
  float signed_shifted_blade_panel_coord(const TrackingRecHit*);

private:
  int phase_;

  const TrackerTopology* tTopo_;
  const TrackerGeometry* tGeom_;
  const SiPixelFedCablingMap* cablingMap_;

  // Internal containers for optimal speed
  // - only calculate things once per DetId
  std::unordered_map<uint32_t, int> quadrant_;
  std::unordered_map<uint32_t, int> side_;
  std::unordered_map<uint32_t, int> module_;
  std::unordered_map<uint32_t, int> layer_;
  std::unordered_map<uint32_t, int> sector_;
  std::unordered_map<uint32_t, int> ladder_;
  std::unordered_map<uint32_t, int> signed_ladder_;
  std::unordered_map<uint32_t, int> signed_module_;
  std::unordered_map<uint32_t, int> half_;
  std::unordered_map<uint32_t, int> outer_;
  std::unordered_map<uint32_t, int> flipped_;
  std::unordered_map<uint32_t, int> disk_;
  std::unordered_map<uint32_t, int> signed_disk_;
  std::unordered_map<uint32_t, int> panel_;
  std::unordered_map<uint32_t, int> ring_;
  std::unordered_map<uint32_t, int> blade_;
  std::unordered_map<uint32_t, int> signed_blade_;

  std::unordered_map<uint32_t, unsigned int> fedid_;
  std::unordered_map<uint64_t, unsigned int> channel_;
  std::unordered_map<uint64_t, unsigned int> roc_;

  // Internal methods used for pixel coordinates
  bool isPixel_(const DetId&);
  bool isBPix_(const DetId&);
  bool isFPix_(const DetId&);
  std::pair<int, int> pixel_(const PixelDigi*);
  std::pair<int, int> pixel_(const SiPixelCluster*);
  std::pair<int, int> pixel_(const SiPixelRecHit*);
  float xcoord_on_module_(const DetId&, const std::pair<int, int>&);
  float ycoord_on_module_(const DetId&, const std::pair<int, int>&);
};

#endif