ATLAS Offline Software
Loading...
Searching...
No Matches
XAODToInDetClusterConversion.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
7
11
14
15#include <map>
16#include <cmath>
17
18namespace InDet {
19
21 ISvcLocator *pSvcLocator)
22 : AthReentrantAlgorithm(name, pSvcLocator)
23 {}
24
26 {
27 ATH_MSG_INFO( "Initializing " << name() << " ... " );
28
29 // Pixel Clusters
31 ATH_CHECK( detStore()->retrieve(m_pixelID,"PixelID") );
32
36
37 // Strip Clusters
39 ATH_CHECK( detStore()->retrieve(m_stripID, "SCT_ID") );
40
44
45 ATH_CHECK( m_lorentzAngleTool.retrieve(EnableTool{not m_lorentzAngleTool.empty()}) );
46
47 // Hgtd Clusters
49 ATH_CHECK( detStore()->retrieve(m_hgtdID, "HGTD_ID") );
50
53
54 return StatusCode::SUCCESS;
55 }
56
57 StatusCode XAODToInDetClusterConversion::execute(const EventContext& ctx) const
58 {
59 ATH_MSG_DEBUG( "Executing " << name() << " ... " );
60
61 if (m_processPixel.value()) {
62 ATH_MSG_DEBUG("Converting Pixel Clusters: xAOD -> InDet");
64 }
65
66 if (m_processStrip.value()) {
67 ATH_MSG_DEBUG("Converting Strip Clusters: xAOD -> InDet");
69 }
70
71 if (m_processHgtd.value()) {
72 ATH_MSG_DEBUG("Converting HGTD Clusters: xAOD -> InDet");
74 }
75
76 return StatusCode::SUCCESS;
77 }
78
79 StatusCode XAODToInDetClusterConversion::convertPixelClusters(const EventContext& ctx) const
80 {
82 const InDetDD::SiDetectorElementCollection* pixElements( *pixelDetEleHandle );
83 if (not pixelDetEleHandle.isValid() or pixElements==nullptr) {
84 ATH_MSG_FATAL(m_pixelDetEleCollKey.fullKey() << " is not available.");
85 return StatusCode::FAILURE;
86 }
87
89 ATH_CHECK( inputPixelClusterContainer.isValid() );
90 const xAOD::PixelClusterContainer *inputPixelClusters = inputPixelClusterContainer.cptr();
91
93 ATH_CHECK( outputPixelClusterContainer.record (std::make_unique<InDet::PixelClusterContainer>(m_pixelID->wafer_hash_max(), EventContainers::Mode::OfflineFast)) );
94 ATH_CHECK( outputPixelClusterContainer.isValid() );
95 ATH_MSG_DEBUG( "Container '" << m_outputPixelClusterContainerKey.key() << "' initialised" );
96
97 ATH_CHECK( outputPixelClusterContainer.symLink( m_pixelClusterContainerLinkKey ) );
98
99 // Conversion
100 // Access to the cluster from a given detector element is possible
101 // via the ContainerAccessor.
103 pixelAccessor ( *inputPixelClusters,
104 [] (const xAOD::PixelCluster& cl) -> IdentifierHash { return cl.identifierHash(); },
105 pixElements->size());
106
107 const auto& allIdHashes = pixelAccessor.allIdentifiers();
108 for (const auto& hashId : allIdHashes) {
109 const InDetDD::SiDetectorElement *element = pixElements->getDetectorElement(hashId);
110 if ( element == nullptr ) {
111 ATH_MSG_FATAL( "Invalid pixel detector element for hash " << hashId);
112 return StatusCode::FAILURE;
113 }
114
115 std::unique_ptr<InDet::PixelClusterCollection> collection = std::make_unique<InDet::PixelClusterCollection>(hashId);
116
117 // Get the detector element and range for the idHash
118 for (const auto& this_range : pixelAccessor.rangesForIdentifierDirect(hashId)) {
119 for (auto start = this_range.first; start != this_range.second; ++start) {
120 const xAOD::PixelCluster* in_cluster = *start;
121
122 InDet::PixelCluster* cluster = nullptr;
123 ATH_CHECK( TrackingUtilities::convertXaodToInDetCluster(*in_cluster, *element, *m_pixelID, cluster) );
124 cluster->setHashAndIndex(hashId, collection->size());
125
126 // Add to Collection
127 collection->push_back(cluster);
128 }
129 }
130
131 InDet::PixelClusterContainer::IDC_WriteHandle lock = outputPixelClusterContainer->getWriteHandle(hashId);
132 ATH_CHECK(lock.addOrDelete( std::move(collection) ));
133
134 } // loop on hashIds
135
136 ATH_CHECK( outputPixelClusterContainer.setConst() );
137
138 return StatusCode::SUCCESS;
139 }
140
141 StatusCode XAODToInDetClusterConversion::convertStripClusters(const EventContext& ctx) const
142 {
144 const InDetDD::SiDetectorElementCollection* stripElements( *stripDetEleHandle );
145 if (not stripDetEleHandle.isValid() or stripElements==nullptr) {
146 ATH_MSG_FATAL(m_stripDetEleCollKey.fullKey() << " is not available.");
147 return StatusCode::FAILURE;
148 }
149
151 ATH_CHECK( inputStripClusterContainer.isValid() );
152 const xAOD::StripClusterContainer *inputStripClusters = inputStripClusterContainer.cptr();
153
155 ATH_CHECK( outputStripClusterContainer.record (std::make_unique<InDet::SCT_ClusterContainer>(m_stripID->wafer_hash_max(), EventContainers::Mode::OfflineFast)) );
156 ATH_CHECK( outputStripClusterContainer.isValid() );
157 ATH_MSG_DEBUG( "Container '" << m_outputStripClusterContainerKey.key() << "' initialised" );
158
159 ATH_CHECK( outputStripClusterContainer.symLink( m_stripClusterContainerLinkKey ) );
160
161 // Conversion
162 // Access to the cluster from a given detector element is possible
163 // via the ContainerAccessor.
165 stripAccessor ( *inputStripClusters,
166 [] (const xAOD::StripCluster& cl) -> IdentifierHash { return cl.identifierHash(); },
167 stripElements->size());
168
169
170
171 const auto& allIdHashes = stripAccessor.allIdentifiers();
172 for (const auto& hashId : allIdHashes) {
173 const InDetDD::SiDetectorElement *element = stripElements->getDetectorElement(hashId);
174 if ( element == nullptr ) {
175 ATH_MSG_FATAL( "Invalid strip detector element for hash " << hashId);
176 return StatusCode::FAILURE;
177 }
178
179 bool isBarrel = element->isBarrel();
180
181 double shift = not isBarrel
182 ? m_lorentzAngleTool->getLorentzShift(hashId, ctx)
183 : 0.;
184
185 std::unique_ptr<InDet::SCT_ClusterCollection> collection = std::make_unique<InDet::SCT_ClusterCollection>(hashId);
186
187
188 // Get the detector element and range for the idHash
189 for (const auto& this_range : stripAccessor.rangesForIdentifierDirect(hashId)) {
190 for (auto start = this_range.first; start != this_range.second; ++start) {
191 const xAOD::StripCluster* in_cluster = *start;
192
193 InDet::SCT_Cluster* cluster = nullptr;
194 ATH_CHECK( TrackingUtilities::convertXaodToInDetCluster(*in_cluster, *element, *m_stripID, cluster, shift) );
195 cluster->setHashAndIndex(hashId, collection->size());
196
197 // Add to Collection
198 collection->push_back( cluster );
199 }
200 }
201
202 InDet::SCT_ClusterContainer::IDC_WriteHandle lock = outputStripClusterContainer->getWriteHandle(hashId);
203 ATH_CHECK(lock.addOrDelete( std::move(collection) ));
204
205 }
206
207 ATH_CHECK( outputStripClusterContainer.setConst() );
208
209 return StatusCode::SUCCESS;
210 }
211
212 StatusCode XAODToInDetClusterConversion::convertHgtdClusters(const EventContext& ctx) const
213 {
215 const InDetDD::HGTD_DetectorElementCollection *hgtdElements( *hgtdDetEleHandle );
216 if (not hgtdDetEleHandle.isValid() or hgtdElements==nullptr) {
217 ATH_MSG_FATAL(m_HGTDDetEleCollKey.fullKey() << " is not available.");
218 return StatusCode::FAILURE;
219 }
220
222 ATH_CHECK( inputHgtdClusterContainer.isValid() );
223 const xAOD::HGTDClusterContainer *inputHgtdClusters = inputHgtdClusterContainer.cptr();
224
226 ATH_CHECK( outputHgtdClusterContainer.record (std::make_unique<::HGTD_ClusterContainer>(m_hgtdID->wafer_hash_max(), EventContainers::Mode::OfflineFast)) );
227 ATH_MSG_DEBUG( "Container '" << m_outputHgtdClusterContainerKey.key() << "' initialised" );
228
230 hgtdAccessor ( *inputHgtdClusters,
231 [] (const xAOD::HGTDCluster& cl) -> IdentifierHash { return cl.identifierHash(); },
232 hgtdElements->size());
233
234 const auto& allIdHashes = hgtdAccessor.allIdentifiers();
235 for (const auto& hashId : allIdHashes) {
236 const auto *element = InDetDD::HGTDDetEl::getDetectorElement(hashId,*hgtdElements);
237 if ( element == nullptr ) {
238 ATH_MSG_FATAL( "Invalid hgtd detector element for hash " << hashId);
239 return StatusCode::FAILURE;
240 }
241
242 std::unique_ptr<::HGTD_ClusterCollection> collection = std::make_unique<::HGTD_ClusterCollection>(hashId);
243
244 // Get the detector element and range for the idHash
245 for (const auto& this_range : hgtdAccessor.rangesForIdentifierDirect(hashId)) {
246 for (auto start = this_range.first; start != this_range.second; ++start) {
247 const xAOD::HGTDCluster* in_cluster = *start;
248
249 ::HGTD_Cluster* cluster = nullptr;
250 ATH_CHECK( TrackingUtilities::convertXaodToInDetCluster(*in_cluster, *element, cluster) );
251 cluster->setHashAndIndex(hashId, collection->size());
252
253 // Add to Collection
254 collection->push_back(cluster);
255 }
256 }
257
258 ::HGTD_ClusterContainer::IDC_WriteHandle lock = outputHgtdClusterContainer->getWriteHandle(hashId);
259 ATH_CHECK(lock.addOrDelete( std::move(collection) ));
260
261 } // loop on hashIds
262
263 ATH_CHECK( outputHgtdClusterContainer.setConst() );
264
265 return StatusCode::SUCCESS;
266 }
267
268
269}
270
271
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
const ServiceHandle< StoreGateSvc > & detStore() const
An algorithm that can be simultaneously executed in multiple threads.
Class implementing how to access a container.
const boost::container::small_vector< Range, inline_size > rangesForIdentifierDirect(const identifier_t &identifier) const
Function to return the list of ranges corresponding to a given identifier.
std::vector< identifier_t > allIdentifiers() const
Function to return all available identifier (i.e. keys in the map).
size_type size() const noexcept
Returns the number of elements in the collection.
This is a "hash" representation of an Identifier.
Class to hold the SiDetectorElement objects to be put in the detector store.
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Class to hold geometrical description of a silicon detector element.
ToolHandle< ISiLorentzAngleTool > m_lorentzAngleTool
SG::ReadHandleKey< xAOD::HGTDClusterContainer > m_inputHgtdClusterContainerKey
SG::WriteHandleKey< InDet::SCT_ClusterContainer > m_outputStripClusterContainerKey
StatusCode convertHgtdClusters(const EventContext &ctx) const
SG::ReadHandleKey< xAOD::PixelClusterContainer > m_inputPixelClusterContainerKey
SG::WriteHandleKey< InDet::SiClusterContainer > m_stripClusterContainerLinkKey
StatusCode convertPixelClusters(const EventContext &ctx) const
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
virtual StatusCode execute(const EventContext &ctx) const override
SG::ReadCondHandleKey< InDetDD::HGTD_DetectorElementCollection > m_HGTDDetEleCollKey
SG::WriteHandleKey< InDet::SiClusterContainer > m_pixelClusterContainerLinkKey
SG::WriteHandleKey<::HGTD_ClusterContainer > m_outputHgtdClusterContainerKey
StatusCode convertStripClusters(const EventContext &ctx) const
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_stripDetEleCollKey
SG::ReadHandleKey< xAOD::StripClusterContainer > m_inputStripClusterContainerKey
SG::WriteHandleKey< InDet::PixelClusterContainer > m_outputPixelClusterContainerKey
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
StatusCode setConst()
Set the 'const' bit for the bound proxy in the store.
StatusCode symLink(const WriteHandleKey< U > &key)
Make an explicit link.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
void setHashAndIndex(unsigned short collHash, unsigned short objIndex)
TEMP for testing: might make some classes friends later ...
const HGTD_DetectorElement * getDetectorElement(const IdentifierHash &hash, const HGTD_DetectorElementCollection &coll)
DataVector< HGTD_DetectorElement > HGTD_DetectorElementCollection
Primary Vertex Finder.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
StatusCode convertXaodToInDetCluster(const xAOD::PixelCluster &xaodCluster, const InDetDD::SiDetectorElement &element, const PixelID &pixelID, InDet::PixelCluster *&indetCluster)
PixelClusterContainer_v1 PixelClusterContainer
Define the version of the pixel cluster container.
HGTDClusterContainer_v1 HGTDClusterContainer
Define the version of the HGTD cluster container.
StripCluster_v1 StripCluster
Define the version of the strip cluster class.
StripClusterContainer_v1 StripClusterContainer
Define the version of the strip cluster container.
PixelCluster_v1 PixelCluster
Define the version of the pixel cluster class.
HGTDCluster_v1 HGTDCluster
Define the version of the pixel cluster class.
Definition HGTDCluster.h:13