dls-dodal 1.29.4__py3-none-any.whl → 1.31.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 (103) hide show
  1. {dls_dodal-1.29.4.dist-info → dls_dodal-1.31.0.dist-info}/METADATA +29 -44
  2. dls_dodal-1.31.0.dist-info/RECORD +134 -0
  3. {dls_dodal-1.29.4.dist-info → dls_dodal-1.31.0.dist-info}/WHEEL +1 -1
  4. dls_dodal-1.31.0.dist-info/entry_points.txt +3 -0
  5. dodal/__init__.py +1 -4
  6. dodal/_version.py +2 -2
  7. dodal/beamline_specific_utils/i03.py +1 -4
  8. dodal/beamlines/__init__.py +7 -1
  9. dodal/beamlines/i03.py +34 -29
  10. dodal/beamlines/i04.py +39 -16
  11. dodal/beamlines/i13_1.py +66 -0
  12. dodal/beamlines/i22.py +22 -22
  13. dodal/beamlines/i24.py +1 -1
  14. dodal/beamlines/p38.py +21 -21
  15. dodal/beamlines/p45.py +18 -16
  16. dodal/beamlines/p99.py +61 -0
  17. dodal/beamlines/training_rig.py +64 -0
  18. dodal/cli.py +6 -3
  19. dodal/common/beamlines/beamline_parameters.py +7 -6
  20. dodal/common/beamlines/beamline_utils.py +15 -14
  21. dodal/common/maths.py +1 -3
  22. dodal/common/types.py +6 -5
  23. dodal/common/udc_directory_provider.py +39 -21
  24. dodal/common/visit.py +60 -62
  25. dodal/devices/CTAB.py +22 -17
  26. dodal/devices/aperture.py +1 -1
  27. dodal/devices/aperturescatterguard.py +139 -209
  28. dodal/devices/areadetector/adaravis.py +8 -6
  29. dodal/devices/areadetector/adsim.py +2 -3
  30. dodal/devices/areadetector/adutils.py +20 -12
  31. dodal/devices/areadetector/plugins/MJPG.py +2 -1
  32. dodal/devices/backlight.py +12 -1
  33. dodal/devices/cryostream.py +19 -7
  34. dodal/devices/dcm.py +1 -1
  35. dodal/devices/detector/__init__.py +13 -2
  36. dodal/devices/detector/det_dim_constants.py +2 -2
  37. dodal/devices/detector/det_dist_to_beam_converter.py +1 -1
  38. dodal/devices/detector/detector.py +33 -32
  39. dodal/devices/detector/detector_motion.py +38 -31
  40. dodal/devices/eiger.py +11 -15
  41. dodal/devices/eiger_odin.py +9 -10
  42. dodal/devices/fast_grid_scan.py +18 -27
  43. dodal/devices/fluorescence_detector_motion.py +13 -4
  44. dodal/devices/focusing_mirror.py +6 -6
  45. dodal/devices/hutch_shutter.py +4 -4
  46. dodal/devices/i22/dcm.py +5 -4
  47. dodal/devices/i22/fswitch.py +10 -6
  48. dodal/devices/i22/nxsas.py +55 -43
  49. dodal/devices/i24/aperture.py +1 -1
  50. dodal/devices/i24/beamstop.py +1 -1
  51. dodal/devices/i24/dcm.py +1 -1
  52. dodal/devices/i24/{I24_detector_motion.py → i24_detector_motion.py} +1 -1
  53. dodal/devices/i24/pmac.py +67 -12
  54. dodal/devices/ipin.py +7 -4
  55. dodal/devices/linkam3.py +12 -6
  56. dodal/devices/logging_ophyd_device.py +1 -1
  57. dodal/devices/motors.py +32 -6
  58. dodal/devices/oav/grid_overlay.py +1 -0
  59. dodal/devices/oav/microns_for_zoom_levels.json +1 -1
  60. dodal/devices/oav/oav_detector.py +2 -1
  61. dodal/devices/oav/oav_parameters.py +18 -10
  62. dodal/devices/oav/oav_to_redis_forwarder.py +129 -0
  63. dodal/devices/oav/pin_image_recognition/__init__.py +6 -6
  64. dodal/devices/oav/pin_image_recognition/utils.py +5 -6
  65. dodal/devices/oav/utils.py +2 -2
  66. dodal/devices/p99/__init__.py +0 -0
  67. dodal/devices/p99/sample_stage.py +43 -0
  68. dodal/devices/robot.py +31 -20
  69. dodal/devices/scatterguard.py +1 -1
  70. dodal/devices/scintillator.py +8 -5
  71. dodal/devices/slits.py +1 -1
  72. dodal/devices/smargon.py +4 -4
  73. dodal/devices/status.py +2 -31
  74. dodal/devices/tetramm.py +23 -19
  75. dodal/devices/thawer.py +5 -3
  76. dodal/devices/training_rig/__init__.py +0 -0
  77. dodal/devices/training_rig/sample_stage.py +10 -0
  78. dodal/devices/turbo_slit.py +1 -1
  79. dodal/devices/undulator.py +1 -1
  80. dodal/devices/undulator_dcm.py +6 -8
  81. dodal/devices/util/adjuster_plans.py +3 -3
  82. dodal/devices/util/epics_util.py +5 -7
  83. dodal/devices/util/lookup_tables.py +2 -3
  84. dodal/devices/util/save_panda.py +87 -0
  85. dodal/devices/util/test_utils.py +17 -0
  86. dodal/devices/webcam.py +3 -3
  87. dodal/devices/xbpm_feedback.py +1 -25
  88. dodal/devices/xspress3/xspress3.py +1 -1
  89. dodal/devices/zebra.py +15 -10
  90. dodal/devices/zebra_controlled_shutter.py +26 -11
  91. dodal/devices/zocalo/zocalo_interaction.py +10 -2
  92. dodal/devices/zocalo/zocalo_results.py +36 -19
  93. dodal/log.py +46 -15
  94. dodal/plans/check_topup.py +65 -10
  95. dodal/plans/data_session_metadata.py +8 -9
  96. dodal/plans/motor_util_plans.py +117 -0
  97. dodal/utils.py +65 -22
  98. dls_dodal-1.29.4.dist-info/RECORD +0 -125
  99. dls_dodal-1.29.4.dist-info/entry_points.txt +0 -2
  100. dodal/devices/beamstop.py +0 -8
  101. dodal/devices/qbpm1.py +0 -8
  102. {dls_dodal-1.29.4.dist-info → dls_dodal-1.31.0.dist-info}/LICENSE +0 -0
  103. {dls_dodal-1.29.4.dist-info → dls_dodal-1.31.0.dist-info}/top_level.txt +0 -0
@@ -1,29 +1,28 @@
1
1
  from bluesky import plan_stubs as bps
2
2
  from bluesky import preprocessors as bpp
3
3
  from bluesky.utils import make_decorator
4
- from ophyd_async.core import DirectoryInfo
5
4
 
6
5
  from dodal.common.beamlines import beamline_utils
7
- from dodal.common.types import MsgGenerator, UpdatingDirectoryProvider
6
+ from dodal.common.types import MsgGenerator, UpdatingPathProvider
8
7
 
9
8
  DATA_SESSION = "data_session"
10
9
  DATA_GROUPS = "data_groups"
11
10
 
12
11
 
13
12
  def attach_data_session_metadata_wrapper(
14
- plan: MsgGenerator, provider: UpdatingDirectoryProvider | None = None
13
+ plan: MsgGenerator, provider: UpdatingPathProvider | None = None
15
14
  ) -> MsgGenerator:
16
15
  """
17
16
  Attach data session metadata to the runs within a plan and make it correlate
18
- with an ophyd-async DirectoryProvider.
17
+ with an ophyd-async PathProvider.
19
18
 
20
- This updates the directory provider (which in turn makes a call to to a service
19
+ This updates the path provider (which in turn makes a call to to a service
21
20
  to figure out which scan number we are using for such a scan), and ensures the
22
21
  start document contains the correct data session.
23
22
 
24
23
  Args:
25
24
  plan: The plan to preprocess
26
- provider: The directory provider that participating detectors are aware of.
25
+ provider: The path provider that participating detectors are aware of.
27
26
 
28
27
  Returns:
29
28
  MsgGenerator: A plan
@@ -32,12 +31,12 @@ def attach_data_session_metadata_wrapper(
32
31
  Iterator[Msg]: Plan messages
33
32
  """
34
33
  if provider is None:
35
- provider = beamline_utils.get_directory_provider()
34
+ provider = beamline_utils.get_path_provider()
36
35
  yield from bps.wait_for([provider.update])
37
- directory_info: DirectoryInfo = provider()
36
+ ress = yield from bps.wait_for([provider.data_session])
37
+ data_session = ress[0].result()
38
38
  # https://github.com/DiamondLightSource/dodal/issues/452
39
39
  # As part of 452, write each dataCollection into their own folder, then can use resource_dir directly
40
- data_session = directory_info.prefix.removesuffix("-")
41
40
  yield from bpp.inject_md_wrapper(plan, md={DATA_SESSION: data_session})
42
41
 
43
42
 
@@ -0,0 +1,117 @@
1
+ import uuid
2
+ from collections.abc import Generator
3
+ from typing import Any, TypeVar
4
+
5
+ from bluesky import plan_stubs as bps
6
+ from bluesky.preprocessors import finalize_wrapper, pchain
7
+ from bluesky.utils import Msg, make_decorator
8
+ from ophyd_async.core import Device
9
+ from ophyd_async.epics.motor import Motor
10
+
11
+ from dodal.common import MsgGenerator
12
+
13
+ AnyDevice = TypeVar("AnyDevice", bound=Device)
14
+
15
+
16
+ class MoveTooLarge(Exception):
17
+ def __init__(
18
+ self, axis: Device, maximum_move: float, position: float, *args: object
19
+ ) -> None:
20
+ self.axis = axis
21
+ self.maximum_move = maximum_move
22
+ self.position = position
23
+ super().__init__(*args)
24
+
25
+
26
+ def _check_and_cache_values(
27
+ devices_and_positions: dict[AnyDevice, float],
28
+ smallest_move: float,
29
+ maximum_move: float,
30
+ ) -> Generator[Msg, Any, dict[AnyDevice, float]]:
31
+ """Caches the positions of all Motors on specified device if they are within
32
+ smallest_move of home_position. Throws MoveTooLarge if they are outside maximum_move
33
+ of the home_position
34
+ """
35
+ positions = {}
36
+ for axis, new_position in devices_and_positions.items():
37
+ position = yield from bps.rd(axis)
38
+ if abs(position - new_position) > maximum_move:
39
+ raise MoveTooLarge(axis, maximum_move, position)
40
+ if abs(position - new_position) > smallest_move:
41
+ positions[axis] = position
42
+ return positions
43
+
44
+
45
+ def home_and_reset_wrapper(
46
+ plan: MsgGenerator,
47
+ device: Device,
48
+ smallest_move: float,
49
+ maximum_move: float,
50
+ group: str | None = None,
51
+ wait_for_all: bool = True,
52
+ ) -> MsgGenerator:
53
+ home_positions = {
54
+ axis: 0.0 for _, axis in device.children() if isinstance(axis, Motor)
55
+ }
56
+ return move_and_reset_wrapper(
57
+ plan, home_positions, smallest_move, maximum_move, group, wait_for_all
58
+ )
59
+
60
+
61
+ def move_and_reset_wrapper(
62
+ plan: MsgGenerator,
63
+ device_and_positions: dict[AnyDevice, float],
64
+ smallest_move: float,
65
+ maximum_move: float,
66
+ group: str | None = None,
67
+ wait_for_all: bool = True,
68
+ ) -> MsgGenerator:
69
+ """Wrapper that does the following:
70
+ 1. Caches the positions of all Motors on device
71
+ 2. Throws a MoveTooLarge exception if any positions are maximum_move away from home_position
72
+ 2. Moves any motor that is more than smallest_move away from the home_position to home_position
73
+ 3. Runs the specified plan
74
+ 4. Moves all motors back to their cached positions
75
+
76
+ Args:
77
+ plan (Callable[[], MsgGenerator]): The plan to move between homing and returning to the cache
78
+ device (Device): The device to move. All Motors in the device will be cached and moved
79
+ smallest_move (float): The smallest move that we care about doing the home and cache for.
80
+ Useful for not wearing out motors if you have large tolerances
81
+ maximum_move (float): If any Motor starts this far from the home an exception is raised
82
+ and no moves occur
83
+ home_position (float): The position to move every motor to after caching
84
+ group (str, optional): If set the home move will be done using the home-{group}
85
+ group and the reset to cache done using reset-{group}
86
+ wait_for_all (bool, optional): If true the home and reset to cache will be waited
87
+ on. If false it is left up to the caller to wait on
88
+ them. Defaults to True.
89
+ """
90
+ initial_positions = yield from _check_and_cache_values(
91
+ device_and_positions, smallest_move, maximum_move
92
+ )
93
+
94
+ def move_to_home():
95
+ home_group = f"home-{group if group else str(uuid.uuid4())[:6]}"
96
+ for axis, position in device_and_positions.items():
97
+ if axis in initial_positions.keys():
98
+ yield from bps.abs_set(axis, position, group=home_group)
99
+ if wait_for_all:
100
+ yield from bps.wait(home_group)
101
+
102
+ def return_to_initial_position():
103
+ reset_group = f"reset-{group if group else str(uuid.uuid4())[:6]}"
104
+ for axis, position in initial_positions.items():
105
+ yield from bps.abs_set(axis, position, group=reset_group)
106
+ if wait_for_all:
107
+ yield from bps.wait(reset_group)
108
+
109
+ return (
110
+ yield from finalize_wrapper(
111
+ pchain(move_to_home(), plan),
112
+ return_to_initial_position(),
113
+ )
114
+ )
115
+
116
+
117
+ home_and_reset_decorator = make_decorator(home_and_reset_wrapper)
dodal/utils.py CHANGED
@@ -4,6 +4,7 @@ import os
4
4
  import re
5
5
  import socket
6
6
  import string
7
+ from collections.abc import Callable, Iterable, Mapping
7
8
  from dataclasses import dataclass
8
9
  from functools import wraps
9
10
  from importlib import import_module
@@ -12,13 +13,6 @@ from os import environ
12
13
  from types import ModuleType
13
14
  from typing import (
14
15
  Any,
15
- Callable,
16
- Dict,
17
- Iterable,
18
- List,
19
- Mapping,
20
- Tuple,
21
- Type,
22
16
  TypeVar,
23
17
  )
24
18
 
@@ -46,7 +40,7 @@ import dodal.log
46
40
  try:
47
41
  from typing import TypeAlias
48
42
  except ImportError:
49
- from typing_extensions import TypeAlias
43
+ from typing import TypeAlias
50
44
 
51
45
 
52
46
  #: Protocols defining interface to hardware
@@ -108,9 +102,35 @@ def skip_device(precondition=lambda: True):
108
102
  return decorator
109
103
 
110
104
 
105
+ def make_device(
106
+ module: str | ModuleType,
107
+ device_name: str,
108
+ **kwargs,
109
+ ) -> dict[str, AnyDevice]:
110
+ """Make a single named device and its dependencies from the given beamline module.
111
+
112
+ Args:
113
+ module (str | ModuleType): The module to make devices from.
114
+ device_name: Name of the device to construct
115
+ **kwargs: Arguments passed on to every device factory
116
+
117
+ Returns:
118
+ dict[str, AnyDevice]: A dict mapping device names to the constructed devices
119
+ """
120
+ if isinstance(module, str):
121
+ module = import_module(module)
122
+
123
+ device_collector = {}
124
+ factories = collect_factories(module)
125
+ device_collector[device_name] = _make_one_device(
126
+ module, device_name, device_collector, factories, **kwargs
127
+ )
128
+ return device_collector
129
+
130
+
111
131
  def make_all_devices(
112
132
  module: str | ModuleType | None = None, include_skipped: bool = False, **kwargs
113
- ) -> Tuple[Dict[str, AnyDevice], Dict[str, Exception]]:
133
+ ) -> tuple[dict[str, AnyDevice], dict[str, Exception]]:
114
134
  """Makes all devices in the given beamline module.
115
135
 
116
136
  In cases of device interdependencies it ensures a device is created before any which
@@ -129,7 +149,7 @@ def make_all_devices(
129
149
  if isinstance(module, str) or module is None:
130
150
  module = import_module(module or __name__)
131
151
  factories = collect_factories(module, include_skipped)
132
- devices: Tuple[Dict[str, AnyDevice], Dict[str, Exception]] = invoke_factories(
152
+ devices: tuple[dict[str, AnyDevice], dict[str, Exception]] = invoke_factories(
133
153
  factories, **kwargs
134
154
  )
135
155
 
@@ -139,7 +159,7 @@ def make_all_devices(
139
159
  def invoke_factories(
140
160
  factories: Mapping[str, AnyDeviceFactory],
141
161
  **kwargs,
142
- ) -> Tuple[Dict[str, AnyDevice], Dict[str, Exception]]:
162
+ ) -> tuple[dict[str, AnyDevice], dict[str, Exception]]:
143
163
  """Call device factory functions in the correct order to resolve dependencies.
144
164
  Inspect function signatures to work out dependencies and execute functions in
145
165
  correct order.
@@ -259,15 +279,13 @@ def is_any_device_factory(func: Callable) -> bool:
259
279
  return is_v1_device_factory(func) or is_v2_device_factory(func)
260
280
 
261
281
 
262
- def is_v2_device_type(obj: Type[Any]) -> bool:
263
- return inspect.isclass(obj) and issubclass(obj, OphydV2Device)
282
+ def is_v2_device_type(obj: type[Any]) -> bool:
283
+ return inspect.isclass(obj) and isinstance(obj, OphydV2Device)
264
284
 
265
285
 
266
- def is_v1_device_type(obj: Type[Any]) -> bool:
286
+ def is_v1_device_type(obj: type[Any]) -> bool:
267
287
  is_class = inspect.isclass(obj)
268
- follows_protocols = any(
269
- (isinstance(obj, protocol) for protocol in BLUESKY_PROTOCOLS)
270
- )
288
+ follows_protocols = any(isinstance(obj, protocol) for protocol in BLUESKY_PROTOCOLS)
271
289
  return is_class and follows_protocols and not is_v2_device_type(obj)
272
290
 
273
291
 
@@ -292,13 +310,11 @@ def get_beamline_based_on_environment_variable() -> ModuleType:
292
310
  or any(c not in valid_characters for c in beamline)
293
311
  ):
294
312
  raise ValueError(
295
- "Invalid BEAMLINE variable - module name is not a permissible python module name, got '{}'".format(
296
- beamline
297
- )
313
+ f"Invalid BEAMLINE variable - module name is not a permissible python module name, got '{beamline}'"
298
314
  )
299
315
 
300
316
  try:
301
- return importlib.import_module("dodal.beamlines.{}".format(beamline))
317
+ return importlib.import_module(f"dodal.beamlines.{beamline}")
302
318
  except ImportError as e:
303
319
  raise ValueError(
304
320
  f"Failed to import beamline-specific dodal module 'dodal.beamlines.{beamline}'."
@@ -306,7 +322,7 @@ def get_beamline_based_on_environment_variable() -> ModuleType:
306
322
  ) from e
307
323
 
308
324
 
309
- def _find_next_run_number_from_files(file_names: List[str]) -> int:
325
+ def _find_next_run_number_from_files(file_names: list[str]) -> int:
310
326
  valid_numbers = []
311
327
 
312
328
  for file_name in file_names:
@@ -336,3 +352,30 @@ def get_run_number(directory: str, prefix: str = "") -> int:
336
352
  return 1
337
353
  else:
338
354
  return _find_next_run_number_from_files(nexus_file_names)
355
+
356
+
357
+ def _make_one_device(
358
+ module: ModuleType,
359
+ device_name: str,
360
+ devices: dict[str, AnyDevice],
361
+ factories: dict[str, AnyDeviceFactory],
362
+ **kwargs,
363
+ ) -> AnyDevice:
364
+ factory = factories.get(device_name)
365
+ if not factory:
366
+ raise ValueError(f"Unable to find factory for {device_name}")
367
+
368
+ dependencies = list(extract_dependencies(factories, device_name))
369
+ for dependency_name in dependencies:
370
+ if dependency_name not in devices:
371
+ try:
372
+ devices[dependency_name] = _make_one_device(
373
+ module, dependency_name, devices, factories, **kwargs
374
+ )
375
+ except Exception as e:
376
+ raise RuntimeError(
377
+ f"Unable to construct device {dependency_name}"
378
+ ) from e
379
+
380
+ params = {name: devices[name] for name in dependencies}
381
+ return factory(**params, **kwargs)
@@ -1,125 +0,0 @@
1
- dodal/__init__.py,sha256=y-VRpfiX-Lm5nchB9N0VfMy_6dwFqVxpSn5SiAQql9I,114
2
- dodal/__main__.py,sha256=kP2S2RPitnOWpNGokjZ1Yq-1umOtp5sNOZk2B3tBPLM,111
3
- dodal/_version.py,sha256=dGQcJRhmSkKpwrkZVgo13Sd0AVHTIBb9i0csee9mzMo,413
4
- dodal/adsim.py,sha256=OW2dcS7ciD4Yq9WFw4PN_c5Bwccrmu7R-zr-u6ZCbQM,497
5
- dodal/cli.py,sha256=z0UBESrNrq6Kq4rttp4uHcwS1fnOnRkKBRDHSriPpGY,2058
6
- dodal/log.py,sha256=dfo1rfYrGG8oIm2HkNxaa_ldVs4vJKtgWSoKe1Z_Xno,8533
7
- dodal/utils.py,sha256=SFDmUOLtxLe5OdNdVgS_EftNpX0ihxduBwq6tufw8s4,10174
8
- dodal/beamline_specific_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- dodal/beamline_specific_utils/i03.py,sha256=Ixe1anFQl-kwRJubmQx28TIW4Zw8qDxpElNNNapWQHI,396
10
- dodal/beamlines/README.md,sha256=K9MkL_GomxlsoTB7Mz-_dJA5NNSbmCfMiutchGg3C8o,404
11
- dodal/beamlines/__init__.py,sha256=U0dQYFEUloCdQOs24zyfpPTncJXOO4cDcfHSevVOAw4,2890
12
- dodal/beamlines/i03.py,sha256=J-4GawTxAhrYDQZh87n11L9ehTgObEQ1Lz2PueXCWbc,16892
13
- dodal/beamlines/i04.py,sha256=JOyNcUnC3wva4no2MHKp6b8gOKAcQXL_c4cBo7oneVs,13034
14
- dodal/beamlines/i04_1.py,sha256=KDxSUQNhIs_NFiRaLY-Jiory0DeN7Y0ErvGuoTrwCDU,4731
15
- dodal/beamlines/i20_1.py,sha256=MaPgONHqpoZuBtkiKEzYtViJnKBM2_ekeP4OdbmuXHE,1158
16
- dodal/beamlines/i22.py,sha256=3VFdA4Wc7O40-64lwUtUBIN23fH4JVNbLKJ1JLjy9as,9870
17
- dodal/beamlines/i23.py,sha256=2j5qLoqE_hg9ETHqNkOVu7LLkVB8qalgXeORnVYKN_I,1075
18
- dodal/beamlines/i24.py,sha256=tPSrWArwRd0fb59HyHFRGR1FdscM7t9_hNPk0edhh4o,6583
19
- dodal/beamlines/p38.py,sha256=TC78u4GwEnj6X0r5cnHhqNdBbbDRnh8lY8pEucBZjEU,8006
20
- dodal/beamlines/p45.py,sha256=TNIkC-SBfj0ayZtlLLXW9xCSi5CzJkO8XpAMIo8fjao,2957
21
- dodal/common/__init__.py,sha256=ZC4ICKUDB0BDxRaVy8nmqclVmDBne-dPtk6UJsoFq6I,258
22
- dodal/common/coordination.py,sha256=OxIjDiO1-9A9KESRPFtzwkvvQlavbgA5RHemlbubBPg,1168
23
- dodal/common/maths.py,sha256=JRSBhbMzwlicKp1_Bsfu9gA79JJA_Dgq9EpbExFH65M,1829
24
- dodal/common/types.py,sha256=M0gZs9F7--gREF8VYJn-Y1Mt9mIEgp1aLY3oUpUkSno,546
25
- dodal/common/udc_directory_provider.py,sha256=zNlt_VgdAlyBtVN7neTHk_0tWBbI4pPUL7q9WQOzXvo,1260
26
- dodal/common/visit.py,sha256=MhrFbLptMG0Wvd2nHubBwQ44qAzoP4Bf4_z_-wO8rh0,6063
27
- dodal/common/beamlines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- dodal/common/beamlines/beamline_parameters.py,sha256=N22dtDLw3Hlo7EUmGxe4qFGcu7OnldwCz_mU7yK2rd0,3577
29
- dodal/common/beamlines/beamline_utils.py,sha256=AgmH9wpnFQ4DHAA7_Yo0COa2piX2ksFxukFt2_600kA,4488
30
- dodal/common/beamlines/device_helpers.py,sha256=s79js7no9k8JMfG7NvdmFomSP5m5VDQ6th_Hsbx1znA,939
31
- dodal/devices/CTAB.py,sha256=_MfL_KH4uDPxq_RuHFEZ9HVXOpUnQb5be3csoz9DdAs,1630
32
- dodal/devices/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- dodal/devices/adsim.py,sha256=dMU0TKIuiODHYFHQOH4_5UvB8iJtaJEtjqaEDGjcU-w,311
34
- dodal/devices/aperture.py,sha256=0MtTzKMDZ5DVAz0DE0kXI0M76VCp0y9vFsrMggEMpxk,586
35
- dodal/devices/aperturescatterguard.py,sha256=2JJsEPJGJHrI0ztv1cSaP7H5T6qdzDfUcN-VEQ39B8o,11012
36
- dodal/devices/attenuator.py,sha256=viK1iccNekX6ZvR_ZmSwj5JdM1j2B8pcTg8qWDdmzhQ,2584
37
- dodal/devices/backlight.py,sha256=vsNGZB4C_mVMafllvJlOTghsfv6UqALMKUMLXu3WZ5k,1115
38
- dodal/devices/beamstop.py,sha256=8L3qhlk-3ZBOp10xK1i8qZqYTGOXX1mVF1MgXoN0dfg,215
39
- dodal/devices/cryostream.py,sha256=6MU4rXIOL33C-8F3DVfAtv0ZnwiysTtawjkeePd5IrQ,332
40
- dodal/devices/dcm.py,sha256=vfyGYDzfSwTiNqlzkfNjkrL-Q1hNVSgJddvJ5Un_lvg,1610
41
- dodal/devices/eiger.py,sha256=HpZIZ6Y8iffo9GxmuFJmnyRCa5Tl0BKSKU2_wVccHDo,14069
42
- dodal/devices/eiger_odin.py,sha256=zKNu5OaIQ9HkflfxKCi87Yr1kEG2gXfxzj0KPv0XzCk,6960
43
- dodal/devices/fast_grid_scan.py,sha256=BEj96j78r60JPPJoOMP-XXG-_9yURFTuu-pp2LcqQmY,12452
44
- dodal/devices/fluorescence_detector_motion.py,sha256=RrXfPmJzWnAjcjp9u0AnJEfjvWPMKburVTySB2hxYbw,181
45
- dodal/devices/flux.py,sha256=RtPStHw7Mad0igVKntKWVZfuZn2clokVJqH14HLix6M,198
46
- dodal/devices/focusing_mirror.py,sha256=v6TPglvmHiv9H05Lssv1LY5Nr9RBHQISLzL4SJ_QIbk,5890
47
- dodal/devices/hutch_shutter.py,sha256=nZ3gRbYIVJsXLlpZMWT4UEYUFFQP1MwMe8Oy304QsqE,3360
48
- dodal/devices/ipin.py,sha256=OGMXwAE4KDDonZRPFkUmR9Vsk6X4Ox-hEvPT5drP-mQ,208
49
- dodal/devices/linkam3.py,sha256=TPhiQ1D9i_HIlKHAlfnVfX7H6aPOAeXPEJLdmvwdKWQ,3776
50
- dodal/devices/logging_ophyd_device.py,sha256=xw4lbyqq5_ehESGterVEfubJsBiJTWvBp5b9k62gSkg,666
51
- dodal/devices/motors.py,sha256=16ID2jFJ35h6ZrFp76nJG_oQg6uDrupgcbvcbmjlc7c,300
52
- dodal/devices/p45.py,sha256=jzBW2fGRhIbGzSRs5Fgupxro6aqE611n1RTcrTTG-yY,1047
53
- dodal/devices/qbpm1.py,sha256=OY7-WbdxMiLGUK8Z57ezwqSXbHxoPP-y3GvBgj9kgMA,220
54
- dodal/devices/robot.py,sha256=5WQ9kF5m8xhHhipBycsycDV0-_2IBNBkcwuSWP-9-1I,4337
55
- dodal/devices/s4_slit_gaps.py,sha256=j3kgF9WfGFaU9xdUuiAh-QqI5u_vhiAftaDVINt91SM,243
56
- dodal/devices/scatterguard.py,sha256=0qnvhoo3RjLsrxVgIoDJpryqunlgMVgaTsoyKRC2g4Y,331
57
- dodal/devices/scintillator.py,sha256=4Dej1a6HRom9GRwTDsaTKGfvloP20POUqIeHqsI8-R8,184
58
- dodal/devices/slits.py,sha256=URru9VN2N19KqeUPDZaBmyKYn0_JJiE0Vko4sZpfsl8,601
59
- dodal/devices/smargon.py,sha256=Ds8QFqK3ljbTxalqkQ6clpArj4u4hu9d4vrt97Fzdf4,4693
60
- dodal/devices/status.py,sha256=TuUGidZ4Ar-WCRc_sX0wn58DmL6brj1pMr8rNF5Z6VU,1198
61
- dodal/devices/synchrotron.py,sha256=QtTufJA_fCaBawHougSc7nxwu240oX46_y0P-4qIW8o,1960
62
- dodal/devices/tetramm.py,sha256=XriN-zBFVnHxhnTbphSPIZcxEbdWBTbw2g_ulUBl4bw,8538
63
- dodal/devices/thawer.py,sha256=hIdZOzCNloY7CtSvdE2gk4vCMMoOtaIA4dPH_k0OwFg,1527
64
- dodal/devices/turbo_slit.py,sha256=W3ZRIqDhq4iMhr5GcIiWvl2U1GaPtGanqkL7upQOZTY,1132
65
- dodal/devices/undulator.py,sha256=kn84MQpuBHtQj7H7HeBoAYKXu5buGKvTgs3tf2gdEdw,2074
66
- dodal/devices/undulator_dcm.py,sha256=TC9fO55r1YIG_88PPbGGtzfjcRJcaoC2ny51JiDOEX4,5199
67
- dodal/devices/webcam.py,sha256=dvNWJ6hHQR7BUsMRC9TH4XiCCofVhlgZ8HYfVCvd2og,1367
68
- dodal/devices/xbpm_feedback.py,sha256=8QHYKHo9ksZo30olbFM-tHpCHcJRFozgHKVJijv3Gck,1986
69
- dodal/devices/zebra.py,sha256=9Zkq5I3-gcP6qfDBnPEAtFU4QJ-VJyp7cHvB79ZfLHk,9186
70
- dodal/devices/zebra_controlled_shutter.py,sha256=MqX4KE6w0FliZRDBltswcLCNSsp6vQrD_iBY640IljI,1094
71
- dodal/devices/areadetector/__init__.py,sha256=8IwLxuZMW0MOJpJp_ZDdlaE20hrtsH_PXWGaKgMiYs4,240
72
- dodal/devices/areadetector/adaravis.py,sha256=pwbmmnakarjhD59XoyAIXJdakS-nqDG09Xmwq17AVw4,3787
73
- dodal/devices/areadetector/adsim.py,sha256=3U7kS93RM3Xeh-XWKjeuw5jXbIGWAbrs59LfxtvB7OU,1907
74
- dodal/devices/areadetector/adutils.py,sha256=JIx1_sYlehpLtEXcwOEuzVoMplsLdKVW7OWv5eiJqgE,2576
75
- dodal/devices/areadetector/plugins/MJPG.py,sha256=2ISGUg9JxJYzEH640WUIsvFwKolSTywkTyPy9wz6f_k,4064
76
- dodal/devices/detector/__init__.py,sha256=XEwjopgTtBq93RRuFthVVVI9DT1jUvpOJzWOHantJpU,104
77
- dodal/devices/detector/det_dim_constants.py,sha256=MZ4w2nsTKzj4eN7yGsSs1pqKWIuU4vc6UzcSll02uWg,2305
78
- dodal/devices/detector/det_dist_to_beam_converter.py,sha256=f6JFp-eEB2v8NzZg27UrN0VDP5CMjRnaPU6BTA7_n_s,1937
79
- dodal/devices/detector/det_resolution.py,sha256=aQkKp24LpRGiwzPAQM3wLVa4ANw32HdrKc2kftHfKQA,3253
80
- dodal/devices/detector/detector.py,sha256=7IYhndhT9CYCft0MrN1mAnopHqKYbaCRPRGLic76srw,4740
81
- dodal/devices/detector/detector_motion.py,sha256=REREva2kyPcIzOZmahN9rT0jDSuUbV0qUDl4IcBnutA,1221
82
- dodal/devices/i03/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
- dodal/devices/i04/transfocator.py,sha256=uieByXIj0JRbmvMB_om5NOAEbEJkzfkCD24bl2aEo1g,3154
84
- dodal/devices/i20_1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
- dodal/devices/i22/dcm.py,sha256=Kzyd_qFg8KVhRsgfTQVOpghESE8yIOgACKa0Fv9NaZI,6270
86
- dodal/devices/i22/fswitch.py,sha256=AdYtnkCBuhivyJGZqelg_7sjB2pHN7vl1JTtlO4vHo4,3061
87
- dodal/devices/i22/nxsas.py,sha256=ky7v9UZ1UQFsm5hI0wD9OXG-fTKFLj2wJjB7wADxKpw,5655
88
- dodal/devices/i24/I24_detector_motion.py,sha256=Joqr1orgeNvRS7n01bjaO-4Yu4obb8fnKaWHQfjPX14,365
89
- dodal/devices/i24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
- dodal/devices/i24/aperture.py,sha256=kKfHli5oKp-j-qZhZoXTRK81SAUNyhpI6VRvtw0SkZA,850
91
- dodal/devices/i24/beamstop.py,sha256=28hQowTvgN5Zw38tkDh32h2ceyN-2GE8bAaGPvDOt5U,1234
92
- dodal/devices/i24/dcm.py,sha256=Hx5pQ-SHEQ_bLCOnpQYDm6-t-it7nNDmUvopGyiGA2w,1991
93
- dodal/devices/i24/dual_backlight.py,sha256=Th-RKr28aFxE8LCT_mdN9KkRIVw0BHLGKkI0ienfRZU,2049
94
- dodal/devices/i24/i24_vgonio.py,sha256=Igqs7687z6lyhGVeJEDtDmPachYxU48MUH2BF0RpK9Q,461
95
- dodal/devices/i24/pmac.py,sha256=pN54myYvzqPl7iW0Vsp59J1EiV_gtn0xQGwbsKJpiYE,3876
96
- dodal/devices/oav/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
- dodal/devices/oav/grid_overlay.py,sha256=FRtjcFd420XY8MEQ9sWedL0i4pK-KUJOSxh2C5zM3PA,5232
98
- dodal/devices/oav/microns_for_zoom_levels.json,sha256=5PA71RzldFTp0eTUGPmov0MjxHe583mzvfor5f3thXI,1208
99
- dodal/devices/oav/oav_calculations.py,sha256=wt71vFcyQrr98FvX8oyUM2n5vmKi3K7PyOTuWp0gq5w,1665
100
- dodal/devices/oav/oav_detector.py,sha256=PlRIuMYSk46o6Aywel9tMZYh1WzMaBhfn3_GWqCas7w,3681
101
- dodal/devices/oav/oav_errors.py,sha256=cc4mGnaTiAc5WIlOt_BIYOc7CRSkrCdnBaavfAJ0pXY,754
102
- dodal/devices/oav/oav_parameters.py,sha256=4XybkhKeG7IEjPRfx0PVM9KNenuyN0rAGWBZG7H3zvQ,7941
103
- dodal/devices/oav/utils.py,sha256=BkTk0aTqqhIHCZInhcUAYjCRPxumPOlTg9m21skncTc,3018
104
- dodal/devices/oav/pin_image_recognition/__init__.py,sha256=Eve6oY9EYGOSw1x-N--xjgyIEzbZE7TTwGR-Q2NZprQ,6441
105
- dodal/devices/oav/pin_image_recognition/manual_test.py,sha256=h1Rto6ZDCB3jWhjSy9N8ECxRN583iYDJr9LxrTJ8kfE,903
106
- dodal/devices/oav/pin_image_recognition/utils.py,sha256=-7-Zs-331UVTq_AZrfdF-zwZdmMn7eitTkBSqnBrxnk,8620
107
- dodal/devices/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
- dodal/devices/util/adjuster_plans.py,sha256=2AYaywQP_LbA2KJ6Op3cok8GoRtj696utrSSDfaJtBY,875
109
- dodal/devices/util/epics_util.py,sha256=4AOGqYjF0ITzs4c7PTZZnHge81Zheg4gZbFonVW7Lko,4728
110
- dodal/devices/util/lookup_tables.py,sha256=Up-0BlARt79TIEM76SkDyn9LtTFLxPUcaEPZv6D6bws,2141
111
- dodal/devices/util/motor_utils.py,sha256=pNY-aUk9LxaIWeDr5rpMS6udiB9j19wcCXkNDLp1uA0,257
112
- dodal/devices/xspress3/xspress3.py,sha256=29elzI3JtceryKeMWXhcP9nWl0tlSdnTZhltCitet6A,4668
113
- dodal/devices/xspress3/xspress3_channel.py,sha256=yJRwseLmtkW2Vv6GB8sLdOFuBn3e4c9Q8fgPacMgl5w,1638
114
- dodal/devices/zocalo/__init__.py,sha256=oPhjFB39yf2NWkGD-MMcPFnnOVZ_RtdyBt2OLYn-Xa4,505
115
- dodal/devices/zocalo/zocalo_interaction.py,sha256=B6TBTDwUlluksLTwC4TiEEgfFzWLOmwgG8xM5Xd4Wik,3132
116
- dodal/devices/zocalo/zocalo_results.py,sha256=U4Vk4OF-eL8w0BR-fbw3k4jyRo6G3Ywaf8NMAkjr4Hs,9658
117
- dodal/parameters/experiment_parameter_base.py,sha256=O7JamfuJ5cYHkPf9tsHJPqn-OMHTAGouigvM1cDFehE,313
118
- dodal/plans/check_topup.py,sha256=Pj6Eu8fa6nvoW4awrMxvzE_ftpLfYz8bN0QDLRw0Yuk,2989
119
- dodal/plans/data_session_metadata.py,sha256=QNx9rb1EfGBHb21eFekIi7KjNhC0PL-SVKBCggDuNeg,1650
120
- dls_dodal-1.29.4.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
121
- dls_dodal-1.29.4.dist-info/METADATA,sha256=biJK1f1BESw8LgPh4Rl0GrxC9cMJ2WCYxP5NqGPBzak,16950
122
- dls_dodal-1.29.4.dist-info/WHEEL,sha256=-oYQCr74JF3a37z2nRlQays_SX2MqOANoqVjBBAP2yE,91
123
- dls_dodal-1.29.4.dist-info/entry_points.txt,sha256=wpzz9FsTiYxI8OBwLKX9V9ResLwThBSmtRMcPwII0FA,46
124
- dls_dodal-1.29.4.dist-info/top_level.txt,sha256=xIozdmZk_wmMV4wugpq9-6eZs0vgADNUKz3j2UAwlhc,6
125
- dls_dodal-1.29.4.dist-info/RECORD,,
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- dodal = dodal.__main__:main
dodal/devices/beamstop.py DELETED
@@ -1,8 +0,0 @@
1
- from ophyd import Component as Cpt
2
- from ophyd import Device, EpicsMotor
3
-
4
-
5
- class BeamStop(Device):
6
- x = Cpt(EpicsMotor, "-MO-BS-01:X")
7
- y = Cpt(EpicsMotor, "-MO-BS-01:Y")
8
- z = Cpt(EpicsMotor, "-MO-BS-01:Z")
dodal/devices/qbpm1.py DELETED
@@ -1,8 +0,0 @@
1
- from ophyd import Component as Cpt
2
- from ophyd import Device, EpicsSignalRO, Kind
3
-
4
-
5
- class QBPM1(Device):
6
- """Quadrant Beam Position Monitor"""
7
-
8
- intensity = Cpt(EpicsSignalRO, "-DI-QBPM-01:INTEN", kind=Kind.normal)