From 7469c892c8076fc09e61f173df6920c551241cec Mon Sep 17 00:00:00 2001 From: wakonig_k Date: Fri, 18 Oct 2024 15:04:04 +0200 Subject: [PATCH] fix(waveform): added support for live_data and data access --- .../widgets/figure/plots/waveform/waveform.py | 18 ++++++++++++++---- tests/end-2-end/test_bec_dock_rpc_e2e.py | 11 ++++++----- tests/end-2-end/test_bec_figure_rpc_e2e.py | 3 ++- tests/unit_tests/test_waveform1d.py | 18 +++++++++++------- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/bec_widgets/widgets/figure/plots/waveform/waveform.py b/bec_widgets/widgets/figure/plots/waveform/waveform.py index 9aed15a2..c3de482f 100644 --- a/bec_widgets/widgets/figure/plots/waveform/waveform.py +++ b/bec_widgets/widgets/figure/plots/waveform/waveform.py @@ -1302,7 +1302,11 @@ class BECWaveform(BECPlotBase): Update the scan curves with the data from the scan segment. """ 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: return @@ -1355,8 +1359,14 @@ class BECWaveform(BECPlotBase): list|np.ndarray|None: X data for the curve. """ 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": - timestamps = self.scan_item.data[y_name][y_entry].timestamps + + timestamps = live_data[y_name][y_entry].timestamps x_data = timestamps return x_data @@ -1376,7 +1386,7 @@ class BECWaveform(BECPlotBase): else: x_name = self.scan_item.status_message.info["scan_report_devices"][0] 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}]" current_label = "" if self.config.axis.x_label is None else self.config.axis.x_label self.plot_item.setLabel( @@ -1387,7 +1397,7 @@ class BECWaveform(BECPlotBase): x_name = curve.config.signals.x.name x_entry = curve.config.signals.x.entry try: - x_data = self.scan_item.data[x_name][x_entry].val + x_data = live_data[x_name][x_entry].val except TypeError: x_data = [] return x_data diff --git a/tests/end-2-end/test_bec_dock_rpc_e2e.py b/tests/end-2-end/test_bec_dock_rpc_e2e.py index 1f5cbb45..1ba9068d 100644 --- a/tests/end-2-end/test_bec_dock_rpc_e2e.py +++ b/tests/end-2-end/test_bec_dock_rpc_e2e.py @@ -1,8 +1,6 @@ import time import numpy as np -import pytest -from bec_lib.client import BECClient from bec_lib.endpoints import MessageEndpoints 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) # 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() 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 @@ -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.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 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) 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 assert ( diff --git a/tests/end-2-end/test_bec_figure_rpc_e2e.py b/tests/end-2-end/test_bec_figure_rpc_e2e.py index 9238a2ab..fd6b27fa 100644 --- a/tests/end-2-end/test_bec_figure_rpc_e2e.py +++ b/tests/end-2-end/test_bec_figure_rpc_e2e.py @@ -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.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 plt_data = plt.get_all_data() diff --git a/tests/unit_tests/test_waveform1d.py b/tests/unit_tests/test_waveform1d.py index 5a30ebd4..adaba4da 100644 --- a/tests/unit_tests/test_waveform1d.py +++ b/tests/unit_tests/test_waveform1d.py @@ -3,6 +3,7 @@ from unittest import mock import numpy as np import pytest +from bec_lib.scan_items import ScanItem from bec_widgets.widgets.figure import BECFigure 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, } # Mock scan_storage.find_scan_by_ID - mock_scan_data_waveform = mock.MagicMock() - mock_scan_data_waveform.data = { + mock_scan_data_waveform = mock.MagicMock(spec=ScanItem) + mock_scan_data_waveform.live_data = { device_name: { entry: mock.MagicMock(val=[msg_waveform["data"][device_name][entry]["value"]]) 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.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 fake_scan_id = "fake_scan_id" @@ -507,8 +510,8 @@ def test_scatter_2d_update(qtbot, mocked_client): } msg_metadata = {"scan_name": "line_scan"} - mock_scan_item = mock.MagicMock() - mock_scan_item.data = { + mock_scan_item = mock.MagicMock(spec=ScanItem) + mock_scan_item.live_data = { device_name: { entry: mock.MagicMock(val=msg["data"][device_name][entry]["value"]) for entry in msg["data"][device_name] @@ -572,7 +575,7 @@ def test_waveform_set_x_sync(qtbot, mocked_client): w1.plot("bpm4i") w1.set_x_label(custom_label) - scan_item_mock = mock.MagicMock() + scan_item_mock = mock.MagicMock(spec=ScanItem) mock_data = { "samx": {"samx": mock.MagicMock(val=np.array([1, 2, 3]))}, "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"]} w1.queue.scan_storage.find_scan_by_ID.return_value = scan_item_mock