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.
Files changed (424) hide show
  1. dls_dodal-1.41.0/.github/scripts/check_test_durations.py +30 -0
  2. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_test.yml +14 -3
  3. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.gitignore +4 -0
  4. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/PKG-INFO +4 -2
  5. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/pyproject.toml +6 -2
  6. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dls_dodal.egg-info/PKG-INFO +4 -2
  7. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dls_dodal.egg-info/SOURCES.txt +1 -0
  8. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dls_dodal.egg-info/requires.txt +3 -1
  9. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/_version.py +9 -4
  10. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i23.py +8 -11
  11. dls_dodal-1.41.0/src/dodal/beamlines/p38.py +210 -0
  12. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/aperturescatterguard.py +1 -1
  13. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/apple2_undulator.py +10 -8
  14. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/attenuator/attenuator.py +1 -1
  15. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/backlight.py +1 -1
  16. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/bimorph_mirror.py +2 -2
  17. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/fast_grid_scan.py +10 -1
  18. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/hutch_shutter.py +1 -1
  19. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/i10_apple2.py +3 -3
  20. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i19/shutter.py +1 -1
  21. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/pmac.py +2 -2
  22. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/oav_detector.py +1 -1
  23. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/pressure_jump_cell.py +12 -5
  24. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/robot.py +1 -1
  25. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/thawer.py +4 -4
  26. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/undulator.py +1 -1
  27. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/undulator_dcm.py +1 -1
  28. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/util/epics_util.py +1 -1
  29. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zebra/zebra.py +4 -3
  30. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zebra/zebra_controlled_shutter.py +1 -1
  31. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plan_stubs/wrapped.py +10 -12
  32. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/utils.py +1 -6
  33. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_apple2_undulator.py +6 -7
  34. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_gridscan.py +16 -0
  35. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_zocalo/__main__.py +27 -1
  36. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plan_stubs/test_wrapped_stubs.py +8 -4
  37. dls_dodal-1.40.0/src/dodal/beamlines/p38.py +0 -350
  38. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.copier-answers.yml +0 -0
  39. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.devcontainer/devcontainer.json +0 -0
  40. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/CODEOWNERS +0 -0
  41. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/CONTRIBUTING.md +0 -0
  42. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/ISSUE_TEMPLATE/issue_template.md +0 -0
  43. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/actions/install_requirements/action.yml +0 -0
  44. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/dependabot.yml +0 -0
  45. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/pages/index.html +0 -0
  46. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/pages/make_switcher.py +0 -0
  47. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_check.yml +0 -0
  48. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_dist.yml +0 -0
  49. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_docs.yml +0 -0
  50. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_pypi.yml +0 -0
  51. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_release.yml +0 -0
  52. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/_tox.yml +0 -0
  53. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/ci.yml +0 -0
  54. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.github/workflows/periodic.yml +0 -0
  55. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.pre-commit-config.yaml +0 -0
  56. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.vscode/extensions.json +0 -0
  57. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.vscode/launch.json +0 -0
  58. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.vscode/settings.json +0 -0
  59. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/.vscode/tasks.json +0 -0
  60. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/Dockerfile +0 -0
  61. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/LICENSE +0 -0
  62. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/README.md +0 -0
  63. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/catalog-info.yaml +0 -0
  64. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/conftest.py +0 -0
  65. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/_templates/autosummary/class.rst +0 -0
  66. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/_templates/autosummary/module.rst +0 -0
  67. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/_templates/custom-module-template.rst +0 -0
  68. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/assets/zocalo.png +0 -0
  69. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/conf.py +0 -0
  70. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  71. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  72. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/decisions/0003-codeowners.md +0 -0
  73. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/decisions/0003-make-devices-factory.md +0 -0
  74. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/decisions/COPYME +0 -0
  75. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/decisions.md +0 -0
  76. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations/reviews.md +0 -0
  77. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/explanations.md +0 -0
  78. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/genindex.md +0 -0
  79. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/build-docs.md +0 -0
  80. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/contribute.md +0 -0
  81. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/coverage.md +0 -0
  82. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/create-beamline.rst +0 -0
  83. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/dev-install.md +0 -0
  84. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/excalidraw.md +0 -0
  85. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/lint.md +0 -0
  86. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/lock-requirements.md +0 -0
  87. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/make-new-ophyd-async-device.rst +0 -0
  88. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/make-release.md +0 -0
  89. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/move-code.rst +0 -0
  90. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/pypi.md +0 -0
  91. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/run-tests.md +0 -0
  92. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/static-analysis.md +0 -0
  93. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/update-template.md +0 -0
  94. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/write-tests.md +0 -0
  95. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to/zocalo.rst +0 -0
  96. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/how-to.md +0 -0
  97. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/images/dls-logo.svg +0 -0
  98. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/images/excalidraw-example.svg +0 -0
  99. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/index.md +0 -0
  100. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/reference/api.md +0 -0
  101. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/reference/device-standards.rst +0 -0
  102. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/reference/standards.rst +0 -0
  103. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/reference.md +0 -0
  104. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/tutorials/get_started.rst +0 -0
  105. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/tutorials/installation.md +0 -0
  106. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/docs/tutorials.md +0 -0
  107. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/pull_request_template.md +0 -0
  108. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/setup.cfg +0 -0
  109. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/__init__.py +0 -0
  110. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dls_dodal.egg-info/dependency_links.txt +0 -0
  111. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dls_dodal.egg-info/entry_points.txt +0 -0
  112. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dls_dodal.egg-info/top_level.txt +0 -0
  113. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/__init__.py +0 -0
  114. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/__main__.py +0 -0
  115. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamline_specific_utils/__init__.py +0 -0
  116. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamline_specific_utils/i03.py +0 -0
  117. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/README.md +0 -0
  118. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/__init__.py +0 -0
  119. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/adsim.py +0 -0
  120. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/b01_1.py +0 -0
  121. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i02_1.py +0 -0
  122. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i03.py +0 -0
  123. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i04.py +0 -0
  124. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i10.py +0 -0
  125. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i13_1.py +0 -0
  126. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i18.py +0 -0
  127. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i19_1.py +0 -0
  128. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i19_2.py +0 -0
  129. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i20_1.py +0 -0
  130. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i22.py +0 -0
  131. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/i24.py +0 -0
  132. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/p45.py +0 -0
  133. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/p99.py +0 -0
  134. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/beamlines/training_rig.py +0 -0
  135. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/cli.py +0 -0
  136. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/__init__.py +0 -0
  137. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/beamlines/__init__.py +0 -0
  138. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/beamlines/beamline_parameters.py +0 -0
  139. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/beamlines/beamline_utils.py +0 -0
  140. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/beamlines/device_helpers.py +0 -0
  141. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/coordination.py +0 -0
  142. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/crystal_metadata.py +0 -0
  143. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/maths.py +0 -0
  144. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/signal_utils.py +0 -0
  145. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/types.py +0 -0
  146. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/udc_directory_provider.py +0 -0
  147. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/common/visit.py +0 -0
  148. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/CTAB.py +0 -0
  149. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/__init__.py +0 -0
  150. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/adsim.py +0 -0
  151. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/aperture.py +0 -0
  152. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/areadetector/plugins/CAM.py +0 -0
  153. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/areadetector/plugins/MJPG.py +0 -0
  154. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/attenuator/filter.py +0 -0
  155. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/attenuator/filter_selections.py +0 -0
  156. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/cryostream.py +0 -0
  157. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/current_amplifiers/__init__.py +0 -0
  158. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/current_amplifiers/current_amplifier.py +0 -0
  159. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/current_amplifiers/current_amplifier_detector.py +0 -0
  160. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/current_amplifiers/femto.py +0 -0
  161. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/current_amplifiers/sr570.py +0 -0
  162. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/current_amplifiers/struck_scaler_counter.py +0 -0
  163. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/dcm.py +0 -0
  164. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/detector/__init__.py +0 -0
  165. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/detector/det_dim_constants.py +0 -0
  166. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/detector/det_dist_to_beam_converter.py +0 -0
  167. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/detector/det_resolution.py +0 -0
  168. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/detector/detector.py +0 -0
  169. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/detector/detector_motion.py +0 -0
  170. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/diamond_filter.py +0 -0
  171. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/eiger.py +0 -0
  172. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/eiger_odin.py +0 -0
  173. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/fluorescence_detector_motion.py +0 -0
  174. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/flux.py +0 -0
  175. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/focusing_mirror.py +0 -0
  176. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i03/__init__.py +0 -0
  177. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i03/beamstop.py +0 -0
  178. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i04/transfocator.py +0 -0
  179. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/i10_setting_data.py +0 -0
  180. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/mirrors.py +0 -0
  181. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/rasor/rasor_current_amp.py +0 -0
  182. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/rasor/rasor_motors.py +0 -0
  183. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/rasor/rasor_scaler_cards.py +0 -0
  184. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i10/slits.py +0 -0
  185. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i13_1/__init__.py +0 -0
  186. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i13_1/merlin.py +0 -0
  187. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i13_1/merlin_controller.py +0 -0
  188. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i13_1/merlin_io.py +0 -0
  189. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i18/KBMirror.py +0 -0
  190. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i18/diode.py +0 -0
  191. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i18/table.py +0 -0
  192. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i18/thor_labs_stage.py +0 -0
  193. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i19/__init__.py +0 -0
  194. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i20_1/__init__.py +0 -0
  195. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i22/dcm.py +0 -0
  196. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i22/fswitch.py +0 -0
  197. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i22/nxsas.py +0 -0
  198. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/__init__.py +0 -0
  199. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/aperture.py +0 -0
  200. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/beam_center.py +0 -0
  201. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/beamstop.py +0 -0
  202. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/dcm.py +0 -0
  203. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/dual_backlight.py +0 -0
  204. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/focus_mirrors.py +0 -0
  205. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/i24_detector_motion.py +0 -0
  206. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/pilatus_metadata.py +0 -0
  207. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/i24/vgonio.py +0 -0
  208. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/ipin.py +0 -0
  209. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/linkam3.py +0 -0
  210. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/logging_ophyd_device.py +0 -0
  211. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/motors.py +0 -0
  212. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/__init__.py +0 -0
  213. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/microns_for_zoom_levels.json +0 -0
  214. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/oav_calculations.py +0 -0
  215. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/oav_parameters.py +0 -0
  216. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/oav_to_redis_forwarder.py +0 -0
  217. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/pin_image_recognition/__init__.py +0 -0
  218. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/pin_image_recognition/manual_test.py +0 -0
  219. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/pin_image_recognition/utils.py +0 -0
  220. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/snapshots/grid_overlay.py +0 -0
  221. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/snapshots/snapshot_with_beam_centre.py +0 -0
  222. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/snapshots/snapshot_with_grid.py +0 -0
  223. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/oav/utils.py +0 -0
  224. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/p45.py +0 -0
  225. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/p99/__init__.py +0 -0
  226. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/p99/sample_stage.py +0 -0
  227. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/pgm.py +0 -0
  228. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/qbpm.py +0 -0
  229. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/s4_slit_gaps.py +0 -0
  230. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/scatterguard.py +0 -0
  231. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/scintillator.py +0 -0
  232. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/slits.py +0 -0
  233. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/smargon.py +0 -0
  234. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/status.py +0 -0
  235. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/synchrotron.py +0 -0
  236. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/tetramm.py +0 -0
  237. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/training_rig/__init__.py +0 -0
  238. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/training_rig/sample_stage.py +0 -0
  239. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/turbo_slit.py +0 -0
  240. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/util/__init__.py +0 -0
  241. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/util/adjuster_plans.py +0 -0
  242. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/util/lookup_tables.py +0 -0
  243. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/util/motor_utils.py +0 -0
  244. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/util/test_utils.py +0 -0
  245. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/watsonmarlow323_pump.py +0 -0
  246. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/webcam.py +0 -0
  247. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/xbpm_feedback.py +0 -0
  248. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/xspress3/xspress3.py +0 -0
  249. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/xspress3/xspress3_channel.py +0 -0
  250. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zebra/__init__.py +0 -0
  251. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zebra/zebra_constants_mapping.py +0 -0
  252. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zocalo/__init__.py +0 -0
  253. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zocalo/zocalo_constants.py +0 -0
  254. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zocalo/zocalo_interaction.py +0 -0
  255. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/devices/zocalo/zocalo_results.py +0 -0
  256. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/log.py +0 -0
  257. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/parameters/experiment_parameter_base.py +0 -0
  258. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plan_stubs/__init__.py +0 -0
  259. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plan_stubs/check_topup.py +0 -0
  260. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plan_stubs/data_session.py +0 -0
  261. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plan_stubs/motor_utils.py +0 -0
  262. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plans/__init__.py +0 -0
  263. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plans/save_panda.py +0 -0
  264. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plans/scanspec.py +0 -0
  265. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/src/dodal/plans/wrapped.py +0 -0
  266. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/__init__.py +0 -0
  267. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_adsim.py +0 -0
  268. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_aperturescatterguard_system.py +0 -0
  269. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_cli.py +0 -0
  270. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_eiger_system.py +0 -0
  271. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_gridscan_system.py +0 -0
  272. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_oav_system.py +0 -0
  273. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_oav_to_redis_system.py +0 -0
  274. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_slit_gaps_system.py +0 -0
  275. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_smargon_system.py +0 -0
  276. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_synchrotron_system.py +0 -0
  277. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_undulator_system.py +0 -0
  278. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_zebra_system.py +0 -0
  279. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/system_tests/test_zocalo_results.py +0 -0
  280. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/__init__.py +0 -0
  281. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/beamlines/__init__.py +0 -0
  282. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/beamlines/unit_tests/__init__.py +0 -0
  283. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/beamlines/unit_tests/test_i03.py +0 -0
  284. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/beamlines/unit_tests/test_i24.py +0 -0
  285. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/beamlines/unit_tests/test_mapping.py +0 -0
  286. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/__init__.py +0 -0
  287. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/beamlines/__init__.py +0 -0
  288. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/beamlines/test_beamline_parameters.py +0 -0
  289. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/beamlines/test_beamline_utils.py +0 -0
  290. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/beamlines/test_device_helpers.py +0 -0
  291. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/beamlines/test_device_instantiation.py +0 -0
  292. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/test_coordination.py +0 -0
  293. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/test_crystal_metadata.py +0 -0
  294. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/test_maths.py +0 -0
  295. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/test_udc_directory_provider.py +0 -0
  296. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/common/test_visit.py +0 -0
  297. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/conftest.py +0 -0
  298. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/__init__.py +0 -0
  299. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i03/__init__.py +0 -0
  300. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i03/test_beamstop.py +0 -0
  301. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i04/__init__.py +0 -0
  302. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i04/test_transfocator.py +0 -0
  303. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/lookupTables/IDEnergy2GapCalibrations.csv +0 -0
  304. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/lookupTables/IDEnergy2PhaseCalibrations.csv +0 -0
  305. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdd.pkl +0 -0
  306. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdu.pkl +0 -0
  307. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidd.pkl +0 -0
  308. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidu.pkl +0 -0
  309. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i10/test_i10Apple2.py +0 -0
  310. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i13_1/test_merlin.py +0 -0
  311. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i18/test_kb_mirror.py +0 -0
  312. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i18/test_table.py +0 -0
  313. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i18/test_thor_labs_stage.py +0 -0
  314. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i19/__init__.py +0 -0
  315. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i19/test_shutter.py +0 -0
  316. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i22/test_dcm.py +0 -0
  317. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i22/test_fswitch.py +0 -0
  318. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/i22/test_metadataholder.py +0 -0
  319. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/test_diamond_filter.py +0 -0
  320. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/training_rig/test_sample_stage.py +0 -0
  321. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/__init__.py +0 -0
  322. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/conftest.py +0 -0
  323. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/current_amplifier/test_femto.py +0 -0
  324. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/current_amplifier/test_sr570.py +0 -0
  325. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/detector/test_det_dim_constants.py +0 -0
  326. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/detector/test_det_resolution.py +0 -0
  327. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/detector/test_detector.py +0 -0
  328. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/i24/__init__.py +0 -0
  329. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/i24/test_dual_backlight.py +0 -0
  330. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/i24/test_focus_mirrors.py +0 -0
  331. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/i24/test_pilatus_metadata.py +0 -0
  332. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/i24/test_pmac.py +0 -0
  333. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/i24/test_vgonio.py +0 -0
  334. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/__init__.py +0 -0
  335. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/conftest.py +0 -0
  336. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect.py +0 -0
  337. {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
  338. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/test_grid_overlay.py +0 -0
  339. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/test_oav.py +0 -0
  340. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/test_oav_parameters.py +0 -0
  341. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/test_oav_to_redis_forwarder.py +0 -0
  342. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/test_oav_utils.py +0 -0
  343. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/oav/test_snapshots.py +0 -0
  344. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/p99/test_p99_stage.py +0 -0
  345. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_OAVCentring.json +0 -0
  346. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_aperture.py +0 -0
  347. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_aperture_scatterguard.py +0 -0
  348. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_attenuator.py +0 -0
  349. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_backlight.py +0 -0
  350. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_bart_robot.py +0 -0
  351. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_beam_converter.py +0 -0
  352. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_beamline_undulator_to_gap_lookup_table.txt +0 -0
  353. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_bimorph_mirror.py +0 -0
  354. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_daq_configuration/domain/beamlineParameters +0 -0
  355. {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
  356. {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
  357. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_dcm.py +0 -0
  358. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_display.configuration +0 -0
  359. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_eiger.py +0 -0
  360. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_focusing_mirror.py +0 -0
  361. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_hutch_shutter.py +0 -0
  362. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_jCameraManZoomLevels.xml +0 -0
  363. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_linkam3.py +0 -0
  364. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_lookup_table.txt +0 -0
  365. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_lookup_table_2.txt +0 -0
  366. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_odin.py +0 -0
  367. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_pressure_jump_cell.py +0 -0
  368. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_qbpm.py +0 -0
  369. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_shutter.py +0 -0
  370. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_slits.py +0 -0
  371. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_smargon.py +0 -0
  372. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_status.py +0 -0
  373. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_synchrotron.py +0 -0
  374. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_tetramm.py +0 -0
  375. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_thawer.py +0 -0
  376. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_undulator.py +0 -0
  377. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_undulator_dcm.py +0 -0
  378. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_utils.py +0 -0
  379. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_watsonmarlow323_pump.py +0 -0
  380. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_webcam.py +0 -0
  381. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_xbpm_feedback.py +0 -0
  382. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_xspress3.py +0 -0
  383. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_zebra.py +0 -0
  384. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_zebra_constants_mapping.py +0 -0
  385. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_zocalo_interaction.py +0 -0
  386. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/test_zocalo_results.py +0 -0
  387. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/util/__init__.py +0 -0
  388. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/util/test_adjuster_plans.py +0 -0
  389. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/util/test_beamline_specific_utils.py +0 -0
  390. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/util/test_lookup_tables.py +0 -0
  391. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/devices/unit_tests/util/test_save_panda.py +0 -0
  392. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline.py +0 -0
  393. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline_all_devices_raise_exception.py +0 -0
  394. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline_broken_dependency.py +0 -0
  395. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline_dependencies.py +0 -0
  396. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline_disordered_dependencies.py +0 -0
  397. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline_misbehaving_builtins.py +0 -0
  398. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_beamline_some_devices_working.py +0 -0
  399. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_device_factory_beamline.py +0 -0
  400. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_zocalo/README.rst +0 -0
  401. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_zocalo/__init__.py +0 -0
  402. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/fake_zocalo/dls_start_fake_zocalo.sh +0 -0
  403. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plan_stubs/test_motor_util_plans.py +0 -0
  404. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plan_stubs/test_topup_plan.py +0 -0
  405. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plans/conftest.py +0 -0
  406. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plans/test_compliance.py +0 -0
  407. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plans/test_scanspec.py +0 -0
  408. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/plans/test_wrapped.py +0 -0
  409. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/preprocessors/test_filesystem_metadata.py +0 -0
  410. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/bad_beamlineParameters +0 -0
  411. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/i04_beamlineParameters +0 -0
  412. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_beamline_dcm_roll_converter.txt +0 -0
  413. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_beamline_dcm_roll_converter_non_monotonic.txt +0 -0
  414. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_beamline_dcm_roll_converter_reversed.txt +0 -0
  415. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_beamline_parameters.txt +0 -0
  416. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_det_dist_converter.txt +0 -0
  417. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_images/oav_snapshot_expected.png +0 -0
  418. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/test_images/oav_snapshot_test.png +0 -0
  419. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/topup_long_delay.txt +0 -0
  420. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_data/topup_short_params.txt +0 -0
  421. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/test_utils.py +0 -0
  422. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/unit_tests/__init__.py +0 -0
  423. {dls_dodal-1.40.0 → dls_dodal-1.41.0}/tests/unit_tests/test_cli.py +0 -0
  424. {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 tests
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: cov.xml
71
+ files: ./unit_cov.xml,./system_cov.xml
61
72
  env:
62
73
  CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
@@ -74,3 +74,7 @@ lockfiles/
74
74
 
75
75
  # pycharm project files
76
76
  .idea/
77
+
78
+
79
+ # custom CI setup
80
+ report.json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dls-dodal
3
- Version: 1.40.0
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.40.0
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 setuptools_scm
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, Union
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.40.0'
16
- __version_tuple__ = version_tuple = (1, 40, 0)
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 device_instantiation
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, skip_device
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
- @skip_device(lambda: not _is_i23_machine())
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 device_instantiation(
28
- PinTipDetection,
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
- await wait_for_value(self.status, 0, self.COMPLETE_STATUS)
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 \