dls-dodal 1.54.0__tar.gz → 1.55.1__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 (521) hide show
  1. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/workflows/_test.yml +1 -0
  2. dls_dodal-1.55.1/.talismanrc +10 -0
  3. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/PKG-INFO +2 -2
  4. dls_dodal-1.55.1/docs/assets/where-to-put-dodal-logic.png +0 -0
  5. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/create-beamline.rst +8 -14
  6. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/create-device.md +1 -1
  7. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/reference/device-standards.rst +36 -7
  8. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/pyproject.toml +1 -1
  9. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dls_dodal.egg-info/PKG-INFO +2 -2
  10. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dls_dodal.egg-info/SOURCES.txt +4 -1
  11. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dls_dodal.egg-info/requires.txt +1 -1
  12. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/_version.py +2 -2
  13. dls_dodal-1.55.1/src/dodal/beamline_specific_utils/i05_shared.py +11 -0
  14. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/aithre.py +2 -3
  15. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/b01_1.py +0 -12
  16. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/b16.py +0 -1
  17. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/b21.py +0 -2
  18. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i03.py +10 -31
  19. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i04.py +7 -38
  20. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i05.py +2 -2
  21. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i05_1.py +8 -3
  22. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i13_1.py +0 -1
  23. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i19_1.py +0 -1
  24. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i19_2.py +0 -1
  25. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i19_optics.py +1 -4
  26. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i23.py +1 -2
  27. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i24.py +0 -12
  28. dls_dodal-1.55.1/src/dodal/common/beamlines/device_helpers.py +4 -0
  29. dls_dodal-1.55.1/src/dodal/devices/aithre_lasershaping/goniometer.py +25 -0
  30. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/aithre_lasershaping/laser_robot.py +2 -2
  31. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/attenuator/attenuator.py +3 -1
  32. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/focusing_mirror.py +1 -1
  33. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i03/undulator_dcm.py +8 -3
  34. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i10/mirrors.py +2 -6
  35. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/motors.py +75 -1
  36. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/robot.py +1 -1
  37. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/tetramm.py +13 -0
  38. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/util/test_utils.py +19 -0
  39. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/webcam.py +2 -1
  40. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/zebra/zebra.py +1 -1
  41. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/zebra/zebra_controlled_shutter.py +1 -1
  42. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/zocalo/__init__.py +2 -0
  43. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/zocalo/zocalo_results.py +16 -26
  44. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/system_tests/test_adsim.py +2 -2
  45. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/aithre_lasershaping/test_goniometer.py +2 -4
  46. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/test_motors.py +54 -1
  47. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/i03/test_undulator_dcm.py +12 -0
  48. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/i24/test_pmac.py +2 -6
  49. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/i24/test_vgonio.py +2 -2
  50. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/oav/test_oav_utils.py +5 -6
  51. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_aperture_scatterguard.py +28 -41
  52. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_attenuator.py +12 -6
  53. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_gridscan.py +3 -5
  54. dls_dodal-1.55.1/tests/devices/unit_tests/test_motors.py +82 -0
  55. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_smargon.py +5 -9
  56. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_tetramm.py +1 -1
  57. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_webcam.py +2 -1
  58. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_zocalo_results.py +37 -112
  59. dls_dodal-1.55.1/tests/unit_tests/__init__.py +0 -0
  60. dls_dodal-1.54.0/src/dodal/common/beamlines/device_helpers.py +0 -37
  61. dls_dodal-1.54.0/src/dodal/devices/aithre_lasershaping/goniometer.py +0 -48
  62. dls_dodal-1.54.0/tests/common/beamlines/test_device_helpers.py +0 -23
  63. dls_dodal-1.54.0/tests/devices/unit_tests/test_motors.py +0 -28
  64. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.copier-answers.yml +0 -0
  65. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.devcontainer/devcontainer.json +0 -0
  66. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/CODEOWNERS +0 -0
  67. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/CONTRIBUTING.md +0 -0
  68. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/ISSUE_TEMPLATE/issue_template.md +0 -0
  69. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/actions/install_requirements/action.yml +0 -0
  70. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/dependabot.yml +0 -0
  71. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/pages/index.html +0 -0
  72. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/pages/make_switcher.py +0 -0
  73. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/scripts/check_test_durations.py +0 -0
  74. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/workflows/_dist.yml +0 -0
  75. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/workflows/_docs.yml +0 -0
  76. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/workflows/_pypi.yml +0 -0
  77. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/workflows/_release.yml +0 -0
  78. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/workflows/_tox.yml +0 -0
  79. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/workflows/ci.yml +0 -0
  80. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.github/workflows/periodic.yml +0 -0
  81. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.gitignore +0 -0
  82. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.pre-commit-config.yaml +0 -0
  83. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.vscode/extensions.json +0 -0
  84. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.vscode/launch.json +0 -0
  85. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.vscode/settings.json +0 -0
  86. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/.vscode/tasks.json +0 -0
  87. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/Dockerfile +0 -0
  88. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/LICENSE +0 -0
  89. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/README.md +0 -0
  90. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/catalog-info.yaml +0 -0
  91. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/conftest.py +0 -0
  92. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/_templates/autosummary/class.rst +0 -0
  93. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/_templates/autosummary/module.rst +0 -0
  94. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/_templates/custom-module-template.rst +0 -0
  95. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/assets/zocalo.png +0 -0
  96. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/conf.py +0 -0
  97. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  98. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  99. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/explanations/decisions/0003-codeowners.md +0 -0
  100. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/explanations/decisions/0004-make-devices-factory.md +0 -0
  101. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/explanations/decisions/0005-standardise-devices-at-epics-level.md +0 -0
  102. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/explanations/decisions/COPYME +0 -0
  103. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/explanations/decisions.md +0 -0
  104. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/explanations/reviews.md +0 -0
  105. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/explanations/umls/apple2_design.png +0 -0
  106. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/explanations/umls/i10_id_design.png +0 -0
  107. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/explanations.md +0 -0
  108. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/genindex.md +0 -0
  109. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/build-docs.md +0 -0
  110. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/contribute.md +0 -0
  111. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/coverage.md +0 -0
  112. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/dev-install.md +0 -0
  113. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/excalidraw.md +0 -0
  114. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/external-io-devices.md +0 -0
  115. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/lint.md +0 -0
  116. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/lock-requirements.md +0 -0
  117. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/make-release.md +0 -0
  118. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/move-code.rst +0 -0
  119. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/pypi.md +0 -0
  120. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/run-tests.md +0 -0
  121. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/static-analysis.md +0 -0
  122. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/update-template.md +0 -0
  123. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/write-tests.md +0 -0
  124. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to/zocalo.rst +0 -0
  125. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/how-to.md +0 -0
  126. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/images/dls-logo.svg +0 -0
  127. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/images/excalidraw-example.svg +0 -0
  128. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/index.md +0 -0
  129. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/reference/api.md +0 -0
  130. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/reference/standards.rst +0 -0
  131. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/reference.md +0 -0
  132. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/tutorials/get_started.rst +0 -0
  133. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/tutorials/installation.md +0 -0
  134. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/docs/tutorials.md +0 -0
  135. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/pull_request_template.md +0 -0
  136. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/setup.cfg +0 -0
  137. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/__init__.py +0 -0
  138. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dls_dodal.egg-info/dependency_links.txt +0 -0
  139. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dls_dodal.egg-info/entry_points.txt +0 -0
  140. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dls_dodal.egg-info/top_level.txt +0 -0
  141. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/__init__.py +0 -0
  142. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/__main__.py +0 -0
  143. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamline_specific_utils/__init__.py +0 -0
  144. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamline_specific_utils/i03.py +0 -0
  145. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/README.md +0 -0
  146. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/__init__.py +0 -0
  147. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/adsim.py +0 -0
  148. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/b07.py +0 -0
  149. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/b07_1.py +0 -0
  150. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/b18.py +0 -0
  151. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i02_1.py +0 -0
  152. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i09.py +0 -0
  153. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i09_1.py +0 -0
  154. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i09_2.py +0 -0
  155. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i10.py +0 -0
  156. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i18.py +0 -0
  157. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i20_1.py +0 -0
  158. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/i22.py +0 -0
  159. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/k11.py +0 -0
  160. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/p38.py +0 -0
  161. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/p45.py +0 -0
  162. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/p60.py +0 -0
  163. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/p99.py +0 -0
  164. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/beamlines/training_rig.py +0 -0
  165. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/cli.py +0 -0
  166. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/common/__init__.py +0 -0
  167. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/common/beamlines/__init__.py +0 -0
  168. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/common/beamlines/beamline_parameters.py +0 -0
  169. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/common/beamlines/beamline_utils.py +0 -0
  170. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/common/coordination.py +0 -0
  171. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/common/crystal_metadata.py +0 -0
  172. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/common/data_util.py +0 -0
  173. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/common/device_utils.py +0 -0
  174. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/common/maths.py +0 -0
  175. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/common/types.py +0 -0
  176. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/common/udc_directory_provider.py +0 -0
  177. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/common/visit.py +0 -0
  178. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/CTAB.py +0 -0
  179. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/__init__.py +0 -0
  180. {dls_dodal-1.54.0/src/dodal/devices/b16 → dls_dodal-1.55.1/src/dodal/devices/aithre_lasershaping}/__init__.py +0 -0
  181. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/aperture.py +0 -0
  182. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/aperturescatterguard.py +0 -0
  183. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/apple2_undulator.py +0 -0
  184. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/areadetector/plugins/CAM.py +0 -0
  185. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/areadetector/plugins/MJPG.py +0 -0
  186. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/attenuator/filter.py +0 -0
  187. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/attenuator/filter_selections.py +0 -0
  188. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/b07/__init__.py +0 -0
  189. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/b07/enums.py +0 -0
  190. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/b07_1/__init__.py +0 -0
  191. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/b07_1/ccmc.py +0 -0
  192. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/b07_1/enums.py +0 -0
  193. {dls_dodal-1.54.0/src/dodal/devices/i10 → dls_dodal-1.55.1/src/dodal/devices/b16}/__init__.py +0 -0
  194. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/b16/detector.py +0 -0
  195. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/backlight.py +0 -0
  196. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/baton.py +0 -0
  197. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/bimorph_mirror.py +0 -0
  198. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/common_dcm.py +0 -0
  199. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/cryostream.py +0 -0
  200. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/current_amplifiers/__init__.py +0 -0
  201. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/current_amplifiers/current_amplifier.py +0 -0
  202. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/current_amplifiers/current_amplifier_detector.py +0 -0
  203. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/current_amplifiers/femto.py +0 -0
  204. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/current_amplifiers/sr570.py +0 -0
  205. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/current_amplifiers/struck_scaler_counter.py +0 -0
  206. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/detector/__init__.py +0 -0
  207. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/detector/det_dim_constants.py +0 -0
  208. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/detector/det_dist_to_beam_converter.py +0 -0
  209. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/detector/det_resolution.py +0 -0
  210. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/detector/detector.py +0 -0
  211. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/detector/detector_motion.py +0 -0
  212. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/diamond_filter.py +0 -0
  213. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/eiger.py +0 -0
  214. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/eiger_odin.py +0 -0
  215. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/__init__.py +0 -0
  216. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/abstract/__init__.py +0 -0
  217. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/abstract/base_detector.py +0 -0
  218. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/abstract/base_driver_io.py +0 -0
  219. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/abstract/base_region.py +0 -0
  220. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/abstract/types.py +0 -0
  221. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/detector.py +0 -0
  222. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/enums.py +0 -0
  223. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/specs/__init__.py +0 -0
  224. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/specs/detector.py +0 -0
  225. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/specs/driver_io.py +0 -0
  226. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/specs/enums.py +0 -0
  227. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/specs/region.py +0 -0
  228. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/types.py +0 -0
  229. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/util.py +0 -0
  230. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/vgscienta/__init__.py +0 -0
  231. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/vgscienta/detector.py +0 -0
  232. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/vgscienta/driver_io.py +0 -0
  233. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/vgscienta/enums.py +0 -0
  234. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/electron_analyser/vgscienta/region.py +0 -0
  235. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/fast_grid_scan.py +0 -0
  236. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/fluorescence_detector_motion.py +0 -0
  237. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/flux.py +0 -0
  238. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/hutch_shutter.py +0 -0
  239. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i03/__init__.py +0 -0
  240. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i03/dcm.py +0 -0
  241. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i04/__init__.py +0 -0
  242. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i04/constants.py +0 -0
  243. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i04/murko_results.py +0 -0
  244. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i04/transfocator.py +0 -0
  245. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i05/__init__.py +0 -0
  246. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i05/enums.py +0 -0
  247. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i09/__init__.py +0 -0
  248. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i09/dcm.py +0 -0
  249. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i09/enums.py +0 -0
  250. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i09_1/__init__.py +0 -0
  251. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i09_1/enums.py +0 -0
  252. {dls_dodal-1.54.0/src/dodal/devices/i13_1 → dls_dodal-1.55.1/src/dodal/devices/i10}/__init__.py +0 -0
  253. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i10/diagnostics.py +0 -0
  254. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i10/i10_apple2.py +0 -0
  255. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i10/i10_setting_data.py +0 -0
  256. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i10/rasor/rasor_current_amp.py +0 -0
  257. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i10/rasor/rasor_motors.py +0 -0
  258. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i10/rasor/rasor_scaler_cards.py +0 -0
  259. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i10/slits.py +0 -0
  260. {dls_dodal-1.54.0/src/dodal/devices/i19 → dls_dodal-1.55.1/src/dodal/devices/i13_1}/__init__.py +0 -0
  261. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i13_1/merlin.py +0 -0
  262. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i13_1/merlin_controller.py +0 -0
  263. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i18/KBMirror.py +0 -0
  264. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i18/diode.py +0 -0
  265. {dls_dodal-1.54.0/src/dodal/devices/i20_1 → dls_dodal-1.55.1/src/dodal/devices/i19}/__init__.py +0 -0
  266. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i19/beamstop.py +0 -0
  267. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i19/blueapi_device.py +0 -0
  268. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i19/hutch_access.py +0 -0
  269. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i19/shutter.py +0 -0
  270. {dls_dodal-1.54.0/src/dodal/devices/i24 → dls_dodal-1.55.1/src/dodal/devices/i20_1}/__init__.py +0 -0
  271. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i22/dcm.py +0 -0
  272. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i22/fswitch.py +0 -0
  273. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i22/nxsas.py +0 -0
  274. {dls_dodal-1.54.0/src/dodal/devices/oav → dls_dodal-1.55.1/src/dodal/devices/i24}/__init__.py +0 -0
  275. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i24/aperture.py +0 -0
  276. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i24/beam_center.py +0 -0
  277. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i24/beamstop.py +0 -0
  278. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i24/dcm.py +0 -0
  279. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i24/dual_backlight.py +0 -0
  280. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i24/focus_mirrors.py +0 -0
  281. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i24/pilatus_metadata.py +0 -0
  282. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i24/pmac.py +0 -0
  283. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/i24/vgonio.py +0 -0
  284. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/ipin.py +0 -0
  285. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/linkam3.py +0 -0
  286. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/mx_phase1/beamstop.py +0 -0
  287. {dls_dodal-1.54.0/src/dodal/devices/p99 → dls_dodal-1.55.1/src/dodal/devices/oav}/__init__.py +0 -0
  288. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/oav/oav_calculations.py +0 -0
  289. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/oav/oav_detector.py +0 -0
  290. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/oav/oav_parameters.py +0 -0
  291. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/oav/oav_to_redis_forwarder.py +0 -0
  292. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/oav/pin_image_recognition/__init__.py +0 -0
  293. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/oav/pin_image_recognition/manual_test.py +0 -0
  294. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/oav/pin_image_recognition/utils.py +0 -0
  295. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/oav/snapshots/grid_overlay.py +0 -0
  296. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/oav/snapshots/snapshot.py +0 -0
  297. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/oav/snapshots/snapshot_image_processing.py +0 -0
  298. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/oav/snapshots/snapshot_with_grid.py +0 -0
  299. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/oav/utils.py +0 -0
  300. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/p45.py +0 -0
  301. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/p60/__init__.py +0 -0
  302. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/p60/enums.py +0 -0
  303. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/p60/lab_xray_source.py +0 -0
  304. {dls_dodal-1.54.0/src/dodal/devices/util → dls_dodal-1.55.1/src/dodal/devices/p99}/__init__.py +0 -0
  305. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/p99/andor2_point.py +0 -0
  306. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/p99/sample_stage.py +0 -0
  307. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/pgm.py +0 -0
  308. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/positioner.py +0 -0
  309. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/pressure_jump_cell.py +0 -0
  310. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/qbpm.py +0 -0
  311. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/s4_slit_gaps.py +0 -0
  312. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/scintillator.py +0 -0
  313. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/slits.py +0 -0
  314. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/smargon.py +0 -0
  315. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/status.py +0 -0
  316. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/synchrotron.py +0 -0
  317. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/thawer.py +0 -0
  318. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/turbo_slit.py +0 -0
  319. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/undulator.py +0 -0
  320. {dls_dodal-1.54.0/src/dodal/devices/zebra → dls_dodal-1.55.1/src/dodal/devices/util}/__init__.py +0 -0
  321. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/util/adjuster_plans.py +0 -0
  322. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/util/epics_util.py +0 -0
  323. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/util/lookup_tables.py +0 -0
  324. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/watsonmarlow323_pump.py +0 -0
  325. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/xbpm_feedback.py +0 -0
  326. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/xspress3/xspress3.py +0 -0
  327. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/xspress3/xspress3_channel.py +0 -0
  328. {dls_dodal-1.54.0/src/dodal/plan_stubs → dls_dodal-1.55.1/src/dodal/devices/zebra}/__init__.py +0 -0
  329. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/zebra/zebra_constants_mapping.py +0 -0
  330. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/zocalo/zocalo_constants.py +0 -0
  331. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/devices/zocalo/zocalo_interaction.py +0 -0
  332. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/log.py +0 -0
  333. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/parameters/experiment_parameter_base.py +0 -0
  334. {dls_dodal-1.54.0/src/dodal/plans/preprocessors → dls_dodal-1.55.1/src/dodal/plan_stubs}/__init__.py +0 -0
  335. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/plan_stubs/check_topup.py +0 -0
  336. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/plan_stubs/data_session.py +0 -0
  337. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/plan_stubs/motor_utils.py +0 -0
  338. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/plan_stubs/wrapped.py +0 -0
  339. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/plans/__init__.py +0 -0
  340. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/plans/bimorph.py +0 -0
  341. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/plans/configure_arm_trigger_and_disarm_detector.py +0 -0
  342. {dls_dodal-1.54.0/system_tests → dls_dodal-1.55.1/src/dodal/plans/preprocessors}/__init__.py +0 -0
  343. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/plans/preprocessors/verify_undulator_gap.py +0 -0
  344. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/plans/save_panda.py +0 -0
  345. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/plans/scanspec.py +0 -0
  346. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/plans/verify_undulator_gap.py +0 -0
  347. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/plans/wrapped.py +0 -0
  348. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/src/dodal/utils.py +0 -0
  349. {dls_dodal-1.54.0/tests → dls_dodal-1.55.1/system_tests}/__init__.py +0 -0
  350. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/system_tests/test_cli.py +0 -0
  351. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/system_tests/test_oav_system.py +0 -0
  352. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/system_tests/test_oav_to_redis_system.py +0 -0
  353. {dls_dodal-1.54.0/tests/beamlines → dls_dodal-1.55.1/tests}/__init__.py +0 -0
  354. {dls_dodal-1.54.0/tests/beamlines/unit_tests → dls_dodal-1.55.1/tests/beamlines}/__init__.py +0 -0
  355. {dls_dodal-1.54.0/tests/common → dls_dodal-1.55.1/tests/beamlines/unit_tests}/__init__.py +0 -0
  356. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/beamlines/unit_tests/test_b16.py +0 -0
  357. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/beamlines/unit_tests/test_i03.py +0 -0
  358. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/beamlines/unit_tests/test_i24.py +0 -0
  359. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/beamlines/unit_tests/test_mapping.py +0 -0
  360. {dls_dodal-1.54.0/tests/common/beamlines → dls_dodal-1.55.1/tests/common}/__init__.py +0 -0
  361. {dls_dodal-1.54.0/tests/devices → dls_dodal-1.55.1/tests/common/beamlines}/__init__.py +0 -0
  362. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/common/beamlines/test_beamline_parameters.py +0 -0
  363. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/common/beamlines/test_beamline_utils.py +0 -0
  364. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/common/beamlines/test_device_instantiation.py +0 -0
  365. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/common/test_coordination.py +0 -0
  366. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/common/test_crystal_metadata.py +0 -0
  367. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/common/test_maths.py +0 -0
  368. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/common/test_udc_directory_provider.py +0 -0
  369. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/common/test_visit.py +0 -0
  370. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/conftest.py +0 -0
  371. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/constants.py +0 -0
  372. {dls_dodal-1.54.0/tests/devices/i03 → dls_dodal-1.55.1/tests/devices}/__init__.py +0 -0
  373. {dls_dodal-1.54.0/tests/devices/i04 → dls_dodal-1.55.1/tests/devices/i03}/__init__.py +0 -0
  374. {dls_dodal-1.54.0/tests/devices/i19 → dls_dodal-1.55.1/tests/devices/i04}/__init__.py +0 -0
  375. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i04/test_murko_results.py +0 -0
  376. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i04/test_transfocator.py +0 -0
  377. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i10/lookupTables/IDEnergy2GapCalibrations.csv +0 -0
  378. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i10/lookupTables/IDEnergy2PhaseCalibrations.csv +0 -0
  379. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdd.pkl +0 -0
  380. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdu.pkl +0 -0
  381. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidd.pkl +0 -0
  382. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidu.pkl +0 -0
  383. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i10/test_i10Apple2.py +0 -0
  384. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i13_1/test_merlin.py +0 -0
  385. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i18/test_kb_mirror.py +0 -0
  386. {dls_dodal-1.54.0/tests/devices/mx_phase1 → dls_dodal-1.55.1/tests/devices/i19}/__init__.py +0 -0
  387. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i19/test_beamstop.py +0 -0
  388. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i19/test_shutter.py +0 -0
  389. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i22/test_dcm.py +0 -0
  390. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i22/test_fswitch.py +0 -0
  391. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/i22/test_metadataholder.py +0 -0
  392. {dls_dodal-1.54.0/tests/devices/unit_tests → dls_dodal-1.55.1/tests/devices/mx_phase1}/__init__.py +0 -0
  393. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/mx_phase1/test_beamstop.py +0 -0
  394. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/test_common_dcm.py +0 -0
  395. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/test_diamond_filter.py +0 -0
  396. {dls_dodal-1.54.0/tests/devices/unit_tests/electron_analyser → dls_dodal-1.55.1/tests/devices/unit_tests}/__init__.py +0 -0
  397. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/b07_1/test_ccmc.py +0 -0
  398. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/current_amplifier/test_femto.py +0 -0
  399. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/current_amplifier/test_sr570.py +0 -0
  400. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/detector/test_det_dim_constants.py +0 -0
  401. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/detector/test_det_resolution.py +0 -0
  402. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/detector/test_detector.py +0 -0
  403. {dls_dodal-1.54.0/tests/devices/unit_tests/electron_analyser/abstract → dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser}/__init__.py +0 -0
  404. {dls_dodal-1.54.0/tests/devices/unit_tests/electron_analyser/specs → dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser/abstract}/__init__.py +0 -0
  405. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/electron_analyser/abstract/test_base_detector.py +0 -0
  406. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/electron_analyser/abstract/test_base_driver_io.py +0 -0
  407. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/electron_analyser/abstract/test_base_region.py +0 -0
  408. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/electron_analyser/conftest.py +0 -0
  409. {dls_dodal-1.54.0/tests/devices/unit_tests/electron_analyser/vgscienta → dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser/specs}/__init__.py +0 -0
  410. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/electron_analyser/specs/test_detector.py +0 -0
  411. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/electron_analyser/specs/test_driver_io.py +0 -0
  412. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/electron_analyser/specs/test_region.py +0 -0
  413. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/electron_analyser/test_util.py +0 -0
  414. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/electron_analyser/util.py +0 -0
  415. {dls_dodal-1.54.0/tests/devices/unit_tests/i03 → dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser/vgscienta}/__init__.py +0 -0
  416. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/electron_analyser/vgscienta/test_detector.py +0 -0
  417. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/electron_analyser/vgscienta/test_driver_io.py +0 -0
  418. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/electron_analyser/vgscienta/test_region.py +0 -0
  419. {dls_dodal-1.54.0/tests/devices/unit_tests/i09 → dls_dodal-1.55.1/tests/devices/unit_tests/i03}/__init__.py +0 -0
  420. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/i03/test_dcm.py +0 -0
  421. {dls_dodal-1.54.0/tests/devices/unit_tests/i24 → dls_dodal-1.55.1/tests/devices/unit_tests/i09}/__init__.py +0 -0
  422. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/i09/test_dcm.py +0 -0
  423. {dls_dodal-1.54.0/tests/devices/unit_tests/oav → dls_dodal-1.55.1/tests/devices/unit_tests/i24}/__init__.py +0 -0
  424. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/i24/test_dual_backlight.py +0 -0
  425. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/i24/test_focus_mirrors.py +0 -0
  426. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/i24/test_pilatus_metadata.py +0 -0
  427. {dls_dodal-1.54.0/tests/devices/unit_tests/util → dls_dodal-1.55.1/tests/devices/unit_tests/oav}/__init__.py +0 -0
  428. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/oav/conftest.py +0 -0
  429. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect.py +0 -0
  430. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect_utils.py +0 -0
  431. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/oav/test_grid_overlay.py +0 -0
  432. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/oav/test_oav.py +0 -0
  433. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/oav/test_oav_parameters.py +0 -0
  434. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/oav/test_oav_to_redis_forwarder.py +0 -0
  435. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/oav/test_snapshot_image_processing.py +0 -0
  436. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/oav/test_snapshots.py +0 -0
  437. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/p60/test_lab_xray_source.py +0 -0
  438. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/p99/test_p99_stage.py +0 -0
  439. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_OAVCentring.json +0 -0
  440. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_aperture.py +0 -0
  441. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_apple2_undulator.py +0 -0
  442. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_backlight.py +0 -0
  443. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_bart_robot.py +0 -0
  444. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_baton.py +0 -0
  445. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_beam_converter.py +0 -0
  446. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_beamline_undulator_to_gap_lookup_table.txt +0 -0
  447. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_bimorph_mirror.py +0 -0
  448. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_daq_configuration/domain/beamlineParameters +0 -0
  449. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Pitch_converter.txt +0 -0
  450. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt +0 -0
  451. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_display.configuration +0 -0
  452. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_eiger.py +0 -0
  453. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_focusing_mirror.py +0 -0
  454. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_hutch_shutter.py +0 -0
  455. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_jCameraManZoomLevels.xml +0 -0
  456. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_lookup_table.txt +0 -0
  457. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_lookup_table_2.txt +0 -0
  458. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_odin.py +0 -0
  459. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_positioner.py +0 -0
  460. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_pressure_jump_cell.py +0 -0
  461. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_qbpm.py +0 -0
  462. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_slits.py +0 -0
  463. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_status.py +0 -0
  464. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_synchrotron.py +0 -0
  465. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_thawer.py +0 -0
  466. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_turbo_slit.py +0 -0
  467. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_undulator.py +0 -0
  468. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_utils.py +0 -0
  469. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_watsonmarlow323_pump.py +0 -0
  470. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_xbpm_feedback.py +0 -0
  471. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_xspress3.py +0 -0
  472. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_zebra.py +0 -0
  473. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_zebra_constants_mapping.py +0 -0
  474. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_zebra_shutter.py +0 -0
  475. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/test_zocalo_interaction.py +0 -0
  476. {dls_dodal-1.54.0/tests/fake_zocalo → dls_dodal-1.55.1/tests/devices/unit_tests/util}/__init__.py +0 -0
  477. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/util/test_adjuster_plans.py +0 -0
  478. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/util/test_beamline_specific_utils.py +0 -0
  479. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/util/test_lookup_tables.py +0 -0
  480. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/devices/unit_tests/util/test_save_panda.py +0 -0
  481. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/fake_beamline.py +0 -0
  482. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/fake_beamline_all_devices_raise_exception.py +0 -0
  483. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/fake_beamline_broken_dependency.py +0 -0
  484. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/fake_beamline_dependencies.py +0 -0
  485. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/fake_beamline_disordered_dependencies.py +0 -0
  486. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/fake_beamline_misbehaving_builtins.py +0 -0
  487. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/fake_beamline_some_devices_working.py +0 -0
  488. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/fake_device_factory_beamline.py +0 -0
  489. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/fake_zocalo/README.rst +0 -0
  490. {dls_dodal-1.54.0/tests/unit_tests → dls_dodal-1.55.1/tests/fake_zocalo}/__init__.py +0 -0
  491. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/fake_zocalo/__main__.py +0 -0
  492. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/fake_zocalo/dls_start_fake_zocalo.sh +0 -0
  493. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/plan_stubs/test_data_session.py +0 -0
  494. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/plan_stubs/test_motor_util_plans.py +0 -0
  495. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/plan_stubs/test_topup_plan.py +0 -0
  496. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/plan_stubs/test_wrapped_stubs.py +0 -0
  497. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/plans/conftest.py +0 -0
  498. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/plans/test_bimorph.py +0 -0
  499. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/plans/test_compliance.py +0 -0
  500. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/plans/test_configure_arm_trigger_and_disarm_detector.py +0 -0
  501. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/plans/test_preprocessors/test_verify_undulator_gap.py +0 -0
  502. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/plans/test_scanspec.py +0 -0
  503. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/plans/test_verify_undulator_gap_plan.py +0 -0
  504. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/plans/test_wrapped.py +0 -0
  505. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/preprocessors/test_filesystem_metadata.py +0 -0
  506. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/bad_beamlineParameters +0 -0
  507. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/electron_analyser/specs_sequence.seq +0 -0
  508. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/electron_analyser/vgscienta_sequence.seq +0 -0
  509. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/i04_beamlineParameters +0 -0
  510. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/test_beamline_dcm_roll_converter.txt +0 -0
  511. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/test_beamline_dcm_roll_converter_non_monotonic.txt +0 -0
  512. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/test_beamline_dcm_roll_converter_reversed.txt +0 -0
  513. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/test_beamline_parameters.txt +0 -0
  514. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/test_det_dist_converter.txt +0 -0
  515. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/test_images/oav_snapshot_expected.png +0 -0
  516. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/test_images/oav_snapshot_test.png +0 -0
  517. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/topup_long_delay.txt +0 -0
  518. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_data/topup_short_params.txt +0 -0
  519. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/test_utils.py +0 -0
  520. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/unit_tests/test_cli.py +0 -0
  521. {dls_dodal-1.54.0 → dls_dodal-1.55.1}/tests/unit_tests/test_log.py +0 -0
@@ -62,6 +62,7 @@ jobs:
62
62
  with:
63
63
  repository: epics-containers/example-services
64
64
  path: example-services
65
+ ref: '2025.8.1'
65
66
 
66
67
  - name: Run docker compose
67
68
  uses: hoverkraft-tech/compose-action@v2.3.0
@@ -0,0 +1,10 @@
1
+ fileignoreconfig:
2
+ # Allow CI workflows to pin to the SHA hash
3
+ - filename: ".github/**/*.yml"
4
+ allowed_patterns:
5
+ - "uses: .*"
6
+ # Allow use of pass_energy signal name
7
+ - filename: "*.py"
8
+ allowed_patterns:
9
+ - pass_energy
10
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dls-dodal
3
- Version: 1.54.0
3
+ Version: 1.55.1
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>, Joseph Ware <joseph.ware@diamond.ac.uk>, Oliver Silvester <Oliver.Silvester@diamond.ac.uk>, Noemi Frisina <noemi.frisina@diamond.ac.uk>
6
6
  License: Apache License
@@ -215,7 +215,7 @@ Description-Content-Type: text/markdown
215
215
  License-File: LICENSE
216
216
  Requires-Dist: click
217
217
  Requires-Dist: ophyd
218
- Requires-Dist: ophyd-async[ca,pva]>=0.12.3
218
+ Requires-Dist: ophyd-async[ca,pva]>=0.13.0
219
219
  Requires-Dist: bluesky
220
220
  Requires-Dist: pyepics
221
221
  Requires-Dist: dataclasses-json
@@ -63,14 +63,14 @@ The following example creates a fictitious beamline ``w41``, with a simulated tw
63
63
  """
64
64
 
65
65
  """
66
- A valid factory function which:
67
- - may be instantiated automatically, selectively on live beamline
68
- - caches and re-uses the result for subsequent calls
69
- - automatically names the device
70
- - may be skipped when make_all_devices is called on this module
71
- - must be explicitly connected (may be automated by tools)
72
- - when connected may connect to a simulated backend
73
- - may be connected concurrently (when automated by tools)
66
+ This decorator gives extra desirable behaviour to this factory function:
67
+ - it may be instantiated automatically, selectively on live beamline
68
+ - caching and re-using the result for subsequent calls
69
+ - it automatically names the device if no name is explicitly set
70
+ - it may be skipped when make_all_devices is called on this module
71
+ - it must be explicitly connected (which may be automated by tools)
72
+ - when connected it may connect to a simulated backend
73
+ - it may be connected concurrently (when automated by tools)
74
74
  """"
75
75
  @device_factory(skip = BL == "s41")
76
76
  def synchrotron() -> Synchrotron:
@@ -85,9 +85,3 @@ The following example creates a fictitious beamline ``w41``, with a simulated tw
85
85
  drv_suffix=CAM_SUFFIX,
86
86
  fileio_suffix=HDF5_SUFFIX,
87
87
  )
88
-
89
-
90
- ``w41`` should also be added to the list of ``ALL_BEAMLINES`` in ``tests/beamlines/test_device_instantiation``.
91
- This test checks that the function returns a type that conforms to Bluesky protocols,
92
- that it always returns the same instance of the device and that the arguments passed
93
- into the Device class constructor are valid.
@@ -1,7 +1,7 @@
1
1
  Creating a new device
2
2
  ---------------------
3
3
 
4
- Devices are written using the ophyd-async framework, the hardware abstraction library at Diamond.
4
+ Devices are written using the ophyd-async framework, the hardware abstraction library at Diamond. Before creating your device, you should [consider where the new code should live](../reference/device-standards.rst#where_to_put_devices).
5
5
 
6
6
  Reusing an existing class
7
7
  =========================
@@ -7,6 +7,9 @@ Some devices have been written in ``ophyd`` for historic reasons. However, all n
7
7
  ``ophyd-async`` and any old ``ophyd`` devices undergoing a large re-write should be considered for
8
8
  conversion to ``ophyd-async``.
9
9
 
10
+
11
+ .. _where_to_put_devices:
12
+
10
13
  Where to put devices
11
14
  --------------------
12
15
 
@@ -19,7 +22,11 @@ should think about where to place them in the following order:
19
22
  complex device (e.g. multiple files) it should have a folder of its own e.g. ``oav``
20
23
  #. A device that is very specific to a particular beamline should go in the ``devices/ixx`` folder
21
24
 
22
- This is in an effort to avoid duplication across facilities/beamlines.
25
+ This is in an effort to avoid duplication across facilities/beamlines. You should also consider whether it is best for a piece of logic is better suited to the control system or a bluesky plan - see `ophyd-async's guide <https://blueskyproject.io/ophyd-async/main/explanations/where-device-logic.html>`_ on that.
26
+
27
+ Determining where in dodal a device should live can be summarised below:
28
+
29
+ .. image:: ../assets/where-to-put-dodal-logic.png
23
30
 
24
31
  Device Best Practices
25
32
  ----------------------------
@@ -27,10 +34,33 @@ Device Best Practices
27
34
  Ophyd-async directory contains a flowchart_ for a simplified decision tree about what interfaces
28
35
  should a given device implement. In addition to this the following guidelines are strongly recommended:
29
36
 
37
+ #. Device should have their name as an optional str parameter with a default of ""- this allows ophyd-async to automatically name the device
30
38
  #. Devices should contain only the PV suffixes that are generic for any instance of the device. See `PV Suffixes`_
31
39
  #. Anything in a device that is expected to be set externally should be a signal. See `Use of signals`_
32
40
  #. Devices should not hold state, when they are read they should read the hardware. See `Holding State`_
33
41
 
42
+ Defaulting Names
43
+ ----------------
44
+
45
+ Device should provide the ability to override their name while maintaining a default name of ""-
46
+ this allows the device to be named on connection from the name of its factory function when using
47
+ the device_factory decorator.
48
+
49
+ When a device is named in this way, all of its child devices are named appropriately.
50
+
51
+ .. code-block:: python
52
+ class MyDevice(Device):
53
+ def __init__(self, prefix: str, name: str = "")
54
+ x = Motor(prefix + "X")
55
+ super().__init__(name)
56
+
57
+ @device_factory()
58
+ def foo() -> MyDevice:
59
+ return MyDevice("FOO:")
60
+
61
+ f = foo()
62
+ f.name == "foo"
63
+ f.x.name == "foo-x"
34
64
 
35
65
  PV Suffixes
36
66
  -----------
@@ -40,23 +70,22 @@ In general devices should contain only the PV suffixes that are generic for any
40
70
  .. code-block:: python
41
71
 
42
72
  class MyDevice(Device):
43
- def __init__(self, name: str, prefix: str)
73
+ def __init__(self, prefix: str, name: str = "")
44
74
  self.bragg = Motor(prefix + "BRAGG")
45
- super().__init__(name)
46
-
47
- device_instantiation(MyDevice, "dcm", "-MO-DCM-01:")
75
+ super().__init__(name)
48
76
 
77
+ MyDevice("BLXXI-MO-DCM-01:")
49
78
 
50
79
  is preferred over
51
80
 
52
81
  .. code-block:: python
53
82
 
54
83
  class MyDevice(Device):
55
- def __init__(self, name: str, prefix: str)
84
+ def __init__(self, prefix: str, name: str = "")
56
85
  self.bragg = Motor(prefix + "-MO-DCM-01:BRAGG")
57
86
  super().__init__(name)
58
87
 
59
- device_instantiation(MyDevice, "dcm", "")
88
+ MyDevice("BLXXI")
60
89
 
61
90
  This is so that a new device on say ``-MO-DCM-02`` can be easily created.
62
91
 
@@ -14,7 +14,7 @@ description = "Ophyd devices and other utils that could be used across DLS beaml
14
14
  dependencies = [
15
15
  "click",
16
16
  "ophyd",
17
- "ophyd-async[ca,pva]>=0.12.3",
17
+ "ophyd-async[ca,pva]>=0.13.0",
18
18
  "bluesky",
19
19
  "pyepics",
20
20
  "dataclasses-json",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dls-dodal
3
- Version: 1.54.0
3
+ Version: 1.55.1
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>, Joseph Ware <joseph.ware@diamond.ac.uk>, Oliver Silvester <Oliver.Silvester@diamond.ac.uk>, Noemi Frisina <noemi.frisina@diamond.ac.uk>
6
6
  License: Apache License
@@ -215,7 +215,7 @@ Description-Content-Type: text/markdown
215
215
  License-File: LICENSE
216
216
  Requires-Dist: click
217
217
  Requires-Dist: ophyd
218
- Requires-Dist: ophyd-async[ca,pva]>=0.12.3
218
+ Requires-Dist: ophyd-async[ca,pva]>=0.13.0
219
219
  Requires-Dist: bluesky
220
220
  Requires-Dist: pyepics
221
221
  Requires-Dist: dataclasses-json
@@ -1,6 +1,7 @@
1
1
  .copier-answers.yml
2
2
  .gitignore
3
3
  .pre-commit-config.yaml
4
+ .talismanrc
4
5
  Dockerfile
5
6
  LICENSE
6
7
  README.md
@@ -39,6 +40,7 @@ docs/tutorials.md
39
40
  docs/_templates/custom-module-template.rst
40
41
  docs/_templates/autosummary/class.rst
41
42
  docs/_templates/autosummary/module.rst
43
+ docs/assets/where-to-put-dodal-logic.png
42
44
  docs/assets/zocalo.png
43
45
  docs/explanations/decisions.md
44
46
  docs/explanations/reviews.md
@@ -90,6 +92,7 @@ src/dodal/log.py
90
92
  src/dodal/utils.py
91
93
  src/dodal/beamline_specific_utils/__init__.py
92
94
  src/dodal/beamline_specific_utils/i03.py
95
+ src/dodal/beamline_specific_utils/i05_shared.py
93
96
  src/dodal/beamlines/README.md
94
97
  src/dodal/beamlines/__init__.py
95
98
  src/dodal/beamlines/adsim.py
@@ -177,6 +180,7 @@ src/dodal/devices/undulator.py
177
180
  src/dodal/devices/watsonmarlow323_pump.py
178
181
  src/dodal/devices/webcam.py
179
182
  src/dodal/devices/xbpm_feedback.py
183
+ src/dodal/devices/aithre_lasershaping/__init__.py
180
184
  src/dodal/devices/aithre_lasershaping/goniometer.py
181
185
  src/dodal/devices/aithre_lasershaping/laser_robot.py
182
186
  src/dodal/devices/areadetector/plugins/CAM.py
@@ -352,7 +356,6 @@ tests/common/test_visit.py
352
356
  tests/common/beamlines/__init__.py
353
357
  tests/common/beamlines/test_beamline_parameters.py
354
358
  tests/common/beamlines/test_beamline_utils.py
355
- tests/common/beamlines/test_device_helpers.py
356
359
  tests/common/beamlines/test_device_instantiation.py
357
360
  tests/devices/__init__.py
358
361
  tests/devices/test_common_dcm.py
@@ -1,6 +1,6 @@
1
1
  click
2
2
  ophyd
3
- ophyd-async[ca,pva]>=0.12.3
3
+ ophyd-async[ca,pva]>=0.13.0
4
4
  bluesky
5
5
  pyepics
6
6
  dataclasses-json
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.54.0'
21
- __version_tuple__ = version_tuple = (1, 54, 0)
20
+ __version__ = version = '1.55.1'
21
+ __version_tuple__ = version_tuple = (1, 55, 1)
@@ -0,0 +1,11 @@
1
+ from dodal.common.beamlines.beamline_utils import device_factory
2
+ from dodal.devices.i05.enums import Grating
3
+ from dodal.devices.pgm import PGM
4
+ from dodal.utils import BeamlinePrefix
5
+
6
+ PREFIX = BeamlinePrefix("i05", "I")
7
+
8
+
9
+ @device_factory()
10
+ def pgm() -> PGM:
11
+ return PGM(prefix=f"{PREFIX.beamline_prefix}-OP-PGM-01:", grating=Grating)
@@ -12,12 +12,12 @@ PREFIX = "LA18L"
12
12
 
13
13
  @device_factory()
14
14
  def goniometer() -> Goniometer:
15
- return Goniometer(f"{PREFIX}-MO-LSR-01:", "goniometer")
15
+ return Goniometer(f"{PREFIX}-MO-LSR-01:")
16
16
 
17
17
 
18
18
  @device_factory()
19
19
  def robot() -> LaserRobot:
20
- return LaserRobot("robot", f"{PREFIX}-MO-ROBOT-01:")
20
+ return LaserRobot(f"{PREFIX}-MO-ROBOT-01:")
21
21
 
22
22
 
23
23
  @device_factory()
@@ -25,6 +25,5 @@ def oav(params: OAVConfigBeamCentre | None = None) -> OAVBeamCentreFile:
25
25
  return OAVBeamCentreFile(
26
26
  prefix=f"{PREFIX}-DI-OAV-01:",
27
27
  config=params or OAVConfigBeamCentre(ZOOM_PARAMS_FILE, DISPLAY_CONFIG),
28
- name="oav",
29
28
  zoom_controller=NullZoomController(),
30
29
  )
@@ -1,16 +1,12 @@
1
- from pathlib import Path
2
-
3
1
  from ophyd_async.epics.adaravis import AravisDetector
4
2
  from ophyd_async.fastcs.panda import HDFPanda
5
3
 
6
4
  from dodal.common.beamlines.beamline_utils import (
7
5
  device_factory,
8
6
  get_path_provider,
9
- set_path_provider,
10
7
  )
11
8
  from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
12
9
  from dodal.common.beamlines.device_helpers import CAM_SUFFIX, HDF5_SUFFIX
13
- from dodal.common.visit import LocalDirectoryServiceClient, StaticVisitPathProvider
14
10
  from dodal.devices.motors import XYZStage
15
11
  from dodal.devices.synchrotron import Synchrotron
16
12
  from dodal.log import set_beamline as set_log_beamline
@@ -21,14 +17,6 @@ PREFIX = BeamlinePrefix(BL)
21
17
  set_log_beamline(BL)
22
18
  set_utils_beamline(BL)
23
19
 
24
- set_path_provider(
25
- StaticVisitPathProvider(
26
- BL,
27
- Path("/dls/b01-1/data/2025/cm40661-1/"),
28
- client=LocalDirectoryServiceClient(),
29
- )
30
- )
31
-
32
20
  """
33
21
  NOTE: Due to ArgoCD and the k8s cluster configuration those PVs are not available remotely.
34
22
  You need to be on the beamline-local network to access them.
@@ -62,7 +62,6 @@ def fds2() -> AreaDetector:
62
62
  def sim_stage() -> XYZStage:
63
63
  return XYZStage(
64
64
  f"{PREFIX.beamline_prefix}-MO-SIM-01:",
65
- "sim_stage",
66
65
  x_infix="M1",
67
66
  y_infix="M2",
68
67
  z_infix="M3",
@@ -116,8 +116,6 @@ def slits_7() -> Slits:
116
116
  prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-07:",
117
117
  x_gap="X:GAP",
118
118
  y_gap="Y:GAP",
119
- x_centre="X:CENTRE",
120
- y_centre="Y:CENTRE",
121
119
  )
122
120
 
123
121
 
@@ -1,5 +1,6 @@
1
1
  from ophyd_async.fastcs.eiger import EigerDetector as FastEiger
2
2
  from ophyd_async.fastcs.panda import HDFPanda
3
+ from yarl import URL
3
4
 
4
5
  from dodal.common.beamlines.beamline_parameters import get_beamline_parameters
5
6
  from dodal.common.beamlines.beamline_utils import (
@@ -49,7 +50,7 @@ from dodal.devices.zebra.zebra_constants_mapping import (
49
50
  ZebraTTLOutputs,
50
51
  )
51
52
  from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter
52
- from dodal.devices.zocalo import ZocaloResults
53
+ from dodal.devices.zocalo import ZocaloResults, ZocaloSource
53
54
  from dodal.log import set_beamline as set_log_beamline
54
55
  from dodal.utils import BeamlinePrefix, get_beamline_name
55
56
 
@@ -105,7 +106,6 @@ def beamstop() -> Beamstop:
105
106
  """
106
107
  return Beamstop(
107
108
  prefix=f"{PREFIX.beamline_prefix}-MO-BS-01:",
108
- name="beamstop",
109
109
  beamline_parameters=get_beamline_parameters(),
110
110
  )
111
111
 
@@ -117,7 +117,6 @@ def dcm() -> DCM:
117
117
  """
118
118
  return DCM(
119
119
  prefix=f"{PREFIX.beamline_prefix}-MO-DCM-01:",
120
- name="dcm",
121
120
  )
122
121
 
123
122
 
@@ -125,7 +124,6 @@ def dcm() -> DCM:
125
124
  def vfm() -> FocusingMirrorWithStripes:
126
125
  return FocusingMirrorWithStripes(
127
126
  prefix=f"{PREFIX.beamline_prefix}-OP-VFM-01:",
128
- name="vfm",
129
127
  bragg_to_lat_lut_path=DAQ_CONFIGURATION_PATH
130
128
  + "/lookup/BeamLineEnergy_DCM_VFM_x_converter.txt",
131
129
  x_suffix="LAT",
@@ -136,7 +134,6 @@ def vfm() -> FocusingMirrorWithStripes:
136
134
  @device_factory()
137
135
  def mirror_voltages() -> MirrorVoltages:
138
136
  return MirrorVoltages(
139
- name="mirror_voltages",
140
137
  prefix=f"{PREFIX.beamline_prefix}-MO-PSU-01:",
141
138
  daq_configuration_path=DAQ_CONFIGURATION_PATH,
142
139
  )
@@ -147,7 +144,7 @@ def backlight() -> Backlight:
147
144
  """Get the i03 backlight device, instantiate it if it hasn't already been.
148
145
  If this is called when already instantiated in i03, it will return the existing object.
149
146
  """
150
- return Backlight(prefix=PREFIX.beamline_prefix, name="backlight")
147
+ return Backlight(prefix=PREFIX.beamline_prefix)
151
148
 
152
149
 
153
150
  @device_factory()
@@ -157,7 +154,6 @@ def detector_motion() -> DetectorMotion:
157
154
  """
158
155
  return DetectorMotion(
159
156
  prefix=PREFIX.beamline_prefix,
160
- name="detector_motion",
161
157
  )
162
158
 
163
159
 
@@ -197,7 +193,6 @@ def zebra_fast_grid_scan() -> ZebraFastGridScan:
197
193
  """
198
194
  return ZebraFastGridScan(
199
195
  prefix=f"{PREFIX.beamline_prefix}-MO-SGON-01:",
200
- name="zebra_fast_grid_scan",
201
196
  )
202
197
 
203
198
 
@@ -209,7 +204,6 @@ def panda_fast_grid_scan() -> PandAFastGridScan:
209
204
  """
210
205
  return PandAFastGridScan(
211
206
  prefix=f"{PREFIX.beamline_prefix}-MO-SGON-01:",
212
- name="panda_fast_grid_scan",
213
207
  )
214
208
 
215
209
 
@@ -222,7 +216,6 @@ def oav(
222
216
  """
223
217
  return OAVBeamCentreFile(
224
218
  prefix=f"{PREFIX.beamline_prefix}-DI-OAV-01:",
225
- name="oav",
226
219
  config=params or OAVConfigBeamCentre(ZOOM_PARAMS_FILE, DISPLAY_CONFIG),
227
220
  )
228
221
 
@@ -234,7 +227,6 @@ def pin_tip_detection() -> PinTipDetection:
234
227
  """
235
228
  return PinTipDetection(
236
229
  f"{PREFIX.beamline_prefix}-DI-OAV-01:",
237
- "pin_tip_detection",
238
230
  )
239
231
 
240
232
 
@@ -243,7 +235,7 @@ def smargon() -> Smargon:
243
235
  """Get the i03 Smargon device, instantiate it if it hasn't already been.
244
236
  If this is called when already instantiated in i03, it will return the existing object.
245
237
  """
246
- return Smargon(f"{PREFIX.beamline_prefix}-MO-SGON-01:", "smargon")
238
+ return Smargon(f"{PREFIX.beamline_prefix}-MO-SGON-01:")
247
239
 
248
240
 
249
241
  @device_factory()
@@ -253,7 +245,6 @@ def s4_slit_gaps() -> S4SlitGaps:
253
245
  """
254
246
  return S4SlitGaps(
255
247
  f"{PREFIX.beamline_prefix}-AL-SLITS-04:",
256
- "s4_slit_gaps",
257
248
  )
258
249
 
259
250
 
@@ -262,7 +253,7 @@ def synchrotron() -> Synchrotron:
262
253
  """Get the i03 synchrotron device, instantiate it if it hasn't already been.
263
254
  If this is called when already instantiated in i03, it will return the existing object.
264
255
  """
265
- return Synchrotron("", "synchrotron")
256
+ return Synchrotron()
266
257
 
267
258
 
268
259
  @device_factory()
@@ -272,7 +263,6 @@ def undulator(daq_configuration_path: str | None = None) -> Undulator:
272
263
  """
273
264
  return Undulator(
274
265
  f"{BeamlinePrefix(BL).insertion_prefix}-MO-SERVC-01:",
275
- name="undulator",
276
266
  # evaluate here not as parameter default to enable post-import mocking
277
267
  id_gap_lookup_table_path=f"{daq_configuration_path or DAQ_CONFIGURATION_PATH}/lookup/BeamLine_Undulator_toGap.txt",
278
268
  )
@@ -290,7 +280,6 @@ def undulator_dcm(daq_configuration_path: str | None = None) -> UndulatorDCM:
290
280
  else undulator()
291
281
  )
292
282
  return UndulatorDCM(
293
- name="undulator_dcm",
294
283
  prefix=PREFIX.beamline_prefix,
295
284
  undulator=undulator_singleton,
296
285
  dcm=dcm(),
@@ -304,7 +293,6 @@ def zebra() -> Zebra:
304
293
  If this is called when already instantiated in i03, it will return the existing object.
305
294
  """
306
295
  return Zebra(
307
- name="zebra",
308
296
  prefix=f"{PREFIX.beamline_prefix}-EA-ZEBRA-01:",
309
297
  mapping=I03_ZEBRA_MAPPING,
310
298
  )
@@ -317,7 +305,6 @@ def xspress3mini() -> Xspress3:
317
305
  """
318
306
  return Xspress3(
319
307
  f"{PREFIX.beamline_prefix}-EA-XSP3-01:",
320
- "xspress3mini",
321
308
  )
322
309
 
323
310
 
@@ -329,7 +316,6 @@ def panda() -> HDFPanda:
329
316
  return HDFPanda(
330
317
  f"{PREFIX.beamline_prefix}-EA-PANDA-01:",
331
318
  path_provider=get_path_provider(),
332
- name="panda",
333
319
  )
334
320
 
335
321
 
@@ -340,7 +326,6 @@ def sample_shutter() -> ZebraShutter:
340
326
  """
341
327
  return ZebraShutter(
342
328
  f"{PREFIX.beamline_prefix}-EA-SHTR-01:",
343
- "sample_shutter",
344
329
  )
345
330
 
346
331
 
@@ -351,7 +336,6 @@ def flux() -> Flux:
351
336
  """
352
337
  return Flux(
353
338
  f"{PREFIX.beamline_prefix}-MO-FLUX-01:",
354
- "flux",
355
339
  )
356
340
 
357
341
 
@@ -362,7 +346,6 @@ def xbpm_feedback() -> XBPMFeedback:
362
346
  """
363
347
  return XBPMFeedback(
364
348
  PREFIX.beamline_prefix,
365
- "xbpm_feedback",
366
349
  )
367
350
 
368
351
 
@@ -371,7 +354,10 @@ def zocalo() -> ZocaloResults:
371
354
  """Get the i03 ZocaloResults device, instantiate it if it hasn't already been.
372
355
  If this is called when already instantiated in i03, it will return the existing object.
373
356
  """
374
- return ZocaloResults(name="zocalo", prefix=PREFIX.beamline_prefix, use_gpu=True)
357
+ return ZocaloResults(
358
+ prefix=PREFIX.beamline_prefix,
359
+ results_source=ZocaloSource.GPU,
360
+ )
375
361
 
376
362
 
377
363
  @device_factory()
@@ -380,7 +366,6 @@ def robot() -> BartRobot:
380
366
  If this is called when already instantiated in i03, it will return the existing object.
381
367
  """
382
368
  return BartRobot(
383
- "robot",
384
369
  f"{PREFIX.beamline_prefix}-MO-ROBOT-01:",
385
370
  )
386
371
 
@@ -391,9 +376,7 @@ def webcam() -> Webcam:
391
376
  If this is called when already instantiated in i03, it will return the existing object.
392
377
  """
393
378
  return Webcam(
394
- "webcam",
395
- PREFIX.beamline_prefix,
396
- url="http://i03-webcam1/axis-cgi/jpg/image.cgi",
379
+ url=URL("http://i03-webcam1/axis-cgi/jpg/image.cgi"),
397
380
  )
398
381
 
399
382
 
@@ -404,7 +387,6 @@ def thawer() -> Thawer:
404
387
  """
405
388
  return Thawer(
406
389
  f"{PREFIX.beamline_prefix}-EA-THAW-01",
407
- "thawer",
408
390
  )
409
391
 
410
392
 
@@ -415,7 +397,6 @@ def lower_gonio() -> XYZStage:
415
397
  """
416
398
  return XYZStage(
417
399
  f"{PREFIX.beamline_prefix}-MO-GONP-01:",
418
- "lower_gonio",
419
400
  )
420
401
 
421
402
 
@@ -426,7 +407,6 @@ def cryo_stream() -> CryoStream:
426
407
  """
427
408
  return CryoStream(
428
409
  PREFIX.beamline_prefix,
429
- "cryo_stream",
430
410
  )
431
411
 
432
412
 
@@ -447,7 +427,6 @@ def qbpm() -> QBPM:
447
427
  """
448
428
  return QBPM(
449
429
  f"{PREFIX.beamline_prefix}-DI-QBPM-01:",
450
- "qbpm",
451
430
  )
452
431
 
453
432