dls-dodal 1.40.0__tar.gz → 1.41.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dls_dodal-1.41.0/.github/scripts/check_test_durations.py +30 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_test.yml +14 -3
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.gitignore +4 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/PKG-INFO +4 -2
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/pyproject.toml +6 -2
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dls_dodal.egg-info/PKG-INFO +4 -2
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dls_dodal.egg-info/SOURCES.txt +1 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dls_dodal.egg-info/requires.txt +3 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/_version.py +9 -4
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i23.py +8 -11
- dls_dodal-1.41.0/src/dodal/beamlines/p38.py +210 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/aperturescatterguard.py +1 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/apple2_undulator.py +10 -8
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/attenuator/attenuator.py +1 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/backlight.py +1 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/bimorph_mirror.py +2 -2
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/fast_grid_scan.py +10 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/hutch_shutter.py +1 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/i10_apple2.py +3 -3
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i19/shutter.py +1 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/pmac.py +2 -2
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/oav_detector.py +1 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/pressure_jump_cell.py +12 -5
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/robot.py +1 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/thawer.py +4 -4
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/undulator.py +1 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/undulator_dcm.py +1 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/util/epics_util.py +1 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zebra/zebra.py +4 -3
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zebra/zebra_controlled_shutter.py +1 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plan_stubs/wrapped.py +10 -12
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/utils.py +1 -6
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_apple2_undulator.py +6 -7
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_gridscan.py +16 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_zocalo/__main__.py +27 -1
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plan_stubs/test_wrapped_stubs.py +8 -4
- dls_dodal-1.40.0/src/dodal/beamlines/p38.py +0 -350
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.copier-answers.yml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.devcontainer/devcontainer.json +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/CODEOWNERS +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/CONTRIBUTING.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/ISSUE_TEMPLATE/issue_template.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/actions/install_requirements/action.yml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/dependabot.yml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/pages/index.html +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/pages/make_switcher.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_check.yml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_dist.yml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_docs.yml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_pypi.yml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_release.yml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_tox.yml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/ci.yml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/periodic.yml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.pre-commit-config.yaml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.vscode/extensions.json +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.vscode/launch.json +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.vscode/settings.json +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.vscode/tasks.json +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/Dockerfile +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/LICENSE +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/README.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/catalog-info.yaml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/conftest.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/_templates/autosummary/class.rst +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/_templates/autosummary/module.rst +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/_templates/custom-module-template.rst +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/assets/zocalo.png +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/conf.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/decisions/0003-codeowners.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/decisions/0003-make-devices-factory.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/decisions/COPYME +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/decisions.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/reviews.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/genindex.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/build-docs.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/contribute.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/coverage.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/create-beamline.rst +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/dev-install.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/excalidraw.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/lint.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/lock-requirements.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/make-new-ophyd-async-device.rst +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/make-release.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/move-code.rst +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/pypi.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/run-tests.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/static-analysis.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/update-template.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/write-tests.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/zocalo.rst +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/images/dls-logo.svg +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/images/excalidraw-example.svg +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/index.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/reference/api.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/reference/device-standards.rst +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/reference/standards.rst +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/reference.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/tutorials/get_started.rst +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/tutorials/installation.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/tutorials.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/pull_request_template.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/setup.cfg +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dls_dodal.egg-info/dependency_links.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dls_dodal.egg-info/entry_points.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dls_dodal.egg-info/top_level.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/__main__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamline_specific_utils/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamline_specific_utils/i03.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/README.md +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/adsim.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/b01_1.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i02_1.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i03.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i04.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i10.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i13_1.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i18.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i19_1.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i19_2.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i20_1.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i22.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i24.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/p45.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/p99.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/training_rig.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/cli.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/beamlines/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/beamlines/beamline_parameters.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/beamlines/beamline_utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/beamlines/device_helpers.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/coordination.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/crystal_metadata.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/maths.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/signal_utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/types.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/udc_directory_provider.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/visit.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/CTAB.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/adsim.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/aperture.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/areadetector/plugins/CAM.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/areadetector/plugins/MJPG.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/attenuator/filter.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/attenuator/filter_selections.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/cryostream.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/current_amplifiers/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/current_amplifiers/current_amplifier.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/current_amplifiers/current_amplifier_detector.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/current_amplifiers/femto.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/current_amplifiers/sr570.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/current_amplifiers/struck_scaler_counter.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/dcm.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/detector/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/detector/det_dim_constants.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/detector/det_dist_to_beam_converter.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/detector/det_resolution.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/detector/detector.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/detector/detector_motion.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/diamond_filter.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/eiger.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/eiger_odin.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/fluorescence_detector_motion.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/flux.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/focusing_mirror.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i03/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i03/beamstop.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i04/transfocator.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/i10_setting_data.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/mirrors.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/rasor/rasor_current_amp.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/rasor/rasor_motors.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/rasor/rasor_scaler_cards.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/slits.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i13_1/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i13_1/merlin.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i13_1/merlin_controller.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i13_1/merlin_io.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i18/KBMirror.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i18/diode.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i18/table.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i18/thor_labs_stage.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i19/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i20_1/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i22/dcm.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i22/fswitch.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i22/nxsas.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/aperture.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/beam_center.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/beamstop.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/dcm.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/dual_backlight.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/focus_mirrors.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/i24_detector_motion.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/pilatus_metadata.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/vgonio.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/ipin.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/linkam3.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/logging_ophyd_device.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/motors.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/microns_for_zoom_levels.json +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/oav_calculations.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/oav_parameters.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/oav_to_redis_forwarder.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/pin_image_recognition/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/pin_image_recognition/manual_test.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/pin_image_recognition/utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/snapshots/grid_overlay.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/snapshots/snapshot_with_beam_centre.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/snapshots/snapshot_with_grid.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/p45.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/p99/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/p99/sample_stage.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/pgm.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/qbpm.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/s4_slit_gaps.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/scatterguard.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/scintillator.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/slits.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/smargon.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/status.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/synchrotron.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/tetramm.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/training_rig/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/training_rig/sample_stage.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/turbo_slit.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/util/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/util/adjuster_plans.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/util/lookup_tables.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/util/motor_utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/util/test_utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/watsonmarlow323_pump.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/webcam.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/xbpm_feedback.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/xspress3/xspress3.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/xspress3/xspress3_channel.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zebra/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zebra/zebra_constants_mapping.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zocalo/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zocalo/zocalo_constants.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zocalo/zocalo_interaction.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zocalo/zocalo_results.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/log.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/parameters/experiment_parameter_base.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plan_stubs/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plan_stubs/check_topup.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plan_stubs/data_session.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plan_stubs/motor_utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plans/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plans/save_panda.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plans/scanspec.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plans/wrapped.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_adsim.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_aperturescatterguard_system.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_cli.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_eiger_system.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_gridscan_system.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_oav_system.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_oav_to_redis_system.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_slit_gaps_system.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_smargon_system.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_synchrotron_system.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_undulator_system.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_zebra_system.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_zocalo_results.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/beamlines/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/beamlines/unit_tests/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/beamlines/unit_tests/test_i03.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/beamlines/unit_tests/test_i24.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/beamlines/unit_tests/test_mapping.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/beamlines/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/beamlines/test_beamline_parameters.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/beamlines/test_beamline_utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/beamlines/test_device_helpers.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/beamlines/test_device_instantiation.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/test_coordination.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/test_crystal_metadata.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/test_maths.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/test_udc_directory_provider.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/test_visit.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/conftest.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i03/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i03/test_beamstop.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i04/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i04/test_transfocator.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/lookupTables/IDEnergy2GapCalibrations.csv +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/lookupTables/IDEnergy2PhaseCalibrations.csv +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdd.pkl +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdu.pkl +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidd.pkl +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidu.pkl +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/test_i10Apple2.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i13_1/test_merlin.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i18/test_kb_mirror.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i18/test_table.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i18/test_thor_labs_stage.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i19/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i19/test_shutter.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i22/test_dcm.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i22/test_fswitch.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i22/test_metadataholder.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/test_diamond_filter.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/training_rig/test_sample_stage.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/conftest.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/current_amplifier/test_femto.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/current_amplifier/test_sr570.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/detector/test_det_dim_constants.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/detector/test_det_resolution.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/detector/test_detector.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/i24/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/i24/test_dual_backlight.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/i24/test_focus_mirrors.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/i24/test_pilatus_metadata.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/i24/test_pmac.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/i24/test_vgonio.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/conftest.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect_utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/test_grid_overlay.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/test_oav.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/test_oav_parameters.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/test_oav_to_redis_forwarder.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/test_oav_utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/test_snapshots.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/p99/test_p99_stage.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_OAVCentring.json +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_aperture.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_aperture_scatterguard.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_attenuator.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_backlight.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_bart_robot.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_beam_converter.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_beamline_undulator_to_gap_lookup_table.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_bimorph_mirror.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_daq_configuration/domain/beamlineParameters +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Pitch_converter.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_dcm.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_display.configuration +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_eiger.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_focusing_mirror.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_hutch_shutter.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_jCameraManZoomLevels.xml +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_linkam3.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_lookup_table.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_lookup_table_2.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_odin.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_pressure_jump_cell.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_qbpm.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_shutter.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_slits.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_smargon.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_status.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_synchrotron.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_tetramm.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_thawer.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_undulator.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_undulator_dcm.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_watsonmarlow323_pump.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_webcam.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_xbpm_feedback.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_xspress3.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_zebra.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_zebra_constants_mapping.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_zocalo_interaction.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_zocalo_results.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/util/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/util/test_adjuster_plans.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/util/test_beamline_specific_utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/util/test_lookup_tables.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/util/test_save_panda.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline_all_devices_raise_exception.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline_broken_dependency.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline_dependencies.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline_disordered_dependencies.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline_misbehaving_builtins.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline_some_devices_working.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_device_factory_beamline.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_zocalo/README.rst +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_zocalo/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_zocalo/dls_start_fake_zocalo.sh +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plan_stubs/test_motor_util_plans.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plan_stubs/test_topup_plan.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plans/conftest.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plans/test_compliance.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plans/test_scanspec.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plans/test_wrapped.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/preprocessors/test_filesystem_metadata.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/bad_beamlineParameters +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/i04_beamlineParameters +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_beamline_dcm_roll_converter.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_beamline_dcm_roll_converter_non_monotonic.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_beamline_dcm_roll_converter_reversed.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_beamline_parameters.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_det_dist_converter.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_images/oav_snapshot_expected.png +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_images/oav_snapshot_test.png +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/topup_long_delay.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/topup_short_params.txt +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_utils.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/unit_tests/__init__.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/unit_tests/test_cli.py +0 -0
- {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/unit_tests/test_log.py +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
# Get report filename and threshold from command-line arguments
|
|
5
|
+
REPORT_FILE = sys.argv[1] if len(sys.argv) > 1 else "report.json"
|
|
6
|
+
THRESHOLD = float(sys.argv[2]) if len(sys.argv) > 2 else 1.0
|
|
7
|
+
|
|
8
|
+
try:
|
|
9
|
+
with open(REPORT_FILE) as f:
|
|
10
|
+
data = json.load(f)
|
|
11
|
+
except FileNotFoundError:
|
|
12
|
+
print(f"❌ Error: Report file '{REPORT_FILE}' not found.")
|
|
13
|
+
sys.exit(1)
|
|
14
|
+
except json.JSONDecodeError:
|
|
15
|
+
print(f"❌ Error: Failed to parse JSON in '{REPORT_FILE}'.")
|
|
16
|
+
sys.exit(1)
|
|
17
|
+
|
|
18
|
+
slow_tests = [
|
|
19
|
+
(t["nodeid"], t["call"]["duration"])
|
|
20
|
+
for t in data.get("tests", [])
|
|
21
|
+
if "call" in t and t["call"]["duration"] > THRESHOLD
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
if slow_tests:
|
|
25
|
+
print(f"❌ The following tests exceeded the {THRESHOLD:.2f}s threshold:")
|
|
26
|
+
for test, duration in slow_tests:
|
|
27
|
+
print(f" - {test}: {duration:.2f}s")
|
|
28
|
+
sys.exit(1)
|
|
29
|
+
|
|
30
|
+
print("✅ All tests ran within the acceptable time limit.")
|
|
@@ -50,13 +50,24 @@ jobs:
|
|
|
50
50
|
python-version: ${{ inputs.python-version }}
|
|
51
51
|
pip-install: ".[dev]"
|
|
52
52
|
|
|
53
|
-
- name: Run tests
|
|
54
|
-
run: tox -e
|
|
53
|
+
- name: Run unit tests
|
|
54
|
+
run: tox -e unit-report
|
|
55
|
+
|
|
56
|
+
- name: Check unit test durations
|
|
57
|
+
run: |
|
|
58
|
+
python .github/scripts/check_test_durations.py unit-report.json 1
|
|
59
|
+
|
|
60
|
+
- name: Run system tests
|
|
61
|
+
run: tox -e system-report
|
|
62
|
+
|
|
63
|
+
- name: Check system test durations
|
|
64
|
+
run: |
|
|
65
|
+
python .github/scripts/check_test_durations.py system-report.json 5
|
|
55
66
|
|
|
56
67
|
- name: Upload coverage to Codecov
|
|
57
68
|
uses: codecov/codecov-action@v4
|
|
58
69
|
with:
|
|
59
70
|
name: ${{ inputs.python-version }}/${{ inputs.runs-on }}
|
|
60
|
-
files:
|
|
71
|
+
files: ./unit_cov.xml,./system_cov.xml
|
|
61
72
|
env:
|
|
62
73
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: dls-dodal
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.41.0
|
|
4
4
|
Summary: Ophyd devices and other utils that could be used across DLS beamlines
|
|
5
5
|
Author-email: Dominic Oram <dominic.oram@diamond.ac.uk>
|
|
6
6
|
License: Apache License
|
|
@@ -238,6 +238,7 @@ Provides-Extra: dev
|
|
|
238
238
|
Requires-Dist: black; extra == "dev"
|
|
239
239
|
Requires-Dist: diff-cover; extra == "dev"
|
|
240
240
|
Requires-Dist: import-linter; extra == "dev"
|
|
241
|
+
Requires-Dist: ispyb; extra == "dev"
|
|
241
242
|
Requires-Dist: mypy; extra == "dev"
|
|
242
243
|
Requires-Dist: myst-parser; extra == "dev"
|
|
243
244
|
Requires-Dist: ophyd_async[sim]; extra == "dev"
|
|
@@ -245,10 +246,11 @@ Requires-Dist: pipdeptree; extra == "dev"
|
|
|
245
246
|
Requires-Dist: pre-commit; extra == "dev"
|
|
246
247
|
Requires-Dist: psutil; extra == "dev"
|
|
247
248
|
Requires-Dist: pydata-sphinx-theme>=0.12; extra == "dev"
|
|
248
|
-
Requires-Dist: pyright; extra == "dev"
|
|
249
|
+
Requires-Dist: pyright==1.1.394; extra == "dev"
|
|
249
250
|
Requires-Dist: pytest; extra == "dev"
|
|
250
251
|
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
251
252
|
Requires-Dist: pytest-cov; extra == "dev"
|
|
253
|
+
Requires-Dist: pytest-json-report; extra == "dev"
|
|
252
254
|
Requires-Dist: pytest-random-order; extra == "dev"
|
|
253
255
|
Requires-Dist: ruff; extra == "dev"
|
|
254
256
|
Requires-Dist: sphinx<7.4.6; extra == "dev"
|
|
@@ -45,6 +45,7 @@ dev = [
|
|
|
45
45
|
"black",
|
|
46
46
|
"diff-cover",
|
|
47
47
|
"import-linter",
|
|
48
|
+
"ispyb",
|
|
48
49
|
"mypy",
|
|
49
50
|
# Commented out due to dependency version conflict with pydantic 1.x
|
|
50
51
|
# "copier",
|
|
@@ -54,10 +55,11 @@ dev = [
|
|
|
54
55
|
"pre-commit",
|
|
55
56
|
"psutil",
|
|
56
57
|
"pydata-sphinx-theme>=0.12",
|
|
57
|
-
"pyright",
|
|
58
|
+
"pyright==1.1.394", # See https://github.com/DiamondLightSource/dodal/issues/1079
|
|
58
59
|
"pytest",
|
|
59
60
|
"pytest-asyncio",
|
|
60
61
|
"pytest-cov",
|
|
62
|
+
"pytest-json-report",
|
|
61
63
|
"pytest-random-order",
|
|
62
64
|
"ruff",
|
|
63
65
|
"sphinx<7.4.6", # pinned due to https://github.com/sphinx-doc/sphinx/issues/12660
|
|
@@ -141,7 +143,7 @@ legacy_tox_ini = """
|
|
|
141
143
|
[tox]
|
|
142
144
|
skipsdist=True
|
|
143
145
|
|
|
144
|
-
[testenv:{pre-commit,type-checking,tests,docs}]
|
|
146
|
+
[testenv:{pre-commit,type-checking,tests,docs,unit-report,system-report}]
|
|
145
147
|
# Don't create a virtualenv for the command, requires tox-direct plugin
|
|
146
148
|
direct = True
|
|
147
149
|
passenv = *
|
|
@@ -156,6 +158,8 @@ commands =
|
|
|
156
158
|
type-checking: pyright src tests {posargs}
|
|
157
159
|
pre-commit: pre-commit run --all-files --show-diff-on-failure {posargs}
|
|
158
160
|
docs: sphinx-{posargs:build -E} -T docs build/html
|
|
161
|
+
unit-report: pytest -m 'not (s03 or adsim)' --cov=dodal --cov-report term --cov-report xml:unit_cov.xml --json-report --json-report-file=unit-report.json tests {posargs}
|
|
162
|
+
system-report: pytest -m 'not (s03 or adsim)' --cov=dodal --cov-report term --cov-report xml:system_cov.xml --json-report --json-report-file=system-report.json system_tests {posargs}
|
|
159
163
|
"""
|
|
160
164
|
|
|
161
165
|
[tool.ruff]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: dls-dodal
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.41.0
|
|
4
4
|
Summary: Ophyd devices and other utils that could be used across DLS beamlines
|
|
5
5
|
Author-email: Dominic Oram <dominic.oram@diamond.ac.uk>
|
|
6
6
|
License: Apache License
|
|
@@ -238,6 +238,7 @@ Provides-Extra: dev
|
|
|
238
238
|
Requires-Dist: black; extra == "dev"
|
|
239
239
|
Requires-Dist: diff-cover; extra == "dev"
|
|
240
240
|
Requires-Dist: import-linter; extra == "dev"
|
|
241
|
+
Requires-Dist: ispyb; extra == "dev"
|
|
241
242
|
Requires-Dist: mypy; extra == "dev"
|
|
242
243
|
Requires-Dist: myst-parser; extra == "dev"
|
|
243
244
|
Requires-Dist: ophyd_async[sim]; extra == "dev"
|
|
@@ -245,10 +246,11 @@ Requires-Dist: pipdeptree; extra == "dev"
|
|
|
245
246
|
Requires-Dist: pre-commit; extra == "dev"
|
|
246
247
|
Requires-Dist: psutil; extra == "dev"
|
|
247
248
|
Requires-Dist: pydata-sphinx-theme>=0.12; extra == "dev"
|
|
248
|
-
Requires-Dist: pyright; extra == "dev"
|
|
249
|
+
Requires-Dist: pyright==1.1.394; extra == "dev"
|
|
249
250
|
Requires-Dist: pytest; extra == "dev"
|
|
250
251
|
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
251
252
|
Requires-Dist: pytest-cov; extra == "dev"
|
|
253
|
+
Requires-Dist: pytest-json-report; extra == "dev"
|
|
252
254
|
Requires-Dist: pytest-random-order; extra == "dev"
|
|
253
255
|
Requires-Dist: ruff; extra == "dev"
|
|
254
256
|
Requires-Dist: sphinx<7.4.6; extra == "dev"
|
|
@@ -16,6 +16,7 @@ pyproject.toml
|
|
|
16
16
|
.github/actions/install_requirements/action.yml
|
|
17
17
|
.github/pages/index.html
|
|
18
18
|
.github/pages/make_switcher.py
|
|
19
|
+
.github/scripts/check_test_durations.py
|
|
19
20
|
.github/workflows/_check.yml
|
|
20
21
|
.github/workflows/_dist.yml
|
|
21
22
|
.github/workflows/_docs.yml
|
|
@@ -23,6 +23,7 @@ scanspec>=0.7.3
|
|
|
23
23
|
black
|
|
24
24
|
diff-cover
|
|
25
25
|
import-linter
|
|
26
|
+
ispyb
|
|
26
27
|
mypy
|
|
27
28
|
myst-parser
|
|
28
29
|
ophyd_async[sim]
|
|
@@ -30,10 +31,11 @@ pipdeptree
|
|
|
30
31
|
pre-commit
|
|
31
32
|
psutil
|
|
32
33
|
pydata-sphinx-theme>=0.12
|
|
33
|
-
pyright
|
|
34
|
+
pyright==1.1.394
|
|
34
35
|
pytest
|
|
35
36
|
pytest-asyncio
|
|
36
37
|
pytest-cov
|
|
38
|
+
pytest-json-report
|
|
37
39
|
pytest-random-order
|
|
38
40
|
ruff
|
|
39
41
|
sphinx<7.4.6
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
# file generated by
|
|
1
|
+
# file generated by setuptools-scm
|
|
2
2
|
# don't change, don't track in version control
|
|
3
|
+
|
|
4
|
+
__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
|
|
5
|
+
|
|
3
6
|
TYPE_CHECKING = False
|
|
4
7
|
if TYPE_CHECKING:
|
|
5
|
-
from typing import Tuple
|
|
8
|
+
from typing import Tuple
|
|
9
|
+
from typing import Union
|
|
10
|
+
|
|
6
11
|
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
|
7
12
|
else:
|
|
8
13
|
VERSION_TUPLE = object
|
|
@@ -12,5 +17,5 @@ __version__: str
|
|
|
12
17
|
__version_tuple__: VERSION_TUPLE
|
|
13
18
|
version_tuple: VERSION_TUPLE
|
|
14
19
|
|
|
15
|
-
__version__ = version = '1.
|
|
16
|
-
__version_tuple__ = version_tuple = (1,
|
|
20
|
+
__version__ = version = '1.41.0'
|
|
21
|
+
__version_tuple__ = version_tuple = (1, 41, 0)
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
from dodal.common.beamlines.beamline_utils import
|
|
1
|
+
from dodal.common.beamlines.beamline_utils import device_factory
|
|
2
2
|
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
|
|
3
3
|
from dodal.devices.oav.pin_image_recognition import PinTipDetection
|
|
4
4
|
from dodal.log import set_beamline as set_log_beamline
|
|
5
|
-
from dodal.utils import get_beamline_name, get_hostname
|
|
5
|
+
from dodal.utils import BeamlinePrefix, get_beamline_name, get_hostname
|
|
6
6
|
|
|
7
7
|
BL = get_beamline_name("i23")
|
|
8
8
|
set_log_beamline(BL)
|
|
9
9
|
set_utils_beamline(BL)
|
|
10
10
|
|
|
11
|
+
PREFIX = BeamlinePrefix(BL)
|
|
12
|
+
|
|
11
13
|
|
|
12
14
|
def _is_i23_machine():
|
|
13
15
|
"""
|
|
@@ -18,16 +20,11 @@ def _is_i23_machine():
|
|
|
18
20
|
return hostname.startswith("i23-ws") or hostname.startswith("i23-control")
|
|
19
21
|
|
|
20
22
|
|
|
21
|
-
@
|
|
22
|
-
def oav_pin_tip_detection(
|
|
23
|
-
wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
|
|
24
|
-
) -> PinTipDetection:
|
|
23
|
+
@device_factory(skip=lambda: not _is_i23_machine())
|
|
24
|
+
def oav_pin_tip_detection() -> PinTipDetection:
|
|
25
25
|
"""Get the i23 OAV pin-tip detection device"""
|
|
26
26
|
|
|
27
|
-
return
|
|
28
|
-
|
|
27
|
+
return PinTipDetection(
|
|
28
|
+
f"{PREFIX.beamline_prefix}-DI-OAV-01:",
|
|
29
29
|
"pin_tip_detection",
|
|
30
|
-
"-DI-OAV-01:",
|
|
31
|
-
wait_for_connection,
|
|
32
|
-
fake_with_ophyd_sim,
|
|
33
30
|
)
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
from ophyd_async.epics.adaravis import AravisDetector
|
|
4
|
+
from ophyd_async.fastcs.panda import HDFPanda
|
|
5
|
+
|
|
6
|
+
from dodal.common.beamlines.beamline_utils import (
|
|
7
|
+
device_factory,
|
|
8
|
+
get_path_provider,
|
|
9
|
+
set_path_provider,
|
|
10
|
+
)
|
|
11
|
+
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
|
|
12
|
+
from dodal.common.beamlines.device_helpers import HDF5_SUFFIX
|
|
13
|
+
from dodal.common.crystal_metadata import (
|
|
14
|
+
MaterialsEnum,
|
|
15
|
+
make_crystal_metadata_from_material,
|
|
16
|
+
)
|
|
17
|
+
from dodal.common.visit import LocalDirectoryServiceClient, StaticVisitPathProvider
|
|
18
|
+
from dodal.devices.focusing_mirror import FocusingMirror
|
|
19
|
+
from dodal.devices.i22.dcm import DoubleCrystalMonochromator
|
|
20
|
+
from dodal.devices.i22.fswitch import FSwitch
|
|
21
|
+
from dodal.devices.linkam3 import Linkam3
|
|
22
|
+
from dodal.devices.pressure_jump_cell import PressureJumpCell
|
|
23
|
+
from dodal.devices.slits import Slits
|
|
24
|
+
from dodal.devices.tetramm import TetrammDetector
|
|
25
|
+
from dodal.devices.undulator import Undulator
|
|
26
|
+
from dodal.devices.watsonmarlow323_pump import WatsonMarlow323Pump
|
|
27
|
+
from dodal.log import set_beamline as set_log_beamline
|
|
28
|
+
from dodal.utils import BeamlinePrefix, get_beamline_name
|
|
29
|
+
|
|
30
|
+
BL = get_beamline_name("p38")
|
|
31
|
+
PREFIX = BeamlinePrefix(BL)
|
|
32
|
+
set_log_beamline(BL)
|
|
33
|
+
set_utils_beamline(BL)
|
|
34
|
+
|
|
35
|
+
# Currently we must hard-code the visit, determining the visit at runtime requires
|
|
36
|
+
# infrastructure that is still WIP.
|
|
37
|
+
# Communication with GDA is also WIP so for now we determine an arbitrary scan number
|
|
38
|
+
# locally and write the commissioning directory. The scan number is not guaranteed to
|
|
39
|
+
# be unique and the data is at risk - this configuration is for testing only.
|
|
40
|
+
set_path_provider(
|
|
41
|
+
StaticVisitPathProvider(
|
|
42
|
+
BL,
|
|
43
|
+
Path("/dls/p38/data/2024/cm37282-2/bluesky"),
|
|
44
|
+
client=LocalDirectoryServiceClient(),
|
|
45
|
+
)
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@device_factory()
|
|
50
|
+
def d3() -> AravisDetector:
|
|
51
|
+
return AravisDetector(
|
|
52
|
+
f"{PREFIX.beamline_prefix}-DI-DCAM-01:",
|
|
53
|
+
path_provider=get_path_provider(),
|
|
54
|
+
drv_suffix="DET:",
|
|
55
|
+
fileio_suffix=HDF5_SUFFIX,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# Disconnected
|
|
60
|
+
@device_factory(skip=True)
|
|
61
|
+
def d11() -> AravisDetector:
|
|
62
|
+
return AravisDetector(
|
|
63
|
+
f"{PREFIX.beamline_prefix}-DI-DCAM-03:",
|
|
64
|
+
path_provider=get_path_provider(),
|
|
65
|
+
drv_suffix="DET:",
|
|
66
|
+
fileio_suffix=HDF5_SUFFIX,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@device_factory()
|
|
71
|
+
def d12() -> AravisDetector:
|
|
72
|
+
return AravisDetector(
|
|
73
|
+
f"{PREFIX.beamline_prefix}-DI-DCAM-04:",
|
|
74
|
+
path_provider=get_path_provider(),
|
|
75
|
+
drv_suffix="DET:",
|
|
76
|
+
fileio_suffix=HDF5_SUFFIX,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@device_factory()
|
|
81
|
+
def i0() -> TetrammDetector:
|
|
82
|
+
return TetrammDetector(
|
|
83
|
+
f"{PREFIX.beamline_prefix}-EA-XBPM-01:",
|
|
84
|
+
path_provider=get_path_provider(),
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
#
|
|
89
|
+
# The following devices are created as fake by default since P38 has no optics,
|
|
90
|
+
# but having mock devices here means they will be reflected in downstream data
|
|
91
|
+
# processing, where they may be required.
|
|
92
|
+
#
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@device_factory(mock=True)
|
|
96
|
+
def slits_1() -> Slits:
|
|
97
|
+
return Slits(f"{PREFIX.beamline_prefix}-AL-SLITS-01:")
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@device_factory(mock=True)
|
|
101
|
+
def slits_2() -> Slits:
|
|
102
|
+
return Slits(f"{PREFIX.beamline_prefix}-AL-SLITS-02:")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@device_factory(mock=True)
|
|
106
|
+
def slits_3() -> Slits:
|
|
107
|
+
return Slits(f"{PREFIX.beamline_prefix}-AL-SLITS-03:")
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@device_factory(mock=True)
|
|
111
|
+
def slits_4() -> Slits:
|
|
112
|
+
return Slits(f"{PREFIX.beamline_prefix}-AL-SLITS-04:")
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@device_factory(mock=True)
|
|
116
|
+
def slits_5() -> Slits:
|
|
117
|
+
return Slits(f"{PREFIX.beamline_prefix}-AL-SLITS-05:")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@device_factory(mock=True)
|
|
121
|
+
def slits_6() -> Slits:
|
|
122
|
+
return Slits(f"{PREFIX.beamline_prefix}-AL-SLITS-06:")
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
@device_factory(mock=True)
|
|
126
|
+
def fswitch() -> FSwitch:
|
|
127
|
+
return FSwitch(
|
|
128
|
+
f"{PREFIX.beamline_prefix}-MO-FSWT-01:",
|
|
129
|
+
lens_geometry="paraboloid",
|
|
130
|
+
cylindrical=True,
|
|
131
|
+
lens_material="Beryllium",
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@device_factory(mock=True)
|
|
136
|
+
def vfm() -> FocusingMirror:
|
|
137
|
+
return FocusingMirror(f"{PREFIX.beamline_prefix}-OP-KBM-01:VFM:")
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@device_factory(mock=True)
|
|
141
|
+
def hfm() -> FocusingMirror:
|
|
142
|
+
return FocusingMirror(f"{PREFIX.beamline_prefix}-OP-KBM-01:HFM:")
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
@device_factory(mock=True)
|
|
146
|
+
def dcm() -> DoubleCrystalMonochromator:
|
|
147
|
+
return DoubleCrystalMonochromator(
|
|
148
|
+
temperature_prefix=f"{PREFIX.beamline_prefix}-DI-DCM-01:",
|
|
149
|
+
crystal_1_metadata=make_crystal_metadata_from_material(
|
|
150
|
+
MaterialsEnum.Si, (1, 1, 1)
|
|
151
|
+
),
|
|
152
|
+
crystal_2_metadata=make_crystal_metadata_from_material(
|
|
153
|
+
MaterialsEnum.Si, (1, 1, 1)
|
|
154
|
+
),
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
@device_factory(mock=True)
|
|
159
|
+
def undulator() -> Undulator:
|
|
160
|
+
return Undulator(
|
|
161
|
+
f"{PREFIX.insertion_prefix}-MO-SERVC-01:",
|
|
162
|
+
poles=80,
|
|
163
|
+
length=2.0,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
# Must document what PandAs are physically connected to
|
|
168
|
+
# See: https://github.com/bluesky/ophyd-async/issues/284
|
|
169
|
+
@device_factory(skip=True)
|
|
170
|
+
def panda1() -> HDFPanda:
|
|
171
|
+
return HDFPanda(
|
|
172
|
+
f"{PREFIX.beamline_prefix}-EA-PANDA-01:",
|
|
173
|
+
path_provider=get_path_provider(),
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
@device_factory(skip=True)
|
|
178
|
+
def panda2() -> HDFPanda:
|
|
179
|
+
return HDFPanda(
|
|
180
|
+
f"{PREFIX.beamline_prefix}-EA-PANDA-02:",
|
|
181
|
+
path_provider=get_path_provider(),
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
@device_factory(skip=True)
|
|
186
|
+
def panda3() -> HDFPanda:
|
|
187
|
+
return HDFPanda(
|
|
188
|
+
f"{PREFIX.beamline_prefix}-EA-PANDA-03:",
|
|
189
|
+
path_provider=get_path_provider(),
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
@device_factory(skip=True)
|
|
194
|
+
def linkam() -> Linkam3:
|
|
195
|
+
return Linkam3(f"{PREFIX.beamline_prefix}-EA-LINKM-02:")
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
@device_factory()
|
|
199
|
+
def ppump() -> WatsonMarlow323Pump:
|
|
200
|
+
"""Peristaltic Pump"""
|
|
201
|
+
return WatsonMarlow323Pump(f"{PREFIX.beamline_prefix}-EA-PUMP-01:")
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
@device_factory()
|
|
205
|
+
def high_pressure_xray_cell() -> PressureJumpCell:
|
|
206
|
+
return PressureJumpCell(
|
|
207
|
+
f"{PREFIX.beamline_prefix}-EA",
|
|
208
|
+
cell_prefix="-HPXC-01:",
|
|
209
|
+
adc_prefix="-ADC",
|
|
210
|
+
)
|
|
@@ -123,7 +123,7 @@ def load_positions_from_beamline_parameters(
|
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
|
|
126
|
-
class ApertureScatterguard(StandardReadable, Movable, Preparable):
|
|
126
|
+
class ApertureScatterguard(StandardReadable, Movable[ApertureValue], Preparable):
|
|
127
127
|
"""Move the aperture and scatterguard assembly in a safe way. There are two ways to
|
|
128
128
|
interact with the device depending on if you want simplicity or move flexibility.
|
|
129
129
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import abc
|
|
2
2
|
import asyncio
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any, Generic, TypeVar
|
|
5
5
|
|
|
6
6
|
import numpy as np
|
|
7
7
|
from bluesky.protocols import Movable
|
|
@@ -21,6 +21,8 @@ from pydantic import BaseModel, ConfigDict, RootModel
|
|
|
21
21
|
|
|
22
22
|
from dodal.log import LOGGER
|
|
23
23
|
|
|
24
|
+
T = TypeVar("T")
|
|
25
|
+
|
|
24
26
|
|
|
25
27
|
class UndulatorGateStatus(StrictEnum):
|
|
26
28
|
OPEN = "Open"
|
|
@@ -99,7 +101,7 @@ async def estimate_motor_timeout(
|
|
|
99
101
|
return abs((target_pos - cur_pos) * 2.0 / vel) + 1
|
|
100
102
|
|
|
101
103
|
|
|
102
|
-
class SafeUndulatorMover(StandardReadable, Movable):
|
|
104
|
+
class SafeUndulatorMover(StandardReadable, Movable[T], Generic[T]):
|
|
103
105
|
"""A device that will check it's safe to move the undulator before moving it and
|
|
104
106
|
wait for the undulator to be safe again before calling the move complete.
|
|
105
107
|
"""
|
|
@@ -115,7 +117,7 @@ class SafeUndulatorMover(StandardReadable, Movable):
|
|
|
115
117
|
super().__init__(name)
|
|
116
118
|
|
|
117
119
|
@AsyncStatus.wrap
|
|
118
|
-
async def set(self, value) -> None:
|
|
120
|
+
async def set(self, value: T) -> None:
|
|
119
121
|
LOGGER.info(f"Setting {self.name} to {value}")
|
|
120
122
|
await self.raise_if_cannot_move()
|
|
121
123
|
await self._set_demand_positions(value)
|
|
@@ -125,7 +127,7 @@ class SafeUndulatorMover(StandardReadable, Movable):
|
|
|
125
127
|
await wait_for_value(self.gate, UndulatorGateStatus.CLOSE, timeout=timeout)
|
|
126
128
|
|
|
127
129
|
@abc.abstractmethod
|
|
128
|
-
async def _set_demand_positions(self, value) -> None:
|
|
130
|
+
async def _set_demand_positions(self, value: T) -> None:
|
|
129
131
|
"""Set the demand positions on the device without actually hitting move."""
|
|
130
132
|
|
|
131
133
|
@abc.abstractmethod
|
|
@@ -139,7 +141,7 @@ class SafeUndulatorMover(StandardReadable, Movable):
|
|
|
139
141
|
raise RuntimeError(f"{self.name} is already in motion.")
|
|
140
142
|
|
|
141
143
|
|
|
142
|
-
class UndulatorGap(SafeUndulatorMover):
|
|
144
|
+
class UndulatorGap(SafeUndulatorMover[float]):
|
|
143
145
|
"""A device with a collection of epics signals to set Apple 2 undulator gap motion.
|
|
144
146
|
Only PV used by beamline are added the full list is here:
|
|
145
147
|
/dls_sw/work/R3.14.12.7/support/insertionDevice/db/IDGapVelocityControl.template
|
|
@@ -185,7 +187,7 @@ class UndulatorGap(SafeUndulatorMover):
|
|
|
185
187
|
self.user_readback = epics_signal_r(float, prefix + "CURRGAPD")
|
|
186
188
|
super().__init__(self.set_move, prefix, name)
|
|
187
189
|
|
|
188
|
-
async def _set_demand_positions(self, value) -> None:
|
|
190
|
+
async def _set_demand_positions(self, value: float) -> None:
|
|
189
191
|
await self.user_setpoint.set(str(value))
|
|
190
192
|
|
|
191
193
|
async def get_timeout(self) -> float:
|
|
@@ -234,7 +236,7 @@ class UndulatorPhaseMotor(StandardReadable):
|
|
|
234
236
|
super().__init__(name=name)
|
|
235
237
|
|
|
236
238
|
|
|
237
|
-
class UndulatorPhaseAxes(SafeUndulatorMover):
|
|
239
|
+
class UndulatorPhaseAxes(SafeUndulatorMover[Apple2PhasesVal]):
|
|
238
240
|
"""
|
|
239
241
|
A collection of 4 phase Motor to make up the full id phase motion. We are using the diamond pv convention.
|
|
240
242
|
e.g. top_outer == Q1
|
|
@@ -290,7 +292,7 @@ class UndulatorPhaseAxes(SafeUndulatorMover):
|
|
|
290
292
|
return np.max(timeouts)
|
|
291
293
|
|
|
292
294
|
|
|
293
|
-
class UndulatorJawPhase(SafeUndulatorMover):
|
|
295
|
+
class UndulatorJawPhase(SafeUndulatorMover[float]):
|
|
294
296
|
"""
|
|
295
297
|
A JawPhase movable, this is use for moving the jaw phase which is use to control the
|
|
296
298
|
linear arbitrary polarisation but only one some of the beamline.
|
|
@@ -29,7 +29,7 @@ class ReadOnlyAttenuator(StandardReadable):
|
|
|
29
29
|
super().__init__(name)
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
class BinaryFilterAttenuator(ReadOnlyAttenuator, Movable):
|
|
32
|
+
class BinaryFilterAttenuator(ReadOnlyAttenuator, Movable[float]):
|
|
33
33
|
"""The attenuator will insert filters into the beam to reduce its transmission.
|
|
34
34
|
In this attenuator, each filter can be in one of two states: IN or OUT
|
|
35
35
|
|
|
@@ -15,7 +15,7 @@ class BacklightPosition(StrictEnum):
|
|
|
15
15
|
OUT = "Out"
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
class Backlight(StandardReadable, Movable):
|
|
18
|
+
class Backlight(StandardReadable, Movable[BacklightPosition]):
|
|
19
19
|
"""Simple device to trigger the pneumatic in/out."""
|
|
20
20
|
|
|
21
21
|
TIME_TO_MOVE_S = 1.0 # Tested using a stopwatch on the beamline 09/2024
|
|
@@ -41,7 +41,7 @@ class BimorphMirrorStatus(StrictEnum):
|
|
|
41
41
|
ERROR = "Error"
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
class BimorphMirrorChannel(StandardReadable, Movable, EpicsDevice):
|
|
44
|
+
class BimorphMirrorChannel(StandardReadable, Movable[float], EpicsDevice):
|
|
45
45
|
"""Collection of PVs comprising a single bimorph channel.
|
|
46
46
|
|
|
47
47
|
Attributes:
|
|
@@ -66,7 +66,7 @@ class BimorphMirrorChannel(StandardReadable, Movable, EpicsDevice):
|
|
|
66
66
|
await self.output_voltage.set(value)
|
|
67
67
|
|
|
68
68
|
|
|
69
|
-
class BimorphMirror(StandardReadable, Movable):
|
|
69
|
+
class BimorphMirror(StandardReadable, Movable[Mapping[int, float]]):
|
|
70
70
|
"""Class to represent CAENels Bimorph Mirrors.
|
|
71
71
|
|
|
72
72
|
Attributes:
|
|
@@ -200,6 +200,7 @@ class FastGridScanCommon(StandardReadable, Flyable, ABC, Generic[ParamType]):
|
|
|
200
200
|
self.scan_invalid = epics_signal_r(float, f"{prefix}SCAN_INVALID")
|
|
201
201
|
|
|
202
202
|
self.run_cmd = epics_signal_x(f"{prefix}RUN.PROC")
|
|
203
|
+
self.stop_cmd = epics_signal_x(f"{prefix}STOP.PROC")
|
|
203
204
|
self.status = epics_signal_r(int, f"{prefix}SCAN_STATUS")
|
|
204
205
|
|
|
205
206
|
self.expected_images = create_hardware_backed_soft_signal(
|
|
@@ -257,7 +258,15 @@ class FastGridScanCommon(StandardReadable, Flyable, ABC, Generic[ParamType]):
|
|
|
257
258
|
|
|
258
259
|
@AsyncStatus.wrap
|
|
259
260
|
async def complete(self):
|
|
260
|
-
|
|
261
|
+
try:
|
|
262
|
+
await wait_for_value(self.status, 0, self.COMPLETE_STATUS)
|
|
263
|
+
except asyncio.TimeoutError:
|
|
264
|
+
LOGGER.error(
|
|
265
|
+
"Hyperion timed out waiting for FGS motion to complete. This may have been caused by a goniometer stage getting stuck.\n\
|
|
266
|
+
Forcibly stopping the FGS motion program..."
|
|
267
|
+
)
|
|
268
|
+
await self.stop_cmd.trigger()
|
|
269
|
+
raise
|
|
261
270
|
|
|
262
271
|
@abstractmethod
|
|
263
272
|
def _create_position_counter(self, prefix: str) -> SignalRW[int]:
|
|
@@ -55,7 +55,7 @@ class HutchInterlock(StandardReadable):
|
|
|
55
55
|
return interlock_state == HUTCH_SAFE_FOR_OPERATIONS
|
|
56
56
|
|
|
57
57
|
|
|
58
|
-
class HutchShutter(StandardReadable, Movable):
|
|
58
|
+
class HutchShutter(StandardReadable, Movable[ShutterDemand]):
|
|
59
59
|
"""Device to operate the hutch shutter.
|
|
60
60
|
|
|
61
61
|
When a demand is sent, the device should first check the hutch status \
|
|
@@ -175,7 +175,7 @@ class I10Apple2(Apple2):
|
|
|
175
175
|
self._available_pol = list(self.lookup_tables["Gap"].keys())
|
|
176
176
|
|
|
177
177
|
|
|
178
|
-
class I10Apple2PGM(StandardReadable, Movable):
|
|
178
|
+
class I10Apple2PGM(StandardReadable, Movable[float]):
|
|
179
179
|
"""
|
|
180
180
|
Compound device to set both ID and PGM energy at the sample time,poly_deg
|
|
181
181
|
|
|
@@ -211,7 +211,7 @@ class I10Apple2PGM(StandardReadable, Movable):
|
|
|
211
211
|
)
|
|
212
212
|
|
|
213
213
|
|
|
214
|
-
class I10Apple2Pol(StandardReadable, Movable):
|
|
214
|
+
class I10Apple2Pol(StandardReadable, Movable[str]):
|
|
215
215
|
"""
|
|
216
216
|
Compound device to set polorisation of ID.
|
|
217
217
|
"""
|
|
@@ -240,7 +240,7 @@ class I10Apple2Pol(StandardReadable, Movable):
|
|
|
240
240
|
) # Move id to new polarisation
|
|
241
241
|
|
|
242
242
|
|
|
243
|
-
class LinearArbitraryAngle(StandardReadable, Movable):
|
|
243
|
+
class LinearArbitraryAngle(StandardReadable, Movable[SupportsFloat]):
|
|
244
244
|
"""
|
|
245
245
|
Device to set polorisation angle of the ID. Linear Arbitrary Angle (laa)
|
|
246
246
|
is the direction of the magnetic field which can be change by varying the jaw_phase
|
|
@@ -18,7 +18,7 @@ class HutchState(str, Enum):
|
|
|
18
18
|
INVALID = "INVALID"
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
class HutchConditionalShutter(StandardReadable, Movable):
|
|
21
|
+
class HutchConditionalShutter(StandardReadable, Movable[ShutterDemand]):
|
|
22
22
|
""" I19-specific device to operate the hutch shutter.
|
|
23
23
|
|
|
24
24
|
This device evaluates the hutch state value to work out which of the two I19 \
|