Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
PixelModuleHelper.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3  */
4 #ifndef INDET_PIXELMODULEHELPER_H
5 #define INDET_PIXELMODULEHELPER_H
6 
8 #include <cassert>
9 #include <array>
10 #include <stdexcept>
11 #include "ModuleKeyHelper.h"
12 
13 namespace InDet {
16  class PixelModuleHelper : public ModuleKeyHelper<unsigned int, // key type
17  12, // bits for rows
18  12, // bits for columns
19  4, // bits for chip
20  4, // bits for flags
21  3 // number of masks: single-pixel, core-column, circuit
22  > {
23  public:
24 
25  static constexpr std::array<unsigned short,2> N_COLS_PER_GROUP {
26  8, //8 columns per group for square pixels
27  4}; //4 columns per group for rectangular pixels
28 
29  // mask with every bit set for all chips, columns, rows, but the mask index bits.
30  static constexpr unsigned int getPixelMask() { return MaskUtils::createMask<0,ROW_BITS+COL_BITS+CHIP_BITS>(); }
31  // mask with row and lowest 3 column bits set to zero i.e. 8 adjacent columns
32  static constexpr unsigned int getColGroup8Mask() { return MaskUtils::createMask<ROW_BITS+3,ROW_BITS+COL_BITS+CHIP_BITS>(); }
33  // mask with row and lowest 2 column bits set to zero i.e. 4 adjacent columns
34  static constexpr unsigned int getColGroup4Mask() { return MaskUtils::createMask<ROW_BITS+2,ROW_BITS+COL_BITS+CHIP_BITS>(); }
35  // mask with row and column bits set to zero.
36  static constexpr unsigned int getChipMask() { return MaskUtils::createMask<ROW_BITS+COL_BITS,ROW_BITS+COL_BITS+CHIP_BITS>(); }
37 
38 
43  {
44  const InDetDD::PixelModuleDesign *pixelModuleDesign = dynamic_cast<const InDetDD::PixelModuleDesign *>(&design);
45  if (pixelModuleDesign) {
46  m_sensorColumns = pixelModuleDesign->columns();
47  m_sensorRows = pixelModuleDesign->rows();
48  if (pixelModuleDesign->rowsPerCircuit()==400 /* @TODO find a better way to identify when to swap columns and rows*/ ) {
49  // the front-ends of ITk ring triplet modules are rotated differently
50  // wrt. the offline coordinate system compared to quads and
51  // barrel triplets. Once these modules are identified, the translation
52  // works in exactly the same way, but columns and rows need to be swapped,
54  m_columns = pixelModuleDesign->rows();
55  m_rows = pixelModuleDesign->columns();
56  m_columnsPerCircuit = pixelModuleDesign->rowsPerCircuit();
57  m_rowsPerCircuit = pixelModuleDesign->columnsPerCircuit();
58  m_circuitsPerColumn = pixelModuleDesign->numberOfCircuitsPerRow();
59  m_circuitsPerRow = pixelModuleDesign->numberOfCircuitsPerColumn();
60  m_columnPitch = pixelModuleDesign->phiPitch();
61  m_rowPitch = pixelModuleDesign->etaPitch();
62  }
63  else {
65  m_rows = pixelModuleDesign->rows();
66  m_columns = pixelModuleDesign->columns();
67  m_rowsPerCircuit = pixelModuleDesign->rowsPerCircuit();
68  m_columnsPerCircuit = pixelModuleDesign->columnsPerCircuit();
69  m_circuitsPerRow = pixelModuleDesign->numberOfCircuitsPerRow();
70  m_circuitsPerColumn = pixelModuleDesign->numberOfCircuitsPerColumn();
71  m_columnPitch = pixelModuleDesign->etaPitch();
72  m_rowPitch = pixelModuleDesign->phiPitch();
73  }
75  }
76  if (m_rectangularPixels) {
78  }
79  }
80  operator bool () const { return m_columns>0; }
81 
82  unsigned int columns() const { return m_columns; }
83  unsigned int rows() const { return m_rows; }
84  unsigned int columnsPerCircuit() const { return m_columnsPerCircuit; }
85  unsigned int rowsPerCircuit() const { return m_rowsPerCircuit; }
86  unsigned int circuitsPerColumn() const { return m_circuitsPerColumn; }
87  unsigned int circuitsPerRow() const { return m_circuitsPerRow; }
88 
89  float columnPitch() const { return m_columnPitch; }
90  float rowPitch() const { return m_rowPitch; }
91 
97  unsigned int hardwareCoordinates(unsigned int row, unsigned int column) const {
98  unsigned int chip =0;
99  if (swapOfflineRowsColumns()) {
100  unsigned int tmp=row;
101  row=column;
102  column=tmp;
103  }
104  if (circuitsPerColumn()>1) {
105  assert( circuitsPerColumn() == 2);
106  chip += (row/rowsPerCircuit()) * circuitsPerRow();
107  row = row % rowsPerCircuit();
108  if (chip>0) {
109  row = rowsPerCircuit() - row -1;
110  column = columns() - column -1;
111  }
112  }
113  if (circuitsPerRow()>1) {
114  chip += column/columnsPerCircuit();
116  }
117  return makeKey(0u, chip, column, row);
118  }
119 
122  unsigned int nCells() const {
123  return nSensorColumns() * nSensorRows();
124  }
127  unsigned int nSensorColumns() const {
128  return m_sensorColumns;
129  }
132  unsigned int nSensorRows() const {
133  return m_sensorRows;
134  }
137  unsigned int nElements(unsigned int mask_i) const {
138  switch (mask_i) {
139  case 1:
140  return nSensorColumns() * circuitsPerRow() / (m_rectangularPixels ? 4 : 8);
141  case 2:
142  return circuitsPerColumn() * circuitsPerRow();
143  default:
144  assert( mask_i==0);
145  return nCells();
146  }
147  }
148 
153  bool isMatchingDefect( unsigned int key_ref, unsigned int key_test) const {
154  return isOverlapping(key_ref, key_test);
155  }
156 
161  std::array<unsigned int,4> offlineRange(unsigned int key) const {
162  unsigned int mask_index = getMaskIdx(key);
163  if (mask_index !=0) {
164  if (getRow(key) !=0) {
165  throw std::runtime_error("invalid key");
166  };
167 
168  unsigned int chip=getChip(key);
169  unsigned int row=getRow(key);
170  unsigned int row_end=row + rowsPerCircuit()-1;
171  unsigned int column=getColumn(key);
172  unsigned int column_end= column + (mask_index == 1 ? N_COLS_PER_GROUP[m_rectangularPixels]-1 : columnsPerCircuit());
173 
174  unsigned int chip_row = chip / circuitsPerRow();
175  unsigned int chip_column = chip % circuitsPerRow();
176 
177  column += chip_column * columnsPerCircuit();
178  column_end += chip_column * columnsPerCircuit();
179  if (chip_row>=1) {
180  column = columns() - column -1;
181  column_end = columns() - column_end -1;
182 
183  row = rowsPerCircuit() - row -1 + chip_row * rowsPerCircuit();
184  row_end = rowsPerCircuit() - row_end -1 + chip_row * rowsPerCircuit();
185  }
186  if (swapOfflineRowsColumns()) {
187  return std::array<unsigned int,4>{ std::min(column, column_end), std::max(column,column_end)+1,
188  std::min(row, row_end), std::max(row, row_end)+1 };
189  }
190  else {
191  return std::array<unsigned int,4>{ std::min(row, row_end), std::max(row, row_end)+1,
192  std::min(column, column_end), std::max(column,column_end)+1 };
193  }
194  }
195  else {
196  unsigned int chip=getChip(key);
197  unsigned int row=getRow(key);
198  unsigned int column=getColumn(key);
199 
200  unsigned int chip_row = chip / circuitsPerRow();
201  unsigned int chip_column = chip % circuitsPerRow();
202 
203  column += chip_column * columnsPerCircuit();
204  if (chip_row>=1) {
205  column = columns() - column -1;
206 
207  row = rowsPerCircuit() - row -1 + chip_row * rowsPerCircuit();
208  }
209  if (swapOfflineRowsColumns()) {
210  return std::array<unsigned int,4 >{ column, column + 1,
211  row, row +1 };
212  }
213  else {
214  return std::array<unsigned int,4>{ row, row + 1,
215  column, column +1 };
216  }
217  }
218  }
220 
221  private:
222 
223  unsigned short m_sensorRows=0;
224  unsigned short m_sensorColumns=0;
225  unsigned short m_rows = 0;
226  unsigned short m_columns = 0;
227  unsigned short m_rowsPerCircuit = 0;
228  unsigned short m_columnsPerCircuit = 0;
229  unsigned char m_circuitsPerRow = 0;
230  unsigned char m_circuitsPerColumn = 0;
231 
232  float m_columnPitch = 0;
233  float m_rowPitch = 0;
234 
235  bool m_rectangularPixels = false;
237  };
238 }
239 #endif
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 4, 3 >::MASKS_SIZE
static constexpr unsigned int MASKS_SIZE
Definition: ModuleKeyHelper.h:61
query_example.row
row
Definition: query_example.py:24
InDet::PixelModuleHelper::nSensorColumns
unsigned int nSensorColumns() const
Return the number of offline columns.
Definition: PixelModuleHelper.h:127
InDet::PixelModuleHelper::m_columnPitch
float m_columnPitch
Definition: PixelModuleHelper.h:232
InDetDD::PixelModuleDesign
Definition: PixelModuleDesign.h:48
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 4, 3 >::getChip
static constexpr unsigned int getChip(unsigned int key)
Get the column index from a full key.
Definition: ModuleKeyHelper.h:107
InDetDD::PixelModuleDesign::columns
int columns() const
Number of cell columns per module:
Definition: PixelModuleDesign.h:340
InDet::PixelModuleHelper::m_columnsPerCircuit
unsigned short m_columnsPerCircuit
Definition: PixelModuleHelper.h:228
InDet::PixelModuleHelper
Helper class to convert between offline column, row and hardware chip, column, row coordinates.
Definition: PixelModuleHelper.h:22
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
InDet
Primary Vertex Finder.
Definition: VP1ErrorUtils.h:36
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
InDet::PixelModuleHelper::rowPitch
float rowPitch() const
Definition: PixelModuleHelper.h:90
InDetDD::PixelModuleDesign::rows
int rows() const
Number of cell rows per module:
Definition: PixelModuleDesign.h:345
InDet::PixelModuleHelper::offlineRange
std::array< unsigned int, 4 > offlineRange(unsigned int key) const
Function to return offline column and row ranges matching the defect-area of the given key (used for ...
Definition: PixelModuleHelper.h:161
DeMoUpdate.column
dictionary column
Definition: DeMoUpdate.py:1110
InDet::PixelModuleHelper::swapOfflineRowsColumns
bool swapOfflineRowsColumns() const
Definition: PixelModuleHelper.h:219
InDet::PixelModuleHelper::m_sensorRows
unsigned short m_sensorRows
Definition: PixelModuleHelper.h:223
xAOD::unsigned
unsigned
Definition: RingSetConf_v1.cxx:662
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
InDetDD::PixelModuleDesign::etaPitch
virtual double etaPitch() const
Pitch in eta direction.
Definition: PixelModuleDesign.cxx:196
InDet::PixelModuleHelper::m_rowsPerCircuit
unsigned short m_rowsPerCircuit
Definition: PixelModuleHelper.h:227
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 4, 3 >::getColumn
static constexpr unsigned int getColumn(unsigned int key)
Get the column index from a full key.
Definition: ModuleKeyHelper.h:99
InDet::PixelModuleHelper::m_circuitsPerRow
unsigned char m_circuitsPerRow
Definition: PixelModuleHelper.h:229
InDetDD::PixelModuleDesign::phiPitch
virtual double phiPitch() const
Pitch in phi direction.
Definition: PixelModuleDesign.cxx:180
InDet::PixelModuleHelper::N_COLS_PER_GROUP
static constexpr std::array< unsigned short, 2 > N_COLS_PER_GROUP
Definition: PixelModuleHelper.h:25
InDet::PixelModuleHelper::getColGroup4Mask
static constexpr unsigned int getColGroup4Mask()
Definition: PixelModuleHelper.h:34
InDet::PixelModuleHelper::m_rowPitch
float m_rowPitch
Definition: PixelModuleHelper.h:233
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 4, 3 >::makeKey
static constexpr unsigned int makeKey(unsigned int mask_sel, unsigned int chip, unsigned int col, unsigned int row=0u)
Create a key from mask, chip, column and row indices.
Definition: ModuleKeyHelper.h:89
InDet::PixelModuleHelper::isMatchingDefect
bool isMatchingDefect(unsigned int key_ref, unsigned int key_test) const
Test whether the given packed hardware coordinates match the given defect.
Definition: PixelModuleHelper.h:153
InDetDD::PixelModuleDesign::numberOfCircuitsPerColumn
int numberOfCircuitsPerColumn() const
Number of circuits per column:
Definition: PixelModuleDesign.h:320
InDet::PixelModuleHelper::m_circuitsPerColumn
unsigned char m_circuitsPerColumn
Definition: PixelModuleHelper.h:230
InDet::PixelModuleHelper::getColGroup8Mask
static constexpr unsigned int getColGroup8Mask()
Definition: PixelModuleHelper.h:32
InDet::PixelModuleHelper::columnPitch
float columnPitch() const
Definition: PixelModuleHelper.h:89
InDet::PixelModuleHelper::hardwareCoordinates
unsigned int hardwareCoordinates(unsigned int row, unsigned int column) const
compute "hardware" coordinates from offline coordinates.
Definition: PixelModuleHelper.h:97
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
lumiFormat.array
array
Definition: lumiFormat.py:91
InDet::PixelModuleHelper::m_sensorColumns
unsigned short m_sensorColumns
Definition: PixelModuleHelper.h:224
InDetDD::PixelModuleDesign::numberOfCircuitsPerRow
int numberOfCircuitsPerRow() const
Number of circuits per row:
Definition: PixelModuleDesign.h:325
InDet::PixelModuleHelper::m_swapOfflineRowsColumns
bool m_swapOfflineRowsColumns
Definition: PixelModuleHelper.h:236
InDet::PixelModuleHelper::m_rows
unsigned short m_rows
Definition: PixelModuleHelper.h:225
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 4, 3 >::getRow
static constexpr unsigned int getRow(unsigned int key)
Get the row index from a full key.
Definition: ModuleKeyHelper.h:103
InDet::PixelModuleHelper::rows
unsigned int rows() const
Definition: PixelModuleHelper.h:83
InDet::PixelModuleHelper::m_columns
unsigned short m_columns
Definition: PixelModuleHelper.h:226
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 4, 3 >::m_masks
std::conditional<(N_MASKS >0), std::array< unsigned int, MASKS_SIZE >, Empty >::type m_masks
the masks for this helper.
Definition: ModuleKeyHelper.h:207
InDet::PixelModuleHelper::columnsPerCircuit
unsigned int columnsPerCircuit() const
Definition: PixelModuleHelper.h:84
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
InDetDD::PixelModuleDesign::rowsPerCircuit
int rowsPerCircuit() const
Number of cell rows per circuit:
Definition: PixelModuleDesign.h:335
PixelModuleDesign.h
InDet::PixelModuleHelper::nCells
unsigned int nCells() const
Return total number of pixels per module.
Definition: PixelModuleHelper.h:122
InDet::PixelModuleHelper::getChipMask
static constexpr unsigned int getChipMask()
Definition: PixelModuleHelper.h:36
InDet::PixelModuleHelper::rowsPerCircuit
unsigned int rowsPerCircuit() const
Definition: PixelModuleHelper.h:85
InDet::PixelModuleHelper::nSensorRows
unsigned int nSensorRows() const
Return the number of offline rows.
Definition: PixelModuleHelper.h:132
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 4, 3 >::isOverlapping
bool isOverlapping(unsigned int key_ref, unsigned int key_test) const
Test whether a single cell (e.g.
Definition: ModuleKeyHelper.h:195
InDet::PixelModuleHelper::PixelModuleHelper
PixelModuleHelper(const InDetDD::SiDetectorDesign &design)
Definition: PixelModuleHelper.h:39
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 4, 3 >::getMaskIdx
static constexpr unsigned int getMaskIdx(unsigned int key)
Get the mask index from a full key.
Definition: ModuleKeyHelper.h:111
InDet::PixelModuleHelper::m_rectangularPixels
bool m_rectangularPixels
Definition: PixelModuleHelper.h:235
InDet::ModuleKeyHelper
Helper class to create keys for defects described by chip, column and row indices,...
Definition: ModuleKeyHelper.h:47
InDet::PixelModuleHelper::nElements
unsigned int nElements(unsigned int mask_i) const
return the maximum number of unique mask (or group) defects per module.
Definition: PixelModuleHelper.h:137
InDet::PixelModuleHelper::circuitsPerRow
unsigned int circuitsPerRow() const
Definition: PixelModuleHelper.h:87
InDet::PixelModuleHelper::circuitsPerColumn
unsigned int circuitsPerColumn() const
Definition: PixelModuleHelper.h:86
InDetDD::SiDetectorDesign
Definition: SiDetectorDesign.h:50
xAOD::bool
setBGCode setTAP setLVL2ErrorBits bool
Definition: TrigDecision_v1.cxx:60
ModuleKeyHelper.h
InDetDD::PixelModuleDesign::columnsPerCircuit
int columnsPerCircuit() const
Number of cell columns per circuit:
Definition: PixelModuleDesign.h:330
InDet::PixelModuleHelper::getPixelMask
static constexpr unsigned int getPixelMask()
Definition: PixelModuleHelper.h:30
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
InDet::PixelModuleHelper::columns
unsigned int columns() const
Definition: PixelModuleHelper.h:82