bec-widgets 0.47.0__py3-none-any.whl → 0.48.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.
- bec_widgets/cli/__init__.py +1 -0
- bec_widgets/cli/auto_updates.py +118 -0
- bec_widgets/cli/client_utils.py +11 -56
- {bec_widgets-0.47.0.dist-info → bec_widgets-0.48.0.dist-info}/METADATA +1 -1
- {bec_widgets-0.47.0.dist-info → bec_widgets-0.48.0.dist-info}/RECORD +8 -7
- {bec_widgets-0.47.0.dist-info → bec_widgets-0.48.0.dist-info}/LICENSE +0 -0
- {bec_widgets-0.47.0.dist-info → bec_widgets-0.48.0.dist-info}/WHEEL +0 -0
- {bec_widgets-0.47.0.dist-info → bec_widgets-0.48.0.dist-info}/top_level.txt +0 -0
bec_widgets/cli/__init__.py
CHANGED
@@ -0,0 +1,118 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING
|
4
|
+
|
5
|
+
from pydantic import BaseModel
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from .client import BECFigure
|
9
|
+
|
10
|
+
|
11
|
+
class ScanInfo(BaseModel):
|
12
|
+
scan_id: str
|
13
|
+
scan_number: int
|
14
|
+
scan_name: str
|
15
|
+
scan_report_devices: list
|
16
|
+
monitored_devices: list
|
17
|
+
status: str
|
18
|
+
|
19
|
+
|
20
|
+
class AutoUpdates:
|
21
|
+
def __init__(self, figure: BECFigure, enabled: bool = True):
|
22
|
+
self.enabled = enabled
|
23
|
+
self.figure = figure
|
24
|
+
|
25
|
+
@staticmethod
|
26
|
+
def get_scan_info(msg) -> ScanInfo:
|
27
|
+
"""
|
28
|
+
Update the script with the given data.
|
29
|
+
"""
|
30
|
+
info = msg.info
|
31
|
+
status = msg.status
|
32
|
+
scan_id = msg.scan_id
|
33
|
+
scan_number = info.get("scan_number", 0)
|
34
|
+
scan_name = info.get("scan_name", "Unknown")
|
35
|
+
scan_report_devices = info.get("scan_report_devices", [])
|
36
|
+
monitored_devices = info.get("readout_priority", {}).get("monitored", [])
|
37
|
+
monitored_devices = [dev for dev in monitored_devices if dev not in scan_report_devices]
|
38
|
+
return ScanInfo(
|
39
|
+
scan_id=scan_id,
|
40
|
+
scan_number=scan_number,
|
41
|
+
scan_name=scan_name,
|
42
|
+
scan_report_devices=scan_report_devices,
|
43
|
+
monitored_devices=monitored_devices,
|
44
|
+
status=status,
|
45
|
+
)
|
46
|
+
|
47
|
+
def run(self, msg):
|
48
|
+
"""
|
49
|
+
Run the update function if enabled.
|
50
|
+
"""
|
51
|
+
if not self.enabled:
|
52
|
+
return
|
53
|
+
if msg.status != "open":
|
54
|
+
return
|
55
|
+
info = self.get_scan_info(msg)
|
56
|
+
self.handler(info)
|
57
|
+
|
58
|
+
@staticmethod
|
59
|
+
def get_selected_device(monitored_devices, selected_device):
|
60
|
+
"""
|
61
|
+
Get the selected device for the plot. If no device is selected, the first
|
62
|
+
device in the monitored devices list is selected.
|
63
|
+
"""
|
64
|
+
if selected_device:
|
65
|
+
return selected_device
|
66
|
+
if len(monitored_devices) > 0:
|
67
|
+
sel_device = monitored_devices[0]
|
68
|
+
return sel_device
|
69
|
+
return None
|
70
|
+
|
71
|
+
def handler(self, info: ScanInfo) -> None:
|
72
|
+
"""
|
73
|
+
Default update function.
|
74
|
+
"""
|
75
|
+
if info.scan_name == "line_scan" and info.scan_report_devices:
|
76
|
+
self.simple_line_scan(info)
|
77
|
+
return
|
78
|
+
if info.scan_name == "grid_scan" and info.scan_report_devices:
|
79
|
+
self.simple_grid_scan(info)
|
80
|
+
return
|
81
|
+
if info.scan_report_devices:
|
82
|
+
self.best_effort(info)
|
83
|
+
return
|
84
|
+
|
85
|
+
def simple_line_scan(self, info: ScanInfo) -> None:
|
86
|
+
"""
|
87
|
+
Simple line scan.
|
88
|
+
"""
|
89
|
+
dev_x = info.scan_report_devices[0]
|
90
|
+
dev_y = self.get_selected_device(info.monitored_devices, self.figure.selected_device)
|
91
|
+
if not dev_y:
|
92
|
+
return
|
93
|
+
self.figure.clear_all()
|
94
|
+
plt = self.figure.plot(dev_x, dev_y)
|
95
|
+
plt.set(title=f"Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
|
96
|
+
|
97
|
+
def simple_grid_scan(self, info: ScanInfo) -> None:
|
98
|
+
"""
|
99
|
+
Simple grid scan.
|
100
|
+
"""
|
101
|
+
dev_x = info.scan_report_devices[0]
|
102
|
+
dev_y = info.scan_report_devices[1]
|
103
|
+
dev_z = self.get_selected_device(info.monitored_devices, self.figure.selected_device)
|
104
|
+
self.figure.clear_all()
|
105
|
+
plt = self.figure.plot(dev_x, dev_y, dev_z, label=f"Scan {info.scan_number}")
|
106
|
+
plt.set(title=f"Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
|
107
|
+
|
108
|
+
def best_effort(self, info: ScanInfo) -> None:
|
109
|
+
"""
|
110
|
+
Best effort scan.
|
111
|
+
"""
|
112
|
+
dev_x = info.scan_report_devices[0]
|
113
|
+
dev_y = self.get_selected_device(info.monitored_devices, self.figure.selected_device)
|
114
|
+
if not dev_y:
|
115
|
+
return
|
116
|
+
self.figure.clear_all()
|
117
|
+
plt = self.figure.plot(dev_x, dev_y, label=f"Scan {info.scan_number}")
|
118
|
+
plt.set(title=f"Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
|
bec_widgets/cli/client_utils.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
import importlib
|
4
|
+
import importlib.metadata as imd
|
4
5
|
import os
|
5
6
|
import select
|
6
7
|
import subprocess
|
@@ -17,6 +18,7 @@ from bec_lib.device import DeviceBase
|
|
17
18
|
from qtpy.QtCore import QCoreApplication
|
18
19
|
|
19
20
|
import bec_widgets.cli.client as client
|
21
|
+
from bec_widgets.cli.auto_updates import AutoUpdates
|
20
22
|
from bec_widgets.utils.bec_dispatcher import BECDispatcher
|
21
23
|
|
22
24
|
if TYPE_CHECKING:
|
@@ -54,68 +56,22 @@ def rpc_call(func):
|
|
54
56
|
return wrapper
|
55
57
|
|
56
58
|
|
57
|
-
def get_selected_device(monitored_devices, selected_device):
|
58
|
-
"""
|
59
|
-
Get the selected device for the plot. If no device is selected, the first
|
60
|
-
device in the monitored devices list is selected.
|
61
|
-
"""
|
62
|
-
if selected_device:
|
63
|
-
return selected_device
|
64
|
-
if len(monitored_devices) > 0:
|
65
|
-
sel_device = monitored_devices[0]
|
66
|
-
return sel_device
|
67
|
-
return None
|
68
|
-
|
69
|
-
|
70
|
-
def update_script(figure: BECFigure, msg):
|
71
|
-
"""
|
72
|
-
Update the script with the given data.
|
73
|
-
"""
|
74
|
-
info = msg.info
|
75
|
-
status = msg.status
|
76
|
-
scan_id = msg.scan_id
|
77
|
-
scan_number = info.get("scan_number", 0)
|
78
|
-
scan_name = info.get("scan_name", "Unknown")
|
79
|
-
scan_report_devices = info.get("scan_report_devices", [])
|
80
|
-
monitored_devices = info.get("readout_priority", {}).get("monitored", [])
|
81
|
-
monitored_devices = [dev for dev in monitored_devices if dev not in scan_report_devices]
|
82
|
-
|
83
|
-
if scan_name == "line_scan" and scan_report_devices:
|
84
|
-
dev_x = scan_report_devices[0]
|
85
|
-
dev_y = get_selected_device(monitored_devices, figure.selected_device)
|
86
|
-
print(f"Selected device: {dev_y}")
|
87
|
-
if not dev_y:
|
88
|
-
return
|
89
|
-
figure.clear_all()
|
90
|
-
plt = figure.plot(dev_x, dev_y)
|
91
|
-
plt.set(title=f"Scan {scan_number}", x_label=dev_x, y_label=dev_y)
|
92
|
-
elif scan_name == "grid_scan" and scan_report_devices:
|
93
|
-
print(f"Scan {scan_number} is running")
|
94
|
-
dev_x = scan_report_devices[0]
|
95
|
-
dev_y = scan_report_devices[1]
|
96
|
-
dev_z = get_selected_device(monitored_devices, figure.selected_device)
|
97
|
-
figure.clear_all()
|
98
|
-
plt = figure.plot(dev_x, dev_y, dev_z, label=f"Scan {scan_number}")
|
99
|
-
plt.set(title=f"Scan {scan_number}", x_label=dev_x, y_label=dev_y)
|
100
|
-
elif scan_report_devices:
|
101
|
-
dev_x = scan_report_devices[0]
|
102
|
-
dev_y = get_selected_device(monitored_devices, figure.selected_device)
|
103
|
-
if not dev_y:
|
104
|
-
return
|
105
|
-
figure.clear_all()
|
106
|
-
plt = figure.plot(dev_x, dev_y, label=f"Scan {scan_number}")
|
107
|
-
plt.set(title=f"Scan {scan_number}", x_label=dev_x, y_label=dev_y)
|
108
|
-
|
109
|
-
|
110
59
|
class BECFigureClientMixin:
|
111
60
|
def __init__(self, **kwargs) -> None:
|
112
61
|
super().__init__(**kwargs)
|
113
62
|
self._process = None
|
114
|
-
self.update_script =
|
63
|
+
self.update_script = self._get_update_script()
|
115
64
|
self._target_endpoint = MessageEndpoints.scan_status()
|
116
65
|
self._selected_device = None
|
117
66
|
self.stderr_output = []
|
118
67
|
|
68
|
+
def _get_update_script(self) -> AutoUpdates:
|
69
|
+
eps = imd.entry_points(group="bec.widgets.auto_updates")
|
70
|
+
for ep in eps:
|
71
|
+
if ep.name == "plugin_widgets_update":
|
72
|
+
return ep.load()(figure=self)
|
73
|
+
return None
|
74
|
+
|
119
75
|
@property
|
120
76
|
def selected_device(self):
|
121
77
|
"""
|
@@ -147,8 +103,7 @@ class BECFigureClientMixin:
|
|
147
103
|
if isinstance(msg, messages.ScanStatusMessage):
|
148
104
|
if not self.gui_is_alive():
|
149
105
|
return
|
150
|
-
|
151
|
-
self.update_script(self, msg)
|
106
|
+
self.update_script.run(msg)
|
152
107
|
|
153
108
|
def show(self) -> None:
|
154
109
|
"""
|
@@ -1,7 +1,8 @@
|
|
1
1
|
bec_widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
bec_widgets/cli/__init__.py,sha256=
|
2
|
+
bec_widgets/cli/__init__.py,sha256=ULoNTVnv2UeSSjhFq3uCQJ-0JTJf9oU76l27aRiizL4,78
|
3
|
+
bec_widgets/cli/auto_updates.py,sha256=ptZeBKr13o9THc8oKLn93K_16i6G3pxzw8hZ4MUgjW4,3845
|
3
4
|
bec_widgets/cli/client.py,sha256=4QedDVBgkCOnRQFYQcAabyAsl5UQ0aRwwLwk1OR5M1k,37882
|
4
|
-
bec_widgets/cli/client_utils.py,sha256=
|
5
|
+
bec_widgets/cli/client_utils.py,sha256=Tv3K3J6rIQlQdVLaa6LDRt_gmQBNOgfCVbqmDbp2wqw,9159
|
5
6
|
bec_widgets/cli/generate_cli.py,sha256=JLqUlUgfz_f_4KHPRUAN-Xli-K7uNOc8-F-LkAC7Scw,4004
|
6
7
|
bec_widgets/cli/server.py,sha256=OMWnl99RrSTKK1EVEyu3MFjkJ54bWfh_fpg38b-bres,4760
|
7
8
|
bec_widgets/examples/__init__.py,sha256=WWQ0cu7m8sA4Ehy-DWdTIqSISjaHsbxhsNmNrMnhDZU,202
|
@@ -94,8 +95,8 @@ tests/unit_tests/test_widget_io.py,sha256=FeL3ZYSBQnRt6jxj8VGYw1cmcicRQyHKleahw7
|
|
94
95
|
tests/unit_tests/test_yaml_dialog.py,sha256=HNrqferkdg02-9ieOhhI2mr2Qvt7GrYgXmQ061YCTbg,5794
|
95
96
|
tests/unit_tests/test_msgs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
96
97
|
tests/unit_tests/test_msgs/available_scans_message.py,sha256=m_z97hIrjHXXMa2Ex-UvsPmTxOYXfjxyJaGkIY6StTY,46532
|
97
|
-
bec_widgets-0.
|
98
|
-
bec_widgets-0.
|
99
|
-
bec_widgets-0.
|
100
|
-
bec_widgets-0.
|
101
|
-
bec_widgets-0.
|
98
|
+
bec_widgets-0.48.0.dist-info/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
|
99
|
+
bec_widgets-0.48.0.dist-info/METADATA,sha256=g91-DgNcINlv5MWQP0jHYvJj60MeYwu0BbmY7gaPuDQ,3714
|
100
|
+
bec_widgets-0.48.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
101
|
+
bec_widgets-0.48.0.dist-info/top_level.txt,sha256=EXCwhJYmXmd1DjYYL3hrGsddX-97IwYSiIHrf27FFVk,18
|
102
|
+
bec_widgets-0.48.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|