dls-dodal 1.69.0__tar.gz → 2.0.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 (1012) hide show
  1. dls_dodal-2.0.0/PKG-INFO +276 -0
  2. dls_dodal-2.0.0/docs/how-to/build-docs.md +47 -0
  3. dls_dodal-2.0.0/docs/how-to/convert-beamline-to-device-manager.md +131 -0
  4. dls_dodal-2.0.0/docs/how-to/create-beamline.md +129 -0
  5. dls_dodal-2.0.0/docs/how-to/create-device.md +74 -0
  6. dls_dodal-2.0.0/docs/how-to/write-tests.md +152 -0
  7. dls_dodal-2.0.0/docs/reference/glossary.md +50 -0
  8. dls_dodal-2.0.0/docs/reference/style-guide.md +39 -0
  9. dls_dodal-2.0.0/pyproject.toml +312 -0
  10. dls_dodal-2.0.0/src/dls_dodal.egg-info/PKG-INFO +276 -0
  11. dls_dodal-2.0.0/src/dls_dodal.egg-info/SOURCES.txt +722 -0
  12. dls_dodal-2.0.0/src/dodal/_version.py +34 -0
  13. dls_dodal-2.0.0/src/dodal/beamlines/__init__.py +91 -0
  14. dls_dodal-2.0.0/src/dodal/beamlines/adsim.py +88 -0
  15. dls_dodal-2.0.0/src/dodal/beamlines/b01_1.py +110 -0
  16. dls_dodal-2.0.0/src/dodal/beamlines/b07.py +42 -0
  17. dls_dodal-2.0.0/src/dodal/beamlines/b07_1.py +52 -0
  18. dls_dodal-2.0.0/src/dodal/beamlines/b07_shared.py +12 -0
  19. dls_dodal-2.0.0/src/dodal/beamlines/b16.py +68 -0
  20. dls_dodal-2.0.0/src/dodal/beamlines/b21.py +159 -0
  21. dls_dodal-2.0.0/src/dodal/beamlines/i02_1.py +89 -0
  22. dls_dodal-2.0.0/src/dodal/beamlines/i02_2.py +26 -0
  23. dls_dodal-2.0.0/src/dodal/beamlines/i03.py +365 -0
  24. dls_dodal-2.0.0/src/dodal/beamlines/i04.py +315 -0
  25. dls_dodal-2.0.0/src/dodal/beamlines/i05.py +19 -0
  26. dls_dodal-2.0.0/src/dodal/beamlines/i05_1.py +13 -0
  27. dls_dodal-2.0.0/src/dodal/beamlines/i05_shared.py +51 -0
  28. dls_dodal-2.0.0/src/dodal/beamlines/i06_1.py +26 -0
  29. dls_dodal-2.0.0/src/dodal/beamlines/i06_shared.py +73 -0
  30. dls_dodal-2.0.0/src/dodal/beamlines/i07.py +39 -0
  31. dls_dodal-2.0.0/src/dodal/beamlines/i09.py +106 -0
  32. dls_dodal-2.0.0/src/dodal/beamlines/i09_1.py +53 -0
  33. dls_dodal-2.0.0/src/dodal/beamlines/i09_1_shared.py +61 -0
  34. dls_dodal-2.0.0/src/dodal/beamlines/i09_2.py +19 -0
  35. dls_dodal-2.0.0/src/dodal/beamlines/i09_2_shared.py +110 -0
  36. dls_dodal-2.0.0/src/dodal/beamlines/i10.py +180 -0
  37. dls_dodal-2.0.0/src/dodal/beamlines/i10_1.py +124 -0
  38. dls_dodal-2.0.0/src/dodal/beamlines/i10_shared.py +274 -0
  39. dls_dodal-2.0.0/src/dodal/beamlines/i11.py +139 -0
  40. dls_dodal-2.0.0/src/dodal/beamlines/i13_1.py +58 -0
  41. dls_dodal-2.0.0/src/dodal/beamlines/i15.py +242 -0
  42. dls_dodal-2.0.0/src/dodal/beamlines/i15_1.py +156 -0
  43. dls_dodal-2.0.0/src/dodal/beamlines/i17.py +109 -0
  44. dls_dodal-2.0.0/src/dodal/beamlines/i18.py +131 -0
  45. dls_dodal-2.0.0/src/dodal/beamlines/i19_1.py +164 -0
  46. dls_dodal-2.0.0/src/dodal/beamlines/i19_2.py +156 -0
  47. dls_dodal-2.0.0/src/dodal/beamlines/i19_optics.py +49 -0
  48. dls_dodal-2.0.0/src/dodal/beamlines/i20_1.py +94 -0
  49. dls_dodal-2.0.0/src/dodal/beamlines/i21.py +131 -0
  50. dls_dodal-2.0.0/src/dodal/beamlines/i22.py +306 -0
  51. dls_dodal-2.0.0/src/dodal/beamlines/i23.py +103 -0
  52. dls_dodal-2.0.0/src/dodal/beamlines/i24.py +169 -0
  53. dls_dodal-2.0.0/src/dodal/beamlines/k07.py +128 -0
  54. dls_dodal-2.0.0/src/dodal/beamlines/p38.py +211 -0
  55. dls_dodal-2.0.0/src/dodal/beamlines/p60.py +69 -0
  56. dls_dodal-2.0.0/src/dodal/beamlines/p99.py +93 -0
  57. dls_dodal-2.0.0/src/dodal/beamlines/training_rig.py +59 -0
  58. dls_dodal-2.0.0/src/dodal/cli.py +175 -0
  59. dls_dodal-2.0.0/src/dodal/common/beamlines/beamline_parameters.py +75 -0
  60. dls_dodal-2.0.0/src/dodal/common/beamlines/beamline_utils.py +178 -0
  61. dls_dodal-2.0.0/src/dodal/common/beamlines/commissioning_mode.py +36 -0
  62. dls_dodal-2.0.0/src/dodal/common/coordination.py +39 -0
  63. dls_dodal-2.0.0/src/dodal/common/crystal_metadata.py +58 -0
  64. dls_dodal-2.0.0/src/dodal/common/device_utils.py +46 -0
  65. dls_dodal-2.0.0/src/dodal/common/maths.py +118 -0
  66. dls_dodal-2.0.0/src/dodal/common/udc_directory_provider.py +61 -0
  67. dls_dodal-2.0.0/src/dodal/common/visit.py +149 -0
  68. dls_dodal-2.0.0/src/dodal/common/watcher_utils.py +84 -0
  69. dls_dodal-2.0.0/src/dodal/device_manager.py +644 -0
  70. dls_dodal-2.0.0/src/dodal/devices/aperturescatterguard.py +374 -0
  71. dls_dodal-2.0.0/src/dodal/devices/areadetector/plugins/cam.py +27 -0
  72. dls_dodal-2.0.0/src/dodal/devices/areadetector/plugins/mjpg.py +91 -0
  73. dls_dodal-2.0.0/src/dodal/devices/attenuator/attenuator.py +164 -0
  74. dls_dodal-2.0.0/src/dodal/devices/beamlines/b07/__init__.py +3 -0
  75. dls_dodal-2.0.0/src/dodal/devices/beamlines/b07_1/__init__.py +12 -0
  76. dls_dodal-2.0.0/src/dodal/devices/beamlines/b07_1/ccmc.py +74 -0
  77. dls_dodal-2.0.0/src/dodal/devices/beamlines/b16/detector.py +24 -0
  78. dls_dodal-2.0.0/src/dodal/devices/beamlines/i02_1/fast_grid_scan.py +60 -0
  79. dls_dodal-2.0.0/src/dodal/devices/beamlines/i02_1/sample_motors.py +19 -0
  80. dls_dodal-2.0.0/src/dodal/devices/beamlines/i03/beamsize.py +39 -0
  81. dls_dodal-2.0.0/src/dodal/devices/beamlines/i03/dcm.py +61 -0
  82. dls_dodal-2.0.0/src/dodal/devices/beamlines/i03/undulator_dcm.py +68 -0
  83. dls_dodal-2.0.0/src/dodal/devices/beamlines/i04/beam_centre.py +151 -0
  84. dls_dodal-2.0.0/src/dodal/devices/beamlines/i04/beamsize.py +49 -0
  85. dls_dodal-2.0.0/src/dodal/devices/beamlines/i04/murko_results.py +296 -0
  86. dls_dodal-2.0.0/src/dodal/devices/beamlines/i04/transfocator.py +78 -0
  87. dls_dodal-2.0.0/src/dodal/devices/beamlines/i05/__init__.py +3 -0
  88. dls_dodal-2.0.0/src/dodal/devices/beamlines/i06_shared/__init__.py +3 -0
  89. dls_dodal-2.0.0/src/dodal/devices/beamlines/i06_shared/i06_enum.py +7 -0
  90. dls_dodal-2.0.0/src/dodal/devices/beamlines/i07/dcm.py +32 -0
  91. dls_dodal-2.0.0/src/dodal/devices/beamlines/i07/id.py +37 -0
  92. dls_dodal-2.0.0/src/dodal/devices/beamlines/i09/__init__.py +3 -0
  93. dls_dodal-2.0.0/src/dodal/devices/beamlines/i09_1_shared/hard_energy.py +111 -0
  94. dls_dodal-2.0.0/src/dodal/devices/beamlines/i09_1_shared/hard_undulator_functions.py +178 -0
  95. dls_dodal-2.0.0/src/dodal/devices/beamlines/i10/diagnostics.py +220 -0
  96. dls_dodal-2.0.0/src/dodal/devices/beamlines/i10/i10_apple2.py +183 -0
  97. dls_dodal-2.0.0/src/dodal/devices/beamlines/i10/rasor/rasor_current_amp.py +49 -0
  98. dls_dodal-2.0.0/src/dodal/devices/beamlines/i10/rasor/rasor_motors.py +48 -0
  99. dls_dodal-2.0.0/src/dodal/devices/beamlines/i10/slits.py +158 -0
  100. dls_dodal-2.0.0/src/dodal/devices/beamlines/i10_1/__init__.py +9 -0
  101. dls_dodal-2.0.0/src/dodal/devices/beamlines/i10_1/electromagnet/magnet.py +16 -0
  102. dls_dodal-2.0.0/src/dodal/devices/beamlines/i10_1/electromagnet/stages.py +14 -0
  103. dls_dodal-2.0.0/src/dodal/devices/beamlines/i10_1/scaler_cards.py +13 -0
  104. dls_dodal-2.0.0/src/dodal/devices/beamlines/i11/cyberstar_blower.py +34 -0
  105. dls_dodal-2.0.0/src/dodal/devices/beamlines/i11/diff_stages.py +53 -0
  106. dls_dodal-2.0.0/src/dodal/devices/beamlines/i11/mythen.py +164 -0
  107. dls_dodal-2.0.0/src/dodal/devices/beamlines/i11/nx100robot.py +153 -0
  108. dls_dodal-2.0.0/src/dodal/devices/beamlines/i11/spinner.py +30 -0
  109. dls_dodal-2.0.0/src/dodal/devices/beamlines/i13_1/merlin.py +32 -0
  110. dls_dodal-2.0.0/src/dodal/devices/beamlines/i15/dcm.py +38 -0
  111. dls_dodal-2.0.0/src/dodal/devices/beamlines/i15/focussing_mirror.py +55 -0
  112. dls_dodal-2.0.0/src/dodal/devices/beamlines/i15/jack.py +31 -0
  113. dls_dodal-2.0.0/src/dodal/devices/beamlines/i15/multilayer_mirror.py +21 -0
  114. dls_dodal-2.0.0/src/dodal/devices/beamlines/i17/i17_apple2.py +60 -0
  115. dls_dodal-2.0.0/src/dodal/devices/beamlines/i18/diode.py +50 -0
  116. dls_dodal-2.0.0/src/dodal/devices/beamlines/i19/access_controlled/attenuator_motor_squad.py +65 -0
  117. dls_dodal-2.0.0/src/dodal/devices/beamlines/i19/access_controlled/blueapi_device.py +111 -0
  118. dls_dodal-2.0.0/src/dodal/devices/beamlines/i19/access_controlled/piezo_control.py +72 -0
  119. dls_dodal-2.0.0/src/dodal/devices/beamlines/i19/access_controlled/shutter.py +54 -0
  120. dls_dodal-2.0.0/src/dodal/devices/beamlines/i19/backlight.py +19 -0
  121. dls_dodal-2.0.0/src/dodal/devices/beamlines/i19/mapt_configuration.py +39 -0
  122. dls_dodal-2.0.0/src/dodal/devices/beamlines/i19/pin_col_stages.py +173 -0
  123. dls_dodal-2.0.0/src/dodal/devices/beamlines/i19/pin_tip.py +32 -0
  124. dls_dodal-2.0.0/src/dodal/devices/beamlines/i21/__init__.py +3 -0
  125. dls_dodal-2.0.0/src/dodal/devices/beamlines/i22/dcm.py +121 -0
  126. dls_dodal-2.0.0/src/dodal/devices/beamlines/i22/fswitch.py +88 -0
  127. dls_dodal-2.0.0/src/dodal/devices/beamlines/i22/nxsas.py +167 -0
  128. dls_dodal-2.0.0/src/dodal/devices/beamlines/i24/beam_center.py +11 -0
  129. dls_dodal-2.0.0/src/dodal/devices/beamlines/i24/beamstop.py +33 -0
  130. dls_dodal-2.0.0/src/dodal/devices/beamlines/i24/commissioning_jungfrau.py +122 -0
  131. dls_dodal-2.0.0/src/dodal/devices/beamlines/i24/dcm.py +27 -0
  132. dls_dodal-2.0.0/src/dodal/devices/beamlines/i24/dual_backlight.py +59 -0
  133. dls_dodal-2.0.0/src/dodal/devices/beamlines/i24/pmac.py +234 -0
  134. dls_dodal-2.0.0/src/dodal/devices/beamlines/p60/lab_xray_source.py +22 -0
  135. dls_dodal-2.0.0/src/dodal/devices/beamlines/p99/andor2_point.py +37 -0
  136. dls_dodal-2.0.0/src/dodal/devices/bimorph_mirror.py +143 -0
  137. dls_dodal-2.0.0/src/dodal/devices/collimation_table.py +37 -0
  138. dls_dodal-2.0.0/src/dodal/devices/common_dcm.py +134 -0
  139. dls_dodal-2.0.0/src/dodal/devices/controllers.py +23 -0
  140. dls_dodal-2.0.0/src/dodal/devices/cryostream.py +109 -0
  141. dls_dodal-2.0.0/src/dodal/devices/current_amplifiers/current_amplifier.py +96 -0
  142. dls_dodal-2.0.0/src/dodal/devices/current_amplifiers/current_amplifier_detector.py +108 -0
  143. dls_dodal-2.0.0/src/dodal/devices/current_amplifiers/femto.py +137 -0
  144. dls_dodal-2.0.0/src/dodal/devices/current_amplifiers/sr570.py +209 -0
  145. dls_dodal-2.0.0/src/dodal/devices/current_amplifiers/struck_scaler_counter.py +79 -0
  146. dls_dodal-2.0.0/src/dodal/devices/detector/det_resolution.py +92 -0
  147. dls_dodal-2.0.0/src/dodal/devices/detector/detector.py +138 -0
  148. dls_dodal-2.0.0/src/dodal/devices/diamond_filter.py +33 -0
  149. dls_dodal-2.0.0/src/dodal/devices/eiger.py +458 -0
  150. dls_dodal-2.0.0/src/dodal/devices/eiger_odin.py +174 -0
  151. dls_dodal-2.0.0/src/dodal/devices/electron_analyser/base/base_controller.py +84 -0
  152. dls_dodal-2.0.0/src/dodal/devices/electron_analyser/base/base_detector.py +209 -0
  153. dls_dodal-2.0.0/src/dodal/devices/electron_analyser/base/base_driver_io.py +224 -0
  154. dls_dodal-2.0.0/src/dodal/devices/electron_analyser/base/base_region.py +200 -0
  155. dls_dodal-2.0.0/src/dodal/devices/electron_analyser/base/base_util.py +35 -0
  156. dls_dodal-2.0.0/src/dodal/devices/electron_analyser/base/energy_sources.py +96 -0
  157. dls_dodal-2.0.0/src/dodal/devices/eurotherm.py +127 -0
  158. dls_dodal-2.0.0/src/dodal/devices/fast_grid_scan.py +484 -0
  159. dls_dodal-2.0.0/src/dodal/devices/fast_shutter.py +155 -0
  160. dls_dodal-2.0.0/src/dodal/devices/flux.py +14 -0
  161. dls_dodal-2.0.0/src/dodal/devices/focusing_mirror.py +238 -0
  162. dls_dodal-2.0.0/src/dodal/devices/hutch_shutter.py +105 -0
  163. dls_dodal-2.0.0/src/dodal/devices/insertion_device/__init__.py +70 -0
  164. dls_dodal-2.0.0/src/dodal/devices/insertion_device/apple2_controller.py +371 -0
  165. dls_dodal-2.0.0/src/dodal/devices/insertion_device/apple2_undulator.py +406 -0
  166. dls_dodal-2.0.0/src/dodal/devices/insertion_device/apple_knot_controller.py +222 -0
  167. dls_dodal-2.0.0/src/dodal/devices/insertion_device/energy.py +161 -0
  168. dls_dodal-2.0.0/src/dodal/devices/insertion_device/energy_motor_lookup.py +81 -0
  169. dls_dodal-2.0.0/src/dodal/devices/insertion_device/lookup_table_models.py +312 -0
  170. dls_dodal-2.0.0/src/dodal/devices/insertion_device/polarisation.py +36 -0
  171. dls_dodal-2.0.0/src/dodal/devices/ipin.py +31 -0
  172. dls_dodal-2.0.0/src/dodal/devices/linkam3.py +60 -0
  173. dls_dodal-2.0.0/src/dodal/devices/motors.py +361 -0
  174. dls_dodal-2.0.0/src/dodal/devices/mx_phase1/beamstop.py +112 -0
  175. dls_dodal-2.0.0/src/dodal/devices/oav/oav_calculations.py +73 -0
  176. dls_dodal-2.0.0/src/dodal/devices/oav/oav_detector.py +330 -0
  177. dls_dodal-2.0.0/src/dodal/devices/oav/oav_parameters.py +187 -0
  178. dls_dodal-2.0.0/src/dodal/devices/oav/oav_to_redis_forwarder.py +178 -0
  179. dls_dodal-2.0.0/src/dodal/devices/oav/pin_image_recognition/__init__.py +167 -0
  180. dls_dodal-2.0.0/src/dodal/devices/oav/pin_image_recognition/manual_test.py +33 -0
  181. dls_dodal-2.0.0/src/dodal/devices/oav/pin_image_recognition/utils.py +271 -0
  182. dls_dodal-2.0.0/src/dodal/devices/oav/snapshots/grid_overlay.py +119 -0
  183. dls_dodal-2.0.0/src/dodal/devices/oav/snapshots/snapshot_image_processing.py +76 -0
  184. dls_dodal-2.0.0/src/dodal/devices/oav/utils.py +135 -0
  185. dls_dodal-2.0.0/src/dodal/devices/p45.py +37 -0
  186. dls_dodal-2.0.0/src/dodal/devices/pgm.py +34 -0
  187. dls_dodal-2.0.0/src/dodal/devices/pressure_jump_cell.py +338 -0
  188. dls_dodal-2.0.0/src/dodal/devices/qbpm.py +16 -0
  189. dls_dodal-2.0.0/src/dodal/devices/robot.py +227 -0
  190. dls_dodal-2.0.0/src/dodal/devices/s4_slit_gaps.py +12 -0
  191. dls_dodal-2.0.0/src/dodal/devices/selectable_source.py +41 -0
  192. dls_dodal-2.0.0/src/dodal/devices/slits.py +54 -0
  193. dls_dodal-2.0.0/src/dodal/devices/smargon.py +134 -0
  194. dls_dodal-2.0.0/src/dodal/devices/temperture_controller/lakeshore/lakeshore.py +178 -0
  195. dls_dodal-2.0.0/src/dodal/devices/temperture_controller/lakeshore/lakeshore_io.py +98 -0
  196. dls_dodal-2.0.0/src/dodal/devices/tetramm.py +283 -0
  197. dls_dodal-2.0.0/src/dodal/devices/turbo_slit.py +32 -0
  198. dls_dodal-2.0.0/src/dodal/devices/undulator.py +257 -0
  199. dls_dodal-2.0.0/src/dodal/devices/util/adjuster_plans.py +24 -0
  200. dls_dodal-2.0.0/src/dodal/devices/util/epics_util.py +128 -0
  201. dls_dodal-2.0.0/src/dodal/devices/util/lookup_tables.py +109 -0
  202. dls_dodal-2.0.0/src/dodal/devices/v2f.py +38 -0
  203. dls_dodal-2.0.0/src/dodal/devices/watsonmarlow323_pump.py +45 -0
  204. dls_dodal-2.0.0/src/dodal/devices/xbpm_feedback.py +35 -0
  205. dls_dodal-2.0.0/src/dodal/devices/xspress3/xspress3.py +141 -0
  206. dls_dodal-2.0.0/src/dodal/devices/xspress3/xspress3_channel.py +37 -0
  207. dls_dodal-2.0.0/src/dodal/devices/zebra/zebra.py +310 -0
  208. dls_dodal-2.0.0/src/dodal/devices/zebra/zebra_constants_mapping.py +101 -0
  209. dls_dodal-2.0.0/src/dodal/devices/zebra/zebra_controlled_shutter.py +53 -0
  210. dls_dodal-2.0.0/src/dodal/devices/zocalo/zocalo_interaction.py +111 -0
  211. dls_dodal-2.0.0/src/dodal/devices/zocalo/zocalo_results.py +347 -0
  212. dls_dodal-2.0.0/src/dodal/log.py +294 -0
  213. dls_dodal-2.0.0/src/dodal/plan_stubs/check_topup.py +137 -0
  214. dls_dodal-2.0.0/src/dodal/plan_stubs/data_session.py +62 -0
  215. dls_dodal-2.0.0/src/dodal/plan_stubs/motor_utils.py +121 -0
  216. dls_dodal-2.0.0/src/dodal/plan_stubs/pressure_jump_cell.py +18 -0
  217. dls_dodal-2.0.0/src/dodal/plan_stubs/wrapped.py +133 -0
  218. dls_dodal-2.0.0/src/dodal/plans/bimorph.py +344 -0
  219. dls_dodal-2.0.0/src/dodal/plans/device_setup_plans/__init__.py +5 -0
  220. dls_dodal-2.0.0/src/dodal/plans/device_setup_plans/setup_pin_tip_params.py +63 -0
  221. dls_dodal-2.0.0/src/dodal/plans/preprocessors/verify_undulator_gap.py +51 -0
  222. dls_dodal-2.0.0/src/dodal/plans/spec_path.py +64 -0
  223. dls_dodal-2.0.0/src/dodal/plans/verify_undulator_gap.py +18 -0
  224. dls_dodal-2.0.0/src/dodal/plans/wrapped.py +58 -0
  225. dls_dodal-2.0.0/src/dodal/testing/electron_analyser/device_factory.py +57 -0
  226. dls_dodal-2.0.0/src/dodal/testing/fixtures/devices/apple2.py +116 -0
  227. dls_dodal-2.0.0/src/dodal/testing/fixtures/run_engine.py +118 -0
  228. dls_dodal-2.0.0/src/dodal/testing/fixtures/utils.py +56 -0
  229. dls_dodal-2.0.0/src/dodal/utils.py +567 -0
  230. dls_dodal-2.0.0/system_tests/test_adsim.py +224 -0
  231. dls_dodal-2.0.0/tests/beamlines/test_b16.py +66 -0
  232. dls_dodal-2.0.0/tests/beamlines/test_i24.py +13 -0
  233. dls_dodal-2.0.0/tests/common/beamlines/test_device_instantiation.py +65 -0
  234. dls_dodal-2.0.0/tests/conftest.py +169 -0
  235. dls_dodal-2.0.0/tests/devices/beamlines/b07_1/test_ccmc.py +109 -0
  236. dls_dodal-2.0.0/tests/devices/beamlines/i02_1/test_fast_grid_scan.py +22 -0
  237. dls_dodal-2.0.0/tests/devices/beamlines/i03/test_beamsize.py +43 -0
  238. dls_dodal-2.0.0/tests/devices/beamlines/i03/test_dcm.py +43 -0
  239. dls_dodal-2.0.0/tests/devices/beamlines/i03/test_undulator_dcm.py +244 -0
  240. dls_dodal-2.0.0/tests/devices/beamlines/i04/conftest.py +11 -0
  241. dls_dodal-2.0.0/tests/devices/beamlines/i04/test_beam_centre.py +209 -0
  242. dls_dodal-2.0.0/tests/devices/beamlines/i04/test_beamsize.py +50 -0
  243. dls_dodal-2.0.0/tests/devices/beamlines/i04/test_max_pixel.py +56 -0
  244. dls_dodal-2.0.0/tests/devices/beamlines/i04/test_murko_results.py +849 -0
  245. dls_dodal-2.0.0/tests/devices/beamlines/i04/test_transfocator.py +48 -0
  246. dls_dodal-2.0.0/tests/devices/beamlines/i07/test_dcm.py +36 -0
  247. dls_dodal-2.0.0/tests/devices/beamlines/i07/test_id.py +34 -0
  248. dls_dodal-2.0.0/tests/devices/beamlines/i09_1_shared/test_hard_energy.py +243 -0
  249. dls_dodal-2.0.0/tests/devices/beamlines/i09_1_shared/test_undulator_functions.py +76 -0
  250. dls_dodal-2.0.0/tests/devices/beamlines/i09_2_shared/test_i09_apple2.py +372 -0
  251. dls_dodal-2.0.0/tests/devices/beamlines/i10/test_i10_apple2.py +728 -0
  252. dls_dodal-2.0.0/tests/devices/beamlines/i10_1/electromagnet/test_magnet.py +16 -0
  253. dls_dodal-2.0.0/tests/devices/beamlines/i10_1/electromagnet/test_stages.py +16 -0
  254. dls_dodal-2.0.0/tests/devices/beamlines/i10_1/test_scaler_cards.py +24 -0
  255. dls_dodal-2.0.0/tests/devices/beamlines/i11/test_i11devices.py +204 -0
  256. dls_dodal-2.0.0/tests/devices/beamlines/i11/test_mythen.py +86 -0
  257. dls_dodal-2.0.0/tests/devices/beamlines/i13_1/test_merlin.py +106 -0
  258. dls_dodal-2.0.0/tests/devices/beamlines/i17/test_i17_apple2.py +70 -0
  259. dls_dodal-2.0.0/tests/devices/beamlines/i18/test_kb_mirror.py +36 -0
  260. dls_dodal-2.0.0/tests/devices/beamlines/i19/access_controlled/test_attenuator_motor_squad.py +136 -0
  261. dls_dodal-2.0.0/tests/devices/beamlines/i19/access_controlled/test_attenuator_position_demand.py +145 -0
  262. dls_dodal-2.0.0/tests/devices/beamlines/i19/access_controlled/test_piezo_control.py +174 -0
  263. dls_dodal-2.0.0/tests/devices/beamlines/i19/access_controlled/test_shutter.py +215 -0
  264. dls_dodal-2.0.0/tests/devices/beamlines/i19/test_backlight.py +18 -0
  265. dls_dodal-2.0.0/tests/devices/beamlines/i19/test_beamstop.py +15 -0
  266. dls_dodal-2.0.0/tests/devices/beamlines/i19/test_diffractometer.py +39 -0
  267. dls_dodal-2.0.0/tests/devices/beamlines/i19/test_mapt.py +63 -0
  268. dls_dodal-2.0.0/tests/devices/beamlines/i19/test_pin_col.py +157 -0
  269. dls_dodal-2.0.0/tests/devices/beamlines/i22/test_dcm.py +128 -0
  270. dls_dodal-2.0.0/tests/devices/beamlines/i22/test_fswitch.py +61 -0
  271. dls_dodal-2.0.0/tests/devices/beamlines/i22/test_metadataholder.py +38 -0
  272. dls_dodal-2.0.0/tests/devices/beamlines/i24/test_commissioning_jungfrau.py +69 -0
  273. dls_dodal-2.0.0/tests/devices/beamlines/i24/test_dual_backlight.py +70 -0
  274. dls_dodal-2.0.0/tests/devices/beamlines/i24/test_focus_mirrors.py +32 -0
  275. dls_dodal-2.0.0/tests/devices/beamlines/i24/test_pmac.py +149 -0
  276. dls_dodal-2.0.0/tests/devices/beamlines/i24/test_vgonio.py +24 -0
  277. dls_dodal-2.0.0/tests/devices/beamlines/p60/test_lab_xray_source.py +117 -0
  278. dls_dodal-2.0.0/tests/devices/beamlines/p99/test_p99_stage.py +45 -0
  279. dls_dodal-2.0.0/tests/devices/current_amplifier/test_femto.py +306 -0
  280. dls_dodal-2.0.0/tests/devices/current_amplifier/test_sr570.py +306 -0
  281. dls_dodal-2.0.0/tests/devices/electron_analyser/base/test_base_detector.py +212 -0
  282. dls_dodal-2.0.0/tests/devices/electron_analyser/base/test_base_driver_io.py +68 -0
  283. dls_dodal-2.0.0/tests/devices/electron_analyser/base/test_base_region.py +155 -0
  284. dls_dodal-2.0.0/tests/devices/electron_analyser/conftest.py +131 -0
  285. dls_dodal-2.0.0/tests/devices/electron_analyser/specs/test_specs_detector.py +46 -0
  286. dls_dodal-2.0.0/tests/devices/electron_analyser/specs/test_specs_driver_io.py +208 -0
  287. dls_dodal-2.0.0/tests/devices/electron_analyser/specs/test_specs_region.py +103 -0
  288. dls_dodal-2.0.0/tests/devices/electron_analyser/vgscienta/test_vgscienta_detector.py +41 -0
  289. dls_dodal-2.0.0/tests/devices/electron_analyser/vgscienta/test_vgscienta_driver_io.py +216 -0
  290. dls_dodal-2.0.0/tests/devices/electron_analyser/vgscienta/test_vgsicenta_region.py +125 -0
  291. dls_dodal-2.0.0/tests/devices/insertion_device/test_apple2_controller.py +146 -0
  292. dls_dodal-2.0.0/tests/devices/insertion_device/test_apple2_undulator.py +473 -0
  293. dls_dodal-2.0.0/tests/devices/insertion_device/test_apple_knot_path_finder.py +248 -0
  294. dls_dodal-2.0.0/tests/devices/insertion_device/test_apple_knot_undulator.py +194 -0
  295. dls_dodal-2.0.0/tests/devices/insertion_device/test_energy.py +222 -0
  296. dls_dodal-2.0.0/tests/devices/mx_phase1/test_beamstop.py +134 -0
  297. dls_dodal-2.0.0/tests/devices/test_aperture_scatterguard.py +571 -0
  298. dls_dodal-2.0.0/tests/devices/test_bart_robot.py +307 -0
  299. dls_dodal-2.0.0/tests/devices/test_bimorph_mirror.py +162 -0
  300. dls_dodal-2.0.0/tests/devices/test_focusing_mirror.py +267 -0
  301. dls_dodal-2.0.0/tests/devices/test_gridscan.py +602 -0
  302. dls_dodal-2.0.0/tests/devices/test_motors.py +360 -0
  303. dls_dodal-2.0.0/tests/devices/test_pressure_jump_cell.py +588 -0
  304. dls_dodal-2.0.0/tests/devices/test_synchrotron.py +216 -0
  305. dls_dodal-2.0.0/tests/devices/test_tetramm.py +323 -0
  306. dls_dodal-2.0.0/tests/devices/test_zocalo_interaction.py +111 -0
  307. dls_dodal-2.0.0/tests/fake_beamline_misbehaving_builtins.py +42 -0
  308. dls_dodal-2.0.0/tests/plan_stubs/test_pressure_jump_cell_stubs.py +46 -0
  309. dls_dodal-2.0.0/tests/plans/conftest.py +86 -0
  310. dls_dodal-2.0.0/tests/plans/device_setup_plans/__init__.py +0 -0
  311. dls_dodal-2.0.0/tests/plans/device_setup_plans/test_setup_pin_tip.py +35 -0
  312. dls_dodal-2.0.0/tests/plans/test_compliance.py +77 -0
  313. dls_dodal-2.0.0/tests/plans/test_preprocessors/__init__.py +0 -0
  314. dls_dodal-2.0.0/tests/preprocessors/__init__.py +0 -0
  315. dls_dodal-2.0.0/tests/test_cli.py +390 -0
  316. dls_dodal-2.0.0/tests/test_device_manager.py +922 -0
  317. dls_dodal-2.0.0/tests/test_utils.py +486 -0
  318. dls_dodal-2.0.0/tests/testing/__init__.py +0 -0
  319. dls_dodal-2.0.0/tests/testing/fixtures/__init__.py +0 -0
  320. dls_dodal-1.69.0/PKG-INFO +0 -276
  321. dls_dodal-1.69.0/docs/how-to/build-docs.md +0 -39
  322. dls_dodal-1.69.0/docs/how-to/create-beamline.md +0 -88
  323. dls_dodal-1.69.0/docs/how-to/create-device.md +0 -66
  324. dls_dodal-1.69.0/docs/how-to/write-tests.md +0 -152
  325. dls_dodal-1.69.0/pyproject.toml +0 -296
  326. dls_dodal-1.69.0/src/dls_dodal.egg-info/PKG-INFO +0 -276
  327. dls_dodal-1.69.0/src/dls_dodal.egg-info/SOURCES.txt +0 -691
  328. dls_dodal-1.69.0/src/dodal/_version.py +0 -34
  329. dls_dodal-1.69.0/src/dodal/beamline_specific_utils/i05_shared.py +0 -14
  330. dls_dodal-1.69.0/src/dodal/beamlines/__init__.py +0 -98
  331. dls_dodal-1.69.0/src/dodal/beamlines/adsim.py +0 -88
  332. dls_dodal-1.69.0/src/dodal/beamlines/b01_1.py +0 -99
  333. dls_dodal-1.69.0/src/dodal/beamlines/b07.py +0 -46
  334. dls_dodal-1.69.0/src/dodal/beamlines/b07_1.py +0 -54
  335. dls_dodal-1.69.0/src/dodal/beamlines/b16.py +0 -68
  336. dls_dodal-1.69.0/src/dodal/beamlines/b21.py +0 -150
  337. dls_dodal-1.69.0/src/dodal/beamlines/i02_1.py +0 -89
  338. dls_dodal-1.69.0/src/dodal/beamlines/i02_2.py +0 -26
  339. dls_dodal-1.69.0/src/dodal/beamlines/i03.py +0 -365
  340. dls_dodal-1.69.0/src/dodal/beamlines/i04.py +0 -307
  341. dls_dodal-1.69.0/src/dodal/beamlines/i05.py +0 -57
  342. dls_dodal-1.69.0/src/dodal/beamlines/i05_1.py +0 -22
  343. dls_dodal-1.69.0/src/dodal/beamlines/i06.py +0 -62
  344. dls_dodal-1.69.0/src/dodal/beamlines/i06_1.py +0 -24
  345. dls_dodal-1.69.0/src/dodal/beamlines/i07.py +0 -41
  346. dls_dodal-1.69.0/src/dodal/beamlines/i09.py +0 -103
  347. dls_dodal-1.69.0/src/dodal/beamlines/i09_1.py +0 -92
  348. dls_dodal-1.69.0/src/dodal/beamlines/i09_2.py +0 -113
  349. dls_dodal-1.69.0/src/dodal/beamlines/i10.py +0 -174
  350. dls_dodal-1.69.0/src/dodal/beamlines/i10_1.py +0 -35
  351. dls_dodal-1.69.0/src/dodal/beamlines/i10_optics.py +0 -260
  352. dls_dodal-1.69.0/src/dodal/beamlines/i11.py +0 -126
  353. dls_dodal-1.69.0/src/dodal/beamlines/i13_1.py +0 -58
  354. dls_dodal-1.69.0/src/dodal/beamlines/i15.py +0 -242
  355. dls_dodal-1.69.0/src/dodal/beamlines/i15_1.py +0 -156
  356. dls_dodal-1.69.0/src/dodal/beamlines/i17.py +0 -100
  357. dls_dodal-1.69.0/src/dodal/beamlines/i18.py +0 -132
  358. dls_dodal-1.69.0/src/dodal/beamlines/i19_1.py +0 -103
  359. dls_dodal-1.69.0/src/dodal/beamlines/i19_2.py +0 -140
  360. dls_dodal-1.69.0/src/dodal/beamlines/i19_optics.py +0 -36
  361. dls_dodal-1.69.0/src/dodal/beamlines/i20_1.py +0 -102
  362. dls_dodal-1.69.0/src/dodal/beamlines/i21.py +0 -124
  363. dls_dodal-1.69.0/src/dodal/beamlines/i22.py +0 -291
  364. dls_dodal-1.69.0/src/dodal/beamlines/i23.py +0 -104
  365. dls_dodal-1.69.0/src/dodal/beamlines/i24.py +0 -168
  366. dls_dodal-1.69.0/src/dodal/beamlines/k07.py +0 -34
  367. dls_dodal-1.69.0/src/dodal/beamlines/p38.py +0 -211
  368. dls_dodal-1.69.0/src/dodal/beamlines/p60.py +0 -58
  369. dls_dodal-1.69.0/src/dodal/beamlines/p99.py +0 -92
  370. dls_dodal-1.69.0/src/dodal/beamlines/training_rig.py +0 -51
  371. dls_dodal-1.69.0/src/dodal/cli.py +0 -141
  372. dls_dodal-1.69.0/src/dodal/common/beamlines/beamline_parameters.py +0 -74
  373. dls_dodal-1.69.0/src/dodal/common/beamlines/beamline_utils.py +0 -176
  374. dls_dodal-1.69.0/src/dodal/common/beamlines/commissioning_mode.py +0 -33
  375. dls_dodal-1.69.0/src/dodal/common/coordination.py +0 -41
  376. dls_dodal-1.69.0/src/dodal/common/crystal_metadata.py +0 -61
  377. dls_dodal-1.69.0/src/dodal/common/device_utils.py +0 -45
  378. dls_dodal-1.69.0/src/dodal/common/maths.py +0 -130
  379. dls_dodal-1.69.0/src/dodal/common/udc_directory_provider.py +0 -56
  380. dls_dodal-1.69.0/src/dodal/common/visit.py +0 -152
  381. dls_dodal-1.69.0/src/dodal/common/watcher_utils.py +0 -83
  382. dls_dodal-1.69.0/src/dodal/device_manager.py +0 -604
  383. dls_dodal-1.69.0/src/dodal/devices/aperturescatterguard.py +0 -375
  384. dls_dodal-1.69.0/src/dodal/devices/areadetector/plugins/cam.py +0 -29
  385. dls_dodal-1.69.0/src/dodal/devices/areadetector/plugins/mjpg.py +0 -90
  386. dls_dodal-1.69.0/src/dodal/devices/attenuator/attenuator.py +0 -163
  387. dls_dodal-1.69.0/src/dodal/devices/b07/__init__.py +0 -3
  388. dls_dodal-1.69.0/src/dodal/devices/b07_1/__init__.py +0 -12
  389. dls_dodal-1.69.0/src/dodal/devices/b07_1/ccmc.py +0 -79
  390. dls_dodal-1.69.0/src/dodal/devices/b16/detector.py +0 -25
  391. dls_dodal-1.69.0/src/dodal/devices/bimorph_mirror.py +0 -141
  392. dls_dodal-1.69.0/src/dodal/devices/collimation_table.py +0 -36
  393. dls_dodal-1.69.0/src/dodal/devices/common_dcm.py +0 -124
  394. dls_dodal-1.69.0/src/dodal/devices/controllers.py +0 -23
  395. dls_dodal-1.69.0/src/dodal/devices/cryostream.py +0 -101
  396. dls_dodal-1.69.0/src/dodal/devices/current_amplifiers/current_amplifier.py +0 -98
  397. dls_dodal-1.69.0/src/dodal/devices/current_amplifiers/current_amplifier_detector.py +0 -109
  398. dls_dodal-1.69.0/src/dodal/devices/current_amplifiers/femto.py +0 -138
  399. dls_dodal-1.69.0/src/dodal/devices/current_amplifiers/sr570.py +0 -209
  400. dls_dodal-1.69.0/src/dodal/devices/current_amplifiers/struck_scaler_counter.py +0 -79
  401. dls_dodal-1.69.0/src/dodal/devices/detector/det_resolution.py +0 -91
  402. dls_dodal-1.69.0/src/dodal/devices/detector/detector.py +0 -136
  403. dls_dodal-1.69.0/src/dodal/devices/diamond_filter.py +0 -34
  404. dls_dodal-1.69.0/src/dodal/devices/eiger.py +0 -458
  405. dls_dodal-1.69.0/src/dodal/devices/eiger_odin.py +0 -174
  406. dls_dodal-1.69.0/src/dodal/devices/electron_analyser/base/base_controller.py +0 -84
  407. dls_dodal-1.69.0/src/dodal/devices/electron_analyser/base/base_detector.py +0 -214
  408. dls_dodal-1.69.0/src/dodal/devices/electron_analyser/base/base_driver_io.py +0 -231
  409. dls_dodal-1.69.0/src/dodal/devices/electron_analyser/base/base_region.py +0 -203
  410. dls_dodal-1.69.0/src/dodal/devices/electron_analyser/base/base_util.py +0 -33
  411. dls_dodal-1.69.0/src/dodal/devices/electron_analyser/base/energy_sources.py +0 -102
  412. dls_dodal-1.69.0/src/dodal/devices/eurotherm.py +0 -126
  413. dls_dodal-1.69.0/src/dodal/devices/fast_grid_scan.py +0 -487
  414. dls_dodal-1.69.0/src/dodal/devices/fast_shutter.py +0 -152
  415. dls_dodal-1.69.0/src/dodal/devices/flux.py +0 -14
  416. dls_dodal-1.69.0/src/dodal/devices/focusing_mirror.py +0 -220
  417. dls_dodal-1.69.0/src/dodal/devices/hutch_shutter.py +0 -105
  418. dls_dodal-1.69.0/src/dodal/devices/i02_1/fast_grid_scan.py +0 -61
  419. dls_dodal-1.69.0/src/dodal/devices/i02_1/sample_motors.py +0 -19
  420. dls_dodal-1.69.0/src/dodal/devices/i03/beamsize.py +0 -35
  421. dls_dodal-1.69.0/src/dodal/devices/i03/dcm.py +0 -62
  422. dls_dodal-1.69.0/src/dodal/devices/i03/undulator_dcm.py +0 -69
  423. dls_dodal-1.69.0/src/dodal/devices/i04/beam_centre.py +0 -84
  424. dls_dodal-1.69.0/src/dodal/devices/i04/beamsize.py +0 -45
  425. dls_dodal-1.69.0/src/dodal/devices/i04/murko_results.py +0 -296
  426. dls_dodal-1.69.0/src/dodal/devices/i04/transfocator.py +0 -83
  427. dls_dodal-1.69.0/src/dodal/devices/i05/__init__.py +0 -3
  428. dls_dodal-1.69.0/src/dodal/devices/i07/dcm.py +0 -33
  429. dls_dodal-1.69.0/src/dodal/devices/i07/id.py +0 -38
  430. dls_dodal-1.69.0/src/dodal/devices/i09/__init__.py +0 -3
  431. dls_dodal-1.69.0/src/dodal/devices/i09_1_shared/hard_energy.py +0 -112
  432. dls_dodal-1.69.0/src/dodal/devices/i09_1_shared/hard_undulator_functions.py +0 -175
  433. dls_dodal-1.69.0/src/dodal/devices/i10/diagnostics.py +0 -219
  434. dls_dodal-1.69.0/src/dodal/devices/i10/i10_apple2.py +0 -197
  435. dls_dodal-1.69.0/src/dodal/devices/i10/rasor/rasor_current_amp.py +0 -72
  436. dls_dodal-1.69.0/src/dodal/devices/i10/rasor/rasor_motors.py +0 -48
  437. dls_dodal-1.69.0/src/dodal/devices/i10/slits.py +0 -156
  438. dls_dodal-1.69.0/src/dodal/devices/i11/cyberstar_blower.py +0 -34
  439. dls_dodal-1.69.0/src/dodal/devices/i11/diff_stages.py +0 -55
  440. dls_dodal-1.69.0/src/dodal/devices/i11/mythen.py +0 -165
  441. dls_dodal-1.69.0/src/dodal/devices/i11/nx100robot.py +0 -153
  442. dls_dodal-1.69.0/src/dodal/devices/i11/spinner.py +0 -30
  443. dls_dodal-1.69.0/src/dodal/devices/i13_1/merlin.py +0 -32
  444. dls_dodal-1.69.0/src/dodal/devices/i15/dcm.py +0 -39
  445. dls_dodal-1.69.0/src/dodal/devices/i15/focussing_mirror.py +0 -55
  446. dls_dodal-1.69.0/src/dodal/devices/i15/jack.py +0 -31
  447. dls_dodal-1.69.0/src/dodal/devices/i15/multilayer_mirror.py +0 -21
  448. dls_dodal-1.69.0/src/dodal/devices/i17/i17_apple2.py +0 -66
  449. dls_dodal-1.69.0/src/dodal/devices/i18/diode.py +0 -50
  450. dls_dodal-1.69.0/src/dodal/devices/i19/access_controlled/attenuator_motor_squad.py +0 -61
  451. dls_dodal-1.69.0/src/dodal/devices/i19/access_controlled/blueapi_device.py +0 -110
  452. dls_dodal-1.69.0/src/dodal/devices/i19/access_controlled/shutter.py +0 -52
  453. dls_dodal-1.69.0/src/dodal/devices/i19/backlight.py +0 -17
  454. dls_dodal-1.69.0/src/dodal/devices/i19/mapt_configuration.py +0 -38
  455. dls_dodal-1.69.0/src/dodal/devices/i19/pin_col_stages.py +0 -170
  456. dls_dodal-1.69.0/src/dodal/devices/i21/__init__.py +0 -5
  457. dls_dodal-1.69.0/src/dodal/devices/i22/dcm.py +0 -122
  458. dls_dodal-1.69.0/src/dodal/devices/i22/fswitch.py +0 -90
  459. dls_dodal-1.69.0/src/dodal/devices/i22/nxsas.py +0 -166
  460. dls_dodal-1.69.0/src/dodal/devices/i24/beam_center.py +0 -11
  461. dls_dodal-1.69.0/src/dodal/devices/i24/beamstop.py +0 -33
  462. dls_dodal-1.69.0/src/dodal/devices/i24/commissioning_jungfrau.py +0 -121
  463. dls_dodal-1.69.0/src/dodal/devices/i24/dcm.py +0 -29
  464. dls_dodal-1.69.0/src/dodal/devices/i24/dual_backlight.py +0 -59
  465. dls_dodal-1.69.0/src/dodal/devices/i24/pmac.py +0 -232
  466. dls_dodal-1.69.0/src/dodal/devices/insertion_device/__init__.py +0 -62
  467. dls_dodal-1.69.0/src/dodal/devices/insertion_device/apple2_controller.py +0 -380
  468. dls_dodal-1.69.0/src/dodal/devices/insertion_device/apple2_undulator.py +0 -430
  469. dls_dodal-1.69.0/src/dodal/devices/insertion_device/energy.py +0 -88
  470. dls_dodal-1.69.0/src/dodal/devices/insertion_device/energy_motor_lookup.py +0 -88
  471. dls_dodal-1.69.0/src/dodal/devices/insertion_device/lookup_table_models.py +0 -317
  472. dls_dodal-1.69.0/src/dodal/devices/insertion_device/polarisation.py +0 -36
  473. dls_dodal-1.69.0/src/dodal/devices/ipin.py +0 -31
  474. dls_dodal-1.69.0/src/dodal/devices/linkam3.py +0 -58
  475. dls_dodal-1.69.0/src/dodal/devices/motors.py +0 -273
  476. dls_dodal-1.69.0/src/dodal/devices/mx_phase1/beamstop.py +0 -114
  477. dls_dodal-1.69.0/src/dodal/devices/oav/oav_calculations.py +0 -66
  478. dls_dodal-1.69.0/src/dodal/devices/oav/oav_detector.py +0 -325
  479. dls_dodal-1.69.0/src/dodal/devices/oav/oav_parameters.py +0 -192
  480. dls_dodal-1.69.0/src/dodal/devices/oav/oav_to_redis_forwarder.py +0 -174
  481. dls_dodal-1.69.0/src/dodal/devices/oav/pin_image_recognition/__init__.py +0 -169
  482. dls_dodal-1.69.0/src/dodal/devices/oav/pin_image_recognition/manual_test.py +0 -34
  483. dls_dodal-1.69.0/src/dodal/devices/oav/pin_image_recognition/utils.py +0 -273
  484. dls_dodal-1.69.0/src/dodal/devices/oav/snapshots/grid_overlay.py +0 -118
  485. dls_dodal-1.69.0/src/dodal/devices/oav/snapshots/snapshot_image_processing.py +0 -74
  486. dls_dodal-1.69.0/src/dodal/devices/oav/utils.py +0 -138
  487. dls_dodal-1.69.0/src/dodal/devices/p45.py +0 -43
  488. dls_dodal-1.69.0/src/dodal/devices/p60/lab_xray_source.py +0 -22
  489. dls_dodal-1.69.0/src/dodal/devices/p99/andor2_point.py +0 -41
  490. dls_dodal-1.69.0/src/dodal/devices/pgm.py +0 -40
  491. dls_dodal-1.69.0/src/dodal/devices/pressure_jump_cell.py +0 -277
  492. dls_dodal-1.69.0/src/dodal/devices/qbpm.py +0 -18
  493. dls_dodal-1.69.0/src/dodal/devices/robot.py +0 -219
  494. dls_dodal-1.69.0/src/dodal/devices/s4_slit_gaps.py +0 -12
  495. dls_dodal-1.69.0/src/dodal/devices/selectable_source.py +0 -38
  496. dls_dodal-1.69.0/src/dodal/devices/slits.py +0 -57
  497. dls_dodal-1.69.0/src/dodal/devices/smargon.py +0 -135
  498. dls_dodal-1.69.0/src/dodal/devices/temperture_controller/lakeshore/lakeshore.py +0 -204
  499. dls_dodal-1.69.0/src/dodal/devices/temperture_controller/lakeshore/lakeshore_io.py +0 -112
  500. dls_dodal-1.69.0/src/dodal/devices/tetramm.py +0 -283
  501. dls_dodal-1.69.0/src/dodal/devices/turbo_slit.py +0 -31
  502. dls_dodal-1.69.0/src/dodal/devices/undulator.py +0 -271
  503. dls_dodal-1.69.0/src/dodal/devices/util/adjuster_plans.py +0 -25
  504. dls_dodal-1.69.0/src/dodal/devices/util/epics_util.py +0 -128
  505. dls_dodal-1.69.0/src/dodal/devices/util/lookup_tables.py +0 -110
  506. dls_dodal-1.69.0/src/dodal/devices/v2f.py +0 -39
  507. dls_dodal-1.69.0/src/dodal/devices/watsonmarlow323_pump.py +0 -45
  508. dls_dodal-1.69.0/src/dodal/devices/xbpm_feedback.py +0 -34
  509. dls_dodal-1.69.0/src/dodal/devices/xspress3/xspress3.py +0 -144
  510. dls_dodal-1.69.0/src/dodal/devices/xspress3/xspress3_channel.py +0 -40
  511. dls_dodal-1.69.0/src/dodal/devices/zebra/zebra.py +0 -311
  512. dls_dodal-1.69.0/src/dodal/devices/zebra/zebra_constants_mapping.py +0 -97
  513. dls_dodal-1.69.0/src/dodal/devices/zebra/zebra_controlled_shutter.py +0 -52
  514. dls_dodal-1.69.0/src/dodal/devices/zocalo/zocalo_interaction.py +0 -111
  515. dls_dodal-1.69.0/src/dodal/devices/zocalo/zocalo_results.py +0 -347
  516. dls_dodal-1.69.0/src/dodal/log.py +0 -291
  517. dls_dodal-1.69.0/src/dodal/plan_stubs/check_topup.py +0 -137
  518. dls_dodal-1.69.0/src/dodal/plan_stubs/data_session.py +0 -62
  519. dls_dodal-1.69.0/src/dodal/plan_stubs/motor_utils.py +0 -117
  520. dls_dodal-1.69.0/src/dodal/plan_stubs/wrapped.py +0 -148
  521. dls_dodal-1.69.0/src/dodal/plans/bimorph.py +0 -333
  522. dls_dodal-1.69.0/src/dodal/plans/preprocessors/verify_undulator_gap.py +0 -49
  523. dls_dodal-1.69.0/src/dodal/plans/spec_path.py +0 -66
  524. dls_dodal-1.69.0/src/dodal/plans/verify_undulator_gap.py +0 -19
  525. dls_dodal-1.69.0/src/dodal/plans/wrapped.py +0 -57
  526. dls_dodal-1.69.0/src/dodal/testing/electron_analyser/device_factory.py +0 -59
  527. dls_dodal-1.69.0/src/dodal/testing/fixtures/devices/apple2.py +0 -78
  528. dls_dodal-1.69.0/src/dodal/testing/fixtures/run_engine.py +0 -122
  529. dls_dodal-1.69.0/src/dodal/testing/fixtures/utils.py +0 -57
  530. dls_dodal-1.69.0/src/dodal/utils.py +0 -565
  531. dls_dodal-1.69.0/system_tests/test_adsim.py +0 -226
  532. dls_dodal-1.69.0/tests/beamlines/test_b16.py +0 -60
  533. dls_dodal-1.69.0/tests/beamlines/test_i24.py +0 -13
  534. dls_dodal-1.69.0/tests/common/beamlines/test_device_instantiation.py +0 -66
  535. dls_dodal-1.69.0/tests/conftest.py +0 -160
  536. dls_dodal-1.69.0/tests/devices/b07_1/test_ccmc.py +0 -109
  537. dls_dodal-1.69.0/tests/devices/current_amplifier/test_femto.py +0 -306
  538. dls_dodal-1.69.0/tests/devices/current_amplifier/test_sr570.py +0 -306
  539. dls_dodal-1.69.0/tests/devices/electron_analyser/base/test_base_detector.py +0 -212
  540. dls_dodal-1.69.0/tests/devices/electron_analyser/base/test_base_driver_io.py +0 -68
  541. dls_dodal-1.69.0/tests/devices/electron_analyser/base/test_base_region.py +0 -155
  542. dls_dodal-1.69.0/tests/devices/electron_analyser/conftest.py +0 -131
  543. dls_dodal-1.69.0/tests/devices/electron_analyser/specs/test_specs_detector.py +0 -46
  544. dls_dodal-1.69.0/tests/devices/electron_analyser/specs/test_specs_driver_io.py +0 -208
  545. dls_dodal-1.69.0/tests/devices/electron_analyser/specs/test_specs_region.py +0 -103
  546. dls_dodal-1.69.0/tests/devices/electron_analyser/vgscienta/test_vgscienta_detector.py +0 -41
  547. dls_dodal-1.69.0/tests/devices/electron_analyser/vgscienta/test_vgscienta_driver_io.py +0 -216
  548. dls_dodal-1.69.0/tests/devices/electron_analyser/vgscienta/test_vgsicenta_region.py +0 -125
  549. dls_dodal-1.69.0/tests/devices/i02_1/test_fast_grid_scan.py +0 -22
  550. dls_dodal-1.69.0/tests/devices/i03/test_beamsize.py +0 -43
  551. dls_dodal-1.69.0/tests/devices/i03/test_dcm.py +0 -43
  552. dls_dodal-1.69.0/tests/devices/i03/test_undulator_dcm.py +0 -244
  553. dls_dodal-1.69.0/tests/devices/i04/conftest.py +0 -11
  554. dls_dodal-1.69.0/tests/devices/i04/test_beam_centre.py +0 -125
  555. dls_dodal-1.69.0/tests/devices/i04/test_beamsize.py +0 -50
  556. dls_dodal-1.69.0/tests/devices/i04/test_max_pixel.py +0 -56
  557. dls_dodal-1.69.0/tests/devices/i04/test_murko_results.py +0 -848
  558. dls_dodal-1.69.0/tests/devices/i04/test_transfocator.py +0 -55
  559. dls_dodal-1.69.0/tests/devices/i07/test_dcm.py +0 -36
  560. dls_dodal-1.69.0/tests/devices/i07/test_id.py +0 -28
  561. dls_dodal-1.69.0/tests/devices/i09_1_shared/test_hard_energy.py +0 -243
  562. dls_dodal-1.69.0/tests/devices/i09_1_shared/test_undulator_functions.py +0 -73
  563. dls_dodal-1.69.0/tests/devices/i09_2_shared/test_i09_apple2.py +0 -372
  564. dls_dodal-1.69.0/tests/devices/i10/test_i10_apple2.py +0 -728
  565. dls_dodal-1.69.0/tests/devices/i11/test_i11devices.py +0 -200
  566. dls_dodal-1.69.0/tests/devices/i11/test_mythen.py +0 -81
  567. dls_dodal-1.69.0/tests/devices/i13_1/test_merlin.py +0 -106
  568. dls_dodal-1.69.0/tests/devices/i17/test_i17_apple2.py +0 -70
  569. dls_dodal-1.69.0/tests/devices/i18/test_kb_mirror.py +0 -38
  570. dls_dodal-1.69.0/tests/devices/i19/access_controlled/test_attenuator_motor_squad.py +0 -134
  571. dls_dodal-1.69.0/tests/devices/i19/access_controlled/test_attenuator_position_demand.py +0 -145
  572. dls_dodal-1.69.0/tests/devices/i19/access_controlled/test_shutter.py +0 -212
  573. dls_dodal-1.69.0/tests/devices/i19/test_backlight.py +0 -18
  574. dls_dodal-1.69.0/tests/devices/i19/test_beamstop.py +0 -15
  575. dls_dodal-1.69.0/tests/devices/i19/test_diffractometer.py +0 -36
  576. dls_dodal-1.69.0/tests/devices/i19/test_mapt.py +0 -63
  577. dls_dodal-1.69.0/tests/devices/i19/test_pin_col.py +0 -157
  578. dls_dodal-1.69.0/tests/devices/i22/test_dcm.py +0 -128
  579. dls_dodal-1.69.0/tests/devices/i22/test_fswitch.py +0 -61
  580. dls_dodal-1.69.0/tests/devices/i22/test_metadataholder.py +0 -38
  581. dls_dodal-1.69.0/tests/devices/i24/test_commissioning_jungfrau.py +0 -69
  582. dls_dodal-1.69.0/tests/devices/i24/test_dual_backlight.py +0 -70
  583. dls_dodal-1.69.0/tests/devices/i24/test_focus_mirrors.py +0 -28
  584. dls_dodal-1.69.0/tests/devices/i24/test_pmac.py +0 -149
  585. dls_dodal-1.69.0/tests/devices/i24/test_vgonio.py +0 -24
  586. dls_dodal-1.69.0/tests/devices/insertion_device/test_apple2_controller.py +0 -147
  587. dls_dodal-1.69.0/tests/devices/insertion_device/test_apple2_undulator.py +0 -507
  588. dls_dodal-1.69.0/tests/devices/insertion_device/test_energy.py +0 -51
  589. dls_dodal-1.69.0/tests/devices/mx_phase1/test_beamstop.py +0 -134
  590. dls_dodal-1.69.0/tests/devices/p60/test_lab_xray_source.py +0 -114
  591. dls_dodal-1.69.0/tests/devices/p99/test_p99_stage.py +0 -47
  592. dls_dodal-1.69.0/tests/devices/test_aperture_scatterguard.py +0 -570
  593. dls_dodal-1.69.0/tests/devices/test_bart_robot.py +0 -309
  594. dls_dodal-1.69.0/tests/devices/test_bimorph_mirror.py +0 -162
  595. dls_dodal-1.69.0/tests/devices/test_focusing_mirror.py +0 -255
  596. dls_dodal-1.69.0/tests/devices/test_gridscan.py +0 -602
  597. dls_dodal-1.69.0/tests/devices/test_motors.py +0 -244
  598. dls_dodal-1.69.0/tests/devices/test_pressure_jump_cell.py +0 -416
  599. dls_dodal-1.69.0/tests/devices/test_synchrotron.py +0 -217
  600. dls_dodal-1.69.0/tests/devices/test_tetramm.py +0 -323
  601. dls_dodal-1.69.0/tests/devices/test_zocalo_interaction.py +0 -113
  602. dls_dodal-1.69.0/tests/fake_beamline_misbehaving_builtins.py +0 -47
  603. dls_dodal-1.69.0/tests/plans/conftest.py +0 -86
  604. dls_dodal-1.69.0/tests/plans/test_compliance.py +0 -78
  605. dls_dodal-1.69.0/tests/test_cli.py +0 -343
  606. dls_dodal-1.69.0/tests/test_device_manager.py +0 -763
  607. dls_dodal-1.69.0/tests/test_utils.py +0 -487
  608. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.copier-answers.yml +0 -0
  609. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.devcontainer/devcontainer.json +0 -0
  610. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/CODEOWNERS +0 -0
  611. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/CONTRIBUTING.md +0 -0
  612. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/ISSUE_TEMPLATE/issue_template.md +0 -0
  613. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/pages/index.html +0 -0
  614. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/pages/make_switcher.py +0 -0
  615. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/workflows/_dist.yml +0 -0
  616. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/workflows/_docs.yml +0 -0
  617. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/workflows/_pypi.yml +0 -0
  618. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/workflows/_release.yml +0 -0
  619. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/workflows/_test.yml +0 -0
  620. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/workflows/_tox.yml +0 -0
  621. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/workflows/ci.yml +0 -0
  622. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.github/workflows/periodic.yml +0 -0
  623. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.gitignore +0 -0
  624. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.gitleaks.toml +0 -0
  625. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.pre-commit-config.yaml +0 -0
  626. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.python-version +0 -0
  627. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.vscode/extensions.json +0 -0
  628. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.vscode/launch.json +0 -0
  629. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.vscode/settings.json +0 -0
  630. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/.vscode/tasks.json +0 -0
  631. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/Dockerfile +0 -0
  632. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/LICENSE +0 -0
  633. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/README.md +0 -0
  634. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/catalog-info.yaml +0 -0
  635. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/_templates/autosummary/class.rst +0 -0
  636. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/_templates/autosummary/module.rst +0 -0
  637. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/_templates/custom-module-template.rst +0 -0
  638. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/assets/where-to-put-dodal-logic.png +0 -0
  639. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/assets/zocalo.png +0 -0
  640. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/conf.py +0 -0
  641. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  642. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  643. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/explanations/decisions/0003-codeowners.md +0 -0
  644. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/explanations/decisions/0004-make-devices-factory.md +0 -0
  645. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/explanations/decisions/0005-standardise-devices-at-epics-level.md +0 -0
  646. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/explanations/decisions/0006-devices-shared-between-endstations.md +0 -0
  647. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/explanations/decisions/COPYME +0 -0
  648. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/explanations/decisions.md +0 -0
  649. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/explanations/reviews.md +0 -0
  650. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/explanations/umls/apple2_design.png +0 -0
  651. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/explanations/umls/i10_id_design.png +0 -0
  652. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/explanations.md +0 -0
  653. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/genindex.md +0 -0
  654. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/contribute.md +0 -0
  655. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/coverage.md +0 -0
  656. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/dev-install.md +0 -0
  657. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/excalidraw.md +0 -0
  658. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/external-io-devices.md +0 -0
  659. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/lint.md +0 -0
  660. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/lock-requirements.md +0 -0
  661. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/make-release.md +0 -0
  662. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/move-code.md +0 -0
  663. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/pypi.md +0 -0
  664. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/run-tests.md +0 -0
  665. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/static-analysis.md +0 -0
  666. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/tidy-docs.md +0 -0
  667. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/update-template.md +0 -0
  668. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to/zocalo.md +0 -0
  669. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/how-to.md +0 -0
  670. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/images/dls-logo.svg +0 -0
  671. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/images/excalidraw-example.svg +0 -0
  672. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/index.md +0 -0
  673. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/reference/api.md +0 -0
  674. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/reference/device-standards.md +0 -0
  675. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/reference/standards.md +0 -0
  676. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/reference.md +0 -0
  677. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/tutorials/get_started.md +0 -0
  678. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/tutorials/installation.md +0 -0
  679. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/docs/tutorials.md +0 -0
  680. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/pull_request_template.md +0 -0
  681. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/renovate.json +0 -0
  682. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/setup.cfg +0 -0
  683. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/__init__.py +0 -0
  684. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dls_dodal.egg-info/dependency_links.txt +0 -0
  685. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dls_dodal.egg-info/entry_points.txt +0 -0
  686. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dls_dodal.egg-info/requires.txt +0 -0
  687. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dls_dodal.egg-info/top_level.txt +0 -0
  688. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/__init__.py +0 -0
  689. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/__main__.py +0 -0
  690. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/beamlines/README.md +0 -0
  691. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/beamlines/aithre.py +0 -0
  692. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/beamlines/b18.py +0 -0
  693. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/beamlines/i03_supervisor.py +0 -0
  694. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/beamlines/i16.py +0 -0
  695. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/beamlines/k11.py +0 -0
  696. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/beamlines/p45.py +0 -0
  697. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/common/__init__.py +0 -0
  698. {dls_dodal-1.69.0/src/dodal/beamline_specific_utils → dls_dodal-2.0.0/src/dodal/common/beamlines}/__init__.py +0 -0
  699. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/common/beamlines/device_helpers.py +0 -0
  700. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/common/data_util.py +0 -0
  701. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/common/enums.py +0 -0
  702. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/common/types.py +0 -0
  703. {dls_dodal-1.69.0/src/dodal/common/beamlines → dls_dodal-2.0.0/src/dodal/devices}/__init__.py +0 -0
  704. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/aithre_lasershaping}/__init__.py +0 -0
  705. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/aithre_lasershaping/goniometer.py +0 -0
  706. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/aithre_lasershaping/laser_robot.py +0 -0
  707. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/aperture.py +0 -0
  708. {dls_dodal-1.69.0/src/dodal/devices/aithre_lasershaping → dls_dodal-2.0.0/src/dodal/devices/areadetector}/__init__.py +0 -0
  709. {dls_dodal-1.69.0/src/dodal/devices/areadetector → dls_dodal-2.0.0/src/dodal/devices/areadetector/plugins}/__init__.py +0 -0
  710. {dls_dodal-1.69.0/src/dodal/devices/areadetector/plugins → dls_dodal-2.0.0/src/dodal/devices/attenuator}/__init__.py +0 -0
  711. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/attenuator/filter.py +0 -0
  712. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/attenuator/filter_selections.py +0 -0
  713. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/backlight.py +0 -0
  714. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/baton.py +0 -0
  715. {dls_dodal-1.69.0/src/dodal/devices/attenuator → dls_dodal-2.0.0/src/dodal/devices/beamlines}/__init__.py +0 -0
  716. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/b07/enums.py +0 -0
  717. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/b07_1/enums.py +0 -0
  718. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/b16/__init__.py +0 -0
  719. {dls_dodal-1.69.0/src/dodal/devices/beamsize → dls_dodal-2.0.0/src/dodal/devices/beamlines/i02_1}/__init__.py +0 -0
  720. {dls_dodal-1.69.0/src/dodal/devices/electron_analyser → dls_dodal-2.0.0/src/dodal/devices/beamlines/i02_2}/__init__.py +0 -0
  721. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i03/__init__.py +0 -0
  722. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i03/constants.py +0 -0
  723. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i04/__init__.py +0 -0
  724. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i04/constants.py +0 -0
  725. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i04/max_pixel.py +0 -0
  726. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i05/enums.py +0 -0
  727. {dls_dodal-1.69.0/src/dodal/devices/i02_1 → dls_dodal-2.0.0/src/dodal/devices/beamlines/i07}/__init__.py +0 -0
  728. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i09/enums.py +0 -0
  729. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i09_1/__init__.py +0 -0
  730. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i09_1/enums.py +0 -0
  731. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i09_1_shared/__init__.py +0 -0
  732. {dls_dodal-1.69.0/src/dodal/devices/i02_2 → dls_dodal-2.0.0/src/dodal/devices/beamlines/i09_2_shared}/__init__.py +0 -0
  733. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i09_2_shared/i09_apple2.py +0 -0
  734. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i10/__init__.py +0 -0
  735. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i10/i10_setting_data.py +0 -0
  736. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i10/mirrors.py +0 -0
  737. {dls_dodal-1.69.0/src/dodal/devices/i07 → dls_dodal-2.0.0/src/dodal/devices/beamlines/i10/rasor}/__init__.py +0 -0
  738. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i10/rasor/rasor_scaler_cards.py +0 -0
  739. {dls_dodal-1.69.0/src/dodal/devices/i09_2_shared → dls_dodal-2.0.0/src/dodal/devices/beamlines/i10_1/electromagnet}/__init__.py +0 -0
  740. {dls_dodal-1.69.0/src/dodal/devices/i10/rasor → dls_dodal-2.0.0/src/dodal/devices/beamlines/i11}/__init__.py +0 -0
  741. {dls_dodal-1.69.0/src/dodal/devices/i11 → dls_dodal-2.0.0/src/dodal/devices/beamlines/i13_1}/__init__.py +0 -0
  742. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i13_1/merlin_controller.py +0 -0
  743. {dls_dodal-1.69.0/src/dodal/devices/i13_1 → dls_dodal-2.0.0/src/dodal/devices/beamlines/i15}/__init__.py +0 -0
  744. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i15/laue.py +0 -0
  745. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i15/motors.py +0 -0
  746. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i15/rail.py +0 -0
  747. {dls_dodal-1.69.0/src/dodal/devices/i15 → dls_dodal-2.0.0/src/dodal/devices/beamlines/i17}/__init__.py +0 -0
  748. {dls_dodal-1.69.0/src/dodal/devices/i17 → dls_dodal-2.0.0/src/dodal/devices/beamlines/i18}/__init__.py +0 -0
  749. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i18/kb_mirror.py +0 -0
  750. {dls_dodal-1.69.0/src/dodal/devices/i18 → dls_dodal-2.0.0/src/dodal/devices/beamlines/i19}/__init__.py +0 -0
  751. {dls_dodal-1.69.0/src/dodal/devices/i19 → dls_dodal-2.0.0/src/dodal/devices/beamlines/i19/access_controlled}/__init__.py +0 -0
  752. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i19/access_controlled/hutch_access.py +0 -0
  753. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i19/beamstop.py +0 -0
  754. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i19/diffractometer.py +0 -0
  755. {dls_dodal-1.69.0/src/dodal/devices/i19/access_controlled → dls_dodal-2.0.0/src/dodal/devices/beamlines/i20_1}/__init__.py +0 -0
  756. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i21/enums.py +0 -0
  757. {dls_dodal-1.69.0/src/dodal/devices/i20_1 → dls_dodal-2.0.0/src/dodal/devices/beamlines/i22}/__init__.py +0 -0
  758. {dls_dodal-1.69.0/src/dodal/devices/i22 → dls_dodal-2.0.0/src/dodal/devices/beamlines/i24}/__init__.py +0 -0
  759. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i24/aperture.py +0 -0
  760. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i24/focus_mirrors.py +0 -0
  761. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/i24/vgonio.py +0 -0
  762. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/p60/__init__.py +0 -0
  763. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/p60/enums.py +0 -0
  764. {dls_dodal-1.69.0/src/dodal/devices/i24 → dls_dodal-2.0.0/src/dodal/devices/beamlines/p99}/__init__.py +0 -0
  765. {dls_dodal-1.69.0/src/dodal/devices → dls_dodal-2.0.0/src/dodal/devices/beamlines}/p99/sample_stage.py +0 -0
  766. {dls_dodal-1.69.0/src/dodal/devices/mx_phase1 → dls_dodal-2.0.0/src/dodal/devices/beamsize}/__init__.py +0 -0
  767. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/beamsize/beamsize.py +0 -0
  768. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/current_amplifiers/__init__.py +0 -0
  769. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/detector/__init__.py +0 -0
  770. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/detector/det_dim_constants.py +0 -0
  771. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/detector/det_dist_to_beam_converter.py +0 -0
  772. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/detector/detector_motion.py +0 -0
  773. {dls_dodal-1.69.0/src/dodal/devices/oav → dls_dodal-2.0.0/src/dodal/devices/electron_analyser}/__init__.py +0 -0
  774. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/electron_analyser/base/__init__.py +0 -0
  775. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/electron_analyser/base/base_enums.py +0 -0
  776. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/electron_analyser/specs/__init__.py +0 -0
  777. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/electron_analyser/specs/specs_detector.py +0 -0
  778. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/electron_analyser/specs/specs_driver_io.py +0 -0
  779. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/electron_analyser/specs/specs_enums.py +0 -0
  780. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/electron_analyser/specs/specs_region.py +0 -0
  781. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/electron_analyser/vgscienta/__init__.py +0 -0
  782. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/electron_analyser/vgscienta/vgscienta_detector.py +0 -0
  783. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/electron_analyser/vgscienta/vgscienta_driver_io.py +0 -0
  784. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/electron_analyser/vgscienta/vgscienta_enums.py +0 -0
  785. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/electron_analyser/vgscienta/vgscienta_region.py +0 -0
  786. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/fluorescence_detector_motion.py +0 -0
  787. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/insertion_device/enum.py +0 -0
  788. {dls_dodal-1.69.0/src/dodal/devices/oav/snapshots → dls_dodal-2.0.0/src/dodal/devices/mx_phase1}/__init__.py +0 -0
  789. {dls_dodal-1.69.0/src/dodal/devices/p99 → dls_dodal-2.0.0/src/dodal/devices/oav}/__init__.py +0 -0
  790. {dls_dodal-1.69.0/src/dodal/devices/temperture_controller/lakeshore → dls_dodal-2.0.0/src/dodal/devices/oav/snapshots}/__init__.py +0 -0
  791. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/oav/snapshots/snapshot.py +0 -0
  792. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/oav/snapshots/snapshot_with_grid.py +0 -0
  793. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/positioner.py +0 -0
  794. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/scintillator.py +0 -0
  795. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/status.py +0 -0
  796. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/synchrotron.py +0 -0
  797. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/temperture_controller/__init__.py +0 -0
  798. {dls_dodal-1.69.0/src/dodal/devices/util → dls_dodal-2.0.0/src/dodal/devices/temperture_controller/lakeshore}/__init__.py +0 -0
  799. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/thawer.py +0 -0
  800. {dls_dodal-1.69.0/src/dodal/devices/xspress3 → dls_dodal-2.0.0/src/dodal/devices/util}/__init__.py +0 -0
  801. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/webcam.py +0 -0
  802. {dls_dodal-1.69.0/src/dodal/devices/zebra → dls_dodal-2.0.0/src/dodal/devices/xspress3}/__init__.py +0 -0
  803. {dls_dodal-1.69.0/src/dodal/parameters → dls_dodal-2.0.0/src/dodal/devices/zebra}/__init__.py +0 -0
  804. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/zocalo/__init__.py +0 -0
  805. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/devices/zocalo/zocalo_constants.py +0 -0
  806. {dls_dodal-1.69.0/src/dodal/plans/preprocessors → dls_dodal-2.0.0/src/dodal/parameters}/__init__.py +0 -0
  807. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/parameters/experiment_parameter_base.py +0 -0
  808. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/plan_stubs/__init__.py +0 -0
  809. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/plans/__init__.py +0 -0
  810. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/plans/configure_arm_trigger_and_disarm_detector.py +0 -0
  811. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/plans/load_panda_yaml.py +0 -0
  812. {dls_dodal-1.69.0/src/dodal/testing → dls_dodal-2.0.0/src/dodal/plans/preprocessors}/__init__.py +0 -0
  813. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/plans/save_panda.py +0 -0
  814. {dls_dodal-1.69.0/src/dodal/testing/fixtures → dls_dodal-2.0.0/src/dodal/testing}/__init__.py +0 -0
  815. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/src/dodal/testing/electron_analyser/__init__.py +0 -0
  816. {dls_dodal-1.69.0/src/dodal/testing/fixtures/devices → dls_dodal-2.0.0/src/dodal/testing/fixtures}/__init__.py +0 -0
  817. {dls_dodal-1.69.0/system_tests → dls_dodal-2.0.0/src/dodal/testing/fixtures/devices}/__init__.py +0 -0
  818. {dls_dodal-1.69.0/tests → dls_dodal-2.0.0/system_tests}/__init__.py +0 -0
  819. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/system_tests/conftest.py +0 -0
  820. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/system_tests/test_cli.py +0 -0
  821. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/system_tests/test_oav_system.py +0 -0
  822. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/system_tests/test_oav_to_redis_system.py +0 -0
  823. {dls_dodal-1.69.0/tests/beamlines → dls_dodal-2.0.0/tests}/__init__.py +0 -0
  824. {dls_dodal-1.69.0/tests/common → dls_dodal-2.0.0/tests/beamlines}/__init__.py +0 -0
  825. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/beamlines/test_i03.py +0 -0
  826. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/beamlines/test_mapping.py +0 -0
  827. {dls_dodal-1.69.0/tests/common/beamlines → dls_dodal-2.0.0/tests/common}/__init__.py +0 -0
  828. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/common/beamlines}/__init__.py +0 -0
  829. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/common/beamlines/test_beamline_parameters.py +0 -0
  830. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/common/beamlines/test_beamline_utils.py +0 -0
  831. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/common/beamlines/test_commissioning_mode.py +0 -0
  832. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/common/test_coordination.py +0 -0
  833. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/common/test_crystal_metadata.py +0 -0
  834. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/common/test_maths.py +0 -0
  835. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/common/test_udc_directory_provider.py +0 -0
  836. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/common/test_visit.py +0 -0
  837. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/common/test_watcher_utils.py +0 -0
  838. {dls_dodal-1.69.0/tests/devices/aithre_lasershaping → dls_dodal-2.0.0/tests/devices}/__init__.py +0 -0
  839. {dls_dodal-1.69.0/tests/devices/b07_1 → dls_dodal-2.0.0/tests/devices/aithre_lasershaping}/__init__.py +0 -0
  840. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/aithre_lasershaping/test_goniometer.py +0 -0
  841. {dls_dodal-1.69.0/tests/devices/current_amplifier → dls_dodal-2.0.0/tests/devices/beamlines}/__init__.py +0 -0
  842. {dls_dodal-1.69.0/tests/devices/detector → dls_dodal-2.0.0/tests/devices/beamlines/b07_1}/__init__.py +0 -0
  843. {dls_dodal-1.69.0/tests/devices/electron_analyser → dls_dodal-2.0.0/tests/devices/beamlines/i02_1}/__init__.py +0 -0
  844. {dls_dodal-1.69.0/tests/devices/electron_analyser/base → dls_dodal-2.0.0/tests/devices/beamlines/i03}/__init__.py +0 -0
  845. {dls_dodal-1.69.0/tests/devices/electron_analyser/specs → dls_dodal-2.0.0/tests/devices/beamlines/i04}/__init__.py +0 -0
  846. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i07/IIDCalibrationTable.txt +0 -0
  847. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i07/__init__.py +0 -0
  848. {dls_dodal-1.69.0/tests/devices/electron_analyser/vgscienta → dls_dodal-2.0.0/tests/devices/beamlines/i09}/__init__.py +0 -0
  849. {dls_dodal-1.69.0/tests/devices/i02_1 → dls_dodal-2.0.0/tests/devices/beamlines/i09_1}/__init__.py +0 -0
  850. {dls_dodal-1.69.0/tests/devices/i03 → dls_dodal-2.0.0/tests/devices/beamlines/i09_1_shared}/__init__.py +0 -0
  851. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i09_1_shared/test_data/__init__.py +0 -0
  852. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i09_1_shared/test_data/test_lookuptable_i09_hu.txt +0 -0
  853. {dls_dodal-1.69.0/tests/devices/i04 → dls_dodal-2.0.0/tests/devices/beamlines/i09_2_shared}/__init__.py +0 -0
  854. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i09_2_shared/test_data/ExpectedJIDEnergy2GapCalibrations.json +0 -0
  855. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i09_2_shared/test_data/ExpectedJIDEnergy2PhaseCalibrations.json +0 -0
  856. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i09_2_shared/test_data/JIDEnergy2GapCalibrations.csv +0 -0
  857. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i09_2_shared/test_data/JIDEnergy2PhaseCalibrations.csv +0 -0
  858. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i09_2_shared/test_data/__init__.py +0 -0
  859. {dls_dodal-1.69.0/tests/devices/i09 → dls_dodal-2.0.0/tests/devices/beamlines/i10}/__init__.py +0 -0
  860. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i10/test_data/IDEnergy2GapCalibrations.csv +0 -0
  861. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i10/test_data/IDEnergy2PhaseCalibrations.csv +0 -0
  862. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i10/test_data/__init__.py +0 -0
  863. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i10/test_data/expectedIDEnergy2GapCalibrationsIdd.json +0 -0
  864. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i10/test_data/expectedIDEnergy2GapCalibrationsIdu.json +0 -0
  865. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i10/test_data/expectedIDEnergy2PhaseCalibrationsidd.json +0 -0
  866. {dls_dodal-1.69.0/tests/devices → dls_dodal-2.0.0/tests/devices/beamlines}/i10/test_data/expectedIDEnergy2PhaseCalibrationsidu.json +0 -0
  867. {dls_dodal-1.69.0/tests/devices/i09_1 → dls_dodal-2.0.0/tests/devices/beamlines/i10_1}/__init__.py +0 -0
  868. {dls_dodal-1.69.0/tests/devices/i09_1_shared → dls_dodal-2.0.0/tests/devices/beamlines/i10_1/electromagnet}/__init__.py +0 -0
  869. {dls_dodal-1.69.0/tests/devices/i09_2_shared → dls_dodal-2.0.0/tests/devices/beamlines/i11}/__init__.py +0 -0
  870. {dls_dodal-1.69.0/tests/devices/i10 → dls_dodal-2.0.0/tests/devices/beamlines/i13_1}/__init__.py +0 -0
  871. {dls_dodal-1.69.0/tests/devices/i11 → dls_dodal-2.0.0/tests/devices/beamlines/i15}/__init__.py +0 -0
  872. {dls_dodal-1.69.0/tests/devices/i13_1 → dls_dodal-2.0.0/tests/devices/beamlines/i17}/__init__.py +0 -0
  873. {dls_dodal-1.69.0/tests/devices/i15 → dls_dodal-2.0.0/tests/devices/beamlines/i18}/__init__.py +0 -0
  874. {dls_dodal-1.69.0/tests/devices/i17 → dls_dodal-2.0.0/tests/devices/beamlines/i19}/__init__.py +0 -0
  875. {dls_dodal-1.69.0/tests/devices/i18 → dls_dodal-2.0.0/tests/devices/beamlines/i19/access_controlled}/__init__.py +0 -0
  876. {dls_dodal-1.69.0/tests/devices/i19 → dls_dodal-2.0.0/tests/devices/beamlines/i22}/__init__.py +0 -0
  877. {dls_dodal-1.69.0/tests/devices/i19/access_controlled → dls_dodal-2.0.0/tests/devices/beamlines/i24}/__init__.py +0 -0
  878. {dls_dodal-1.69.0/tests/devices/i22 → dls_dodal-2.0.0/tests/devices/beamlines/p60}/__init__.py +0 -0
  879. {dls_dodal-1.69.0/tests/devices/i24 → dls_dodal-2.0.0/tests/devices/beamlines/p99}/__init__.py +0 -0
  880. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/conftest.py +0 -0
  881. {dls_dodal-1.69.0/tests/devices/insertion_device → dls_dodal-2.0.0/tests/devices/current_amplifier}/__init__.py +0 -0
  882. {dls_dodal-1.69.0/tests/devices/mx_phase1 → dls_dodal-2.0.0/tests/devices/detector}/__init__.py +0 -0
  883. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/detector/test_data/__init__.py +0 -0
  884. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/detector/test_data/test_det_dist_converter.txt +0 -0
  885. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/detector/test_det_dim_constants.py +0 -0
  886. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/detector/test_det_resolution.py +0 -0
  887. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/detector/test_detector.py +0 -0
  888. {dls_dodal-1.69.0/tests/devices/oav → dls_dodal-2.0.0/tests/devices/electron_analyser}/__init__.py +0 -0
  889. {dls_dodal-1.69.0/tests/devices/oav/image_recognition → dls_dodal-2.0.0/tests/devices/electron_analyser/base}/__init__.py +0 -0
  890. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/electron_analyser/base/test_base_controller.py +0 -0
  891. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/electron_analyser/base/test_base_util.py +0 -0
  892. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/electron_analyser/base/test_energy_sources.py +0 -0
  893. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/electron_analyser/helper_util/__init__.py +0 -0
  894. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/electron_analyser/helper_util/assert_func.py +0 -0
  895. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/electron_analyser/helper_util/sequence.py +0 -0
  896. {dls_dodal-1.69.0/tests/devices/p60 → dls_dodal-2.0.0/tests/devices/electron_analyser/specs}/__init__.py +0 -0
  897. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/electron_analyser/test_data/__init__.py +0 -0
  898. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/electron_analyser/test_data/specs_sequence.seq +0 -0
  899. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/electron_analyser/test_data/vgscienta_sequence.seq +0 -0
  900. {dls_dodal-1.69.0/tests/devices/p99 → dls_dodal-2.0.0/tests/devices/electron_analyser/vgscienta}/__init__.py +0 -0
  901. {dls_dodal-1.69.0/tests/devices/temperature_controller → dls_dodal-2.0.0/tests/devices/insertion_device}/__init__.py +0 -0
  902. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/insertion_device/conftest.py +0 -0
  903. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/insertion_device/test_energy_motor_lookup.py +0 -0
  904. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/insertion_device/test_lookup_tables_models.py +0 -0
  905. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/insertion_device/test_polarisation.py +0 -0
  906. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/insertion_device/util.py +0 -0
  907. {dls_dodal-1.69.0/tests/devices/temperature_controller/lakeshore → dls_dodal-2.0.0/tests/devices/mx_phase1}/__init__.py +0 -0
  908. {dls_dodal-1.69.0/tests/devices/util → dls_dodal-2.0.0/tests/devices/oav}/__init__.py +0 -0
  909. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/conftest.py +0 -0
  910. {dls_dodal-1.69.0/tests/fake_zocalo → dls_dodal-2.0.0/tests/devices/oav/image_recognition}/__init__.py +0 -0
  911. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/image_recognition/test_pin_tip_detect.py +0 -0
  912. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/image_recognition/test_pin_tip_detect_utils.py +0 -0
  913. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/test_data/__init__.py +0 -0
  914. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/test_data/oav_snapshot_expected.png +0 -0
  915. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/test_data/oav_snapshot_test.png +0 -0
  916. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/test_data/test_OAVCentring.json +0 -0
  917. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/test_grid_overlay.py +0 -0
  918. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/test_oav.py +0 -0
  919. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/test_oav_parameters.py +0 -0
  920. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/test_oav_to_redis_forwarder.py +0 -0
  921. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/test_oav_utils.py +0 -0
  922. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/test_snapshot_image_processing.py +0 -0
  923. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/oav/test_snapshots.py +0 -0
  924. {dls_dodal-1.69.0/tests/plan_stubs → dls_dodal-2.0.0/tests/devices/temperature_controller}/__init__.py +0 -0
  925. {dls_dodal-1.69.0/tests/plans → dls_dodal-2.0.0/tests/devices/temperature_controller/lakeshore}/__init__.py +0 -0
  926. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/temperature_controller/lakeshore/test_lakeshore.py +0 -0
  927. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/temperature_controller/lakeshore/test_lakeshore_io.py +0 -0
  928. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_aperture.py +0 -0
  929. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_attenuator.py +0 -0
  930. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_backlight.py +0 -0
  931. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_baton.py +0 -0
  932. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_beam_converter.py +0 -0
  933. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_common_dcm.py +0 -0
  934. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_controllers.py +0 -0
  935. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_daq_configuration/__init__.py +0 -0
  936. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_daq_configuration/domain/__init__.py +0 -0
  937. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_daq_configuration/domain/beamlineParameters +0 -0
  938. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_daq_configuration/lookup/BeamLineEnergy_DCM_Pitch_converter.txt +0 -0
  939. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt +0 -0
  940. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_daq_configuration/lookup/__init__.py +0 -0
  941. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_data/__init__.py +0 -0
  942. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_data/test_beamline_undulator_to_gap_lookup_table.txt +0 -0
  943. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_data/test_lookup_table.txt +0 -0
  944. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_diamond_filter.py +0 -0
  945. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_eiger.py +0 -0
  946. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_fast_shutters.py +0 -0
  947. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_hutch_shutter.py +0 -0
  948. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_odin.py +0 -0
  949. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_positioner.py +0 -0
  950. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_qbpm.py +0 -0
  951. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_scintillator.py +0 -0
  952. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_selectable_source.py +0 -0
  953. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_slits.py +0 -0
  954. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_smargon.py +0 -0
  955. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_thawer.py +0 -0
  956. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_turbo_slit.py +0 -0
  957. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_undulator.py +0 -0
  958. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_utils.py +0 -0
  959. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_watsonmarlow323_pump.py +0 -0
  960. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_webcam.py +0 -0
  961. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_xbpm_feedback.py +0 -0
  962. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_xspress3.py +0 -0
  963. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_zebra.py +0 -0
  964. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_zebra_constants_mapping.py +0 -0
  965. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_zebra_shutter.py +0 -0
  966. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/test_zocalo_results.py +0 -0
  967. {dls_dodal-1.69.0/tests/plans/test_preprocessors → dls_dodal-2.0.0/tests/devices/util}/__init__.py +0 -0
  968. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/util/test_adjuster_plans.py +0 -0
  969. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/util/test_data/__init__.py +0 -0
  970. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/util/test_data/test_beamline_dcm_roll_converter.txt +0 -0
  971. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/util/test_data/test_beamline_dcm_roll_converter_non_monotonic.txt +0 -0
  972. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/util/test_data/test_beamline_dcm_roll_converter_reversed.txt +0 -0
  973. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/devices/util/test_lookup_tables.py +0 -0
  974. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/fake_beamline.py +0 -0
  975. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/fake_beamline_all_devices_raise_exception.py +0 -0
  976. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/fake_beamline_broken_dependency.py +0 -0
  977. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/fake_beamline_dependencies.py +0 -0
  978. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/fake_beamline_disordered_dependencies.py +0 -0
  979. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/fake_beamline_some_devices_working.py +0 -0
  980. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/fake_device_factory_beamline.py +0 -0
  981. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/fake_zocalo/README.rst +0 -0
  982. {dls_dodal-1.69.0/tests/preprocessors → dls_dodal-2.0.0/tests/fake_zocalo}/__init__.py +0 -0
  983. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/fake_zocalo/__main__.py +0 -0
  984. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/fake_zocalo/dls_start_fake_zocalo.sh +0 -0
  985. {dls_dodal-1.69.0/tests/testing → dls_dodal-2.0.0/tests/plan_stubs}/__init__.py +0 -0
  986. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plan_stubs/test_data/__init__.py +0 -0
  987. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plan_stubs/test_data/topup_long_delay.txt +0 -0
  988. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plan_stubs/test_data/topup_short_params.txt +0 -0
  989. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plan_stubs/test_data_session.py +0 -0
  990. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plan_stubs/test_motor_util_plans.py +0 -0
  991. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plan_stubs/test_topup_plan.py +0 -0
  992. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plan_stubs/test_wrapped_stubs.py +0 -0
  993. {dls_dodal-1.69.0/tests/testing/fixtures → dls_dodal-2.0.0/tests/plans}/__init__.py +0 -0
  994. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plans/test_bimorph.py +0 -0
  995. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plans/test_configure_arm_trigger_and_disarm_detector.py +0 -0
  996. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plans/test_load_panda_yaml.py +0 -0
  997. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plans/test_preprocessors/test_verify_undulator_gap.py +0 -0
  998. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plans/test_save_panda.py +0 -0
  999. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plans/test_scanspec.py +0 -0
  1000. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plans/test_verify_undulator_gap_plan.py +0 -0
  1001. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/plans/test_wrapped.py +0 -0
  1002. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/preprocessors/test_filesystem_metadata.py +0 -0
  1003. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/test_data/__init__.py +0 -0
  1004. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/test_data/bad_beamlineParameters +0 -0
  1005. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/test_data/i04_beamlineParameters +0 -0
  1006. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/test_data/scintillator_with_beam.jpg +0 -0
  1007. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/test_data/test_beamline_parameters.txt +0 -0
  1008. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/test_data/test_display.configuration +0 -0
  1009. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/test_data/test_oav_zoom_levels.xml +0 -0
  1010. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/test_log.py +0 -0
  1011. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/tests/testing/fixtures/test_run_engine.py +0 -0
  1012. {dls_dodal-1.69.0 → dls_dodal-2.0.0}/uv.lock +0 -0
@@ -0,0 +1,276 @@
1
+ Metadata-Version: 2.4
2
+ Name: dls-dodal
3
+ Version: 2.0.0
4
+ Summary: Ophyd devices and other utils that could be used across DLS beamlines
5
+ Author-email: Dominic Oram <dominic.oram@diamond.ac.uk>, Joseph Ware <joseph.ware@diamond.ac.uk>, Oliver Silvester <Oliver.Silvester@diamond.ac.uk>, Noemi Frisina <noemi.frisina@diamond.ac.uk>
6
+ License: Apache License
7
+ Version 2.0, January 2004
8
+ http://www.apache.org/licenses/
9
+
10
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
11
+
12
+ 1. Definitions.
13
+
14
+ "License" shall mean the terms and conditions for use, reproduction,
15
+ and distribution as defined by Sections 1 through 9 of this document.
16
+
17
+ "Licensor" shall mean the copyright owner or entity authorized by
18
+ the copyright owner that is granting the License.
19
+
20
+ "Legal Entity" shall mean the union of the acting entity and all
21
+ other entities that control, are controlled by, or are under common
22
+ control with that entity. For the purposes of this definition,
23
+ "control" means (i) the power, direct or indirect, to cause the
24
+ direction or management of such entity, whether by contract or
25
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
26
+ outstanding shares, or (iii) beneficial ownership of such entity.
27
+
28
+ "You" (or "Your") shall mean an individual or Legal Entity
29
+ exercising permissions granted by this License.
30
+
31
+ "Source" form shall mean the preferred form for making modifications,
32
+ including but not limited to software source code, documentation
33
+ source, and configuration files.
34
+
35
+ "Object" form shall mean any form resulting from mechanical
36
+ transformation or translation of a Source form, including but
37
+ not limited to compiled object code, generated documentation,
38
+ and conversions to other media types.
39
+
40
+ "Work" shall mean the work of authorship, whether in Source or
41
+ Object form, made available under the License, as indicated by a
42
+ copyright notice that is included in or attached to the work
43
+ (an example is provided in the Appendix below).
44
+
45
+ "Derivative Works" shall mean any work, whether in Source or Object
46
+ form, that is based on (or derived from) the Work and for which the
47
+ editorial revisions, annotations, elaborations, or other modifications
48
+ represent, as a whole, an original work of authorship. For the purposes
49
+ of this License, Derivative Works shall not include works that remain
50
+ separable from, or merely link (or bind by name) to the interfaces of,
51
+ the Work and Derivative Works thereof.
52
+
53
+ "Contribution" shall mean any work of authorship, including
54
+ the original version of the Work and any modifications or additions
55
+ to that Work or Derivative Works thereof, that is intentionally
56
+ submitted to Licensor for inclusion in the Work by the copyright owner
57
+ or by an individual or Legal Entity authorized to submit on behalf of
58
+ the copyright owner. For the purposes of this definition, "submitted"
59
+ means any form of electronic, verbal, or written communication sent
60
+ to the Licensor or its representatives, including but not limited to
61
+ communication on electronic mailing lists, source code control systems,
62
+ and issue tracking systems that are managed by, or on behalf of, the
63
+ Licensor for the purpose of discussing and improving the Work, but
64
+ excluding communication that is conspicuously marked or otherwise
65
+ designated in writing by the copyright owner as "Not a Contribution."
66
+
67
+ "Contributor" shall mean Licensor and any individual or Legal Entity
68
+ on behalf of whom a Contribution has been received by Licensor and
69
+ subsequently incorporated within the Work.
70
+
71
+ 2. Grant of Copyright License. Subject to the terms and conditions of
72
+ this License, each Contributor hereby grants to You a perpetual,
73
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
74
+ copyright license to reproduce, prepare Derivative Works of,
75
+ publicly display, publicly perform, sublicense, and distribute the
76
+ Work and such Derivative Works in Source or Object form.
77
+
78
+ 3. Grant of Patent License. Subject to the terms and conditions of
79
+ this License, each Contributor hereby grants to You a perpetual,
80
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
81
+ (except as stated in this section) patent license to make, have made,
82
+ use, offer to sell, sell, import, and otherwise transfer the Work,
83
+ where such license applies only to those patent claims licensable
84
+ by such Contributor that are necessarily infringed by their
85
+ Contribution(s) alone or by combination of their Contribution(s)
86
+ with the Work to which such Contribution(s) was submitted. If You
87
+ institute patent litigation against any entity (including a
88
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
89
+ or a Contribution incorporated within the Work constitutes direct
90
+ or contributory patent infringement, then any patent licenses
91
+ granted to You under this License for that Work shall terminate
92
+ as of the date such litigation is filed.
93
+
94
+ 4. Redistribution. You may reproduce and distribute copies of the
95
+ Work or Derivative Works thereof in any medium, with or without
96
+ modifications, and in Source or Object form, provided that You
97
+ meet the following conditions:
98
+
99
+ (a) You must give any other recipients of the Work or
100
+ Derivative Works a copy of this License; and
101
+
102
+ (b) You must cause any modified files to carry prominent notices
103
+ stating that You changed the files; and
104
+
105
+ (c) You must retain, in the Source form of any Derivative Works
106
+ that You distribute, all copyright, patent, trademark, and
107
+ attribution notices from the Source form of the Work,
108
+ excluding those notices that do not pertain to any part of
109
+ the Derivative Works; and
110
+
111
+ (d) If the Work includes a "NOTICE" text file as part of its
112
+ distribution, then any Derivative Works that You distribute must
113
+ include a readable copy of the attribution notices contained
114
+ within such NOTICE file, excluding those notices that do not
115
+ pertain to any part of the Derivative Works, in at least one
116
+ of the following places: within a NOTICE text file distributed
117
+ as part of the Derivative Works; within the Source form or
118
+ documentation, if provided along with the Derivative Works; or,
119
+ within a display generated by the Derivative Works, if and
120
+ wherever such third-party notices normally appear. The contents
121
+ of the NOTICE file are for informational purposes only and
122
+ do not modify the License. You may add Your own attribution
123
+ notices within Derivative Works that You distribute, alongside
124
+ or as an addendum to the NOTICE text from the Work, provided
125
+ that such additional attribution notices cannot be construed
126
+ as modifying the License.
127
+
128
+ You may add Your own copyright statement to Your modifications and
129
+ may provide additional or different license terms and conditions
130
+ for use, reproduction, or distribution of Your modifications, or
131
+ for any such Derivative Works as a whole, provided Your use,
132
+ reproduction, and distribution of the Work otherwise complies with
133
+ the conditions stated in this License.
134
+
135
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
136
+ any Contribution intentionally submitted for inclusion in the Work
137
+ by You to the Licensor shall be under the terms and conditions of
138
+ this License, without any additional terms or conditions.
139
+ Notwithstanding the above, nothing herein shall supersede or modify
140
+ the terms of any separate license agreement you may have executed
141
+ with Licensor regarding such Contributions.
142
+
143
+ 6. Trademarks. This License does not grant permission to use the trade
144
+ names, trademarks, service marks, or product names of the Licensor,
145
+ except as required for reasonable and customary use in describing the
146
+ origin of the Work and reproducing the content of the NOTICE file.
147
+
148
+ 7. Disclaimer of Warranty. Unless required by applicable law or
149
+ agreed to in writing, Licensor provides the Work (and each
150
+ Contributor provides its Contributions) on an "AS IS" BASIS,
151
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
152
+ implied, including, without limitation, any warranties or conditions
153
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
154
+ PARTICULAR PURPOSE. You are solely responsible for determining the
155
+ appropriateness of using or redistributing the Work and assume any
156
+ risks associated with Your exercise of permissions under this License.
157
+
158
+ 8. Limitation of Liability. In no event and under no legal theory,
159
+ whether in tort (including negligence), contract, or otherwise,
160
+ unless required by applicable law (such as deliberate and grossly
161
+ negligent acts) or agreed to in writing, shall any Contributor be
162
+ liable to You for damages, including any direct, indirect, special,
163
+ incidental, or consequential damages of any character arising as a
164
+ result of this License or out of the use or inability to use the
165
+ Work (including but not limited to damages for loss of goodwill,
166
+ work stoppage, computer failure or malfunction, or any and all
167
+ other commercial damages or losses), even if such Contributor
168
+ has been advised of the possibility of such damages.
169
+
170
+ 9. Accepting Warranty or Additional Liability. While redistributing
171
+ the Work or Derivative Works thereof, You may choose to offer,
172
+ and charge a fee for, acceptance of support, warranty, indemnity,
173
+ or other liability obligations and/or rights consistent with this
174
+ License. However, in accepting such obligations, You may act only
175
+ on Your own behalf and on Your sole responsibility, not on behalf
176
+ of any other Contributor, and only if You agree to indemnify,
177
+ defend, and hold each Contributor harmless for any liability
178
+ incurred by, or claims asserted against, such Contributor by reason
179
+ of your accepting any such warranty or additional liability.
180
+
181
+ END OF TERMS AND CONDITIONS
182
+
183
+ APPENDIX: How to apply the Apache License to your work.
184
+
185
+ To apply the Apache License to your work, attach the following
186
+ boilerplate notice, with the fields enclosed by brackets "{}"
187
+ replaced with your own identifying information. (Don't include
188
+ the brackets!) The text should be enclosed in the appropriate
189
+ comment syntax for the file format. We also recommend that a
190
+ file or class name and description of purpose be included on the
191
+ same "printed page" as the copyright notice for easier
192
+ identification within third-party archives.
193
+
194
+ Copyright {yyyy} {name of copyright owner}
195
+
196
+ Licensed under the Apache License, Version 2.0 (the "License");
197
+ you may not use this file except in compliance with the License.
198
+ You may obtain a copy of the License at
199
+
200
+ http://www.apache.org/licenses/LICENSE-2.0
201
+
202
+ Unless required by applicable law or agreed to in writing, software
203
+ distributed under the License is distributed on an "AS IS" BASIS,
204
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
205
+ See the License for the specific language governing permissions and
206
+ limitations under the License.
207
+
208
+ Project-URL: GitHub, https://github.com/DiamondLightSource/dodal
209
+ Classifier: Development Status :: 3 - Alpha
210
+ Classifier: License :: OSI Approved :: Apache Software License
211
+ Classifier: Programming Language :: Python :: 3.11
212
+ Classifier: Programming Language :: Python :: 3.12
213
+ Requires-Python: >=3.11
214
+ Description-Content-Type: text/markdown
215
+ License-File: LICENSE
216
+ Requires-Dist: click
217
+ Requires-Dist: ophyd
218
+ Requires-Dist: ophyd-async[ca,pva]>=v0.14.0
219
+ Requires-Dist: bluesky>=1.14.5
220
+ Requires-Dist: pyepics
221
+ Requires-Dist: pillow
222
+ Requires-Dist: zocalo>=1.0.0
223
+ Requires-Dist: requests
224
+ Requires-Dist: graypy
225
+ Requires-Dist: pydantic>=2.0
226
+ Requires-Dist: opencv-python-headless
227
+ Requires-Dist: numpy
228
+ Requires-Dist: aiofiles
229
+ Requires-Dist: aiohttp
230
+ Requires-Dist: redis
231
+ Requires-Dist: scanspec>=0.7.3
232
+ Requires-Dist: pyzmq==26.3.0
233
+ Requires-Dist: deepdiff
234
+ Requires-Dist: daq-config-server>=v1.0.0
235
+ Dynamic: license-file
236
+
237
+ [![CI](https://github.com/DiamondLightSource/dodal/actions/workflows/ci.yml/badge.svg)](https://github.com/DiamondLightSource/dodal/actions/workflows/ci.yml)
238
+ [![Coverage](https://codecov.io/gh/DiamondLightSource/dodal/branch/main/graph/badge.svg)](https://codecov.io/gh/DiamondLightSource/dodal)
239
+ [![PyPI](https://img.shields.io/pypi/v/dls-dodal.svg)](https://pypi.org/project/dls-dodal)
240
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
241
+
242
+ # dodal
243
+
244
+ Ophyd devices and other utils that could be used across DLS beamlines
245
+
246
+ Source | <https://github.com/DiamondLightSource/dodal>
247
+ :---: | :---:
248
+ PyPI | `pip install dls-dodal`
249
+ Documentation | <https://diamondlightsource.github.io/dodal>
250
+ Releases | <https://github.com/DiamondLightSource/dodal/releases>
251
+
252
+ Testing Connectivity
253
+ --------------------
254
+
255
+ You can test your connection to a beamline if it's PVs are visible to your machine with:
256
+
257
+
258
+ ```
259
+ # On any workstation:
260
+ dodal connect <BEAMLINE>
261
+
262
+ # On a beamline workstation, this should suffice:
263
+ dodal connect ${BEAMLINE}
264
+ ```
265
+
266
+
267
+
268
+ For more options, including a list of valid beamlines, type
269
+
270
+ ```
271
+ dodal connect --help
272
+ ```
273
+
274
+ <!-- README only content. Anything below this line won't be included in index.md -->
275
+
276
+ See https://diamondlightsource.github.io/dodal for more detailed documentation.
@@ -0,0 +1,47 @@
1
+ # Build the docs using sphinx
2
+
3
+ You can build the [sphinx](https://www.sphinx-doc.org) based docs from the project directory by running:
4
+
5
+ ```
6
+ $ tox -e docs
7
+ ```
8
+
9
+ This will build the static docs on the `docs` directory, which includes API docs that pull in docstrings from the code.
10
+
11
+ :::{seealso}
12
+ [](documentation_standards)
13
+ :::
14
+
15
+ The docs will be built into the `build/html` directory, and can be opened locally with a web browse:
16
+
17
+ ```
18
+ $ firefox build/html/index.html
19
+ ```
20
+
21
+ ## Autobuild
22
+
23
+ You can also run an autobuild process, which will watch your `docs` directory for changes and rebuild whenever it sees changes, reloading any browsers watching the pages:
24
+
25
+ ```
26
+ $ tox -e docs autobuild
27
+ ```
28
+
29
+ You can view the pages at localhost:
30
+
31
+ ```
32
+ $ firefox http://localhost:8000
33
+ ```
34
+
35
+ If you are making changes to source code too, you can tell it to watch changes in this directory too:
36
+
37
+ ```
38
+ $ tox -e docs autobuild -- --watch src
39
+ ```
40
+
41
+ ## Common issues
42
+
43
+ ### Building docs fails due to cached *rst files
44
+
45
+ If the module stucture changes from "x.y" to "x.z.y" one could get "module x.z.y not found" error trying to build the docs locally.
46
+
47
+ The solution is to clear "/workspaces/dodal/docs/reference/generated" folder.
@@ -0,0 +1,131 @@
1
+ # Converting an existing beamline to use a DeviceManager
2
+
3
+ This guide assumes you have a beamline module file (eg `dodal/beamlines/ixx.py`)
4
+ with a number of functions defined and decorated with `@device_factory`
5
+ (`dodal.common.beamlines.beamline_utils`).
6
+
7
+ ## Create a DeviceManager
8
+
9
+ By convention this should be named `devices` but can be custom if there is good
10
+ reason.
11
+
12
+ ```python
13
+ from dodal.device_manager import DeviceManager
14
+
15
+ devices = DeviceManager()
16
+ ```
17
+
18
+ This device manager keeps track of all device factories for a beamline making it
19
+ easier to determine which are present and the order in which to build them to
20
+ ensure dependencies are available before their dependents.
21
+
22
+ ## Replace the `@device_factory` decorators
23
+
24
+ Each factory function should be decorated with `@devices.factory` (where
25
+ `devices` is the name of the `DeviceManager` created above) instead of
26
+ `@device_factory`. If no arguments are required, the parentheses can be omitted,
27
+ eg
28
+
29
+ ```python
30
+ @devices.factory()
31
+ def device() -> Device:
32
+ ...
33
+ ```
34
+
35
+ is equivalent to
36
+
37
+ ```python
38
+ @devices.factory
39
+ def device() -> Device:
40
+ ...
41
+ ```
42
+
43
+ If arguments (eg `skip` or `mock`) were passed to `device_factory`, these can
44
+ continue to be passed to `devices.factory` in the same way.
45
+
46
+ ## Replace `get_path_provider` with fixture
47
+
48
+ Previously, the path_provider used by detectors was set and accessed as a global.
49
+
50
+ Where device factory functions used this global (via `get_path_provider`) they
51
+ should be updated to accept `path_provider` as a parameter. This can then be
52
+ passed in when creating the devices.
53
+
54
+ ```python
55
+ # Previous approach using `get_path_provider`...
56
+ @device_factory()
57
+ def panda() -> HDFPanda:
58
+ return HDFPanda(
59
+ f"{PREFIX.beamline_prefix}-EA-PANDA-01:",
60
+ path_provider=get_path_provider(),
61
+ )
62
+
63
+ # ... should be replaced with
64
+ @devices.factory()
65
+ def panda(path_provider: PathProvider) -> HDFPanda:
66
+ return HDFPanda(
67
+ f"{PREFIX.beamline_prefix}-EA-PANDA-01:",
68
+ path_provider=path_provider,
69
+ )
70
+ ```
71
+
72
+ Where a beamline was setting the path provider via `set_path_provider`, a
73
+ fixture should be created which will provide a fallback instance to be used if
74
+ one is not passed in.
75
+
76
+
77
+ ```python
78
+ # The previous approach...
79
+ set_path_provider(PathProviderImplementation(...))
80
+
81
+ # ...should be removed and replaced with
82
+ @devices.fixture
83
+ def path_provider() -> PathProvider:
84
+ return PathProviderImplementation(...)
85
+ ```
86
+
87
+ ## Replace factory calls with parameters
88
+
89
+ Where one function previously called another to access another device, this should
90
+ be replaced with a parameter of the same name. This is to prevent multiple
91
+ instances of devices being created as functions no longer cache the devices they
92
+ create.
93
+
94
+ ```python
95
+ # Previous example using a device factory function
96
+ @device_factory()
97
+ def beamsize() -> Beamsize:
98
+ return Beamsize(aperture_scatterguard())
99
+
100
+ # New version with `aperture_scatterguard` passed as a parameter
101
+ @devices.factory
102
+ def beamsize(aperture_scatterguard: ApertureScatterguard) -> Beamsize:
103
+ return Beamsize(aperture_scatterguard)
104
+ ```
105
+
106
+ ## Merge multiple device managers
107
+
108
+ If devices need to be shared between multiple beamlines, eg branch beamlines
109
+ sharing optics components, an external device manager can be imported and
110
+ merged into another.
111
+
112
+ ```python
113
+ # in ixx_shared.py
114
+ devices = DeviceManager()
115
+
116
+ @devices.factory
117
+ def common_device() -> CommonDevice:
118
+ ...
119
+
120
+ # in ixx.py
121
+ from ixx_shared import devices as shared_devices
122
+
123
+ devices = DeviceManager()
124
+ devices.include(shared_devices)
125
+
126
+ # devices defined in the common beamline module can then be used as dependencies
127
+ # in the beamline module
128
+ @devices.factory
129
+ def beamline_device(common_device: CommonDevice) -> BeamlineDevice:
130
+ ...
131
+ ```
@@ -0,0 +1,129 @@
1
+ # Creating a new beamline
2
+
3
+ A beamline is a collection of devices that can be used together to run experiments, they may be read-only or capable of being set.
4
+ They include motors in the experiment hutch, optical components in the optics hutch, the synchrotron "machine" and more.
5
+
6
+ ## Beamline Modules
7
+
8
+ Each beamline should have its own file in the ``dodal.beamlines`` folder, in which the particular devices for the
9
+ beamline are instantiated. The file should be named after the colloquial name for the beamline. For example:
10
+
11
+ * ``i03.py``
12
+ * ``i20_1.py``
13
+ * ``vmxi.py``
14
+
15
+ Beamline modules (in ``dodal.beamlines``) are code-as-configuration. They define the set of devices and common device
16
+ settings needed for a particular beamline or group of similar beamlines (e.g. a beamline and its digital twin). Some
17
+ of our tooling depends on the convention of *only* beamline modules going in this package. Common utilities should
18
+ go somewhere else e.g. ``dodal.utils`` or ``dodal.beamlines.common``.
19
+
20
+ The following example creates a fictitious beamline ``w41``, with a simulated twin ``s41``.
21
+ ``w41`` needs to monitor the status of the Synchrotron and has an AdAravisDetector.
22
+ ``s41`` has a simulated clone of the AdAravisDetector, but not of the Synchrotron machine.
23
+
24
+ ```python
25
+
26
+ from functools import cache
27
+ from pathlib import Path
28
+ from ophyd_async.core import PathProvider
29
+ from ophyd_async.epics.adaravis import AravisDetector
30
+
31
+ from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
32
+ from dodal.common.beamlines.device_helpers import CAM_SUFFIX, HDF5_SUFFIX
33
+ from dodal.common.visit import RemoteDirectoryServiceClient, StaticVisitPathProvider
34
+ from dodal.device_manager import DeviceManager
35
+ from dodal.devices.synchrotron import Synchrotron
36
+ from dodal.log import set_beamline as set_log_beamline
37
+ from dodal.utils import BeamlinePrefix, get_beamline_name
38
+
39
+ BL = get_beamline_name("s41") # Default used when not on a live beamline
40
+ PREFIX = BeamlinePrefix(BL)
41
+ set_log_beamline(BL) # Configure logging and util functions
42
+ set_utils_beamline(BL)
43
+
44
+ devices = DeviceManager()
45
+
46
+ @devices.fixture
47
+ @cache
48
+ def path_provider() -> PathProvider:
49
+ # Currently we must hard-code the visit, determining the visit is WIP.
50
+ return StaticVisitPathProvider(
51
+ BL,
52
+ # Root directory for all detectors
53
+ Path("/dls/w41/data/YYYY/cm12345-1"),
54
+ # Uses an existing GDA server to ensure filename uniqueness
55
+ client=RemoteDirectoryServiceClient("http://s41-control:8088/api"),
56
+ # Else if no GDA server use a LocalDirectoryServiceClient(),
57
+ )
58
+
59
+
60
+ """
61
+ Define device factory functions below this point.
62
+ A device factory function is any function that has a return type which conforms
63
+ to one or more Bluesky Protocols.
64
+ """
65
+
66
+ """
67
+ This decorator gives extra desirable behaviour to this factory function:
68
+ - it may be instantiated automatically, selectively on live beamline
69
+ - it automatically names the device if no name is explicitly set
70
+ - it may be skipped when make_all_devices is called on this module
71
+ - it must be explicitly connected (which may be automated by tools)
72
+ - when connected it may connect to a simulated backend
73
+ - it may be connected concurrently (when automated by tools)
74
+ """
75
+ @devices.factory(skip = BL == "s41")
76
+ def synchrotron() -> Synchrotron:
77
+ return Synchrotron()
78
+
79
+
80
+ @devices.factory()
81
+ def d11(path_provider: PathProvider) -> AravisDetector:
82
+ return AravisDetector(
83
+ f"{PREFIX.beamline_prefix}-DI-DCAM-01:",
84
+ path_provider=path_provider,
85
+ drv_suffix=CAM_SUFFIX,
86
+ fileio_suffix=HDF5_SUFFIX,
87
+ )
88
+ ```
89
+
90
+ Some beamlines have multiple endstations and shared optics. To reduce duplicate configuration, the `DeviceManager` allows us to include devices from another instance of `DeviceManager`.
91
+
92
+ An example is shown below for a shared beamline setup:
93
+
94
+ ```python
95
+ from dodal.device_manager import DeviceManager
96
+ from dodal.devices.pgm import PlaneGratingMonochromator
97
+
98
+ ...
99
+
100
+ devices = DeviceManager()
101
+
102
+ """Device that is shared between multiple endstations, i05 and i05-1."""
103
+ @devices.factory()
104
+ def pgm() -> PlaneGratingMonochromator:
105
+ return PlaneGratingMonochromator(
106
+ prefix=f"{PREFIX.beamline_prefix}-OP-PGM-01:",
107
+ grating=Grating,
108
+ )
109
+ ```
110
+
111
+ Then for i05, we include the i05_shared devices so we have access to the shared devices.
112
+
113
+ ```python
114
+ from dodal.beamlines.i05_shared import devices as i05_shared_devices
115
+ from dodal.device_manager import DeviceManager
116
+ from dodal.devices.temperture_controller import Lakeshore336
117
+
118
+ ...
119
+
120
+ """Include all the i05 shared beamline devices which should be avaliable for every end station.
121
+ In this example, the pgm device will be included in this beamline."""
122
+ devices = DeviceManager()
123
+ devices.include(i05_shared_devices)
124
+
125
+ """Beamline specific device for i05 only."""
126
+ @devices.factory()
127
+ def sample_temperature_controller() -> Lakeshore336:
128
+ return Lakeshore336(prefix=f"{PREFIX.beamline_prefix}-EA-TCTRL-02:")
129
+ ```
@@ -0,0 +1,74 @@
1
+ Creating a new device
2
+ ---------------------
3
+
4
+ Devices in dodal use the ophyd-async framework for hardware abstraction at Diamond Light Source. Before starting, [review where your code should live](../reference/device-standards.rst#where_to_put_devices) to avoid duplication and ensure maintainability.
5
+
6
+ Reusing an existing class
7
+ =========================
8
+
9
+ Before creating a new device, always check if a suitable class already exists in dodal or ophyd-async. This helps avoid duplication, ensures maintainability, and leverages tested code.
10
+
11
+ - **Motors:** Use [Motor](https://github.com/bluesky/ophyd-async/blob/main/src/ophyd_async/epics/motor.py) for EPICS motor records.
12
+ - **Storage ring signals:** Use [Synchrotron](https://github.com/DiamondLightSource/dodal/blob/main/src/dodal/devices/synchrotron.py).
13
+ - **AreaDetectors:** Use [StandardDetector](https://github.com/bluesky/ophyd-async/tree/main/src/ophyd_async/epics/adcore) or [adcore](https://github.com/bluesky/ophyd-async/tree/main/src/ophyd_async/epics/adcore).
14
+
15
+ If a compatible device class exists:
16
+ - Use it and add it to the [beamline](./create-beamline.rst) to avoid re-implementation and share improvements.
17
+ - You can use ophyd-async's [DeviceVector](https://blueskyproject.io/ophyd-async/main/explanations/decisions/0006-procedural-device-definitions.html) to handle a collection of identical devices.
18
+ - If a device class only differs by PV address, request an alias in the EPICS IOC support module with the relevant controls support team.
19
+ - If that's not possible (e.g. proprietary support), add configurability to the dodal device class, ensuring defaults match existing patterns and that `dodal connect` still works for current devices.
20
+ - Avoid dynamic attribute assignment (e.g. dicts of motors) as it hinders type checking and plan writing.
21
+ - Use static attributes and type hints for better IDE support and maintainability.
22
+
23
+ Many device classes in `dodal.devices.motors` represent physical relationships between motors, such as `Stage` and `XYStage`.
24
+
25
+ For example, only use `XYStage` for two perpendicular motors (e.g. X and Y axes on a sample table):
26
+ - Do not use `XYStage` for unrelated motors or for motors that move in the same axis (e.g. coarse and fine adjustment).
27
+ - Only a device that represents a group of motors with a physical relationship, should be defined in `motor`.
28
+ - If your class define an `XYStage` but you need extra signals or behaviour, extend the `XYStage` class outside the `motor` module.
29
+
30
+ **Only if no suitable class exists**, create a new device that connects to the required signals. During review, refactor to align with existing devices if needed, using inheritance or composition to deduplicate code.
31
+
32
+ Devices that are generic and reusable across multiple beamlines should be defined under `dodal.devices`. For example, `dodal.devices.motors.XYStage` is generic enough that most beamlines can use it directly or inherit from it.
33
+
34
+ Devices that are specific to a single beamline should be placed under `dodal.devices.beamlines.iXX`. For instance, a detector that is only used on that beamline and is too specialized to be reused elsewhere belongs here.
35
+
36
+ If a beamline has multiple endstations and a device is shared between them, it should be defined under `dodal.devices.beamlines.iXX_shared`.
37
+
38
+ Writing a device class
39
+ ======================
40
+
41
+ To develop a new device, get an initial, working version of your code into the main branch as early as possible. Test it at the beamline, then continuously make and merge small changes into main. This approach prevents pull requests from becoming long-standing issues.
42
+
43
+ - **Follow the [ophyd-async device implementation guide](https://blueskyproject.io/ophyd-async/main/tutorials/implementing-devices.html)** to structure your device code.
44
+ - **Choose the right base class** by consulting the [base class guide](https://blueskyproject.io/ophyd-async/main/how-to/choose-right-baseclass.html), If your device needs to move, you'll need to extend the Movable protocol. For detailed guidance on when and how to do this, refer to the [movable device guide](https://blueskyproject.io/ophyd-async/main/explanations/when-to-extend-movable.html).
45
+ - **Add static metadata (if any) to the device class** using a [soft signal](https://blueskyproject.io/ophyd-async/main/_api/ophyd_async/ophyd_async.core.html#ophyd_async.core.soft_signal_rw) or existing device epics record. For example this could be a manufacturer or brand name of the device. Another example is crystal metadata in [i22 DCM](https://diamondlightsource.github.io/dodal/main/reference/generated/dodal.devices.beamlines.i22.dcm.DCM.html#dodal.devices.beamlines.i22.dcm.DCM) In some cases it might be beneficial to ask controls team to create an additional epics field containing metadata for such device.
46
+ - **Write thorough unit tests** for all expected use cases. Reference the [ophyd-async device test guide](https://blueskyproject.io/ophyd-async/main/tutorials/implementing-devices.html) for best practices.
47
+ - **Validate your device on the beamline** and keep notes of any issues for later fixes.
48
+ - **Make use of type annotations** so that pyright will validate that you are passing around values that ophyd-async will accept.
49
+ - Use `dodal connect <beamline>` to check device connectivity and `cainfo <PV address>` to confirm PVs and datatypes. You can check a PV's datatype by using the `cainfo <PV address>` command. If the datatype is an enum, `caget -d 31 <PV address>` will also display the available enums that the PV takes. Common enums are defined in `ophyd-async.core` for devices to use, but you can define custom ones when suitable (inheriting from `ophyd_async.core` `StrictEnum`, `SupersetEnum` or `SubsetEnum`). The values should be capitalised e.g `ON = "On"`. If the PV expects upper case for the enum (e.g `ON = "ON"`), please speak to the relevant controls engineer(s) to get this changed if possible. For more infomation, please visit [here](https://blueskyproject.io/ophyd-async/main/explanations/decisions/0008-signal-types.html).
50
+
51
+ Device best practices for Bluesky plans
52
+ =======================================
53
+
54
+ - Interact with devices in plans only through the Bluesky [messages protocol](https://blueskyproject.io/bluesky/main/msg.html), such as `yield from bps.abs_set(...)` or `yield Msg("set", ...)`.
55
+ - Avoid calling device methods directly inside plans (e.g. `device.do_thing()`), as this breaks the abstraction and can lead to unpredictable behaviour.
56
+
57
+ Example of what **not** to do:
58
+ ```python
59
+ class MyDevice(Device):
60
+ def do_thing(...):
61
+ ...
62
+
63
+ def my_plan():
64
+ yield from bps.set(...)
65
+ device.do_thing() # This is bad: do not call device methods directly in plans
66
+ ```
67
+
68
+ **Tip:**
69
+
70
+ - If you are unsure how to represent a PV as a Signal, seek feedback early (for example, by opening a draft PR).
71
+ - Whenever possible, merge with existing devices—comprehensive tests help ensure changes do not break current functionality.
72
+ - Document any device-specific quirks or limitations for future maintainers.
73
+
74
+ For further guidance, see the [ophyd-async documentation](https://blueskyproject.io/ophyd-async/main/how-to/choose-interfaces-for-devices.html).