mirror of
https://github.com/bec-project/bec_widgets.git
synced 2025-07-14 03:31:50 +02:00
fix(test): update last scan data retrieval in async plotting test
This commit is contained in:
@ -1,6 +1,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
import traceback
|
||||||
from typing import Literal
|
from typing import Literal
|
||||||
|
|
||||||
import lmfit
|
import lmfit
|
||||||
@ -1205,6 +1206,7 @@ class Waveform(PlotBase):
|
|||||||
plot_mode = self.x_axis_mode["name"]
|
plot_mode = self.x_axis_mode["name"]
|
||||||
for curve in self._async_curves:
|
for curve in self._async_curves:
|
||||||
x_data = None # Reset x_data
|
x_data = None # Reset x_data
|
||||||
|
y_data = None
|
||||||
# Get the curve data
|
# Get the curve data
|
||||||
async_data = msg["signals"].get(curve.config.signal.entry, None)
|
async_data = msg["signals"].get(curve.config.signal.entry, None)
|
||||||
if async_data is None:
|
if async_data is None:
|
||||||
@ -1223,6 +1225,7 @@ class Waveform(PlotBase):
|
|||||||
data_plot_y = data_plot_y[-1, :]
|
data_plot_y = data_plot_y[-1, :]
|
||||||
else:
|
else:
|
||||||
x_data, y_data = curve.get_data()
|
x_data, y_data = curve.get_data()
|
||||||
|
|
||||||
if y_data is not None:
|
if y_data is not None:
|
||||||
data_plot_y = np.hstack((y_data, data_plot_y))
|
data_plot_y = np.hstack((y_data, data_plot_y))
|
||||||
# Add slice
|
# Add slice
|
||||||
|
@ -3,11 +3,14 @@ import time
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import pytest
|
import pytest
|
||||||
from bec_lib.endpoints import MessageEndpoints
|
from bec_lib.endpoints import MessageEndpoints
|
||||||
|
from bec_lib.logger import bec_logger
|
||||||
|
|
||||||
from bec_widgets.cli.client import Image, MotorMap, MultiWaveform, ScatterWaveform, Waveform
|
from bec_widgets.cli.client import Image, MotorMap, MultiWaveform, ScatterWaveform, Waveform
|
||||||
from bec_widgets.cli.rpc.rpc_base import RPCReference
|
from bec_widgets.cli.rpc.rpc_base import RPCReference
|
||||||
from bec_widgets.tests.utils import check_remote_data_size
|
from bec_widgets.tests.utils import check_remote_data_size
|
||||||
|
|
||||||
|
logger = bec_logger.logger
|
||||||
|
|
||||||
|
|
||||||
def test_rpc_waveform1d_custom_curve(qtbot, connected_client_gui_obj):
|
def test_rpc_waveform1d_custom_curve(qtbot, connected_client_gui_obj):
|
||||||
gui = connected_client_gui_obj
|
gui = connected_client_gui_obj
|
||||||
@ -111,6 +114,7 @@ def test_rpc_waveform_scan(qtbot, bec_client_lib, connected_client_gui_obj):
|
|||||||
|
|
||||||
|
|
||||||
def test_async_plotting(qtbot, bec_client_lib, connected_client_gui_obj):
|
def test_async_plotting(qtbot, bec_client_lib, connected_client_gui_obj):
|
||||||
|
logger.warning("Starting async plotting test in e2e test.")
|
||||||
gui = connected_client_gui_obj
|
gui = connected_client_gui_obj
|
||||||
dock = gui.bec
|
dock = gui.bec
|
||||||
|
|
||||||
@ -121,9 +125,9 @@ def test_async_plotting(qtbot, bec_client_lib, connected_client_gui_obj):
|
|||||||
|
|
||||||
# Test add
|
# Test add
|
||||||
dev.waveform.sim.select_model("GaussianModel")
|
dev.waveform.sim.select_model("GaussianModel")
|
||||||
dev.waveform.sim.params = {"amplitude": 1000, "center": 4000, "sigma": 300}
|
dev.waveform.sim.params = {"amplitude": 1000, "center": 400, "sigma": 300}
|
||||||
dev.waveform.async_update.put("add")
|
dev.waveform.async_update.put("add")
|
||||||
dev.waveform.waveform_shape.put(10000)
|
dev.waveform.waveform_shape.put(1000) # Do not reduce, data needs to be large to downsample
|
||||||
wf = dock.new("wf_dock").new("Waveform")
|
wf = dock.new("wf_dock").new("Waveform")
|
||||||
curve = wf.plot(y_name="waveform")
|
curve = wf.plot(y_name="waveform")
|
||||||
|
|
||||||
@ -131,28 +135,24 @@ def test_async_plotting(qtbot, bec_client_lib, connected_client_gui_obj):
|
|||||||
status.wait()
|
status.wait()
|
||||||
|
|
||||||
# Wait for the scan to finish and the data to be available in history
|
# Wait for the scan to finish and the data to be available in history
|
||||||
# Wait until scan_id is in history
|
|
||||||
def _wait_for_scan_in_history():
|
def _wait_for_scan_in_history():
|
||||||
if len(client.history) == 0:
|
# Get scan item from history
|
||||||
return False
|
scan_item = client.history.get_by_scan_id(status.scan.scan_id)
|
||||||
# Once items appear in storage, the last one hast to be the one we just scanned
|
return scan_item is not None
|
||||||
return client.history[-1].metadata.bec["scan_id"] == status.scan.scan_id
|
|
||||||
|
qtbot.waitUntil(_wait_for_scan_in_history, timeout=7000)
|
||||||
|
# Get all data
|
||||||
|
waveform_data = client.history[-1].devices.waveform.waveform_waveform.read()["value"]
|
||||||
|
|
||||||
qtbot.waitUntil(_wait_for_scan_in_history, timeout=10000)
|
|
||||||
last_scan_data = client.history[-1]
|
|
||||||
# check plotted data
|
# check plotted data
|
||||||
x_data, y_data = curve.get_data()
|
x_data, y_data = curve.get_data()
|
||||||
assert np.array_equal(x_data, np.linspace(0, len(y_data) - 1, len(y_data)))
|
assert np.array_equal(x_data, np.linspace(0, len(y_data) - 1, len(y_data)))
|
||||||
assert np.array_equal(
|
assert np.array_equal(y_data, waveform_data)
|
||||||
y_data, last_scan_data.devices.waveform.get("waveform_waveform", {}).read().get("value", [])
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check displayed data
|
# Check displayed data
|
||||||
x_data_display, y_data_display = curve._get_displayed_data()
|
x_data_display, y_data_display = curve._get_displayed_data()
|
||||||
# Should be not more than 1% difference, actually be closer but this might be flaky
|
# Should be not more than 1% difference, actually be closer but this might be flaky
|
||||||
assert np.isclose(x_data_display[-1], x_data[-1], rtol=0.01)
|
assert np.isclose(x_data_display[-1], x_data[-1], rtol=0.01)
|
||||||
# Downsampled data should be smaller than original data
|
|
||||||
assert len(y_data_display) < len(y_data)
|
|
||||||
|
|
||||||
|
|
||||||
def test_rpc_image(qtbot, bec_client_lib, connected_client_gui_obj):
|
def test_rpc_image(qtbot, bec_client_lib, connected_client_gui_obj):
|
||||||
|
@ -315,6 +315,14 @@ def test_widgets_e2e_image(
|
|||||||
# Run a scan and plot the image
|
# Run a scan and plot the image
|
||||||
s = scans.line_scan(dev.samx, -3, 3, steps=50, exp_time=0.01, relative=False)
|
s = scans.line_scan(dev.samx, -3, 3, steps=50, exp_time=0.01, relative=False)
|
||||||
s.wait()
|
s.wait()
|
||||||
|
|
||||||
|
def _wait_for_scan_in_history():
|
||||||
|
# Get scan item from history
|
||||||
|
scan_item = bec.history.get_by_scan_id(s.scan.scan_id)
|
||||||
|
return scan_item is not None
|
||||||
|
|
||||||
|
qtbot.waitUntil(_wait_for_scan_in_history, timeout=7000)
|
||||||
|
|
||||||
# Check that last image is equivalent to data in Redis
|
# Check that last image is equivalent to data in Redis
|
||||||
last_img = bec.device_monitor.get_data(
|
last_img = bec.device_monitor.get_data(
|
||||||
dev.eiger, count=1
|
dev.eiger, count=1
|
||||||
@ -325,22 +333,6 @@ def test_widgets_e2e_image(
|
|||||||
maybe_remove_widget(qtbot, gui, dock, widget, random_generator_from_seed)
|
maybe_remove_widget(qtbot, gui, dock, widget, random_generator_from_seed)
|
||||||
maybe_remove_dock_area(qtbot, gui, dock_area, random_generator_from_seed)
|
maybe_remove_dock_area(qtbot, gui, dock_area, random_generator_from_seed)
|
||||||
|
|
||||||
# @pytest.mark.timeout(PYTEST_TIMEOUT)
|
|
||||||
# def test_widgets_e2e_lmfit_dialog(
|
|
||||||
# qtbot, connected_gui_and_bec_with_scope_session, random_generator_from_seed
|
|
||||||
# ):
|
|
||||||
# """Test the LMFITDialog widget."""
|
|
||||||
# gui = connected_gui_and_bec_with_scope_session
|
|
||||||
# bec = gui._client
|
|
||||||
# # Create dock_area, dock, widget
|
|
||||||
# dock_area, dock, widget = create_widget(qtbot, gui, gui.available_widgets.LMFitDialog)
|
|
||||||
|
|
||||||
# # No rpc calls to check so far
|
|
||||||
|
|
||||||
# # Test removing the widget, or leaving it open for the next test
|
|
||||||
# maybe_remove_widget(qtbot, gui, dock, widget, random_generator_from_seed)
|
|
||||||
maybe_remove_dock_area(qtbot, gui, dock_area, random_generator_from_seed)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.timeout(PYTEST_TIMEOUT)
|
@pytest.mark.timeout(PYTEST_TIMEOUT)
|
||||||
def test_widgets_e2e_log_panel(
|
def test_widgets_e2e_log_panel(
|
||||||
@ -672,24 +664,16 @@ def test_widgets_e2e_waveform(
|
|||||||
s = scans.line_scan(dev.samx, -3, 3, steps=50, exp_time=0.01, relative=False)
|
s = scans.line_scan(dev.samx, -3, 3, steps=50, exp_time=0.01, relative=False)
|
||||||
s.wait()
|
s.wait()
|
||||||
|
|
||||||
def _wait_live_data_updated():
|
def _wait_for_scan_in_history():
|
||||||
# Wait until storage exists
|
# Get scan item from history
|
||||||
if len(bec.queue.scan_storage.storage) == 0:
|
scan_item = bec.history.get_by_scan_id(s.scan.scan_id)
|
||||||
return False
|
return scan_item is not None
|
||||||
scan_item = bec.queue.scan_storage.storage[-1]
|
|
||||||
# Wait until scan_id is in history
|
|
||||||
if not scan_item.status_message.info["scan_id"] == s.scan.scan_id:
|
|
||||||
return False
|
|
||||||
# Wait until data for all steps is available
|
|
||||||
return len(scan_item.live_data.samx.samx.val) == 50
|
|
||||||
|
|
||||||
qtbot.waitUntil(_wait_live_data_updated, timeout=7000)
|
qtbot.waitUntil(_wait_for_scan_in_history, timeout=7000)
|
||||||
# Check if data that is plotted is the same as the scan_item
|
|
||||||
# Plot may not be updated yet, so we need to wait for the data to be updated
|
scan_item = bec.history.get_by_scan_id(s.scan.scan_id)
|
||||||
qtbot.waitUntil(lambda: len(widget.curves[0].get_data()[0]) == 50)
|
samx_data = scan_item.devices.samx.samx.read()["value"]
|
||||||
scan_item = bec.queue.scan_storage.storage[-1]
|
bpm4i_data = scan_item.devices.bpm4i.bpm4i.read()["value"]
|
||||||
samx_data = scan_item.live_data.samx.samx.val
|
|
||||||
bpm4i_data = scan_item.live_data.bpm4i.bpm4i.val
|
|
||||||
curve = widget.curves[0]
|
curve = widget.curves[0]
|
||||||
assert np.allclose(curve.get_data()[0], samx_data)
|
assert np.allclose(curve.get_data()[0], samx_data)
|
||||||
assert np.allclose(curve.get_data()[1], bpm4i_data)
|
assert np.allclose(curve.get_data()[1], bpm4i_data)
|
||||||
|
Reference in New Issue
Block a user