ATLAS Offline Software
Public Member Functions | Private Attributes | List of all members
InDetDD::ITk::PixelReadoutManager Class Referencefinal

#include <ITkPixelReadoutManager.h>

Inheritance diagram for InDetDD::ITk::PixelReadoutManager:
Collaboration diagram for InDetDD::ITk::PixelReadoutManager:

Public Member Functions

 PixelReadoutManager (const std::string &name, ISvcLocator *svc)
 
virtual StatusCode initialize () override final
 
virtual PixelModuleType getModuleType (Identifier id) const override final
 
virtual PixelDiodeType getDiodeType (Identifier id) const override final
 
virtual Identifier getPixelIdfromHash (IdentifierHash offlineIdHash, uint32_t FE, uint32_t row, uint32_t column) const override final
 
virtual Identifier getPixelId (Identifier offlineId, uint32_t FE, uint32_t row, uint32_t column) const override final
 
virtual uint32_t getFE (Identifier diodeId, Identifier offlineId) const override final
 
virtual uint32_t getColumn (Identifier diodeId, Identifier offlineId) const override final
 
virtual uint32_t getRow (Identifier diodeId, Identifier offlineId) const override final
 

Private Attributes

ServiceHandle< StoreGateSvcm_detStore {this, "DetectorStore", "DetectorStore"}
 
const PixelDetectorManagerm_detManager {}
 
const PixelIDm_idHelper {}
 
Gaudi::Property< std::string > m_detectorName {this, "DetectorName", "ITkPixel", "Pixel detector name"}
 
Gaudi::Property< std::string > m_pixelIDName {this, "PixelIDName", "PixelID", "Pixel ID name"}
 

Detailed Description

Definition at line 23 of file ITkPixelReadoutManager.h.

Constructor & Destructor Documentation

◆ PixelReadoutManager()

InDetDD::ITk::PixelReadoutManager::PixelReadoutManager ( const std::string &  name,
ISvcLocator *  svc 
)

Definition at line 19 of file ITkPixelReadoutManager.cxx.

21  : base_class(name, svc)
22 {
23 }

Member Function Documentation

◆ getColumn()

uint32_t InDetDD::ITk::PixelReadoutManager::getColumn ( Identifier  diodeId,
Identifier  offlineId 
) const
finaloverridevirtual

Definition at line 212 of file ITkPixelReadoutManager.cxx.

214 {
215  const SiDetectorElement *element = m_detManager->getDetectorElement(offlineId);
216  const PixelModuleDesign *p_design = static_cast<const PixelModuleDesign *>(&element->design());
217  if (p_design->getReadoutTechnology() != PixelReadoutTechnology::RD53) {
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 }

◆ getDiodeType()

PixelDiodeType InDetDD::ITk::PixelReadoutManager::getDiodeType ( Identifier  id) const
finaloverridevirtual

Definition at line 60 of file ITkPixelReadoutManager.cxx.

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());
65  if (p_design->getReadoutTechnology() != PixelReadoutTechnology::RD53) {
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 }

◆ getFE()

uint32_t InDetDD::ITk::PixelReadoutManager::getFE ( Identifier  diodeId,
Identifier  offlineId 
) const
finaloverridevirtual

Definition at line 169 of file ITkPixelReadoutManager.cxx.

171 {
172  const SiDetectorElement *element = m_detManager->getDetectorElement(offlineId);
173  const PixelModuleDesign *p_design = static_cast<const PixelModuleDesign *>(&element->design());
174  if (p_design->getReadoutTechnology() != PixelReadoutTechnology::RD53) {
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 }

◆ getModuleType()

PixelModuleType InDetDD::ITk::PixelReadoutManager::getModuleType ( Identifier  id) const
finaloverridevirtual

Definition at line 38 of file ITkPixelReadoutManager.cxx.

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());
43  if (p_design->getReadoutTechnology() != PixelReadoutTechnology::RD53) {
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 }

◆ getPixelId()

Identifier InDetDD::ITk::PixelReadoutManager::getPixelId ( Identifier  offlineId,
uint32_t  FE,
uint32_t  row,
uint32_t  column 
) const
finaloverridevirtual

Definition at line 113 of file ITkPixelReadoutManager.cxx.

117 {
118  const SiDetectorElement *element = m_detManager->getDetectorElement(offlineId);
119  const PixelModuleDesign *p_design = static_cast<const PixelModuleDesign *>(&element->design());
120  if (p_design->getReadoutTechnology() != PixelReadoutTechnology::RD53) {
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 }

◆ getPixelIdfromHash()

Identifier InDetDD::ITk::PixelReadoutManager::getPixelIdfromHash ( IdentifierHash  offlineIdHash,
uint32_t  FE,
uint32_t  row,
uint32_t  column 
) const
finaloverridevirtual

Definition at line 104 of file ITkPixelReadoutManager.cxx.

108 {
109  return getPixelId(m_idHelper->wafer_id(offlineIdHash), FE, row, column);
110 }

◆ getRow()

uint32_t InDetDD::ITk::PixelReadoutManager::getRow ( Identifier  diodeId,
Identifier  offlineId 
) const
finaloverridevirtual

Definition at line 247 of file ITkPixelReadoutManager.cxx.

249 {
250  const SiDetectorElement *element = m_detManager->getDetectorElement(offlineId);
251  const PixelModuleDesign *p_design = static_cast<const PixelModuleDesign *>(&element->design());
252  if (p_design->getReadoutTechnology() != PixelReadoutTechnology::RD53) {
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 }

◆ initialize()

StatusCode InDetDD::ITk::PixelReadoutManager::initialize ( )
finaloverridevirtual

Definition at line 26 of file ITkPixelReadoutManager.cxx.

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 }

Member Data Documentation

◆ m_detectorName

Gaudi::Property<std::string> InDetDD::ITk::PixelReadoutManager::m_detectorName {this, "DetectorName", "ITkPixel", "Pixel detector name"}
private

Definition at line 56 of file ITkPixelReadoutManager.h.

◆ m_detManager

const PixelDetectorManager* InDetDD::ITk::PixelReadoutManager::m_detManager {}
private

Definition at line 53 of file ITkPixelReadoutManager.h.

◆ m_detStore

ServiceHandle<StoreGateSvc> InDetDD::ITk::PixelReadoutManager::m_detStore {this, "DetectorStore", "DetectorStore"}
private

Definition at line 51 of file ITkPixelReadoutManager.h.

◆ m_idHelper

const PixelID* InDetDD::ITk::PixelReadoutManager::m_idHelper {}
private

Definition at line 54 of file ITkPixelReadoutManager.h.

◆ m_pixelIDName

Gaudi::Property<std::string> InDetDD::ITk::PixelReadoutManager::m_pixelIDName {this, "PixelIDName", "PixelID", "Pixel ID name"}
private

Definition at line 58 of file ITkPixelReadoutManager.h.


The documentation for this class was generated from the following files:
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
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::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
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
InDetDD::PixelDiodeType::LONG
@ LONG
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
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
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:194
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
InDetDD::ITk::PixelReadoutManager::getColumn
virtual uint32_t getColumn(Identifier diodeId, Identifier offlineId) const override final
Definition: ITkPixelReadoutManager.cxx:212
query_example.col
col
Definition: query_example.py:7
InDetDD::ITk::PixelReadoutManager::getRow
virtual uint32_t getRow(Identifier diodeId, Identifier offlineId) const override final
Definition: ITkPixelReadoutManager.cxx:247
InDetDD::PixelModuleType::PIX_ENDCAP
@ PIX_ENDCAP
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
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
InDetDD::PixelModuleType::PIX_BARREL
@ PIX_BARREL
PixelID::phi_module
int phi_module(const Identifier &id) const
Definition: PixelID.h:644
InDetDD::PixelDetectorManager::getDetectorElement
virtual SiDetectorElement * getDetectorElement(const Identifier &id) const override
access to individual elements : via Identifier
Definition: PixelDetectorManager.cxx:80