dls-dodal 1.38.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 (408) hide show
  1. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/PKG-INFO +2 -2
  2. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/pyproject.toml +1 -1
  3. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dls_dodal.egg-info/PKG-INFO +2 -2
  4. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dls_dodal.egg-info/requires.txt +1 -1
  5. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/_version.py +2 -2
  6. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i03.py +15 -5
  7. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/eiger.py +21 -12
  8. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/fast_grid_scan.py +13 -2
  9. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i04/transfocator.py +22 -29
  10. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i04/test_transfocator.py +11 -3
  11. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_eiger.py +12 -0
  12. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_gridscan.py +52 -53
  13. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.copier-answers.yml +0 -0
  14. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.devcontainer/devcontainer.json +0 -0
  15. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/CODEOWNERS +0 -0
  16. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/CONTRIBUTING.md +0 -0
  17. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/ISSUE_TEMPLATE/issue_template.md +0 -0
  18. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/actions/install_requirements/action.yml +0 -0
  19. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/dependabot.yml +0 -0
  20. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/pages/index.html +0 -0
  21. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/pages/make_switcher.py +0 -0
  22. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/workflows/_check.yml +0 -0
  23. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/workflows/_dist.yml +0 -0
  24. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/workflows/_docs.yml +0 -0
  25. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/workflows/_pypi.yml +0 -0
  26. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/workflows/_release.yml +0 -0
  27. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/workflows/_test.yml +0 -0
  28. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/workflows/_tox.yml +0 -0
  29. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/workflows/ci.yml +0 -0
  30. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.github/workflows/periodic.yml +0 -0
  31. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.gitignore +0 -0
  32. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.pre-commit-config.yaml +0 -0
  33. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.vscode/extensions.json +0 -0
  34. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.vscode/launch.json +0 -0
  35. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.vscode/settings.json +0 -0
  36. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/.vscode/tasks.json +0 -0
  37. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/Dockerfile +0 -0
  38. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/LICENSE +0 -0
  39. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/README.md +0 -0
  40. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/catalog-info.yaml +0 -0
  41. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/conftest.py +0 -0
  42. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/_templates/autosummary/class.rst +0 -0
  43. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/_templates/autosummary/module.rst +0 -0
  44. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/_templates/custom-module-template.rst +0 -0
  45. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/assets/zocalo.png +0 -0
  46. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/conf.py +0 -0
  47. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  48. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  49. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/explanations/decisions/0003-codeowners.md +0 -0
  50. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/explanations/decisions/0003-make-devices-factory.md +0 -0
  51. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/explanations/decisions/COPYME +0 -0
  52. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/explanations/decisions.md +0 -0
  53. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/explanations/reviews.md +0 -0
  54. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/explanations.md +0 -0
  55. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/genindex.md +0 -0
  56. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/build-docs.md +0 -0
  57. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/contribute.md +0 -0
  58. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/coverage.md +0 -0
  59. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/create-beamline.rst +0 -0
  60. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/dev-install.md +0 -0
  61. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/excalidraw.md +0 -0
  62. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/lint.md +0 -0
  63. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/lock-requirements.md +0 -0
  64. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/make-new-ophyd-async-device.rst +0 -0
  65. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/make-release.md +0 -0
  66. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/move-code.rst +0 -0
  67. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/pypi.md +0 -0
  68. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/run-tests.md +0 -0
  69. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/static-analysis.md +0 -0
  70. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/update-template.md +0 -0
  71. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/write-tests.md +0 -0
  72. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to/zocalo.rst +0 -0
  73. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/how-to.md +0 -0
  74. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/images/dls-logo.svg +0 -0
  75. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/images/excalidraw-example.svg +0 -0
  76. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/index.md +0 -0
  77. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/reference/api.md +0 -0
  78. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/reference/device-standards.rst +0 -0
  79. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/reference/standards.rst +0 -0
  80. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/reference.md +0 -0
  81. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/tutorials/get_started.rst +0 -0
  82. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/tutorials/installation.md +0 -0
  83. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/docs/tutorials.md +0 -0
  84. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/pull_request_template.md +0 -0
  85. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/setup.cfg +0 -0
  86. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/__init__.py +0 -0
  87. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dls_dodal.egg-info/SOURCES.txt +0 -0
  88. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dls_dodal.egg-info/dependency_links.txt +0 -0
  89. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dls_dodal.egg-info/entry_points.txt +0 -0
  90. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dls_dodal.egg-info/top_level.txt +0 -0
  91. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/__init__.py +0 -0
  92. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/__main__.py +0 -0
  93. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamline_specific_utils/__init__.py +0 -0
  94. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamline_specific_utils/i03.py +0 -0
  95. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/README.md +0 -0
  96. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/__init__.py +0 -0
  97. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/adsim.py +0 -0
  98. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/b01_1.py +0 -0
  99. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i02_1.py +0 -0
  100. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i04.py +0 -0
  101. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i10.py +0 -0
  102. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i13_1.py +0 -0
  103. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i20_1.py +0 -0
  104. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i22.py +0 -0
  105. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i23.py +0 -0
  106. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/i24.py +0 -0
  107. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/p38.py +0 -0
  108. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/p45.py +0 -0
  109. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/p99.py +0 -0
  110. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/beamlines/training_rig.py +0 -0
  111. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/cli.py +0 -0
  112. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/common/__init__.py +0 -0
  113. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/common/beamlines/__init__.py +0 -0
  114. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/common/beamlines/beamline_parameters.py +0 -0
  115. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/common/beamlines/beamline_utils.py +0 -0
  116. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/common/beamlines/device_helpers.py +0 -0
  117. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/common/coordination.py +0 -0
  118. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/common/crystal_metadata.py +0 -0
  119. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/common/maths.py +0 -0
  120. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/common/signal_utils.py +0 -0
  121. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/common/types.py +0 -0
  122. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/common/udc_directory_provider.py +0 -0
  123. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/common/visit.py +0 -0
  124. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/CTAB.py +0 -0
  125. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/__init__.py +0 -0
  126. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/adsim.py +0 -0
  127. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/aperture.py +0 -0
  128. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/aperturescatterguard.py +0 -0
  129. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/apple2_undulator.py +0 -0
  130. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/areadetector/plugins/CAM.py +0 -0
  131. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/areadetector/plugins/MJPG.py +0 -0
  132. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/attenuator/attenuator.py +0 -0
  133. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/attenuator/filter.py +0 -0
  134. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/attenuator/filter_selections.py +0 -0
  135. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/backlight.py +0 -0
  136. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/bimorph_mirror.py +0 -0
  137. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/cryostream.py +0 -0
  138. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/current_amplifiers/__init__.py +0 -0
  139. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/current_amplifiers/current_amplifier.py +0 -0
  140. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/current_amplifiers/current_amplifier_detector.py +0 -0
  141. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/current_amplifiers/femto.py +0 -0
  142. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/current_amplifiers/sr570.py +0 -0
  143. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/current_amplifiers/struck_scaler_counter.py +0 -0
  144. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/dcm.py +0 -0
  145. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/detector/__init__.py +0 -0
  146. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/detector/det_dim_constants.py +0 -0
  147. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/detector/det_dist_to_beam_converter.py +0 -0
  148. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/detector/det_resolution.py +0 -0
  149. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/detector/detector.py +0 -0
  150. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/detector/detector_motion.py +0 -0
  151. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/diamond_filter.py +0 -0
  152. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/eiger_odin.py +0 -0
  153. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/fluorescence_detector_motion.py +0 -0
  154. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/flux.py +0 -0
  155. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/focusing_mirror.py +0 -0
  156. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/hutch_shutter.py +0 -0
  157. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i03/__init__.py +0 -0
  158. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i03/beamstop.py +0 -0
  159. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/i10_apple2.py +0 -0
  160. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/i10_setting_data.py +0 -0
  161. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/mirrors.py +0 -0
  162. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/rasor/rasor_current_amp.py +0 -0
  163. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/rasor/rasor_motors.py +0 -0
  164. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/rasor/rasor_scaler_cards.py +0 -0
  165. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i10/slits.py +0 -0
  166. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i13_1/__init__.py +0 -0
  167. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i13_1/merlin.py +0 -0
  168. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i13_1/merlin_controller.py +0 -0
  169. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i13_1/merlin_io.py +0 -0
  170. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i20_1/__init__.py +0 -0
  171. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i22/dcm.py +0 -0
  172. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i22/fswitch.py +0 -0
  173. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i22/nxsas.py +0 -0
  174. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/__init__.py +0 -0
  175. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/aperture.py +0 -0
  176. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/beam_center.py +0 -0
  177. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/beamstop.py +0 -0
  178. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/dcm.py +0 -0
  179. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/dual_backlight.py +0 -0
  180. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/focus_mirrors.py +0 -0
  181. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/i24_detector_motion.py +0 -0
  182. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/pilatus_metadata.py +0 -0
  183. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/pmac.py +0 -0
  184. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/i24/vgonio.py +0 -0
  185. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/ipin.py +0 -0
  186. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/linkam3.py +0 -0
  187. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/logging_ophyd_device.py +0 -0
  188. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/motors.py +0 -0
  189. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/__init__.py +0 -0
  190. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/microns_for_zoom_levels.json +0 -0
  191. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/oav_calculations.py +0 -0
  192. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/oav_detector.py +0 -0
  193. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/oav_parameters.py +0 -0
  194. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/oav_to_redis_forwarder.py +0 -0
  195. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/pin_image_recognition/__init__.py +0 -0
  196. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/pin_image_recognition/manual_test.py +0 -0
  197. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/pin_image_recognition/utils.py +0 -0
  198. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/snapshots/grid_overlay.py +0 -0
  199. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/snapshots/snapshot_with_beam_centre.py +0 -0
  200. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/snapshots/snapshot_with_grid.py +0 -0
  201. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/oav/utils.py +0 -0
  202. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/p45.py +0 -0
  203. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/p99/__init__.py +0 -0
  204. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/p99/sample_stage.py +0 -0
  205. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/pgm.py +0 -0
  206. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/pressure_jump_cell.py +0 -0
  207. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/qbpm.py +0 -0
  208. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/robot.py +0 -0
  209. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/s4_slit_gaps.py +0 -0
  210. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/scatterguard.py +0 -0
  211. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/scintillator.py +0 -0
  212. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/slits.py +0 -0
  213. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/smargon.py +0 -0
  214. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/status.py +0 -0
  215. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/synchrotron.py +0 -0
  216. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/tetramm.py +0 -0
  217. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/thawer.py +0 -0
  218. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/training_rig/__init__.py +0 -0
  219. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/training_rig/sample_stage.py +0 -0
  220. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/turbo_slit.py +0 -0
  221. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/undulator.py +0 -0
  222. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/undulator_dcm.py +0 -0
  223. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/util/__init__.py +0 -0
  224. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/util/adjuster_plans.py +0 -0
  225. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/util/epics_util.py +0 -0
  226. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/util/lookup_tables.py +0 -0
  227. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/util/motor_utils.py +0 -0
  228. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/util/test_utils.py +0 -0
  229. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/watsonmarlow323_pump.py +0 -0
  230. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/webcam.py +0 -0
  231. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/xbpm_feedback.py +0 -0
  232. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/xspress3/xspress3.py +0 -0
  233. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/xspress3/xspress3_channel.py +0 -0
  234. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/zebra/__init__.py +0 -0
  235. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/zebra/zebra.py +0 -0
  236. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/zebra/zebra_constants_mapping.py +0 -0
  237. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/zebra/zebra_controlled_shutter.py +0 -0
  238. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/zocalo/__init__.py +0 -0
  239. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/zocalo/zocalo_constants.py +0 -0
  240. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/zocalo/zocalo_interaction.py +0 -0
  241. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/devices/zocalo/zocalo_results.py +0 -0
  242. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/log.py +0 -0
  243. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/parameters/experiment_parameter_base.py +0 -0
  244. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/plan_stubs/__init__.py +0 -0
  245. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/plan_stubs/check_topup.py +0 -0
  246. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/plan_stubs/data_session.py +0 -0
  247. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/plan_stubs/motor_utils.py +0 -0
  248. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/plan_stubs/wrapped.py +0 -0
  249. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/plans/__init__.py +0 -0
  250. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/plans/save_panda.py +0 -0
  251. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/plans/scanspec.py +0 -0
  252. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/plans/wrapped.py +0 -0
  253. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/src/dodal/utils.py +0 -0
  254. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/__init__.py +0 -0
  255. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/test_adsim.py +0 -0
  256. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/test_aperturescatterguard_system.py +0 -0
  257. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/test_eiger_system.py +0 -0
  258. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/test_gridscan_system.py +0 -0
  259. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/test_oav_system.py +0 -0
  260. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/test_oav_to_redis_system.py +0 -0
  261. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/test_slit_gaps_system.py +0 -0
  262. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/test_smargon_system.py +0 -0
  263. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/test_synchrotron_system.py +0 -0
  264. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/test_undulator_system.py +0 -0
  265. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/test_zebra_system.py +0 -0
  266. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/system_tests/test_zocalo_results.py +0 -0
  267. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/__init__.py +0 -0
  268. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/beamlines/__init__.py +0 -0
  269. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/beamlines/unit_tests/__init__.py +0 -0
  270. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/beamlines/unit_tests/test_i03.py +0 -0
  271. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/beamlines/unit_tests/test_i24.py +0 -0
  272. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/beamlines/unit_tests/test_mapping.py +0 -0
  273. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/common/__init__.py +0 -0
  274. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/common/beamlines/__init__.py +0 -0
  275. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/common/beamlines/test_beamline_parameters.py +0 -0
  276. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/common/beamlines/test_beamline_utils.py +0 -0
  277. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/common/beamlines/test_device_helpers.py +0 -0
  278. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/common/beamlines/test_device_instantiation.py +0 -0
  279. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/common/test_coordination.py +0 -0
  280. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/common/test_crystal_metadata.py +0 -0
  281. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/common/test_maths.py +0 -0
  282. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/common/test_udc_directory_provider.py +0 -0
  283. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/common/test_visit.py +0 -0
  284. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/conftest.py +0 -0
  285. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/__init__.py +0 -0
  286. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i03/__init__.py +0 -0
  287. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i03/test_beamstop.py +0 -0
  288. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i04/__init__.py +0 -0
  289. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i10/lookupTables/IDEnergy2GapCalibrations.csv +0 -0
  290. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i10/lookupTables/IDEnergy2PhaseCalibrations.csv +0 -0
  291. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdd.pkl +0 -0
  292. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdu.pkl +0 -0
  293. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidd.pkl +0 -0
  294. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidu.pkl +0 -0
  295. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i10/test_i10Apple2.py +0 -0
  296. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i13_1/test_merlin.py +0 -0
  297. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i22/test_dcm.py +0 -0
  298. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i22/test_fswitch.py +0 -0
  299. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/i22/test_metadataholder.py +0 -0
  300. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/test_diamond_filter.py +0 -0
  301. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/training_rig/test_sample_stage.py +0 -0
  302. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/__init__.py +0 -0
  303. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/conftest.py +0 -0
  304. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/current_amplifier/test_femto.py +0 -0
  305. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/current_amplifier/test_sr570.py +0 -0
  306. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/detector/test_det_dim_constants.py +0 -0
  307. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/detector/test_det_resolution.py +0 -0
  308. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/detector/test_detector.py +0 -0
  309. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/i24/__init__.py +0 -0
  310. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/i24/test_dual_backlight.py +0 -0
  311. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/i24/test_focus_mirrors.py +0 -0
  312. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/i24/test_pilatus_metadata.py +0 -0
  313. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/i24/test_pmac.py +0 -0
  314. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/i24/test_vgonio.py +0 -0
  315. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/__init__.py +0 -0
  316. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/conftest.py +0 -0
  317. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect.py +0 -0
  318. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect_utils.py +0 -0
  319. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/test_grid_overlay.py +0 -0
  320. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/test_oav.py +0 -0
  321. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/test_oav_parameters.py +0 -0
  322. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/test_oav_to_redis_forwarder.py +0 -0
  323. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/test_oav_utils.py +0 -0
  324. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/oav/test_snapshots.py +0 -0
  325. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/p99/test_p99_stage.py +0 -0
  326. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_OAVCentring.json +0 -0
  327. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_aperture.py +0 -0
  328. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_aperture_scatterguard.py +0 -0
  329. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_apple2_undulator.py +0 -0
  330. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_attenuator.py +0 -0
  331. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_backlight.py +0 -0
  332. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_bart_robot.py +0 -0
  333. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_beam_converter.py +0 -0
  334. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_beamline_undulator_to_gap_lookup_table.txt +0 -0
  335. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_bimorph_mirror.py +0 -0
  336. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_daq_configuration/domain/beamlineParameters +0 -0
  337. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Pitch_converter.txt +0 -0
  338. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt +0 -0
  339. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_dcm.py +0 -0
  340. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_display.configuration +0 -0
  341. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_focusing_mirror.py +0 -0
  342. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_hutch_shutter.py +0 -0
  343. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_jCameraManZoomLevels.xml +0 -0
  344. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_linkam3.py +0 -0
  345. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_lookup_table.txt +0 -0
  346. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_lookup_table_2.txt +0 -0
  347. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_odin.py +0 -0
  348. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_pressure_jump_cell.py +0 -0
  349. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_qbpm.py +0 -0
  350. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_shutter.py +0 -0
  351. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_slits.py +0 -0
  352. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_smargon.py +0 -0
  353. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_status.py +0 -0
  354. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_synchrotron.py +0 -0
  355. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_tetramm.py +0 -0
  356. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_thawer.py +0 -0
  357. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_undulator.py +0 -0
  358. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_undulator_dcm.py +0 -0
  359. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_utils.py +0 -0
  360. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_watsonmarlow323_pump.py +0 -0
  361. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_webcam.py +0 -0
  362. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_xbpm_feedback.py +0 -0
  363. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_xspress3.py +0 -0
  364. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_zebra.py +0 -0
  365. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_zebra_constants_mapping.py +0 -0
  366. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_zocalo_interaction.py +0 -0
  367. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/test_zocalo_results.py +0 -0
  368. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/util/__init__.py +0 -0
  369. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/util/test_adjuster_plans.py +0 -0
  370. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/util/test_beamline_specific_utils.py +0 -0
  371. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/util/test_lookup_tables.py +0 -0
  372. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/devices/unit_tests/util/test_save_panda.py +0 -0
  373. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/fake_beamline.py +0 -0
  374. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/fake_beamline_all_devices_raise_exception.py +0 -0
  375. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/fake_beamline_broken_dependency.py +0 -0
  376. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/fake_beamline_dependencies.py +0 -0
  377. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/fake_beamline_disordered_dependencies.py +0 -0
  378. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/fake_beamline_misbehaving_builtins.py +0 -0
  379. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/fake_beamline_some_devices_working.py +0 -0
  380. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/fake_device_factory_beamline.py +0 -0
  381. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/fake_zocalo/README.rst +0 -0
  382. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/fake_zocalo/__init__.py +0 -0
  383. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/fake_zocalo/__main__.py +0 -0
  384. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/fake_zocalo/dls_start_fake_zocalo.sh +0 -0
  385. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/plan_stubs/test_motor_util_plans.py +0 -0
  386. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/plan_stubs/test_topup_plan.py +0 -0
  387. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/plan_stubs/test_wrapped_stubs.py +0 -0
  388. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/plans/conftest.py +0 -0
  389. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/plans/test_compliance.py +0 -0
  390. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/plans/test_scanspec.py +0 -0
  391. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/plans/test_wrapped.py +0 -0
  392. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/preprocessors/test_filesystem_metadata.py +0 -0
  393. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_cli.py +0 -0
  394. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_data/bad_beamlineParameters +0 -0
  395. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_data/i04_beamlineParameters +0 -0
  396. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_data/test_beamline_dcm_roll_converter.txt +0 -0
  397. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_data/test_beamline_dcm_roll_converter_non_monotonic.txt +0 -0
  398. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_data/test_beamline_dcm_roll_converter_reversed.txt +0 -0
  399. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_data/test_beamline_parameters.txt +0 -0
  400. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_data/test_det_dist_converter.txt +0 -0
  401. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_data/test_images/oav_snapshot_expected.png +0 -0
  402. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_data/test_images/oav_snapshot_test.png +0 -0
  403. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_data/topup_long_delay.txt +0 -0
  404. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_data/topup_short_params.txt +0 -0
  405. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/test_utils.py +0 -0
  406. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/unit_tests/__init__.py +0 -0
  407. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/unit_tests/test_cli.py +0 -0
  408. {dls_dodal-1.38.0 → dls_dodal-1.39.0}/tests/unit_tests/test_log.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dls-dodal
3
- Version: 1.38.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
@@ -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",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dls-dodal
3
- Version: 1.38.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
@@ -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
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.38.0'
16
- __version_tuple__ = version_tuple = (1, 38, 0)
15
+ __version__ = version = '1.39.0'
16
+ __version_tuple__ = version_tuple = (1, 39, 0)
@@ -335,7 +335,9 @@ def synchrotron(
335
335
 
336
336
 
337
337
  def undulator(
338
- 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,
339
341
  ) -> Undulator:
340
342
  """Get the i03 undulator device, instantiate it if it hasn't already been.
341
343
  If this is called when already instantiated in i03, it will return the existing object.
@@ -347,12 +349,15 @@ def undulator(
347
349
  wait_for_connection,
348
350
  fake_with_ophyd_sim,
349
351
  bl_prefix=False,
350
- 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",
351
354
  )
352
355
 
353
356
 
354
357
  def undulator_dcm(
355
- 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,
356
361
  ) -> UndulatorDCM:
357
362
  """Get the i03 undulator DCM device, instantiate it if it hasn't already been.
358
363
  If this is called when already instantiated in i03, it will return the existing object.
@@ -363,9 +368,14 @@ def undulator_dcm(
363
368
  prefix="",
364
369
  wait=wait_for_connection,
365
370
  fake=fake_with_ophyd_sim,
366
- 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
+ ),
367
376
  dcm=dcm(wait_for_connection, fake_with_ophyd_sim),
368
- 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,
369
379
  )
370
380
 
371
381
 
@@ -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):
@@ -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(),
@@ -32,16 +32,16 @@ async def set_beamsize_to_same_value_as_mock_signal(
32
32
  await transfocator.set(value)
33
33
 
34
34
 
35
- @patch("dodal.devices.i04.transfocator.Transfocator._observe_beamsize_microns")
35
+ @patch("dodal.devices.i04.transfocator.Transfocator.set_based_on_prediction")
36
36
  async def test_given_beamsize_already_set_then_when_transfocator_set_then_returns_immediately(
37
- mock_observe_beamsize_microns,
37
+ mock_set_based_on_prediction,
38
38
  fake_transfocator: Transfocator,
39
39
  ):
40
40
  await asyncio.wait_for(
41
41
  set_beamsize_to_same_value_as_mock_signal(fake_transfocator, 100.0),
42
42
  timeout=0.01,
43
43
  )
44
- mock_observe_beamsize_microns.assert_not_awaited()
44
+ mock_set_based_on_prediction.assert_not_awaited()
45
45
 
46
46
 
47
47
  @patch("dodal.devices.i04.transfocator.wait_for_value")
@@ -72,3 +72,11 @@ async def test_if_timeout_exceeded_and_start_rbv_not_equal_to_set_value_then_tim
72
72
  fake_transfocator.start_rbv.get_value = AsyncMock(side_effect=[0, 1])
73
73
  with pytest.raises((TimeoutError, asyncio.exceptions.TimeoutError)):
74
74
  await fake_transfocator.set(315)
75
+
76
+
77
+ async def test_given_number_of_lenses_is_already_correct_then_transfocator_set_returns_immediately(
78
+ fake_transfocator: Transfocator,
79
+ ):
80
+ given_predicted_lenses_is_half_of_beamsize(fake_transfocator)
81
+ set_mock_value(fake_transfocator.predicted_vertical_num_lenses, 10)
82
+ await fake_transfocator.set(20)
@@ -740,3 +740,15 @@ def test_for_other_beamlines_i03_used_as_default(params: DetectorParams):
740
740
  )
741
741
  assert fake_eiger.beamline == "ixx"
742
742
  assert fake_eiger.timeouts == AVAILABLE_TIMEOUTS["i03"]
743
+
744
+
745
+ def test_given_eiger_is_disarming_when_eiger_is_stopped_then_wait_for_disarming_to_finish(
746
+ fake_eiger: EigerDetector,
747
+ ):
748
+ fake_eiger.disarm_detector = MagicMock()
749
+ fake_eiger.disarming_status = (disarming_status := MagicMock())
750
+ disarming_status.done = False
751
+ fake_eiger.stop()
752
+
753
+ disarming_status.wait.assert_called_once()
754
+ fake_eiger.disarm_detector.assert_not_called()
@@ -1,4 +1,5 @@
1
1
  from asyncio import TimeoutError, wait_for
2
+ from contextlib import nullcontext
2
3
  from dataclasses import dataclass
3
4
 
4
5
  import numpy as np
@@ -12,6 +13,7 @@ from ophyd_async.testing import get_mock_put, set_mock_value
12
13
 
13
14
  from dodal.devices.fast_grid_scan import (
14
15
  FastGridScanCommon,
16
+ GridScanParamsCommon,
15
17
  PandAFastGridScan,
16
18
  PandAGridScanParams,
17
19
  ZebraFastGridScan,
@@ -246,63 +248,62 @@ def panda_grid_scan_params():
246
248
  )
247
249
 
248
250
 
249
- @pytest.mark.parametrize(
250
- "grid_position",
251
- [
252
- (np.array([-1, 2, 4])),
253
- (np.array([11, 2, 4])),
254
- (np.array([1, 17, 4])),
255
- (np.array([1, 5, 22])),
256
- ],
257
- )
258
- def test_given_x_y_z_out_of_range_then_converting_to_motor_coords_raises(
259
- zebra_grid_scan_params: ZebraGridScanParams,
260
- panda_grid_scan_params: PandAGridScanParams,
261
- grid_position,
262
- ):
263
- with pytest.raises(IndexError):
264
- zebra_grid_scan_params.grid_position_to_motor_position(grid_position)
265
- with pytest.raises(IndexError):
266
- panda_grid_scan_params.grid_position_to_motor_position(grid_position)
267
-
268
-
269
- def test_given_x_y_z_of_origin_when_get_motor_positions_then_initial_positions_returned(
270
- zebra_grid_scan_params: ZebraGridScanParams,
271
- panda_grid_scan_params: PandAGridScanParams,
272
- ):
273
- motor_positions = [
274
- zebra_grid_scan_params.grid_position_to_motor_position(np.array([0, 0, 0])),
275
- panda_grid_scan_params.grid_position_to_motor_position(np.array([0, 0, 0])),
276
- ]
277
- assert [np.allclose(position, np.array([0, 1, 4])) for position in motor_positions]
251
+ @pytest.fixture(params=["zebra_grid_scan_params", "panda_grid_scan_params"])
252
+ def common_grid_scan_params(request):
253
+ return request.getfixturevalue(request.param)
278
254
 
279
255
 
280
256
  @pytest.mark.parametrize(
281
- "grid_position, expected_x, expected_y, expected_z",
257
+ "grid_position, expected",
282
258
  [
283
- (np.array([1, 1, 1]), 0.3, 1.2, 4.1),
284
- (np.array([2, 11, 16]), 0.6, 3.2, 5.6),
285
- (np.array([6, 5, 5]), 1.8, 2.0, 4.5),
259
+ [np.array([-1, 2, 4]), pytest.raises(IndexError)],
260
+ [np.array([11, 2, 4]), pytest.raises(IndexError)],
261
+ [np.array([1, 17, 4]), pytest.raises(IndexError)],
262
+ [np.array([1, 5, 22]), pytest.raises(IndexError)],
263
+ [np.array([0, 0, 0]), nullcontext(np.array([0, 1, 4]))],
264
+ [np.array([1, 1, 1]), nullcontext(np.array([0.3, 1.2, 4.1]))],
265
+ [np.array([2, 11, 16]), nullcontext(np.array([0.6, 3.2, 5.6]))],
266
+ [np.array([6, 5, 5]), nullcontext(np.array([1.8, 2.0, 4.5]))],
267
+ [np.array([-0.51, 5, 5]), pytest.raises(IndexError)],
268
+ [
269
+ np.array([-0.5, 5, 5]),
270
+ nullcontext(np.array([-0.5 * 0.3, 1 + 5 * 0.2, 4 + 5 * 0.1])),
271
+ ],
272
+ [np.array([5, -0.51, 5]), pytest.raises(IndexError)],
273
+ [
274
+ np.array([5, -0.5, 5]),
275
+ nullcontext(np.array([5 * 0.3, 1 - 0.5 * 0.2, 4 + 5 * 0.1])),
276
+ ],
277
+ [np.array([5, 5, -0.51]), pytest.raises(IndexError)],
278
+ [
279
+ np.array([5, 5, -0.5]),
280
+ nullcontext(np.array([5 * 0.3, 1 + 5 * 0.2, 4 - 0.5 * 0.1])),
281
+ ],
282
+ [np.array([9.51, 5, 5]), pytest.raises(IndexError)],
283
+ [
284
+ np.array([9.5, 5, 5]),
285
+ nullcontext(np.array([9.5 * 0.3, 1 + 5 * 0.2, 4 + 5 * 0.1])),
286
+ ],
287
+ [np.array([5, 14.51, 5]), pytest.raises(IndexError)],
288
+ [
289
+ np.array([5, 14.5, 5]),
290
+ nullcontext(np.array([5 * 0.3, 1 + 14.5 * 0.2, 4 + 5 * 0.1])),
291
+ ],
292
+ [np.array([5, 5, 19.51]), pytest.raises(IndexError)],
293
+ [
294
+ np.array([5, 5, 19.5]),
295
+ nullcontext(np.array([5 * 0.3, 1 + 5 * 0.2, 4 + 19.5 * 0.1])),
296
+ ],
286
297
  ],
287
298
  )
288
- def test_given_various_x_y_z_when_get_motor_positions_then_expected_positions_returned(
289
- zebra_grid_scan_params: ZebraGridScanParams,
290
- panda_grid_scan_params: PandAGridScanParams,
291
- grid_position,
292
- expected_x,
293
- expected_y,
294
- expected_z,
299
+ def test_given_x_y_z_out_of_range_then_converting_to_motor_coords_raises(
300
+ common_grid_scan_params: GridScanParamsCommon, grid_position, expected
295
301
  ):
296
- motor_positions = [
297
- zebra_grid_scan_params.grid_position_to_motor_position(grid_position),
298
- panda_grid_scan_params.grid_position_to_motor_position(grid_position),
299
- ]
300
- [
301
- np.testing.assert_allclose(
302
- position, np.array([expected_x, expected_y, expected_z])
302
+ with expected as expected_value:
303
+ motor_position = common_grid_scan_params.grid_position_to_motor_position(
304
+ grid_position
303
305
  )
304
- for position in motor_positions
305
- ]
306
+ assert np.allclose(motor_position, expected_value)
306
307
 
307
308
 
308
309
  @pytest.mark.parametrize(
@@ -333,11 +334,9 @@ def test_can_run_fast_grid_scan_in_run_engine(
333
334
 
334
335
 
335
336
  def test_given_x_y_z_steps_when_full_number_calculated_then_answer_is_as_expected(
336
- zebra_grid_scan_params: ZebraGridScanParams,
337
- panda_grid_scan_params: PandAGridScanParams,
337
+ common_grid_scan_params: GridScanParamsCommon,
338
338
  ):
339
- assert zebra_grid_scan_params.get_num_images() == 350
340
- assert panda_grid_scan_params.get_num_images() == 350
339
+ assert common_grid_scan_params.get_num_images() == 350
341
340
 
342
341
 
343
342
  @pytest.mark.parametrize(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes