Execute method.
97{
98
100
102 {
104 return StatusCode::FAILURE;
105 }
106
107 const PRD_MultiTruthCollection* prdmtColl(nullptr);
108 const xAODTruthParticleLinkVector *truth_particle_links{nullptr};
110 SG::ReadHandle<PRD_MultiTruthCollection> prdmtCollHandle(
m_multiTruth_key,ctx);
111 if (prdmtCollHandle.isValid()) {
112 prdmtColl = &*prdmtCollHandle;
113 }
115 SG::ReadHandle<xAODTruthParticleLinkVector> truthParticleLinksHandle{
m_truthParticleLinks, ctx};
116 if (truthParticleLinksHandle.
isValid()) {
117 truth_particle_links = truthParticleLinksHandle.
cptr();
118 }
119 }
120 }
121
122 const InDetSimDataCollection* sdoCollection(nullptr);
125 if (sdoCollectionHandle.isValid()) {
126 sdoCollection = &*sdoCollectionHandle;
128 ATH_MSG_WARNING(
"SDO information requested, but SDO collection not available!");
129 }
130 }
131
132 SG::ReadHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainer;
133 bool foundSplitProbContainer = false;
136 if (!splitProbContainer.
isValid()) {
138 }
139 foundSplitProbContainer = true;
140 }
141
142 std::vector<std::vector<const SiHit*>> siHits(
m_PixelHelper->wafer_hash_max());
145 if (siHitCollectionHandle.isValid()) {
146 for (const SiHit& siHit: *siHitCollectionHandle) {
147
148 if (!siHit.isPixel()) continue;
149
150 Identifier wafer_id(
m_PixelHelper->wafer_id(siHit.getBarrelEndcap(),
151 siHit.getLayerDisk(),
152 siHit.getPhiModule(),
153 siHit.getEtaModule()));
154 IdentifierHash wafer_hash(
m_PixelHelper->wafer_hash(wafer_id));
156 siHits[wafer_hash].push_back(&siHit);
157 }
159 ATH_MSG_WARNING(
"SiHit information requested, but SiHit collection not available!");
160 }
161 }
162
163 const PixelChargeCalibCondData *calibData=nullptr;
165 SG::ReadCondHandle<PixelChargeCalibCondData> calibData_handle(
m_chargeDataKey,ctx);
166 if (!calibData_handle.isValid()) {
168 }
169 calibData=calibData_handle.cptr();
170 }
171
172
173 SG::WriteHandle<xAOD::TrackMeasurementValidationContainer> xaod(
m_write_xaod_key,ctx);
174 ATH_CHECK(xaod.record(std::make_unique<xAOD::TrackMeasurementValidationContainer>(),
175 std::make_unique<xAOD::TrackMeasurementValidationAuxContainer>()));
176
177 SG::WriteHandle<std::vector<unsigned int>> offsets(
m_write_offsets,ctx);
178 ATH_CHECK(offsets.record(std::make_unique<std::vector<unsigned int>>(
m_PixelHelper->wafer_hash_max(), 0)));
179
180 unsigned int have_truth_link=0
u;
181 unsigned int missing_truth_particle=0
u;
182 unsigned int missing_parent_particle=0
u;
183
185
187 SG::ReadCondHandle<PixelDCSHVData> dcsHV(
m_readKeyHV,ctx);
188 SG::ReadCondHandle<PixelDCSTempData> dcsTemp(
m_readKeyTemp,ctx);
189
190 std::unordered_map< unsigned int , std::vector<unsigned int> > cluster_map;
191 for( const auto clusterCollection : * PixelClusterContainer ){
192
193
194 (*offsets)[clusterCollection->identifyHash()] =
counter;
195
196
197 if( clusterCollection->empty() ) continue;
198
199
200 for( const InDet::PixelCluster* prd : *clusterCollection ){
202
203 Identifier clusterId = prd->identify();
206 }
207
208
210 unsigned int cluster_idx = xaod->size();
211 xaod->push_back(xprd);
212
213
215
216
219
220
222
223
225
227 if(localCov.size() == 1){
229 } else if(localCov.size() == 4){
231 } else {
233 }
234
235
236 std::vector< uint64_t > rdoIdentifierList;
237 rdoIdentifierList.reserve(prd->rdoList().size());
238 int rowmin=9999; int rowmax=-9999;
239 int colmin=9999; int colmax=-9999;
240 for( const auto &hitIdentifier : prd->rdoList() ){
241 rdoIdentifierList.push_back( hitIdentifier.get_compact() );
242
245 if(rowmin > row) rowmin =
row;
246 if(rowmax < row) rowmax =
row;
247 if(colmin > col) colmin = col;
248 if(colmax < col) colmax = col;
249 }
251
252
257 AUXDATA(xprd,
int,layer) = the_layer ;
258 AUXDATA(xprd,
int,phi_module) = the_phi ;
259 AUXDATA(xprd,
int,eta_module) = the_eta ;
262
263
265 cluster_map[ makeKey(the_phi, the_eta, the_layer)].push_back(cluster_idx);
266 }
267
268 const InDet::SiWidth cw = prd->width();
271 AUXDATA(xprd,
int,nRDO) = (
int)prd->rdoList().size();
272
274 AUXDATA(xprd,
int,ToT) = prd->totalToT();
275 AUXDATA(xprd,
int,LVL1A) = prd->LVL1A();
276
278 AUXDATA(xprd,
char,gangedPixel) = (
char)prd->gangedPixel();
279 const Trk::ClusterSplitProbabilityContainer::ProbabilityInfo &
281 AUXDATA(xprd,
char,isSplit) =
static_cast<char>(splitProb.
isSplit());
284
285
287
288
290 IdentifierHash moduleHash = clusterCollection->identifyHash();
292 AUXDATA(xprd,
int,DCSState) = dcsState->getModuleStatus(moduleHash);
293 }
294
295
297 IdentifierHash moduleHash = clusterCollection->identifyHash();
298
299 float deplVoltage = 0.0;
300 AUXDATA(xprd,
float,BiasVoltage) = dcsHV->getBiasVoltage(moduleHash);
301 AUXDATA(xprd,
float,Temperature) = dcsTemp->getTemperature(moduleHash);
302 AUXDATA(xprd,
float,DepletionVoltage) = deplVoltage;
303
305
306 assert (calibData);
308 }
309
310
311
312 const InDetDD::SiDetectorElement* de = prd->detectorElement();
314 if(de){
318 }
319 }
320 AUXDATA(xprd,uint64_t,detectorElementID) = detElementId;
321
324
325 const InDetDD::PixelModuleDesign* design =
static_cast<const InDetDD::PixelModuleDesign*
>(&de->
design());
330 InDetDD::SiLocalPosition centroid = 0.25*(pos1+pos2+pos3+pos4);
331
332 AUXDATA(xprd,
float,centroid_xphi) = centroid.
xPhi();
333 AUXDATA(xprd,
float,centroid_xeta) = centroid.
xEta();
334
335 AUXDATA(xprd,
float,omegax) = prd->omegax();
336 AUXDATA(xprd,
float,omegay) = prd->omegay();
337 }
338
339
340 if (prdmtColl) {
341 auto range{prdmtColl->equal_range(clusterId)};
342 if (truth_particle_links) {
343 std::vector<unsigned int> tp_indices;
345 ElementLink<xAOD::TruthParticleContainer> a_truth_particle_link = truth_particle_links->
find(
i->second);
346 if (a_truth_particle_link) {
348 if (truth_particle) {
349 ++have_truth_link;
350 tp_indices.push_back(static_cast<int>(truth_particle->index()));
351 }
352 else {
353 ++missing_parent_particle;
354 }
355 }
356 else {
357 tp_indices.push_back(std::numeric_limits<unsigned int>::max());
358 ++missing_truth_particle;
359 }
360 }
361
362 AUXDATA(xprd,std::vector<unsigned int>, truth_index) = std::move(tp_indices);
363 }
364 std::vector<int> uniqueIDs;
365 for (
auto i =
range.first; i !=
range.second; ++i) {
367 }
368 AUXDATA(xprd,std::vector<int>, truth_barcode) = std::move(uniqueIDs);
369 }
370
371 std::vector< std::vector< int > > sdo_tracks;
372
373
374 if (sdoCollection) {
376 }
377
378
379
384 }
385
388 }
389 }
390 }
391 }
392
393 for ( auto clusItr = xaod->begin(); clusItr != xaod->end(); ++clusItr ) {
394 AUXDATA(*clusItr,
char,broken) =
false;
395 }
399
400
401
403 static const SG::AuxElement::Accessor<int> acc_layer ("layer");
404 static const SG::AuxElement::Accessor<int> acc_phi_module ("phi_module");
405 static const SG::AuxElement::Accessor<int> acc_eta_module ("eta_module");
406 static const SG::AuxElement::Accessor<std::vector<int> > acc_sihit_barcode ("sihit_barcode");
407 for ( auto clusItr = xaod->begin(); clusItr != xaod->end(); ++clusItr)
408 {
410 int layer = acc_layer(*pixelCluster);
411 std::vector<int> uniqueIDs = acc_sihit_barcode(*pixelCluster);
412
413 const std::vector< unsigned int> &cluster_idx_list = cluster_map.at( makeKey(acc_phi_module(*pixelCluster), acc_eta_module(*pixelCluster), acc_layer(*pixelCluster) ));
414 for (unsigned int cluster_idx : cluster_idx_list) {
415 auto pixelCluster2 = xaod->at(cluster_idx);
416 if ( acc_layer(*pixelCluster2) != layer )
417 continue;
418 if ( acc_eta_module(*pixelCluster) != acc_eta_module(*pixelCluster2) )
419 continue;
420 if ( acc_phi_module(*pixelCluster) != acc_phi_module(*pixelCluster2) )
421 continue;
422
423 std::vector<int> uniqueIDs2 = acc_sihit_barcode(*pixelCluster2);
424
425 for ( auto uid : uniqueIDs ) {
426 if (std::find(uniqueIDs2.begin(), uniqueIDs2.end(), uid ) == uniqueIDs2.end()) continue;
427 static const SG::AuxElement::Accessor<char> acc_broken ("broken");
428 acc_broken(*pixelCluster) = true;
429 acc_broken(*pixelCluster2) = true;
430 break;
431 }
432 }
433 }
434 }
435
436 ATH_MSG_DEBUG(
" recorded PixelPrepData objects: size " << xaod->size() );
437
439
440 return StatusCode::SUCCESS;
441}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x,...)
bool is_valid() const
Check if id is in a valid state.
value_type get_compact() const
Get the compact id.
SiLocalPosition positionFromColumnRow(const int column, const int row) const
Given row and column index of a diode, return position of diode center ALTERNATIVE/PREFERED way is to...
virtual Identifier identify() const override final
identifier of this detector element (inline)
const Amg::Vector2D & colRow() const
void addNNInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *pixelCluster, const unsigned int SizeX, const unsigned int SizeY) const
SG::WriteHandleKey< std::vector< unsigned int > > m_write_offsets
Gaudi::Property< bool > m_writeExtendedPRDinformation
void addRdoInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *pixelCluster, const PixelChargeCalibCondData *calibData) const
std::atomic< unsigned int > m_missingTruthParticle
Gaudi::Property< bool > m_writeNNinformation
Gaudi::Property< bool > m_writeRDOinformation
SG::ReadCondHandleKey< PixelDCSHVData > m_readKeyHV
SG::ReadHandleKey< SiHitCollection > m_sihitContainer_key
SG::ReadCondHandleKey< PixelChargeCalibCondData > m_chargeDataKey
void addSiHitInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *prd, const std::vector< SiHit > &matchingHits) const
SG::ReadHandleKey< Trk::ClusterSplitProbabilityContainer > m_clusterSplitProbContainer
std::vector< SiHit > findAllHitsCompatibleWithCluster(const InDet::PixelCluster *prd, const std::vector< const SiHit * > *sihits, std::vector< std::vector< int > > &trkBCs) const
ToolHandle< IInDetConditionsTool > m_pixelSummary
Gaudi::Property< bool > m_useTruthInfo
SG::ReadHandleKey< xAODTruthParticleLinkVector > m_truthParticleLinks
SG::ReadCondHandleKey< PixelDCSTempData > m_readKeyTemp
SG::ReadHandleKey< InDetSimDataCollection > m_SDOcontainer_key
Gaudi::Property< bool > m_writeSDOs
std::atomic< unsigned int > m_missingParentParticle
void addNNTruthInfo(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *prd, const std::vector< SiHit > &matchingHits) const
Gaudi::Property< bool > m_writeModuleStatus
SG::ReadHandleKey< InDet::PixelClusterContainer > m_clustercontainer_key
SG::ReadHandleKey< PRD_MultiTruthCollection > m_multiTruth_key
SG::ReadCondHandleKey< PixelDCSStateData > m_condDCSStateKey
SG::WriteHandleKey< xAOD::TrackMeasurementValidationContainer > m_write_xaod_key
bool m_firstEventWarnings
std::vector< std::vector< int > > addSDOInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *prd, const InDetSimDataCollection &sdoCollection) const
Gaudi::Property< bool > m_writeSiHits
std::atomic< unsigned int > m_haveTruthLink
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
static const ProbabilityInfo & getNoSplitProbability()
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.
row
Appending html table to final .html summary file.
PixelClusterContainer_v1 PixelClusterContainer
Define the version of the pixel cluster container.
TrackMeasurementValidation_v1 TrackMeasurementValidation
Reference the current persistent version:
TruthParticle_v1 TruthParticle
Typedef to implementation.
float splitProbability1() const
float splitProbability2() const