ATLAS Offline Software
Loading...
Searching...
No Matches
ITkPixelDecodingAlg.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef ITKPIXEL_DECODINGALG_H
6#define ITKPIXEL_DECODINGALG_H
7
10#include "GaudiKernel/MsgStream.h"
14#include "Identifier/Identifier.h"
18#include "itksw/pix/endec/DecCore.hpp"
19#include <chrono>
20
21
28
30{
31 public:
32
33 ITkPixelDecodingAlg(const std::string &name, ISvcLocator *pSvcLocator);
34
35 virtual StatusCode initialize() override;
36
37 virtual StatusCode execute (const EventContext& ctx) const override;
38
39 virtual StatusCode finalize() override;
40
41
42 private:
43
44 typedef std::vector< std::vector<uint32_t >> ITkPacketCollection;
45
46 ServiceHandle<IROBDataProviderSvc> m_robDataProviderSvc{ this, "ROBDataProvider", "ROBDataProviderSvc" };
47
48 SG::ReadCondHandleKey<ITkPixelCablingData> m_pixelCablingKey{this, "PixelCablingKey", "ITkPixelCablingData", "Cond Key of Pixel Cabling"};
49
50 SG::WriteHandleKey<PixelRDO_Container> m_pixelRDOKey{this, "pixelRDOKey", "ITkPixelRDOs", "StoreGate Key of Pixel RDOs"};
51
52 std::vector<uint32_t> m_sourceIDs;
53
55
56};
57
59 struct ScopedTimer {
60 std::string m_label;
61 std::chrono::time_point<std::chrono::high_resolution_clock> m_start;
62 MsgStream& m_msg_source;
63
64 ScopedTimer(std::string lbl, MsgStream& src) : m_label(std::move(lbl)), m_start(std::chrono::high_resolution_clock::now()), m_msg_source(src) {}
66 auto end = std::chrono::high_resolution_clock::now();
67 auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - m_start).count();
68 m_msg_source << MSG::DEBUG << m_label << " took " << ms << " ms" << endmsg;
69 }
70
71 };
72}
73
75 //Forms pixel RDOs from the decoded hits & fills them into a container
77
78 public:
79 explicit RDOCallback(PixelRDO_Container* rdoContainer, const PixelID* idHelper, MsgStream& msg_source) :
80 m_rdoContainer(rdoContainer),
81 m_idHelper(idHelper),
82 m_msg_source(msg_source)
83 {};
84
85 ~RDOCallback() = default;
86
87 //non-negotiable concepts
88 inline void evt_init([[maybe_unused]] uint8_t tag) {
90 const auto waferHash = m_idHelper->wafer_hash(m_identifier);
91 if (m_rdoContainer->indexFind(waferHash) == m_rdoContainer->end()){
92 m_rdoCollection = std::make_unique<PixelRDO_Collection>(waferHash);
93 m_rdoCollection->setIdentifier(m_identifier);
94 m_rdoCollection->reserve(1000);
95 }
96 else {
97 m_rdoCollection.reset(m_rdoContainer->removeCollection(waferHash));
98 }
99
100 };
101
102 inline void evt_next([[maybe_unused]] uint8_t tag) {};
103
104 inline void evt_done() {
105 m_rdoContainer->addCollection(m_rdoCollection.release(), m_idHelper->wafer_hash(m_identifier)).ignore();
106 m_msg_source << MSG::DEBUG << "evt_done nRDOs=" << m_n_rdos << endmsg;
107 };
108
109 inline void add_hit(uint16_t col, uint16_t row, uint16_t tot){
110 //Translate the col, row into module coordinates
112 m_rdoCollection->emplace_back(new Pixel1RawData(m_idHelper->pixel_id(m_identifier, row, col), tot, 0, 0, 0));
113 ++m_n_rdos;
114 };
115
116 inline void add_hmap([[maybe_unused]] uint8_t qcol, [[maybe_unused]] uint8_t qrow, [[maybe_unused]] uint16_t hmap, [[maybe_unused]] uint64_t tots) {};
117
118 inline void add_qcore([[maybe_unused]] uint8_t qcol, [[maybe_unused]] uint8_t qrow, [[maybe_unused]] uint64_t qtot) {};
119
120 inline uint8_t on_error([[maybe_unused]] itksw::pix::endec::intf::EventError error) {return 0;};
121 //end of non-negotiable concepts
122
123 //extra members
124
125 //this is needed to properly identify the module.
126 inline void setOfflineID(const uint32_t& offlineID){
127 m_offlineID = offlineID;
128 };
129
130 //this is needed to properly translate hits on a quad
131 inline void setChipID(const uint8_t& chipID){
132 m_chipID = chipID;
133 }
134
135 //translate
137 m_transform = transform;
138 }
139
140 private:
142 uint32_t m_offlineID = 0;
143 uint8_t m_chipID = 0;
146 std::unique_ptr<PixelRDO_Collection> m_rdoCollection;
147 uint32_t m_n_rdos = 0;
149 MsgStream& m_msg_source;
150 };
151
152 //This prints the decoded hits on the screen,
153 //useful for testing purposes
155 public:
156 TestEventCallback(MsgStream& src): m_msg_source(src) {};
158
159 inline void evt_init(uint8_t tag) {
160 m_msg_source << MSG::DEBUG << "evt_init(" << tag << ")" << std::endl;
161 }
162
163 inline void evt_next(uint8_t tag) {
164 m_msg_source << MSG::DEBUG << "evt_next(" << tag << ")" << std::endl;
165 }
166
167 inline void evt_done() {
168 m_msg_source << MSG::DEBUG << "evt_done()" << std::endl;
169 }
170
171 inline void add_hit(uint16_t col, uint16_t row, uint16_t tot) {
172 m_msg_source << MSG::DEBUG << "add_hit(" << col << "," << row << "," << tot << ")" << std::endl;
173 }
174
175 inline void add_hmap(uint8_t qcol, uint8_t qrow, uint16_t hmap, uint64_t tots) {
176 m_msg_source << MSG::DEBUG << "add_hmap(qcol=" << qcol << ",qrow=" << qrow
177 << ",hmap=" << hmap << ",tots=" << tots << ")" << std::endl;
178 }
179
180 inline void add_qcore(uint8_t qcol, uint8_t qrow, uint64_t qtot) {
181 m_msg_source << MSG::DEBUG << "add_qcore(qcol=" << qcol << ",qrow=" << qrow
182 << ",qtot=" << qtot << ")" << std::endl;
183 }
184
185 inline uint8_t on_error(itksw::pix::endec::intf::EventError error) {
186 m_msg_source << MSG::DEBUG << "on_error(" << error.code << ")" << std::endl;
187 return 0;
188 }
189
190 MsgStream& m_msg_source;
191
192 };
193}
194
195
196#endif
197
#define endmsg
This is an Identifier helper class for the Pixel subdetector.
InDetRawDataContainer< InDetRawDataCollection< PixelRDORawData > > PixelRDO_Container
Property holding a SG store/key/clid from which a ReadHandle is made.
An algorithm that can be simultaneously executed in multiple threads.
virtual StatusCode initialize() override
ServiceHandle< IROBDataProviderSvc > m_robDataProviderSvc
std::vector< uint32_t > m_sourceIDs
virtual StatusCode finalize() override
virtual StatusCode execute(const EventContext &ctx) const override
SG::WriteHandleKey< PixelRDO_Container > m_pixelRDOKey
const PixelID * m_idHelper
SG::ReadCondHandleKey< ITkPixelCablingData > m_pixelCablingKey
std::vector< std::vector< uint32_t > > ITkPacketCollection
ITkPixelDecodingAlg(const std::string &name, ISvcLocator *pSvcLocator)
void add_hmap(uint8_t qcol, uint8_t qrow, uint16_t hmap, uint64_t tots)
RDOCallback(PixelRDO_Container *rdoContainer, const PixelID *idHelper, MsgStream &msg_source)
uint8_t on_error(itksw::pix::endec::intf::EventError error)
PixelRDO_Container * m_rdoContainer
ITkPixelCabling::TransformType m_transform
void add_hit(uint16_t col, uint16_t row, uint16_t tot)
void setChipID(const uint8_t &chipID)
void setOfflineID(const uint32_t &offlineID)
void setTransformType(const ITkPixelCabling::TransformType &transform)
void add_qcore(uint8_t qcol, uint8_t qrow, uint64_t qtot)
std::unique_ptr< PixelRDO_Collection > m_rdoCollection
void add_hit(uint16_t col, uint16_t row, uint16_t tot)
void add_hmap(uint8_t qcol, uint8_t qrow, uint16_t hmap, uint64_t tots)
uint8_t on_error(itksw::pix::endec::intf::EventError error)
void add_qcore(uint8_t qcol, uint8_t qrow, uint64_t qtot)
This is an Identifier helper class for the Pixel subdetector.
Definition PixelID.h:69
Property holding a SG store/key/clid from which a WriteHandle is made.
static void chipToModuleTransform(const TransformType &transform, const uint8_t &chipID, uint16_t &col, uint16_t &row)
STL namespace.
ScopedTimer(std::string lbl, MsgStream &src)
std::chrono::time_point< std::chrono::high_resolution_clock > m_start