dls-dodal 1.69.0__py3-none-any.whl → 2.0.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 (282) hide show
  1. {dls_dodal-1.69.0.dist-info → dls_dodal-2.0.0.dist-info}/METADATA +1 -1
  2. dls_dodal-2.0.0.dist-info/RECORD +354 -0
  3. {dls_dodal-1.69.0.dist-info → dls_dodal-2.0.0.dist-info}/WHEEL +1 -1
  4. dodal/_version.py +2 -2
  5. dodal/beamlines/__init__.py +10 -17
  6. dodal/beamlines/adsim.py +17 -17
  7. dodal/beamlines/b01_1.py +11 -0
  8. dodal/beamlines/b07.py +17 -21
  9. dodal/beamlines/b07_1.py +20 -22
  10. dodal/beamlines/b07_shared.py +12 -0
  11. dodal/beamlines/b16.py +1 -1
  12. dodal/beamlines/b21.py +15 -6
  13. dodal/beamlines/i02_1.py +3 -3
  14. dodal/beamlines/i02_2.py +1 -1
  15. dodal/beamlines/i03.py +4 -4
  16. dodal/beamlines/i04.py +16 -8
  17. dodal/beamlines/i05.py +7 -45
  18. dodal/beamlines/i05_1.py +4 -13
  19. dodal/beamlines/i05_shared.py +51 -0
  20. dodal/beamlines/i06_1.py +7 -5
  21. dodal/beamlines/{i06.py → i06_shared.py} +25 -14
  22. dodal/beamlines/i07.py +14 -16
  23. dodal/beamlines/i09.py +54 -51
  24. dodal/beamlines/i09_1.py +25 -64
  25. dodal/beamlines/i09_1_shared.py +61 -0
  26. dodal/beamlines/i09_2.py +6 -100
  27. dodal/beamlines/i09_2_shared.py +110 -0
  28. dodal/beamlines/i10.py +60 -54
  29. dodal/beamlines/i10_1.py +99 -10
  30. dodal/beamlines/{i10_optics.py → i10_shared.py} +80 -66
  31. dodal/beamlines/i11.py +31 -18
  32. dodal/beamlines/i13_1.py +1 -1
  33. dodal/beamlines/i15.py +6 -6
  34. dodal/beamlines/i15_1.py +6 -6
  35. dodal/beamlines/i17.py +37 -28
  36. dodal/beamlines/i18.py +3 -4
  37. dodal/beamlines/i19_1.py +95 -34
  38. dodal/beamlines/i19_2.py +68 -52
  39. dodal/beamlines/i19_optics.py +26 -13
  40. dodal/beamlines/i20_1.py +6 -14
  41. dodal/beamlines/i21.py +35 -28
  42. dodal/beamlines/i22.py +19 -4
  43. dodal/beamlines/i23.py +1 -2
  44. dodal/beamlines/i24.py +11 -10
  45. dodal/beamlines/k07.py +99 -5
  46. dodal/beamlines/p38.py +3 -3
  47. dodal/beamlines/p60.py +28 -17
  48. dodal/beamlines/p99.py +16 -15
  49. dodal/beamlines/training_rig.py +20 -12
  50. dodal/cli.py +36 -2
  51. dodal/common/beamlines/beamline_parameters.py +2 -1
  52. dodal/common/beamlines/beamline_utils.py +11 -9
  53. dodal/common/beamlines/commissioning_mode.py +6 -3
  54. dodal/common/coordination.py +12 -14
  55. dodal/common/crystal_metadata.py +5 -8
  56. dodal/common/device_utils.py +4 -3
  57. dodal/common/maths.py +28 -40
  58. dodal/common/udc_directory_provider.py +13 -8
  59. dodal/common/visit.py +18 -21
  60. dodal/common/watcher_utils.py +13 -12
  61. dodal/device_manager.py +94 -54
  62. dodal/devices/aperturescatterguard.py +26 -27
  63. dodal/devices/areadetector/plugins/cam.py +1 -3
  64. dodal/devices/areadetector/plugins/mjpg.py +6 -5
  65. dodal/devices/attenuator/attenuator.py +12 -11
  66. dodal/devices/beamlines/b07/__init__.py +3 -0
  67. dodal/devices/{b07_1 → beamlines/b07_1}/__init__.py +2 -2
  68. dodal/devices/{b07_1 → beamlines/b07_1}/ccmc.py +5 -10
  69. dodal/devices/{b16 → beamlines/b16}/detector.py +2 -3
  70. dodal/devices/{i02_1 → beamlines/i02_1}/fast_grid_scan.py +2 -3
  71. dodal/devices/{i02_1 → beamlines/i02_1}/sample_motors.py +1 -1
  72. dodal/devices/{i03 → beamlines/i03}/beamsize.py +11 -7
  73. dodal/devices/{i03 → beamlines/i03}/dcm.py +1 -2
  74. dodal/devices/{i03 → beamlines/i03}/undulator_dcm.py +4 -5
  75. dodal/devices/beamlines/i04/beam_centre.py +151 -0
  76. dodal/devices/{i04 → beamlines/i04}/beamsize.py +11 -7
  77. dodal/devices/{i04 → beamlines/i04}/murko_results.py +5 -5
  78. dodal/devices/{i04 → beamlines/i04}/transfocator.py +10 -15
  79. dodal/devices/beamlines/i05/__init__.py +3 -0
  80. dodal/devices/beamlines/i06_shared/__init__.py +3 -0
  81. dodal/devices/beamlines/i06_shared/i06_enum.py +7 -0
  82. dodal/devices/{i07 → beamlines/i07}/dcm.py +2 -3
  83. dodal/devices/{i07 → beamlines/i07}/id.py +8 -9
  84. dodal/devices/beamlines/i09/__init__.py +3 -0
  85. dodal/devices/{i09_1_shared → beamlines/i09_1_shared}/hard_energy.py +5 -6
  86. dodal/devices/{i09_1_shared → beamlines/i09_1_shared}/hard_undulator_functions.py +19 -16
  87. dodal/devices/{i10 → beamlines/i10}/diagnostics.py +4 -3
  88. dodal/devices/{i10 → beamlines/i10}/i10_apple2.py +31 -45
  89. dodal/devices/{i10 → beamlines/i10}/rasor/rasor_current_amp.py +1 -24
  90. dodal/devices/{i10 → beamlines/i10}/rasor/rasor_motors.py +2 -2
  91. dodal/devices/{i10 → beamlines/i10}/slits.py +5 -3
  92. dodal/devices/beamlines/i10_1/__init__.py +9 -0
  93. dodal/devices/beamlines/i10_1/electromagnet/magnet.py +16 -0
  94. dodal/devices/beamlines/i10_1/electromagnet/stages.py +14 -0
  95. dodal/devices/beamlines/i10_1/scaler_cards.py +13 -0
  96. dodal/devices/{i11 → beamlines/i11}/cyberstar_blower.py +1 -1
  97. dodal/devices/{i11 → beamlines/i11}/diff_stages.py +4 -6
  98. dodal/devices/{i11 → beamlines/i11}/mythen.py +3 -4
  99. dodal/devices/{i11 → beamlines/i11}/nx100robot.py +6 -6
  100. dodal/devices/{i11 → beamlines/i11}/spinner.py +1 -1
  101. dodal/devices/{i13_1 → beamlines/i13_1}/merlin.py +1 -1
  102. dodal/devices/{i15 → beamlines/i15}/dcm.py +1 -2
  103. dodal/devices/{i15 → beamlines/i15}/focussing_mirror.py +5 -5
  104. dodal/devices/{i15 → beamlines/i15}/jack.py +2 -2
  105. dodal/devices/{i15 → beamlines/i15}/multilayer_mirror.py +1 -1
  106. dodal/devices/{i17 → beamlines/i17}/i17_apple2.py +10 -16
  107. dodal/devices/{i18 → beamlines/i18}/diode.py +1 -1
  108. dodal/devices/{i19 → beamlines/i19}/access_controlled/attenuator_motor_squad.py +12 -8
  109. dodal/devices/{i19 → beamlines/i19}/access_controlled/blueapi_device.py +16 -15
  110. dodal/devices/beamlines/i19/access_controlled/piezo_control.py +72 -0
  111. dodal/devices/{i19 → beamlines/i19}/access_controlled/shutter.py +11 -9
  112. dodal/devices/{i19 → beamlines/i19}/backlight.py +3 -1
  113. dodal/devices/{i19 → beamlines/i19}/mapt_configuration.py +2 -1
  114. dodal/devices/{i19 → beamlines/i19}/pin_col_stages.py +11 -8
  115. dodal/devices/beamlines/i19/pin_tip.py +32 -0
  116. dodal/devices/beamlines/i21/__init__.py +3 -0
  117. dodal/devices/{i22 → beamlines/i22}/dcm.py +1 -2
  118. dodal/devices/{i22 → beamlines/i22}/fswitch.py +1 -3
  119. dodal/devices/{i22 → beamlines/i22}/nxsas.py +5 -4
  120. dodal/devices/{i24 → beamlines/i24}/beam_center.py +1 -1
  121. dodal/devices/{i24 → beamlines/i24}/beamstop.py +2 -2
  122. dodal/devices/{i24 → beamlines/i24}/commissioning_jungfrau.py +3 -2
  123. dodal/devices/{i24 → beamlines/i24}/dcm.py +1 -3
  124. dodal/devices/{i24 → beamlines/i24}/dual_backlight.py +3 -3
  125. dodal/devices/{i24 → beamlines/i24}/pmac.py +9 -7
  126. dodal/devices/{p60 → beamlines/p60}/lab_xray_source.py +1 -1
  127. dodal/devices/beamlines/p99/__init__.py +0 -0
  128. dodal/devices/{p99 → beamlines/p99}/andor2_point.py +11 -15
  129. dodal/devices/bimorph_mirror.py +22 -20
  130. dodal/devices/collimation_table.py +3 -2
  131. dodal/devices/common_dcm.py +30 -20
  132. dodal/devices/controllers.py +2 -2
  133. dodal/devices/cryostream.py +8 -0
  134. dodal/devices/current_amplifiers/current_amplifier.py +16 -18
  135. dodal/devices/current_amplifiers/current_amplifier_detector.py +9 -10
  136. dodal/devices/current_amplifiers/femto.py +8 -9
  137. dodal/devices/current_amplifiers/sr570.py +16 -16
  138. dodal/devices/current_amplifiers/struck_scaler_counter.py +5 -5
  139. dodal/devices/detector/det_resolution.py +9 -8
  140. dodal/devices/detector/detector.py +4 -2
  141. dodal/devices/diamond_filter.py +3 -4
  142. dodal/devices/eiger.py +3 -3
  143. dodal/devices/eiger_odin.py +1 -1
  144. dodal/devices/electron_analyser/base/base_controller.py +13 -13
  145. dodal/devices/electron_analyser/base/base_detector.py +15 -20
  146. dodal/devices/electron_analyser/base/base_driver_io.py +39 -46
  147. dodal/devices/electron_analyser/base/base_region.py +27 -30
  148. dodal/devices/electron_analyser/base/base_util.py +18 -16
  149. dodal/devices/electron_analyser/base/energy_sources.py +13 -19
  150. dodal/devices/eurotherm.py +3 -2
  151. dodal/devices/fast_grid_scan.py +31 -34
  152. dodal/devices/fast_shutter.py +24 -21
  153. dodal/devices/flux.py +1 -1
  154. dodal/devices/focusing_mirror.py +29 -11
  155. dodal/devices/hutch_shutter.py +6 -6
  156. dodal/devices/insertion_device/__init__.py +8 -0
  157. dodal/devices/insertion_device/apple2_controller.py +51 -60
  158. dodal/devices/insertion_device/apple2_undulator.py +40 -64
  159. dodal/devices/insertion_device/apple_knot_controller.py +222 -0
  160. dodal/devices/insertion_device/energy.py +100 -27
  161. dodal/devices/insertion_device/energy_motor_lookup.py +20 -27
  162. dodal/devices/insertion_device/lookup_table_models.py +45 -50
  163. dodal/devices/insertion_device/polarisation.py +1 -1
  164. dodal/devices/ipin.py +1 -1
  165. dodal/devices/linkam3.py +7 -5
  166. dodal/devices/motors.py +107 -19
  167. dodal/devices/mx_phase1/beamstop.py +2 -4
  168. dodal/devices/oav/oav_calculations.py +20 -13
  169. dodal/devices/oav/oav_detector.py +28 -23
  170. dodal/devices/oav/oav_parameters.py +4 -9
  171. dodal/devices/oav/oav_to_redis_forwarder.py +22 -18
  172. dodal/devices/oav/pin_image_recognition/__init__.py +4 -6
  173. dodal/devices/oav/pin_image_recognition/manual_test.py +1 -2
  174. dodal/devices/oav/pin_image_recognition/utils.py +30 -32
  175. dodal/devices/oav/snapshots/grid_overlay.py +10 -9
  176. dodal/devices/oav/snapshots/snapshot_image_processing.py +15 -13
  177. dodal/devices/oav/utils.py +9 -12
  178. dodal/devices/p45.py +3 -9
  179. dodal/devices/pgm.py +8 -14
  180. dodal/devices/pressure_jump_cell.py +93 -32
  181. dodal/devices/qbpm.py +1 -3
  182. dodal/devices/robot.py +12 -4
  183. dodal/devices/s4_slit_gaps.py +1 -1
  184. dodal/devices/selectable_source.py +5 -2
  185. dodal/devices/slits.py +2 -5
  186. dodal/devices/smargon.py +2 -3
  187. dodal/devices/temperture_controller/lakeshore/lakeshore.py +38 -64
  188. dodal/devices/temperture_controller/lakeshore/lakeshore_io.py +21 -35
  189. dodal/devices/tetramm.py +7 -7
  190. dodal/devices/turbo_slit.py +8 -7
  191. dodal/devices/undulator.py +42 -56
  192. dodal/devices/util/adjuster_plans.py +2 -3
  193. dodal/devices/util/epics_util.py +10 -10
  194. dodal/devices/util/lookup_tables.py +17 -18
  195. dodal/devices/v2f.py +2 -3
  196. dodal/devices/watsonmarlow323_pump.py +1 -1
  197. dodal/devices/xbpm_feedback.py +3 -2
  198. dodal/devices/xspress3/xspress3.py +8 -11
  199. dodal/devices/xspress3/xspress3_channel.py +3 -6
  200. dodal/devices/zebra/zebra.py +6 -7
  201. dodal/devices/zebra/zebra_constants_mapping.py +11 -7
  202. dodal/devices/zebra/zebra_controlled_shutter.py +2 -1
  203. dodal/devices/zocalo/zocalo_interaction.py +14 -14
  204. dodal/devices/zocalo/zocalo_results.py +33 -33
  205. dodal/log.py +23 -20
  206. dodal/plan_stubs/check_topup.py +15 -15
  207. dodal/plan_stubs/data_session.py +6 -6
  208. dodal/plan_stubs/motor_utils.py +22 -18
  209. dodal/plan_stubs/pressure_jump_cell.py +18 -0
  210. dodal/plan_stubs/wrapped.py +40 -55
  211. dodal/plans/bimorph.py +63 -52
  212. dodal/plans/device_setup_plans/__init__.py +5 -0
  213. dodal/plans/device_setup_plans/setup_pin_tip_params.py +63 -0
  214. dodal/plans/preprocessors/verify_undulator_gap.py +10 -8
  215. dodal/plans/spec_path.py +3 -5
  216. dodal/plans/verify_undulator_gap.py +1 -2
  217. dodal/plans/wrapped.py +4 -3
  218. dodal/testing/electron_analyser/device_factory.py +5 -7
  219. dodal/testing/fixtures/devices/apple2.py +38 -0
  220. dodal/testing/fixtures/run_engine.py +3 -7
  221. dodal/testing/fixtures/utils.py +1 -2
  222. dodal/utils.py +60 -58
  223. dls_dodal-1.69.0.dist-info/RECORD +0 -338
  224. dodal/beamline_specific_utils/i05_shared.py +0 -14
  225. dodal/devices/b07/__init__.py +0 -3
  226. dodal/devices/i04/beam_centre.py +0 -84
  227. dodal/devices/i05/__init__.py +0 -3
  228. dodal/devices/i09/__init__.py +0 -3
  229. dodal/devices/i21/__init__.py +0 -5
  230. {dls_dodal-1.69.0.dist-info → dls_dodal-2.0.0.dist-info}/entry_points.txt +0 -0
  231. {dls_dodal-1.69.0.dist-info → dls_dodal-2.0.0.dist-info}/licenses/LICENSE +0 -0
  232. {dls_dodal-1.69.0.dist-info → dls_dodal-2.0.0.dist-info}/top_level.txt +0 -0
  233. /dodal/{beamline_specific_utils → devices/beamlines}/__init__.py +0 -0
  234. /dodal/devices/{b07 → beamlines/b07}/enums.py +0 -0
  235. /dodal/devices/{b07_1 → beamlines/b07_1}/enums.py +0 -0
  236. /dodal/devices/{b16 → beamlines/b16}/__init__.py +0 -0
  237. /dodal/devices/{i02_1 → beamlines/i02_1}/__init__.py +0 -0
  238. /dodal/devices/{i02_2 → beamlines/i02_2}/__init__.py +0 -0
  239. /dodal/devices/{i03 → beamlines/i03}/__init__.py +0 -0
  240. /dodal/devices/{i03 → beamlines/i03}/constants.py +0 -0
  241. /dodal/devices/{i04 → beamlines/i04}/__init__.py +0 -0
  242. /dodal/devices/{i04 → beamlines/i04}/constants.py +0 -0
  243. /dodal/devices/{i04 → beamlines/i04}/max_pixel.py +0 -0
  244. /dodal/devices/{i05 → beamlines/i05}/enums.py +0 -0
  245. /dodal/devices/{i07 → beamlines/i07}/__init__.py +0 -0
  246. /dodal/devices/{i09 → beamlines/i09}/enums.py +0 -0
  247. /dodal/devices/{i09_1 → beamlines/i09_1}/__init__.py +0 -0
  248. /dodal/devices/{i09_1 → beamlines/i09_1}/enums.py +0 -0
  249. /dodal/devices/{i09_1_shared → beamlines/i09_1_shared}/__init__.py +0 -0
  250. /dodal/devices/{i09_2_shared → beamlines/i09_2_shared}/__init__.py +0 -0
  251. /dodal/devices/{i09_2_shared → beamlines/i09_2_shared}/i09_apple2.py +0 -0
  252. /dodal/devices/{i10 → beamlines/i10}/__init__.py +0 -0
  253. /dodal/devices/{i10 → beamlines/i10}/i10_setting_data.py +0 -0
  254. /dodal/devices/{i10 → beamlines/i10}/mirrors.py +0 -0
  255. /dodal/devices/{i10 → beamlines/i10}/rasor/__init__.py +0 -0
  256. /dodal/devices/{i10 → beamlines/i10}/rasor/rasor_scaler_cards.py +0 -0
  257. /dodal/devices/{i11 → beamlines/i10_1/electromagnet}/__init__.py +0 -0
  258. /dodal/devices/{i13_1 → beamlines/i11}/__init__.py +0 -0
  259. /dodal/devices/{i15 → beamlines/i13_1}/__init__.py +0 -0
  260. /dodal/devices/{i13_1 → beamlines/i13_1}/merlin_controller.py +0 -0
  261. /dodal/devices/{i17 → beamlines/i15}/__init__.py +0 -0
  262. /dodal/devices/{i15 → beamlines/i15}/laue.py +0 -0
  263. /dodal/devices/{i15 → beamlines/i15}/motors.py +0 -0
  264. /dodal/devices/{i15 → beamlines/i15}/rail.py +0 -0
  265. /dodal/devices/{i18 → beamlines/i17}/__init__.py +0 -0
  266. /dodal/devices/{i19 → beamlines/i18}/__init__.py +0 -0
  267. /dodal/devices/{i18 → beamlines/i18}/kb_mirror.py +0 -0
  268. /dodal/devices/{i19/access_controlled → beamlines/i19}/__init__.py +0 -0
  269. /dodal/devices/{i20_1 → beamlines/i19/access_controlled}/__init__.py +0 -0
  270. /dodal/devices/{i19 → beamlines/i19}/access_controlled/hutch_access.py +0 -0
  271. /dodal/devices/{i19 → beamlines/i19}/beamstop.py +0 -0
  272. /dodal/devices/{i19 → beamlines/i19}/diffractometer.py +0 -0
  273. /dodal/devices/{i22 → beamlines/i20_1}/__init__.py +0 -0
  274. /dodal/devices/{i21 → beamlines/i21}/enums.py +0 -0
  275. /dodal/devices/{i24 → beamlines/i22}/__init__.py +0 -0
  276. /dodal/devices/{p99 → beamlines/i24}/__init__.py +0 -0
  277. /dodal/devices/{i24 → beamlines/i24}/aperture.py +0 -0
  278. /dodal/devices/{i24 → beamlines/i24}/focus_mirrors.py +0 -0
  279. /dodal/devices/{i24 → beamlines/i24}/vgonio.py +0 -0
  280. /dodal/devices/{p60 → beamlines/p60}/__init__.py +0 -0
  281. /dodal/devices/{p60 → beamlines/p60}/enums.py +0 -0
  282. /dodal/devices/{p99 → beamlines/p99}/sample_stage.py +0 -0
@@ -33,19 +33,23 @@ Xtal_2 = TypeVar("Xtal_2", bound=StationaryCrystal)
33
33
 
34
34
 
35
35
  class DoubleCrystalMonochromatorBase(StandardReadable, Generic[Xtal_1, Xtal_2]):
36
- """
37
- Base device for the double crystal monochromator (DCM), used to select the energy of the beam.
36
+ """Base device for the double crystal monochromator (DCM), used to select the energy
37
+ of the beam.
38
38
 
39
- Features common across all DCM's should include virtual motors to set energy/wavelength and contain two crystals,
40
- each of which can be movable. Some DCM's contain crystals with roll motors, and some contain crystals with roll and pitch motors.
41
- This base device accounts for all combinations of this.
39
+ Features common across all DCM's should include virtual motors to set
40
+ energy/wavelength and contain two crystals, each of which can be movable. Some DCM's
41
+ contain crystals with roll motors, and some contain crystals with roll and pitch
42
+ motors. This base device accounts for all combinations of this.
43
+
44
+ This device should act as a parent for beamline-specific DCM's which do not match
45
+ the standard EPICS interface, it provides only energy and the crystal configuration.
46
+ Most beamlines should use DoubleCrystalMonochromator instead.
42
47
 
43
- This device should act as a parent for beamline-specific DCM's which do not match the standard EPICS interface, it provides
44
- only energy and the crystal configuration. Most beamlines should use DoubleCrystalMonochromator instead
48
+ Bluesky plans using DCM's should be typed to specify which types of crystals are
49
+ required. For example, a plan which only requires one crystal which can roll should
50
+ be typed::
45
51
 
46
- Bluesky plans using DCM's should be typed to specify which types of crystals are required. For example, a plan
47
- which only requires one crystal which can roll should be typed
48
- 'def my_plan(dcm: DoubleCrystalMonochromatorBase[RollCrystal, StationaryCrystal])`
52
+ def my_plan(dcm: DoubleCrystalMonochromatorBase[RollCrystal,StationaryCrystal])
49
53
  """
50
54
 
51
55
  def __init__(
@@ -78,17 +82,23 @@ class DoubleCrystalMonochromatorBase(StandardReadable, Generic[Xtal_1, Xtal_2]):
78
82
  class DoubleCrystalMonochromator(
79
83
  DoubleCrystalMonochromatorBase, Generic[Xtal_1, Xtal_2]
80
84
  ):
81
- """
82
- Common device for the double crystal monochromator (DCM), used to select the energy of the beam.
85
+ """Common device for the double crystal monochromator (DCM), used to select the
86
+ energy of the beam.
83
87
 
84
- Features common across all DCM's should include virtual motors to set energy/wavelength and contain two crystals,
85
- each of which can be movable. Some DCM's contain crystals with roll motors, and some contain crystals with roll and pitch motors.
88
+ Features common across all DCM's should include virtual motors to set
89
+ energy/wavelength and contain two crystals, each of which can be movable. Some DCM's
90
+ contain crystals with roll motors, and some contain crystals with roll and pitch
91
+ motors.
86
92
  This base device accounts for all combinations of this.
87
93
 
88
- This device should act as a parent for beamline-specific DCM's, in which any other missing signals can be added.
94
+ This device should act as a parent for beamline-specific DCM's, in which any other
95
+ missing signals can be added.
96
+
97
+ Bluesky plans using DCM's should be typed to specify which types of crystals are
98
+ required. For example, a plan which only requires one crystal which can roll should
99
+ be typed::
89
100
 
90
- Bluesky plans using DCM's should be typed to specify which types of crystals are required. For example, a plan which only
91
- requires one crystal which can roll should be typed 'def my_plan(dcm: DoubleCrystalMonochromator[RollCrystal, StationaryCrystal])`
101
+ def my_plan(dcm: DoubleCrystalMonochromator[RollCrystal, StationaryCrystal])
92
102
  """
93
103
 
94
104
  def __init__(
@@ -109,9 +119,9 @@ class DoubleCrystalMonochromator(
109
119
  class DoubleCrystalMonochromatorWithDSpacing(
110
120
  DoubleCrystalMonochromator, Generic[Xtal_1, Xtal_2]
111
121
  ):
112
- """
113
- Adds crystal D-spacing metadata to the DoubleCrystalMonochromator class. This should be used in preference to the
114
- DoubleCrystalMonochromator on beamlines which have a "DSPACING:RBV" pv on their DCM.
122
+ """Adds crystal D-spacing metadata to the DoubleCrystalMonochromator class. This
123
+ should be used in preference to the DoubleCrystalMonochromator on beamlines which
124
+ have a "DSPACING:RBV" pv on their DCM.
115
125
  """
116
126
 
117
127
  def __init__(
@@ -6,8 +6,8 @@ ADBaseIOT = TypeVar("ADBaseIOT", bound=ADBaseIO)
6
6
 
7
7
 
8
8
  class ConstantDeadTimeController(ADBaseController[ADBaseIOT]):
9
- """
10
- ADBaseController with a configured constant deadtime for a driver of type ADBaseIO.
9
+ """ADBaseController with a configured constant deadtime for a driver of type
10
+ ADBaseIO.
11
11
  """
12
12
 
13
13
  def __init__(
@@ -87,6 +87,14 @@ class OxfordCryoJet(StandardReadable):
87
87
 
88
88
 
89
89
  class CryoStreamGantry(StandardReadable):
90
+ """Gantry controlling whether the standard Cryostream or the
91
+ HC1 cryostream is in position.
92
+
93
+ Note: this device is currently implemented read-only; moving the gantry without
94
+ adequate checks risks a collision if the gantry is moved while HC1 is selected
95
+ and in the IN position.
96
+ """
97
+
90
98
  def __init__(self, prefix: str, name: str = ""):
91
99
  with self.add_children_as_readables(StandardReadableFormat.CONFIG_SIGNAL):
92
100
  self.cryostream_selector = epics_signal_r(
@@ -9,14 +9,13 @@ from ophyd_async.core import AsyncStatus, StandardReadable
9
9
 
10
10
 
11
11
  class CurrentAmp(ABC, StandardReadable, Movable):
12
- """
13
- Base class for current amplifier, it contains the minimal functionality
14
- a current amplifier needs:
12
+ """Base class for current amplifier, it contains the minimal functionality
13
+ a current amplifier needs:
15
14
 
16
15
  Attributes:
17
16
  gain_conversion_table (Enum): The conversion table between current
18
- and gain setting.
19
- """
17
+ and gain setting.
18
+ """ # noqa D415
20
19
 
21
20
  def __init__(self, gain_conversion_table: type[Enum], name: str = "") -> None:
22
21
  self.gain_conversion_table = gain_conversion_table
@@ -40,7 +39,7 @@ class CurrentAmp(ABC, StandardReadable, Movable):
40
39
 
41
40
  @abstractmethod
42
41
  async def get_gain(self) -> Enum:
43
- """Get the current gain setting
42
+ """Get the current gain setting.
44
43
 
45
44
  Returns:
46
45
  Enum: The member name of the current gain setting in gain_conversion_table.
@@ -48,17 +47,16 @@ class CurrentAmp(ABC, StandardReadable, Movable):
48
47
 
49
48
  @abstractmethod
50
49
  async def get_upperlimit(self) -> float:
51
- """Get the upper limit of the current amplifier"""
50
+ """Get the upper limit of the current amplifier."""
52
51
 
53
52
  @abstractmethod
54
53
  async def get_lowerlimit(self) -> float:
55
- """Get the lower limit of the current amplifier"""
54
+ """Get the lower limit of the current amplifier."""
56
55
 
57
56
 
58
57
  class CurrentAmpCounter(ABC, StandardReadable, Preparable):
59
- """
60
- Base class for current amplifier counter, it contain the minimal implementations
61
- required for a counter/detector to function with CurrentAmpDet:
58
+ """Base class for current amplifier counter, it contain the minimal implementations
59
+ required for a counter/detector to function with CurrentAmpDet.
62
60
 
63
61
  Attributes:
64
62
  count_per_volt (float): The conversion factor between counter output and voltage.
@@ -70,29 +68,29 @@ class CurrentAmpCounter(ABC, StandardReadable, Preparable):
70
68
 
71
69
  @abstractmethod
72
70
  async def get_count(self) -> float:
73
- """ "Get count
71
+ """Get count.
74
72
 
75
73
  Returns:
76
- float: Current count
74
+ float: Current count.
77
75
  """
78
76
 
79
77
  @abstractmethod
80
78
  async def get_count_per_sec(self) -> float:
81
- """Get count per second
79
+ """Get count per second.
82
80
 
83
81
  Returns:
84
- float: Current count per second
82
+ float: Current count per second.
85
83
  """
86
84
 
87
85
  @abstractmethod
88
86
  async def get_voltage_per_sec(self) -> float:
89
- """Get count per second in voltage
87
+ """Get count per second in voltage.
90
88
 
91
89
  Returns:
92
- float: Current count in volt per second
90
+ float: Current count in volt per second.
93
91
  """
94
92
 
95
93
  @abstractmethod
96
94
  @AsyncStatus.wrap
97
95
  async def prepare(self, value: float) -> None:
98
- """Prepare method for setting up the counter"""
96
+ """Prepare method for setting up the counter."""
@@ -18,11 +18,11 @@ from dodal.log import LOGGER
18
18
 
19
19
 
20
20
  class CurrentAmpDet(StandardReadable, Preparable):
21
- """
22
- CurrentAmpDet composed of a CurrentAmp and a CurrentAmpCounter. It provides
23
- the option for automatically changing the CurrentAmp gain to within the optimal
24
- range. It also converts the currentAmp/counter output back into the detector
25
- current output in Amp.
21
+ """CurrentAmpDet composed of a CurrentAmp and a CurrentAmpCounter. It provides
22
+ the option for automatically changing the CurrentAmp gain to within the optimal
23
+ range. It also converts the currentAmp/counter output back into the detector
24
+ current output in Amp.
25
+
26
26
  Attributes:
27
27
  current_amp (currentAmp): Current amplifier type device.
28
28
  counter (CurrentAmpCounter): Counter that capture the current amplifier output.
@@ -48,9 +48,8 @@ class CurrentAmpDet(StandardReadable, Preparable):
48
48
  super().__init__(name)
49
49
 
50
50
  async def read(self) -> dict[str, Reading]:
51
- """
52
- Read is modified so that if auto_mode is true it will optimise gain before
53
- taking the final reading
51
+ """Read is modified so that if auto_mode is true it will optimise gain before
52
+ taking the final reading.
54
53
  """
55
54
  if await self.auto_mode.get_value():
56
55
  LOGGER.info(f"{self.name}-Attempting auto-gain")
@@ -85,8 +84,8 @@ class CurrentAmpDet(StandardReadable, Preparable):
85
84
  within_limits = True
86
85
 
87
86
  async def get_corrected_current(self) -> float:
88
- """
89
- Convert the output(count and gain) back into the read detector output in Amp.
87
+ """Convert the output (count and gain) back into the read detector output in
88
+ Amp.
90
89
  """
91
90
  current_gain, voltage_per_sec = await asyncio.gather(
92
91
  self.current_amp().get_gain(),
@@ -13,7 +13,7 @@ from dodal.log import LOGGER
13
13
 
14
14
 
15
15
  class Femto3xxGainTable(StrictEnum):
16
- """These are the sensitivity setting for Femto 3xx current amplifier"""
16
+ """These are the sensitivity setting for Femto 3xx current amplifier."""
17
17
 
18
18
  SEN_1 = "10^4"
19
19
  SEN_2 = "10^5"
@@ -28,7 +28,7 @@ class Femto3xxGainTable(StrictEnum):
28
28
 
29
29
 
30
30
  class Femto3xxGainToCurrentTable(float, Enum):
31
- """These are the voltage to current setting for Femto 3xx current amplifier"""
31
+ """These are the voltage to current setting for Femto 3xx current amplifier."""
32
32
 
33
33
  SEN_1 = 1e4
34
34
  SEN_2 = 1e5
@@ -43,7 +43,7 @@ class Femto3xxGainToCurrentTable(float, Enum):
43
43
 
44
44
 
45
45
  class Femto3xxRaiseTime(float, Enum):
46
- """These are the gain dependent raise time(s) for Femto 3xx current amplifier"""
46
+ """These are the gain dependent raise time(s) for Femto 3xx current amplifier."""
47
47
 
48
48
  SEN_1 = 0.8e-3
49
49
  SEN_2 = 0.8e-3
@@ -58,10 +58,10 @@ class Femto3xxRaiseTime(float, Enum):
58
58
 
59
59
 
60
60
  class FemtoDDPCA(CurrentAmp):
61
- """
62
- Femto current amplifier device, this class should cover all DDPCA Femto current
63
- amplifiers, As the main different between all the DDPCA Femto is their gain table
64
- and response time table.
61
+ """Femto current amplifier device, this class should cover all DDPCA Femto current
62
+ amplifiers, As the main different between all the DDPCA Femto is their gain table
63
+ and response time table.
64
+
65
65
  Attributes:
66
66
  gain (SignalRW): This is the epic signal that control current amplifier gain.
67
67
  gain_table (strictEnum): The table epic use to set gain.
@@ -69,8 +69,7 @@ class FemtoDDPCA(CurrentAmp):
69
69
  lowerlimit (float): lowerlimit of the current amplifier
70
70
  timeout (float): Maximum waiting time in second for setting gain.
71
71
  raise_timetable (Enum): Table contain the minimum amount of time to wait after
72
- changing gain.
73
-
72
+ changing gain.
74
73
  """
75
74
 
76
75
  def __init__(
@@ -13,7 +13,7 @@ from dodal.log import LOGGER
13
13
 
14
14
 
15
15
  class SR570GainTable(StrictEnum):
16
- """Coarse/unit sensitivity setting for SR570 current amplifier"""
16
+ """Coarse/unit sensitivity setting for SR570 current amplifier."""
17
17
 
18
18
  SEN_1 = "mA/V"
19
19
  SEN_2 = "uA/V"
@@ -22,7 +22,7 @@ class SR570GainTable(StrictEnum):
22
22
 
23
23
 
24
24
  class SR570FineGainTable(StrictEnum):
25
- """Fine sensitivity setting for SR570 current amplifier"""
25
+ """Fine sensitivity setting for SR570 current amplifier."""
26
26
 
27
27
  SEN_1 = "1"
28
28
  SEN_2 = "2"
@@ -36,7 +36,7 @@ class SR570FineGainTable(StrictEnum):
36
36
 
37
37
 
38
38
  class SR570RaiseTimeTable(float, Enum):
39
- """These are the gain dependent raise time(s) for SR570 current amplifier"""
39
+ """These are the gain dependent raise time(s) for SR570 current amplifier."""
40
40
 
41
41
  SEN_1 = 1e-4
42
42
  SEN_2 = 1e-2
@@ -46,7 +46,8 @@ class SR570RaiseTimeTable(float, Enum):
46
46
 
47
47
  class SR570FullGainTable(Enum):
48
48
  """Combined gain table, as each gain step is a combination of both coarse gain and
49
- fine gain setting"""
49
+ fine gain setting.
50
+ """
50
51
 
51
52
  SEN_1 = [SR570GainTable.SEN_1, SR570FineGainTable.SEN_1]
52
53
  SEN_2 = [SR570GainTable.SEN_2, SR570FineGainTable.SEN_9]
@@ -79,7 +80,7 @@ class SR570FullGainTable(Enum):
79
80
 
80
81
 
81
82
  class SR570GainToCurrentTable(float, Enum):
82
- """Conversion table for gain (sensitivity) to current"""
83
+ """Conversion table for gain (sensitivity) to current."""
83
84
 
84
85
  SEN_1 = 1e3
85
86
  SEN_2 = 2e3
@@ -112,10 +113,10 @@ class SR570GainToCurrentTable(float, Enum):
112
113
 
113
114
 
114
115
  class SR570(CurrentAmp):
115
- """
116
- SR570 current amplifier device. This is similar to Femto with the only different
117
- is SR570 has two gain setting fine and coarse, therefore it requires extra
118
- gain tables.
116
+ """SR570 current amplifier device. This is similar to Femto with the only different
117
+ is SR570 has two gain setting fine and coarse, therefore it requires extra
118
+ gain tables.
119
+
119
120
  Attributes:
120
121
  fine_gain (SignalRW): This is the epic signal that control SR570 fine gain.
121
122
  coarse_gain (SignalRW): This is the epic signal that control SR570 coarse gain.
@@ -129,18 +130,17 @@ class SR570(CurrentAmp):
129
130
  setting in gain_conversion_table.
130
131
  upperlimit (float): upperlimit of the current amplifier
131
132
  lowerlimit (float): lowerlimit of the current amplifier
132
-
133
133
  """
134
134
 
135
135
  def __init__(
136
136
  self,
137
137
  prefix: str,
138
- suffix: str,
139
- fine_gain_table: type[StrictEnum],
140
- coarse_gain_table: type[StrictEnum],
141
- combined_table: type[Enum],
142
- gain_to_current_table: type[Enum],
143
- raise_timetable: type[Enum],
138
+ suffix: str = "SENS:SEL",
139
+ fine_gain_table: type[StrictEnum] = SR570FineGainTable,
140
+ coarse_gain_table: type[StrictEnum] = SR570GainTable,
141
+ combined_table: type[Enum] = SR570FullGainTable,
142
+ gain_to_current_table: type[Enum] = SR570GainToCurrentTable,
143
+ raise_timetable: type[Enum] = SR570RaiseTimeTable,
144
144
  upperlimit: float = 4.8,
145
145
  lowerlimit: float = 0.4,
146
146
  timeout: float = 1,
@@ -25,11 +25,11 @@ COUNT_PER_VOLTAGE = 100000
25
25
 
26
26
 
27
27
  class StruckScaler(CurrentAmpCounter):
28
- """
29
- StruckScaler is a counting card that record the output signal from a wide
30
- range of detectors. This class contains the basic control to run the struckscaler
31
- card together with a current amplifier. It has functions that provide conversion
32
- between count and voltage.
28
+ """StruckScaler is a counting card that record the output signal from a wide
29
+ range of detectors. This class contains the basic control to run the struckscaler
30
+ card together with a current amplifier. It has functions that provide conversion
31
+ between count and voltage.
32
+
33
33
  Attributes:
34
34
  readout(SignalR): Scaler card output.
35
35
  count_mode (SignalR[CountMode]): Counting card setting.
@@ -47,17 +47,18 @@ def _calc_useful_radius(detector_radius_mm, beam_x_mm, beam_y_mm):
47
47
 
48
48
 
49
49
  def _calc_res_at_angle(wavelength_angstroms, angular_shift_radians):
50
- """Base definition of maximum resolution (from Bragg's Law with n=1)"""
50
+ """Base definition of maximum resolution (from Bragg's Law with n=1)."""
51
51
  return 0.5 * wavelength_angstroms / sin(angular_shift_radians)
52
52
 
53
53
 
54
54
  def _calc_res_off_axis_detector(
55
55
  wavelength_angstroms, usable_radius, det_distance_mm, two_theta_radians
56
56
  ):
57
- """
58
- Calculate maximum resolution given detector distance and extent (radius) that detector face extends
59
- No correction for position of beam centre on detector face at twoTheta=0
60
- Here radius and distance parameters can be in any length unit, provided it is the same, millimetres is the convention
57
+ """Calculate maximum resolution given detector distance and extent (radius) that
58
+ detector face extends.
59
+ No correction for position of beam centre on detector face at twoTheta=0.
60
+ Here radius and distance parameters can be in any length unit, provided it is the
61
+ same, millimetres is the convention.
61
62
  """
62
63
  angular_shift_radians = atan(usable_radius / det_distance_mm)
63
64
  return _calc_res_at_angle(
@@ -68,9 +69,9 @@ def _calc_res_off_axis_detector(
68
69
  def _max_res_for_mx(
69
70
  wavelength_angstroms, detector_radius_mm, det_distance_mm, beam_x_mm, beam_y_mm
70
71
  ):
71
- """
72
- Calculate maximum resolution given MX Use Case (detector at twoTheta=0) and beam centre on detector face
73
- Correct the radius for position of beam centre on detector face at twoTheta=0
72
+ """Calculate maximum resolution given MX Use Case (detector at twoTheta=0) and beam
73
+ centre on detector face.
74
+ Correct the radius for position of beam centre on detector face at twoTheta=0.
74
75
  """
75
76
  usable_radius = _calc_useful_radius(detector_radius_mm, beam_x_mm, beam_y_mm)
76
77
  return _calc_res_off_axis_detector(
@@ -19,7 +19,8 @@ from dodal.utils import get_run_number
19
19
 
20
20
  class TriggerMode(Enum):
21
21
  """In set frames the number of frames is known at arm time. In free run they are
22
- not known until the detector is unstaged."""
22
+ not known until the detector is unstaged.
23
+ """
23
24
 
24
25
  SET_FRAMES = auto()
25
26
  FREE_RUN = auto()
@@ -27,7 +28,8 @@ class TriggerMode(Enum):
27
28
 
28
29
  class DetectorParams(BaseModel):
29
30
  """Holds parameters for the detector. Provides access to a list of Dectris detector
30
- sizes and a converter for distance to beam centre."""
31
+ sizes and a converter for distance to beam centre.
32
+ """
31
33
 
32
34
  # https://github.com/pydantic/pydantic/issues/8379
33
35
  # Must use model_dump(by_alias=True) if serialising!
@@ -26,9 +26,8 @@ T = TypeVar("T", bound=_Filters)
26
26
 
27
27
 
28
28
  class DiamondFilter(Positioner1D[T]):
29
- """
30
- A filter set that is used to reduce the heat load on the monochromator.
29
+ """A filter set that is used to reduce the heat load on the monochromator.
31
30
 
32
- It has 4 slots that can contain filters of different thickness. Changing the thickness
33
- signal will move the filter set to select this filter.
31
+ It has 4 slots that can contain filters of different thickness. Changing the
32
+ thickness signal will move the filter set to select this filter.
34
33
  """
dodal/devices/eiger.py CHANGED
@@ -323,14 +323,14 @@ class EigerDetector(Device, Stageable):
323
323
  return status
324
324
 
325
325
  def set_detector_threshold(self, energy: float, tolerance: float = 0.1) -> Status:
326
- """Ensures the energy threshold on the detector is set to the specified energy (in eV),
327
- within the specified tolerance.
326
+ """Ensures the energy threshold on the detector is set to the specified energy
327
+ (in eV), within the specified tolerance.
328
+
328
329
  Args:
329
330
  energy (float): The energy to set (in eV)
330
331
  tolerance (float, optional): If the energy is already set to within
331
332
  this tolerance it is not set again. Defaults to 0.1eV.
332
333
  """
333
-
334
334
  current_energy = float(self.cam.photon_energy.get())
335
335
  if abs(current_energy - energy) > tolerance:
336
336
  LOGGER.info(f"Setting detector threshold to {energy}")
@@ -167,7 +167,7 @@ class EigerOdin(Device):
167
167
  return not error_strings, "\n".join(error_strings)
168
168
 
169
169
  def stop(self) -> StatusBase:
170
- """Stop odin manually"""
170
+ """Stop odin manually."""
171
171
  LOGGER.info("Stopping Odin...")
172
172
  status = self.file_writer.capture.set(0)
173
173
  status &= self.meta.stop_writing.set(1)
@@ -21,10 +21,19 @@ class ElectronAnalyserController(
21
21
  ConstantDeadTimeController[TAbstractAnalyserDriverIO],
22
22
  Generic[TAbstractAnalyserDriverIO, TAbstractBaseRegion],
23
23
  ):
24
- """
25
- Specialised controller for the electron analysers to provide additional setup logic
26
- such as selecting the energy source to use from requested region and giving the
27
- driver the correct region parameters.
24
+ """Specialised controller for the electron analysers to provide additional setup
25
+ logic such as selecting the energy source to use from requested region and giving
26
+ the driver the correct region parameters.
27
+
28
+ Args:
29
+ driver (TAbstractAnalyserDriverIO): The electron analyser driver to wrap
30
+ around that holds the PV's.
31
+ energy_source (AbstractEnergySource): Device that holds the excitation
32
+ energy and ability to switch between sources.
33
+ deadtime (float, optional): For a given exposure, what is the safest minimum
34
+ time between exposures that can be determined without reading signals.
35
+ image_mode (ADImageMode, optional): The image mode to configure the driver
36
+ with before measuring.
28
37
  """
29
38
 
30
39
  def __init__(
@@ -36,15 +45,6 @@ class ElectronAnalyserController(
36
45
  deadtime: float = 0,
37
46
  image_mode: ADImageMode = ADImageMode.SINGLE,
38
47
  ):
39
- """
40
- Parameters:
41
- driver: The electron analyser driver to wrap around that holds the PV's.
42
- energy_source: Device that holds the excitation energy and ability to switch
43
- between sources.
44
- deadtime: For a given exposure, what is the safest minimum time between
45
- exposures that can be determined without reading signals.
46
- image_mode: The image mode to configure the driver with before measuring.
47
- """
48
48
  self.energy_source = energy_source
49
49
  self.shutter = shutter
50
50
  self.source_selector = source_selector
@@ -33,9 +33,8 @@ class BaseElectronAnalyserDetector(
33
33
  AsyncConfigurable,
34
34
  Generic[TAbstractAnalyserDriverIO, TAbstractBaseRegion],
35
35
  ):
36
- """
37
- Detector for data acquisition of electron analyser. Can only acquire using settings
38
- already configured for the device.
36
+ """Detector for data acquisition of electron analyser. Can only acquire using
37
+ settings already configured for the device.
39
38
 
40
39
  If possible, this should be changed to inherit from a StandardDetector. Currently,
41
40
  StandardDetector forces you to use a file writer which doesn't apply here.
@@ -90,9 +89,8 @@ class ElectronAnalyserRegionDetector(
90
89
  BaseElectronAnalyserDetector[TAbstractAnalyserDriverIO, TAbstractBaseRegion],
91
90
  Generic[TAbstractAnalyserDriverIO, TAbstractBaseRegion],
92
91
  ):
93
- """
94
- Extends electron analyser detector to configure specific region settings before data
95
- acquisition. It is designed to only exist inside a plan.
92
+ """Extends electron analyser detector to configure specific region settings before
93
+ data acquisition. It is designed to only exist inside a plan.
96
94
  """
97
95
 
98
96
  def __init__(
@@ -127,10 +125,9 @@ class ElectronAnalyserDetector(
127
125
  Stageable,
128
126
  Generic[TAbstractBaseSequence, TAbstractAnalyserDriverIO, TAbstractBaseRegion],
129
127
  ):
130
- """
131
- Electron analyser detector with the additional functionality to load a sequence file
132
- and create a list of temporary ElectronAnalyserRegionDetector objects. These will
133
- setup configured region settings before data acquisition.
128
+ """Electron analyser detector with the additional functionality to load a sequence
129
+ file and create a list of temporary ElectronAnalyserRegionDetector objects. These
130
+ will setup configured region settings before data acquisition.
134
131
  """
135
132
 
136
133
  def __init__(
@@ -146,8 +143,7 @@ class ElectronAnalyserDetector(
146
143
 
147
144
  @AsyncStatus.wrap
148
145
  async def stage(self) -> None:
149
- """
150
- Prepare the detector for use by ensuring it is idle and ready.
146
+ """Prepare the detector for use by ensuring it is idle and ready.
151
147
 
152
148
  This method asynchronously stages the detector by first disarming the controller
153
149
  to ensure the detector is not actively acquiring data, then invokes the driver's
@@ -165,11 +161,10 @@ class ElectronAnalyserDetector(
165
161
  await self._controller.disarm()
166
162
 
167
163
  def load_sequence(self, filename: str) -> TAbstractBaseSequence:
168
- """
169
- Load the sequence data from a provided json file into a sequence class.
164
+ """Load the sequence data from a provided json file into a sequence class.
170
165
 
171
166
  Args:
172
- filename: Path to the sequence file containing the region data.
167
+ filename (str): Path to the sequence file containing the region data.
173
168
 
174
169
  Returns:
175
170
  Pydantic model representing the sequence file.
@@ -181,17 +176,17 @@ class ElectronAnalyserDetector(
181
176
  ) -> list[
182
177
  ElectronAnalyserRegionDetector[TAbstractAnalyserDriverIO, TAbstractBaseRegion]
183
178
  ]:
184
- """
185
- Create a list of detectors equal to the number of regions in a sequence file.
179
+ """Create a list of detectors equal to the number of regions in a sequence file.
186
180
  Each detector is responsible for setting up a specific region.
187
181
 
188
182
  Args:
189
- filename: Path to the sequence file containing the region data.
190
- enabled_only: If true, only include the region if enabled is True.
183
+ filename (str): Path to the sequence file containing the region data.
184
+ enabled_only (bool, optional): If true, only include the region if enabled
185
+ is True.
191
186
 
192
187
  Returns:
193
188
  List of ElectronAnalyserRegionDetector, equal to the number of regions in
194
- the sequence file.
189
+ the sequence file.
195
190
  """
196
191
  seq = self.load_sequence(filename)
197
192
  regions: list[TAbstractBaseRegion] = (