ophyd-async 0.3.4a1__py3-none-any.whl → 0.5.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. ophyd_async/_version.py +2 -2
  2. ophyd_async/core/__init__.py +86 -63
  3. ophyd_async/core/{detector.py → _detector.py} +18 -23
  4. ophyd_async/core/{device.py → _device.py} +19 -7
  5. ophyd_async/core/{device_save_loader.py → _device_save_loader.py} +3 -3
  6. ophyd_async/core/{flyer.py → _flyer.py} +6 -8
  7. ophyd_async/core/_hdf_dataset.py +97 -0
  8. ophyd_async/{log.py → core/_log.py} +11 -3
  9. ophyd_async/core/{mock_signal_backend.py → _mock_signal_backend.py} +3 -3
  10. ophyd_async/core/{mock_signal_utils.py → _mock_signal_utils.py} +3 -4
  11. ophyd_async/{protocols.py → core/_protocol.py} +1 -1
  12. ophyd_async/core/_providers.py +186 -24
  13. ophyd_async/core/{standard_readable.py → _readable.py} +6 -16
  14. ophyd_async/core/{signal.py → _signal.py} +39 -16
  15. ophyd_async/core/{signal_backend.py → _signal_backend.py} +4 -13
  16. ophyd_async/core/{soft_signal_backend.py → _soft_signal_backend.py} +24 -18
  17. ophyd_async/core/{async_status.py → _status.py} +3 -11
  18. ophyd_async/epics/adaravis/__init__.py +9 -0
  19. ophyd_async/epics/{areadetector/aravis.py → adaravis/_aravis.py} +12 -14
  20. ophyd_async/epics/{areadetector/controllers/aravis_controller.py → adaravis/_aravis_controller.py} +8 -10
  21. ophyd_async/epics/{areadetector/drivers/aravis_driver.py → adaravis/_aravis_io.py} +6 -3
  22. ophyd_async/epics/adcore/__init__.py +36 -0
  23. ophyd_async/epics/adcore/_core_io.py +114 -0
  24. ophyd_async/epics/{areadetector/drivers/ad_base.py → adcore/_core_logic.py} +17 -52
  25. ophyd_async/epics/{areadetector/writers/hdf_writer.py → adcore/_hdf_writer.py} +36 -18
  26. ophyd_async/epics/{areadetector/single_trigger_det.py → adcore/_single_trigger.py} +5 -6
  27. ophyd_async/epics/{areadetector/utils.py → adcore/_utils.py} +29 -0
  28. ophyd_async/epics/adkinetix/__init__.py +9 -0
  29. ophyd_async/epics/{areadetector/kinetix.py → adkinetix/_kinetix.py} +12 -14
  30. ophyd_async/epics/{areadetector/controllers/kinetix_controller.py → adkinetix/_kinetix_controller.py} +6 -9
  31. ophyd_async/epics/{areadetector/drivers/kinetix_driver.py → adkinetix/_kinetix_io.py} +5 -4
  32. ophyd_async/epics/adpilatus/__init__.py +11 -0
  33. ophyd_async/epics/{areadetector/pilatus.py → adpilatus/_pilatus.py} +12 -16
  34. ophyd_async/epics/{areadetector/controllers/pilatus_controller.py → adpilatus/_pilatus_controller.py} +14 -16
  35. ophyd_async/epics/{areadetector/drivers/pilatus_driver.py → adpilatus/_pilatus_io.py} +5 -3
  36. ophyd_async/epics/adsimdetector/__init__.py +7 -0
  37. ophyd_async/epics/adsimdetector/_sim.py +34 -0
  38. ophyd_async/epics/{areadetector/controllers/ad_sim_controller.py → adsimdetector/_sim_controller.py} +8 -14
  39. ophyd_async/epics/advimba/__init__.py +9 -0
  40. ophyd_async/epics/advimba/_vimba.py +43 -0
  41. ophyd_async/epics/{areadetector/controllers/vimba_controller.py → advimba/_vimba_controller.py} +6 -14
  42. ophyd_async/epics/{areadetector/drivers/vimba_driver.py → advimba/_vimba_io.py} +5 -4
  43. ophyd_async/epics/demo/__init__.py +9 -132
  44. ophyd_async/epics/demo/_mover.py +97 -0
  45. ophyd_async/epics/demo/_sensor.py +36 -0
  46. ophyd_async/epics/motor.py +228 -0
  47. ophyd_async/epics/pvi/__init__.py +2 -2
  48. ophyd_async/epics/pvi/{pvi.py → _pvi.py} +17 -14
  49. ophyd_async/epics/signal/__init__.py +7 -1
  50. ophyd_async/epics/{_backend → signal}/_aioca.py +6 -2
  51. ophyd_async/epics/{_backend/common.py → signal/_common.py} +4 -2
  52. ophyd_async/epics/signal/_epics_transport.py +3 -3
  53. ophyd_async/epics/{_backend → signal}/_p4p.py +53 -4
  54. ophyd_async/epics/signal/{signal.py → _signal.py} +10 -9
  55. ophyd_async/fastcs/odin/__init__.py +0 -0
  56. ophyd_async/{panda → fastcs/panda}/__init__.py +28 -9
  57. ophyd_async/{panda → fastcs/panda}/_common_blocks.py +24 -3
  58. ophyd_async/{panda → fastcs/panda}/_hdf_panda.py +6 -9
  59. ophyd_async/{panda/writers → fastcs/panda}/_hdf_writer.py +24 -14
  60. ophyd_async/{panda → fastcs/panda}/_panda_controller.py +2 -1
  61. ophyd_async/{panda → fastcs/panda}/_table.py +20 -18
  62. ophyd_async/fastcs/panda/_trigger.py +90 -0
  63. ophyd_async/plan_stubs/__init__.py +2 -2
  64. ophyd_async/plan_stubs/_ensure_connected.py +26 -0
  65. ophyd_async/plan_stubs/{fly.py → _fly.py} +67 -12
  66. ophyd_async/sim/__init__.py +0 -11
  67. ophyd_async/sim/demo/__init__.py +18 -2
  68. ophyd_async/sim/demo/_pattern_detector/__init__.py +13 -0
  69. ophyd_async/sim/demo/_pattern_detector/_pattern_detector.py +42 -0
  70. ophyd_async/sim/{sim_pattern_detector_control.py → demo/_pattern_detector/_pattern_detector_controller.py} +6 -7
  71. ophyd_async/sim/{sim_pattern_detector_writer.py → demo/_pattern_detector/_pattern_detector_writer.py} +12 -8
  72. ophyd_async/sim/demo/_pattern_detector/_pattern_generator.py +211 -0
  73. ophyd_async/sim/demo/{sim_motor.py → _sim_motor.py} +7 -5
  74. ophyd_async/sim/testing/__init__.py +0 -0
  75. ophyd_async/tango/__init__.py +0 -0
  76. {ophyd_async-0.3.4a1.dist-info → ophyd_async-0.5.0.dist-info}/METADATA +7 -2
  77. ophyd_async-0.5.0.dist-info/RECORD +89 -0
  78. {ophyd_async-0.3.4a1.dist-info → ophyd_async-0.5.0.dist-info}/WHEEL +1 -1
  79. ophyd_async/epics/areadetector/__init__.py +0 -23
  80. ophyd_async/epics/areadetector/controllers/__init__.py +0 -5
  81. ophyd_async/epics/areadetector/drivers/__init__.py +0 -23
  82. ophyd_async/epics/areadetector/vimba.py +0 -43
  83. ophyd_async/epics/areadetector/writers/__init__.py +0 -5
  84. ophyd_async/epics/areadetector/writers/_hdfdataset.py +0 -10
  85. ophyd_async/epics/areadetector/writers/_hdffile.py +0 -54
  86. ophyd_async/epics/areadetector/writers/nd_file_hdf.py +0 -40
  87. ophyd_async/epics/areadetector/writers/nd_plugin.py +0 -38
  88. ophyd_async/epics/demo/demo_ad_sim_detector.py +0 -35
  89. ophyd_async/epics/motion/__init__.py +0 -3
  90. ophyd_async/epics/motion/motor.py +0 -97
  91. ophyd_async/panda/_trigger.py +0 -39
  92. ophyd_async/panda/writers/__init__.py +0 -3
  93. ophyd_async/panda/writers/_panda_hdf_file.py +0 -54
  94. ophyd_async/plan_stubs/ensure_connected.py +0 -22
  95. ophyd_async/sim/pattern_generator.py +0 -318
  96. ophyd_async/sim/sim_pattern_generator.py +0 -35
  97. ophyd_async-0.3.4a1.dist-info/RECORD +0 -86
  98. /ophyd_async/core/{utils.py → _utils.py} +0 -0
  99. /ophyd_async/{epics/_backend → fastcs}/__init__.py +0 -0
  100. /ophyd_async/{panda → fastcs/panda}/_utils.py +0 -0
  101. {ophyd_async-0.3.4a1.dist-info → ophyd_async-0.5.0.dist-info}/LICENSE +0 -0
  102. {ophyd_async-0.3.4a1.dist-info → ophyd_async-0.5.0.dist-info}/entry_points.txt +0 -0
  103. {ophyd_async-0.3.4a1.dist-info → ophyd_async-0.5.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,211 @@
1
+ from pathlib import Path
2
+ from typing import AsyncGenerator, AsyncIterator, Dict, Optional
3
+
4
+ import h5py
5
+ import numpy as np
6
+ from bluesky.protocols import DataKey, StreamAsset
7
+
8
+ from ophyd_async.core import (
9
+ DEFAULT_TIMEOUT,
10
+ HDFDataset,
11
+ HDFFile,
12
+ PathProvider,
13
+ observe_value,
14
+ soft_signal_r_and_setter,
15
+ )
16
+
17
+ # raw data path
18
+ DATA_PATH = "/entry/data/data"
19
+
20
+ # pixel sum path
21
+ SUM_PATH = "/entry/sum"
22
+
23
+ MAX_UINT8_VALUE = np.iinfo(np.uint8).max
24
+
25
+
26
+ def generate_gaussian_blob(height: int, width: int) -> np.ndarray:
27
+ """Make a Gaussian Blob with float values in range 0..1"""
28
+ x, y = np.meshgrid(np.linspace(-1, 1, width), np.linspace(-1, 1, height))
29
+ d = np.sqrt(x * x + y * y)
30
+ blob = np.exp(-(d**2))
31
+ return blob
32
+
33
+
34
+ def generate_interesting_pattern(x: float, y: float) -> float:
35
+ """This function is interesting in x and y in range -10..10, returning
36
+ a float value in range 0..1
37
+ """
38
+ z = 0.5 + (np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)) / 2
39
+ return z
40
+
41
+
42
+ class PatternGenerator:
43
+ def __init__(
44
+ self,
45
+ saturation_exposure_time: float = 0.1,
46
+ detector_width: int = 320,
47
+ detector_height: int = 240,
48
+ ) -> None:
49
+ self.saturation_exposure_time = saturation_exposure_time
50
+ self.exposure = saturation_exposure_time
51
+ self.x = 0.0
52
+ self.y = 0.0
53
+ self.height = detector_height
54
+ self.width = detector_width
55
+ self.image_counter: int = 0
56
+
57
+ # it automatically initializes to 0
58
+ self.counter_signal, self._set_counter_signal = soft_signal_r_and_setter(int)
59
+ self._full_intensity_blob = (
60
+ generate_gaussian_blob(width=detector_width, height=detector_height)
61
+ * MAX_UINT8_VALUE
62
+ )
63
+ self._hdf_stream_provider: Optional[HDFFile] = None
64
+ self._handle_for_h5_file: Optional[h5py.File] = None
65
+ self.target_path: Optional[Path] = None
66
+
67
+ async def write_image_to_file(self) -> None:
68
+ assert self._handle_for_h5_file, "no file has been opened!"
69
+ # prepare - resize the fixed hdf5 data structure
70
+ # so that the new image can be written
71
+ self._handle_for_h5_file[DATA_PATH].resize(
72
+ (self.image_counter + 1, self.height, self.width)
73
+ )
74
+ self._handle_for_h5_file[SUM_PATH].resize((self.image_counter + 1,))
75
+
76
+ # generate the simulated data
77
+ intensity: float = generate_interesting_pattern(self.x, self.y)
78
+ detector_data = (
79
+ self._full_intensity_blob
80
+ * intensity
81
+ * self.exposure
82
+ / self.saturation_exposure_time
83
+ ).astype(np.uint8)
84
+
85
+ # write data to disc (intermediate step)
86
+ self._handle_for_h5_file[DATA_PATH][self.image_counter] = detector_data
87
+ sum = np.sum(detector_data)
88
+ self._handle_for_h5_file[SUM_PATH][self.image_counter] = sum
89
+
90
+ # save metadata - so that it's discoverable
91
+ self._handle_for_h5_file[DATA_PATH].flush()
92
+ self._handle_for_h5_file[SUM_PATH].flush()
93
+
94
+ # counter increment is last
95
+ # as only at this point the new data is visible from the outside
96
+ self.image_counter += 1
97
+ self._set_counter_signal(self.image_counter)
98
+
99
+ def set_exposure(self, value: float) -> None:
100
+ self.exposure = value
101
+
102
+ def set_x(self, value: float) -> None:
103
+ self.x = value
104
+
105
+ def set_y(self, value: float) -> None:
106
+ self.y = value
107
+
108
+ async def open_file(
109
+ self, path_provider: PathProvider, name: str, multiplier: int = 1
110
+ ) -> Dict[str, DataKey]:
111
+ await self.counter_signal.connect()
112
+
113
+ self.target_path = self._get_new_path(path_provider)
114
+ self._path_provider = path_provider
115
+
116
+ self._handle_for_h5_file = h5py.File(self.target_path, "w", libver="latest")
117
+
118
+ assert self._handle_for_h5_file, "not loaded the file right"
119
+
120
+ self._handle_for_h5_file.create_dataset(
121
+ name=DATA_PATH,
122
+ shape=(0, self.height, self.width),
123
+ dtype=np.uint8,
124
+ maxshape=(None, self.height, self.width),
125
+ )
126
+ self._handle_for_h5_file.create_dataset(
127
+ name=SUM_PATH,
128
+ shape=(0,),
129
+ dtype=np.float64,
130
+ maxshape=(None,),
131
+ )
132
+
133
+ # once datasets written, can switch the model to single writer multiple reader
134
+ self._handle_for_h5_file.swmr_mode = True
135
+ self.multiplier = multiplier
136
+
137
+ outer_shape = (multiplier,) if multiplier > 1 else ()
138
+
139
+ # cache state to self
140
+ # Add the main data
141
+ self._datasets = [
142
+ HDFDataset(
143
+ data_key=name,
144
+ dataset=DATA_PATH,
145
+ shape=(self.height, self.width),
146
+ multiplier=multiplier,
147
+ ),
148
+ HDFDataset(
149
+ f"{name}-sum",
150
+ dataset=SUM_PATH,
151
+ shape=(),
152
+ multiplier=multiplier,
153
+ ),
154
+ ]
155
+
156
+ describe = {
157
+ ds.data_key: DataKey(
158
+ source="sim://pattern-generator-hdf-file",
159
+ shape=outer_shape + tuple(ds.shape),
160
+ dtype="array" if ds.shape else "number",
161
+ external="STREAM:",
162
+ )
163
+ for ds in self._datasets
164
+ }
165
+ return describe
166
+
167
+ def _get_new_path(self, path_provider: PathProvider) -> Path:
168
+ info = path_provider(device_name="pattern")
169
+ filename = info.filename
170
+ new_path: Path = info.root / info.resource_dir / filename
171
+ return new_path
172
+
173
+ async def collect_stream_docs(
174
+ self, indices_written: int
175
+ ) -> AsyncIterator[StreamAsset]:
176
+ """
177
+ stream resource says "here is a dataset",
178
+ stream datum says "here are N frames in that stream resource",
179
+ you get one stream resource and many stream datums per scan
180
+ """
181
+ if self._handle_for_h5_file:
182
+ self._handle_for_h5_file.flush()
183
+ # when already something was written to the file
184
+ if indices_written:
185
+ # if no frames arrived yet, there's no file to speak of
186
+ # cannot get the full filename the HDF writer will write
187
+ # until the first frame comes in
188
+ if not self._hdf_stream_provider:
189
+ assert self.target_path, "open file has not been called"
190
+ self._hdf_stream_provider = HDFFile(
191
+ self._path_provider(),
192
+ self.target_path,
193
+ self._datasets,
194
+ )
195
+ for doc in self._hdf_stream_provider.stream_resources():
196
+ yield "stream_resource", doc
197
+ if self._hdf_stream_provider:
198
+ for doc in self._hdf_stream_provider.stream_data(indices_written):
199
+ yield "stream_datum", doc
200
+
201
+ def close(self) -> None:
202
+ if self._handle_for_h5_file:
203
+ self._handle_for_h5_file.close()
204
+ print("file closed")
205
+ self._handle_for_h5_file = None
206
+
207
+ async def observe_indices_written(
208
+ self, timeout=DEFAULT_TIMEOUT
209
+ ) -> AsyncGenerator[int, None]:
210
+ async for num_captured in observe_value(self.counter_signal, timeout=timeout):
211
+ yield num_captured // self.multiplier
@@ -4,15 +4,17 @@ import time
4
4
 
5
5
  from bluesky.protocols import Movable, Stoppable
6
6
 
7
- from ophyd_async.core import StandardReadable
8
- from ophyd_async.core.async_status import AsyncStatus, WatchableAsyncStatus
9
- from ophyd_async.core.signal import (
7
+ from ophyd_async.core import (
8
+ AsyncStatus,
9
+ ConfigSignal,
10
+ HintedSignal,
11
+ StandardReadable,
12
+ WatchableAsyncStatus,
13
+ WatcherUpdate,
10
14
  observe_value,
11
15
  soft_signal_r_and_setter,
12
16
  soft_signal_rw,
13
17
  )
14
- from ophyd_async.core.standard_readable import ConfigSignal, HintedSignal
15
- from ophyd_async.core.utils import WatcherUpdate
16
18
 
17
19
 
18
20
  class SimMotor(StandardReadable, Movable, Stoppable):
File without changes
File without changes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ophyd-async
3
- Version: 0.3.4a1
3
+ Version: 0.5.0
4
4
  Summary: Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango
5
5
  Author-email: Tom Cobb <tom.cobb@diamond.ac.uk>
6
6
  License: BSD 3-Clause License
@@ -45,10 +45,12 @@ Requires-Dist: numpy <2.0.0
45
45
  Requires-Dist: packaging
46
46
  Requires-Dist: pint
47
47
  Requires-Dist: bluesky >=1.13.0a3
48
- Requires-Dist: event-model <1.21.0
48
+ Requires-Dist: event-model
49
49
  Requires-Dist: p4p
50
50
  Requires-Dist: pyyaml
51
51
  Requires-Dist: colorlog
52
+ Requires-Dist: pydantic >=2.0
53
+ Requires-Dist: pydantic-numpy
52
54
  Provides-Extra: ca
53
55
  Requires-Dist: aioca >=1.6 ; extra == 'ca'
54
56
  Provides-Extra: dev
@@ -79,10 +81,13 @@ Requires-Dist: pytest-faulthandler ; extra == 'dev'
79
81
  Requires-Dist: pytest-rerunfailures ; extra == 'dev'
80
82
  Requires-Dist: pytest-timeout ; extra == 'dev'
81
83
  Requires-Dist: ruff ; extra == 'dev'
84
+ Requires-Dist: sphinx <7.4.0 ; extra == 'dev'
82
85
  Requires-Dist: sphinx-autobuild ; extra == 'dev'
86
+ Requires-Dist: autodoc-pydantic ; extra == 'dev'
83
87
  Requires-Dist: sphinxcontrib-mermaid ; extra == 'dev'
84
88
  Requires-Dist: sphinx-copybutton ; extra == 'dev'
85
89
  Requires-Dist: sphinx-design ; extra == 'dev'
90
+ Requires-Dist: super-state-machine ; extra == 'dev'
86
91
  Requires-Dist: tox-direct ; extra == 'dev'
87
92
  Requires-Dist: types-mock ; extra == 'dev'
88
93
  Requires-Dist: types-pyyaml ; extra == 'dev'
@@ -0,0 +1,89 @@
1
+ ophyd_async/__init__.py,sha256=v-rRiDOgZ3sQSMQKq0vgUQZvpeOkoHFXissAx6Ktg84,61
2
+ ophyd_async/__main__.py,sha256=G-Zcv_G9zK7Nhx6o5L5w-wyhMxdl_WgyMELu8IMFqAE,328
3
+ ophyd_async/_version.py,sha256=aeBju2l8GTMwAhIRG_c2Q_oVPFacRkZZwGtxmvFCGPQ,411
4
+ ophyd_async/core/__init__.py,sha256=5TjvjpdZEAjCHsf3G5A_yrgdh0vK0KwCx-qg31f2fLs,3675
5
+ ophyd_async/core/_detector.py,sha256=Rk7HR_QpQskhqWDwjENQL5HSj49PJWtLbWTxoQeTZKw,11228
6
+ ophyd_async/core/_device.py,sha256=DDdRujYLCDSuGDB0gqElkzI0qEGb3sMlFP6FgmH2u3A,7554
7
+ ophyd_async/core/_device_save_loader.py,sha256=pTom5EOFa9_5Z3bV37zOnbGx2ujWIOl_D9PVYhpY1FY,8232
8
+ ophyd_async/core/_flyer.py,sha256=8_N9u6s2P9qPZmNtHFfdmFv8FD7sKrKb9-IuvNUVHPw,2267
9
+ ophyd_async/core/_hdf_dataset.py,sha256=ZFfG6hmWRcExFhTxbnWB5NwuaOI_cwE4z_fjXV2Vg8s,2600
10
+ ophyd_async/core/_log.py,sha256=Hsk2Iwx81n3HpxNR30xGTnLJh_lPGd_CGy2MI3OGpWs,3588
11
+ ophyd_async/core/_mock_signal_backend.py,sha256=M_I2LxxJrJmBAbmILjVoAR6E2U8K2UswvHGiHluMqHc,2799
12
+ ophyd_async/core/_mock_signal_utils.py,sha256=DSCJiwkSF1aVoUAtlsRm-3PY4Eiff4vYHjlD_QbbhdA,4696
13
+ ophyd_async/core/_protocol.py,sha256=aRoqet0ThyVK_wrULh4k_StnpeHnNhXc0YffWdRJNZw,3391
14
+ ophyd_async/core/_providers.py,sha256=-HlisysZZcqs6z1yQsWCpof7hQ9QTbg2IYpm4XaErGQ,7454
15
+ ophyd_async/core/_readable.py,sha256=WayM35JOJj732-YgvGsjUSlCZwZ_zq1zbAmk-1U0uwU,8998
16
+ ophyd_async/core/_signal.py,sha256=IE_7Enn_RU8IUg6L1bpchbMvwwA4YZdrA8S7bOKk_7o,18503
17
+ ophyd_async/core/_signal_backend.py,sha256=-Vze8-57W0jpcC4gq4P4rZpXXJvi2qrbu0A8AjqA594,2638
18
+ ophyd_async/core/_soft_signal_backend.py,sha256=Z4LiADd9xKrxhhPOx8q5xq4yrJRdJbfuKeB0o2wBjCk,6653
19
+ ophyd_async/core/_status.py,sha256=mjzoGyaMFCfQLIWNKv_VcuCz9unZ9Gs3nCkaa1dTne8,4334
20
+ ophyd_async/core/_utils.py,sha256=3oZcXNqAUHX4ZWMBH5gSuK6cFWEhSkZ9GSDYv0pf8jc,5783
21
+ ophyd_async/epics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ ophyd_async/epics/motor.py,sha256=z1a61P1-tA3RxeD36uhhE6WJ0AfLU6xodtdk2avV_Ss,8495
23
+ ophyd_async/epics/adaravis/__init__.py,sha256=u979_9nQTYB0TvDOTXFN4qMrbDP8-xQFfXYMGzLVBo4,207
24
+ ophyd_async/epics/adaravis/_aravis.py,sha256=f2xiKQr1AcX6R-NjaMMgfXBfbHIsYfDGp4-CyHKIT6I,1949
25
+ ophyd_async/epics/adaravis/_aravis_controller.py,sha256=SzyajBNoqvBOUVtNE0t8ghffY2pYP8U99XgQ-4u2pVI,2635
26
+ ophyd_async/epics/adaravis/_aravis_io.py,sha256=GY2thPUJ-6821GvfZTBLoX8g9d-U1YgyoXe3wYRVw-g,1554
27
+ ophyd_async/epics/adcore/__init__.py,sha256=6L2xRXI6AvrOYGqPg0oIzYF7N9lxF9mxIVFDYELjw7I,923
28
+ ophyd_async/epics/adcore/_core_io.py,sha256=aLl8sSYJZqPjHEVBiwWcLDsWtjCFYL-t_02KTqDiwUA,4547
29
+ ophyd_async/epics/adcore/_core_logic.py,sha256=XpM1t2kqof9q_7fkKlFPKP2vT0DoLgc0drj7cTUHsbU,3421
30
+ ophyd_async/epics/adcore/_hdf_writer.py,sha256=rnNNwFAr3KtNJCIk0jRGA0Fz5MPhUV3bvShG00OpG7A,5882
31
+ ophyd_async/epics/adcore/_single_trigger.py,sha256=LGhAZV0GoRwRTNFQmgLpkfq73HsiMCu20JKYGOzxt0I,1159
32
+ ophyd_async/epics/adcore/_utils.py,sha256=EgpofUaLV9AofcMmwLYmRybDGWRonRZNYUzWrMxoQL4,3587
33
+ ophyd_async/epics/adkinetix/__init__.py,sha256=QEft12PURied6LRzjw-NhUmngjAm1XNA3k-5o5aMXDQ,216
34
+ ophyd_async/epics/adkinetix/_kinetix.py,sha256=Xnt54pqxWArcBIZ8RdLMXfMX0kCDCInJQp48MMx6Gmw,1181
35
+ ophyd_async/epics/adkinetix/_kinetix_controller.py,sha256=jHe6MSfqCOdzw0jQ5L6cYq55I0TD5Bso2ZGOZmv1j3Q,1504
36
+ ophyd_async/epics/adkinetix/_kinetix_io.py,sha256=zm3MnJkOVCAIyHi3x3t0trAv4GlEFZMJPd8VGsn50Lc,838
37
+ ophyd_async/epics/adpilatus/__init__.py,sha256=daimScOCCMHR2eb8VbezHOcGOkd6uIRZQiyeTQsaAx4,308
38
+ ophyd_async/epics/adpilatus/_pilatus.py,sha256=NEim_ZROa-B0uYXYgLiiAIDzqzl-IjSCqpOrosOvcHk,1748
39
+ ophyd_async/epics/adpilatus/_pilatus_controller.py,sha256=1dB27dZyNdcGLDDs8Lw8C0wVc_Yok0tXjGyBocI4BiE,2463
40
+ ophyd_async/epics/adpilatus/_pilatus_io.py,sha256=jhD8RswxN0eTqPR-lMw7L9yGoT4H1ZIphguZk2GZOJM,735
41
+ ophyd_async/epics/adsimdetector/__init__.py,sha256=t3crUgTEvVJGI8o6FsfN42k0A-l4v9ZBwXIYtixoE-M,128
42
+ ophyd_async/epics/adsimdetector/_sim.py,sha256=nk4Xj_j_WeKk1FJov-Zo2W7NHnHcBUDbIzranHUpngI,863
43
+ ophyd_async/epics/adsimdetector/_sim_controller.py,sha256=v0GrMXg7U1PUvLKW8zmx8zrunk_MfFt7GbckbVlnUys,1494
44
+ ophyd_async/epics/advimba/__init__.py,sha256=GSnFWGPNJsCJZ-Tgyv-L38Smwzp2bWC64U_4uD2TLvs,198
45
+ ophyd_async/epics/advimba/_vimba.py,sha256=qDLP5KcI0PZGgpMVmzkfxfgIt3hoiqpvNlRGrtEZxl4,1122
46
+ ophyd_async/epics/advimba/_vimba_controller.py,sha256=R7OUQGule1HdEl4Eo7MTthU0TpLFYSAZ8l_G8G3LNxU,1995
47
+ ophyd_async/epics/advimba/_vimba_io.py,sha256=4tYfcPgt0uD2pf3eAV7OHMCXlecG3vfvoll_EI6_neM,1802
48
+ ophyd_async/epics/demo/__init__.py,sha256=wCrgemEo-zR4TTvaqCKnQ-AIUHorotV5jhftbq1tXz0,1368
49
+ ophyd_async/epics/demo/_mover.py,sha256=7GEmF-mgN0qxiHUE3Tgboh0p9S5AuPBYR-pFeg5QFTk,3520
50
+ ophyd_async/epics/demo/_sensor.py,sha256=8OyFAsB3EXMzrQreOIg_TGHrseUtI5rxXpfwwUaC76I,1165
51
+ ophyd_async/epics/demo/mover.db,sha256=RFz0rxZue689Wh1sWTZwWeFMUrH04ttPq2u5xJH_Fp4,998
52
+ ophyd_async/epics/demo/sensor.db,sha256=AVtiydrdtwAz2EFurO2Ult9SSRtre3r0akOBbL98LT0,554
53
+ ophyd_async/epics/pvi/__init__.py,sha256=ZvJO69ApL7N9rWT9-hD-JZMC_KsHxgeEqxe-01jNUVw,137
54
+ ophyd_async/epics/pvi/_pvi.py,sha256=PUst4KhX8emkbRunLrJeqTruaOMF3mm1s7YJsBB7HpQ,12099
55
+ ophyd_async/epics/signal/__init__.py,sha256=cJGvTnJxHNzpWyWIYXU4UGMoz3uqZ88UVXNvG-TGngo,441
56
+ ophyd_async/epics/signal/_aioca.py,sha256=qvaEmGllNplWgzwjlAPsHhF8IgPkgYYKqn-_YV9t1pU,11408
57
+ ophyd_async/epics/signal/_common.py,sha256=MYf34SAKUPqvMv9YKJ5-3G6zVrjhRYbpQvGXGiONSws,1848
58
+ ophyd_async/epics/signal/_epics_transport.py,sha256=MnkhnbpYSxrS7Wo8jDJ1YGnkrvjfYEt1oOe-uxjGCPU,839
59
+ ophyd_async/epics/signal/_p4p.py,sha256=jozZoyCC6bOtpJMWCcPLWA3sxQTf9YLo_Koq9hOVrLA,15752
60
+ ophyd_async/epics/signal/_signal.py,sha256=i5q7zTv5y3HFQRI1JrwWT-gN6bViPWNuks14le2pTFI,3252
61
+ ophyd_async/fastcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
+ ophyd_async/fastcs/odin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
+ ophyd_async/fastcs/panda/__init__.py,sha256=REtsRQCLGi9uhjYIwLL7C6n_pbJMvG_MfWY_M5wxGIQ,1187
64
+ ophyd_async/fastcs/panda/_common_blocks.py,sha256=4wyc4iTpOuDnzFXk98l287E5Ygl9ZO9tN7s1Lp9t6CM,1542
65
+ ophyd_async/fastcs/panda/_hdf_panda.py,sha256=KXahiaMvMm2Ox9G31QBWunYTWedXnKAKS8c63FL0AgM,1321
66
+ ophyd_async/fastcs/panda/_hdf_writer.py,sha256=6I89I4XVUOWYA7IqmbOcL8hp9x5vFA_vJOSxAIqqRRw,5042
67
+ ophyd_async/fastcs/panda/_panda_controller.py,sha256=ltetcf_OSQMtLVSh1uKW7Nyu5XDbb-W9iuw767cP66E,1237
68
+ ophyd_async/fastcs/panda/_table.py,sha256=atd9wiam0XQH89doqzn0U6J42CFQBKDs9K1_q5GcJR8,6093
69
+ ophyd_async/fastcs/panda/_trigger.py,sha256=iqmLN1Dh8n_p4amhTKSP5ifSaLhYwqqHhva0G-oVSvM,3062
70
+ ophyd_async/fastcs/panda/_utils.py,sha256=VHW5kPVISyEkmse_qQcyisBkkEwMO6GG2Ago-CH1AFA,487
71
+ ophyd_async/plan_stubs/__init__.py,sha256=Qn0VDrlT2CmzP32qzAeP3YFvLWdLfpveq3qGQM_4TsE,407
72
+ ophyd_async/plan_stubs/_ensure_connected.py,sha256=6Q7_UWQ-UQ0awe6mnN4PdNCAOGRm4GZR9X2M-ghQCeI,711
73
+ ophyd_async/plan_stubs/_fly.py,sha256=PWT7cbnVUDBFtjKkMQ7Lr960M9d0JcUBseXFYhzBc8I,6299
74
+ ophyd_async/sim/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
+ ophyd_async/sim/demo/__init__.py,sha256=JKWFnHqmFuRRMvvU0aBuclke3OdF0iq89yvHEd4J7Bg,371
76
+ ophyd_async/sim/demo/_sim_motor.py,sha256=Dfc-1faeqbVLsCLuM2FFJ2F20Ib0UsS2vsHdqgVt2Zk,3601
77
+ ophyd_async/sim/demo/_pattern_detector/__init__.py,sha256=o_dSZDIl_CyS3YPSNKpGiQiR9UaC4cNzZ8_ByEN9dIk,402
78
+ ophyd_async/sim/demo/_pattern_detector/_pattern_detector.py,sha256=5PH9vZ0vLhhvzN1H-7HUcaNUOQ---9i0GEBKY_luRTI,1278
79
+ ophyd_async/sim/demo/_pattern_detector/_pattern_detector_controller.py,sha256=JJ6iQexK--ODJ8am9hIu4LARzuYvdNhqHjPE6KcCdJI,1717
80
+ ophyd_async/sim/demo/_pattern_detector/_pattern_detector_writer.py,sha256=ayJJ2Y0rqM7gIEtxhH4-iRnYi0RQTaEWFIHUJd2W27Y,1280
81
+ ophyd_async/sim/demo/_pattern_detector/_pattern_generator.py,sha256=ksgXyyErAdvFKac4vuJLB_9aXBqLzbCEZ4_ag7hFpE4,7257
82
+ ophyd_async/sim/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
+ ophyd_async/tango/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
+ ophyd_async-0.5.0.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
85
+ ophyd_async-0.5.0.dist-info/METADATA,sha256=uExqBPoTfChURS_0SJ0AZ0ktukzZYMOZ1AcXKMOJj80,6491
86
+ ophyd_async-0.5.0.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
87
+ ophyd_async-0.5.0.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
88
+ ophyd_async-0.5.0.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
89
+ ophyd_async-0.5.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.1.1)
2
+ Generator: setuptools (71.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,23 +0,0 @@
1
- from .aravis import AravisDetector
2
- from .kinetix import KinetixDetector
3
- from .pilatus import PilatusDetector
4
- from .single_trigger_det import SingleTriggerDet
5
- from .utils import (
6
- FileWriteMode,
7
- ImageMode,
8
- NDAttributeDataType,
9
- NDAttributesXML,
10
- )
11
- from .vimba import VimbaDetector
12
-
13
- __all__ = [
14
- "AravisDetector",
15
- "KinetixDetector",
16
- "VimbaDetector",
17
- "SingleTriggerDet",
18
- "FileWriteMode",
19
- "ImageMode",
20
- "NDAttributeDataType",
21
- "NDAttributesXML",
22
- "PilatusDetector",
23
- ]
@@ -1,5 +0,0 @@
1
- from .ad_sim_controller import ADSimController
2
- from .aravis_controller import AravisController
3
- from .pilatus_controller import PilatusController
4
-
5
- __all__ = ["PilatusController", "ADSimController", "AravisController"]
@@ -1,23 +0,0 @@
1
- from .ad_base import (
2
- ADBase,
3
- ADBaseShapeProvider,
4
- DetectorState,
5
- set_exposure_time_and_acquire_period_if_supplied,
6
- start_acquiring_driver_and_ensure_status,
7
- )
8
- from .aravis_driver import AravisDriver
9
- from .kinetix_driver import KinetixDriver
10
- from .pilatus_driver import PilatusDriver
11
- from .vimba_driver import VimbaDriver
12
-
13
- __all__ = [
14
- "ADBase",
15
- "ADBaseShapeProvider",
16
- "PilatusDriver",
17
- "AravisDriver",
18
- "KinetixDriver",
19
- "VimbaDriver",
20
- "start_acquiring_driver_and_ensure_status",
21
- "set_exposure_time_and_acquire_period_if_supplied",
22
- "DetectorState",
23
- ]
@@ -1,43 +0,0 @@
1
- from bluesky.protocols import HasHints, Hints
2
-
3
- from ophyd_async.core import DirectoryProvider, StandardDetector
4
- from ophyd_async.epics.areadetector.controllers.vimba_controller import VimbaController
5
- from ophyd_async.epics.areadetector.drivers import ADBaseShapeProvider
6
- from ophyd_async.epics.areadetector.drivers.vimba_driver import VimbaDriver
7
- from ophyd_async.epics.areadetector.writers import HDFWriter, NDFileHDF
8
-
9
-
10
- class VimbaDetector(StandardDetector, HasHints):
11
- """
12
- Ophyd-async implementation of an ADVimba Detector.
13
- """
14
-
15
- _controller: VimbaController
16
- _writer: HDFWriter
17
-
18
- def __init__(
19
- self,
20
- prefix: str,
21
- directory_provider: DirectoryProvider,
22
- drv_suffix="cam1:",
23
- hdf_suffix="HDF1:",
24
- name="",
25
- ):
26
- self.drv = VimbaDriver(prefix + drv_suffix)
27
- self.hdf = NDFileHDF(prefix + hdf_suffix)
28
-
29
- super().__init__(
30
- VimbaController(self.drv),
31
- HDFWriter(
32
- self.hdf,
33
- directory_provider,
34
- lambda: self.name,
35
- ADBaseShapeProvider(self.drv),
36
- ),
37
- config_sigs=(self.drv.acquire_time,),
38
- name=name,
39
- )
40
-
41
- @property
42
- def hints(self) -> Hints:
43
- return self._writer.hints
@@ -1,5 +0,0 @@
1
- from .hdf_writer import HDFWriter
2
- from .nd_file_hdf import NDFileHDF
3
- from .nd_plugin import NDPluginBase, NDPluginStats
4
-
5
- __all__ = ["HDFWriter", "NDFileHDF", "NDPluginBase", "NDPluginStats"]
@@ -1,10 +0,0 @@
1
- from dataclasses import dataclass
2
- from typing import Sequence
3
-
4
-
5
- @dataclass
6
- class _HDFDataset:
7
- name: str
8
- path: str
9
- shape: Sequence[int]
10
- multiplier: int
@@ -1,54 +0,0 @@
1
- from pathlib import Path
2
- from typing import Iterator, List
3
-
4
- from event_model import StreamDatum, StreamResource, compose_stream_resource
5
-
6
- from ophyd_async.core import DirectoryInfo
7
-
8
- from ._hdfdataset import _HDFDataset
9
-
10
-
11
- class _HDFFile:
12
- """
13
- :param directory_info: Contains information about how to construct a StreamResource
14
- :param full_file_name: Absolute path to the file to be written
15
- :param datasets: Datasets to write into the file
16
- """
17
-
18
- def __init__(
19
- self,
20
- directory_info: DirectoryInfo,
21
- full_file_name: Path,
22
- datasets: List[_HDFDataset],
23
- ) -> None:
24
- self._last_emitted = 0
25
- self._bundles = [
26
- compose_stream_resource(
27
- spec="AD_HDF5_SWMR_SLICE",
28
- root=str(directory_info.root),
29
- data_key=ds.name,
30
- resource_path=str(full_file_name.relative_to(directory_info.root)),
31
- resource_kwargs={
32
- "path": ds.path,
33
- "multiplier": ds.multiplier,
34
- "timestamps": "/entry/instrument/NDAttributes/NDArrayTimeStamp",
35
- },
36
- )
37
- for ds in datasets
38
- ]
39
-
40
- def stream_resources(self) -> Iterator[StreamResource]:
41
- for bundle in self._bundles:
42
- yield bundle.stream_resource_doc
43
-
44
- def stream_data(self, indices_written: int) -> Iterator[StreamDatum]:
45
- # Indices are relative to resource
46
- if indices_written > self._last_emitted:
47
- indices = {
48
- "start": self._last_emitted,
49
- "stop": indices_written,
50
- }
51
- self._last_emitted = indices_written
52
- for bundle in self._bundles:
53
- yield bundle.compose_stream_datum(indices)
54
- return None
@@ -1,40 +0,0 @@
1
- from enum import Enum
2
-
3
- from ...signal.signal import epics_signal_r, epics_signal_rw, epics_signal_rw_rbv
4
- from ..utils import FileWriteMode
5
- from .nd_plugin import NDPluginBase
6
-
7
-
8
- class Compression(str, Enum):
9
- none = "None"
10
- nbit = "N-bit"
11
- szip = "szip"
12
- zlib = "zlib"
13
- blosc = "Blosc"
14
- bslz4 = "BSLZ4"
15
- lz4 = "LZ4"
16
- jpeg = "JPEG"
17
-
18
-
19
- class NDFileHDF(NDPluginBase):
20
- def __init__(self, prefix: str, name="") -> None:
21
- # Define some signals
22
- self.position_mode = epics_signal_rw_rbv(bool, prefix + "PositionMode")
23
- self.compression = epics_signal_rw_rbv(Compression, prefix + "Compression")
24
- self.num_extra_dims = epics_signal_rw_rbv(int, prefix + "NumExtraDims")
25
- self.file_path = epics_signal_rw_rbv(str, prefix + "FilePath")
26
- self.file_name = epics_signal_rw_rbv(str, prefix + "FileName")
27
- self.file_path_exists = epics_signal_r(bool, prefix + "FilePathExists_RBV")
28
- self.file_template = epics_signal_rw_rbv(str, prefix + "FileTemplate")
29
- self.full_file_name = epics_signal_r(str, prefix + "FullFileName_RBV")
30
- self.file_write_mode = epics_signal_rw_rbv(
31
- FileWriteMode, prefix + "FileWriteMode"
32
- )
33
- self.num_capture = epics_signal_rw_rbv(int, prefix + "NumCapture")
34
- self.num_captured = epics_signal_r(int, prefix + "NumCaptured_RBV")
35
- self.swmr_mode = epics_signal_rw_rbv(bool, prefix + "SWMRMode")
36
- self.lazy_open = epics_signal_rw_rbv(bool, prefix + "LazyOpen")
37
- self.capture = epics_signal_rw_rbv(bool, prefix + "Capture")
38
- self.flush_now = epics_signal_rw(bool, prefix + "FlushNow")
39
- self.xml_file_name = epics_signal_rw_rbv(str, prefix + "XMLFileName")
40
- super().__init__(prefix, name)
@@ -1,38 +0,0 @@
1
- from enum import Enum
2
-
3
- from ophyd_async.core import Device
4
- from ophyd_async.epics.signal import epics_signal_rw
5
- from ophyd_async.epics.signal.signal import epics_signal_r, epics_signal_rw_rbv
6
-
7
-
8
- class Callback(str, Enum):
9
- Enable = "Enable"
10
- Disable = "Disable"
11
-
12
-
13
- class NDArrayBase(Device):
14
- def __init__(self, prefix: str, name: str = "") -> None:
15
- self.unique_id = epics_signal_r(int, prefix + "UniqueId_RBV")
16
- self.nd_attributes_file = epics_signal_rw(str, prefix + "NDAttributesFile")
17
- self.acquire = epics_signal_rw_rbv(bool, prefix + "Acquire")
18
- self.array_size_x = epics_signal_r(int, prefix + "ArraySizeX_RBV")
19
- self.array_size_y = epics_signal_r(int, prefix + "ArraySizeY_RBV")
20
- self.array_counter = epics_signal_rw_rbv(int, prefix + "ArrayCounter")
21
- # There is no _RBV for this one
22
- self.wait_for_plugins = epics_signal_rw(bool, prefix + "WaitForPlugins")
23
-
24
- super().__init__(name=name)
25
-
26
-
27
- class NDPluginBase(NDArrayBase):
28
- def __init__(self, prefix: str, name: str = "") -> None:
29
- self.nd_array_port = epics_signal_rw_rbv(str, prefix + "NDArrayPort")
30
- self.enable_callback = epics_signal_rw_rbv(Callback, prefix + "EnableCallbacks")
31
- self.nd_array_address = epics_signal_rw_rbv(int, prefix + "NDArrayAddress")
32
- self.array_size0 = epics_signal_r(int, prefix + "ArraySize0_RBV")
33
- self.array_size1 = epics_signal_r(int, prefix + "ArraySize1_RBV")
34
- super().__init__(prefix, name)
35
-
36
-
37
- class NDPluginStats(NDPluginBase):
38
- pass
@@ -1,35 +0,0 @@
1
- from typing import Sequence
2
-
3
- from ophyd_async.core import DirectoryProvider, SignalR, StandardDetector
4
-
5
- from ..areadetector.controllers import ADSimController
6
- from ..areadetector.drivers import ADBase, ADBaseShapeProvider
7
- from ..areadetector.writers import HDFWriter, NDFileHDF
8
-
9
-
10
- class DemoADSimDetector(StandardDetector):
11
- _controller: ADSimController
12
- _writer: HDFWriter
13
-
14
- def __init__(
15
- self,
16
- drv: ADBase,
17
- hdf: NDFileHDF,
18
- directory_provider: DirectoryProvider,
19
- name: str = "",
20
- config_sigs: Sequence[SignalR] = (),
21
- ):
22
- self.drv = drv
23
- self.hdf = hdf
24
-
25
- super().__init__(
26
- ADSimController(self.drv),
27
- HDFWriter(
28
- self.hdf,
29
- directory_provider,
30
- lambda: self.name,
31
- ADBaseShapeProvider(self.drv),
32
- ),
33
- config_sigs=config_sigs,
34
- name=name,
35
- )
@@ -1,3 +0,0 @@
1
- from .motor import Motor
2
-
3
- __all__ = ["Motor"]