Metadata-Version: 2.4
Name: eco-suite
Version: 0.1.0
Summary: Experiment control and orchestration framework for the SwissFEL Bernina endstation
Author: Paul Scherrer Institute
Maintainer: Bernina beamline
License: GPL-3.0-or-later
Project-URL: Homepage, https://github.com/paulscherrerinstitute/eco-suite
Project-URL: Documentation, https://eco-suite.readthedocs.io
Project-URL: Repository, https://github.com/paulscherrerinstitute/eco-suite
Project-URL: Issues, https://github.com/paulscherrerinstitute/eco-suite/issues
Project-URL: Internal source (PSI), https://gitea.psi.ch/Bernina/eco
Keywords: swissfel,beamline,epics,controls,bernina,psi
Classifier: Programming Language :: Python :: 3
Classifier: Operating System :: POSIX :: Linux
Classifier: Intended Audience :: Science/Research
Classifier: Topic :: Scientific/Engineering :: Physics
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: numpy
Requires-Dist: scipy
Requires-Dist: pandas
Requires-Dist: matplotlib
Requires-Dist: h5py
Requires-Dist: pyepics
Requires-Dist: pyzmq
Requires-Dist: requests
Requires-Dist: urllib3
Requires-Dist: colorama
Requires-Dist: rich
Requires-Dist: textual
Requires-Dist: tqdm
Requires-Dist: tabulate
Requires-Dist: wcwidth
Requires-Dist: pint
Requires-Dist: python-dateutil
Requires-Dist: six
Requires-Dist: markdown
Requires-Dist: ansi2html
Requires-Dist: ascii_graph
Requires-Dist: inputimeout
Requires-Dist: simple-pid
Requires-Dist: simple-term-menu
Requires-Dist: cachebox
Requires-Dist: lazy-object-proxy
Requires-Dist: numpy-stl
Requires-Dist: diffcalc-core
Requires-Dist: IPython
Requires-Dist: escape-fel
Requires-Dist: dask-jobqueue
Provides-Extra: gui
Requires-Dist: ipywidgets; extra == "gui"
Requires-Dist: ipyevents; extra == "gui"
Requires-Dist: qtpy; extra == "gui"
Requires-Dist: PyQt5; extra == "gui"
Requires-Dist: PyQtWebEngine; extra == "gui"
Requires-Dist: qt-material; extra == "gui"
Requires-Dist: dash; extra == "gui"
Requires-Dist: flask; extra == "gui"
Requires-Dist: timg; extra == "gui"
Requires-Dist: pyttsx3; extra == "gui"
Requires-Dist: pillow; extra == "gui"
Requires-Dist: av; extra == "gui"
Provides-Extra: sheets
Requires-Dist: gspread; extra == "sheets"
Requires-Dist: gspread-dataframe; extra == "sheets"
Requires-Dist: gspread-formatting; extra == "sheets"
Requires-Dist: oauth2client; extra == "sheets"
Requires-Dist: openpyxl; extra == "sheets"
Requires-Dist: xlwt; extra == "sheets"
Provides-Extra: hardware
Requires-Dist: pyserial; extra == "hardware"
Requires-Dist: gpiozero; extra == "hardware"
Requires-Dist: adafruit-blinka; extra == "hardware"
Requires-Dist: adafruit-circuitpython-ads1x15; extra == "hardware"
Provides-Extra: lab
Requires-Dist: jupyterlab; extra == "lab"
Provides-Extra: voila
Requires-Dist: voila; extra == "voila"
Provides-Extra: psi
Requires-Dist: scilog; extra == "psi"
Provides-Extra: docs
Requires-Dist: sphinx<9,>=7; extra == "docs"
Requires-Dist: furo>=2024.1.29; extra == "docs"
Requires-Dist: myst-parser>=2; extra == "docs"
Requires-Dist: sphinx-copybutton>=0.5; extra == "docs"
Requires-Dist: sphinx-design>=0.5; extra == "docs"
Provides-Extra: dev
Requires-Dist: pytest; extra == "dev"
Requires-Dist: eco[docs]; extra == "dev"
Dynamic: license-file

# 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](https://realpython.com/python3-object-oriented-programming/).

## Documentation

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

Build it locally:

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

## Installation

```bash
conda install -c paulscherrerinstitute eco
```

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

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

See [Installation](docs/installation.md) 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:

```python
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](docs/concepts.md) in the full docs
for the rest of the model (Adjustable, Detector, Namespace) and a
from-scratch, runnable example of each.
