dls-dodal 1.49.0__tar.gz → 1.50.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 (499) hide show
  1. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/PKG-INFO +1 -1
  2. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dls_dodal.egg-info/PKG-INFO +1 -1
  3. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dls_dodal.egg-info/SOURCES.txt +2 -0
  4. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/_version.py +2 -2
  5. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/hutch_shutter.py +6 -6
  6. dls_dodal-1.50.0/src/dodal/plans/bimorph.py +333 -0
  7. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_hutch_shutter.py +11 -2
  8. dls_dodal-1.50.0/tests/plans/test_bimorph.py +793 -0
  9. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.copier-answers.yml +0 -0
  10. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.devcontainer/devcontainer.json +0 -0
  11. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/CODEOWNERS +0 -0
  12. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/CONTRIBUTING.md +0 -0
  13. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/ISSUE_TEMPLATE/issue_template.md +0 -0
  14. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/actions/install_requirements/action.yml +0 -0
  15. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/dependabot.yml +0 -0
  16. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/pages/index.html +0 -0
  17. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/pages/make_switcher.py +0 -0
  18. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/scripts/check_test_durations.py +0 -0
  19. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/workflows/_check.yml +0 -0
  20. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/workflows/_dist.yml +0 -0
  21. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/workflows/_docs.yml +0 -0
  22. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/workflows/_pypi.yml +0 -0
  23. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/workflows/_release.yml +0 -0
  24. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/workflows/_test.yml +0 -0
  25. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/workflows/_tox.yml +0 -0
  26. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/workflows/ci.yml +0 -0
  27. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.github/workflows/periodic.yml +0 -0
  28. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.gitignore +0 -0
  29. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.pre-commit-config.yaml +0 -0
  30. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.vscode/extensions.json +0 -0
  31. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.vscode/launch.json +0 -0
  32. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.vscode/settings.json +0 -0
  33. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/.vscode/tasks.json +0 -0
  34. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/Dockerfile +0 -0
  35. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/LICENSE +0 -0
  36. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/README.md +0 -0
  37. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/catalog-info.yaml +0 -0
  38. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/conftest.py +0 -0
  39. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/_templates/autosummary/class.rst +0 -0
  40. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/_templates/autosummary/module.rst +0 -0
  41. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/_templates/custom-module-template.rst +0 -0
  42. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/assets/zocalo.png +0 -0
  43. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/conf.py +0 -0
  44. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  45. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  46. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/explanations/decisions/0003-codeowners.md +0 -0
  47. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/explanations/decisions/0004-make-devices-factory.md +0 -0
  48. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/explanations/decisions/0005-standardise-devices-at-epics-level.md +0 -0
  49. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/explanations/decisions/COPYME +0 -0
  50. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/explanations/decisions.md +0 -0
  51. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/explanations/reviews.md +0 -0
  52. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/explanations/umls/apple2_design.png +0 -0
  53. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/explanations/umls/i10_id_design.png +0 -0
  54. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/explanations.md +0 -0
  55. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/genindex.md +0 -0
  56. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/build-docs.md +0 -0
  57. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/contribute.md +0 -0
  58. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/coverage.md +0 -0
  59. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/create-beamline.rst +0 -0
  60. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/create-device.md +0 -0
  61. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/dev-install.md +0 -0
  62. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/excalidraw.md +0 -0
  63. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/external-io-devices.md +0 -0
  64. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/lint.md +0 -0
  65. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/lock-requirements.md +0 -0
  66. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/make-release.md +0 -0
  67. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/move-code.rst +0 -0
  68. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/pypi.md +0 -0
  69. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/run-tests.md +0 -0
  70. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/static-analysis.md +0 -0
  71. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/update-template.md +0 -0
  72. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/write-tests.md +0 -0
  73. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to/zocalo.rst +0 -0
  74. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/how-to.md +0 -0
  75. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/images/dls-logo.svg +0 -0
  76. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/images/excalidraw-example.svg +0 -0
  77. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/index.md +0 -0
  78. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/reference/api.md +0 -0
  79. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/reference/device-standards.rst +0 -0
  80. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/reference/standards.rst +0 -0
  81. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/reference.md +0 -0
  82. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/tutorials/get_started.rst +0 -0
  83. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/tutorials/installation.md +0 -0
  84. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/docs/tutorials.md +0 -0
  85. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/pull_request_template.md +0 -0
  86. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/pyproject.toml +0 -0
  87. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/setup.cfg +0 -0
  88. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/__init__.py +0 -0
  89. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dls_dodal.egg-info/dependency_links.txt +0 -0
  90. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dls_dodal.egg-info/entry_points.txt +0 -0
  91. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dls_dodal.egg-info/requires.txt +0 -0
  92. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dls_dodal.egg-info/top_level.txt +0 -0
  93. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/__init__.py +0 -0
  94. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/__main__.py +0 -0
  95. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamline_specific_utils/__init__.py +0 -0
  96. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamline_specific_utils/i03.py +0 -0
  97. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/README.md +0 -0
  98. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/__init__.py +0 -0
  99. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/adsim.py +0 -0
  100. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/aithre.py +0 -0
  101. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/b01_1.py +0 -0
  102. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/b07.py +0 -0
  103. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/b07_1.py +0 -0
  104. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/b16.py +0 -0
  105. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/b18.py +0 -0
  106. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i02_1.py +0 -0
  107. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i03.py +0 -0
  108. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i04.py +0 -0
  109. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i09.py +0 -0
  110. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i09_1.py +0 -0
  111. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i10.py +0 -0
  112. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i13_1.py +0 -0
  113. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i18.py +0 -0
  114. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i19_1.py +0 -0
  115. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i19_2.py +0 -0
  116. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i19_optics.py +0 -0
  117. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i20_1.py +0 -0
  118. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i22.py +0 -0
  119. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i23.py +0 -0
  120. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/i24.py +0 -0
  121. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/k11.py +0 -0
  122. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/p38.py +0 -0
  123. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/p45.py +0 -0
  124. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/p60.py +0 -0
  125. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/p99.py +0 -0
  126. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/beamlines/training_rig.py +0 -0
  127. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/cli.py +0 -0
  128. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/common/__init__.py +0 -0
  129. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/common/beamlines/__init__.py +0 -0
  130. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/common/beamlines/beamline_parameters.py +0 -0
  131. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/common/beamlines/beamline_utils.py +0 -0
  132. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/common/beamlines/device_helpers.py +0 -0
  133. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/common/coordination.py +0 -0
  134. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/common/crystal_metadata.py +0 -0
  135. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/common/data_util.py +0 -0
  136. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/common/maths.py +0 -0
  137. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/common/types.py +0 -0
  138. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/common/udc_directory_provider.py +0 -0
  139. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/common/visit.py +0 -0
  140. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/CTAB.py +0 -0
  141. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/__init__.py +0 -0
  142. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/adsim.py +0 -0
  143. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/aithre_lasershaping/goniometer.py +0 -0
  144. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/aithre_lasershaping/laser_robot.py +0 -0
  145. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/aperture.py +0 -0
  146. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/aperturescatterguard.py +0 -0
  147. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/apple2_undulator.py +0 -0
  148. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/areadetector/plugins/CAM.py +0 -0
  149. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/areadetector/plugins/MJPG.py +0 -0
  150. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/attenuator/attenuator.py +0 -0
  151. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/attenuator/filter.py +0 -0
  152. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/attenuator/filter_selections.py +0 -0
  153. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/b16/__init__.py +0 -0
  154. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/b16/detector.py +0 -0
  155. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/backlight.py +0 -0
  156. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/baton.py +0 -0
  157. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/bimorph_mirror.py +0 -0
  158. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/common_dcm.py +0 -0
  159. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/cryostream.py +0 -0
  160. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/current_amplifiers/__init__.py +0 -0
  161. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/current_amplifiers/current_amplifier.py +0 -0
  162. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/current_amplifiers/current_amplifier_detector.py +0 -0
  163. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/current_amplifiers/femto.py +0 -0
  164. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/current_amplifiers/sr570.py +0 -0
  165. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/current_amplifiers/struck_scaler_counter.py +0 -0
  166. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/detector/__init__.py +0 -0
  167. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/detector/det_dim_constants.py +0 -0
  168. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/detector/det_dist_to_beam_converter.py +0 -0
  169. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/detector/det_resolution.py +0 -0
  170. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/detector/detector.py +0 -0
  171. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/detector/detector_motion.py +0 -0
  172. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/diamond_filter.py +0 -0
  173. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/eiger.py +0 -0
  174. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/eiger_odin.py +0 -0
  175. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/__init__.py +0 -0
  176. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/abstract/__init__.py +0 -0
  177. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/abstract/base_detector.py +0 -0
  178. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/abstract/base_driver_io.py +0 -0
  179. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/abstract/base_region.py +0 -0
  180. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/detector.py +0 -0
  181. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/enums.py +0 -0
  182. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/specs/__init__.py +0 -0
  183. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/specs/detector.py +0 -0
  184. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/specs/driver_io.py +0 -0
  185. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/specs/enums.py +0 -0
  186. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/specs/region.py +0 -0
  187. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/types.py +0 -0
  188. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/util.py +0 -0
  189. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/vgscienta/__init__.py +0 -0
  190. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/vgscienta/detector.py +0 -0
  191. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/vgscienta/driver_io.py +0 -0
  192. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/vgscienta/enums.py +0 -0
  193. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/electron_analyser/vgscienta/region.py +0 -0
  194. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/fast_grid_scan.py +0 -0
  195. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/fluorescence_detector_motion.py +0 -0
  196. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/flux.py +0 -0
  197. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/focusing_mirror.py +0 -0
  198. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i03/__init__.py +0 -0
  199. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i03/dcm.py +0 -0
  200. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i03/undulator_dcm.py +0 -0
  201. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i04/__init__.py +0 -0
  202. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i04/constants.py +0 -0
  203. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i04/murko_results.py +0 -0
  204. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i04/transfocator.py +0 -0
  205. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i10/__init__.py +0 -0
  206. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i10/diagnostics.py +0 -0
  207. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i10/i10_apple2.py +0 -0
  208. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i10/i10_setting_data.py +0 -0
  209. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i10/mirrors.py +0 -0
  210. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i10/rasor/rasor_current_amp.py +0 -0
  211. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i10/rasor/rasor_motors.py +0 -0
  212. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i10/rasor/rasor_scaler_cards.py +0 -0
  213. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i10/slits.py +0 -0
  214. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i13_1/__init__.py +0 -0
  215. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i13_1/merlin.py +0 -0
  216. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i13_1/merlin_controller.py +0 -0
  217. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i18/KBMirror.py +0 -0
  218. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i18/diode.py +0 -0
  219. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i18/table.py +0 -0
  220. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i18/thor_labs_stage.py +0 -0
  221. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i19/__init__.py +0 -0
  222. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i19/beamstop.py +0 -0
  223. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i19/blueapi_device.py +0 -0
  224. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i19/hutch_access.py +0 -0
  225. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i19/shutter.py +0 -0
  226. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i20_1/__init__.py +0 -0
  227. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i22/dcm.py +0 -0
  228. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i22/fswitch.py +0 -0
  229. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i22/nxsas.py +0 -0
  230. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i24/__init__.py +0 -0
  231. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i24/aperture.py +0 -0
  232. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i24/beam_center.py +0 -0
  233. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i24/beamstop.py +0 -0
  234. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i24/dcm.py +0 -0
  235. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i24/dual_backlight.py +0 -0
  236. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i24/focus_mirrors.py +0 -0
  237. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i24/i24_detector_motion.py +0 -0
  238. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i24/pilatus_metadata.py +0 -0
  239. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i24/pmac.py +0 -0
  240. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/i24/vgonio.py +0 -0
  241. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/ipin.py +0 -0
  242. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/linkam3.py +0 -0
  243. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/motors.py +0 -0
  244. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/mx_phase1/beamstop.py +0 -0
  245. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/__init__.py +0 -0
  246. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/oav_calculations.py +0 -0
  247. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/oav_detector.py +0 -0
  248. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/oav_parameters.py +0 -0
  249. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/oav_to_redis_forwarder.py +0 -0
  250. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/pin_image_recognition/__init__.py +0 -0
  251. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/pin_image_recognition/manual_test.py +0 -0
  252. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/pin_image_recognition/utils.py +0 -0
  253. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/snapshots/grid_overlay.py +0 -0
  254. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/snapshots/snapshot.py +0 -0
  255. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/snapshots/snapshot_image_processing.py +0 -0
  256. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/snapshots/snapshot_with_grid.py +0 -0
  257. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/oav/utils.py +0 -0
  258. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/p45.py +0 -0
  259. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/p99/__init__.py +0 -0
  260. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/p99/andor2_point.py +0 -0
  261. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/p99/sample_stage.py +0 -0
  262. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/pgm.py +0 -0
  263. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/positioner.py +0 -0
  264. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/pressure_jump_cell.py +0 -0
  265. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/qbpm.py +0 -0
  266. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/robot.py +0 -0
  267. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/s4_slit_gaps.py +0 -0
  268. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/scatterguard.py +0 -0
  269. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/scintillator.py +0 -0
  270. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/slits.py +0 -0
  271. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/smargon.py +0 -0
  272. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/status.py +0 -0
  273. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/synchrotron.py +0 -0
  274. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/tetramm.py +0 -0
  275. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/thawer.py +0 -0
  276. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/training_rig/__init__.py +0 -0
  277. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/training_rig/sample_stage.py +0 -0
  278. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/turbo_slit.py +0 -0
  279. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/undulator.py +0 -0
  280. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/util/__init__.py +0 -0
  281. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/util/adjuster_plans.py +0 -0
  282. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/util/epics_util.py +0 -0
  283. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/util/lookup_tables.py +0 -0
  284. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/util/test_utils.py +0 -0
  285. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/watsonmarlow323_pump.py +0 -0
  286. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/webcam.py +0 -0
  287. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/xbpm_feedback.py +0 -0
  288. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/xspress3/xspress3.py +0 -0
  289. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/xspress3/xspress3_channel.py +0 -0
  290. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/zebra/__init__.py +0 -0
  291. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/zebra/zebra.py +0 -0
  292. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/zebra/zebra_constants_mapping.py +0 -0
  293. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/zebra/zebra_controlled_shutter.py +0 -0
  294. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/zocalo/__init__.py +0 -0
  295. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/zocalo/zocalo_constants.py +0 -0
  296. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/zocalo/zocalo_interaction.py +0 -0
  297. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/devices/zocalo/zocalo_results.py +0 -0
  298. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/log.py +0 -0
  299. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/parameters/experiment_parameter_base.py +0 -0
  300. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plan_stubs/__init__.py +0 -0
  301. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plan_stubs/check_topup.py +0 -0
  302. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plan_stubs/data_session.py +0 -0
  303. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plan_stubs/motor_utils.py +0 -0
  304. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plan_stubs/wrapped.py +0 -0
  305. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plans/__init__.py +0 -0
  306. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plans/configure_arm_trigger_and_disarm_detector.py +0 -0
  307. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plans/preprocessors/__init__.py +0 -0
  308. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plans/preprocessors/verify_undulator_gap.py +0 -0
  309. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plans/save_panda.py +0 -0
  310. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plans/scanspec.py +0 -0
  311. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plans/verify_undulator_gap.py +0 -0
  312. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/plans/wrapped.py +0 -0
  313. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/src/dodal/utils.py +0 -0
  314. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/system_tests/__init__.py +0 -0
  315. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/system_tests/test_adsim.py +0 -0
  316. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/system_tests/test_cli.py +0 -0
  317. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/system_tests/test_oav_system.py +0 -0
  318. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/system_tests/test_oav_to_redis_system.py +0 -0
  319. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/__init__.py +0 -0
  320. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/beamlines/__init__.py +0 -0
  321. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/beamlines/unit_tests/__init__.py +0 -0
  322. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/beamlines/unit_tests/test_b16.py +0 -0
  323. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/beamlines/unit_tests/test_i03.py +0 -0
  324. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/beamlines/unit_tests/test_i24.py +0 -0
  325. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/beamlines/unit_tests/test_mapping.py +0 -0
  326. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/common/__init__.py +0 -0
  327. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/common/beamlines/__init__.py +0 -0
  328. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/common/beamlines/test_beamline_parameters.py +0 -0
  329. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/common/beamlines/test_beamline_utils.py +0 -0
  330. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/common/beamlines/test_device_helpers.py +0 -0
  331. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/common/beamlines/test_device_instantiation.py +0 -0
  332. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/common/test_coordination.py +0 -0
  333. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/common/test_crystal_metadata.py +0 -0
  334. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/common/test_maths.py +0 -0
  335. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/common/test_udc_directory_provider.py +0 -0
  336. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/common/test_visit.py +0 -0
  337. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/conftest.py +0 -0
  338. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/constants.py +0 -0
  339. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/__init__.py +0 -0
  340. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/aithre_lasershaping/test_goniometer.py +0 -0
  341. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i03/__init__.py +0 -0
  342. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i04/__init__.py +0 -0
  343. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i04/test_murko_results.py +0 -0
  344. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i04/test_transfocator.py +0 -0
  345. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i10/lookupTables/IDEnergy2GapCalibrations.csv +0 -0
  346. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i10/lookupTables/IDEnergy2PhaseCalibrations.csv +0 -0
  347. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdd.pkl +0 -0
  348. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdu.pkl +0 -0
  349. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidd.pkl +0 -0
  350. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidu.pkl +0 -0
  351. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i10/test_i10Apple2.py +0 -0
  352. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i13_1/test_merlin.py +0 -0
  353. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i18/test_kb_mirror.py +0 -0
  354. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i18/test_table.py +0 -0
  355. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i18/test_thor_labs_stage.py +0 -0
  356. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i19/__init__.py +0 -0
  357. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i19/test_beamstop.py +0 -0
  358. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i19/test_shutter.py +0 -0
  359. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i22/test_dcm.py +0 -0
  360. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i22/test_fswitch.py +0 -0
  361. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/i22/test_metadataholder.py +0 -0
  362. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/mx_phase1/__init__.py +0 -0
  363. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/mx_phase1/test_beamstop.py +0 -0
  364. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/test_common_dcm.py +0 -0
  365. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/test_diamond_filter.py +0 -0
  366. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/training_rig/test_sample_stage.py +0 -0
  367. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/__init__.py +0 -0
  368. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/current_amplifier/test_femto.py +0 -0
  369. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/current_amplifier/test_sr570.py +0 -0
  370. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/detector/test_det_dim_constants.py +0 -0
  371. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/detector/test_det_resolution.py +0 -0
  372. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/detector/test_detector.py +0 -0
  373. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/__init__.py +0 -0
  374. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/abstract/__init__.py +0 -0
  375. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/abstract/test_base_detector.py +0 -0
  376. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/abstract/test_base_driver_io.py +0 -0
  377. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/conftest.py +0 -0
  378. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/specs/__init__.py +0 -0
  379. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/specs/test_detector.py +0 -0
  380. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/specs/test_driver_io.py +0 -0
  381. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/specs/test_region.py +0 -0
  382. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/test_util.py +0 -0
  383. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/util.py +0 -0
  384. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/vgscienta/__init__.py +0 -0
  385. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/vgscienta/test_detector.py +0 -0
  386. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/vgscienta/test_driver_io.py +0 -0
  387. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/electron_analyser/vgscienta/test_region.py +0 -0
  388. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/i03/__init__.py +0 -0
  389. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/i03/test_dcm.py +0 -0
  390. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/i03/test_undulator_dcm.py +0 -0
  391. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/i24/__init__.py +0 -0
  392. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/i24/test_dual_backlight.py +0 -0
  393. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/i24/test_focus_mirrors.py +0 -0
  394. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/i24/test_pilatus_metadata.py +0 -0
  395. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/i24/test_pmac.py +0 -0
  396. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/i24/test_vgonio.py +0 -0
  397. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/oav/__init__.py +0 -0
  398. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/oav/conftest.py +0 -0
  399. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect.py +0 -0
  400. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect_utils.py +0 -0
  401. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/oav/test_grid_overlay.py +0 -0
  402. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/oav/test_oav.py +0 -0
  403. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/oav/test_oav_parameters.py +0 -0
  404. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/oav/test_oav_to_redis_forwarder.py +0 -0
  405. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/oav/test_oav_utils.py +0 -0
  406. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/oav/test_snapshot_image_processing.py +0 -0
  407. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/oav/test_snapshots.py +0 -0
  408. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/p99/test_p99_stage.py +0 -0
  409. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_OAVCentring.json +0 -0
  410. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_aperture.py +0 -0
  411. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_aperture_scatterguard.py +0 -0
  412. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_apple2_undulator.py +0 -0
  413. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_attenuator.py +0 -0
  414. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_backlight.py +0 -0
  415. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_bart_robot.py +0 -0
  416. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_baton.py +0 -0
  417. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_beam_converter.py +0 -0
  418. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_beamline_undulator_to_gap_lookup_table.txt +0 -0
  419. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_bimorph_mirror.py +0 -0
  420. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_daq_configuration/domain/beamlineParameters +0 -0
  421. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Pitch_converter.txt +0 -0
  422. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt +0 -0
  423. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_display.configuration +0 -0
  424. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_eiger.py +0 -0
  425. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_focusing_mirror.py +0 -0
  426. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_gridscan.py +0 -0
  427. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_jCameraManZoomLevels.xml +0 -0
  428. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_linkam3.py +0 -0
  429. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_lookup_table.txt +0 -0
  430. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_lookup_table_2.txt +0 -0
  431. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_motors.py +0 -0
  432. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_odin.py +0 -0
  433. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_positioner.py +0 -0
  434. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_pressure_jump_cell.py +0 -0
  435. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_qbpm.py +0 -0
  436. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_slits.py +0 -0
  437. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_smargon.py +0 -0
  438. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_status.py +0 -0
  439. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_synchrotron.py +0 -0
  440. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_tetramm.py +0 -0
  441. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_thawer.py +0 -0
  442. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_turbo_slit.py +0 -0
  443. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_undulator.py +0 -0
  444. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_utils.py +0 -0
  445. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_watsonmarlow323_pump.py +0 -0
  446. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_webcam.py +0 -0
  447. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_xbpm_feedback.py +0 -0
  448. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_xspress3.py +0 -0
  449. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_zebra.py +0 -0
  450. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_zebra_constants_mapping.py +0 -0
  451. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_zebra_shutter.py +0 -0
  452. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_zocalo_interaction.py +0 -0
  453. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/test_zocalo_results.py +0 -0
  454. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/util/__init__.py +0 -0
  455. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/util/test_adjuster_plans.py +0 -0
  456. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/util/test_beamline_specific_utils.py +0 -0
  457. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/util/test_lookup_tables.py +0 -0
  458. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/devices/unit_tests/util/test_save_panda.py +0 -0
  459. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/fake_beamline.py +0 -0
  460. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/fake_beamline_all_devices_raise_exception.py +0 -0
  461. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/fake_beamline_broken_dependency.py +0 -0
  462. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/fake_beamline_dependencies.py +0 -0
  463. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/fake_beamline_disordered_dependencies.py +0 -0
  464. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/fake_beamline_misbehaving_builtins.py +0 -0
  465. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/fake_beamline_some_devices_working.py +0 -0
  466. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/fake_device_factory_beamline.py +0 -0
  467. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/fake_zocalo/README.rst +0 -0
  468. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/fake_zocalo/__init__.py +0 -0
  469. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/fake_zocalo/__main__.py +0 -0
  470. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/fake_zocalo/dls_start_fake_zocalo.sh +0 -0
  471. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/plan_stubs/test_data_session.py +0 -0
  472. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/plan_stubs/test_motor_util_plans.py +0 -0
  473. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/plan_stubs/test_topup_plan.py +0 -0
  474. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/plan_stubs/test_wrapped_stubs.py +0 -0
  475. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/plans/conftest.py +0 -0
  476. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/plans/test_compliance.py +0 -0
  477. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/plans/test_configure_arm_trigger_and_disarm_detector.py +0 -0
  478. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/plans/test_preprocessors/test_verify_undulator_gap.py +0 -0
  479. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/plans/test_scanspec.py +0 -0
  480. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/plans/test_verify_undulator_gap_plan.py +0 -0
  481. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/plans/test_wrapped.py +0 -0
  482. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/preprocessors/test_filesystem_metadata.py +0 -0
  483. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/bad_beamlineParameters +0 -0
  484. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/electron_analyser/specs_sequence.seq +0 -0
  485. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/electron_analyser/vgscienta_sequence.seq +0 -0
  486. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/i04_beamlineParameters +0 -0
  487. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/test_beamline_dcm_roll_converter.txt +0 -0
  488. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/test_beamline_dcm_roll_converter_non_monotonic.txt +0 -0
  489. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/test_beamline_dcm_roll_converter_reversed.txt +0 -0
  490. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/test_beamline_parameters.txt +0 -0
  491. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/test_det_dist_converter.txt +0 -0
  492. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/test_images/oav_snapshot_expected.png +0 -0
  493. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/test_images/oav_snapshot_test.png +0 -0
  494. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/topup_long_delay.txt +0 -0
  495. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_data/topup_short_params.txt +0 -0
  496. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/test_utils.py +0 -0
  497. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/unit_tests/__init__.py +0 -0
  498. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/unit_tests/test_cli.py +0 -0
  499. {dls_dodal-1.49.0 → dls_dodal-1.50.0}/tests/unit_tests/test_log.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dls-dodal
3
- Version: 1.49.0
3
+ Version: 1.50.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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dls-dodal
3
- Version: 1.49.0
3
+ Version: 1.50.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
@@ -299,6 +299,7 @@ src/dodal/plan_stubs/data_session.py
299
299
  src/dodal/plan_stubs/motor_utils.py
300
300
  src/dodal/plan_stubs/wrapped.py
301
301
  src/dodal/plans/__init__.py
302
+ src/dodal/plans/bimorph.py
302
303
  src/dodal/plans/configure_arm_trigger_and_disarm_detector.py
303
304
  src/dodal/plans/save_panda.py
304
305
  src/dodal/plans/scanspec.py
@@ -470,6 +471,7 @@ tests/plan_stubs/test_motor_util_plans.py
470
471
  tests/plan_stubs/test_topup_plan.py
471
472
  tests/plan_stubs/test_wrapped_stubs.py
472
473
  tests/plans/conftest.py
474
+ tests/plans/test_bimorph.py
473
475
  tests/plans/test_compliance.py
474
476
  tests/plans/test_configure_arm_trigger_and_disarm_detector.py
475
477
  tests/plans/test_scanspec.py
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.49.0'
21
- __version_tuple__ = version_tuple = (1, 49, 0)
20
+ __version__ = version = '1.50.0'
21
+ __version_tuple__ = version_tuple = (1, 50, 0)
@@ -81,14 +81,14 @@ class HutchShutter(StandardReadable, Movable[ShutterDemand]):
81
81
 
82
82
  @AsyncStatus.wrap
83
83
  async def set(self, value: ShutterDemand):
84
- interlock_state = await self.interlock.shutter_safe_to_operate()
85
- if not interlock_state and not TEST_MODE:
86
- # If not in test mode, fail. If in test mode, the optics hutch may be open.
87
- raise ShutterNotSafeToOperateError(
88
- "The hutch has not been locked, not operating shutter."
89
- )
90
84
  if not TEST_MODE:
91
85
  if value == ShutterDemand.OPEN:
86
+ interlock_state = await self.interlock.shutter_safe_to_operate()
87
+ if not interlock_state:
88
+ # If not in test mode, fail. If in test mode, the optics hutch may be open.
89
+ raise ShutterNotSafeToOperateError(
90
+ "The hutch has not been locked, not operating shutter."
91
+ )
92
92
  await self.control.set(ShutterDemand.RESET, wait=True)
93
93
  await self.control.set(value, wait=True)
94
94
  return await wait_for_value(
@@ -0,0 +1,333 @@
1
+ from collections.abc import Generator
2
+ from dataclasses import dataclass
3
+ from enum import Enum
4
+ from typing import Any
5
+
6
+ import bluesky.plan_stubs as bps
7
+ import bluesky.preprocessors as bpp
8
+ from bluesky.protocols import Preparable, Readable
9
+ from bluesky.utils import MsgGenerator
10
+ from numpy import linspace
11
+ from ophyd_async.core import TriggerInfo
12
+
13
+ from dodal.devices.bimorph_mirror import BimorphMirror
14
+ from dodal.devices.slits import Slits
15
+
16
+
17
+ class SlitDimension(str, Enum):
18
+ """Enum representing the dimensions of a 2d slit
19
+
20
+ Used to describe which dimension the pencil beam scan should move across.
21
+ The other dimension will be held constant.
22
+
23
+ Attributes:
24
+ X: Represents X dimension
25
+ Y: Represents Y dimension
26
+ """
27
+
28
+ X = "X"
29
+ Y = "Y"
30
+
31
+
32
+ def move_slits(slits: Slits, dimension: SlitDimension, gap: float, center: float):
33
+ """Moves ones dimension of Slits object to given position.
34
+
35
+ Args:
36
+ slits: Slits to move
37
+ dimension: SlitDimension (X or Y)
38
+ gap: float size of gap
39
+ center: float position of center
40
+ """
41
+ if dimension == SlitDimension.X:
42
+ yield from bps.mv(slits.x_gap, gap)
43
+ yield from bps.mv(slits.x_centre, center)
44
+ else:
45
+ yield from bps.mv(slits.y_gap, gap)
46
+ yield from bps.mv(slits.y_centre, center)
47
+
48
+
49
+ def check_valid_bimorph_state(
50
+ voltage_list: list[float], abs_range: float, abs_diff: float
51
+ ) -> bool:
52
+ """Checks that a set of bimorph voltages is valid.
53
+ Args:
54
+ voltage_list: float amount each actuator will be increased by per scan
55
+ abs_range: float absolute value of maximum possible voltage of each actuator
56
+ abs_diff: float absolute maximum difference between two consecutive actuators
57
+
58
+ Returns:
59
+ Bool representing state validity
60
+ """
61
+ for voltage in voltage_list:
62
+ if abs(voltage) > abs_range:
63
+ return False
64
+
65
+ for i in range(len(voltage_list) - 1):
66
+ if abs(voltage_list[i] - voltage_list[i - 1]) > abs_diff:
67
+ return False
68
+
69
+ return True
70
+
71
+
72
+ def validate_bimorph_plan(
73
+ initial_voltage_list: list[float],
74
+ voltage_increment: float,
75
+ abs_range: float,
76
+ abs_diff: float,
77
+ ) -> bool:
78
+ """Checks that every position the bimorph will move through will not error.
79
+
80
+ Args:
81
+ initial_voltage_list: float list starting position
82
+ voltage_increment: float amount each actuator will be increased by per scan
83
+ abs_range: float absolute value of maximum possible voltage of each actuator
84
+ abs_diff: float absolute maximum difference between two consecutive actuators
85
+
86
+ Raises:
87
+ Exception if the plan will lead to an error state"""
88
+ voltage_list = initial_voltage_list.copy()
89
+
90
+ if not check_valid_bimorph_state(voltage_list, abs_range, abs_diff):
91
+ raise ValueError(f"Bimorph plan reaches invalid state at: {voltage_list}")
92
+
93
+ for i in range(len(initial_voltage_list)):
94
+ voltage_list[i] += voltage_increment
95
+
96
+ if not check_valid_bimorph_state(voltage_list, abs_range, abs_diff):
97
+ raise ValueError(f"Bimorph plan reaches invalid state at: {voltage_list}")
98
+
99
+ return True
100
+
101
+
102
+ @dataclass
103
+ class BimorphState:
104
+ """Data class containing positions of BimorphMirror and Slits"""
105
+
106
+ voltages: list[float]
107
+ x_gap: float
108
+ y_gap: float
109
+ x_center: float
110
+ y_center: float
111
+
112
+
113
+ def capture_bimorph_state(mirror: BimorphMirror, slits: Slits):
114
+ """Plan stub that captures current position of BimorphMirror and Slits.
115
+
116
+ Args:
117
+ mirror: BimorphMirror to read from
118
+ slits: Slits to read from
119
+
120
+ Returns:
121
+ A BimorphState containing BimorphMirror and Slits positions"""
122
+ original_voltage_list = []
123
+
124
+ for channel in mirror.channels.values():
125
+ position = yield from bps.rd(channel.output_voltage)
126
+ original_voltage_list.append(position)
127
+
128
+ original_x_gap = yield from bps.rd(slits.x_gap)
129
+ original_y_gap = yield from bps.rd(slits.y_gap)
130
+ original_x_center = yield from bps.rd(slits.x_centre)
131
+ original_y_center = yield from bps.rd(slits.y_centre)
132
+ return BimorphState(
133
+ original_voltage_list,
134
+ original_x_gap,
135
+ original_y_gap,
136
+ original_x_center,
137
+ original_y_center,
138
+ )
139
+
140
+
141
+ def restore_bimorph_state(mirror: BimorphMirror, slits: Slits, state: BimorphState):
142
+ """Moves BimorphMirror and Slits to state given in BirmophState.
143
+
144
+ Args:
145
+ mirror: BimorphMirror to move
146
+ slits: Slits to move
147
+ state: BimorphState to move to.
148
+ """
149
+ yield from move_slits(slits, SlitDimension.X, state.x_gap, state.x_center)
150
+ yield from move_slits(slits, SlitDimension.Y, state.y_gap, state.y_center)
151
+
152
+ yield from bps.mv(mirror, state.voltages) # type: ignore
153
+
154
+
155
+ def bimorph_position_generator(
156
+ initial_voltage_list: list[float], voltage_increment: float
157
+ ) -> Generator[list[float], None, None]:
158
+ """Generator that produces bimorph positions, starting with the initial_voltage_list.
159
+
160
+ Args:
161
+ initial_voltage_list: list starting position for bimorph
162
+ voltage_increment: float amount to increase each actuator by in turn
163
+
164
+ Yields:
165
+ List bimorph positions, starting with initial_voltage_list
166
+ """
167
+ voltage_list = initial_voltage_list.copy()
168
+
169
+ for i in range(-1, len(initial_voltage_list)):
170
+ yield [
171
+ voltage + voltage_increment if i >= j else voltage
172
+ for (j, voltage) in enumerate(voltage_list)
173
+ ]
174
+
175
+
176
+ def bimorph_optimisation(
177
+ detectors: list[Readable],
178
+ mirror: BimorphMirror,
179
+ slits: Slits,
180
+ voltage_increment: float,
181
+ active_dimension: SlitDimension,
182
+ active_slit_center_start: float,
183
+ active_slit_center_end: float,
184
+ active_slit_size: float,
185
+ inactive_slit_center: float,
186
+ inactive_slit_size: float,
187
+ number_of_slit_positions: int,
188
+ bimorph_settle_time: float,
189
+ slit_settle_time: float,
190
+ initial_voltage_list: list | None = None,
191
+ metadata: dict[str, Any] | None = None,
192
+ ) -> MsgGenerator:
193
+ """Plan for performing bimorph mirror optimisation.
194
+
195
+ Bluesky plan that performs a series of pencil beam scans across one axis of a
196
+ bimorph mirror, of using a 2-dimensional slit.
197
+
198
+ Args:
199
+ detectors: list[Readable] detectors
200
+ bimorph: BimorphMirror to move
201
+ slit: Slits
202
+ voltage_increment: float voltage increment applied to each bimorph electrode
203
+ active_dimension: SlitDimension that slit will move in (X or Y)
204
+ active_slit_center_start: float start position of center of slit in active dimension
205
+ active_slit_center_end: float final position of center of slit in active dimension
206
+ active_slit_size: float size of slit in active dimension
207
+ inactive_slit_center: float center of slit in inactive dimension
208
+ inactive_slit_size: float size of slit in inactive dimension
209
+ number_of_slit_positions: int number of slit positions per pencil beam scan
210
+ bimorph_settle_time: float time in seconds to wait after bimorph move
211
+ slit_settle_time: float time in seconds to wait after slit move
212
+ initial_voltage_list: optional list[float] starting voltages for bimorph (defaults to current voltages)
213
+ metadata: optional dict[str, Any] metadata to add to start document
214
+ """
215
+
216
+ _metadata = {
217
+ "plan_args": {
218
+ "detectors": {det.name for det in detectors},
219
+ "mirror": mirror.name,
220
+ "slits": slits.name,
221
+ "voltage_increment": voltage_increment,
222
+ "active_dimension": active_dimension,
223
+ "active_slit_center_start": active_slit_center_start,
224
+ "active_slit_center_end": active_slit_center_end,
225
+ "active_slit_size": active_slit_size,
226
+ "inactive_slit_center": inactive_slit_center,
227
+ "inactive_slit_size": inactive_slit_size,
228
+ "number_of_slit_positions": number_of_slit_positions,
229
+ "bimorph_settle_time": bimorph_settle_time,
230
+ "slit_settle_time": slit_settle_time,
231
+ "initial_voltage_list": initial_voltage_list,
232
+ },
233
+ "plan_name": "bimorph_optimisation",
234
+ "shape": [len(mirror.channels), number_of_slit_positions],
235
+ **(metadata or {}),
236
+ }
237
+
238
+ state = yield from capture_bimorph_state(mirror, slits)
239
+
240
+ # If a starting set of voltages is not provided, default to current:
241
+ initial_voltage_list = initial_voltage_list or state.voltages
242
+
243
+ bimorph_positions = bimorph_position_generator(
244
+ initial_voltage_list, voltage_increment
245
+ )
246
+
247
+ validate_bimorph_plan(initial_voltage_list, voltage_increment, 1000, 500)
248
+
249
+ inactive_dimension = (
250
+ SlitDimension.Y if active_dimension == SlitDimension.X else SlitDimension.X
251
+ )
252
+
253
+ @bpp.run_decorator(md=_metadata)
254
+ @bpp.stage_decorator((*detectors, mirror, slits))
255
+ def outer_scan():
256
+ """Outer plan stub, which moves mirror and calls inner_scan."""
257
+ for detector in detectors:
258
+ if isinstance(detector, Preparable):
259
+ yield from bps.prepare(detector, TriggerInfo(), wait=True)
260
+
261
+ stream_name = "0"
262
+ yield from bps.declare_stream(*detectors, mirror, slits, name=stream_name)
263
+
264
+ # Move slits into starting position:
265
+ yield from move_slits(
266
+ slits, active_dimension, active_slit_size, active_slit_center_start
267
+ )
268
+ yield from move_slits(
269
+ slits, inactive_dimension, inactive_slit_size, inactive_slit_center
270
+ )
271
+ yield from bps.sleep(slit_settle_time)
272
+
273
+ for bimorph_position in bimorph_positions:
274
+ yield from bps.mv(
275
+ mirror, # type: ignore
276
+ bimorph_position, # type: ignore
277
+ )
278
+ yield from bps.sleep(bimorph_settle_time)
279
+
280
+ yield from bps.declare_stream(*detectors, mirror, slits, name=stream_name)
281
+
282
+ yield from inner_scan(
283
+ detectors,
284
+ mirror,
285
+ slits,
286
+ active_dimension,
287
+ active_slit_center_start,
288
+ active_slit_center_end,
289
+ active_slit_size,
290
+ number_of_slit_positions,
291
+ slit_settle_time,
292
+ stream_name,
293
+ )
294
+
295
+ stream_name = str(int(stream_name) + 1)
296
+
297
+ yield from outer_scan()
298
+
299
+ yield from restore_bimorph_state(mirror, slits, state)
300
+
301
+
302
+ def inner_scan(
303
+ detectors: list[Readable],
304
+ mirror: BimorphMirror,
305
+ slits: Slits,
306
+ active_dimension: SlitDimension,
307
+ active_slit_center_start: float,
308
+ active_slit_center_end: float,
309
+ active_slit_size: float,
310
+ number_of_slit_positions: int,
311
+ slit_settle_time: float,
312
+ stream_name: str,
313
+ ):
314
+ """Inner plan stub, which moves Slits and performs a read.
315
+
316
+ Args:
317
+ mirror: BimorphMirror to move
318
+ slit: Slits
319
+ oav: oav on-axis viewer
320
+ active_dimension: SlitDimension that slit will move in (X or Y)
321
+ active_slit_center_start: float start position of center of slit in active dimension
322
+ active_slit_center_end: float final position of center of slit in active dimension
323
+ active_slit_size: float size of slit in active dimension
324
+ number_of_slit_positions: int number of slit positions per pencil beam scan
325
+ slit_settle_time: float time in seconds to wait after slit move
326
+ stream_name: str name to pass to trigger_and_read
327
+ """
328
+ for value in linspace(
329
+ active_slit_center_start, active_slit_center_end, number_of_slit_positions
330
+ ):
331
+ yield from move_slits(slits, active_dimension, active_slit_size, value)
332
+ yield from bps.sleep(slit_settle_time)
333
+ yield from bps.trigger_and_read([*detectors, mirror, slits], name=stream_name)
@@ -35,14 +35,23 @@ def test_shutter_can_be_created(fake_shutter: HutchShutter):
35
35
  assert isinstance(fake_shutter, HutchShutter)
36
36
 
37
37
 
38
- async def test_shutter_raises_error_on_set_if_hutch_not_interlocked(
38
+ async def test_shutter_raises_error_on_set_if_hutch_not_interlocked_on_open(
39
39
  fake_shutter: HutchShutter,
40
40
  ):
41
41
  set_mock_value(fake_shutter.interlock.status, 1)
42
42
  assert await fake_shutter.interlock.shutter_safe_to_operate() is False
43
43
 
44
44
  with pytest.raises(ShutterNotSafeToOperateError):
45
- await fake_shutter.set(ShutterDemand.CLOSE)
45
+ await fake_shutter.set(ShutterDemand.OPEN)
46
+
47
+
48
+ async def test_shutter_does_not_error_on_close_even_if_hutch_not_interlocked(
49
+ fake_shutter: HutchShutter,
50
+ ):
51
+ set_mock_value(fake_shutter.interlock.status, 1)
52
+ assert await fake_shutter.interlock.shutter_safe_to_operate() is False
53
+
54
+ await fake_shutter.set(ShutterDemand.CLOSE)
46
55
 
47
56
 
48
57
  @pytest.mark.parametrize(