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)
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.
StatusCode addOrDelete(std::unique_ptr< T > ptr)
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