ATLAS Offline Software
StripModuleHelper.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_STRIPMODULEHELPER_H
5 #define INDET_STRIPMODULEHELPER_H
6 
8 #include <cassert>
9 #include <array>
10 #include <stdexcept>
11 #include <algorithm>
12 #include "ModuleKeyHelper.h"
13 
14 namespace InDet {
17  class StripModuleHelper : public ModuleKeyHelper<unsigned short, // key type
18  12, // bits for rows
19  0, // bits for columns
20  0 // bits for chip
21  > {
22  public:
23 
24 
25  // mask with every bit set for all chips, columns, rows, but the mask index bits.
26  static constexpr unsigned int getStripMask() { return MaskUtils::createMask<0,ROW_BITS+CHIP_BITS>(); }
27  // mask with row and column bits set to zero.
28  static constexpr unsigned int getChipMask() { return MaskUtils::createMask<ROW_BITS,ROW_BITS+CHIP_BITS>(); }
29 
30 
32  {
33  const InDetDD::SCT_ModuleSideDesign *stripModuleDesign = dynamic_cast<const InDetDD::SCT_ModuleSideDesign *>(&design);
34  if (stripModuleDesign) {
35  m_rows = stripModuleDesign->cells(); // strips
36  m_columns=1u;
37  }
38  }
39  static constexpr unsigned int N_MASKS = 1;
40  static constexpr unsigned int nMasks() { return N_MASKS; }
41  std::array<unsigned int, N_MASKS> masks() const {
42  return std::array<unsigned int,N_MASKS> {
44  };
45  }
46 
47  operator bool () const { return m_rows>0; }
48 
49  unsigned int columns() const { return m_columns; }
50  unsigned int rows() const { return m_rows; }
51  static constexpr unsigned int columnsPerCircuit() { return 1u; }
52  unsigned int rowsPerCircuit() const { return m_rows; }
53  static constexpr unsigned int circuitsPerColumn() { return 1u; }
54  static constexpr unsigned int circuitsPerRow() { return 1u; }
55 
56  static constexpr unsigned int columnsPerMask([[maybe_unused]] unsigned int mask_idx) { return 1u;}
57 
63  KEY_TYPE hardwareCoordinates(unsigned int row, unsigned int column) const {
64  unsigned int chip =0;
65  if (circuitsPerColumn()>1) {
66  chip += (row/rowsPerCircuit()) * circuitsPerRow();
67  row = row % rowsPerCircuit();
68  if (chip>0) {
69  row = rowsPerCircuit() - row -1;
70  column = columns() - column -1;
71  }
72  }
73  if (circuitsPerRow()>1) {
74  chip += column/columnsPerCircuit();
76  }
77  return makeKey(0u, chip, column, row);
78  }
83  std::pair<unsigned int,unsigned int> offlineCoordinates(unsigned int key) const {
84  unsigned int chip = getChip(key);
85  unsigned int column = getColumn(key);
86  unsigned int row = getRow(key);
87  // handle special values
88  // used for merging
89  // should not occur for strips
90  if (row == getLimitRowMax()) {
91  row=rowsPerCircuit()-1;
92  }
93  if (row == rowsPerCircuit()) {
94  column+=1u;
95  row=0u;
96  }
97 
99  if (chip>=circuitsPerRow()) {
100  column=columns() - column -1;
101  row=rowsPerCircuit() - row -1;
102  row+=rowsPerCircuit() * (chip/circuitsPerRow());
103  }
104  if (row>nSensorRows() || column>nSensorColumns()) {
105  throw std::runtime_error("Invvalid offline coordinates");
106  }
107  return std::make_pair(row,column);
108  }
109 
112  unsigned int nCells() const {
113  return m_columns * m_rows;
114  }
117  unsigned int nSensorColumns() const {
118  return m_columns;
119  }
122  unsigned int nSensorRows() const {
123  return m_rows;
124  }
128  unsigned int nElements([[maybe_unused]] unsigned int mask_i) const {
129  assert( mask_i==0);
130  return nCells();
131  }
132 
137  std::array<unsigned int,4> offlineRange(const std::pair<unsigned int,unsigned int> &range) const {
138  if (range.first != range.second) {
139  if (getRow(range.first) !=0) {
140  throw std::runtime_error("invalid key");
141  };
142 
143  std::pair<unsigned int, unsigned int> start=offlineCoordinates(range.first);
144  std::pair<unsigned int, unsigned int> end=offlineCoordinates(range.second);
145  return std::array<unsigned int,4>{ std::min(start.first, end.first), std::max(start.first, end.first)+1,
146  std::min(start.second, end.second), std::max(start.second,end.second)+1};
147  }
148  else {
149  std::pair<unsigned int, unsigned int> start=offlineCoordinates(range.first);
150  return std::array<unsigned int,4>{ start.first, start.first+1,
151  start.second, start.second+1 };
152  }
153  }
154 
155  static constexpr bool swapOfflineRowsColumns() { return false;}
156  private:
157 
158  unsigned short m_rows = 0;
159  unsigned short m_columns = 0;
160  };
161 }
162 #endif
InDet::ModuleKeyHelper< unsigned short, 12, 0, 0 >::getColumn
static constexpr unsigned short getColumn(unsigned short key)
Get the column index from a full key.
Definition: ModuleKeyHelper.h:94
InDet::StripModuleHelper::columnsPerCircuit
static constexpr unsigned int columnsPerCircuit()
Definition: StripModuleHelper.h:51
InDet::ModuleKeyHelper< unsigned short, 12, 0, 0 >::getRow
static constexpr unsigned short getRow(unsigned short key)
Get the row index from a full key.
Definition: ModuleKeyHelper.h:98
InDet::StripModuleHelper
Helper class to convert between offline column, row and hardware chip, column, row coordinates.
Definition: StripModuleHelper.h:21
InDet::StripModuleHelper::offlineCoordinates
std::pair< unsigned int, unsigned int > offlineCoordinates(unsigned int key) const
compute offline coordinates from "hardware" coordinates
Definition: StripModuleHelper.h:83
InDet::StripModuleHelper::nSensorColumns
unsigned int nSensorColumns() const
Number of offline columns aka.
Definition: StripModuleHelper.h:117
InDet::StripModuleHelper::circuitsPerRow
static constexpr unsigned int circuitsPerRow()
Definition: StripModuleHelper.h:54
SCT_ModuleSideDesign.h
InDetDD::SCT_ModuleSideDesign
Definition: SCT_ModuleSideDesign.h:40
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
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:13
InDet::StripModuleHelper::masks
std::array< unsigned int, N_MASKS > masks() const
Definition: StripModuleHelper.h:41
DeMoUpdate.column
dictionary column
Definition: DeMoUpdate.py:1110
keylayer_zslicemap.row
row
Definition: keylayer_zslicemap.py:155
InDet::StripModuleHelper::offlineRange
std::array< unsigned int, 4 > offlineRange(const std::pair< unsigned int, unsigned int > &range) const
Convenience function to return offline column and row ranges matching the defect-area of the given ke...
Definition: StripModuleHelper.h:137
InDet::StripModuleHelper::nElements
unsigned int nElements([[maybe_unused]] unsigned int mask_i) const
return the maximum number of unique mask (or group) defects per module.
Definition: StripModuleHelper.h:128
InDetDD::SCT_ModuleSideDesign::cells
int cells() const
number of readout stips within module side:
Definition: SCT_ModuleSideDesign.h:228
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
InDet::StripModuleHelper::nCells
unsigned int nCells() const
Return the total number strips of this module.
Definition: StripModuleHelper.h:112
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:92
InDet::StripModuleHelper::rowsPerCircuit
unsigned int rowsPerCircuit() const
Definition: StripModuleHelper.h:52
InDet::ModuleKeyHelper< unsigned short, 12, 0, 0 >::KEY_TYPE
unsigned short KEY_TYPE
Definition: ModuleKeyHelper.h:57
InDet::StripModuleHelper::m_columns
unsigned short m_columns
Definition: StripModuleHelper.h:159
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:194
InDet::ModuleKeyHelper< unsigned short, 12, 0, 0 >::getChip
static constexpr unsigned short getChip(unsigned short key)
Get the column index from a full key.
Definition: ModuleKeyHelper.h:110
InDet::StripModuleHelper::circuitsPerColumn
static constexpr unsigned int circuitsPerColumn()
Definition: StripModuleHelper.h:53
InDet::StripModuleHelper::swapOfflineRowsColumns
static constexpr bool swapOfflineRowsColumns()
Definition: StripModuleHelper.h:155
InDet::StripModuleHelper::getChipMask
static constexpr unsigned int getChipMask()
Definition: StripModuleHelper.h:28
InDet::StripModuleHelper::columnsPerMask
static constexpr unsigned int columnsPerMask([[maybe_unused]] unsigned int mask_idx)
Definition: StripModuleHelper.h:56
InDet::StripModuleHelper::StripModuleHelper
StripModuleHelper(const InDetDD::SiDetectorDesign &design)
Definition: StripModuleHelper.h:31
InDet::StripModuleHelper::nSensorRows
unsigned int nSensorRows() const
Number of offline rows aka.
Definition: StripModuleHelper.h:122
InDet::StripModuleHelper::N_MASKS
static constexpr unsigned int N_MASKS
Definition: StripModuleHelper.h:39
InDet::StripModuleHelper::m_rows
unsigned short m_rows
Definition: StripModuleHelper.h:158
InDet::StripModuleHelper::nMasks
static constexpr unsigned int nMasks()
Definition: StripModuleHelper.h:40
InDet::ModuleKeyHelper< unsigned short, 12, 0, 0 >::makeKey
static constexpr unsigned short 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::StripModuleHelper::columns
unsigned int columns() const
Definition: StripModuleHelper.h:49
InDet::StripModuleHelper::getStripMask
static constexpr unsigned int getStripMask()
Definition: StripModuleHelper.h:26
InDet::ModuleKeyHelper
Helper class to create keys for defects described by chip, column and row indices,...
Definition: ModuleKeyHelper.h:41
InDetDD::SiDetectorDesign
Definition: SiDetectorDesign.h:50
InDet::StripModuleHelper::rows
unsigned int rows() const
Definition: StripModuleHelper.h:50
InDet::StripModuleHelper::hardwareCoordinates
KEY_TYPE hardwareCoordinates(unsigned int row, unsigned int column) const
Compute "hardware" coordinates from offline coordinates.
Definition: StripModuleHelper.h:63
xAOD::bool
setBGCode setTAP setLVL2ErrorBits bool
Definition: TrigDecision_v1.cxx:60
InDet::ModuleKeyHelper< unsigned short, 12, 0, 0 >::getLimitRowMax
static constexpr unsigned short getLimitRowMax()
Get the maximum row value.
Definition: ModuleKeyHelper.h:102
ModuleKeyHelper.h
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37