mirror of
https://github.com/bec-project/bec_widgets.git
synced 2025-07-14 03:31:50 +02:00
fix(waveform): added support for live_data and data access
This commit is contained in:
@ -1302,7 +1302,11 @@ class BECWaveform(BECPlotBase):
|
|||||||
Update the scan curves with the data from the scan segment.
|
Update the scan curves with the data from the scan segment.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
data = self.scan_item.data
|
data = (
|
||||||
|
self.scan_item.live_data
|
||||||
|
if hasattr(self.scan_item, "live_data") # backward compatibility
|
||||||
|
else self.scan_item.data
|
||||||
|
)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -1355,8 +1359,14 @@ class BECWaveform(BECPlotBase):
|
|||||||
list|np.ndarray|None: X data for the curve.
|
list|np.ndarray|None: X data for the curve.
|
||||||
"""
|
"""
|
||||||
x_data = None
|
x_data = None
|
||||||
|
live_data = (
|
||||||
|
self.scan_item.live_data
|
||||||
|
if hasattr(self.scan_item, "live_data")
|
||||||
|
else self.scan_item.data
|
||||||
|
)
|
||||||
if self._x_axis_mode["name"] == "timestamp":
|
if self._x_axis_mode["name"] == "timestamp":
|
||||||
timestamps = self.scan_item.data[y_name][y_entry].timestamps
|
|
||||||
|
timestamps = live_data[y_name][y_entry].timestamps
|
||||||
|
|
||||||
x_data = timestamps
|
x_data = timestamps
|
||||||
return x_data
|
return x_data
|
||||||
@ -1376,7 +1386,7 @@ class BECWaveform(BECPlotBase):
|
|||||||
else:
|
else:
|
||||||
x_name = self.scan_item.status_message.info["scan_report_devices"][0]
|
x_name = self.scan_item.status_message.info["scan_report_devices"][0]
|
||||||
x_entry = self.entry_validator.validate_signal(x_name, None)
|
x_entry = self.entry_validator.validate_signal(x_name, None)
|
||||||
x_data = self.scan_item.data[x_name][x_entry].val
|
x_data = live_data[x_name][x_entry].val
|
||||||
self._x_axis_mode["label_suffix"] = f" [auto: {x_name}-{x_entry}]"
|
self._x_axis_mode["label_suffix"] = f" [auto: {x_name}-{x_entry}]"
|
||||||
current_label = "" if self.config.axis.x_label is None else self.config.axis.x_label
|
current_label = "" if self.config.axis.x_label is None else self.config.axis.x_label
|
||||||
self.plot_item.setLabel(
|
self.plot_item.setLabel(
|
||||||
@ -1387,7 +1397,7 @@ class BECWaveform(BECPlotBase):
|
|||||||
x_name = curve.config.signals.x.name
|
x_name = curve.config.signals.x.name
|
||||||
x_entry = curve.config.signals.x.entry
|
x_entry = curve.config.signals.x.entry
|
||||||
try:
|
try:
|
||||||
x_data = self.scan_item.data[x_name][x_entry].val
|
x_data = live_data[x_name][x_entry].val
|
||||||
except TypeError:
|
except TypeError:
|
||||||
x_data = []
|
x_data = []
|
||||||
return x_data
|
return x_data
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pytest
|
|
||||||
from bec_lib.client import BECClient
|
|
||||||
from bec_lib.endpoints import MessageEndpoints
|
from bec_lib.endpoints import MessageEndpoints
|
||||||
|
|
||||||
from bec_widgets.cli.auto_updates import AutoUpdates
|
from bec_widgets.cli.auto_updates import AutoUpdates
|
||||||
@ -96,7 +94,8 @@ def test_rpc_add_dock_with_figure_e2e(bec_client_lib, rpc_server_dock):
|
|||||||
time.sleep(0.2)
|
time.sleep(0.2)
|
||||||
|
|
||||||
# plot
|
# plot
|
||||||
plt_last_scan_data = queue.scan_storage.storage[-1].data
|
item = queue.scan_storage.storage[-1]
|
||||||
|
plt_last_scan_data = item.live_data if hasattr(item, "live_data") else item.data
|
||||||
plt_data = plt.get_all_data()
|
plt_data = plt.get_all_data()
|
||||||
assert plt_data["bpm4i-bpm4i"]["x"] == plt_last_scan_data["samx"]["samx"].val
|
assert plt_data["bpm4i-bpm4i"]["x"] == plt_last_scan_data["samx"]["samx"].val
|
||||||
assert plt_data["bpm4i-bpm4i"]["y"] == plt_last_scan_data["bpm4i"]["bpm4i"].val
|
assert plt_data["bpm4i-bpm4i"]["y"] == plt_last_scan_data["bpm4i"]["bpm4i"].val
|
||||||
@ -258,7 +257,8 @@ def test_auto_update(bec_client_lib, rpc_server_dock, qtbot):
|
|||||||
status = scans.line_scan(dev.samx, -5, 5, steps=10, exp_time=0.05, relative=False)
|
status = scans.line_scan(dev.samx, -5, 5, steps=10, exp_time=0.05, relative=False)
|
||||||
status.wait()
|
status.wait()
|
||||||
|
|
||||||
last_scan_data = queue.scan_storage.storage[-1].data
|
item = queue.scan_storage.storage[-1]
|
||||||
|
last_scan_data = item.live_data if hasattr(item, "live_data") else item.data
|
||||||
|
|
||||||
# get data from curves
|
# get data from curves
|
||||||
widgets = plt.widget_list
|
widgets = plt.widget_list
|
||||||
@ -284,7 +284,8 @@ def test_auto_update(bec_client_lib, rpc_server_dock, qtbot):
|
|||||||
qtbot.waitUntil(lambda: len(plt.widget_list) > 0, timeout=5000)
|
qtbot.waitUntil(lambda: len(plt.widget_list) > 0, timeout=5000)
|
||||||
plt_data = widgets[0].get_all_data()
|
plt_data = widgets[0].get_all_data()
|
||||||
|
|
||||||
last_scan_data = queue.scan_storage.storage[-1].data
|
item = queue.scan_storage.storage[-1]
|
||||||
|
last_scan_data = item.live_data if hasattr(item, "live_data") else item.data
|
||||||
|
|
||||||
# check plotted data
|
# check plotted data
|
||||||
assert (
|
assert (
|
||||||
|
@ -94,7 +94,8 @@ def test_rpc_waveform_scan(rpc_server_figure, bec_client_lib):
|
|||||||
status = scans.line_scan(dev.samx, -5, 5, steps=10, exp_time=0.05, relative=False)
|
status = scans.line_scan(dev.samx, -5, 5, steps=10, exp_time=0.05, relative=False)
|
||||||
status.wait()
|
status.wait()
|
||||||
|
|
||||||
last_scan_data = queue.scan_storage.storage[-1].data
|
item = queue.scan_storage.storage[-1]
|
||||||
|
last_scan_data = item.live_data if hasattr(item, "live_data") else item.data
|
||||||
|
|
||||||
# get data from curves
|
# get data from curves
|
||||||
plt_data = plt.get_all_data()
|
plt_data = plt.get_all_data()
|
||||||
|
@ -3,6 +3,7 @@ from unittest import mock
|
|||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pytest
|
import pytest
|
||||||
|
from bec_lib.scan_items import ScanItem
|
||||||
|
|
||||||
from bec_widgets.widgets.figure import BECFigure
|
from bec_widgets.widgets.figure import BECFigure
|
||||||
from bec_widgets.widgets.figure.plots.waveform.waveform_curve import CurveConfig, Signal, SignalData
|
from bec_widgets.widgets.figure.plots.waveform.waveform_curve import CurveConfig, Signal, SignalData
|
||||||
@ -447,8 +448,8 @@ def test_scan_update(qtbot, mocked_client):
|
|||||||
"scan_id": 1,
|
"scan_id": 1,
|
||||||
}
|
}
|
||||||
# Mock scan_storage.find_scan_by_ID
|
# Mock scan_storage.find_scan_by_ID
|
||||||
mock_scan_data_waveform = mock.MagicMock()
|
mock_scan_data_waveform = mock.MagicMock(spec=ScanItem)
|
||||||
mock_scan_data_waveform.data = {
|
mock_scan_data_waveform.live_data = {
|
||||||
device_name: {
|
device_name: {
|
||||||
entry: mock.MagicMock(val=[msg_waveform["data"][device_name][entry]["value"]])
|
entry: mock.MagicMock(val=[msg_waveform["data"][device_name][entry]["value"]])
|
||||||
for entry in msg_waveform["data"][device_name]
|
for entry in msg_waveform["data"][device_name]
|
||||||
@ -477,7 +478,9 @@ def test_scan_history_with_val_access(qtbot, mocked_client):
|
|||||||
}
|
}
|
||||||
|
|
||||||
mock_scan_storage = mock.MagicMock()
|
mock_scan_storage = mock.MagicMock()
|
||||||
mock_scan_storage.find_scan_by_ID.return_value = mock.MagicMock(data=mock_scan_data)
|
scan_item_mock = mock.MagicMock(spec=ScanItem)
|
||||||
|
scan_item_mock.data = mock_scan_data
|
||||||
|
mock_scan_storage.find_scan_by_ID.return_value = scan_item_mock
|
||||||
w1.queue.scan_storage = mock_scan_storage
|
w1.queue.scan_storage = mock_scan_storage
|
||||||
|
|
||||||
fake_scan_id = "fake_scan_id"
|
fake_scan_id = "fake_scan_id"
|
||||||
@ -507,8 +510,8 @@ def test_scatter_2d_update(qtbot, mocked_client):
|
|||||||
}
|
}
|
||||||
msg_metadata = {"scan_name": "line_scan"}
|
msg_metadata = {"scan_name": "line_scan"}
|
||||||
|
|
||||||
mock_scan_item = mock.MagicMock()
|
mock_scan_item = mock.MagicMock(spec=ScanItem)
|
||||||
mock_scan_item.data = {
|
mock_scan_item.live_data = {
|
||||||
device_name: {
|
device_name: {
|
||||||
entry: mock.MagicMock(val=msg["data"][device_name][entry]["value"])
|
entry: mock.MagicMock(val=msg["data"][device_name][entry]["value"])
|
||||||
for entry in msg["data"][device_name]
|
for entry in msg["data"][device_name]
|
||||||
@ -572,7 +575,7 @@ def test_waveform_set_x_sync(qtbot, mocked_client):
|
|||||||
w1.plot("bpm4i")
|
w1.plot("bpm4i")
|
||||||
w1.set_x_label(custom_label)
|
w1.set_x_label(custom_label)
|
||||||
|
|
||||||
scan_item_mock = mock.MagicMock()
|
scan_item_mock = mock.MagicMock(spec=ScanItem)
|
||||||
mock_data = {
|
mock_data = {
|
||||||
"samx": {"samx": mock.MagicMock(val=np.array([1, 2, 3]))},
|
"samx": {"samx": mock.MagicMock(val=np.array([1, 2, 3]))},
|
||||||
"samy": {"samy": mock.MagicMock(val=np.array([4, 5, 6]))},
|
"samy": {"samy": mock.MagicMock(val=np.array([4, 5, 6]))},
|
||||||
@ -584,7 +587,8 @@ def test_waveform_set_x_sync(qtbot, mocked_client):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
scan_item_mock.data = mock_data
|
scan_item_mock.live_data = mock_data
|
||||||
|
scan_item_mock.status_message = mock.MagicMock()
|
||||||
scan_item_mock.status_message.info = {"scan_report_devices": ["samx"]}
|
scan_item_mock.status_message.info = {"scan_report_devices": ["samx"]}
|
||||||
|
|
||||||
w1.queue.scan_storage.find_scan_by_ID.return_value = scan_item_mock
|
w1.queue.scan_storage.find_scan_by_ID.return_value = scan_item_mock
|
||||||
|
Reference in New Issue
Block a user