Execute method.
131{
132
134
136 {
138 return StatusCode::FAILURE;
139 }
140
141 const PRD_MultiTruthCollection* prdmtColl(nullptr);
142 const xAODTruthParticleLinkVector *truth_particle_links{nullptr};
144 SG::ReadHandle<PRD_MultiTruthCollection> prdmtCollHandle(
m_multiTruth_key,ctx);
145 if (prdmtCollHandle.isValid()) {
146 prdmtColl = &*prdmtCollHandle;
147 }
149 SG::ReadHandle<xAODTruthParticleLinkVector> truthParticleLinksHandle{
m_truthParticleLinks, ctx};
150 if (truthParticleLinksHandle.
isValid()) {
151 truth_particle_links = truthParticleLinksHandle.
cptr();
152 }
153 }
154 }
155
156 const InDetSimDataCollection* sdoCollection(nullptr);
159 if (sdoCollectionHandle.isValid()) {
160 sdoCollection = &*sdoCollectionHandle;
162 ATH_MSG_WARNING(
"SDO information requested, but SDO collection not available!");
163 }
164 }
165
166 SG::ReadHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainer;
167 bool foundSplitProbContainer = false;
170 if (!splitProbContainer.
isValid()) {
172 }
173 foundSplitProbContainer = true;
174 }
175
176 std::vector<std::vector<const SiHit*>> siHits(
m_PixelHelper->wafer_hash_max());
179 if (siHitCollectionHandle.isValid()) {
180 for (const SiHit& siHit: *siHitCollectionHandle) {
181
182 if (!siHit.isPixel()) continue;
183
184 Identifier wafer_id(
m_PixelHelper->wafer_id(siHit.getBarrelEndcap(),
185 siHit.getLayerDisk(),
186 siHit.getPhiModule(),
187 siHit.getEtaModule()));
188 IdentifierHash wafer_hash(
m_PixelHelper->wafer_hash(wafer_id));
190 siHits[wafer_hash].push_back(&siHit);
191 }
193 ATH_MSG_WARNING(
"SiHit information requested, but SiHit collection not available!");
194 }
195 }
196
197 const PixelChargeCalibCondData *calibData=nullptr;
199 SG::ReadCondHandle<PixelChargeCalibCondData> calibData_handle(
m_chargeDataKey,ctx);
200 if (!calibData_handle.isValid()) {
202 }
203 calibData=calibData_handle.cptr();
204 }
205
206
207 SG::WriteHandle<xAOD::TrackMeasurementValidationContainer> xaod(
m_write_xaod_key,ctx);
208 ATH_CHECK(xaod.record(std::make_unique<xAOD::TrackMeasurementValidationContainer>(),
209 std::make_unique<xAOD::TrackMeasurementValidationAuxContainer>()));
210
211 SG::WriteHandle<std::vector<unsigned int>> offsets(
m_write_offsets,ctx);
212 ATH_CHECK(offsets.record(std::make_unique<std::vector<unsigned int>>(
m_PixelHelper->wafer_hash_max(), 0)));
213
214 unsigned int have_truth_link=0
u;
215 unsigned int missing_truth_particle=0
u;
216 unsigned int missing_parent_particle=0
u;
217
219
221 SG::ReadCondHandle<PixelDCSHVData> dcsHV(
m_readKeyHV,ctx);
222 SG::ReadCondHandle<PixelDCSTempData> dcsTemp(
m_readKeyTemp,ctx);
223
224 std::unordered_map< unsigned int , std::vector<unsigned int> > cluster_map;
225 for( const auto clusterCollection : * PixelClusterContainer ){
226
227
228 (*offsets)[clusterCollection->identifyHash()] =
counter;
229
230
231 if( clusterCollection->empty() ) continue;
232
233
234 for( const InDet::PixelCluster* prd : *clusterCollection ){
236
237 Identifier clusterId = prd->identify();
240 }
241
242
244 unsigned int cluster_idx = xaod->size();
245 xaod->push_back(xprd);
246
247
249
250
253
254
256
257
259
261 if(localCov.size() == 1){
263 } else if(localCov.size() == 4){
265 } else {
267 }
268
269
270 std::vector< uint64_t > rdoIdentifierList;
271 rdoIdentifierList.reserve(prd->rdoList().size());
272 int rowmin=9999; int rowmax=-9999;
273 int colmin=9999; int colmax=-9999;
274 for( const auto &hitIdentifier : prd->rdoList() ){
275 rdoIdentifierList.push_back( hitIdentifier.get_compact() );
276
279 if(rowmin > row) rowmin =
row;
280 if(rowmax < row) rowmax =
row;
281 if(colmin > col) colmin = col;
282 if(colmax < col) colmax = col;
283 }
285
286
291 AUXDATA(xprd,
int,layer) = the_layer ;
292 AUXDATA(xprd,
int,phi_module) = the_phi ;
293 AUXDATA(xprd,
int,eta_module) = the_eta ;
296
297 cluster_map[ makeKey(the_phi, the_eta, the_layer)].push_back(cluster_idx);
298
299 const InDet::SiWidth cw = prd->width();
302 AUXDATA(xprd,
int,nRDO) = (
int)prd->rdoList().size();
303
305 AUXDATA(xprd,
int,ToT) = prd->totalToT();
306 AUXDATA(xprd,
int,LVL1A) = prd->LVL1A();
307
309 AUXDATA(xprd,
char,gangedPixel) = (
char)prd->gangedPixel();
310 const Trk::ClusterSplitProbabilityContainer::ProbabilityInfo &
312 AUXDATA(xprd,
char,isSplit) =
static_cast<char>(splitProb.
isSplit());
315
316
318
319
321 IdentifierHash moduleHash = clusterCollection->identifyHash();
323 AUXDATA(xprd,
int,DCSState) = dcsState->getModuleStatus(moduleHash);
324
325 float deplVoltage = 0.0;
326 AUXDATA(xprd,
float,BiasVoltage) = dcsHV->getBiasVoltage(moduleHash);
327 AUXDATA(xprd,
float,Temperature) = dcsTemp->getTemperature(moduleHash);
328 AUXDATA(xprd,
float,DepletionVoltage) = deplVoltage;
329
331
332 assert (calibData);
334 }
335
336
337
338 const InDetDD::SiDetectorElement* de = prd->detectorElement();
340 if(de){
344 }
345 }
346 AUXDATA(xprd,uint64_t,detectorElementID) = detElementId;
347
350
351 const InDetDD::PixelModuleDesign* design =
dynamic_cast<const InDetDD::PixelModuleDesign*
>(&de->
design());
356 InDetDD::SiLocalPosition centroid = 0.25*(pos1+pos2+pos3+pos4);
357
358 AUXDATA(xprd,
float,centroid_xphi) = centroid.
xPhi();
359 AUXDATA(xprd,
float,centroid_xeta) = centroid.
xEta();
360
361 AUXDATA(xprd,
float,omegax) = prd->omegax();
362 AUXDATA(xprd,
float,omegay) = prd->omegay();
363 }
364
365
366 if (prdmtColl) {
367 auto range{prdmtColl->equal_range(clusterId)};
368 if (truth_particle_links) {
369 std::vector<unsigned int> tp_indices;
371 ElementLink<xAOD::TruthParticleContainer> a_truth_particle_link = truth_particle_links->
find(
i->second);
372 if (a_truth_particle_link) {
374 if (truth_particle) {
375 ++have_truth_link;
376 tp_indices.push_back(static_cast<int>(truth_particle->index()));
377 }
378 else {
379 ++missing_parent_particle;
380 }
381 }
382 else {
383 tp_indices.push_back(std::numeric_limits<unsigned int>::max());
384 ++missing_truth_particle;
385 }
386 }
387
388 AUXDATA(xprd,std::vector<unsigned int>, truth_index) = tp_indices;
389 }
390 std::vector<int> uniqueIDs;
391 for (
auto i =
range.first; i !=
range.second; ++i) {
393 }
394
395 AUXDATA(xprd,std::vector<int>, truth_barcode) = uniqueIDs;
396 }
397
398 std::vector< std::vector< int > > sdo_tracks;
399
400
401 if (sdoCollection) {
403 }
404
405
406
411 }
412
415 }
416 }
417 }
418 }
419
420 for ( auto clusItr = xaod->begin(); clusItr != xaod->end(); ++clusItr ) {
421 AUXDATA(*clusItr,
char,broken) =
false;
422 }
426
427 static const SG::AuxElement::Accessor<int> acc_layer ("layer");
428 static const SG::AuxElement::Accessor<int> acc_phi_module ("phi_module");
429 static const SG::AuxElement::Accessor<int> acc_eta_module ("eta_module");
430 static const SG::AuxElement::Accessor<std::vector<int> > acc_sihit_barcode ("sihit_barcode");
431 for ( auto clusItr = xaod->begin(); clusItr != xaod->end(); ++clusItr)
432 {
434 int layer = acc_layer(*pixelCluster);
435 std::vector<int> uniqueIDs = acc_sihit_barcode(*pixelCluster);
436
437 const std::vector< unsigned int> &cluster_idx_list = cluster_map.at( makeKey(acc_phi_module(*pixelCluster), acc_eta_module(*pixelCluster), acc_layer(*pixelCluster) ));
438 for (unsigned int cluster_idx : cluster_idx_list) {
439 auto pixelCluster2 = xaod->at(cluster_idx);
440 if ( acc_layer(*pixelCluster2) != layer )
441 continue;
442 if ( acc_eta_module(*pixelCluster) != acc_eta_module(*pixelCluster2) )
443 continue;
444 if ( acc_phi_module(*pixelCluster) != acc_phi_module(*pixelCluster2) )
445 continue;
446
447 std::vector<int> uniqueIDs2 = acc_sihit_barcode(*pixelCluster2);
448
449 for ( auto uid : uniqueIDs ) {
450 if (std::find(uniqueIDs2.begin(), uniqueIDs2.end(), uid ) == uniqueIDs2.end()) continue;
451 static const SG::AuxElement::Accessor<char> acc_broken ("broken");
452 acc_broken(*pixelCluster) = true;
453 acc_broken(*pixelCluster2) = true;
454 break;
455 }
456 }
457 }
458
459 ATH_MSG_DEBUG(
" recorded PixelPrepData objects: size " << xaod->size() );
460
462
463 return StatusCode::SUCCESS;
464}
#define ATH_CHECK
Evaluate an expression and check for errors.
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
void addRdoInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *pixelCluster, const PixelChargeCalibCondData *calibData) const
std::atomic< unsigned int > m_missingTruthParticle
SG::ReadCondHandleKey< PixelDCSHVData > m_readKeyHV
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
SG::ReadHandleKey< xAODTruthParticleLinkVector > m_truthParticleLinks
SG::ReadCondHandleKey< PixelDCSTempData > m_readKeyTemp
std::atomic< unsigned int > m_missingParentParticle
void addNNTruthInfo(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *prd, const std::vector< SiHit > &matchingHits) const
SG::ReadCondHandleKey< PixelDCSStateData > m_condDCSStateKey
std::vector< std::vector< int > > addSDOInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *prd, const InDetSimDataCollection &sdoCollection) const
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