dls-dodal 1.60.0__py3-none-any.whl → 1.62.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.
Files changed (45) hide show
  1. {dls_dodal-1.60.0.dist-info → dls_dodal-1.62.0.dist-info}/METADATA +1 -1
  2. {dls_dodal-1.60.0.dist-info → dls_dodal-1.62.0.dist-info}/RECORD +45 -30
  3. dodal/_version.py +2 -2
  4. dodal/beamlines/i04.py +1 -1
  5. dodal/beamlines/i19_2.py +10 -0
  6. dodal/devices/apple2_undulator.py +85 -52
  7. dodal/devices/areadetector/__init__.py +0 -0
  8. dodal/devices/areadetector/plugins/__init__.py +0 -0
  9. dodal/devices/attenuator/__init__.py +0 -0
  10. dodal/devices/controllers.py +8 -6
  11. dodal/devices/electron_analyser/abstract/__init__.py +2 -2
  12. dodal/devices/electron_analyser/abstract/base_detector.py +13 -26
  13. dodal/devices/electron_analyser/abstract/base_driver_io.py +5 -4
  14. dodal/devices/electron_analyser/abstract/base_region.py +28 -13
  15. dodal/devices/electron_analyser/detector.py +19 -31
  16. dodal/devices/electron_analyser/specs/driver_io.py +0 -1
  17. dodal/devices/electron_analyser/vgscienta/driver_io.py +0 -1
  18. dodal/devices/fast_grid_scan.py +111 -32
  19. dodal/devices/fast_shutter.py +57 -0
  20. dodal/devices/i02_1/fast_grid_scan.py +1 -1
  21. dodal/devices/i04/murko_results.py +24 -12
  22. dodal/devices/i10/i10_apple2.py +15 -15
  23. dodal/devices/i10/rasor/__init__.py +0 -0
  24. dodal/devices/i11/__init__.py +0 -0
  25. dodal/devices/i15/__init__.py +0 -0
  26. dodal/devices/i15/dcm.py +10 -9
  27. dodal/devices/i15/focussing_mirror.py +4 -20
  28. dodal/devices/i15/jack.py +2 -10
  29. dodal/devices/i15/laue.py +1 -5
  30. dodal/devices/i15/multilayer_mirror.py +1 -5
  31. dodal/devices/i15/rail.py +1 -5
  32. dodal/devices/i18/__init__.py +0 -0
  33. dodal/devices/i19/mapt_configuration.py +38 -0
  34. dodal/devices/i19/pin_col_stages.py +170 -0
  35. dodal/devices/i22/__init__.py +0 -0
  36. dodal/devices/i24/commissioning_jungfrau.py +9 -1
  37. dodal/devices/mx_phase1/__init__.py +0 -0
  38. dodal/devices/oav/snapshots/__init__.py +0 -0
  39. dodal/devices/xspress3/__init__.py +0 -0
  40. dodal/parameters/__init__.py +0 -0
  41. dodal/plans/configure_arm_trigger_and_disarm_detector.py +27 -5
  42. {dls_dodal-1.60.0.dist-info → dls_dodal-1.62.0.dist-info}/WHEEL +0 -0
  43. {dls_dodal-1.60.0.dist-info → dls_dodal-1.62.0.dist-info}/entry_points.txt +0 -0
  44. {dls_dodal-1.60.0.dist-info → dls_dodal-1.62.0.dist-info}/licenses/LICENSE +0 -0
  45. {dls_dodal-1.60.0.dist-info → dls_dodal-1.62.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dls-dodal
3
- Version: 1.60.0
3
+ Version: 1.62.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
@@ -1,7 +1,7 @@
1
- dls_dodal-1.60.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1
+ dls_dodal-1.62.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=DQ2eCF3LevBLy0Ytmwazcpp3NBvIb4zB_mzF8VnCjP4,706
4
+ dodal/_version.py,sha256=5VUVRHNcXnR6NHNHVw0jy5canKWEf1jsJRKy9oQveHA,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
@@ -20,7 +20,7 @@ dodal/beamlines/b18.py,sha256=ryxrGtcCdwoFgZ8ljWYgr1g9gKvoA7nxkARVxl1IE78,1189
20
20
  dodal/beamlines/b21.py,sha256=QGn0b88Od5-PCbleKwR6CSOleAY0vriybxcWlc58NS0,3851
21
21
  dodal/beamlines/i02_1.py,sha256=SwRm9v1U6CiT0fwLbSTECbJ6OF1BPEx4TJ0cEReuGZA,4017
22
22
  dodal/beamlines/i03.py,sha256=S2mJikFdZiV0e3VLNwHp38OCk_rL9wnWD009a7tH5kE,16203
23
- dodal/beamlines/i04.py,sha256=b42_K8Fe2GonF7SUMwac8oEWnJyLOuhYQ12wdys_oQQ,13757
23
+ dodal/beamlines/i04.py,sha256=QyprATHFxnw_cP2gak1i2_ywj-i26vrGlvOYM6RmyTY,13758
24
24
  dodal/beamlines/i05.py,sha256=v4QKd8-neh4Og205oovm6NDRnAU6Oktu1WrxalXsI40,656
25
25
  dodal/beamlines/i05_1.py,sha256=R6JFFg8Bj-Izw355mx3mOd4IDvJb5ipB4p7_S0I_4Z0,670
26
26
  dodal/beamlines/i09.py,sha256=E7PgMfJAixwvxd5bKzqX8ifVNExbzVMUYFN22TTTAFU,1594
@@ -35,7 +35,7 @@ dodal/beamlines/i15_1.py,sha256=TomeTLsYSvL5en8GPvI8driQa5nMObrB5DrMKckHig8,3898
35
35
  dodal/beamlines/i17.py,sha256=Nickt8CKQ9JcQ1D_ulNICUT4jjLF1Aib7D9jblSnzA4,987
36
36
  dodal/beamlines/i18.py,sha256=FuU8G-q1piu6BRou-Shj3BQEbNtsF7CUsSIqqkvCKZc,3615
37
37
  dodal/beamlines/i19_1.py,sha256=xAI9B3fyUKtoO-tnAF7wWQelrXQ6QrYNgEyncHqVzn4,3057
38
- dodal/beamlines/i19_2.py,sha256=x-k6Dy2_Jy_9Z4Jh5ytcQWsOQlk4MRAsLOX55Fjz4t0,3171
38
+ dodal/beamlines/i19_2.py,sha256=gY4YBYW_uble5rr74fxoW7490UXJdsFVDWALT_Zdp3Y,3594
39
39
  dodal/beamlines/i19_optics.py,sha256=8hdlDAAMgFrhcXrp5xCPZtLUlrDUEC9VwKnnuUAMbbU,1150
40
40
  dodal/beamlines/i20_1.py,sha256=Zsr1lsH7ySbOgK7RhMVMWzNWZAV-fuYW0iAjSEJZicY,2625
41
41
  dodal/beamlines/i21.py,sha256=5v6iiTlY4kWlWvQ_uNidJSotvkdNF3qdjR49l7sIYPc,728
@@ -68,19 +68,20 @@ dodal/common/beamlines/device_helpers.py,sha256=8sasAIFRDwo6ElHqLrXnpj_v7xcEg-29
68
68
  dodal/devices/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
69
  dodal/devices/aperture.py,sha256=S7AoIoQg_kFxaQk7HUMijbm1kYkOEi2csbdj76kp1ys,427
70
70
  dodal/devices/aperturescatterguard.py,sha256=FH2oru3DU-I6BwOJOVEgHdFplLKIIknxtEBUBAXZ_WA,13946
71
- dodal/devices/apple2_undulator.py,sha256=-IKrEFatjbyI8nbfbCsAmsYWZU-l4A0gXFDJ-WPYEpw,22144
71
+ dodal/devices/apple2_undulator.py,sha256=LjhU4ILkSrhnccHOwOrOT9HenowKmI0NFHLfpQk14lY,23035
72
72
  dodal/devices/backlight.py,sha256=y40kR6N3qSFVLRaGU8CjJJpwv_hq2QALf_85fLQqras,1415
73
73
  dodal/devices/baton.py,sha256=315I_0V73_DYYVT0PBs0luVy4CMqdPo0kLvHBi12MIU,606
74
74
  dodal/devices/bimorph_mirror.py,sha256=OGe6aCczG0gVco4OvIRLJVxn2kw5F2QG1e06uqhFLTw,4609
75
75
  dodal/devices/collimation_table.py,sha256=64HunSPJH-L2gZdfIj_RYdOlOuwRFEfMHfLHzu4BAKI,1681
76
76
  dodal/devices/common_dcm.py,sha256=8QSRE6Z10RQjfL3g4JZhyHRNI_aCKxWlzKSsDgiJHhE,3049
77
- dodal/devices/controllers.py,sha256=un-12-ts65rKJ4Az6gwnIWIUGvAH6KxAQhZ2u2iJ1O4,542
77
+ dodal/devices/controllers.py,sha256=W_Ras1c6xLjcOMKPSHN8Z1eCUCH-ktaah2hzQXyuFLk,652
78
78
  dodal/devices/cryostream.py,sha256=2FxCGioEZNMHItsGm_rsnkRnHjwMUIwRMAX_x8odKIw,4678
79
79
  dodal/devices/diamond_filter.py,sha256=hySd7HnLdplpPNvBrLddLjO_3LqgD8-99Zr__Sy_GbI,689
80
80
  dodal/devices/eiger.py,sha256=ZKaRXF-YnYWuMW94BIg-gmdKW7JKmtMUvehF3S5XaLY,16670
81
81
  dodal/devices/eiger_odin.py,sha256=1JoqPppTp99IZCiFOXJZB3h62xXRYKZINxTYXdLnT8c,7480
82
82
  dodal/devices/eurotherm.py,sha256=rdLldmWYP1PZBckoya6svPy1mDxHYaa1IfMleMPGzD4,3832
83
- dodal/devices/fast_grid_scan.py,sha256=Bng0FFIw3PYqdqX2Mj-KhyGRKIbKZVYEygzrYtylorY,14530
83
+ dodal/devices/fast_grid_scan.py,sha256=2k2Ub-ywwfwCfmlofjnhkumXk07bidDfF86DPN7hcrA,17365
84
+ dodal/devices/fast_shutter.py,sha256=kgYafhBURRTN6edrhv0xKggxkSEWGXg2rhWz_ewLZhc,1837
84
85
  dodal/devices/fluorescence_detector_motion.py,sha256=hJ1M9Zs6Dlw8DDL9APh7yVePlS4tU2hnlySd16hqfwE,346
85
86
  dodal/devices/flux.py,sha256=1CDsq9yU2-ho8MfYBl50Tl9ABZwpUBHnV486PQXKNoQ,462
86
87
  dodal/devices/focusing_mirror.py,sha256=2UWVrY6bs6_0i-h6JJ_LAUZPX_FgMzIx04JqZafdtYU,7464
@@ -111,8 +112,11 @@ dodal/devices/xbpm_feedback.py,sha256=HKLY3k52FPe2G-EAg8ir2LSdeUuGvhRD73ibDZ4mjH
111
112
  dodal/devices/aithre_lasershaping/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
113
  dodal/devices/aithre_lasershaping/goniometer.py,sha256=-2ewYMcdzB1DqP9sMpr4L1i4KeTCrGAJfngAt9-eFWw,1005
113
114
  dodal/devices/aithre_lasershaping/laser_robot.py,sha256=vy-I1ASYflFYIUYePhT2l3l7g2iekrIFzLxA0GLmKY8,717
115
+ dodal/devices/areadetector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
114
116
  dodal/devices/areadetector/plugins/CAM.py,sha256=sZzJm5Ez3eWfXZi_EB67wluhZmMQm1UyOc2bJFfzd1U,964
115
117
  dodal/devices/areadetector/plugins/MJPG.py,sha256=QTsxCoWbofNpLMGPoOR2hWoM33KyntuLepbF0YmX0KE,3031
118
+ dodal/devices/areadetector/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
+ dodal/devices/attenuator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
120
  dodal/devices/attenuator/attenuator.py,sha256=-rJYY_bHCDl8NVn3yYPytYIANiOPsz0f-3U1zBsT5pE,6246
117
121
  dodal/devices/attenuator/filter.py,sha256=xb_8S62ktJdqdNE03PqhsfsTsQyTsRbR9CF1ksfX06M,542
118
122
  dodal/devices/attenuator/filter_selections.py,sha256=k77EKESAlbA_ZUf1eNBdzMa8Xs8Mmmmb7XBkhipo3lE,1900
@@ -136,35 +140,35 @@ dodal/devices/detector/det_resolution.py,sha256=aQkKp24LpRGiwzPAQM3wLVa4ANw32Hdr
136
140
  dodal/devices/detector/detector.py,sha256=DqQvlgdjIdKErrZqgM9IH7drc-r6N8nhkFk7KwlgYAk,4815
137
141
  dodal/devices/detector/detector_motion.py,sha256=Ly4nz_AsB-_EDOADMC2u2J0dunpkOMbafVN_dgh3T-E,1389
138
142
  dodal/devices/electron_analyser/__init__.py,sha256=mpC48s2fK58aEKI-Fl3CiYBb4tXgcaa4Msj8_jLpH8g,956
139
- dodal/devices/electron_analyser/detector.py,sha256=nnZ5bGaZJql-G9JaDK9VqLcsbPXb7hRSSfO1103JbX0,5046
143
+ dodal/devices/electron_analyser/detector.py,sha256=FE8Qh7H01tej5GqWLXtCbiWo4n7OGm6q-QVViv-dqZ8,4749
140
144
  dodal/devices/electron_analyser/energy_sources.py,sha256=NO3oxaVgmXnm6QuvyPBaeFbTjl3KwXzXY7EsdOhjATM,3152
141
145
  dodal/devices/electron_analyser/enums.py,sha256=ruSH7LNRhtqMflv7gYxKeAu0uLzZIaoCai7sSTzpvkg,204
142
146
  dodal/devices/electron_analyser/types.py,sha256=_kmdSp4E98fsusg5Wg-Hyo25zHYA_pMe_hFW8lKe3tE,1869
143
147
  dodal/devices/electron_analyser/util.py,sha256=ZFQJxxwDPIr43859DPIS9lBuq54phUT3R2f_Rbn-FbU,1235
144
- dodal/devices/electron_analyser/abstract/__init__.py,sha256=4M9RF4ccXRnkK0zrNzt3vR-8vHgqcPiCl2CPXHSlyxg,620
145
- dodal/devices/electron_analyser/abstract/base_detector.py,sha256=_jcUSZoHJNwLVI_HLk7DD8vEjZTSN2E3APJS8-Ssjzc,2368
146
- dodal/devices/electron_analyser/abstract/base_driver_io.py,sha256=uQVsw43RigLJ_nWxS6RxtzeSjrfNgFHz5aOcbBrxIvI,9839
147
- dodal/devices/electron_analyser/abstract/base_region.py,sha256=DXJkDBJUyD7gi0ZEksXP5Wh1EZvmVbSlOevbZUHrVjU,5056
148
+ dodal/devices/electron_analyser/abstract/__init__.py,sha256=OE5iU5L_7wQudl3cddtMk6eRNbXzZxqiVIzaOAZmuxc,612
149
+ dodal/devices/electron_analyser/abstract/base_detector.py,sha256=alBDZgJxNYLAHDrUa_C5tRUSlujxwWdBebFHDQ8jOv0,2055
150
+ dodal/devices/electron_analyser/abstract/base_driver_io.py,sha256=1j_bCS1k4LqyOBvlt34ijGOLbgX3vboxOUD4j-zv-MU,9963
151
+ dodal/devices/electron_analyser/abstract/base_region.py,sha256=DY5wNs-BMYimkH5tpBEqXGq4n0YhHpk81kuHASveBpw,5702
148
152
  dodal/devices/electron_analyser/abstract/types.py,sha256=eoeO7sqlv5RE7AEnyzsxHyuBXlUzOIYdRLWp0EnLyAU,596
149
153
  dodal/devices/electron_analyser/specs/__init__.py,sha256=qN57kY6ERUGdrAWhU5m8CBrc0KaqiOGwPL6h2BNm3i0,291
150
154
  dodal/devices/electron_analyser/specs/detector.py,sha256=RaNkSmQ_Jb9AuwQqVqo3vv5Q6DcTtpoVqqRAQvgoeEs,1139
151
- dodal/devices/electron_analyser/specs/driver_io.py,sha256=vfiwK2TcDMJ5AbSPqwJDI9Xs1t0In7KzHys7PgCjNAg,4557
155
+ dodal/devices/electron_analyser/specs/driver_io.py,sha256=_6FG5zXGw8vzKc8JzyxdqqQAcU5mBoDjrF_ehfG9h8w,4500
152
156
  dodal/devices/electron_analyser/specs/enums.py,sha256=cXPcbIGEN5ZJJt1KeiNJEtZkkcjQ-fz7dBfsU283zYQ,235
153
157
  dodal/devices/electron_analyser/specs/region.py,sha256=P7rwbY72-QGKzC6TeldmP8sTmardpB_-rYx7gPVCMqo,1213
154
158
  dodal/devices/electron_analyser/vgscienta/__init__.py,sha256=5ZUJcUkJJ9ruwE0PzCFdA0HyWKrfjxaUBeGAMCC9JH4,357
155
159
  dodal/devices/electron_analyser/vgscienta/detector.py,sha256=JkO8E5N8tQjYfaHMXoDV6r3oEyzTC0oQI5IqWbOmvxw,1446
156
- dodal/devices/electron_analyser/vgscienta/driver_io.py,sha256=ISOQek03DK7UItZwZY4DxatyLwGmOlgQn131onVcmtE,3567
160
+ dodal/devices/electron_analyser/vgscienta/driver_io.py,sha256=c1v3AOSGKp6DlVmE82rvuN5aYElWsHeWPtYHPLwIM-s,3510
157
161
  dodal/devices/electron_analyser/vgscienta/enums.py,sha256=3vmX67ExATU8clueVp_mCzw3OUQx799oZMc8gyHtMJE,205
158
162
  dodal/devices/electron_analyser/vgscienta/region.py,sha256=6k6Eah6_I74Pi2_a0KfyMYFfwHwJbh1ndqy0fuq5o14,2184
159
163
  dodal/devices/i02_1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
- dodal/devices/i02_1/fast_grid_scan.py,sha256=eyWE-urpxY10_KZK4Vg48Rau0rTK3O2Ul4IcK6P2Geg,2428
164
+ dodal/devices/i02_1/fast_grid_scan.py,sha256=bfiumNayrISFGYqdcd3Bh6lEZvkOxrqyX_B24LYW1nU,2429
161
165
  dodal/devices/i02_1/sample_motors.py,sha256=fAHAyeuP4hjOnYsp2x5VQNrTh8Di35ezJV1si2YmKPY,607
162
166
  dodal/devices/i03/__init__.py,sha256=Kvukapy4a5lUQ20qaCqYCJzKNaqJn2DfXP5nKZ_Pec8,118
163
167
  dodal/devices/i03/dcm.py,sha256=zDcgxOdMRVOQZBGDsLaIlr7o4UJIK2vehPWHxAxt6VA,2268
164
168
  dodal/devices/i03/undulator_dcm.py,sha256=L7dr1QcwJ1SiQWkHm0a4yQVJFtPiAJQyDLEXok64Ab8,2857
165
169
  dodal/devices/i04/__init__.py,sha256=Kvukapy4a5lUQ20qaCqYCJzKNaqJn2DfXP5nKZ_Pec8,118
166
170
  dodal/devices/i04/constants.py,sha256=_Dw28NeXldwRYH-h6YP6OHnyj7h0z4NQs_-RysNby5Q,281
167
- dodal/devices/i04/murko_results.py,sha256=JZNW0_G0f41ZWjp1l0TxBuYWcqjfr1XPpGRe4ObCVUk,8506
171
+ dodal/devices/i04/murko_results.py,sha256=Lool7IqYrYoUojexKpoVK8C4ztk9-sNFDg5lcPHBFSw,8949
168
172
  dodal/devices/i04/transfocator.py,sha256=sVI4Bgv-2-DH4-F1nIXMp5Aktevrm3agZnCA-WgjmW8,3780
169
173
  dodal/devices/i05/__init__.py,sha256=v0Axsf-vMyLyxcbqS8lljJc0BQ5Tw8yVBTWcO3tG_4g,67
170
174
  dodal/devices/i05/enums.py,sha256=9FHBIexkSfZSTHxUnGupravfG9sVriHcrB15jemkQOQ,191
@@ -175,13 +179,15 @@ dodal/devices/i09_1/__init__.py,sha256=dTazun87AkMDXh7J8gIZYJxJth0XUs72qahJ-VvhR
175
179
  dodal/devices/i09_1/enums.py,sha256=FwhsvKnEcm9M22U4gcAJi6FE2RaUBZH0jRjNgJUKRqc,1319
176
180
  dodal/devices/i10/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
177
181
  dodal/devices/i10/diagnostics.py,sha256=iEPScPnjhLX20dD313hBekqM2OmL_WYQN-4yKAMOFWU,5440
178
- dodal/devices/i10/i10_apple2.py,sha256=QN5y03VNE52DyMB6wI6trd7JYzQmQuXBKVod9dL2jRg,19489
182
+ dodal/devices/i10/i10_apple2.py,sha256=Rqk_xaBdIqpimjosFvM4_z5r-PkY0pPEoR2xjyqgWKI,19480
179
183
  dodal/devices/i10/i10_setting_data.py,sha256=69XWgE-YNTiW7C3t67MNcTL5JDDhOo7h-X7DCTpFE5g,164
180
184
  dodal/devices/i10/mirrors.py,sha256=Zofd0g2f3YvFi_KIHQE_w4dFZNglhmh--65tRnWLuyY,504
181
185
  dodal/devices/i10/slits.py,sha256=jI4wJPVT2vtl4bvabrU9u_v-SdGjOfDLBm0S9GMZC7w,4157
186
+ dodal/devices/i10/rasor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
187
  dodal/devices/i10/rasor/rasor_current_amp.py,sha256=hImaPI3veKiS5YVfYwv-qrQ1AYNBjFVxG_MwTQqtkcc,2368
183
188
  dodal/devices/i10/rasor/rasor_motors.py,sha256=yWBxsiVhbdkQzhaK1S-nUq_wVntwHgdf6T8c8f7wHUE,1327
184
189
  dodal/devices/i10/rasor/rasor_scaler_cards.py,sha256=sfWJKNx6pq342PEAlmg_Yt_Tijq7mO1XFjcCDtToQiU,467
190
+ dodal/devices/i11/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
185
191
  dodal/devices/i11/cyberstar_blower.py,sha256=YngbNzNkWVj_LUGEIqo9JRxRQ0PT7zjouj2VljdDlOk,1033
186
192
  dodal/devices/i11/diff_stages.py,sha256=3kcBRUvIwaqmoVf9MxY0CvU8LBbX_qaGhqbbYEmOri4,1713
187
193
  dodal/devices/i11/mythen.py,sha256=_fi7SAoWfJ34RyfSNXEyG0gwP0ox6_l9RUN9BF6OBUI,5221
@@ -190,14 +196,16 @@ dodal/devices/i11/spinner.py,sha256=PjumM7QRB7iFUtN4b6xCvxKItYUNX2XLLWDupy5LI_M,
190
196
  dodal/devices/i13_1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
191
197
  dodal/devices/i13_1/merlin.py,sha256=mgTFSMJftRzLL-HXAUuJkOYxtyA3Rp8YX0L46JCb30Y,1019
192
198
  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
199
+ dodal/devices/i15/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
200
+ dodal/devices/i15/dcm.py,sha256=MQK2oHQOPB1pUyc4uWwIvzb3WWP8PuzaPe5O4Zqt0TM,3089
201
+ dodal/devices/i15/focussing_mirror.py,sha256=E6T_c7M2osgHLa7u8eUfQJlXlJbZHtOp95FhP3qZ4gY,1739
202
+ dodal/devices/i15/jack.py,sha256=VafCNx-uqkIy0LxbBAhSm_tuC8_SbGCrnTbvQCExAzA,962
203
+ dodal/devices/i15/laue.py,sha256=H0nLPH8gqJejBZtZeY0lv84EaE2lqdL3CmXvT9iHhpk,496
197
204
  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
205
+ dodal/devices/i15/multilayer_mirror.py,sha256=qdxnn6PBAxK0MgeVUpM8Ukkq4tdX3jhjlmyU-AzzH4M,741
206
+ dodal/devices/i15/rail.py,sha256=9cRTRKy6uZBASMhK1wC8K_k_5FfLgHnoh9VblSOTkpQ,428
200
207
  dodal/devices/i18/KBMirror.py,sha256=W4R3TeulSjosUqAFIIznyWzje_Y2AoEf9f8N-NkisYM,710
208
+ dodal/devices/i18/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
209
  dodal/devices/i18/diode.py,sha256=nk5kvn4LsbhczRpCwHOO0_jJTYOz7MP9qm_uvBWuv7c,1468
202
210
  dodal/devices/i19/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
203
211
  dodal/devices/i19/backlight.py,sha256=c3F8RTessUJmJHlCWATSj-W25qlkAttb-c95eS28lKs,662
@@ -205,10 +213,13 @@ dodal/devices/i19/beamstop.py,sha256=JkcvkEmcC3eY3GHrvYNGqv2yDwrfgdpWKVZJWSadWW8
205
213
  dodal/devices/i19/blueapi_device.py,sha256=Tsl4vsREz7FM2d-kKJK-9tGrYbyKq4SLxnMlEKIM-g8,3966
206
214
  dodal/devices/i19/diffractometer.py,sha256=QCEi0Gko6Ja9_ec2vfdazwMspknvX63jcz8hQ2XW1xo,1182
207
215
  dodal/devices/i19/hutch_access.py,sha256=hnClUWCL1qTYzuBMmhXX85jiNak7mbYfyHEh54tZ27U,377
216
+ dodal/devices/i19/mapt_configuration.py,sha256=0zUzCSDofQORdaqbgD5NU-Vuf-EljgTKfvFDRDA9IjQ,1717
217
+ dodal/devices/i19/pin_col_stages.py,sha256=SAdokjoTmlRcCQQSVTz4jCkBibSsKCye7s5aYtfhsfg,6691
208
218
  dodal/devices/i19/shutter.py,sha256=B4KP0Ruc8Ex47OfCskbjYSSu81jz4tK9GC_7pxMIkgI,2140
209
219
  dodal/devices/i20_1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
210
220
  dodal/devices/i21/__init__.py,sha256=1H0Ov9s8K7nu6e20WtQDH39wgSKWz2ChRVAUzytIyzQ,67
211
221
  dodal/devices/i21/enums.py,sha256=asy90S84fBBydYwz89jNeocz04JXpbHn8ynaPzW353c,141
222
+ dodal/devices/i22/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
212
223
  dodal/devices/i22/dcm.py,sha256=s3RU6NxsQxOc_YgMBwR8lhboStI1gCDKbWc5pk22O0M,4489
213
224
  dodal/devices/i22/fswitch.py,sha256=kpgegs4Wv_weBSzbrlXLXqXOOZdzTn3X9k5PlEN5F6c,2881
214
225
  dodal/devices/i22/nxsas.py,sha256=M6hhiPmHO4WDBsFoSOhKAG_yPF6vTpLRPbB2UW3-aMs,6122
@@ -216,12 +227,13 @@ dodal/devices/i24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
216
227
  dodal/devices/i24/aperture.py,sha256=dlH_g7OPTBc5QRMd-ADU3_GDTKh668kkMHo4k_JxUcY,770
217
228
  dodal/devices/i24/beam_center.py,sha256=nQyOif6JtlU_qP7kZP-8wN1ldW81MIbFUykPC1bEm70,446
218
229
  dodal/devices/i24/beamstop.py,sha256=6tbiQLlcTlp4PCPhHJ_mlHtkv0kz5ArQ99zg9rwTnrw,1133
219
- dodal/devices/i24/commissioning_jungfrau.py,sha256=kVt19MS0d9kZhBCgQnWAsC5kxMY9ckTEIprggf-gveY,4217
230
+ dodal/devices/i24/commissioning_jungfrau.py,sha256=i-B6Sy2braKSGYF2G7QrluPkThXHY-YiULUJRqClFok,4532
220
231
  dodal/devices/i24/dcm.py,sha256=l7qbJh2JKL-5ANlMYXDeU5EBYY6mDiLxn7kp_Z9KNaM,1206
221
232
  dodal/devices/i24/dual_backlight.py,sha256=N0R7M1mHPRmQ4fks5lGU1wrXjOvcW_ZKIXaRoC8aLDE,2084
222
233
  dodal/devices/i24/focus_mirrors.py,sha256=DYiYLpDw8FJ1LYHxLOxE_om5qGfUo2itzskgqhmQZlg,1763
223
234
  dodal/devices/i24/pmac.py,sha256=-HYf2HPzaqWvszp4T8TXohdp40-xmKqQq4V0mLvVri8,7028
224
235
  dodal/devices/i24/vgonio.py,sha256=sxSmcYZayVJPJz_D_91j9PmNor7Tbl1RGQFRrdtESlw,533
236
+ dodal/devices/mx_phase1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
225
237
  dodal/devices/mx_phase1/beamstop.py,sha256=GeHLqHVf3XwJSszUHuxZ2JBwQlcDiFs6jVpdHuw7snM,3127
226
238
  dodal/devices/oav/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
227
239
  dodal/devices/oav/oav_calculations.py,sha256=qoaNz4MAdbpu0XHAkWTQ3rebFwsWfa8JA1eerUgISjA,2367
@@ -232,6 +244,7 @@ dodal/devices/oav/utils.py,sha256=T-xg7J38ritzXwRrKjsWZ7daC_qR7aNhlbkXx75nJ8Q,31
232
244
  dodal/devices/oav/pin_image_recognition/__init__.py,sha256=ZDqvAk-Nvw_WM00efxfx2aDEoK1T5QydIciqqCCpp7Q,6302
233
245
  dodal/devices/oav/pin_image_recognition/manual_test.py,sha256=h1Rto6ZDCB3jWhjSy9N8ECxRN583iYDJr9LxrTJ8kfE,903
234
246
  dodal/devices/oav/pin_image_recognition/utils.py,sha256=L9ypluYqeOFoS7gQuws-vTNc8LqaKl2ZIDNeQ2JaNpg,8592
247
+ dodal/devices/oav/snapshots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
235
248
  dodal/devices/oav/snapshots/grid_overlay.py,sha256=CdvCdTKMCiwMwxm2lV28KpcIUSXlscZmWxb73_KKmiI,3694
236
249
  dodal/devices/oav/snapshots/snapshot.py,sha256=VDHYxko97sATMKvD5wClgvN7WQUtUAjcXXSyoQAL8q8,499
237
250
  dodal/devices/oav/snapshots/snapshot_image_processing.py,sha256=wDxH9WPmB0nsotr49PUpw2Ke4l4RFxirrbpPzOUF9s4,2318
@@ -250,6 +263,7 @@ dodal/devices/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
250
263
  dodal/devices/util/adjuster_plans.py,sha256=c40PFZpXFw0YmJLh9jU4VIb8vRxHyafZlmvprTKAOhM,824
251
264
  dodal/devices/util/epics_util.py,sha256=4useFL8ngsVF08fhOn48BlnO4oh0T4sEKqjdS6mjvG0,4687
252
265
  dodal/devices/util/lookup_tables.py,sha256=jH9f_D8JbTSqzL-RKHUWOORLt8lEoNQL3o9HpXE98TY,3476
266
+ dodal/devices/xspress3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
253
267
  dodal/devices/xspress3/xspress3.py,sha256=OerapEy-IuK7EFz13B5z0BzBmESVl6pYUlqAWHIwJck,4555
254
268
  dodal/devices/xspress3/xspress3_channel.py,sha256=w8tAx2lz5kJ_LeJ_eb_4o--Dtt8MRijsYNgDG6oEIVg,1626
255
269
  dodal/devices/zebra/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -260,6 +274,7 @@ dodal/devices/zocalo/__init__.py,sha256=W3R09eHAmybP4BcM_gHy6gVAW5_gVSnFq2o3z2iT
260
274
  dodal/devices/zocalo/zocalo_constants.py,sha256=vu7Xjz7UNEpBUWEEBxDvP4bVFkZIN6NLGfQDpWbCjH8,98
261
275
  dodal/devices/zocalo/zocalo_interaction.py,sha256=GFukU9xqagQtVSDg5BrL23jxl1w8wjs4b4NLLqdFfpk,3584
262
276
  dodal/devices/zocalo/zocalo_results.py,sha256=8ZYkNB-By47Ag_p68iOq7jK8_P-LAsWPNs0m_DhnVEQ,12639
277
+ dodal/parameters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
263
278
  dodal/parameters/experiment_parameter_base.py,sha256=vONep-llSqhM0OpVj3zFUxdnzRQpu9y9mPhh2HauEJE,226
264
279
  dodal/plan_stubs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
265
280
  dodal/plan_stubs/check_topup.py,sha256=3gyLHfHNQBCgEWuAg4QE-ONx7y2Do1vVv5HP8ss0Z1I,5371
@@ -268,7 +283,7 @@ dodal/plan_stubs/motor_utils.py,sha256=Mf8utOA_xmxUa2dLmQ1uRkdfyDTip7D8YcKeCBCQL
268
283
  dodal/plan_stubs/wrapped.py,sha256=kC8HH7bx3-sLYu2oieY_502tAdT2OECF8n-fqoL5Bfc,4266
269
284
  dodal/plans/__init__.py,sha256=nH1jNxw3DzDMg9O8Uda0kqKIalRVEWBrq07OLY6Ey38,93
270
285
  dodal/plans/bimorph.py,sha256=JxDmZDiEvZnz5f22tlaoyivpnaNGiX8kSL82qz5uvMM,11738
271
- dodal/plans/configure_arm_trigger_and_disarm_detector.py,sha256=Ndg6Tuqvu4WesTxtDlzzgeJh0BP7aWJ-TbYlforDkjM,5454
286
+ dodal/plans/configure_arm_trigger_and_disarm_detector.py,sha256=VLsNhHx8NPFLhNeUd_EjlbOPqe18C-SEZEWGGmXtf_Y,6170
272
287
  dodal/plans/save_panda.py,sha256=1fumH7Ih8uDIv8ahAtgQ_vUuR3dz0sfUs4n9TEtEbSs,3053
273
288
  dodal/plans/scanspec.py,sha256=Q0AcvTKRT401iGMRDSqK-D523UX5_ofiVMZ_rNXKOx8,2074
274
289
  dodal/plans/verify_undulator_gap.py,sha256=OcDN09-eCoMzsmhKGxvzsH5EapG2zYz0yGCqUtQxLSc,568
@@ -279,8 +294,8 @@ dodal/testing/__init__.py,sha256=AUYZKAvVOs7ZvxO1dVhL0pDTleRO34FQlO5MNe_cwgU,96
279
294
  dodal/testing/setup.py,sha256=8cQnrzE5MQD4Etf0eqMarmtr-opsUOMQww-k1V7DzIQ,2442
280
295
  dodal/testing/electron_analyser/__init__.py,sha256=-lc1opD2dCv0x678-J-ApOhHtvEvcslfOQ7E613U8-Y,118
281
296
  dodal/testing/electron_analyser/device_factory.py,sha256=tkMY6fW3iI02DTD1XXHi4lH6sjo8RHHZBGDHSuTdmNU,2243
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,,
297
+ dls_dodal-1.62.0.dist-info/METADATA,sha256=oUaFqOHwl4hc_7ifCVwr1lskpYdxni_oGRG1eihyPog,16941
298
+ dls_dodal-1.62.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
299
+ dls_dodal-1.62.0.dist-info/entry_points.txt,sha256=bycw_EKUzup_rxfCetOwcauXV4kLln_OPpPT8jEnr-I,94
300
+ dls_dodal-1.62.0.dist-info/top_level.txt,sha256=xIozdmZk_wmMV4wugpq9-6eZs0vgADNUKz3j2UAwlhc,6
301
+ dls_dodal-1.62.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.60.0'
32
- __version_tuple__ = version_tuple = (1, 60, 0)
31
+ __version__ = version = '1.62.0'
32
+ __version_tuple__ = version_tuple = (1, 62, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
dodal/beamlines/i04.py CHANGED
@@ -234,7 +234,7 @@ def undulator() -> Undulator:
234
234
  """
235
235
  return Undulator(
236
236
  prefix=f"{PREFIX.insertion_prefix}-MO-SERVC-01:",
237
- id_gap_lookup_table_path="/dls_sw/i04/software/gda/config/lookupTables/BeamLine_Undulator_toGap.txt",
237
+ id_gap_lookup_table_path="/dls_sw/i04/software/daq_configuration/lookup/BeamLine_Undulator_toGap.txt",
238
238
  )
239
239
 
240
240
 
dodal/beamlines/i19_2.py CHANGED
@@ -11,6 +11,7 @@ from dodal.devices.i19.backlight import BacklightPosition
11
11
  from dodal.devices.i19.beamstop import BeamStop
12
12
  from dodal.devices.i19.blueapi_device import HutchState
13
13
  from dodal.devices.i19.diffractometer import FourCircleDiffractometer
14
+ from dodal.devices.i19.pin_col_stages import PinholeCollimatorControl
14
15
  from dodal.devices.i19.shutter import AccessControlledShutter
15
16
  from dodal.devices.synchrotron import Synchrotron
16
17
  from dodal.devices.zebra.zebra import Zebra
@@ -81,6 +82,15 @@ def synchrotron() -> Synchrotron:
81
82
  return Synchrotron()
82
83
 
83
84
 
85
+ @device_factory()
86
+ def pinhole_and_collimator() -> PinholeCollimatorControl:
87
+ """Get the i19-2 pinhole and collimator control device, instantiate it if it
88
+ hasn't already been. If this is called when already instantiated in i19-2,
89
+ it will return the existing object.
90
+ """
91
+ return PinholeCollimatorControl(prefix=PREFIX.beamline_prefix)
92
+
93
+
84
94
  @device_factory()
85
95
  def backlight() -> BacklightPosition:
86
96
  """Get the i19-2 backlight device, instantiate it if it hasn't already been.
@@ -301,9 +301,68 @@ class UndulatorJawPhase(SafeUndulatorMover[float]):
301
301
  )
302
302
 
303
303
 
304
+ class Apple2Motors(StandardReadable, Movable):
305
+ """
306
+ Device representing the combined motor controls for an Apple2 undulator.
307
+
308
+ Attributes
309
+ ----------
310
+ gap : UndulatorGap
311
+ The undulator gap motor device.
312
+ phase : UndulatorPhaseAxes
313
+ The undulator phase axes device, consisting of four phase motors.
314
+ """
315
+
316
+ def __init__(self, id_gap: UndulatorGap, id_phase: UndulatorPhaseAxes, name=""):
317
+ """
318
+ Parameters
319
+ ----------
320
+
321
+ id_gap: UndulatorGap
322
+ An UndulatorGap device.
323
+ id_phase: UndulatorPhaseAxes
324
+ An UndulatorPhaseAxes device.
325
+ name: str
326
+ Name of the device.
327
+ """
328
+ with self.add_children_as_readables():
329
+ self.gap = id_gap
330
+ self.phase = id_phase
331
+ super().__init__(name=name)
332
+
333
+ @AsyncStatus.wrap
334
+ async def set(self, id_motor_values: Apple2Val) -> None:
335
+ """
336
+ Check ID is in a movable state and set all the demand value before moving them
337
+ all at the same time. This should be modified by the beamline specific ID
338
+ class, if the ID motors has to move in a specific order.
339
+ """
340
+
341
+ # Only need to check gap as the phase motors share both fault and gate with gap.
342
+ await self.gap.raise_if_cannot_move()
343
+ await asyncio.gather(
344
+ self.phase.top_outer.user_setpoint.set(value=id_motor_values.top_outer),
345
+ self.phase.top_inner.user_setpoint.set(value=id_motor_values.top_inner),
346
+ self.phase.btm_inner.user_setpoint.set(value=id_motor_values.btm_inner),
347
+ self.phase.btm_outer.user_setpoint.set(value=id_motor_values.btm_outer),
348
+ self.gap.user_setpoint.set(value=id_motor_values.gap),
349
+ )
350
+ timeout = np.max(
351
+ await asyncio.gather(self.gap.get_timeout(), self.phase.get_timeout())
352
+ )
353
+ LOGGER.info(
354
+ f"Moving f{self.name} apple2 motors to {id_motor_values}, timeout = {timeout}"
355
+ )
356
+ await asyncio.gather(
357
+ self.gap.set_move.set(value=1, wait=False, timeout=timeout),
358
+ self.phase.set_move.set(value=1, wait=False, timeout=timeout),
359
+ )
360
+ await wait_for_value(self.gap.gate, UndulatorGateStatus.CLOSE, timeout=timeout)
361
+
362
+
304
363
  class EnergyMotorConvertor(Protocol):
305
364
  def __call__(self, energy: float, pol: Pol) -> tuple[float, float]:
306
- """Protocol to provide energy to motor position convertion"""
365
+ """Protocol to provide energy to motor position conversion"""
307
366
  ...
308
367
 
309
368
 
@@ -318,15 +377,13 @@ class Apple2(abc.ABC, StandardReadable, Movable):
318
377
  The class is designed to manage the undulator's gap, phase motors, and polarisation settings, while
319
378
  abstracting hardware interactions and providing a high-level interface for beamline operations.
320
379
 
321
- The class is abstract and requires beamline-specific implementations for set motor
380
+ The class is abstract and requires beamline-specific implementations for _set motor
322
381
  positions based on energy and polarisation.
323
382
 
324
383
  Attributes
325
384
  ----------
326
- gap : UndulatorGap
327
- The gap control device for the undulator.
328
- phase : UndulatorPhaseAxes
329
- The phase control device, consisting of four phase motors.
385
+ apple2_motors : Apple2Motors
386
+ A collection of gap and phase motor devices.
330
387
  energy : SignalR
331
388
  A soft signal for the current energy readback.
332
389
  polarisation_setpoint : SignalR
@@ -340,7 +397,7 @@ class Apple2(abc.ABC, StandardReadable, Movable):
340
397
 
341
398
  Abstract Methods
342
399
  ----------------
343
- set(value: float) -> None
400
+ _set(value: float) -> None
344
401
  Abstract method to set motor positions for a given energy and polarisation.
345
402
 
346
403
  Methods
@@ -363,8 +420,7 @@ class Apple2(abc.ABC, StandardReadable, Movable):
363
420
 
364
421
  def __init__(
365
422
  self,
366
- id_gap: UndulatorGap,
367
- id_phase: UndulatorPhaseAxes,
423
+ apple2_motors: Apple2Motors,
368
424
  energy_motor_convertor: EnergyMotorConvertor,
369
425
  name: str = "",
370
426
  ) -> None:
@@ -378,8 +434,7 @@ class Apple2(abc.ABC, StandardReadable, Movable):
378
434
  name: Name of the device.
379
435
  """
380
436
 
381
- self.gap = id_gap
382
- self.phase = id_phase
437
+ self.motors = apple2_motors
383
438
  self.energy_to_motor = energy_motor_convertor
384
439
  with self.add_children_as_readables(StandardReadableFormat.HINTED_SIGNAL):
385
440
  # Store the set energy for readback.
@@ -398,11 +453,11 @@ class Apple2(abc.ABC, StandardReadable, Movable):
398
453
  raw_to_derived=self._read_pol,
399
454
  set_derived=self._set_pol,
400
455
  pol=self.polarisation_setpoint,
401
- top_outer=self.phase.top_outer.user_readback,
402
- top_inner=self.phase.top_inner.user_readback,
403
- btm_inner=self.phase.btm_inner.user_readback,
404
- btm_outer=self.phase.btm_outer.user_readback,
405
- gap=id_gap.user_readback,
456
+ top_outer=self.motors.phase.top_outer.user_readback,
457
+ top_inner=self.motors.phase.top_inner.user_readback,
458
+ btm_inner=self.motors.phase.btm_inner.user_readback,
459
+ btm_outer=self.motors.phase.btm_outer.user_readback,
460
+ gap=self.motors.gap.user_readback,
406
461
  )
407
462
  super().__init__(name)
408
463
 
@@ -420,24 +475,32 @@ class Apple2(abc.ABC, StandardReadable, Movable):
420
475
  self._set_pol_setpoint(value)
421
476
  await self.set(await self.energy.get_value())
422
477
 
423
- @abc.abstractmethod
424
478
  @AsyncStatus.wrap
425
479
  async def set(self, value: float) -> None:
426
480
  """
427
481
  Set should be in energy units, this will set the energy of the ID by setting the
428
482
  gap and phase motors to the correct position for the given energy
429
483
  and polarisation.
430
- This method should be implemented by the beamline specific ID class as the
431
- motor positions will be different for each beamline depending on the
432
- undulator design and the lookup table used.
433
- _set can be used to set the motor positions for the given energy and
434
- polarisation provided that all motors can be moved at the same time.
484
+
435
485
 
436
486
  Examples
437
487
  --------
438
488
  RE( id.set(888.0)) # This will set the ID to 888 eV
439
489
  RE(scan([detector], id,600,700,100)) # This will scan the ID from 600 to 700 eV in 100 steps.
440
490
  """
491
+ await self._set(value)
492
+ self._set_energy_rbv(value) # Update energy after move for readback.
493
+ LOGGER.info(f"Energy set to {value} eV successfully.")
494
+
495
+ @abc.abstractmethod
496
+ async def _set(self, value: float) -> None:
497
+ """
498
+ This method should be implemented by the beamline specific ID class as the
499
+ motor positions will be different for each beamline depending on the
500
+ undulator design and the lookup table used. The set method can be
501
+ used to set the motor positions for the given energy and polarisation
502
+ provided that all motors can be moved at the same time.
503
+ """
441
504
 
442
505
  def _read_pol(
443
506
  self,
@@ -468,36 +531,6 @@ class Apple2(abc.ABC, StandardReadable, Movable):
468
531
 
469
532
  return read_pol
470
533
 
471
- async def _set(self, value: Apple2Val, energy: float) -> None:
472
- """
473
- Check ID is in a movable state and set all the demand value before moving them
474
- all at the same time. This should be modified by the beamline specific ID class
475
- , if the ID motors has to move in a specific order.
476
- """
477
-
478
- # Only need to check gap as the phase motors share both fault and gate with gap.
479
- await self.gap.raise_if_cannot_move()
480
- await asyncio.gather(
481
- self.phase.top_outer.user_setpoint.set(value=value.top_outer),
482
- self.phase.top_inner.user_setpoint.set(value=value.top_inner),
483
- self.phase.btm_inner.user_setpoint.set(value=value.btm_inner),
484
- self.phase.btm_outer.user_setpoint.set(value=value.btm_outer),
485
- self.gap.user_setpoint.set(value=value.gap),
486
- )
487
- timeout = np.max(
488
- await asyncio.gather(self.gap.get_timeout(), self.phase.get_timeout())
489
- )
490
- LOGGER.info(
491
- f"Moving f{self.name} energy and polorisation to {energy}, {await self.polarisation.get_value()}"
492
- + f"with motor position {value}, timeout = {timeout}"
493
- )
494
- await asyncio.gather(
495
- self.gap.set_move.set(value=1, wait=False, timeout=timeout),
496
- self.phase.set_move.set(value=1, wait=False, timeout=timeout),
497
- )
498
- await wait_for_value(self.gap.gate, UndulatorGateStatus.CLOSE, timeout=timeout)
499
- self._set_energy_rbv(energy) # Update energy after move for readback.
500
-
501
534
  def determine_phase_from_hardware(
502
535
  self,
503
536
  top_outer: float,
File without changes
File without changes
File without changes
@@ -1,9 +1,6 @@
1
1
  from typing import TypeVar
2
2
 
3
- from ophyd_async.epics.adcore import (
4
- ADBaseController,
5
- ADBaseIO,
6
- )
3
+ from ophyd_async.epics.adcore import ADBaseController, ADBaseIO, ADImageMode
7
4
 
8
5
  ADBaseIOT = TypeVar("ADBaseIOT", bound=ADBaseIO)
9
6
 
@@ -13,8 +10,13 @@ class ConstantDeadTimeController(ADBaseController[ADBaseIOT]):
13
10
  ADBaseController with a configured constant deadtime for a driver of type ADBaseIO.
14
11
  """
15
12
 
16
- def __init__(self, driver: ADBaseIOT, deadtime: float):
17
- super().__init__(driver)
13
+ def __init__(
14
+ self,
15
+ driver: ADBaseIOT,
16
+ deadtime: float,
17
+ image_mode: ADImageMode = ADImageMode.MULTIPLE,
18
+ ):
19
+ super().__init__(driver, image_mode=image_mode)
18
20
  self.deadtime = deadtime
19
21
 
20
22
  def get_deadtime(self, exposure: float | None) -> float:
@@ -1,5 +1,5 @@
1
1
  from .base_detector import (
2
- AbstractElectronAnalyserDetector,
2
+ BaseElectronAnalyserDetector,
3
3
  )
4
4
  from .base_driver_io import AbstractAnalyserDriverIO, TAbstractAnalyserDriverIO
5
5
  from .base_region import (
@@ -19,7 +19,7 @@ __all__ = [
19
19
  "TAcquisitionMode",
20
20
  "TLensMode",
21
21
  "AbstractAnalyserDriverIO",
22
- "AbstractElectronAnalyserDetector",
22
+ "BaseElectronAnalyserDetector",
23
23
  "AbstractAnalyserDriverIO",
24
24
  "TAbstractAnalyserDriverIO",
25
25
  ]
@@ -1,4 +1,3 @@
1
- from abc import abstractmethod
2
1
  from typing import Generic
3
2
 
4
3
  from bluesky.protocols import Reading, Triggerable
@@ -9,14 +8,14 @@ from ophyd_async.core import (
9
8
  AsyncStatus,
10
9
  Device,
11
10
  )
11
+ from ophyd_async.epics.adcore import ADBaseController
12
12
 
13
- from dodal.devices.controllers import ConstantDeadTimeController
14
13
  from dodal.devices.electron_analyser.abstract.base_driver_io import (
15
14
  TAbstractAnalyserDriverIO,
16
15
  )
17
16
 
18
17
 
19
- class AbstractElectronAnalyserDetector(
18
+ class BaseElectronAnalyserDetector(
20
19
  Device,
21
20
  Triggerable,
22
21
  AsyncReadable,
@@ -34,43 +33,31 @@ class AbstractElectronAnalyserDetector(
34
33
 
35
34
  def __init__(
36
35
  self,
37
- driver: TAbstractAnalyserDriverIO,
36
+ controller: ADBaseController[TAbstractAnalyserDriverIO],
38
37
  name: str = "",
39
38
  ):
40
- self.controller = ConstantDeadTimeController(driver, 0)
39
+ self._controller = controller
41
40
  super().__init__(name)
42
41
 
43
42
  @AsyncStatus.wrap
44
43
  async def trigger(self) -> None:
45
- await self.controller.arm()
46
- await self.controller.wait_for_idle()
44
+ await self._controller.arm()
45
+ await self._controller.wait_for_idle()
47
46
 
48
47
  async def read(self) -> dict[str, Reading]:
49
- return await self.driver.read()
48
+ return await self._controller.driver.read()
50
49
 
51
50
  async def describe(self) -> dict[str, DataKey]:
52
- data = await self.driver.describe()
51
+ data = await self._controller.driver.describe()
53
52
  # Correct the shape for image
54
- prefix = self.driver.name + "-"
55
- energy_size = len(await self.driver.energy_axis.get_value())
56
- angle_size = len(await self.driver.angle_axis.get_value())
53
+ prefix = self._controller.driver.name + "-"
54
+ energy_size = len(await self._controller.driver.energy_axis.get_value())
55
+ angle_size = len(await self._controller.driver.angle_axis.get_value())
57
56
  data[prefix + "image"]["shape"] = [angle_size, energy_size]
58
57
  return data
59
58
 
60
59
  async def read_configuration(self) -> dict[str, Reading]:
61
- return await self.driver.read_configuration()
60
+ return await self._controller.driver.read_configuration()
62
61
 
63
62
  async def describe_configuration(self) -> dict[str, DataKey]:
64
- return await self.driver.describe_configuration()
65
-
66
- @property
67
- @abstractmethod
68
- def driver(self) -> TAbstractAnalyserDriverIO:
69
- """
70
- Define common property for all implementations to access the driver. Some
71
- implementations will store this as a reference so it doesn't have conflicting
72
- parents.
73
-
74
- Returns:
75
- instance of the driver.
76
- """
63
+ return await self._controller.driver.describe_configuration()
@@ -153,11 +153,12 @@ class AbstractAnalyserDriverIO(
153
153
  self.energy_source.selected_source.set(region.excitation_energy_source)
154
154
  excitation_energy = await self.energy_source.energy.get_value()
155
155
 
156
- # Copy region so doesn't alter the actual region and switch to kinetic energy
157
- ke_region = region.model_copy()
158
- ke_region.switch_energy_mode(EnergyMode.KINETIC, excitation_energy)
159
-
156
+ # Switch to kinetic energy as epics doesn't support BINDING.
157
+ ke_region = region.switch_energy_mode(EnergyMode.KINETIC, excitation_energy)
160
158
  await self._set_region(ke_region)
159
+ # Set the true energy mode from original region so binding_energy_axis can be
160
+ # calculated correctly.
161
+ await self.energy_mode.set(region.energy_mode)
161
162
 
162
163
  @abstractmethod
163
164
  async def _set_region(self, ke_region: TAbstractBaseRegion):