dls-dodal 1.59.1__py3-none-any.whl → 1.60.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.59.1
3
+ Version: 1.60.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>, Joseph Ware <joseph.ware@diamond.ac.uk>, Oliver Silvester <Oliver.Silvester@diamond.ac.uk>, Noemi Frisina <noemi.frisina@diamond.ac.uk>
6
6
  License: Apache License
@@ -216,7 +216,7 @@ License-File: LICENSE
216
216
  Requires-Dist: click
217
217
  Requires-Dist: ophyd
218
218
  Requires-Dist: ophyd-async[ca,pva]>=0.13.2
219
- Requires-Dist: bluesky==1.14.2
219
+ Requires-Dist: bluesky>=1.14.5
220
220
  Requires-Dist: pyepics
221
221
  Requires-Dist: dataclasses-json
222
222
  Requires-Dist: pillow
@@ -230,7 +230,6 @@ Requires-Dist: aiofiles
230
230
  Requires-Dist: aiohttp
231
231
  Requires-Dist: redis
232
232
  Requires-Dist: scanspec>=0.7.3
233
- Requires-Dist: event-model>=1.23
234
233
  Requires-Dist: pyzmq==26.3.0
235
234
  Requires-Dist: deepdiff
236
235
  Requires-Dist: daq-config-server>=v1.0.0-rc.2
@@ -1,7 +1,7 @@
1
- dls_dodal-1.59.1.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1
+ dls_dodal-1.60.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=wK0DlFmbBUtBSJrrSyAf2e1H4HULMvk71ss8iHGbVFg,706
4
+ dodal/_version.py,sha256=DQ2eCF3LevBLy0Ytmwazcpp3NBvIb4zB_mzF8VnCjP4,706
5
5
  dodal/cli.py,sha256=yi8dXOp0hqzlg4ZZXCRGU-LpDa_ydaropDjyREWbZ5Y,4152
6
6
  dodal/log.py,sha256=Rt5O3hFZfMnJvQueZvgagQuXnPqHrFxhponOvVkpfrk,9871
7
7
  dodal/utils.py,sha256=abGitd4FLpLnmckF7lUqOKYUL88r5Ex_NGSVgO4gOf4,19305
@@ -9,7 +9,7 @@ dodal/beamline_specific_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
9
9
  dodal/beamline_specific_utils/i03.py,sha256=P6Ls4FoVtcacH0RJM3v6ZwwGx27oMppcBdW0la-ohTY,377
10
10
  dodal/beamline_specific_utils/i05_shared.py,sha256=EsgNlOPq9iRbKv7FinR__gCEwp1S2DRclJdklmBpaxo,336
11
11
  dodal/beamlines/README.md,sha256=K9MkL_GomxlsoTB7Mz-_dJA5NNSbmCfMiutchGg3C8o,404
12
- dodal/beamlines/__init__.py,sha256=pYP4kWH7h3VYXmjXdgbt27T_q-EA5PIyiaMZc7C49UA,3198
12
+ dodal/beamlines/__init__.py,sha256=FU0P25acBYfikeXaVlQz0cMssJRrSRPzjak0FMeB4Bc,3220
13
13
  dodal/beamlines/adsim.py,sha256=fxj_P-7PsywdWPjfBAsLoOPiSKtApOKmLWHdQ8xCa3s,2048
14
14
  dodal/beamlines/aithre.py,sha256=IoRO5szytOtdkLLEtwYwLl4TLhMllyG6l9A2G1r7Yic,994
15
15
  dodal/beamlines/b01_1.py,sha256=c82X3HXysBK0s2_JxJkEg1HPXBNewP_OR_DXBU4izzc,2829
@@ -30,10 +30,12 @@ dodal/beamlines/i10-1.py,sha256=9uivujUOgYMaNeVKMq6ZmR4HdXF4je7VEKGk4RtY5xc,736
30
30
  dodal/beamlines/i10.py,sha256=EgVmrF7c5hT2WljDdfBpmYi6GVu4vkKuZ3kURdGM1XU,6141
31
31
  dodal/beamlines/i11.py,sha256=hzW5Lh74zDzUD0vqXQzekoFVWDp8qEIc0OPRm0Qepqs,3643
32
32
  dodal/beamlines/i13_1.py,sha256=VYVqMN8-njy7YSI08gskRccT-K2paRC9edAx0ah-Cwo,1602
33
+ dodal/beamlines/i15.py,sha256=lmUhh1jt5CtD4P_BzkwNufu814aT3uaQlLyDMY_B5AE,5725
34
+ dodal/beamlines/i15_1.py,sha256=TomeTLsYSvL5en8GPvI8driQa5nMObrB5DrMKckHig8,3898
33
35
  dodal/beamlines/i17.py,sha256=Nickt8CKQ9JcQ1D_ulNICUT4jjLF1Aib7D9jblSnzA4,987
34
36
  dodal/beamlines/i18.py,sha256=FuU8G-q1piu6BRou-Shj3BQEbNtsF7CUsSIqqkvCKZc,3615
35
- dodal/beamlines/i19_1.py,sha256=tg3eALJTn9p686VFV7GjfUvChGS1mrh8-98uzjdLj_g,2934
36
- dodal/beamlines/i19_2.py,sha256=hlpAbSsgmhtxrygIVMPso4YL2jAqRfYWuK_L4TS54Fw,3171
37
+ dodal/beamlines/i19_1.py,sha256=xAI9B3fyUKtoO-tnAF7wWQelrXQ6QrYNgEyncHqVzn4,3057
38
+ dodal/beamlines/i19_2.py,sha256=x-k6Dy2_Jy_9Z4Jh5ytcQWsOQlk4MRAsLOX55Fjz4t0,3171
37
39
  dodal/beamlines/i19_optics.py,sha256=8hdlDAAMgFrhcXrp5xCPZtLUlrDUEC9VwKnnuUAMbbU,1150
38
40
  dodal/beamlines/i20_1.py,sha256=Zsr1lsH7ySbOgK7RhMVMWzNWZAV-fuYW0iAjSEJZicY,2625
39
41
  dodal/beamlines/i21.py,sha256=5v6iiTlY4kWlWvQ_uNidJSotvkdNF3qdjR49l7sIYPc,728
@@ -85,7 +87,7 @@ dodal/devices/focusing_mirror.py,sha256=2UWVrY6bs6_0i-h6JJ_LAUZPX_FgMzIx04JqZafd
85
87
  dodal/devices/hutch_shutter.py,sha256=iY3qWxDr8mDlAvN_BYe2gqpXRM1hlfV3ewdwkwh0_v0,3889
86
88
  dodal/devices/ipin.py,sha256=eq5jlKw7WGQi8VLrAWpaAIsZmfiVf-5Q0td_B22H6A4,473
87
89
  dodal/devices/linkam3.py,sha256=Lkw7c05XyHEEA83djfVFqz_8HN4kROCRqZwLwvHwRdA,2054
88
- dodal/devices/motors.py,sha256=UIc6JZbzYhgT4Vr3DpHqG53_4q391A9-8W_BWHksSG8,6300
90
+ dodal/devices/motors.py,sha256=3exQwYqTCQsCmtBvv_H5T_Dd5KJXF4__afnR33vTNB0,7741
89
91
  dodal/devices/p45.py,sha256=CImflt7ifaOkV20Uip3S8_fde_GlIIhD16y-54ODfHE,1390
90
92
  dodal/devices/pgm.py,sha256=92yfr3i4fC92g-HPbbUBrazGs4b9n6CjmJfKxmUrMUY,1157
91
93
  dodal/devices/positioner.py,sha256=qf_1uYOI1whS0U5sPA3O3mlZYKrPuW3i0gEKI_q-up0,1289
@@ -94,7 +96,7 @@ dodal/devices/qbpm.py,sha256=FfrWWAHHtYv3fGRT1qljyPpAwoHJYfbooT9CfKg-oXI,465
94
96
  dodal/devices/robot.py,sha256=k4Vkjpd3R-wXWf6YbYC1225sSdjvTrZS54v5v6Qy_EU,7003
95
97
  dodal/devices/s4_slit_gaps.py,sha256=4KdarIQoRqX4ry3LUS1Km7fkjUFahA0VuTd2DvYEqQ8,446
96
98
  dodal/devices/scintillator.py,sha256=JresF8SY_-t1raibzR4f0UoMXnFi-Abh3ywGm2DjhKs,3003
97
- dodal/devices/slits.py,sha256=b_7ku2sHlzhMHTvWrwiRwee6ufrbxNX9JB_Z0lvk15o,1105
99
+ dodal/devices/slits.py,sha256=IJtipn1N5B7pH64frWcF2TFK8mTFwSYXpGt_FMGl68w,1537
98
100
  dodal/devices/smargon.py,sha256=m3wkiyGVrFw1HSnIcV2JPvuWkflSdii-1eZxoePxSkg,5025
99
101
  dodal/devices/status.py,sha256=hVrJS1yooQo6PRumRACoIEh-SKBUKxvBlQl-MtLFUMQ,327
100
102
  dodal/devices/synchrotron.py,sha256=OHBrTrm4K39XE8BrE9b_Jn_ZfMRyDp9CHCwvmiV-KOc,1989
@@ -102,7 +104,7 @@ dodal/devices/tetramm.py,sha256=IKZ49NtOf65L46Zu5CjX0kjQsYkA-bNIdu4BpMI2iLA,1024
102
104
  dodal/devices/thawer.py,sha256=HexahKZ1rUxF9jBMeULruqYt6I7fsl6OgXkvcxPQY3M,1963
103
105
  dodal/devices/turbo_slit.py,sha256=xhcnhfbdcTYSYozogw6Li4fF4ofoPsc350rEyrRdaNE,1460
104
106
  dodal/devices/undulator.py,sha256=SsgYvIEQUNs_zZiUPAzlw0yJPaSExdmBFltlq5ypbc8,5530
105
- dodal/devices/v2f.py,sha256=MQiC5vEp2scu99ERcx9N5RIVtn5IYTWEUSFaklgbWKY,1225
107
+ dodal/devices/v2f.py,sha256=TL9fFYKEWENBtos031Ma4D6eDVG1uqUmdJON9aQzwwc,1232
106
108
  dodal/devices/watsonmarlow323_pump.py,sha256=xNwjoxW3NJIDkeDWHfb0A8Yj95_KKRXMD9AghvX-WLk,1337
107
109
  dodal/devices/webcam.py,sha256=UAx2KF0mKi6I-mJJUb5z56MHY-Wd89-tqyPcFbouQFg,2491
108
110
  dodal/devices/xbpm_feedback.py,sha256=HKLY3k52FPe2G-EAg8ir2LSdeUuGvhRD73ibDZ4mjH8,1418
@@ -188,6 +190,13 @@ dodal/devices/i11/spinner.py,sha256=PjumM7QRB7iFUtN4b6xCvxKItYUNX2XLLWDupy5LI_M,
188
190
  dodal/devices/i13_1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
189
191
  dodal/devices/i13_1/merlin.py,sha256=mgTFSMJftRzLL-HXAUuJkOYxtyA3Rp8YX0L46JCb30Y,1019
190
192
  dodal/devices/i13_1/merlin_controller.py,sha256=myfmByOEXyMrlJZfsjOxDHeGQVwZGfsRtzrfSy2001o,1495
193
+ dodal/devices/i15/dcm.py,sha256=QLqnKhNbkcVuCFEy9yB-2Ga4fAR0EOGZQshfSoVN8-w,3113
194
+ dodal/devices/i15/focussing_mirror.py,sha256=o0foDrdqDJNFO5Mv_Cb42fVLcJ8hrMjLau3uUS7_yWE,1863
195
+ dodal/devices/i15/jack.py,sha256=3FmRdVO54O1rsX3J8VBAYRvbmKOJJveAIz836SKTvoc,1024
196
+ dodal/devices/i15/laue.py,sha256=I6aTJuVV93PjwtMtE_P4ZeUCsKTIvZPoG0HlOTUGGnY,527
197
+ dodal/devices/i15/motors.py,sha256=-kGHisSWc_zuV9m2L0mGgmiSiIZ7puLsimddk28h_7s,831
198
+ dodal/devices/i15/multilayer_mirror.py,sha256=KHalIhgz5QX-SPl-d8ypPwIc72iqmj004pzeIMOhytg,772
199
+ dodal/devices/i15/rail.py,sha256=STXoNC8G7UbaK_wBhRv8RwnLJa2qklqE-XzaWxkD7h0,459
191
200
  dodal/devices/i18/KBMirror.py,sha256=W4R3TeulSjosUqAFIIznyWzje_Y2AoEf9f8N-NkisYM,710
192
201
  dodal/devices/i18/diode.py,sha256=nk5kvn4LsbhczRpCwHOO0_jJTYOz7MP9qm_uvBWuv7c,1468
193
202
  dodal/devices/i19/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -270,8 +279,8 @@ dodal/testing/__init__.py,sha256=AUYZKAvVOs7ZvxO1dVhL0pDTleRO34FQlO5MNe_cwgU,96
270
279
  dodal/testing/setup.py,sha256=8cQnrzE5MQD4Etf0eqMarmtr-opsUOMQww-k1V7DzIQ,2442
271
280
  dodal/testing/electron_analyser/__init__.py,sha256=-lc1opD2dCv0x678-J-ApOhHtvEvcslfOQ7E613U8-Y,118
272
281
  dodal/testing/electron_analyser/device_factory.py,sha256=tkMY6fW3iI02DTD1XXHi4lH6sjo8RHHZBGDHSuTdmNU,2243
273
- dls_dodal-1.59.1.dist-info/METADATA,sha256=vhekTYIeuSt8iSv0nmyRJljih2oZyHJ8mE1vJiKFuoU,16974
274
- dls_dodal-1.59.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
275
- dls_dodal-1.59.1.dist-info/entry_points.txt,sha256=bycw_EKUzup_rxfCetOwcauXV4kLln_OPpPT8jEnr-I,94
276
- dls_dodal-1.59.1.dist-info/top_level.txt,sha256=xIozdmZk_wmMV4wugpq9-6eZs0vgADNUKz3j2UAwlhc,6
277
- dls_dodal-1.59.1.dist-info/RECORD,,
282
+ dls_dodal-1.60.0.dist-info/METADATA,sha256=ZayuvRHyJXBJ91LHyhhe137vN9naAJGFYm5NfbTgZ4E,16941
283
+ dls_dodal-1.60.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
284
+ dls_dodal-1.60.0.dist-info/entry_points.txt,sha256=bycw_EKUzup_rxfCetOwcauXV4kLln_OPpPT8jEnr-I,94
285
+ dls_dodal-1.60.0.dist-info/top_level.txt,sha256=xIozdmZk_wmMV4wugpq9-6eZs0vgADNUKz3j2UAwlhc,6
286
+ dls_dodal-1.60.0.dist-info/RECORD,,
dodal/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '1.59.1'
32
- __version_tuple__ = version_tuple = (1, 59, 1)
31
+ __version__ = version = '1.60.0'
32
+ __version_tuple__ = version_tuple = (1, 60, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -13,6 +13,7 @@ _BEAMLINE_NAME_OVERRIDES = {
13
13
  "b07-1": "b07_1",
14
14
  "i09-1": "i09_1",
15
15
  "i13-1": "i13_1",
16
+ "i15-1": "i15_1",
16
17
  "i20-1": "i20_1",
17
18
  "i19-1": "i19_1",
18
19
  "i19-2": "i19_2",
dodal/beamlines/i15.py ADDED
@@ -0,0 +1,242 @@
1
+ from ophyd_async.epics.motor import Motor
2
+
3
+ from dodal.common.beamlines.beamline_utils import device_factory
4
+ from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
5
+ from dodal.devices.i15.dcm import DCM
6
+ from dodal.devices.i15.focussing_mirror import (
7
+ FocusingMirror,
8
+ FocusingMirrorHorizontal,
9
+ FocusingMirrorVertical,
10
+ FocusingMirrorWithRoll,
11
+ )
12
+ from dodal.devices.i15.jack import JackX, JackY
13
+ from dodal.devices.i15.motors import UpstreamDownstreamPair
14
+ from dodal.devices.motors import (
15
+ SixAxisGonioKappaPhi,
16
+ XYStage,
17
+ XYZPitchYawStage,
18
+ XYZStage,
19
+ )
20
+ from dodal.devices.slits import Slits, SlitsY
21
+ from dodal.devices.synchrotron import Synchrotron
22
+ from dodal.log import set_beamline as set_log_beamline
23
+ from dodal.utils import BeamlinePrefix, get_beamline_name
24
+
25
+ BL = get_beamline_name("i15") # Default used when not on a live beamline
26
+ PREFIX = BeamlinePrefix(BL)
27
+ set_log_beamline(BL) # Configure logging and util functions
28
+ set_utils_beamline(BL)
29
+
30
+ """
31
+ Define device factory functions below this point.
32
+ A device factory function is any function that has a return type which conforms
33
+ to one or more Bluesky Protocols.
34
+ """
35
+
36
+
37
+ @device_factory()
38
+ def arm() -> UpstreamDownstreamPair:
39
+ return UpstreamDownstreamPair(f"{PREFIX.beamline_prefix}-MO-LHEAT-01:ARM:")
40
+
41
+
42
+ @device_factory()
43
+ def beamstop() -> XYStage:
44
+ return XYStage(f"{PREFIX.beamline_prefix}-RS-ABSB-04:")
45
+
46
+
47
+ @device_factory()
48
+ def bs2() -> XYStage:
49
+ return XYStage(f"{PREFIX.beamline_prefix}-RS-ABSB-08:")
50
+
51
+
52
+ @device_factory()
53
+ def bs3() -> XYZStage:
54
+ return XYZStage(f"{PREFIX.beamline_prefix}-RS-ABSB-09:")
55
+
56
+
57
+ @device_factory()
58
+ def dcm() -> DCM:
59
+ return DCM(f"{PREFIX.beamline_prefix}-OP-DCM-01:")
60
+
61
+
62
+ @device_factory()
63
+ def det1z() -> Motor:
64
+ return Motor(f"{PREFIX.beamline_prefix}-MO-DIFF-01:ARM:DETECTOR:Z")
65
+
66
+
67
+ @device_factory()
68
+ def det2z() -> Motor:
69
+ """Deliberately the same as eht2dtx"""
70
+ return Motor(f"{PREFIX.beamline_prefix}-MO-TABLE-03:DETECTOR2:Z")
71
+
72
+
73
+ @device_factory()
74
+ def diffractometer() -> SixAxisGonioKappaPhi:
75
+ return SixAxisGonioKappaPhi(
76
+ prefix=f"{PREFIX.beamline_prefix}-MO-DIFF-01:SAMPLE:",
77
+ phi_infix="KPHI",
78
+ )
79
+
80
+
81
+ @device_factory()
82
+ def djack1() -> JackX:
83
+ return JackX(f"{PREFIX.beamline_prefix}-MO-DIFF-01:BASE:")
84
+
85
+
86
+ @device_factory()
87
+ def eht2dtx() -> Motor:
88
+ """Deliberately the same as det2z"""
89
+ return Motor(f"{PREFIX.beamline_prefix}-MO-TABLE-03:DETECTOR2:Z")
90
+
91
+
92
+ @device_factory()
93
+ def f2x() -> Motor:
94
+ return Motor(f"{PREFIX.beamline_prefix}-RS-ABSB-10:X")
95
+
96
+
97
+ @device_factory()
98
+ def fs() -> XYStage:
99
+ return XYStage(f"{PREFIX.beamline_prefix}-EA-SHTR-01:")
100
+
101
+
102
+ @device_factory()
103
+ def fs2() -> XYStage:
104
+ return XYStage(f"{PREFIX.beamline_prefix}-EA-SHTR-02:")
105
+
106
+
107
+ @device_factory()
108
+ def hfm() -> FocusingMirrorWithRoll:
109
+ return FocusingMirrorWithRoll(f"{PREFIX.beamline_prefix}-OP-HFM-01:")
110
+
111
+
112
+ @device_factory()
113
+ def laserboard() -> XYZStage:
114
+ return XYZStage(f"{PREFIX.beamline_prefix}-MO-LHEAT-01:")
115
+
116
+
117
+ @device_factory()
118
+ def obj() -> UpstreamDownstreamPair:
119
+ return UpstreamDownstreamPair(f"{PREFIX.beamline_prefix}-MO-LHEAT-01:OBJ:")
120
+
121
+
122
+ @device_factory()
123
+ def opticds() -> XYStage:
124
+ return XYStage(f"{PREFIX.beamline_prefix}-MO-LHEAT-01:OPTIC:DS:")
125
+
126
+
127
+ @device_factory()
128
+ def opticus() -> XYStage:
129
+ return XYStage(f"{PREFIX.beamline_prefix}-MO-LHEAT-01:OPTIC:US:")
130
+
131
+
132
+ @device_factory()
133
+ def pin3() -> XYStage:
134
+ return XYStage(f"{PREFIX.beamline_prefix}-AL-APTR-03:")
135
+
136
+
137
+ @device_factory()
138
+ def pin() -> XYZPitchYawStage:
139
+ return XYZPitchYawStage(f"{PREFIX.beamline_prefix}-AL-APTR-02:")
140
+
141
+
142
+ @device_factory()
143
+ def qbpm1() -> XYStage:
144
+ return XYStage(f"{PREFIX.beamline_prefix}-DI-QBPM-01:")
145
+
146
+
147
+ @device_factory()
148
+ def qbpm2() -> XYStage:
149
+ return XYStage(f"{PREFIX.beamline_prefix}-DI-QBPM-02:")
150
+
151
+
152
+ @device_factory()
153
+ def s1() -> Slits:
154
+ return Slits(
155
+ prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-01:",
156
+ x_centre="X:CENTER",
157
+ y_centre="Y:CENTER",
158
+ )
159
+
160
+
161
+ @device_factory()
162
+ def s2() -> Slits:
163
+ return Slits(
164
+ prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-02:",
165
+ x_centre="X:CENTER",
166
+ y_centre="Y:CENTER",
167
+ )
168
+
169
+
170
+ @device_factory()
171
+ def s4() -> Slits:
172
+ return Slits(
173
+ prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-04:",
174
+ x_centre="X:CENTER",
175
+ y_centre="Y:CENTER",
176
+ )
177
+
178
+
179
+ @device_factory()
180
+ def s5() -> Slits:
181
+ return Slits(
182
+ prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-05:",
183
+ x_centre="X:CENTER",
184
+ y_centre="Y:CENTER",
185
+ )
186
+
187
+
188
+ @device_factory()
189
+ def s6() -> SlitsY:
190
+ return SlitsY(
191
+ prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-06:",
192
+ y_centre="Y:CENTER",
193
+ )
194
+
195
+
196
+ @device_factory()
197
+ def s7() -> Slits:
198
+ return Slits(
199
+ prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-07:",
200
+ x_centre="X:CENTER",
201
+ y_centre="Y:CENTER",
202
+ )
203
+
204
+
205
+ @device_factory()
206
+ def shd() -> XYZStage:
207
+ return XYZStage(f"{PREFIX.beamline_prefix}-MO-SHEAD-01:")
208
+
209
+
210
+ @device_factory()
211
+ def shd2() -> XYZStage:
212
+ return XYZStage(f"{PREFIX.beamline_prefix}-MO-SHEAD-02:")
213
+
214
+
215
+ @device_factory()
216
+ def shfm() -> FocusingMirrorHorizontal:
217
+ return FocusingMirrorHorizontal(f"{PREFIX.beamline_prefix}-OP-MIRR-03:HFM:")
218
+
219
+
220
+ @device_factory()
221
+ def skb() -> JackY:
222
+ return JackY(f"{PREFIX.beamline_prefix}-OP-MIRR-03:BASE:")
223
+
224
+
225
+ @device_factory()
226
+ def svfm() -> FocusingMirrorVertical:
227
+ return FocusingMirrorVertical(f"{PREFIX.beamline_prefix}-OP-MIRR-03:VFM:")
228
+
229
+
230
+ @device_factory()
231
+ def tab2jack() -> JackX:
232
+ return JackX(f"{PREFIX.beamline_prefix}-MO-TABLE-03:BASE:")
233
+
234
+
235
+ @device_factory()
236
+ def vfm() -> FocusingMirror:
237
+ return FocusingMirror(f"{PREFIX.beamline_prefix}-OP-VFM-01:")
238
+
239
+
240
+ @device_factory()
241
+ def synchrotron() -> Synchrotron:
242
+ return Synchrotron()
@@ -0,0 +1,156 @@
1
+ from ophyd_async.epics.motor import Motor
2
+
3
+ from dodal.common.beamlines.beamline_utils import device_factory
4
+ from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
5
+ from dodal.devices.i15.laue import LaueMonochrometer
6
+ from dodal.devices.i15.motors import NumberedTripleAxisStage
7
+ from dodal.devices.i15.multilayer_mirror import MultiLayerMirror
8
+ from dodal.devices.i15.rail import Rail
9
+ from dodal.devices.motors import XYPhiStage, XYStage, YZStage
10
+ from dodal.devices.slits import Slits
11
+ from dodal.devices.synchrotron import Synchrotron
12
+ from dodal.log import set_beamline as set_log_beamline
13
+ from dodal.utils import BeamlinePrefix, get_beamline_name
14
+
15
+ BL = get_beamline_name("i15-1") # Default used when not on a live beamline
16
+ PREFIX = BeamlinePrefix(BL, suffix="J")
17
+ set_log_beamline(BL) # Configure logging and util functions
18
+ set_utils_beamline(BL)
19
+
20
+ """
21
+ Define device factory functions below this point.
22
+ A device factory function is any function that has a return type which conforms
23
+ to one or more Bluesky Protocols.
24
+ """
25
+
26
+
27
+ @device_factory()
28
+ def attY() -> NumberedTripleAxisStage:
29
+ return NumberedTripleAxisStage(
30
+ f"{PREFIX.beamline_prefix}-OP-ATTN-01:",
31
+ axis1_infix="STICK1",
32
+ axis2_infix="STICK2",
33
+ axis3_infix="STICK3",
34
+ )
35
+
36
+
37
+ @device_factory()
38
+ def baseY() -> Motor:
39
+ return Motor(f"{PREFIX.beamline_prefix}-MO-TABLE-01:Y")
40
+
41
+
42
+ @device_factory()
43
+ def blowerY() -> Motor:
44
+ """Same motor as blowerZ"""
45
+ return Motor(f"{PREFIX.beamline_prefix}-EA-BLOWR-01:TLATE")
46
+
47
+
48
+ @device_factory()
49
+ def blowerZ() -> Motor:
50
+ """Same motor as blowerY"""
51
+ return Motor(f"{PREFIX.beamline_prefix}-EA-BLOWR-01:TLATE")
52
+
53
+
54
+ @device_factory()
55
+ def bs2() -> XYStage:
56
+ return XYStage(f"{PREFIX.beamline_prefix}-MO-SMAR-02:")
57
+
58
+
59
+ @device_factory()
60
+ def clean() -> XYStage:
61
+ return XYStage(f"{PREFIX.beamline_prefix}-MO-ABSB-01:CLEAN:")
62
+
63
+
64
+ @device_factory()
65
+ def det2() -> YZStage:
66
+ return YZStage(f"{PREFIX.beamline_prefix}-EA-DET-02:")
67
+
68
+
69
+ @device_factory()
70
+ def envX() -> Motor:
71
+ return Motor(f"{PREFIX.beamline_prefix}-MO-TABLE-01:ENV:X")
72
+
73
+
74
+ @device_factory()
75
+ def f2y() -> Motor:
76
+ return Motor(f"{PREFIX.beamline_prefix}-OP-ATTN-02:Y")
77
+
78
+
79
+ @device_factory()
80
+ def m1() -> MultiLayerMirror:
81
+ return MultiLayerMirror(f"{PREFIX.beamline_prefix}-OP-MIRR-01:")
82
+
83
+
84
+ @device_factory()
85
+ def rail() -> Rail:
86
+ return Rail(f"{PREFIX.beamline_prefix}-MO-RAIL-01:")
87
+
88
+
89
+ @device_factory(skip=True)
90
+ def sam() -> XYPhiStage:
91
+ return XYPhiStage(f"{PREFIX.beamline_prefix}-MO-TABLE-01:SAMPLE:", phi_infix="PHI2")
92
+
93
+
94
+ @device_factory()
95
+ def slits_1() -> Slits:
96
+ return Slits(
97
+ prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-01:",
98
+ x_centre="X:CENTER",
99
+ y_centre="Y:CENTER",
100
+ )
101
+
102
+
103
+ @device_factory()
104
+ def slits_2() -> Slits:
105
+ return Slits(
106
+ prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-02:",
107
+ x_centre="X:CENTER",
108
+ y_centre="Y:CENTER",
109
+ )
110
+
111
+
112
+ @device_factory()
113
+ def slits_3() -> Slits:
114
+ return Slits(
115
+ prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-03:",
116
+ x_centre="X:CENTER",
117
+ y_centre="Y:CENTER",
118
+ )
119
+
120
+
121
+ @device_factory()
122
+ def slits_4() -> Slits:
123
+ return Slits(
124
+ prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-04:",
125
+ x_centre="X:CENTER",
126
+ y_centre="Y:CENTER",
127
+ )
128
+
129
+
130
+ @device_factory()
131
+ def slits_5() -> Slits:
132
+ return Slits(
133
+ prefix=f"{PREFIX.beamline_prefix}-AL-SLITS-05:",
134
+ x_centre="X:CENTER",
135
+ y_centre="Y:CENTER",
136
+ )
137
+
138
+
139
+ @device_factory()
140
+ def synchrotron() -> Synchrotron:
141
+ return Synchrotron()
142
+
143
+
144
+ @device_factory()
145
+ def tth() -> Motor:
146
+ return Motor(f"{PREFIX.beamline_prefix}-MO-TABLE-01:TTH")
147
+
148
+
149
+ @device_factory()
150
+ def trans() -> XYPhiStage:
151
+ return XYPhiStage(prefix=f"{PREFIX.beamline_prefix}-MO-TABLE-01:TRANS:")
152
+
153
+
154
+ @device_factory()
155
+ def xtal() -> LaueMonochrometer:
156
+ return LaueMonochrometer(prefix=f"{PREFIX.beamline_prefix}-OP-LAUE-01:")
dodal/beamlines/i19_1.py CHANGED
@@ -58,6 +58,8 @@ def oav() -> OAVBeamCentreFile:
58
58
  )
59
59
 
60
60
 
61
+ # NOTE EH1 uses the Zebra 2 box. While a Zebra 1 box exists and is connected
62
+ # on the beamline, it is currently not in use
61
63
  @device_factory()
62
64
  def zebra() -> Zebra:
63
65
  """Get the i19-1 zebra device, instantiate it if it hasn't already been.
@@ -65,7 +67,7 @@ def zebra() -> Zebra:
65
67
  """
66
68
  return Zebra(
67
69
  mapping=I19_1_ZEBRA_MAPPING,
68
- prefix=f"{PREFIX.beamline_prefix}-EA-ZEBRA-03:",
70
+ prefix=f"{PREFIX.beamline_prefix}-EA-ZEBRA-02:",
69
71
  )
70
72
 
71
73
 
dodal/beamlines/i19_2.py CHANGED
@@ -57,7 +57,7 @@ def zebra() -> Zebra:
57
57
  """
58
58
  return Zebra(
59
59
  mapping=I19_2_ZEBRA_MAPPING,
60
- prefix=f"{PREFIX.beamline_prefix}-EA-ZEBRA-01:",
60
+ prefix=f"{PREFIX.beamline_prefix}-EA-ZEBRA-03:",
61
61
  )
62
62
 
63
63
 
@@ -0,0 +1,77 @@
1
+ from typing import Generic, TypeVar
2
+
3
+ from ophyd_async.core import StandardReadable
4
+ from ophyd_async.epics.motor import Motor
5
+
6
+ from dodal.devices.common_dcm import (
7
+ StationaryCrystal,
8
+ )
9
+
10
+
11
+ class ThetaYCrystal(StationaryCrystal):
12
+ def __init__(self, prefix):
13
+ with self.add_children_as_readables():
14
+ self.theta = Motor(prefix + "THETA")
15
+ self.y = Motor(prefix + "Y")
16
+ super().__init__(prefix)
17
+
18
+
19
+ class ThetaRollYZCrystal(ThetaYCrystal):
20
+ def __init__(self, prefix):
21
+ with self.add_children_as_readables():
22
+ self.roll = Motor(prefix + "ROLL")
23
+ self.z = Motor(prefix + "Z")
24
+ super().__init__(prefix)
25
+
26
+
27
+ Xtal_1 = TypeVar("Xtal_1", bound=StationaryCrystal)
28
+ Xtal_2 = TypeVar("Xtal_2", bound=StationaryCrystal)
29
+
30
+
31
+ class DualCrystalMonoSimple(StandardReadable, Generic[Xtal_1, Xtal_2]):
32
+ """
33
+ Device for simple double crystal monochromators (DCM), which only allow energy of the beam to be selected.
34
+
35
+ Features common across all DCM's should include virtual motors to set energy/wavelength and contain two crystals,
36
+ each of which can be movable. Some DCM's contain crystals with roll motors, and some contain crystals with roll and pitch motors.
37
+ This base device accounts for all combinations of this.
38
+
39
+ This device is more able to act as a parent for beamline-specific DCM's, in which any other missing signals can be added,
40
+ as it doesn't assume WAVELENGTH, BRAGG and OFFSET are available for all DCM deivces, as BaseDCM does.
41
+
42
+ Bluesky plans using DCM's should be typed to specify which types of crystals are required. For example, a plan
43
+ which only requires one crystal which can roll should be typed 'def my_plan(dcm: BaseDCM[RollCrystal, StationaryCrystal])`
44
+ """
45
+
46
+ def __init__(
47
+ self, prefix: str, xtal_1: type[Xtal_1], xtal_2: type[Xtal_2], name: str = ""
48
+ ) -> None:
49
+ with self.add_children_as_readables():
50
+ # Virtual motor PV's which set the physical motors so that the DCM produces requested
51
+ # wavelength/energy
52
+ self.energy_in_kev = Motor(prefix + "ENERGY")
53
+ self._make_crystals(prefix, xtal_1, xtal_2)
54
+
55
+ super().__init__(name)
56
+
57
+ # Prefix convention is different depending on whether there are one or two controllable crystals
58
+ def _make_crystals(self, prefix: str, xtal_1: type[Xtal_1], xtal_2: type[Xtal_2]):
59
+ if StationaryCrystal not in [xtal_1, xtal_2]:
60
+ self.xtal_1 = xtal_1(f"{prefix}XTAL1:")
61
+ self.xtal_2 = xtal_2(f"{prefix}XTAL2:")
62
+ else:
63
+ self.xtal_1 = xtal_1(prefix)
64
+ self.xtal_2 = xtal_2(prefix)
65
+
66
+
67
+ class DCM(DualCrystalMonoSimple[ThetaRollYZCrystal, ThetaYCrystal]):
68
+ """
69
+ A double crystal monocromator device, used to select the beam energy.
70
+ """
71
+
72
+ def __init__(self, prefix: str, name: str = "") -> None:
73
+ with self.add_children_as_readables():
74
+ self.calibrated_energy_in_kev = Motor(prefix + "CAL")
75
+ self.x1 = Motor(prefix + "X1")
76
+
77
+ super().__init__(prefix, ThetaRollYZCrystal, ThetaYCrystal, name)
@@ -0,0 +1,71 @@
1
+ from ophyd_async.core import StandardReadable
2
+ from ophyd_async.epics.motor import Motor
3
+
4
+
5
+ class FocusingMirrorBase(StandardReadable):
6
+ """Focusing Mirror with curve, ellip & pitch"""
7
+
8
+ def __init__(
9
+ self,
10
+ prefix: str,
11
+ name: str = "",
12
+ ):
13
+ with self.add_children_as_readables():
14
+ self.curve = Motor(prefix + "CURVE")
15
+ self.ellipticity = Motor(prefix + "ELLIP")
16
+ self.pitch = Motor(prefix + "PITCH")
17
+
18
+ super().__init__(name)
19
+
20
+
21
+ class FocusingMirrorHorizontal(FocusingMirrorBase):
22
+ """Focusing Mirror with curve, ellip, pitch & X"""
23
+
24
+ def __init__(
25
+ self,
26
+ prefix: str,
27
+ name: str = "",
28
+ ):
29
+ with self.add_children_as_readables():
30
+ self.x = Motor(prefix + "X")
31
+
32
+ super().__init__(prefix, name)
33
+
34
+
35
+ class FocusingMirrorVertical(FocusingMirrorBase):
36
+ """Focusing Mirror with curve, ellip, pitch & Y"""
37
+
38
+ def __init__(
39
+ self,
40
+ prefix: str,
41
+ name: str = "",
42
+ ):
43
+ with self.add_children_as_readables():
44
+ self.y = Motor(prefix + "Y")
45
+
46
+ super().__init__(prefix, name)
47
+
48
+
49
+ class FocusingMirror(FocusingMirrorBase):
50
+ """Focusing Mirror with curve, ellip, pitch, yaw, X & Y"""
51
+
52
+ def __init__(
53
+ self,
54
+ prefix: str,
55
+ name: str = "",
56
+ ):
57
+ with self.add_children_as_readables():
58
+ self.yaw = Motor(prefix + "YAW")
59
+ self.x = Motor(prefix + "X")
60
+ self.y = Motor(prefix + "Y")
61
+
62
+ super().__init__(prefix, name)
63
+
64
+
65
+ class FocusingMirrorWithRoll(FocusingMirror):
66
+ """Focusing Mirror with curve, ellip, pitch, roll, yaw, X & Y"""
67
+
68
+ def __init__(self, prefix: str, name: str = "") -> None:
69
+ with self.add_children_as_readables():
70
+ self.roll = Motor(prefix + "ROLL")
71
+ super().__init__(prefix, name)
@@ -0,0 +1,39 @@
1
+ from ophyd_async.core import StandardReadable
2
+ from ophyd_async.epics.motor import Motor
3
+
4
+
5
+ class JackX(StandardReadable):
6
+ """Focusing Mirror"""
7
+
8
+ def __init__(
9
+ self,
10
+ prefix: str,
11
+ name: str = "",
12
+ ):
13
+ with self.add_children_as_readables():
14
+ self.rotation = Motor(prefix + "Ry")
15
+ self.transx = Motor(prefix + "X")
16
+ self.y1 = Motor(prefix + "Y1")
17
+ self.y2 = Motor(prefix + "Y2")
18
+ self.y3 = Motor(prefix + "Y3")
19
+
20
+ super().__init__(name)
21
+
22
+
23
+ class JackY(StandardReadable):
24
+ """Focusing Mirror"""
25
+
26
+ def __init__(
27
+ self,
28
+ prefix: str,
29
+ name: str = "",
30
+ ):
31
+ with self.add_children_as_readables():
32
+ self.j1 = Motor(prefix + "J1")
33
+ self.j2 = Motor(prefix + "J2")
34
+ self.j3 = Motor(prefix + "J3")
35
+ self.pitch = Motor(prefix + "PITCH")
36
+ self.roll = Motor(prefix + "ROLL")
37
+ self.y = Motor(prefix + "Y")
38
+
39
+ super().__init__(name)
@@ -0,0 +1,18 @@
1
+ from ophyd_async.core import StandardReadable
2
+ from ophyd_async.epics.motor import Motor
3
+
4
+
5
+ class LaueMonochrometer(StandardReadable):
6
+ def __init__(
7
+ self,
8
+ prefix: str,
9
+ name: str = "",
10
+ ):
11
+ with self.add_children_as_readables():
12
+ self.bend = Motor(prefix + "BENDER")
13
+ self.bragg = Motor(prefix + "PITCH")
14
+ self.roll = Motor(prefix + "ROLL")
15
+ self.yaw = Motor(prefix + "YAW")
16
+ self.y = Motor(prefix + "Y")
17
+
18
+ super().__init__(name)
@@ -0,0 +1,27 @@
1
+ from ophyd_async.epics.motor import Motor
2
+
3
+ from dodal.devices.motors import Stage
4
+
5
+
6
+ class UpstreamDownstreamPair(Stage):
7
+ def __init__(self, prefix: str, name: str = ""):
8
+ with self.add_children_as_readables():
9
+ self.upstream = Motor(prefix + "US")
10
+ self.downstream = Motor(prefix + "DS")
11
+ super().__init__(name=name)
12
+
13
+
14
+ class NumberedTripleAxisStage(Stage):
15
+ def __init__(
16
+ self,
17
+ prefix: str,
18
+ name: str = "",
19
+ axis1_infix: str = "AXIS1",
20
+ axis2_infix: str = "AXIS2",
21
+ axis3_infix: str = "AXIS3",
22
+ ):
23
+ with self.add_children_as_readables():
24
+ self.axis1 = Motor(prefix + axis1_infix)
25
+ self.axis2 = Motor(prefix + axis2_infix)
26
+ self.axis3 = Motor(prefix + axis3_infix)
27
+ super().__init__(name=name)
@@ -0,0 +1,25 @@
1
+ from ophyd_async.core import StandardReadable
2
+ from ophyd_async.epics.motor import Motor
3
+
4
+
5
+ class MultiLayerMirror(StandardReadable):
6
+ """Multilayer Mirror"""
7
+
8
+ def __init__(
9
+ self,
10
+ prefix: str,
11
+ name: str = "",
12
+ ):
13
+ with self.add_children_as_readables():
14
+ self.ds_x = Motor(prefix + "X2")
15
+ self.ds_y = Motor(prefix + "J3")
16
+ self.ib_y = Motor(prefix + "J1")
17
+ self.ob_y = Motor(prefix + "J2")
18
+ self.pitch = Motor(prefix + "PITCH")
19
+ self.roll = Motor(prefix + "ROLL")
20
+ self.us_x = Motor(prefix + "X1")
21
+ self.x = Motor(prefix + "X")
22
+ self.y = Motor(prefix + "Y")
23
+ self.yaw = Motor(prefix + "YAW")
24
+
25
+ super().__init__(name)
@@ -0,0 +1,17 @@
1
+ from ophyd_async.core import StandardReadable
2
+ from ophyd_async.epics.motor import Motor
3
+
4
+
5
+ class Rail(StandardReadable):
6
+ def __init__(
7
+ self,
8
+ prefix: str,
9
+ name: str = "",
10
+ ):
11
+ with self.add_children_as_readables():
12
+ self.pitch = Motor(prefix + "PITCH")
13
+ self.y = Motor(prefix + "Y")
14
+ self.y1 = Motor(prefix + "Y1")
15
+ self.y2 = Motor(prefix + "Y2")
16
+
17
+ super().__init__(name)
dodal/devices/motors.py CHANGED
@@ -70,13 +70,27 @@ class XYZThetaStage(XYZStage):
70
70
  x_infix: str = _X,
71
71
  y_infix: str = _Y,
72
72
  z_infix: str = _Z,
73
- theta_infix: str = _Z,
73
+ theta_infix: str = "THETA",
74
74
  ) -> None:
75
75
  with self.add_children_as_readables():
76
76
  self.theta = Motor(prefix + theta_infix)
77
77
  super().__init__(prefix, name, x_infix, y_infix, z_infix)
78
78
 
79
79
 
80
+ class XYPhiStage(XYStage):
81
+ def __init__(
82
+ self,
83
+ prefix: str,
84
+ x_infix: str = _X,
85
+ y_infix: str = _Y,
86
+ phi_infix: str = "PHI",
87
+ name: str = "",
88
+ ) -> None:
89
+ with self.add_children_as_readables():
90
+ self.phi = Motor(prefix + phi_infix)
91
+ super().__init__(prefix, name, x_infix, y_infix)
92
+
93
+
80
94
  class XYPitchStage(XYStage):
81
95
  def __init__(
82
96
  self,
@@ -91,6 +105,23 @@ class XYPitchStage(XYStage):
91
105
  super().__init__(prefix, name, x_infix, y_infix)
92
106
 
93
107
 
108
+ class XYZPitchYawStage(XYZStage):
109
+ def __init__(
110
+ self,
111
+ prefix: str,
112
+ name: str = "",
113
+ x_infix: str = _X,
114
+ y_infix: str = _Y,
115
+ z_infix: str = _Z,
116
+ pitch_infix="PITCH",
117
+ yaw_infix="YAW",
118
+ ):
119
+ with self.add_children_as_readables():
120
+ self.pitch = Motor(prefix + pitch_infix)
121
+ self.yaw = Motor(prefix + yaw_infix)
122
+ super().__init__(prefix, name, x_infix, y_infix, z_infix)
123
+
124
+
94
125
  class XYZPitchYawRollStage(XYZStage):
95
126
  def __init__(
96
127
  self,
@@ -136,6 +167,26 @@ class SixAxisGonio(XYZStage):
136
167
  )
137
168
 
138
169
 
170
+ class SixAxisGonioKappaPhi(XYZStage):
171
+ def __init__(
172
+ self,
173
+ prefix: str,
174
+ name: str = "",
175
+ x_infix: str = _X,
176
+ y_infix: str = _Y,
177
+ z_infix: str = _Z,
178
+ kappa_infix: str = "KAPPA",
179
+ phi_infix: str = "PHI",
180
+ ):
181
+ """Six-axis goniometer with a standard xyz stage and two axes of rotation:
182
+ kappa and phi.
183
+ """
184
+ with self.add_children_as_readables():
185
+ self.kappa = Motor(prefix + kappa_infix)
186
+ self.phi = Motor(prefix + phi_infix)
187
+ super().__init__(prefix, name, x_infix, y_infix, z_infix)
188
+
189
+
139
190
  class YZStage(Stage):
140
191
  def __init__(
141
192
  self, prefix: str, name: str = "", y_infix: str = _Y, z_infix: str = _Z
dodal/devices/slits.py CHANGED
@@ -37,3 +37,21 @@ class Slits(MinimalSlits):
37
37
  self.x_centre = Motor(prefix + x_centre)
38
38
  self.y_centre = Motor(prefix + y_centre)
39
39
  super().__init__(prefix=prefix, x_gap=x_gap, y_gap=y_gap, name=name)
40
+
41
+
42
+ class SlitsY(StandardReadable):
43
+ """
44
+ Representation of a 2-blade slits.
45
+ """
46
+
47
+ def __init__(
48
+ self,
49
+ prefix: str,
50
+ y_gap: str = "Y:SIZE",
51
+ y_centre: str = "Y:CENTRE",
52
+ name: str = "",
53
+ ) -> None:
54
+ with self.add_children_as_readables():
55
+ self.y_gap = Motor(prefix + y_gap)
56
+ self.y_centre = Motor(prefix + y_centre)
57
+ super().__init__(name=name)
dodal/devices/v2f.py CHANGED
@@ -10,13 +10,13 @@ class V2FGain(StrictEnum):
10
10
  LOW_NOISE7 = "10^7 low noise"
11
11
  LOW_NOISE8 = "10^8 low noise"
12
12
  LOW_NOISE9 = "10^9 low noise"
13
- HIGHSPEED5 = "10^5 high speed"
14
- HIGHSPEED6 = "10^6 high speed"
15
- HIGHSPEED7 = "10^7 high speed"
16
- HIGHSPEED8 = "10^8 high speed"
17
- HIGHSPEED9 = "10^9 high speed"
18
- HIGHSPEED10 = "10^10 high spd"
19
- HIGHSPEED11 = "10^11 high spd"
13
+ HIGH_SPEED5 = "10^5 high speed"
14
+ HIGH_SPEED6 = "10^6 high speed"
15
+ HIGH_SPEED7 = "10^7 high speed"
16
+ HIGH_SPEED8 = "10^8 high speed"
17
+ HIGH_SPEED9 = "10^9 high speed"
18
+ HIGH_SPEED10 = "10^10 high spd"
19
+ HIGH_SPEED11 = "10^11 high spd"
20
20
 
21
21
 
22
22
  class QDV2F(StandardReadable):