Rugnux report: low warning thresholds, worded as prompts to check; ice apart from powder
Build Packages / Create release (push) Successful in 15s
Build Packages / build:rugnux:aarch64 (cross) (push) Successful in 7m56s
Build Packages / build:rugnux-tgz (x86_64) (push) Successful in 8m39s
Build Packages / build:viewer-tgz:cpu (push) Successful in 10m23s
Build Packages / build:viewer-tgz:cuda (push) Successful in 12m48s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 15m22s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 16m11s
Build Packages / build:windows:nocuda (push) Successful in 18m24s
Build Packages / build:windows:cuda (push) Successful in 20m42s
Build Packages / HDF5 consumer tests (DIALS, XDS) (push) Successful in 24m38s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 19m11s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 19m24s
Build Packages / Generate python client (push) Successful in 45s
Build Packages / build:rugnux:windows (push) Successful in 11m0s
Build Packages / Build documentation (push) Successful in 1m22s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 20m36s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 19m52s
Build Packages / build:rpm (rocky8) (push) Successful in 18m15s
Build Packages / build:rpm (rocky9) (push) Successful in 18m10s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 14m2s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 12m29s
Build Packages / Unit tests (push) Successful in 1h14m50s

Owner decision: a warning is a prompt to check and must catch the real cases (9min) at the
cost of some spurious ones. The physically motivated corrections stay (<|L|> outside its
physical range is not twinning; a single sweep's indexing choice; NO_LATTICE on rotation;
the no-crystal report); thresholds raised only to cut noise come back down:

- SUPERCELL_POSSIBLE warns wherever the class measures and rocks (as before rc173's audit
  fix), worded as "check the cell", naming weak ordered intensity of a correct cell and spots
  of further lattice domains as the other readings. 9min (rock 4.2%) warns again.
- LATTICE_TRANSLATION warns on every admitted vector (>=75% of the origin); below 90% the
  wording names a very strong pseudo-translation as the other reading.
- PSEUDO_TRANSLATION warns on every detection; below a 20% peak it is worded as weak, check.
- SWEEP_GAPS warns where the degraded ranges cover at least 1% of the sweep (the 4 sets of 77
  below that had 1-2 frames, 0.4-0.6% of the sweep).
- Powder rings are split between hexagonal-ice positions and the rest (MeasurePowderRings,
  report-only fields); ICE_RINGS and POWDER_RINGS warn separately from 5% of the spots, and
  ICE_RINGS also where the merge's ice gate found ice.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D1G8gJVAy6gp1K5Dz3NE5C
This commit is contained in:
2026-09-26 14:02:05 +02:00
co-authored by Claude Opus 5.5
parent 8a8c992cca
commit e9da892790
8 changed files with 182 additions and 127 deletions
+21
View File
@@ -144,3 +144,24 @@ TEST_CASE("MaxSpotCount_InputFloor") {
REQUIRE_NOTHROW(s.MaxSpotCount(MIN_SPOT_COUNT));
REQUIRE(s.GetMaxSpotCount() == MIN_SPOT_COUNT);
}
// The ring share is split between rings on hexagonal-ice positions and the rest, so a report can say
// which it is.
TEST_CASE("MeasurePowderRings_SplitsIceFromOtherRings", "[SpotUtils]") {
const float half_width = 0.01f;
std::vector<float> q;
// A smooth spot density over 0.5-3.0 1/A...
for (int i = 0; i < 5000; ++i)
q.push_back(0.5f + 2.5f * static_cast<float>(i) / 5000.0f);
// ...one ring at the 3.661 A ice line, and one at 5.000 A, which is not ice.
for (int i = 0; i < 400; ++i) {
q.push_back(6.283185307f / 3.661f);
q.push_back(6.283185307f / 5.000f);
}
const auto pw = MeasurePowderRings(q, half_width);
REQUIRE(pw.rings_q_recipA.size() == 2);
CHECK(pw.ice_ring_count == 1);
CHECK(pw.ice_spot_fraction > 0.05f);
CHECK(pw.non_ice_spot_fraction > 0.05f);
CHECK(pw.ice_spot_fraction + pw.non_ice_spot_fraction == Catch::Approx(pw.spot_fraction));
}