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.
- {dls_dodal-1.28.0.dist-info → dls_dodal-1.29.2.dist-info}/METADATA +6 -4
- {dls_dodal-1.28.0.dist-info → dls_dodal-1.29.2.dist-info}/RECORD +37 -35
- {dls_dodal-1.28.0.dist-info → dls_dodal-1.29.2.dist-info}/WHEEL +1 -1
- dodal/_version.py +2 -2
- dodal/beamlines/i03.py +3 -3
- dodal/beamlines/i20_1.py +18 -0
- dodal/beamlines/i22.py +34 -9
- dodal/beamlines/i23.py +0 -12
- dodal/beamlines/i24.py +47 -1
- dodal/devices/areadetector/plugins/MJPG.py +4 -0
- dodal/devices/fast_grid_scan.py +0 -30
- dodal/devices/hutch_shutter.py +93 -0
- dodal/devices/i22/dcm.py +10 -6
- dodal/devices/i22/nxsas.py +173 -0
- dodal/devices/i24/I24_detector_motion.py +8 -5
- dodal/devices/i24/aperture.py +29 -0
- dodal/devices/i24/beamstop.py +38 -0
- dodal/devices/i24/dual_backlight.py +39 -21
- dodal/devices/i24/pmac.py +118 -13
- dodal/devices/motors.py +0 -48
- dodal/devices/oav/utils.py +15 -1
- dodal/devices/robot.py +58 -8
- dodal/devices/smargon.py +102 -48
- dodal/devices/synchrotron.py +14 -19
- dodal/devices/tetramm.py +32 -23
- dodal/devices/thawer.py +35 -2
- dodal/devices/util/epics_util.py +16 -13
- dodal/devices/webcam.py +6 -1
- dodal/devices/xbpm_feedback.py +27 -16
- dodal/devices/xspress3/xspress3.py +150 -0
- dodal/devices/xspress3/xspress3_channel.py +42 -0
- dodal/devices/zebra.py +4 -0
- dodal/log.py +13 -2
- dodal/plans/check_topup.py +4 -4
- dodal/devices/i23/__init__.py +0 -0
- dodal/devices/i23/gonio.py +0 -29
- dodal/devices/xspress3_mini/xspress3_mini.py +0 -103
- dodal/devices/xspress3_mini/xspress3_mini_channel.py +0 -24
- {dls_dodal-1.28.0.dist-info → dls_dodal-1.29.2.dist-info}/LICENSE +0 -0
- {dls_dodal-1.28.0.dist-info → dls_dodal-1.29.2.dist-info}/entry_points.txt +0 -0
- {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.
|
|
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.
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
16
|
-
dodal/beamlines/i22.py,sha256=
|
|
17
|
-
dodal/beamlines/i23.py,sha256=
|
|
18
|
-
dodal/beamlines/i24.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
61
|
-
dodal/devices/tetramm.py,sha256=
|
|
62
|
-
dodal/devices/thawer.py,sha256=
|
|
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=
|
|
67
|
-
dodal/devices/xbpm_feedback.py,sha256=
|
|
68
|
-
dodal/devices/zebra.py,sha256=
|
|
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=
|
|
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=
|
|
85
|
+
dodal/devices/i22/dcm.py,sha256=Kzyd_qFg8KVhRsgfTQVOpghESE8yIOgACKa0Fv9NaZI,6270
|
|
85
86
|
dodal/devices/i22/fswitch.py,sha256=AdYtnkCBuhivyJGZqelg_7sjB2pHN7vl1JTtlO4vHo4,3061
|
|
86
|
-
dodal/devices/
|
|
87
|
-
dodal/devices/
|
|
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/
|
|
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=
|
|
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=
|
|
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=
|
|
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/
|
|
110
|
-
dodal/devices/
|
|
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=
|
|
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.
|
|
118
|
-
dls_dodal-1.
|
|
119
|
-
dls_dodal-1.
|
|
120
|
-
dls_dodal-1.
|
|
121
|
-
dls_dodal-1.
|
|
122
|
-
dls_dodal-1.
|
|
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,,
|
dodal/_version.py
CHANGED
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.
|
|
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
|
-
) ->
|
|
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
|
-
|
|
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
|
|
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=
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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):
|
dodal/devices/fast_grid_scan.py
CHANGED
|
@@ -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
|
+
)
|