CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
RectangularPixelTopology.h
Go to the documentation of this file.
1 #ifndef Geometry_TrackerGeometryBuilder_RectangularPixelTopology_H
2 #define Geometry_TrackerGeometryBuilder_RectangularPixelTopology_H
3 
7 // Modified for the large pixels. Should work for barrel and forward.
8 // Danek Kotlinski & Michele Pioppi, 3/06.
9 // The bigger pixels are on the ROC boundries.
10 // For columns (Y direction, longer direction):
11 // the normal pixel are 150um long, big pixels are 300um long,
12 // the pixel index goes from 0 to 416 (or less for smaller modules)
13 // the big pixel are in 0, 52,104,156,208,260,312,363
14 // 51,103,155,207,259,311,363,415 .
15 // For rows (X direction, shorter direction):
16 // the normal pixel are 100um wide, big pixels are 200um wide,
17 // the pixel index goes from 0 to 159 (or less for smaller modules)
18 // the big pixel are in 79,80.
19 // The ROC has rows=80, cols=52.
20 // There are a lot of hardwired constants, sorry but this is a very
21 // specific class. For any other sensor design it has to be rewritten.
22 
23 // G. Giurgiu 11/27/06 ---------------------------------------------
24 // Check whether the pixel is at the edge of the module by adding the
25 // following functions (ixbin and iybin are the pixel row and column
26 // inside the module):
27 // bool isItEdgePixelInX (int ixbin)
28 // bool isItEdgePixelInY (int iybin)
29 // bool isItEdgePixel (int ixbin, int iybin)
30 // ------------------------------------------------------------------
31 // Add the individual measurement to local trasformations classes 01/07 d.k.
32 // ------------------------------------------------------------------
33 // Add big pixel flags for cluster range 15/3/07 V.Chiochia
34 
38 
40 public:
41  // Constructor, initilize
43  int ncols,
44  float pitchx,
45  float pitchy,
46  bool upgradeGeometry,
47  bool isBricked,
48  int ROWS_PER_ROC, // Num of Rows per ROC
49  int COLS_PER_ROC, // Num of Cols per ROC
50  int BIG_PIX_PER_ROC_X, // in x direction, rows. BIG_PIX_PER_ROC_X = 0 for SLHC
51  int BIG_PIX_PER_ROC_Y, // in y direction, cols. BIG_PIX_PER_ROC_Y = 0 for SLHC
52  int ROCS_X,
53  int ROCS_Y)
54  : m_pitchx(pitchx),
55  m_pitchy(pitchy),
56  m_nrows(nrows),
57  m_ncols(ncols),
58  m_ROWS_PER_ROC(ROWS_PER_ROC), // Num of Rows per ROC
59  m_COLS_PER_ROC(COLS_PER_ROC), // Num of Cols per ROC
60  m_ROCS_X(ROCS_X), // 2 for SLHC
61  m_ROCS_Y(ROCS_Y), // 8 for SLHC
62  m_upgradeGeometry(upgradeGeometry),
63  m_isBricked(isBricked) {
64  // Calculate the edge of the active sensor with respect to the center,
65  // that is simply the half-size.
66  // Take into account large pixels
67  m_xoffset = -(m_nrows + BIG_PIX_PER_ROC_X * m_nrows / ROWS_PER_ROC) / 2. * m_pitchx;
68  m_yoffset = -(m_ncols + BIG_PIX_PER_ROC_Y * m_ncols / COLS_PER_ROC) / 2. * m_pitchy;
69 
70  LogDebug("RectangularPixelTopology") << "nrows " << m_nrows << ", ncols " << m_ncols << ", pitchx " << m_pitchx
71  << ", pitchy " << m_pitchy << ", xoffset " << m_xoffset << ", yoffset "
72  << m_yoffset << ", BIG_PIX_PER_ROC_X " << BIG_PIX_PER_ROC_X
73  << ", BIG_PIX_PER_ROC_Y " << BIG_PIX_PER_ROC_Y << ", ROWS_PER_ROC "
74  << ROWS_PER_ROC << ", COLS_PER_ROC " << COLS_PER_ROC << ", ROCS_X " << ROCS_X
75  << ", ROCS_Y " << ROCS_Y << "\nNROWS " << m_ROWS_PER_ROC * m_ROCS_X
76  << ", NCOL " << m_COLS_PER_ROC * m_ROCS_Y << ", isBricked " << m_isBricked;
77  }
78 
79  // Topology interface, go from Masurement to Local corrdinates
80  // pixel coordinates (mp) -> cm (LocalPoint)
81  LocalPoint localPosition(const MeasurementPoint& mp) const override;
82 
83  // Transform LocalPoint to Measurement. Call pixel().
84  MeasurementPoint measurementPosition(const LocalPoint& lp) const override {
85  std::pair<float, float> p = pixel(lp);
86  return MeasurementPoint(p.first, p.second);
87  }
88 
89  // PixelTopology interface.
90  // Transform LocalPoint in cm to measurement in pitch units.
91  std::pair<float, float> pixel(const LocalPoint& p) const override;
92 
93  // Errors
94  // Error in local (cm) from the masurement errors
95  LocalError localError(const MeasurementPoint&, const MeasurementError&) const override;
96  // Errors in pitch units from localpoint error (in cm)
97  MeasurementError measurementError(const LocalPoint&, const LocalError&) const override;
98 
99  //-------------------------------------------------------------
100  // Transform LocalPoint to channel. Call pixel()
101  //
102  int channel(const LocalPoint& lp) const override {
103  std::pair<float, float> p = pixel(lp);
104  return PixelChannelIdentifier::pixelToChannel(int(p.first), int(p.second));
105  }
106 
107  //-------------------------------------------------------------
108  // Transform measurement to local coordinates individually in each dimension
109  //
110  float localX(const float mpX) const override;
111  float localY(const float mpY) const override;
112 
113  //-------------------------------------------------------------
114  // Return the BIG pixel information for a given pixel
115  //
116  bool isItBigPixelInX(const int ixbin) const override {
117  return ((m_upgradeGeometry) ? (false) : ((ixbin == 79) | (ixbin == 80)));
118  }
119 
120  bool isItBigPixelInY(const int iybin) const override {
122  return false;
123  else {
124  int iybin0 = iybin % 52;
125  return ((iybin0 == 0) | (iybin0 == 51));
126  // constexpr int bigYIndeces[]{0,51,52,103,104,155,156,207,208,259,260,311,312,363,364,415,416,511};
127  // return *std::lower_bound(std::begin(bigYIndeces),std::end(bigYIndeces),iybin) == iybin;
128  }
129  }
130 
131  //-------------------------------------------------------------
132  // Return BIG pixel flag in a given pixel range
133  //
134  bool containsBigPixelInX(int ixmin, int ixmax) const override {
135  return m_upgradeGeometry ? false : ((ixmin <= 80) & (ixmax >= 79));
136  }
137  bool containsBigPixelInY(int iymin, int iymax) const override {
138  return m_upgradeGeometry ? false
139  : (isItBigPixelInY(iymin) || isItBigPixelInY(iymax) || (iymin / 52) != (iymax / 52));
140  }
141 
142  //-------------------------------------------------------------
143  // Check whether the pixel is at the edge of the module
144  //
145  bool isItEdgePixelInX(int ixbin) const override { return ((ixbin == 0) | (ixbin == (m_nrows - 1))); }
146  bool isItEdgePixelInY(int iybin) const override { return ((iybin == 0) | (iybin == (m_ncols - 1))); }
147  bool isItEdgePixel(int ixbin, int iybin) const override {
148  return (isItEdgePixelInX(ixbin) | isItEdgePixelInY(iybin));
149  }
150 
151  //------------------------------------------------------------------
152  // Return pitch
153  std::pair<float, float> pitch() const override { return std::pair<float, float>(float(m_pitchx), float(m_pitchy)); }
154  // Return number of rows
155  int nrows() const override { return (m_nrows); }
156  // Return number of cols
157  int ncolumns() const override { return (m_ncols); }
158  // mlw Return number of ROCS Y
159  int rocsY() const override { return m_ROCS_Y; }
160  // mlw Return number of ROCS X
161  int rocsX() const override { return m_ROCS_X; }
162  // mlw Return number of rows per roc
163  int rowsperroc() const override { return m_ROWS_PER_ROC; }
164  // mlw Return number of cols per roc
165  int colsperroc() const override { return m_COLS_PER_ROC; }
166  float xoffset() const { return m_xoffset; }
167  float yoffset() const { return m_yoffset; }
168  bool isBricked() const override { return m_isBricked; }
169 
170 private:
171  float m_pitchx;
172  float m_pitchy;
173  float m_xoffset;
174  float m_yoffset;
175  int m_nrows;
176  int m_ncols;
179  int m_ROCS_X;
180  int m_ROCS_Y;
183 };
184 
185 #endif
LocalPoint localPosition(const MeasurementPoint &mp) const override
std::pair< float, float > pitch() const override
RectangularPixelTopology(int nrows, int ncols, float pitchx, float pitchy, bool upgradeGeometry, bool isBricked, int ROWS_PER_ROC, int COLS_PER_ROC, int BIG_PIX_PER_ROC_X, int BIG_PIX_PER_ROC_Y, int ROCS_X, int ROCS_Y)
std::pair< float, float > pixel(const LocalPoint &p) const override
bool containsBigPixelInY(int iymin, int iymax) const override
bool containsBigPixelInX(int ixmin, int ixmax) const override
MeasurementError measurementError(const LocalPoint &, const LocalError &) const override
bool isItEdgePixel(int ixbin, int iybin) const override
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
bool isItBigPixelInX(const int ixbin) const override
float localY(const float mpY) const override
bool isItEdgePixelInY(int iybin) const override
bool isItEdgePixelInX(int ixbin) const override
int channel(const LocalPoint &lp) const override
static int pixelToChannel(int row, int col)
bool isItBigPixelInY(const int iybin) const override
#define UNLIKELY(x)
Definition: Likely.h:21
float localX(const float mpX) const override
LocalError localError(const MeasurementPoint &, const MeasurementError &) const override
#define LogDebug(id)
MeasurementPoint measurementPosition(const LocalPoint &lp) const override