131{
132 const EventContext& ctx = Gaudi::Hive::currentContext();
133
135
137 {
139 return StatusCode::FAILURE;
140 }
141
142 const PRD_MultiTruthCollection* prdmtColl(nullptr);
143 const xAODTruthParticleLinkVector *truth_particle_links{nullptr};
145 SG::ReadHandle<PRD_MultiTruthCollection> prdmtCollHandle(
m_multiTruth_key,ctx);
146 if (prdmtCollHandle.isValid()) {
147 prdmtColl = &*prdmtCollHandle;
148 }
150 SG::ReadHandle<xAODTruthParticleLinkVector> truthParticleLinksHandle{
m_truthParticleLinks, ctx};
151 if (truthParticleLinksHandle.
isValid()) {
152 truth_particle_links = truthParticleLinksHandle.
cptr();
153 }
154 }
155 }
156
157 const InDetSimDataCollection* sdoCollection(nullptr);
160 if (sdoCollectionHandle.isValid()) {
161 sdoCollection = &*sdoCollectionHandle;
163 ATH_MSG_WARNING(
"SDO information requested, but SDO collection not available!");
164 }
165 }
166
167 SG::ReadHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainer;
168 bool foundSplitProbContainer = false;
171 if (!splitProbContainer.
isValid()) {
173 }
174 foundSplitProbContainer = true;
175 }
176
177 std::vector<std::vector<const SiHit*>> siHits(
m_PixelHelper->wafer_hash_max());
180 if (siHitCollectionHandle.isValid()) {
181 for (const SiHit& siHit: *siHitCollectionHandle) {
182
183 if (!siHit.isPixel()) continue;
184
185 Identifier wafer_id(
m_PixelHelper->wafer_id(siHit.getBarrelEndcap(),
186 siHit.getLayerDisk(),
187 siHit.getPhiModule(),
188 siHit.getEtaModule()));
189 IdentifierHash wafer_hash(
m_PixelHelper->wafer_hash(wafer_id));
191 siHits[wafer_hash].push_back(&siHit);
192 }
194 ATH_MSG_WARNING(
"SiHit information requested, but SiHit collection not available!");
195 }
196 }
197
198 const PixelChargeCalibCondData *calibData=nullptr;
200 SG::ReadCondHandle<PixelChargeCalibCondData> calibData_handle(
m_chargeDataKey,ctx);
201 if (!calibData_handle.isValid()) {
203 }
204 calibData=calibData_handle.cptr();
205 }
206
207
208 SG::WriteHandle<xAOD::TrackMeasurementValidationContainer> xaod(
m_write_xaod_key,ctx);
209 ATH_CHECK(xaod.record(std::make_unique<xAOD::TrackMeasurementValidationContainer>(),
210 std::make_unique<xAOD::TrackMeasurementValidationAuxContainer>()));
211
212 SG::WriteHandle<std::vector<unsigned int>> offsets(
m_write_offsets,ctx);
213 ATH_CHECK(offsets.record(std::make_unique<std::vector<unsigned int>>(
m_PixelHelper->wafer_hash_max(), 0)));
214
215 unsigned int have_truth_link=0
u;
216 unsigned int missing_truth_particle=0
u;
217 unsigned int missing_parent_particle=0
u;
218
220
222 SG::ReadCondHandle<PixelDCSHVData> dcsHV(
m_readKeyHV,ctx);
223 SG::ReadCondHandle<PixelDCSTempData> dcsTemp(
m_readKeyTemp,ctx);
224
225 std::unordered_map< unsigned int , std::vector<unsigned int> > cluster_map;
226 for( const auto clusterCollection : * PixelClusterContainer ){
227
228
229 (*offsets)[clusterCollection->identifyHash()] =
counter;
230
231
232 if( clusterCollection->empty() ) continue;
233
234
235 for( const InDet::PixelCluster* prd : *clusterCollection ){
237
238 Identifier clusterId = prd->identify();
241 }
242
243
245 unsigned int cluster_idx = xaod->size();
246 xaod->push_back(xprd);
247
248
250
251
254
255
257
258
260
262 if(localCov.size() == 1){
264 } else if(localCov.size() == 4){
266 } else {
268 }
269
270
271 std::vector< uint64_t > rdoIdentifierList;
272 rdoIdentifierList.reserve(prd->rdoList().size());
273 int rowmin=9999; int rowmax=-9999;
274 int colmin=9999; int colmax=-9999;
275 for( const auto &hitIdentifier : prd->rdoList() ){
276 rdoIdentifierList.push_back( hitIdentifier.get_compact() );
277
280 if(rowmin > row) rowmin =
row;
281 if(rowmax < row) rowmax =
row;
282 if(colmin > col) colmin = col;
283 if(colmax < col) colmax = col;
284 }
286
287
292 AUXDATA(xprd,
int,layer) = the_layer ;
293 AUXDATA(xprd,
int,phi_module) = the_phi ;
294 AUXDATA(xprd,
int,eta_module) = the_eta ;
297
298 cluster_map[ makeKey(the_phi, the_eta, the_layer)].push_back(cluster_idx);
299
300 const InDet::SiWidth cw = prd->width();
303 AUXDATA(xprd,
int,nRDO) = (
int)prd->rdoList().size();
304
306 AUXDATA(xprd,
int,ToT) = prd->totalToT();
307 AUXDATA(xprd,
int,LVL1A) = prd->LVL1A();
308
310 AUXDATA(xprd,
char,gangedPixel) = (
char)prd->gangedPixel();
311 const Trk::ClusterSplitProbabilityContainer::ProbabilityInfo &
313 AUXDATA(xprd,
char,isSplit) =
static_cast<char>(splitProb.
isSplit());
316
317
319
320
322 IdentifierHash moduleHash = clusterCollection->identifyHash();
324 AUXDATA(xprd,
int,DCSState) = dcsState->getModuleStatus(moduleHash);
325
326 float deplVoltage = 0.0;
327 AUXDATA(xprd,
float,BiasVoltage) = dcsHV->getBiasVoltage(moduleHash);
328 AUXDATA(xprd,
float,Temperature) = dcsTemp->getTemperature(moduleHash);
329 AUXDATA(xprd,
float,DepletionVoltage) = deplVoltage;
330
332
333 assert (calibData);
335 }
336
337
338
339 const InDetDD::SiDetectorElement* de = prd->detectorElement();
341 if(de){
345 }
346 }
347 AUXDATA(xprd,uint64_t,detectorElementID) = detElementId;
348
351
352 const InDetDD::PixelModuleDesign* design =
dynamic_cast<const InDetDD::PixelModuleDesign*
>(&de->
design());
357 InDetDD::SiLocalPosition centroid = 0.25*(pos1+pos2+pos3+pos4);
358
359 AUXDATA(xprd,
float,centroid_xphi) = centroid.
xPhi();
360 AUXDATA(xprd,
float,centroid_xeta) = centroid.
xEta();
361
362 AUXDATA(xprd,
float,omegax) = prd->omegax();
363 AUXDATA(xprd,
float,omegay) = prd->omegay();
364 }
365
366
367 if (prdmtColl) {
368 auto range{prdmtColl->equal_range(clusterId)};
369 if (truth_particle_links) {
370 std::vector<unsigned int> tp_indices;
372 ElementLink<xAOD::TruthParticleContainer> a_truth_particle_link = truth_particle_links->
find(
i->second);
373 if (a_truth_particle_link) {
375 if (truth_particle) {
376 ++have_truth_link;
377 tp_indices.push_back(
static_cast<int>(truth_particle->
index()));
378 }
379 else {
380 ++missing_parent_particle;
381 }
382 }
383 else {
384 tp_indices.push_back(std::numeric_limits<unsigned int>::max());
385 ++missing_truth_particle;
386 }
387 }
388
389 AUXDATA(xprd,std::vector<unsigned int>, truth_index) = tp_indices;
390 }
391 std::vector<int> uniqueIDs;
392 for (
auto i =
range.first; i !=
range.second; ++i) {
394 }
395
396 AUXDATA(xprd,std::vector<int>, truth_barcode) = uniqueIDs;
397 }
398
399 std::vector< std::vector< int > > sdo_tracks;
400
401
402 if (sdoCollection) {
404 }
405
406
407
412 }
413
416 }
417 }
418 }
419 }
420
421 for ( auto clusItr = xaod->begin(); clusItr != xaod->end(); ++clusItr ) {
422 AUXDATA(*clusItr,
char,broken) =
false;
423 }
427
432 for ( auto clusItr = xaod->begin(); clusItr != xaod->end(); ++clusItr)
433 {
435 int layer = acc_layer(*pixelCluster);
436 std::vector<int> uniqueIDs = acc_sihit_barcode(*pixelCluster);
437
438 const std::vector< unsigned int> &cluster_idx_list = cluster_map.at( makeKey(acc_phi_module(*pixelCluster), acc_eta_module(*pixelCluster), acc_layer(*pixelCluster) ));
439 for (unsigned int cluster_idx : cluster_idx_list) {
440 auto pixelCluster2 = xaod->at(cluster_idx);
441 if ( acc_layer(*pixelCluster2) != layer )
442 continue;
443 if ( acc_eta_module(*pixelCluster) != acc_eta_module(*pixelCluster2) )
444 continue;
445 if ( acc_phi_module(*pixelCluster) != acc_phi_module(*pixelCluster2) )
446 continue;
447
448 std::vector<int> uniqueIDs2 = acc_sihit_barcode(*pixelCluster2);
449
450 for ( auto uid : uniqueIDs ) {
451 if (std::find(uniqueIDs2.begin(), uniqueIDs2.end(), uid ) == uniqueIDs2.end()) continue;
452 static const SG::AuxElement::Accessor<char> acc_broken ("broken");
453 acc_broken(*pixelCluster) = true;
454 acc_broken(*pixelCluster2) = true;
455 break;
456 }
457 }
458 }
459
460 ATH_MSG_DEBUG(
" recorded PixelPrepData objects: size " << xaod->size() );
461
463
464 return StatusCode::SUCCESS;
465}
#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
SG::Accessor< T, ALLOC > Accessor
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.
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