dls-dodal 1.28.0__py3-none-any.whl → 1.29.2__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 (41) hide show
  1. {dls_dodal-1.28.0.dist-info → dls_dodal-1.29.2.dist-info}/METADATA +6 -4
  2. {dls_dodal-1.28.0.dist-info → dls_dodal-1.29.2.dist-info}/RECORD +37 -35
  3. {dls_dodal-1.28.0.dist-info → dls_dodal-1.29.2.dist-info}/WHEEL +1 -1
  4. dodal/_version.py +2 -2
  5. dodal/beamlines/i03.py +3 -3
  6. dodal/beamlines/i20_1.py +18 -0
  7. dodal/beamlines/i22.py +34 -9
  8. dodal/beamlines/i23.py +0 -12
  9. dodal/beamlines/i24.py +47 -1
  10. dodal/devices/areadetector/plugins/MJPG.py +4 -0
  11. dodal/devices/fast_grid_scan.py +0 -30
  12. dodal/devices/hutch_shutter.py +93 -0
  13. dodal/devices/i22/dcm.py +10 -6
  14. dodal/devices/i22/nxsas.py +173 -0
  15. dodal/devices/i24/I24_detector_motion.py +8 -5
  16. dodal/devices/i24/aperture.py +29 -0
  17. dodal/devices/i24/beamstop.py +38 -0
  18. dodal/devices/i24/dual_backlight.py +39 -21
  19. dodal/devices/i24/pmac.py +118 -13
  20. dodal/devices/motors.py +0 -48
  21. dodal/devices/oav/utils.py +15 -1
  22. dodal/devices/robot.py +58 -8
  23. dodal/devices/smargon.py +102 -48
  24. dodal/devices/synchrotron.py +14 -19
  25. dodal/devices/tetramm.py +32 -23
  26. dodal/devices/thawer.py +35 -2
  27. dodal/devices/util/epics_util.py +16 -13
  28. dodal/devices/webcam.py +6 -1
  29. dodal/devices/xbpm_feedback.py +27 -16
  30. dodal/devices/xspress3/xspress3.py +150 -0
  31. dodal/devices/xspress3/xspress3_channel.py +42 -0
  32. dodal/devices/zebra.py +4 -0
  33. dodal/log.py +13 -2
  34. dodal/plans/check_topup.py +4 -4
  35. dodal/devices/i23/__init__.py +0 -0
  36. dodal/devices/i23/gonio.py +0 -29
  37. dodal/devices/xspress3_mini/xspress3_mini.py +0 -103
  38. dodal/devices/xspress3_mini/xspress3_mini_channel.py +0 -24
  39. {dls_dodal-1.28.0.dist-info → dls_dodal-1.29.2.dist-info}/LICENSE +0 -0
  40. {dls_dodal-1.28.0.dist-info → dls_dodal-1.29.2.dist-info}/entry_points.txt +0 -0
  41. {dls_dodal-1.28.0.dist-info → dls_dodal-1.29.2.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dls-dodal
3
- Version: 1.28.0
3
+ Version: 1.29.2
4
4
  Summary: Ophyd devices and other utils that could be used across DLS beamlines
5
5
  Author-email: Dominic Oram <dominic.oram@diamond.ac.uk>
6
6
  License: Apache License
@@ -215,7 +215,7 @@ Description-Content-Type: text/x-rst
215
215
  License-File: LICENSE
216
216
  Requires-Dist: click
217
217
  Requires-Dist: ophyd
218
- Requires-Dist: ophyd-async >=0.3a5
218
+ Requires-Dist: ophyd-async >=0.3.1
219
219
  Requires-Dist: bluesky
220
220
  Requires-Dist: pyepics
221
221
  Requires-Dist: dataclasses-json
@@ -227,7 +227,7 @@ Requires-Dist: pydantic
227
227
  Requires-Dist: opencv-python-headless
228
228
  Requires-Dist: aioca
229
229
  Requires-Dist: p4p
230
- Requires-Dist: numpy
230
+ Requires-Dist: numpy <2.0
231
231
  Requires-Dist: aiofiles
232
232
  Requires-Dist: aiohttp
233
233
  Provides-Extra: dev
@@ -242,9 +242,11 @@ Requires-Dist: pytest-asyncio ; extra == 'dev'
242
242
  Requires-Dist: pytest-cov ; extra == 'dev'
243
243
  Requires-Dist: pytest-random-order ; extra == 'dev'
244
244
  Requires-Dist: ruff ; extra == 'dev'
245
- Requires-Dist: sphinx-autobuild ==2024.2.4 ; extra == 'dev'
245
+ Requires-Dist: sphinx-autobuild ; extra == 'dev'
246
246
  Requires-Dist: sphinx-copybutton ; extra == 'dev'
247
+ Requires-Dist: sphinxcontrib-mermaid ; extra == 'dev'
247
248
  Requires-Dist: sphinx-design ; extra == 'dev'
249
+ Requires-Dist: sphinx-autodoc-typehints ; extra == 'dev'
248
250
  Requires-Dist: tox-direct ; extra == 'dev'
249
251
  Requires-Dist: types-requests ; extra == 'dev'
250
252
  Requires-Dist: types-mock ; extra == 'dev'
@@ -1,21 +1,21 @@
1
1
  dodal/__init__.py,sha256=y-VRpfiX-Lm5nchB9N0VfMy_6dwFqVxpSn5SiAQql9I,114
2
2
  dodal/__main__.py,sha256=kP2S2RPitnOWpNGokjZ1Yq-1umOtp5sNOZk2B3tBPLM,111
3
- dodal/_version.py,sha256=RW6USZoeFR_9ttdXBH9tb0lK1erQEYot3NzmBpWXDMs,413
3
+ dodal/_version.py,sha256=eOWWacfqG9vwurNfs90FChgA65Fn-DDQGkxIrhBgYv8,413
4
4
  dodal/adsim.py,sha256=OW2dcS7ciD4Yq9WFw4PN_c5Bwccrmu7R-zr-u6ZCbQM,497
5
5
  dodal/cli.py,sha256=z0UBESrNrq6Kq4rttp4uHcwS1fnOnRkKBRDHSriPpGY,2058
6
- dodal/log.py,sha256=grK5-c-V6UjMERwDqYPdKbc_BpycrNb8hP0uteLOVCY,8296
6
+ dodal/log.py,sha256=dfo1rfYrGG8oIm2HkNxaa_ldVs4vJKtgWSoKe1Z_Xno,8533
7
7
  dodal/utils.py,sha256=aH-W94t6NFOoGHZ7awbUKY8_k7qIYDourCFs3MKIjjA,10024
8
8
  dodal/beamline_specific_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  dodal/beamline_specific_utils/i03.py,sha256=Ixe1anFQl-kwRJubmQx28TIW4Zw8qDxpElNNNapWQHI,396
10
10
  dodal/beamlines/README.md,sha256=K9MkL_GomxlsoTB7Mz-_dJA5NNSbmCfMiutchGg3C8o,404
11
11
  dodal/beamlines/__init__.py,sha256=U0dQYFEUloCdQOs24zyfpPTncJXOO4cDcfHSevVOAw4,2890
12
- dodal/beamlines/i03.py,sha256=LcE9Vir0cCjt9pxO2wcevlM0NTP6NBCxp6DNtShPV0E,16914
12
+ dodal/beamlines/i03.py,sha256=J-4GawTxAhrYDQZh87n11L9ehTgObEQ1Lz2PueXCWbc,16892
13
13
  dodal/beamlines/i04.py,sha256=JOyNcUnC3wva4no2MHKp6b8gOKAcQXL_c4cBo7oneVs,13034
14
14
  dodal/beamlines/i04_1.py,sha256=KDxSUQNhIs_NFiRaLY-Jiory0DeN7Y0ErvGuoTrwCDU,4731
15
- dodal/beamlines/i20_1.py,sha256=XJpey1-XZnCVpjK6-tODRYeBofqV44BL8lK5OSdQgiI,746
16
- dodal/beamlines/i22.py,sha256=Lk5S5AHu9hCnqlJJHZj1fhSDm1sTOgEVMe1S20nVqeY,8786
17
- dodal/beamlines/i23.py,sha256=iEFkrA4sPQsRLGAmeD263jPMX4u2SF1NK4_KYqnVwow,1402
18
- dodal/beamlines/i24.py,sha256=LIe8tu_ZJsoeQH7tYRZHSvqQ9C9zBGOXO6rb1DPCYjQ,4595
15
+ dodal/beamlines/i20_1.py,sha256=MaPgONHqpoZuBtkiKEzYtViJnKBM2_ekeP4OdbmuXHE,1158
16
+ dodal/beamlines/i22.py,sha256=3VFdA4Wc7O40-64lwUtUBIN23fH4JVNbLKJ1JLjy9as,9870
17
+ dodal/beamlines/i23.py,sha256=2j5qLoqE_hg9ETHqNkOVu7LLkVB8qalgXeORnVYKN_I,1075
18
+ dodal/beamlines/i24.py,sha256=dCMQGcBZ6ADZ6_rEDFcV2BPHGKBC9iVFvfxewxVts4k,6111
19
19
  dodal/beamlines/p38.py,sha256=TC78u4GwEnj6X0r5cnHhqNdBbbDRnh8lY8pEucBZjEU,8006
20
20
  dodal/beamlines/p45.py,sha256=TNIkC-SBfj0ayZtlLLXW9xCSi5CzJkO8XpAMIo8fjao,2957
21
21
  dodal/common/__init__.py,sha256=ZC4ICKUDB0BDxRaVy8nmqclVmDBne-dPtk6UJsoFq6I,258
@@ -40,38 +40,39 @@ dodal/devices/cryostream.py,sha256=6MU4rXIOL33C-8F3DVfAtv0ZnwiysTtawjkeePd5IrQ,3
40
40
  dodal/devices/dcm.py,sha256=vfyGYDzfSwTiNqlzkfNjkrL-Q1hNVSgJddvJ5Un_lvg,1610
41
41
  dodal/devices/eiger.py,sha256=NE4tHdqgUZpUxJLQbd5lLUIHZcpeotppexJGlDNByzM,13868
42
42
  dodal/devices/eiger_odin.py,sha256=U5Byb7uNwDdNscBRp7yBYQrsjKrKXl2l5WdSpL09lAw,6980
43
- dodal/devices/fast_grid_scan.py,sha256=qp0jdzhTjkDtaf7ngdPcegcFLlp1EmWUDbU_knCBDpc,13438
43
+ dodal/devices/fast_grid_scan.py,sha256=BEj96j78r60JPPJoOMP-XXG-_9yURFTuu-pp2LcqQmY,12452
44
44
  dodal/devices/fluorescence_detector_motion.py,sha256=RrXfPmJzWnAjcjp9u0AnJEfjvWPMKburVTySB2hxYbw,181
45
45
  dodal/devices/flux.py,sha256=RtPStHw7Mad0igVKntKWVZfuZn2clokVJqH14HLix6M,198
46
46
  dodal/devices/focusing_mirror.py,sha256=aRqBkE3OgaXpH6lP3v1VbSYgHsMMbSsPPXzeyAGf_Pg,6435
47
+ dodal/devices/hutch_shutter.py,sha256=nZ3gRbYIVJsXLlpZMWT4UEYUFFQP1MwMe8Oy304QsqE,3360
47
48
  dodal/devices/ipin.py,sha256=OGMXwAE4KDDonZRPFkUmR9Vsk6X4Ox-hEvPT5drP-mQ,208
48
49
  dodal/devices/linkam3.py,sha256=TPhiQ1D9i_HIlKHAlfnVfX7H6aPOAeXPEJLdmvwdKWQ,3776
49
50
  dodal/devices/logging_ophyd_device.py,sha256=xw4lbyqq5_ehESGterVEfubJsBiJTWvBp5b9k62gSkg,666
50
- dodal/devices/motors.py,sha256=T0wKGpRKhgduAQj3jE8CGmxy3cWMAFl9_glyjVZwjnA,1473
51
+ dodal/devices/motors.py,sha256=16ID2jFJ35h6ZrFp76nJG_oQg6uDrupgcbvcbmjlc7c,300
51
52
  dodal/devices/p45.py,sha256=jzBW2fGRhIbGzSRs5Fgupxro6aqE611n1RTcrTTG-yY,1047
52
53
  dodal/devices/qbpm1.py,sha256=OY7-WbdxMiLGUK8Z57ezwqSXbHxoPP-y3GvBgj9kgMA,220
53
- dodal/devices/robot.py,sha256=V5Gk-e1ZczU7y8SqU4_1YXYQJ6knoVFtXLZmIDY9MI4,2530
54
+ dodal/devices/robot.py,sha256=RcSqBPMMUpWyP7LoyifatII5GWup-vFYZutniM60m_k,4231
54
55
  dodal/devices/s4_slit_gaps.py,sha256=j3kgF9WfGFaU9xdUuiAh-QqI5u_vhiAftaDVINt91SM,243
55
56
  dodal/devices/scatterguard.py,sha256=0qnvhoo3RjLsrxVgIoDJpryqunlgMVgaTsoyKRC2g4Y,331
56
57
  dodal/devices/scintillator.py,sha256=4Dej1a6HRom9GRwTDsaTKGfvloP20POUqIeHqsI8-R8,184
57
58
  dodal/devices/slits.py,sha256=URru9VN2N19KqeUPDZaBmyKYn0_JJiE0Vko4sZpfsl8,601
58
- dodal/devices/smargon.py,sha256=ml96h7E1C31qPo8jocAepSouIVXgpIR0vuMF99nZjqM,2964
59
+ dodal/devices/smargon.py,sha256=Ds8QFqK3ljbTxalqkQ6clpArj4u4hu9d4vrt97Fzdf4,4693
59
60
  dodal/devices/status.py,sha256=TuUGidZ4Ar-WCRc_sX0wn58DmL6brj1pMr8rNF5Z6VU,1198
60
- dodal/devices/synchrotron.py,sha256=E5vcSum-zoD5vIZxa2Xcl0gAkeRqY6a-AfZQICCwLHg,1947
61
- dodal/devices/tetramm.py,sha256=Xdy3dXFo4Wn6HHsRo4e1tTgMzvDa8MwkVvcDFZxFrYQ,8280
62
- dodal/devices/thawer.py,sha256=L5OYSdzGvx6dIkGgcTbITAbFAm0OKEVVqYBb4MPstOg,382
61
+ dodal/devices/synchrotron.py,sha256=QtTufJA_fCaBawHougSc7nxwu240oX46_y0P-4qIW8o,1960
62
+ dodal/devices/tetramm.py,sha256=XriN-zBFVnHxhnTbphSPIZcxEbdWBTbw2g_ulUBl4bw,8538
63
+ dodal/devices/thawer.py,sha256=hIdZOzCNloY7CtSvdE2gk4vCMMoOtaIA4dPH_k0OwFg,1527
63
64
  dodal/devices/turbo_slit.py,sha256=W3ZRIqDhq4iMhr5GcIiWvl2U1GaPtGanqkL7upQOZTY,1132
64
65
  dodal/devices/undulator.py,sha256=kn84MQpuBHtQj7H7HeBoAYKXu5buGKvTgs3tf2gdEdw,2074
65
66
  dodal/devices/undulator_dcm.py,sha256=TC9fO55r1YIG_88PPbGGtzfjcRJcaoC2ny51JiDOEX4,5199
66
- dodal/devices/webcam.py,sha256=dvNWJ6hHQR7BUsMRC9TH4XiCCofVhlgZ8HYfVCvd2og,1367
67
- dodal/devices/xbpm_feedback.py,sha256=a4evzdoMANbwoboQCbdMkcrxRogXLnHs966SZJsywYQ,1521
68
- dodal/devices/zebra.py,sha256=XE2oEm6kLkXd86ev4dYP8bh3tI9Fesb1SmU61RSMHBA,9082
67
+ dodal/devices/webcam.py,sha256=FXYcxQdOOCRIMAf8jMWlDVAhSEs4ycGCnoODvHb-apM,1554
68
+ dodal/devices/xbpm_feedback.py,sha256=8QHYKHo9ksZo30olbFM-tHpCHcJRFozgHKVJijv3Gck,1986
69
+ dodal/devices/zebra.py,sha256=9Zkq5I3-gcP6qfDBnPEAtFU4QJ-VJyp7cHvB79ZfLHk,9186
69
70
  dodal/devices/zebra_controlled_shutter.py,sha256=MqX4KE6w0FliZRDBltswcLCNSsp6vQrD_iBY640IljI,1094
70
71
  dodal/devices/areadetector/__init__.py,sha256=8IwLxuZMW0MOJpJp_ZDdlaE20hrtsH_PXWGaKgMiYs4,240
71
72
  dodal/devices/areadetector/adaravis.py,sha256=pwbmmnakarjhD59XoyAIXJdakS-nqDG09Xmwq17AVw4,3787
72
73
  dodal/devices/areadetector/adsim.py,sha256=3U7kS93RM3Xeh-XWKjeuw5jXbIGWAbrs59LfxtvB7OU,1907
73
74
  dodal/devices/areadetector/adutils.py,sha256=JIx1_sYlehpLtEXcwOEuzVoMplsLdKVW7OWv5eiJqgE,2576
74
- dodal/devices/areadetector/plugins/MJPG.py,sha256=2ISGUg9JxJYzEH640WUIsvFwKolSTywkTyPy9wz6f_k,4064
75
+ dodal/devices/areadetector/plugins/MJPG.py,sha256=pLuEZiRGgCwJM1ONA5jdetGLo6O0OVhvmcVkkYtPeR8,4159
75
76
  dodal/devices/detector/__init__.py,sha256=XEwjopgTtBq93RRuFthVVVI9DT1jUvpOJzWOHantJpU,104
76
77
  dodal/devices/detector/det_dim_constants.py,sha256=MZ4w2nsTKzj4eN7yGsSs1pqKWIuU4vc6UzcSll02uWg,2305
77
78
  dodal/devices/detector/det_dist_to_beam_converter.py,sha256=f6JFp-eEB2v8NzZg27UrN0VDP5CMjRnaPU6BTA7_n_s,1937
@@ -81,15 +82,16 @@ dodal/devices/detector/detector_motion.py,sha256=REREva2kyPcIzOZmahN9rT0jDSuUbV0
81
82
  dodal/devices/i03/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
83
  dodal/devices/i04/transfocator.py,sha256=uieByXIj0JRbmvMB_om5NOAEbEJkzfkCD24bl2aEo1g,3154
83
84
  dodal/devices/i20_1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- dodal/devices/i22/dcm.py,sha256=ZJL-K7GdJxyH-0wKsV0psX8iaFYJINpqBZljfAyuLbs,6046
85
+ dodal/devices/i22/dcm.py,sha256=Kzyd_qFg8KVhRsgfTQVOpghESE8yIOgACKa0Fv9NaZI,6270
85
86
  dodal/devices/i22/fswitch.py,sha256=AdYtnkCBuhivyJGZqelg_7sjB2pHN7vl1JTtlO4vHo4,3061
86
- dodal/devices/i23/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
- dodal/devices/i23/gonio.py,sha256=cxqD2Kd578c4-K4h2sHdJjoap2gPGC46Qr4SPudHLTs,864
88
- dodal/devices/i24/I24_detector_motion.py,sha256=bKbb44Qs24oguwJ780N4e5XGNtka_3ZZCGGq6BQu99Y,229
87
+ dodal/devices/i22/nxsas.py,sha256=ky7v9UZ1UQFsm5hI0wD9OXG-fTKFLj2wJjB7wADxKpw,5655
88
+ dodal/devices/i24/I24_detector_motion.py,sha256=Joqr1orgeNvRS7n01bjaO-4Yu4obb8fnKaWHQfjPX14,365
89
89
  dodal/devices/i24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
- dodal/devices/i24/dual_backlight.py,sha256=5Xkkt4VqS-G1QLDmBJNHs-LNVYJ_aTso_ev8QNDJiis,1367
90
+ dodal/devices/i24/aperture.py,sha256=kKfHli5oKp-j-qZhZoXTRK81SAUNyhpI6VRvtw0SkZA,850
91
+ dodal/devices/i24/beamstop.py,sha256=28hQowTvgN5Zw38tkDh32h2ceyN-2GE8bAaGPvDOt5U,1234
92
+ dodal/devices/i24/dual_backlight.py,sha256=Th-RKr28aFxE8LCT_mdN9KkRIVw0BHLGKkI0ienfRZU,2049
91
93
  dodal/devices/i24/i24_vgonio.py,sha256=Igqs7687z6lyhGVeJEDtDmPachYxU48MUH2BF0RpK9Q,461
92
- dodal/devices/i24/pmac.py,sha256=EFLclXWMh7eMk4YNutXeSdLyyqFSBpLe5O6HEWC8OQc,405
94
+ dodal/devices/i24/pmac.py,sha256=pN54myYvzqPl7iW0Vsp59J1EiV_gtn0xQGwbsKJpiYE,3876
93
95
  dodal/devices/oav/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
96
  dodal/devices/oav/grid_overlay.py,sha256=FRtjcFd420XY8MEQ9sWedL0i4pK-KUJOSxh2C5zM3PA,5232
95
97
  dodal/devices/oav/microns_for_zoom_levels.json,sha256=5PA71RzldFTp0eTUGPmov0MjxHe583mzvfor5f3thXI,1208
@@ -97,26 +99,26 @@ dodal/devices/oav/oav_calculations.py,sha256=wt71vFcyQrr98FvX8oyUM2n5vmKi3K7PyOT
97
99
  dodal/devices/oav/oav_detector.py,sha256=JtzRdFQVXUdVK4Qyd9knDhsfkK6tsXoD_rIWDpLdpD4,3654
98
100
  dodal/devices/oav/oav_errors.py,sha256=cc4mGnaTiAc5WIlOt_BIYOc7CRSkrCdnBaavfAJ0pXY,754
99
101
  dodal/devices/oav/oav_parameters.py,sha256=4XybkhKeG7IEjPRfx0PVM9KNenuyN0rAGWBZG7H3zvQ,7941
100
- dodal/devices/oav/utils.py,sha256=BkTk0aTqqhIHCZInhcUAYjCRPxumPOlTg9m21skncTc,3018
102
+ dodal/devices/oav/utils.py,sha256=zbUDvNETDoCtclj5jNzxz1XBt5mQlWBbxUrhRP7pZrU,3663
101
103
  dodal/devices/oav/pin_image_recognition/__init__.py,sha256=qEX3BRnrcP1BLZD-f_smHiMMPLJPkWQZQbIWTbW25JA,6499
102
104
  dodal/devices/oav/pin_image_recognition/manual_test.py,sha256=h1Rto6ZDCB3jWhjSy9N8ECxRN583iYDJr9LxrTJ8kfE,903
103
105
  dodal/devices/oav/pin_image_recognition/utils.py,sha256=-7-Zs-331UVTq_AZrfdF-zwZdmMn7eitTkBSqnBrxnk,8620
104
106
  dodal/devices/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
107
  dodal/devices/util/adjuster_plans.py,sha256=2AYaywQP_LbA2KJ6Op3cok8GoRtj696utrSSDfaJtBY,875
106
- dodal/devices/util/epics_util.py,sha256=FSiTgBhm4id1nILM3UUD7V3eDjJM4DEMIG_wEwzM8Tk,4441
108
+ dodal/devices/util/epics_util.py,sha256=eQr-ImBnADpBL_6XWr3_q9yuMe55Lu0h3j9L1fG4Jws,4714
107
109
  dodal/devices/util/lookup_tables.py,sha256=Up-0BlARt79TIEM76SkDyn9LtTFLxPUcaEPZv6D6bws,2141
108
110
  dodal/devices/util/motor_utils.py,sha256=pNY-aUk9LxaIWeDr5rpMS6udiB9j19wcCXkNDLp1uA0,257
109
- dodal/devices/xspress3_mini/xspress3_mini.py,sha256=gBLr_sdt4HmGLAJUimZ4MlPu_0B6gVmjUmYYQYCSTAc,2858
110
- dodal/devices/xspress3_mini/xspress3_mini_channel.py,sha256=eKmsgf4AFaVOwpB2o-5B7EOr9xn4d0A_0gGPuQv3ohk,810
111
+ dodal/devices/xspress3/xspress3.py,sha256=29elzI3JtceryKeMWXhcP9nWl0tlSdnTZhltCitet6A,4668
112
+ dodal/devices/xspress3/xspress3_channel.py,sha256=yJRwseLmtkW2Vv6GB8sLdOFuBn3e4c9Q8fgPacMgl5w,1638
111
113
  dodal/devices/zocalo/__init__.py,sha256=oPhjFB39yf2NWkGD-MMcPFnnOVZ_RtdyBt2OLYn-Xa4,505
112
114
  dodal/devices/zocalo/zocalo_interaction.py,sha256=B6TBTDwUlluksLTwC4TiEEgfFzWLOmwgG8xM5Xd4Wik,3132
113
115
  dodal/devices/zocalo/zocalo_results.py,sha256=U4Vk4OF-eL8w0BR-fbw3k4jyRo6G3Ywaf8NMAkjr4Hs,9658
114
116
  dodal/parameters/experiment_parameter_base.py,sha256=O7JamfuJ5cYHkPf9tsHJPqn-OMHTAGouigvM1cDFehE,313
115
- dodal/plans/check_topup.py,sha256=VOkHak88_r-pdTsSnwAJnbvlK2_UhKnO5I36pJmWKvQ,2985
117
+ dodal/plans/check_topup.py,sha256=Pj6Eu8fa6nvoW4awrMxvzE_ftpLfYz8bN0QDLRw0Yuk,2989
116
118
  dodal/plans/data_session_metadata.py,sha256=QNx9rb1EfGBHb21eFekIi7KjNhC0PL-SVKBCggDuNeg,1650
117
- dls_dodal-1.28.0.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
118
- dls_dodal-1.28.0.dist-info/METADATA,sha256=1EiYYnvAHwt0rilBYosSJaPDpF34SdatvnYUuqud9lE,16837
119
- dls_dodal-1.28.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
120
- dls_dodal-1.28.0.dist-info/entry_points.txt,sha256=wpzz9FsTiYxI8OBwLKX9V9ResLwThBSmtRMcPwII0FA,46
121
- dls_dodal-1.28.0.dist-info/top_level.txt,sha256=xIozdmZk_wmMV4wugpq9-6eZs0vgADNUKz3j2UAwlhc,6
122
- dls_dodal-1.28.0.dist-info/RECORD,,
119
+ dls_dodal-1.29.2.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
120
+ dls_dodal-1.29.2.dist-info/METADATA,sha256=CGmJ2TuJkSbjLoFhxLZpWn-BkN5zmeGzwzpFtFM1jTU,16942
121
+ dls_dodal-1.29.2.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
122
+ dls_dodal-1.29.2.dist-info/entry_points.txt,sha256=wpzz9FsTiYxI8OBwLKX9V9ResLwThBSmtRMcPwII0FA,46
123
+ dls_dodal-1.29.2.dist-info/top_level.txt,sha256=xIozdmZk_wmMV4wugpq9-6eZs0vgADNUKz3j2UAwlhc,6
124
+ dls_dodal-1.29.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (70.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
dodal/_version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.28.0'
16
- __version_tuple__ = version_tuple = (1, 28, 0)
15
+ __version__ = version = '1.29.2'
16
+ __version_tuple__ = version_tuple = (1, 29, 2)
dodal/beamlines/i03.py CHANGED
@@ -30,7 +30,7 @@ from dodal.devices.undulator import Undulator
30
30
  from dodal.devices.undulator_dcm import UndulatorDCM
31
31
  from dodal.devices.webcam import Webcam
32
32
  from dodal.devices.xbpm_feedback import XBPMFeedback
33
- from dodal.devices.xspress3_mini.xspress3_mini import Xspress3Mini
33
+ from dodal.devices.xspress3.xspress3 import Xspress3
34
34
  from dodal.devices.zebra import Zebra
35
35
  from dodal.devices.zebra_controlled_shutter import ZebraShutter
36
36
  from dodal.devices.zocalo import ZocaloResults
@@ -363,12 +363,12 @@ def zebra(wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False) -
363
363
 
364
364
  def xspress3mini(
365
365
  wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
366
- ) -> Xspress3Mini:
366
+ ) -> Xspress3:
367
367
  """Get the i03 Xspress3Mini device, instantiate it if it hasn't already been.
368
368
  If this is called when already instantiated in i03, it will return the existing object.
369
369
  """
370
370
  return device_instantiation(
371
- Xspress3Mini,
371
+ Xspress3,
372
372
  "xspress3mini",
373
373
  "-EA-XSP3-01:",
374
374
  wait_for_connection,
dodal/beamlines/i20_1.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from dodal.common.beamlines.beamline_utils import device_instantiation
2
2
  from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
3
3
  from dodal.devices.turbo_slit import TurboSlit
4
+ from dodal.devices.xspress3.xspress3 import Xspress3
4
5
  from dodal.log import set_beamline as set_log_beamline
5
6
  from dodal.utils import get_beamline_name
6
7
 
@@ -23,3 +24,20 @@ def turbo_slit(
23
24
  wait=wait_for_connection,
24
25
  fake=fake_with_ophyd_sim,
25
26
  )
27
+
28
+
29
+ def xspress3(
30
+ wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
31
+ ) -> Xspress3:
32
+ """
33
+ 16 channels Xspress3 detector
34
+ """
35
+
36
+ return device_instantiation(
37
+ Xspress3,
38
+ prefix="-EA-DET-03:",
39
+ name="Xspress3",
40
+ num_channels=16,
41
+ wait=wait_for_connection,
42
+ fake=fake_with_ophyd_sim,
43
+ )
dodal/beamlines/i22.py CHANGED
@@ -10,10 +10,11 @@ from dodal.common.beamlines.beamline_utils import (
10
10
  )
11
11
  from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
12
12
  from dodal.common.beamlines.device_helpers import numbered_slits
13
- from dodal.common.visit import LocalDirectoryServiceClient, StaticVisitDirectoryProvider
13
+ from dodal.common.visit import DirectoryServiceClient, StaticVisitDirectoryProvider
14
14
  from dodal.devices.focusing_mirror import FocusingMirror
15
15
  from dodal.devices.i22.dcm import CrystalMetadata, DoubleCrystalMonochromator
16
16
  from dodal.devices.i22.fswitch import FSwitch
17
+ from dodal.devices.i22.nxsas import NXSasMetadataHolder, NXSasOAV, NXSasPilatus
17
18
  from dodal.devices.linkam3 import Linkam3
18
19
  from dodal.devices.slits import Slits
19
20
  from dodal.devices.synchrotron import Synchrotron
@@ -35,7 +36,7 @@ set_directory_provider(
35
36
  StaticVisitDirectoryProvider(
36
37
  BL,
37
38
  Path("/dls/i22/data/2024/cm37271-2/bluesky"),
38
- client=LocalDirectoryServiceClient(),
39
+ client=DirectoryServiceClient("http://i22-control:8088/api"),
39
40
  )
40
41
  )
41
42
 
@@ -44,13 +45,22 @@ def saxs(
44
45
  wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
45
46
  ) -> PilatusDetector:
46
47
  return device_instantiation(
47
- PilatusDetector,
48
+ NXSasPilatus,
48
49
  "saxs",
49
50
  "-EA-PILAT-01:",
50
51
  wait_for_connection,
51
52
  fake_with_ophyd_sim,
52
53
  drv_suffix="CAM:",
53
54
  hdf_suffix="HDF5:",
55
+ metadata_holder=NXSasMetadataHolder(
56
+ x_pixel_size=(1.72e-1, "mm"),
57
+ y_pixel_size=(1.72e-1, "mm"),
58
+ description="Dectris Pilatus3 2M",
59
+ type="Photon Counting Hybrid Pixel",
60
+ sensor_material="silicon",
61
+ sensor_thickness=(0.45, "mm"),
62
+ distance=(4711.833684146172, "mm"),
63
+ ),
54
64
  directory_provider=get_directory_provider(),
55
65
  )
56
66
 
@@ -71,13 +81,22 @@ def waxs(
71
81
  wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
72
82
  ) -> PilatusDetector:
73
83
  return device_instantiation(
74
- PilatusDetector,
84
+ NXSasPilatus,
75
85
  "waxs",
76
86
  "-EA-PILAT-03:",
77
87
  wait_for_connection,
78
88
  fake_with_ophyd_sim,
79
89
  drv_suffix="CAM:",
80
90
  hdf_suffix="HDF5:",
91
+ metadata_holder=NXSasMetadataHolder(
92
+ x_pixel_size=(1.72e-1, "mm"),
93
+ y_pixel_size=(1.72e-1, "mm"),
94
+ description="Dectris Pilatus3 2M",
95
+ type="Photon Counting Hybrid Pixel",
96
+ sensor_material="silicon",
97
+ sensor_thickness=(0.45, "mm"),
98
+ distance=(175.4199417092314, "mm"),
99
+ ),
81
100
  directory_provider=get_directory_provider(),
82
101
  )
83
102
 
@@ -92,6 +111,7 @@ def i0(
92
111
  "-EA-XBPM-02:",
93
112
  wait_for_connection,
94
113
  fake_with_ophyd_sim,
114
+ type="Cividec Diamond XBPM",
95
115
  directory_provider=get_directory_provider(),
96
116
  )
97
117
 
@@ -106,6 +126,7 @@ def it(
106
126
  "-EA-TTRM-02:",
107
127
  wait_for_connection,
108
128
  fake_with_ophyd_sim,
129
+ type="PIN Diode",
109
130
  directory_provider=get_directory_provider(),
110
131
  )
111
132
 
@@ -153,13 +174,13 @@ def dcm(
153
174
  usage="Bragg",
154
175
  type="silicon",
155
176
  reflection=(1, 1, 1),
156
- d_spacing=3.13475,
177
+ d_spacing=(3.13475, "nm"),
157
178
  ),
158
179
  crystal_2_metadata=CrystalMetadata(
159
180
  usage="Bragg",
160
181
  type="silicon",
161
182
  reflection=(1, 1, 1),
162
- d_spacing=3.13475,
183
+ d_spacing=(3.13475, "nm"),
163
184
  ),
164
185
  )
165
186
 
@@ -263,7 +284,6 @@ def fswitch(
263
284
  )
264
285
 
265
286
 
266
- # Must find which PandA IOC(s) are compatible
267
287
  # Must document what PandAs are physically connected to
268
288
  # See: https://github.com/bluesky/ophyd-async/issues/284
269
289
  def panda1(
@@ -325,18 +345,23 @@ def panda4(
325
345
  )
326
346
 
327
347
 
328
- @skip_device
329
348
  def oav(
330
349
  wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
331
350
  ) -> AravisDetector:
332
351
  return device_instantiation(
333
- AravisDetector,
352
+ NXSasOAV,
334
353
  "oav",
335
354
  "-DI-OAV-01:",
336
355
  wait_for_connection,
337
356
  fake_with_ophyd_sim,
338
357
  drv_suffix="DET:",
339
358
  hdf_suffix="HDF5:",
359
+ metadata_holder=NXSasMetadataHolder(
360
+ x_pixel_size=(3.45e-3, "mm"), # Double check this figure
361
+ y_pixel_size=(3.45e-3, "mm"),
362
+ description="AVT Mako G-507B",
363
+ distance=(-1.0, "m"),
364
+ ),
340
365
  directory_provider=get_directory_provider(),
341
366
  )
342
367
 
dodal/beamlines/i23.py CHANGED
@@ -1,6 +1,5 @@
1
1
  from dodal.common.beamlines.beamline_utils import device_instantiation
2
2
  from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
3
- from dodal.devices.i23.gonio import Gonio
4
3
  from dodal.devices.oav.pin_image_recognition import PinTipDetection
5
4
  from dodal.log import set_beamline as set_log_beamline
6
5
  from dodal.utils import get_beamline_name, get_hostname, skip_device
@@ -19,17 +18,6 @@ def _is_i23_machine():
19
18
  return hostname.startswith("i23-ws") or hostname.startswith("i23-control")
20
19
 
21
20
 
22
- def gonio(wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False) -> Gonio:
23
- """Get the i23 goniometer device"""
24
- return device_instantiation(
25
- Gonio,
26
- "Gonio",
27
- "-MO-GONIO-01:",
28
- wait_for_connection,
29
- fake_with_ophyd_sim,
30
- )
31
-
32
-
33
21
  @skip_device(lambda: not _is_i23_machine())
34
22
  def oav_pin_tip_detection(
35
23
  wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
dodal/beamlines/i24.py CHANGED
@@ -2,11 +2,15 @@ from dodal.common.beamlines.beamline_utils import BL, device_instantiation
2
2
  from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
3
3
  from dodal.devices.detector import DetectorParams
4
4
  from dodal.devices.eiger import EigerDetector
5
+ from dodal.devices.hutch_shutter import HutchShutter
6
+ from dodal.devices.i24.aperture import Aperture
7
+ from dodal.devices.i24.beamstop import Beamstop
5
8
  from dodal.devices.i24.dual_backlight import DualBacklight
6
9
  from dodal.devices.i24.I24_detector_motion import DetectorMotion
7
10
  from dodal.devices.i24.i24_vgonio import VGonio
8
11
  from dodal.devices.i24.pmac import PMAC
9
- from dodal.devices.oav.oav_detector import OAV, OAVConfigParams
12
+ from dodal.devices.oav.oav_detector import OAV
13
+ from dodal.devices.oav.oav_parameters import OAVConfigParams
10
14
  from dodal.devices.zebra import Zebra
11
15
  from dodal.log import set_beamline as set_log_beamline
12
16
  from dodal.utils import get_beamline_name, skip_device
@@ -21,6 +25,32 @@ set_log_beamline(BL)
21
25
  set_utils_beamline(BL)
22
26
 
23
27
 
28
+ def aperture(
29
+ wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
30
+ ) -> Aperture:
31
+ """Get the i24 aperture device, instantiate it if it hasn't already been.
32
+ If this is called when already instantiated in i24, it will return the existing object.
33
+ """
34
+ return device_instantiation(
35
+ Aperture, "aperture", "-AL-APTR-01:", wait_for_connection, fake_with_ophyd_sim
36
+ )
37
+
38
+
39
+ def beamstop(
40
+ wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
41
+ ) -> Beamstop:
42
+ """Get the i24 beamstop device, instantiate it if it hasn't already been.
43
+ If this is called when already instantiated in i24, it will return the existing object.
44
+ """
45
+ return device_instantiation(
46
+ Beamstop,
47
+ "beamstop",
48
+ "-MO-BS-01:",
49
+ wait_for_connection,
50
+ fake_with_ophyd_sim,
51
+ )
52
+
53
+
24
54
  def backlight(
25
55
  wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
26
56
  ) -> DualBacklight:
@@ -134,3 +164,19 @@ def zebra(wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False) -
134
164
  wait_for_connection,
135
165
  fake_with_ophyd_sim,
136
166
  )
167
+
168
+
169
+ @skip_device(lambda: BL == "s24")
170
+ def shutter(
171
+ wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
172
+ ) -> HutchShutter:
173
+ """Get the i24 hutch shutter device, instantiate it if it hasn't already been.
174
+ If this is called when already instantiated, it will return the existing object.
175
+ """
176
+ return device_instantiation(
177
+ HutchShutter,
178
+ "shutter",
179
+ "-PS-SHTR-01:",
180
+ wait_for_connection,
181
+ fake_with_ophyd_sim,
182
+ )
@@ -8,6 +8,7 @@ from ophyd import Component, Device, DeviceStatus, EpicsSignal, EpicsSignalRO, S
8
8
  from PIL import Image, ImageDraw
9
9
 
10
10
  from dodal.devices.oav.oav_parameters import OAVConfigParams
11
+ from dodal.devices.oav.utils import save_thumbnail
11
12
  from dodal.log import LOGGER
12
13
 
13
14
 
@@ -49,6 +50,9 @@ class MJPG(Device, ABC):
49
50
 
50
51
  LOGGER.info(f"Saving image to {path}")
51
52
  image.save(path)
53
+
54
+ save_thumbnail(Path(path), image)
55
+
52
56
  self.last_saved_path.put(path)
53
57
 
54
58
  def trigger(self):
@@ -23,7 +23,6 @@ from ophyd_async.epics.signal import (
23
23
  from pydantic import validator
24
24
  from pydantic.dataclasses import dataclass
25
25
 
26
- from dodal.devices.motors import XYZLimitBundle
27
26
  from dodal.log import LOGGER
28
27
  from dodal.parameters.experiment_parameter_base import AbstractExperimentWithBeamParams
29
28
 
@@ -112,35 +111,6 @@ class GridScanParamsCommon(AbstractExperimentWithBeamParams):
112
111
  def _get_z_axis(cls, z_axis: GridAxis, values: dict[str, Any]) -> GridAxis:
113
112
  return GridAxis(values["z2_start"], values["z_step_size"], values["z_steps"])
114
113
 
115
- def is_valid(self, limits: XYZLimitBundle) -> bool:
116
- """
117
- Validates scan parameters
118
-
119
- :param limits: The motor limits against which to validate
120
- the parameters
121
- :return: True if the scan is valid
122
- """
123
- x_in_limits = limits.x.is_within(self.x_axis.start) and limits.x.is_within(
124
- self.x_axis.end
125
- )
126
- y_in_limits = limits.y.is_within(self.y_axis.start) and limits.y.is_within(
127
- self.y_axis.end
128
- )
129
-
130
- first_grid_in_limits = (
131
- x_in_limits and y_in_limits and limits.z.is_within(self.z1_start)
132
- )
133
-
134
- z_in_limits = limits.z.is_within(self.z_axis.start) and limits.z.is_within(
135
- self.z_axis.end
136
- )
137
-
138
- second_grid_in_limits = (
139
- x_in_limits and z_in_limits and limits.y.is_within(self.y2_start)
140
- )
141
-
142
- return first_grid_in_limits and second_grid_in_limits
143
-
144
114
  def get_num_images(self):
145
115
  return self.x_steps * self.y_steps + self.x_steps * self.z_steps
146
116
 
@@ -0,0 +1,93 @@
1
+ from enum import Enum
2
+
3
+ from bluesky.protocols import Movable
4
+ from ophyd_async.core import (
5
+ DEFAULT_TIMEOUT,
6
+ AsyncStatus,
7
+ StandardReadable,
8
+ wait_for_value,
9
+ )
10
+ from ophyd_async.epics.signal import epics_signal_r, epics_signal_w
11
+
12
+ HUTCH_SAFE_FOR_OPERATIONS = 0 # Hutch is locked and can't be entered
13
+
14
+
15
+ class ShutterNotSafeToOperateError(Exception):
16
+ pass
17
+
18
+
19
+ class ShutterDemand(str, Enum):
20
+ OPEN = "Open"
21
+ CLOSE = "Close"
22
+ RESET = "Reset"
23
+
24
+
25
+ class ShutterState(str, Enum):
26
+ FAULT = "Fault"
27
+ OPEN = "Open"
28
+ OPENING = "Opening"
29
+ CLOSED = "Closed"
30
+ CLOSING = "Closing"
31
+
32
+
33
+ class HutchInterlock(StandardReadable):
34
+ """Device to check the interlock status of the hutch."""
35
+
36
+ def __init__(self, bl_prefix: str, name: str = "") -> None:
37
+ self.status = epics_signal_r(float, bl_prefix + "-PS-IOC-01:M14:LOP")
38
+ super().__init__(name)
39
+
40
+ # TODO replace with read
41
+ # See https://github.com/DiamondLightSource/dodal/issues/651
42
+ async def shutter_safe_to_operate(self) -> bool:
43
+ """If the status value is 0, hutch has been searched and locked and it is safe \
44
+ to operate the shutter.
45
+ If the status value is not 0 (usually set to 7), the hutch is open and the \
46
+ shutter should not be in use.
47
+ """
48
+ interlock_state = await self.status.get_value()
49
+ return interlock_state == HUTCH_SAFE_FOR_OPERATIONS
50
+
51
+
52
+ class HutchShutter(StandardReadable, Movable):
53
+ """Device to operate the hutch shutter.
54
+
55
+ When a demand is sent, the device should first check the hutch status \
56
+ and raise an error if it's not interlocked (searched and locked), meaning it's not \
57
+ safe to operate the shutter.
58
+
59
+ If the requested shutter position is "Open", the shutter control PV should first \
60
+ go to "Reset" and then move to "Open". This is because before opening the hutch \
61
+ shutter, the interlock status PV (`-PS-SHTR-01:ILKSTA`) will show as `failed` until \
62
+ the hutch shutter is reset. This will set the interlock status to `OK`, allowing \
63
+ for shutter operations. Until this step is done, the hutch shutter can't be opened.
64
+ The reset is not needed for closing the shutter.
65
+ """
66
+
67
+ def __init__(self, prefix: str, name: str = "") -> None:
68
+ self.control = epics_signal_w(ShutterDemand, prefix + "CON")
69
+ self.status = epics_signal_r(ShutterState, prefix + "STA")
70
+
71
+ bl_prefix = prefix.split("-")[0]
72
+ self.interlock = HutchInterlock(bl_prefix)
73
+
74
+ super().__init__(name)
75
+
76
+ @AsyncStatus.wrap
77
+ async def set(self, position_demand: ShutterDemand):
78
+ interlock_state = await self.interlock.shutter_safe_to_operate()
79
+ if not interlock_state:
80
+ raise ShutterNotSafeToOperateError(
81
+ "The hutch has not been locked, not operating shutter."
82
+ )
83
+ if position_demand == ShutterDemand.OPEN:
84
+ await self.control.set(ShutterDemand.RESET, wait=True)
85
+ await self.control.set(position_demand, wait=True)
86
+ return await wait_for_value(
87
+ self.status, match=ShutterState.OPEN, timeout=DEFAULT_TIMEOUT
88
+ )
89
+ else:
90
+ await self.control.set(position_demand, wait=True)
91
+ return await wait_for_value(
92
+ self.status, match=ShutterState.CLOSED, timeout=DEFAULT_TIMEOUT
93
+ )