Execute method.
96{
97
99
101 {
103 return StatusCode::FAILURE;
104 }
105
106 const PRD_MultiTruthCollection* prdmtColl(nullptr);
107 const xAODTruthParticleLinkVector *truth_particle_links{nullptr};
109 SG::ReadHandle<PRD_MultiTruthCollection> prdmtCollHandle(
m_multiTruth_key,ctx);
110 if (prdmtCollHandle.isValid()) {
111 prdmtColl = &*prdmtCollHandle;
112 }
114 SG::ReadHandle<xAODTruthParticleLinkVector> truthParticleLinksHandle{
m_truthParticleLinks, ctx};
115 if (truthParticleLinksHandle.
isValid()) {
116 truth_particle_links = truthParticleLinksHandle.
cptr();
117 }
118 }
119 }
120
121 const InDetSimDataCollection* sdoCollection(nullptr);
124 if (sdoCollectionHandle.isValid()) {
125 sdoCollection = &*sdoCollectionHandle;
127 ATH_MSG_WARNING(
"SDO information requested, but SDO collection not available!");
128 }
129 }
130
131 SG::ReadHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainer;
132 bool foundSplitProbContainer = false;
135 if (!splitProbContainer.
isValid()) {
137 }
138 foundSplitProbContainer = true;
139 }
140
141 std::vector<std::vector<const SiHit*>> siHits(
m_PixelHelper->wafer_hash_max());
144 if (siHitCollectionHandle.isValid()) {
145 for (const SiHit& siHit: *siHitCollectionHandle) {
146
147 if (!siHit.isPixel()) continue;
148
149 Identifier wafer_id(
m_PixelHelper->wafer_id(siHit.getBarrelEndcap(),
150 siHit.getLayerDisk(),
151 siHit.getPhiModule(),
152 siHit.getEtaModule()));
153 IdentifierHash wafer_hash(
m_PixelHelper->wafer_hash(wafer_id));
155 siHits[wafer_hash].push_back(&siHit);
156 }
158 ATH_MSG_WARNING(
"SiHit information requested, but SiHit collection not available!");
159 }
160 }
161
162 const PixelChargeCalibCondData *calibData=nullptr;
164 SG::ReadCondHandle<PixelChargeCalibCondData> calibData_handle(
m_chargeDataKey,ctx);
165 if (!calibData_handle.isValid()) {
167 }
168 calibData=calibData_handle.cptr();
169 }
170
171
172 SG::WriteHandle<xAOD::TrackMeasurementValidationContainer> xaod(
m_write_xaod_key,ctx);
173 ATH_CHECK(xaod.record(std::make_unique<xAOD::TrackMeasurementValidationContainer>(),
174 std::make_unique<xAOD::TrackMeasurementValidationAuxContainer>()));
175
176 SG::WriteHandle<std::vector<unsigned int>> offsets(
m_write_offsets,ctx);
177 ATH_CHECK(offsets.record(std::make_unique<std::vector<unsigned int>>(
m_PixelHelper->wafer_hash_max(), 0)));
178
179 unsigned int have_truth_link=0
u;
180 unsigned int missing_truth_particle=0
u;
181 unsigned int missing_parent_particle=0
u;
182
184
186 SG::ReadCondHandle<PixelDCSHVData> dcsHV(
m_readKeyHV,ctx);
187 SG::ReadCondHandle<PixelDCSTempData> dcsTemp(
m_readKeyTemp,ctx);
188
189 std::unordered_map< unsigned int , std::vector<unsigned int> > cluster_map;
190 for( const auto clusterCollection : * PixelClusterContainer ){
191
192
193 (*offsets)[clusterCollection->identifyHash()] =
counter;
194
195
196 if( clusterCollection->empty() ) continue;
197
198
199 for( const InDet::PixelCluster* prd : *clusterCollection ){
201
202 Identifier clusterId = prd->identify();
205 }
206
207
209 unsigned int cluster_idx = xaod->size();
210 xaod->push_back(xprd);
211
212
214
215
218
219
221
222
224
226 if(localCov.size() == 1){
228 } else if(localCov.size() == 4){
230 } else {
232 }
233
234
235 std::vector< uint64_t > rdoIdentifierList;
236 rdoIdentifierList.reserve(prd->rdoList().size());
237 int rowmin=9999; int rowmax=-9999;
238 int colmin=9999; int colmax=-9999;
239 for( const auto &hitIdentifier : prd->rdoList() ){
240 rdoIdentifierList.push_back( hitIdentifier.get_compact() );
241
244 if(rowmin > row) rowmin =
row;
245 if(rowmax < row) rowmax =
row;
246 if(colmin > col) colmin = col;
247 if(colmax < col) colmax = col;
248 }
250
251
256 AUXDATA(xprd,
int,layer) = the_layer ;
257 AUXDATA(xprd,
int,phi_module) = the_phi ;
258 AUXDATA(xprd,
int,eta_module) = the_eta ;
261
262 cluster_map[ makeKey(the_phi, the_eta, the_layer)].push_back(cluster_idx);
263
264 const InDet::SiWidth cw = prd->width();
267 AUXDATA(xprd,
int,nRDO) = (
int)prd->rdoList().size();
268
270 AUXDATA(xprd,
int,ToT) = prd->totalToT();
271 AUXDATA(xprd,
int,LVL1A) = prd->LVL1A();
272
274 AUXDATA(xprd,
char,gangedPixel) = (
char)prd->gangedPixel();
275 const Trk::ClusterSplitProbabilityContainer::ProbabilityInfo &
277 AUXDATA(xprd,
char,isSplit) =
static_cast<char>(splitProb.
isSplit());
280
281
283
284
286 IdentifierHash moduleHash = clusterCollection->identifyHash();
288 AUXDATA(xprd,
int,DCSState) = dcsState->getModuleStatus(moduleHash);
289
290 float deplVoltage = 0.0;
291 AUXDATA(xprd,
float,BiasVoltage) = dcsHV->getBiasVoltage(moduleHash);
292 AUXDATA(xprd,
float,Temperature) = dcsTemp->getTemperature(moduleHash);
293 AUXDATA(xprd,
float,DepletionVoltage) = deplVoltage;
294
296
297 assert (calibData);
299 }
300
301
302
303 const InDetDD::SiDetectorElement* de = prd->detectorElement();
305 if(de){
309 }
310 }
311 AUXDATA(xprd,uint64_t,detectorElementID) = detElementId;
312
315
316 const InDetDD::PixelModuleDesign* design =
static_cast<const InDetDD::PixelModuleDesign*
>(&de->
design());
321 InDetDD::SiLocalPosition centroid = 0.25*(pos1+pos2+pos3+pos4);
322
323 AUXDATA(xprd,
float,centroid_xphi) = centroid.
xPhi();
324 AUXDATA(xprd,
float,centroid_xeta) = centroid.
xEta();
325
326 AUXDATA(xprd,
float,omegax) = prd->omegax();
327 AUXDATA(xprd,
float,omegay) = prd->omegay();
328 }
329
330
331 if (prdmtColl) {
332 auto range{prdmtColl->equal_range(clusterId)};
333 if (truth_particle_links) {
334 std::vector<unsigned int> tp_indices;
336 ElementLink<xAOD::TruthParticleContainer> a_truth_particle_link = truth_particle_links->
find(
i->second);
337 if (a_truth_particle_link) {
339 if (truth_particle) {
340 ++have_truth_link;
341 tp_indices.push_back(static_cast<int>(truth_particle->index()));
342 }
343 else {
344 ++missing_parent_particle;
345 }
346 }
347 else {
348 tp_indices.push_back(std::numeric_limits<unsigned int>::max());
349 ++missing_truth_particle;
350 }
351 }
352
353 AUXDATA(xprd,std::vector<unsigned int>, truth_index) = std::move(tp_indices);
354 }
355 std::vector<int> uniqueIDs;
356 for (
auto i =
range.first; i !=
range.second; ++i) {
358 }
359 AUXDATA(xprd,std::vector<int>, truth_barcode) = std::move(uniqueIDs);
360 }
361
362 std::vector< std::vector< int > > sdo_tracks;
363
364
365 if (sdoCollection) {
367 }
368
369
370
375 }
376
379 }
380 }
381 }
382 }
383
384 for ( auto clusItr = xaod->begin(); clusItr != xaod->end(); ++clusItr ) {
385 AUXDATA(*clusItr,
char,broken) =
false;
386 }
390
391 static const SG::AuxElement::Accessor<int> acc_layer ("layer");
392 static const SG::AuxElement::Accessor<int> acc_phi_module ("phi_module");
393 static const SG::AuxElement::Accessor<int> acc_eta_module ("eta_module");
394 static const SG::AuxElement::Accessor<std::vector<int> > acc_sihit_barcode ("sihit_barcode");
395 for ( auto clusItr = xaod->begin(); clusItr != xaod->end(); ++clusItr)
396 {
398 int layer = acc_layer(*pixelCluster);
399 std::vector<int> uniqueIDs = acc_sihit_barcode(*pixelCluster);
400
401 const std::vector< unsigned int> &cluster_idx_list = cluster_map.at( makeKey(acc_phi_module(*pixelCluster), acc_eta_module(*pixelCluster), acc_layer(*pixelCluster) ));
402 for (unsigned int cluster_idx : cluster_idx_list) {
403 auto pixelCluster2 = xaod->at(cluster_idx);
404 if ( acc_layer(*pixelCluster2) != layer )
405 continue;
406 if ( acc_eta_module(*pixelCluster) != acc_eta_module(*pixelCluster2) )
407 continue;
408 if ( acc_phi_module(*pixelCluster) != acc_phi_module(*pixelCluster2) )
409 continue;
410
411 std::vector<int> uniqueIDs2 = acc_sihit_barcode(*pixelCluster2);
412
413 for ( auto uid : uniqueIDs ) {
414 if (std::find(uniqueIDs2.begin(), uniqueIDs2.end(), uid ) == uniqueIDs2.end()) continue;
415 static const SG::AuxElement::Accessor<char> acc_broken ("broken");
416 acc_broken(*pixelCluster) = true;
417 acc_broken(*pixelCluster2) = true;
418 break;
419 }
420 }
421 }
422
423 ATH_MSG_DEBUG(
" recorded PixelPrepData objects: size " << xaod->size() );
424
426
427 return StatusCode::SUCCESS;
428}
#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
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
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