dls-dodal 1.37.0__tar.gz → 1.39.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 (411) hide show
  1. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/workflows/_tox.yml +3 -0
  2. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.pre-commit-config.yaml +8 -0
  3. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/PKG-INFO +3 -2
  4. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/explanations/reviews.md +1 -1
  5. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/pyproject.toml +16 -1
  6. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dls_dodal.egg-info/PKG-INFO +3 -2
  7. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dls_dodal.egg-info/SOURCES.txt +11 -3
  8. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dls_dodal.egg-info/requires.txt +2 -1
  9. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/_version.py +2 -2
  10. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i03.py +29 -7
  11. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i04.py +13 -2
  12. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i13_1.py +20 -2
  13. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i24.py +13 -1
  14. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/training_rig.py +10 -1
  15. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/eiger.py +21 -12
  16. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/fast_grid_scan.py +13 -2
  17. dls_dodal-1.39.0/src/dodal/devices/flux.py +14 -0
  18. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i04/transfocator.py +22 -29
  19. dls_dodal-1.39.0/src/dodal/devices/i13_1/merlin.py +33 -0
  20. dls_dodal-1.39.0/src/dodal/devices/i13_1/merlin_controller.py +52 -0
  21. dls_dodal-1.39.0/src/dodal/devices/i13_1/merlin_io.py +17 -0
  22. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/beam_center.py +1 -1
  23. dls_dodal-1.39.0/src/dodal/devices/p45.py +55 -0
  24. dls_dodal-1.39.0/src/dodal/devices/s4_slit_gaps.py +12 -0
  25. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/util/lookup_tables.py +14 -10
  26. {dls_dodal-1.37.0/src/dodal/devices → dls_dodal-1.39.0/src/dodal/devices/zebra}/zebra.py +3 -32
  27. dls_dodal-1.39.0/src/dodal/devices/zebra/zebra_constants_mapping.py +96 -0
  28. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/system_tests/test_zebra_system.py +3 -2
  29. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/common/beamlines/test_beamline_utils.py +6 -7
  30. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/i04/test_transfocator.py +11 -3
  31. dls_dodal-1.39.0/tests/devices/i13_1/test_merlin.py +106 -0
  32. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_eiger.py +12 -0
  33. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_gridscan.py +52 -53
  34. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_shutter.py +1 -1
  35. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_zebra.py +1 -1
  36. dls_dodal-1.39.0/tests/devices/unit_tests/test_zebra_constants_mapping.py +42 -0
  37. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/util/test_lookup_tables.py +22 -12
  38. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/util/test_save_panda.py +9 -9
  39. dls_dodal-1.39.0/tests/fake_zocalo/__init__.py +0 -0
  40. dls_dodal-1.39.0/tests/unit_tests/__init__.py +0 -0
  41. dls_dodal-1.37.0/src/dodal/devices/flux.py +0 -7
  42. dls_dodal-1.37.0/src/dodal/devices/p45.py +0 -44
  43. dls_dodal-1.37.0/src/dodal/devices/s4_slit_gaps.py +0 -8
  44. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.copier-answers.yml +0 -0
  45. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.devcontainer/devcontainer.json +0 -0
  46. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/CODEOWNERS +0 -0
  47. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/CONTRIBUTING.md +0 -0
  48. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/ISSUE_TEMPLATE/issue_template.md +0 -0
  49. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/actions/install_requirements/action.yml +0 -0
  50. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/dependabot.yml +0 -0
  51. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/pages/index.html +0 -0
  52. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/pages/make_switcher.py +0 -0
  53. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/workflows/_check.yml +0 -0
  54. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/workflows/_dist.yml +0 -0
  55. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/workflows/_docs.yml +0 -0
  56. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/workflows/_pypi.yml +0 -0
  57. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/workflows/_release.yml +0 -0
  58. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/workflows/_test.yml +0 -0
  59. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/workflows/ci.yml +0 -0
  60. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.github/workflows/periodic.yml +0 -0
  61. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.gitignore +0 -0
  62. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.vscode/extensions.json +0 -0
  63. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.vscode/launch.json +0 -0
  64. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.vscode/settings.json +0 -0
  65. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/.vscode/tasks.json +0 -0
  66. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/Dockerfile +0 -0
  67. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/LICENSE +0 -0
  68. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/README.md +0 -0
  69. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/catalog-info.yaml +0 -0
  70. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/conftest.py +0 -0
  71. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/_templates/autosummary/class.rst +0 -0
  72. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/_templates/autosummary/module.rst +0 -0
  73. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/_templates/custom-module-template.rst +0 -0
  74. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/assets/zocalo.png +0 -0
  75. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/conf.py +0 -0
  76. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  77. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  78. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/explanations/decisions/0003-codeowners.md +0 -0
  79. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/explanations/decisions/0003-make-devices-factory.md +0 -0
  80. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/explanations/decisions/COPYME +0 -0
  81. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/explanations/decisions.md +0 -0
  82. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/explanations.md +0 -0
  83. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/genindex.md +0 -0
  84. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/build-docs.md +0 -0
  85. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/contribute.md +0 -0
  86. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/coverage.md +0 -0
  87. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/create-beamline.rst +0 -0
  88. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/dev-install.md +0 -0
  89. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/excalidraw.md +0 -0
  90. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/lint.md +0 -0
  91. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/lock-requirements.md +0 -0
  92. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/make-new-ophyd-async-device.rst +0 -0
  93. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/make-release.md +0 -0
  94. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/move-code.rst +0 -0
  95. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/pypi.md +0 -0
  96. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/run-tests.md +0 -0
  97. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/static-analysis.md +0 -0
  98. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/update-template.md +0 -0
  99. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/write-tests.md +0 -0
  100. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to/zocalo.rst +0 -0
  101. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/how-to.md +0 -0
  102. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/images/dls-logo.svg +0 -0
  103. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/images/excalidraw-example.svg +0 -0
  104. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/index.md +0 -0
  105. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/reference/api.md +0 -0
  106. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/reference/device-standards.rst +0 -0
  107. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/reference/standards.rst +0 -0
  108. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/reference.md +0 -0
  109. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/tutorials/get_started.rst +0 -0
  110. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/tutorials/installation.md +0 -0
  111. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/docs/tutorials.md +0 -0
  112. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/pull_request_template.md +0 -0
  113. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/setup.cfg +0 -0
  114. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/__init__.py +0 -0
  115. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dls_dodal.egg-info/dependency_links.txt +0 -0
  116. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dls_dodal.egg-info/entry_points.txt +0 -0
  117. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dls_dodal.egg-info/top_level.txt +0 -0
  118. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/__init__.py +0 -0
  119. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/__main__.py +0 -0
  120. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamline_specific_utils/__init__.py +0 -0
  121. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamline_specific_utils/i03.py +0 -0
  122. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/README.md +0 -0
  123. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/__init__.py +0 -0
  124. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/adsim.py +0 -0
  125. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/b01_1.py +0 -0
  126. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i02_1.py +0 -0
  127. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i10.py +0 -0
  128. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i20_1.py +0 -0
  129. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i22.py +0 -0
  130. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i23.py +0 -0
  131. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/p38.py +0 -0
  132. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/p45.py +0 -0
  133. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/beamlines/p99.py +0 -0
  134. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/cli.py +0 -0
  135. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/common/__init__.py +0 -0
  136. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/common/beamlines/__init__.py +0 -0
  137. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/common/beamlines/beamline_parameters.py +0 -0
  138. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/common/beamlines/beamline_utils.py +0 -0
  139. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/common/beamlines/device_helpers.py +0 -0
  140. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/common/coordination.py +0 -0
  141. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/common/crystal_metadata.py +0 -0
  142. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/common/maths.py +0 -0
  143. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/common/signal_utils.py +0 -0
  144. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/common/types.py +0 -0
  145. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/common/udc_directory_provider.py +0 -0
  146. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/common/visit.py +0 -0
  147. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/CTAB.py +0 -0
  148. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/__init__.py +0 -0
  149. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/adsim.py +0 -0
  150. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/aperture.py +0 -0
  151. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/aperturescatterguard.py +0 -0
  152. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/apple2_undulator.py +0 -0
  153. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/areadetector/plugins/CAM.py +0 -0
  154. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/areadetector/plugins/MJPG.py +0 -0
  155. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/attenuator/attenuator.py +0 -0
  156. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/attenuator/filter.py +0 -0
  157. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/attenuator/filter_selections.py +0 -0
  158. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/backlight.py +0 -0
  159. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/bimorph_mirror.py +0 -0
  160. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/cryostream.py +0 -0
  161. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/current_amplifiers/__init__.py +0 -0
  162. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/current_amplifiers/current_amplifier.py +0 -0
  163. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/current_amplifiers/current_amplifier_detector.py +0 -0
  164. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/current_amplifiers/femto.py +0 -0
  165. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/current_amplifiers/sr570.py +0 -0
  166. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/current_amplifiers/struck_scaler_counter.py +0 -0
  167. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/dcm.py +0 -0
  168. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/detector/__init__.py +0 -0
  169. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/detector/det_dim_constants.py +0 -0
  170. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/detector/det_dist_to_beam_converter.py +0 -0
  171. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/detector/det_resolution.py +0 -0
  172. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/detector/detector.py +0 -0
  173. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/detector/detector_motion.py +0 -0
  174. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/diamond_filter.py +0 -0
  175. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/eiger_odin.py +0 -0
  176. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/fluorescence_detector_motion.py +0 -0
  177. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/focusing_mirror.py +0 -0
  178. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/hutch_shutter.py +0 -0
  179. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i03/__init__.py +0 -0
  180. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i03/beamstop.py +0 -0
  181. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/i10_apple2.py +0 -0
  182. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/i10_setting_data.py +0 -0
  183. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/mirrors.py +0 -0
  184. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/rasor/rasor_current_amp.py +0 -0
  185. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/rasor/rasor_motors.py +0 -0
  186. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/rasor/rasor_scaler_cards.py +0 -0
  187. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/slits.py +0 -0
  188. {dls_dodal-1.37.0/src/dodal/devices/i20_1 → dls_dodal-1.39.0/src/dodal/devices/i13_1}/__init__.py +0 -0
  189. {dls_dodal-1.37.0/src/dodal/devices/i24 → dls_dodal-1.39.0/src/dodal/devices/i20_1}/__init__.py +0 -0
  190. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i22/dcm.py +0 -0
  191. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i22/fswitch.py +0 -0
  192. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i22/nxsas.py +0 -0
  193. {dls_dodal-1.37.0/src/dodal/devices/oav → dls_dodal-1.39.0/src/dodal/devices/i24}/__init__.py +0 -0
  194. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/aperture.py +0 -0
  195. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/beamstop.py +0 -0
  196. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/dcm.py +0 -0
  197. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/dual_backlight.py +0 -0
  198. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/focus_mirrors.py +0 -0
  199. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/i24_detector_motion.py +0 -0
  200. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/pilatus_metadata.py +0 -0
  201. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/pmac.py +0 -0
  202. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/vgonio.py +0 -0
  203. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/ipin.py +0 -0
  204. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/linkam3.py +0 -0
  205. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/logging_ophyd_device.py +0 -0
  206. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/motors.py +0 -0
  207. {dls_dodal-1.37.0/src/dodal/devices/p99 → dls_dodal-1.39.0/src/dodal/devices/oav}/__init__.py +0 -0
  208. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/microns_for_zoom_levels.json +0 -0
  209. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/oav_calculations.py +0 -0
  210. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/oav_detector.py +0 -0
  211. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/oav_parameters.py +0 -0
  212. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/oav_to_redis_forwarder.py +0 -0
  213. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/pin_image_recognition/__init__.py +0 -0
  214. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/pin_image_recognition/manual_test.py +0 -0
  215. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/pin_image_recognition/utils.py +0 -0
  216. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/snapshots/grid_overlay.py +0 -0
  217. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/snapshots/snapshot_with_beam_centre.py +0 -0
  218. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/snapshots/snapshot_with_grid.py +0 -0
  219. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/utils.py +0 -0
  220. {dls_dodal-1.37.0/src/dodal/devices/training_rig → dls_dodal-1.39.0/src/dodal/devices/p99}/__init__.py +0 -0
  221. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/p99/sample_stage.py +0 -0
  222. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/pgm.py +0 -0
  223. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/pressure_jump_cell.py +0 -0
  224. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/qbpm.py +0 -0
  225. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/robot.py +0 -0
  226. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/scatterguard.py +0 -0
  227. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/scintillator.py +0 -0
  228. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/slits.py +0 -0
  229. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/smargon.py +0 -0
  230. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/status.py +0 -0
  231. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/synchrotron.py +0 -0
  232. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/tetramm.py +0 -0
  233. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/thawer.py +0 -0
  234. {dls_dodal-1.37.0/src/dodal/devices/util → dls_dodal-1.39.0/src/dodal/devices/training_rig}/__init__.py +0 -0
  235. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/training_rig/sample_stage.py +0 -0
  236. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/turbo_slit.py +0 -0
  237. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/undulator.py +0 -0
  238. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/undulator_dcm.py +0 -0
  239. {dls_dodal-1.37.0/src/dodal/plan_stubs → dls_dodal-1.39.0/src/dodal/devices/util}/__init__.py +0 -0
  240. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/util/adjuster_plans.py +0 -0
  241. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/util/epics_util.py +0 -0
  242. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/util/motor_utils.py +0 -0
  243. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/util/test_utils.py +0 -0
  244. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/watsonmarlow323_pump.py +0 -0
  245. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/webcam.py +0 -0
  246. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/xbpm_feedback.py +0 -0
  247. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/xspress3/xspress3.py +0 -0
  248. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/xspress3/xspress3_channel.py +0 -0
  249. {dls_dodal-1.37.0/system_tests → dls_dodal-1.39.0/src/dodal/devices/zebra}/__init__.py +0 -0
  250. {dls_dodal-1.37.0/src/dodal/devices → dls_dodal-1.39.0/src/dodal/devices/zebra}/zebra_controlled_shutter.py +0 -0
  251. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/zocalo/__init__.py +0 -0
  252. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/zocalo/zocalo_constants.py +0 -0
  253. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/zocalo/zocalo_interaction.py +0 -0
  254. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/devices/zocalo/zocalo_results.py +0 -0
  255. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/log.py +0 -0
  256. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/parameters/experiment_parameter_base.py +0 -0
  257. {dls_dodal-1.37.0/tests → dls_dodal-1.39.0/src/dodal/plan_stubs}/__init__.py +0 -0
  258. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/plan_stubs/check_topup.py +0 -0
  259. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/plan_stubs/data_session.py +0 -0
  260. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/plan_stubs/motor_utils.py +0 -0
  261. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/plan_stubs/wrapped.py +0 -0
  262. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/plans/__init__.py +0 -0
  263. {dls_dodal-1.37.0/src/dodal/devices/util → dls_dodal-1.39.0/src/dodal/plans}/save_panda.py +0 -0
  264. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/plans/scanspec.py +0 -0
  265. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/plans/wrapped.py +0 -0
  266. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/src/dodal/utils.py +0 -0
  267. {dls_dodal-1.37.0/tests/beamlines → dls_dodal-1.39.0/system_tests}/__init__.py +0 -0
  268. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/system_tests/test_adsim.py +0 -0
  269. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/system_tests/test_aperturescatterguard_system.py +0 -0
  270. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/system_tests/test_eiger_system.py +0 -0
  271. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/system_tests/test_gridscan_system.py +0 -0
  272. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/system_tests/test_oav_system.py +0 -0
  273. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/system_tests/test_oav_to_redis_system.py +0 -0
  274. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/system_tests/test_slit_gaps_system.py +0 -0
  275. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/system_tests/test_smargon_system.py +0 -0
  276. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/system_tests/test_synchrotron_system.py +0 -0
  277. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/system_tests/test_undulator_system.py +0 -0
  278. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/system_tests/test_zocalo_results.py +0 -0
  279. {dls_dodal-1.37.0/tests/beamlines/unit_tests → dls_dodal-1.39.0/tests}/__init__.py +0 -0
  280. {dls_dodal-1.37.0/tests/common → dls_dodal-1.39.0/tests/beamlines}/__init__.py +0 -0
  281. {dls_dodal-1.37.0/tests/common/beamlines → dls_dodal-1.39.0/tests/beamlines/unit_tests}/__init__.py +0 -0
  282. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/beamlines/unit_tests/test_i03.py +0 -0
  283. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/beamlines/unit_tests/test_i24.py +0 -0
  284. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/beamlines/unit_tests/test_mapping.py +0 -0
  285. {dls_dodal-1.37.0/tests/devices → dls_dodal-1.39.0/tests/common}/__init__.py +0 -0
  286. {dls_dodal-1.37.0/tests/devices/i03 → dls_dodal-1.39.0/tests/common/beamlines}/__init__.py +0 -0
  287. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/common/beamlines/test_beamline_parameters.py +0 -0
  288. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/common/beamlines/test_device_helpers.py +0 -0
  289. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/common/beamlines/test_device_instantiation.py +0 -0
  290. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/common/test_coordination.py +0 -0
  291. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/common/test_crystal_metadata.py +0 -0
  292. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/common/test_maths.py +0 -0
  293. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/common/test_udc_directory_provider.py +0 -0
  294. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/common/test_visit.py +0 -0
  295. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/conftest.py +0 -0
  296. {dls_dodal-1.37.0/tests/devices/i04 → dls_dodal-1.39.0/tests/devices}/__init__.py +0 -0
  297. {dls_dodal-1.37.0/tests/devices/unit_tests → dls_dodal-1.39.0/tests/devices/i03}/__init__.py +0 -0
  298. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/i03/test_beamstop.py +0 -0
  299. {dls_dodal-1.37.0/tests/devices/unit_tests/i24 → dls_dodal-1.39.0/tests/devices/i04}/__init__.py +0 -0
  300. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/i10/lookupTables/IDEnergy2GapCalibrations.csv +0 -0
  301. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/i10/lookupTables/IDEnergy2PhaseCalibrations.csv +0 -0
  302. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdd.pkl +0 -0
  303. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdu.pkl +0 -0
  304. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidd.pkl +0 -0
  305. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidu.pkl +0 -0
  306. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/i10/test_i10Apple2.py +0 -0
  307. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/i22/test_dcm.py +0 -0
  308. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/i22/test_fswitch.py +0 -0
  309. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/i22/test_metadataholder.py +0 -0
  310. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/test_diamond_filter.py +0 -0
  311. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/training_rig/test_sample_stage.py +0 -0
  312. {dls_dodal-1.37.0/tests/devices/unit_tests/oav → dls_dodal-1.39.0/tests/devices/unit_tests}/__init__.py +0 -0
  313. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/conftest.py +0 -0
  314. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/current_amplifier/test_femto.py +0 -0
  315. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/current_amplifier/test_sr570.py +0 -0
  316. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/detector/test_det_dim_constants.py +0 -0
  317. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/detector/test_det_resolution.py +0 -0
  318. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/detector/test_detector.py +0 -0
  319. {dls_dodal-1.37.0/tests/devices/unit_tests/util → dls_dodal-1.39.0/tests/devices/unit_tests/i24}/__init__.py +0 -0
  320. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/i24/test_dual_backlight.py +0 -0
  321. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/i24/test_focus_mirrors.py +0 -0
  322. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/i24/test_pilatus_metadata.py +0 -0
  323. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/i24/test_pmac.py +0 -0
  324. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/i24/test_vgonio.py +0 -0
  325. {dls_dodal-1.37.0/tests/fake_zocalo → dls_dodal-1.39.0/tests/devices/unit_tests/oav}/__init__.py +0 -0
  326. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/conftest.py +0 -0
  327. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect.py +0 -0
  328. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect_utils.py +0 -0
  329. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/test_grid_overlay.py +0 -0
  330. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/test_oav.py +0 -0
  331. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/test_oav_parameters.py +0 -0
  332. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/test_oav_to_redis_forwarder.py +0 -0
  333. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/test_oav_utils.py +0 -0
  334. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/test_snapshots.py +0 -0
  335. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/p99/test_p99_stage.py +0 -0
  336. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_OAVCentring.json +0 -0
  337. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_aperture.py +0 -0
  338. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_aperture_scatterguard.py +0 -0
  339. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_apple2_undulator.py +0 -0
  340. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_attenuator.py +0 -0
  341. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_backlight.py +0 -0
  342. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_bart_robot.py +0 -0
  343. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_beam_converter.py +0 -0
  344. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_beamline_undulator_to_gap_lookup_table.txt +0 -0
  345. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_bimorph_mirror.py +0 -0
  346. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_daq_configuration/domain/beamlineParameters +0 -0
  347. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Pitch_converter.txt +0 -0
  348. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt +0 -0
  349. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_dcm.py +0 -0
  350. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_display.configuration +0 -0
  351. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_focusing_mirror.py +0 -0
  352. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_hutch_shutter.py +0 -0
  353. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_jCameraManZoomLevels.xml +0 -0
  354. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_linkam3.py +0 -0
  355. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_lookup_table.txt +0 -0
  356. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_lookup_table_2.txt +0 -0
  357. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_odin.py +0 -0
  358. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_pressure_jump_cell.py +0 -0
  359. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_qbpm.py +0 -0
  360. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_slits.py +0 -0
  361. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_smargon.py +0 -0
  362. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_status.py +0 -0
  363. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_synchrotron.py +0 -0
  364. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_tetramm.py +0 -0
  365. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_thawer.py +0 -0
  366. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_undulator.py +0 -0
  367. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_undulator_dcm.py +0 -0
  368. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_utils.py +0 -0
  369. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_watsonmarlow323_pump.py +0 -0
  370. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_webcam.py +0 -0
  371. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_xbpm_feedback.py +0 -0
  372. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_xspress3.py +0 -0
  373. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_zocalo_interaction.py +0 -0
  374. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_zocalo_results.py +0 -0
  375. {dls_dodal-1.37.0/tests/unit_tests → dls_dodal-1.39.0/tests/devices/unit_tests/util}/__init__.py +0 -0
  376. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/util/test_adjuster_plans.py +0 -0
  377. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/util/test_beamline_specific_utils.py +0 -0
  378. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/fake_beamline.py +0 -0
  379. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/fake_beamline_all_devices_raise_exception.py +0 -0
  380. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/fake_beamline_broken_dependency.py +0 -0
  381. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/fake_beamline_dependencies.py +0 -0
  382. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/fake_beamline_disordered_dependencies.py +0 -0
  383. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/fake_beamline_misbehaving_builtins.py +0 -0
  384. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/fake_beamline_some_devices_working.py +0 -0
  385. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/fake_device_factory_beamline.py +0 -0
  386. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/fake_zocalo/README.rst +0 -0
  387. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/fake_zocalo/__main__.py +0 -0
  388. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/fake_zocalo/dls_start_fake_zocalo.sh +0 -0
  389. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/plan_stubs/test_motor_util_plans.py +0 -0
  390. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/plan_stubs/test_topup_plan.py +0 -0
  391. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/plan_stubs/test_wrapped_stubs.py +0 -0
  392. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/plans/conftest.py +0 -0
  393. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/plans/test_compliance.py +0 -0
  394. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/plans/test_scanspec.py +0 -0
  395. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/plans/test_wrapped.py +0 -0
  396. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/preprocessors/test_filesystem_metadata.py +0 -0
  397. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_cli.py +0 -0
  398. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_data/bad_beamlineParameters +0 -0
  399. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_data/i04_beamlineParameters +0 -0
  400. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_data/test_beamline_dcm_roll_converter.txt +0 -0
  401. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_data/test_beamline_dcm_roll_converter_non_monotonic.txt +0 -0
  402. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_data/test_beamline_dcm_roll_converter_reversed.txt +0 -0
  403. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_data/test_beamline_parameters.txt +0 -0
  404. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_data/test_det_dist_converter.txt +0 -0
  405. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_data/test_images/oav_snapshot_expected.png +0 -0
  406. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_data/test_images/oav_snapshot_test.png +0 -0
  407. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_data/topup_long_delay.txt +0 -0
  408. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_data/topup_short_params.txt +0 -0
  409. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/test_utils.py +0 -0
  410. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/unit_tests/test_cli.py +0 -0
  411. {dls_dodal-1.37.0 → dls_dodal-1.39.0}/tests/unit_tests/test_log.py +0 -0
@@ -20,5 +20,8 @@ jobs:
20
20
  - name: Install python packages
21
21
  uses: ./.github/actions/install_requirements
22
22
 
23
+ - name: Run import linter
24
+ run: lint-imports
25
+
23
26
  - name: Run tox
24
27
  run: tox -e ${{ inputs.tox }}
@@ -22,3 +22,11 @@ repos:
22
22
  entry: ruff format --force-exclude
23
23
  types: [python]
24
24
  require_serial: true
25
+
26
+ - id: import-contracts
27
+ name: Ensure import directionality
28
+ pass_filenames: false
29
+ language: system
30
+ entry: lint-imports
31
+ types: [python]
32
+ require_serial: false
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dls-dodal
3
- Version: 1.37.0
3
+ Version: 1.39.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
@@ -216,7 +216,7 @@ Description-Content-Type: text/markdown
216
216
  License-File: LICENSE
217
217
  Requires-Dist: click
218
218
  Requires-Dist: ophyd
219
- Requires-Dist: ophyd-async>=0.9.0a1
219
+ Requires-Dist: ophyd-async==0.9.0a1
220
220
  Requires-Dist: bluesky
221
221
  Requires-Dist: pyepics
222
222
  Requires-Dist: dataclasses-json
@@ -237,6 +237,7 @@ Requires-Dist: scanspec>=0.7.3
237
237
  Provides-Extra: dev
238
238
  Requires-Dist: black; extra == "dev"
239
239
  Requires-Dist: diff-cover; extra == "dev"
240
+ Requires-Dist: import-linter; extra == "dev"
240
241
  Requires-Dist: mypy; extra == "dev"
241
242
  Requires-Dist: myst-parser; extra == "dev"
242
243
  Requires-Dist: ophyd_async[sim]; extra == "dev"
@@ -51,6 +51,6 @@ New members should be regular contributors to dodal and should have been "shadow
51
51
  - Adherence to the review standards above as well as the [repository standards](../reference/standards.rst) and [device standards](../reference/device-standards.rst).
52
52
  - Independent (i.e. not just to satisfy a reviewer) motivation to make sure all code in dodal is well-tested. Use of unit and system tests as appropriate. Clear effort made to keep test coverage high (>90%).
53
53
  - Advanced understanding of bluesky and ophyd-async including concepts and best practices, such as how to appropriately split logic between devices/plans/callbacks.
54
- - Humility in the use of reviewing as a tool in a way that balances the need to preserve quality with the need for progress. Appropriate use of the Must/Should/Could/Nit system documented above is helpful in showing this, as it gives the reviewer the opportunity to weight their comments in terms of project impact. They should also demonstrate similar humiliary as a reviewee.
54
+ - Humility in the use of reviewing as a tool in a way that balances the need to preserve quality with the need for progress. Appropriate use of the Must/Should/Could/Nit system documented above is helpful in showing this, as it gives the reviewer the opportunity to weight their comments in terms of project impact. They should also demonstrate similar humility as a reviewee.
55
55
 
56
56
  Additionally, they should be regularly raising issues in the repository and demonstrating the ability to write well formed issues, with well defined acceptance criteria, that are understandable without large amounts of context.
@@ -15,7 +15,7 @@ description = "Ophyd devices and other utils that could be used across DLS beaml
15
15
  dependencies = [
16
16
  "click",
17
17
  "ophyd",
18
- "ophyd-async >= 0.9.0a1",
18
+ "ophyd-async == 0.9.0a1",
19
19
  "bluesky",
20
20
  "pyepics",
21
21
  "dataclasses-json",
@@ -44,6 +44,7 @@ requires-python = ">=3.10"
44
44
  dev = [
45
45
  "black",
46
46
  "diff-cover",
47
+ "import-linter",
47
48
  "mypy",
48
49
  # Commented out due to dependency version conflict with pydantic 1.x
49
50
  # "copier",
@@ -181,3 +182,17 @@ lint.select = [
181
182
  # Remove this line to forbid private member access in tests
182
183
  "tests/**/*" = ["SLF001"]
183
184
  "system_tests/**/*" = ["SLF001"]
185
+
186
+ [tool.importlinter]
187
+ root_package = "dodal"
188
+
189
+ [[tool.importlinter.contracts]]
190
+ name = "Common cannot import from beamlines"
191
+ type = "forbidden"
192
+ source_modules = ["dodal.common"]
193
+ forbidden_modules = ["dodal.beamlines"]
194
+
195
+ [[tool.importlinter.contracts]]
196
+ name = "Enforce import order"
197
+ type = "layers"
198
+ layers = ["dodal.plans", "dodal.beamlines", "dodal.devices"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dls-dodal
3
- Version: 1.37.0
3
+ Version: 1.39.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
@@ -216,7 +216,7 @@ Description-Content-Type: text/markdown
216
216
  License-File: LICENSE
217
217
  Requires-Dist: click
218
218
  Requires-Dist: ophyd
219
- Requires-Dist: ophyd-async>=0.9.0a1
219
+ Requires-Dist: ophyd-async==0.9.0a1
220
220
  Requires-Dist: bluesky
221
221
  Requires-Dist: pyepics
222
222
  Requires-Dist: dataclasses-json
@@ -237,6 +237,7 @@ Requires-Dist: scanspec>=0.7.3
237
237
  Provides-Extra: dev
238
238
  Requires-Dist: black; extra == "dev"
239
239
  Requires-Dist: diff-cover; extra == "dev"
240
+ Requires-Dist: import-linter; extra == "dev"
240
241
  Requires-Dist: mypy; extra == "dev"
241
242
  Requires-Dist: myst-parser; extra == "dev"
242
243
  Requires-Dist: ophyd_async[sim]; extra == "dev"
@@ -157,8 +157,6 @@ src/dodal/devices/undulator_dcm.py
157
157
  src/dodal/devices/watsonmarlow323_pump.py
158
158
  src/dodal/devices/webcam.py
159
159
  src/dodal/devices/xbpm_feedback.py
160
- src/dodal/devices/zebra.py
161
- src/dodal/devices/zebra_controlled_shutter.py
162
160
  src/dodal/devices/areadetector/plugins/CAM.py
163
161
  src/dodal/devices/areadetector/plugins/MJPG.py
164
162
  src/dodal/devices/attenuator/attenuator.py
@@ -186,6 +184,10 @@ src/dodal/devices/i10/slits.py
186
184
  src/dodal/devices/i10/rasor/rasor_current_amp.py
187
185
  src/dodal/devices/i10/rasor/rasor_motors.py
188
186
  src/dodal/devices/i10/rasor/rasor_scaler_cards.py
187
+ src/dodal/devices/i13_1/__init__.py
188
+ src/dodal/devices/i13_1/merlin.py
189
+ src/dodal/devices/i13_1/merlin_controller.py
190
+ src/dodal/devices/i13_1/merlin_io.py
189
191
  src/dodal/devices/i20_1/__init__.py
190
192
  src/dodal/devices/i22/dcm.py
191
193
  src/dodal/devices/i22/fswitch.py
@@ -223,10 +225,13 @@ src/dodal/devices/util/adjuster_plans.py
223
225
  src/dodal/devices/util/epics_util.py
224
226
  src/dodal/devices/util/lookup_tables.py
225
227
  src/dodal/devices/util/motor_utils.py
226
- src/dodal/devices/util/save_panda.py
227
228
  src/dodal/devices/util/test_utils.py
228
229
  src/dodal/devices/xspress3/xspress3.py
229
230
  src/dodal/devices/xspress3/xspress3_channel.py
231
+ src/dodal/devices/zebra/__init__.py
232
+ src/dodal/devices/zebra/zebra.py
233
+ src/dodal/devices/zebra/zebra_constants_mapping.py
234
+ src/dodal/devices/zebra/zebra_controlled_shutter.py
230
235
  src/dodal/devices/zocalo/__init__.py
231
236
  src/dodal/devices/zocalo/zocalo_constants.py
232
237
  src/dodal/devices/zocalo/zocalo_interaction.py
@@ -238,6 +243,7 @@ src/dodal/plan_stubs/data_session.py
238
243
  src/dodal/plan_stubs/motor_utils.py
239
244
  src/dodal/plan_stubs/wrapped.py
240
245
  src/dodal/plans/__init__.py
246
+ src/dodal/plans/save_panda.py
241
247
  src/dodal/plans/scanspec.py
242
248
  src/dodal/plans/wrapped.py
243
249
  system_tests/__init__.py
@@ -294,6 +300,7 @@ tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdd.pkl
294
300
  tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdu.pkl
295
301
  tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidd.pkl
296
302
  tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidu.pkl
303
+ tests/devices/i13_1/test_merlin.py
297
304
  tests/devices/i22/test_dcm.py
298
305
  tests/devices/i22/test_fswitch.py
299
306
  tests/devices/i22/test_metadataholder.py
@@ -338,6 +345,7 @@ tests/devices/unit_tests/test_webcam.py
338
345
  tests/devices/unit_tests/test_xbpm_feedback.py
339
346
  tests/devices/unit_tests/test_xspress3.py
340
347
  tests/devices/unit_tests/test_zebra.py
348
+ tests/devices/unit_tests/test_zebra_constants_mapping.py
341
349
  tests/devices/unit_tests/test_zocalo_interaction.py
342
350
  tests/devices/unit_tests/test_zocalo_results.py
343
351
  tests/devices/unit_tests/current_amplifier/test_femto.py
@@ -1,6 +1,6 @@
1
1
  click
2
2
  ophyd
3
- ophyd-async>=0.9.0a1
3
+ ophyd-async==0.9.0a1
4
4
  bluesky
5
5
  pyepics
6
6
  dataclasses-json
@@ -22,6 +22,7 @@ scanspec>=0.7.3
22
22
  [dev]
23
23
  black
24
24
  diff-cover
25
+ import-linter
25
26
  mypy
26
27
  myst-parser
27
28
  ophyd_async[sim]
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.37.0'
16
- __version_tuple__ = version_tuple = (1, 37, 0)
15
+ __version__ = version = '1.39.0'
16
+ __version_tuple__ = version_tuple = (1, 39, 0)
@@ -40,8 +40,13 @@ from dodal.devices.undulator_dcm import UndulatorDCM
40
40
  from dodal.devices.webcam import Webcam
41
41
  from dodal.devices.xbpm_feedback import XBPMFeedback
42
42
  from dodal.devices.xspress3.xspress3 import Xspress3
43
- from dodal.devices.zebra import Zebra
44
- from dodal.devices.zebra_controlled_shutter import ZebraShutter
43
+ from dodal.devices.zebra.zebra import Zebra
44
+ from dodal.devices.zebra.zebra_constants_mapping import (
45
+ ZebraMapping,
46
+ ZebraSources,
47
+ ZebraTTLOutputs,
48
+ )
49
+ from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter
45
50
  from dodal.devices.zocalo import ZocaloResults
46
51
  from dodal.log import set_beamline as set_log_beamline
47
52
  from dodal.utils import BeamlinePrefix, get_beamline_name, skip_device
@@ -58,6 +63,12 @@ set_utils_beamline(BL)
58
63
 
59
64
  set_path_provider(PandASubpathProvider())
60
65
 
66
+ I03_ZEBRA_MAPPING = ZebraMapping(
67
+ outputs=ZebraTTLOutputs(TTL_DETECTOR=1, TTL_SHUTTER=2, TTL_XSPRESS3=3, TTL_PANDA=4),
68
+ sources=ZebraSources(),
69
+ AND_GATE_FOR_AUTO_SHUTTER=2,
70
+ )
71
+
61
72
 
62
73
  def aperture_scatterguard(
63
74
  wait_for_connection: bool = True,
@@ -324,7 +335,9 @@ def synchrotron(
324
335
 
325
336
 
326
337
  def undulator(
327
- wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
338
+ wait_for_connection: bool = True,
339
+ fake_with_ophyd_sim: bool = False,
340
+ daq_configuration_path: str | None = None,
328
341
  ) -> Undulator:
329
342
  """Get the i03 undulator device, instantiate it if it hasn't already been.
330
343
  If this is called when already instantiated in i03, it will return the existing object.
@@ -336,12 +349,15 @@ def undulator(
336
349
  wait_for_connection,
337
350
  fake_with_ophyd_sim,
338
351
  bl_prefix=False,
339
- id_gap_lookup_table_path="/dls_sw/i03/software/daq_configuration/lookup/BeamLine_Undulator_toGap.txt",
352
+ # evaluate here not as parameter default to enable post-import mocking
353
+ id_gap_lookup_table_path=f"{daq_configuration_path or DAQ_CONFIGURATION_PATH}/lookup/BeamLine_Undulator_toGap.txt",
340
354
  )
341
355
 
342
356
 
343
357
  def undulator_dcm(
344
- wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
358
+ wait_for_connection: bool = True,
359
+ fake_with_ophyd_sim: bool = False,
360
+ daq_configuration_path: str | None = None,
345
361
  ) -> UndulatorDCM:
346
362
  """Get the i03 undulator DCM device, instantiate it if it hasn't already been.
347
363
  If this is called when already instantiated in i03, it will return the existing object.
@@ -352,9 +368,14 @@ def undulator_dcm(
352
368
  prefix="",
353
369
  wait=wait_for_connection,
354
370
  fake=fake_with_ophyd_sim,
355
- undulator=undulator(wait_for_connection, fake_with_ophyd_sim),
371
+ undulator=undulator(
372
+ wait_for_connection,
373
+ fake_with_ophyd_sim,
374
+ daq_configuration_path=daq_configuration_path,
375
+ ),
356
376
  dcm=dcm(wait_for_connection, fake_with_ophyd_sim),
357
- daq_configuration_path=DAQ_CONFIGURATION_PATH,
377
+ # evaluate here not as parameter default to enable post-import mocking
378
+ daq_configuration_path=daq_configuration_path or DAQ_CONFIGURATION_PATH,
358
379
  )
359
380
 
360
381
 
@@ -368,6 +389,7 @@ def zebra(wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False) -
368
389
  "-EA-ZEBRA-01:",
369
390
  wait_for_connection,
370
391
  fake_with_ophyd_sim,
392
+ mapping=I03_ZEBRA_MAPPING,
371
393
  )
372
394
 
373
395
 
@@ -28,8 +28,13 @@ from dodal.devices.synchrotron import Synchrotron
28
28
  from dodal.devices.thawer import Thawer
29
29
  from dodal.devices.undulator import Undulator
30
30
  from dodal.devices.xbpm_feedback import XBPMFeedback
31
- from dodal.devices.zebra import Zebra
32
- from dodal.devices.zebra_controlled_shutter import ZebraShutter
31
+ from dodal.devices.zebra.zebra import Zebra
32
+ from dodal.devices.zebra.zebra_constants_mapping import (
33
+ ZebraMapping,
34
+ ZebraSources,
35
+ ZebraTTLOutputs,
36
+ )
37
+ from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter
33
38
  from dodal.log import set_beamline as set_log_beamline
34
39
  from dodal.utils import BeamlinePrefix, get_beamline_name, skip_device
35
40
 
@@ -47,6 +52,11 @@ BL = get_beamline_name("s04")
47
52
  set_log_beamline(BL)
48
53
  set_utils_beamline(BL)
49
54
 
55
+ I04_ZEBRA_MAPPING = ZebraMapping(
56
+ outputs=(ZebraTTLOutputs(TTL_DETECTOR=1, TTL_FAST_SHUTTER=2, TTL_XSPRESS3=3)),
57
+ sources=ZebraSources(),
58
+ )
59
+
50
60
 
51
61
  def smargon(
52
62
  wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
@@ -341,6 +351,7 @@ def zebra(wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False) -
341
351
  "-EA-ZEBRA-01:",
342
352
  wait_for_connection,
343
353
  fake_with_ophyd_sim,
354
+ mapping=I04_ZEBRA_MAPPING,
344
355
  )
345
356
 
346
357
 
@@ -8,7 +8,8 @@ from dodal.common.beamlines.beamline_utils import (
8
8
  set_path_provider,
9
9
  )
10
10
  from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
11
- from dodal.common.visit import StaticVisitPathProvider
11
+ from dodal.common.visit import LocalDirectoryServiceClient, StaticVisitPathProvider
12
+ from dodal.devices.i13_1.merlin import Merlin
12
13
  from dodal.devices.motors import XYZPositioner
13
14
  from dodal.log import set_beamline as set_log_beamline
14
15
  from dodal.utils import get_beamline_name
@@ -19,7 +20,8 @@ set_utils_beamline(BL)
19
20
  set_path_provider(
20
21
  StaticVisitPathProvider(
21
22
  BL,
22
- Path("/data/2024/cm37257-4/"), # latest commissioning visit
23
+ Path("/dls/i13-1/data/2024/cm37257-5/tmp/"), # latest commissioning visit
24
+ client=LocalDirectoryServiceClient(),
23
25
  )
24
26
  )
25
27
 
@@ -64,3 +66,19 @@ def side_camera(
64
66
  wait=wait_for_connection,
65
67
  fake=fake_with_ophyd_sim,
66
68
  )
69
+
70
+
71
+ def merlin(
72
+ wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
73
+ ) -> Merlin:
74
+ return device_instantiation(
75
+ Merlin,
76
+ prefix="BL13J-EA-DET-04:",
77
+ name="merlin",
78
+ bl_prefix=False,
79
+ drv_suffix="CAM:",
80
+ hdf_suffix="HDF5:",
81
+ path_provider=get_path_provider(),
82
+ wait=wait_for_connection,
83
+ fake=fake_with_ophyd_sim,
84
+ )
@@ -16,7 +16,12 @@ from dodal.devices.i24.pmac import PMAC
16
16
  from dodal.devices.i24.vgonio import VerticalGoniometer
17
17
  from dodal.devices.oav.oav_detector import OAV
18
18
  from dodal.devices.oav.oav_parameters import OAVConfig
19
- from dodal.devices.zebra import Zebra
19
+ from dodal.devices.zebra.zebra import Zebra
20
+ from dodal.devices.zebra.zebra_constants_mapping import (
21
+ ZebraMapping,
22
+ ZebraSources,
23
+ ZebraTTLOutputs,
24
+ )
20
25
  from dodal.log import set_beamline as set_log_beamline
21
26
  from dodal.utils import get_beamline_name, skip_device
22
27
 
@@ -25,10 +30,16 @@ ZOOM_PARAMS_FILE = (
25
30
  )
26
31
  DISPLAY_CONFIG = "/dls_sw/i24/software/gda_versions/var/display.configuration"
27
32
 
33
+
28
34
  BL = get_beamline_name("s24")
29
35
  set_log_beamline(BL)
30
36
  set_utils_beamline(BL)
31
37
 
38
+ I24_ZEBRA_MAPPING = ZebraMapping(
39
+ outputs=ZebraTTLOutputs(TTL_EIGER=1, TTL_PILATUS=2, TTL_FAST_SHUTTER=4),
40
+ sources=ZebraSources(),
41
+ )
42
+
32
43
 
33
44
  def attenuator(
34
45
  wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
@@ -191,6 +202,7 @@ def zebra(wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False) -
191
202
  "-EA-ZEBRA-01:",
192
203
  wait_for_connection,
193
204
  fake_with_ophyd_sim,
205
+ mapping=I24_ZEBRA_MAPPING,
194
206
  )
195
207
 
196
208
 
@@ -1,6 +1,7 @@
1
1
  from pathlib import Path
2
2
 
3
3
  from ophyd_async.epics.adaravis import AravisDetector
4
+ from ophyd_async.fastcs.panda import HDFPanda
4
5
 
5
6
  from dodal.common.beamlines.beamline_utils import (
6
7
  device_factory,
@@ -33,7 +34,7 @@ set_utils_beamline(BL)
33
34
  set_path_provider(
34
35
  StaticVisitPathProvider(
35
36
  BL,
36
- Path("/exports/mybeamline/data"),
37
+ Path("/data"),
37
38
  client=LocalDirectoryServiceClient(),
38
39
  )
39
40
  )
@@ -52,3 +53,11 @@ def det() -> AravisDetector:
52
53
  drv_suffix="DET:",
53
54
  hdf_suffix=HDF5_PREFIX,
54
55
  )
56
+
57
+
58
+ @device_factory()
59
+ def panda() -> HDFPanda:
60
+ return HDFPanda(
61
+ prefix=f"{PREFIX.beamline_prefix}-MO-PANDA-01:",
62
+ path_provider=get_path_provider(),
63
+ )
@@ -62,6 +62,9 @@ class EigerDetector(Device):
62
62
  arming_status = Status()
63
63
  arming_status.set_finished()
64
64
 
65
+ disarming_status = Status()
66
+ disarming_status.set_finished()
67
+
65
68
  def __init__(self, beamline: str = "i03", *args, **kwargs):
66
69
  super().__init__(*args, **kwargs)
67
70
  self.beamline = beamline
@@ -140,6 +143,7 @@ class EigerDetector(Device):
140
143
  def unstage(self) -> bool:
141
144
  assert self.detector_params is not None
142
145
  try:
146
+ self.disarming_status = Status()
143
147
  self.wait_on_arming_if_started()
144
148
  if self.detector_params.trigger_mode == TriggerMode.FREE_RUN:
145
149
  # In free run mode we have to manually stop odin
@@ -158,23 +162,28 @@ class EigerDetector(Device):
158
162
  self.timeouts.general_status_timeout
159
163
  )
160
164
  self.disable_roi_mode()
165
+ self.disarming_status.set_finished()
161
166
  return status_ok
162
167
 
163
168
  def stop(self, *args):
164
169
  """Emergency stop the device, mainly used to clean up after error."""
165
170
  LOGGER.info("Eiger stop() called - cleaning up...")
166
- self.wait_on_arming_if_started()
167
- stop_status = self.odin.stop()
168
- self.odin.file_writer.start_timeout.set(1).wait(
169
- self.timeouts.general_status_timeout
170
- )
171
- self.disarm_detector()
172
- stop_status &= self.disable_roi_mode()
173
- stop_status.wait(self.timeouts.general_status_timeout)
174
- # See https://github.com/DiamondLightSource/hyperion/issues/1395
175
- LOGGER.info("Turning off Eiger dev/shm streaming")
176
- self.odin.fan.dev_shm_enable.set(0).wait()
177
- LOGGER.info("Eiger has successfully been stopped")
171
+ if not self.disarming_status.done:
172
+ LOGGER.info("Eiger still disarming, waiting on disarm")
173
+ self.disarming_status.wait(self.timeouts.arming_timeout)
174
+ else:
175
+ self.wait_on_arming_if_started()
176
+ stop_status = self.odin.stop()
177
+ self.odin.file_writer.start_timeout.set(1).wait(
178
+ self.timeouts.general_status_timeout
179
+ )
180
+ self.disarm_detector()
181
+ stop_status &= self.disable_roi_mode()
182
+ stop_status.wait(self.timeouts.general_status_timeout)
183
+ # See https://github.com/DiamondLightSource/hyperion/issues/1395
184
+ LOGGER.info("Turning off Eiger dev/shm streaming")
185
+ self.odin.fan.dev_shm_enable.set(0).wait()
186
+ LOGGER.info("Eiger has successfully been stopped")
178
187
 
179
188
  def disable_roi_mode(self):
180
189
  return self.change_roi_mode(False)
@@ -45,8 +45,19 @@ class GridAxis:
45
45
  # refering to the first position
46
46
  return self.steps_to_motor_position(self.full_steps - 1)
47
47
 
48
- def is_within(self, steps):
49
- return 0 <= steps <= self.full_steps
48
+ def is_within(self, steps: float):
49
+ """
50
+ Determine whether a single axis coordinate is within the grid.
51
+ The coordinate is from a continuous coordinate space based on the
52
+ XRC grid where the origin corresponds to the centre of the first grid box.
53
+
54
+ Args:
55
+ steps: The coordinate to check
56
+
57
+ Returns:
58
+ True if the coordinate falls within the grid.
59
+ """
60
+ return -0.5 <= steps <= self.full_steps - 0.5
50
61
 
51
62
 
52
63
  class GridScanParamsCommon(AbstractExperimentWithBeamParams):
@@ -0,0 +1,14 @@
1
+ from ophyd_async.core import (
2
+ StandardReadable,
3
+ StandardReadableFormat,
4
+ )
5
+ from ophyd_async.epics.core import epics_signal_r
6
+
7
+
8
+ class Flux(StandardReadable):
9
+ """Simple device to get the flux reading"""
10
+
11
+ def __init__(self, prefix: str, name="") -> None:
12
+ with self.add_children_as_readables(StandardReadableFormat.HINTED_SIGNAL):
13
+ self.flux_reading = epics_signal_r(float, prefix + "SAMP")
14
+ super().__init__(name=name)
@@ -37,32 +37,18 @@ class Transfocator(StandardReadable):
37
37
 
38
38
  super().__init__(name=name)
39
39
 
40
- async def _observe_beamsize_microns(self):
41
- is_set_filters_done = False
42
-
43
- async def set_based_on_prediction(value: float):
44
- if not math.isclose(
45
- self.latest_pred_vertical_num_lenses, value, abs_tol=1e-8
46
- ):
47
- # We can only put an integer number of lenses in the beam but the
48
- # calculation in the IOC returns the theoretical float number of lenses
49
- nonlocal is_set_filters_done
50
- value = round(value)
51
- LOGGER.info(f"Transfocator setting {value} filters")
52
- await self.number_filters_sp.set(value)
53
- await self.start.set(1)
54
- LOGGER.info("Waiting for start_rbv to change to 1")
55
- await wait_for_value(self.start_rbv, 1, self.TIMEOUT)
56
- LOGGER.info("Waiting for start_rbv to change to 0")
57
- await wait_for_value(self.start_rbv, 0, self.TIMEOUT)
58
- self.latest_pred_vertical_num_lenses = value
59
- is_set_filters_done = True
60
-
61
- # The value hasn't changed so assume the device is already set up correctly
62
- async for value in observe_value(self.predicted_vertical_num_lenses):
63
- await set_based_on_prediction(value)
64
- if is_set_filters_done:
65
- break
40
+ async def set_based_on_prediction(self, value: float):
41
+ # We can only put an integer number of lenses in the beam but the
42
+ # calculation in the IOC returns the theoretical float number of lenses
43
+ value = round(value)
44
+ LOGGER.info(f"Transfocator setting {value} filters")
45
+ await self.number_filters_sp.set(value)
46
+ await self.start.set(1)
47
+ LOGGER.info("Waiting for start_rbv to change to 1")
48
+ await wait_for_value(self.start_rbv, 1, self.TIMEOUT)
49
+ LOGGER.info("Waiting for start_rbv to change to 0")
50
+ await wait_for_value(self.start_rbv, 0, self.TIMEOUT)
51
+ self.latest_pred_vertical_num_lenses = value
66
52
 
67
53
  @AsyncStatus.wrap
68
54
  async def set(self, value: float):
@@ -81,10 +67,17 @@ class Transfocator(StandardReadable):
81
67
 
82
68
  if await self.beamsize_set_microns.get_value() != value:
83
69
  # Logic in the IOC calculates predicted_vertical_num_lenses when beam_set_microns changes
84
- await asyncio.gather(
85
- self.beamsize_set_microns.set(value),
86
- self._observe_beamsize_microns(),
70
+
71
+ # Register an observer before setting beamsize_set_microns to ensure we don't miss changes
72
+ predicted_vertical_num_lenses_iterator = observe_value(
73
+ self.predicted_vertical_num_lenses, timeout=self.TIMEOUT
87
74
  )
75
+ # Keep initial prediction before setting to later compare with change after setting
76
+ current_prediction = await anext(predicted_vertical_num_lenses_iterator)
77
+ await self.beamsize_set_microns.set(value)
78
+ accepted_prediction = await anext(predicted_vertical_num_lenses_iterator)
79
+ if not math.isclose(current_prediction, accepted_prediction, abs_tol=1e-8):
80
+ await self.set_based_on_prediction(accepted_prediction)
88
81
 
89
82
  number_filters_rbv, vertical_lens_size_rbv = await asyncio.gather(
90
83
  self.number_filters_sp.get_value(),
@@ -0,0 +1,33 @@
1
+ from ophyd_async.core import PathProvider, StandardDetector
2
+ from ophyd_async.epics import adcore
3
+
4
+ from dodal.devices.i13_1.merlin_controller import MerlinController
5
+ from dodal.devices.i13_1.merlin_io import MerlinDriverIO
6
+
7
+
8
+ class Merlin(StandardDetector):
9
+ _controller: MerlinController
10
+ _writer: adcore.ADHDFWriter
11
+
12
+ def __init__(
13
+ self,
14
+ prefix: str,
15
+ path_provider: PathProvider,
16
+ drv_suffix="CAM:",
17
+ hdf_suffix="HDF:",
18
+ name: str = "",
19
+ ):
20
+ self.drv = MerlinDriverIO(prefix + drv_suffix)
21
+ self.hdf = adcore.NDFileHDFIO(prefix + hdf_suffix)
22
+
23
+ super().__init__(
24
+ MerlinController(self.drv),
25
+ adcore.ADHDFWriter(
26
+ self.hdf,
27
+ path_provider,
28
+ lambda: self.name,
29
+ adcore.ADBaseDatasetDescriber(self.drv),
30
+ ),
31
+ config_sigs=(self.drv.acquire_period, self.drv.acquire_time),
32
+ name=name,
33
+ )