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) {
91 if (clusters->empty())
continue;
97 truths[
static_cast<std::size_t
>(elementType)] = truthHandle.
cptr();
100 ATH_CHECK( truths[
static_cast<std::size_t
>(elementType)]->isCompatibleWith(clusters) );
103 *truths[
static_cast<std::size_t
>(elementType)],
109 for (std::size_t i(0); i<
m_seeds.size(); ++i) {
122 for (std::size_t i(0); i<
m_tracks.size(); ++i) {
133 onTrack_clusterStat) );
139 return StatusCode::SUCCESS;
149 std::size_t clusterTypeIndex =
static_cast<std::size_t
>(meas->type());
151 const auto& tps = truth.at(meas->index());
160 bool allValidParticles =
true;
161 for (
const auto* tp : tps) {
163 allValidParticles =
false;
167 if (tps.size() == 1) {
171 else if (tps.size() == 2) {
181 bool hasContributionFromPrimaryParticle =
false;
182 for (
const auto* tp : tps) {
184 hasContributionFromPrimaryParticle =
true;
192 return StatusCode::SUCCESS;
197 std::array<const ActsTrk::MeasurementToTruthParticleAssociation*, s_nClusterTypes>& truths,
201 for (std::size_t i(0); i<seeds.
size(); ++i) {
205 int nMeasurements = 0;
206 std::unordered_map<std::size_t, int> particleIds {};
211 const auto& sps = seed.sp();
213 const auto& measurements =
sp->measurements();
217 std::size_t clusterTypeIndex = Acts::toUnderlying(meas->type());
219 auto tps = truth->at(meas->index());
221 if (tps.empty())
continue;
223 bool contributionOnlyFromSimulationParticles =
true;
224 for (
const auto* tp : tps) {
226 contributionOnlyFromSimulationParticles =
false;
229 particleIds.try_emplace( pid, 0 );
232 if (contributionOnlyFromSimulationParticles)
continue;
241 bool isFromSameParticle =
false;
242 for (
const auto [pid, nEntries] : particleIds) {
243 if (nEntries != nMeasurements)
continue;
244 isFromSameParticle =
true;
251 }
else if (nMatches == 1) {
253 }
else if (nMatches == 2) {
256 }
else if (nMatches == 3) {
259 }
else if (nMatches == 4) {
262 }
else if (nMatches == 5) {
265 }
else if (nMatches == 6) {
271 return StatusCode::SUCCESS;
306 std::array<const ActsTrk::MeasurementToTruthParticleAssociation*, s_nClusterTypes>& truths,
310 for (
const auto track : tracks) {
312 std::size_t nHoles = track.nHoles();
318 std::size_t nOutliers = track.nOutliers();
325 bool AllValids =
true;
326 int nConsideredMeasurements = 0;
327 std::unordered_map<std::size_t, int> particleIds {};
331 .trackStateContainer().visitBackwards(track.tipIndex(),
332 [&truths, &onTrackStat,
334 &nConsideredMeasurements, &particleIds]
335 (
const auto& state) {
336 auto flags = state.typeFlags();
337 if (not flags.hasMeasurement()) return;
338 ++nConsideredMeasurements;
341 auto meas = detail::xAODUncalibMeasCalibrator::unpack(state.getUncalibratedSourceLink());
342 assert( meas != nullptr);
345 std::size_t clusterTypeIndex = Acts::toUnderlying(meas->type());
346 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNTotal)][clusterTypeIndex];
348 const ActsTrk::MeasurementToTruthParticleAssociation* truth = truths[clusterTypeIndex];
349 const auto& tps = truth->at(meas->index());
352 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWithNoBarcode)][clusterTypeIndex];
357 bool allBarcodesValid =
true;
358 bool hasContributionFromPrimaryParticle =
false;
359 for (
const auto* tp : tps) {
361 hasContributionFromPrimaryParticle =
true;
364 allBarcodesValid =
false;
367 if (not hasContributionFromPrimaryParticle) AllValids =
false;
369 if (tps.size() == 1) {
370 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith1Contribution)][clusterTypeIndex];
371 if (allBarcodesValid) ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith1ValidContribution)][clusterTypeIndex];
373 else if (tps.size() == 2) {
374 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith2Contribution)][clusterTypeIndex];
375 if (allBarcodesValid) ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith2ValidContribution)][clusterTypeIndex];
378 ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith3Contribution)][clusterTypeIndex];
379 if (allBarcodesValid) ++onTrackStat[Acts::toUnderlying(EStatClusters::kNClustersWith3ValidContribution)][clusterTypeIndex];
382 bool contributionOnlyFromSimulationParticles =
true;
383 for (
const auto* tp : tps) {
385 contributionOnlyFromSimulationParticles =
false;
388 particleIds.try_emplace( pid, 0 );
397 bool AllSameBarcode =
false;
398 for (
const auto [pid, nEntries] : particleIds ) {
399 if (nEntries != nConsideredMeasurements)
continue;
400 AllSameBarcode =
true;
408 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