0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-14 03:31:50 +02:00
Files
bec_widgets/docs/user/getting_started/auto_updates.md

3.7 KiB

(user.auto_updates)=

Auto updates

BEC Widgets provides a simple way to update the entire GUI configuration based on events. These events can be of different types, such as a new scan being started or completed, a button being pressed, a device reporting an error or the existence of a specific metadata key. This allows the users to streamline the experience of the GUI and to focus on the data and the analysis, rather than on the GUI itself.

The default auto update only takes control over a single BECFigure widget, which is automatically added to the GUI instance. The update instance is accessible via the bec.gui.auto_updates object. The user can disable / enable the auto updates by setting the enabled attribute of the bec.gui.auto_updates object, e.g.

bec.gui.auto_updates.enabled = False

Without further customization, the auto update will automatically update the BECFigure widget based on the currently performed scan. The behaviour is determined by the handler method of the AutoUpdate class:

:icon: code-square
:animate: fade-in-slide-down
:open: 
```{literalinclude} ../../../bec_widgets/cli/auto_updates.py
:pyobject: AutoUpdates.handler
```

As shown, the default handler switches between different scan names and updates the BECFigure widget accordingly. If the scan is a line scan, the simple_line_scan update method is executed.

:icon: code-square
:animate: fade-in-slide-down
:open: 
```{literalinclude} ../../../bec_widgets/cli/auto_updates.py
:pyobject: AutoUpdates.simple_line_scan
```

As it can be seen from the above snippet, the update method gets the default figure by calling the get_default_figure method. If the figure is not found, maybe because the user has deleted or closed it, no update is performed. If the figure is found, the scan info is used to extract the first reported device for the x axis and the first device of the monitored devices for the y axis. The y axis can also be set by the user using the selected_device attribute:

bec.gui.auto_updates.selected_device = 'bpm4i'
:icon: code-square
:animate: fade-in-slide-down
```{literalinclude} ../../../bec_widgets/cli/auto_updates.py
```

Custom Auto Updates

The beamline can customize their default behaviour through customized auto update classes. This can be achieved by modifying the class located in the beamline plugin repository: <beamline_plugin>/bec_widgets/auto_updates.py. The class should inherit from the AutoUpdates class and overwrite the handler method.

from bec_widgets.cli.auto_updates import AutoUpdates, ScanInfo


class PlotUpdate(AutoUpdates):
    create_default_dock = True
    enabled = True

    # def simple_line_scan(self, info: ScanInfo) -> None:
    #     """
    #     Simple line scan.
    #     """
    #     fig = self.get_default_figure()
    #     if not fig:
    #         return
    #     dev_x = info.scan_report_devices[0]
    #     dev_y = self.get_selected_device(info.monitored_devices, self.gui.selected_device)
    #     if not dev_y:
    #         return
    #     fig.clear_all()
    #     plt = fig.plot(x_name=dev_x, y_name=dev_y)
    #     plt.set(title=f"Custom Plot {info.scan_number}", x_label=dev_x, y_label=dev_y)

    def handler(self, info: ScanInfo) -> None:
        # EXAMPLES:
        # if info.scan_name == "line_scan" and info.scan_report_devices:
        #     self.simple_line_scan(info)
        #     return
        # if info.scan_name == "grid_scan" and info.scan_report_devices:
        #     self.run_grid_scan_update(info)
        #     return
        super().handler(info)