Refactor/parallel and dedup #1

Merged
tka merged 10 commits from refactor/parallel-and-dedup into main 2026-07-31 15:20:33 -05:00
2 changed files with 23 additions and 19 deletions
Showing only changes of commit 52e91d46fd - Show all commits
+9 -6
View File
@@ -2540,12 +2540,15 @@ class SrasViewerWindow(QMainWindow):
ref_idx = 0
threshold_mv = self.spin_threshold_mv.value()
seed: dict[int, ManualAngleParams] = {}
if (self._alignment_result is not None
and self._alignment_result.ref_angle_idx == ref_idx):
seed = {a: ManualAngleParams(t.rotation_deg, t.shift_mm)
for a, t in self._alignment_result.per_angle.items()}
threshold_mv = self._alignment_result.dc_threshold_mv
else:
# Seed only from a previously *saved manual* alignment (this dialog's
# own Save also writes this sidecar) -- never from self._alignment_result
# when it holds the automatic Fusion -> Angle Alignment's output. That
# path's translation comes from FFT phase correlation, which is the
# very thing manual mode exists to work around; inheriting it here
# would silently reintroduce the same bad translations under a
# "manual" label, on top of the (correct) analytic rotation, which is
# exactly what makes manual mode look like it "still does the same
# thing" the automatic one does.
sidecar = load_manual_alignment(self._sras)
if sidecar is not None and sidecar.ref_angle_idx == ref_idx:
seed = dict(sidecar.per_angle)
+9 -8
View File
@@ -278,19 +278,20 @@ def main():
-(float(s.angles_deg[a]) - float(s.angles_deg[0])))
for a in range(s.n_angles)))
# --- Open, seeding from the still-live automatic AlignmentResult --------
# --- Open: must NOT seed from the still-live automatic AlignmentResult --
# The automatic result's translation comes from FFT phase correlation --
# the very thing manual mode exists to work around -- so manual mode
# must start from identity (centroids coincide, zero shift) regardless
# of whatever the automatic run last computed. Only a previously *saved
# manual* alignment (sidecar) should ever seed this dialog.
win._on_manual_alignment()
check("dialog opened", win._manual_align_dialog is not None)
dlg = win._manual_align_dialog
check("mask prep needed no background worker (already DC-cached)",
not win._job_running("manual_align_masks"))
r = win._alignment_result # still the automatic result from the block above
if r is not None:
check("seeded rotation matches the automatic result",
all(dlg._angle_params[a].rotation_deg == r.per_angle[a].rotation_deg
for a in range(s.n_angles)))
check("seeded shift matches the automatic result",
all(dlg._angle_params[a].shift_mm == r.per_angle[a].shift_mm
check("no manual sidecar yet -> dialog starts at identity, not the "
"automatic result",
all(dlg._angle_params[a] == compute.ManualAngleParams()
for a in range(s.n_angles)))
# --- Reference angle is locked -------------------------------------------