Flomni commissioning 4 #250

Merged
holler merged 33 commits from flomni_commissioning_4 into main 2026-07-07 10:41:41 +02:00
33 Commits
Author SHA1 Message Date
holler 5bf37becad Merge branch 'main' into flomni_commissioning_4
CI for csaxs_bec / test (push) Successful in 1m34s
CI for csaxs_bec / test (pull_request) Successful in 1m31s
2026-07-07 10:39:54 +02:00
x12sa 608708448f rt_flomni: add ConstEmitter client access to RtFlomniController
CI for csaxs_bec / test (push) Successful in 1m35s
CI for csaxs_bec / test (pull_request) Successful in 1m47s
Expose the flOMNI ConstEmitter runtime constants (served over the control-loop
TCP server, command letter 'e') to BEC users. These were previously baked into
Orchestra module parameter files; they can now be read and set live.

New RtFlomniController methods (all added to USER_ACCESS):
  emitter_get()                                  -> dict of the four values
  emitter_show_all()                             -> PrettyTable printout
  emitter_set_tracking_target_y(val)             -> "ey<val>"
  emitter_set_tracking_target_z(val)             -> "ez<val>"
  emitter_set_intensity_threshold_laser(val)     -> "et<val>"
  emitter_set_psd_intensity_threshold_tracking_low(val) -> "el<val>"

emitter_get issues "es" and parses the CSV reply
(targetpos_tracking_y, targetpos_tracking_z, intensity_threshold_laser,
PSD_intensity_threshold_tracking_low), same pattern as the Ts/sr readouts.
Setters use socket_put with a fixed %.4f value, same pattern as the pa
setpoint command; they are fire-and-forget (the server does not ack sets).

The rotation-loop laser threshold (intensity_threshold_rot_laser) is a startup
constant on the server side and is intentionally neither read back nor settable
here.

Named methods were chosen over a single opaque command to match the existing
laser_tracker_* / feedback_* convention and to self-document each value.

Requires the corresponding flOMNI control-loop change (ConstEmitter module +
'e' command in CommunicationServer). Additive change; no existing behaviour
modified.
2026-07-06 11:23:30 +02:00
x12sa 0b019b0490 flomni: add laser_parameters CLI and laser_tweak tool
Expose the ConstEmitter runtime constants through the high-level flomni
interface, alongside the existing laser_tracker_* methods, and add an
interactive tweak tool for the two tracking target positions.

New methods on FlomniSampleTransferMixin (thin wrappers delegating to
dev.rtx.controller, same pattern as laser_tracker_show_all):
  laser_parameters_show_all()
  laser_parameters_set_targety(val)
  laser_parameters_set_targetz(val)
  laser_parameters_set_intensity_threshold_laser(val)
  laser_parameters_set_psd_intensity_threshold_tracking_low(val)

laser_tweak(): interactive 2D raw-terminal loop for the two tracking targets,
modeled on OMNYTools.tweak_cursor.
  left/right : target y -/+   (fixed 0.01 step, absolute set of current +/- step)
  up/down    : target z +/-
  s          : return both targets to their launch positions
  q          : quit (terminal state restored in finally)
On launch and after every change it prints the current y/z targets and the
fzp x interferometer signal (read_ssi_interferometer channel 1), so the signal
response can be watched while tweaking.

termios/tty/fcntl/sys are imported locally in laser_tweak to avoid touching
module-level imports. Additive change; no existing behaviour modified. Requires
the ConstEmitter emitter_* methods on RtFlomniController.
2026-07-06 11:20:30 +02:00
x12sa 5e51f7d7e4 webpage_generator: keep scanning->blocked silent (no scan-stopped warning)
CI for csaxs_bec / test (push) Successful in 1m32s
A block is external and self-resolving, so the immediate "measurement stopped,
confirm" warning chime was misleading there - the user cannot act on it and
should just wait. Suppress startWarning when the destination status is blocked;
the blocked track still handles it (silent until the 60-min blockedChime, then
hourly). scanning->idle (success tone) and scanning->other (warning tone) are
unchanged. Help text updated.
2026-07-06 10:30:24 +02:00
x12sa bda617428d config update
CI for csaxs_bec / test (push) Successful in 1m30s
2026-07-06 09:54:59 +02:00
x12sa b686ef24eb webpage_generator: success chime on finish + trim mobile empty scroll space
CI for csaxs_bec / test (push) Successful in 1m29s
- Audio: a normal finish (scanning -> idle) now plays a rising success
  arpeggio (C5-E5-G5) instead of the falling warning chime, so a completed
  measurement is audibly distinct from a stop to any other state (which keeps
  the falling 660->440 warning). startWarning(finished) selects the chime for
  both the initial tone and the 30s repeats; the Watch LED text reads
  "Measurement finished" vs "Measurement stopped" accordingly. Help text
  updated.
- Layout: body uses min-height:100dvh (with 100vh fallback) so the page no
  longer extends below the visible viewport on mobile, where iOS 100vh counts
  the retracted-toolbar height and leaves empty scroll room at the bottom.
2026-07-06 09:41:00 +02:00
x12sa ac1ade2faf webpage_generator: instrument pane shows full live measurement parameters
CI for csaxs_bec / test (push) Successful in 1m34s
The instrument-details pane showed only a hand-built 6-row settings summary,
far less than the tomo queue shows per job, and nothing useful for a tomo
started outside the queue.

- Flomni _collect_setup_data now returns current_params: the tomo parameters
  read live from global vars, keyed by the same names the queue stores in
  job.params (_CURRENT_PARAM_KEYS, matching TQ_PARAM_DISPLAY). Values left raw;
  the page formats them. Replaces the old settings dict.
- Extract the queue's param-table builder into a shared buildParamRows() JS
  helper (carries the computed Projections row), used by both the queue and the
  new instrument 'Current measurement' section, so they can't drift.
- renderInstrument renders current_params via buildParamRows (Sample name row
  first); card hides only when there are neither params nor temperatures.
- Base _collect_setup_data contract updated: settings -> current_params.
2026-07-06 08:53:15 +02:00
x12sa a8fb13ca96 feat(flomni): guard umvr_fsamy_tracked against enabled rt feedback
CI for csaxs_bec / test (push) Successful in 1m36s
umvr_fsamy_tracked/umv_fsamy_tracked require feedback OFF but did not
enforce it. Add an _internal flag; for user/CLI calls, warn that feedback
must be off (active alignment may be lost), prompt (default yes), and
disable feedback on confirm. Internal callers pass _internal=True since
they already manage the feedback lifecycle (ftransfer_flomni_stage_out,
x_ray_eye_align height-centering and mvy jog).
2026-07-05 20:42:39 +02:00
x12sa 5c57ec2515 fix timeout at end of acqusition
CI for csaxs_bec / test (push) Successful in 1m30s
2026-07-05 15:28:31 +02:00
x12sa 7f3259d541 fix(flomni): use _flomnigui_is_missing guard in show_cameras
CI for csaxs_bec / test (push) Successful in 1m32s
Match the deleted-widget detection used by all other flomniGuiTools
methods. The previous _flomnigui_check_attribute_not_exists path relied
on hasattr(self.gui.flomni, "Image"/"Image_0"), which returns stale/
mismatched results when docks are recreated, leaving an empty window
after a user closed the GUI mid sample-transfer. _is_deleted() checks
registry membership and reliably triggers a rebuild.
2026-07-05 11:33:07 +02:00
x12sa c131bccada fix: add timeout to MCS card status checks to prevent deadlock
CI for csaxs_bec / test (push) Successful in 1m34s
2026-07-05 10:24:00 +02:00
x12sa 11e5dbe5ce webpage_generator: tomo queue - don't reopen a manually collapsed running job
CI for csaxs_bec / test (push) Successful in 1m30s
renderTomoQueue auto-opened the running job whenever the open-state snapshot
was empty, so collapsing the only open job (the running one) made the snapshot
empty and re-opened it on the next refresh. Open-state was also keyed by
positional index, which mis-assigns the flag when jobs are added/removed/
reordered.

- Snapshot open jobs by stable key (added_at|label) via a data-key attribute
  instead of positional index.
- Auto-open a running job only once, on first appearance, tracked in
  window.__tqAutoOpened; afterwards honor the DOM snapshot so a manual collapse
  sticks. Prune the set when jobs disappear.
2026-07-05 09:06:12 +02:00
x12sa 4975b3e3ca webpage_generator: report blocked on interlock even when scan is interrupted
CI for csaxs_bec / test (push) Successful in 1m34s
A block interrupts the running scan, clearing active_request_block, so
the old _derive_status() (which only returned 'blocked' inside the
queue_has_active_scan branch) fell through to 'idle' with the blocked
LED off, despite watched beamline states being out of spec.

- _derive_status: return 'blocked' on beamline_blocking OR queue_locks,
  independent of active scan; only fresh-heartbeat 'scanning' outranks it.
- _cycle: beamline_blocking = enabled is True AND any(state mismatched).
  Gated on enabled so a disabled/unknown interlock with an out-of-spec
  state does not raise BLOCKED. Also counted as activity so the idle
  clock restarts once cleared.
- beamline-states card summary updated in lock-step: mismatched states are
  only called "currently blocking" when enabled, else "out of spec
  (interlock disabled/unknown, not blocking)", so pill and card can't
  disagree.
- status-detail JS: describe blocking beamline states when no explicit
  queue lock is present. Update help text.
2026-07-05 08:53:30 +02:00
x12sa daf527b8df webpage_generator: make tomo-queue and tomo-type formula setup-configurable
CI for csaxs_bec / test (push) Successful in 1m36s
webpage_generator: report blocked on interlock even when scan is interrupted

- Add HAS_TOMO_QUEUE and TOMO_TYPES capability flags to
  WebpageGeneratorBase, defaulting to flomni's current behavior
  (type1 grid-8, type2/3 golden-capped) so this is a no-op for flomni.
- Gate the tomo_queue global-var read in _cycle() behind
  HAS_TOMO_QUEUE; unaffected: queue_status/queue_locks/beamline_states,
  which come from BEC's own primary scan queue and stay common to
  all setups.
- _render_html() now conditionally emits the 'Tomo queue' card and
  its DEFAULT_ORDER slot, and drives the projection-count formula
  from a TOMO_TYPES JSON blob (generic calcProjections()) instead of
  a hardcoded per-instrument JS branch.
- LamniWebpageGenerator: HAS_TOMO_QUEUE=False, TOMO_TYPES with
  2-subtomo and 8-subtomo equally_spaced_grid entries (placeholder
  keys pending real tomo_type values from the LamNI producer side).

A block interrupts the running scan, clearing active_request_block, so
the old _derive_status() (which only returned 'blocked' inside the
queue_has_active_scan branch) fell through to 'idle' with the blocked
LED off, despite watched beamline states being out of spec.

- _derive_status: return 'blocked' on beamline_blocking OR queue_locks,
  independent of active scan; only fresh-heartbeat 'scanning' outranks it.
- _cycle: compute beamline_blocking = any(state mismatched), defined
  identically to the beamline-states card so pill and card can't disagree;
  also count it as activity so the idle clock restarts once cleared.
- status-detail JS: describe blocking beamline states when no explicit
  queue lock is present. Update help text."
2026-07-05 05:20:51 +02:00
x12sa dab331f9d0 docs update
CI for csaxs_bec / test (push) Successful in 1m28s
2026-07-04 08:16:03 +02:00
x12sa 625a9f1063 fix(flomni): warn on OSA position vs IN-position clearance mismatch in ffzp_info
CI for csaxs_bec / test (push) Successful in 1m32s
fosaz_info previously only reported remaining collision clearance for the
live fosaz position, giving no indication of clearance once OSA is moved
back to its defined IN position if foptz has shifted while OSA was OUT.

Now compares live fosaz against fosaz_in (10 um tolerance):
- if live fosaz is further IN than nominal (closer to collision), warn and
  show current remaining space (the number that matters right now)
- if OSA is OUT/away from IN, no warning, but also report remaining space
  at the IN position using current foptz, as a heads-up before moving OSA in
2026-07-04 08:09:23 +02:00
x12sa 89df83286f feat/webpage_generator: make tomo-queue and tomo-type formula setup-configurable
CI for csaxs_bec / test (push) Successful in 1m32s
- Add HAS_TOMO_QUEUE and TOMO_TYPES capability flags to
  WebpageGeneratorBase, defaulting to flomni's current behavior
  (type1 grid-8, type2/3 golden-capped) so this is a no-op for flomni.
- Gate the tomo_queue global-var read in _cycle() behind
  HAS_TOMO_QUEUE; unaffected: queue_status/queue_locks/beamline_states,
  which come from BEC's own primary scan queue and stay common to
  all setups.
- _render_html() now conditionally emits the 'Tomo queue' card and
  its DEFAULT_ORDER slot, and drives the projection-count formula
  from a TOMO_TYPES JSON blob (generic calcProjections()) instead of
  a hardcoded per-instrument JS branch.
- LamniWebpageGenerator: HAS_TOMO_QUEUE=False, TOMO_TYPES with
  2-subtomo and 8-subtomo equally_spaced_grid entries (placeholder
  keys pending real tomo_type values from the LamNI producer side).
2026-07-04 07:50:01 +02:00
x12sa c514cbfb79 added umv fsamy tracked command to docs 2026-07-04 07:16:25 +02:00
x12sa 41e63b0ba4 updated osa parameters for abes fzp
CI for csaxs_bec / test (push) Successful in 1m33s
2026-07-03 15:53:44 +02:00
x12sa 225a4e6f65 feat(flomni): log per-projection and per-tomogram scan timing AND guard tomo_scan_projection against single-point mode
CI for csaxs_bec / test (push) Successful in 1m30s
Add JSONL timing logs under ~/data/raw/logs/timing_statistics/ for
building a scan-time prediction model. Times each projection in
_tomo_scan_at_angle (final successful attempt only, retries excluded)
and each tomogram in tomo_scan, capturing raw scan parameters plus
elapsed/idle/active durations.

tomo_scan_projection always runs a fermat scan; warn and confirm when
called directly with single_point_instead_of_fermat_scan set, pointing
to tomo_acquire_at_angle instead. Internal callers pass _internal=True
to skip the prompt.
2026-07-03 15:05:55 +02:00
x12sa da3d417e59 docs updated
CI for csaxs_bec / test (push) Successful in 1m33s
2026-07-03 13:32:31 +02:00
x12sa 1a5126096d random offset control added to gui, and json file writing 2026-07-03 13:28:34 +02:00
x12sa a1295ac967 option for random offset in single point acquisitions 2026-07-03 13:28:02 +02:00
x12sa be900c228e parameter update 2026-07-03 12:10:28 +02:00
x12sa 7e656ea9c1 list active account on webpage top 2026-07-03 11:34:35 +02:00
x12sa e6a5568faf fix in writing reconstruction file 2026-07-03 11:29:35 +02:00
x12sa 65c2d5e080 table in queue modified
CI for csaxs_bec / test (push) Successful in 1m31s
2026-07-03 07:19:59 +02:00
x12sa 3d6b6d448d config update 2026-07-03 07:02:37 +02:00
x12sa cb66b967f6 block entry while queue or tomo heartbeat 2026-07-03 07:02:30 +02:00
x12sa 4d225c2d79 adjustments 2026-07-03 07:02:07 +02:00
x12sa e2b9fbeb28 tomo queue added 2026-07-03 06:48:28 +02:00
x12sa bf3ca21535 added check so gui only works with flomni
CI for csaxs_bec / test (push) Successful in 1m39s
2026-07-02 14:08:46 +02:00
x12sa c4566d6d2a improvements in gui
CI for csaxs_bec / test (push) Successful in 1m34s
2026-07-02 13:06:32 +02:00