lemke_handClaude Sonnet 5 d6aee4dc68 Stop the post-scan "change back?" prompt from freezing live-plot windows
StepScan.scan_all()'s end-of-scan confirmation (inputimeout.inputimeout()
for return_at_end="timeout", plain input() for "question") blocked the
calling thread -- normally the interactive session's own thread, which
also owns any open live-plot window's GUI event loop -- for the whole
wait, freezing every such window for up to the 10s timeout after every
single scan. Same class of bug as the per-step live-plot freeze fixed
earlier via Acquisition's on_tick.

Added _inputimeout_nonblocking()/_input_nonblocking(): run the actual
read in a background thread and poll it with short joins from the
calling thread instead of one blocking call, flushing every open
matplotlib figure's GUI events between polls. Verified directly
(mocked inputimeout to control timing): both the timeout and
answer-arrives paths return the same result as before, with GUI
flushes actually happening during the wait rather than only after it.

Also passes BsStreamCounter's own name as label= into
Stream.plot_med() (escape-fel) so its live plot's title/y-axis show
e.g. "mon_opt.intensity" instead of the raw bs channel it subscribes
to ("SAROP21-PBPS133:INTENSITY").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-12 21:36:05 +02:00
2026-09-11 18:25:50 +02:00
2026-08-18 21:56:17 +02:00
2026-08-28 18:20:00 +02:00
2026-09-09 17:14:38 +02:00
2026-08-18 21:56:17 +02:00
2018-07-06 12:38:44 +02:00
2026-08-18 21:56:17 +02:00
2026-08-18 21:56:17 +02:00
2026-08-18 21:56:17 +02:00
2026-09-10 19:31:54 +02:00
2021-01-13 13:11:22 +01:00
2026-08-18 21:56:17 +02:00
2026-08-21 15:10:25 +02:00
2025-06-24 15:33:02 +02:00

eco — Experiment Control

                       ___ _______
                      / -_) __/ _ \
 Experiment Control   \__/\__/\___/

eco is a Python-based control environment for experiments, developed and used at SwissFEL, PSI. It is used both as:

  • a library of experimental devices for higher-level Python applications or GUIs, and
  • an interactive command-line interface, e.g. from an IPython/Jupyter shell or notebook.

eco follows an object-oriented approach: every device is represented as a Python object with a small, predictable interface, so devices can be freely combined in generic control/acquisition routines and analysed with the scientific Python ecosystem. For a general introduction to object-oriented Python, see e.g. this short introduction.

Documentation

The full documentation — installation, core concepts, and worked examples (listening monitors, archiver data and strip charts, pipeline offload, motor configuration) — lives in docs/ and is built with Sphinx, configured to build on Read the Docs via .readthedocs.yaml.

Build it locally:

pip install -r docs/requirements.txt
sphinx-build -b html docs docs/_build/html

Installation

conda install -c paulscherrerinstitute eco

or, for development, in editable mode from a checkout:

git clone https://github.com/paulscherrerinstitute/eco.git
cd eco
pip install -e .

See Installation for beamline-specific setup (the eco launcher, .ecorc defaults) and the full dependency picture.

Creating a new device

New devices are implemented as a subclass of Assembly, which provides naming, aliasing, and shell representation:

from eco.elements.assembly import Assembly

class MyDevice(Assembly):
    def __init__(self, name=None):
        super().__init__(name=name)
        self._append(MySubObject, name="my_sub_object", is_setting=True, is_status=True)

is_setting=True marks the child as a setting of the assembly (shown by .settings() and captured when settings are saved); is_status=True marks it as contributing to the assembly's .status(). See Representing real devices — the Assembly in the full docs for the rest of the model (Adjustable, Detector, Namespace) and a from-scratch, runnable example of each.

S
Description
Experimental control package
Readme GPL-3.0
8.8 MiB
Languages
Python 86.7%
HTML 10.4%
Jupyter Notebook 2%
Shell 0.8%