ATLAS Offline Software
ITkPixelHitSortingTool.cxx
Go to the documentation of this file.
1 /*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
12 #include "ITkPixel1RawData.h"
14 #include "ITkPixelRDO_Container.h"
16 
17 
18 #include <map>
19 
20 
21 ITkPixelHitSortingTool::ITkPixelHitSortingTool(const std::string& type,const std::string& name,const IInterface* parent) :
23  m_pixelReadout(this, "PixelReadoutManager", "ITkPixelReadoutManager", "Pixel readout manager")
24 {
25  //not much to construct as of now
26 }
27 
28 
30  ATH_CHECK(m_pixelReadout.retrieve());
31  ATH_CHECK(detStore()->retrieve(m_pixIdHelper, "PixelID"));
32  ATH_CHECK(detStore()->retrieve(m_detManager, "ITkPixel"));
33  return StatusCode::SUCCESS;
34 }
35 
36 template<class ContainerType>
37 std::map<ITkPixelOnlineId, ITkPixLayout<uint16_t>> ITkPixelHitSortingTool::sortRDOHits(const ContainerType* rdoContainer, const ITkPixelCablingData* cabling) const {
38 
39  std::map<ITkPixelOnlineId, ITkPixLayout<uint16_t>> EventHitMaps;
40 
41  for(const auto& RDO_Collection : *rdoContainer){
42 
43  for(const auto *const rdo : *RDO_Collection) {
44 
45  const Identifier rdoID = rdo->identify();
46  const Identifier waferID = m_pixIdHelper->wafer_id(rdoID);
47 
48  const uint16_t tot = rdo->getToT();
49  const uint32_t chip = m_pixelReadout->getFE( rdoID, waferID);
50  uint32_t col = m_pixelReadout->getColumn( rdoID, waferID);
51  uint32_t row = m_pixelReadout->getRow( rdoID, waferID);
52 
53  //find out if we're dealing with 25x100 sensors
55  const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign *>(&element->design());
56  const uint nChips = p_design->numberOfCircuits();
57  const uint rowsPerFE = p_design->rowsPerCircuit();
58  const uint colsPerFE = p_design->columnsPerCircuit();
59  bool is25x100 = rowsPerFE == 768 && colsPerFE == 200;
60  ATH_MSG_DEBUG("Module specs: nChips = " << nChips << ", rows per FE = " << rowsPerFE << " cols per FE = " << colsPerFE);
61 
62  if (is25x100){
63  //The bonding pattern as understood at the time of writing this code is
64  //that odd sensor rows (with even indices if numbered from 0) are bonded to the left and even (= odd indices) to the right.
65  col = 2 * col + (row + 1)% 2;
66  row = row / 2;
67  ATH_MSG_DEBUG("Adding hit from 25x100 pixel");
68  }
69  else if (colsPerFE == 384 && rowsPerFE == 400){
70  //R0 EC modules are 90 degrees rotated, the readout manager doesn't know about it
71  std::swap(col, row);
72  ATH_MSG_DEBUG("Rotated chip - swapping col and row");
73  }
74 
75  // Store ToT+1, reserve 0 for no hit.
76  // ITkPixelOnlineId onlineID = m_cablingHelper.onlineId(rdoID); To be used when cabling helper is implemented
77  // HitMap and encoder labels rows/cols from 0
78 
79  //Extract the online 'base' from cabling. Last two bits are reserved
80  //for chip ID.
81  ITkPixelCabling::ModuleInfo mi = cabling->onlineModuleInfo(waferID);
82  //auto onlineID = (waferID.get_identifier32().get_compact() << 2 ) | chip;
83  auto onlineID = (uint32_t)mi.id | chip;
84 
85  ATH_MSG_DEBUG(" Chip: " << std::hex << onlineID << std::dec << " ID: " << chip << " col: " << col << " row: " << row << " ToT: " << tot << " eta_index = " << m_pixIdHelper->eta_index(rdoID) << " phi index = " << m_pixIdHelper->phi_index(rdoID) << " rowsPerFE = " << rowsPerFE << " colsPerFE = " << colsPerFE << "\n");
86 
87  EventHitMaps[onlineID](col, row) = tot + 1;
88 
89  };
90  };
91 
92  return EventHitMaps;
93 
94 }
95 
96 template std::map<ITkPixelOnlineId, ITkPixLayout<uint16_t>> ITkPixelHitSortingTool::sortRDOHits<ITkPixelRDO_Container>(const ITkPixelRDO_Container* rdoContainer, const ITkPixelCablingData* cabling) const;
97 template std::map<ITkPixelOnlineId, ITkPixLayout<uint16_t>> ITkPixelHitSortingTool::sortRDOHits<PixelRDO_Container>(const PixelRDO_Container* rdoContainer, const ITkPixelCablingData* cabling) const;
98 /*
99 template<class ContainerType, class RDOType>
100 StatusCode ITkPixelHitSortingTool::createRDO(std::map<ITkPixelOnlineId, HitMap> &EventHitMaps, ContainerType *rdoContainer) const {
101  //this is VERY preliminary/experimental.
102  //Testing purposes only at this point, will certainly change.
103  //Using current ID inspiration, adapted so that no compilation
104  //warnings arise. All values are dummy and no functionality is expected
105  //at this point.
106 
107  typedef InDetRawDataCollection< InDetRawData > PixelRawCollection;
108 
109  for (const auto& entry : EventHitMaps) {
110 
111  // Will have to conver onlineId to offlineIdHash, for now keeping it the same
112  // since we don't have cabling
113  const uint offlineIdHash = (uint)entry.first; // temp
114  PixelRawCollection* coll = new PixelRawCollection (offlineIdHash);
115 
116  ATH_CHECK( rdoContainer->fetchOrCreate(offlineIdHash) );//Returns null if not present -- this was used in PixelRODDecoder but compiler says it's not thread safe
117 
118  // get identifier from the hash, this is not nice
119  Identifier ident = m_pixIdHelper->wafer_id(offlineIdHash);
120  // set the Identifier to be nice to downstream clients
121  coll->setIdentifier(ident);
122 
123  StatusCode sc = rdoContainer->addCollection(coll, offlineIdHash);
124  ATH_MSG_DEBUG("Adding " << offlineIdHash);
125  if (sc.isFailure()){
126  ATH_MSG_ERROR("failed to add Pixel RDO collection to container" );
127 
128 
129 
130  const Identifier pixelId;
131  const unsigned int mToT = 0xFFFF;
132  const unsigned int mBCID = 0xFFFF;
133  const unsigned int mLVL1ID = 0xFFFF;
134  const unsigned int mLVL1A = 0xFFFF;
135 
136  coll->push_back(new RDOType(pixelId, mToT, mBCID, mLVL1ID, mLVL1A));
137  }
138  }
139  return StatusCode::SUCCESS;
140 }
141 
142 template StatusCode ITkPixelHitSortingTool::createRDO<ITkPixelRDO_Container, ITkPixel1RawData>(std::map<ITkPixelOnlineId, HitMap> &EventHitMaps, ITkPixelRDO_Container *rdoContainer) const;
143 template StatusCode ITkPixelHitSortingTool::createRDO<PixelRDO_Container, Pixel1RawData>(std::map<ITkPixelOnlineId, HitMap> &EventHitMaps, PixelRDO_Container *rdoContainer) const;
144 */
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
PixelID.h
This is an Identifier helper class for the Pixel subdetector. This class is a factory for creating co...
ITkPixelHitSortingTool.h
PixelID::phi_index
int phi_index(const Identifier &id) const
Definition: PixelID.h:654
ITkPixelCablingData.h
InDetDD::PixelModuleDesign
Definition: PixelModuleDesign.h:45
ITkPixelHitSortingTool::m_pixelReadout
ServiceHandle< InDetDD::IPixelReadoutManager > m_pixelReadout
Definition: ITkPixelHitSortingTool.h:48
ITkPixelHitSortingTool::initialize
StatusCode initialize()
Definition: ITkPixelHitSortingTool.cxx:29
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
ITkPixelHitSortingTool::m_pixIdHelper
const PixelID * m_pixIdHelper
Definition: ITkPixelHitSortingTool.h:50
keylayer_zslicemap.row
row
Definition: keylayer_zslicemap.py:155
ITkPixel1RawData.h
InDetRawDataContainer
Definition: InDetRawDataContainer.h:27
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
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:360
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
uint
unsigned int uint
Definition: LArOFPhaseFill.cxx:20
PixelDetectorManager.h
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:93
ITkPixelRDO_Container.h
PixelRDORawData.h
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:306
Pixel1RawData.h
test_pyathena.parent
parent
Definition: test_pyathena.py:15
PixelID::eta_index
int eta_index(const Identifier &id) const
Definition: PixelID.h:660
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
ITkPixelHitSortingTool::sortRDOHits
std::map< ITkPixelOnlineId, HitMap > sortRDOHits(const ContainerType *rdoContainer, const ITkPixelCablingData *cabling) const
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
ITkPixelCablingData
Definition: ITkPixelCablingData.h:105
PixelCalibrationConfig.tot
tot
Definition: PixelCalibrationConfig.py:28
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
ITkPixelCabling::ModuleInfo
Definition: ITkPixelCablingData.h:49
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
PixelRDO_Container.h
SiDetectorElement.h
InDetDD::PixelModuleDesign::rowsPerCircuit
int rowsPerCircuit() const
Number of cell rows per circuit:
Definition: PixelModuleDesign.h:326
PixelModuleDesign.h
ITkPixelHitSortingTool::m_detManager
const InDetDD::PixelDetectorManager * m_detManager
Definition: ITkPixelHitSortingTool.h:52
InDetDD::PixelDetectorManager::getDetectorElement
virtual const SiDetectorElement * getDetectorElement(const Identifier &id) const override
access to individual elements : via Identifier
Definition: PixelDetectorManager.cxx:80
AthAlgTool
Definition: AthAlgTool.h:26
InDetDD::SiDetectorElement::design
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
ITkPixelHitSortingTool::ITkPixelHitSortingTool
ITkPixelHitSortingTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: ITkPixelHitSortingTool.cxx:21
InDetDD::PixelModuleDesign::columnsPerCircuit
int columnsPerCircuit() const
Number of cell columns per circuit:
Definition: PixelModuleDesign.h:321
ITkPixelCabling::ModuleInfo::id
ID id
Definition: ITkPixelCablingData.h:50
Identifier
Definition: IdentifierFieldParser.cxx:14