dls-dodal 1.55.0__py3-none-any.whl → 1.56.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 (101) hide show
  1. {dls_dodal-1.55.0.dist-info → dls_dodal-1.56.0.dist-info}/METADATA +3 -3
  2. {dls_dodal-1.55.0.dist-info → dls_dodal-1.56.0.dist-info}/RECORD +100 -86
  3. dodal/_version.py +2 -2
  4. dodal/beamlines/b01_1.py +6 -13
  5. dodal/beamlines/b07.py +2 -1
  6. dodal/beamlines/b07_1.py +2 -1
  7. dodal/beamlines/b21.py +4 -24
  8. dodal/beamlines/i03.py +53 -53
  9. dodal/beamlines/i04.py +16 -38
  10. dodal/beamlines/i09.py +3 -2
  11. dodal/beamlines/i09_1.py +2 -1
  12. dodal/beamlines/i11.py +143 -0
  13. dodal/beamlines/i19_1.py +1 -0
  14. dodal/beamlines/i19_2.py +7 -0
  15. dodal/beamlines/i22.py +2 -2
  16. dodal/beamlines/i23.py +3 -3
  17. dodal/beamlines/i24.py +6 -14
  18. dodal/beamlines/p38.py +1 -0
  19. dodal/beamlines/p60.py +3 -2
  20. dodal/cli.py +11 -1
  21. dodal/common/__init__.py +4 -0
  22. dodal/common/beamlines/beamline_parameters.py +1 -1
  23. dodal/common/beamlines/beamline_utils.py +5 -1
  24. dodal/common/enums.py +19 -0
  25. dodal/common/watcher_utils.py +83 -0
  26. dodal/devices/aithre_lasershaping/laser_robot.py +4 -9
  27. dodal/devices/aperturescatterguard.py +52 -12
  28. dodal/devices/apple2_undulator.py +0 -1
  29. dodal/devices/attenuator/attenuator.py +3 -1
  30. dodal/devices/b16/detector.py +1 -10
  31. dodal/devices/backlight.py +8 -20
  32. dodal/devices/bimorph_mirror.py +4 -7
  33. dodal/devices/collimation_table.py +36 -0
  34. dodal/devices/controllers.py +21 -0
  35. dodal/devices/cryostream.py +97 -7
  36. dodal/devices/current_amplifiers/femto.py +1 -1
  37. dodal/devices/detector/detector_motion.py +1 -7
  38. dodal/devices/eiger.py +22 -8
  39. dodal/devices/eiger_odin.py +2 -0
  40. dodal/devices/electron_analyser/__init__.py +2 -1
  41. dodal/devices/electron_analyser/abstract/__init__.py +0 -1
  42. dodal/devices/electron_analyser/abstract/base_detector.py +3 -25
  43. dodal/devices/electron_analyser/abstract/base_driver_io.py +18 -9
  44. dodal/devices/electron_analyser/abstract/base_region.py +34 -3
  45. dodal/devices/electron_analyser/detector.py +24 -0
  46. dodal/devices/electron_analyser/enums.py +5 -0
  47. dodal/devices/electron_analyser/specs/detector.py +2 -1
  48. dodal/devices/electron_analyser/specs/driver_io.py +21 -26
  49. dodal/devices/electron_analyser/specs/region.py +1 -1
  50. dodal/devices/electron_analyser/util.py +20 -0
  51. dodal/devices/electron_analyser/vgscienta/__init__.py +3 -3
  52. dodal/devices/electron_analyser/vgscienta/detector.py +2 -1
  53. dodal/devices/electron_analyser/vgscienta/driver_io.py +24 -32
  54. dodal/devices/electron_analyser/vgscienta/enums.py +0 -8
  55. dodal/devices/electron_analyser/vgscienta/region.py +2 -31
  56. dodal/devices/eurotherm.py +126 -0
  57. dodal/devices/fluorescence_detector_motion.py +3 -10
  58. dodal/devices/focusing_mirror.py +1 -1
  59. dodal/devices/i03/undulator_dcm.py +0 -1
  60. dodal/devices/i09/enums.py +8 -8
  61. dodal/devices/i10/diagnostics.py +4 -4
  62. dodal/devices/i10/i10_apple2.py +3 -6
  63. dodal/devices/i11/cyberstar_blower.py +34 -0
  64. dodal/devices/i11/diff_stages.py +55 -0
  65. dodal/devices/i11/mythen.py +165 -0
  66. dodal/devices/i11/nx100robot.py +153 -0
  67. dodal/devices/i11/spinner.py +30 -0
  68. dodal/devices/i13_1/merlin_controller.py +4 -4
  69. dodal/devices/i19/diffractometer.py +34 -0
  70. dodal/devices/i19/shutter.py +11 -1
  71. dodal/devices/i22/dcm.py +1 -1
  72. dodal/devices/i22/fswitch.py +3 -12
  73. dodal/devices/i24/aperture.py +3 -3
  74. dodal/devices/i24/dcm.py +11 -15
  75. dodal/devices/i24/dual_backlight.py +11 -12
  76. dodal/devices/i24/pmac.py +8 -7
  77. dodal/devices/mx_phase1/beamstop.py +10 -11
  78. dodal/devices/oav/pin_image_recognition/__init__.py +0 -3
  79. dodal/devices/p60/enums.py +8 -8
  80. dodal/devices/p60/lab_xray_source.py +3 -2
  81. dodal/devices/pressure_jump_cell.py +77 -123
  82. dodal/devices/scintillator.py +76 -4
  83. dodal/devices/smargon.py +2 -2
  84. dodal/devices/synchrotron.py +1 -2
  85. dodal/devices/tetramm.py +13 -0
  86. dodal/devices/thawer.py +6 -11
  87. dodal/devices/undulator.py +3 -8
  88. dodal/devices/util/epics_util.py +1 -1
  89. dodal/devices/util/test_utils.py +19 -0
  90. dodal/devices/watsonmarlow323_pump.py +7 -7
  91. dodal/devices/xbpm_feedback.py +4 -6
  92. dodal/devices/xspress3/xspress3.py +0 -5
  93. dodal/devices/zocalo/zocalo_results.py +1 -3
  94. dodal/testing/__init__.py +0 -0
  95. dodal/testing/electron_analyser/__init__.py +6 -0
  96. dodal/testing/electron_analyser/device_factory.py +59 -0
  97. dodal/devices/CTAB.py +0 -41
  98. {dls_dodal-1.55.0.dist-info → dls_dodal-1.56.0.dist-info}/WHEEL +0 -0
  99. {dls_dodal-1.55.0.dist-info → dls_dodal-1.56.0.dist-info}/entry_points.txt +0 -0
  100. {dls_dodal-1.55.0.dist-info → dls_dodal-1.56.0.dist-info}/licenses/LICENSE +0 -0
  101. {dls_dodal-1.55.0.dist-info → dls_dodal-1.56.0.dist-info}/top_level.txt +0 -0
dodal/beamlines/i03.py CHANGED
@@ -1,3 +1,4 @@
1
+ from ophyd_async.core import Reference
1
2
  from ophyd_async.fastcs.eiger import EigerDetector as FastEiger
2
3
  from ophyd_async.fastcs.panda import HDFPanda
3
4
  from yarl import URL
@@ -19,11 +20,13 @@ from dodal.devices.aperturescatterguard import (
19
20
  from dodal.devices.attenuator.attenuator import BinaryFilterAttenuator
20
21
  from dodal.devices.backlight import Backlight
21
22
  from dodal.devices.baton import Baton
23
+ from dodal.devices.collimation_table import CollimationTable
22
24
  from dodal.devices.cryostream import CryoStream
23
25
  from dodal.devices.detector.detector_motion import DetectorMotion
24
26
  from dodal.devices.diamond_filter import DiamondFilter, I03Filters
25
27
  from dodal.devices.eiger import EigerDetector
26
28
  from dodal.devices.fast_grid_scan import PandAFastGridScan, ZebraFastGridScan
29
+ from dodal.devices.fluorescence_detector_motion import FluorescenceDetector
27
30
  from dodal.devices.flux import Flux
28
31
  from dodal.devices.focusing_mirror import FocusingMirrorWithStripes, MirrorVoltages
29
32
  from dodal.devices.i03 import Beamstop
@@ -36,6 +39,7 @@ from dodal.devices.oav.pin_image_recognition import PinTipDetection
36
39
  from dodal.devices.qbpm import QBPM
37
40
  from dodal.devices.robot import BartRobot
38
41
  from dodal.devices.s4_slit_gaps import S4SlitGaps
42
+ from dodal.devices.scintillator import Scintillator
39
43
  from dodal.devices.smargon import Smargon
40
44
  from dodal.devices.synchrotron import Synchrotron
41
45
  from dodal.devices.thawer import Thawer
@@ -82,7 +86,8 @@ def aperture_scatterguard() -> ApertureScatterguard:
82
86
  """
83
87
  params = get_beamline_parameters()
84
88
  return ApertureScatterguard(
85
- prefix=PREFIX.beamline_prefix,
89
+ aperture_prefix=f"{PREFIX.beamline_prefix}-MO-MAPT-01:",
90
+ scatterguard_prefix=f"{PREFIX.beamline_prefix}-MO-SCAT-01:",
86
91
  loaded_positions=load_positions_from_beamline_parameters(params),
87
92
  tolerances=AperturePosition.tolerances_from_gda_params(params),
88
93
  )
@@ -115,9 +120,7 @@ def dcm() -> DCM:
115
120
  """Get the i03 DCM device, instantiate it if it hasn't already been.
116
121
  If this is called when already instantiated in i03, it will return the existing object.
117
122
  """
118
- return DCM(
119
- prefix=f"{PREFIX.beamline_prefix}-MO-DCM-01:",
120
- )
123
+ return DCM(prefix=f"{PREFIX.beamline_prefix}-MO-DCM-01:")
121
124
 
122
125
 
123
126
  @device_factory()
@@ -153,7 +156,8 @@ def detector_motion() -> DetectorMotion:
153
156
  If this is called when already instantiated in i03, it will return the existing object.
154
157
  """
155
158
  return DetectorMotion(
156
- prefix=PREFIX.beamline_prefix,
159
+ device_prefix=f"{PREFIX.beamline_prefix}-MO-DET-01:",
160
+ pmac_prefix=f"{PREFIX.beamline_prefix}-MO-PMAC-02:",
157
161
  )
158
162
 
159
163
 
@@ -191,9 +195,7 @@ def zebra_fast_grid_scan() -> ZebraFastGridScan:
191
195
  """Get the i03 zebra_fast_grid_scan device, instantiate it if it hasn't already been.
192
196
  If this is called when already instantiated in i03, it will return the existing object.
193
197
  """
194
- return ZebraFastGridScan(
195
- prefix=f"{PREFIX.beamline_prefix}-MO-SGON-01:",
196
- )
198
+ return ZebraFastGridScan(prefix=f"{PREFIX.beamline_prefix}-MO-SGON-01:")
197
199
 
198
200
 
199
201
  @device_factory()
@@ -202,9 +204,7 @@ def panda_fast_grid_scan() -> PandAFastGridScan:
202
204
  If this is called when already instantiated in i03, it will return the existing object.
203
205
  This is used instead of the zebra_fast_grid_scan device when using the PandA.
204
206
  """
205
- return PandAFastGridScan(
206
- prefix=f"{PREFIX.beamline_prefix}-MO-SGON-01:",
207
- )
207
+ return PandAFastGridScan(prefix=f"{PREFIX.beamline_prefix}-MO-SGON-01:")
208
208
 
209
209
 
210
210
  @device_factory()
@@ -225,9 +225,7 @@ def pin_tip_detection() -> PinTipDetection:
225
225
  """Get the i03 pin tip detection device, instantiate it if it hasn't already been.
226
226
  If this is called when already instantiated in i03, it will return the existing object.
227
227
  """
228
- return PinTipDetection(
229
- f"{PREFIX.beamline_prefix}-DI-OAV-01:",
230
- )
228
+ return PinTipDetection(f"{PREFIX.beamline_prefix}-DI-OAV-01:")
231
229
 
232
230
 
233
231
  @device_factory()
@@ -243,9 +241,7 @@ def s4_slit_gaps() -> S4SlitGaps:
243
241
  """Get the i03 s4_slit_gaps device, instantiate it if it hasn't already been.
244
242
  If this is called when already instantiated in i03, it will return the existing object.
245
243
  """
246
- return S4SlitGaps(
247
- f"{PREFIX.beamline_prefix}-AL-SLITS-04:",
248
- )
244
+ return S4SlitGaps(f"{PREFIX.beamline_prefix}-AL-SLITS-04:")
249
245
 
250
246
 
251
247
  @device_factory()
@@ -280,7 +276,6 @@ def undulator_dcm(daq_configuration_path: str | None = None) -> UndulatorDCM:
280
276
  else undulator()
281
277
  )
282
278
  return UndulatorDCM(
283
- prefix=PREFIX.beamline_prefix,
284
279
  undulator=undulator_singleton,
285
280
  dcm=dcm(),
286
281
  daq_configuration_path=daq_configuration_path or DAQ_CONFIGURATION_PATH,
@@ -303,9 +298,7 @@ def xspress3mini() -> Xspress3:
303
298
  """Get the i03 Xspress3Mini device, instantiate it if it hasn't already been.
304
299
  If this is called when already instantiated in i03, it will return the existing object.
305
300
  """
306
- return Xspress3(
307
- f"{PREFIX.beamline_prefix}-EA-XSP3-01:",
308
- )
301
+ return Xspress3(f"{PREFIX.beamline_prefix}-EA-XSP3-01:")
309
302
 
310
303
 
311
304
  @device_factory()
@@ -324,9 +317,7 @@ def sample_shutter() -> ZebraShutter:
324
317
  """Get the i03 sample shutter device, instantiate it if it hasn't already been.
325
318
  If this is called when already instantiated in i03, it will return the existing object.
326
319
  """
327
- return ZebraShutter(
328
- f"{PREFIX.beamline_prefix}-EA-SHTR-01:",
329
- )
320
+ return ZebraShutter(f"{PREFIX.beamline_prefix}-EA-SHTR-01:")
330
321
 
331
322
 
332
323
  @device_factory()
@@ -334,9 +325,7 @@ def flux() -> Flux:
334
325
  """Get the i03 flux device, instantiate it if it hasn't already been.
335
326
  If this is called when already instantiated in i03, it will return the existing object.
336
327
  """
337
- return Flux(
338
- f"{PREFIX.beamline_prefix}-MO-FLUX-01:",
339
- )
328
+ return Flux(f"{PREFIX.beamline_prefix}-MO-FLUX-01:")
340
329
 
341
330
 
342
331
  @device_factory()
@@ -344,9 +333,7 @@ def xbpm_feedback() -> XBPMFeedback:
344
333
  """Get the i03 XBPM feeback device, instantiate it if it hasn't already been.
345
334
  If this is called when already instantiated in i03, it will return the existing object.
346
335
  """
347
- return XBPMFeedback(
348
- PREFIX.beamline_prefix,
349
- )
336
+ return XBPMFeedback(f"{PREFIX.beamline_prefix}-EA-FDBK-01:")
350
337
 
351
338
 
352
339
  @device_factory()
@@ -354,10 +341,7 @@ def zocalo() -> ZocaloResults:
354
341
  """Get the i03 ZocaloResults device, instantiate it if it hasn't already been.
355
342
  If this is called when already instantiated in i03, it will return the existing object.
356
343
  """
357
- return ZocaloResults(
358
- prefix=PREFIX.beamline_prefix,
359
- results_source=ZocaloSource.GPU,
360
- )
344
+ return ZocaloResults(results_source=ZocaloSource.GPU)
361
345
 
362
346
 
363
347
  @device_factory()
@@ -365,9 +349,7 @@ def robot() -> BartRobot:
365
349
  """Get the i03 robot device, instantiate it if it hasn't already been.
366
350
  If this is called when already instantiated in i03, it will return the existing object.
367
351
  """
368
- return BartRobot(
369
- f"{PREFIX.beamline_prefix}-MO-ROBOT-01:",
370
- )
352
+ return BartRobot(f"{PREFIX.beamline_prefix}-MO-ROBOT-01:")
371
353
 
372
354
 
373
355
  @device_factory()
@@ -375,9 +357,7 @@ def webcam() -> Webcam:
375
357
  """Get the i03 webcam, instantiate it if it hasn't already been.
376
358
  If this is called when already instantiated in i03, it will return the existing object.
377
359
  """
378
- return Webcam(
379
- url=URL("http://i03-webcam1/axis-cgi/jpg/image.cgi"),
380
- )
360
+ return Webcam(url=URL("http://i03-webcam1/axis-cgi/jpg/image.cgi"))
381
361
 
382
362
 
383
363
  @device_factory()
@@ -385,9 +365,7 @@ def thawer() -> Thawer:
385
365
  """Get the i03 thawer, instantiate it if it hasn't already been.
386
366
  If this is called when already instantiated in i03, it will return the existing object.
387
367
  """
388
- return Thawer(
389
- f"{PREFIX.beamline_prefix}-EA-THAW-01",
390
- )
368
+ return Thawer(f"{PREFIX.beamline_prefix}-EA-THAW-01")
391
369
 
392
370
 
393
371
  @device_factory()
@@ -395,19 +373,15 @@ def lower_gonio() -> XYZStage:
395
373
  """Get the i03 lower gonio device, instantiate it if it hasn't already been.
396
374
  If this is called when already instantiated in i03, it will return the existing object.
397
375
  """
398
- return XYZStage(
399
- f"{PREFIX.beamline_prefix}-MO-GONP-01:",
400
- )
376
+ return XYZStage(f"{PREFIX.beamline_prefix}-MO-GONP-01:")
401
377
 
402
378
 
403
379
  @device_factory()
404
- def cryo_stream() -> CryoStream:
380
+ def cryostream() -> CryoStream:
405
381
  """Get the i03 cryostream device, instantiate it if it hasn't already been.
406
382
  If this is called when already instantiated in i03, it will return the existing object.
407
383
  """
408
- return CryoStream(
409
- PREFIX.beamline_prefix,
410
- )
384
+ return CryoStream(PREFIX.beamline_prefix)
411
385
 
412
386
 
413
387
  @device_factory()
@@ -425,9 +399,7 @@ def qbpm() -> QBPM:
425
399
  """Get the i03 qbpm device, instantiate it if it hasn't already been.
426
400
  If this is called when already instantiated in i03, it will return the existing object.
427
401
  """
428
- return QBPM(
429
- f"{PREFIX.beamline_prefix}-DI-QBPM-01:",
430
- )
402
+ return QBPM(f"{PREFIX.beamline_prefix}-DI-QBPM-01:")
431
403
 
432
404
 
433
405
  @device_factory()
@@ -436,3 +408,31 @@ def baton() -> Baton:
436
408
  If this is called when already instantiated in i03, it will return the existing object.
437
409
  """
438
410
  return Baton(f"{PREFIX.beamline_prefix}-CS-BATON-01:")
411
+
412
+
413
+ @device_factory()
414
+ def fluorescence_det_motion() -> FluorescenceDetector:
415
+ """Get the i03 device for moving the fluorescence detector, instantiate it if it hasn't already been.
416
+ If this is called when already instantiated in i03, it will return the existing object.
417
+ """
418
+ return FluorescenceDetector(f"{PREFIX.beamline_prefix}-EA-FLU-01:")
419
+
420
+
421
+ @device_factory()
422
+ def scintillator() -> Scintillator:
423
+ """Get the i03 scintillator device, instantiate it if it hasn't already been.
424
+ If this is called when already instantiated in i03, it will return the existing object.
425
+ """
426
+ return Scintillator(
427
+ f"{PREFIX.beamline_prefix}-MO-SCIN-01:",
428
+ Reference(aperture_scatterguard()),
429
+ get_beamline_parameters(),
430
+ )
431
+
432
+
433
+ @device_factory()
434
+ def collimation_table() -> CollimationTable:
435
+ """Get the i03 device for moving the collimation table, instantiate it if it hasn't already been.
436
+ If this is called when already instantiated in i03, it will return the existing object.
437
+ """
438
+ return CollimationTable(prefix=f"{PREFIX.beamline_prefix}-MO-TABLE-01")
dodal/beamlines/i04.py CHANGED
@@ -70,9 +70,7 @@ def smargon() -> Smargon:
70
70
  """Get the i04 Smargon device, instantiate it if it hasn't already been.
71
71
  If this is called when already instantiated in i04, it will return the existing object.
72
72
  """
73
- return Smargon(
74
- f"{PREFIX.beamline_prefix}-MO-SGON-01:",
75
- )
73
+ return Smargon(f"{PREFIX.beamline_prefix}-MO-SGON-01:")
76
74
 
77
75
 
78
76
  @device_factory()
@@ -91,9 +89,7 @@ def sample_delivery_system() -> XYZStage:
91
89
  """Get the i04 sample_delivery_system device, instantiate it if it hasn't already been.
92
90
  If this is called when already instantiated in i04, it will return the existing object.
93
91
  """
94
- return XYZStage(
95
- f"{PREFIX.beamline_prefix}-MO-SDE-01:",
96
- )
92
+ return XYZStage(f"{PREFIX.beamline_prefix}-MO-SDE-01:")
97
93
 
98
94
 
99
95
  @device_factory()
@@ -101,9 +97,7 @@ def ipin() -> IPin:
101
97
  """Get the i04 ipin device, instantiate it if it hasn't already been.
102
98
  If this is called when already instantiated in i04, it will return the existing object.
103
99
  """
104
- return IPin(
105
- f"{PREFIX.beamline_prefix}-EA-PIN-01:",
106
- )
100
+ return IPin(f"{PREFIX.beamline_prefix}-EA-PIN-01:")
107
101
 
108
102
 
109
103
  @device_factory()
@@ -122,9 +116,7 @@ def sample_shutter() -> ZebraShutter:
122
116
  """Get the i04 sample shutter device, instantiate it if it hasn't already been.
123
117
  If this is called when already instantiated in i04, it will return the existing object.
124
118
  """
125
- return ZebraShutter(
126
- f"{PREFIX.beamline_prefix}-EA-SHTR-01:",
127
- )
119
+ return ZebraShutter(f"{PREFIX.beamline_prefix}-EA-SHTR-01:")
128
120
 
129
121
 
130
122
  @device_factory()
@@ -143,9 +135,7 @@ def transfocator() -> Transfocator:
143
135
  """Get the i04 transfocator device, instantiate it if it hasn't already been.
144
136
  If this is called when already instantiated in i04, it will return the existing object.
145
137
  """
146
- return Transfocator(
147
- f"{PREFIX.beamline_prefix}-MO-FSWT-01:",
148
- )
138
+ return Transfocator(f"{PREFIX.beamline_prefix}-MO-FSWT-01:")
149
139
 
150
140
 
151
141
  @device_factory()
@@ -153,9 +143,7 @@ def xbpm_feedback() -> XBPMFeedback:
153
143
  """Get the i04 xbpm_feedback device, instantiate it if it hasn't already been.
154
144
  If this is called when already instantiated in i04, it will return the existing object.
155
145
  """
156
- return XBPMFeedback(
157
- PREFIX.beamline_prefix,
158
- )
146
+ return XBPMFeedback(f"{PREFIX.beamline_prefix}-EA-FDBK-01:")
159
147
 
160
148
 
161
149
  @device_factory()
@@ -171,9 +159,7 @@ def dcm() -> DCM:
171
159
  """Get the i04 DCM device, instantiate it if it hasn't already been.
172
160
  If this is called when already instantiated in i04, it will return the existing object.
173
161
  """
174
- return DCM(
175
- f"{PREFIX.beamline_prefix}-MO-DCM-01:",
176
- )
162
+ return DCM(f"{PREFIX.beamline_prefix}-MO-DCM-01:")
177
163
 
178
164
 
179
165
  @device_factory()
@@ -181,9 +167,7 @@ def backlight() -> Backlight:
181
167
  """Get the i04 backlight device, instantiate it if it hasn't already been.
182
168
  If this is called when already instantiated in i04, it will return the existing object.
183
169
  """
184
- return Backlight(
185
- PREFIX.beamline_prefix,
186
- )
170
+ return Backlight(PREFIX.beamline_prefix)
187
171
 
188
172
 
189
173
  @device_factory()
@@ -194,7 +178,8 @@ def aperture_scatterguard() -> ApertureScatterguard:
194
178
  """
195
179
  params = get_beamline_parameters()
196
180
  return ApertureScatterguard(
197
- prefix=PREFIX.beamline_prefix,
181
+ aperture_prefix=f"{PREFIX.beamline_prefix}-MO-MAPT-01:",
182
+ scatterguard_prefix=f"{PREFIX.beamline_prefix}-MO-SCAT-01:",
198
183
  loaded_positions=load_positions_from_beamline_parameters(params),
199
184
  tolerances=AperturePosition.tolerances_from_gda_params(params),
200
185
  )
@@ -226,9 +211,7 @@ def zebra_fast_grid_scan() -> ZebraFastGridScan:
226
211
  """Get the i04 zebra_fast_grid_scan device, instantiate it if it hasn't already been.
227
212
  If this is called when already instantiated in i04, it will return the existing object.
228
213
  """
229
- return ZebraFastGridScan(
230
- prefix=f"{PREFIX.beamline_prefix}-MO-SGON-01:",
231
- )
214
+ return ZebraFastGridScan(f"{PREFIX.beamline_prefix}-MO-SGON-01:")
232
215
 
233
216
 
234
217
  @device_factory()
@@ -304,7 +287,8 @@ def detector_motion() -> DetectorMotion:
304
287
  If this is called when already instantiated in i04, it will return the existing object.
305
288
  """
306
289
  return DetectorMotion(
307
- prefix=PREFIX.beamline_prefix,
290
+ device_prefix=f"{PREFIX.beamline_prefix}-MO-DET-01:",
291
+ pmac_prefix=f"{PREFIX.beamline_prefix}-MO-PMAC-02:",
308
292
  )
309
293
 
310
294
 
@@ -313,9 +297,7 @@ def thawer() -> Thawer:
313
297
  """Get the i04 thawer, instantiate it if it hasn't already been.
314
298
  If this is called when already instantiated in i04, it will return the existing object.
315
299
  """
316
- return Thawer(
317
- f"{PREFIX.beamline_prefix}-EA-THAW-01",
318
- )
300
+ return Thawer(f"{PREFIX.beamline_prefix}-EA-THAW-01")
319
301
 
320
302
 
321
303
  @device_factory()
@@ -323,9 +305,7 @@ def robot() -> BartRobot:
323
305
  """Get the i04 robot device, instantiate it if it hasn't already been.
324
306
  If this is called when already instantiated in i04, it will return the existing object.
325
307
  """
326
- return BartRobot(
327
- f"{PREFIX.beamline_prefix}-MO-ROBOT-01:",
328
- )
308
+ return BartRobot(f"{PREFIX.beamline_prefix}-MO-ROBOT-01:")
329
309
 
330
310
 
331
311
  @device_factory()
@@ -376,6 +356,4 @@ def pin_tip_detection() -> PinTipDetection:
376
356
  """Get the i04 pin tip detection device, instantiate it if it hasn't already been.
377
357
  If this is called when already instantiated in i04, it will return the existing object.
378
358
  """
379
- return PinTipDetection(
380
- f"{PREFIX.beamline_prefix}-DI-OAV-01:",
381
- )
359
+ return PinTipDetection(f"{PREFIX.beamline_prefix}-DI-OAV-01:")
dodal/beamlines/i09.py CHANGED
@@ -2,6 +2,7 @@ from dodal.common.beamlines.beamline_utils import (
2
2
  device_factory,
3
3
  )
4
4
  from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
5
+ from dodal.devices.electron_analyser import SelectedSource
5
6
  from dodal.devices.electron_analyser.vgscienta import VGScientaAnalyserDriverIO
6
7
  from dodal.devices.i09 import DCM, Grating, LensMode, PassEnergy, PsuMode
7
8
  from dodal.devices.pgm import PGM
@@ -38,8 +39,8 @@ def dcm() -> DCM:
38
39
  @device_factory()
39
40
  def analyser_driver() -> VGScientaAnalyserDriverIO[LensMode, PsuMode, PassEnergy]:
40
41
  energy_sources = {
41
- "source1": pgm().energy.user_readback,
42
- "source2": dcm().energy_in_ev,
42
+ SelectedSource.SOURCE1: pgm().energy.user_readback,
43
+ SelectedSource.SOURCE2: dcm().energy_in_ev,
43
44
  }
44
45
  return VGScientaAnalyserDriverIO[LensMode, PsuMode, PassEnergy](
45
46
  prefix=f"{PREFIX.beamline_prefix}-EA-DET-01:CAM:",
dodal/beamlines/i09_1.py CHANGED
@@ -2,6 +2,7 @@ from dodal.common.beamlines.beamline_utils import (
2
2
  device_factory,
3
3
  )
4
4
  from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
5
+ from dodal.devices.electron_analyser import SelectedSource
5
6
  from dodal.devices.electron_analyser.specs import SpecsAnalyserDriverIO
6
7
  from dodal.devices.i09.dcm import DCM
7
8
  from dodal.devices.i09_1 import LensMode, PsuMode
@@ -33,5 +34,5 @@ def analyser_driver() -> SpecsAnalyserDriverIO[LensMode, PsuMode]:
33
34
  prefix=f"{PREFIX.beamline_prefix}-EA-DET-02:CAM:",
34
35
  lens_mode_type=LensMode,
35
36
  psu_mode_type=PsuMode,
36
- energy_sources={"source1": dcm().energy_in_ev},
37
+ energy_sources={SelectedSource.SOURCE1: dcm().energy_in_ev},
37
38
  )
dodal/beamlines/i11.py ADDED
@@ -0,0 +1,143 @@
1
+ from pathlib import Path
2
+
3
+ from dodal.common.beamlines.beamline_utils import (
4
+ device_factory,
5
+ get_path_provider,
6
+ set_path_provider,
7
+ )
8
+ from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
9
+ from dodal.common.beamlines.device_helpers import DET_SUFFIX
10
+ from dodal.common.visit import RemoteDirectoryServiceClient, StaticVisitPathProvider
11
+ from dodal.devices.cryostream import OxfordCryoStream
12
+ from dodal.devices.eurotherm import (
13
+ EurothermGeneral,
14
+ UpdatingEurothermGeneral,
15
+ )
16
+ from dodal.devices.i11.cyberstar_blower import (
17
+ AutotunedCyberstarBlower,
18
+ CyberstarBlower,
19
+ )
20
+ from dodal.devices.i11.diff_stages import (
21
+ DiffractometerBase,
22
+ DiffractometerStage,
23
+ )
24
+ from dodal.devices.i11.mythen import Mythen3
25
+ from dodal.devices.i11.nx100robot import NX100Robot
26
+ from dodal.devices.i11.spinner import Spinner
27
+ from dodal.devices.slits import Slits
28
+ from dodal.devices.synchrotron import Synchrotron
29
+ from dodal.log import set_beamline as set_log_beamline
30
+ from dodal.utils import BeamlinePrefix, get_beamline_name
31
+
32
+ BL = get_beamline_name("i11")
33
+ PREFIX = BeamlinePrefix(BL)
34
+ set_log_beamline(BL)
35
+ set_utils_beamline(BL)
36
+
37
+ # Currently we must hard-code the visit, determining the visit at runtime requires
38
+ # infrastructure that is still WIP.
39
+ # Communication with GDA is also WIP so for now we determine an arbitrary scan number
40
+ # locally and write the commissioning directory. The scan number is not guaranteed to
41
+ # be unique and the data is at risk - this configuration is for testing only.
42
+ set_path_provider(
43
+ StaticVisitPathProvider(
44
+ BL,
45
+ Path(f"/dls/{BL}/data/2025/cm40625-3/bluesky"),
46
+ client=RemoteDirectoryServiceClient(f"http://{BL}-control:8088/api"),
47
+ )
48
+ )
49
+
50
+
51
+ @device_factory()
52
+ def mythen3() -> Mythen3:
53
+ """Mythen3 Detector from PSI"""
54
+ return Mythen3(
55
+ prefix=f"{PREFIX.beamline_prefix}-EA-DET-07:",
56
+ path_provider=get_path_provider(),
57
+ drv_suffix=DET_SUFFIX,
58
+ fileio_suffix="HDF:",
59
+ )
60
+
61
+
62
+ @device_factory()
63
+ def ocs1() -> OxfordCryoStream:
64
+ """i11 Oxford Cryostream 700 plus without cryoshutter"""
65
+ return OxfordCryoStream(f"{PREFIX.beamline_prefix}-CG-CSTRM-01:")
66
+
67
+
68
+ @device_factory()
69
+ def ocs2() -> OxfordCryoStream:
70
+ """i11 Oxford Cryostream 700 standard without cryoshutter"""
71
+ return OxfordCryoStream(f"{PREFIX.beamline_prefix}-CG-CSTRM-02:")
72
+
73
+
74
+ @device_factory()
75
+ def diff_stage() -> DiffractometerStage:
76
+ """Stage that contains the rotation axes, theta, two_theta, delta, spos"""
77
+ return DiffractometerStage(prefix=f"{PREFIX.beamline_prefix}-MO-DIFF-01:")
78
+
79
+
80
+ @device_factory()
81
+ def diff_base() -> DiffractometerBase:
82
+ return DiffractometerBase(prefix=f"{PREFIX.beamline_prefix}-MO-DIFF-01:BASE:")
83
+
84
+
85
+ @device_factory()
86
+ def csb1() -> CyberstarBlower[UpdatingEurothermGeneral]:
87
+ """Cyberstar hot air blower 1 with Eurotherm Controller and updating PID"""
88
+ return CyberstarBlower(
89
+ prefix=f"{PREFIX.beamline_prefix}-EA-BLOW-01:",
90
+ controller_type=UpdatingEurothermGeneral,
91
+ )
92
+
93
+
94
+ @device_factory()
95
+ def csb2() -> AutotunedCyberstarBlower[EurothermGeneral]:
96
+ """Cyberstar hot air blower 2 with autotuneable Eurotherm Controller"""
97
+ return AutotunedCyberstarBlower(
98
+ prefix=f"{PREFIX.beamline_prefix}-EA-BLOW-02:LOOP1:",
99
+ controller_type=EurothermGeneral,
100
+ )
101
+
102
+
103
+ @device_factory()
104
+ def sample_robot() -> NX100Robot:
105
+ """The sample robot arm and carosel on i11 that moves
106
+ and loads samples on/off the spinner"""
107
+ return NX100Robot(prefix=f"{PREFIX.beamline_prefix}-EA-ROBOT-01:")
108
+
109
+
110
+ @device_factory()
111
+ def spinner() -> Spinner:
112
+ """Sample spinner for powder averaging"""
113
+ return Spinner(prefix=f"{PREFIX.beamline_prefix}-EA-ENV-01:")
114
+
115
+
116
+ @device_factory()
117
+ def synchrotron() -> Synchrotron:
118
+ return Synchrotron()
119
+
120
+
121
+ @device_factory()
122
+ def slits_1() -> Slits:
123
+ return Slits(prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-01:")
124
+
125
+
126
+ @device_factory()
127
+ def slits_2() -> Slits:
128
+ return Slits(prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-02:")
129
+
130
+
131
+ @device_factory()
132
+ def slits_3() -> Slits:
133
+ return Slits(prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-03:")
134
+
135
+
136
+ @device_factory()
137
+ def slits_4() -> Slits:
138
+ return Slits(prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-04:")
139
+
140
+
141
+ @device_factory()
142
+ def slits_5() -> Slits:
143
+ return Slits(prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-05:")
dodal/beamlines/i19_1.py CHANGED
@@ -77,6 +77,7 @@ def shutter() -> AccessControlledShutter:
77
77
  return AccessControlledShutter(
78
78
  prefix=f"{PREFIX.beamline_prefix}-PS-SHTR-01:",
79
79
  hutch=HutchState.EH1,
80
+ instrument_session="cm40638-4",
80
81
  )
81
82
 
82
83
 
dodal/beamlines/i19_2.py CHANGED
@@ -6,6 +6,7 @@ from dodal.common.beamlines.beamline_utils import (
6
6
  )
7
7
  from dodal.devices.i19.beamstop import BeamStop
8
8
  from dodal.devices.i19.blueapi_device import HutchState
9
+ from dodal.devices.i19.diffractometer import FourCircleDiffractometer
9
10
  from dodal.devices.i19.shutter import AccessControlledShutter
10
11
  from dodal.devices.synchrotron import Synchrotron
11
12
  from dodal.devices.zebra.zebra import Zebra
@@ -32,6 +33,11 @@ I19_2_ZEBRA_MAPPING = ZebraMapping(
32
33
  )
33
34
 
34
35
 
36
+ @device_factory()
37
+ def diffractometer() -> FourCircleDiffractometer:
38
+ return FourCircleDiffractometer(prefix=PREFIX.beamline_prefix)
39
+
40
+
35
41
  @device_factory()
36
42
  def beamstop() -> BeamStop:
37
43
  """Get the i19-2 beamstop device, instantiate it if it hasn't already been.
@@ -59,6 +65,7 @@ def shutter() -> AccessControlledShutter:
59
65
  return AccessControlledShutter(
60
66
  prefix=f"{PREFIX.beamline_prefix}-PS-SHTR-01:",
61
67
  hutch=HutchState.EH2,
68
+ instrument_session="cm40639-4",
62
69
  )
63
70
 
64
71
 
dodal/beamlines/i22.py CHANGED
@@ -45,7 +45,7 @@ set_utils_beamline(BL)
45
45
  set_path_provider(
46
46
  StaticVisitPathProvider(
47
47
  BL,
48
- Path("/dls/i22/data/2024/cm37271-2/bluesky"),
48
+ Path("/dls/i22/data/2025/cm40643-4/"),
49
49
  client=RemoteDirectoryServiceClient("http://i22-control:8088/api"),
50
50
  )
51
51
  )
@@ -279,5 +279,5 @@ def ppump() -> WatsonMarlow323Pump:
279
279
 
280
280
 
281
281
  @device_factory()
282
- def base_top() -> XYPitchStage:
282
+ def base() -> XYPitchStage:
283
283
  return XYPitchStage(f"{PREFIX.beamline_prefix}-MO-STABL-01:")
dodal/beamlines/i23.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from pathlib import Path
2
2
 
3
- from ophyd_async.core import StrictEnum
3
+ from ophyd_async.core import InOut, StrictEnum
4
4
  from ophyd_async.epics.adpilatus import PilatusDetector
5
5
 
6
6
  from dodal.common.beamlines.beamline_utils import (
@@ -45,8 +45,8 @@ I23_ZEBRA_MAPPING = ZebraMapping(
45
45
 
46
46
 
47
47
  class I23DetectorPositions(StrictEnum):
48
- IN = "In"
49
- OUT = "Out"
48
+ IN = InOut.IN.value
49
+ OUT = InOut.OUT.value
50
50
  SAMPLE_CHANGE = "sample change"
51
51
 
52
52