74{
75
76 std::map<Identifier, const SCT_RDORawData*> idToRAWDataMap;
78 SG::ReadHandle<SCT_RDO_Container> rdoContainer{
m_rdoContainer, ctx};
80
81 for (const auto collection: *rdoContainer) {
82
83 for (const auto rdo : *collection) {
84 if (rdo==nullptr) {
86 continue;
87 }
88 Identifier rdoId{rdo->identify()};
89 idToRAWDataMap.insert(std::pair<Identifier, const SCT_RDORawData*>{rdoId, rdo});
90 }
91 }
94 }
95 }
96 ATH_MSG_DEBUG(
"Size of RDO map is " << idToRAWDataMap.size());
97
98 const PRD_MultiTruthCollection* prdmtColl{nullptr};
99 const xAODTruthParticleLinkVector *truth_particle_links{nullptr};
101 SG::ReadHandle<PRD_MultiTruthCollection> prdmtCollHandle{
m_multiTruth, ctx};
102 if (prdmtCollHandle.
isValid()) {
103 prdmtColl = &*prdmtCollHandle;
104 }
106 SG::ReadHandle<xAODTruthParticleLinkVector> truthParticleLinksHandle{
m_truthParticleLinks, ctx};
107 if (truthParticleLinksHandle.
isValid()) {
108 truth_particle_links = truthParticleLinksHandle.
cptr();
109 }
110 }
111 }
112
113 const InDetSimDataCollection* sdoCollection{nullptr};
115 SG::ReadHandle<InDetSimDataCollection> sdoCollectionHandle{
m_SDOcontainer, ctx};
116 if (sdoCollectionHandle.
isValid()) {
117 sdoCollection = &*sdoCollectionHandle;
118 }
119 }
120
121 std::vector<std::vector<const SiHit*>> siHits(
m_SCTHelper->wafer_hash_max());
124 if (sihitCollection.
isValid()) {
125 for (const SiHit& siHit: *sihitCollection) {
126
127 if (not siHit.isSCT()) continue;
128
129 Identifier wafer_id{
m_SCTHelper->wafer_id(siHit.getBarrelEndcap(),
130 siHit.getLayerDisk(),
131 siHit.getPhiModule(),
132 siHit.getEtaModule(),
133 siHit.getSide())};
134 IdentifierHash wafer_hash{
m_SCTHelper->wafer_hash(wafer_id)};
135 siHits[wafer_hash].push_back(&siHit);
136 }
137 }
138 }
139
140
141 SG::ReadHandle<InDet::SCT_ClusterContainer> sctClusterContainer{
m_clustercontainer, ctx};
142 if (not sctClusterContainer.
isValid()) {
144 return StatusCode::FAILURE;
145 }
146
147
148 SG::WriteHandle<xAOD::TrackMeasurementValidationContainer> xaod{
m_xAodContainer, ctx};
149 ATH_CHECK(xaod.
record(std::make_unique<xAOD::TrackMeasurementValidationContainer>(),
150 std::make_unique<xAOD::TrackMeasurementValidationAuxContainer>()));
151
152 SG::WriteHandle<std::vector<unsigned int>> offsets{
m_xAodOffset, ctx};
154
155 unsigned int have_truth_link=0
u;
156 unsigned int missing_truth_particle=0
u;
157 unsigned int missing_parent_particle=0
u;
158
160 for (const auto clusterCollection: *sctClusterContainer) {
161
162 (*offsets)[clusterCollection->identifyHash()] =
counter;
163
164
165 if (clusterCollection->empty()) continue;
166
167 xaod->resize(counter + clusterCollection->size());
168
169 for (const InDet::SCT_Cluster* prd: *clusterCollection) {
170 Identifier clusterId{prd->identify()};
173 }
174
175
177 xaod->at(counter) = xprd;
179
180
182
183
186
187
190 float locX{
static_cast<float>(locpos.x())};
191 if ((not std::isinf(locpos.y()) or std::isnan(locpos.y()))) {
192 if (locpos.y()>=1e-07)
locY = locpos.y();
193 } else {
195 }
196
197
199
201 if (localCov.size() == 1) {
203 } else if (localCov.size() == 4) {
205 } else {
207 }
208
209
210 std::vector<uint64_t> rdoIdentifierList;
211 rdoIdentifierList.reserve(prd->rdoList().size());
212 for (const auto& hitIdentifier: prd->rdoList()) {
213 rdoIdentifierList.push_back(hitIdentifier.get_compact());
214 }
216
217
218 const InDet::SiWidth cw{prd->width()};
219 AUXDATA(xprd,
int, SiWidth) =
static_cast<int>(cw.
colRow()[0]);
220 AUXDATA(xprd,
int, hitsInThirdTimeBin) =
static_cast<int>(prd->hitsInThirdTimeBin());
221
227
228
229 const InDetDD::SiDetectorElement* de{prd->detectorElement()};
231 if (de) {
235 }
236 }
237 AUXDATA(xprd, uint64_t, detectorElementID) = detElementId;
238
239
242 }
243
244
246 if (prdmtColl) {
247 auto range{prdmtColl->equal_range(clusterId)};
248 if (truth_particle_links) {
249 std::vector<unsigned int> tp_indices;
251 ElementLink<xAOD::TruthParticleContainer> a_truth_particle_link = truth_particle_links->
find(
i->second);
252 if (a_truth_particle_link) {
254 if (truth_particle) {
255 ++have_truth_link;
256 tp_indices.push_back(
static_cast<int>(truth_particle->
index()));
257 }
258 else {
259 ++missing_parent_particle;
260 }
261 }
262 else {
263 tp_indices.push_back(std::numeric_limits<unsigned int>::max());
264 ++missing_truth_particle;
265 }
266 }
267
268 AUXDATA(xprd, std::vector<unsigned int>, truth_index) = tp_indices;
269 }
270 std::vector<int> uniqueIDs;
273 }
274
275 AUXDATA(xprd, std::vector<int>, truth_barcode) = uniqueIDs;
276 }
277 }
278
279
280
282 if (sdoCollection) {
284 }
285 }
286
287
288
291 }
292 }
293 }
294 ATH_MSG_DEBUG(
" recorded SCT_PrepData objects: size " << xaod->size());
295
300
301 return StatusCode::SUCCESS;
302}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
bool is_valid() const
Check if id is in a valid state.
value_type get_compact() const
Get the compact id.
virtual Identifier identify() const override final
identifier of this detector element (inline)
const Amg::Vector2D & colRow() const
void addSiHitInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::SCT_Cluster *prd, const std::vector< const SiHit * > *siHits) const
std::atomic< unsigned int > m_missingParentParticle
void addSDOInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::SCT_Cluster *prd, const InDetSimDataCollection *sdoCollection) const
SG::ReadHandleKey< SiHitCollection > m_sihitContainer
SG::ReadHandleKey< PRD_MultiTruthCollection > m_multiTruth
SG::ReadHandleKey< SCT_RDO_Container > m_rdoContainer
BooleanProperty m_writeSDOs
SG::ReadHandleKey< InDetSimDataCollection > m_SDOcontainer
std::atomic_bool m_firstEventWarnings
BooleanProperty m_writeSiHits
SG::WriteHandleKey< xAOD::TrackMeasurementValidationContainer > m_xAodContainer
SG::WriteHandleKey< std::vector< unsigned int > > m_xAodOffset
BooleanProperty m_writeRDOinformation
SG::ReadHandleKey< xAODTruthParticleLinkVector > m_truthParticleLinks
std::atomic< unsigned int > m_missingTruthParticle
SG::ReadHandleKey< InDet::SCT_ClusterContainer > m_clustercontainer
void addRDOInformation(xAOD::TrackMeasurementValidation *, const InDet::SCT_Cluster *, const std::map< Identifier, const SCT_RDORawData * > &idToRAWDataMap) const
std::atomic< unsigned int > m_haveTruthLink
BooleanProperty m_useTruthInfo
size_t index() const
Return the index of this element within its container.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
ElementLink< xAOD::TruthParticleContainer > find(const HepMcParticleLink &hepMCLink) const
void setRdoIdentifierList(const std::vector< uint64_t > &rdoIdentifierList)
Sets the list of RDO identifiers.
void setLocalPositionError(float localXError, float localYError, float localXYCorrelation)
Sets the local position error.
void setLocalPosition(float localX, float localY)
Sets the local position.
void setIdentifier(uint64_t identifier)
Sets the identifier.
void setGlobalPosition(float globalX, float globalY, float globalZ)
Sets the global position.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 3, 1 > Vector3D
@ u
Enums for curvilinear frames.
TrackMeasurementValidation_v1 TrackMeasurementValidation
Reference the current persistent version:
TruthParticle_v1 TruthParticle
Typedef to implementation.