44 ATH_MSG_INFO(
"Statistics from Seed check with truth info:" );
48 return StatusCode::FAILURE;
53 return StatusCode::FAILURE;
56 for (
const auto& [trackCollectionName, onTrackStat] : m_onTrack_clusterStat) {
57 std::string reportName =
"On Track Clusters (" + trackCollectionName +
")";
59 ATH_MSG_FATAL(
"Problem dumping On Track Cluster truth info (" << trackCollectionName <<
")");
60 return StatusCode::FAILURE;
64 for (
const auto& [trackCollectionName, trackStat] : m_trackStat) {
65 std::string reportName =
"Track (" + trackCollectionName +
")";
67 ATH_MSG_FATAL(
"Problem dumping Track truth info (" << trackCollectionName <<
")");
68 return StatusCode::FAILURE;
72 return StatusCode::SUCCESS;
83 std::array<const ActsTrk::MeasurementToTruthParticleAssociation*, s_nClusterTypes> truths {};
85 for (std::size_t i(0); i<
m_clusters.size(); ++i) {
90 if (clusters->empty())
continue;
97 ATH_CHECK( truths[Acts::toUnderlying(elementType)]->sourceContainer() == clusters);
100 *truths[Acts::toUnderlying(elementType)],
106 for (std::size_t i(0); i<
m_seeds.size(); ++i) {
115 for (std::size_t i(0); i<
m_tracks.size(); ++i) {
125 onTrack_clusterStat) );
131 return StatusCode::SUCCESS;
141 std::size_t clusterTypeIndex = Acts::toUnderlying(meas->type());
143 const auto& tps = truth.at(meas->index());
152 bool allValidParticles =
true;
153 for (
const auto* tp : tps) {
155 allValidParticles =
false;
159 if (tps.size() == 1) {
163 else if (tps.size() == 2) {
173 bool hasContributionFromPrimaryParticle =
false;
174 for (
const auto* tp : tps) {
176 hasContributionFromPrimaryParticle =
true;
184 return StatusCode::SUCCESS;
189 std::array<const ActsTrk::MeasurementToTruthParticleAssociation*, s_nClusterTypes>& truths,
193 for (std::size_t i(0); i<seeds.
size(); ++i) {
197 int nMeasurements = 0;
198 std::unordered_map<std::size_t, int> particleIds {};
203 const auto& sps = seed.sp();
205 const auto& measurements =
sp->measurements();
209 std::size_t clusterTypeIndex = Acts::toUnderlying(meas->type());
211 auto tps = truth->at(meas->index());
213 if (tps.empty())
continue;
215 bool contributionOnlyFromSimulationParticles =
true;
216 for (
const auto* tp : tps) {
218 contributionOnlyFromSimulationParticles =
false;
221 particleIds.try_emplace( pid, 0 );
224 if (contributionOnlyFromSimulationParticles)
continue;
233 bool isFromSameParticle =
false;
234 for (
const auto [pid, nEntries] : particleIds) {
235 if (nEntries != nMeasurements)
continue;
236 isFromSameParticle =
true;
243 }
else if (nMatches == 1) {
245 }
else if (nMatches == 2) {
248 }
else if (nMatches == 3) {
251 }
else if (nMatches == 4) {
254 }
else if (nMatches == 5) {
257 }
else if (nMatches == 6) {
263 return StatusCode::SUCCESS;
298 std::array<const ActsTrk::MeasurementToTruthParticleAssociation*, s_nClusterTypes>& truths,
302 for (
const auto track : tracks) {
304 std::size_t nHoles = track.nHoles();
310 std::size_t nOutliers = track.nOutliers();
317 bool AllValids =
true;
318 int nConsideredMeasurements = 0;
319 std::unordered_map<std::size_t, int> particleIds {};
323 .trackStateContainer().visitBackwards(track.tipIndex(),
324 [&truths, &onTrackStat,
326 &nConsideredMeasurements, &particleIds]
327 (
const auto& state) {
328 auto flags = state.typeFlags();
329 if (not flags.hasMeasurement()) return;
330 ++nConsideredMeasurements;
333 auto meas = detail::xAODUncalibMeasCalibrator::unpack(state.getUncalibratedSourceLink());
334 assert( meas != nullptr);
337 std::size_t clusterTypeIndex = Acts::toUnderlying(meas->type());
338 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNTotal)][clusterTypeIndex];
340 const ActsTrk::MeasurementToTruthParticleAssociation* truth = truths[clusterTypeIndex];
341 const auto& tps = truth->at(meas->index());
344 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWithNoBarcode)][clusterTypeIndex];
349 bool allBarcodesValid =
true;
350 bool hasContributionFromPrimaryParticle =
false;
351 for (
const auto* tp : tps) {
353 hasContributionFromPrimaryParticle =
true;
356 allBarcodesValid =
false;
359 if (not hasContributionFromPrimaryParticle) AllValids =
false;
361 if (tps.size() == 1) {
362 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith1Contribution)][clusterTypeIndex];
363 if (allBarcodesValid) ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith1ValidContribution)][clusterTypeIndex];
365 else if (tps.size() == 2) {
366 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith2Contribution)][clusterTypeIndex];
367 if (allBarcodesValid) ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith2ValidContribution)][clusterTypeIndex];
370 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith3Contribution)][clusterTypeIndex];
371 if (allBarcodesValid) ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith3ValidContribution)][clusterTypeIndex];
374 bool contributionOnlyFromSimulationParticles =
true;
375 for (
const auto* tp : tps) {
377 contributionOnlyFromSimulationParticles =
false;
380 particleIds.try_emplace( pid, 0 );
389 bool AllSameBarcode =
false;
390 for (
const auto [pid, nEntries] : particleIds ) {
391 if (nEntries != nConsideredMeasurements)
continue;
392 AllSameBarcode =
true;
400 return StatusCode::SUCCESS;
SG::ReadHandleKeyArray< ActsTrk::SeedContainer > m_seeds
StatusCode fillStatClusters(const xAOD::UncalibratedMeasurementContainer &container, const ActsTrk::MeasurementToTruthParticleAssociation &truth, cluster_stat_t &stat) const
virtual StatusCode execute(const EventContext &ctx) const override
SeedType deduceSeedType(const ActsTrk::Seed &) const
std::array< std::array< std::size_t, 1 >, static_cast< std::size_t >(EStatTracks::kNStat)> track_stat_t
std::array< std::array< std::size_t, s_nClusterTypes >, static_cast< std::size_t >(EStatClusters::kNStat)> cluster_stat_t
StatusCode printStatTables(const std::string &objectCollectionName, const stat_t &stat) const
SG::ReadHandleKeyArray< ActsTrk::TrackContainer > m_tracks
virtual StatusCode finalize() override
StatusCode copyStatTable(const stat_t &contextual, stat_t &global) const
ActsInspectTruthContentAlg(const std::string &name, ISvcLocator *pSvcLocator)
StatusCode fillStatTracks(const ActsTrk::TrackContainer &tracks, std::array< const ActsTrk::MeasurementToTruthParticleAssociation *, s_nClusterTypes > &truths, track_stat_t &trackStat, cluster_stat_t &onTrackClusterStat) const
StatusCode fillStatSeeds(const ActsTrk::SeedContainer &seeds, std::array< const ActsTrk::MeasurementToTruthParticleAssociation *, s_nClusterTypes > &truths, seed_stat_t &stat) const
std::array< std::array< std::size_t, s_nSeedTypes >, static_cast< std::size_t >(EStatSeeds::kNStat)> seed_stat_t
virtual StatusCode initialize() override
SG::ReadHandleKeyArray< xAOD::UncalibratedMeasurementContainer > m_clusters
SG::ReadHandleKeyArray< ActsTrk::MeasurementToTruthParticleAssociation > m_associationMap_key