ATLAS Offline Software
ITkPixelReadoutManager.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
11 
12 
13 namespace InDetDD
14 {
15 
16 namespace ITk
17 {
18 
20  ISvcLocator *svc)
21  : base_class(name, svc)
22 {
23 }
24 
25 
27 {
28  ATH_MSG_DEBUG("ITkPixelReadoutManager::initialize()");
29 
30  ATH_CHECK(m_detStore.retrieve());
31  ATH_CHECK(m_detStore->retrieve(m_detManager, m_detectorName.value()));
32  ATH_CHECK(m_detStore->retrieve(m_idHelper, m_pixelIDName.value()));
33 
34  return StatusCode::SUCCESS;
35 }
36 
37 
39 {
40  const Identifier wafer_id = m_idHelper->wafer_id(id);
41  const SiDetectorElement *element = m_detManager->getDetectorElement(wafer_id);
42  const PixelModuleDesign *p_design = static_cast<const PixelModuleDesign *>(&element->design());
44  ATH_MSG_ERROR("Non-RD53 readout technologies not supported!");
45  return PixelModuleType::NONE;
46  }
47 
48  if (m_idHelper->barrel_ec(id) == 0) {
50  }
51 
52  if (std::abs(m_idHelper->barrel_ec(id)) == 2) {
54  }
55 
56  return PixelModuleType::NONE;
57 }
58 
59 
61 {
62  const Identifier wafer_id = m_idHelper->wafer_id(id);
63  const SiDetectorElement *element = m_detManager->getDetectorElement(wafer_id);
64  const PixelModuleDesign *p_design = static_cast<const PixelModuleDesign *>(&element->design());
66  ATH_MSG_ERROR("Non-RD53 readout technologies not supported!");
68  }
69 
70  Identifier diodeId = id;
71  uint32_t col = getColumn(diodeId, wafer_id);
72  uint32_t row = getRow(diodeId, wafer_id);
73 
74  // ---------------------
75  // Get the pixel type
76  // ---------------------
77  unsigned int FEs = p_design->numberOfCircuits();
78  unsigned int rowsPerFE = p_design->rowsPerCircuit();
79  unsigned int columnsPerFE = p_design->columnsPerCircuit();
80 
81  if (FEs == 4) {
82  // long pixel row and columns
83  // 2 per row/column side
84  // TODO: avoid hardcoding this
85  if (row > rowsPerFE - 3 && col < columnsPerFE - 2) {
86  return PixelDiodeType::LONG;
87  }
88  if (col > columnsPerFE - 3 && row < rowsPerFE - 2) {
89  return PixelDiodeType::LONG;
90  }
91  // corner big pixels
92  if (row > rowsPerFE - 3 && col > columnsPerFE - 3) {
93  return PixelDiodeType::LARGE;
94  }
95  } else if (FEs != 1) {
96  ATH_MSG_WARNING("Module with a number of circuits which is not 1 or 4.");
97  ATH_MSG_WARNING("Long/pixel identification not implemented");
98  }
99 
100  return PixelDiodeType::NORMAL;
101 }
102 
103 
105  uint32_t FE,
106  uint32_t row,
107  uint32_t column) const
108 {
109  return getPixelId(m_idHelper->wafer_id(offlineIdHash), FE, row, column);
110 }
111 
112 
114  uint32_t FE,
115  uint32_t row,
116  uint32_t column) const
117 {
118  const SiDetectorElement *element = m_detManager->getDetectorElement(offlineId);
119  const PixelModuleDesign *p_design = static_cast<const PixelModuleDesign *>(&element->design());
121  ATH_MSG_ERROR("Non-RD53 readout technologies not supported!");
122  return {};
123  }
124 
125  unsigned int FEs = p_design->numberOfCircuits();
126  unsigned int FEsPerRow = p_design->numberOfCircuitsPerRow();
127  unsigned int rowsPerFE = p_design->rowsPerCircuit();
128  unsigned int columnsPerFE = p_design->columnsPerCircuit();
129 
130  // ---------------------
131  // Check input sanity
132  // ---------------------
133  if (row >= rowsPerFE || column >= columnsPerFE || FE >= FEs) {
134  ATH_MSG_DEBUG("Illegal pixel requested OfflineID: " << std::hex << offlineId << std::dec << " FE: " << FE << " row: " << row << " column: " << column);
135  ATH_MSG_DEBUG("Limits are: FE < " << FEs << ", row < " << rowsPerFE << ", column < " << columnsPerFE);
136  return {}; // illegal Identifier, standardized for PixelRodDecoder
137  }
138 
139  // ---------------------
140  // Convert row/column to eta/phi indices
141  // ---------------------
142  unsigned int phi_index{}, eta_index{};
143  if (FE >= 2) {
144  phi_index = 2 * rowsPerFE - 1 - row;
145  } else {
146  phi_index = row;
147  }
148  if (FE % 2 == 1) {
149  eta_index = 2 * columnsPerFE - 1 - column;
150  } else {
151  eta_index = column;
152  }
153 
154  // Identify the module type
155  PixelModuleType moduleType = getModuleType(offlineId);
156  if (moduleType == PixelModuleType::PIX_ENDCAP) {
157  // Swap phi_index for even endcap modules
158  int module_phi = m_idHelper->phi_module(offlineId);
159  if (module_phi % 2 == 0) {
160  phi_index = FEsPerRow * rowsPerFE - phi_index - 1;
161  ATH_MSG_DEBUG("Even disk module found, phi module: " << module_phi << " swapped phi index to : " << phi_index);
162  }
163  }
164 
165  return m_idHelper->pixel_id(offlineId, phi_index, eta_index);
166 }
167 
168 
170  Identifier offlineId) const
171 {
172  const SiDetectorElement *element = m_detManager->getDetectorElement(offlineId);
173  const PixelModuleDesign *p_design = static_cast<const PixelModuleDesign *>(&element->design());
175  ATH_MSG_ERROR("Non-RD53 readout technologies not supported!");
176  return 0xffffffff;
177  }
178 
179  unsigned int FEsPerRow = p_design->numberOfCircuitsPerRow();
180  unsigned int rowsPerFE = p_design->rowsPerCircuit();
181  unsigned int columnsPerFE = p_design->columnsPerCircuit();
182 
183  // ---------------------
184  // Set module properties
185  // ---------------------
186  unsigned int phi_index = m_idHelper->phi_index(diodeId);
187  unsigned int eta_index = m_idHelper->eta_index(diodeId);
188 
189  PixelModuleType moduleType = getModuleType(offlineId);
190  if (moduleType == PixelModuleType::PIX_ENDCAP) {
191  // Swap phi_index for even endcap modules
192  int module_phi = m_idHelper->phi_module(offlineId);
193  if (module_phi % 2 == 0) {
194  phi_index = FEsPerRow * rowsPerFE - phi_index - 1;
195  }
196  }
197 
198  // ---------------------
199  // Compute FE number
200  // ---------------------
201  // ITk has up to 4 FEs
202  unsigned int FErow = static_cast<unsigned int>(std::floor(phi_index / rowsPerFE));
203  unsigned int FEcol = static_cast<unsigned int>(std::floor(eta_index / columnsPerFE));
204  if (FErow > 0) {
205  return 2 + FEcol;
206  } else {
207  return FEcol;
208  }
209 }
210 
211 
213  Identifier offlineId) const
214 {
215  const SiDetectorElement *element = m_detManager->getDetectorElement(offlineId);
216  const PixelModuleDesign *p_design = static_cast<const PixelModuleDesign *>(&element->design());
218  ATH_MSG_ERROR("Non-RD53 readout technologies not supported!");
219  return 0xffffffff;
220  }
221 
222  unsigned int columnsPerFE = p_design->columnsPerCircuit();
223  unsigned int eta_index = m_idHelper->eta_index(diodeId);
224 
225  // ---------------------
226  // Convert eta index to column number
227  // ---------------------
228  unsigned int column{};
229  if (eta_index >= columnsPerFE) {
230  column = 2 * columnsPerFE - eta_index - 1;
231  } else {
232  column = eta_index;
233  }
234 
235  // ---------------------
236  // Check output sanity
237  // ---------------------
238  if (column >= columnsPerFE) {
239  ATH_MSG_ERROR("Computed column number exceeds maximum value: col = " << column << " (max = " << columnsPerFE << ")");
240  return 0xffffffff;
241  }
242 
243  return column;
244 }
245 
246 
248  Identifier offlineId) const
249 {
250  const SiDetectorElement *element = m_detManager->getDetectorElement(offlineId);
251  const PixelModuleDesign *p_design = static_cast<const PixelModuleDesign *>(&element->design());
253  ATH_MSG_ERROR("Non-RD53 readout technologies not supported!");
254  return 0xffffffff;
255  }
256 
257  unsigned int FEsPerRow = p_design->numberOfCircuitsPerRow();
258  unsigned int rowsPerFE = p_design->rowsPerCircuit();
259  unsigned int phi_index = m_idHelper->phi_index(diodeId);
260 
261  // Identify the module type
262  PixelModuleType moduleType = getModuleType(offlineId);
263  if (moduleType == PixelModuleType::PIX_ENDCAP) {
264  // Swap phi_index for even endcap modules
265  int module_phi = m_idHelper->phi_module(offlineId);
266  if (module_phi % 2 == 0) {
267  phi_index = FEsPerRow * rowsPerFE - phi_index - 1;
268  }
269  }
270 
271  // ---------------------
272  // Convert phi index to row number
273  // ---------------------
274  unsigned int row{};
275  if (phi_index >= rowsPerFE) {
276  row = 2 * rowsPerFE - phi_index - 1;
277  } else {
278  row = phi_index;
279  }
280 
281  // ---------------------
282  // Check output sanity
283  // ---------------------
284  if (row >= rowsPerFE) {
285  ATH_MSG_ERROR("Computed row number exceeds maximum value: row = " << row << "(max = " << rowsPerFE << ")");
286  return 0xffffffff;
287  }
288 
289  return row;
290 }
291 
292 } // namespace ITk
293 } // namespace InDetDD
PixelID.h
This is an Identifier helper class for the Pixel subdetector. This class is a factory for creating co...
InDetDD::ITk::PixelReadoutManager::getPixelId
virtual Identifier getPixelId(Identifier offlineId, uint32_t FE, uint32_t row, uint32_t column) const override final
Definition: ITkPixelReadoutManager.cxx:113
query_example.row
row
Definition: query_example.py:24
PixelID::phi_index
int phi_index(const Identifier &id) const
Definition: PixelID.h:658
InDetDD::PixelModuleDesign
Definition: PixelModuleDesign.h:48
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
PixelID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: PixelID.h:619
InDetDD::ITk::PixelReadoutManager::getPixelIdfromHash
virtual Identifier getPixelIdfromHash(IdentifierHash offlineIdHash, uint32_t FE, uint32_t row, uint32_t column) const override final
Definition: ITkPixelReadoutManager.cxx:104
InDetDD::PixelDiodeType
PixelDiodeType
Definition: PixelReadoutDefinitions.h:20
InDetDD::ITk::PixelReadoutManager::getModuleType
virtual PixelModuleType getModuleType(Identifier id) const override final
Definition: ITkPixelReadoutManager.cxx:38
DeMoUpdate.column
dictionary column
Definition: DeMoUpdate.py:1110
InDetDD::ITk::PixelReadoutManager::m_idHelper
const PixelID * m_idHelper
Definition: ITkPixelReadoutManager.h:54
PixelID::wafer_id
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module) const
For a single crystal.
Definition: PixelID.h:364
InDetDD::PixelReadoutTechnology::RD53
@ RD53
InDetDD::ITk::PixelReadoutManager::m_detManager
const PixelDetectorManager * m_detManager
Definition: ITkPixelReadoutManager.h:53
InDetDD::PixelModuleType::NONE
@ NONE
InDetDD::ITk::PixelReadoutManager::initialize
virtual StatusCode initialize() override final
Definition: ITkPixelReadoutManager.cxx:26
PixelDetectorManager.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
InDetDD::PixelDiodeType::LONG
@ LONG
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
InDetDD::PixelModuleDesign::numberOfCircuits
int numberOfCircuits() const
Total number of circuits:
Definition: PixelModuleDesign.h:297
InDetDD::ITk::PixelReadoutManager::m_detectorName
Gaudi::Property< std::string > m_detectorName
Definition: ITkPixelReadoutManager.h:57
InDetDD::ITk::PixelReadoutManager::m_detStore
ServiceHandle< StoreGateSvc > m_detStore
Definition: ITkPixelReadoutManager.h:51
PixelID::eta_index
int eta_index(const Identifier &id) const
Definition: PixelID.h:664
InDetDD::PixelDiodeType::LARGE
@ LARGE
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
InDetDD::PixelModuleType
PixelModuleType
Definition: PixelReadoutDefinitions.h:11
Handler::svc
AthROOTErrorHandlerSvc * svc
Definition: AthROOTErrorHandlerSvc.cxx:10
createCablingJSON.eta_index
int eta_index
Definition: createCablingJSON.py:9
ITkPixelReadoutManager.h
InDetDD::PixelModuleDesign::numberOfCircuitsPerRow
int numberOfCircuitsPerRow() const
Number of circuits per row:
Definition: PixelModuleDesign.h:307
ITk
Definition: ITkPixelOfflineCalibCondAlg.cxx:14
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:191
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
InDetDD::ITk::PixelReadoutManager::getColumn
virtual uint32_t getColumn(Identifier diodeId, Identifier offlineId) const override final
Definition: ITkPixelReadoutManager.cxx:212
InDetDD::PixelModuleDesign::getReadoutTechnology
PixelReadoutTechnology getReadoutTechnology() const
Definition: PixelModuleDesign.h:368
query_example.col
col
Definition: query_example.py:7
SiDetectorElement.h
InDetDD::ITk::PixelReadoutManager::getRow
virtual uint32_t getRow(Identifier diodeId, Identifier offlineId) const override final
Definition: ITkPixelReadoutManager.cxx:247
InDetDD::ITk::PixelReadoutManager::getDiodeType
virtual PixelDiodeType getDiodeType(Identifier id) const override final
Definition: ITkPixelReadoutManager.cxx:60
InDetDD::PixelModuleType::PIX_ENDCAP
@ PIX_ENDCAP
InDetDD::ITk::PixelReadoutManager::getFE
virtual uint32_t getFE(Identifier diodeId, Identifier offlineId) const override final
Definition: ITkPixelReadoutManager.cxx:169
InDetDD::PixelModuleDesign::rowsPerCircuit
int rowsPerCircuit() const
Number of cell rows per circuit:
Definition: PixelModuleDesign.h:317
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
InDetDD
Message Stream Member.
Definition: FakeTrackBuilder.h:8
PixelModuleDesign.h
InDetDD::ITk::PixelReadoutManager::m_pixelIDName
Gaudi::Property< std::string > m_pixelIDName
Definition: ITkPixelReadoutManager.h:59
PixelID::pixel_id
Identifier pixel_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int phi_index, int eta_index) const
For an individual pixel.
Definition: PixelID.h:432
InDetDD::PixelDiodeType::NORMAL
@ NORMAL
IdentifierHash
Definition: IdentifierHash.h:38
InDetDD::PixelModuleType::PIX_BARREL
@ PIX_BARREL
InDetDD::SiDetectorElement::design
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
PixelID::phi_module
int phi_module(const Identifier &id) const
Definition: PixelID.h:644
InDetDD::PixelModuleDesign::columnsPerCircuit
int columnsPerCircuit() const
Number of cell columns per circuit:
Definition: PixelModuleDesign.h:312
InDetDD::ITk::PixelReadoutManager::PixelReadoutManager
PixelReadoutManager(const std::string &name, ISvcLocator *svc)
Definition: ITkPixelReadoutManager.cxx:19
InDetDD::PixelDetectorManager::getDetectorElement
virtual SiDetectorElement * getDetectorElement(const Identifier &id) const override
access to individual elements : via Identifier
Definition: PixelDetectorManager.cxx:80