48 ATH_MSG_INFO(
"Statistics from Seed check with truth info:" );
52 return StatusCode::FAILURE;
57 return StatusCode::FAILURE;
60 for (
const auto& [trackCollectionName, onTrackStat] : m_onTrack_clusterStat) {
61 std::string reportName =
"On Track Clusters (" + trackCollectionName +
")";
63 ATH_MSG_FATAL(
"Problem dumping On Track Cluster truth info (" << trackCollectionName <<
")");
64 return StatusCode::FAILURE;
68 for (
const auto& [trackCollectionName, trackStat] : m_trackStat) {
69 std::string reportName =
"Track (" + trackCollectionName +
")";
71 ATH_MSG_FATAL(
"Problem dumping Track truth info (" << trackCollectionName <<
")");
72 return StatusCode::FAILURE;
76 return StatusCode::SUCCESS;
87 std::array<const ActsTrk::MeasurementToTruthParticleAssociation*, s_nClusterTypes> truths {};
89 for (std::size_t i(0); i<
m_clusters.size(); ++i) {
95 if (clusters->empty())
continue;
101 truths[
static_cast<std::size_t
>(elementType)] = truthHandle.
cptr();
104 ATH_CHECK( truths[
static_cast<std::size_t
>(elementType)]->isCompatibleWith(clusters) );
107 *truths[
static_cast<std::size_t
>(elementType)],
113 for (std::size_t i(0); i<
m_seeds.size(); ++i) {
126 for (std::size_t i(0); i<
m_tracks.size(); ++i) {
137 onTrack_clusterStat) );
143 return StatusCode::SUCCESS;
201 std::array<const ActsTrk::MeasurementToTruthParticleAssociation*, s_nClusterTypes>& truths,
205 for (std::size_t i(0); i<seeds.size(); ++i) {
209 int nMeasurements = 0;
210 std::unordered_map<std::size_t, int> particleIds {};
215 const auto& sps = seed.sp();
217 const auto& measurements = sp->measurements();
223 auto tps = truth->at(meas->index());
225 if (tps.empty())
continue;
227 bool contributionOnlyFromSimulationParticles =
true;
228 for (
const auto* tp : tps) {
230 contributionOnlyFromSimulationParticles =
false;
233 particleIds.try_emplace( pid, 0 );
236 if (contributionOnlyFromSimulationParticles)
continue;
245 bool isFromSameParticle =
false;
246 for (
const auto [pid, nEntries] : particleIds) {
247 if (nEntries != nMeasurements)
continue;
248 isFromSameParticle =
true;
255 }
else if (nMatches == 1) {
257 }
else if (nMatches == 2) {
260 }
else if (nMatches == 3) {
263 }
else if (nMatches == 4) {
266 }
else if (nMatches == 5) {
269 }
else if (nMatches == 6) {
275 return StatusCode::SUCCESS;
310 std::array<const ActsTrk::MeasurementToTruthParticleAssociation*, s_nClusterTypes>& truths,
314 for (
const auto track : tracks) {
316 std::size_t nHoles = track.nHoles();
322 std::size_t nOutliers = track.nOutliers();
329 bool AllValids =
true;
330 int nConsideredMeasurements = 0;
331 std::unordered_map<std::size_t, int> particleIds {};
335 .trackStateContainer().visitBackwards(track.tipIndex(),
336 [&truths, &onTrackStat,
338 &nConsideredMeasurements, &particleIds]
339 (
const auto& state) {
340 auto flags = state.typeFlags();
341 if (not flags.test(Acts::TrackStateFlag::MeasurementFlag) and
342 not flags.test(Acts::TrackStateFlag::OutlierFlag)) return;
343 ++nConsideredMeasurements;
346 auto sl = state.getUncalibratedSourceLink().template get<ATLASUncalibSourceLink>();
347 assert( sl != nullptr);
348 const xAOD::UncalibratedMeasurement &meas = getUncalibratedMeasurement(sl);
350 std::size_t clusterTypeIndex = to_underlying(meas.type());
351 ++onTrackStat[to_underlying(EStatClusters::kNTotal)][clusterTypeIndex];
353 const ActsTrk::MeasurementToTruthParticleAssociation* truth = truths[clusterTypeIndex];
354 const auto& tps = truth->at(meas.index());
357 ++onTrackStat[to_underlying(EStatClusters::kNClustersWithNoBarcode)][clusterTypeIndex];
362 bool allBarcodesValid =
true;
363 bool hasContributionFromPrimaryParticle =
false;
364 for (
const auto* tp : tps) {
366 hasContributionFromPrimaryParticle =
true;
369 allBarcodesValid =
false;
372 if (not hasContributionFromPrimaryParticle) AllValids =
false;
374 if (tps.size() == 1) {
375 ++onTrackStat[to_underlying(EStatClusters::kNClustersWith1Contribution)][clusterTypeIndex];
376 if (allBarcodesValid) ++onTrackStat[to_underlying(EStatClusters::kNClustersWith1ValidContribution)][clusterTypeIndex];
378 else if (tps.size() == 2) {
379 ++onTrackStat[to_underlying(EStatClusters::kNClustersWith2Contribution)][clusterTypeIndex];
380 if (allBarcodesValid) ++onTrackStat[to_underlying(EStatClusters::kNClustersWith2ValidContribution)][clusterTypeIndex];
383 ++onTrackStat[to_underlying(EStatClusters::kNClustersWith3Contribution)][clusterTypeIndex];
384 if (allBarcodesValid) ++onTrackStat[to_underlying(EStatClusters::kNClustersWith3ValidContribution)][clusterTypeIndex];
387 bool contributionOnlyFromSimulationParticles =
true;
388 for (
const auto* tp : tps) {
390 contributionOnlyFromSimulationParticles =
false;
393 particleIds.try_emplace( pid, 0 );
402 bool AllSameBarcode =
false;
403 for (
const auto [pid, nEntries] : particleIds ) {
404 if (nEntries != nConsideredMeasurements)
continue;
405 AllSameBarcode =
true;
413 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
std::array< std::array< std::size_t, 1 >, static_cast< std::size_t >(EStatTracks::kNStat)> track_stat_t
SeedType deduceSeedType(const ActsTrk::Seed &) const
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
virtual StatusCode initialize() override
SG::ReadHandleKeyArray< xAOD::UncalibratedMeasurementContainer > m_clusters
SG::ReadHandleKeyArray< ActsTrk::MeasurementToTruthParticleAssociation > m_associationMap_key
std::array< std::array< std::size_t, s_nSeedTypes >, static_cast< std::size_t >(EStatSeeds::kNStat)> seed_stat_t