Library Reference

The plugin module

Contains only plugins and plugin templates.

The user controls generally have a large amount of logic integrated and can act as an intelligent database. This avoids complex and error prone synchronization between redundant data in the UI and a separate database. Every Parameter should only exist in one unique location at run time.

class esibd.plugins.ChannelManager(*args: Any, **kwargs: Any)

Generic plugin with a tree of channels. This can be extended to implement device plugins, plugins with relay channels, and more.

class ChannelPlot(*args: Any, **kwargs: Any)

Simplified version of the Line plugin for plotting channels.

finalizeInit() None

Execute final initialization code after all other Plugins are initialized.

Use this for code that modifies other Plugins, e.g. adding an Action to the DeviceManager.

getIcon(desaturate: bool = False) Icon

Get the plugin icon. Consider using a themed icon that works in dark and light modes.

Overwrite only if definition of iconFile and iconFileDark is not sufficient.

Parameters:

desaturate (bool, optional) – Indicates if color should be removed from icon, defaults to False

Returns:

Icon

Return type:

Icon

initFig() None

Initialize a figure.

Will be called when a display is closed and reopened or the theme is changed. Overwrite your figure initialization here to make sure all references are updated correctly.

initGUI() None

Initialize the graphic user interface (GUI), independent of all other plugins.

parentPlugin: ChannelManager

A Plugin that acts as a parent by providing references for and using this plugin

plot() None

Plot current values from all real channels.

pluginType: PLUGINTYPE = 'Display'

The type defines the location of the plugin in the user interface and allows to run operations on a group of plugins with the same type using getPluginsByType().

provideDock() bool

Add existing dock to UI at position defined by esibd.plugins.Plugin.pluginType.

Always call from the main_thread.

runTestParallel() None

Run a series of tests by changing values of selected controls and triggering the corresponding events.

Extend and add call to super().runTestParallel() to the end to make sure testing flag is set to False after all test completed.

version: str = '1.0'

The version of the plugin. Plugins are independent programs that require independent versioning and documentation.

property LOADVALUES: str

Load values string for context menus.

class SignalCommunicate(*args: Any, **kwargs: Any)

Bundle pyqtSignals.

plotSignal

Signal that triggers plotting of history.

addChannel(item: dict[str, Any], index: int | None = None) None

Map dictionary to Channel.

Parameters:
  • item (dict) – Dictionary containing channel details.

  • index (int, optional) – Index where channel should be inserted, defaults to None

bufferLagging(wait: int = 5) bool

Wait for excess events to be processed.

Only call from parallel thread, e.g. during testing or scanning!

Parameters:

wait (int) – Indicates how long the thread should wait to allow lag to recover, defaults to 5

channelConfigChanged(file: Path | None = None, useDefaultFile: bool = True) bool

Scan for changes when saving configuration.

Parameters:
  • file (pathlib.Path, optional) – Compare configuration to stat in this file, defaults to None

  • useDefaultFile (bool, optional) – Indicates if default file should be used, defaults to True

Returns:

True if configuration has changed and does not match file.

Return type:

bool

channelPlotActive() bool

Indicate if the channel plot is active.

channelSelection(selectedChannel: Channel) None

Ensure that only one channel is selected at all times.

Parameters:

selectedChannel (esibd.core.Channel) – The Channel that has been selected by the user.

channelType

Type of Channel used by the device. Overwrite by appropriate type in derived classes.

alias of Channel

channels: list[Channel]

List of channels.

clearPlot() None

Clear the plot in the liveDisplay.

close() bool

Close plugin cleanly without leaving any data or communication running.

Extend to make sure your custom data and custom communication is closed.

closeCommunication() None

Stop recording and also closes all device communication.

Extend to add custom code to close device communication.

closeGUI() None

Close the user interface but might keep data available in case the user interface is restored later.

Closes all open references. Extend to save data and make hardware save if needed.

compareItemsConfig(items: list[dict[str, str | Path | int | float | PyQt6.QtGui.QColor | bool]], ignoreIndicators: bool = False) tuple[list[str], bool]

Compare channel items from file with current configuration.

This allows to track changes and decide if files need to be updated.

Parameters:
  • items (list[dict[str, ParameterType]]) – Channel items from file

  • ignoreIndicators (bool) – Set to True if deciding about file updates (indicators are not saved in files).

convertDataDisplay(data: ndarray[Any, dtype[float32]]) ndarray[Any, dtype[float32]]

Overwrite to apply scaling and offsets to data before it is displayed. Use, e.g., to convert to another unit.

Parameters:

data (np.ndarray) – Original data.

Returns:

Scaled data.

Return type:

np.ndarray

copyClipboard() None

Copy matplotlib figure to clipboard.

customConfigFile(file: str) Path

Return custom config file including full path.

Parameters:

file (str) – File name.

Returns:

File including full path.

Return type:

pathlib.Path

deleteChannel() None

Delete the currently selected channel.

duplicateChannel() Channel | None

Duplicates the currently selected channel.

exportConfiguration(file: Path | None = None, useDefaultFile: bool = False) None

Save an .ini or .h5 file which contains the configuration for this Device.

Channels can be added and edited through the user interface, but the .ini file can also be edited manually with a text editor.

Parameters:
  • file (pathlib.Path, optional) – The file to add the configuration to, defaults to None

  • useDefaultFile (bool, optional) – Indicates if the default should be used, defaults to False

finalizeInit() None

Execute final initialization code after all other Plugins are initialized.

Use this for code that modifies other Plugins, e.g. adding an Action to the DeviceManager.

getActiveChannels() list[Channel]

Return all channels that are enabled or not real.

getChannelByName(name: str) Channel | None

Return a device specific channel based on its unique name.

Parameters:

name (str) – Name of the channel to be found.

Returns:

Found channel, defaults to None if no channel found.

Return type:

esibd.core.Channel

getChannels() list[Channel]

Get channels. Overwrite to return subsets based on channel state.

getDataChannels() list[Channel]

Return all channels that have data history.

getDefaultSettings() dict[str, dict]

Define a dictionary of parameterDict() which specifies default settings for this plugin.

Overwrite or extend as needed to define specific settings that will be added to Settings section. NOTE: While settings with attributes will be automatically accessible, it is good practice to define the type of the attribute for type checking.

Returns:

Settings dictionary

Return type:

{parameterDict()}

initGUI() None

Initialize the graphic user interface (GUI), independent of all other plugins.

initializeCommunication() None

Extend to initialize communication.

Can be used to initialize GUI. Redirect initialization of hardware communication to the corresponding DeviceController.

intervalChanged() None

Extend to add code to be executed in case the Interval changes.

isOn() bool

Overwrite to signal if device output (e.g. for voltage supplies) is on.

liveDisplay: LiveDisplay

Internal plugin to display data in real time.

liveDisplayActive() bool

Indicate if the liveDisplay is active.

loadConfiguration(file: Path | None = None, useDefaultFile: bool = False, append: bool = False) None

Load channel configuration from file.

If only values should be loaded without complete reinitialization, use loadValues instead.

Parameters:
  • file (pathlib.Path, optional) – File from which to load configuration, defaults to None

  • useDefaultFile (bool, optional) – Use internal configuration file if True, defaults to False

  • append (bool, optional) – True if changelog should be appended to previous change logs, e.g. when loading from multiple devices at once. Defaults to False

loadValues(file: Path | None = None, append: bool = False) None

Load values only, instead of entire configuration, for channels matching in file and current configuration.

Channels that exist in the file but not in the current configuration will be ignored. Only used by input devices.

Parameters:
  • file (pathlib.Path, optional) – The file to load values from, defaults to None

  • append (bool, optional) – True if changelog should be appended to previous change logs, e.g. when loading from multiple devices at once. Defaults to False

minTime() float64

Get the oldest time in the stored history.

modifyChannel() Channel | None

Return selected channel. Note, channels can only be selected in advanced mode.

Returns:

The selected channel. None if no channel found.

Return type:

esibd.core.Channel

moveChannel(up: bool) Channel | None

Move the channel up or down in the list of channels.

Parameters:

up (bool) – Move up if True, else down.

name: str = 'Channel Manager'

A unique name that will be used in the graphic user interface. Plugins can be accessed directly from the Console using their name.

optional: bool = False

Defines if the user can deactivate the plugin in the PluginManager user interface.

plot(apply: bool = False) None

Plot for all active LiveDisplays.

Parameters:

apply (bool) – Apply most recent data, otherwise update rate depends on data thinning.

pluginType: PLUGINTYPE = 'Generic Control'

The type defines the location of the plugin in the user interface and allows to run operations on a group of plugins with the same type using getPluginsByType().

property recording: bool

Indicates the recording state.

runDataThread(recording: Callable) None

Trigger regular plotting of data.

Extend or Overwrite to add logic for appending data to channels.

Parameters:

recording (Callable) – Queries recording state.

runTestParallel() None

Run a series of tests by changing values of selected controls and triggering the corresponding events.

Extend and add call to super().runTestParallel() to the end to make sure testing flag is set to False after all test completed.

saveConfiguration() None

Save configuration to file in current session.

setOn(on: bool | None = None) None

Toggles device on state.

Parameters:

on (bool, optional) – Requested state, defaults to None. Extended versions of this function may perform tasks based on self.isOn() even if on=None.

showChannelPlot() None

Show a plot based on the current values of all real channels.

startRecording() None

Start the data recording thread.

staticDisplay: StaticDisplay

Internal plugin to display data from file.

staticDisplayActive() bool

Indicate if the staticDisplay is active.

supportsFile(file: Path) bool

Test if a file is supported by the plugin, based on file name or content.

Parameters:

file (pathlib.Path) – File that has been selected by the user.

Returns:

Returns True if the file is supported by the plugin. Test if supported based on file extension or content.

Return type:

bool

toggleAdvanced(advanced: bool | None = False) None

Overwrite to show advanced options.

Parameters:

advanced (bool, optional) – Indicates if advanced options should be visible, defaults to None

toggleChannelPlot(visible: bool) None

Toggles visibility of the channelPlot.

Parameters:

visible (bool) – Requested visibility for channelPlot.

toggleLiveDisplay(visible: bool | None = None) None

Toggle visibility of the liveDisplay.

Parameters:

visible (bool) – Requested visibility for liveDisplay.

toggleRecording(on: bool | None = None, manual: bool = True) None

Turn recording on or off or toggles state.

Data will be plotted in LiveDisplay if that is active. Extend to add recoding logic for devices.

Parameters:
  • on (bool, optional) – If True recording will be turned on, if False it will be turned off. If already on or off nothing happens. If None, recording is toggled.

  • manual (bool, optional) – If True, signal was send directly from corresponding live display. Otherwise might be send from device manager

toggleStaticDisplay(visible: bool) None

Toggles visibility of the staticDisplay.

Parameters:

visible (bool) – Requested visibility for staticDisplay.

toggleTitleBar() None

Adjust the title bar layout and titleBarLabel depending on the state of the dock (tabbed, floating, …).

Extend to make sure toggleTitleBar is called for dependent plugins if applicable.

updateChannelConfig(items: list[dict[str, str | Path | int | float | PyQt6.QtGui.QColor | bool]], file: Path, append: bool = False) None

Scan for changes when loading configuration and displays change log before overwriting old channel configuration.

Parameters:
  • items (list[dict[str, ParameterType]]) – Channel items from file

  • file (pathlib.Path) – config file

  • append (bool, optional) – True if changelog should be appended to previous change logs, e.g. when loading from multiple devices at once. Defaults to False

updateChannelValue(name: str, value: float) None

Update channel value und adds message to change log if the value has changed.

Parameters:
  • name (str) – Channel name.

  • value (float) – The new value.

updateTheme() None

Change between dark and light themes.

Most controls should update automatically as the color pallet is changed. Only update the remaining controls using style sheets. Extend to adjust colors to app theme.

useAdvancedOptions: bool = True

Adds toolbox icon to show advanced plugin options.

useBackgrounds: bool = False

If True, the device implements controls to define and subtract background signals.

useDisplays = True

use liveDisplay, StaticDisplay, ChannelPlot, and all related functionality.

useMonitors = False

Use record monitors and compare them to set points.

useOnOffLogic = False

Creates an Action in the DeviceManager that handles turning key functions on and off.

version: str = '1.0'

The version of the plugin. Plugins are independent programs that require independent versioning and documentation.

class esibd.plugins.Device(*args: Any, **kwargs: Any)

Handle communication with one or more physical devices, provide controls to configure the device and display live or previously recorded data.

There are input devices (sending input from the user to hardware) and output devices (reading outputs from hardware). Note that some input devices may also read back data from hardware to confirm that the user defined values are applied correctly.

The main interface consists of a list of Channels. By default only the physically relevant information is shown. By entering the advanced mode, additional channel parameters can be configured. The configuration can be exported and imported, though once all channels have been setup it is sufficient to only load values which can be done using a file dialog or from the context menu of an appropriate file in the Explorer. After loading the configurations or values, a change log will be available in the Text plugin to quickly identify what has changed. Each device also comes with a display and a live display. The current values can also be plotted to get a quick overview and identify any unusual values.

class SignalCommunicate(*args: Any, **kwargs: Any)

Bundle pyqtSignals.

appendDataSignal

Signal that triggers appending of data from channels to history.

alias of bool

appendData(nan: bool = False, skipPlotting: bool = False) None

Append data from device acquisition to channels and updates plots.

Parameters:
  • nan (bool, optional) – Indicates that a nan value should be appended to prevent interpolation through areas without data. Defaults to False

  • skipPlotting (bool, optional) – Skip plotting if previous plot was too recent, defaults to False

appendOutputData(h5file: File, useDefaultFile: bool = False) None

Append Device data to hdf file.

Parameters:
  • h5file (h5py.File) – The file to which append the data.

  • useDefaultFile (bool, optional) – Use all data when appending to default file, defaults to False

applyValues(apply: bool = False) None

Apply Channel values to physical devices. Only used by input devices.

Parameters:

apply (bool, optional) – If False, only values that have changed since last apply will be updated, defaults to False

bufferLagging(wait: int = 5) bool

Wait for excess events to be processed.

Only call from parallel thread, e.g. during testing or scanning!

Parameters:

wait (int) – Indicates how long the thread should wait to allow lag to recover, defaults to 5

clearHistory() None

Clear all data history for this device. Should only be needed if history gets out of sync and needs clean initialization.

close() bool

Close plugin cleanly without leaving any data or communication running.

Extend to make sure your custom data and custom communication is closed.

closeCommunication() None

Stop all communication of this Device.

Make sure that final calls to device are send from main thread or use a delay so they are not send after connection has terminated.

deleteChannel() None

Delete the currently selected channel.

duplicateChannel() None

Duplicates the currently selected channel.

errorCountChanged() None

Start a timer to reset error count if no further errors occur.

estimateStorage() None

Estimates storage space required to save maximal history depending on sample rate, number of channels, and backgrounds.

exportOutputData(useDefaultFile: bool = False) None

Export output data.

Parameters:

useDefaultFile (bool, optional) – Add configuration to default file, defaults to False

finalizeInit() None

Execute final initialization code after all other Plugins are initialized.

Use this for code that modifies other Plugins, e.g. adding an Action to the DeviceManager.

getDefaultSettings() dict[str, dict]

Define a dictionary of parameterDict() which specifies default settings for this plugin.

Overwrite or extend as needed to define specific settings that will be added to Settings section. NOTE: While settings with attributes will be automatically accessible, it is good practice to define the type of the attribute for type checking.

Returns:

Settings dictionary

Return type:

{parameterDict()}

getSupportedFiles() list[str]

Return supported file types.

getUnit() str

Overwrite if you want to change units dynamically.

initGUI() None

Initialize the graphic user interface (GUI), independent of all other plugins.

initializeCommunication() None

Initialize communication of device or channel controllers.

property initialized: bool

Extend or overwrite to indicate when the device is initialized.

Default implementation works when using DeviceController.

inout: INOUT

Flag specifying if this is an input or output device.

intervalChanged() None

Extend to add code to be executed in case the Interval changes.

loadData(file: Path, showPlugin: bool = True) None

Load and displays data from file.

This should only be called for files where supportsFile() returns True. Overwrite depending on data supported by the plugin.

Parameters:
  • file (pathlib.Path) – File from which to load data.

  • showPlugin (bool, optional) – Show plugin after loading data, defaults to True. Some files are handled by multiple plugins and only one of them should be shown by default.

measureInterval(reset: bool = True) None

Measures interval since last successful plotting.

Parameters:

reset (bool, optional) – Only reset if plotting was successful or not required, defaults to True

moveChannel(up: bool) None

Move the channel up or down in the list of channels.

Parameters:

up (bool) – Move up if True, else down.

name: str = 'Device'

A unique name that will be used in the graphic user interface. Plugins can be accessed directly from the Console using their name.

optional: bool = True

Defines if the user can deactivate the plugin in the PluginManager user interface.

property plotableChannels: bool

Extend or overwrite to indicate when the device has plotable channels.

Default implementation works when using DeviceController.

pluginType: PLUGINTYPE = 'Input Device'

Devices are categorized as input or output devices. Overwrite with OUTPUTDEVICE after inheriting if applicable.

restoreOutputData() None

Restore data from internal restore file.

runDataThread(recording: Callable) None

Regularly triggers appending and plotting of data.

This uses the current value of channels which is updated independently by the corresponding DeviceController.

Parameters:

recording (Callable) – Queries recording state.

runTestParallel() None

Run a series of tests by changing values of selected controls and triggering the corresponding events.

Extend and add call to super().runTestParallel() to the end to make sure testing flag is set to False after all test completed.

setBackground() None

Set the background based on current channel values.

Only used by output devices.

setOn(on: bool | None = None) None

Toggles device on state.

Parameters:

on (bool, optional) – Requested state, defaults to None. Extended versions of this function may perform tasks based on self.isOn() even if on=None.

startAcquisition() None

Start device Acquisition.

Default implementation works when using DeviceController.

stopAcquisition() None

Stop device acquisition.

Communication stays initialized! Default implementation works when using DeviceController.

subtractBackgroundActive() bool

Indicate if backgrounds should be subtracted.

subtractBackgroundChanged() None

Update plot if background subtraction is toggled.

toggleRecording(on: bool | None = None, manual: bool = False) None

Turn recording on or off or toggles state.

Data will be plotted in LiveDisplay if that is active. Extend to add recoding logic for devices.

Parameters:
  • on (bool, optional) – If True recording will be turned on, if False it will be turned off. If already on or off nothing happens. If None, recording is toggled.

  • manual (bool, optional) – If True, signal was send directly from corresponding live display. Otherwise might be send from device manager

unit: str = 'unit'

Unit used in user interface.

updateTheme() None

Change between dark and light themes.

Most controls should update automatically as the color pallet is changed. Only update the remaining controls using style sheets. Extend to adjust colors to app theme.

updateValues(N: int = 2, apply: bool = False) None

Update channel values based on equations.

This minimal implementation will not give a warning about circular definitions. It will also fail if expressions are nested on more than N levels but N can be increased as needed. N=2 should however be sufficient for day to day work. More complex algorithms should only be implemented if they are required to solve a practical problem.

Parameters:
  • N (int, optional) – Number of iterations, defaults to 2

  • apply (bool, optional) – If False, only values that have changed since last apply will be updated, defaults to False

useBackgrounds: bool = False

If True, the device implements controls to define and subtract background signals.

version: str = 1.0

The version of the plugin. Plugins are independent programs that require independent versioning and documentation.

class esibd.plugins.DeviceManager(*args: Any, **kwargs: Any)

Bundle functionality of devices and thus allows to initialize, start, and stop data acquisition from all devices with a single click.

In the Advanced mode it allows to import all channels of all devices from a single file. Ideally, plugins that control potentially dangerous hardware like power supplies, cryo coolers, or vacuum valves should add a status icon to the device manager, so that their status is visible at all times and they can be shut down quickly, even when the corresponding plugin tab is is not selected. Internally, the device manager also serves as a central interface to all data channels, independent of the devices they belong to, making it easy to setup collection of any number of output signals as a function of any number of input signals.

class SignalCommunicate(*args: Any, **kwargs: Any)

Bundle pyqtSignals.

closeCommunicationSignal

Signal that triggers stop communication.

storeSignal

Signal that triggers storage of device data.

afterFinalizeInit() None

Execute after all other plugins are finalized.

channels(inout: INOUT = INOUT.BOTH) list[Channel]

Get a flat list of all channels based on device type.

Parameters:

inout (INOUT, optional) – Type of device, defaults to INOUT.BOTH

Returns:

List of channels.

Return type:

list[Channel]

clearPlot() None

Clear plots for all plugins.

close() bool

Close plugin cleanly without leaving any data or communication running.

Extend to make sure your custom data and custom communication is closed.

closeCommunication(manual: bool = False, closing: bool = False, message: str = 'Stopping communication.') None

Close all communication.

Parameters:
  • manual (bool, optional) – Indicates if triggered by user and needs confirmation dialog before proceeding. Defaults to False

  • closing (bool, optional) – Indicate that the application is closing, defaults to False

  • message (str, optional) – Message indicating that the communication is stopped. Optionally add reason. Defaults to ‘Stopping communication.’

documentation: str = 'The device manager, by default located below the live displays, bundles\n    functionality of devices and thus allows to initialize, start, and stop\n    data acquisition from all devices with a single click. In the Advanced mode it allows to\n    import all channels of all devices from a single file. Ideally, plugins\n    that control potentially dangerous hardware like power supplies, cryo\n    coolers, or vacuum valves should add a status icon to the device\n    manager, so that their status is visible at all times and they can be\n    shut down quickly, even when the corresponding plugin tab is is not\n    selected. Internally, the device manager also serves as a\n    central interface to all data channels, independent of the devices they\n    belong to, making it easy to setup collection of any output\n    signals as a function of any input signals.'

The plugin documentation used in the internal about dialog in the Browser. If None, the doc string __doc__ will be used instead. The latter may contain rst commands for sphinx documentation which should not be exposed to the user.

exportConfiguration(file: Path | None = None, useDefaultFile: bool = False) None

Export configuration for multiple Devices and ChannelManagers.

Parameters:
  • file (pathlib.Path, optional) – The file to add the configuration to, defaults to None

  • useDefaultFile (bool, optional) – Indicates if the default should be used, defaults to False

exportOutputData(file: Path | None = None) None

Export output data for all active LiveDisplays.

Parameters:

file (Path | None, optional) – The file to which the data should be added, defaults to None

finalizeInit() None

Execute final initialization code after all other Plugins are initialized.

Use this for code that modifies other Plugins, e.g. adding an Action to the DeviceManager.

getActiveLiveDisplays() list[LiveDisplay]

Get all active liveDisplays.

getActiveStaticDisplays() list[StaticDisplay]

Get all active staticDisplays.

getChannelByName(name: str, inout: INOUT = INOUT.BOTH) Channel | None

Get channel based on unique name and type.

Parameters:
  • name (str) – Unique channel name.

  • inout (INOUT, optional) – Type of channel, defaults to BOTH

Returns:

The requested channel.

Return type:

Channel

getDefaultSettings() dict[str, dict[str, str | Path | int | float | PyQt6.QtGui.QColor | bool | PyQt6.QtWidgets.QTreeWidget | PARAMETERTYPE | PyQt6.QtWidgets.QWidget | Callable | None]]

Define a dictionary of parameterDict() which specifies default settings for this plugin.

Overwrite or extend as needed to define specific settings that will be added to Settings section. NOTE: While settings with attributes will be automatically accessible, it is good practice to define the type of the attribute for type checking.

Returns:

Settings dictionary

Return type:

{parameterDict()}

getDevices(inout: INOUT = INOUT.BOTH) list[ChannelManager] | list[Device]

Get devices depending on device type.

Parameters:

inout (INOUT, optional) – Type of device, defaults to INOUT.BOTH

Returns:

List of devices

Return type:

list[Device]

getInputDevices() list[Device]

Get all input devices.

getOutputDevices() list[Device]

Get all output devices.

getRelays() list[ChannelManager]

Get all channel managers. These usually do not have real channels but channels that link to device channels in other plugins.

globalUpdate(apply: bool = False, inout: INOUT = INOUT.BOTH) None

Update channel values based on equations for all devices of provided type.

Parameters:
  • apply (bool, optional) – Indicates if values should be applied to devices, even if they have not changed. Defaults to False

  • inout (INOUT, optional) – Type of device to evaluate, defaults to INOUT.BOTH

iconFile: str = 'DeviceManager.png'

Default icon file. Expected to be in dependencyPath.

initDock() None

Initialize the DockWidget.

initGUI() None

Initialize the graphic user interface (GUI), independent of all other plugins.

initializeCommunication() None

Initialize communication for all Devices and ChannelManagers.

initialized() bool

Indicate if communication to at least one device is initialized.

livePlot(apply: bool = False) None

Update plots for all active liveDisplays.

Parameters:

apply (bool, optional) – Indicates if plot curves should be recreated or just updated. Defaults to False

loadConfiguration() None

Load configuration of all devices from a single file.

loadData(file: Path, showPlugin: bool = True) None

Load and displays data from file.

This should only be called for files where supportsFile() returns True. Overwrite depending on data supported by the plugin.

Parameters:
  • file (pathlib.Path) – File from which to load data.

  • showPlugin (bool, optional) – Show plugin after loading data, defaults to True. Some files are handled by multiple plugins and only one of them should be shown by default.

name: str = 'DeviceManager'

A unique name that will be used in the graphic user interface. Plugins can be accessed directly from the Console using their name.

optional: bool = False

Defines if the user can deactivate the plugin in the PluginManager user interface.

pluginType: PLUGINTYPE = 'DeviceManager'

The type defines the location of the plugin in the user interface and allows to run operations on a group of plugins with the same type using getPluginsByType().

property recording: bool

Indicates if at least one device is recording.

restoreConfiguration() None

Load configuration and settings for all devices and scans.

runTestParallel() None

Run a series of tests by changing values of selected controls and triggering the corresponding events.

Extend and add call to super().runTestParallel() to the end to make sure testing flag is set to False after all test completed.

stopRecording() None

Stop recording for all devices. Communication stays active.

stopScans(closing: bool = False) None

Stop all scans and waits for them to finish.

Parameters:

closing (bool, optional) – Indicate that the application is closing and needs to wait for scans to finish. Defaults to False

store() None

Regularly stores device settings and data to minimize loss in the event of a program crash.

toggleAdvanced(advanced: bool | None = False) None

Overwrite to show advanced options.

Parameters:

advanced (bool, optional) – Indicates if advanced options should be visible, defaults to None

toggleRecording() None

Toggle recording of data.

updateStaticPlot() None

Update all staticPlots.

useAdvancedOptions: bool = True

Adds toolbox icon to show advanced plugin options.

version: str = '1.0'

The version of the plugin. Plugins are independent programs that require independent versioning and documentation.

class esibd.plugins.LiveDisplay(*args: Any, **kwargs: Any)

Live displays show the history of measured data over time.

Use the start/pause icon to control data recording. The toolbar provides icons to initialize and stop acquisition, optionally subtract backgrounds, or export displayed data to the current session. Data is only collected if the corresponding live display is visible. The length of the displayed history is determined by the display time control in the tool bar.

Frequently updating those plots is typically the computationally most expensive action. Thus you might want to reduce the number of displayed data points in the acquisition settings. This will make sure that the graphs are updated less frequently and select a smaller but consistent subset of data points for a smooth visualization. While PyQtGraph provides its own algorithms for down sampling data (accessible via the context menu), they tend to cause a flicker when updating data.

class GroupActionState(value)

States for the Group Action.

class StackActionState(value)

States for the Stack Action.

autoRangeY(autorange: bool = True) None

Auto range y axis of all livePlotWidgets.

Parameters:

autorange (bool, optional) – Indicates if autorange should be applied, defaults to True

clearPlot() None

Clear all references to plotCurves, plotItems, and legends.

To be recreated if needed.

closeGUI() None

Close the user interface but might keep data available in case the user interface is restored later.

Closes all open references. Extend to save data and make hardware save if needed.

closeUserGUI() None

Perform additional closing actions when user is closing the plugin GUI.

copyClipboard() None

Extend matplotlib based version to add support for pyqtgraph.

displayTimeChanged() None

Adjust displayed section to display time and activates autorange.

documentation: str = 'Live displays show the history of measured data over time.\n    Use the start/pause icon to control data recording. The toolbar\n    provides icons to initialize and stop acquisition, optionally\n    subtract backgrounds, or export displayed data to the current session.\n    Data is only collected if the corresponding live display is visible.\n    The length of the displayed history is determined by the display time\n    control in the tool bar.\n\n    Frequently updating those plots is typically the computationally most\n    expensive action. Thus you might want to reduce\n    the number of displayed data points in the Settings. This will make sure that\n    the graphs are updated less frequently and select a smaller but\n    consistent subset of data points for a smooth visualization. While\n    PyQtGraph provides its own algorithms for down sampling data (accessible\n    via the context menu), they tend to cause a flicker when updating data.'

The plugin documentation used in the internal about dialog in the Browser. If None, the doc string __doc__ will be used instead. The latter may contain rst commands for sphinx documentation which should not be exposed to the user.

finalizeInit() None

Execute final initialization code after all other Plugins are initialized.

Use this for code that modifies other Plugins, e.g. adding an Action to the DeviceManager.

getDisplayTime() float

Get displaytime independent of displayTimeComboBox.

getGroups() dict[str, list[Channel]]

Return Channel groups, sorted by device, unit, group, or unsorted.

Returns:

Channel groups.

Return type:

dict[str, list[esibd.core.Channel]]

getIcon(desaturate: bool = False) Icon

Get the plugin icon. Consider using a themed icon that works in dark and light modes.

Overwrite only if definition of iconFile and iconFileDark is not sufficient.

Parameters:

desaturate (bool, optional) – Indicates if color should be removed from icon, defaults to False

Returns:

Icon

Return type:

Icon

getTimeAxes() dict[str, tuple[int, int | None, int, ndarray[Any, dtype[float64]]]]

Return the time axes for all devices.

Returns:

List of time axes for all relevant devices.

Return type:

dict[str, tuple[int, int, int, np.ndarray]]

initFig() None

Initialize a figure.

Will be called when a display is closed and reopened or the theme is changed. Overwrite your figure initialization here to make sure all references are updated correctly.

initGUI() None

Initialize the graphic user interface (GUI), independent of all other plugins.

parentPlugin: ChannelManager

A Plugin that acts as a parent by providing references for and using this plugin

plot(apply: bool = False) None

Plot the enabled and initialized channels in the main output plot.

The x axis is either time or a selected channel.

Parameters:

apply (bool) – Apply most recent data, otherwise update rate depends on data thinning.

plotChannel(livePlotWidget: PlotWidget | PlotItem | ViewBox, timeAxes: dict[str, tuple[int, int | None, int, ndarray]], channel: Channel, apply: bool) None

Plot a channel.

Parameters:
  • livePlotWidget (PlotWidget) – The PlotWidget used to display Channel values.

  • timeAxes (np.ndarray) – The time axis.

  • channel (esibd.core.Channel) – Channels to plot.

  • apply (bool) – Recreates all plots from scratch if True.

plotGroup(livePlotWidget: PlotWidget | PlotItem | ViewBox, timeAxes: dict[str, tuple[int, int | None, int, ndarray]], channels: list[Channel], apply: bool) None

Plot a group of Channels.

Parameters:
  • livePlotWidget (PlotWidget) – The PlotWidget used to display Channel values.

  • timeAxes (np.ndarray) – The time axis.

  • channels (list[esibd.core.Channel]) – List of Channels in group.

  • apply (bool) – Recreates all plots from scratch if True.

pluginType: PLUGINTYPE = 'LiveDisplay'

The type defines the location of the plugin in the user interface and allows to run operations on a group of plugins with the same type using getPluginsByType().

provideDock() bool

Add existing dock to UI at position defined by esibd.plugins.Plugin.pluginType.

Always call from the main_thread.

runTestParallel() None

Run a series of tests by changing values of selected controls and triggering the corresponding events.

Extend and add call to super().runTestParallel() to the end to make sure testing flag is set to False after all test completed.

subtractBackgroundChanged() None

Relays change of background subtraction to corresponding action in parentPlugin.

toggleAdvanced(advanced: bool | None = False) None

Overwrite to show advanced options.

Parameters:

advanced (bool, optional) – Indicates if advanced options should be visible, defaults to None

updateMouseEnabled(x: bool, y: bool | None = None) None

Set same x mouse enabled state for all livePlotWidgets.

Parameters:
  • x (bool) – x mouse enabled

  • y (bool) – y mouse enabled

updateStackedViews() None

Ensure stacked views use same x axis.

updateTheme() None

Change between dark and light themes.

Most controls should update automatically as the color pallet is changed. Only update the remaining controls using style sheets. Extend to adjust colors to app theme.

useAdvancedOptions: bool = True

Adds toolbox icon to show advanced plugin options.

class esibd.plugins.PID(*args: Any, **kwargs: Any)

Allow to connect an input (controlling) and output (controlled) channel via PID logic.

Whenever the output changes, the input will be adjusted to stabilize the output to its setpoint. Proportional: If you’re not where you want to be, get there. Integral: If you haven’t been where you want to be for a long time, get there faster. Derivative: If you’re getting close to where you want to be, slow down.

class PIDChannel(*args: Any, **kwargs: Any)

Minimal UI for abstract PID channel.

connectSource(giveFeedback: bool = False) None

Connect the source and inputChannels.

Parameters:

giveFeedback (bool, optional) – Report on success of connection, defaults to False

findChannel(name: str, DEVICE: str) tuple[Channel | None, str]

Find the source or inputChannel based on its name and sets its device icon.

Parameters:
  • name (str) – Channel name.

  • DEVICE (str) – Input or Outputdevice icon parameter

Returns:

channel, notes

Return type:

Channel, str

getDefaultChannel() dict[str, dict]

Define Parameter(s) of the default Channel.

This is also use to assign parameterTypes, if Parameters are visible outside of advanced mode, and many other parameter properties. See parameterDict(). If parameters do not exist in the settings file, the default Parameter will be added. Overwrite in dependent classes as needed.

NOTE: While parameters with attributes will be automatically accessible, it is good practice to define the type of the attribute for type checking.

initGUI(item: dict) None

Initialize Channel GUI.

Call after corresponding QTreeWidgetItem has been added to tree. Item needs parent for all graphics operations.

Parameters:

item (dict) – Dictionary containing all channel information.

monitorChanged() None

Disable internal monitor event.

onDelete() None

Extend to handle events on deleting. E.g. handle references that should remain available.

removeEvents() None

Remove extra events from sourceChannel.

setDisplayedParameters() None

Determine which parameters to use and in what order.

Extend using insertDisplayedParameter() to add more parameters.

stepPID() None

Set inputChannel.value based on sourceChannel.value and PID state.

tempParameters() list[str]

List of parameters, such as live signal or status, that will not be saved and restored.

updatePID() None

Update P, I, and D in the pid controller based on the channel values.

updateSampleTime() None

Update the sample time in the pid controller based on the channel value.

updateSetpoint() None

Update the setpoint in the pid controller based on the channel value.

valueChanged() None

Update PID when setpoint changed.

afterFinalizeInit() None

Execute after all other plugins are finalized.

channelType

alias of PIDChannel

channels: list[PIDChannel]

List of channels.

connectAllSources(update: bool = False) None

Connect all available source channels.

Parameters:

update (bool, optional) – Indicates that all channels should be (re-)connected. Otherwise will only attempt to connect channels that are not yet connected. Defaults to False

duplicateChannel() None

Duplicates the currently selected channel.

getChannels() list[Channel]

Get channels. Overwrite to return subsets based on channel state.

iconFile: str = 'PID.png'

Default icon file. Expected to be in dependencyPath.

loadConfiguration(file: Path | None = None, useDefaultFile: bool = False, append: bool = False) None

Load channel configuration from file.

If only values should be loaded without complete reinitialization, use loadValues instead.

Parameters:
  • file (pathlib.Path, optional) – File from which to load configuration, defaults to None

  • useDefaultFile (bool, optional) – Use internal configuration file if True, defaults to False

  • append (bool, optional) – True if changelog should be appended to previous change logs, e.g. when loading from multiple devices at once. Defaults to False

loadData(file: Path, showPlugin: bool = True) None

Load and displays data from file.

This should only be called for files where supportsFile() returns True. Overwrite depending on data supported by the plugin.

Parameters:
  • file (pathlib.Path) – File from which to load data.

  • showPlugin (bool, optional) – Show plugin after loading data, defaults to True. Some files are handled by multiple plugins and only one of them should be shown by default.

moveChannel(up: bool) None

Move the channel up or down in the list of channels.

Parameters:

up (bool) – Move up if True, else down.

name: str = 'PID'

A unique name that will be used in the graphic user interface. Plugins can be accessed directly from the Console using their name.

optional: bool = True

Defines if the user can deactivate the plugin in the PluginManager user interface.

pluginType: PLUGINTYPE = 'Channel Manager'

The type defines the location of the plugin in the user interface and allows to run operations on a group of plugins with the same type using getPluginsByType().

reconnectSource(name: str) None

Try to reconnect linked channels if applicable.

This is needed e.g. after renaming, moving, or deleting channels. If the channel has been deleted, the reconnection attempt will fail and and the linking channel will indicated that no source has been found.

Parameters:

name (str) – Name of the channel to reconnect.

updateTheme() None

Change between dark and light themes.

Most controls should update automatically as the color pallet is changed. Only update the remaining controls using style sheets. Extend to adjust colors to app theme.

useDisplays = False

use liveDisplay, StaticDisplay, ChannelPlot, and all related functionality.

useMonitors = True

Use record monitors and compare them to set points.

useOnOffLogic = True

Creates an Action in the DeviceManager that handles turning key functions on and off.

version: str = '1.0'

The version of the plugin. Plugins are independent programs that require independent versioning and documentation.

class esibd.plugins.Plugin(*args: Any, **kwargs: Any)

Plugins abstract basic GUI code for devices, scans, and other high level UI elements.

All plugins are ultimately derived from the Plugin class. The doc string of the plugin class will be shown in the corresponding help window unless documentation is implemented explicitly.

class SignalCommunicate(*args: Any, **kwargs: Any)

Bundle pyqtSignals.

about() None

Display the about dialog of the plugin using the Browser.

addAction(event: Callable | None = None, toolTip: str = '', *, icon: Icon | str, before: QAction | None = None) Action

Add a simple Action to the toolBar.

Parameters:
  • event (method, optional) – The function triggered by the action, defaults to None

  • toolTip (str, optional) – The toolTip of the action, defaults to ‘’

  • icon (Icon, optional) – The icon of the action

  • before (Action, optional) – The existing action before which the new action will be placed, defaults to None. If None, the new action will be added to the end.

Returns:

The new Action

Return type:

Action

addContentLayout(layout: PyQt6.QtWidgets.QLayout) None

Use this to add a content layout instead of a content widget to the user interface.

Parameters:

layout (QLayout) – Content layout

addContentWidget(contentWidget: PyQt6.QtWidgets.QWidget) None

Use this to add your main content widget to the user interface.

Parameters:

contentWidget (QWidget) – Content widget

addMultiStateAction(states: list[MultiState], event: Callable | None = None, before: QAction | None = None, attr: str = '', restore: bool = True, defaultState: int = 0) MultiStateAction

Add an action with can be toggled between two states, each having a dedicated tooltip and icon.

Parameters:
  • event (method, optional) – The function triggered by the stateAction, defaults to None

  • states (list[MultiState], optional) – The list of states the control can represent, defaults to a list of empty states

  • before (Action, optional) – An existing action or stateAction before which the new action will be placed, defaults to None. If None, the new stateAction will be added to the end.

  • attr (str, optional) – Used to save and restore state, defaults to ‘’

  • restore (bool, optional) – If True state will be restored when the program is restarted, defaults to True

  • defaultState (int, optional) – Index of default state, defaults to 0

Returns:

The new StateAction

Return type:

StateAction

addRightAxis(ax: matplotlib.axes.Axes) None

Add additional y labels on the right.

Parameters:

ax (matplotlib.axes) – A matplotlib axes.

addStateAction(event: Callable | None = None, toolTipFalse: str = '', *, iconFalse: Icon, toolTipTrue: str = '', iconTrue: Icon | None = None, before: Action | None = None, attr: str = '', restore: bool = True, defaultState: bool = False) StateAction

Add an action with can be toggled between two states, each having a dedicated tooltip and icon.

Parameters:
  • event (method, optional) – The function triggered by the stateAction, defaults to None

  • toolTipFalse (str, optional) – The toolTip of the stateAction if state is False, defaults to ‘’

  • iconFalse (Icon, optional) – The icon of the stateAction if state is False.

  • toolTipTrue (str, optional) – The toolTip of the stateAction if state is True, defaults to ‘’

  • iconTrue (Icon, optional) – The icon of the stateAction if state is True, defaults to None

  • before (Action, optional) – An existing action or stateAction before which the new action will be placed, defaults to None. If None, the new stateAction will be added to the end.

  • attr (str, optional) – used to save and restore state, defaults to ‘’

  • restore (bool, optional) – If True state will be restored when the program is restarted, defaults to True

  • defaultState (bool, optional) – Default state as saved by qSettings, defaults to False

Returns:

The new StateAction

Return type:

StateAction

addToolbarStretch() None

Add a dummy action that can be used to stretch the gap between actions on the left and right of a toolbar.

afterFinalizeInit() None

Execute after all other plugins are finalized.

axes: list[matplotlib.axes.Axes]

The axes of fig.

bufferLagging(wait: int = 5) bool

Wait for excess events to be processed.

Only call from parallel thread, e.g. during testing or scanning!

Parameters:

wait (int) – Indicates how long the thread should wait to allow lag to recover, defaults to 5

close() bool

Close plugin cleanly without leaving any data or communication running.

Extend to make sure your custom data and custom communication is closed.

closeGUI() None

Close the user interface but might keep data available in case the user interface is restored later.

Closes all open references. Extend to save data and make hardware save if needed.

closeUserGUI() None

Perform additional closing actions when user is closing the plugin GUI.

copyClipboard() None

Copy matplotlib figure to clipboard.

copyLineDataClipboard(line: Line2D) None

Copy data as text to clipboard.

Parameters:

line (Line2D) – The line with the data do be copied.

defaultLabelPlot() None

Add file name labels to plot to trace back which file it is based on.

dependencyPath: Path = WindowsPath('.')

Path to the plugin file defining the plugin. Can be used to locate corresponding dependencies like external scripts or media which are stored next to the plugin file or in sub folders relative to its location.

disconnect_all_signals() None

Disconnect all signals.

displayActive() bool

Indicate if the display is active.

dock: DockWidget | None

The dockWidget that allows to float and rearrange the plugin user interface.

documentation: str = ''

The plugin documentation used in the internal about dialog in the Browser. If None, the doc string __doc__ will be used instead. The latter may contain rst commands for sphinx documentation which should not be exposed to the user.

fig: Figure | None

A figure, initialized e.g. using plt.figure(constrained_layout=True, dpi=getDPI()) and followed by self.makeFigureCanvasWithToolbar(self.fig).

finalizeInit() None

Execute final initialization code after all other Plugins are initialized.

Use this for code that modifies other Plugins, e.g. adding an Action to the DeviceManager.

generatePythonPlotCode() str

Provide plugin specific code to plot data exported by the plugin independently.

This is a starting point to reproduce and adjust figures e.g. for publications or independent data analysis.

Returns:

Python plot code

Return type:

str

getDefaultSettings() dict[str, dict[str, str | Path | int | float | PyQt6.QtGui.QColor | bool | PyQt6.QtWidgets.QTreeWidget | PARAMETERTYPE | PyQt6.QtWidgets.QWidget | Callable | None]]

Define a dictionary of parameterDict() which specifies default settings for this plugin.

Overwrite or extend as needed to define specific settings that will be added to Settings section. NOTE: While settings with attributes will be automatically accessible, it is good practice to define the type of the attribute for type checking.

Returns:

Settings dictionary

Return type:

{parameterDict()}

getIcon(desaturate: bool = False) Icon

Get the plugin icon. Consider using a themed icon that works in dark and light modes.

Overwrite only if definition of iconFile and iconFileDark is not sufficient.

Parameters:

desaturate (bool, optional) – Indicates if color should be removed from icon, defaults to False

Returns:

Icon

Return type:

Icon

getSupportedFiles() list[str]

Return supported file types.

getToolBarActionsHTML() str

Return HTML code that lists all toolbar actions including the corresponding icons.

Returns:

HTML code documenting toolbar actions.

Return type:

str

hdfUpdateVersion(file: File) None

Update version in the Info group.

Parameters:

file (h5py.File) – The file in which to update the version.

iconFile: str = ''

Default icon file. Expected to be in dependencyPath.

iconFileDark: str = ''

Default icon file for dark mode. Expected to be in dependencyPath. Will fallback to iconFile.

imageToClipboard(image: QPixmap | QImage) None

Set an image to the clipboard.

While testing, images are written to files instead of clipboard for later inspection and to not spam the clipboard.

Parameters:

image (QPixmap | QImage) – The image to be set to the clipboard.

initDock() None

Initialize the DockWidget.

initFig() None

Initialize a figure.

Will be called when a display is closed and reopened or the theme is changed. Overwrite your figure initialization here to make sure all references are updated correctly.

initGUI() None

Initialize the graphic user interface (GUI), independent of all other plugins.

initializedDock: bool

A flag signaling if the plugin dock has been initialized. You may want to ignore certain events before initialization is complete.

initializedGUI: bool

A flag signaling if the plugin graphical user interface has been initialized. You may want to ignore certain events before initialization is complete.

labelAxis: matplotlib.axes.Axes = None

Axis used for plot labels.

labelPlot(label: str) None

Add file name labels to plot to trace back which file it is based on.

Parameters:
  • ax (matplotlib.axes.Axes) – A matplotlib axes.

  • label (str) – The plot label.

line: Line2D

A line to store matplotlib lines for simple displays.

loadData(file: Path, showPlugin: bool = True) None

Load and displays data from file.

This should only be called for files where supportsFile() returns True. Overwrite depending on data supported by the plugin.

Parameters:
  • file (pathlib.Path) – File from which to load data.

  • showPlugin (bool, optional) – Show plugin after loading data, defaults to True. Some files are handled by multiple plugins and only one of them should be shown by default.

property loading: bool

A flag that can be used to suppress certain events while loading data or initializing the user interface.

Make sure the flag is reset after every use. Internal logic allows nested use.

lock: TimeoutLock

Locks are used to make sure methods decorated with @synchronized() cannot run in parallel, but one call has to be completed before the next.

makeCoreIcon(file: str, desaturate: bool = False) Icon

Return an icon based on a filename. Looks for files in the dependencyPath().

Parameters:
  • file (str) – Icon file name.

  • desaturate (bool, optional) – Indicates if color should be removed from icon, defaults to False

Returns:

Icon

Return type:

Icon

makeFigureCanvasWithToolbar(figure: matplotlib.figure.Figure) None

Create canvas, which can be added to the user interface, and adds the corresponding navToolBar to the plugin titleBar.

Parameters:

figure (matplotlib.figure.Figure) – A matplotlib figure.

makeIcon(file: str, path: Path | None = None, desaturate: bool = False) Icon

Return an icon based on a filename. Looks for files in the dependencyPath() unless otherwise specified.

Parameters:
  • file (str) – Icon file name.

  • path (pathlib.Path, optional) – The file path to the icon.

  • desaturate (bool, optional) – Indicates if color should be removed from icon, defaults to False

Returns:

Icon

Return type:

Icon

name: str = ''

A unique name that will be used in the graphic user interface. Plugins can be accessed directly from the Console using their name.

optional: bool = True

Defines if the user can deactivate the plugin in the PluginManager user interface.

parentPlugin: Plugin

A Plugin that acts as a parent by providing references for and using this plugin

plot() None

If applicable, overwrite with a plugin specific plot method.

pluginManager: PluginManager

A reference to the central PluginManager.

pluginType: PLUGINTYPE = 'Internal'

The type defines the location of the plugin in the user interface and allows to run operations on a group of plugins with the same type using getPluginsByType().

previewFileTypes: list[str]

File extensions that are supported by this plugin. If a corresponding file is selected in the Explorer(), the plugins loadData() function will be called.

print(message: str, flag: PRINT = PRINT.MESSAGE) None

Send a message to stdout, the statusbar, the Console, and to the logfile.

It will automatically add a timestamp and the name of the sending plugin.

Parameters:
  • message (str) – A short informative message.

  • flag (PRINT(), optional) – Flag used to adjust message display, defaults to MESSAGE

processEvents() None

Process all open events in the event loop before continuing. Is ignored in testmode where this could lead to a dead lock.

provideDock() bool

Add existing dock to UI at position defined by esibd.plugins.Plugin.pluginType.

Always call from the main_thread.

provideFig() None

Create or reinitialize a matplotlib figure.

raiseDock(showPlugin: bool = True) None

Raise dock if showPlugin is True.

Parameters:

showPlugin (bool, optional) – Only show one plugin, even though multiple plugins may load a file, defaults to True

removeAnnotations(ax: matplotlib.axes.Axes) None

Remove all annotations from an axes.

Parameters:

ax (matplotlib.axes.Axes) – A matplotlib axes.

requireGroup(group: Group, name: str) Group

Replace require_group from h5py, and adds support for track_order.

Parameters:
  • group (h5py.Group) – Valid group.

  • name (str) – Name of new group.

Returns:

New group.

Return type:

h5py.Group

requiredPlugin(name: str) None

Display error message if required plugin is not available.

Parameters:

name (str) – Name of required Plugin.

resizing: bool = False

Indicate if the plugin is resizing. May be used to increase performance by suppressing updates while resizing.

runTestParallel() None

Run a series of tests by changing values of selected controls and triggering the corresponding events.

Extend and add call to super().runTestParallel() to the end to make sure testing flag is set to False after all test completed.

scan = None

A Scan() that provides content to display.

setFloat() None

Turn the plugin into a popup. It can be combined with others or docked in another place in the main window.

setLabelMargin(ax: matplotlib.axes.Axes, margin: float) None

Set top margin only, to reserve space for file name label.

Parameters:
  • ax (matplotlib.axis.Axes) – The axis to which to add the top margin

  • margin (float) – The margin to add. 0.15 -> add 15 % margin

stopTest() None

Stop testing.

supportedVersion: str = '0.8'

By default the current program version is used. You can define a fixed plugin version and future program versions will state that they are incompatible with this plugin. This can be used to prompt developers to update and test their plugins before distributing them for a more recent program version.

supportsFile(file: Path) bool

Test if a file is supported by the plugin, based on file name or content.

Parameters:

file (pathlib.Path) – File that has been selected by the user.

Returns:

Returns True if the file is supported by the plugin. Test if supported based on file extension or content.

Return type:

bool

test() None

Runs runTestParallel() in parallel thread.

testComplete() None

Resets testing flag after last test completed.

testControl(control: PushButton | ToolButton | ColorButton | CheckBox | Label | CompactComboBox | LineEdit | LedIndicator | LabviewSpinBox | LabviewDoubleSpinBox | LabviewSciSpinBox | PyQt6.QtGui.QAction | Action | StateAction | MultiStateAction | RestoreFloatComboBox | None, value: Any, delay: float = 0, label: str = '') None

Changes control states and triggers corresponding events.

Parameters:
  • control (ParameterWidgetType) – The control to be tested.

  • value (Any) – The value that should be simulated.

  • delay (float, optional) – Wait this long for event to be processed before proceeding to next test. Defaults to 0

  • label (str, optional) – Custom test message used for logging, defaults to ‘’

testPythonPlotCode(closePopup: bool = False) None

Generate and run python plot code for given file.

Will save figure to file.

Parameters:

closePopup (bool, optional) – Determine if popup should be closed automatically, defaults to False

property testing: bool

Indicates if the plugin, or any other plugin, is currently testing.

tilt_xlabels(ax: matplotlib.axes.Axes, rotation: int = 30) None

Replace autofmt_xdate which is currently not compatible with constrained_layout.

Parameters:
  • ax (matplotlib.axes.Axes) – The axis for which to tilt the labels.

  • rotation (int, optional) – The tilt angle in degrees, defaults to 30

titleBar: QToolBar | None

Actions can be added to the titleBar using addAction() or addStateAction().

titleBarLabel: QLabel | None

The label used in the titleBar.

toggleAdvanced(advanced: bool | None = False) None

Overwrite to show advanced options.

Parameters:

advanced (bool, optional) – Indicates if advanced options should be visible, defaults to None

toggleTitleBar() None

Adjust the title bar layout and titleBarLabel depending on the state of the dock (tabbed, floating, …).

Extend to make sure toggleTitleBar is called for dependent plugins if applicable.

toggleTitleBarDelayed(delay: int = 500) None

Delay toggleTitleBar until GUI updates have been completed.

Parameters:

delay (int, optional) – Delay in ms, defaults to 500

toggleVideoRecorder() None

Toggles visibility of videoRecorderActions.

updateTheme() None

Change between dark and light themes.

Most controls should update automatically as the color pallet is changed. Only update the remaining controls using style sheets. Extend to adjust colors to app theme.

useAdvancedOptions: bool = False

Adds toolbox icon to show advanced plugin options.

version: str = ''

The version of the plugin. Plugins are independent programs that require independent versioning and documentation.

waitForCondition(condition: Callable, interval: float = 0.1, timeout: int = 5, timeoutMessage: str = '') bool

Wait until condition returns False or timeout expires.

This can be safer and easier to understand than using signals and locks. The flag not just blocks other functions but informs them and allows them to react instantly.

Parameters:
  • condition (Callable) – will wait for condition to return True

  • interval (float) – wait interval seconds before checking condition

  • timeout (float) – timeout in seconds

  • timeoutMessage (str) – message displayed if timeout is reached

class esibd.plugins.Scan(*args: Any, **kwargs: Any)

Record any number of outputChannels as a function of any number of inputs.

The main interface consists of a list of scan settings. Each scan comes with a tailored display optimized for its specific data format. Scan settings can be imported and exported from the scan toolbar, though in most cases it will be sufficient to import them from the context menu of a previously saved scan file in the Explorer. When all settings are defined and all relevant channels are communicating the scan can be started. A scan can be stopped at any time. At the end of a scan the corresponding file will be saved to the session path. The filename is displayed inside the corresponding graph to allow to find the file later based on exported figures. Scan files are saved in the widely used HDF5 file format that allows to keep data and metadata together in a structured binary file. External viewers, such as HDFView, or minimal python scripts based on the h5py package can be used if files need to be accessed externally. Use the context menu of a scan file to create a template plot file using h5py and adjust it to your needs.

Note: If the Scan crashes it may be necessary to reset the finished flag before it can be started again: Scan.finished = True.

class Display(*args: Any, **kwargs: Any)

Display for base scan. Extend as needed.

axes: list[matplotlib.axes.Axes]

The axes of fig.

closeGUI() None

Close the user interface but might keep data available in case the user interface is restored later.

Closes all open references. Extend to save data and make hardware save if needed.

finalizeInit() None

Execute final initialization code after all other Plugins are initialized.

Use this for code that modifies other Plugins, e.g. adding an Action to the DeviceManager.

getIcon(desaturate: bool = False) Icon

Get the plugin icon. Consider using a themed icon that works in dark and light modes.

Overwrite only if definition of iconFile and iconFileDark is not sufficient.

Parameters:

desaturate (bool, optional) – Indicates if color should be removed from icon, defaults to False

Returns:

Icon

Return type:

Icon

initFig() None

Initialize a figure.

Will be called when a display is closed and reopened or the theme is changed. Overwrite your figure initialization here to make sure all references are updated correctly.

initGUI() None

Initialize the graphic user interface (GUI), independent of all other plugins.

mouseEvent(event: matplotlib.backend_bases.Event) None

Handle dragging beam in 2D scan or setting retarding grid potential in energy scan.

Parameters:

event (Event) – The mouse event.

pluginType: PLUGINTYPE = 'Display'

The type defines the location of the plugin in the user interface and allows to run operations on a group of plugins with the same type using getPluginsByType().

provideDock() bool

Add existing dock to UI at position defined by esibd.plugins.Plugin.pluginType.

Always call from the main_thread.

runTestParallel() None

Run a series of tests by changing values of selected controls and triggering the corresponding events.

Extend and add call to super().runTestParallel() to the end to make sure testing flag is set to False after all test completed.

test() None

Runs runTestParallel() in parallel thread.

class ScanChannel(*args: Any, **kwargs: Any)

Minimal UI for abstract PID channel.

connectSource(giveFeedback: bool = False) None

Connect the sourceChannel.

Parameters:

giveFeedback (bool, optional) – Report on success of connection, defaults to False

getDefaultChannel() dict[str, dict]

Define Parameter(s) of the default Channel.

This is also use to assign parameterTypes, if Parameters are visible outside of advanced mode, and many other parameter properties. See parameterDict(). If parameters do not exist in the settings file, the default Parameter will be added. Overwrite in dependent classes as needed.

NOTE: While parameters with attributes will be automatically accessible, it is good practice to define the type of the attribute for type checking.

getDevice() Device

SourceChannel.getDevice() if available. Default provided.

initGUI(item: dict) None

Initialize Channel GUI.

Call after corresponding QTreeWidgetItem has been added to tree. Item needs parent for all graphics operations.

Parameters:

item (dict) – Dictionary containing all channel information.

property loading: bool

Indicates if the corresponding device is currently loading.

onDelete() None

Extend to handle events on deleting. E.g. handle references that should remain available.

relayValueEvent() None

Update value when sourceChannel.value changed.

removeEvents() None

Remove extra events from sourceChannel.

setDisplayedParameters() None

Determine which parameters to use and in what order.

Extend using insertDisplayedParameter() to add more parameters.

tempParameters() list[str]

Return list of tempParameters.

ScanChannels are not restored from file, thus every parameter is a tempParameter.

updateDisplay() None

Update live and static displays.

class SignalCommunicate(*args: Any, **kwargs: Any)

Bundle pyqtSignals.

saveScanCompleteSignal

Signal that confirms that scan data has been saved and a new scan can be started.

scanUpdateSignal

Signal that triggers update of the figure and, if True is passed, saving of data.

alias of bool

updateRecordingSignal

Signal that allows to stop recording from an external thread.

alias of bool

class TreeSplitter(*args: Any, **kwargs: Any)

Splitter with optimized layout for Settings and Channel trees of a scan.

resizeEvent(a0: QResizeEvent | None) None

Make sure settingsTree takes up as much space as possible but there is no gap between settingsTree and channelTree.

Parameters:

a0 (QResizeEvent) – The resize event.

addInputChannel(name: str, start: float | None = None, stop: float | None = None, step: float | None = None, unit: str = '', recordingData: ndarray | None = None) ScanChannel | None

Convert channel to generic input data.

Parameters:
  • name (str) – Channel name.

  • start (float) – Start value, defaults to None

  • stop (float) – Final value, defaults to None

  • step (float) – Step size, defaults to None

  • unit (str, optional) – channel unit, defaults to ‘’

  • recordingData (np.ndarray, optional) – Recorded values from previous scan or initialized array for new scan, defaults to None

Returns:

Generic channel that is used to store and restore scan data.

Return type:

esibd.core.ScanChannel

addInputChannels() None

Add all input channels.

Extend to add scan specific input channels.

addOutputChannel(name: str, unit: str = '', recordingData: ndarray | DynamicNp | None = None, recordingBackground: ndarray | None = None) ScanChannel | None

Convert channel to generic output data.

Uses data from file if provided.

Parameters:
  • name (str) – channel name.

  • unit (str, optional) – channel unit, defaults to ‘’

  • recordingData (np.ndarray, optional) – Recorded values from previous scan or initialized array for new scan, defaults to None

  • recordingBackground (np.ndarray, optional) – Recorded background values from previous scan or initialized array for new scan, defaults to None

Returns:

Generic channel that is used to store and restore scan data.

Return type:

esibd.core.ScanChannel

addOutputChannels() None

Add all output channels.

addTimeInputChannel() MetaChannel

Add a time channel to save the time of each step in the scan.

Returns:

The time channel

Return type:

ScanChannel

afterFinalizeInit() None

Execute after all other plugins are finalized.

channels: list[ScanChannel | MetaChannel]

List of output meta channels.

close() bool

Close plugin cleanly without leaving any data or communication running.

Extend to make sure your custom data and custom communication is closed.

closeGUI() None

Close the user interface but might keep data available in case the user interface is restored later.

Closes all open references. Extend to save data and make hardware save if needed.

connectAllSources() None

Connect all available source channels.

display: Scan.Display

The internal plugin used to display scan data.

dummyInitialization() None

Initialize scan without data.

Will populate scan channels and indicate that channels have become obsolete by plotting without data if applicable.

estimateScanTime() None

Estimates scan time. Will likely need to be adapted for custom scans.

file: Path

The scan file. Either existing file or file to be created when scan finishes.

finalizeChannelTree() None

Expand all items and hide unused category.

finalizeInit() None

Execute final initialization code after all other Plugins are initialized.

Use this for code that modifies other Plugins, e.g. adding an Action to the DeviceManager.

property finished: bool

Indicate finished state.

True before and after scanning. Even when recording is set to False it will take time for the scan to complete and be ready to be started again.

generatePythonPlotCode() str

Provide plugin specific code to plot data exported by the plugin independently.

This is a starting point to reproduce and adjust figures e.g. for publications or independent data analysis.

Returns:

Python plot code

Return type:

str

getData(i: int, inout: INOUT) ndarray | None

Get the data of a scan channel based on index and type.

Parameters:
  • i (int) – Index of channel.

  • inout (INOUT) – Type of channel.

Returns:

The requested data.

Return type:

np.ndarray

getDefaultSettings() dict[str, dict]

Define a dictionary of parameterDict() which specifies default settings for this plugin.

Overwrite or extend as needed to define specific settings that will be added to Settings section. NOTE: While settings with attributes will be automatically accessible, it is good practice to define the type of the attribute for type checking.

Returns:

Settings dictionary

Return type:

{parameterDict()}

getOutputIndex() int

Get the index of the output channel corresponding to the currently selected display channel. See useDisplayChannel.

getSteps(start: float, stop: float, step: float) ndarray | None

Return steps based on start, stop, and step parameters.

Parameters:
  • start (float) – Start value.

  • stop (float) – Final value.

  • step (float) – Step size.

Returns:

Array of steps.

Return type:

np.ndarray

initData() None

Clear all channels before (re-)initialization.

initGUI() None

Initialize the graphic user interface (GUI), independent of all other plugins.

initScan() bool

Initialize all data and metadata.

Returns True if initialization successful and scan is ready to start. Will likely need to be adapted for custom scans.

inputChannels: list[ScanChannel | MetaChannel]

List of input meta channels.

invalidWhileWaiting: bool = False

Indicates if channel values should be changed to Nan while waiting for values to stabilize.

loadData(file: Path, showPlugin: bool = True) None

Load and displays data from file.

This should only be called for files where supportsFile() returns True. Overwrite depending on data supported by the plugin.

Parameters:
  • file (pathlib.Path) – File from which to load data.

  • showPlugin (bool, optional) – Show plugin after loading data, defaults to True. Some files are handled by multiple plugins and only one of them should be shown by default.

loadDataInternal() bool

Load data from scan file. Data is stored in scan-neutral format of input and output channels.

Extend to provide support for previous file formats.

loadSettings(file: Path | None = None, useDefaultFile: bool = False) None

Load scan settings from file.

Parameters:
  • file (pathlib.Path, optional) – File to load settings from, defaults to None

  • useDefaultFile (bool, optional) – Indicates if default file should be used, defaults to False

measurementsPerStep: int

Number of measurements per step based on the average time and acquisition rate.

outputChannels: list[ScanChannel | MetaChannel]

List of output meta channels.

plot(update: bool = False, **kwargs) None

Plot showing a current or final state of the scan.

Extend to add scan specific plot code. Make sure to also use the @plotting decorator when overwriting this function.

Parameters:

update (bool, optional) – If update is True, only data will be updates, otherwise entire figure will be initialized, defaults to False

pluginType: PLUGINTYPE = 'Scan'

The type defines the location of the plugin in the user interface and allows to run operations on a group of plugins with the same type using getPluginsByType().

populateDisplayChannel() None

Populate dropdown that allows to select displayed channel for scans that can only display one channel at a time.

pythonLoadCode() str

Import channels from scan file.

pythonPlotCode() str

Define minimal code to create a plot which can be customized by user.

Accessible from context menu of scan files. Overwrite to add scan specific plot code here.

reconnectSource(name: str) None

Reconnect a specific source channel.

Parameters:

name (str) – name of channel to reconnect

property recording: bool

Indicate recording state. Set to False to stop recording and save available data.

runScan(recording: Callable) None

Step through input values, records output values, and triggers plot update.

Executed in runThread. Will likely need to be adapted for custom scans.

Parameters:

recording (Callable) – Queries recording state.

runTestParallel() None

Run a series of tests by changing values of selected controls and triggering the corresponding events.

Extend and add call to super().runTestParallel() to the end to make sure testing flag is set to False after all test completed.

runThread: Thread | None

Parallel thread that updates the scan channel(s) and reads out the display channel(s).

saveData(file: Path) None

Write generic scan data to hdf file.

Parameters:

file (pathlib.Path) – The file to save data to.

saveScanComplete() None

Mark scan as finished after saving file completed.

saveScanParallel(file: Path) None

Keep GUI interactive by saving scan data in external thread.

Parameters:

file (pathlib.Path) – The file to save to.

saveSettings(file: Path | None = None, useDefaultFile: bool = False) None

Save scan settings to file.

Parameters:
  • file (pathlib.Path, optional) – File to save settings to, defaults to None

  • useDefaultFile (bool, optional) – Indicates if default file should be used, defaults to False

scanUpdate(done: bool = False) None

Update plot and saves data when done.

Parameters:

done (bool, optional) – Call with True in last step of scan to indicate that data should be saved to file. Defaults to False

statusActionEvent() None

Show scan and corresponding display.

toggleAdvanced(advanced: bool | None = False) None

Overwrite to show advanced options.

Parameters:

advanced (bool, optional) – Indicates if advanced options should be visible, defaults to None

toggleDisplay(visible: bool) None

Toggles visibility of display.

Parameters:

visible (bool) – Indicates if the display should be visible.

toggleRecording() None

Handle start and stop of scan.

updateDisplayChannel() None

Update plot after changing display channel.

updateDisplayDefault() None

Select displayed Channel based on default display setting.

updateFile() None

Update scan file.

updateRecording(recording: bool) None

Set recording state. (Make sure this is called in main thread!).

Parameters:

recording (bool) – New recording state.

updateTheme() None

Change between dark and light themes.

Most controls should update automatically as the color pallet is changed. Only update the remaining controls using style sheets. Extend to adjust colors to app theme.

updateToolBar(update: bool) None

Update toolbar if this is not just an update.

Parameters:

update (bool) – Indicates if this us an update. Otherwise this is initializing of finalizing a plot.

useAdvancedOptions: bool = True

Adds toolbox icon to show advanced plugin options.

useDisplayChannel: bool

If True, a combobox will be created to allow to select for which channel data should be displayed.

useDisplayParameter = False

Use display parameter to control which scan channels are displayed.

useInvalidWhileWaiting: bool = False

Enable setting to ignore values while stabilizing.

class esibd.plugins.Settings(*args: Any, **kwargs: Any)

Edit, save, and load all general program and hardware settings.

Settings can be edited either directly or using the context menu that opens on right click. Settings are stored in an .ini file which can be edited directly with any text editor if needed. The settings file that is used on startup is automatically generated if it does not exist. Likewise, default values are used for any missing parameters. Setting files can be exported or imported from the user interface. A change log will show which settings have changed after importing. In addition, the PluginManager and Console can be opened from here.

buildSessionPath() Path

Build the session path based on timestamp. Extend to add additional elements to session path.

componentInputValidation(component: str) str

Validate a path component.

Parameters:

component (str) – Path component.

Returns:

Validated path component.

Return type:

str

finalizeInit() None

Execute final initialization code after all other Plugins are initialized.

Use this for code that modifies other Plugins, e.g. adding an Action to the DeviceManager.

getDefaultSettings() dict[str, dict]

Provide settings and corresponding default values.

Returns:

Dictionary of settings

Return type:

dict[str, dict]

getFullSessionPath() Path

Return full session path inside data path.

getMeasurementFileName(extension: str) Path

Get measurement file name based on session path, measurement number, and plugin specific file extension.

Parameters:

extension (str) – Plugin specific file extension.

Returns:

Full measurement file path with measurement number and extension.

Return type:

pathlib.Path

iconFile: str = 'gear.png'

Default icon file. Expected to be in dependencyPath.

incrementMeasurementNumber() None

Increment without triggering event.

init() None

Init all internal settings and those of all other plugins.

initDock() None

Initialize the DockWidget.

initGUI() None

Initialize the graphic user interface (GUI), independent of all other plugins.

loadData(file: Path, showPlugin: bool = False) None

Load and displays data from file.

This should only be called for files where supportsFile() returns True. Overwrite depending on data supported by the plugin.

Parameters:
  • file (pathlib.Path) – File from which to load data.

  • showPlugin (bool, optional) – Show plugin after loading data, defaults to True. Some files are handled by multiple plugins and only one of them should be shown by default.

loadSettings(file: Path | None = None, useDefaultFile: bool = False) None

Load settings from hdf or ini file.

Parameters:
  • file (pathlib.Path, optional) – File from which settings should be loaded, defaults to None

  • useDefaultFile (bool, optional) – Indicates if default file should be used, defaults to False

name: str = 'Settings'

A unique name that will be used in the graphic user interface. Plugins can be accessed directly from the Console using their name.

optional: bool = False

Defines if the user can deactivate the plugin in the PluginManager user interface.

pathInputValidation(path: Path) Path

Validate path.

Parameters:

path (pathlib.Path) – The path to validate.

Returns:

Validated path.

Return type:

pathlib.Path

pluginType: PLUGINTYPE = 'Generic Control'

The type defines the location of the plugin in the user interface and allows to run operations on a group of plugins with the same type using getPluginsByType().

runTestParallel() None

Run a series of tests by changing values of selected controls and triggering the corresponding events.

Extend and add call to super().runTestParallel() to the end to make sure testing flag is set to False after all test completed.

testModeChanged() None

Close communication so it can be reinitialized with new test mode state.

toggleAdvanced(advanced: bool | None = False) None

Overwrite to show advanced options.

Parameters:

advanced (bool, optional) – Indicates if advanced options should be visible, defaults to None

updateConfigPath() None

Reload settings and plugin configuration after changing configuration path.

updateDPI() None

Update DPI in all active matplotlib figures.

updateDataPath() None

Update session path and Explorer root directory after changing data path.

updatePluginPath() None

Restart after changing user plugin path.

updateSessionPath(mesNum: int = 0) None

Update the session path based on settings. Overwrite if you want to use different fields instead.

Parameters:

mesNum (int, optional) – measurement number, defaults to 0

useAdvancedOptions: bool = True

Adds toolbox icon to show advanced plugin options.

version: str = '1.0'

The version of the plugin. Plugins are independent programs that require independent versioning and documentation.

class esibd.plugins.SettingsManager(*args: Any, **kwargs: Any)

Bundles multiple settings into a single object to handle shared functionality.

addDefaultSettings(plugin: Plugin) None

Add settings from provided plugin and makes them accessible as attributes.

Parameters:

plugin (Plugin) – The plugin providing the settings.

addSetting(item: dict) None

Add a Setting including GUI elements.

Parameters:

item (dict) – Setting dict.

hdfSaveSetting(group: Group, name: str, defaultSetting: dict[str, Any]) None

Save Setting in hdf file.

Parameters:
  • group (h5py.Group) – The group to which to add Setting.

  • name (str) – Setting name.

  • defaultSetting (dict[str, any]) – Default dict for Setting.

init() None

Initialize Settings. Extended to add settings of all other plugins using addDefaultSettings.

initSettingsContextMenu(pos: PyQt6.QtCore.QPoint) None

Initialize the context menu of the setting.

Parameters:

pos (QPoint) – The position of the context menu.

initSettingsContextMenuBase(setting: Parameter | Setting, pos: PyQt6.QtCore.QPoint) None

Choose relevant context menu actions based on the type and properties of the Setting.

Parameters:
  • setting (esibd.core.Setting) – The setting for which the context menu is requested.

  • pos (QPoint) – The position of the context menu.

loadSettings(file: Path | None = None, useDefaultFile: bool = False) None

Load settings from hdf or ini file.

Parameters:
  • file (pathlib.Path, optional) – File from which settings should be loaded, defaults to None

  • useDefaultFile (bool, optional) – Indicates if default file should be used, defaults to False

pluginType: PLUGINTYPE = 'Internal'

The type defines the location of the plugin in the user interface and allows to run operations on a group of plugins with the same type using getPluginsByType().

requireParentItem(name: str, parentItem: PyQt6.QtWidgets.QTreeWidgetItem) PyQt6.QtWidgets.QTreeWidgetItem

Ensure all parents groups exist.

Parameters:
  • name (str) – name containing all parent groups

  • parentItem (QTreeWidgetItem) – Ensures all groups exist relative to this parent item.

Returns:

Valid parent item for last element of name.

Return type:

QTreeWidgetItem

saveSettings(file: Path | None = None, useDefaultFile: bool = False) None

Save settings to hdf or ini file.

Parameters:
  • file (pathlib.Path, optional) – File to save settings in, defaults to None

  • useDefaultFile (bool, optional) – Indicates if defaultFile should be used, defaults to False

updateSettings(items: list[dict], file: Path) None

Scan for changes and shows change log before overwriting old channel configuration.

Parameters:
  • items (list[dict]) – List of setting dictionaries

  • file (pathlib.Path) – File from which settings are being loaded.

version: str = '1.0'

The version of the plugin. Plugins are independent programs that require independent versioning and documentation.

class esibd.plugins.StaticDisplay(*args: Any, **kwargs: Any)

Display Device data from file.

connectAllSources() None

Connect all available source channels.

copyClipboard() None

Extend matplotlib based version to add support for pyqtgraph.

finalizeInit() None

Execute final initialization code after all other Plugins are initialized.

Use this for code that modifies other Plugins, e.g. adding an Action to the DeviceManager.

generatePythonPlotCode() str

Provide plugin specific code to plot data exported by the plugin independently.

This is a starting point to reproduce and adjust figures e.g. for publications or independent data analysis.

Returns:

Python plot code

Return type:

str

getIcon(desaturate: bool = False) Icon

Get the plugin icon. Consider using a themed icon that works in dark and light modes.

Overwrite only if definition of iconFile and iconFileDark is not sufficient.

Parameters:

desaturate (bool, optional) – Indicates if color should be removed from icon, defaults to False

Returns:

Icon

Return type:

Icon

initData() None

Clear all channels before (re-)initialization.

initFig() None

Initialize a figure.

Will be called when a display is closed and reopened or the theme is changed. Overwrite your figure initialization here to make sure all references are updated correctly.

initGUI() None

Initialize the graphic user interface (GUI), independent of all other plugins.

loadData(file: Path, showPlugin: bool = True) None

Load and displays data from file.

This should only be called for files where supportsFile() returns True. Overwrite depending on data supported by the plugin.

Parameters:
  • file (pathlib.Path) – File from which to load data.

  • showPlugin (bool, optional) – Show plugin after loading data, defaults to True. Some files are handled by multiple plugins and only one of them should be shown by default.

loadDataInternal(file: Path) bool

Load data in standard format. Overwrite in derived classes to add support for old file formats.

Parameters:

file (pathlib.Path) – File to load data from.

Returns:

Return True if loading was successful.

Return type:

bool

parentPlugin: ChannelManager

A Plugin that acts as a parent by providing references for and using this plugin

plot(update: bool = False) None

Plot channels from file, using real channel information (color, linewidth, linestyle, …) if available.

Parameters:

update (bool, optional) – Indicates if plot needs to be updated, defaults to False

pluginType: PLUGINTYPE = 'Display'

The type defines the location of the plugin in the user interface and allows to run operations on a group of plugins with the same type using getPluginsByType().

provideDock() bool

Add existing dock to UI at position defined by esibd.plugins.Plugin.pluginType.

Always call from the main_thread.

reconnectSource(name: str) None

Reconnect a specific source channel.

Parameters:

name (str) – name of channel to reconnect

runTestParallel() None

Run a series of tests by changing values of selected controls and triggering the corresponding events.

Extend and add call to super().runTestParallel() to the end to make sure testing flag is set to False after all test completed.

supportsFile(file: Path) bool

Test if a file is supported by the plugin, based on file name or content.

Parameters:

file (pathlib.Path) – File that has been selected by the user.

Returns:

Returns True if the file is supported by the plugin. Test if supported based on file extension or content.

Return type:

bool

togglePlotType() None

Toggles between using matplotlib and pyqtgraph.

updateTheme() None

Change between dark and light themes.

Most controls should update automatically as the color pallet is changed. Only update the remaining controls using style sheets. Extend to adjust colors to app theme.

class esibd.plugins.UCM(*args: Any, **kwargs: Any)

Allow to specify a custom list of channels from all devices.

This allows to have the most relevant controls and information in one place. All logic remains within the corresponding device plugins. This is just an interface! To get started, simply add channels and name them after existing channels from other devices.

class UCMChannel(*args: Any, **kwargs: Any)

Minimal UI for abstract channel.

connectSource(giveFeedback: bool = False) None

Connect the sourceChannel.

Parameters:

giveFeedback (bool, optional) – Report on success of connection, defaults to False

getDefaultChannel() dict[str, dict]

Define Parameter(s) of the default Channel.

This is also use to assign parameterTypes, if Parameters are visible outside of advanced mode, and many other parameter properties. See parameterDict(). If parameters do not exist in the settings file, the default Parameter will be added. Overwrite in dependent classes as needed.

NOTE: While parameters with attributes will be automatically accessible, it is good practice to define the type of the attribute for type checking.

getSourceChannelValues() None

Get value and if applicable monitor from sourceChannel.

initGUI(item: dict) None

Initialize Channel GUI.

Call after corresponding QTreeWidgetItem has been added to tree. Item needs parent for all graphics operations.

Parameters:

item (dict) – Dictionary containing all channel information.

monitorChanged() None

Disable internal monitor event.

onDelete() None

Extend to handle events on deleting. E.g. handle references that should remain available.

relayMonitorEvent() None

Update monitor and monitor stylesheet when sourceChannel.monitor changed.

relayValueEvent() None

Update value when sourceChannel.value changed.

removeEvents() None

Remove extra events from sourceChannel.

setDisplayedParameters() None

Determine which parameters to use and in what order.

Extend using insertDisplayedParameter() to add more parameters.

setSourceChannelValue() None

Update sourceChannel.value.

tempParameters() list[str]

List of parameters, such as live signal or status, that will not be saved and restored.

afterFinalizeInit() None

Execute after all other plugins are finalized.

channelType

alias of UCMChannel

channels: list[UCMChannel]

List of channels.

connectAllSources(update: bool = False) None

Connect all available source channels.

Parameters:

update (bool, optional) – Indicates that all channels should be (re-)connected. Otherwise will only attempt to connect channels that are not yet connected. Defaults to False

documentation: str = 'Unified Channel Manager (UCM) allows to specify a custom list of channels from all devices.\n    This allows to have the most relevant controls and information in one place.\n    All logic remains within the corresponding device plugins. This is just an interface!\n    To get started, simply add channels and name them after existing channels from other devices.'

The plugin documentation used in the internal about dialog in the Browser. If None, the doc string __doc__ will be used instead. The latter may contain rst commands for sphinx documentation which should not be exposed to the user.

duplicateChannel() None

Duplicates the currently selected channel.

getChannels() list[Channel]

Get channels. Overwrite to return subsets based on channel state.

iconFile: str = 'UCM.png'

Default icon file. Expected to be in dependencyPath.

initGUI() None

Initialize the graphic user interface (GUI), independent of all other plugins.

loadConfiguration(file: Path | None = None, useDefaultFile: bool = False, append: bool = False) None

Load channel configuration from file.

If only values should be loaded without complete reinitialization, use loadValues instead.

Parameters:
  • file (pathlib.Path, optional) – File from which to load configuration, defaults to None

  • useDefaultFile (bool, optional) – Use internal configuration file if True, defaults to False

  • append (bool, optional) – True if changelog should be appended to previous change logs, e.g. when loading from multiple devices at once. Defaults to False

loadData(file: Path, showPlugin: bool = True) None

Load and displays data from file.

This should only be called for files where supportsFile() returns True. Overwrite depending on data supported by the plugin.

Parameters:
  • file (pathlib.Path) – File from which to load data.

  • showPlugin (bool, optional) – Show plugin after loading data, defaults to True. Some files are handled by multiple plugins and only one of them should be shown by default.

moveChannel(up: bool) None

Move the channel up or down in the list of channels.

Parameters:

up (bool) – Move up if True, else down.

name: str = 'UCM'

A unique name that will be used in the graphic user interface. Plugins can be accessed directly from the Console using their name.

optional: bool = True

Defines if the user can deactivate the plugin in the PluginManager user interface.

pluginType: PLUGINTYPE = 'Channel Manager'

The type defines the location of the plugin in the user interface and allows to run operations on a group of plugins with the same type using getPluginsByType().

reconnectSource(name: str) None

Try to reconnect linked channels if applicable.

This is needed e.g. after renaming, moving, or deleting channels. If the channel has been deleted, the reconnection attempt will fail and and the linking channel will indicated that no source has been found.

Parameters:

name (str) – Name of the channel to reconnect.

toggleRecording(on: bool | None = None, manual: bool = False) None

Turn recording on or off or toggles state.

Data will be plotted in LiveDisplay if that is active. Extend to add recoding logic for devices.

Parameters:
  • on (bool, optional) – If True recording will be turned on, if False it will be turned off. If already on or off nothing happens. If None, recording is toggled.

  • manual (bool, optional) – If True, signal was send directly from corresponding live display. Otherwise might be send from device manager

useMonitors = True

Use record monitors and compare them to set points.

version: str = '1.0'

The version of the plugin. Plugins are independent programs that require independent versioning and documentation.

Defines which plugins are loaded and in what order.

Only use to replace plugins specified below with extended versions. Define all other plugins in devices, scans, examples, displays, or a user plugin folder.

esibd.provide_plugins.providePlugins() list[type[Plugin]]

Return list of plugins.

Plugins are available for activation in the PluginManager user interface accessible from Settings.

Returns:

Plugin list

Return type:

[Plugin]

The core module

Internally used functions and classes.

Generally all objects that are used across multiple modules should be defined here to avoid circular imports and keep things consistent. Whenever it is possible to make definitions only locally where they are needed, this is preferred. For now, English is the only supported language and use of hard coded error messages etc. in other files is tolerated if they are unique.

class esibd.core.Action(*args: Any, **kwargs: Any)

An Action that allows to change values from another thread and retains a reference to icon an toolTip.

class SignalCommunicate(*args: Any, **kwargs: Any)

Bundle pyqtSignals.

setValueFromThreadSignal

alias of bool

getIcon() Icon

Get the icon. API consistent with other Action classes.

getToolTip() str

Get the tooltip. API consistent with other Action classes.

setValue(value: bool) None

Set action state. API consistent with other Action classes.

Parameters:

value (bool) – New state.

property state: bool

Return the state. API consistent with other Action classes.

class esibd.core.Application(*args: Any, **kwargs: Any)

Application that has a mouseInterceptor.

class esibd.core.Channel(*args: Any, **kwargs: Any)

Represent a virtual or real Parameter and manage all data and metadata related to that Parameter.

Each device can only have one type of channel, but channels have dynamic interfaces that allow to account for differences in the physical backend. Channels provide a consistent and structured interface to inputs and outputs. In the advanced mode, channels can be duplicated, moved, or deleted. You may also edit channels directly in the corresponding .ini file in the config path (import after edit or changes will be lost).

Channels are accessible from any plugin using getChannelByName(). This, and other features like linking channels by equations, depends on the usage of unique and descriptive channel names.

class SignalCommunicate(*args: Any, **kwargs: Any)

Bundle pyqtSignals.

updateValueSignal

alias of float

waitUntilStableSignal

alias of int

property acquiring: bool

Indicates if the channel is acquiring data.

activeChanged() None

Update channel after active state has changed.

appendValue(lenT: int, nan: bool = False) None

Append a datapoint to the recorded values.

Parameters:
  • lenT (int, optional) – length of corresponding time array, defaults to None

  • nan (bool) – If True, np.nan is used instead of current value. This should mark a new collection and prevent interpolation in regions without data.

applyValue(apply: bool = False) None

Apply value to device if value has changed or explicitly requested.

Parameters:

apply (bool) – If True, value will be applied even if it has not changed. Defaults to None

asDict(includeTempParameters: bool = False, formatValue: bool = False) dict[str, str | Path | int | float | PyQt6.QtGui.QColor | bool]

Return a dictionary containing all Channel Parameters and their values.

Parameters:
  • includeTempParameters (bool, optional) – If True, dict will contain temporary Parameters, Defaults to False

  • formatValue (bool, optional) – Indicates if the value should be formatted as a string, Defaults to False

Returns:

The channel as dictionary.

Return type:

dict[str, ParameterType]

backgrounds: DynamicNp

List of backgrounds. Only defined if corresponding device uses backgrounds.

channelParent: ChannelManager | Device | Scan

The Device or Scan containing this channel.

clearHistory() None

Clear all history data including backgrounds if applicable.

clearPlotCurve() None

Clear the plot curve. It will be recreated (with updated values and settings) next time plot is called.

collapseChanged(toggle: bool = True) None

Update visible channels after collapse has changed.

Parameters:

toggle (bool, optional) – Toggles display of visible channels, defaults to True

displayedParameters: list[str]

List of Parameters that determines which Parameters are shown in the user interface and in what order. Compare insertDisplayedParameter(). If your custom Parameter is not in this list it will not be visible in the user interface.

enabledChanged() None

Extend as needed. Already linked to enabled checkbox.

equationChanged() None

Update channel after equation has changed.

getDefaultChannel() dict[str, dict]

Define Parameter(s) of the default Channel.

This is also use to assign parameterTypes, if Parameters are visible outside of advanced mode, and many other parameter properties. See parameterDict(). If parameters do not exist in the settings file, the default Parameter will be added. Overwrite in dependent classes as needed.

NOTE: While parameters with attributes will be automatically accessible, it is good practice to define the type of the attribute for type checking.

getDevice() ChannelManager | Device | Scan

Get the device. Overwrite for more specific cases like relay channels where the channel parent is not the device.

getParameterByName(name: str) Parameter

Get a Channel Parameter by name.

Parameters:

name (str) – The name of the Parameter.

Returns:

The requested Parameter.

Return type:

esibd.core.Parameter

getQtLineStyle() PyQt6.QtCore.Qt.PenStyle

Get Qt.PenStyle matching matplotlib linestyle.

getSortedDefaultChannel() dict[str, dict]

Return default Channel parameters sorted in the order defined by displayedParameters.

getValues(length: int | None = None, index_min: int | None = None, index_max: int | None = None, n: int = 1, subtractBackground: bool = False) ndarray[tuple[int, ...], dtype[float64 | float32]]

Return plain Numpy array of values.

Note that background subtraction only affects what is displayed, the raw signal and background curves are always retained.

Parameters:
  • length (int) – will return last ‘length’ values.

  • index_min (int) – Index of lower limit.

  • index_max (int) – Index of upper limit.

  • n (int, optional) – Will only return every nth value, defaults to 1

  • subtractBackground (bool, optional) – Indicates if the background should be subtracted, defaults to False

Returns:

The array of values.

Return type:

np.ndarray[Any, np.dtype[np.float32]]

initGUI(item: dict) None

Initialize Channel GUI.

Call after corresponding QTreeWidgetItem has been added to tree. Item needs parent for all graphics operations.

Parameters:

item (dict) – Dictionary containing all channel information.

initSettingsContextMenuBase(parameter: Parameter | Setting, pos: PyQt6.QtCore.QPoint) None

General implementation of a context menu.

The relevant actions will be chosen based on the type and properties of the Parameter.

Parameters:
  • parameter (esibd.core.Parameter) – The parameter for which the context menu is requested.

  • pos (QPoint) – The position of the context menu.

property initialized: bool

Indicate if the channel is initialized and ready for plotting.

inout: INOUT = 3

Reference to inout.

insertDisplayedParameter(parameter: str, before: str) None

Insert your custom Parameter before an existing Parameter in displayedParameters.

Parameters:
  • parameter (Parameter) – The new Parameter to insert.

  • before (Parameter) – The existing Parameter before which the new one will be placed.

lastAppliedValue: ParameterType | None

Reference to last value. Allows to decide if hardware update is required.

property loading: bool

Indicates if the corresponding device is currently loading.

logY: bool = False

Indicates if logarithmic controls and scales should be used.

monitorChanged() None

Highlights monitors if they deviate to far from set point. Extend for custom monitor logic if applicable.

nameChanged() None

Update display and linked channels if channel name changed.

onDelete() None

Extend to handle events on deleting. E.g. handle references that should remain available.

parameters: list[Parameter]

List of channel parameters.

plotCurve: PlotCurveItem | PlotDataItem | None

The plotCurve in the corresponding LiveDisplay.

print: Callable

Reference to print().

realChanged() None

Extend as needed. Already linked to real checkbox.

resetUnstable() None

Indicate signal is stable.

scalingChanged() None

Adjust height of all Channel Parameters according to new scaling value.

setDisplayedParameters() None

Determine which parameters to use and in what order.

Extend using insertDisplayedParameter() to add more parameters.

sizeHint(column) PyQt6.QtCore.QSize

Provide a custom size hint based on the item’s content.

tempParameters() list[str]

List of parameters, such as live signal or status, that will not be saved and restored.

property time: DynamicNp | None

The time axis of the corresponding device.

toggleBackgroundVisible() bool

Show the background widget if applicable and hides it otherwise.

Returns:

True if background is visible.

Return type:

bool

tree: QTreeWidget | None

TreeWidget containing the channel widgets.

property unit: str

The unit of the corresponding device.

updateColor() PyQt6.QtGui.QColor

Apply new color to all controls.

updateDisplay() None

Update live and static displays.

updateMax() None

Apply new maximum to value widget.

updateMin() None

Apply new minimum to value widget.

updateValueParallel(value: float) None

Update the value (thread safe).

Parameters:

value (float) – new value

updateWarningState(warn: bool = False) None

Update warningState of monitor and applies corresponding style sheet.

Parameters:

warn (bool, optional) – Indicates if the warningStyleSheet should be used, defaults to False

valueChanged() None

Update after value has changed.

values: DynamicNp

The history of values shown in the LiveDisplay. Use getValues() to get a plain numpy.array.

waitToStabilize = False

Indicates if the device is stabilized. Will return NaN if unstable.

waitUntilStable(wait: int) None

Wait for signal to stabilize.

Will return NaN until stable. Make sure to call from the mainThread.

Parameters:

wait (int) – Wait time in ms.

class esibd.core.CheckBox(*args: Any, **kwargs: Any)

Allows to set values in a widget in a consistent way.

class SignalCommunicate(*args: Any, **kwargs: Any)

Bundle pyqtSignals.

setValueFromThreadSignal

alias of bool

setValue(value: bool) None

Set value using consistent API for Parameter widgets.

Parameters:

value (bool) – The new checked state.

class esibd.core.CloseDialog(*args: Any, **kwargs: Any)

Dialog to confirm closing the program.

class esibd.core.ColorButton(*args: Any, **kwargs: Any)

ColorButton as ParameterWidget.

class esibd.core.CompactComboBox(*args: Any, **kwargs: Any)

Combobox that stays small while showing full content in dropdown menus.

setPopupMinimumWidthForItems() None

Calculate and sets the minimum combobox width.

showPopup() None

Show popup after setting minimum width.

wheelEvent(e: QWheelEvent | None) None

Ignore wheel event.

class esibd.core.ControlCursor(*args: Any, **kwargs: Any)

Extending internal implementation to get draggable cursor.

getPosition()

Get current position.

ondrag(event) None

Continuously updates cursor position.

setPosition(x, y) None

Emulated mouse event to set position.

updatePosition() None

Update position. Usually required to reset position after cursors have been lost by drawing other elements.

class esibd.core.CursorAxes(*args: Any, **kwargs: Any)

An axes with comes with a controllable cursor.

class esibd.core.DebouncedCanvas(*args: Any, **kwargs: Any)

Figure Canvas that defers drawing until manual resize is complete.

This makes the GUI more responsive.

request_update() None

Restart the timer every time this is called.

class esibd.core.DeviceController(*args: Any, **kwargs: Any)

Each Device or Channel comes with a DeviceController.

The DeviceController is not itself a Plugin. It only abstracts the direct hardware communication from plugins allowing them to use minimal and consistent code that can be adjusted and reused independently of the hardware. It should do all resource or time intensive communication work in parallel threads to keep the GUI responsive. Following the producer-consumer pattern, the DeviceController reads values from a physical device and assigns them to the corresponding Channel. The devices will collect data from the Channel independently. In case you work with time sensitive experiments this concept will need to be adapted. Feel free to use the basic functionality provided by DeviceController or implement your own from scratch. As the DeviceController only interacts with your custom Channel or Device, there are no general requirements for its implementation.

MAX_ERROR_COUNT = 25

Close communication if exceeded.

class SignalCommunicate(*args: Any, **kwargs: Any)

Bundle pyqtSignals.

closeCommunicationSignal

Signal that triggers the acquisition to stop after communication errors.

initCompleteSignal

Signal that is emitted after successful initialization of device communication.

updateValuesSignal

Signal that transfers new data from the acquisitionThread to the corresponding channels.

acquiring: bool = False

True, while acquisitionThread is running. AcquisitionThread terminates if set to False.

acquisitionThread: Thread | None = None

A parallel thread that regularly reads values from the device.

applyValue(channel: Channel) None

Apply value to device.

Should only be called for real channels!

Parameters:

channel (esibd.core.Channel) – Channel for which the value should be applied.

applyValueFromThread(channel: Channel) None

Apply value to device (thread safe).

Parameters:

channel (esibd.core.Channel) – Channel for which the value should be applied.

clearBuffer(port: serial.Serial) None

Clear the buffer at the serial port.

Parameters:

port (serial.Serial, optional) – The port at which to clear the buffer, defaults to None

closeCommunication() None

Close all open ports. Ths method has to be extended as described below.

This should free up all resources and allow for clean reinitialization. Extend to add hardware specific code. Keep following order to make sure acquisition is stopped before communication is closed: 1. super().closeCommunication() 2. closing your custom hardware communication 3. self.initialized = False

controllerParent: Device | Channel

Reference to the associated class.

property errorCount: int

Convenience method to access the errorCount of the device.

fakeInitialization() None

Faking successful initialization in test mode. Called instead of runInitialization.

fakeNumbers() None

Write fake channel values in an array that will be used in updateValue.

initComplete() None

Start acquisition from main thread (access to GUI!). Called after successful initialization.

initThread: Thread | None = None

A parallel thread used to initialize communication.

initializeCommunication() None

Start the initThread().

initializeValues(reset: bool = False) None

Initialize array used to store current values or readbacks.

Parameters:

reset (bool, optional) – If True, will reset values to np.nan, defaults to False

initialized: bool = False

Indicates if communications has been initialized successfully and not yet terminated.

initializing: bool = False

Indicates if communications is being initialized.

lock: TimeoutLock

Lock used to avoid race conditions when communicating with the hardware.

property name: str

Convenience method to access the name of the device.

port: serial.Serial | None = None

Port for serial communication.

print(message: str, flag: PRINT = PRINT.MESSAGE) None

Send a message to stdout, the statusbar, the Console, and if enabled to the logfile.

It will automatically add a timestamp and the name of the sending plugin.

Parameters:
  • message (str) – A short informative message.

  • flag (PRINT(), optional) – Flag used to adjust message display, defaults to MESSAGE

readNumbers() None

Write channel values in an array that will be used in updateValue.

resetErrorCount() None

Reset error count to 0.

rng = Generator(PCG64) at 0x250AEF757E0

Random number generator.

runAcquisition() None

Run acquisition loop. Executed in acquisitionThread.

Overwrite with hardware specific acquisition code.

runInitialization() None

Hardware specific initialization of communication. Executed in initThread (no access to GUI!).

serialRead(port: serial.Serial, encoding: str = 'utf-8', EOL: str = '\n', strip: str = '') str

Read a string from a serial port.

Takes care of decoding messages from bytes and catches common exceptions.

Parameters:
  • port (serial.Serial) – Serial port.

  • encoding (str, optional) – Encoding used for sending and receiving messages, defaults to ‘utf-8’

  • EOL (str, optional) – End of line character.

  • strip (str, optional) – String to be stripped from message, defaults to ‘’

Returns:

message

Return type:

str

serialWrite(port: serial.Serial, message: str, encoding: str = 'utf-8') None

Write a string to a serial port. Takes care of decoding messages to bytes and catches common exceptions.

Parameters:
  • port (serial.Serial) – Serial port.

  • message (str) – Message.

  • encoding (str, optional) – Encoding used for sending and receiving messages, defaults to ‘utf-8’

startAcquisition() None

Start data acquisition from physical device.

stopAcquisition() bool

Terminate acquisition but leaves communication initialized.

toggleOn() None

Toggles device on or off.

toggleOnFromThread(parallel: bool = True) None

Toggles device on or off (tread safe).

Parameters:

parallel (bool, optional) – Use parallel thread. Run in main thread if you want the application to wait for this to complete! Defaults to True

updateValues() None

Update the value or monitor of the channel(s) in the main thread. Called from acquisitionThread.

class esibd.core.DockWidget(*args: Any, **kwargs: Any)

DockWidget with custom title bar allows to intercept the close and float events triggered by user.

class SignalCommunicate(*args: Any, **kwargs: Any)

Bundle pyqtSignals.

closeEvent(event: QCloseEvent | None) None

Close the GUI when the dock is closing.

on_top_level_changed() None

Update toolbars after dragging plugins to new location.

resetResize() None

Reset resizing flag.

resizeEvent(a0: QResizeEvent | None) None

Temporary set resizing flag.

toggleTitleBar() None

Update titleBar as dock is changing from floating to docked states.

class esibd.core.DynamicNp(initialData: ~numpy.ndarray[tuple[int, ...], ~numpy.dtype[~numpy.float64 | ~numpy.float32]] | None = None, max_size: int | None = None, dtype: type = <class 'numpy.float32'>)

A numpy.array that dynamically increases its size in increments to prevent frequent memory allocation while growing.

add(x: float, lenT: int | None = None) None

Add the new data point and adjusts the data array as required.

Parameters:
  • x (float) – Datapoint to be added

  • lenT (int, optional) – length of corresponding time array, defaults to None

get(length: int | None = None, index_min: int | None = None, index_max: int | None = None, n: int = 1) ndarray[tuple[int, ...], dtype[float64 | float32]]

Return actual values.

Parameters:
  • length (int) – will return last ‘length’ values.

  • index_min (int) – Index of lower limit.

  • index_max (int) – Index of upper limit.

  • n (int, optional) – Will only return every nth value, defaults to 1

Returns:

Values in specified range.

Return type:

numpy.array

init(initialData: ndarray[tuple[int, ...], dtype[float64 | float32]] | None = None, max_size: int | None = None) None

Initialize DynamicNp. This is also used if data is cropped or padded.

Parameters:
  • initialData (np.ndarray, optional) – Initial data, defaults to None

  • max_size (int, optional) – Initial maximal size. Will extend dynamically as needed. Defaults to None

class esibd.core.EsibdExplorer(*args: Any, **kwargs: Any)

ESIBD Explorer: A comprehensive data acquisition and analysis tool for Electrospray Ion-Beam Deposition experiments and beyond.

Contains minimal code to start, initialize, and close the program. All high level logic is provided by core, plugins and additional plugins.

closeApplication(restart: bool = False, confirm: bool = True) bool

Close communication and plugins, restart if applicable.

Parameters:
  • restart (bool, optional) – If True, application will restart in a clean new process, defaults to False

  • confirm (bool, optional) – Indicates if user should confirm in case devices are initialized, defaults to True

Returns:

Returns True if the application is closing.

Return type:

bool

closeEvent(a0: QCloseEvent | None) None

Triggers PluginManager to close all plugins and all related communication.

Parameters:

a0 (QCloseEvent) – The close event.

loadPlugins() None

Load plugins in main thread.

restoreUiState() None

Restores size and location of main window.

saveUiState() None

Save size and location of main window.

toggleFullscreen() None

Toggles full screen mode.

class esibd.core.Icon(*args: Any, **kwargs: Any)

QIcon that allows to save the icon file name. Allows to reuse icon elsewhere, e.g., for html about dialog.

class esibd.core.IconStatusBar(*args: Any, **kwargs: Any)

Statusbar that shows an icon in front of the message to indicate the type of message.

iconClicked

alias of bool

setFlag(flag: PRINT = PRINT.MESSAGE) None

Set the status icon depending on the message flag.

Parameters:

flag (esibd.const.PRINT, optional) – The message flag, defaults to PRINT.MESSAGE

showMessage(message, msecs=Ellipsis) None

Redirecting message to custom statusbar.

Parameters:
  • message (str) – The message.

  • msecs (int, optional) – Defines message display time. Not used for custom statusbar.

class esibd.core.Label(*args: Any, **kwargs: Any)

QLabel as ParameterWidget.

class esibd.core.LabelItem(*args: Any, **kwargs: Any)

LabelItem that passes color changes on to the label text.

setColor(color: ColorType) None

Set the color.

Parameters:

color (ColorType) – The color to be applied.

class esibd.core.LabviewDoubleSpinBox(*args: Any, **kwargs: Any)

Implements handling of arrow key events based on curser position similar as in LabView.

contextMenuEvent(e: QContextMenuEvent | None) None

Do not use context menu for indicators.

keyPressEvent(event: PyQt6.QtGui.QKeyEvent) None

Allow to manually rest a value from NaN.

setDisplayDecimals(displayDecimals: int) None

Set display precision.

Parameters:

displayDecimals (int) – Number of displayed decimals.

setValue(val: float) None

Display nan and inf as text.

stepBy(steps: int) None

Handle stepping value depending con caret position. This implementation works with negative numbers and of number of digits before the dot.

textFromValue(v: float) str

Make sure nan and inf will be represented by NaN.

value() float

Return nan instead of trying convert it.

valueFromText(text: str | None) float

Convert text to value.

Parameters:

text (str) – Input text.

Returns:

value

Return type:

float

wheelEvent(e: QWheelEvent | None) None

Overwrite to disable accidental change of values via the mouse wheel.

class esibd.core.LabviewSciSpinBox(*args: Any, **kwargs: Any)

Spinbox for scientific notation.

class FloatValidator(*args: Any, **kwargs: Any)

Validates input for correct scientific notation.

stepBy(steps: int) None

Handle stepping value depending con caret position. This implementation works with negative numbers and of number of digits before the dot.

textFromValue(v: float) str

Make sure nan and inf will be represented by NaN.

class esibd.core.LabviewSpinBox(*args: Any, **kwargs: Any)

Implements handling of arrow key events based on curser position similar as in LabView.

contextMenuEvent(e: QContextMenuEvent | None) None

Suppresses context menu for indicators.

keyPressEvent(event: PyQt6.QtGui.QKeyEvent) None

Allow to manually rest a value from NaN.

setValue(val: int) None

Display nan and inf as text.

stepBy(steps: int) None

Handle stepping value depending con caret position.

textFromValue(v: int) str

Make sure nan and inf will be represented by NaN.

value() int

Return nan instead of trying convert it.

valueFromText(text: str | None) int

Convert text to value.

Parameters:

text (str) – Input text.

Returns:

value

Return type:

int

wheelEvent(e: QWheelEvent | None) None

Overwrite to disable accidental change of values via the mouse wheel.

class esibd.core.LedIndicator(*args: Any, **kwargs: Any)

Simple custom LED indicator.

mousePressEvent(e: QMouseEvent | None) None

Allow to open context menu while preventing change of LedIndicator state by user.

property offColor: PyQt6.QtGui.QColor

Off color.

property onColor: PyQt6.QtGui.QColor

On color.

class esibd.core.LineEdit(*args: Any, **kwargs: Any)

LineEdit with input validation and custom signal onEditingFinished.

onEditingFinished() None

Process new value and update tree if applicable after editing was finished by Enter or loosing focus.

onTextChanged(text: str) None

Validate text and adjust width after text was changed by user or setText.

Parameters:

text (str) – The new text.

onTextEdited() None

Set flag to indicate text was edited by user but editing is not yet finished, emitted on every keystroke.

sizeHint() PyQt6.QtCore.QSize

Return reasonable size hint based on content within minimum and maximum limits.

validateInput() None

Validate the text and remove invalid characters.

class esibd.core.Logger(*args: Any, **kwargs: Any)

Redirect stderr and stdout to logfile while still sending them to Console as well.

Also shows messages on Status bar. Use print() to send messages to the logger.

close() None

Disables logging and restores stdout and stderr.

closeTestLogFile() None

Add header and close test log file.

This runs in the main thread!

flush() None

Flushes content to log file.

open() None

Activates logging of Plugin.print statements, stdout, and stderr to the log file.

openLog() None

Open the log file in an external program.

openTestLogFile(tester: str = '') None

Open the test log file for writing.

Parameters:

tester (str) – The testing plugin

print(message: str, sender: str = 'ESIBD Explorer 0.8.2', flag: PRINT = PRINT.MESSAGE) None

Augments messages and redirects to log file, statusbar, and console.

Parameters:
  • message (str) – A short and descriptive message.

  • sender (str, optional) – The name of the sending plugin.

  • flag (PRINT, optional) – Signals the status of the message, defaults to MESSAGE

printFromThreadSignal

alias of str

purge() None

Purges the log file to keep it below purgeLimit.

write(message: str, fromConsole: bool = False) None

Direct messages to terminal, log file, and Console.

Called directly from stdout or stderr or indirectly via print().

Parameters:
  • message (str) – The message.

  • fromConsole (bool) – Indicates if called from Console while executing code and intercepting stdout.

writeToLogAndTerminal(message: str) None

Write to log files only. Save to use without creating stdout recursion.

Parameters:

message (str) – The message.

class esibd.core.MZCalculator(parentPlugin: Plugin, ax: Axes | None = None)

Add to a class derived from Scan.

Allows to mark mass to charge (m/z) locations within a charge-state distribution, calculates absolute mass, and displays it on the axis. Use Ctrl + left mouse click to mark and Ctrl + right mouse click to reset.

addMZ(x: float, y: float) None

Add a single m/z value and evaluates the likely mass.

Parameters:
  • x (float) – m/z value.

  • y (float) – Intensity.

clear() None

Clear all data and removes labels.

determine_mass_to_charge() None

Estimate charge states based on m/z values provided by user by minimizing standard deviation of absolute mass within a charge state series.

Provides standard deviation for neighboring series to allow for validation of the result.

mass_string(offset: int, label: str) str

Indicate mass and standard deviation.

Parameters:
  • offset (int) – Charge offset relative to likely charge.

  • label (str) – Descriptor for type of estimation.

Returns:

Complete string.

Return type:

str

msOnClick(event: matplotlib.backend_bases.Event) None

Add a new m/z value for Ctrl+left mouse click.

Clears all data and labels for Ctrl+right mouse click.

Parameters:

event (Event) – The click event.

setAxis(ax: matplotlib.axes.Axes) None

Set the axes and canvas to be used.

Parameters:

ax (matplotlib.axes) – A matplotlib axes.

update_mass_to_charge() None

Update labels indicating mass and mass-to-charge values.

class esibd.core.MetaChannel(parentPlugin: ChannelManager | Scan | StaticDisplay, name: str = '', unit: str = '', recordingData: np.ndarray | DynamicNp | None = None, initialValue: float | None = None, recordingBackground: np.ndarray | None = None, inout: INOUT | None = None)

Manage metadata associated with a channel by a Scan or LiveDisplay.

Allows to restore data even if corresponding channels do not exist anymore.

namestr

The scan channel name is usually the same as the name of the corresponding Channel.

datanumpy.array

Scan data is saved and restored automatically. Each scan is free to define its data with arbitrary dimensions.

initialvar

Initial value. Used to restore all conditions after scan has completed.

backgroundnumpy.array

If used, has to be of same dimension as data.

unitstr

The channel unit.

channel: PluginManager

The actual channel, if it exists.

connectSource(giveFeedback: bool = False) None

Connect the sourceChannel.

Parameters:

giveFeedback (bool, optional) – Report on success of connection, defaults to False

display() bool

Indicate of the source channel should be displayed.

onDelete() None

Provide onDelete for channel API consistency.

class esibd.core.MouseInterceptor(*args: Any, **kwargs: Any)

Intercepts mouse clicks and applies ripple effect.

eventFilter(a0: QObject | None, a1: QEvent | None) bool

Intercept mouse clicks and applies ripple effect.

Parameters:
  • a0 (QObject) – Sender of the event.

  • a1 (QEvent) – The Event.

Returns:

Indicates if the event has been handled. Always False as we want to add the ripple effect without altering anything else.

Return type:

bool

ripple(x: int, y: int, color: PyQt6.QtGui.QColor) None

Initialize an instance of the RippleEffect at the given location.

Parameters:
  • x (int) – X position.

  • y (int) – Y position.

  • color (QColor) – Ripple color.

rippleEffectSignal

alias of int

class esibd.core.MultiState(label: Enum, toolTip: str, icon: Icon)

Represents a state of a MultiStateAction including label, toolTip and icon.

class esibd.core.MultiStateAction(*args: Any, **kwargs: Any)

Show different icons depending on multiple states.

Values are restored using QSettings if name is provided.

getIcon() Icon

Get the icon. API consistent with other Action classes.

getToolTip() str

Get the tooltip. API consistent with other Action classes.

rollState() None

Roll to next state.

setValue(value: Enum) None

Set action state. API consistent with other Action classes.

Parameters:

value (Enum) – A valid label corresponding to one of the defined states.

property state: Enum

Label representation of current state.

stateFromEnum(state: Enum) int

Return state corresponding to provided label.

Parameters:

state (Enum) – State Enum.

Returns:

Index of corresponding state, defaults to 0.

Return type:

int

updateIcon() None

Update icon and icon toolTip based on current state.

class esibd.core.NumberBar(*args: Any, **kwargs: Any)

A bar that displays line numbers of an associated editor.

updateTheme() None

Change between dark and light themes.

update_on_scroll(rect, scroll) None

Update NumberBar when scrolling in editor.

update_width(string) None

Adjust with to number of required digits.

class esibd.core.Parameter(name: str, parameterParent: SettingsManager | Channel, default: ParameterType | None = None, parameterType: PARAMETERTYPE | None = None, column: int = 1, items: str = '', fixedItems: bool = False, widget: QWidget | None = None, internal: bool = False, tree: QTreeWidget | None = None, itemWidget: QTreeWidgetItem | None = None, toolTip: str = '', event: Callable | None = None, minimum: float | None = None, maximum: float | None = None, indicator: bool = False, restore: bool = True, instantUpdate: bool = True, displayDecimals: int = 2)

Parameters are used by Settings and Channels.

They take care of providing consistent user controls, linking events, input validation, context menus, and restoring values. Typically they are not initialized directly but via a parameterDict() from which Settings and Channels take the relevant information.

addItem(value: str) None

Add an item to a combobox and selects it.

Parameters:

value (str) – The new value to be added.

advanced: bool

If True, parameter will only be visible in advanced mode.

applyChangedEvent() None

Assign events to the corresponding controls.

Even indicators should be able to trigger events, e.g. to update dependent channels.

applyWidget() None

Create UI widget depending on parameterType.

Links dedicated widget if provided.

attr: str

Allows direct access to the parameter. Only applies to channel and settings parameters.

E.g. The color parameter of a channel specifies attr=’color’ and can thus be accessed via channel.color.

E.g. The Session path parameter in Settings specifies attr=’sessionPath’ and can thus be accessed via Settings.sessionPath.

E.g. The interval parameter of a device specifies attr=’interval’ and can thus be accessed via device.interval.

E.g. The notes parameter of a scan specifies attr=’notes’ and can thus be accessed via scan.notes.

changedEvent() None

Event that is triggered when the value of the Parameter changes.

Depending on the type and configuration of Parameter specific additional events will be triggered.

containerize(widget: PushButton | ToolButton | ColorButton | CheckBox | Label | CompactComboBox | LineEdit | LedIndicator | LabviewSpinBox | LabviewDoubleSpinBox | LabviewSciSpinBox) PyQt6.QtWidgets.QWidget

Add a container around the widget that ensures correct handling of visibility and color changes.

Parameters:

widget (QWidget) – The widget to be added to a container.

Returns:

The container containing the widget.

Return type:

QWidget

property default: str | Path | int | float | PyQt6.QtGui.QColor | bool | None

The default value.

displayDecimals: int

Number of decimal places to display if applicable.

editCurrentItem(value: str) None

Edits currently selected item of a combobox.

Parameters:

value (str) – The new value to be validated.

equals(value: str | Path | int | float | PyQt6.QtGui.QColor | bool) bool

Return True if a representation of value matches the value of the Parameter.

Parameters:

value (ParameterType) – The value to compare against.

Returns:

True if value equals self.value.

Return type:

bool

event: Callable | None

A function that will be triggered when the parameter value changes.

extraEvents: list[Callable]

Used to add internal events on top of the user assigned ones.

fixedItems: bool

Indicates if list of items can be edited by the user or should remain fixed.

formatValue(value: str | Path | int | float | PyQt6.QtGui.QColor | bool | None = None) str

Format value as a string, depending on Parameter type.

Parameters:

value (ParameterType, optional) – A value to be formatted using the Parameter formatting, defaults to None and uses self.value

Returns:

Formatted value as text.

Return type:

str

fullName: str

Will contain path of Setting in HDF5 file if applicable.

getWidget() PushButton | ToolButton | ColorButton | CheckBox | Label | CompactComboBox | LineEdit | LedIndicator | LabviewSpinBox | LabviewDoubleSpinBox | LabviewSciSpinBox | None

Return the widget used to display the Parameter value in the user interface.

header: str

Header used for the corresponding column in list of Channels. The parameter name is used if not specified. Only applies to channel parameters.

indicator: bool

Indicators cannot be edited by the user.

initContextMenu(pos: PyQt6.QtCore.QPoint) None

Initialize the context menu of the parent at the location of the Parameter.

Parameters:

pos (QPoint) – The position of the context menu.

instantUpdate: bool

By default, events are triggered as soon as the value changes. If set to False, certain events will only be triggered if editing is finished by the enter key or if the widget loses focus.

internal: bool

Set to True to save parameter value in the registry (using QSetting) instead of configuration files. This can help to reduce clutter in configuration files and restore essential parameters even if configuration files get moved or lost.

itemWidget: QTreeWidgetItem | None

Widget used to display the value of the parameter. None if parameter is part of a channel. Defined if it is part of a Setting.

property items: list[str]

List of items for parameters with a combobox.

makeDefault() None

Make current value the default value.

max: float | None

Maximum limit for numerical properties.

min: float | None

Minimum limit for numerical properties.

name: str

The parameter name. Only use last element of fullName in case its a path.

parameterType: PARAMETERTYPE

The parameterType determines which widget is used to represent the parameter in the user interface.

print: Callable

Reference to print().

removeCurrentItem() None

Remove currently selected item from combobox.

safeConnect(control: PyQt6.QtWidgets.QWidget, signal: PyQt6.QtCore.pyqtBoundSignal, event: Callable) None

Make sure there is never more than one event assigned to the signal.

Parameters:
  • control (QWidget) – The control emitting the signal.

  • signal (pyqtSignal) – The signal.

  • event (Callable) – The event to be connected to the signal.

setEnabled(enabled: bool) None

Control user access using setEnabled or setReadOnly depending on the widget type.

Parameters:

enabled (bool) – The requested enabled state.

setHeight(height: float | None = None) None

Set the height of the Parameter while accounting for different types of Parameter widgets.

Parameters:

height (float, optional) – Target height, defaults to None

setToDefault() None

Set Parameter value to its default.

setValueChanged() None

Indicate that value actually changed.

The changedEvent might be ignored e.g. if there was an input but the value did not change.

setValueWithoutEvents(value: str | Path | int | float | PyQt6.QtGui.QColor | bool | None) None

Set the parameter value without triggering valueChanged Events.

In most cases, use parameter.value = value instead.

Parameters:

value (ParameterType | None) – The new value.

setVisible(visible: bool) None

Set parameter visibility.

Parameters:

visible (bool) – Visible or hidden.

settingEvent() None

Extend to manage changes to settings.

toolTip: str

Tooltip used to describe the parameter.

tree: QTreeWidget | None

None, unless the parameter is used for settings.

validateComboInput(value: str) bool

Validate input for comboboxes.

Parameters:

value (str) – The new value to be validated.

Returns:

True if valid.

Return type:

bool

property value: str | Path | int | float | PyQt6.QtGui.QColor | bool | None

Return value in correct format, based on parameterType.

widget: QWidget | None

A custom widget that will be used instead of the automatically provided one.

class esibd.core.ParameterWidget

Implement functionality shared by all parameter widgets.

class esibd.core.PlotCurveItem(*args: Any, **kwargs: Any)

PlotCurveItem that stores a reference to its parent and legend to allow for clean removal of references before deletion.

class esibd.core.PlotDataItem(*args: Any, **kwargs: Any)

PlotCurveItem that stores a reference to its parent and legend to allow for clean removal of references before deletion.

class esibd.core.PlotItem(*args: Any, **kwargs: Any)

PlotItem providing xyLabel.

connectMouse() None

Connect the mouse to the scene to update xyLabel. Plot when user moves or rescales x range.

property dragging: bool

Indicate if dragging event has been called recently.

finalizeInit() None

Apply final formatting.

init() None

Init plotItem formatting and events.

mouseMoveEvent(event: QGraphicsSceneMouseEvent | None) None

Update the xyLabel with the current position.

Parameters:

event (QGraphicsSceneMouseEvent) – The mouseMoveEvent

parentPlot() None

Plot if Xrange changed by user.

When looking at larger x ranges sections might not be shown due to data thinning. Make sure the number of displayed data points is appropriate for your data.

class esibd.core.PlotWidget(*args: Any, **kwargs: Any)

PlotWidget providing xyLabel.

property legend: pg.LegendItem | None

The plot legend.

class esibd.core.PluginManager

The PluginManager is responsible for loading all internal and external Plugins.

It catches errors or incompatibilities while loading, initializing, and closing plugins. Users will only see the plugin selection interface accessed from the Settings plugin. The PluginManager can be accessed from the Console as PluginManager. It allows plugins to interact by using unique plugin names as attributes, e.g. self.pluginManager.ISEG or self.pluginManager.DeviceManager.

class SignalCommunicate(*args: Any, **kwargs: Any)

Bundle pyqtSignals.

addPluginTreeWidgetItem(tree: PyQt6.QtWidgets.QTreeWidget, item: Mapping, name: str) None

Add a row for given plugin. If not a core plugin it can be enabled or disabled using the checkbox.

Parameters:
  • tree (QTreeWidget) – The tree used to display plugin information.

  • item (Mapping) – Dictionary with plugin information.

  • name (str) – Plugin name.

afterFinalizeInit() None

Finalize initialization after all other plugins have been initialized.

closePlugins() None

Close all open connections and leave hardware in save state (e.g. voltage off).

connectAllSources(update: bool = True) None

Connect all available source channels.

Parameters:

update (bool, optional) – Indicates that all channels should be (re-)connected. Otherwise will only attempt to connect channels that are not yet connected. Defaults to False

finalizeInit() None

Finalize initialization after all other plugins have been initialized.

finalizeUiState() None

Restores dimensions of core plugins.

getMainPlugins() list[Plugin]

Return all plugins found in the control section, including devices, controls, and scans.

getPluginsByClass(parentClasses: type[A] | tuple[type[A]]) list[A]

Return all plugins of the specified type.

Parameters:

parentClasses ('Plugin' | 'list[Plugin]') – A single class or list of classes.

Returns:

List of matching plugins.

Return type:

[Plugin]

getPluginsByType(pluginTypes: PLUGINTYPE | list[PLUGINTYPE]) list[Plugin]

Return all plugins of the specified type.

Parameters:

pluginTypes (PLUGINTYPE()) – A single type or list of types.

Returns:

List of matching plugins.

Return type:

[Plugin]

loadPlugin(Plugin: type[Plugin], dependencyPath: Path = WindowsPath('C:/DATA/Syncthing/Essentials/Software/PyQt/ESIBD_Explorer/esibd/media')) Plugin | None

Load a single plugin.

Plugins must have a static name and pluginType. ‘mainWindow’ is passed to enable flexible integration, but should only be used at your own risk. Enabled state is saved and restored from an independent file and can also be edited using the plugins dialog.

Parameters:
  • Plugin (Plugin) – The class of the Plugin to be loaded.

  • dependencyPath (pathlib.Path, optional) – The path where dependencies like icons are stored, defaults to None

Returns:

Instance of the plugin.

Return type:

class:~esibd.plugins.Plugin

loadPlugins() None

Load all enabled plugins.

loadPluginsFromModule(Module: ModuleType, dependencyPath: Path) None

Load plugins from a module.

Parameters:
  • Module (ModuleType) – A module providing one or multiple plugins.

  • dependencyPath (pathlib.Path, optional) – The path where dependencies like icons are stored, defaults to None

loadPluginsFromPath(path: Path | None) None

Load plugins from a path.

Parameters:

path (pathlib.Path) – The path in which to look for plugins.

property loading: bool

Flag that can be used to suppress events while plugins are loading, initializing, or closing.

managePlugins() None

Select which plugins should be enabled.

provideDocks() None

Create docks and positions them as defined by pluginType.

reconnectSource(name: str) None

Try to reconnect linked channels if applicable.

This is needed e.g. after renaming, moving, or deleting channels. If the channel has been deleted, the reconnection attempt will fail and and the linking channel will indicated that no source has been found.

Parameters:

name (str) – Channel name to reconnect.

resetMainDisplayWidgetLimits() None

Reset limits to allow for user scaling of plugin sizes.

property resizing: bool

Indicates if any plugin is currently resizing.

runTestParallel() None

Run test of all plugins from parallel thread.

showThreads() None

Show all currently running threads in the Text plugin.

stopTest() None

Stop test after current step completes.

test() None

Test most features of for all plugins. Calls runTestParallel().

property testing: bool

Indicates if the PluginManager or any individual plugin is currently testing.

toggleTitleBar(update: bool = False) None

Toggles between showing icons or text in tabs.

Parameters:

update (bool, optional) – Indicates if the list of tabBars should be updated, defaults to False

toggleTitleBarDelayed(update: bool = False, delay: int = 500) None

Delay toggleTitleBar until GUI updates have been completed.

Parameters:
  • update (bool, optional) – Indicates if the list of tabBars should be updated, defaults to False

  • delay (int, optional) – Delay in ms, defaults to 500

toggleVideoRecorder() None

Toggles visibility of videoRecorderActions for all plugins.

updateTheme() None

Update application theme while showing a splash screen if necessary.

class esibd.core.PushButton(*args: Any, **kwargs: Any)

PushButton as ParameterWidget.

class esibd.core.RelayChannel

Channel that wraps another sourceChannel. Used to display and access some elements of sourceChannel in other parts of the program.

property acquiring: bool

SourceChannel.acquiring if available. Default provided.

property active: bool

SourceChannel.active if available. Default provided.

property color: str

SourceChannel.color if available. Default provided.

property enabled: bool

SourceChannel.enabled if available. Default provided.

getDevice() ChannelManager | Device | Scan

SourceChannel.getDevice() if available. Default provided.

getQtLineStyle() PyQt6.QtCore.Qt.PenStyle

SourceChannel.QtLineStyle if available. Default provided.

getRecordingData() ndarray | None

SourceChannel.getRecordingData() if available. Default provided.

getValues(length: int | None = None, index_min: int | None = None, index_max: int | None = None, n: int = 1, subtractBackground: bool = False) ndarray | None

SourceChannel.getValues() if available. Default provided.

Parameters:
  • length (int) – will return last ‘length’ values.

  • index_min (int) – Index of lower limit.

  • index_max (int) – Index of upper limit.

  • n (int, optional) – Will only return every nth value, defaults to 1

  • subtractBackground (bool, optional) – Indicates if the background should be subtracted, defaults to False

Returns:

The array of values.

Return type:

np.ndarray

property linestyle: str

SourceChannel.linestyle if available. Default provided.

property linewidth: int

SourceChannel.linewidth if available. Default provided.

property logY: bool

SourceChannel.logY if available. Default provided.

property max: int | float

SourceChannel.max if available. Default provided.

property min: int | float

SourceChannel.min if available. Default provided.

property real: bool

SourceChannel.real if available. Default provided.

property recording: bool

SourceChannel.recording if available. Default provided.

property smooth: int

SourceChannel.smooth if available. Default provided.

subtractBackgroundActive() bool

SourceChannel.subtractBackgroundActive() if available. Default provided.

property value: int | float

SourceChannel.value if available. Default provided.

property waitToStabilize: bool

SourceChannel.waitToStabilize if available. Default provided.

class esibd.core.ReplWidget(*args: Any, **kwargs: Any)

Add logging to terminal and log files. See original class for Documentation.

displayException() None

Display the current exception and stack.

Also print to terminal and log files.

runCmd(cmd: str) None

Print command to terminal and log files.

Parameters:

cmd (str) – console command

class esibd.core.RestoreFloatComboBox(*args: Any, **kwargs: Any)

ComboBox that allows to restore its value upon restart using an internal Setting.

class esibd.core.RippleEffect(*args: Any, **kwargs: Any)

Creates a fading ripple effect at the clicked QAction.

expand() None

Expand and fades the ripple effect.

paintEvent(a0: QPaintEvent | None) None

Draws the ripple effect.

Parameters:

a0 (QPaintEvent) – The paint event.

class esibd.core.ScanChannel(*args: Any, **kwargs: Any)

Minimal UI for abstract PID channel.

connectSource(giveFeedback: bool = False) None

Connect the sourceChannel.

Parameters:

giveFeedback (bool, optional) – Report on success of connection, defaults to False

getDefaultChannel() dict[str, dict]

Define Parameter(s) of the default Channel.

This is also use to assign parameterTypes, if Parameters are visible outside of advanced mode, and many other parameter properties. See parameterDict(). If parameters do not exist in the settings file, the default Parameter will be added. Overwrite in dependent classes as needed.

NOTE: While parameters with attributes will be automatically accessible, it is good practice to define the type of the attribute for type checking.

getDevice() Device

SourceChannel.getDevice() if available. Default provided.

initGUI(item: dict) None

Initialize Channel GUI.

Call after corresponding QTreeWidgetItem has been added to tree. Item needs parent for all graphics operations.

Parameters:

item (dict) – Dictionary containing all channel information.

property loading: bool

Indicates if the corresponding device is currently loading.

onDelete() None

Extend to handle events on deleting. E.g. handle references that should remain available.

relayValueEvent() None

Update value when sourceChannel.value changed.

removeEvents() None

Remove extra events from sourceChannel.

setDisplayedParameters() None

Determine which parameters to use and in what order.

Extend using insertDisplayedParameter() to add more parameters.

tempParameters() list[str]

Return list of tempParameters.

ScanChannels are not restored from file, thus every parameter is a tempParameter.

updateDisplay() None

Update live and static displays.

class esibd.core.SciAxisItem(*args: Any, **kwargs: Any)

Version of original logTickStrings that provide improved formatting of tick labels.

Only difference to source code is 0.1g -> .0e and consistent use of 1 = 10⁰.

class esibd.core.Setting(*args: Any, **kwargs: Any)

Parameter to be used as general settings with dedicated UI controls instead of being embedded in a channel.

resetWidget() None

Return widget back to the Settings tree.

setWidget(widget: PyQt6.QtWidgets.QWidget) None

Allow to change to custom widget after initialization. E.g. to move a Setting to a more logical position outside the Settings tree.

Parameters:

widget (QWidget) – An appropriate widget to display the Setting value.

settingEvent() None

Execute internal validation based on Setting type.

Saves parameters to file or qSet to make sure they can be restored even after a crash. Finally executes Setting specific event if applicable.

toolTip: str

Tooltip used to describe the parameter.

class esibd.core.SplashScreen(*args: Any, **kwargs: Any)

Program splash screen that indicates loading.

animate() None

Advances to the next frame.

close() bool

Close the splash screen.

show() None

Show the splash screen.

class esibd.core.StateAction(*args: Any, **kwargs: Any)

Show different icons depending on a state.

Values are restored using QSettings if name is provided.

getIcon() Icon

Get the icon. API consistent with other Action classes.

getToolTip() str

Get the tooltip. API consistent with other Action classes.

setValue(value: bool) None

Set action state. API consistent with other Action classes.

Parameters:

value (bool) – New state.

property state: bool

Returns the state.

toggle() bool

Toggles the state.

updateIcon(state: bool) None

Update icon and icon toolTip.

Parameters:

state (bool) – The state for which icon and toolTip should be set.

class esibd.core.StdoutInterceptor(*args: Any, **kwargs: Any)

Add logging to terminal and log files. See original class for Documentation.

write(strn: str) None

Print response to terminal and log files.

Parameters:

strn (str) – response to input command

class esibd.core.TextEdit(*args: Any, **kwargs: Any)

Editor that is compatible with NumberBar.

class esibd.core.ThemedConsole(*args: Any, **kwargs: Any)

pyqtgraph.console.ConsoleWidget with colors adjusting to theme.

scrollToBottom() None

Scrolls to bottom to show recently added messages.

updateTheme() None

Change between dark and light themes.

class esibd.core.ThemedNavigationToolbar(*args: Any, **kwargs: Any)

Provide controls to interact with the figure.

Adds light and dark theme support to NavigationToolbar2QT.

save_figure(*args) None

Adjust theme used for saved figure.

updateNavToolbarTheme() None

Change color of icons in matplotlib navigation toolBar to match theme.

class esibd.core.TimeoutLock(lockParent: Plugin | DeviceController | Logger)

Specify a timeout inside a with statement.

Can be used as normal Lock or optionally using ‘with self.lock.acquire_timeout(1) as lock_acquired:’.

acquire(blocking: bool = True, timeout: int = -1) bool

Acquires the lock.

Parameters:
  • blocking (bool, optional) – If it is set to True, the calling thread will be blocked if some other thread is holding the flag and once that lock is released, then the calling thread will acquire the lock and return True. If it is set to False, it will not block the thread if the lock is already acquired by some other thread, and will return False. Defaults to True

  • timeout (int, optional) – Timeout for lock acquisition, defaults to -1

Returns:

True if lock has been acquired.

Return type:

bool

acquire_timeout(timeout: int, timeoutMessage: str = '', already_acquired: bool = False)

Acquire lock.

Shows timeoutMessage if lock could not be acquired before timeout expires.

Parameters:
  • timeout (float, optional) – timeout in seconds

  • timeoutMessage (str, optional) – Message shown in case of a timeout, defaults to ‘’

  • already_acquired (bool, optional) – True if lock has already been acquired in callstack. Use to prevent deadlocks

Yield:

True if lock is acquired

Return type:

bool

release() None

Releases the lock.

class esibd.core.ToolButton(*args: Any, **kwargs: Any)

Allows to set values in a widget in a consistent way.

class SignalCommunicate(*args: Any, **kwargs: Any)

Bundle pyqtSignals.

setValueFromThreadSignal

alias of bool

setValue(value: bool) None

Set value using consistent API for parameter widgets.

Parameters:

value (bool) – New checked state.

class esibd.core.TreeWidget(*args: Any, **kwargs: Any)

A TreeWidget with extended options to control its height.

count_child_items(item: PyQt6.QtWidgets.QTreeWidgetItem) int

Count the number of child items of a QTreeWidgetItem.

Parameters:

item (QTreeWidgetItem) – The item of which the children should be counted.

Returns:

The child count.

Return type:

int

expandAllItems(depth: int = 1) None

Expand all Items up to a given level.

Parameters:

depth (int, optional) – Limit expansion depth to prevent infinite loops (e.g. channel.device.channel.device…), defaults to 1

grabItems() PyQt6.QtGui.QPixmap

Grab a QPixmap of the items.

itemRect() PyQt6.QtCore.QRect

Return the QRect of all visible items.

itemWidth() int

Width of fist visible item.

item_depth(item: PyQt6.QtWidgets.QTreeWidgetItem) int

Recursively count item depth from root (root = 0).

Parameters:

item (QTreeWidgetItem) – The item for which to return the depth.

Returns:

item depth

Return type:

int

sizeHint() PyQt6.QtCore.QSize

SizeHint with custom minimal or complete height.

totalHeight(limit: int = 0) int

Total height of all items.

Parameters:

limit (int, optional) – Limit the number of items considered, defaults to 0

Returns:

_description_

Return type:

int

totalItems() int

Total number of items at top level and first child level.

tree_height_hint_complete() int

Calculate the complete height, corresponding to all items.

tree_height_hint_minimal() int

Calculate the minimal height, corresponding to up to 6 items.

class esibd.core.TreeWidgetItem(*args: Any, **kwargs: Any)

TreeWidgetItem with path_info.

class esibd.core.VideoRecorder(parentPlugin: Plugin)

Allows to record videos of a plugin.

capture_frame() None

Capture a single video frame.

startRecording() None

Initialize video recorder and starts recording.

stopRecording() None

Stop recording and finalizes the video file.

class esibd.core.ViewBox(*args: Any, **kwargs: Any)

ViewBox providing mouseEnabledChangedUser event.

setMouseEnabled(x: bool | None = None, y: bool | None = None) None

Call user event if values have changed.

Parameters:
  • x (bool | None, optional) – x enabled state, defaults to None

  • y (bool | None, optional) – y enabled state, defaults to None

userMouseEnabledChanged

alias of bool

esibd.core.parameterDict(name: str = '', value: ParameterType | None = None, default: ParameterType | None = None, minimum: float | None = None, maximum: float | None = None, toolTip: str = '', items: str | None = None, fixedItems: bool = False, tree: QTreeWidget | None = None, parameterType: PARAMETERTYPE | None = None, advanced: bool = False, header: str = '', widget: QWidget | None = None, event: Callable | None = None, internal: bool = False, attr: str = '', indicator: bool = False, restore: bool = True, instantUpdate: bool = True, displayDecimals: int = 2) dict[str, str | Path | int | float | PyQt6.QtGui.QColor | bool | PyQt6.QtWidgets.QTreeWidget | PARAMETERTYPE | PyQt6.QtWidgets.QWidget | Callable | None]

Provide default values for all properties of a Parameter.

Parameters:
  • name (str, optional) – The Parameter name. Only use last element of fullName in case its a path, defaults to ‘’

  • value (ParameterType, optional) – The value of the Parameter in any supported type, defaults to None

  • default (ParameterType, optional) – The default value of the Parameter in any supported type, defaults to None

  • minimum (float, optional) – Minimum limit for numerical properties, defaults to None

  • maximum (float, optional) – Maximum limit for numerical properties., defaults to None

  • toolTip (str, optional) – ToolTip used to describe the Parameter, defaults to ‘’

  • items (str, optional) – Coma separated list of options for parameters with a comboBox, defaults to None

  • fixedItems (bool, optional) – Indicates if list of items can be edited by the user or should remain fixed., defaults to False

  • tree (QTreeWidget, optional) – None, unless the Parameter is used for settings., defaults to None

  • parameterType (esibd.core.PARAMETERTYPE, optional) – The parameterType determines which widget is used to represent the Parameter in the user interface, defaults to None

  • advanced (bool, optional) – If True, Parameter will only be visible in advanced mode, defaults to False

  • header (str, optional) – Header used for the corresponding column in list of Channels. The Parameter name is used if not specified. Only applies to Channel Parameters. Defaults to ‘’

  • widget (QWidget, optional) – A custom widget that will be used instead of the automatically provided one., defaults to None

  • event (Callable, optional) – A function that will be triggered when the Parameter value changes, defaults to None

  • internal (bool, optional) – Set to True to save Parameter value in the registry (using QSetting) instead of configuration files. This can help to reduce clutter in configuration files and restore essential Parameters even if configuration files get moved or lost. Defaults to False

  • attr (str, optional) – Allows direct access to the Parameter. Only applies to Channel and Settings Parameters. Defaults to ‘’

  • indicator (bool, optional) – Indicators cannot be edited by the user, defaults to False

  • restore (bool, optional) – Indicates if the parameter will be restored, defaults to True. Note that temp parameters of channels will never be restored.

  • instantUpdate (bool, optional) – By default, events are triggered as soon as the value changes. If set to False, certain events will only be triggered if editing is finished by the enter key or if the widget loses focus. Defaults to True

  • displayDecimals (int, optional) – Number of decimal places to display if applicable, defaults to 2

Returns:

Dictionary containing all Parameter information.

Return type:

dict[str, ParameterType]

Constants

Defines constants used throughout the package.

class esibd.const.Colors

Provides dark mode dependent default colors.

property bg: str

Background color.

property bgAlt1: str

First alternative background color.

property bgAlt2: str

Second alternative background color.

property blue: str

ESIBD blue.

property fg: str

Foreground color.

property green: str

ESIBD green.

property highlight: str

Highlight color.

property red: str

ESIBD red.

property yellow: str

ESIBD yellow.

class esibd.const.INOUT(value)

Specify if a function affects only input, only output, or all Channels.

ALL = 4

Input and output and all others.

BOTH = 2

Both input and output.

IN = 0

Input

NONE = 3

Neither input nor output.

OUT = 1

Output

class esibd.const.PARAMETERTYPE(value)

Specifies what type of widget should be used to represent the Parameter in the user interface.

BOOL = 'BOOL'

A boolean, represented by a checkbox.

COLOR = 'COLOR'

A ColorButton that allows to select a color.

COMBO = 'COMBO'

A combobox providing text options.

EXP = 'EXP'

A spinbox with scientific format.

FLOAT = 'FLOAT'

A floating point spinbox.

FLOATCOMBO = 'FLOATCOMBO'

A combobox providing floating point options.

INT = 'INT'

An integer spinbox.

INTCOMBO = 'INTCOMBO'

A combobox providing integer options.

LABEL = 'LABEL'

A label that displays information.

PATH = 'PATH'

A path to a file or directory.

TEXT = 'TEXT'

An editable text field.

class esibd.const.PLUGINTYPE(value)

Each plugin must be of one of the following types to define its location and behavior.

CHANNELMANAGER = 'Channel Manager'

A plugin that manages channels which are neither inputs or outputs.

CONSOLE = 'Console'

The internal Console.

CONTROL = 'Generic Control'

Any control plugin, will be placed next to Settings, Explorer, Devices, and Scans.

DEVICEMGR = 'DeviceManager'

Device manager, will be placed below live displays.

DISPLAY = 'Display'

Any display plugin, will be places next to scan displays and static displays.

INPUTDEVICE = 'Input Device'

Device plugin sending user input to hardware.

INTERNAL = 'Internal'

A plugin without user interface.

LIVEDISPLAY = 'LiveDisplay'

Live display associated with a device.

OUTPUTDEVICE = 'Output Device'

Device plugin sending hardware output to user.

SCAN = 'Scan'

Scan plugin, will be placed with other controls.

class esibd.const.PRINT(value)

Specify type of message in Plugin.print.

CONSOLE = 4

Tag message as Console input or output.

DEBUG = 5

Only show if debug flag is enabled.

ERROR = 3

Tag message as error.

EXPLORER = 0

Key messages by Explorer

MESSAGE = 1

A standard message.

TRACE = 7

All messages, including detailed trace of instrument communication.

VERBOSE = 6

Additional details that would be distracting if not needed for specific test.

WARNING = 2

Tag message as warning.

esibd.const.datasetToStrList(dataset: Dataset) list[str]

Convert a h5py string dataset into a list of str.

Parameters:

dataset (h5py.Dataset) – The dataset.

Returns:

The list.

Return type:

list[str]

esibd.const.dynamicImport(module: str, path: Path | str) ModuleType | None

Import a module from the given path at runtime.

This is more general and robust than importing modules relative to plugin path.

Parameters:
  • module (str) – module name

  • path (Path | str) – module path

Returns:

Module

Return type:

ModuleType

esibd.const.getClipboardTheme() bool

Get the dark clipboard mode from Settings.

Returns:

Dark clipboard mode

Return type:

bool

esibd.const.getDPI() int

Get the DPI from Settings.

Returns:

DPI

Return type:

int

esibd.const.getDarkMode() bool

Get the dark mode from Settings.

Returns:

Dark mode

Return type:

bool

esibd.const.getDebugMode() bool

Get the debug mode from Settings.

Returns:

Debug mode

Return type:

bool

esibd.const.getIconMode() str

Get the icon mode from Settings.

Returns:

Icon mode

Return type:

str

esibd.const.getLogLevel(asString: bool = False) int | str

Get the log level from Settings.

Parameters:

asString (str) – Indicate if the log level should be returned as a string.

Returns:

Log level

Return type:

int | str

esibd.const.getTestMode() bool

Get the test mode from Settings.

Returns:

Test mode

Return type:

bool

esibd.const.getValidConfigPath() Path

Get validated configuration path.

Returns:

Validated path and indication if path has changed during validation.

Return type:

pathlib.Path, bool

esibd.const.getValidDataPath() Path

Get validated data path.

Returns:

Validated path and indication if path has changed during validation.

Return type:

pathlib.Path, bool

esibd.const.getValidPluginPath() Path

Get validated plugin path.

Returns:

Validated path and indication if path has changed during validation.

Return type:

pathlib.Path, bool

esibd.const.infoDict(name: str) dict[str, str]

Return a dictionary with general information, usually used to add this information to exported files.

Parameters:

name (str) – Usually the name of the plugin requesting the infoDict.

Returns:

infoDict

Return type:

dict

esibd.const.makeSettingWrapper(name: str, settingsMgr: SettingsManager, docstring: str = '') property

Neutral Setting wrapper for convenient access to the value of a Setting.

If you need to handle events on value change, link these directly to the events of the corresponding control.

Parameters:
  • name (str) – The Setting name.

  • settingsMgr (esibd.plugins.SettingsManager) – The SettingsManager of the Setting.

  • docstring (str, optional) – The docstring used for the attribute, defaults to None

esibd.const.makeWrapper(name: str, docstring: str = '') property

Neutral property wrapper for convenient access to the value of a Parameter inside a Channel.

If you need to handle events on value change, link these directly to the events of the corresponding control in the finalizeInit method.

Parameters:
  • name (str) – The Parameter name.

  • docstring (str, optional) – The docstring used for the attribute, defaults to None

esibd.const.mix_hex_colors(color1: str, color2: str, ratio: float) str

Mix two hex colors by ratio.

Parameters:
  • color1 – First color, e.g. “#FF0000”

  • color2 – Second color, e.g. “#0000FF”

  • ratio – 0.0 (all color1) to 1.0 (all color2)

Returns:

Mixed hex color as string

esibd.const.openInDefaultApplication(file: str | Path) None

Open file in system default application for file type.

Parameters:

file (str / pathlib.Path) – Path to the file to open.

esibd.const.plotting(func: Callable) Callable

Decorate to check for and sets the plotting flag to make sure func is not executed before previous call is processed.

Only use within a class that contains the plotting flag. This is intended for Scans, but might be used elsewhere.

Parameters:

func (Callable) – function to add the decorator to

Returns:

decorated function

Return type:

Callable

esibd.const.pluginSupported(pluginVersion: str) bool

Test if given version is supported by comparing to current program version.

Parameters:

pluginVersion (str) – Version that the plugin supports.

Returns:

True if the plugin is supported.

Return type:

bool

esibd.const.rgb_to_hex(rgba: tuple[float, float, float, float]) str

Convert colors from rgb to hex.

Parameters:

rgba (tuple) – RGBA color tuple.

Returns:

Hex color string.

Return type:

str

esibd.const.setDarkMode(darkMode: bool) None

Set the dark mode from Settings.

Parameters:

darkMode (bool) – True if dark mode active.

esibd.const.shorten_text(text: str, max_length: int = 100) str

Shorten text e.g. for concise and consistent log file format.

Parameters:
  • text (str) – Original text.

  • max_length (int, optional) – Length after shortening. Defaults to 100

Returns:

shortened text

Return type:

str

esibd.const.smooth(data: ndarray[tuple[int, ...], dtype[float32]], smooth: int) ndarray[tuple[int, ...], dtype[float32]]

Smooth a 1D array while keeping edges meaningful.

This method is robust if array contains np.nan.

Parameters:
  • data (np.typing.NDArray[np.float32]) – Array to be smoothed.

  • smooth (int) – With of box used for smoothing.

Returns:

convolvedArray

Return type:

np.typing.NDArray[np.float32]

esibd.const.synchronized(timeout: int = 5) Callable

Decorate to add thread-safety using a lock from the instance.

NOTE: Only works with keyword arguments. Positional arguments apart form self will not be passed on.

Use with @synchronized() or @synchronized(timeout=5).

Parameters:

timeout (int, optional) – Will wait this long for lock to become available. Defaults to 5

Returns:

decorator

Return type:

decorator

esibd.const.validatePath(path: Path | str | None, default: Path) tuple[Path, bool]

Return a valid path. If the path does not exist, falling back to default.

If default does not exist it will be created.

Parameters:
  • path (pathlib.Path) – Valid path

  • default (pathlib.Path) – Default path that is returned if path is not valid.

Returns:

Validated path and indication if path has changed during validation.

Return type:

pathlib.Path, bool