From 34ab50be524c4f83f14e99674e61d55870a158d8 Mon Sep 17 00:00:00 2001 From: Wouter Deconinck Date: Wed, 29 Jul 2026 13:28:37 -0500 Subject: [PATCH 1/2] fix: use std::map for deterministic digi raw hit ordering Replace unordered_map with map in SiliconTrackerDigi and MPGDTrackerDigi. std::map iterates in ascending key order, making output ordering deterministic without a separate sort step or intermediate vector. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/algorithms/digi/MPGDTrackerDigi.cc | 17 ++++++++--------- src/algorithms/digi/SiliconTrackerDigi.cc | 11 +++++------ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/algorithms/digi/MPGDTrackerDigi.cc b/src/algorithms/digi/MPGDTrackerDigi.cc index 43f90ecdaa..83d2fd3bf2 100644 --- a/src/algorithms/digi/MPGDTrackerDigi.cc +++ b/src/algorithms/digi/MPGDTrackerDigi.cc @@ -133,7 +133,6 @@ #include #include #include -#include #include #include @@ -251,7 +250,7 @@ void MPGDTrackerDigi::process(const MPGDTrackerDigi::Input& input, std::normal_distribution gaussian; // Maps of unique cellIDs with temporary structure RawHit - std::unordered_map cell_hit_maps[2]; + std::map cell_hit_maps[2]; // A map of strip cellIDs with vector of contributing cellIDs std::map> stripID2cIDs; // Prepare for strip segmentation @@ -354,7 +353,7 @@ void MPGDTrackerDigi::process(const MPGDTrackerDigi::Input& input, // ***** APPLY THRESHOLD / STORE (sim_hit -> stripIDs) / ACCUMULATION // (Note: Threshold is applied first. See issue #1722 in // "https://github.com/eic/EICrecon/issues/1722".) - std::unordered_map& cell_hit_map = + std::map& cell_hit_map = gsl::at(cell_hit_maps, pn); double g = m_cfg.gain; for (auto clusterHit : cluster) { @@ -396,10 +395,10 @@ void MPGDTrackerDigi::process(const MPGDTrackerDigi::Input& input, // ***** RawHit INSTANTIATION AND RawHit<-SimHits ASSOCIATION: for (auto& cell_hit_map : cell_hit_maps) { - for (auto item : cell_hit_map) { - raw_hits->push_back(item.second); - CellID stripID = item.first; - const auto is = stripID2cIDs.find(stripID); + for (const auto& [stripID, hit] : cell_hit_map) { + raw_hits->push_back(hit); + const auto raw_hit = raw_hits->at(raw_hits->size() - 1); + const auto is = stripID2cIDs.find(stripID); if (is == stripID2cIDs.end()) { error(R"(Inconsistency: CellID {:x} not found in "stripID2cIDs" map)", stripID); throw std::runtime_error(R"(Inconsistency in the handling of "stripID2cIDs" map)"); @@ -410,13 +409,13 @@ void MPGDTrackerDigi::process(const MPGDTrackerDigi::Input& input, if (sim_hit.getCellID() == cID) { // create link auto link = links->create(); - link.setFrom(item.second); + link.setFrom(raw_hit); link.setTo(sim_hit); link.setWeight(1.0); // set association auto hitassoc = associations->create(); hitassoc.setWeight(1.0); - hitassoc.setRawHit(item.second); + hitassoc.setRawHit(raw_hit); hitassoc.setSimHit(sim_hit); } } diff --git a/src/algorithms/digi/SiliconTrackerDigi.cc b/src/algorithms/digi/SiliconTrackerDigi.cc index a9a20ef4a6..5014fba126 100644 --- a/src/algorithms/digi/SiliconTrackerDigi.cc +++ b/src/algorithms/digi/SiliconTrackerDigi.cc @@ -13,7 +13,6 @@ #include #include #include -#include #include #include "SiliconTrackerDigi.h" @@ -35,7 +34,7 @@ void SiliconTrackerDigi::process(const SiliconTrackerDigi::Input& input, std::normal_distribution gaussian; // A map of unique cellIDs with temporary structure RawHit - std::unordered_map cell_hit_map; + std::map cell_hit_map; for (const auto& sim_hit : *sim_hits) { @@ -83,15 +82,15 @@ void SiliconTrackerDigi::process(const SiliconTrackerDigi::Input& input, } } - for (auto item : cell_hit_map) { - raw_hits->push_back(item.second); + for (const auto& [cell_id, hit] : cell_hit_map) { + raw_hits->push_back(hit); auto raw_hit = raw_hits->at(raw_hits->size() - 1); for (const auto& sim_hit : *sim_hits) { - if (item.first == sim_hit.getCellID()) { + if (cell_id == sim_hit.getCellID()) { // create link auto link = links->create(); - link.setFrom(item.second); + link.setFrom(raw_hit); link.setTo(sim_hit); link.setWeight(1.0); // set association From c73d3f272bfe192d597d5162fd1ae56e29782659 Mon Sep 17 00:00:00 2001 From: epic-capybara <139920704+epic-capybara@users.noreply.github.com> Date: Wed, 29 Jul 2026 15:24:54 -0400 Subject: [PATCH 2/2] fix: use std::map for deterministic digi raw hit ordering (fix: iwyu) (#2811) This PR applies the include-what-you-use fixes as suggested by https://github.com/eic/EICrecon/actions/runs/30480148342. Please merge this PR into the branch `wdconinc-fix-digi-determinism-map` to resolve failures in PR #2808. Auto-generated by [create-pull-request][1] [1]: https://github.com/peter-evans/create-pull-request Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/algorithms/digi/SiliconTrackerDigi.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/algorithms/digi/SiliconTrackerDigi.cc b/src/algorithms/digi/SiliconTrackerDigi.cc index 5014fba126..c275dd00a7 100644 --- a/src/algorithms/digi/SiliconTrackerDigi.cc +++ b/src/algorithms/digi/SiliconTrackerDigi.cc @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include