fix/stop LamNI per-sub-tomogram scilog entries

LamNI's tomo_scan() wrote a separate scilog entry ("Starting subtomo:
N...") every time the sub-tomogram number changed -- 8 extra entries
per tomo_type-1 scan, and one per sub-tomogram traversed for types 2/3
-- leftover behavior carried over from omny.py during the flomni->lamni
port. Flomni itself never does this: it only writes at scan start (PDF
report) and scan end (timing summary). Removed the three
_write_subtomo_to_scilog() call sites and the now-unused method so
LamNI's scilog behavior matches Flomni's.

Also fixed a stale test (test_tomo_queue_reacquire_rejects_when_another_job_is_incomplete)
that encoded the old, buggy tomo_queue_reacquire() invariant (rejecting
on ANY other job being incomplete/running) rather than the fixed one
from the prior commit (only an EARLIER job is a real conflict) --
split it into two tests covering both directions.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
x01dc
2026-07-21 15:59:02 +02:00
co-authored by Claude Sonnet 5
parent 887c732865
commit 636dd0ec88
3 changed files with 20 additions and 20 deletions
@@ -771,17 +771,6 @@ class LamNI(TomoQueueMixin, LamNIAlignmentMixin, LamNIOpticsMixin, LamniGuiTools
except Exception:
logger.warning("Failed to write to scilog.")
def _write_subtomo_to_scilog(self, subtomo_number):
bec = builtins.__dict__.get("bec")
if self.tomo_id > 0:
tags = ["BEC_subtomo", self.sample_name, f"tomo_id_{self.tomo_id}"]
else:
tags = ["BEC_subtomo", self.sample_name]
self.write_to_scilog(
f"Starting subtomo: {subtomo_number}. First scan number: {bec.queue.next_scan_number}.",
tags,
)
_TIMING_LOG_DIR = "~/data/raw/logs/timing_statistics"
_TIMING_SETUP = "lamni"
_PROJECTION_TIMING_LOG = "projection_timing_log.jsonl"
@@ -1306,8 +1295,6 @@ class LamNI(TomoQueueMixin, LamNIAlignmentMixin, LamNIOpticsMixin, LamniGuiTools
def sub_tomo_scan(self, subtomo_number, start_angle=None):
"""Perform one sub-tomogram (tomo_type 1 only)."""
self._write_subtomo_to_scilog(subtomo_number)
angles, N = self._subtomo_angle_plan(
subtomo_number, self.tomo_angle_stepsize, start_angle=start_angle
)
@@ -1564,7 +1551,6 @@ class LamNI(TomoQueueMixin, LamNIAlignmentMixin, LamNIOpticsMixin, LamniGuiTools
ii, self.golden_ratio_bunch_size, maxangle=360, reverse=True
)
if previous_subtomo_number != subtomo_number:
self._write_subtomo_to_scilog(subtomo_number)
if (
subtomo_number % 2 == 1
and ii > 10
@@ -1603,7 +1589,6 @@ class LamNI(TomoQueueMixin, LamNIAlignmentMixin, LamNIOpticsMixin, LamniGuiTools
ii, int(360 / self.tomo_angle_stepsize), maxangle=360, reverse=True
)
if previous_subtomo_number != subtomo_number:
self._write_subtomo_to_scilog(subtomo_number)
if (
subtomo_number % 2 == 1
and ii > 10
@@ -46,7 +46,6 @@ def make_lamni(tomo_angle_stepsize: float) -> LamNI:
obj._progress_proxy = _ProgressProxy(obj.client)
obj.tomo_angle_stepsize = tomo_angle_stepsize
obj.tomo_id = -1
obj._write_subtomo_to_scilog = lambda subtomo_number: None
return obj
@@ -82,7 +82,6 @@ def make_flomni():
def test_lamni_resolve_type1_projection_matches_sub_tomo_scan(stepsize):
lamni = make_lamni()
lamni.tomo_angle_stepsize = stepsize
lamni._write_subtomo_to_scilog = lambda subtomo_number: None
recorded = {}
lamni._tomo_scan_at_angle = lambda angle, subtomo_number: recorded.__setitem__(
lamni.progress["projection"], (subtomo_number, angle)
@@ -219,7 +218,21 @@ def test_tomo_queue_reacquire_rejects_command_job():
lamni.tomo_queue_reacquire(0, projection_number=0)
def test_tomo_queue_reacquire_rejects_when_another_job_is_incomplete():
def test_tomo_queue_reacquire_rejects_when_an_earlier_job_is_incomplete():
lamni = make_lamni()
lamni.tomo_type = 1
lamni.tomo_angle_stepsize = 10.0
i0 = lamni.tomo_queue_add(label="job0")
i1 = lamni.tomo_queue_add(label="job1")
lamni._tomo_queue_proxy.update(i0, status="incomplete")
with pytest.raises(TomoQueueError):
lamni.tomo_queue_reacquire(i1, projection_number=0)
def test_tomo_queue_reacquire_allows_a_later_job_being_incomplete():
# A later job's own status doesn't matter -- it gets reset to
# "pending" by this call anyway, so it's not a real conflict.
lamni = make_lamni()
lamni.tomo_type = 1
lamni.tomo_angle_stepsize = 10.0
@@ -227,8 +240,11 @@ def test_tomo_queue_reacquire_rejects_when_another_job_is_incomplete():
i1 = lamni.tomo_queue_add(label="job1")
lamni._tomo_queue_proxy.update(i1, status="incomplete")
with pytest.raises(TomoQueueError):
lamni.tomo_queue_reacquire(i0, projection_number=0)
lamni.tomo_queue_reacquire(i0, projection_number=0)
jobs = lamni._tomo_queue_proxy.as_list()
assert jobs[i0]["status"] == "incomplete"
assert jobs[i1]["status"] == "pending"
def test_tomo_queue_reacquire_allows_targeting_the_incomplete_job_itself():