dls-dodal 1.68.0__py3-none-any.whl → 2.0.0__py3-none-any.whl

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 (292) hide show
  1. {dls_dodal-1.68.0.dist-info → dls_dodal-2.0.0.dist-info}/METADATA +1 -31
  2. dls_dodal-2.0.0.dist-info/RECORD +354 -0
  3. {dls_dodal-1.68.0.dist-info → dls_dodal-2.0.0.dist-info}/WHEEL +1 -1
  4. dodal/_version.py +2 -2
  5. dodal/beamlines/__init__.py +10 -17
  6. dodal/beamlines/adsim.py +40 -33
  7. dodal/beamlines/b01_1.py +11 -0
  8. dodal/beamlines/b07.py +17 -21
  9. dodal/beamlines/b07_1.py +20 -22
  10. dodal/beamlines/b07_shared.py +12 -0
  11. dodal/beamlines/b16.py +1 -1
  12. dodal/beamlines/b21.py +15 -6
  13. dodal/beamlines/i02_1.py +17 -45
  14. dodal/beamlines/i02_2.py +6 -12
  15. dodal/beamlines/i03.py +8 -5
  16. dodal/beamlines/i03_supervisor.py +19 -0
  17. dodal/beamlines/i04.py +87 -184
  18. dodal/beamlines/i05.py +9 -39
  19. dodal/beamlines/i05_1.py +4 -13
  20. dodal/beamlines/i05_shared.py +51 -0
  21. dodal/beamlines/i06_1.py +26 -0
  22. dodal/beamlines/{i06.py → i06_shared.py} +25 -14
  23. dodal/beamlines/i07.py +14 -16
  24. dodal/beamlines/i09.py +76 -29
  25. dodal/beamlines/i09_1.py +25 -56
  26. dodal/beamlines/i09_1_shared.py +61 -0
  27. dodal/beamlines/i09_2.py +6 -100
  28. dodal/beamlines/i09_2_shared.py +110 -0
  29. dodal/beamlines/i10.py +60 -54
  30. dodal/beamlines/i10_1.py +99 -10
  31. dodal/beamlines/{i10_optics.py → i10_shared.py} +80 -66
  32. dodal/beamlines/i11.py +31 -18
  33. dodal/beamlines/i13_1.py +1 -1
  34. dodal/beamlines/i15.py +6 -6
  35. dodal/beamlines/i15_1.py +6 -6
  36. dodal/beamlines/i16.py +11 -0
  37. dodal/beamlines/i17.py +37 -28
  38. dodal/beamlines/i18.py +3 -4
  39. dodal/beamlines/i19_1.py +95 -34
  40. dodal/beamlines/i19_2.py +68 -52
  41. dodal/beamlines/i19_optics.py +26 -13
  42. dodal/beamlines/i20_1.py +17 -11
  43. dodal/beamlines/i21.py +44 -29
  44. dodal/beamlines/i22.py +19 -4
  45. dodal/beamlines/i23.py +20 -27
  46. dodal/beamlines/i24.py +64 -113
  47. dodal/beamlines/k07.py +99 -5
  48. dodal/beamlines/p38.py +3 -3
  49. dodal/beamlines/p60.py +35 -14
  50. dodal/beamlines/p99.py +16 -15
  51. dodal/beamlines/training_rig.py +20 -12
  52. dodal/cli.py +36 -2
  53. dodal/common/__init__.py +2 -1
  54. dodal/common/beamlines/beamline_parameters.py +2 -1
  55. dodal/common/beamlines/beamline_utils.py +11 -9
  56. dodal/common/beamlines/commissioning_mode.py +6 -3
  57. dodal/common/coordination.py +12 -14
  58. dodal/common/crystal_metadata.py +5 -8
  59. dodal/common/device_utils.py +4 -3
  60. dodal/common/maths.py +87 -19
  61. dodal/common/udc_directory_provider.py +13 -8
  62. dodal/common/visit.py +18 -21
  63. dodal/common/watcher_utils.py +13 -12
  64. dodal/device_manager.py +94 -54
  65. dodal/devices/aperturescatterguard.py +26 -27
  66. dodal/devices/areadetector/plugins/cam.py +1 -3
  67. dodal/devices/areadetector/plugins/mjpg.py +6 -5
  68. dodal/devices/attenuator/attenuator.py +12 -11
  69. dodal/devices/beamlines/b07/__init__.py +3 -0
  70. dodal/devices/{b07_1 → beamlines/b07_1}/__init__.py +2 -2
  71. dodal/devices/{b07_1 → beamlines/b07_1}/ccmc.py +5 -10
  72. dodal/devices/{b16 → beamlines/b16}/detector.py +2 -3
  73. dodal/devices/{i02_1 → beamlines/i02_1}/fast_grid_scan.py +2 -3
  74. dodal/devices/{i02_1 → beamlines/i02_1}/sample_motors.py +1 -1
  75. dodal/devices/{i03 → beamlines/i03}/beamsize.py +11 -7
  76. dodal/devices/{i03 → beamlines/i03}/dcm.py +1 -2
  77. dodal/devices/{i03 → beamlines/i03}/undulator_dcm.py +4 -5
  78. dodal/devices/beamlines/i04/beam_centre.py +151 -0
  79. dodal/devices/{i04 → beamlines/i04}/beamsize.py +11 -7
  80. dodal/devices/beamlines/i04/max_pixel.py +25 -0
  81. dodal/devices/{i04 → beamlines/i04}/murko_results.py +23 -8
  82. dodal/devices/{i04 → beamlines/i04}/transfocator.py +10 -15
  83. dodal/devices/beamlines/i05/__init__.py +3 -0
  84. dodal/devices/beamlines/i06_shared/__init__.py +3 -0
  85. dodal/devices/beamlines/i06_shared/i06_enum.py +7 -0
  86. dodal/devices/{i07 → beamlines/i07}/dcm.py +2 -3
  87. dodal/devices/{i07 → beamlines/i07}/id.py +8 -9
  88. dodal/devices/beamlines/i09/__init__.py +3 -0
  89. dodal/devices/{i09_1_shared → beamlines/i09_1_shared}/hard_energy.py +5 -6
  90. dodal/devices/{i09_1_shared → beamlines/i09_1_shared}/hard_undulator_functions.py +19 -16
  91. dodal/devices/{i10 → beamlines/i10}/diagnostics.py +4 -3
  92. dodal/devices/{i10 → beamlines/i10}/i10_apple2.py +37 -51
  93. dodal/devices/{i10 → beamlines/i10}/rasor/rasor_current_amp.py +1 -24
  94. dodal/devices/{i10 → beamlines/i10}/rasor/rasor_motors.py +2 -2
  95. dodal/devices/{i10 → beamlines/i10}/slits.py +5 -3
  96. dodal/devices/beamlines/i10_1/__init__.py +9 -0
  97. dodal/devices/beamlines/i10_1/electromagnet/magnet.py +16 -0
  98. dodal/devices/beamlines/i10_1/electromagnet/stages.py +14 -0
  99. dodal/devices/beamlines/i10_1/scaler_cards.py +13 -0
  100. dodal/devices/{i11 → beamlines/i11}/cyberstar_blower.py +1 -1
  101. dodal/devices/{i11 → beamlines/i11}/diff_stages.py +4 -6
  102. dodal/devices/{i11 → beamlines/i11}/mythen.py +3 -4
  103. dodal/devices/{i11 → beamlines/i11}/nx100robot.py +6 -6
  104. dodal/devices/{i11 → beamlines/i11}/spinner.py +1 -1
  105. dodal/devices/{i13_1 → beamlines/i13_1}/merlin.py +1 -1
  106. dodal/devices/{i15 → beamlines/i15}/dcm.py +1 -2
  107. dodal/devices/{i15 → beamlines/i15}/focussing_mirror.py +5 -5
  108. dodal/devices/{i15 → beamlines/i15}/jack.py +2 -2
  109. dodal/devices/{i15 → beamlines/i15}/multilayer_mirror.py +1 -1
  110. dodal/devices/{i17 → beamlines/i17}/i17_apple2.py +16 -22
  111. dodal/devices/{i18 → beamlines/i18}/diode.py +1 -1
  112. dodal/devices/{i19 → beamlines/i19}/access_controlled/attenuator_motor_squad.py +12 -8
  113. dodal/devices/{i19 → beamlines/i19}/access_controlled/blueapi_device.py +16 -15
  114. dodal/devices/beamlines/i19/access_controlled/piezo_control.py +72 -0
  115. dodal/devices/{i19 → beamlines/i19}/access_controlled/shutter.py +11 -9
  116. dodal/devices/{i19 → beamlines/i19}/backlight.py +3 -1
  117. dodal/devices/{i19 → beamlines/i19}/mapt_configuration.py +2 -1
  118. dodal/devices/{i19 → beamlines/i19}/pin_col_stages.py +11 -8
  119. dodal/devices/beamlines/i19/pin_tip.py +32 -0
  120. dodal/devices/beamlines/i21/__init__.py +3 -0
  121. dodal/devices/{i22 → beamlines/i22}/dcm.py +1 -2
  122. dodal/devices/{i22 → beamlines/i22}/fswitch.py +1 -3
  123. dodal/devices/{i22 → beamlines/i22}/nxsas.py +5 -4
  124. dodal/devices/{i24 → beamlines/i24}/beam_center.py +1 -1
  125. dodal/devices/{i24 → beamlines/i24}/beamstop.py +2 -2
  126. dodal/devices/{i24 → beamlines/i24}/commissioning_jungfrau.py +12 -12
  127. dodal/devices/{i24 → beamlines/i24}/dcm.py +1 -3
  128. dodal/devices/{i24 → beamlines/i24}/dual_backlight.py +3 -3
  129. dodal/devices/{i24 → beamlines/i24}/pmac.py +9 -7
  130. dodal/devices/{p60 → beamlines/p60}/lab_xray_source.py +1 -1
  131. dodal/devices/beamlines/p99/__init__.py +0 -0
  132. dodal/devices/{p99 → beamlines/p99}/andor2_point.py +11 -15
  133. dodal/devices/bimorph_mirror.py +22 -20
  134. dodal/devices/collimation_table.py +3 -2
  135. dodal/devices/common_dcm.py +30 -20
  136. dodal/devices/controllers.py +2 -2
  137. dodal/devices/cryostream.py +8 -0
  138. dodal/devices/current_amplifiers/current_amplifier.py +16 -18
  139. dodal/devices/current_amplifiers/current_amplifier_detector.py +9 -10
  140. dodal/devices/current_amplifiers/femto.py +8 -9
  141. dodal/devices/current_amplifiers/sr570.py +16 -16
  142. dodal/devices/current_amplifiers/struck_scaler_counter.py +5 -5
  143. dodal/devices/detector/det_resolution.py +9 -8
  144. dodal/devices/detector/detector.py +4 -2
  145. dodal/devices/diamond_filter.py +3 -4
  146. dodal/devices/eiger.py +32 -17
  147. dodal/devices/eiger_odin.py +1 -1
  148. dodal/devices/electron_analyser/base/__init__.py +3 -3
  149. dodal/devices/electron_analyser/base/base_controller.py +32 -21
  150. dodal/devices/electron_analyser/base/base_detector.py +15 -20
  151. dodal/devices/electron_analyser/base/base_driver_io.py +39 -46
  152. dodal/devices/electron_analyser/base/base_enums.py +0 -5
  153. dodal/devices/electron_analyser/base/base_region.py +29 -31
  154. dodal/devices/electron_analyser/base/base_util.py +18 -16
  155. dodal/devices/electron_analyser/base/energy_sources.py +35 -40
  156. dodal/devices/electron_analyser/specs/specs_detector.py +7 -6
  157. dodal/devices/electron_analyser/vgscienta/vgscienta_detector.py +7 -6
  158. dodal/devices/eurotherm.py +3 -2
  159. dodal/devices/fast_grid_scan.py +31 -34
  160. dodal/devices/fast_shutter.py +125 -39
  161. dodal/devices/flux.py +1 -1
  162. dodal/devices/focusing_mirror.py +29 -11
  163. dodal/devices/hutch_shutter.py +6 -6
  164. dodal/devices/insertion_device/__init__.py +20 -8
  165. dodal/devices/insertion_device/apple2_controller.py +371 -0
  166. dodal/devices/insertion_device/apple2_undulator.py +184 -587
  167. dodal/devices/insertion_device/apple_knot_controller.py +222 -0
  168. dodal/devices/insertion_device/energy.py +161 -0
  169. dodal/devices/insertion_device/energy_motor_lookup.py +21 -28
  170. dodal/devices/insertion_device/lookup_table_models.py +47 -52
  171. dodal/devices/insertion_device/polarisation.py +36 -0
  172. dodal/devices/ipin.py +1 -1
  173. dodal/devices/linkam3.py +7 -5
  174. dodal/devices/motors.py +107 -19
  175. dodal/devices/mx_phase1/beamstop.py +2 -4
  176. dodal/devices/oav/oav_calculations.py +20 -13
  177. dodal/devices/oav/oav_detector.py +92 -22
  178. dodal/devices/oav/oav_parameters.py +4 -9
  179. dodal/devices/oav/oav_to_redis_forwarder.py +22 -18
  180. dodal/devices/oav/pin_image_recognition/__init__.py +4 -6
  181. dodal/devices/oav/pin_image_recognition/manual_test.py +1 -2
  182. dodal/devices/oav/pin_image_recognition/utils.py +30 -32
  183. dodal/devices/oav/snapshots/grid_overlay.py +10 -9
  184. dodal/devices/oav/snapshots/snapshot_image_processing.py +15 -13
  185. dodal/devices/oav/utils.py +20 -6
  186. dodal/devices/p45.py +3 -9
  187. dodal/devices/pgm.py +8 -14
  188. dodal/devices/pressure_jump_cell.py +93 -32
  189. dodal/devices/qbpm.py +1 -3
  190. dodal/devices/robot.py +45 -20
  191. dodal/devices/s4_slit_gaps.py +1 -1
  192. dodal/devices/selectable_source.py +41 -0
  193. dodal/devices/slits.py +2 -5
  194. dodal/devices/smargon.py +2 -3
  195. dodal/devices/temperture_controller/lakeshore/lakeshore.py +38 -64
  196. dodal/devices/temperture_controller/lakeshore/lakeshore_io.py +21 -35
  197. dodal/devices/tetramm.py +7 -7
  198. dodal/devices/turbo_slit.py +8 -7
  199. dodal/devices/undulator.py +42 -56
  200. dodal/devices/util/adjuster_plans.py +2 -3
  201. dodal/devices/util/epics_util.py +10 -10
  202. dodal/devices/util/lookup_tables.py +17 -18
  203. dodal/devices/v2f.py +2 -3
  204. dodal/devices/watsonmarlow323_pump.py +1 -1
  205. dodal/devices/xbpm_feedback.py +3 -2
  206. dodal/devices/xspress3/xspress3.py +8 -11
  207. dodal/devices/xspress3/xspress3_channel.py +3 -6
  208. dodal/devices/zebra/zebra.py +21 -7
  209. dodal/devices/zebra/zebra_constants_mapping.py +12 -7
  210. dodal/devices/zebra/zebra_controlled_shutter.py +2 -1
  211. dodal/devices/zocalo/zocalo_interaction.py +14 -14
  212. dodal/devices/zocalo/zocalo_results.py +33 -33
  213. dodal/log.py +23 -20
  214. dodal/plan_stubs/check_topup.py +15 -15
  215. dodal/plan_stubs/data_session.py +6 -6
  216. dodal/plan_stubs/motor_utils.py +22 -18
  217. dodal/plan_stubs/pressure_jump_cell.py +18 -0
  218. dodal/plan_stubs/wrapped.py +40 -55
  219. dodal/plans/bimorph.py +63 -52
  220. dodal/plans/configure_arm_trigger_and_disarm_detector.py +0 -1
  221. dodal/plans/device_setup_plans/__init__.py +5 -0
  222. dodal/plans/device_setup_plans/setup_pin_tip_params.py +63 -0
  223. dodal/plans/preprocessors/verify_undulator_gap.py +10 -8
  224. dodal/plans/spec_path.py +3 -5
  225. dodal/plans/verify_undulator_gap.py +1 -2
  226. dodal/plans/wrapped.py +4 -3
  227. dodal/testing/__init__.py +0 -0
  228. dodal/testing/electron_analyser/device_factory.py +5 -7
  229. dodal/testing/fixtures/devices/apple2.py +38 -0
  230. dodal/testing/fixtures/run_engine.py +3 -7
  231. dodal/testing/fixtures/utils.py +1 -2
  232. dodal/utils.py +60 -58
  233. dls_dodal-1.68.0.dist-info/RECORD +0 -330
  234. dodal/beamline_specific_utils/i05_shared.py +0 -14
  235. dodal/devices/b07/__init__.py +0 -3
  236. dodal/devices/i04/max_pixel.py +0 -38
  237. dodal/devices/i05/__init__.py +0 -3
  238. dodal/devices/i09/__init__.py +0 -3
  239. dodal/devices/i21/__init__.py +0 -5
  240. {dls_dodal-1.68.0.dist-info → dls_dodal-2.0.0.dist-info}/entry_points.txt +0 -0
  241. {dls_dodal-1.68.0.dist-info → dls_dodal-2.0.0.dist-info}/licenses/LICENSE +0 -0
  242. {dls_dodal-1.68.0.dist-info → dls_dodal-2.0.0.dist-info}/top_level.txt +0 -0
  243. /dodal/{beamline_specific_utils → devices/beamlines}/__init__.py +0 -0
  244. /dodal/devices/{b07 → beamlines/b07}/enums.py +0 -0
  245. /dodal/devices/{b07_1 → beamlines/b07_1}/enums.py +0 -0
  246. /dodal/devices/{b16 → beamlines/b16}/__init__.py +0 -0
  247. /dodal/devices/{i02_1 → beamlines/i02_1}/__init__.py +0 -0
  248. /dodal/devices/{i02_2 → beamlines/i02_2}/__init__.py +0 -0
  249. /dodal/devices/{i03 → beamlines/i03}/__init__.py +0 -0
  250. /dodal/devices/{i03 → beamlines/i03}/constants.py +0 -0
  251. /dodal/devices/{i04 → beamlines/i04}/__init__.py +0 -0
  252. /dodal/devices/{i04 → beamlines/i04}/constants.py +0 -0
  253. /dodal/devices/{i05 → beamlines/i05}/enums.py +0 -0
  254. /dodal/devices/{i07 → beamlines/i07}/__init__.py +0 -0
  255. /dodal/devices/{i09 → beamlines/i09}/enums.py +0 -0
  256. /dodal/devices/{i09_1 → beamlines/i09_1}/__init__.py +0 -0
  257. /dodal/devices/{i09_1 → beamlines/i09_1}/enums.py +0 -0
  258. /dodal/devices/{i09_1_shared → beamlines/i09_1_shared}/__init__.py +0 -0
  259. /dodal/devices/{i09_2_shared → beamlines/i09_2_shared}/__init__.py +0 -0
  260. /dodal/devices/{i09_2_shared → beamlines/i09_2_shared}/i09_apple2.py +0 -0
  261. /dodal/devices/{i10 → beamlines/i10}/__init__.py +0 -0
  262. /dodal/devices/{i10 → beamlines/i10}/i10_setting_data.py +0 -0
  263. /dodal/devices/{i10 → beamlines/i10}/mirrors.py +0 -0
  264. /dodal/devices/{i10 → beamlines/i10}/rasor/__init__.py +0 -0
  265. /dodal/devices/{i10 → beamlines/i10}/rasor/rasor_scaler_cards.py +0 -0
  266. /dodal/devices/{i11 → beamlines/i10_1/electromagnet}/__init__.py +0 -0
  267. /dodal/devices/{i13_1 → beamlines/i11}/__init__.py +0 -0
  268. /dodal/devices/{i15 → beamlines/i13_1}/__init__.py +0 -0
  269. /dodal/devices/{i13_1 → beamlines/i13_1}/merlin_controller.py +0 -0
  270. /dodal/devices/{i17 → beamlines/i15}/__init__.py +0 -0
  271. /dodal/devices/{i15 → beamlines/i15}/laue.py +0 -0
  272. /dodal/devices/{i15 → beamlines/i15}/motors.py +0 -0
  273. /dodal/devices/{i15 → beamlines/i15}/rail.py +0 -0
  274. /dodal/devices/{i18 → beamlines/i17}/__init__.py +0 -0
  275. /dodal/devices/{i19 → beamlines/i18}/__init__.py +0 -0
  276. /dodal/devices/{i18 → beamlines/i18}/kb_mirror.py +0 -0
  277. /dodal/devices/{i19/access_controlled → beamlines/i19}/__init__.py +0 -0
  278. /dodal/devices/{i20_1 → beamlines/i19/access_controlled}/__init__.py +0 -0
  279. /dodal/devices/{i19 → beamlines/i19}/access_controlled/hutch_access.py +0 -0
  280. /dodal/devices/{i19 → beamlines/i19}/beamstop.py +0 -0
  281. /dodal/devices/{i19 → beamlines/i19}/diffractometer.py +0 -0
  282. /dodal/devices/{i22 → beamlines/i20_1}/__init__.py +0 -0
  283. /dodal/devices/{i21 → beamlines/i21}/enums.py +0 -0
  284. /dodal/devices/{i24 → beamlines/i22}/__init__.py +0 -0
  285. /dodal/devices/{p99 → beamlines/i24}/__init__.py +0 -0
  286. /dodal/devices/{i24 → beamlines/i24}/aperture.py +0 -0
  287. /dodal/devices/{i24 → beamlines/i24}/focus_mirrors.py +0 -0
  288. /dodal/devices/{i24 → beamlines/i24}/vgonio.py +0 -0
  289. /dodal/devices/{p60 → beamlines/p60}/__init__.py +0 -0
  290. /dodal/devices/{p60 → beamlines/p60}/enums.py +0 -0
  291. /dodal/devices/{p99 → beamlines/p99}/sample_stage.py +0 -0
  292. /dodal/devices/insertion_device/{id_enum.py → enum.py} +0 -0
dodal/beamlines/i19_2.py CHANGED
@@ -1,26 +1,30 @@
1
+ from functools import cache
1
2
  from pathlib import Path
2
3
 
4
+ from ophyd_async.core import PathProvider
3
5
  from ophyd_async.fastcs.eiger import EigerDetector
4
6
  from ophyd_async.fastcs.panda import HDFPanda
5
7
 
6
- from dodal.common.beamlines.beamline_utils import (
7
- device_factory,
8
- get_path_provider,
9
- set_path_provider,
10
- )
11
8
  from dodal.common.beamlines.beamline_utils import (
12
9
  set_beamline as set_utils_beamline,
13
10
  )
14
11
  from dodal.common.visit import StaticVisitPathProvider
15
- from dodal.devices.i19.access_controlled.attenuator_motor_squad import (
12
+ from dodal.device_manager import DeviceManager
13
+ from dodal.devices.beamlines.i19.access_controlled.attenuator_motor_squad import (
16
14
  AttenuatorMotorSquad,
17
15
  )
18
- from dodal.devices.i19.access_controlled.blueapi_device import HutchState
19
- from dodal.devices.i19.access_controlled.shutter import AccessControlledShutter
20
- from dodal.devices.i19.backlight import BacklightPosition
21
- from dodal.devices.i19.beamstop import BeamStop
22
- from dodal.devices.i19.diffractometer import FourCircleDiffractometer
23
- from dodal.devices.i19.pin_col_stages import PinholeCollimatorControl
16
+ from dodal.devices.beamlines.i19.access_controlled.blueapi_device import HutchState
17
+ from dodal.devices.beamlines.i19.access_controlled.piezo_control import (
18
+ AccessControlledPiezoActuator,
19
+ FocusingMirrorName,
20
+ )
21
+ from dodal.devices.beamlines.i19.access_controlled.shutter import (
22
+ AccessControlledShutter,
23
+ )
24
+ from dodal.devices.beamlines.i19.backlight import BacklightPosition
25
+ from dodal.devices.beamlines.i19.beamstop import BeamStop
26
+ from dodal.devices.beamlines.i19.diffractometer import FourCircleDiffractometer
27
+ from dodal.devices.beamlines.i19.pin_col_stages import PinholeCollimatorControl
24
28
  from dodal.devices.synchrotron import Synchrotron
25
29
  from dodal.devices.zebra.zebra import Zebra
26
30
  from dodal.devices.zebra.zebra_constants_mapping import (
@@ -39,13 +43,6 @@ PREFIX = BeamlinePrefix("i19", "I")
39
43
  set_log_beamline(BL)
40
44
  set_utils_beamline(BL)
41
45
 
42
- set_path_provider(
43
- StaticVisitPathProvider(
44
- BL,
45
- Path("/dls/i19-2/data/2025/cm40639-4/"),
46
- )
47
- )
48
-
49
46
  I19_2_COMMISSIONING_INSTR_SESSION: str = "cm40639-5"
50
47
 
51
48
  I19_2_ZEBRA_MAPPING = ZebraMapping(
@@ -53,67 +50,66 @@ I19_2_ZEBRA_MAPPING = ZebraMapping(
53
50
  sources=ZebraSources(),
54
51
  )
55
52
 
53
+ devices = DeviceManager()
54
+
56
55
 
57
- @device_factory()
56
+ @devices.fixture
57
+ @cache
58
+ def path_provider() -> PathProvider:
59
+ return StaticVisitPathProvider(
60
+ BL,
61
+ Path("/dls/i19-2/data/2026/cm44169-1/"),
62
+ )
63
+
64
+
65
+ @devices.factory()
58
66
  def attenuator_motor_squad() -> AttenuatorMotorSquad:
59
67
  return AttenuatorMotorSquad(
60
68
  hutch=HutchState.EH2, instrument_session=I19_2_COMMISSIONING_INSTR_SESSION
61
69
  )
62
70
 
63
71
 
64
- @device_factory()
72
+ @devices.factory()
65
73
  def backlight() -> BacklightPosition:
66
- """Get the i19-2 backlight device, instantiate it if it hasn't already been.
67
- If this is called when already instantiated in i19-2, it will return the existing object.
68
- """
69
74
  return BacklightPosition(prefix=f"{PREFIX.beamline_prefix}-EA-IOC-12:")
70
75
 
71
76
 
72
- @device_factory()
77
+ @devices.factory()
73
78
  def beamstop() -> BeamStop:
74
- """Get the i19-2 beamstop device, instantiate it if it hasn't already been.
75
- If this is called when already instantiated in i19-2, it will return the existing object.
76
- """
77
79
  return BeamStop(prefix=f"{PREFIX.beamline_prefix}-OP-ABSB-02:")
78
80
 
79
81
 
80
- @device_factory()
82
+ @devices.factory()
81
83
  def diffractometer() -> FourCircleDiffractometer:
82
84
  return FourCircleDiffractometer(prefix=PREFIX.beamline_prefix)
83
85
 
84
86
 
85
- @device_factory()
86
- def eiger() -> EigerDetector:
87
+ @devices.factory()
88
+ def eiger(path_provider: PathProvider) -> EigerDetector:
87
89
  return EigerDetector(
88
90
  prefix=PREFIX.beamline_prefix,
89
- path_provider=get_path_provider(),
91
+ path_provider=path_provider,
90
92
  drv_suffix="-EA-EIGER-01:",
91
93
  hdf_suffix="-EA-EIGER-01:OD:",
92
94
  )
93
95
 
94
96
 
95
- @device_factory()
96
- def panda() -> HDFPanda:
97
+ @devices.factory()
98
+ def panda(path_provider: PathProvider) -> HDFPanda:
97
99
  return HDFPanda(
98
100
  prefix=f"{PREFIX.beamline_prefix}-EA-PANDA-01:",
99
- path_provider=get_path_provider(),
101
+ path_provider=path_provider,
100
102
  )
101
103
 
102
104
 
103
- @device_factory()
105
+ @devices.factory()
104
106
  def pinhole_and_collimator() -> PinholeCollimatorControl:
105
- """Get the i19-2 pinhole and collimator control device, instantiate it if it
106
- hasn't already been. If this is called when already instantiated in i19-2,
107
- it will return the existing object.
108
- """
109
107
  return PinholeCollimatorControl(prefix=PREFIX.beamline_prefix)
110
108
 
111
109
 
112
- @device_factory()
110
+ @devices.factory()
113
111
  def shutter() -> AccessControlledShutter:
114
- """Get the i19-2 hutch shutter device, instantiate it if it hasn't already been.
115
- If this is called when already instantiated, it will return the existing object.
116
- """
112
+ """Access controlled wrapper for the experiment shutter."""
117
113
  return AccessControlledShutter(
118
114
  prefix=f"{PREFIX.beamline_prefix}-PS-SHTR-01:",
119
115
  hutch=HutchState.EH2,
@@ -121,20 +117,40 @@ def shutter() -> AccessControlledShutter:
121
117
  )
122
118
 
123
119
 
124
- @device_factory()
120
+ @devices.factory()
125
121
  def synchrotron() -> Synchrotron:
126
- """Get the i19-2 synchrotron device, instantiate it if it hasn't already been.
127
- If this is called when already instantiated in i19-2, it will return the existing object.
128
- """
129
122
  return Synchrotron()
130
123
 
131
124
 
132
- @device_factory()
125
+ @devices.factory()
133
126
  def zebra() -> Zebra:
134
- """Get the i19-2 zebra device, instantiate it if it hasn't already been.
135
- If this is called when already instantiated in i19-2, it will return the existing object.
136
- """
137
127
  return Zebra(
138
128
  mapping=I19_2_ZEBRA_MAPPING,
139
129
  prefix=f"{PREFIX.beamline_prefix}-EA-ZEBRA-03:",
140
130
  )
131
+
132
+
133
+ @devices.factory()
134
+ def hfm_piezo() -> AccessControlledPiezoActuator:
135
+ """Get the i19-2 access controlled hfm piezo device, instantiate it if it hasn't already been.
136
+ If this is called when already instantiated, it will return the existing object.
137
+ """
138
+ return AccessControlledPiezoActuator(
139
+ prefix=f"{PREFIX.beamline_prefix}-OP-HFM-01:",
140
+ mirror_type=FocusingMirrorName.HFM,
141
+ hutch=HutchState.EH2,
142
+ instrument_session=I19_2_COMMISSIONING_INSTR_SESSION,
143
+ )
144
+
145
+
146
+ @devices.factory()
147
+ def vfm_piezo() -> AccessControlledPiezoActuator:
148
+ """Get the i19-2 access controlled vfm piezo device, instantiate it if it hasn't already been.
149
+ If this is called when already instantiated, it will return the existing object.
150
+ """
151
+ return AccessControlledPiezoActuator(
152
+ prefix=f"{PREFIX.beamline_prefix}-OP-VFM-01:",
153
+ mirror_type=FocusingMirrorName.VFM,
154
+ hutch=HutchState.EH2,
155
+ instrument_session=I19_2_COMMISSIONING_INSTR_SESSION,
156
+ )
@@ -1,14 +1,13 @@
1
- from dodal.common.beamlines.beamline_utils import (
2
- device_factory,
3
- )
4
1
  from dodal.common.beamlines.beamline_utils import (
5
2
  set_beamline as set_utils_beamline,
6
3
  )
7
- from dodal.devices.hutch_shutter import HutchShutter
8
- from dodal.devices.i19.access_controlled.hutch_access import (
4
+ from dodal.device_manager import DeviceManager
5
+ from dodal.devices.beamlines.i19.access_controlled.hutch_access import (
9
6
  ACCESS_DEVICE_NAME,
10
7
  HutchAccessControl,
11
8
  )
9
+ from dodal.devices.focusing_mirror import FocusingMirrorWithPiezo
10
+ from dodal.devices.hutch_shutter import HutchShutter
12
11
  from dodal.log import set_beamline as set_log_beamline
13
12
  from dodal.utils import BeamlinePrefix
14
13
 
@@ -17,20 +16,34 @@ PREFIX = BeamlinePrefix("i19", "I")
17
16
  set_log_beamline(BL)
18
17
  set_utils_beamline(BL)
19
18
 
19
+ devices = DeviceManager()
20
+
20
21
 
21
- @device_factory()
22
+ @devices.factory()
22
23
  def shutter() -> HutchShutter:
23
- """Get the i19 hutch shutter device, instantiate it if it hasn't already been.
24
- If this is called when already instantiated, it will return the existing object.
25
- """
24
+ """Real experiment shutter device for I19."""
26
25
  return HutchShutter(f"{PREFIX.beamline_prefix}-PS-SHTR-01:")
27
26
 
28
27
 
29
- @device_factory()
28
+ @devices.factory()
30
29
  def access_control() -> HutchAccessControl:
31
- """Get a device that checks the active hutch for i19, instantiate it if it hasn't already been.
32
- If this is called when already instantiated, it will return the existing object.
33
- """
30
+ """Device to check which hutch is the active hutch on i19."""
34
31
  return HutchAccessControl(
35
32
  f"{PREFIX.beamline_prefix}-OP-STAT-01:", ACCESS_DEVICE_NAME
36
33
  )
34
+
35
+
36
+ @devices.factory()
37
+ def vfm() -> FocusingMirrorWithPiezo:
38
+ """Get the i19 vfm device, instantiate it if it hasn't already been.
39
+ If this is called when already instantiated, it will return the existing object.
40
+ """
41
+ return FocusingMirrorWithPiezo(f"{PREFIX.beamline_prefix}-OP-VFM-01:")
42
+
43
+
44
+ @devices.factory()
45
+ def hfm() -> FocusingMirrorWithPiezo:
46
+ """Get the i19 hfm device, instantiate it if it hasn't already been.
47
+ If this is called when already instantiated, it will return the existing object.
48
+ """
49
+ return FocusingMirrorWithPiezo(f"{PREFIX.beamline_prefix}-OP-HFM-01:")
dodal/beamlines/i20_1.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from pathlib import Path
2
2
 
3
3
  from ophyd_async.epics.motor import Motor
4
+ from ophyd_async.epics.pmac import PmacIO
4
5
  from ophyd_async.fastcs.panda import HDFPanda
5
6
 
6
7
  from dodal.common.beamlines.beamline_utils import (
@@ -37,27 +38,34 @@ set_path_provider(
37
38
  """
38
39
  NOTE: Due to the CA gateway machine being switched off, PVs are not available remotely
39
40
  and you need to be on the beamline network to access them.
40
- The simplest way to do this is to `ssh i20-1-ws001` and run dodal connect i20_1 from there.
41
+ The simplest way to do this is to `ssh i20-1-ws001` and run dodal connect i20_1 from
42
+ there.
41
43
  """
42
44
 
43
45
 
44
46
  @device_factory()
45
47
  def turbo_slit() -> TurboSlit:
46
- """
47
- turboslit for selecting energy from the polychromator
48
- """
49
-
48
+ """Turboslit for selecting energy from the polychromator."""
50
49
  return TurboSlit(f"{PREFIX.beamline_prefix}-OP-PCHRO-01:TS:")
51
50
 
52
51
 
53
52
  @device_factory()
54
53
  def turbo_slit_x() -> Motor:
55
- """
56
- turbo slit x motor
57
- """
54
+ """Turbo slit x motor."""
58
55
  return Motor(f"{PREFIX.beamline_prefix}-OP-PCHRO-01:TS:XFINE")
59
56
 
60
57
 
58
+ @device_factory()
59
+ def turbo_slit_pmac() -> PmacIO:
60
+ """PMac controller using running fly scans with trajectory."""
61
+ motor = turbo_slit_x()
62
+ return PmacIO(
63
+ prefix=f"{PREFIX.beamline_prefix}-MO-STEP-06:",
64
+ raw_motors=[motor],
65
+ coord_nums=[3],
66
+ )
67
+
68
+
61
69
  @device_factory()
62
70
  def panda() -> HDFPanda:
63
71
  return HDFPanda(
@@ -79,9 +87,7 @@ def alignment_y() -> Motor:
79
87
 
80
88
  @device_factory(skip=True)
81
89
  def xspress3() -> Xspress3:
82
- """
83
- 16 channels Xspress3 detector
84
- """
90
+ """16 channels Xspress3 detector."""
85
91
  return Xspress3(
86
92
  f"{PREFIX.beamline_prefix}-EA-DET-03:",
87
93
  num_channels=16,
dodal/beamlines/i21.py CHANGED
@@ -2,13 +2,9 @@ from pathlib import Path
2
2
 
3
3
  from daq_config_server.client import ConfigServer
4
4
 
5
- from dodal.common.beamlines.beamline_utils import (
6
- device_factory,
7
- )
8
5
  from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
9
- from dodal.devices.i21 import (
10
- Grating,
11
- )
6
+ from dodal.device_manager import DeviceManager
7
+ from dodal.devices.beamlines.i21 import Grating
12
8
  from dodal.devices.insertion_device import (
13
9
  Apple2,
14
10
  Apple2EnforceLHMoveController,
@@ -24,6 +20,9 @@ from dodal.devices.insertion_device.energy_motor_lookup import (
24
20
  from dodal.devices.insertion_device.lookup_table_models import LookupTableColumnConfig
25
21
  from dodal.devices.pgm import PlaneGratingMonochromator
26
22
  from dodal.devices.synchrotron import Synchrotron
23
+ from dodal.devices.temperture_controller import (
24
+ Lakeshore336,
25
+ )
27
26
  from dodal.log import set_beamline as set_log_beamline
28
27
  from dodal.utils import BeamlinePrefix, get_beamline_name
29
28
 
@@ -39,14 +38,15 @@ I21_CONF_CLIENT = ConfigServer(url="https://daq-config.diamond.ac.uk")
39
38
  LOOK_UPTABLE_DIR = "/dls_sw/i21/software/gda/workspace_git/gda-diamond.git/configurations/i21-config/lookupTables/"
40
39
  GAP_LOOKUP_FILE_NAME = "IDEnergy2GapCalibrations.csv"
41
40
  PHASE_LOOKUP_FILE_NAME = "IDEnergy2PhaseCalibrations.csv"
41
+ devices = DeviceManager()
42
42
 
43
43
 
44
- @device_factory()
44
+ @devices.factory()
45
45
  def synchrotron() -> Synchrotron:
46
46
  return Synchrotron()
47
47
 
48
48
 
49
- @device_factory()
49
+ @devices.factory()
50
50
  def pgm() -> PlaneGratingMonochromator:
51
51
  return PlaneGratingMonochromator(
52
52
  prefix=f"{PREFIX.beamline_prefix}-OP-PGM-01:",
@@ -54,12 +54,12 @@ def pgm() -> PlaneGratingMonochromator:
54
54
  )
55
55
 
56
56
 
57
- @device_factory()
57
+ @devices.factory()
58
58
  def id_gap() -> UndulatorGap:
59
59
  return UndulatorGap(prefix=f"{PREFIX.insertion_prefix}-MO-SERVC-01:")
60
60
 
61
61
 
62
- @device_factory()
62
+ @devices.factory()
63
63
  def id_phase() -> UndulatorPhaseAxes:
64
64
  return UndulatorPhaseAxes(
65
65
  prefix=f"{PREFIX.insertion_prefix}-MO-SERVC-01:",
@@ -70,20 +70,24 @@ def id_phase() -> UndulatorPhaseAxes:
70
70
  )
71
71
 
72
72
 
73
- @device_factory()
74
- def id() -> Apple2:
73
+ @devices.factory()
74
+ def id(
75
+ id_gap: UndulatorGap, id_phase: UndulatorPhaseAxes
76
+ ) -> Apple2[UndulatorPhaseAxes]:
75
77
  """I21 insertion device."""
76
- return Apple2(
77
- id_gap=id_gap(),
78
- id_phase=id_phase(),
78
+ return Apple2[UndulatorPhaseAxes](
79
+ id_gap=id_gap,
80
+ id_phase=id_phase,
79
81
  )
80
82
 
81
83
 
82
- @device_factory()
83
- def id_controller() -> Apple2EnforceLHMoveController:
84
- """i21 insertion device controller."""
85
- return Apple2EnforceLHMoveController(
86
- apple2=id(),
84
+ @devices.factory()
85
+ def id_controller(
86
+ id: Apple2[UndulatorPhaseAxes],
87
+ ) -> Apple2EnforceLHMoveController[UndulatorPhaseAxes]:
88
+ """I21 insertion device controller."""
89
+ return Apple2EnforceLHMoveController[UndulatorPhaseAxes](
90
+ apple2=id,
87
91
  gap_energy_motor_lut=ConfigServerEnergyMotorLookup(
88
92
  lut_config=LookupTableColumnConfig(grating=I21_GRATING_COLUMNS),
89
93
  config_client=I21_CONF_CLIENT,
@@ -100,17 +104,28 @@ def id_controller() -> Apple2EnforceLHMoveController:
100
104
  )
101
105
 
102
106
 
103
- @device_factory()
104
- def id_energy() -> InsertionDeviceEnergy:
105
- return InsertionDeviceEnergy(id_controller=id_controller())
107
+ @devices.factory()
108
+ def id_energy(
109
+ id_controller: Apple2EnforceLHMoveController[UndulatorPhaseAxes],
110
+ ) -> InsertionDeviceEnergy:
111
+ return InsertionDeviceEnergy(id_controller=id_controller)
106
112
 
107
113
 
108
- @device_factory()
109
- def id_polarisation() -> InsertionDevicePolarisation:
110
- return InsertionDevicePolarisation(id_controller=id_controller())
114
+ @devices.factory()
115
+ def id_polarisation(
116
+ id_controller: Apple2EnforceLHMoveController[UndulatorPhaseAxes],
117
+ ) -> InsertionDevicePolarisation:
118
+ return InsertionDevicePolarisation(id_controller=id_controller)
111
119
 
112
120
 
113
- @device_factory()
114
- def energy_jid() -> BeamEnergy:
121
+ @devices.factory()
122
+ def energy(
123
+ id_energy: InsertionDeviceEnergy, pgm: PlaneGratingMonochromator
124
+ ) -> BeamEnergy:
115
125
  """Beam energy."""
116
- return BeamEnergy(id_energy=id_energy(), mono=pgm().energy)
126
+ return BeamEnergy(id_energy=id_energy, mono=pgm.energy)
127
+
128
+
129
+ @devices.factory()
130
+ def sample_temperature_controller() -> Lakeshore336:
131
+ return Lakeshore336(prefix=f"{PREFIX.beamline_prefix}-EA-TCTRL-01:")
dodal/beamlines/i22.py CHANGED
@@ -1,3 +1,6 @@
1
+ from pathlib import Path
2
+
3
+ from ophyd_async.core import StaticPathProvider, UUIDFilenameProvider
1
4
  from ophyd_async.epics.adaravis import AravisDetector
2
5
  from ophyd_async.epics.adcore import NDPluginBaseIO, NDPluginStatsIO
3
6
  from ophyd_async.epics.adpilatus import PilatusDetector
@@ -6,6 +9,7 @@ from ophyd_async.fastcs.panda import HDFPanda
6
9
  from dodal.common.beamlines.beamline_utils import (
7
10
  device_factory,
8
11
  get_path_provider,
12
+ set_path_provider,
9
13
  )
10
14
  from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
11
15
  from dodal.common.beamlines.device_helpers import CAM_SUFFIX, DET_SUFFIX, HDF5_SUFFIX
@@ -13,11 +17,15 @@ from dodal.common.crystal_metadata import (
13
17
  MaterialsEnum,
14
18
  make_crystal_metadata_from_material,
15
19
  )
20
+ from dodal.devices.beamlines.i22.dcm import DCM
21
+ from dodal.devices.beamlines.i22.fswitch import FSwitch
22
+ from dodal.devices.beamlines.i22.nxsas import (
23
+ NXSasMetadataHolder,
24
+ NXSasOAV,
25
+ NXSasPilatus,
26
+ )
16
27
  from dodal.devices.bimorph_mirror import BimorphMirror
17
28
  from dodal.devices.focusing_mirror import FocusingMirror
18
- from dodal.devices.i22.dcm import DCM
19
- from dodal.devices.i22.fswitch import FSwitch
20
- from dodal.devices.i22.nxsas import NXSasMetadataHolder, NXSasOAV, NXSasPilatus
21
29
  from dodal.devices.linkam3 import Linkam3
22
30
  from dodal.devices.motors import XYPitchStage, XYRollStage, XYStage
23
31
  from dodal.devices.slits import Slits
@@ -33,6 +41,13 @@ PREFIX = BeamlinePrefix(BL)
33
41
  set_log_beamline(BL)
34
42
  set_utils_beamline(BL)
35
43
 
44
+ # This should be removed when the DeviceManager is adopted
45
+ try:
46
+ get_path_provider()
47
+ except NameError:
48
+ # If one hasn't already been set, use a default to stop things crashing
49
+ set_path_provider(StaticPathProvider(UUIDFilenameProvider(), Path("/tmp")))
50
+
36
51
 
37
52
  @device_factory()
38
53
  def saxs() -> PilatusDetector:
@@ -267,7 +282,7 @@ def linkam() -> Linkam3:
267
282
 
268
283
  @device_factory(skip=True)
269
284
  def ppump() -> WatsonMarlow323Pump:
270
- """Sample Environment Peristaltic Pump"""
285
+ """Sample Environment Peristaltic Pump."""
271
286
  return WatsonMarlow323Pump(f"{PREFIX.beamline_prefix}-EA-PUMP-01:")
272
287
 
273
288
 
dodal/beamlines/i23.py CHANGED
@@ -1,16 +1,13 @@
1
+ from functools import cache
1
2
  from pathlib import Path
2
3
 
3
- from ophyd_async.core import InOut, StrictEnum
4
+ from ophyd_async.core import InOut, PathProvider, StrictEnum
4
5
  from ophyd_async.epics.adpilatus import PilatusDetector
5
6
 
6
- from dodal.common.beamlines.beamline_utils import (
7
- device_factory,
8
- get_path_provider,
9
- set_path_provider,
10
- )
11
7
  from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
12
8
  from dodal.common.beamlines.device_helpers import HDF5_SUFFIX
13
9
  from dodal.common.visit import LocalDirectoryServiceClient, StaticVisitPathProvider
10
+ from dodal.device_manager import DeviceManager
14
11
  from dodal.devices.motors import SixAxisGonio
15
12
  from dodal.devices.oav.pin_image_recognition import PinTipDetection
16
13
  from dodal.devices.positioner import Positioner1D
@@ -25,18 +22,22 @@ from dodal.log import set_beamline as set_log_beamline
25
22
  from dodal.utils import BeamlinePrefix, get_beamline_name, get_hostname
26
23
 
27
24
  BL = get_beamline_name("i23")
25
+ PREFIX = BeamlinePrefix(BL)
28
26
  set_log_beamline(BL)
29
27
  set_utils_beamline(BL)
30
28
 
31
- set_path_provider(
32
- StaticVisitPathProvider(
29
+ devices = DeviceManager()
30
+
31
+
32
+ @devices.fixture
33
+ @cache
34
+ def path_provider() -> PathProvider:
35
+ return StaticVisitPathProvider(
33
36
  BL,
34
37
  Path("/tmp"),
35
38
  client=LocalDirectoryServiceClient(),
36
39
  )
37
- )
38
40
 
39
- PREFIX = BeamlinePrefix(BL)
40
41
 
41
42
  I23_ZEBRA_MAPPING = ZebraMapping(
42
43
  outputs=ZebraTTLOutputs(TTL_DETECTOR=1, TTL_SHUTTER=4),
@@ -51,59 +52,51 @@ class I23DetectorPositions(StrictEnum):
51
52
 
52
53
 
53
54
  def _is_i23_machine():
54
- """
55
- Devices using PVA can only connect from i23 machines, due to the absence of
55
+ """Devices using PVA can only connect from i23 machines, due to the absence of
56
56
  PVA gateways at present.
57
57
  """
58
58
  hostname = get_hostname()
59
59
  return hostname.startswith("i23-ws") or hostname.startswith("i23-control")
60
60
 
61
61
 
62
- @device_factory(skip=lambda: not _is_i23_machine())
62
+ @devices.factory(skip=lambda: not _is_i23_machine())
63
63
  def oav_pin_tip_detection() -> PinTipDetection:
64
- """Get the i23 OAV pin-tip detection device."""
65
-
66
64
  return PinTipDetection(
67
65
  f"{PREFIX.beamline_prefix}-DI-OAV-01:",
68
66
  "pin_tip_detection",
69
67
  )
70
68
 
71
69
 
72
- @device_factory()
70
+ @devices.factory()
73
71
  def shutter() -> ZebraShutter:
74
- """Get the i23 zebra controlled shutter."""
75
72
  return ZebraShutter(f"{PREFIX.beamline_prefix}-EA-SHTR-01:")
76
73
 
77
74
 
78
- @device_factory()
75
+ @devices.factory()
79
76
  def gonio() -> SixAxisGonio:
80
- """Get the i23 goniometer"""
81
77
  return SixAxisGonio(f"{PREFIX.beamline_prefix}-MO-GONIO-01:")
82
78
 
83
79
 
84
- @device_factory()
80
+ @devices.factory()
85
81
  def zebra() -> Zebra:
86
- """Get the i23 zebra"""
87
82
  return Zebra(
88
83
  prefix=f"{PREFIX.beamline_prefix}-EA-ZEBRA-01:ZEBRA:",
89
84
  mapping=I23_ZEBRA_MAPPING,
90
85
  )
91
86
 
92
87
 
93
- @device_factory()
94
- def pilatus() -> PilatusDetector:
95
- """Get the i23 pilatus"""
88
+ @devices.factory()
89
+ def pilatus(path_provider: PathProvider) -> PilatusDetector:
96
90
  return PilatusDetector(
97
91
  prefix=f"{PREFIX.beamline_prefix}-EA-PILAT-01:",
98
- path_provider=get_path_provider(),
92
+ path_provider=path_provider,
99
93
  drv_suffix="cam1:",
100
94
  fileio_suffix=HDF5_SUFFIX,
101
95
  )
102
96
 
103
97
 
104
- @device_factory()
98
+ @devices.factory()
105
99
  def detector_motion() -> Positioner1D[I23DetectorPositions]:
106
- """Get the i23 detector"""
107
100
  return Positioner1D[I23DetectorPositions](
108
101
  f"{PREFIX.beamline_prefix}-EA-DET-01:Z",
109
102
  datatype=I23DetectorPositions,