dls-dodal 1.47.0__tar.gz → 1.48.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 (495) hide show
  1. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/workflows/_test.yml +15 -0
  2. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.gitignore +2 -1
  3. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/PKG-INFO +2 -2
  4. dls_dodal-1.48.0/docs/explanations/decisions/0005-standardise-devices-at-epics-level.md +21 -0
  5. dls_dodal-1.48.0/docs/how-to/create-device.md +28 -0
  6. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/pyproject.toml +9 -12
  7. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dls_dodal.egg-info/PKG-INFO +2 -2
  8. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dls_dodal.egg-info/SOURCES.txt +9 -4
  9. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dls_dodal.egg-info/requires.txt +1 -1
  10. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/_version.py +2 -2
  11. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/aithre.py +6 -0
  12. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/b01_1.py +1 -1
  13. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i03.py +21 -6
  14. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i04.py +17 -10
  15. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i18.py +1 -1
  16. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i19_1.py +9 -6
  17. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i24.py +5 -5
  18. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/common/beamlines/beamline_parameters.py +2 -28
  19. dls_dodal-1.48.0/src/dodal/devices/aithre_lasershaping/goniometer.py +49 -0
  20. dls_dodal-1.48.0/src/dodal/devices/aithre_lasershaping/laser_robot.py +27 -0
  21. dls_dodal-1.48.0/src/dodal/devices/electron_analyser/__init__.py +18 -0
  22. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/electron_analyser/abstract/__init__.py +0 -6
  23. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/electron_analyser/abstract/base_detector.py +69 -56
  24. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/electron_analyser/abstract/base_driver_io.py +114 -5
  25. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/electron_analyser/abstract/base_region.py +1 -0
  26. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/electron_analyser/specs/__init__.py +1 -2
  27. dls_dodal-1.48.0/src/dodal/devices/electron_analyser/specs/detector.py +13 -0
  28. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/electron_analyser/specs/driver_io.py +27 -2
  29. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/electron_analyser/vgscienta/__init__.py +1 -2
  30. dls_dodal-1.48.0/src/dodal/devices/electron_analyser/vgscienta/detector.py +22 -0
  31. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/electron_analyser/vgscienta/driver_io.py +31 -3
  32. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/electron_analyser/vgscienta/region.py +0 -1
  33. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/fast_grid_scan.py +1 -1
  34. dls_dodal-1.48.0/src/dodal/devices/i04/murko_results.py +192 -0
  35. dls_dodal-1.48.0/src/dodal/devices/i18/diode.py +50 -0
  36. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/mx_phase1/beamstop.py +23 -6
  37. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/oav_detector.py +61 -23
  38. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/oav_parameters.py +46 -16
  39. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/oav_to_redis_forwarder.py +2 -2
  40. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/robot.py +20 -1
  41. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/smargon.py +43 -4
  42. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/zebra/zebra.py +8 -0
  43. dls_dodal-1.48.0/src/dodal/plans/configure_arm_trigger_and_disarm_detector.py +167 -0
  44. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/system_tests/test_adsim.py +40 -8
  45. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/system_tests/test_oav_to_redis_system.py +3 -3
  46. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/common/beamlines/test_beamline_parameters.py +27 -1
  47. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/common/beamlines/test_beamline_utils.py +2 -1
  48. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/conftest.py +22 -0
  49. dls_dodal-1.48.0/tests/devices/aithre_lasershaping/test_goniometer.py +61 -0
  50. dls_dodal-1.48.0/tests/devices/i04/test_murko_results.py +495 -0
  51. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i22/test_dcm.py +68 -122
  52. {dls_dodal-1.47.0/tests/devices/i03 → dls_dodal-1.48.0/tests/devices/mx_phase1}/test_beamstop.py +37 -1
  53. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/electron_analyser/abstract/test_base_detector.py +35 -22
  54. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/electron_analyser/abstract/test_base_driver_io.py +31 -42
  55. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/electron_analyser/conftest.py +53 -22
  56. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/electron_analyser/specs/test_detector.py +0 -3
  57. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/electron_analyser/specs/test_driver_io.py +24 -29
  58. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/electron_analyser/specs/test_region.py +3 -1
  59. dls_dodal-1.48.0/tests/devices/unit_tests/electron_analyser/test_util.py +32 -0
  60. dls_dodal-1.47.0/tests/devices/unit_tests/electron_analyser/test_util.py → dls_dodal-1.48.0/tests/devices/unit_tests/electron_analyser/util.py +34 -8
  61. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/electron_analyser/vgscienta/test_detector.py +0 -3
  62. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/electron_analyser/vgscienta/test_driver_io.py +17 -21
  63. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/electron_analyser/vgscienta/test_region.py +1 -1
  64. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/i03/test_undulator_dcm.py +2 -1
  65. dls_dodal-1.48.0/tests/devices/unit_tests/oav/conftest.py +56 -0
  66. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/oav/test_oav.py +36 -1
  67. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/oav/test_oav_parameters.py +32 -5
  68. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_eiger.py +6 -37
  69. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_smargon.py +57 -2
  70. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_zebra.py +5 -0
  71. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/plan_stubs/test_wrapped_stubs.py +4 -4
  72. dls_dodal-1.48.0/tests/plans/test_configure_arm_trigger_and_disarm_detector.py +66 -0
  73. dls_dodal-1.48.0/tests/unit_tests/__init__.py +0 -0
  74. dls_dodal-1.47.0/docs/how-to/make-new-ophyd-async-device.rst +0 -67
  75. dls_dodal-1.47.0/src/dodal/devices/aithre_lasershaping/goniometer.py +0 -15
  76. dls_dodal-1.47.0/src/dodal/devices/electron_analyser/__init__.py +0 -8
  77. dls_dodal-1.47.0/src/dodal/devices/electron_analyser/specs/detector.py +0 -29
  78. dls_dodal-1.47.0/src/dodal/devices/electron_analyser/vgscienta/detector.py +0 -36
  79. dls_dodal-1.47.0/src/dodal/devices/i04/murko_results.py +0 -195
  80. dls_dodal-1.47.0/src/dodal/devices/i18/diode.py +0 -17
  81. dls_dodal-1.47.0/src/dodal/plan_stubs/electron_analyser/__init__.py +0 -3
  82. dls_dodal-1.47.0/src/dodal/plan_stubs/electron_analyser/configure_driver.py +0 -92
  83. dls_dodal-1.47.0/tests/devices/i04/test_murko_results.py +0 -361
  84. dls_dodal-1.47.0/tests/devices/unit_tests/oav/conftest.py +0 -26
  85. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.copier-answers.yml +0 -0
  86. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.devcontainer/devcontainer.json +0 -0
  87. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/CODEOWNERS +0 -0
  88. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/CONTRIBUTING.md +0 -0
  89. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/ISSUE_TEMPLATE/issue_template.md +0 -0
  90. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/actions/install_requirements/action.yml +0 -0
  91. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/dependabot.yml +0 -0
  92. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/pages/index.html +0 -0
  93. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/pages/make_switcher.py +0 -0
  94. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/scripts/check_test_durations.py +0 -0
  95. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/workflows/_check.yml +0 -0
  96. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/workflows/_dist.yml +0 -0
  97. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/workflows/_docs.yml +0 -0
  98. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/workflows/_pypi.yml +0 -0
  99. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/workflows/_release.yml +0 -0
  100. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/workflows/_tox.yml +0 -0
  101. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/workflows/ci.yml +0 -0
  102. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.github/workflows/periodic.yml +0 -0
  103. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.pre-commit-config.yaml +0 -0
  104. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.vscode/extensions.json +0 -0
  105. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.vscode/launch.json +0 -0
  106. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.vscode/settings.json +0 -0
  107. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/.vscode/tasks.json +0 -0
  108. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/Dockerfile +0 -0
  109. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/LICENSE +0 -0
  110. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/README.md +0 -0
  111. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/catalog-info.yaml +0 -0
  112. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/conftest.py +0 -0
  113. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/_templates/autosummary/class.rst +0 -0
  114. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/_templates/autosummary/module.rst +0 -0
  115. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/_templates/custom-module-template.rst +0 -0
  116. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/assets/zocalo.png +0 -0
  117. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/conf.py +0 -0
  118. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  119. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  120. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/explanations/decisions/0003-codeowners.md +0 -0
  121. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/explanations/decisions/0004-make-devices-factory.md +0 -0
  122. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/explanations/decisions/COPYME +0 -0
  123. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/explanations/decisions.md +0 -0
  124. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/explanations/reviews.md +0 -0
  125. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/explanations.md +0 -0
  126. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/genindex.md +0 -0
  127. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/build-docs.md +0 -0
  128. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/contribute.md +0 -0
  129. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/coverage.md +0 -0
  130. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/create-beamline.rst +0 -0
  131. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/dev-install.md +0 -0
  132. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/excalidraw.md +0 -0
  133. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/external-io-devices.md +0 -0
  134. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/lint.md +0 -0
  135. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/lock-requirements.md +0 -0
  136. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/make-release.md +0 -0
  137. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/move-code.rst +0 -0
  138. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/pypi.md +0 -0
  139. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/run-tests.md +0 -0
  140. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/static-analysis.md +0 -0
  141. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/update-template.md +0 -0
  142. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/write-tests.md +0 -0
  143. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to/zocalo.rst +0 -0
  144. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/how-to.md +0 -0
  145. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/images/dls-logo.svg +0 -0
  146. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/images/excalidraw-example.svg +0 -0
  147. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/index.md +0 -0
  148. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/reference/api.md +0 -0
  149. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/reference/device-standards.rst +0 -0
  150. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/reference/standards.rst +0 -0
  151. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/reference.md +0 -0
  152. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/tutorials/get_started.rst +0 -0
  153. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/tutorials/installation.md +0 -0
  154. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/docs/tutorials.md +0 -0
  155. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/pull_request_template.md +0 -0
  156. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/setup.cfg +0 -0
  157. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/__init__.py +0 -0
  158. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dls_dodal.egg-info/dependency_links.txt +0 -0
  159. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dls_dodal.egg-info/entry_points.txt +0 -0
  160. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dls_dodal.egg-info/top_level.txt +0 -0
  161. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/__init__.py +0 -0
  162. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/__main__.py +0 -0
  163. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamline_specific_utils/__init__.py +0 -0
  164. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamline_specific_utils/i03.py +0 -0
  165. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/README.md +0 -0
  166. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/__init__.py +0 -0
  167. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/adsim.py +0 -0
  168. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/b07.py +0 -0
  169. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/b07_1.py +0 -0
  170. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i02_1.py +0 -0
  171. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i09.py +0 -0
  172. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i09_1.py +0 -0
  173. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i10.py +0 -0
  174. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i13_1.py +0 -0
  175. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i19_2.py +0 -0
  176. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i19_optics.py +0 -0
  177. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i20_1.py +0 -0
  178. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i22.py +0 -0
  179. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/i23.py +0 -0
  180. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/p38.py +0 -0
  181. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/p45.py +0 -0
  182. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/p60.py +0 -0
  183. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/p99.py +0 -0
  184. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/beamlines/training_rig.py +0 -0
  185. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/cli.py +0 -0
  186. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/common/__init__.py +0 -0
  187. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/common/beamlines/__init__.py +0 -0
  188. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/common/beamlines/beamline_utils.py +0 -0
  189. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/common/beamlines/device_helpers.py +0 -0
  190. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/common/coordination.py +0 -0
  191. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/common/crystal_metadata.py +0 -0
  192. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/common/data_util.py +0 -0
  193. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/common/maths.py +0 -0
  194. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/common/types.py +0 -0
  195. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/common/udc_directory_provider.py +0 -0
  196. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/common/visit.py +0 -0
  197. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/CTAB.py +0 -0
  198. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/__init__.py +0 -0
  199. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/adsim.py +0 -0
  200. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/aperture.py +0 -0
  201. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/aperturescatterguard.py +0 -0
  202. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/apple2_undulator.py +0 -0
  203. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/areadetector/plugins/CAM.py +0 -0
  204. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/areadetector/plugins/MJPG.py +0 -0
  205. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/attenuator/attenuator.py +0 -0
  206. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/attenuator/filter.py +0 -0
  207. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/attenuator/filter_selections.py +0 -0
  208. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/backlight.py +0 -0
  209. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/baton.py +0 -0
  210. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/bimorph_mirror.py +0 -0
  211. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/common_dcm.py +0 -0
  212. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/cryostream.py +0 -0
  213. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/current_amplifiers/__init__.py +0 -0
  214. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/current_amplifiers/current_amplifier.py +0 -0
  215. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/current_amplifiers/current_amplifier_detector.py +0 -0
  216. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/current_amplifiers/femto.py +0 -0
  217. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/current_amplifiers/sr570.py +0 -0
  218. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/current_amplifiers/struck_scaler_counter.py +0 -0
  219. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/detector/__init__.py +0 -0
  220. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/detector/det_dim_constants.py +0 -0
  221. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/detector/det_dist_to_beam_converter.py +0 -0
  222. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/detector/det_resolution.py +0 -0
  223. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/detector/detector.py +0 -0
  224. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/detector/detector_motion.py +0 -0
  225. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/diamond_filter.py +0 -0
  226. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/eiger.py +0 -0
  227. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/eiger_odin.py +0 -0
  228. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/electron_analyser/specs/region.py +0 -0
  229. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/electron_analyser/types.py +0 -0
  230. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/electron_analyser/util.py +0 -0
  231. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/fluorescence_detector_motion.py +0 -0
  232. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/flux.py +0 -0
  233. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/focusing_mirror.py +0 -0
  234. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/hutch_shutter.py +0 -0
  235. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i03/__init__.py +0 -0
  236. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i03/dcm.py +0 -0
  237. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i03/undulator_dcm.py +0 -0
  238. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i04/__init__.py +0 -0
  239. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i04/constants.py +0 -0
  240. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i04/transfocator.py +0 -0
  241. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i10/diagnostics.py +0 -0
  242. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i10/i10_apple2.py +0 -0
  243. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i10/i10_setting_data.py +0 -0
  244. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i10/mirrors.py +0 -0
  245. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i10/rasor/rasor_current_amp.py +0 -0
  246. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i10/rasor/rasor_motors.py +0 -0
  247. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i10/rasor/rasor_scaler_cards.py +0 -0
  248. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i10/slits.py +0 -0
  249. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i13_1/__init__.py +0 -0
  250. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i13_1/merlin.py +0 -0
  251. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i13_1/merlin_controller.py +0 -0
  252. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i18/KBMirror.py +0 -0
  253. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i18/table.py +0 -0
  254. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i18/thor_labs_stage.py +0 -0
  255. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i19/__init__.py +0 -0
  256. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i19/beamstop.py +0 -0
  257. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i19/blueapi_device.py +0 -0
  258. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i19/hutch_access.py +0 -0
  259. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i19/shutter.py +0 -0
  260. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i20_1/__init__.py +0 -0
  261. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i22/dcm.py +0 -0
  262. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i22/fswitch.py +0 -0
  263. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i22/nxsas.py +0 -0
  264. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i24/__init__.py +0 -0
  265. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i24/aperture.py +0 -0
  266. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i24/beam_center.py +0 -0
  267. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i24/beamstop.py +0 -0
  268. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i24/dcm.py +0 -0
  269. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i24/dual_backlight.py +0 -0
  270. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i24/focus_mirrors.py +0 -0
  271. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i24/i24_detector_motion.py +0 -0
  272. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i24/pilatus_metadata.py +0 -0
  273. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i24/pmac.py +0 -0
  274. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/i24/vgonio.py +0 -0
  275. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/ipin.py +0 -0
  276. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/linkam3.py +0 -0
  277. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/motors.py +0 -0
  278. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/__init__.py +0 -0
  279. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/oav_calculations.py +0 -0
  280. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/pin_image_recognition/__init__.py +0 -0
  281. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/pin_image_recognition/manual_test.py +0 -0
  282. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/pin_image_recognition/utils.py +0 -0
  283. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/snapshots/grid_overlay.py +0 -0
  284. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/snapshots/snapshot.py +0 -0
  285. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/snapshots/snapshot_image_processing.py +0 -0
  286. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/snapshots/snapshot_with_grid.py +0 -0
  287. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/oav/utils.py +0 -0
  288. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/p45.py +0 -0
  289. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/p99/__init__.py +0 -0
  290. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/p99/andor2_point.py +0 -0
  291. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/p99/sample_stage.py +0 -0
  292. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/pgm.py +0 -0
  293. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/positioner.py +0 -0
  294. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/pressure_jump_cell.py +0 -0
  295. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/qbpm.py +0 -0
  296. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/s4_slit_gaps.py +0 -0
  297. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/scatterguard.py +0 -0
  298. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/scintillator.py +0 -0
  299. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/slits.py +0 -0
  300. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/status.py +0 -0
  301. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/synchrotron.py +0 -0
  302. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/tetramm.py +0 -0
  303. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/thawer.py +0 -0
  304. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/training_rig/__init__.py +0 -0
  305. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/training_rig/sample_stage.py +0 -0
  306. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/turbo_slit.py +0 -0
  307. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/undulator.py +0 -0
  308. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/util/__init__.py +0 -0
  309. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/util/adjuster_plans.py +0 -0
  310. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/util/epics_util.py +0 -0
  311. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/util/lookup_tables.py +0 -0
  312. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/util/test_utils.py +0 -0
  313. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/watsonmarlow323_pump.py +0 -0
  314. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/webcam.py +0 -0
  315. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/xbpm_feedback.py +0 -0
  316. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/xspress3/xspress3.py +0 -0
  317. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/xspress3/xspress3_channel.py +0 -0
  318. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/zebra/__init__.py +0 -0
  319. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/zebra/zebra_constants_mapping.py +0 -0
  320. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/zebra/zebra_controlled_shutter.py +0 -0
  321. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/zocalo/__init__.py +0 -0
  322. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/zocalo/zocalo_constants.py +0 -0
  323. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/zocalo/zocalo_interaction.py +0 -0
  324. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/devices/zocalo/zocalo_results.py +0 -0
  325. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/log.py +0 -0
  326. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/parameters/experiment_parameter_base.py +0 -0
  327. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/plan_stubs/__init__.py +0 -0
  328. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/plan_stubs/check_topup.py +0 -0
  329. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/plan_stubs/data_session.py +0 -0
  330. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/plan_stubs/motor_utils.py +0 -0
  331. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/plan_stubs/wrapped.py +0 -0
  332. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/plans/__init__.py +0 -0
  333. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/plans/preprocessors/__init__.py +0 -0
  334. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/plans/preprocessors/verify_undulator_gap.py +0 -0
  335. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/plans/save_panda.py +0 -0
  336. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/plans/scanspec.py +0 -0
  337. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/plans/verify_undulator_gap.py +0 -0
  338. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/plans/wrapped.py +0 -0
  339. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/src/dodal/utils.py +0 -0
  340. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/system_tests/__init__.py +0 -0
  341. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/system_tests/test_cli.py +0 -0
  342. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/system_tests/test_oav_system.py +0 -0
  343. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/__init__.py +0 -0
  344. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/beamlines/__init__.py +0 -0
  345. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/beamlines/unit_tests/__init__.py +0 -0
  346. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/beamlines/unit_tests/test_i03.py +0 -0
  347. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/beamlines/unit_tests/test_i24.py +0 -0
  348. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/beamlines/unit_tests/test_mapping.py +0 -0
  349. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/common/__init__.py +0 -0
  350. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/common/beamlines/__init__.py +0 -0
  351. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/common/beamlines/test_device_helpers.py +0 -0
  352. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/common/beamlines/test_device_instantiation.py +0 -0
  353. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/common/test_coordination.py +0 -0
  354. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/common/test_crystal_metadata.py +0 -0
  355. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/common/test_maths.py +0 -0
  356. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/common/test_udc_directory_provider.py +0 -0
  357. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/common/test_visit.py +0 -0
  358. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/constants.py +0 -0
  359. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/__init__.py +0 -0
  360. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i03/__init__.py +0 -0
  361. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i04/__init__.py +0 -0
  362. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i04/test_transfocator.py +0 -0
  363. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i10/lookupTables/IDEnergy2GapCalibrations.csv +0 -0
  364. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i10/lookupTables/IDEnergy2PhaseCalibrations.csv +0 -0
  365. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdd.pkl +0 -0
  366. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i10/lookupTables/expectedIDEnergy2GapCalibrationsIdu.pkl +0 -0
  367. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidd.pkl +0 -0
  368. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i10/lookupTables/expectedIDEnergy2PhaseCalibrationsidu.pkl +0 -0
  369. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i10/test_i10Apple2.py +0 -0
  370. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i13_1/test_merlin.py +0 -0
  371. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i18/test_kb_mirror.py +0 -0
  372. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i18/test_table.py +0 -0
  373. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i18/test_thor_labs_stage.py +0 -0
  374. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i19/__init__.py +0 -0
  375. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i19/test_beamstop.py +0 -0
  376. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i19/test_shutter.py +0 -0
  377. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i22/test_fswitch.py +0 -0
  378. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/i22/test_metadataholder.py +0 -0
  379. {dls_dodal-1.47.0/tests/devices/unit_tests → dls_dodal-1.48.0/tests/devices/mx_phase1}/__init__.py +0 -0
  380. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/test_common_dcm.py +0 -0
  381. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/test_diamond_filter.py +0 -0
  382. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/training_rig/test_sample_stage.py +0 -0
  383. {dls_dodal-1.47.0/tests/devices/unit_tests/electron_analyser → dls_dodal-1.48.0/tests/devices/unit_tests}/__init__.py +0 -0
  384. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/current_amplifier/test_femto.py +0 -0
  385. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/current_amplifier/test_sr570.py +0 -0
  386. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/detector/test_det_dim_constants.py +0 -0
  387. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/detector/test_det_resolution.py +0 -0
  388. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/detector/test_detector.py +0 -0
  389. {dls_dodal-1.47.0/tests/devices/unit_tests/electron_analyser/abstract → dls_dodal-1.48.0/tests/devices/unit_tests/electron_analyser}/__init__.py +0 -0
  390. {dls_dodal-1.47.0/tests/devices/unit_tests/electron_analyser/specs → dls_dodal-1.48.0/tests/devices/unit_tests/electron_analyser/abstract}/__init__.py +0 -0
  391. {dls_dodal-1.47.0/tests/devices/unit_tests/electron_analyser/vgscienta → dls_dodal-1.48.0/tests/devices/unit_tests/electron_analyser/specs}/__init__.py +0 -0
  392. {dls_dodal-1.47.0/tests/devices/unit_tests/i03 → dls_dodal-1.48.0/tests/devices/unit_tests/electron_analyser/vgscienta}/__init__.py +0 -0
  393. {dls_dodal-1.47.0/tests/devices/unit_tests/i24 → dls_dodal-1.48.0/tests/devices/unit_tests/i03}/__init__.py +0 -0
  394. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/i03/test_dcm.py +0 -0
  395. {dls_dodal-1.47.0/tests/devices/unit_tests/oav → dls_dodal-1.48.0/tests/devices/unit_tests/i24}/__init__.py +0 -0
  396. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/i24/test_dual_backlight.py +0 -0
  397. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/i24/test_focus_mirrors.py +0 -0
  398. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/i24/test_pilatus_metadata.py +0 -0
  399. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/i24/test_pmac.py +0 -0
  400. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/i24/test_vgonio.py +0 -0
  401. {dls_dodal-1.47.0/tests/devices/unit_tests/util → dls_dodal-1.48.0/tests/devices/unit_tests/oav}/__init__.py +0 -0
  402. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect.py +0 -0
  403. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/oav/image_recognition/test_pin_tip_detect_utils.py +0 -0
  404. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/oav/test_grid_overlay.py +0 -0
  405. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/oav/test_oav_to_redis_forwarder.py +0 -0
  406. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/oav/test_oav_utils.py +0 -0
  407. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/oav/test_snapshot_image_processing.py +0 -0
  408. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/oav/test_snapshots.py +0 -0
  409. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/p99/test_p99_stage.py +0 -0
  410. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_OAVCentring.json +0 -0
  411. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_aperture.py +0 -0
  412. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_aperture_scatterguard.py +0 -0
  413. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_apple2_undulator.py +0 -0
  414. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_attenuator.py +0 -0
  415. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_backlight.py +0 -0
  416. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_bart_robot.py +0 -0
  417. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_baton.py +0 -0
  418. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_beam_converter.py +0 -0
  419. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_beamline_undulator_to_gap_lookup_table.txt +0 -0
  420. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_bimorph_mirror.py +0 -0
  421. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_daq_configuration/domain/beamlineParameters +0 -0
  422. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Pitch_converter.txt +0 -0
  423. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt +0 -0
  424. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_display.configuration +0 -0
  425. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_focusing_mirror.py +0 -0
  426. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_gridscan.py +0 -0
  427. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_hutch_shutter.py +0 -0
  428. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_jCameraManZoomLevels.xml +0 -0
  429. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_linkam3.py +0 -0
  430. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_lookup_table.txt +0 -0
  431. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_lookup_table_2.txt +0 -0
  432. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_motors.py +0 -0
  433. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_odin.py +0 -0
  434. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_positioner.py +0 -0
  435. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_pressure_jump_cell.py +0 -0
  436. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_qbpm.py +0 -0
  437. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_slits.py +0 -0
  438. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_status.py +0 -0
  439. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_synchrotron.py +0 -0
  440. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_tetramm.py +0 -0
  441. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_thawer.py +0 -0
  442. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_turbo_slit.py +0 -0
  443. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_undulator.py +0 -0
  444. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_utils.py +0 -0
  445. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_watsonmarlow323_pump.py +0 -0
  446. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_webcam.py +0 -0
  447. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_xbpm_feedback.py +0 -0
  448. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_xspress3.py +0 -0
  449. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_zebra_constants_mapping.py +0 -0
  450. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_zebra_shutter.py +0 -0
  451. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_zocalo_interaction.py +0 -0
  452. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/test_zocalo_results.py +0 -0
  453. {dls_dodal-1.47.0/tests/fake_zocalo → dls_dodal-1.48.0/tests/devices/unit_tests/util}/__init__.py +0 -0
  454. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/util/test_adjuster_plans.py +0 -0
  455. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/util/test_beamline_specific_utils.py +0 -0
  456. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/util/test_lookup_tables.py +0 -0
  457. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/devices/unit_tests/util/test_save_panda.py +0 -0
  458. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/fake_beamline.py +0 -0
  459. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/fake_beamline_all_devices_raise_exception.py +0 -0
  460. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/fake_beamline_broken_dependency.py +0 -0
  461. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/fake_beamline_dependencies.py +0 -0
  462. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/fake_beamline_disordered_dependencies.py +0 -0
  463. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/fake_beamline_misbehaving_builtins.py +0 -0
  464. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/fake_beamline_some_devices_working.py +0 -0
  465. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/fake_device_factory_beamline.py +0 -0
  466. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/fake_zocalo/README.rst +0 -0
  467. {dls_dodal-1.47.0/tests/unit_tests → dls_dodal-1.48.0/tests/fake_zocalo}/__init__.py +0 -0
  468. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/fake_zocalo/__main__.py +0 -0
  469. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/fake_zocalo/dls_start_fake_zocalo.sh +0 -0
  470. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/plan_stubs/test_data_session.py +0 -0
  471. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/plan_stubs/test_motor_util_plans.py +0 -0
  472. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/plan_stubs/test_topup_plan.py +0 -0
  473. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/plans/conftest.py +0 -0
  474. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/plans/test_compliance.py +0 -0
  475. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/plans/test_preprocessors/test_verify_undulator_gap.py +0 -0
  476. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/plans/test_scanspec.py +0 -0
  477. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/plans/test_verify_undulator_gap_plan.py +0 -0
  478. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/plans/test_wrapped.py +0 -0
  479. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/preprocessors/test_filesystem_metadata.py +0 -0
  480. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/bad_beamlineParameters +0 -0
  481. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/electron_analyser/specs_sequence.seq +0 -0
  482. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/electron_analyser/vgscienta_sequence.seq +0 -0
  483. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/i04_beamlineParameters +0 -0
  484. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/test_beamline_dcm_roll_converter.txt +0 -0
  485. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/test_beamline_dcm_roll_converter_non_monotonic.txt +0 -0
  486. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/test_beamline_dcm_roll_converter_reversed.txt +0 -0
  487. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/test_beamline_parameters.txt +0 -0
  488. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/test_det_dist_converter.txt +0 -0
  489. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/test_images/oav_snapshot_expected.png +0 -0
  490. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/test_images/oav_snapshot_test.png +0 -0
  491. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/topup_long_delay.txt +0 -0
  492. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_data/topup_short_params.txt +0 -0
  493. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/test_utils.py +0 -0
  494. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/unit_tests/test_cli.py +0 -0
  495. {dls_dodal-1.47.0 → dls_dodal-1.48.0}/tests/unit_tests/test_log.py +0 -0
@@ -57,6 +57,21 @@ jobs:
57
57
  run: |
58
58
  python .github/scripts/check_test_durations.py unit-report.json 1
59
59
 
60
+ - name: Checkout simulated devices
61
+ uses: actions/checkout@v4
62
+ with:
63
+ repository: epics-containers/example-services
64
+ path: example-services
65
+
66
+ - name: Run docker compose
67
+ uses: hoverkraft-tech/compose-action@v2.2.0
68
+ with:
69
+ compose-file: "./example-services/compose.yaml"
70
+ services: |
71
+ bl01t-di-cam-01
72
+ bl01t-mo-sim-01
73
+ ca-gateway
74
+
60
75
  - name: Run system tests
61
76
  run: tox -e system-report
62
77
 
@@ -77,4 +77,5 @@ lockfiles/
77
77
 
78
78
 
79
79
  # custom CI setup
80
- report.json
80
+ *-report.json
81
+ *_cov.xml
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dls-dodal
3
- Version: 1.47.0
3
+ Version: 1.48.0
4
4
  Summary: Ophyd devices and other utils that could be used across DLS beamlines
5
5
  Author-email: Dominic Oram <dominic.oram@diamond.ac.uk>
6
6
  License: Apache License
@@ -216,7 +216,7 @@ Description-Content-Type: text/markdown
216
216
  License-File: LICENSE
217
217
  Requires-Dist: click
218
218
  Requires-Dist: ophyd
219
- Requires-Dist: ophyd-async>=0.10.0a3
219
+ Requires-Dist: ophyd-async>=0.10.0a4
220
220
  Requires-Dist: bluesky
221
221
  Requires-Dist: pyepics
222
222
  Requires-Dist: dataclasses-json
@@ -0,0 +1,21 @@
1
+ # 5. Encourage aliasing at EPICS level
2
+
3
+ Date: 2025-05-13
4
+
5
+ ## Status
6
+
7
+ Proposed
8
+
9
+ ## Context
10
+
11
+ Many devices have the same functional set of PVs with differing addresses, requiring that either device classes in dodal are generic to support them or duplicate classes are created and must be maintained.
12
+
13
+ ## Decision
14
+
15
+ Dodal device classes should be made generic before duplicate classes are created, to ensure that upgrades and benefits are shared. Prior to making a device class generic a reasonable attempt should be made to unify the devices at the epics level.
16
+
17
+ When a new device is onboarded into dodal, there should be clear guidance for the support and controls engineers to use to determine whether an alias should be added to the support module or configurability should be added to the device class.
18
+
19
+ ## Consequences
20
+
21
+ Documentation on making new devices has been updated and the commitment to trying to standardise devices has been codified.
@@ -0,0 +1,28 @@
1
+ Creating a new device
2
+ ---------------------
3
+
4
+ Devices are written using the ophyd-async framework, the hardware abstraction library at Diamond.
5
+
6
+ Reusing an existing class
7
+ =========================
8
+
9
+ When creating a new device, first check if there is a device class that claims to support the device: e.g. all EPICS Motor records should use the [Motor](https://github.com/bluesky/ophyd-async/blob/main/src/ophyd_async/epics/motor.py) type; for reading or monitoring signals from the storage ring the [Synchrotron](https://github.com/DiamondLightSource/dodal/blob/main/src/dodal/devices/synchrotron.py) device should be used; AreaDetectors should use the [StandardDetector](https://github.com/bluesky/ophyd-async/blob/main/src/ophyd_async/core/_detector.py) type- of which there are examples in ophyd_async and in dodal.
10
+
11
+ If there is a compatible device class it should be used- adding it to the [the beamline](./create-beamline.rst)- this prevents reimplementing the device, and allows improvements to be shared. Improving the device to meet your use case is better than starting again.
12
+
13
+ If a device class is incompatible due to differences in PV address only, first request that an alias is added to the EPICS support module for the IOC - or request support in making that change. Only if it is not possible to add an alias, for example the support module is proprietary, add configurability to the dodal device class, taking care not to break existing devices- e.g. make new fields have a default that matches the existing pattern, and ensure that `dodal connect` is still able to connect to the device for the existing instances.
14
+
15
+ If the device class is sufficiently different (or you cannot find a similar device), create a device that connects to the required signals and can be tested for your desired behaviour. During the review process, attempts to bring it closer in line with existing devices may allow to deduplicate some parts, through inheritance or composition of the device from existing components.
16
+
17
+
18
+ Writing a device class
19
+ ======================
20
+
21
+ The aim should be to get a new device ready for testing it on the beamline as soon as possible, to ensure fast iteration: write a device against your assumptions of how it should work, write tests against those assumptions then test your assumptions on the beamline. Write issues from beamline testing, to resolve offline to reserve as much time for testing that requires the beamline as possible.
22
+
23
+ Dodal's CLI `dodal connect <beamline>` is a useful way to verify that PV addresses are correct, together with `cainfo <PV address>` to find the datatype of signals.
24
+
25
+ If you're not sure how to represent a PV as a Signal: ask! Seek feedback early (e.g. by opening a draft PR) and merge with other devices where it makes sense to. The test suite should provide confidence to do so without breaking existing code.
26
+
27
+
28
+ .. _ophyd-async: https://blueskyproject.io/ophyd-async/main/how-to/choose-interfaces-for-devices.html
@@ -15,7 +15,7 @@ description = "Ophyd devices and other utils that could be used across DLS beaml
15
15
  dependencies = [
16
16
  "click",
17
17
  "ophyd",
18
- "ophyd-async>=0.10.0a3",
18
+ "ophyd-async>=0.10.0a4",
19
19
  "bluesky",
20
20
  "pyepics",
21
21
  "dataclasses-json",
@@ -24,9 +24,9 @@ dependencies = [
24
24
  "requests",
25
25
  "graypy",
26
26
  "pydantic>=2.0",
27
- "opencv-python-headless", # For pin-tip detection.
28
- "aioca", # Required for CA support with ophyd-async.
29
- "p4p", # Required for PVA support with ophyd-async.
27
+ "opencv-python-headless", # For pin-tip detection.
28
+ "aioca", # Required for CA support with ophyd-async.
29
+ "p4p", # Required for PVA support with ophyd-async.
30
30
  "numpy",
31
31
  "aiofiles",
32
32
  "aiohttp",
@@ -103,12 +103,11 @@ reportMissingImports = false # Ignore missing stubs in imported modules
103
103
  # Run pytest with all our checkers, and don't spam us with massive tracebacks on error
104
104
  asyncio_mode = "auto"
105
105
  markers = [
106
- "adsim: marks tests as requiring the containerised AreaDetector simulator running (deselect with '-m \"not adsim\"')",
106
+ "requires: marks tests as requiring other infrastructure",
107
107
  "skip_in_pycharm: marks test as not working in pycharm testrunner",
108
- "system_test: marks test as other system test that requires infrastructure"
109
108
  ]
110
109
  addopts = """
111
- --cov=dodal --cov-report term --cov-report xml:cov.xml
110
+ --cov=src/dodal --cov=dodal --cov-report term
112
111
  --tb=native -vv --doctest-modules --doctest-glob="*.rst"
113
112
  """
114
113
  # https://iscinumpy.gitlab.io/post/bound-version-constraints/#watch-for-warnings
@@ -118,8 +117,6 @@ filterwarnings = [
118
117
  "ignore:dep_util is Deprecated. Use functions from setuptools instead.:DeprecationWarning",
119
118
  # Ignore deprecation warning from zocalo
120
119
  "ignore:.*pkg_resources.*:DeprecationWarning",
121
- # Ignore deprecation warning from setuptools_dso (remove when https://github.com/epics-base/setuptools_dso/issues/36 is released)
122
- "ignore::DeprecationWarning:wheel",
123
120
  ]
124
121
  # Doctest python code in docs, python code in src docstrings, test functions in tests
125
122
  testpaths = "docs src tests system_tests"
@@ -154,12 +151,12 @@ allowlist_externals =
154
151
  sphinx-build
155
152
  sphinx-autobuild
156
153
  commands =
157
- tests: pytest -m 'not (adsim)' --cov=dodal --cov-report term --cov-report xml:cov.xml {posargs}
154
+ tests: pytest -m 'not requires' {posargs}
158
155
  type-checking: pyright src tests {posargs}
159
156
  pre-commit: pre-commit run --all-files --show-diff-on-failure {posargs}
160
157
  docs: sphinx-{posargs:build -E} -T docs build/html
161
- unit-report: pytest -m 'not (adsim)' --cov=dodal --cov-report term --cov-report xml:unit_cov.xml --json-report --json-report-file=unit-report.json tests {posargs}
162
- system-report: pytest -m 'not (adsim or system_test)' --cov=dodal --cov-report term --cov-report xml:system_cov.xml --json-report --json-report-file=system-report.json system_tests {posargs}
158
+ unit-report: pytest --cov-report xml:unit_cov.xml --json-report --json-report-file=unit-report.json tests {posargs}
159
+ system-report: pytest -m 'not requires(instrument="i04")' --cov-report xml:system_cov.xml --json-report --json-report-file=system-report.json system_tests {posargs}
163
160
  """
164
161
 
165
162
  [tool.ruff]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dls-dodal
3
- Version: 1.47.0
3
+ Version: 1.48.0
4
4
  Summary: Ophyd devices and other utils that could be used across DLS beamlines
5
5
  Author-email: Dominic Oram <dominic.oram@diamond.ac.uk>
6
6
  License: Apache License
@@ -216,7 +216,7 @@ Description-Content-Type: text/markdown
216
216
  License-File: LICENSE
217
217
  Requires-Dist: click
218
218
  Requires-Dist: ophyd
219
- Requires-Dist: ophyd-async>=0.10.0a3
219
+ Requires-Dist: ophyd-async>=0.10.0a4
220
220
  Requires-Dist: bluesky
221
221
  Requires-Dist: pyepics
222
222
  Requires-Dist: dataclasses-json
@@ -47,17 +47,18 @@ docs/explanations/decisions/0001-record-architecture-decisions.md
47
47
  docs/explanations/decisions/0002-switched-to-python-copier-template.md
48
48
  docs/explanations/decisions/0003-codeowners.md
49
49
  docs/explanations/decisions/0004-make-devices-factory.md
50
+ docs/explanations/decisions/0005-standardise-devices-at-epics-level.md
50
51
  docs/explanations/decisions/COPYME
51
52
  docs/how-to/build-docs.md
52
53
  docs/how-to/contribute.md
53
54
  docs/how-to/coverage.md
54
55
  docs/how-to/create-beamline.rst
56
+ docs/how-to/create-device.md
55
57
  docs/how-to/dev-install.md
56
58
  docs/how-to/excalidraw.md
57
59
  docs/how-to/external-io-devices.md
58
60
  docs/how-to/lint.md
59
61
  docs/how-to/lock-requirements.md
60
- docs/how-to/make-new-ophyd-async-device.rst
61
62
  docs/how-to/make-release.md
62
63
  docs/how-to/move-code.rst
63
64
  docs/how-to/pypi.md
@@ -170,6 +171,7 @@ src/dodal/devices/watsonmarlow323_pump.py
170
171
  src/dodal/devices/webcam.py
171
172
  src/dodal/devices/xbpm_feedback.py
172
173
  src/dodal/devices/aithre_lasershaping/goniometer.py
174
+ src/dodal/devices/aithre_lasershaping/laser_robot.py
173
175
  src/dodal/devices/areadetector/plugins/CAM.py
174
176
  src/dodal/devices/areadetector/plugins/MJPG.py
175
177
  src/dodal/devices/attenuator/attenuator.py
@@ -284,9 +286,8 @@ src/dodal/plan_stubs/check_topup.py
284
286
  src/dodal/plan_stubs/data_session.py
285
287
  src/dodal/plan_stubs/motor_utils.py
286
288
  src/dodal/plan_stubs/wrapped.py
287
- src/dodal/plan_stubs/electron_analyser/__init__.py
288
- src/dodal/plan_stubs/electron_analyser/configure_driver.py
289
289
  src/dodal/plans/__init__.py
290
+ src/dodal/plans/configure_arm_trigger_and_disarm_detector.py
290
291
  src/dodal/plans/save_panda.py
291
292
  src/dodal/plans/scanspec.py
292
293
  src/dodal/plans/verify_undulator_gap.py
@@ -329,8 +330,8 @@ tests/common/beamlines/test_device_instantiation.py
329
330
  tests/devices/__init__.py
330
331
  tests/devices/test_common_dcm.py
331
332
  tests/devices/test_diamond_filter.py
333
+ tests/devices/aithre_lasershaping/test_goniometer.py
332
334
  tests/devices/i03/__init__.py
333
- tests/devices/i03/test_beamstop.py
334
335
  tests/devices/i04/__init__.py
335
336
  tests/devices/i04/test_murko_results.py
336
337
  tests/devices/i04/test_transfocator.py
@@ -351,6 +352,8 @@ tests/devices/i19/test_shutter.py
351
352
  tests/devices/i22/test_dcm.py
352
353
  tests/devices/i22/test_fswitch.py
353
354
  tests/devices/i22/test_metadataholder.py
355
+ tests/devices/mx_phase1/__init__.py
356
+ tests/devices/mx_phase1/test_beamstop.py
354
357
  tests/devices/training_rig/test_sample_stage.py
355
358
  tests/devices/unit_tests/__init__.py
356
359
  tests/devices/unit_tests/test_OAVCentring.json
@@ -404,6 +407,7 @@ tests/devices/unit_tests/detector/test_detector.py
404
407
  tests/devices/unit_tests/electron_analyser/__init__.py
405
408
  tests/devices/unit_tests/electron_analyser/conftest.py
406
409
  tests/devices/unit_tests/electron_analyser/test_util.py
410
+ tests/devices/unit_tests/electron_analyser/util.py
407
411
  tests/devices/unit_tests/electron_analyser/abstract/__init__.py
408
412
  tests/devices/unit_tests/electron_analyser/abstract/test_base_detector.py
409
413
  tests/devices/unit_tests/electron_analyser/abstract/test_base_driver_io.py
@@ -454,6 +458,7 @@ tests/plan_stubs/test_topup_plan.py
454
458
  tests/plan_stubs/test_wrapped_stubs.py
455
459
  tests/plans/conftest.py
456
460
  tests/plans/test_compliance.py
461
+ tests/plans/test_configure_arm_trigger_and_disarm_detector.py
457
462
  tests/plans/test_scanspec.py
458
463
  tests/plans/test_verify_undulator_gap_plan.py
459
464
  tests/plans/test_wrapped.py
@@ -1,6 +1,6 @@
1
1
  click
2
2
  ophyd
3
- ophyd-async>=0.10.0a3
3
+ ophyd-async>=0.10.0a4
4
4
  bluesky
5
5
  pyepics
6
6
  dataclasses-json
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.47.0'
21
- __version_tuple__ = version_tuple = (1, 47, 0)
20
+ __version__ = version = '1.48.0'
21
+ __version_tuple__ = version_tuple = (1, 48, 0)
@@ -1,5 +1,6 @@
1
1
  from dodal.common.beamlines.beamline_utils import device_factory
2
2
  from dodal.devices.aithre_lasershaping.goniometer import Goniometer
3
+ from dodal.devices.aithre_lasershaping.laser_robot import LaserRobot
3
4
 
4
5
  PREFIX = "LA18L"
5
6
 
@@ -7,3 +8,8 @@ PREFIX = "LA18L"
7
8
  @device_factory()
8
9
  def goniometer() -> Goniometer:
9
10
  return Goniometer(f"{PREFIX}-MO-LSR-01:", "goniometer")
11
+
12
+
13
+ @device_factory()
14
+ def robot() -> LaserRobot:
15
+ return LaserRobot("robot", f"{PREFIX}-MO-ROBOT-01:")
@@ -24,7 +24,7 @@ set_utils_beamline(BL)
24
24
  set_path_provider(
25
25
  StaticVisitPathProvider(
26
26
  BL,
27
- Path("/dls/b01-1/data/"),
27
+ Path("/dls/b01-1/data/2025/cm40661-1/"),
28
28
  client=LocalDirectoryServiceClient(),
29
29
  )
30
30
  )
@@ -1,3 +1,4 @@
1
+ from ophyd_async.fastcs.eiger import EigerDetector as FastEiger
1
2
  from ophyd_async.fastcs.panda import HDFPanda
2
3
 
3
4
  from dodal.common.beamlines.beamline_parameters import get_beamline_parameters
@@ -28,8 +29,8 @@ from dodal.devices.i03 import Beamstop
28
29
  from dodal.devices.i03.dcm import DCM
29
30
  from dodal.devices.i03.undulator_dcm import UndulatorDCM
30
31
  from dodal.devices.motors import XYZPositioner
31
- from dodal.devices.oav.oav_detector import OAV
32
- from dodal.devices.oav.oav_parameters import OAVConfig
32
+ from dodal.devices.oav.oav_detector import OAVBeamCentreFile
33
+ from dodal.devices.oav.oav_parameters import OAVConfigBeamCentre
33
34
  from dodal.devices.oav.pin_image_recognition import PinTipDetection
34
35
  from dodal.devices.qbpm import QBPM
35
36
  from dodal.devices.robot import BartRobot
@@ -172,6 +173,20 @@ def eiger(mock: bool = False) -> EigerDetector:
172
173
  )
173
174
 
174
175
 
176
+ @device_factory()
177
+ def fastcs_eiger() -> FastEiger:
178
+ """Get the i03 FastCS Eiger device, instantiate it if it hasn't already been.
179
+ If this is called when already instantiated in i03, it will return the existing object.
180
+ """
181
+
182
+ return FastEiger(
183
+ prefix=PREFIX.beamline_prefix,
184
+ path_provider=get_path_provider(),
185
+ drv_suffix="-EA-EIGER-02:",
186
+ hdf_suffix="-EA-EIGER-01:OD:",
187
+ )
188
+
189
+
175
190
  @device_factory()
176
191
  def zebra_fast_grid_scan() -> ZebraFastGridScan:
177
192
  """Get the i03 zebra_fast_grid_scan device, instantiate it if it hasn't already been.
@@ -197,15 +212,15 @@ def panda_fast_grid_scan() -> PandAFastGridScan:
197
212
 
198
213
  @device_factory()
199
214
  def oav(
200
- params: OAVConfig | None = None,
201
- ) -> OAV:
215
+ params: OAVConfigBeamCentre | None = None,
216
+ ) -> OAVBeamCentreFile:
202
217
  """Get the i03 OAV device, instantiate it if it hasn't already been.
203
218
  If this is called when already instantiated in i03, it will return the existing object.
204
219
  """
205
- return OAV(
220
+ return OAVBeamCentreFile(
206
221
  prefix=f"{PREFIX.beamline_prefix}-DI-OAV-01:",
207
222
  name="oav",
208
- config=params or OAVConfig(ZOOM_PARAMS_FILE, DISPLAY_CONFIG),
223
+ config=params or OAVConfigBeamCentre(ZOOM_PARAMS_FILE, DISPLAY_CONFIG),
209
224
  )
210
225
 
211
226
 
@@ -24,7 +24,7 @@ from dodal.devices.i04.transfocator import Transfocator
24
24
  from dodal.devices.ipin import IPin
25
25
  from dodal.devices.motors import XYZPositioner
26
26
  from dodal.devices.mx_phase1.beamstop import Beamstop
27
- from dodal.devices.oav.oav_detector import OAV
27
+ from dodal.devices.oav.oav_detector import OAVBeamCentrePV
28
28
  from dodal.devices.oav.oav_parameters import OAVConfig
29
29
  from dodal.devices.oav.oav_to_redis_forwarder import OAVToRedisForwarder
30
30
  from dodal.devices.oav.pin_image_recognition import PinTipDetection
@@ -53,7 +53,7 @@ DISPLAY_CONFIG = "/dls_sw/i04/software/gda_versions/var/display.configuration"
53
53
  DAQ_CONFIGURATION_PATH = "/dls_sw/i04/software/daq_configuration"
54
54
 
55
55
 
56
- BL = get_beamline_name("s04")
56
+ BL = get_beamline_name("i04")
57
57
  set_log_beamline(BL)
58
58
  set_utils_beamline(BL)
59
59
 
@@ -297,18 +297,25 @@ def zebra() -> Zebra:
297
297
 
298
298
 
299
299
  @device_factory(skip=BL == "s04")
300
- def oav(
301
- wait_for_connection: bool = True,
302
- fake_with_ophyd_sim: bool = False,
303
- params: OAVConfig | None = None,
304
- ) -> OAV:
300
+ def oav(params: OAVConfig | None = None) -> OAVBeamCentrePV:
305
301
  """Get the i04 OAV device, instantiate it if it hasn't already been.
306
302
  If this is called when already instantiated in i04, it will return the existing object.
307
303
  """
308
- return OAV(
304
+ return OAVBeamCentrePV(
309
305
  prefix=f"{PREFIX.beamline_prefix}-DI-OAV-01:",
310
- name="oav",
311
- config=params or OAVConfig(ZOOM_PARAMS_FILE, DISPLAY_CONFIG),
306
+ config=params or OAVConfig(ZOOM_PARAMS_FILE),
307
+ )
308
+
309
+
310
+ @device_factory(skip=BL == "s04")
311
+ def oav_full_screen(params: OAVConfig | None = None) -> OAVBeamCentrePV:
312
+ """Get the i04 OAV device, instantiate it if it hasn't already been.
313
+ If this is called when already instantiated in i04, it will return the existing object.
314
+ """
315
+ return OAVBeamCentrePV(
316
+ prefix=f"{PREFIX.beamline_prefix}-DI-OAV-01:",
317
+ config=params or OAVConfig(ZOOM_PARAMS_FILE),
318
+ overlay_channel=3,
312
319
  )
313
320
 
314
321
 
@@ -113,7 +113,7 @@ def hfm() -> KBMirror:
113
113
 
114
114
 
115
115
  @device_factory()
116
- def d7diode() -> Diode:
116
+ def d7_diode() -> Diode:
117
117
  return Diode(f"{PREFIX.beamline_prefix}-DI-PHDGN-07:")
118
118
 
119
119
 
@@ -6,9 +6,12 @@ from dodal.common.beamlines.beamline_utils import (
6
6
  )
7
7
  from dodal.devices.i19.beamstop import BeamStop
8
8
  from dodal.devices.i19.blueapi_device import HutchState
9
- from dodal.devices.i19.shutter import AccessControlledShutter
10
- from dodal.devices.oav.oav_detector import OAV
11
- from dodal.devices.oav.oav_parameters import OAVConfig
9
+ from dodal.devices.i19.shutter import (
10
+ AccessControlledShutter,
11
+ HutchState,
12
+ )
13
+ from dodal.devices.oav.oav_detector import OAVBeamCentreFile
14
+ from dodal.devices.oav.oav_parameters import OAVConfigBeamCentre
12
15
  from dodal.devices.synchrotron import Synchrotron
13
16
  from dodal.devices.zebra.zebra import Zebra
14
17
  from dodal.devices.zebra.zebra_constants_mapping import (
@@ -48,10 +51,10 @@ def beamstop() -> BeamStop:
48
51
 
49
52
 
50
53
  @device_factory()
51
- def oav() -> OAV:
52
- return OAV(
54
+ def oav() -> OAVBeamCentreFile:
55
+ return OAVBeamCentreFile(
53
56
  prefix=f"{PREFIX.beamline_prefix}-EA-OAV-01:",
54
- config=OAVConfig(ZOOM_PARAMS_FILE, DISPLAY_CONFIG),
57
+ config=OAVConfigBeamCentre(ZOOM_PARAMS_FILE, DISPLAY_CONFIG),
55
58
  )
56
59
 
57
60
 
@@ -15,8 +15,8 @@ from dodal.devices.i24.i24_detector_motion import DetectorMotion
15
15
  from dodal.devices.i24.pilatus_metadata import PilatusMetadata
16
16
  from dodal.devices.i24.pmac import PMAC
17
17
  from dodal.devices.i24.vgonio import VerticalGoniometer
18
- from dodal.devices.oav.oav_detector import OAV
19
- from dodal.devices.oav.oav_parameters import OAVConfig
18
+ from dodal.devices.oav.oav_detector import OAVBeamCentreFile
19
+ from dodal.devices.oav.oav_parameters import OAVConfigBeamCentre
20
20
  from dodal.devices.zebra.zebra import Zebra
21
21
  from dodal.devices.zebra.zebra_constants_mapping import (
22
22
  ZebraMapping,
@@ -150,11 +150,11 @@ def pmac() -> PMAC:
150
150
 
151
151
 
152
152
  @device_factory(skip=BL == "s24")
153
- def oav() -> OAV:
154
- return OAV(
153
+ def oav() -> OAVBeamCentreFile:
154
+ return OAVBeamCentreFile(
155
155
  prefix=f"{PREFIX.beamline_prefix}-DI-OAV-01:",
156
156
  name="oav",
157
- config=OAVConfig(ZOOM_PARAMS_FILE, DISPLAY_CONFIG),
157
+ config=OAVConfigBeamCentre(ZOOM_PARAMS_FILE, DISPLAY_CONFIG),
158
158
  )
159
159
 
160
160
 
@@ -1,3 +1,4 @@
1
+ import ast
1
2
  from typing import Any, cast
2
3
 
3
4
  from dodal.log import LOGGER
@@ -57,34 +58,7 @@ class GDABeamlineParameters:
57
58
 
58
59
  @classmethod
59
60
  def parse_value(cls, value: str):
60
- if value[0] == "[":
61
- return cls.parse_list(value[1:].strip())
62
- else:
63
- return cls.parse_list_element(value)
64
-
65
- @classmethod
66
- def parse_list_element(cls, value: str):
67
- if value == "Yes":
68
- return True
69
- elif value == "No":
70
- return False
71
- else:
72
- return float(value)
73
-
74
- @classmethod
75
- def parse_list(cls, value: str):
76
- list_output = []
77
- remaining = value.strip()
78
- i = 0
79
- while (i := remaining.find(",")) != -1:
80
- list_output.append(cls.parse_list_element(remaining[:i]))
81
- remaining = remaining[i + 1 :].lstrip()
82
- if (i := remaining.find("]")) != -1:
83
- list_output.append(cls.parse_list_element(remaining[:i]))
84
- remaining = remaining[i + 1 :].lstrip()
85
- else:
86
- raise ValueError("Missing closing ']' in list expression")
87
- return list_output
61
+ return ast.literal_eval(value.replace("Yes", "True").replace("No", "False"))
88
62
 
89
63
 
90
64
  def get_beamline_parameters(beamline_param_path: str | None = None):
@@ -0,0 +1,49 @@
1
+ import asyncio
2
+ import math
3
+
4
+ from ophyd_async.core import StandardReadable, derived_signal_rw
5
+ from ophyd_async.epics.motor import Motor
6
+
7
+
8
+ class Goniometer(StandardReadable):
9
+ """The Aithre lab goniometer and the XYZ stage it sits on.
10
+
11
+ `x`, `y` and `z` control the axes of the positioner at the base, while `sampy` and
12
+ `sampz` control the positioner of the sample. `omega` is the rotation about the
13
+ x-axis (along the length of the sample holder).
14
+
15
+ The `vertical_position` signal refers to the height of the sample from the point of
16
+ view of the OAV and setting this value moves the sample vertically in the OAV plane
17
+ regardless of the current rotation.
18
+ """
19
+
20
+ def __init__(self, prefix: str, name: str = "") -> None:
21
+ self.x = Motor(prefix + "X")
22
+ self.y = Motor(prefix + "Y")
23
+ self.z = Motor(prefix + "Z")
24
+ self.sampy = Motor(prefix + "SAMPY")
25
+ self.sampz = Motor(prefix + "SAMPZ")
26
+ self.omega = Motor(prefix + "OMEGA")
27
+ self.vertical_position = derived_signal_rw(
28
+ self._get,
29
+ self._set,
30
+ sampy=self.sampy,
31
+ sampz=self.sampz,
32
+ omega=self.omega,
33
+ )
34
+ super().__init__(name)
35
+
36
+ def _get(self, sampz: float, sampy: float, omega: float) -> float:
37
+ z_component = sampz * math.cos(math.radians(omega))
38
+ y_component = sampy * math.sin(math.radians(omega))
39
+ return z_component + y_component
40
+
41
+ async def _set(self, value: float) -> None:
42
+ omega = await self.omega.user_readback.get_value()
43
+ z_component = value * math.cos(math.radians(omega))
44
+ y_component = value * math.sin(math.radians(omega))
45
+ await asyncio.gather(
46
+ self.sampy.set(y_component),
47
+ self.sampz.set(z_component),
48
+ self.omega.set(omega),
49
+ )
@@ -0,0 +1,27 @@
1
+ from ophyd_async.core import StrictEnum
2
+ from ophyd_async.epics.core import epics_signal_rw
3
+
4
+ from dodal.devices.robot import BartRobot
5
+
6
+
7
+ class ForceBit(StrictEnum):
8
+ ON = "On"
9
+ NO = "No"
10
+ OFF = "Off"
11
+
12
+
13
+ class LidHeatEnable(StrictEnum):
14
+ ENABLED = "Enabled"
15
+ DISABLED = "Disabled"
16
+
17
+
18
+ class LaserRobot(BartRobot):
19
+ def __init__(self, name: str, prefix: str) -> None:
20
+ self.dewar_lid_heater = epics_signal_rw(
21
+ LidHeatEnable, prefix + "DW_1_ENABLED", prefix + "DW_1_CTRL"
22
+ )
23
+ self.cryojet_retract = epics_signal_rw(ForceBit, prefix + "OP_24_FORCE_OPTION")
24
+ self.set_beamline_safe = epics_signal_rw(
25
+ ForceBit, prefix + "IP_16_FORCE_OPTION"
26
+ )
27
+ super().__init__(name=name, prefix=prefix)
@@ -0,0 +1,18 @@
1
+ from .abstract.base_detector import (
2
+ ElectronAnalyserDetector,
3
+ ElectronAnalyserRegionDetector,
4
+ TElectronAnalyserDetector,
5
+ TElectronAnalyserRegionDetector,
6
+ )
7
+ from .types import EnergyMode
8
+ from .util import to_binding_energy, to_kinetic_energy
9
+
10
+ __all__ = [
11
+ "to_binding_energy",
12
+ "to_kinetic_energy",
13
+ "EnergyMode",
14
+ "ElectronAnalyserDetector",
15
+ "TElectronAnalyserDetector",
16
+ "ElectronAnalyserRegionDetector",
17
+ "TElectronAnalyserRegionDetector",
18
+ ]
@@ -1,9 +1,6 @@
1
1
  from .base_detector import (
2
2
  AbstractAnalyserDriverIO,
3
3
  AbstractElectronAnalyserDetector,
4
- AbstractElectronAnalyserRegionDetector,
5
- TAbstractElectronAnalyserDetector,
6
- TAbstractElectronAnalyserRegionDetector,
7
4
  )
8
5
  from .base_driver_io import AbstractAnalyserDriverIO, TAbstractAnalyserDriverIO
9
6
  from .base_region import (
@@ -20,9 +17,6 @@ __all__ = [
20
17
  "TAbstractBaseSequence",
21
18
  "AbstractAnalyserDriverIO",
22
19
  "AbstractElectronAnalyserDetector",
23
- "AbstractElectronAnalyserRegionDetector",
24
- "TAbstractElectronAnalyserDetector",
25
- "TAbstractElectronAnalyserRegionDetector",
26
20
  "AbstractAnalyserDriverIO",
27
21
  "TAbstractAnalyserDriverIO",
28
22
  ]