dls-dodal 1.45.0__py3-none-any.whl → 1.46.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.4
2
2
  Name: dls-dodal
3
- Version: 1.45.0
3
+ Version: 1.46.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
@@ -216,7 +216,7 @@ Description-Content-Type: text/markdown
216
216
  License-File: LICENSE
217
217
  Requires-Dist: click
218
218
  Requires-Dist: ophyd
219
- Requires-Dist: ophyd-async>=0.10.0a1
219
+ Requires-Dist: ophyd-async>=0.10.0a3
220
220
  Requires-Dist: bluesky
221
221
  Requires-Dist: pyepics
222
222
  Requires-Dist: dataclasses-json
@@ -1,7 +1,7 @@
1
- dls_dodal-1.45.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1
+ dls_dodal-1.46.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
2
2
  dodal/__init__.py,sha256=Ksms_WJF8LTkbm38gEpm1jBpGqcQ8NGvmb2ZJlOE1j8,198
3
3
  dodal/__main__.py,sha256=kP2S2RPitnOWpNGokjZ1Yq-1umOtp5sNOZk2B3tBPLM,111
4
- dodal/_version.py,sha256=-lvg1BmUOhOAxrHg12BxBARo342x9HFCl64fpGxLs6c,513
4
+ dodal/_version.py,sha256=rx9X6grU4HKVMuiliyERGBbevIYUheRbfXNhHBtDkEw,513
5
5
  dodal/cli.py,sha256=NieWNUgLUxyck1rHoFAPJjX1xXLzHNdQ-s4wvxYFfps,3757
6
6
  dodal/log.py,sha256=ry8WMq1S4WMIAPqtqGeKuegMRN7Jy3qdVTJlkpKXkL8,9503
7
7
  dodal/utils.py,sha256=rqQNalufZPxUPSD2SYuUgWSCpefb8FnqvR6N0t-YcEY,19675
@@ -15,21 +15,21 @@ dodal/beamlines/b01_1.py,sha256=hHv9YJtUVmxAQ0UqF00-9wUYC_OtNo9awd04RM8b_HI,1993
15
15
  dodal/beamlines/b07.py,sha256=OM_zdHeFO49IITT9fFHB3aOW-gDtmZTm0zrSauphQbo,799
16
16
  dodal/beamlines/b07_1.py,sha256=o82BW38oNH8TLTscMgQYBSNOnvAiW8B9Z9DybDbvJ_k,763
17
17
  dodal/beamlines/i02_1.py,sha256=d2IyqFMgeaSEyZYm7GMSjTKr7_02SakyC_oARx-XwnY,1204
18
- dodal/beamlines/i03.py,sha256=MS91uQArCsvg92eX_AR_DsUiRPQtnKkMgKV4ca1fosw,15259
19
- dodal/beamlines/i04.py,sha256=V0fgXfEJnkh0spDXelK6zwjFChN6VaV9_CtrxJLZx2E,12100
18
+ dodal/beamlines/i03.py,sha256=Rm1F1bR2M1SBZhWpVkhJ5_wrn8XSvEp23mKgo_LDviA,15279
19
+ dodal/beamlines/i04.py,sha256=GHLjQWDt4zBweVd1viTz754RzMZFll8huagFmLeHeH0,12104
20
20
  dodal/beamlines/i09.py,sha256=DTmgtjUbzFZT3vrFLnPJhFb5h6U1YEXuNewucAAGgZ8,765
21
21
  dodal/beamlines/i09_1.py,sha256=pxgkcKBvetwVxXAm1KmlzBiK45GDdE30eO971w9zzoI,763
22
22
  dodal/beamlines/i10.py,sha256=k8tnUwAb6jX2xY8hgST3ZP4jX3s4I4ispL5M6HF-M5k,11221
23
23
  dodal/beamlines/i13_1.py,sha256=RF8AXBqVKPY7rVf4j1gOxcURAToYVk-Yo9t4FWyaphU,1650
24
- dodal/beamlines/i18.py,sha256=Y5qLniqUkbYHcGGLPdBbiMILQHonPT2oz5M1hKMGqzs,3434
24
+ dodal/beamlines/i18.py,sha256=1BL5QA744ZGuCc2IXdsy_ZD2UV9SVXlUYAiMtpy0YNk,3656
25
25
  dodal/beamlines/i19_1.py,sha256=3mxRQzMQrg2ppMN19EKqEV0bMs5pNtorQYgkBBWRPks,2838
26
26
  dodal/beamlines/i19_2.py,sha256=zairZIPj1mrs9-dG19CjdMEFeqztGmlyeBmIxj7Kl5I,2329
27
27
  dodal/beamlines/i19_optics.py,sha256=RztOdru0lvPXpaIXSUfzSsPVIuwAMKZsEA8vJFU4_Mk,1184
28
28
  dodal/beamlines/i20_1.py,sha256=Xp6XXofjXh3Yibrg5wSHet-pXikprJ9oprEhJg19OkI,1825
29
- dodal/beamlines/i22.py,sha256=XCAVBkZxN9cmxfpGoWaCvo77lu8hVIJ_e3BUc_qxdu0,7664
30
- dodal/beamlines/i23.py,sha256=JI9p3IJZ4t5QdpR5TCzPO1_z5kRd09OhosgFveFMsbg,1183
29
+ dodal/beamlines/i22.py,sha256=GAS1KgRrtpdXhYb7tIO3yHHMRcffxOqcSIaCZyexnDk,7595
30
+ dodal/beamlines/i23.py,sha256=7NSbJDKPcw3O2oRs5oCsy2PbV4XaJAeReJuLoUqgPsI,2648
31
31
  dodal/beamlines/i24.py,sha256=9rBQMCWGdKiRnFbcVvmjiBWiC9WJIJCtLh5m6LkHUtU,7096
32
- dodal/beamlines/p38.py,sha256=MwxBqYe_rUIj-MCRIFZpHJmR0JtA22bSFKfBpoDI9P0,5777
32
+ dodal/beamlines/p38.py,sha256=8rtf0a2UZJ0DKRXuSmQngae_iSIK_eJ4MhLGtatA_J0,5708
33
33
  dodal/beamlines/p45.py,sha256=2snO895TGwf4LbNIvg4BkvAGSfvZcevdpv_82MRpXKo,2129
34
34
  dodal/beamlines/p60.py,sha256=ybZwKvtsUoQvRwkSZvlK9I2PfAUI72JL3syCpt79O0k,674
35
35
  dodal/beamlines/p99.py,sha256=k24QhYpoOHBd0188Fu3wvmpT6dsu8okiIVqVVckdBkw,1063
@@ -45,7 +45,7 @@ dodal/common/udc_directory_provider.py,sha256=v5OBaCUwjtQZAsRQUw6LlVL58UvwwDO1l2
45
45
  dodal/common/visit.py,sha256=BLpr3GrP7Ij95V135hRJLgg7gWtBKXVxyOibWtcO8RE,5782
46
46
  dodal/common/beamlines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
47
  dodal/common/beamlines/beamline_parameters.py,sha256=oIPHooqu5vTAwfqZutsKbzwdi9nvFF8568Mz7jrK5rI,3618
48
- dodal/common/beamlines/beamline_utils.py,sha256=s_9A0woipsS8wEsn4FdaKppKAKEYKbSfL6XGpfKosLI,4977
48
+ dodal/common/beamlines/beamline_utils.py,sha256=uy-HWchyUwoIqYYUWAd4BOPPoDzqvvtgkWQGzuKStTg,5061
49
49
  dodal/common/beamlines/device_helpers.py,sha256=lh7eih7KoFiqxo8PLQIDjbpBbhHuAXSeApt7K3KF9to,1002
50
50
  dodal/devices/CTAB.py,sha256=5_261Ox6NG2cJIzzwnjWz289BG0nZoE0wKOaI5V5jqM,1998
51
51
  dodal/devices/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -56,8 +56,8 @@ dodal/devices/apple2_undulator.py,sha256=R4KDgA4HcFj9zg1rPAEP9E0mKVzE06bhyxNRUrs
56
56
  dodal/devices/backlight.py,sha256=RcgeA1hE3Z_5jA-jH8S8uLMpBfZjenRLz1lx6HTYeAo,1653
57
57
  dodal/devices/baton.py,sha256=BnakfZxx3cIIX6Kxj8-abxn8Z9LaQODhcPbStbD0as4,485
58
58
  dodal/devices/bimorph_mirror.py,sha256=D5PkrOggJRVAnv38lTdy8rErKLu_O2juLEvSqwcotxY,4825
59
+ dodal/devices/common_dcm.py,sha256=8QSRE6Z10RQjfL3g4JZhyHRNI_aCKxWlzKSsDgiJHhE,3049
59
60
  dodal/devices/cryostream.py,sha256=K-ldpredpeDTzNt4qtQMg99nKJNjBYoXBbK0WJGexzw,656
60
- dodal/devices/dcm.py,sha256=JbyxLnrS68nnnv39l9XEWgJgXUBqxX6aFo19MZnL36E,2574
61
61
  dodal/devices/diamond_filter.py,sha256=A--RHd7WuH-IBhvCyENcRCTP4K-mm_Kqpa0pojpHZow,1098
62
62
  dodal/devices/eiger.py,sha256=RN3klVASvdTT_jer2HJHUCZWZBKoOUQQdTpsKdgTPfo,15836
63
63
  dodal/devices/eiger_odin.py,sha256=ytUH_18YuM1nJDhplS6OTdtADloYvHpO6ppENjVd4jU,7411
@@ -82,11 +82,10 @@ dodal/devices/slits.py,sha256=b_7ku2sHlzhMHTvWrwiRwee6ufrbxNX9JB_Z0lvk15o,1105
82
82
  dodal/devices/smargon.py,sha256=tOHb9fjI8ZCIrboiC4OzS2j1QJDOKkAlQ2SORbBmaGo,4708
83
83
  dodal/devices/status.py,sha256=hVrJS1yooQo6PRumRACoIEh-SKBUKxvBlQl-MtLFUMQ,327
84
84
  dodal/devices/synchrotron.py,sha256=wLfClZ1lYQWA_D--UsM3NnKLG8bY8mvVsRYER6ob-Ew,2026
85
- dodal/devices/tetramm.py,sha256=1lNXtWlmq0Pc_gVGD77XrV3ECe38TornDJUXkq3H1i0,8524
85
+ dodal/devices/tetramm.py,sha256=i2akuxU9olINFZfEnQALTZQX2uXq3w9JmdD6_rN4CJs,8528
86
86
  dodal/devices/thawer.py,sha256=mYrO9klUPYcSbpoUuJ4ZuZZEPcHWWaZ2px5jh8XNQ9Y,1675
87
- dodal/devices/turbo_slit.py,sha256=-WaiXziJ3TBaOOiVqtGeUk8CI3HSsCWoPDtEIhCPLug,1421
87
+ dodal/devices/turbo_slit.py,sha256=xhcnhfbdcTYSYozogw6Li4fF4ofoPsc350rEyrRdaNE,1460
88
88
  dodal/devices/undulator.py,sha256=ZCdMQ8PKnW7mFV1BmrprOt0aSBCZMSKAH-2yyVH5Ihk,5316
89
- dodal/devices/undulator_dcm.py,sha256=olg8FrIKWqGmhJMuzuvJXH-LQTGhKytvXHPso3Br7C0,2398
90
89
  dodal/devices/watsonmarlow323_pump.py,sha256=rwU94YE6esgGLYdh-pe8nBo_3tvgp6brrrbPDrqp5_M,1406
91
90
  dodal/devices/webcam.py,sha256=mef075ynDbzZ4pNAjfxR_9tdTTqF_rM7hAOVEEOV-Do,2408
92
91
  dodal/devices/xbpm_feedback.py,sha256=j8MHhhE0feoe6R54zPKqS5EbQ0bEDR-nOpLHzHhnHHQ,1156
@@ -117,6 +116,8 @@ dodal/devices/electron_analyser/vgscienta_analyser_io.py,sha256=q1L8G_JTjjUxfW-r
117
116
  dodal/devices/electron_analyser/vgscienta_region.py,sha256=GYGvsvpMulwpMc-EVQEh4ZW7M3c35oz1_waXvyZRln8,2543
118
117
  dodal/devices/i03/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
118
  dodal/devices/i03/beamstop.py,sha256=sJ2i9yEgaKPIbv23NNhUDTTIKIPN9MNfmwt2XqjBT1E,2806
119
+ dodal/devices/i03/dcm.py,sha256=zDcgxOdMRVOQZBGDsLaIlr7o4UJIK2vehPWHxAxt6VA,2268
120
+ dodal/devices/i03/undulator_dcm.py,sha256=c5H-17Dpt3pIMAlU9fHCnU59lYDnmgKk3qE2qR9gg44,2594
120
121
  dodal/devices/i04/transfocator.py,sha256=sVI4Bgv-2-DH4-F1nIXMp5Aktevrm3agZnCA-WgjmW8,3780
121
122
  dodal/devices/i10/diagnostics.py,sha256=TYqVtrCtf-IG-1e02D2nfq1R8jcYnaX1npKxqieLRDc,7018
122
123
  dodal/devices/i10/i10_apple2.py,sha256=ErObNNE59NuYssde6ojWJb8wo3SVohkQsvK0Bjnf1T8,13192
@@ -127,8 +128,8 @@ dodal/devices/i10/rasor/rasor_current_amp.py,sha256=hImaPI3veKiS5YVfYwv-qrQ1AYNB
127
128
  dodal/devices/i10/rasor/rasor_motors.py,sha256=0w31rKDuzRL-9tGbLDj0JZljaDjfXvKHQyzMs6fc3sw,1653
128
129
  dodal/devices/i10/rasor/rasor_scaler_cards.py,sha256=sfWJKNx6pq342PEAlmg_Yt_Tijq7mO1XFjcCDtToQiU,467
129
130
  dodal/devices/i13_1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
- dodal/devices/i13_1/merlin.py,sha256=ML-AzjvvO0kgpVv1vaG2hyVwrkfXeysF-mTvj7h8AoI,1015
131
- dodal/devices/i13_1/merlin_controller.py,sha256=FwKVesrDostoKGRJYTxvcfR1Bo16KtEeFXQgMVLNwvA,1452
131
+ dodal/devices/i13_1/merlin.py,sha256=mgTFSMJftRzLL-HXAUuJkOYxtyA3Rp8YX0L46JCb30Y,1019
132
+ dodal/devices/i13_1/merlin_controller.py,sha256=XkY8E3UkSzZb9Pw_Ic4bv1DYJvBVADS_3okjHvY4nH4,1453
132
133
  dodal/devices/i18/KBMirror.py,sha256=W4R3TeulSjosUqAFIIznyWzje_Y2AoEf9f8N-NkisYM,710
133
134
  dodal/devices/i18/diode.py,sha256=q8ddVYT7yDXwURzxw5gfXlGT1tFirNfHBmiKnpvvXHk,406
134
135
  dodal/devices/i18/table.py,sha256=f6OtVSqCFIpXyoHX97CPLpaVDVXUNc2EvgSFP3qVFKo,446
@@ -139,14 +140,14 @@ dodal/devices/i19/blueapi_device.py,sha256=Tsl4vsREz7FM2d-kKJK-9tGrYbyKq4SLxnMlE
139
140
  dodal/devices/i19/hutch_access.py,sha256=hnClUWCL1qTYzuBMmhXX85jiNak7mbYfyHEh54tZ27U,377
140
141
  dodal/devices/i19/shutter.py,sha256=Z3_UO3TmSczJrB8AcU5ohk8WlDN04a00XhSyDLAHvbc,1815
141
142
  dodal/devices/i20_1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
- dodal/devices/i22/dcm.py,sha256=SQDh-Sj1OvplHZ9yTWblJwv8PJrUqxseDPupZOWmcLo,4701
143
+ dodal/devices/i22/dcm.py,sha256=IbK56lSvX3PZlYKVeH7mIbRK83-mhJEIoTn1zjQfScE,4494
143
144
  dodal/devices/i22/fswitch.py,sha256=LSMoo9aDkH0SLcojbUh2NxTWIpUXHZxauTqThc3XtSk,3073
144
145
  dodal/devices/i22/nxsas.py,sha256=lFB_h6ns6yETPFZjDghOMZLg16nDnWveMOJV34TDSYk,5994
145
146
  dodal/devices/i24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
147
  dodal/devices/i24/aperture.py,sha256=XlnOyQsvdTom1dJHVUg8CUSthq3jlBlZFOUaa9b1eZ4,837
147
148
  dodal/devices/i24/beam_center.py,sha256=m6LWsG9e_lhtPfZ8pc_hoLNyTYQQGGdRNav8J_2scTo,483
148
149
  dodal/devices/i24/beamstop.py,sha256=89ncXUisia1rn1Faf5iWg3k0QW6Rm99j1vq9A8l9Xv8,1221
149
- dodal/devices/i24/dcm.py,sha256=Q3qqlgsiLJga2cgI8L4jczjyUgQixJh6QWg7shrFpTQ,1988
150
+ dodal/devices/i24/dcm.py,sha256=9eNCGq-lpyFAftLxLxlhG_enzVmrx1nbwMxGFP_UBvU,1354
150
151
  dodal/devices/i24/dual_backlight.py,sha256=CbQ9mYUNhhozVdNXqR5ac73tEIAWT2RnEpRwXB3EFog,2049
151
152
  dodal/devices/i24/focus_mirrors.py,sha256=vkDUxnvGG3vqrsDR90YM84U8_fPUesmiD5XE1Fb4k2c,1863
152
153
  dodal/devices/i24/i24_detector_motion.py,sha256=_HgdsZqFYY0tKqUgMzViHaPEUFXL3WlXXioGvDehRUw,364
@@ -178,7 +179,7 @@ dodal/devices/util/test_utils.py,sha256=KEYkqyZrAyju438VCbtQ0Ujv-9GBuIuVGCgggDHU
178
179
  dodal/devices/xspress3/xspress3.py,sha256=75RdPuHpES4Xi-Lcywz0XUhaN2G3vZSoc-dzgcxfNvs,4636
179
180
  dodal/devices/xspress3/xspress3_channel.py,sha256=w8tAx2lz5kJ_LeJ_eb_4o--Dtt8MRijsYNgDG6oEIVg,1626
180
181
  dodal/devices/zebra/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
181
- dodal/devices/zebra/zebra.py,sha256=UPryxnhvEb9Y2hefYWbTZShmVKULghftHyO1LVJRLpI,9248
182
+ dodal/devices/zebra/zebra.py,sha256=PpgGVrtb7t5QTNchEalSG3bPeOqf6tPzOUHoOyARWLY,9290
182
183
  dodal/devices/zebra/zebra_constants_mapping.py,sha256=DCWMvBFvmN90rBpZ4aOVF_hbKm4K6QWubsG811R-MK8,4170
183
184
  dodal/devices/zebra/zebra_controlled_shutter.py,sha256=tcBq2WQxST9g2VrjVWu-tOomFX-zGLHLNDhYhL0DtHc,1871
184
185
  dodal/devices/zocalo/__init__.py,sha256=dRAZ9o7B9TACqyE7aanT3yzvqWtt019YgV5ZJY7Ylso,517
@@ -188,7 +189,7 @@ dodal/devices/zocalo/zocalo_results.py,sha256=cmKlgu-42CAu2X2aIgjxmfdUXypF4RHRNR
188
189
  dodal/parameters/experiment_parameter_base.py,sha256=O7JamfuJ5cYHkPf9tsHJPqn-OMHTAGouigvM1cDFehE,313
189
190
  dodal/plan_stubs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
190
191
  dodal/plan_stubs/check_topup.py,sha256=3gyLHfHNQBCgEWuAg4QE-ONx7y2Do1vVv5HP8ss0Z1I,5371
191
- dodal/plan_stubs/data_session.py,sha256=PsRrGceZg7M5LkjQZ8DD2FlSX1fmoyhMPgLDXTEX3m4,1873
192
+ dodal/plan_stubs/data_session.py,sha256=Syc6XKaN1usf7bNWOez8_vAH3byrcROqskmBrSUWa4Y,2132
192
193
  dodal/plan_stubs/motor_utils.py,sha256=Mf8utOA_xmxUa2dLmQ1uRkdfyDTip7D8YcKeCBCQLUQ,4458
193
194
  dodal/plan_stubs/wrapped.py,sha256=kC8HH7bx3-sLYu2oieY_502tAdT2OECF8n-fqoL5Bfc,4266
194
195
  dodal/plan_stubs/electron_analyser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -196,12 +197,12 @@ dodal/plan_stubs/electron_analyser/configure_controller.py,sha256=wbQJc1Z0Vlzc5d
196
197
  dodal/plans/__init__.py,sha256=nH1jNxw3DzDMg9O8Uda0kqKIalRVEWBrq07OLY6Ey38,93
197
198
  dodal/plans/save_panda.py,sha256=1fumH7Ih8uDIv8ahAtgQ_vUuR3dz0sfUs4n9TEtEbSs,3053
198
199
  dodal/plans/scanspec.py,sha256=Q0AcvTKRT401iGMRDSqK-D523UX5_ofiVMZ_rNXKOx8,2074
199
- dodal/plans/verify_undulator_gap.py,sha256=mq2fHtc5o5rSgdTM2xhULOImfjwa6x29tPpeoLw4GcU,553
200
+ dodal/plans/verify_undulator_gap.py,sha256=OcDN09-eCoMzsmhKGxvzsH5EapG2zYz0yGCqUtQxLSc,568
200
201
  dodal/plans/wrapped.py,sha256=BPMw__RcWvk9v5XnhMsi9_k4KsDEbmXogzD2n1ecbUg,2098
201
202
  dodal/plans/preprocessors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
202
203
  dodal/plans/preprocessors/verify_undulator_gap.py,sha256=cBZEGq8TW1jrXFXB00iClQVXSEaE_jP_rHMY9WTgYyY,1813
203
- dls_dodal-1.45.0.dist-info/METADATA,sha256=I98zoUjSqxwMan-nd3YqR1yVzZXgKv8nixs6txVNz1E,16806
204
- dls_dodal-1.45.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
205
- dls_dodal-1.45.0.dist-info/entry_points.txt,sha256=bycw_EKUzup_rxfCetOwcauXV4kLln_OPpPT8jEnr-I,94
206
- dls_dodal-1.45.0.dist-info/top_level.txt,sha256=xIozdmZk_wmMV4wugpq9-6eZs0vgADNUKz3j2UAwlhc,6
207
- dls_dodal-1.45.0.dist-info/RECORD,,
204
+ dls_dodal-1.46.0.dist-info/METADATA,sha256=pRapE3URGvj3ihEkVa3VeglDUl2kXjmyhIdDGeUlqb0,16806
205
+ dls_dodal-1.46.0.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
206
+ dls_dodal-1.46.0.dist-info/entry_points.txt,sha256=bycw_EKUzup_rxfCetOwcauXV4kLln_OPpPT8jEnr-I,94
207
+ dls_dodal-1.46.0.dist-info/top_level.txt,sha256=xIozdmZk_wmMV4wugpq9-6eZs0vgADNUKz3j2UAwlhc,6
208
+ dls_dodal-1.46.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (79.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
dodal/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.45.0'
21
- __version_tuple__ = version_tuple = (1, 45, 0)
20
+ __version__ = version = '1.46.0'
21
+ __version_tuple__ = version_tuple = (1, 46, 0)
dodal/beamlines/i03.py CHANGED
@@ -18,7 +18,6 @@ from dodal.devices.attenuator.attenuator import BinaryFilterAttenuator
18
18
  from dodal.devices.backlight import Backlight
19
19
  from dodal.devices.baton import Baton
20
20
  from dodal.devices.cryostream import CryoStream
21
- from dodal.devices.dcm import DCM
22
21
  from dodal.devices.detector.detector_motion import DetectorMotion
23
22
  from dodal.devices.diamond_filter import DiamondFilter, I03Filters
24
23
  from dodal.devices.eiger import EigerDetector
@@ -26,6 +25,8 @@ from dodal.devices.fast_grid_scan import PandAFastGridScan, ZebraFastGridScan
26
25
  from dodal.devices.flux import Flux
27
26
  from dodal.devices.focusing_mirror import FocusingMirrorWithStripes, MirrorVoltages
28
27
  from dodal.devices.i03.beamstop import Beamstop
28
+ from dodal.devices.i03.dcm import DCM
29
+ from dodal.devices.i03.undulator_dcm import UndulatorDCM
29
30
  from dodal.devices.motors import XYZPositioner
30
31
  from dodal.devices.oav.oav_detector import OAV
31
32
  from dodal.devices.oav.oav_parameters import OAVConfig
@@ -37,7 +38,6 @@ from dodal.devices.smargon import Smargon
37
38
  from dodal.devices.synchrotron import Synchrotron
38
39
  from dodal.devices.thawer import Thawer
39
40
  from dodal.devices.undulator import Undulator
40
- from dodal.devices.undulator_dcm import UndulatorDCM
41
41
  from dodal.devices.webcam import Webcam
42
42
  from dodal.devices.xbpm_feedback import XBPMFeedback
43
43
  from dodal.devices.xspress3.xspress3 import Xspress3
@@ -113,8 +113,8 @@ def dcm() -> DCM:
113
113
  If this is called when already instantiated in i03, it will return the existing object.
114
114
  """
115
115
  return DCM(
116
- f"{PREFIX.beamline_prefix}-MO-DCM-01:",
117
- "dcm",
116
+ prefix=f"{PREFIX.beamline_prefix}-MO-DCM-01:",
117
+ name="dcm",
118
118
  )
119
119
 
120
120
 
dodal/beamlines/i04.py CHANGED
@@ -10,13 +10,13 @@ from dodal.devices.aperturescatterguard import (
10
10
  )
11
11
  from dodal.devices.attenuator.attenuator import BinaryFilterAttenuator
12
12
  from dodal.devices.backlight import Backlight
13
- from dodal.devices.dcm import DCM
14
13
  from dodal.devices.detector import DetectorParams
15
14
  from dodal.devices.detector.detector_motion import DetectorMotion
16
15
  from dodal.devices.diamond_filter import DiamondFilter, I04Filters
17
16
  from dodal.devices.eiger import EigerDetector
18
17
  from dodal.devices.fast_grid_scan import ZebraFastGridScan
19
18
  from dodal.devices.flux import Flux
19
+ from dodal.devices.i03.dcm import DCM
20
20
  from dodal.devices.i04.transfocator import Transfocator
21
21
  from dodal.devices.ipin import IPin
22
22
  from dodal.devices.motors import XYZPositioner
dodal/beamlines/i18.py CHANGED
@@ -12,7 +12,7 @@ from dodal.common.visit import (
12
12
  LocalDirectoryServiceClient,
13
13
  StaticVisitPathProvider,
14
14
  )
15
- from dodal.devices.dcm import DCM
15
+ from dodal.devices.common_dcm import BaseDCM, PitchAndRollCrystal, RollCrystal
16
16
  from dodal.devices.i18.diode import Diode
17
17
  from dodal.devices.i18.KBMirror import KBMirror
18
18
  from dodal.devices.i18.table import Table
@@ -54,12 +54,15 @@ def undulator() -> Undulator:
54
54
  return Undulator(f"{PREFIX.insertion_prefix}-MO-SERVC-01:")
55
55
 
56
56
 
57
- @device_factory()
58
- def dcm() -> DCM:
57
+ # See https://github.com/DiamondLightSource/dodal/issues/1180
58
+ @device_factory(skip=True)
59
+ def dcm() -> BaseDCM[RollCrystal, PitchAndRollCrystal]:
59
60
  # once spacing is added Si111 d-spacing is 3.135 angsterm , and Si311 is 1.637
60
61
  # calculations are in gda/config/lookupTables/Si111/eV_Deg_converter.xml
61
- return DCM(
62
+ return BaseDCM(
62
63
  prefix=f"{PREFIX.beamline_prefix}-MO-DCM-01:",
64
+ xtal_1=RollCrystal,
65
+ xtal_2=PitchAndRollCrystal,
63
66
  )
64
67
 
65
68
 
dodal/beamlines/i22.py CHANGED
@@ -18,7 +18,7 @@ from dodal.common.crystal_metadata import (
18
18
  from dodal.common.visit import RemoteDirectoryServiceClient, StaticVisitPathProvider
19
19
  from dodal.devices.bimorph_mirror import BimorphMirror
20
20
  from dodal.devices.focusing_mirror import FocusingMirror
21
- from dodal.devices.i22.dcm import DoubleCrystalMonochromator
21
+ from dodal.devices.i22.dcm import DCM
22
22
  from dodal.devices.i22.fswitch import FSwitch
23
23
  from dodal.devices.i22.nxsas import NXSasMetadataHolder, NXSasOAV, NXSasPilatus
24
24
  from dodal.devices.linkam3 import Linkam3
@@ -141,8 +141,8 @@ def bimorph_vfm() -> BimorphMirror:
141
141
 
142
142
 
143
143
  @device_factory()
144
- def dcm() -> DoubleCrystalMonochromator:
145
- return DoubleCrystalMonochromator(
144
+ def dcm() -> DCM:
145
+ return DCM(
146
146
  prefix=f"{PREFIX.beamline_prefix}-MO-DCM-01:",
147
147
  temperature_prefix=f"{PREFIX.beamline_prefix}-DI-DCM-01:",
148
148
  crystal_1_metadata=make_crystal_metadata_from_material(
dodal/beamlines/i23.py CHANGED
@@ -1,7 +1,24 @@
1
- from dodal.common.beamlines.beamline_utils import device_factory
1
+ from pathlib import Path
2
+
3
+ from ophyd_async.epics.adpilatus import PilatusDetector
4
+
5
+ from dodal.common.beamlines.beamline_utils import (
6
+ device_factory,
7
+ get_path_provider,
8
+ set_path_provider,
9
+ )
2
10
  from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
11
+ from dodal.common.beamlines.device_helpers import HDF5_SUFFIX
12
+ from dodal.common.visit import LocalDirectoryServiceClient, StaticVisitPathProvider
3
13
  from dodal.devices.motors import SixAxisGonio
4
14
  from dodal.devices.oav.pin_image_recognition import PinTipDetection
15
+ from dodal.devices.zebra.zebra import Zebra
16
+ from dodal.devices.zebra.zebra_constants_mapping import (
17
+ ZebraMapping,
18
+ ZebraSources,
19
+ ZebraTTLOutputs,
20
+ )
21
+ from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter
5
22
  from dodal.log import set_beamline as set_log_beamline
6
23
  from dodal.utils import BeamlinePrefix, get_beamline_name, get_hostname
7
24
 
@@ -9,8 +26,22 @@ BL = get_beamline_name("i23")
9
26
  set_log_beamline(BL)
10
27
  set_utils_beamline(BL)
11
28
 
29
+ set_path_provider(
30
+ StaticVisitPathProvider(
31
+ BL,
32
+ Path("/tmp"),
33
+ client=LocalDirectoryServiceClient(),
34
+ )
35
+ )
36
+
12
37
  PREFIX = BeamlinePrefix(BL)
13
38
 
39
+ I23_ZEBRA_MAPPING = ZebraMapping(
40
+ outputs=ZebraTTLOutputs(TTL_DETECTOR=1, TTL_SHUTTER=4),
41
+ sources=ZebraSources(),
42
+ AND_GATE_FOR_AUTO_SHUTTER=2,
43
+ )
44
+
14
45
 
15
46
  def _is_i23_machine():
16
47
  """
@@ -23,7 +54,7 @@ def _is_i23_machine():
23
54
 
24
55
  @device_factory(skip=lambda: not _is_i23_machine())
25
56
  def oav_pin_tip_detection() -> PinTipDetection:
26
- """Get the i23 OAV pin-tip detection device"""
57
+ """Get the i23 OAV pin-tip detection device."""
27
58
 
28
59
  return PinTipDetection(
29
60
  f"{PREFIX.beamline_prefix}-DI-OAV-01:",
@@ -31,10 +62,34 @@ def oav_pin_tip_detection() -> PinTipDetection:
31
62
  )
32
63
 
33
64
 
65
+ @device_factory()
66
+ def shutter() -> ZebraShutter:
67
+ """Get the i23 zebra controlled shutter."""
68
+ return ZebraShutter(f"{PREFIX.beamline_prefix}-EA-SHTR-01:", "shutter")
69
+
70
+
34
71
  @device_factory()
35
72
  def gonio() -> SixAxisGonio:
36
73
  """Get the i23 goniometer"""
74
+ return SixAxisGonio(f"{PREFIX.beamline_prefix}-MO-GONIO-01:")
75
+
37
76
 
38
- return SixAxisGonio(
39
- f"{PREFIX.beamline_prefix}-MO-GONIO-01:",
77
+ @device_factory()
78
+ def zebra() -> Zebra:
79
+ """Get the i23 zebra"""
80
+ return Zebra(
81
+ name="zebra",
82
+ prefix=f"{PREFIX.beamline_prefix}-EA-ZEBRA-01:ZEBRA:",
83
+ mapping=I23_ZEBRA_MAPPING,
84
+ )
85
+
86
+
87
+ @device_factory()
88
+ def pilatus() -> PilatusDetector:
89
+ """Get the i23 pilatus"""
90
+ return PilatusDetector(
91
+ prefix=f"{PREFIX.beamline_prefix}-EA-PILAT-01:",
92
+ path_provider=get_path_provider(),
93
+ drv_suffix="cam1:",
94
+ fileio_suffix=HDF5_SUFFIX,
40
95
  )
dodal/beamlines/p38.py CHANGED
@@ -16,7 +16,7 @@ from dodal.common.crystal_metadata import (
16
16
  )
17
17
  from dodal.common.visit import LocalDirectoryServiceClient, StaticVisitPathProvider
18
18
  from dodal.devices.focusing_mirror import FocusingMirror
19
- from dodal.devices.i22.dcm import DoubleCrystalMonochromator
19
+ from dodal.devices.i22.dcm import DCM
20
20
  from dodal.devices.i22.fswitch import FSwitch
21
21
  from dodal.devices.linkam3 import Linkam3
22
22
  from dodal.devices.pressure_jump_cell import PressureJumpCell
@@ -143,8 +143,8 @@ def hfm() -> FocusingMirror:
143
143
 
144
144
 
145
145
  @device_factory(mock=True)
146
- def dcm() -> DoubleCrystalMonochromator:
147
- return DoubleCrystalMonochromator(
146
+ def dcm() -> DCM:
147
+ return DCM(
148
148
  temperature_prefix=f"{PREFIX.beamline_prefix}-DI-DCM-01:",
149
149
  crystal_1_metadata=make_crystal_metadata_from_material(
150
150
  MaterialsEnum.Si, (1, 1, 1)
@@ -162,3 +162,8 @@ def set_path_provider(provider: PathProvider):
162
162
 
163
163
  def get_path_provider() -> PathProvider:
164
164
  return PATH_PROVIDER
165
+
166
+
167
+ def clear_path_provider() -> None:
168
+ global PATH_PROVIDER
169
+ del PATH_PROVIDER
@@ -0,0 +1,77 @@
1
+ from typing import Generic, TypeVar
2
+
3
+ from ophyd_async.core import (
4
+ StandardReadable,
5
+ )
6
+ from ophyd_async.epics.core import epics_signal_r
7
+ from ophyd_async.epics.motor import Motor
8
+
9
+
10
+ class StationaryCrystal(StandardReadable):
11
+ def __init__(self, prefix):
12
+ super().__init__(prefix)
13
+
14
+
15
+ class RollCrystal(StationaryCrystal):
16
+ def __init__(self, prefix):
17
+ with self.add_children_as_readables():
18
+ self.roll_in_mrad = Motor(prefix + "ROLL")
19
+ super().__init__(prefix)
20
+
21
+
22
+ class PitchAndRollCrystal(StationaryCrystal):
23
+ def __init__(self, prefix):
24
+ with self.add_children_as_readables():
25
+ self.pitch_in_mrad = Motor(prefix + "PITCH")
26
+ self.roll_in_mrad = Motor(prefix + "ROLL")
27
+ super().__init__(prefix)
28
+
29
+
30
+ Xtal_1 = TypeVar("Xtal_1", bound=StationaryCrystal)
31
+ Xtal_2 = TypeVar("Xtal_2", bound=StationaryCrystal)
32
+
33
+
34
+ class BaseDCM(StandardReadable, Generic[Xtal_1, Xtal_2]):
35
+ """
36
+ Common device for the double crystal monochromator (DCM), used to select the energy of the beam.
37
+
38
+ Features common across all DCM's should include virtual motors to set energy/wavelength and contain two crystals,
39
+ each of which can be movable. Some DCM's contain crystals with roll motors, and some contain crystals with roll and pitch motors.
40
+ This base device accounts for all combinations of this.
41
+
42
+ This device should act as a parent for beamline-specific DCM's, in which any other missing signals can be added.
43
+
44
+ Bluesky plans using DCM's should be typed to specify which types of crystals are required. For example, a plan
45
+ which only requires one crystal which can roll should be typed 'def my_plan(dcm: BaseDCM[RollCrystal, StationaryCrystal])`
46
+ """
47
+
48
+ def __init__(
49
+ self, prefix: str, xtal_1: type[Xtal_1], xtal_2: type[Xtal_2], name: str = ""
50
+ ) -> None:
51
+ with self.add_children_as_readables():
52
+ # Virtual motor PV's which set the physical motors so that the DCM produces requested
53
+ # wavelength/energy
54
+ self.energy_in_kev = Motor(prefix + "ENERGY")
55
+ self.wavelength_in_a = Motor(prefix + "WAVELENGTH")
56
+
57
+ # Real motors
58
+ self.bragg_in_degrees = Motor(prefix + "BRAGG")
59
+ # Offset ensures that the beam exits the DCM at the same point, regardless of energy.
60
+ self.offset_in_mm = Motor(prefix + "OFFSET")
61
+
62
+ self.crystal_metadata_d_spacing_a = epics_signal_r(
63
+ float, prefix + "DSPACING:RBV"
64
+ )
65
+
66
+ self._make_crystals(prefix, xtal_1, xtal_2)
67
+
68
+ super().__init__(name)
69
+
70
+ # Prefix convention is different depending on whether there are one or two controllable crystals
71
+ def _make_crystals(self, prefix: str, xtal_1: type[Xtal_1], xtal_2: type[Xtal_2]):
72
+ if StationaryCrystal not in [xtal_1, xtal_2]:
73
+ self.xtal_1 = xtal_1(f"{prefix}XTAL1:")
74
+ self.xtal_2 = xtal_2(f"{prefix}XTAL2:")
75
+ else:
76
+ self.xtal_1 = xtal_1(prefix)
77
+ self.xtal_2 = xtal_2(prefix)
@@ -1,5 +1,5 @@
1
1
  import numpy as np
2
- from ophyd_async.core import Array1D, StandardReadable, soft_signal_r_and_setter
2
+ from ophyd_async.core import Array1D, soft_signal_r_and_setter
3
3
  from ophyd_async.epics.core import epics_signal_r
4
4
  from ophyd_async.epics.motor import Motor
5
5
 
@@ -8,9 +8,14 @@ from dodal.common.crystal_metadata import (
8
8
  MaterialsEnum,
9
9
  make_crystal_metadata_from_material,
10
10
  )
11
+ from dodal.devices.common_dcm import (
12
+ BaseDCM,
13
+ PitchAndRollCrystal,
14
+ StationaryCrystal,
15
+ )
11
16
 
12
17
 
13
- class DCM(StandardReadable):
18
+ class DCM(BaseDCM[PitchAndRollCrystal, StationaryCrystal]):
14
19
  """
15
20
  A double crystal monochromator (DCM), used to select the energy of the beam.
16
21
 
@@ -30,13 +35,7 @@ class DCM(StandardReadable):
30
35
  MaterialsEnum.Si, (1, 1, 1)
31
36
  )
32
37
  with self.add_children_as_readables():
33
- self.bragg_in_degrees = Motor(prefix + "BRAGG")
34
- self.roll_in_mrad = Motor(prefix + "ROLL")
35
- self.offset_in_mm = Motor(prefix + "OFFSET")
36
38
  self.perp_in_mm = Motor(prefix + "PERP")
37
- self.energy_in_kev = Motor(prefix + "ENERGY")
38
- self.pitch_in_mrad = Motor(prefix + "PITCH")
39
- self.wavelength = Motor(prefix + "WAVELENGTH")
40
39
 
41
40
  # temperatures
42
41
  self.xtal1_temp = epics_signal_r(float, prefix + "TEMP1")
@@ -58,7 +57,4 @@ class DCM(StandardReadable):
58
57
  Array1D[np.uint64],
59
58
  initial_value=reflection_array,
60
59
  )
61
- self.crystal_metadata_d_spacing = epics_signal_r(
62
- float, prefix + "DSPACING:RBV"
63
- )
64
- super().__init__(name)
60
+ super().__init__(prefix, PitchAndRollCrystal, StationaryCrystal, name)
@@ -4,10 +4,9 @@ from bluesky.protocols import Movable
4
4
  from ophyd_async.core import AsyncStatus, Reference, StandardReadable
5
5
 
6
6
  from dodal.common.beamlines.beamline_parameters import get_beamline_parameters
7
-
8
- from ..log import LOGGER
9
- from .dcm import DCM
10
- from .undulator import Undulator
7
+ from dodal.devices.i03.dcm import DCM
8
+ from dodal.devices.undulator import Undulator
9
+ from dodal.log import LOGGER
11
10
 
12
11
  ENERGY_TIMEOUT_S: float = 30.0
13
12
 
@@ -23,6 +22,9 @@ class UndulatorDCM(StandardReadable, Movable[float]):
23
22
  Calling unulator_dcm.set(energy) will move the DCM motor, perform a table lookup
24
23
  and move the Undulator gap motor if needed. So the set method can be thought of as
25
24
  a comprehensive way to set beam energy.
25
+
26
+ This class will be removed in the future. Use the separate Undulator and DCM devices
27
+ instead. See https://github.com/DiamondLightSource/dodal/issues/1092
26
28
  """
27
29
 
28
30
  def __init__(
@@ -23,10 +23,9 @@ class Merlin(StandardDetector):
23
23
  super().__init__(
24
24
  MerlinController(self.drv),
25
25
  adcore.ADHDFWriter(
26
- self.hdf,
27
- path_provider,
28
- lambda: self.name,
29
- adcore.ADBaseDatasetDescriber(self.drv),
26
+ fileio=self.hdf,
27
+ path_provider=path_provider,
28
+ dataset_describer=adcore.ADBaseDatasetDescriber(self.drv),
30
29
  ),
31
30
  config_sigs=(self.drv.acquire_period, self.drv.acquire_time),
32
31
  name=name,
@@ -37,7 +37,7 @@ class MerlinController(ADBaseController):
37
37
  DEFAULT_TIMEOUT + await self.driver.acquire_time.get_value()
38
38
  )
39
39
  await asyncio.gather(
40
- self.driver.num_images.set(trigger_info.total_number_of_triggers),
40
+ self.driver.num_images.set(trigger_info.total_number_of_exposures),
41
41
  self.driver.image_mode.set(ADImageMode.MULTIPLE),
42
42
  )
43
43
 
dodal/devices/i22/dcm.py CHANGED
@@ -5,7 +5,6 @@ from bluesky.protocols import Reading
5
5
  from event_model.documents.event_descriptor import DataKey
6
6
  from ophyd_async.core import (
7
7
  Array1D,
8
- StandardReadable,
9
8
  StandardReadableFormat,
10
9
  soft_signal_r_and_setter,
11
10
  )
@@ -13,13 +12,18 @@ from ophyd_async.epics.core import epics_signal_r
13
12
  from ophyd_async.epics.motor import Motor
14
13
 
15
14
  from dodal.common.crystal_metadata import CrystalMetadata
15
+ from dodal.devices.common_dcm import (
16
+ BaseDCM,
17
+ PitchAndRollCrystal,
18
+ RollCrystal,
19
+ )
16
20
 
17
21
  # Conversion constant for energy and wavelength, taken from the X-Ray data booklet
18
22
  # Converts between energy in KeV and wavelength in angstrom
19
23
  _CONVERSION_CONSTANT = 12.3984
20
24
 
21
25
 
22
- class DoubleCrystalMonochromator(StandardReadable):
26
+ class DCM(BaseDCM[RollCrystal, PitchAndRollCrystal]):
23
27
  """
24
28
  A double crystal monochromator (DCM), used to select the energy of the beam.
25
29
 
@@ -39,13 +43,7 @@ class DoubleCrystalMonochromator(StandardReadable):
39
43
  ) -> None:
40
44
  with self.add_children_as_readables():
41
45
  # Positionable Parameters
42
- self.bragg = Motor(prefix + "BRAGG")
43
- self.offset = Motor(prefix + "OFFSET")
44
46
  self.perp = Motor(prefix + "PERP")
45
- self.energy = Motor(prefix + "ENERGY")
46
- self.crystal_1_roll = Motor(prefix + "XTAL1:ROLL")
47
- self.crystal_2_roll = Motor(prefix + "XTAL2:ROLL")
48
- self.crystal_2_pitch = Motor(prefix + "XTAL2:PITCH")
49
47
 
50
48
  # Temperatures
51
49
  self.backplate_temp = epics_signal_r(float, temperature_prefix + "PT100-7")
@@ -93,12 +91,12 @@ class DoubleCrystalMonochromator(StandardReadable):
93
91
  units=crystal_2_metadata.d_spacing[1],
94
92
  )
95
93
 
96
- super().__init__(name)
94
+ super().__init__(prefix, RollCrystal, PitchAndRollCrystal, name)
97
95
 
98
96
  async def describe(self) -> dict[str, DataKey]:
99
97
  default_describe = await super().describe()
100
98
  return {
101
- f"{self.name}-wavelength": DataKey(
99
+ f"{self.name}-wavelength_in_a": DataKey(
102
100
  dtype="number",
103
101
  shape=[],
104
102
  source=self.name,
@@ -109,7 +107,7 @@ class DoubleCrystalMonochromator(StandardReadable):
109
107
 
110
108
  async def read(self) -> dict[str, Reading]:
111
109
  default_reading = await super().read()
112
- energy: float = default_reading[f"{self.name}-energy"]["value"]
110
+ energy: float = default_reading[f"{self.name}-energy_in_kev"]["value"]
113
111
  if energy > 0.0:
114
112
  wavelength = _CONVERSION_CONSTANT / energy
115
113
  else:
@@ -117,7 +115,7 @@ class DoubleCrystalMonochromator(StandardReadable):
117
115
 
118
116
  return {
119
117
  **default_reading,
120
- f"{self.name}-wavelength": Reading(
118
+ f"{self.name}-wavelength_in_a": Reading(
121
119
  value=wavelength,
122
120
  timestamp=time.time(),
123
121
  ),
dodal/devices/i24/dcm.py CHANGED
@@ -1,28 +1,19 @@
1
- from ophyd_async.core import StandardReadable
2
1
  from ophyd_async.epics.core import epics_signal_r
3
- from ophyd_async.epics.motor import Motor
4
2
 
3
+ from dodal.devices.common_dcm import (
4
+ BaseDCM,
5
+ PitchAndRollCrystal,
6
+ RollCrystal,
7
+ )
5
8
 
6
- class DCM(StandardReadable):
9
+
10
+ class DCM(BaseDCM[RollCrystal, PitchAndRollCrystal]):
7
11
  """
8
12
  A double crystal monocromator device, used to select the beam energy.
9
13
  """
10
14
 
11
15
  def __init__(self, prefix: str, name: str = "") -> None:
12
16
  with self.add_children_as_readables():
13
- # Motors
14
- self.bragg_in_degrees = Motor(prefix + "-MO-DCM-01:BRAGG")
15
- self.x_translation_in_mm = Motor(prefix + "-MO-DCM-01:X")
16
- self.offset_in_mm = Motor(prefix + "-MO-DCM-01:OFFSET")
17
- self.gap_in_mm = Motor(prefix + "-MO-DCM-01:GAP")
18
- self.energy_in_kev = Motor(prefix + "-MO-DCM-01:ENERGY")
19
- self.xtal1_roll = Motor(prefix + "-MO-DCM-01:XTAL1:ROLL")
20
- self.xtal2_roll = Motor(prefix + "-MO-DCM-01:XTAL2:ROLL")
21
- self.xtal2_pitch = Motor(prefix + "-MO-DCM-01:XTAL2:PITCH")
22
-
23
- # Wavelength is calculated in epics from the energy
24
- self.wavelength_in_a = epics_signal_r(float, prefix + "-MO-DCM-01:LAMBDA")
25
-
26
17
  # Temperatures
27
18
  self.xtal1_temp = epics_signal_r(float, prefix + "-DI-DCM-01:PT100-1")
28
19
  self.xtal1_heater_temp = epics_signal_r(
@@ -39,4 +30,4 @@ class DCM(StandardReadable):
39
30
  self.b1_plate_temp = epics_signal_r(float, prefix + "-DI-DCM-01:PT100-7")
40
31
  self.gap_temp = epics_signal_r(float, prefix + "-DI-DCM-01:TC-1")
41
32
 
42
- super().__init__(name)
33
+ super().__init__(prefix + "-MO-DCM-01:", RollCrystal, PitchAndRollCrystal, name)
dodal/devices/tetramm.py CHANGED
@@ -244,10 +244,9 @@ class TetrammDetector(StandardDetector):
244
244
  super().__init__(
245
245
  controller,
246
246
  ADHDFWriter(
247
- self.hdf,
248
- path_provider,
249
- lambda: self.name,
250
- TetrammDatasetDescriber(controller),
247
+ fileio=self.hdf,
248
+ path_provider=path_provider,
249
+ dataset_describer=TetrammDatasetDescriber(controller),
251
250
  plugins=plugins,
252
251
  ),
253
252
  config_signals,
@@ -13,9 +13,9 @@ class TurboSlit(StandardReadable, Movable[float]):
13
13
  The xfine motor can move the slit in x direction at high frequencies for different scans.
14
14
  These slits can be scanned continously or in step mode.
15
15
  The relationship between the three motors is as follows:
16
- - arc - position of the middle of the gap (coarse/ macro) extension
16
+ - arc - position of the middle of the gap in degrees (coarse/ macro) extension
17
17
  - gap - width in mm, provides energy resolution
18
- - xfine selects the energy as part of the high frequency scan
18
+ - xfine - main scanning axis in mm, selects the energy as part of the high frequency scan
19
19
  """
20
20
 
21
21
  def __init__(self, prefix: str, name: str = ""):
@@ -51,6 +51,10 @@ class I24Axes:
51
51
  VGON_YH = EncEnum.ENC4
52
52
 
53
53
 
54
+ class I23Axes:
55
+ OMEGA = EncEnum.ENC1
56
+
57
+
54
58
  class RotationDirection(StrictEnum):
55
59
  """
56
60
  Defines for a swept angle whether the scan width (sweep) is to be added or subtracted from
@@ -33,7 +33,11 @@ def attach_data_session_metadata_wrapper(
33
33
  Yields:
34
34
  Iterator[Msg]: Plan messages
35
35
  """
36
- provider = provider or get_path_provider()
36
+ try:
37
+ provider = provider or get_path_provider()
38
+ except NameError:
39
+ provider = None
40
+
37
41
  if isinstance(provider, UpdatingPathProvider):
38
42
  yield from bps.wait_for([provider.update])
39
43
  ress = yield from bps.wait_for([provider.data_session])
@@ -41,6 +45,11 @@ def attach_data_session_metadata_wrapper(
41
45
  # https://github.com/DiamondLightSource/dodal/issues/452
42
46
  # As part of 452, write each dataCollection into their own folder, then can use resource_dir directly
43
47
  yield from bpp.inject_md_wrapper(plan, md={DATA_SESSION: data_session})
48
+ elif provider is None:
49
+ logging.warning(
50
+ f"There is no PathProvider set, {attach_data_session_metadata_wrapper.__name__} will have no effect"
51
+ )
52
+ yield from plan
44
53
  else:
45
54
  logging.warning(
46
55
  f"{provider} is not an UpdatingPathProvider, {attach_data_session_metadata_wrapper.__name__} will have no effect"
@@ -2,14 +2,14 @@ from typing import Protocol, runtime_checkable
2
2
 
3
3
  from bluesky import plan_stubs as bps
4
4
 
5
- from dodal.devices.dcm import DCM
5
+ from dodal.devices.common_dcm import BaseDCM
6
6
  from dodal.devices.undulator import Undulator
7
7
 
8
8
 
9
9
  @runtime_checkable
10
10
  class CheckUndulatorDevices(Protocol):
11
11
  undulator: Undulator
12
- dcm: DCM
12
+ dcm: BaseDCM
13
13
 
14
14
 
15
15
  def verify_undulator_gap(devices: CheckUndulatorDevices):