Hyperion Overview#

Repository for the Hyperion project to implement Unattended Data Collections on the Diamond MX beamlines using the BlueSky / Ophyd framework from BNL.

The software is able to:

  • Fetch and decode UDC instructions from Agamemnon

  • Mount/unmount samples

  • Change energy of the beamline

  • Centre a sample, first using an optical camera, then using an xray grid scan. This centring is done at two orthogonal angles so that the sample is centred in 3D.

  • Perform a rotation scan to take diffraction data of the sample

Left to do is:

  • Set up the beamline to be in a standard state for collection

Development Installation#

This project supports only the most recent Python version for which our dependencies are available - currently Python 3.11.

Run ./utility_scripts/dls_dev_env.sh (This assumes you’re on a DLS machine. If you are not, you should be able to just run a subset of this script)

Note that because Hyperion makes heavy use of Dodal this will also pull a local editable version of dodal to the parent folder of this repo.

Controlling the Gridscan Externally (e.g. from GDA)#

Starting the bluesky runner#

The bluesky runner is (re)started in production by GDA when it invokes run_hyperion.sh.

This script will determine which beamline you are on based on the BEAMLINE environment variable. If on a beamline Hyperion will run with INFO level logging, sending its logs to both production graylog and to the beamline/log/bluesky/hyperion.log on the shared file system.

If you wish to attempt to run from a developer machine, then (if you are able to connect all devices) you may run_hyperion.sh --dev --beamline=<beamline>, which will give you a running instance albeit with read-only devices. The --dev flag ensures that logging will not be sent to the production Graylog/output folders and that hyperion will create mock devices.

If in a dev environment Hyperion will log to a local graylog instance instead and into a file at ./tmp/dev/hyperion.log. A local instance of graylog will need to be running for this to work correctly. To set this up and run up the containers on your local machine run the setup_graylog.sh script.

This uses the generic defaults for a local graylog instance. It can be accessed on localhost:9000 where the username and password for the graylog portal are both admin.

Testing#

Unit tests can be run with pytest --random-order. To see log output from tests you can turn on logging with the --logging command line option and then use the -s command line option to print logs into the console. So to run the unit tests such that all logs are at printed to the terminal, you can use python -m pytest --random-order --logging -s. Note that this will likely overrun your terminal buffer, so you can narrow the selection of tests with the -k "<test name pattern>" option.

To fake interaction and processing with Zocalo, you can run fake_zocalo/dls_start_fake_zocalo.sh, and make sure to run module load dials/latest before starting hyperion (in the same terminal).

Tracing#

Tracing information (the time taken to complete different steps of experiments) is collected by an OpenTelemetry tracer, and currently we export this information to a local Jaeger monitor (if available). To see the tracing output, run the Jaeger all-in-one container, and go to the web interface at http://localhost:16686.

REST API (GDA Mode)#

When running in GDA mode, Hyperion offers the following API

Starting a scan#

To start a scan you can do the following:

curl -X PUT http://127.0.0.1:5005/flyscan_xray_centre/start --data-binary "@tests/test_data/parameter_json_files/test_parameters.json" -H "Content-Type: application/json"

Getting the Runner Status#

To get the status of the runner:

curl http://127.0.0.1:5005/status

Stopping the Scan#

To stop a scan that is currently running:

curl -X PUT http://127.0.0.1:5005/stop

Writing out DEBUG logs#

To make the app write the DEBUG level logs stored in the CircularMemoryHandler:

curl -X PUT http://127.0.0.1:5005/flush_debug_log

REST API (UDC Mode)#

In UDC Mode, the only endpoint available is the /status endpoint.