Three independent fixes:
- sub_tomo_scan(): in 360-degree tomo_type-1 mode, every sub-tomogram used
to sweep the full 0-360 range, so each one's own fine grid contained
angle pairs exactly 180deg apart -- redundant tomographic information.
Sub-tomograms now each cover a 180deg span, split into low/high halves
by subtomo_number % 4 with a bit-reversal-of-4 phase table, so adjacent
pairs (1,2)/(3,4)/(5,6)/(7,8), either quartet, and all 8 combined each
independently form a complete, evenly-spaced 360deg tomogram at
successively finer spacing. Total projection count for a given
tomo_angle_stepsize is now identical between 180 and 360 mode (same N,
no longer doubled). Updated the 4 other consumers of the old N/step
formula (zero-deg reference gating, _tomo_type1_actual_grid, the
parameter wizard, the PDF report) to match. 180-degree mode is
unchanged. Live-verified against the running flomni sim: real motor
motion traces the expected boustrophedon path with no duplicate or
180deg-apart angles.
- Sample storage: added an owner field, packed into the same EPICS DESC
field as the sample name ("name | owner", via new sample_desc_codec.py)
since there's no separate PV for it. Wired through
FlomniSampleStorage, the CLI (flomni_modify_storage_non_interactive,
ftransfer_modify_storage), the two transfer routines that forward a
raw DESC value across a gripper move (now unpacked/repacked so owner
survives the move instead of being dropped or double-packed), and
SampleStorageWidget. Scoped to flomni only this session; OMNY's
storage/transfer mixin is unchanged.
- ConsoleButtonsWidget's ABORT button used to send SIGINT then, 500ms
later, a stop_devices() broadcast to ALL devices with no stop_id --
an un-suppressed error from that broadcast landing on a queue-tracked
instruction could kill the scan worker thread outright, requiring a
full BEC restart. Replaced with: queue.request_scan_abortion() (safe
no-op if idle, but registers a stop_id so expected errors are
suppressed), then SIGINT, then a direct, immediate Galil hard stop via
new GalilController.hard_abort_and_restore_positioning_mode() -- the
same method ftransfer_abort() now delegates to, so the CLI and GUI
paths can't drift apart again. SIGINT is sent before the hard stop:
live testing showed that if the hard stop's mntprgs-clearing side
effect lands first, a same-session polling loop can mistake it for
normal completion and fall through into ensure_gripper_up(), which
must not happen mid-transfer -- sending SIGINT first (near-instant)
gives that loop's own KeyboardInterrupt handler a head start before
the hard stop's own multi-step sequence completes. The button is
labeled per beamline (e.g. "Flomni Motion Stop") and disabled rather
than silently inert when no hard-stop device is configured/enabled.
Scoped to flomni only this session (OMNY/LamNI wiring deferred).
Live-verified against the running sim, including the exact
stop-lands-mid-queued-instruction scenario that previously crashed
the scan worker.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
cSAXS BEC
cSAXS specific plugins and configs for BEC This document guides you through the procedure to spin up BEC at the beamline for a new experiment (e-account). You might want to run cSAXS copy scripts before in case you want to have the former data structure to be preserved.
Overview
- Clone cSAXS BEC repository into e-account (e.g. into ~/Data10/software/.)
- Start Epics iocs
- Start BEC, BEC server and load/modify the device config with relevant hardware
- BEC commands
Clone cSAXS BEC repository
Clone the current cSAXS BEC repository from GIT into the new e-account. Create directory
mkdir ~/Data10/software
cd ~/Data10/software
Clone repository
git clone https://gitlab.psi.ch/bec/csaxs_bec.git
Start epics iocs
You can start up the iocs while the ./setup_bec.sh script is running. Be aware though that the scripts requires you to interact with it.
DelayGenerator
Open a new tab in a terminal in comp1/comp2 or cons1 and follow the commands below:
ssh gac-x12sa@localhost
cd ~/delaygen
iocsh -7.0.6 startup.script
Be aware -7.0.6 is referring to the current epics version and might change in future (SLS 2.0). To start the epics panel (only if needed), run in a new shell
caqtdm -noMsg -macro P=delaygen:,R=DG1: srsDG645.ui
More notes on usages and cabelling of DDGs. Currently 3 generators are used:
- DDG1 for detectors (EXT Enable from SGalil stages, T0 to DDG2, AB for eiger, CD for Falcon, EF for Pilatus_2)
- DDG2 for mcs card (ext. enable from DDG1, AB to mcs card)
- DDG3 for fast shutter and mcs enable (AB short pulse to enable MCS (needed!!), CD to keep FSH open )
Eiger
Open a new tab in a terminal in comp1/comp2 or cons1 and follow the commands below:
ssh gac-x12sa@localhost
cd ~/Software/Eiger/
./launch_ioc
A live view of status and images for std_daq can be found here xbl-daq-29:5000.
Pilatus_2
First, start the cam server. Connect to the computer and follow the instructions printed after connecting:
ssh det@x12sa-pd-2 (Pilatus2)
The cam server will open, wait until you see **. Nex step, open a new tab in a terminal in comp1/comp2 or cons1 and follow the commands below:
ssh gac-x12sa@localhost
cd ~/Software/Pilatus300K/
./launch_epics
FalconX1
Open a new tab in a terminal in comp1/comp2 or cons1 (logged in as the current e-account) and follow the commands:
ssh x12sa-cons-01
cd /ioc/X12SA-PC-FALCONX1/
iocsh -7.0.6 startup.script
Be aware -7.0.6 is referring to the current epics version and might change in future (SLS 2.0)
Start BEC, BEC server and load device config
Step 1 needs to have finished for continuing with these steps. What remains now is to start the bec server. Connect to pc15543 and open a new terminal to run:
cd ~/Data10/software
source bec_venv/bin/activate
bec-server start
tmux attach -t bec
Open another teminal on pc15543 and start BEC:
cd ~/Data10/software
source bec_venv/bin/activate
bec
Note: In case there is a warning after starting BEC that it was not able to import scilog, you will have to pip install scilog in the bec_venv to be able to send printouts to scilog from the command line. Within a new terminal:
cd ~/Data10/software
source bec_venv/bin/activate
pip install scilog
Device config from csaxs-bec plugins
bec.config.update_session_with_file('/sls/X12SA/data/e20639/Data10/software/csaxs-bec/bec_plugins/configs/bec_device_config_sastt.yaml')
bec.config.save_current_session('~/Data10/software/current_config.yaml')
The second command is helpful if you adjust limits of motors, which will then be stored in the config and loaded if a reload of the configuration is needed.
BEC commands
A number of commands that are useful:
To move devices that are added in the config:
umv(dev.samx, 0) #absolute
umvr(dev.samx, 0) #relative
dev.samx.wm #print motor position and limits
dev.samx.limits = [low_limit, high_limit] # To set limits, note, same lower and higher limit, e.g. [0, 0] means no limits!!
Scans:
scans.acquire(exp_time = 0.5, frames_per_trigger=10, readout_time=3e-3) # equivalent to a loopscan 30 0.5
scans.line_scan(dev.samx, -1, 1, steps=20, exp_time=0.5, readout_time=3e-3, relative=True) # optional, add frames_per_trigger =10 for burst acquisition at each step
#Scan 2 motors in a step scan at the same time
scans.line_scan(dev.samx, -1, 1, dev.samy, -1, 1, steps=20, exp_time=0.5, readout_time =3e-3, relative=True) # step scan with 20 steps, again frames_per_trigger can be added for burst at each point
scans.sgalil_grid(start_y = , end_y = , interval_y = , start_x=, end_x=, interval_x =, exp_time=0.5, readout_time=3e-3, relative=True)