dls-dodal 1.26.0__py3-none-any.whl → 1.28.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dls-dodal
3
- Version: 1.26.0
3
+ Version: 1.28.0
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
@@ -1,6 +1,6 @@
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=ZreJF-rILTr9IBCA-InSDMjl6Bdsh4uJHrXyWFkH87M,413
3
+ dodal/_version.py,sha256=RW6USZoeFR_9ttdXBH9tb0lK1erQEYot3NzmBpWXDMs,413
4
4
  dodal/adsim.py,sha256=OW2dcS7ciD4Yq9WFw4PN_c5Bwccrmu7R-zr-u6ZCbQM,497
5
5
  dodal/cli.py,sha256=z0UBESrNrq6Kq4rttp4uHcwS1fnOnRkKBRDHSriPpGY,2058
6
6
  dodal/log.py,sha256=grK5-c-V6UjMERwDqYPdKbc_BpycrNb8hP0uteLOVCY,8296
@@ -9,21 +9,21 @@ dodal/beamline_specific_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
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=BsqiPR-z1svEm0psbTtmW3FR69xcC7_pJqLc5Z27mSQ,15935
13
- dodal/beamlines/i04.py,sha256=2sa7qbNnIDK7r7d8-9Y296Fvzl8TzI_z_K2u7EsUQQw,12063
12
+ dodal/beamlines/i03.py,sha256=LcE9Vir0cCjt9pxO2wcevlM0NTP6NBCxp6DNtShPV0E,16914
13
+ dodal/beamlines/i04.py,sha256=JOyNcUnC3wva4no2MHKp6b8gOKAcQXL_c4cBo7oneVs,13034
14
14
  dodal/beamlines/i04_1.py,sha256=KDxSUQNhIs_NFiRaLY-Jiory0DeN7Y0ErvGuoTrwCDU,4731
15
15
  dodal/beamlines/i20_1.py,sha256=XJpey1-XZnCVpjK6-tODRYeBofqV44BL8lK5OSdQgiI,746
16
- dodal/beamlines/i22.py,sha256=TlXgAuRYM4JS733tyZyLMYDyC7ajwg85_XzYI5qh46U,7574
16
+ dodal/beamlines/i22.py,sha256=Lk5S5AHu9hCnqlJJHZj1fhSDm1sTOgEVMe1S20nVqeY,8786
17
17
  dodal/beamlines/i23.py,sha256=iEFkrA4sPQsRLGAmeD263jPMX4u2SF1NK4_KYqnVwow,1402
18
- dodal/beamlines/i24.py,sha256=87ugX8yAv1gqpwskl4RDjqZPraySeD0TDJylI6zUytQ,4569
19
- dodal/beamlines/p38.py,sha256=0uRL4GVs1sGobr0BZpDDbtStNJcipT6o4FvoA_OWLaE,7120
18
+ dodal/beamlines/i24.py,sha256=LIe8tu_ZJsoeQH7tYRZHSvqQ9C9zBGOXO6rb1DPCYjQ,4595
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
22
- dodal/common/coordination.py,sha256=psJ-UWNk4w9YUy-1Vc-CpSn9ea_Ugs2pY5wFKA7JBEY,1133
22
+ dodal/common/coordination.py,sha256=OxIjDiO1-9A9KESRPFtzwkvvQlavbgA5RHemlbubBPg,1168
23
23
  dodal/common/maths.py,sha256=JRSBhbMzwlicKp1_Bsfu9gA79JJA_Dgq9EpbExFH65M,1829
24
24
  dodal/common/types.py,sha256=M0gZs9F7--gREF8VYJn-Y1Mt9mIEgp1aLY3oUpUkSno,546
25
25
  dodal/common/udc_directory_provider.py,sha256=zNlt_VgdAlyBtVN7neTHk_0tWBbI4pPUL7q9WQOzXvo,1260
26
- dodal/common/visit.py,sha256=8q-cee1r59tU_ywsxBvUzRMyP3Mn6zRHbE-pQAzBPVM,7545
26
+ dodal/common/visit.py,sha256=MhrFbLptMG0Wvd2nHubBwQ44qAzoP4Bf4_z_-wO8rh0,6063
27
27
  dodal/common/beamlines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  dodal/common/beamlines/beamline_parameters.py,sha256=N22dtDLw3Hlo7EUmGxe4qFGcu7OnldwCz_mU7yK2rd0,3577
29
29
  dodal/common/beamlines/beamline_utils.py,sha256=AgmH9wpnFQ4DHAA7_Yo0COa2piX2ksFxukFt2_600kA,4488
@@ -32,27 +32,25 @@ dodal/devices/CTAB.py,sha256=_MfL_KH4uDPxq_RuHFEZ9HVXOpUnQb5be3csoz9DdAs,1630
32
32
  dodal/devices/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  dodal/devices/adsim.py,sha256=dMU0TKIuiODHYFHQOH4_5UvB8iJtaJEtjqaEDGjcU-w,311
34
34
  dodal/devices/aperture.py,sha256=0MtTzKMDZ5DVAz0DE0kXI0M76VCp0y9vFsrMggEMpxk,586
35
- dodal/devices/aperturescatterguard.py,sha256=2T1VKzE3-mb9hocZtHRwRqC4Eh_M_r8lCmiYwU_mndE,9906
35
+ dodal/devices/aperturescatterguard.py,sha256=2JJsEPJGJHrI0ztv1cSaP7H5T6qdzDfUcN-VEQ39B8o,11012
36
36
  dodal/devices/attenuator.py,sha256=OD7fElTIMHWk7ZopPqEu29lionm7WwgC0-Kvl8vBIb0,2599
37
- dodal/devices/backlight.py,sha256=9BJcAg1f1kGRlb7bNzeltSDlpBXcxjcW90f87ewnj5k,562
37
+ dodal/devices/backlight.py,sha256=vsNGZB4C_mVMafllvJlOTghsfv6UqALMKUMLXu3WZ5k,1115
38
38
  dodal/devices/beamstop.py,sha256=8L3qhlk-3ZBOp10xK1i8qZqYTGOXX1mVF1MgXoN0dfg,215
39
39
  dodal/devices/cryostream.py,sha256=6MU4rXIOL33C-8F3DVfAtv0ZnwiysTtawjkeePd5IrQ,332
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=cbM6Jqcu7Gao0zFH6u8iTuJfojDDYs0AvseAnRs8iMg,12134
43
+ dodal/devices/fast_grid_scan.py,sha256=qp0jdzhTjkDtaf7ngdPcegcFLlp1EmWUDbU_knCBDpc,13438
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
47
  dodal/devices/ipin.py,sha256=OGMXwAE4KDDonZRPFkUmR9Vsk6X4Ox-hEvPT5drP-mQ,208
48
48
  dodal/devices/linkam3.py,sha256=TPhiQ1D9i_HIlKHAlfnVfX7H6aPOAeXPEJLdmvwdKWQ,3776
49
49
  dodal/devices/logging_ophyd_device.py,sha256=xw4lbyqq5_ehESGterVEfubJsBiJTWvBp5b9k62gSkg,666
50
- dodal/devices/lower_gonio_stages.py,sha256=oJ_Xeuqs5E8AWAoZX52jD1qV6pCSjCOjdwnXFKz_xjw,229
51
- dodal/devices/motors.py,sha256=aKtMv5q_4b1eFhzyuk2-D6zDsY_6cqAmG59y5LWUz1s,1328
50
+ dodal/devices/motors.py,sha256=T0wKGpRKhgduAQj3jE8CGmxy3cWMAFl9_glyjVZwjnA,1473
52
51
  dodal/devices/p45.py,sha256=jzBW2fGRhIbGzSRs5Fgupxro6aqE611n1RTcrTTG-yY,1047
53
- dodal/devices/panda_fast_grid_scan.py,sha256=cQmrs3pQ3P_J1e5C1IOdjDZibRthIHjqY98eaH5kLCE,5424
54
52
  dodal/devices/qbpm1.py,sha256=OY7-WbdxMiLGUK8Z57ezwqSXbHxoPP-y3GvBgj9kgMA,220
55
- dodal/devices/robot.py,sha256=ITMKXiA83KVCAVI3ZpN-wWCLj62uDmxLBFO3PUheaRg,2379
53
+ dodal/devices/robot.py,sha256=V5Gk-e1ZczU7y8SqU4_1YXYQJ6knoVFtXLZmIDY9MI4,2530
56
54
  dodal/devices/s4_slit_gaps.py,sha256=j3kgF9WfGFaU9xdUuiAh-QqI5u_vhiAftaDVINt91SM,243
57
55
  dodal/devices/scatterguard.py,sha256=0qnvhoo3RjLsrxVgIoDJpryqunlgMVgaTsoyKRC2g4Y,331
58
56
  dodal/devices/scintillator.py,sha256=4Dej1a6HRom9GRwTDsaTKGfvloP20POUqIeHqsI8-R8,184
@@ -60,7 +58,8 @@ dodal/devices/slits.py,sha256=URru9VN2N19KqeUPDZaBmyKYn0_JJiE0Vko4sZpfsl8,601
60
58
  dodal/devices/smargon.py,sha256=ml96h7E1C31qPo8jocAepSouIVXgpIR0vuMF99nZjqM,2964
61
59
  dodal/devices/status.py,sha256=TuUGidZ4Ar-WCRc_sX0wn58DmL6brj1pMr8rNF5Z6VU,1198
62
60
  dodal/devices/synchrotron.py,sha256=E5vcSum-zoD5vIZxa2Xcl0gAkeRqY6a-AfZQICCwLHg,1947
63
- dodal/devices/tetramm.py,sha256=dHA15KkJhBHwtmbivDua_aVqFbvK47TVQG7KXmn8jQ8,8041
61
+ dodal/devices/tetramm.py,sha256=Xdy3dXFo4Wn6HHsRo4e1tTgMzvDa8MwkVvcDFZxFrYQ,8280
62
+ dodal/devices/thawer.py,sha256=L5OYSdzGvx6dIkGgcTbITAbFAm0OKEVVqYBb4MPstOg,382
64
63
  dodal/devices/turbo_slit.py,sha256=W3ZRIqDhq4iMhr5GcIiWvl2U1GaPtGanqkL7upQOZTY,1132
65
64
  dodal/devices/undulator.py,sha256=kn84MQpuBHtQj7H7HeBoAYKXu5buGKvTgs3tf2gdEdw,2074
66
65
  dodal/devices/undulator_dcm.py,sha256=TC9fO55r1YIG_88PPbGGtzfjcRJcaoC2ny51JiDOEX4,5199
@@ -77,11 +76,12 @@ dodal/devices/detector/__init__.py,sha256=XEwjopgTtBq93RRuFthVVVI9DT1jUvpOJzWOHa
77
76
  dodal/devices/detector/det_dim_constants.py,sha256=MZ4w2nsTKzj4eN7yGsSs1pqKWIuU4vc6UzcSll02uWg,2305
78
77
  dodal/devices/detector/det_dist_to_beam_converter.py,sha256=f6JFp-eEB2v8NzZg27UrN0VDP5CMjRnaPU6BTA7_n_s,1937
79
78
  dodal/devices/detector/det_resolution.py,sha256=aQkKp24LpRGiwzPAQM3wLVa4ANw32HdrKc2kftHfKQA,3253
80
- dodal/devices/detector/detector.py,sha256=UDw_hLbhfUo_ECasGQ_Ud8bVQzE9D8uaAMagVAa_R4g,4647
79
+ dodal/devices/detector/detector.py,sha256=arP27DbrgOjYZhE6Ibp9kDBglfmqZpPBk53S5ItsrvE,4756
81
80
  dodal/devices/detector/detector_motion.py,sha256=REREva2kyPcIzOZmahN9rT0jDSuUbV0qUDl4IcBnutA,1221
82
81
  dodal/devices/i03/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
82
  dodal/devices/i04/transfocator.py,sha256=uieByXIj0JRbmvMB_om5NOAEbEJkzfkCD24bl2aEo1g,3154
84
83
  dodal/devices/i20_1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
+ dodal/devices/i22/dcm.py,sha256=ZJL-K7GdJxyH-0wKsV0psX8iaFYJINpqBZljfAyuLbs,6046
85
85
  dodal/devices/i22/fswitch.py,sha256=AdYtnkCBuhivyJGZqelg_7sjB2pHN7vl1JTtlO4vHo4,3061
86
86
  dodal/devices/i23/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  dodal/devices/i23/gonio.py,sha256=cxqD2Kd578c4-K4h2sHdJjoap2gPGC46Qr4SPudHLTs,864
@@ -97,7 +97,7 @@ dodal/devices/oav/oav_calculations.py,sha256=wt71vFcyQrr98FvX8oyUM2n5vmKi3K7PyOT
97
97
  dodal/devices/oav/oav_detector.py,sha256=JtzRdFQVXUdVK4Qyd9knDhsfkK6tsXoD_rIWDpLdpD4,3654
98
98
  dodal/devices/oav/oav_errors.py,sha256=cc4mGnaTiAc5WIlOt_BIYOc7CRSkrCdnBaavfAJ0pXY,754
99
99
  dodal/devices/oav/oav_parameters.py,sha256=4XybkhKeG7IEjPRfx0PVM9KNenuyN0rAGWBZG7H3zvQ,7941
100
- dodal/devices/oav/utils.py,sha256=KBvwlacwxt0KVV6ybc0nb6wPbxeAF3NfAMKWeJ5XtcU,999
100
+ dodal/devices/oav/utils.py,sha256=BkTk0aTqqhIHCZInhcUAYjCRPxumPOlTg9m21skncTc,3018
101
101
  dodal/devices/oav/pin_image_recognition/__init__.py,sha256=qEX3BRnrcP1BLZD-f_smHiMMPLJPkWQZQbIWTbW25JA,6499
102
102
  dodal/devices/oav/pin_image_recognition/manual_test.py,sha256=h1Rto6ZDCB3jWhjSy9N8ECxRN583iYDJr9LxrTJ8kfE,903
103
103
  dodal/devices/oav/pin_image_recognition/utils.py,sha256=-7-Zs-331UVTq_AZrfdF-zwZdmMn7eitTkBSqnBrxnk,8620
@@ -113,9 +113,10 @@ dodal/devices/zocalo/zocalo_interaction.py,sha256=B6TBTDwUlluksLTwC4TiEEgfFzWLOm
113
113
  dodal/devices/zocalo/zocalo_results.py,sha256=U4Vk4OF-eL8w0BR-fbw3k4jyRo6G3Ywaf8NMAkjr4Hs,9658
114
114
  dodal/parameters/experiment_parameter_base.py,sha256=O7JamfuJ5cYHkPf9tsHJPqn-OMHTAGouigvM1cDFehE,313
115
115
  dodal/plans/check_topup.py,sha256=VOkHak88_r-pdTsSnwAJnbvlK2_UhKnO5I36pJmWKvQ,2985
116
- dls_dodal-1.26.0.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
117
- dls_dodal-1.26.0.dist-info/METADATA,sha256=0fEtRaibwFzXvFI-JP3xbxw29Sp_H1ocnv23eMgU5xk,16837
118
- dls_dodal-1.26.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
119
- dls_dodal-1.26.0.dist-info/entry_points.txt,sha256=wpzz9FsTiYxI8OBwLKX9V9ResLwThBSmtRMcPwII0FA,46
120
- dls_dodal-1.26.0.dist-info/top_level.txt,sha256=xIozdmZk_wmMV4wugpq9-6eZs0vgADNUKz3j2UAwlhc,6
121
- dls_dodal-1.26.0.dist-info/RECORD,,
116
+ 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,,
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.26.0'
16
- __version_tuple__ = version_tuple = (1, 26, 0)
15
+ __version__ = version = '1.28.0'
16
+ __version_tuple__ = version_tuple = (1, 28, 0)
dodal/beamlines/i03.py CHANGED
@@ -14,17 +14,18 @@ from dodal.devices.dcm import DCM
14
14
  from dodal.devices.detector import DetectorParams
15
15
  from dodal.devices.detector.detector_motion import DetectorMotion
16
16
  from dodal.devices.eiger import EigerDetector
17
- from dodal.devices.fast_grid_scan import FastGridScan
17
+ from dodal.devices.fast_grid_scan import PandAFastGridScan, ZebraFastGridScan
18
18
  from dodal.devices.flux import Flux
19
19
  from dodal.devices.focusing_mirror import FocusingMirrorWithStripes, VFMMirrorVoltages
20
+ from dodal.devices.motors import XYZPositioner
20
21
  from dodal.devices.oav.oav_detector import OAV, OAVConfigParams
21
22
  from dodal.devices.oav.pin_image_recognition import PinTipDetection
22
- from dodal.devices.panda_fast_grid_scan import PandAFastGridScan
23
23
  from dodal.devices.qbpm1 import QBPM1
24
24
  from dodal.devices.robot import BartRobot
25
25
  from dodal.devices.s4_slit_gaps import S4SlitGaps
26
26
  from dodal.devices.smargon import Smargon
27
27
  from dodal.devices.synchrotron import Synchrotron
28
+ from dodal.devices.thawer import Thawer
28
29
  from dodal.devices.undulator import Undulator
29
30
  from dodal.devices.undulator_dcm import UndulatorDCM
30
31
  from dodal.devices.webcam import Webcam
@@ -199,15 +200,15 @@ def eiger(
199
200
  )
200
201
 
201
202
 
202
- def fast_grid_scan(
203
+ def zebra_fast_grid_scan(
203
204
  wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
204
- ) -> FastGridScan:
205
- """Get the i03 fast_grid_scan device, instantiate it if it hasn't already been.
205
+ ) -> ZebraFastGridScan:
206
+ """Get the i03 zebra_fast_grid_scan device, instantiate it if it hasn't already been.
206
207
  If this is called when already instantiated in i03, it will return the existing object.
207
208
  """
208
209
  return device_instantiation(
209
- device_factory=FastGridScan,
210
- name="fast_grid_scan",
210
+ device_factory=ZebraFastGridScan,
211
+ name="zebra_fast_grid_scan",
211
212
  prefix="-MO-SGON-01:",
212
213
  wait=wait_for_connection,
213
214
  fake=fake_with_ophyd_sim,
@@ -219,12 +220,12 @@ def panda_fast_grid_scan(
219
220
  ) -> PandAFastGridScan:
220
221
  """Get the i03 panda_fast_grid_scan device, instantiate it if it hasn't already been.
221
222
  If this is called when already instantiated in i03, it will return the existing object.
222
- This is used instead of the fast_grid_scan device when using the PandA.
223
+ This is used instead of the zebra_fast_grid_scan device when using the PandA.
223
224
  """
224
225
  return device_instantiation(
225
226
  device_factory=PandAFastGridScan,
226
227
  name="panda_fast_grid_scan",
227
- prefix="-MO-SGON-01:PGS:",
228
+ prefix="-MO-SGON-01:",
228
229
  wait=wait_for_connection,
229
230
  fake=fake_with_ophyd_sim,
230
231
  )
@@ -480,3 +481,33 @@ def webcam(
480
481
  fake_with_ophyd_sim,
481
482
  url="http://i03-webcam1/axis-cgi/jpg/image.cgi",
482
483
  )
484
+
485
+
486
+ def thawer(
487
+ wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
488
+ ) -> Thawer:
489
+ """Get the i03 thawer, instantiate it if it hasn't already been.
490
+ If this is called when already instantiated in i03, it will return the existing object.
491
+ """
492
+ return device_instantiation(
493
+ Thawer,
494
+ "thawer",
495
+ "-EA-THAW-01",
496
+ wait_for_connection,
497
+ fake_with_ophyd_sim,
498
+ )
499
+
500
+
501
+ def lower_gonio_positioner(
502
+ wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
503
+ ) -> XYZPositioner:
504
+ """Get the i03 lower gonio device, instantiate it if it hasn't already been.
505
+ If this is called when already instantiated in i03, it will return the existing object.
506
+ """
507
+ return device_instantiation(
508
+ XYZPositioner,
509
+ "lower_gonio_positioner",
510
+ "-MO-GONP-01:",
511
+ wait_for_connection,
512
+ fake_with_ophyd_sim,
513
+ )
dodal/beamlines/i04.py CHANGED
@@ -8,15 +8,17 @@ from dodal.devices.dcm import DCM
8
8
  from dodal.devices.detector import DetectorParams
9
9
  from dodal.devices.detector.detector_motion import DetectorMotion
10
10
  from dodal.devices.eiger import EigerDetector
11
- from dodal.devices.fast_grid_scan import FastGridScan
11
+ from dodal.devices.fast_grid_scan import ZebraFastGridScan
12
12
  from dodal.devices.flux import Flux
13
13
  from dodal.devices.i04.transfocator import Transfocator
14
14
  from dodal.devices.ipin import IPin
15
15
  from dodal.devices.motors import XYZPositioner
16
16
  from dodal.devices.oav.oav_detector import OAV, OAVConfigParams
17
+ from dodal.devices.robot import BartRobot
17
18
  from dodal.devices.s4_slit_gaps import S4SlitGaps
18
19
  from dodal.devices.smargon import Smargon
19
20
  from dodal.devices.synchrotron import Synchrotron
21
+ from dodal.devices.thawer import Thawer
20
22
  from dodal.devices.undulator import Undulator
21
23
  from dodal.devices.xbpm_feedback import XBPMFeedbackI04
22
24
  from dodal.devices.zebra import Zebra
@@ -258,15 +260,15 @@ def eiger(
258
260
  )
259
261
 
260
262
 
261
- def fast_grid_scan(
263
+ def zebra_fast_grid_scan(
262
264
  wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
263
- ) -> FastGridScan:
264
- """Get the i04 fast_grid_scan device, instantiate it if it hasn't already been.
265
+ ) -> ZebraFastGridScan:
266
+ """Get the i04 zebra_fast_grid_scan device, instantiate it if it hasn't already been.
265
267
  If this is called when already instantiated in i04, it will return the existing object.
266
268
  """
267
269
  return device_instantiation(
268
- device_factory=FastGridScan,
269
- name="fast_grid_scan",
270
+ device_factory=ZebraFastGridScan,
271
+ name="zebra_fast_grid_scan",
270
272
  prefix="-MO-SGON-01:",
271
273
  wait=wait_for_connection,
272
274
  fake=fake_with_ophyd_sim,
@@ -363,3 +365,33 @@ def detector_motion(
363
365
  wait=wait_for_connection,
364
366
  fake=fake_with_ophyd_sim,
365
367
  )
368
+
369
+
370
+ def thawer(
371
+ wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
372
+ ) -> Thawer:
373
+ """Get the i04 thawer, instantiate it if it hasn't already been.
374
+ If this is called when already instantiated in i04, it will return the existing object.
375
+ """
376
+ return device_instantiation(
377
+ Thawer,
378
+ "thawer",
379
+ "-EA-THAW-01",
380
+ wait_for_connection,
381
+ fake_with_ophyd_sim,
382
+ )
383
+
384
+
385
+ def robot(
386
+ wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
387
+ ) -> BartRobot:
388
+ """Get the i04 robot device, instantiate it if it hasn't already been.
389
+ If this is called when already instantiated in i04, it will return the existing object.
390
+ """
391
+ return device_instantiation(
392
+ BartRobot,
393
+ "robot",
394
+ "-MO-ROBOT-01:",
395
+ wait_for_connection,
396
+ fake_with_ophyd_sim,
397
+ )
dodal/beamlines/i22.py CHANGED
@@ -12,9 +12,11 @@ from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beam
12
12
  from dodal.common.beamlines.device_helpers import numbered_slits
13
13
  from dodal.common.visit import LocalDirectoryServiceClient, StaticVisitDirectoryProvider
14
14
  from dodal.devices.focusing_mirror import FocusingMirror
15
+ from dodal.devices.i22.dcm import CrystalMetadata, DoubleCrystalMonochromator
15
16
  from dodal.devices.i22.fswitch import FSwitch
16
17
  from dodal.devices.linkam3 import Linkam3
17
18
  from dodal.devices.slits import Slits
19
+ from dodal.devices.synchrotron import Synchrotron
18
20
  from dodal.devices.tetramm import TetrammDetector
19
21
  from dodal.devices.undulator import Undulator
20
22
  from dodal.log import set_beamline as set_log_beamline
@@ -53,6 +55,18 @@ def saxs(
53
55
  )
54
56
 
55
57
 
58
+ def synchrotron(
59
+ wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
60
+ ) -> Synchrotron:
61
+ return device_instantiation(
62
+ Synchrotron,
63
+ "synchrotron",
64
+ "",
65
+ wait_for_connection,
66
+ fake_with_ophyd_sim,
67
+ )
68
+
69
+
56
70
  def waxs(
57
71
  wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
58
72
  ) -> PilatusDetector:
@@ -122,6 +136,34 @@ def hfm(
122
136
  )
123
137
 
124
138
 
139
+ def dcm(
140
+ wait_for_connection: bool = True,
141
+ fake_with_ophyd_sim: bool = False,
142
+ ) -> DoubleCrystalMonochromator:
143
+ return device_instantiation(
144
+ DoubleCrystalMonochromator,
145
+ "dcm",
146
+ "",
147
+ wait_for_connection,
148
+ fake_with_ophyd_sim,
149
+ bl_prefix=False,
150
+ motion_prefix=f"{BeamlinePrefix(BL).beamline_prefix}-MO-DCM-01:",
151
+ temperature_prefix=f"{BeamlinePrefix(BL).beamline_prefix}-DI-DCM-01:",
152
+ crystal_1_metadata=CrystalMetadata(
153
+ usage="Bragg",
154
+ type="silicon",
155
+ reflection=(1, 1, 1),
156
+ d_spacing=3.13475,
157
+ ),
158
+ crystal_2_metadata=CrystalMetadata(
159
+ usage="Bragg",
160
+ type="silicon",
161
+ reflection=(1, 1, 1),
162
+ d_spacing=3.13475,
163
+ ),
164
+ )
165
+
166
+
125
167
  def undulator(
126
168
  wait_for_connection: bool = True,
127
169
  fake_with_ophyd_sim: bool = False,
@@ -283,6 +325,7 @@ def panda4(
283
325
  )
284
326
 
285
327
 
328
+ @skip_device
286
329
  def oav(
287
330
  wait_for_connection: bool = True, fake_with_ophyd_sim: bool = False
288
331
  ) -> AravisDetector:
dodal/beamlines/i24.py CHANGED
@@ -11,7 +11,9 @@ from dodal.devices.zebra import Zebra
11
11
  from dodal.log import set_beamline as set_log_beamline
12
12
  from dodal.utils import get_beamline_name, skip_device
13
13
 
14
- ZOOM_PARAMS_FILE = "/dls_sw/i24/software/gda/config/xml/jCameraManZoomLevels.xml"
14
+ ZOOM_PARAMS_FILE = (
15
+ "/dls_sw/i24/software/gda_versions/gda_9_34/config/xml/jCameraManZoomLevels.xml"
16
+ )
15
17
  DISPLAY_CONFIG = "/dls_sw/i24/software/gda_versions/var/display.configuration"
16
18
 
17
19
  BL = get_beamline_name("s24")
dodal/beamlines/p38.py CHANGED
@@ -12,6 +12,7 @@ from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beam
12
12
  from dodal.common.beamlines.device_helpers import numbered_slits
13
13
  from dodal.common.visit import LocalDirectoryServiceClient, StaticVisitDirectoryProvider
14
14
  from dodal.devices.focusing_mirror import FocusingMirror
15
+ from dodal.devices.i22.dcm import CrystalMetadata, DoubleCrystalMonochromator
15
16
  from dodal.devices.i22.fswitch import FSwitch
16
17
  from dodal.devices.linkam3 import Linkam3
17
18
  from dodal.devices.slits import Slits
@@ -214,6 +215,34 @@ def hfm(
214
215
  )
215
216
 
216
217
 
218
+ def dcm(
219
+ wait_for_connection: bool = True,
220
+ fake_with_ophyd_sim: bool = True,
221
+ ) -> DoubleCrystalMonochromator:
222
+ return device_instantiation(
223
+ DoubleCrystalMonochromator,
224
+ "dcm",
225
+ "",
226
+ wait_for_connection,
227
+ fake_with_ophyd_sim,
228
+ bl_prefix=False,
229
+ motion_prefix=f"{BeamlinePrefix(BL).beamline_prefix}-MO-DCM-01:",
230
+ temperature_prefix=f"{BeamlinePrefix(BL).beamline_prefix}-DI-DCM-01:",
231
+ crystal_1_metadata=CrystalMetadata(
232
+ usage="Bragg",
233
+ type="silicon",
234
+ reflection=(1, 1, 1),
235
+ d_spacing=3.13475,
236
+ ),
237
+ crystal_2_metadata=CrystalMetadata(
238
+ usage="Bragg",
239
+ type="silicon",
240
+ reflection=(1, 1, 1),
241
+ d_spacing=3.13475,
242
+ ),
243
+ )
244
+
245
+
217
246
  def undulator(
218
247
  wait_for_connection: bool = True,
219
248
  fake_with_ophyd_sim: bool = True,
@@ -1,4 +1,5 @@
1
1
  import uuid
2
+ from typing import Any
2
3
 
3
4
  from dodal.common.types import Group
4
5
 
@@ -16,19 +17,20 @@ def group_uuid(name: str) -> Group:
16
17
  return f"{name}-{str(uuid.uuid4())[:6]}"
17
18
 
18
19
 
19
- def inject(name: str): # type: ignore
20
+ def inject(name: str) -> Any: # type: ignore
20
21
  """
21
- Function to mark a default argument of a plan method as a reference to a device
22
- that is stored in the Blueapi context, as devices are constructed on startup of the
23
- service, and are not available to be used when writing plans.
24
- Bypasses mypy linting, returning x as Any and therefore valid as a default
25
- argument.
26
- e.g. For a 1-dimensional scan, that is usually performed on a consistent Movable
27
- axis with name "stage_x"
22
+ Function to mark a defaulted argument of a plan as a reference to a device stored
23
+ in another context and not available to be referenced directly.
24
+ Bypasses type checking, returning x as Any and therefore valid as a default
25
+ argument, leaving handling to the context from which the plan is called.
26
+ Assumes that device.name is unique.
27
+ e.g. For a 1-dimensional scan, that is usually performed on a Movable with
28
+ name "stage_x"
29
+
28
30
  def scan(x: Movable = inject("stage_x"), start: float = 0.0 ...)
29
31
 
30
32
  Args:
31
- name (str): Name of a device to be fetched from the Blueapi context
33
+ name (str): Name of a Device to be fetched from an external context
32
34
 
33
35
  Returns:
34
36
  Any: name but without typing checking, valid as any default type
dodal/common/visit.py CHANGED
@@ -3,14 +3,10 @@ from pathlib import Path
3
3
  from typing import Optional
4
4
 
5
5
  from aiohttp import ClientSession
6
- from bluesky import plan_stubs as bps
7
- from bluesky import preprocessors as bpp
8
- from bluesky.utils import make_decorator
9
6
  from ophyd_async.core import DirectoryInfo
10
7
  from pydantic import BaseModel
11
8
 
12
- from dodal.common.beamlines import beamline_utils
13
- from dodal.common.types import MsgGenerator, UpdatingDirectoryProvider
9
+ from dodal.common.types import UpdatingDirectoryProvider
14
10
  from dodal.log import LOGGER
15
11
 
16
12
  """
@@ -156,41 +152,3 @@ class StaticVisitDirectoryProvider(UpdatingDirectoryProvider):
156
152
  raise ValueError(
157
153
  "No current collection, update() needs to be called at least once"
158
154
  )
159
-
160
-
161
- DATA_SESSION = "data_session"
162
- DATA_GROUPS = "data_groups"
163
-
164
-
165
- def attach_metadata(
166
- plan: MsgGenerator, provider: UpdatingDirectoryProvider | None
167
- ) -> MsgGenerator:
168
- """
169
- Attach data session metadata to the runs within a plan and make it correlate
170
- with an ophyd-async DirectoryProvider.
171
-
172
- This updates the directory provider (which in turn makes a call to to a service
173
- to figure out which scan number we are using for such a scan), and ensures the
174
- start document contains the correct data session.
175
-
176
- Args:
177
- plan: The plan to preprocess
178
- provider: The directory provider that participating detectors are aware of.
179
-
180
- Returns:
181
- MsgGenerator: A plan
182
-
183
- Yields:
184
- Iterator[Msg]: Plan messages
185
- """
186
- if provider is None:
187
- provider = beamline_utils.get_directory_provider()
188
- yield from bps.wait_for([provider.update])
189
- directory_info: DirectoryInfo = provider()
190
- # https://github.com/DiamondLightSource/dodal/issues/452
191
- # As part of 452, write each dataCollection into their own folder, then can use resource_dir directly
192
- data_session = directory_info.prefix.removesuffix("-")
193
- yield from bpp.inject_md_wrapper(plan, md={DATA_SESSION: data_session})
194
-
195
-
196
- attach_metadata_decorator = make_decorator(attach_metadata)
@@ -1,6 +1,7 @@
1
1
  import asyncio
2
2
  from collections import OrderedDict, namedtuple
3
3
  from dataclasses import asdict, dataclass
4
+ from enum import Enum
4
5
 
5
6
  from bluesky.protocols import Movable, Reading
6
7
  from ophyd_async.core import AsyncStatus, SignalR, StandardReadable
@@ -48,8 +49,22 @@ class SingleAperturePosition:
48
49
  )
49
50
 
50
51
 
52
+ # Use StrEnum once we stop python 3.10 support
53
+ class AperturePositionGDANames(str, Enum):
54
+ LARGE_APERTURE = "LARGE_APERTURE"
55
+ MEDIUM_APERTURE = "MEDIUM_APERTURE"
56
+ SMALL_APERTURE = "SMALL_APERTURE"
57
+ ROBOT_LOAD = "ROBOT_LOAD"
58
+
59
+ def __str__(self):
60
+ return str(self.value)
61
+
62
+
51
63
  def position_from_params(
52
- name: str, GDA_name: str, radius_microns: float | None, params: dict
64
+ name: str,
65
+ GDA_name: AperturePositionGDANames,
66
+ radius_microns: float | None,
67
+ params: dict,
53
68
  ) -> SingleAperturePosition:
54
69
  return SingleAperturePosition(
55
70
  name,
@@ -77,7 +92,8 @@ def tolerances_from_params(params: dict) -> ApertureScatterguardTolerances:
77
92
 
78
93
  @dataclass
79
94
  class AperturePositions:
80
- """Holds the motor positions needed to select a particular aperture size."""
95
+ """Holds the motor positions needed to select a particular aperture size. This class should be instantiated with definitions for its sizes
96
+ using from_gda_beamline_params"""
81
97
 
82
98
  LARGE: SingleAperturePosition
83
99
  MEDIUM: SingleAperturePosition
@@ -93,13 +109,32 @@ class AperturePositions:
93
109
  @classmethod
94
110
  def from_gda_beamline_params(cls, params):
95
111
  return cls(
96
- LARGE=position_from_params("Large", "LARGE_APERTURE", 100, params),
97
- MEDIUM=position_from_params("Medium", "MEDIUM_APERTURE", 50, params),
98
- SMALL=position_from_params("Small", "SMALL_APERTURE", 20, params),
99
- ROBOT_LOAD=position_from_params("Robot load", "ROBOT_LOAD", None, params),
112
+ LARGE=position_from_params(
113
+ "Large", AperturePositionGDANames.LARGE_APERTURE, 100, params
114
+ ),
115
+ MEDIUM=position_from_params(
116
+ "Medium", AperturePositionGDANames.MEDIUM_APERTURE, 50, params
117
+ ),
118
+ SMALL=position_from_params(
119
+ "Small", AperturePositionGDANames.SMALL_APERTURE, 20, params
120
+ ),
121
+ ROBOT_LOAD=position_from_params(
122
+ "Robot load", AperturePositionGDANames.ROBOT_LOAD, None, params
123
+ ),
100
124
  tolerances=tolerances_from_params(params),
101
125
  )
102
126
 
127
+ def get_position_from_gda_aperture_name(
128
+ self, gda_aperture_name: AperturePositionGDANames
129
+ ) -> SingleAperturePosition:
130
+ apertures = [ap for ap in self.as_list() if ap.GDA_name == gda_aperture_name]
131
+ if not apertures:
132
+ raise ValueError(
133
+ f"Tried to convert unknown aperture name {gda_aperture_name} to a SingleAperturePosition"
134
+ )
135
+ else:
136
+ return apertures[0]
137
+
103
138
  def as_list(self) -> list[SingleAperturePosition]:
104
139
  return [
105
140
  self.LARGE,
@@ -1,20 +1,36 @@
1
- from ophyd import Component, Device, EpicsSignal, StatusBase
1
+ from enum import Enum
2
2
 
3
+ from ophyd_async.core import AsyncStatus, StandardReadable
4
+ from ophyd_async.epics.signal import epics_signal_rw
5
+
6
+
7
+ class BacklightPower(str, Enum):
8
+ ON = "On"
9
+ OFF = "Off"
3
10
 
4
- class Backlight(Device):
5
- """Simple device to trigger the pneumatic in/out."""
6
11
 
7
- OUT = 0
8
- IN = 1
12
+ class BacklightPosition(str, Enum):
13
+ IN = "In"
14
+ OUT = "Out"
15
+
16
+
17
+ class Backlight(StandardReadable):
18
+ """Simple device to trigger the pneumatic in/out."""
9
19
 
10
- pos = Component(EpicsSignal, "-EA-BL-01:CTRL")
11
- # Toggle to switch it On or Off
12
- toggle = Component(EpicsSignal, "-EA-BLIT-01:TOGGLE")
20
+ def __init__(self, prefix: str, name: str = "") -> None:
21
+ with self.add_children_as_readables():
22
+ self.power = epics_signal_rw(BacklightPower, prefix + "-EA-BLIT-01:TOGGLE")
23
+ self.position = epics_signal_rw(
24
+ BacklightPosition, prefix + "-EA-BL-01:CTRL"
25
+ )
26
+ super().__init__(name)
13
27
 
14
- def set(self, position: int) -> StatusBase:
15
- status = self.pos.set(position)
16
- if position == self.OUT:
17
- status &= self.toggle.set("Off")
28
+ @AsyncStatus.wrap
29
+ async def set(self, position: BacklightPosition):
30
+ """This setter will turn the backlight on when we move it in to the beam and off
31
+ when we move it out."""
32
+ await self.position.set(position)
33
+ if position == BacklightPosition.OUT:
34
+ await self.power.set(BacklightPower.OFF)
18
35
  else:
19
- status &= self.toggle.set("On")
20
- return status
36
+ await self.power.set(BacklightPower.ON)