dls-dodal 1.35.0__tar.gz → 1.36.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 (369) hide show
  1. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/PKG-INFO +3 -1
  2. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/pyproject.toml +2 -0
  3. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dls_dodal.egg-info/PKG-INFO +3 -1
  4. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dls_dodal.egg-info/SOURCES.txt +15 -5
  5. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dls_dodal.egg-info/requires.txt +2 -0
  6. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/_version.py +2 -2
  7. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/eiger.py +88 -49
  8. dls_dodal-1.35.0/src/dodal/plans/data_session_metadata.py → dls_dodal-1.36.0/src/dodal/plan_stubs/data_session.py +2 -2
  9. dls_dodal-1.35.0/src/dodal/plans/motor_util_plans.py → dls_dodal-1.36.0/src/dodal/plan_stubs/motor_utils.py +2 -2
  10. dls_dodal-1.36.0/src/dodal/plan_stubs/wrapped.py +150 -0
  11. dls_dodal-1.36.0/src/dodal/plans/__init__.py +4 -0
  12. dls_dodal-1.36.0/src/dodal/plans/scanspec.py +66 -0
  13. dls_dodal-1.36.0/src/dodal/plans/wrapped.py +57 -0
  14. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_eiger.py +11 -2
  15. {dls_dodal-1.35.0/tests/plans → dls_dodal-1.36.0/tests/plan_stubs}/test_motor_util_plans.py +7 -7
  16. {dls_dodal-1.35.0/tests/plans → dls_dodal-1.36.0/tests/plan_stubs}/test_topup_plan.py +9 -9
  17. dls_dodal-1.36.0/tests/plan_stubs/test_wrapped_stubs.py +144 -0
  18. dls_dodal-1.36.0/tests/plans/conftest.py +40 -0
  19. dls_dodal-1.36.0/tests/plans/test_compliance.py +78 -0
  20. dls_dodal-1.36.0/tests/plans/test_scanspec.py +183 -0
  21. dls_dodal-1.36.0/tests/plans/test_wrapped.py +159 -0
  22. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/preprocessors/test_filesystem_metadata.py +1 -1
  23. dls_dodal-1.36.0/tests/unit_tests/__init__.py +0 -0
  24. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.copier-answers.yml +0 -0
  25. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.devcontainer/devcontainer.json +0 -0
  26. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/CONTRIBUTING.md +0 -0
  27. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/ISSUE_TEMPLATE/issue_template.md +0 -0
  28. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/actions/install_requirements/action.yml +0 -0
  29. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/dependabot.yml +0 -0
  30. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/pages/index.html +0 -0
  31. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/pages/make_switcher.py +0 -0
  32. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/workflows/_check.yml +0 -0
  33. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/workflows/_dist.yml +0 -0
  34. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/workflows/_docs.yml +0 -0
  35. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/workflows/_pypi.yml +0 -0
  36. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/workflows/_release.yml +0 -0
  37. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/workflows/_test.yml +0 -0
  38. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/workflows/_tox.yml +0 -0
  39. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/workflows/ci.yml +0 -0
  40. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.github/workflows/periodic.yml +0 -0
  41. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.gitignore +0 -0
  42. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.pre-commit-config.yaml +0 -0
  43. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.vscode/extensions.json +0 -0
  44. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.vscode/launch.json +0 -0
  45. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.vscode/settings.json +0 -0
  46. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/.vscode/tasks.json +0 -0
  47. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/Dockerfile +0 -0
  48. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/LICENSE +0 -0
  49. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/README.md +0 -0
  50. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/catalog-info.yaml +0 -0
  51. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/conftest.py +0 -0
  52. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/_api.rst +0 -0
  53. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/_templates/autosummary/class.rst +0 -0
  54. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/_templates/autosummary/module.rst +0 -0
  55. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/_templates/custom-module-template.rst +0 -0
  56. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/assets/zocalo.png +0 -0
  57. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/conf.py +0 -0
  58. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  59. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  60. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/explanations/decisions/COPYME +0 -0
  61. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/explanations/decisions.md +0 -0
  62. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/explanations.md +0 -0
  63. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/genindex.md +0 -0
  64. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/build-docs.md +0 -0
  65. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/contribute.md +0 -0
  66. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/coverage.md +0 -0
  67. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/create-beamline.rst +0 -0
  68. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/dev-install.md +0 -0
  69. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/excalidraw.md +0 -0
  70. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/lint.md +0 -0
  71. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/lock-requirements.md +0 -0
  72. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/make-new-ophyd-async-device.rst +0 -0
  73. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/make-release.md +0 -0
  74. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/move-code.rst +0 -0
  75. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/pypi.md +0 -0
  76. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/run-tests.md +0 -0
  77. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/static-analysis.md +0 -0
  78. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/update-template.md +0 -0
  79. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/write-tests.md +0 -0
  80. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to/zocalo.rst +0 -0
  81. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/how-to.md +0 -0
  82. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/images/dls-logo.svg +0 -0
  83. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/images/excalidraw-example.svg +0 -0
  84. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/index.md +0 -0
  85. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/reference/device-standards.rst +0 -0
  86. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/reference/standards.rst +0 -0
  87. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/reference.md +0 -0
  88. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/tutorials/get_started.rst +0 -0
  89. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/tutorials/installation.md +0 -0
  90. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/docs/tutorials.md +0 -0
  91. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/pull_request_template.md +0 -0
  92. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/setup.cfg +0 -0
  93. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/__init__.py +0 -0
  94. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dls_dodal.egg-info/dependency_links.txt +0 -0
  95. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dls_dodal.egg-info/entry_points.txt +0 -0
  96. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dls_dodal.egg-info/top_level.txt +0 -0
  97. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/__init__.py +0 -0
  98. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/__main__.py +0 -0
  99. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/adsim.py +0 -0
  100. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamline_specific_utils/__init__.py +0 -0
  101. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamline_specific_utils/i03.py +0 -0
  102. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/README.md +0 -0
  103. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/__init__.py +0 -0
  104. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/b01_1.py +0 -0
  105. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/i03.py +0 -0
  106. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/i04.py +0 -0
  107. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/i10.py +0 -0
  108. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/i13_1.py +0 -0
  109. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/i20_1.py +0 -0
  110. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/i22.py +0 -0
  111. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/i23.py +0 -0
  112. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/i24.py +0 -0
  113. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/p38.py +0 -0
  114. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/p45.py +0 -0
  115. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/p99.py +0 -0
  116. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/beamlines/training_rig.py +0 -0
  117. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/cli.py +0 -0
  118. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/common/__init__.py +0 -0
  119. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/common/beamlines/__init__.py +0 -0
  120. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/common/beamlines/beamline_parameters.py +0 -0
  121. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/common/beamlines/beamline_utils.py +0 -0
  122. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/common/beamlines/device_helpers.py +0 -0
  123. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/common/coordination.py +0 -0
  124. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/common/crystal_metadata.py +0 -0
  125. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/common/maths.py +0 -0
  126. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/common/signal_utils.py +0 -0
  127. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/common/types.py +0 -0
  128. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/common/udc_directory_provider.py +0 -0
  129. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/common/visit.py +0 -0
  130. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/CTAB.py +0 -0
  131. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/__init__.py +0 -0
  132. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/adsim.py +0 -0
  133. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/aperture.py +0 -0
  134. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/aperturescatterguard.py +0 -0
  135. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/apple2_undulator.py +0 -0
  136. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/areadetector/__init__.py +0 -0
  137. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/areadetector/adaravis.py +0 -0
  138. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/areadetector/adsim.py +0 -0
  139. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/areadetector/adutils.py +0 -0
  140. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/areadetector/plugins/CAM.py +0 -0
  141. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/areadetector/plugins/MJPG.py +0 -0
  142. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/attenuator.py +0 -0
  143. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/backlight.py +0 -0
  144. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/cryostream.py +0 -0
  145. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/dcm.py +0 -0
  146. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/detector/__init__.py +0 -0
  147. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/detector/det_dim_constants.py +0 -0
  148. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/detector/det_dist_to_beam_converter.py +0 -0
  149. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/detector/det_resolution.py +0 -0
  150. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/detector/detector.py +0 -0
  151. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/detector/detector_motion.py +0 -0
  152. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/diamond_filter.py +0 -0
  153. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/eiger_odin.py +0 -0
  154. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/fast_grid_scan.py +0 -0
  155. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/fluorescence_detector_motion.py +0 -0
  156. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/flux.py +0 -0
  157. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/focusing_mirror.py +0 -0
  158. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/hutch_shutter.py +0 -0
  159. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i03/__init__.py +0 -0
  160. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i04/transfocator.py +0 -0
  161. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i10/i10_apple2.py +0 -0
  162. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i10/i10_setting_data.py +0 -0
  163. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i20_1/__init__.py +0 -0
  164. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i22/dcm.py +0 -0
  165. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i22/fswitch.py +0 -0
  166. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i22/nxsas.py +0 -0
  167. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i24/__init__.py +0 -0
  168. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i24/aperture.py +0 -0
  169. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i24/beamstop.py +0 -0
  170. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i24/dcm.py +0 -0
  171. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i24/dual_backlight.py +0 -0
  172. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i24/i24_detector_motion.py +0 -0
  173. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i24/pmac.py +0 -0
  174. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/i24/vgonio.py +0 -0
  175. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/ipin.py +0 -0
  176. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/linkam3.py +0 -0
  177. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/logging_ophyd_device.py +0 -0
  178. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/motors.py +0 -0
  179. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/__init__.py +0 -0
  180. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/microns_for_zoom_levels.json +0 -0
  181. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/oav_calculations.py +0 -0
  182. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/oav_detector.py +0 -0
  183. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/oav_parameters.py +0 -0
  184. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/oav_to_redis_forwarder.py +0 -0
  185. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/pin_image_recognition/__init__.py +0 -0
  186. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/pin_image_recognition/manual_test.py +0 -0
  187. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/pin_image_recognition/utils.py +0 -0
  188. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/snapshots/grid_overlay.py +0 -0
  189. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/snapshots/snapshot_with_beam_centre.py +0 -0
  190. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/snapshots/snapshot_with_grid.py +0 -0
  191. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/oav/utils.py +0 -0
  192. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/p45.py +0 -0
  193. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/p99/__init__.py +0 -0
  194. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/p99/sample_stage.py +0 -0
  195. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/pgm.py +0 -0
  196. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/qbpm.py +0 -0
  197. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/robot.py +0 -0
  198. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/s4_slit_gaps.py +0 -0
  199. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/scatterguard.py +0 -0
  200. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/scintillator.py +0 -0
  201. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/slits.py +0 -0
  202. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/smargon.py +0 -0
  203. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/status.py +0 -0
  204. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/synchrotron.py +0 -0
  205. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/tetramm.py +0 -0
  206. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/thawer.py +0 -0
  207. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/training_rig/__init__.py +0 -0
  208. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/training_rig/sample_stage.py +0 -0
  209. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/turbo_slit.py +0 -0
  210. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/undulator.py +0 -0
  211. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/undulator_dcm.py +0 -0
  212. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/util/__init__.py +0 -0
  213. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/util/adjuster_plans.py +0 -0
  214. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/util/epics_util.py +0 -0
  215. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/util/lookup_tables.py +0 -0
  216. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/util/motor_utils.py +0 -0
  217. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/util/save_panda.py +0 -0
  218. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/util/test_utils.py +0 -0
  219. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/watsonmarlow323_pump.py +0 -0
  220. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/webcam.py +0 -0
  221. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/xbpm_feedback.py +0 -0
  222. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/xspress3/xspress3.py +0 -0
  223. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/xspress3/xspress3_channel.py +0 -0
  224. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/zebra.py +0 -0
  225. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/zebra_controlled_shutter.py +0 -0
  226. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/zocalo/__init__.py +0 -0
  227. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/zocalo/zocalo_constants.py +0 -0
  228. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/zocalo/zocalo_interaction.py +0 -0
  229. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/devices/zocalo/zocalo_results.py +0 -0
  230. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/log.py +0 -0
  231. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/parameters/experiment_parameter_base.py +0 -0
  232. {dls_dodal-1.35.0/system_tests → dls_dodal-1.36.0/src/dodal/plan_stubs}/__init__.py +0 -0
  233. {dls_dodal-1.35.0/src/dodal/plans → dls_dodal-1.36.0/src/dodal/plan_stubs}/check_topup.py +0 -0
  234. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/src/dodal/utils.py +0 -0
  235. {dls_dodal-1.35.0/tests → dls_dodal-1.36.0/system_tests}/__init__.py +0 -0
  236. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/system_tests/test_aperturescatterguard_system.py +0 -0
  237. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/system_tests/test_eiger_system.py +0 -0
  238. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/system_tests/test_gridscan_system.py +0 -0
  239. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/system_tests/test_oav_system.py +0 -0
  240. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/system_tests/test_oav_to_redis_system.py +0 -0
  241. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/system_tests/test_slit_gaps_system.py +0 -0
  242. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/system_tests/test_smargon_system.py +0 -0
  243. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/system_tests/test_synchrotron_system.py +0 -0
  244. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/system_tests/test_undulator_system.py +0 -0
  245. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/system_tests/test_zebra_system.py +0 -0
  246. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/system_tests/test_zocalo_results.py +0 -0
  247. {dls_dodal-1.35.0/tests/beamlines → dls_dodal-1.36.0/tests}/__init__.py +0 -0
  248. {dls_dodal-1.35.0/tests/beamlines/unit_tests → dls_dodal-1.36.0/tests/beamlines}/__init__.py +0 -0
  249. {dls_dodal-1.35.0/tests/common → dls_dodal-1.36.0/tests/beamlines/unit_tests}/__init__.py +0 -0
  250. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/beamlines/unit_tests/test_i03.py +0 -0
  251. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/beamlines/unit_tests/test_i24.py +0 -0
  252. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/beamlines/unit_tests/test_mapping.py +0 -0
  253. {dls_dodal-1.35.0/tests/common/beamlines → dls_dodal-1.36.0/tests/common}/__init__.py +0 -0
  254. {dls_dodal-1.35.0/tests/devices → dls_dodal-1.36.0/tests/common/beamlines}/__init__.py +0 -0
  255. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/common/beamlines/test_beamline_parameters.py +0 -0
  256. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/common/beamlines/test_beamline_utils.py +0 -0
  257. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/common/beamlines/test_device_helpers.py +0 -0
  258. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/common/beamlines/test_device_instantiation.py +0 -0
  259. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/common/test_coordination.py +0 -0
  260. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/common/test_crystal_metadata.py +0 -0
  261. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/common/test_maths.py +0 -0
  262. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/common/test_udc_directory_provider.py +0 -0
  263. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/common/test_visit.py +0 -0
  264. {dls_dodal-1.35.0/tests/devices/i04 → dls_dodal-1.36.0/tests/devices}/__init__.py +0 -0
  265. {dls_dodal-1.35.0/tests/devices/unit_tests → dls_dodal-1.36.0/tests/devices/i04}/__init__.py +0 -0
  266. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/i04/test_transfocator.py +0 -0
  267. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/i10/lookupTables/IDEnergy2GapCalibrations.csv +0 -0
  268. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/i10/lookupTables/IDEnergy2PhaseCalibrations.csv +0 -0
  269. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdd.pkl +0 -0
  270. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdu.pkl +0 -0
  271. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidd.pkl +0 -0
  272. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidu.pkl +0 -0
  273. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/i10/test_i10Apple2.py +0 -0
  274. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/i22/test_dcm.py +0 -0
  275. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/i22/test_fswitch.py +0 -0
  276. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/i22/test_metadataholder.py +0 -0
  277. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/test_diamond_filter.py +0 -0
  278. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/training_rig/test_sample_stage.py +0 -0
  279. {dls_dodal-1.35.0/tests/devices/unit_tests/i24 → dls_dodal-1.36.0/tests/devices/unit_tests}/__init__.py +0 -0
  280. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/conftest.py +0 -0
  281. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/detector/test_det_dim_constants.py +0 -0
  282. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/detector/test_det_resolution.py +0 -0
  283. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/detector/test_detector.py +0 -0
  284. {dls_dodal-1.35.0/tests/devices/unit_tests/oav → dls_dodal-1.36.0/tests/devices/unit_tests/i24}/__init__.py +0 -0
  285. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/i24/test_dual_backlight.py +0 -0
  286. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/i24/test_pmac.py +0 -0
  287. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/i24/test_vgonio.py +0 -0
  288. {dls_dodal-1.35.0/tests/devices/unit_tests/util → dls_dodal-1.36.0/tests/devices/unit_tests/oav}/__init__.py +0 -0
  289. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/oav/conftest.py +0 -0
  290. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect.py +0 -0
  291. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect_utils.py +0 -0
  292. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/oav/test_grid_overlay.py +0 -0
  293. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/oav/test_oav.py +0 -0
  294. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/oav/test_oav_parameters.py +0 -0
  295. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/oav/test_oav_to_redis_forwarder.py +0 -0
  296. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/oav/test_oav_utils.py +0 -0
  297. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/oav/test_snapshots.py +0 -0
  298. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/p99/test_p99_stage.py +0 -0
  299. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_OAVCentring.json +0 -0
  300. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_aperture.py +0 -0
  301. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_aperture_scatterguard.py +0 -0
  302. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_apple2_undulator.py +0 -0
  303. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_attenuator.py +0 -0
  304. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_backlight.py +0 -0
  305. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_bart_robot.py +0 -0
  306. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_beam_converter.py +0 -0
  307. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_beamline_undulator_to_gap_lookup_table.txt +0 -0
  308. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_daq_configuration/domain/beamlineParameters +0 -0
  309. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Pitch_converter.txt +0 -0
  310. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt +0 -0
  311. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_dcm.py +0 -0
  312. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_display.configuration +0 -0
  313. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_focusing_mirror.py +0 -0
  314. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_gridscan.py +0 -0
  315. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_hutch_shutter.py +0 -0
  316. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_jCameraManZoomLevels.xml +0 -0
  317. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_linkam3.py +0 -0
  318. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_lookup_table.txt +0 -0
  319. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_lookup_table_2.txt +0 -0
  320. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_odin.py +0 -0
  321. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_qbpm.py +0 -0
  322. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_shutter.py +0 -0
  323. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_slits.py +0 -0
  324. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_smargon.py +0 -0
  325. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_status.py +0 -0
  326. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_synchrotron.py +0 -0
  327. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_tetramm.py +0 -0
  328. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_thawer.py +0 -0
  329. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_undulator.py +0 -0
  330. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_undulator_dcm.py +0 -0
  331. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_utils.py +0 -0
  332. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_watsonmarlow323_pump.py +0 -0
  333. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_webcam.py +0 -0
  334. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_xbpm_feedback.py +0 -0
  335. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_xspress3.py +0 -0
  336. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_zebra.py +0 -0
  337. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_zocalo_interaction.py +0 -0
  338. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/test_zocalo_results.py +0 -0
  339. {dls_dodal-1.35.0/tests/fake_zocalo → dls_dodal-1.36.0/tests/devices/unit_tests/util}/__init__.py +0 -0
  340. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/util/test_adjuster_plans.py +0 -0
  341. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/util/test_beamline_specific_utils.py +0 -0
  342. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/util/test_lookup_tables.py +0 -0
  343. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/devices/unit_tests/util/test_save_panda.py +0 -0
  344. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/fake_beamline.py +0 -0
  345. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/fake_beamline_all_devices_raise_exception.py +0 -0
  346. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/fake_beamline_broken_dependency.py +0 -0
  347. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/fake_beamline_dependencies.py +0 -0
  348. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/fake_beamline_disordered_dependencies.py +0 -0
  349. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/fake_beamline_misbehaving_builtins.py +0 -0
  350. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/fake_beamline_some_devices_working.py +0 -0
  351. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/fake_zocalo/README.rst +0 -0
  352. {dls_dodal-1.35.0/tests/unit_tests → dls_dodal-1.36.0/tests/fake_zocalo}/__init__.py +0 -0
  353. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/fake_zocalo/__main__.py +0 -0
  354. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/fake_zocalo/dls_start_fake_zocalo.sh +0 -0
  355. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_cli.py +0 -0
  356. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_data/bad_beamlineParameters +0 -0
  357. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_data/i04_beamlineParameters +0 -0
  358. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_data/test_beamline_dcm_roll_converter.txt +0 -0
  359. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_data/test_beamline_dcm_roll_converter_non_monotonic.txt +0 -0
  360. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_data/test_beamline_dcm_roll_converter_reversed.txt +0 -0
  361. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_data/test_beamline_parameters.txt +0 -0
  362. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_data/test_det_dist_converter.txt +0 -0
  363. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_data/test_images/oav_snapshot_expected.png +0 -0
  364. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_data/test_images/oav_snapshot_test.png +0 -0
  365. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_data/topup_long_delay.txt +0 -0
  366. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_data/topup_short_params.txt +0 -0
  367. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/test_utils.py +0 -0
  368. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/unit_tests/test_cli.py +0 -0
  369. {dls_dodal-1.35.0 → dls_dodal-1.36.0}/tests/unit_tests/test_log.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dls-dodal
3
- Version: 1.35.0
3
+ Version: 1.36.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
@@ -233,11 +233,13 @@ Requires-Dist: aiofiles
233
233
  Requires-Dist: aiohttp
234
234
  Requires-Dist: redis
235
235
  Requires-Dist: deepdiff
236
+ Requires-Dist: scanspec>=0.7.3
236
237
  Provides-Extra: dev
237
238
  Requires-Dist: black; extra == "dev"
238
239
  Requires-Dist: diff-cover; extra == "dev"
239
240
  Requires-Dist: mypy; extra == "dev"
240
241
  Requires-Dist: myst-parser; extra == "dev"
242
+ Requires-Dist: ophyd_async[sim]; extra == "dev"
241
243
  Requires-Dist: pipdeptree; extra == "dev"
242
244
  Requires-Dist: pre-commit; extra == "dev"
243
245
  Requires-Dist: psutil; extra == "dev"
@@ -32,6 +32,7 @@ dependencies = [
32
32
  "aiohttp",
33
33
  "redis",
34
34
  "deepdiff",
35
+ "scanspec>=0.7.3",
35
36
  ]
36
37
 
37
38
  dynamic = ["version"]
@@ -47,6 +48,7 @@ dev = [
47
48
  # Commented out due to dependency version conflict with pydantic 1.x
48
49
  # "copier",
49
50
  "myst-parser",
51
+ "ophyd_async[sim]",
50
52
  "pipdeptree",
51
53
  "pre-commit",
52
54
  "psutil",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dls-dodal
3
- Version: 1.35.0
3
+ Version: 1.36.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
@@ -233,11 +233,13 @@ Requires-Dist: aiofiles
233
233
  Requires-Dist: aiohttp
234
234
  Requires-Dist: redis
235
235
  Requires-Dist: deepdiff
236
+ Requires-Dist: scanspec>=0.7.3
236
237
  Provides-Extra: dev
237
238
  Requires-Dist: black; extra == "dev"
238
239
  Requires-Dist: diff-cover; extra == "dev"
239
240
  Requires-Dist: mypy; extra == "dev"
240
241
  Requires-Dist: myst-parser; extra == "dev"
242
+ Requires-Dist: ophyd_async[sim]; extra == "dev"
241
243
  Requires-Dist: pipdeptree; extra == "dev"
242
244
  Requires-Dist: pre-commit; extra == "dev"
243
245
  Requires-Dist: psutil; extra == "dev"
@@ -212,9 +212,14 @@ src/dodal/devices/zocalo/zocalo_constants.py
212
212
  src/dodal/devices/zocalo/zocalo_interaction.py
213
213
  src/dodal/devices/zocalo/zocalo_results.py
214
214
  src/dodal/parameters/experiment_parameter_base.py
215
- src/dodal/plans/check_topup.py
216
- src/dodal/plans/data_session_metadata.py
217
- src/dodal/plans/motor_util_plans.py
215
+ src/dodal/plan_stubs/__init__.py
216
+ src/dodal/plan_stubs/check_topup.py
217
+ src/dodal/plan_stubs/data_session.py
218
+ src/dodal/plan_stubs/motor_utils.py
219
+ src/dodal/plan_stubs/wrapped.py
220
+ src/dodal/plans/__init__.py
221
+ src/dodal/plans/scanspec.py
222
+ src/dodal/plans/wrapped.py
218
223
  system_tests/__init__.py
219
224
  system_tests/test_aperturescatterguard_system.py
220
225
  system_tests/test_eiger_system.py
@@ -338,8 +343,13 @@ tests/fake_zocalo/README.rst
338
343
  tests/fake_zocalo/__init__.py
339
344
  tests/fake_zocalo/__main__.py
340
345
  tests/fake_zocalo/dls_start_fake_zocalo.sh
341
- tests/plans/test_motor_util_plans.py
342
- tests/plans/test_topup_plan.py
346
+ tests/plan_stubs/test_motor_util_plans.py
347
+ tests/plan_stubs/test_topup_plan.py
348
+ tests/plan_stubs/test_wrapped_stubs.py
349
+ tests/plans/conftest.py
350
+ tests/plans/test_compliance.py
351
+ tests/plans/test_scanspec.py
352
+ tests/plans/test_wrapped.py
343
353
  tests/preprocessors/test_filesystem_metadata.py
344
354
  tests/test_data/bad_beamlineParameters
345
355
  tests/test_data/i04_beamlineParameters
@@ -17,12 +17,14 @@ aiofiles
17
17
  aiohttp
18
18
  redis
19
19
  deepdiff
20
+ scanspec>=0.7.3
20
21
 
21
22
  [dev]
22
23
  black
23
24
  diff-cover
24
25
  mypy
25
26
  myst-parser
27
+ ophyd_async[sim]
26
28
  pipdeptree
27
29
  pre-commit
28
30
  psutil
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.35.0'
16
- __version_tuple__ = version_tuple = (1, 35, 0)
15
+ __version__ = version = '1.36.0'
16
+ __version_tuple__ = version_tuple = (1, 36, 0)
@@ -1,4 +1,5 @@
1
1
  # type: ignore # Eiger will soon be ophyd-async https://github.com/DiamondLightSource/dodal/issues/700
2
+ from dataclasses import dataclass
2
3
  from enum import Enum
3
4
 
4
5
  from ophyd import Component, Device, EpicsSignalRO, Signal
@@ -14,6 +15,15 @@ from dodal.log import LOGGER
14
15
  FREE_RUN_MAX_IMAGES = 1000000
15
16
 
16
17
 
18
+ @dataclass
19
+ class EigerTimeouts:
20
+ stale_params_timeout: int = 60
21
+ general_status_timeout: int = 10
22
+ meta_file_ready_timeout: int = 30
23
+ all_frames_timeout: int = 120
24
+ arming_timeout: int = 60
25
+
26
+
17
27
  class InternalEigerTriggerMode(Enum):
18
28
  INTERNAL_SERIES = 0
19
29
  INTERNAL_ENABLE = 1
@@ -21,6 +31,17 @@ class InternalEigerTriggerMode(Enum):
21
31
  EXTERNAL_ENABLE = 3
22
32
 
23
33
 
34
+ AVAILABLE_TIMEOUTS = {
35
+ "i03": EigerTimeouts(
36
+ stale_params_timeout=60,
37
+ general_status_timeout=10,
38
+ meta_file_ready_timeout=30,
39
+ all_frames_timeout=120, # Long timeout for meta file to compensate for filesystem issues
40
+ arming_timeout=60,
41
+ )
42
+ }
43
+
44
+
24
45
  class EigerDetector(Device):
25
46
  class ArmingSignal(Signal):
26
47
  def set(self, value, *, timeout=None, settle_time=None, **kwargs):
@@ -34,13 +55,6 @@ class EigerDetector(Device):
34
55
  stale_params = Component(EpicsSignalRO, "CAM:StaleParameters_RBV")
35
56
  bit_depth = Component(EpicsSignalRO, "CAM:BitDepthImage_RBV")
36
57
 
37
- STALE_PARAMS_TIMEOUT = 60
38
- GENERAL_STATUS_TIMEOUT = 10
39
- # Long timeout for meta file to compensate for filesystem issues
40
- META_FILE_READY_TIMEOUT = 30
41
- ALL_FRAMES_TIMEOUT = 120
42
- ARMING_TIMEOUT = 60
43
-
44
58
  filewriters_finished: StatusBase
45
59
 
46
60
  detector_params: DetectorParams | None = None
@@ -48,13 +62,20 @@ class EigerDetector(Device):
48
62
  arming_status = Status()
49
63
  arming_status.set_finished()
50
64
 
65
+ def __init__(self, beamline: str = "i03", *args, **kwargs):
66
+ super().__init__(*args, **kwargs)
67
+ self.beamline = beamline
68
+ # using i03 timeouts as default
69
+ self.timeouts = AVAILABLE_TIMEOUTS.get(beamline, AVAILABLE_TIMEOUTS["i03"])
70
+
51
71
  @classmethod
52
72
  def with_params(
53
73
  cls,
54
74
  params: DetectorParams,
55
75
  name: str = "EigerDetector",
76
+ beamline: str = "i03",
56
77
  ):
57
- det = cls(name=name)
78
+ det = cls(name=name, beamline=beamline)
58
79
  det.set_detector_parameters(params)
59
80
  return det
60
81
 
@@ -82,7 +103,7 @@ class EigerDetector(Device):
82
103
  def async_stage(self):
83
104
  self.odin.nodes.clear_odin_errors()
84
105
  status_ok, error_message = self.odin.wait_for_odin_initialised(
85
- self.GENERAL_STATUS_TIMEOUT
106
+ self.timeouts.general_status_timeout
86
107
  )
87
108
  if not status_ok:
88
109
  raise Exception(f"Odin not initialised: {error_message}")
@@ -96,14 +117,14 @@ class EigerDetector(Device):
96
117
  def wait_on_arming_if_started(self):
97
118
  if not self.arming_status.done:
98
119
  LOGGER.info("Waiting for arming to finish")
99
- self.arming_status.wait(self.ARMING_TIMEOUT)
120
+ self.arming_status.wait(self.timeouts.arming_timeout)
100
121
 
101
122
  def stage(self):
102
123
  self.wait_on_arming_if_started()
103
124
  if not self.is_armed():
104
125
  LOGGER.info("Eiger not armed, arming")
105
126
 
106
- self.async_stage().wait(timeout=self.ARMING_TIMEOUT)
127
+ self.async_stage().wait(timeout=self.timeouts.arming_timeout)
107
128
 
108
129
  def stop_odin_when_all_frames_collected(self):
109
130
  LOGGER.info("Waiting on all frames")
@@ -111,7 +132,7 @@ class EigerDetector(Device):
111
132
  await_value(
112
133
  self.odin.file_writer.num_captured,
113
134
  self.detector_params.full_number_of_images,
114
- ).wait(self.ALL_FRAMES_TIMEOUT)
135
+ ).wait(self.timeouts.all_frames_timeout)
115
136
  finally:
116
137
  LOGGER.info("Stopping Odin")
117
138
  self.odin.stop().wait(5)
@@ -124,7 +145,9 @@ class EigerDetector(Device):
124
145
  # In free run mode we have to manually stop odin
125
146
  self.stop_odin_when_all_frames_collected()
126
147
 
127
- self.odin.file_writer.start_timeout.set(1).wait(self.GENERAL_STATUS_TIMEOUT)
148
+ self.odin.file_writer.start_timeout.set(1).wait(
149
+ self.timeouts.general_status_timeout
150
+ )
128
151
  LOGGER.info("Waiting on filewriter to finish")
129
152
  self.filewriters_finished.wait(30)
130
153
 
@@ -132,7 +155,7 @@ class EigerDetector(Device):
132
155
  finally:
133
156
  self.disarm_detector()
134
157
  status_ok = self.odin.check_and_wait_for_odin_state(
135
- self.GENERAL_STATUS_TIMEOUT
158
+ self.timeouts.general_status_timeout
136
159
  )
137
160
  self.disable_roi_mode()
138
161
  return status_ok
@@ -142,10 +165,12 @@ class EigerDetector(Device):
142
165
  LOGGER.info("Eiger stop() called - cleaning up...")
143
166
  self.wait_on_arming_if_started()
144
167
  stop_status = self.odin.stop()
145
- self.odin.file_writer.start_timeout.set(1).wait(self.GENERAL_STATUS_TIMEOUT)
168
+ self.odin.file_writer.start_timeout.set(1).wait(
169
+ self.timeouts.general_status_timeout
170
+ )
146
171
  self.disarm_detector()
147
172
  stop_status &= self.disable_roi_mode()
148
- stop_status.wait(self.GENERAL_STATUS_TIMEOUT)
173
+ stop_status.wait(self.timeouts.general_status_timeout)
149
174
  # See https://github.com/DiamondLightSource/hyperion/issues/1395
150
175
  LOGGER.info("Turning off Eiger dev/shm streaming")
151
176
  self.odin.fan.dev_shm_enable.set(0).wait()
@@ -166,19 +191,19 @@ class EigerDetector(Device):
166
191
  )
167
192
 
168
193
  status = self.cam.roi_mode.set(
169
- 1 if enable else 0, timeout=self.GENERAL_STATUS_TIMEOUT
194
+ 1 if enable else 0, timeout=self.timeouts.general_status_timeout
170
195
  )
171
196
  status &= self.odin.file_writer.image_height.set(
172
- detector_dimensions.height, timeout=self.GENERAL_STATUS_TIMEOUT
197
+ detector_dimensions.height, timeout=self.timeouts.general_status_timeout
173
198
  )
174
199
  status &= self.odin.file_writer.image_width.set(
175
- detector_dimensions.width, timeout=self.GENERAL_STATUS_TIMEOUT
200
+ detector_dimensions.width, timeout=self.timeouts.general_status_timeout
176
201
  )
177
202
  status &= self.odin.file_writer.num_row_chunks.set(
178
- detector_dimensions.height, timeout=self.GENERAL_STATUS_TIMEOUT
203
+ detector_dimensions.height, timeout=self.timeouts.general_status_timeout
179
204
  )
180
205
  status &= self.odin.file_writer.num_col_chunks.set(
181
- detector_dimensions.width, timeout=self.GENERAL_STATUS_TIMEOUT
206
+ detector_dimensions.width, timeout=self.timeouts.general_status_timeout
182
207
  )
183
208
 
184
209
  return status
@@ -186,25 +211,29 @@ class EigerDetector(Device):
186
211
  def set_cam_pvs(self) -> AndStatus:
187
212
  assert self.detector_params is not None
188
213
  status = self.cam.acquire_time.set(
189
- self.detector_params.exposure_time, timeout=self.GENERAL_STATUS_TIMEOUT
214
+ self.detector_params.exposure_time,
215
+ timeout=self.timeouts.general_status_timeout,
190
216
  )
191
217
  status &= self.cam.acquire_period.set(
192
- self.detector_params.exposure_time, timeout=self.GENERAL_STATUS_TIMEOUT
218
+ self.detector_params.exposure_time,
219
+ timeout=self.timeouts.general_status_timeout,
220
+ )
221
+ status &= self.cam.num_exposures.set(
222
+ 1, timeout=self.timeouts.general_status_timeout
193
223
  )
194
- status &= self.cam.num_exposures.set(1, timeout=self.GENERAL_STATUS_TIMEOUT)
195
224
  status &= self.cam.image_mode.set(
196
- self.cam.ImageMode.MULTIPLE, timeout=self.GENERAL_STATUS_TIMEOUT
225
+ self.cam.ImageMode.MULTIPLE, timeout=self.timeouts.general_status_timeout
197
226
  )
198
227
  status &= self.cam.trigger_mode.set(
199
228
  InternalEigerTriggerMode.EXTERNAL_SERIES.value,
200
- timeout=self.GENERAL_STATUS_TIMEOUT,
229
+ timeout=self.timeouts.general_status_timeout,
201
230
  )
202
231
  return status
203
232
 
204
233
  def set_odin_number_of_frame_chunks(self) -> Status:
205
234
  assert self.detector_params is not None
206
235
  status = self.odin.file_writer.num_frames_chunks.set(
207
- 1, timeout=self.GENERAL_STATUS_TIMEOUT
236
+ 1, timeout=self.timeouts.general_status_timeout
208
237
  )
209
238
  return status
210
239
 
@@ -212,16 +241,20 @@ class EigerDetector(Device):
212
241
  assert self.detector_params is not None
213
242
  file_prefix = self.detector_params.full_filename
214
243
  status = self.odin.file_writer.file_path.set(
215
- self.detector_params.directory, timeout=self.GENERAL_STATUS_TIMEOUT
244
+ self.detector_params.directory, timeout=self.timeouts.general_status_timeout
216
245
  )
217
246
  status &= self.odin.file_writer.file_name.set(
218
- file_prefix, timeout=self.GENERAL_STATUS_TIMEOUT
247
+ file_prefix, timeout=self.timeouts.general_status_timeout
219
248
  )
220
249
  status &= await_value(
221
- self.odin.meta.file_name, file_prefix, timeout=self.GENERAL_STATUS_TIMEOUT
250
+ self.odin.meta.file_name,
251
+ file_prefix,
252
+ timeout=self.timeouts.general_status_timeout,
222
253
  )
223
254
  status &= await_value(
224
- self.odin.file_writer.id, file_prefix, timeout=self.GENERAL_STATUS_TIMEOUT
255
+ self.odin.file_writer.id,
256
+ file_prefix,
257
+ timeout=self.timeouts.general_status_timeout,
225
258
  )
226
259
  return status
227
260
 
@@ -231,19 +264,22 @@ class EigerDetector(Device):
231
264
  self.detector_params.detector_distance
232
265
  )
233
266
  status = self.cam.beam_center_x.set(
234
- beam_x_pixels, timeout=self.GENERAL_STATUS_TIMEOUT
267
+ beam_x_pixels, timeout=self.timeouts.general_status_timeout
235
268
  )
236
269
  status &= self.cam.beam_center_y.set(
237
- beam_y_pixels, timeout=self.GENERAL_STATUS_TIMEOUT
270
+ beam_y_pixels, timeout=self.timeouts.general_status_timeout
238
271
  )
239
272
  status &= self.cam.det_distance.set(
240
- self.detector_params.detector_distance, timeout=self.GENERAL_STATUS_TIMEOUT
273
+ self.detector_params.detector_distance,
274
+ timeout=self.timeouts.general_status_timeout,
241
275
  )
242
276
  status &= self.cam.omega_start.set(
243
- self.detector_params.omega_start, timeout=self.GENERAL_STATUS_TIMEOUT
277
+ self.detector_params.omega_start,
278
+ timeout=self.timeouts.general_status_timeout,
244
279
  )
245
280
  status &= self.cam.omega_incr.set(
246
- self.detector_params.omega_increment, timeout=self.GENERAL_STATUS_TIMEOUT
281
+ self.detector_params.omega_increment,
282
+ timeout=self.timeouts.general_status_timeout,
247
283
  )
248
284
  return status
249
285
 
@@ -259,7 +295,7 @@ class EigerDetector(Device):
259
295
  current_energy = self.cam.photon_energy.get()
260
296
  if abs(current_energy - energy) > tolerance:
261
297
  return self.cam.photon_energy.set(
262
- energy, timeout=self.GENERAL_STATUS_TIMEOUT
298
+ energy, timeout=self.timeouts.general_status_timeout
263
299
  )
264
300
  else:
265
301
  status = Status()
@@ -275,45 +311,46 @@ class EigerDetector(Device):
275
311
  assert self.detector_params is not None
276
312
  status = self.cam.num_images.set(
277
313
  self.detector_params.num_images_per_trigger,
278
- timeout=self.GENERAL_STATUS_TIMEOUT,
314
+ timeout=self.timeouts.general_status_timeout,
279
315
  )
280
316
  if self.detector_params.trigger_mode == TriggerMode.FREE_RUN:
281
317
  # The Eiger can't actually free run so we set a very large number of frames
282
318
  status &= self.cam.num_triggers.set(
283
- FREE_RUN_MAX_IMAGES, timeout=self.GENERAL_STATUS_TIMEOUT
319
+ FREE_RUN_MAX_IMAGES, timeout=self.timeouts.general_status_timeout
284
320
  )
285
321
  # Setting Odin to write 0 frames tells it to write until externally stopped
286
322
  status &= self.odin.file_writer.num_capture.set(
287
- 0, timeout=self.GENERAL_STATUS_TIMEOUT
323
+ 0, timeout=self.timeouts.general_status_timeout
288
324
  )
289
325
  elif self.detector_params.trigger_mode == TriggerMode.SET_FRAMES:
290
326
  status &= self.cam.num_triggers.set(
291
- self.detector_params.num_triggers, timeout=self.GENERAL_STATUS_TIMEOUT
327
+ self.detector_params.num_triggers,
328
+ timeout=self.timeouts.general_status_timeout,
292
329
  )
293
330
  status &= self.odin.file_writer.num_capture.set(
294
331
  self.detector_params.full_number_of_images,
295
- timeout=self.GENERAL_STATUS_TIMEOUT,
332
+ timeout=self.timeouts.general_status_timeout,
296
333
  )
297
334
 
298
335
  return status
299
336
 
300
337
  def _wait_for_odin_status(self) -> StatusBase:
301
338
  self.forward_bit_depth_to_filewriter()
302
- await_value(self.odin.meta.active, 1).wait(self.GENERAL_STATUS_TIMEOUT)
339
+ await_value(self.odin.meta.active, 1).wait(self.timeouts.general_status_timeout)
303
340
 
304
341
  status = self.odin.file_writer.capture.set(
305
- 1, timeout=self.GENERAL_STATUS_TIMEOUT
342
+ 1, timeout=self.timeouts.general_status_timeout
306
343
  )
307
344
  LOGGER.info("Eiger staging: awaiting odin metadata")
308
345
  status &= await_value(
309
- self.odin.meta.ready, 1, timeout=self.META_FILE_READY_TIMEOUT
346
+ self.odin.meta.ready, 1, timeout=self.timeouts.meta_file_ready_timeout
310
347
  )
311
348
  return status
312
349
 
313
350
  def _wait_fan_ready(self) -> StatusBase:
314
351
  self.filewriters_finished = self.odin.create_finished_status()
315
352
  LOGGER.info("Eiger staging: awaiting odin fan ready")
316
- return await_value(self.odin.fan.ready, 1, self.GENERAL_STATUS_TIMEOUT)
353
+ return await_value(self.odin.fan.ready, 1, self.timeouts.general_status_timeout)
317
354
 
318
355
  def _finish_arm(self) -> Status:
319
356
  LOGGER.info("Eiger staging: Finishing arming")
@@ -324,7 +361,7 @@ class EigerDetector(Device):
324
361
  def forward_bit_depth_to_filewriter(self):
325
362
  bit_depth = self.bit_depth.get()
326
363
  self.odin.file_writer.data_type.set(f"UInt{bit_depth}").wait(
327
- self.GENERAL_STATUS_TIMEOUT
364
+ self.timeouts.general_status_timeout
328
365
  )
329
366
 
330
367
  def change_dev_shm(self, enable_dev_shm: bool):
@@ -332,7 +369,7 @@ class EigerDetector(Device):
332
369
  return self.odin.fan.dev_shm_enable.set(1 if enable_dev_shm else 0)
333
370
 
334
371
  def disarm_detector(self):
335
- self.cam.acquire.set(0).wait(self.GENERAL_STATUS_TIMEOUT)
372
+ self.cam.acquire.set(0).wait(self.timeouts.general_status_timeout)
336
373
 
337
374
  def do_arming_chain(self) -> Status:
338
375
  functions_to_do_arm = []
@@ -355,7 +392,9 @@ class EigerDetector(Device):
355
392
  self.set_num_triggers_and_captures,
356
393
  lambda: await_value(self.stale_params, 0, 60),
357
394
  self._wait_for_odin_status,
358
- lambda: self.cam.acquire.set(1, timeout=self.GENERAL_STATUS_TIMEOUT),
395
+ lambda: self.cam.acquire.set(
396
+ 1, timeout=self.timeouts.general_status_timeout
397
+ ),
359
398
  self._wait_fan_ready,
360
399
  self._finish_arm,
361
400
  ]
@@ -2,7 +2,7 @@ from bluesky import plan_stubs as bps
2
2
  from bluesky import preprocessors as bpp
3
3
  from bluesky.utils import MsgGenerator, make_decorator
4
4
 
5
- from dodal.common.beamlines import beamline_utils
5
+ from dodal.common.beamlines.beamline_utils import get_path_provider
6
6
  from dodal.common.types import UpdatingPathProvider
7
7
 
8
8
  DATA_SESSION = "data_session"
@@ -31,7 +31,7 @@ def attach_data_session_metadata_wrapper(
31
31
  Iterator[Msg]: Plan messages
32
32
  """
33
33
  if provider is None:
34
- provider = beamline_utils.get_path_provider()
34
+ provider = get_path_provider()
35
35
  yield from bps.wait_for([provider.update])
36
36
  ress = yield from bps.wait_for([provider.data_session])
37
37
  data_session = ress[0].result()
@@ -23,7 +23,7 @@ class MoveTooLarge(Exception):
23
23
  super().__init__(*args)
24
24
 
25
25
 
26
- def _check_and_cache_values(
26
+ def check_and_cache_values(
27
27
  devices_and_positions: dict[MovableReadableDevice, float],
28
28
  smallest_move: float,
29
29
  maximum_move: float,
@@ -89,7 +89,7 @@ def move_and_reset_wrapper(
89
89
  on. If false it is left up to the caller to wait on
90
90
  them. Defaults to True.
91
91
  """
92
- initial_positions = yield from _check_and_cache_values(
92
+ initial_positions = yield from check_and_cache_values(
93
93
  device_and_positions, smallest_move, maximum_move
94
94
  )
95
95
 
@@ -0,0 +1,150 @@
1
+ import itertools
2
+ from collections.abc import Mapping
3
+ from typing import Annotated, Any
4
+
5
+ import bluesky.plan_stubs as bps
6
+ from bluesky.protocols import Movable
7
+ from bluesky.utils import MsgGenerator
8
+
9
+ """
10
+ Wrappers for Bluesky built-in plan stubs with type hinting
11
+ """
12
+
13
+ Group = Annotated[str, "String identifier used by 'wait' or stubs that await"]
14
+
15
+
16
+ # After bluesky 1.14, bounds for stubs that move can be narrowed
17
+ # https://github.com/bluesky/bluesky/issues/1821
18
+ def set_absolute(
19
+ movable: Movable, value: Any, group: Group | None = None, wait: bool = False
20
+ ) -> MsgGenerator:
21
+ """
22
+ Set a device, wrapper for `bp.abs_set`.
23
+
24
+ Args:
25
+ movable (Movable): The device to set
26
+ value (T): The new value
27
+ group (Group | None, optional): The message group to associate with the
28
+ setting, for sequencing. Defaults to None.
29
+ wait (bool, optional): The group should wait until all setting is complete
30
+ (e.g. a motor has finished moving). Defaults to False.
31
+
32
+ Returns:
33
+ MsgGenerator: Plan
34
+
35
+ Yields:
36
+ Iterator[MsgGenerator]: Bluesky messages
37
+ """
38
+ return (yield from bps.abs_set(movable, value, group=group, wait=wait))
39
+
40
+
41
+ def set_relative(
42
+ movable: Movable, value: Any, group: Group | None = None, wait: bool = False
43
+ ) -> MsgGenerator:
44
+ """
45
+ Change a device, wrapper for `bp.rel_set`.
46
+
47
+ Args:
48
+ movable (Movable): The device to set
49
+ value (T): The new value
50
+ group (Group | None, optional): The message group to associate with the
51
+ setting, for sequencing. Defaults to None.
52
+ wait (bool, optional): The group should wait until all setting is complete
53
+ (e.g. a motor has finished moving). Defaults to False.
54
+
55
+ Returns:
56
+ MsgGenerator: Plan
57
+
58
+ Yields:
59
+ Iterator[MsgGenerator]: Bluesky messages
60
+ """
61
+
62
+ return (yield from bps.rel_set(movable, value, group=group, wait=wait))
63
+
64
+
65
+ def move(moves: Mapping[Movable, Any], group: Group | None = None) -> MsgGenerator:
66
+ """
67
+ Move a device, wrapper for `bp.mv`.
68
+
69
+ Args:
70
+ moves (Mapping[Movable, T]): Mapping of Movables to target positions
71
+ group (Group | None, optional): The message group to associate with the
72
+ setting, for sequencing. Defaults to None.
73
+
74
+ Returns:
75
+ MsgGenerator: Plan
76
+
77
+ Yields:
78
+ Iterator[MsgGenerator]: Bluesky messages
79
+ """
80
+
81
+ return (
82
+ # type ignore until https://github.com/bluesky/bluesky/issues/1809
83
+ yield from bps.mv(*itertools.chain.from_iterable(moves.items()), group=group) # type: ignore
84
+ )
85
+
86
+
87
+ def move_relative(
88
+ moves: Mapping[Movable, Any], group: Group | None = None
89
+ ) -> MsgGenerator:
90
+ """
91
+ Move a device relative to its current position, wrapper for `bp.mvr`.
92
+
93
+ Args:
94
+ moves (Mapping[Movable, T]): Mapping of Movables to target deltas
95
+ group (Group | None, optional): The message group to associate with the
96
+ setting, for sequencing. Defaults to None.
97
+
98
+ Returns:
99
+ MsgGenerator: Plan
100
+
101
+ Yields:
102
+ Iterator[MsgGenerator]: Bluesky messages
103
+ """
104
+
105
+ return (
106
+ # type ignore until https://github.com/bluesky/bluesky/issues/1809
107
+ yield from bps.mvr(*itertools.chain.from_iterable(moves.items()), group=group) # type: ignore
108
+ )
109
+
110
+
111
+ def sleep(time: float) -> MsgGenerator:
112
+ """
113
+ Suspend all action for a given time, wrapper for `bp.sleep`
114
+
115
+ Args:
116
+ time (float): Time to wait in seconds
117
+
118
+ Returns:
119
+ MsgGenerator: Plan
120
+
121
+ Yields:
122
+ Iterator[MsgGenerator]: Bluesky messages
123
+ """
124
+
125
+ return (yield from bps.sleep(time))
126
+
127
+
128
+ def wait(
129
+ group: Group | None = None,
130
+ timeout: float | None = None,
131
+ ) -> MsgGenerator:
132
+ """
133
+ Wait for a group status to complete, wrapper for `bp.wait`.
134
+ Does not expose move_on, as when used as a stub will not fail on Timeout.
135
+
136
+ Args:
137
+ group (Group | None, optional): The name of the group to wait for, defaults
138
+ to None, in which case waits for all
139
+ groups that have not yet been awaited.
140
+ timeout (float | None, default=None): a timeout in seconds
141
+
142
+
143
+ Returns:
144
+ MsgGenerator: Plan
145
+
146
+ Yields:
147
+ Iterator[MsgGenerator]: Bluesky messages
148
+ """
149
+
150
+ return (yield from bps.wait(group, timeout=timeout))
@@ -0,0 +1,4 @@
1
+ from .scanspec import spec_scan
2
+ from .wrapped import count
3
+
4
+ __all__ = ["count", "spec_scan"]