43 ATH_MSG_INFO(
"Statistics from Seed check with truth info:" );
47 return StatusCode::FAILURE;
52 return StatusCode::FAILURE;
55 for (
const auto& [trackCollectionName, onTrackStat] : m_onTrack_clusterStat) {
56 std::string reportName =
"On Track Clusters (" + trackCollectionName +
")";
58 ATH_MSG_FATAL(
"Problem dumping On Track Cluster truth info (" << trackCollectionName <<
")");
59 return StatusCode::FAILURE;
63 for (
const auto& [trackCollectionName, trackStat] : m_trackStat) {
64 std::string reportName =
"Track (" + trackCollectionName +
")";
66 ATH_MSG_FATAL(
"Problem dumping Track truth info (" << trackCollectionName <<
")");
67 return StatusCode::FAILURE;
71 return StatusCode::SUCCESS;
82 std::array<const ActsTrk::MeasurementToTruthParticleAssociation*, s_nClusterTypes> truths {};
84 for (std::size_t i(0); i<
m_clusters.size(); ++i) {
90 if (clusters->empty())
continue;
96 truths[
static_cast<std::size_t
>(elementType)] = truthHandle.
cptr();
99 ATH_CHECK( truths[
static_cast<std::size_t
>(elementType)]->isCompatibleWith(clusters) );
102 *truths[
static_cast<std::size_t
>(elementType)],
108 for (std::size_t i(0); i<
m_seeds.size(); ++i) {
121 for (std::size_t i(0); i<
m_tracks.size(); ++i) {
132 onTrack_clusterStat) );
138 return StatusCode::SUCCESS;
148 std::size_t clusterTypeIndex =
static_cast<std::size_t
>(meas->type());
150 const auto& tps = truth.at(meas->index());
159 bool allValidParticles =
true;
160 for (
const auto* tp : tps) {
162 allValidParticles =
false;
166 if (tps.size() == 1) {
170 else if (tps.size() == 2) {
180 bool hasContributionFromPrimaryParticle =
false;
181 for (
const auto* tp : tps) {
183 hasContributionFromPrimaryParticle =
true;
191 return StatusCode::SUCCESS;
196 std::array<const ActsTrk::MeasurementToTruthParticleAssociation*, s_nClusterTypes>& truths,
200 for (std::size_t i(0); i<seeds.
size(); ++i) {
204 int nMeasurements = 0;
205 std::unordered_map<std::size_t, int> particleIds {};
210 const auto& sps = seed.sp();
212 const auto& measurements =
sp->measurements();
216 std::size_t clusterTypeIndex = Acts::toUnderlying(meas->type());
218 auto tps = truth->at(meas->index());
220 if (tps.empty())
continue;
222 bool contributionOnlyFromSimulationParticles =
true;
223 for (
const auto* tp : tps) {
225 contributionOnlyFromSimulationParticles =
false;
228 particleIds.try_emplace( pid, 0 );
231 if (contributionOnlyFromSimulationParticles)
continue;
240 bool isFromSameParticle =
false;
241 for (
const auto [pid, nEntries] : particleIds) {
242 if (nEntries != nMeasurements)
continue;
243 isFromSameParticle =
true;
250 }
else if (nMatches == 1) {
252 }
else if (nMatches == 2) {
255 }
else if (nMatches == 3) {
258 }
else if (nMatches == 4) {
261 }
else if (nMatches == 5) {
264 }
else if (nMatches == 6) {
270 return StatusCode::SUCCESS;
305 std::array<const ActsTrk::MeasurementToTruthParticleAssociation*, s_nClusterTypes>& truths,
309 for (
const auto track : tracks) {
311 std::size_t nHoles = track.nHoles();
317 std::size_t nOutliers = track.nOutliers();
324 bool AllValids =
true;
325 int nConsideredMeasurements = 0;
326 std::unordered_map<std::size_t, int> particleIds {};
330 .trackStateContainer().visitBackwards(track.tipIndex(),
331 [&truths, &onTrackStat,
333 &nConsideredMeasurements, &particleIds]
334 (
const auto& state) {
335 auto flags = state.typeFlags();
336 if (not flags.hasMeasurement()) return;
337 ++nConsideredMeasurements;
340 auto sl = state.getUncalibratedSourceLink().template get<ATLASUncalibSourceLink>();
341 assert( sl != nullptr);
342 const xAOD::UncalibratedMeasurement &meas = getUncalibratedMeasurement(sl);
344 std::size_t clusterTypeIndex = Acts::toUnderlying(meas.type());
345 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNTotal)][clusterTypeIndex];
347 const ActsTrk::MeasurementToTruthParticleAssociation* truth = truths[clusterTypeIndex];
348 const auto& tps = truth->at(meas.index());
351 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWithNoBarcode)][clusterTypeIndex];
356 bool allBarcodesValid =
true;
357 bool hasContributionFromPrimaryParticle =
false;
358 for (
const auto* tp : tps) {
360 hasContributionFromPrimaryParticle =
true;
363 allBarcodesValid =
false;
366 if (not hasContributionFromPrimaryParticle) AllValids =
false;
368 if (tps.size() == 1) {
369 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith1Contribution)][clusterTypeIndex];
370 if (allBarcodesValid) ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith1ValidContribution)][clusterTypeIndex];
372 else if (tps.size() == 2) {
373 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith2Contribution)][clusterTypeIndex];
374 if (allBarcodesValid) ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith2ValidContribution)][clusterTypeIndex];
377 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith3Contribution)][clusterTypeIndex];
378 if (allBarcodesValid) ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith3ValidContribution)][clusterTypeIndex];
381 bool contributionOnlyFromSimulationParticles =
true;
382 for (
const auto* tp : tps) {
384 contributionOnlyFromSimulationParticles =
false;
387 particleIds.try_emplace( pid, 0 );
396 bool AllSameBarcode =
false;
397 for (
const auto [pid, nEntries] : particleIds ) {
398 if (nEntries != nConsideredMeasurements)
continue;
399 AllSameBarcode =
true;
407 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