ATLAS Offline Software
Loading...
Searching...
No Matches
InDetEventCnvTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include "Identifier/Identifier.h"
13
16
20#include "IdDict/IdDictMgr.h"
21
28
29#include <vector>
30#include <cassert>
31#include <iostream>
32
34 const std::string& n,
35 const IInterface* p )
36 :
37 base_class(t,n,p),
39 m_IDHelper(nullptr),
40 m_pixelHelper(nullptr),
41 m_SCTHelper(nullptr),
42 m_TRTHelper(nullptr),
43 m_idDictMgr(nullptr)
44{
45 declareProperty("RecreatePRDLinks", m_setPrepRawDataLink);
46
47}
48
50
51 StatusCode sc = AthAlgTool::initialize();
52 if (sc.isFailure()) return sc;
53
54 ATH_CHECK(detStore()->retrieve(m_idDictMgr, "IdDict")) ;
55
56 const IdDictDictionary* dict = m_idDictMgr->manager()->find_dictionary("InnerDetector");
57 if (!dict) {
58 ATH_MSG_ERROR( " Cannot access InnerDetector dictionary ");
59 return StatusCode::FAILURE;
60 }
61
62 //retrieving the various ID helpers
63 ATH_CHECK (detStore()->retrieve(m_IDHelper, "AtlasID"));
64
65 ATH_CHECK( detStore()->retrieve(m_pixelHelper, "PixelID") );
66 ATH_CHECK( detStore()->retrieve(m_SCTHelper, "SCT_ID") );
67 if(!m_trtDetEleContKey.empty())
68 ATH_CHECK( detStore()->retrieve(m_TRTHelper, "TRT_ID") );
69
70 ATH_CHECK( m_pixClusContName.initialize() );
71 ATH_CHECK( m_sctClusContName.initialize() );
73
74 ATH_CHECK( m_pixelDetEleCollKey.initialize() );
75 ATH_CHECK( m_SCTDetEleCollKey.initialize() );
76 ATH_CHECK( m_trtDetEleContKey.initialize(!m_trtDetEleContKey.empty()));
77
78 return sc;
79
80}
81
82void
85 if (nullptr!=dynamic_cast<const SCT_ClusterOnTrack*>(&rioOnTrack) ) type = SCT;
86 if (nullptr!=dynamic_cast<const PixelClusterOnTrack*>(&rioOnTrack) ) type = Pixel;
87 if (nullptr!=dynamic_cast<const TRT_DriftCircleOnTrack*>(&rioOnTrack) ) type = TRT;
88 if (type==Unknown) {
89 ATH_MSG_ERROR("Type does not match known concrete type of InDet! Dumping RoT:"<<rioOnTrack);
90 } else {
91 ATH_MSG_VERBOSE("Type = "<<type);
92 }
93
94 return;
95}
96
97std::pair<const Trk::TrkDetElementBase*, const Trk::PrepRawData*>
99{
100 using namespace Trk;
101 const TrkDetElementBase* detEl = nullptr;
102 const PrepRawData* prd = nullptr;
103 const Identifier& id = rioOnTrack.identify();
104
105 if (m_IDHelper->is_pixel(id) ) {
106 ATH_MSG_DEBUG ("Set Pixel detector element.");
107 // use IdentifierHash for speed
108 detEl = getPixelDetectorElement( rioOnTrack.idDE() ) ;
109 if (m_setPrepRawDataLink) prd = pixelClusterLink( id, rioOnTrack.idDE() );
110 } else if (m_IDHelper->is_sct(id)) {
111 ATH_MSG_DEBUG("Set SCT detector element" );
112 // use IdentifierHash for speed
113 detEl = getSCTDetectorElement( rioOnTrack.idDE() ) ;
114 if (m_setPrepRawDataLink) prd = sctClusterLink( id, rioOnTrack.idDE() );
115 } else if (m_IDHelper->is_trt(id)) {
116 ATH_MSG_DEBUG("Set TRT detector element" );
117 // use IdentifierHash for speed
118 detEl = getTRTDetectorElement( rioOnTrack.idDE() ) ;
119 if (m_setPrepRawDataLink) prd = trtDriftCircleLink( id, rioOnTrack.idDE() );
120 } else {
121 ATH_MSG_WARNING("Unknown type of ID detector from identifier :"
122 << id<<", in string form:"
123 << m_IDHelper->show_to_string(id)
124 );
125 }
126 return std::pair<const Trk::TrkDetElementBase*, const Trk::PrepRawData*>(detEl,prd);
127}
128
130
132 if (pixel!=nullptr) {
133 prepareRIO_OnTrackElementLink<const InDet::PixelClusterContainer, InDet::PixelClusterOnTrack>(pixel);
134 return;
135 }
136 InDet::SCT_ClusterOnTrack* sct = dynamic_cast<InDet::SCT_ClusterOnTrack*>(RoT);
137 if (sct!=nullptr) {
138 prepareRIO_OnTrackElementLink<const InDet::SCT_ClusterContainer, InDet::SCT_ClusterOnTrack>(sct);
139 return;
140 }
142 if (trt!=nullptr) {
143 prepareRIO_OnTrackElementLink<const InDet::TRT_DriftCircleContainer, InDet::TRT_DriftCircleOnTrack>(trt);
144 return;
145 }
146 return;
147}
148
149void
151 ELKey_t& key,
152 ELIndex_t& index) const
153{
154 const InDet::PixelClusterOnTrack* pixel = dynamic_cast<const InDet::PixelClusterOnTrack*>(RoT);
155 if (pixel!=nullptr) {
156 prepareRIO_OnTrackElementLink<const InDet::PixelClusterContainer, InDet::PixelClusterOnTrack>(pixel, key, index);
157 return;
158 }
159 const InDet::SCT_ClusterOnTrack* sct = dynamic_cast<const InDet::SCT_ClusterOnTrack*>(RoT);
160 if (sct!=nullptr) {
161 prepareRIO_OnTrackElementLink<const InDet::SCT_ClusterContainer, InDet::SCT_ClusterOnTrack>(sct, key, index);
162 return;
163 }
164 const InDet::TRT_DriftCircleOnTrack* trt = dynamic_cast<const InDet::TRT_DriftCircleOnTrack*>(RoT);
165 if (trt!=nullptr) {
166 prepareRIO_OnTrackElementLink<const InDet::TRT_DriftCircleContainer, InDet::TRT_DriftCircleOnTrack>(trt, key, index);
167 return;
168 }
169 return;
170}
171
173 std::pair<const Trk::TrkDetElementBase *, const Trk::PrepRawData *> pair = getLinks( *RoT );
175 return;
176}
177
180
181 const Trk::TrkDetElementBase* detEl=nullptr;
182
183 if (m_IDHelper->is_pixel(id)) {
184
185 ATH_MSG_DEBUG("Set Pixel detector element.");
186 // use IdentifierHash for speed
187 detEl = getPixelDetectorElement( idHash ) ;
188 } else if (m_IDHelper->is_sct(id)) {
189
190 ATH_MSG_DEBUG("Set SCT detector element" );
191 // use IdentifierHash for speed
192 detEl = getSCTDetectorElement( idHash ) ;
193 } else if (m_IDHelper->is_trt(id)) {
194
195 ATH_MSG_DEBUG("Set TRT detector element" );
196 // use IdentifierHash for speed
197 detEl = getTRTDetectorElement( idHash ) ;
198 } else {
199 ATH_MSG_WARNING("Unknown type of ID detector from identifier :"
200 << id<<", in string form:"
201 << m_IDHelper->show_to_string(id)
202 );
203 }
204 return detEl;
205}
206
209
210 const Trk::TrkDetElementBase* detEl=nullptr;
211
212 if (m_IDHelper->is_pixel(id) ) {
213
214 ATH_MSG_DEBUG("Set Pixel detector element.");
215 // use IdentifierHash for speed
216 const IdentifierHash wafer_hash = m_pixelHelper->wafer_hash(id);
217 detEl = getPixelDetectorElement( wafer_hash ) ;
218 } else if (m_IDHelper->is_sct(id)) {
219
220 ATH_MSG_DEBUG("Set SCT detector element" );
221 const Identifier wafer_id = m_SCTHelper->wafer_id(id);
222 const IdentifierHash wafer_hash = m_SCTHelper->wafer_hash(wafer_id);
223 detEl = getSCTDetectorElement( wafer_hash ) ;
224 } else if (m_IDHelper->is_trt(id)) {
225 ATH_MSG_DEBUG("Set TRT detector element");
226 // use IdentifierHash for speed
227 const Identifier strawLayerId = m_TRTHelper->layer_id(id);
228 const IdentifierHash hashId = m_TRTHelper->straw_layer_hash(strawLayerId);
229 detEl = getTRTDetectorElement( hashId ) ;
230 } else {
231 ATH_MSG_WARNING("Unknown type of ID detector from identifier :"<< id<<", in string form:"
232 << m_IDHelper->show_to_string(id) );
233 }
234 return detEl;
235}
236
237const Trk::PrepRawData*
239 using namespace Trk;
240 // need to retrieve pointers to collections
241 // retrieve Pixel cluster container
242
243 // obviously this can be optimised! EJWM
245 if (!h_pixClusCont.isValid()) {
246 ATH_MSG_ERROR("Pixel Cluster container not found at "<<m_pixClusContName);
247 return nullptr;
248 } else {
249 ATH_MSG_DEBUG("Pixel Cluster Container found" );
250 }
251 const PixelClusterCollection *ptr = h_pixClusCont->indexFindPtr(idHash);
252 // if we find PRD, then recreate link
253 if (ptr!=nullptr) {
254 //loop though collection to find matching PRD.
255 PixelClusterCollection::const_iterator collIt = ptr->begin();
256 PixelClusterCollection::const_iterator collItEnd = ptr->end();
257 // there MUST be a faster way to do this!!
258 for ( ; collIt!=collItEnd; ++collIt){
259 if ( (*collIt)->identify()==id ) return *collIt;
260 }
261 }
262 ATH_MSG_DEBUG("No matching PRD found" );
263 return nullptr;
264}
265
266const Trk::PrepRawData*
268 using namespace Trk;
269 // need to retrieve pointers to collections
270 // retrieve Pixel cluster container
271
272 // obviously this can be optimised! EJWM
274 if (!h_sctClusCont.isValid()) {
275 ATH_MSG_ERROR("SCT Cluster container not found at "<<m_sctClusContName);
276 return nullptr;
277 } else {
278 ATH_MSG_DEBUG("SCT Cluster Container found" );
279 }
280 const SCT_ClusterCollection *ptr = h_sctClusCont->indexFindPtr(idHash);
281 // if we find PRD, then recreate link
282 if (ptr!=nullptr) {
283 //loop though collection to find matching PRD.
284 SCT_ClusterCollection::const_iterator collIt = ptr->begin();
285 SCT_ClusterCollection::const_iterator collItEnd = ptr->end();
286 // there MUST be a faster way to do this!!
287 for ( ; collIt!=collItEnd; ++collIt) {
288 if ( (*collIt)->identify()==id ) return *collIt;
289 }
290 }
291 ATH_MSG_DEBUG("No matching PRD found" );
292 return nullptr;
293}
294
295const Trk::PrepRawData*
297 using namespace Trk;
298 // need to retrieve pointers to collections
299 // retrieve Pixel cluster container
300
301 // obviously this can be optimised! EJWM
303 if (!h_trtDriftCircleCont.isValid()) {
304 ATH_MSG_ERROR("TRT Drift Circles container not found at "<<m_trtDriftCircleContName);
305 return nullptr;
306 } else {
307 ATH_MSG_DEBUG("TRT Drift Circles Container found" );
308 }
309 const TRT_DriftCircleCollection *ptr = h_trtDriftCircleCont->indexFindPtr(idHash);
310 // if we find PRD, then recreate link
311 if (ptr!=nullptr) {
312 //loop though collection to find matching PRD.
313 TRT_DriftCircleCollection::const_iterator collIt = ptr->begin();
314 TRT_DriftCircleCollection::const_iterator collItEnd = ptr->end();
315 // there MUST be a faster way to do this!!
316 for ( ; collIt!=collItEnd; ++collIt) {
317 if ( (*collIt)->identify()==id ) return *collIt;
318 }
319 }
320 ATH_MSG_DEBUG("No matching PRD found" );
321 return nullptr;
322}
323
326 if (not pixelDetEle.isValid()) return nullptr;
327 return pixelDetEle->getDetectorElement(waferHash);
328}
329
332 if (not sctDetEle.isValid()) return nullptr;
333 return sctDetEle->getDetectorElement(waferHash);
334}
335
338 const InDetDD::TRT_DetElementCollection* elements(trtDetEleHandle->getElements());
339 if (not trtDetEleHandle.isValid() or elements==nullptr) {
340 ATH_MSG_FATAL(m_trtDetEleContKey.fullKey() << " is not available.");
341 return nullptr;
342 }
343 return elements->getDetectorElement(HashId);
344}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
static Double_t sc
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
This is an Identifier helper class for the TRT subdetector.
This is a "hash" representation of an Identifier.
Class to hold geometrical description of a silicon detector element.
Virtual base class of TRT readout elements.
Class to hold collection of TRT detector elements.
const TRT_BaseElement * getDetectorElement(const IdentifierHash &hash) const
virtual void prepareRIO_OnTrack(Trk::RIO_OnTrack *rot) const override
const InDetDD::TRT_BaseElement * getTRTDetectorElement(const IdentifierHash &HashId) const
use the passed IdentifierHash to get TRTDetectorElement for TRT
virtual StatusCode initialize() override
SG::ReadHandleKey< TRT_DriftCircleContainer > m_trtDriftCircleContName
location of container of TRT drift circles
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
const InDetDD::SiDetectorElement * getPixelDetectorElement(const IdentifierHash &waferHash) const
use the passed IdentifierHash to get SiDetectorElement for Pixel
virtual const Trk::PrepRawData * pixelClusterLink(const Identifier &id, const IdentifierHash &idHash) const
use the passed identifier to recreate the pixel cluster link on the passed RIO_OnTrack
virtual std::pair< const Trk::TrkDetElementBase *, const Trk::PrepRawData * > getLinks(Trk::RIO_OnTrack &rioOnTrack) const override
use the passed identifier to recreate the detector element and PRD links on the passed RIO_OnTrack
InDetEventCnvTool(const std::string &, const std::string &, const IInterface *)
const InDetDD::SiDetectorElement * getSCTDetectorElement(const IdentifierHash &waferHash) const
use the passed IdentifierHash to get SiDetectorElement for SCT
virtual void prepareRIO_OnTrackLink(const Trk::RIO_OnTrack *rot, ELKey_t &key, ELIndex_t &index) const override
Similar, but just return the EL components rather then changing ROT.
virtual void recreateRIO_OnTrack(Trk::RIO_OnTrack *RoT) const override
virtual const Trk::TrkDetElementBase * getDetectorElement(const Identifier &id, const IdentifierHash &idHash) const override
Return the detectorElement associated with this Identifier.
SG::ReadHandleKey< SCT_ClusterContainer > m_sctClusContName
location of container of sct clusters
virtual void checkRoT(const Trk::RIO_OnTrack &rioOnTrack) const override
virtual const Trk::PrepRawData * sctClusterLink(const Identifier &id, const IdentifierHash &idHash) const
use the passed identifier to recreate the SCT cluster link on the passed RIO_OnTrack
const IdDictManager * m_idDictMgr
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
SG::ReadHandleKey< PixelClusterContainer > m_pixClusContName
location of container of pixel clusters
virtual const Trk::PrepRawData * trtDriftCircleLink(const Identifier &id, const IdentifierHash &idHash) const
use the passed identifier to recreate the TRT Drift circle link on the passed RIO_OnTrack
bool m_setPrepRawDataLink
if true, attempt to recreate link to PRD
const AtlasDetectorID * m_IDHelper
SG::ReadCondHandleKey< InDetDD::TRT_DetElementContainer > m_trtDetEleContKey
Specific class to represent the pixel measurements.
Specific class to represent the SCT measurements.
Represents 'corrected' measurements from the TRT (for example, corrected for wire sag).
virtual bool isValid() override final
Can the handle be successfully dereferenced?
virtual void setRoT_Values(std::pair< const Trk::TrkDetElementBase *, const Trk::PrepRawData * > &pair, Trk::RIO_OnTrack *RoT) const
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
Identifier identify() const
return the identifier -extends MeasurementBase
virtual IdentifierHash idDE() const =0
returns the DE hashID
This is the base class for all tracking detector elements with read-out relevant information.
STL class.
Definition HitInfo.h:33
Ensure that the ATLAS eigen extensions are properly loaded.
Definition index.py:1