diff --git a/pxiii_bec/scripts/alignment_fit.py b/pxiii_bec/scripts/alignment_fit.py index 5cd0418..d95735d 100644 --- a/pxiii_bec/scripts/alignment_fit.py +++ b/pxiii_bec/scripts/alignment_fit.py @@ -16,7 +16,8 @@ def alignment_fit_and_plot( Args: history_index (int): scan to fetch, e.g. -1 for the most recent scan device_name (str): the device for which to get the monitoring data - + signal_name (str | None): the signal to plot, if different from the device name. + smoothing_sigma (float): the sigma for the Gaussian smoothing filter """ # Fetch scan data from the history # by default, signal = device name, unless otherwise specified @@ -29,9 +30,9 @@ def alignment_fit_and_plot( # Create a plot and a text box to display results dock_area = bec.gui.new() - wf = dock_area.new().new(bec.gui.available_widgets.Waveform) + wf = dock_area.new(bec.gui.available_widgets.Waveform) wf.title = f"Scan {md['scan_number']}: {md['scan_name']} of {motor_name}" - text = dock_area.new(position="right").new(widget=bec.gui.available_widgets.TextBox) + text = dock_area.new(bec.gui.available_widgets.TextBox, where="right") # Calculate some processed data and add everything to the plot wf.plot(data, label="Raw data") diff --git a/pxiii_bec/scripts/beamlinescripts.py b/pxiii_bec/scripts/beamlinescripts.py index 8bde700..6ea2c98 100644 --- a/pxiii_bec/scripts/beamlinescripts.py +++ b/pxiii_bec/scripts/beamlinescripts.py @@ -5,6 +5,18 @@ import time +def _device_name(device): + return device.name if hasattr(device, "name") else str(device) + + +def _get_or_create_scan_window(name="CurrentScan"): + window = bec.gui.windows.get(name) + if window is None: + return bec.gui.new(name) + window.delete_all() + return window + + def rock(steps, exp_time, scan_start=None, scan_end=None, datasource=None, visual=True, **kwargs): """Demo step scan with plotting @@ -26,22 +38,18 @@ def rock(steps, exp_time, scan_start=None, scan_end=None, datasource=None, visua scan_end = 0.05 / dev.dccm_energy.user_readback.get() if visual: - # Get or create scan specific window - window = None - for _, val in bec.gui.windows.items(): - if val.title == "CurrentScan": - window = val.widget - window.clear_all() - if window is None: - window = bec.gui.new("CurrentScan") + # Get or create scan specific window. + window = _get_or_create_scan_window("CurrentScan") + motor_name = _device_name(motor) + datasource_name = _device_name(datasource) - # Draw a simploe plot in the window - dock = window.add_dock(f"ScanDisplay {motor}") - plt1 = dock.add_widget("BECWaveformWidget") - plt1.plot(x_name=motor, y_name=datasource) - plt1.set_x_label(motor) - plt1.set_y_label(datasource) - plt1.add_dap(motor, datasource, dap="LinearModel") + # Draw a waveform plot in the window. + plt1 = window.new( + bec.gui.available_widgets.Waveform, object_name=f"ScanDisplay_{motor_name}" + ) + plt1.plot(device_x=motor_name, device_y=datasource_name, dap="LinearModel") + plt1.x_label = motor_name + plt1.y_label = datasource_name window.show() print("Handing over to 'scans.line_scan'") diff --git a/pxiii_bec/scripts/kat.py b/pxiii_bec/scripts/kat.py index 423a483..4d6aeb5 100644 --- a/pxiii_bec/scripts/kat.py +++ b/pxiii_bec/scripts/kat.py @@ -17,14 +17,13 @@ def scan_theta2(scan_start, scan_end, stepno, exp): # # Create a plot to display the results dock_area = bec.gui.new() - wf = dock_area.new().new(bec.gui.available_widgets.Waveform) + wf = dock_area.new(bec.gui.available_widgets.Waveform) wf.title = f"Scan of DCCM_theta2" - wf.plot(x_name='dccm_theta2', y_name='dccm_xbpm') - wf.add_dap_curve(device_label='dccm_xbpm-dccm_xbpm', dap_name='GaussianModel') + wf.plot(device_x="dccm_theta2", device_y="dccm_xbpm", label="dccm_xbpm-dccm_xbpm") + dap_xbpm = wf.add_dap_curve(device_label="dccm_xbpm-dccm_xbpm", dap_name="GaussianModel") print(dap_xbpm.dap_params) - diff --git a/pxiii_bec/scripts/scanwrappers.py b/pxiii_bec/scripts/scanwrappers.py index 0393d34..698a651 100644 --- a/pxiii_bec/scripts/scanwrappers.py +++ b/pxiii_bec/scripts/scanwrappers.py @@ -6,6 +6,18 @@ def bl_check_beam(): return True +def _device_name(device): + return device.name if hasattr(device, "name") else str(device) + + +def _get_or_create_scan_window(name="CurrentScan"): + window = bec.gui.windows.get(name) + if window is None: + return bec.gui.new(name) + window.delete_all() + return window + + def ascan( motor, scan_start, scan_end, steps, exp_time, plot=None, visual=True, relative=False, **kwargs ): @@ -23,22 +35,18 @@ def ascan( raise RuntimeError("Beamline is not in ready state") if visual: - # Get or create scan specific window - window = None - for _, val in bec.gui.windows.items(): - if val.title == "CurrentScan": - window = val.widget - window.clear_all() - if window is None: - window = bec.gui.new("CurrentScan") + # Get or create scan specific window. + window = _get_or_create_scan_window("CurrentScan") + motor_name = _device_name(motor) + plot_name = _device_name(plot) - # Draw a simploe plot in the window - dock = window.add_dock(f"ScanDisplay {motor}") - plt1 = dock.add_widget("BECWaveformWidget") - plt1.plot(x_name=motor, y_name=plot) - plt1.set_x_label(motor) - plt1.set_y_label(plot) - plt1.add_dap(motor, plot, dap="LinearModel") + # Draw a waveform plot in the window. + plt1 = window.new( + bec.gui.available_widgets.Waveform, object_name=f"ScanDisplay_{motor_name}" + ) + plt1.plot(device_x=motor_name, device_y=plot_name, dap="LinearModel") + plt1.x_label = motor_name + plt1.y_label = plot_name window.show() print("Handing over to 'scans.line_scan'")