ATLAS Offline Software
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  2 // bits for defect type
21  > {
22  public:
23 
24  static constexpr std::array<unsigned short,2> N_COLS_PER_GROUP {
25  8, //8 columns per group for square pixels
26  4}; //4 columns per group for rectangular pixels
27 
28  // mask with every bit set for all chips, columns, rows, but the mask index bits.
29  static constexpr unsigned int getPixelMask() { return MaskUtils::createMask<0,ROW_BITS+COL_BITS+CHIP_BITS>(); }
30  // mask with row and lowest 3 column bits set to zero i.e. 8 adjacent columns
31  static constexpr unsigned int getColGroup8Mask() { return MaskUtils::createMask<ROW_BITS+3,ROW_BITS+COL_BITS+CHIP_BITS>(); }
32  // mask with row and lowest 2 column bits set to zero i.e. 4 adjacent columns
33  static constexpr unsigned int getColGroup4Mask() { return MaskUtils::createMask<ROW_BITS+2,ROW_BITS+COL_BITS+CHIP_BITS>(); }
34  // mask with row and column bits set to zero.
35  static constexpr unsigned int getChipMask() { return MaskUtils::createMask<ROW_BITS+COL_BITS,ROW_BITS+COL_BITS+CHIP_BITS>(); }
36 
37 
39  {
40  const InDetDD::PixelModuleDesign *pixelModuleDesign = dynamic_cast<const InDetDD::PixelModuleDesign *>(&design);
41  if (pixelModuleDesign) {
42  m_sensorColumns = pixelModuleDesign->columns();
43  m_sensorRows = pixelModuleDesign->rows();
44  if (pixelModuleDesign->rowsPerCircuit()==400 /* @TODO find a better way to identify when to swap columns and rows*/ ) {
45  // the front-ends of ITk ring triplet modules are rotated differently
46  // wrt. the offline coordinate system compared to quads and
47  // barrel triplets. Once these modules are identified, the translation
48  // works in exactly the same way, but columns and rows need to be swapped,
50  m_columns = pixelModuleDesign->rows();
51  m_rows = pixelModuleDesign->columns();
52  m_columnsPerCircuit = pixelModuleDesign->rowsPerCircuit();
53  m_rowsPerCircuit = pixelModuleDesign->columnsPerCircuit();
54  m_circuitsPerColumn = pixelModuleDesign->numberOfCircuitsPerRow();
55  m_circuitsPerRow = pixelModuleDesign->numberOfCircuitsPerColumn();
56  m_columnPitch = pixelModuleDesign->phiPitch();
57  m_rowPitch = pixelModuleDesign->etaPitch();
58  }
59  else {
61  m_rows = pixelModuleDesign->rows();
62  m_columns = pixelModuleDesign->columns();
63  m_rowsPerCircuit = pixelModuleDesign->rowsPerCircuit();
64  m_columnsPerCircuit = pixelModuleDesign->columnsPerCircuit();
65  m_circuitsPerRow = pixelModuleDesign->numberOfCircuitsPerRow();
66  m_circuitsPerColumn = pixelModuleDesign->numberOfCircuitsPerColumn();
67  m_columnPitch = pixelModuleDesign->etaPitch();
68  m_rowPitch = pixelModuleDesign->phiPitch();
69  }
71  }
72  }
73  static constexpr unsigned int N_MASKS=3;
74  static constexpr unsigned int nMasks() { return N_MASKS; }
75  std::array<unsigned int, N_MASKS> masks() const {
76  return std::array<unsigned int,N_MASKS> {
80  };
81  }
82  operator bool () const { return m_columns>0; }
83 
84  unsigned int columns() const { return m_columns; }
85  unsigned int rows() const { return m_rows; }
86  unsigned int columnsPerCircuit() const { return m_columnsPerCircuit; }
87  unsigned int rowsPerCircuit() const { return m_rowsPerCircuit; }
88  unsigned int circuitsPerColumn() const { return m_circuitsPerColumn; }
89  unsigned int circuitsPerRow() const { return m_circuitsPerRow; }
90 
91  float columnPitch() const { return m_columnPitch; }
92  float rowPitch() const { return m_rowPitch; }
93 
99  unsigned int hardwareCoordinates(unsigned int row, unsigned int column) const {
100  unsigned int chip =0;
101  if (swapOfflineRowsColumns()) {
102  unsigned int tmp=row;
103  row=column;
104  column=tmp;
105  }
106  if (circuitsPerColumn()>1) {
107  assert( circuitsPerColumn() == 2);
108  chip += (row/rowsPerCircuit()) * circuitsPerRow();
109  row = row % rowsPerCircuit();
110  if (chip>0) {
111  row = rowsPerCircuit() - row -1;
112  column = columns() - column -1;
113  }
114  }
115  if (circuitsPerRow()>1) {
116  chip += column/columnsPerCircuit();
118  }
119  return makeKey(0u, chip, column, row);
120  }
125  std::pair<unsigned int,unsigned int> offlineCoordinates(unsigned int key) const {
126  unsigned int chip = getChip(key);
127  unsigned int column = getColumn(key);
128  unsigned int row = getRow(key);
129  // handle special values
130  // used for merging
131  if (row == getLimitRowMax()) {
132  row=rowsPerCircuit()-1;
133  }
134  if (row == rowsPerCircuit()) {
135  column+=1u;
136  row=0u;
137  }
138 
139  column+= columnsPerCircuit() * (chip%circuitsPerRow());
140  if (chip>=circuitsPerRow()) {
141  column=columns() - column -1;
142  row=rowsPerCircuit() - row -1;
143  row+=rowsPerCircuit() * (chip/circuitsPerRow());
144  }
145  if (swapOfflineRowsColumns()) {
147  }
148  if (row>=nSensorRows() || column>=nSensorColumns()) {
149  throw std::runtime_error("Invvalid offline coordinates");
150  }
151  return std::make_pair(row,column);
152  }
153 
156  unsigned int nCells() const {
157  return nSensorColumns() * nSensorRows();
158  }
161  unsigned int nSensorColumns() const {
162  return m_sensorColumns;
163  }
166  unsigned int nSensorRows() const {
167  return m_sensorRows;
168  }
171  unsigned int nElements(unsigned int mask_i) const {
172  switch (mask_i) {
173  case 1:
174  return nSensorColumns() * circuitsPerRow() / (m_rectangularPixels ? 4 : 8);
175  case 2:
176  return circuitsPerColumn() * circuitsPerRow();
177  default:
178  assert( mask_i==0);
179  return nCells();
180  }
181  }
182 
187  std::array<unsigned int,4> offlineRange(const std::pair<unsigned int,unsigned int> &range) const {
188  if (range.first != range.second) {
189  // if (getRow(range.first) !=0) {
190  // throw std::runtime_error("invalid key");
191  // };
192 
193  std::pair<unsigned int, unsigned int> start=offlineCoordinates(range.first);
194  std::pair<unsigned int, unsigned int> end=offlineCoordinates(range.second);
195  return std::array<unsigned int,4>{ std::min(start.first, end.first), std::max(start.first, end.first)+1,
196  std::min(start.second, end.second), std::max(start.second,end.second)+1};
197  }
198  else {
199  std::pair<unsigned int, unsigned int> start=offlineCoordinates(range.first);
200  return std::array<unsigned int,4>{ start.first, start.first+1,
201  start.second, start.second+1};
202  }
203  }
205 
206  private:
207 
208  unsigned short m_sensorRows=0;
209  unsigned short m_sensorColumns=0;
210  unsigned short m_rows = 0;
211  unsigned short m_columns = 0;
212  unsigned short m_rowsPerCircuit = 0;
213  unsigned short m_columnsPerCircuit = 0;
214  unsigned char m_circuitsPerRow = 0;
215  unsigned char m_circuitsPerColumn = 0;
216 
217  float m_columnPitch = 0;
218  float m_rowPitch = 0;
219 
220  bool m_rectangularPixels = false;
222  };
223 }
224 #endif
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 2 >::getColumn
static constexpr unsigned int getColumn(unsigned int key)
Get the column index from a full key.
Definition: ModuleKeyHelper.h:94
InDet::PixelModuleHelper::nSensorColumns
unsigned int nSensorColumns() const
Return the number of offline columns.
Definition: PixelModuleHelper.h:161
InDet::PixelModuleHelper::m_columnPitch
float m_columnPitch
Definition: PixelModuleHelper.h:217
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 2 >::getRow
static constexpr unsigned int getRow(unsigned int key)
Get the row index from a full key.
Definition: ModuleKeyHelper.h:98
InDetDD::PixelModuleDesign
Definition: PixelModuleDesign.h:45
InDetDD::PixelModuleDesign::columns
int columns() const
Number of cell columns per module:
Definition: PixelModuleDesign.h:331
InDet::PixelModuleHelper::m_columnsPerCircuit
unsigned short m_columnsPerCircuit
Definition: PixelModuleHelper.h:213
InDet::PixelModuleHelper
Helper class to convert between offline column, row and hardware chip, column, row coordinates.
Definition: PixelModuleHelper.h:21
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:92
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:13
InDetDD::PixelModuleDesign::rows
int rows() const
Number of cell rows per module:
Definition: PixelModuleDesign.h:336
DeMoUpdate.column
dictionary column
Definition: DeMoUpdate.py:1110
keylayer_zslicemap.row
row
Definition: keylayer_zslicemap.py:155
InDet::PixelModuleHelper::swapOfflineRowsColumns
bool swapOfflineRowsColumns() const
Definition: PixelModuleHelper.h:204
InDet::PixelModuleHelper::m_sensorRows
unsigned short m_sensorRows
Definition: PixelModuleHelper.h:208
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:208
InDet::PixelModuleHelper::m_rowsPerCircuit
unsigned short m_rowsPerCircuit
Definition: PixelModuleHelper.h:212
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:92
InDet::PixelModuleHelper::m_circuitsPerRow
unsigned char m_circuitsPerRow
Definition: PixelModuleHelper.h:214
InDetDD::PixelModuleDesign::phiPitch
virtual double phiPitch() const
Pitch in phi direction.
Definition: PixelModuleDesign.cxx:192
InDet::PixelModuleHelper::N_COLS_PER_GROUP
static constexpr std::array< unsigned short, 2 > N_COLS_PER_GROUP
Definition: PixelModuleHelper.h:24
InDet::PixelModuleHelper::getColGroup4Mask
static constexpr unsigned int getColGroup4Mask()
Definition: PixelModuleHelper.h:33
InDet::PixelModuleHelper::m_rowPitch
float m_rowPitch
Definition: PixelModuleHelper.h:218
InDetDD::PixelModuleDesign::numberOfCircuitsPerColumn
int numberOfCircuitsPerColumn() const
Number of circuits per column:
Definition: PixelModuleDesign.h:311
InDet::PixelModuleHelper::nMasks
static constexpr unsigned int nMasks()
Definition: PixelModuleHelper.h:74
InDet::PixelModuleHelper::m_circuitsPerColumn
unsigned char m_circuitsPerColumn
Definition: PixelModuleHelper.h:215
InDet::PixelModuleHelper::getColGroup8Mask
static constexpr unsigned int getColGroup8Mask()
Definition: PixelModuleHelper.h:31
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:194
InDet::PixelModuleHelper::columnPitch
float columnPitch() const
Definition: PixelModuleHelper.h:91
InDet::PixelModuleHelper::hardwareCoordinates
unsigned int hardwareCoordinates(unsigned int row, unsigned int column) const
compute "hardware" coordinates from offline coordinates.
Definition: PixelModuleHelper.h:99
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 2 >::getChip
static constexpr unsigned int getChip(unsigned int key)
Get the column index from a full key.
Definition: ModuleKeyHelper.h:110
InDet::PixelModuleHelper::masks
std::array< unsigned int, N_MASKS > masks() const
Definition: PixelModuleHelper.h:75
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
InDet::PixelModuleHelper::offlineRange
std::array< unsigned int, 4 > offlineRange(const std::pair< unsigned int, unsigned int > &range) const
Function to return offline column and row ranges matching the defect-area of the given key (used for ...
Definition: PixelModuleHelper.h:187
InDet::PixelModuleHelper::m_sensorColumns
unsigned short m_sensorColumns
Definition: PixelModuleHelper.h:209
InDetDD::PixelModuleDesign::numberOfCircuitsPerRow
int numberOfCircuitsPerRow() const
Number of circuits per row:
Definition: PixelModuleDesign.h:316
InDet::PixelModuleHelper::m_swapOfflineRowsColumns
bool m_swapOfflineRowsColumns
Definition: PixelModuleHelper.h:221
InDet::PixelModuleHelper::m_rows
unsigned short m_rows
Definition: PixelModuleHelper.h:210
InDet::PixelModuleHelper::rows
unsigned int rows() const
Definition: PixelModuleHelper.h:85
InDet::PixelModuleHelper::m_columns
unsigned short m_columns
Definition: PixelModuleHelper.h:211
InDet::PixelModuleHelper::columnsPerCircuit
unsigned int columnsPerCircuit() const
Definition: PixelModuleHelper.h:86
InDetDD::PixelModuleDesign::rowsPerCircuit
int rowsPerCircuit() const
Number of cell rows per circuit:
Definition: PixelModuleDesign.h:326
PixelModuleDesign.h
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 2 >::makeKey
static constexpr unsigned int makeKey(bool is_range, unsigned int chip, unsigned int col, unsigned int row=0u)
Create a key from mask, chip, column and row indices.
Definition: ModuleKeyHelper.h:85
InDet::PixelModuleHelper::nCells
unsigned int nCells() const
Return total number of pixels per module.
Definition: PixelModuleHelper.h:156
InDet::PixelModuleHelper::getChipMask
static constexpr unsigned int getChipMask()
Definition: PixelModuleHelper.h:35
InDet::PixelModuleHelper::rowsPerCircuit
unsigned int rowsPerCircuit() const
Definition: PixelModuleHelper.h:87
InDet::PixelModuleHelper::nSensorRows
unsigned int nSensorRows() const
Return the number of offline rows.
Definition: PixelModuleHelper.h:166
InDet::PixelModuleHelper::PixelModuleHelper
PixelModuleHelper(const InDetDD::SiDetectorDesign &design)
Definition: PixelModuleHelper.h:38
InDet::PixelModuleHelper::m_rectangularPixels
bool m_rectangularPixels
Definition: PixelModuleHelper.h:220
InDet::PixelModuleHelper::offlineCoordinates
std::pair< unsigned int, unsigned int > offlineCoordinates(unsigned int key) const
compute offline coordinates from "hardware" coordinates
Definition: PixelModuleHelper.h:125
InDet::PixelModuleHelper::N_MASKS
static constexpr unsigned int N_MASKS
Definition: PixelModuleHelper.h:73
InDet::ModuleKeyHelper
Helper class to create keys for defects described by chip, column and row indices,...
Definition: ModuleKeyHelper.h:41
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:171
InDet::PixelModuleHelper::circuitsPerRow
unsigned int circuitsPerRow() const
Definition: PixelModuleHelper.h:89
InDet::PixelModuleHelper::circuitsPerColumn
unsigned int circuitsPerColumn() const
Definition: PixelModuleHelper.h:88
InDetDD::SiDetectorDesign
Definition: SiDetectorDesign.h:50
xAOD::bool
setBGCode setTAP setLVL2ErrorBits bool
Definition: TrigDecision_v1.cxx:60
InDet::ModuleKeyHelper< unsigned int, 12, 12, 4, 2 >::getLimitRowMax
static constexpr unsigned int getLimitRowMax()
Get the maximum row value.
Definition: ModuleKeyHelper.h:102
ModuleKeyHelper.h
InDetDD::PixelModuleDesign::columnsPerCircuit
int columnsPerCircuit() const
Number of cell columns per circuit:
Definition: PixelModuleDesign.h:321
InDet::PixelModuleHelper::getPixelMask
static constexpr unsigned int getPixelMask()
Definition: PixelModuleHelper.h:29
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
InDet::PixelModuleHelper::columns
unsigned int columns() const
Definition: PixelModuleHelper.h:84