这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

数据分析模块

如何分析内容并根据您的需求输出需要的数据。

quatm.analysis package

Submodules

quatm.analysis.bright_spots module

Detect bright spots such as ions in an image. We use skimage.features.blob_dog for bright spot detection.

Input:

  • Imagestream

Output:

  • Imagestream:
    • np.array: Mask containing ones on the locations where the bright spots are
    • dict: N_bright the number of bright spots detected
  • Datastream:
    • bloblist: the locations of the bright spots
    • dict: N_bright the number of bright spots detected

Properties:

  • imagestreams ([str]): Input streams
  • max_sigma (float): Parameter from blob_dog
  • threshold (float): Parameter from blob_dog

Hint: Use the output stream as a mask in the image monitor.

class quatm.analysis.bright_spots.BrightSpots(name)

Bases: object

run()

quatm.analysis.bright_spots.main_run(name)

quatm.analysis.crashit module

Simulate a crashed analysis routine.

quatm.analysis.gaussfit module

Perform a 1D Gaussian fit on a dataset.

Fit function: [ f(x) = \frac{A_0}{\sqrt{2\pi}\sigma} e^{\frac{-(x-\mu)^2}{2\sigma^2}} + C ]

Output: The output is a datastream containing a dictionary with the fit results and a 2D array containing the fitted curve.

Fit parameter nomenclature:

  • A0: ( A_0 )
  • sigma: ( \sigma )
  • pos: ( \mu )
  • offset: ( C )
  • height: ( \frac{A_0}{\sqrt{2\pi}\sigma} )

In older versions some of the parameters were named differently:

  • area: ( A_0 )
  • height: ( A_0 )

Format of the input datastream: The fit can handle two types of data:

  • 1D numpy.array (data.ndim == 1): the y-values are taken from the data, and the x values are a linear spaced index from 0 to ny.
  • 2D numpy.array:
    • x = data[0]
    • y = data[1]

Properties controlling the program:

  • datastreams: list of input datastreams

class quatm.analysis.gaussfit.Gaussfit(name)

Bases: object

run()

quatm.analysis.gaussfit.main_run(name)

quatm.analysis.imagedivider module

Handle absorption imaging data. According to Beer’s Law, light travelling through an atomic cloud is attenuated by:

[ I = I_0 e^{-n(x,y)\sigma} ]

where ( I_0 ) is the intensity before the cloud (Imaging beam without atoms) and ( I ) is the attenuated intensity (Image with atoms), ( \sigma ) is the absorption cross section, and ( n(x,y) ) is the column density of the atoms. Transforming this equation allows us to determine the column density of the atoms from the import two images.

[ n(x,y) = \frac{ln(I_0/I)}{\sigma} ]

where ( \sigma ) is given by:

[ N_{atoms} = \frac{ln(I_0/I)}{\frac{\sigma_0}{1+(2\Delta/\Gamma)^2}} ]

where effscale rescales the value from atoms per ( m^2 ) to atoms per pixel.

[ \sigma_0 = \frac{\hbar\omega\Gamma}{2 I_{sat}/C_2} ]

where ( \omega ) is the angular frequency of the laser, ( \Gamma ) is the linewidth of the transition in angular frequencies, ( I_{sat} ) is the saturation intensity in SI units, and ( C_2 ) is the Clebsh-Gordon coefficient for the dipole transition.

Properties:

  • imagestreams: input datastreams
  • imageWithAtoms: index of the image containing the image data with atoms (0 being the first image in each run)
  • imageWithoutAtoms: the image containing the image without atoms
  • absorptionCrossection: defaults to ( \sigma_0 )
  • detuning_rad: detuning of the imaging laser from resonance
  • linewidth_rad: linewidth of the transition

class quatm.analysis.imagedivider.ImageSlice(name)

Bases: object

  • C_2 = 0.6666666666666666
  • gamma = 36897377.3978814
  • h_bar = 1.0545716346179718e-34
  • isat = 25.4
  • omega = 2807325165778985.0
run()
  • sig0 = 1.4335384024006802e-13

quatm.analysis.imagedivider.main_run(name)

quatm.analysis.imageselector module

Select one single image per shot from the stream using the imgindex.

Input:

  • One image stream

Output:

  • Imagestream: the selected image

Properties:

  • imagestreams: ([str]) input image streams
  • SelectedImage: (int) the number of the image to be selected counting from 0.

class quatm.analysis.imageselector.ImageSlice(name)

Bases: object

run()

quatm.analysis.imageselector.main_run(name)

quatm.analysis.imageslice module

Create linear traces and small subregions from image stream.

![Imageslice]

Input:

  • Imagestream

Output:

  • colsum_ (datastream): summation in the direction of columns (use only row that lie within the region of interest. (gray area))
  • rowsum_ (datastream): summation along rows
  • colsumcut_, rowsumcut_: use only data within the region of interest
  • colint, rowint, colintcut, rowintcut: Perform numeric integration (which means the sum is multiplied by the metric pixel size)
  • (imagestream): send the image within the ROI

Properties:

  • cutimg: (bool) send the image inside the ROI
  • colsum: send the column sum
  • rowsum: send the sum over the rows
  • colsumcut, rowsumcut: (bool) send the corresponding data restricted to the region of interest
  • colint, rowint, colintcut, rowintcut: similar to the sum version but taking into account the scale. Therefore these versions can be treated as integrals

class quatm.analysis.imageslice.ImageSlice(name)

Bases: object

run()

quatm.analysis.imageslice.main_run(name)

1 - 事件分析模块

该代码定义了一些用于计算和处理物理实验数据的函数,包括计算概率、频率和数据过滤。代码还定义了一个事件函数字典 eventfunctions,其中包含了一些预定义的函数及其相关信息。这些函数主要用于统计分析和数据处理,特别是实验中测量的原子数量和频率。

代码概述

该代码定义了一些用于计算和处理物理实验数据的函数,包括计算概率、频率和数据过滤。代码还定义了一个事件函数字典 eventfunctions,其中包含了一些预定义的函数及其相关信息。这些函数主要用于统计分析和数据处理,特别是实验中测量的原子数量和频率。

依赖库

  • numpy:用于数值计算和数组操作。
  • scipy.constants:用于获取物理常数。
  • scipy.special:用于特殊函数的计算。
  • pytiamo.odt.utils:自定义工具库,用于计算 Wilson 误差。

物理常数

  • m_Li:锂原子的质量。
  • m_Ba:钡原子的质量。
  • kB:玻尔兹曼常数。

函数

P_n(data, args)

计算每个 xvalargs['n'] 的概率,并排除 args['x'] 中的值。

参数:

  • data:包含 x 和 y 值的数组。
  • args:包含 nx 的字典,n 是要计算的值,x 是要排除的值。

返回:

  • xvals:唯一的 x 值数组。
  • p:每个 x 值对应的概率。
  • [l, u]:每个概率的 Wilson 误差。
def P_n(data, args):
    n = float(args['n'])
    x = args['x']
    x = eval(x)
    if type(x) == tuple:
        x = list(x)
    else:
        x = [x]
    xvals = np.array(list(set(data[0])))
    yvals = [data[1][data[0] == i] for i in xvals]
    k = np.array([len(np.where(i==n)[0]) for i in yvals])
    N = np.array([len(i) for i in yvals])
    Nx = np.zeros(len(xvals))
    for j in x:
        Nx += np.array([len(np.where(i==j)[0]) for i in yvals])
    N = N - Nx
    p, l, u = ut.wilson_err(N, k)
    return xvals, p, [l,u]

freq(data, args)

计算每个 xvalargs['n'] 的频率和泊松误差。

参数:

  • data:包含 x 和 y 值的数组。
  • args:包含 n 的字典,n 是要计算的值。

返回:

  • xvals:唯一的 x 值数组。
  • yvals:每个 x 值对应的频率。
  • yerr:每个频率的泊松误差。
def freq(data, args):
    n = float(args['n'])
    xvals = np.array(list(set(data[0])))
    yvals = [data[1][data[0] == i] for i in xvals]
    yvals = np.array([len(np.where(i==n)[0]) for i in yvals])
    yerr = np.sqrt(yvals)
    return xvals, yvals, yerr

getFilter(data, n)

根据给定的值 n 过滤数据集,返回过滤后的数据。

参数:

  • data:包含 x 和 y 值的数组。
  • n:用于过滤数据的值。

返回:

  • filtdat:过滤后的数据数组。
def getFilter(data, n):
    dzip = [list(i) for i in zip(*data)]
    filt = filter(lambda d: d[1] == n, dzip)
    flist = list(filt)
    filtdat = [np.array(i) for i in zip(*flist)]
    return filtdat

事件函数字典 eventfunctions

包含预定义的事件函数及其相关信息,包括函数名称、公式、参数名和初始值。

eventfunctions = {
    '--None--': {
        'function_text': 'no Fitfunction',
        'arg_names': [],
        'start_values': [],
        'function': None
    },
    'P_n': {
        'name': 'P_n',
        'function_text': 'N_n/(N_tot-N_x)',
        'function': P_n,
        'arg_names': ['n', 'x'],
        'start_values': [1, 0]
    },
    'freq': {
        'name': 'freq',
        'function_text': 'N',
        'function': freq,
        'arg_names': ['n'],
        'start_values': [1]
    }
}

总结

该代码实现了一些用于物理实验数据处理的实用函数,包括计算概率、频率和数据过滤。事件函数字典 eventfunctions 提供了预定义的函数和其相关信息,方便在实验分析中使用。

2 - 表格组件

table_parameterItemtable_parameter 类扩展了 pyqtgraph 参数树的功能,使其能够以表格形式显示和编辑 NumPy 记录数组。通过注册自定义参数类型,这些类可以轻松地集成到现有的 pyqtgraph 应用程序中,提供灵活且强大的数据编辑功能。

概述

这个代码定义了一个用于编辑 NumPy 记录数组的自定义参数类型 table_parameter,并在 PyQt 环境中实现了一个表格小部件,用于显示和编辑记录数组的数据。

table_parameterItem

table_parameterItem 继承自 pTypes.WidgetParameterItem,是一个用于编辑 NumPy 记录数组的表格小部件。

主要方法

  • __init__(self, param, depth)

    • 初始化参数项,并隐藏小部件。
  • makeWidget(self)

    • 创建一个表格小部件 (QTableWidget)。
    • 获取初始值,并根据值的结构设置表格的行列数和标题。
    • 连接信号和槽,以便在表格内容更改时触发相应的操作。
  • value(self)

    • 获取表格当前的值,并返回一个 NumPy 记录数组。
    • 尝试从表格中读取数据并填充到 NumPy 数组中,如果失败则返回初始值。
  • setValue(self, arr)

    • 设置表格的值。
    • 根据提供的 NumPy 数组填充表格的每个单元格。
  • valueChanged(self, param, val, force=False)

    • 当参数值更改时调用,更新表格的显示内容。
    • 断开信号连接,更新表格值后重新连接信号,确保信号处理不会重复触发。

table_parameter

table_parameter 继承自 Parameter,用于管理和存储表格参数项的值。

主要方法

  • __init__(self, **opts)

    • 初始化参数项,传递其他参数选项。
  • setValue(self, value, blockSignal=None)

    • 设置参数项的值,并返回实际设置的值。
    • 在设置值之前断开信号连接,避免信号重复触发,设置完毕后重新连接信号。
  • valueIsDefault(self)

    • 判断当前值是否等于默认值。
    • 返回一个布尔值,表示当前值是否等于默认值。

registerParameterType 函数

使用 registerParameterType 函数将自定义参数类型 table_parameter 注册到参数树中,使其可以在参数树中使用。

使用场景

  • 该代码主要用于需要在图形用户界面中编辑和显示 NumPy 记录数组的场景。
  • 适用于科学计算、数据分析等需要处理大量数据的应用程序。
  • 提供了一种灵活的方式在 PyQt 应用程序中集成和使用表格参数项。

3 - 数据管理分析模块

这段代码实现了一个复杂的图形用户界面应用,用于科学实验数据的管理、分析和可视化。

主要功能和组件介绍

1. 数据存储管理 (H5StorageDataMgr)

  • 数据存储:通过HDF5文件格式保存和加载实验数据。
  • 数据订阅:管理数据流和图像流的订阅,确保在实验过程中捕获和存储所有相关数据。
  • 定时保存:定期自动保存数据,以防数据丢失。
  • 数据清理:在需要时清理当前加载的数据。

2. 图形用户界面 (H5StorageGui)

  • 标签页管理:包含选择数据、绘制数据和事件数据三个主要标签页,每个标签页对应不同的功能模块。
  • 数据选择和加载:允许用户选择数据文件和加载特定实验数据进行分析。
  • 保存和加载按钮:提供保存当前数据和从文件加载数据的功能。

3. 数据绘图 (H5DataPlotter)

  • 数据可视化:使用pyqtgraph和matplotlib库将实验数据绘制成图表,支持多种图形格式(如折线图、散点图等)。
  • 坐标轴选择:允许用户选择和配置x轴和y轴的数据源和显示方式。
  • 定期更新:定期检查并更新绘图数据,以确保图表反映最新的实验数据。
  • 数据导出:将绘制的图表导出为PDF或PNG格式文件。

4. 事件数据处理 (EventPlotter)

  • 事件分析:处理和绘制事件数据,例如离子存活率或损失率的概率或频率。
  • 自定义事件函数:用户可以选择和配置不同的事件函数来分析数据。
  • 保存事件数据:将事件分析结果保存为CSV或pickle文件,方便后续数据处理和分析。

交互功能和用户体验

  • 交互式控件:使用PyQt6提供交互式控件,如按钮、复选框、组合框和文本输入框,使用户能够方便地进行数据选择、配置和操作。
  • 动态更新:用户界面和绘图能够实时更新,确保用户始终看到最新的实验数据。
  • 多样化导出选项:支持将图表导出为不同格式,便于用户在报告和演示中使用。

辅助功能

  • 错误和信息处理:通过日志和弹窗显示错误信息和操作反馈,帮助用户及时了解系统状态和操作结果。
  • 数据过滤和处理:支持数据过滤和自定义处理函数,提供灵活的数据分析手段。

这个应用程序特别适合用于需要频繁收集、分析和可视化实验数据的科研环境。通过集成多种数据处理和绘图功能,它能够显著提高实验数据管理和分析的效率。

导入模块

代码导入了必要的模块和库,用于数据处理、图形绘制、图形用户界面(GUI)开发等。主要模块包括:

  • NumPySciPy:用于科学计算和数据处理。
  • matplotlibpyqtgraph:用于图形绘制。
  • PyQt6:用于构建图形用户界面。
  • pandas:用于数据处理和分析。

全局变量和常量定义

定义了一些物理常数,例如m_Li(锂原子质量)、m_Ba(钡原子质量)和kB(玻尔兹曼常数),这些常量用于后续的计算和拟合。

H5StorageGui 类

这是主界面类,继承自 BWidget。它包含了三个主要组件:

  1. H5StorageDataMgr:用于数据管理和存储。
  2. H5DataPlotter:用于数据的绘制和展示。
  3. EventPlotter:用于处理和绘制事件数据。

__init__ 方法

  • 初始化三个主要组件并将它们添加到标签页中。
  • 设置保存、加载和清除按钮,并配置定时器以定期保存数据。

H5StorageDataMgr 类

该类用于管理HDF5数据存储和加载。主要功能包括:

  • 选择数据存储目录。
  • 管理数据订阅。
  • 存储和加载数据文件。
  • 定期保存和更新数据。

__init__ 方法

  • 初始化数据管理器,设置数据存储路径和文件名。
  • 添加数据订阅编辑器,用于管理数据流和图像流。
  • 配置定时器以定期更新数据。

数据存储和加载

  • savetoFile 方法:将当前数据保存到HDF5文件中。
  • loadFromFile 方法:从HDF5文件中加载数据。
  • clear 方法:清除当前数据。

H5DataPlotter 类

用于绘制和展示数据。主要功能包括:

  • 设置坐标轴选择器。
  • 管理不同数据源。
  • 定期检查和更新数据。
  • 导出图形到PDF或PNG格式。

__init__ 方法

  • 初始化绘图窗口和数据选择器。
  • 设置坐标轴选择器和导出按钮。
  • 配置定时器以定期检查数据更新。

数据更新和绘制

  • checkForNewData 方法:定期检查是否有新数据,并更新绘图。
  • updateDatasources 方法:更新数据源列表。
  • update 方法:更新坐标轴选择器和绘图数据。
  • gen_export_plot 方法:生成用于导出的图形。
  • exportpngexportpdf 方法:导出图形到PNG和PDF格式。

EventPlotter 类

继承自 H5DataPlotter,用于处理和绘制事件数据。主要功能包括:

  • 设置和管理事件数据的坐标轴选择器。
  • 处理事件数据的计算和拟合。
  • 导出事件数据的图形。

__init__ 方法

  • 初始化事件绘图窗口和数据选择器。
  • 配置定时器以定期检查事件数据更新。

数据更新和绘制

  • updateData 方法:更新事件数据。
  • get_event_data 方法:获取和处理事件数据。
  • addFittingaddBinning 方法:添加数据拟合和分箱处理。
  • save_events 方法:保存事件数据。

EventYAxisWidget 类

继承自 YAxisWidget,用于事件数据的Y轴管理。主要功能包括:

  • 管理和更新Y轴数据。
  • 处理事件函数和参数。

updateData 方法

  • 更新Y轴数据和事件函数参数。
  • 处理和应用数据过滤器。

EventFuncWidget 类

用于设置事件函数和参数。主要功能包括:

  • 管理和选择事件函数。
  • 配置事件函数参数。

主要功能总结

  1. 数据管理:通过 H5StorageDataMgr 类实现,支持数据的存储、加载和定期保存。
  2. 数据绘制:通过 H5DataPlotter 类和 EventPlotter 类实现,支持数据和事件数据的绘制、更新和导出。
  3. 图形用户界面:通过 PyQt6 构建,支持用户交互、数据选择和配置。

4 - 数据流订阅管理

这段代码实现了能够动态订阅、显示和更新数据流的数据可视化界面。

PlotDataEditor

PlotDataEditor 类是一个管理数据或图像流订阅的小部件。它包含以下关键部分:

  • 初始化方法:接收属性对象和数据字典,设置布局,创建一个下拉菜单用于选择数据流。
  • 更新数据流列表:清空并重新填充下拉菜单中的数据流。
  • 更新数据通道:根据用户选择更新数据通道。

ScrollPlot

ScrollPlot 类继承自 pg.PlotItem,用于显示滚动数据图表。它的主要功能包括:

  • 初始化方法:设置图表属性,初始化数据缓冲区,创建数据流客户端和属性对象。
  • 初始化数据缓冲区:创建一个用于存储数据的数组。
  • 数据馈送方法:将新数据块添加到数据数组中。
  • 更新图表:根据数据数组更新图表显示。
  • 设置新数据:从数据流接收新数据,并调用数据馈送和图表更新方法。
  • 数据选择对话框:弹出一个对话框供用户选择数据流。
  • 订阅窗口:管理数据流订阅的对话框。
  • 配置窗口:弹出一个对话框供用户配置图表属性。

ScrollWindow

ScrollWindow 类继承自 BMainWindow,是应用程序的主窗口。它包含以下关键部分:

  • 初始化方法:创建主窗口和图形窗口,初始化多个 ScrollPlot 实例,并添加到窗口中。
  • 初始化图表:循环创建并添加 ScrollPlot 实例。
  • 数据馈送方法:将新数据块添加到数据数组中。
  • 更新图表:根据数据数组更新所有图表的显示。
  • 更新方法:定期调用数据馈送和图表更新方法。

main 函数

main 函数是程序的入口点,执行以下步骤:

  1. 创建一个 QApplication 实例。
  2. 创建并显示 ScrollWindow 实例。
  3. 启动应用程序事件循环。

主要功能和工作流程

  1. 数据订阅和显示PlotDataEditor 管理数据流订阅,ScrollPlot 显示订阅的数据,并定期更新图表。
  2. 用户交互:用户可以通过图形界面选择和配置数据流,更新图表显示。
  3. 定期更新:通过定时器定期检查和更新数据,实现滚动显示效果。

5 - 数据流订阅管理

SubscriptionEditor 类提供了一个直观的界面,用户可以方便地管理数据和图像流的订阅。通过灵活的属性管理和用户交互,确保用户能够轻松地添加、删除和更新订阅,从而适应不断变化的需求和数据源。

概述

这个代码定义了一个订阅编辑器 SubscriptionEditor 类,主要用于管理程序对数据流或图像流的订阅。在 PyQt 环境中,通过一个简单的图形用户界面,用户可以查看和修改当前的订阅列表。

SubscriptionEditor

SubscriptionEditor 类继承自 QWidget,用于管理数据或图像流的订阅。

主要方法和属性

  • 初始化方法 __init__

    • 接受参数:props(属性对象)、category(类别,例如 ‘Image’ 或 ‘Data’)、parent(父组件)、propprefix(属性前缀)、streamkey(流键)、fullList(全列表)。
    • 设置类的各种属性,并初始化图形界面组件,包括 QVBoxLayoutQListWidgetQComboBox
    • 调用 loadSubscriptions 方法加载当前的订阅,并调用 update_streamlist 方法更新可用的流列表。
    • 添加“添加”和“删除”按钮,并连接到相应的槽函数。
  • loadSubscriptions 方法

    • 从属性中加载当前的订阅列表,并将其显示在 QListWidget 中。
  • handle_property_changes 方法

    • 检查属性是否发生变化,如果发生变化则更新订阅列表,并发出 propertiesChanged 信号。
  • update_streamlist 方法

    • 更新 QComboBox 中可用的流列表。
    • 如果类别是 ‘List’,则使用全列表更新。
    • 否则,从属性中获取活动流,并计算每个流的时间差,并将其添加到 QComboBox 中。
  • add 方法

    • QComboBox 中选择的流添加到订阅列表中。
    • 检查流是否已经在订阅列表中,如果没有,则添加到 QListWidget 和属性中,并发出 subscriptionsChanged 信号。
  • deletemarked 方法

    • 删除 QListWidget 中选中的流。
    • 从属性中删除对应的流,并更新 QListWidget,最后发出 subscriptionsChanged 信号。

使用场景

  • 该代码主要用于需要管理数据或图像流订阅的应用程序。
  • 适用于需要动态调整订阅数据源的场景,例如科学计算、数据采集和监控等应用。
  • 提供了一种用户友好的方式,通过图形界面查看和修改订阅列表。

6 - 图表动态显示器

这个脚本可以用于需要实时监控和展示数据流的应用程序,例如科学实验、工业监控和实时数据分析等。用户可以通过 GUI 配置数据流的订阅和绘图属性,实时查看和分析数据变化。

概述

这个脚本使用 PyQt6 和 pyqtgraph 库创建了一个实时更新的绘图工具。工具订阅数据流并动态更新图表显示。核心组件包括 UpdatingPlot 类和 LivePlot 类。

主要组件

UpdatingPlot

UpdatingPlot 类继承自 pg.PlotItem,用于创建能够订阅数据流并实时更新的图表。

主要方法和属性
  • 初始化方法 __init__

    • 初始化数据客户端和属性客户端。
    • 设置绘图区域的上下文菜单,添加订阅和配置选项。
    • 启动定时器,每隔 10 毫秒调用 setnewData 方法更新数据。
  • setnewData 方法

    • 检查数据流中是否有新数据。
    • 处理新数据并更新曲线显示。
  • subscribe_window 方法

    • 创建并显示一个对话框,允许用户配置数据流订阅。
    • 更新订阅配置。
  • updateConfiguration 方法

    • 更新数据流订阅。
    • 清除旧的绘图,并为每个数据流创建新的曲线。
  • configureWindow 方法

    • 创建并显示一个对话框,允许用户配置绘图属性。
    • 更新绘图配置。

LivePlot

LivePlot 类继承自 QtWidgets.QWidget,用于创建包含 UpdatingPlot 图表的窗口。

主要方法和属性
  • 初始化方法 __init__

    • 初始化窗口布局,添加 UpdatingPlot 图表。
    • 设置窗口大小提示和显示配置。
  • sizeHint 方法

    • 返回窗口的大小提示。
  • setSizeHint 方法

    • 设置窗口的宽度和高度提示。

使用场景

这个脚本可以用于需要实时监控和展示数据流的应用程序,例如科学实验、工业监控和实时数据分析等。用户可以通过 GUI 配置数据流的订阅和绘图属性,实时查看和分析数据变化。

示例

下面是一个示例,展示如何使用 UpdatingPlotLivePlot 类:

def main(name):
    app = QtGui.QApplication([])
    camWin = LivePlot(name)
    camWin.show()
    sys.exit(app.exec())

if __name__ == '__main__':
    main('dummyname')

在这个示例中,main 函数创建一个 LivePlot 窗口并启动应用程序事件循环。运行此代码将显示一个包含实时更新图表的窗口。

关键功能

  • 实时数据更新:使用定时器定期检查数据流中的新数据并更新图表显示。
  • 动态配置:通过 GUI 配置数据流订阅和绘图属性,支持用户自定义设置。
  • 可扩展性:基于 PyQt6 和 pyqtgraph 构建,易于扩展和集成其他功能。

7 - 图形ROI管理器

这个类适用于需要在图形界面中显示和管理多个兴趣区域的应用程序,特别是那些需要通过中心属性类来通信和管理属性的场景。例如,科学实验中的图像处理和分析,实时监控中的区域选择和管理等。

概述

这个脚本定义了一个名为 zmq_ROI 的类,它继承自 pyqtgraph.ROI,并通过 BaLis 的中心属性类 Properties 来通信其属性。该类主要用于在图形界面中显示和管理一个兴趣区域(ROI),并实时更新其属性。

主要组件

zmq_ROI

zmq_ROI 类继承自 pg.ROI,用于创建一个可以通过属性类 Properties 来管理和通信其属性的兴趣区域。

属性和方法
  • 静态属性

    • roilist:存储所有 ROI 名称的列表。
    • p_pos:存储 ROI 的位置。
    • p_size:存储 ROI 的大小。
    • color:存储 ROI 的颜色。
  • 初始化方法 __init__

    • 初始化 ROI 的名称和属性。
    • 将 ROI 名称添加到 roilist 中(如果不存在)。
    • 设置 ROI 的位置和大小,并启动一个定时器,每隔 1000 毫秒调用 _publish_values 方法。
  • update_from_properties 方法

    • 从属性中更新 ROI 的颜色、位置和大小。
  • _publish_values 方法

    • 检查 ROI 的位置和大小是否发生变化。如果发生变化,则更新属性中的位置和大小。
    • 如果属性中有变化,则从属性中更新 ROI 的信息。

使用场景

这个类适用于需要在图形界面中显示和管理多个兴趣区域的应用程序,特别是那些需要通过中心属性类来通信和管理属性的场景。例如,科学实验中的图像处理和分析,实时监控中的区域选择和管理等。

示例

下面是一个使用 zmq_ROI 类的示例:

import pyqtgraph as pg
from PyQt6.QtWidgets import QApplication
import sys

def main():
    app = QApplication(sys.argv)
    win = pg.GraphicsLayoutWidget(show=True)
    view = win.addViewBox()
    view.setAspectLocked(True)
    img = pg.ImageItem()
    view.addItem(img)
    
    # 创建并添加 zmq_ROI 实例
    roi = zmq_ROI('exampleROI', pos=[50, 50], size=[100, 100])
    view.addItem(roi)
    
    # 显示窗口
    win.show()
    sys.exit(app.exec())

if __name__ == '__main__':
    main()

在这个示例中,main 函数创建一个包含图像和兴趣区域(ROI)的窗口。运行此代码将显示一个窗口,其中包含一个可拖动和调整大小的 ROI。

关键功能

  • 属性通信:通过 Properties 类管理和通信 ROI 的属性,使得多个 ROI 可以共享和实时更新其属性。
  • 定时更新:通过定时器定期检查和更新 ROI 的位置和大小。
  • 图形界面集成:集成到 pyqtgraph 中,提供强大的图形界面支持。

8 - 属性编辑器

这个代码实现了一个属性编辑器 GUI,用于管理和编辑属性树。

ScalableGroup 类

ScalableGroup 类是一个自定义的参数组,用于自动生成两个子参数,这两个子参数始终互为倒数。

初始化方法
  • __init__ 方法
    • 初始化参数组,并设置组类型、添加文本和添加列表。
    • 调用基类 GroupParameter 的初始化方法。
添加新参数方法
  • addNew 方法
    • 根据参数类型(字符串、浮点数或整数)添加新的子参数。
    • 设置新子参数的初始值和属性。

TreeEdit 类

TreeEdit 类用于从 Properties 类中提取信息并根据树视图进行格式化。

初始化方法
  • __init__ 方法
    • 初始化类实例,设置父类和子树路径。
    • 从属性对象中提取条目,并创建参数组。
    • 连接参数组的状态变化信号到 change 方法。
解析字典方法
  • _parsedict 方法
    • 将字典格式化为可以在树视图中查看的格式。
    • 根据不同的数据类型(整数、布尔、字符串、浮点数、列表、字典)创建相应的参数条目。
更改参数方法
  • change 方法
    • 处理树视图中的任何更改。
    • 根据参数类型和变化的数据更新属性对象。
更新方法
  • _update_update_whole_tree 方法
    • 更新树视图中选定条目或整个树视图。
    • 根据属性对象中的数据重新生成参数条目。

PropEdit 类

PropEdit 类是属性编辑器的主要 GUI 窗口,用于管理属性树。

初始化方法
  • __init__ 方法
    • 初始化类实例,设置子树路径。
    • 创建布局和参数树视图。
    • 添加更新、删除、保存和加载按钮,并连接相应的槽函数。
更新、保存、加载和删除方法
  • update 方法
    • 更新参数树视图。
  • save 方法
    • 将当前属性保存到文件。
  • load 方法
    • 从文件加载属性并更新参数树视图。
  • delete 方法
    • 删除当前选定的参数条目。

PropSelector 类

PropSelector 类是属性选择器 GUI,用于从属性树中选择和管理键列表。

初始化方法
  • __init__ 方法
    • 初始化类实例,设置子树路径。
    • 创建布局和参数树视图。
    • 添加选择和删除按钮,并连接相应的槽函数。
选择和删除方法
  • select 方法
    • 从参数树视图中选择当前条目并更新键列表。
  • updateKeys 方法
    • 更新键列表视图。
  • delete_marked 方法
    • 删除当前选定的键条目。

主函数

  • main 方法
    • 创建应用程序实例,设置窗口图标,创建并显示主窗口。
    • 进入应用程序事件循环。

代码逻辑

  1. 导入所需模块:导入标准库、第三方库和项目特定模块。
  2. 定义 ScalableGroup 类:自定义参数组,用于自动生成子参数。
  3. 定义 TreeEdit 类:从 Properties 类中提取信息并根据树视图进行格式化。
  4. 定义 PropEdit 类:属性编辑器的主要 GUI 窗口。
  5. 定义 PropSelector 类:属性选择器 GUI,用于选择和管理键列表。
  6. 定义主函数:创建并启动应用程序。
  7. 运行主程序:检查是否在交互模式下运行,如果不是,则运行主程序。

运行流程概述

  1. 启动应用程序:创建 QApplication 实例,并设置窗口图标。
  2. 创建 PropEdit 实例:初始化属性编辑器,并显示主窗口。
  3. 管理属性树:通过参数树视图和按钮与属性对象交互,更新、保存、加载和删除属性条目。
  4. 进入事件循环:应用程序进入事件循环,等待用户交互。

9 - 属性更新管理器

该代码实现了一个用于检查属性更新的 GUI 应用程序。通过 PropertiesChecker 类,用户可以定期检查属性是否更新,并在属性未更新时发出警报,使用了 PyQt6 的多种控件和信号槽机制来实现用户交互和数据更新。

PropertiesChecker 类

PropertiesChecker 类用于检查属性是否定期更新,并在属性未更新时发出警报。以下是该类的详细分析:

初始化方法
  • __init__ 方法
    • 初始化类实例,并设置初始状态或配置。
    • 创建两个 Properties 对象,用于检查属性的更新。
    • 初始化一个 QSoundEffect 对象,用于播放警报声音。
    • 调用 run 方法开始检查属性更新。
警报窗口方法
  • open_alert_window 方法
    • 创建并显示一个警报对话框,当属性未更新时调用。
    • 播放警报声音。
属性检查方法
  • run 方法
    • 使用一个无限循环定期检查属性是否更新。
    • 每隔一段时间设置和检查属性值。
    • 如果属性值未更新,则打印错误信息并显示警报窗口;否则,打印属性仍在更新的信息。

主函数

  • main 方法
    • 创建应用程序实例,设置窗口图标,创建并显示主窗口。
    • 进入应用程序事件循环。

代码逻辑

  1. 导入所需模块:导入标准库、第三方库和项目特定模块。
  2. 定义 PropertiesChecker 类:包含初始化方法、警报窗口方法和属性检查方法。
  3. 定义主函数:创建并启动应用程序。
  4. 运行主程序:检查是否在交互模式下运行,如果不是,则运行主程序。

运行流程概述

  1. 启动应用程序:创建 QApplication 实例,并设置窗口图标。
  2. 创建 PropertiesChecker 实例:初始化属性检查器,并开始检查属性更新。
  3. 检查属性更新:在 run 方法中,定期设置和检查属性值,并在属性未更新时发出警报。
  4. 显示警报窗口:当属性未更新时,显示警报对话框并播放警报声音。
  5. 进入事件循环:应用程序进入事件循环,等待用户交互。

10 - 数据/图像分析管理器

该代码实现了一个数据/图像分析管理器,通过图形用户界面(GUI)来启动、停止和配置分析脚本。使用PyQt6库来构建界面,包括树视图、按钮、文本框和下拉菜单。代码主要包括四个类:checkableModelTreeViewWidgetaddAnalysisWidgetAnalysisManager

类和方法

checkableModel

checkableModel 继承自 QtGui.QStandardItemModel,实现了一个可检查的模型。

方法:

  • test(self):测试方法(空实现)。

TreeViewWidget

TreeViewWidget 继承自 QWidget,实现了一个树视图组件,用于显示和管理分析任务。

方法:

  • __init__(self, props, parent=None):初始化树视图组件。

    • props:属性对象,用于存储和管理配置数据。
    • parent:父窗口。
    • 创建树视图和模型,并设置定时器定期更新任务状态。
  • createMailModel(self, parent):创建树视图模型。

    • 设置模型的列标题。
    • 连接模型的itemChanged信号到itchange方法。
  • itchange(self, item):处理模型项改变事件。

    • item:改变的模型项。
    • 根据项的检查状态,启动或停止相应的分析任务,并更新属性。
  • killVagabonding(self, pname, pargs):终止运行的孤立进程。

    • pname:程序名称。
    • pargs:程序参数。
    • 根据操作系统,查找并终止孤立进程。
  • startProcess(self, name):启动分析任务。

    • name:任务名称。
    • 终止同名任务后,启动新任务并记录进程对象。
  • endProcess(self, name):终止分析任务。

    • name:任务名称。
    • 如果任务在运行,则终止进程并记录日志。
  • updateStatus(self):更新任务状态。

    • 检查进程是否仍在运行,更新任务状态和视图。
  • addItem(self, direc, script, Filtername, active, category, streams):添加新任务到树视图。

    • direc:目录。
    • script:脚本名称。
    • Filtername:任务名称。
    • active:任务是否激活。
    • category:任务类别。
    • streams:数据流。
    • 创建新任务项并添加到模型中。
  • del_current(self):删除当前选中的任务。

    • 获取选中的任务项并删除相应的任务和进程。
  • configureCurrent(self):配置当前选中的任务。

    • 获取选中的任务项,打开属性编辑对话框进行配置。
  • __del__(self):析构函数,终止所有运行中的任务。

addAnalysisWidget

addAnalysisWidget 继承自 QWidget,实现了一个用于添加新分析任务的组件。

方法:

  • __init__(self, manager, parent=None):初始化添加分析任务组件。

    • manager:分析管理器对象。
    • parent:父窗口。
    • 创建布局、按钮、文本框和下拉菜单。
  • update_streamlist(self, category):更新数据流列表。

    • category:任务类别。
    • 根据选定的类别更新数据流下拉菜单。
  • addd(self):添加新任务。

    • 获取输入的信息,创建新任务,并添加到分析管理器中。

AnalysisManager

AnalysisManager 继承自 BWidget,实现了分析管理器,管理分析脚本的运行。

方法:

  • __init__(self, name='Analysis', parent=None):初始化分析管理器。

    • name:管理器名称,默认为’Analysis’。
    • parent:父窗口。
    • 设置属性和分析目录,初始化GUI。
  • initGUI(self):初始化GUI界面。

    • 创建添加分析任务组件和树视图组件,并设置布局。
    • 添加已有任务到树视图中。
  • delentry(self):删除当前选中的任务。

    • 调用树视图的del_current方法。
  • configureFilter(self):配置当前选中的任务。

    • 调用树视图的configureCurrent方法。

主函数

代码通过创建 QApplication 实例和 AnalysisManager 窗口来执行,并启动应用程序的主循环。

def main():
    app = QtWidgets.QApplication(sys.argv)
    icon = QtGui.QIcon()
    icon.addFile(iconpath + '/analysis.png')
    app.setWindowIcon(icon)
    Win = AnalysisManager()
    Win.setWindowTitle('Data/Image analysis manager')
    Win.show()
    sys.exit(app.exec())

代码执行

该代码通过命令行执行,创建一个AnalysisManager对象,并显示数据/图像分析管理器窗口。

11 - 数据/图像分析管理器

该代码定义了一些用于拟合和分析物理实验数据的数学函数。它包括一系列函数和常量,用于描述各种物理现象,例如多项式、指数衰减、高斯分布等。这些函数可以用于数据拟合和模型化实验结果。

常量定义

代码开始定义了一些常见的物理常数,用于后续计算。

  • m_Li:锂原子的质量
  • m_Ba:钡原子的质量
  • kB:玻尔兹曼常数

函数定义

这些函数用于拟合和分析实验数据,每个函数都有特定的用途和参数。

多项式函数

用于拟合线性和多项式数据。

  • pol1(p, x):一阶多项式
  • pol2(p, x):二阶多项式
  • pol10(p, x):十阶多项式

指数函数

用于描述指数增长和衰减现象。

  • exponential(p, x):指数函数
  • exponential_decay(p, x):指数衰减函数

扩展模型函数

用于描述复杂的物理现象,例如热云膨胀。

  • tof_temperature(p, x):热云膨胀模型
  • spatial_thermometry_scaled(p, x):空间测温模型

高斯函数

用于描述高斯分布和光束强度分布。

  • gaussian(p, x):高斯分布函数
  • gaussian_beam_intensity(p, x):高斯光束强度分布

洛伦兹函数

用于描述洛伦兹分布。

  • lorentzian(p, x):洛伦兹分布
  • lorentzian_cutoff(p, x):带截止的洛伦兹分布

其他函数

描述不同物理现象的函数。

  • sinc_profile(p, x):sinc函数
  • rabi_oscillation(p, x):拉比振荡
  • ac_stark_detuned_scattering(p, x):AC Stark失谐散射
  • saturation_parameter(p, x):饱和参数

拟合函数字典

这些函数被存储在一个字典中,可以根据需要进行调用。每个条目包含函数名称、函数公式、参数名称、初始值以及函数本身。

fitfunctions = {
    '--None--': {'function_text': 'no Fitfunction', 'par_names': [], 'startvalues': [], 'function': None},
    'linear': {'name': 'linear fit', 'function_text': 'a+b*x', 'par_names': ['a', 'b'], 'startvalues': [1, 0], 'function': pol1},
    'quadratic': {'name': 'quadratic fit', 'function_text': 'a+b*x+c*x^2', 'par_names': ['a', 'b', 'c'], 'startvalues': [1, 0, 0], 'function': pol2},
    'exponential': {'name': 'exponential', 'function_text': 'a+be^cx', 'par_names': ['a', 'b', 'c'], 'startvalues': [0, 1, 1], 'function': exponential},
    'tof_temperature': {'name': 'TOF_temperature', 'function_text': 'sqrt(sigma_0**2 + kB*T/m *(t-t0)**2)', 'par_names': ['sigma_0', 'T', 't0'], 'startvalues': [5e-6, 1.5e-6, 25e-6], 'function': tof_temperature},
    'spatial_thermometry_scaled': {'name': 'Spatial thermometry', 'function_text': 'sqrt(sigma_th^2 + sigma_psf^2)', 'par_names': ['T', 'sigma_psf'], 'startvalues': [360e-6, 10e-6], 'function': spatial_thermometry_scaled},
    'exponential_decay': {'name': 'exponential_decay', 'function_text': 'A*exp(-x/tau) + c', 'par_names': ['tau', 'A', 'c'], 'startvalues': [0.0003, 300e-6, 0.0], 'function': exponential_decay},
    'gaussian': {'name': 'gaussian', 'function_text': 'A0/(sqrt(2*pi)*sigma)*exp(-(x-mu)**2/2sigma**2) + c', 'par_names': ['mu', 'sigma', 'A0', 'c'], 'startvalues': [0, 1, 1, 0], 'function': gaussian},
    'lorentzian': {'name': 'lorentzian', 'function_text': 'A0 / (1 + (mu-x / (fwhm/2))**2) + c', 'par_names': ['mu', 'fwhm', 'A0', 'c'], 'startvalues': [318, 6, 18e3, 0], 'function': lorentzian},
    'sinc_profile': {'name': 'sinc_profile', 'function_text': 'A0 * sinc(b*(x-x0))**2 + c', 'par_names': ['x0', 'A0', 'b', 'c'], 'startvalues': [73.739e6, -2.3e4, 7e-4, 23e3], 'function': sinc_profile}
}

12 - 数据流图片流监视器

该代码使用 PyQt6 库构建了一个 GUI 应用,用于显示和编辑数据流、图像数据和相机属性。代码主要定义了一些自定义窗口小部件(widgets),包括参数显示框、图像数据框和相机属性框,并实现了上下文菜单、订阅管理和数据选择对话框等功能。

概要

该代码使用 PyQt6 库构建了一个 GUI 应用,用于显示和编辑数据流、图像数据和相机属性。代码主要定义了一些自定义窗口小部件(widgets),包括参数显示框、图像数据框和相机属性框,并实现了上下文菜单、订阅管理和数据选择对话框等功能。

主要类和功能

ParameterBox

该类继承自 BFrame,用于显示单个参数。它包括以下功能:

  • 初始化:设置框架样式、获取属性和数据流名称,并初始化显示标签。
  • 数据更新:使用定时器定期从数据流中获取新数据,并更新显示值。
  • 上下文菜单:右键单击时显示上下文菜单,包括订阅管理和数据选择功能。
  • 订阅管理:打开订阅管理窗口以编辑订阅。
  • 数据选择:打开数据选择对话框以选择要显示的数据。

ImageDataBox

该类继承自 BFrame,用于显示图像数据。它包括以下功能:

  • 初始化:设置框架样式、获取属性,并初始化显示框。
  • 上下文菜单:右键单击时显示上下文菜单,包括订阅管理功能。
  • 订阅管理:打开订阅管理窗口以编辑订阅。
  • 数据更新:通过设置新数据的方法更新显示框内容。

CamPropsBox

该类继承自 ImageDataBox,用于显示相机属性。它包括以下功能:

  • 初始化:获取相机名称和属性子树,并设置定时器定期更新数据。
  • 上下文菜单:右键单击时显示上下文菜单,包括属性和相机选择功能。
  • 属性窗口:打开属性选择窗口以编辑相机属性。
  • 相机选择窗口:打开相机选择窗口以选择要显示的相机。
  • 数据更新:根据当前相机和配置获取并显示相机属性。

DataBox

这是一个简单的用于显示标签和值的框,继承自 QWidget。它主要包括:

  • 初始化:设置布局,添加标签和值的显示。
  • 大小提示:返回组件的建议大小。

详细描述

ParameterBox

  • __init__ 方法

    • 初始化框架样式和宽度。
    • 获取参数属性和数据流名称。
    • 初始化显示标签和值标签,并设置布局。
    • 设置上下文菜单策略和定时器。
  • setNewData 方法

    • 检查数据流中是否有新数据。
    • 更新显示值。
  • openMenu 方法

    • 打开上下文菜单,包含订阅管理和数据选择选项。
  • dataSelectDialog 方法

    • 打开数据选择对话框,允许用户选择要显示的数据。
  • subscribe_window 方法

    • 打开订阅管理窗口,允许用户编辑订阅。
  • updateSubscription 方法

    • 更新数据流订阅。
  • updateDataLists 方法

    • 更新数据列表和显示标签。

ImageDataBox

  • __init__ 方法

    • 初始化框架样式和宽度。
    • 获取属性并初始化显示框。
    • 设置上下文菜单策略。
  • openMenu 方法

    • 打开上下文菜单,包含订阅管理选项。
  • subscribe_window 方法

    • 打开订阅管理窗口,允许用户编辑订阅。
  • dataSelectDialog 方法

    • 打开数据选择对话框,允许用户选择要显示的数据。
  • setNewData 方法

    • 更新显示框内容。

CamPropsBox

  • __init__ 方法

    • 获取相机名称和属性子树。
    • 设置定时器定期更新数据。
  • openMenu 方法

    • 打开上下文菜单,包含属性和相机选择选项。
  • props_window 方法

    • 打开属性选择窗口,允许用户编辑相机属性。
  • cams_window 方法

    • 打开相机选择窗口,允许用户选择相机。
  • setNewData 方法

    • 更新相机属性显示。

DataBox

  • __init__ 方法

    • 设置布局,添加标签和值显示。
  • sizeHint 方法

    • 返回组件的建议大小。

运行流程

  1. 创建 ParameterBoxImageDataBoxCamPropsBox 的实例。
  2. 定时器触发,调用 setNewData 方法从数据流中获取新数据并更新显示。
  3. 用户右键单击组件,显示上下文菜单。
  4. 用户选择订阅管理或数据选择选项,打开相应的对话框。
  5. 用户在对话框中编辑订阅或选择数据,更新组件显示。

13 - 数据流图片流监视器

该代码实现了一个基于 PyQt6 的应用程序,用于订阅和显示数据流或图像流。应用程序提供了一个可滚动的绘图窗口,用户可以通过多种交互方式来管理数据源和配置绘图属性。

功能介绍

该代码实现了一个基于 PyQt6 的应用程序,用于订阅和显示数据流或图像流。应用程序提供了一个可滚动的绘图窗口,用户可以通过多种交互方式来管理数据源和配置绘图属性。

代码结构

  1. 导入必要的模块和库
  2. 定义 PlotDataEditor
  3. 定义 ScrollPlot
  4. 定义 ScrollWindow
  5. 定义脚本入口

类:PlotDataEditor

功能介绍

PlotDataEditor 类是一个小部件,用于管理程序对数据流或图像流的订阅。

方法

  • __init__:初始化 PlotDataEditor 对象,设置布局和控件,更新可用流的列表。
    • 参数:props (属性对象)、data (初始数据字典)、category (流的类别)、parent (父对象)、preselect (预选择的流名称)。
  • update_streamlist:更新流选择框中的可用流列表。
  • updateDatachannel:更新选定的数据通道,并在父对象中设置相关属性。

类:ScrollPlot

功能介绍

ScrollPlot 类是一个绘图部件,用于订阅数据流并实时更新显示。

方法

  • __init__:初始化 ScrollPlot 对象,设置属性,订阅数据流,并配置绘图选项。
    • 参数:name (绘图的名称)、parent (父对象)。
  • initDataBuffer:初始化数据缓冲区,用于存储接收的数据。
  • feedData:将新数据块添加到数据缓冲区,并计算运行平均值(如果启用)。
  • clearPlot:清除绘图中的数据。
  • updatePlot:更新绘图,显示新的数据点和运行平均值。
  • updatePlotContent:更新绘图内容,删除当前内容以便显示新的数据。
  • updateTitle:更新绘图的标题。
  • updateSubscription:更新数据流的订阅,切换到新的数据流。
  • updateDataLists:更新数据列表和相关属性。
  • setnewData:接收新数据并更新绘图。
  • setScatterplot:设置散点图的绘图选项。
  • deletePlot:删除绘图并从属性中移除相关配置。
  • dataSelectDialog:打开数据选择对话框,用于选择新的数据源。
  • subscribe_window:打开订阅窗口,用于管理数据流的订阅。
  • configureWindow:打开配置窗口,用于修改绘图属性。
  • running_mean:静态方法,计算运行平均值。

类:ScrollWindow

功能介绍

ScrollWindow 类是主窗口类,包含多个滚动绘图,用于显示和管理数据流。

方法

  • __init__:初始化 ScrollWindow 对象,设置窗口和工具栏,并恢复之前保存的绘图。
    • 参数:name (窗口的名称)、parent (父对象)、n_plots (初始绘图数量)。
  • init_toolbar:初始化工具栏,添加操作按钮。
  • updateAllSubscriptions:更新所有绘图的订阅。
  • restorePlots:恢复之前保存的绘图。
  • addPlot:添加新绘图到窗口中。

脚本入口

功能介绍

脚本入口用于创建应用程序实例,显示主窗口并启动应用事件循环。

主要步骤

  1. 创建 QApplication 实例。
  2. 创建 ScrollWindow 实例。
  3. 显示主窗口。
  4. 启动应用事件循环。

总结

该代码实现了一个完整的 PyQt6 应用程序,用于管理和显示数据流。通过定义多个类和方法,用户可以方便地订阅数据流、配置绘图属性以及实时更新绘图。

14 - 数据实时监视器

该模块是一个用于在科学实验中实时绘制和分析数据的 PyQt6 控件。该控件集成了 pyqtgraph 库,用于高效地绘制和更新图表。

类:DataPlotterWidget

方法:__init__

功能:初始化 DataPlotterWidget 对象,设置属性和布局,启动定时器用于实时数据更新。

参数

  • axis_name:轴名称
  • prop_root:属性根路径
  • datastream_names:数据流名称列表
  • n_yaxis:Y轴数量
  • parent:父对象

主要步骤

  1. 初始化属性和数据管理器 (DataSummary)。
  2. 创建并设置网格布局 (QGridLayout)。
  3. 调用 buildPlotWidget 方法创建绘图小部件。
  4. 调用 buildDataSelector 方法创建数据选择器。
  5. 启动定时器,每20毫秒调用 checkForNewData 方法检查新数据。
方法:buildPlotWidget

功能:创建并设置绘图窗口和右键菜单。

主要步骤

  1. 创建 pyqtgraph 图形布局窗口 (GraphicsLayoutWidget)。
  2. 在窗口中添加绘图项 (PlotItem)。
  3. 添加右键菜单选项,通过 QAction 类实现。
方法:buildDataSelector

功能:创建并设置数据选择器界面。

主要步骤

  1. 创建数据选择器 (DataSelectorItem)。
  2. 创建 X轴选择器 (XAxisWidget) 和多个 Y轴选择器 (YAxisWidgetHelper)。
  3. 设置网格布局 (QGridLayout) 来管理数据选择器控件的排列和显示。
  4. 隐藏配置界面,默认不显示。
方法:toggleConfig

功能:切换配置界面的显示和隐藏状态。

主要步骤

  1. 根据 configVisible 变量的值显示或隐藏配置界面。
  2. 更新 configVisible 变量的值。
方法:setDataSource

功能:设置或更改数据源。

参数text - 数据源名称。

方法:checkForNewData

功能:检查是否有新数据,并更新图表。

主要步骤

  1. 调用 recvData 方法从数据源接收数据。
  2. 如果有新数据,更新 lastUpdate 时间戳。
  3. 调用 updateDatasourcesupdate 方法更新数据源和图表。
方法:updateDatasources

功能:检查并更新数据源列表。

主要步骤

  1. 创建一个新的数据源列表 sourcelist
  2. 如果数据源列表有变化,更新数据选择器中的数据源列表。
方法:update

功能:更新数据选择器中的可选数据字段,并更新图表。

主要步骤

  1. 从当前数据集中选择所有代表浮点数或整数的键。
  2. 更新数据选择器中的可选键列表。
  3. 调用 _updatePlotData 方法更新图表。
方法:_updatePlotData

功能:更新图表数据。

主要步骤

  1. 获取当前选中的 X轴字段。
  2. 调用每个 Y轴选择器的 updateData 方法更新数据。
方法:exportpdf

功能:导出图表为 PDF 文件。

主要步骤

  1. 创建一个 matplotlib 图表对象。
  2. 调用每个 Y轴选择器的 plotmpl 方法将数据绘制到图表上。
  3. 保存图表为 PDF 文件并使用查看器打开。
方法:clear

功能:清除数据。

主要步骤

  1. 调用数据管理器的 clear 方法清除数据。
  2. 移除所有图表项。
方法:plotData

功能:在图表中绘制数据。

参数

  • x:X轴数据
  • y:Y轴数据

主要步骤

  1. 创建一个 pg.PlotDataItem 对象并设置绘图样式。
  2. 将数据添加到图表项中并绘制。

类:YAxisWidgetHelper

方法:__init__

功能:初始化 YAxisWidgetHelper 对象,设置属性和布局。

参数

  • label:标签
  • plotter:数据绘图器对象
  • props:属性对象
  • plotitem:绘图项对象
  • parent:父对象

主要步骤

  1. 初始化 Y轴选择器,创建并设置布局和过滤器组合框。
  2. 创建并配置绘图项。
方法:updateYscale

功能:更新 Y轴缩放比例。

参数text - 缩放比例文本。

方法:createContextMenu

功能:创建上下文菜单。

参数position - 菜单位置。

主要步骤

  1. 创建菜单项用于添加过滤、分箱和拟合。
  2. 显示菜单并处理用户选择。
方法:_initPlot

功能:初始化绘图项。

主要步骤

  1. 创建并配置 pg.PlotDataItem 对象。
  2. 添加到绘图项中。
方法:configurePlot

功能:配置绘图样式。

主要步骤

  1. 设置绘图项的绘图样式。
  2. 如果有后续数据处理步骤,递归调用其配置方法。
方法:addBinning

功能:添加分箱处理步骤。

主要步骤

  1. 如果当前没有后续处理步骤,创建 BinningWidget 并添加到布局中。
  2. 更新数据。
方法:addFitting

功能:添加拟合处理步骤。

主要步骤

  1. 如果当前没有后续处理步骤,创建 FittingWidget 并添加到布局中。
  2. 更新数据。
方法:reevaluateData

功能:重新评估数据。

主要步骤

  1. 获取当前 X轴字段。
  2. 调用 updateData 方法更新数据。
方法:updateData

功能:更新数据。

参数xtext - X轴字段。

主要步骤

  1. 获取当前 Y轴字段。
  2. 从数据源获取数据并应用过滤器。
  3. 更新图表中的数据。
方法:plotmpl

功能:在 matplotlib 图表中绘制数据。

参数

  • axmatplotlib 图表轴对象。

主要步骤

  1. 将数据绘制到 matplotlib 图表轴中。
  2. 如果有后续数据处理步骤,递归调用其绘图方法。

15 - 图像查看器

该代码实现了一个基于 PyQt6 的图像查看器应用,名为 ImageWindow。这个应用包含一个中心图像显示区域和两个用于显示线图的侧边栏。用户可以通过该应用实时查看和分析图像数据,并调整图像的显示参数。

功能介绍

该代码实现了一个基于 PyQt6 的图像查看器应用,名为 ImageWindow。这个应用包含一个中心图像显示区域和两个用于显示线图的侧边栏。用户可以通过该应用实时查看和分析图像数据,并调整图像的显示参数。

代码结构

  • 导入必要的模块和库
  • 定义 ImageWindow
  • 定义主函数 main
  • 定义脚本入口

类:ImageWindow

简短功能介绍

ImageWindow 类是一个主窗口,包含一个图像显示区域和两个用于显示线图的侧边栏。此外,它还提供了一些工具栏和面板,用于调整图像显示参数和查看图像信息。

方法:__init__

功能:初始化 ImageWindow 对象,并设置窗口名称和父对象。

参数

  • name:窗口名称。
  • parent:父对象(可选)。

主要步骤

  1. 调用父类 BMainWindow 的构造函数。
  2. 初始化属性字段。
  3. 调用 initUI 方法初始化用户界面。

方法:initUI

功能:初始化用户界面,包括状态栏、图像显示区域和停靠窗口。

主要步骤

  1. 显示状态栏信息。
  2. 创建图像显示区域并设置为中心部件。
  3. 创建停靠窗口(Dock Widgets)。

方法:createDockWidgets

功能:创建用于显示线图、直方图和图像信息的停靠窗口。

主要步骤

  1. 创建顶部的线图停靠窗口并添加到主窗口。
  2. 创建右侧的线图停靠窗口并添加到主窗口。
  3. 创建左侧的直方图停靠窗口并添加到主窗口。
  4. 创建顶部的图像信息停靠窗口并添加到主窗口。

方法:update_min_max

功能:更新图像显示的最小和最大亮度值。

主要步骤

  1. 获取直方图的最小和最大亮度值。
  2. 更新属性中的最小和最大亮度值。

方法:get_tick_position

功能:获取直方图梯度的刻度位置。

主要步骤

  1. 获取直方图梯度的所有刻度位置。
  2. 计算并返回归一化的刻度位置。

方法:closeEvent

功能:在窗口关闭事件中保存当前图像的显示范围和刻度位置。

主要步骤

  1. 获取图像显示的 x 和 y 范围。
  2. 保存显示范围和刻度位置到属性中。
  3. 调用父类的关闭事件处理方法。

主函数:main

功能:创建并显示 ImageWindow 实例。

参数

  • name:窗口名称。

主要步骤

  1. 创建 QApplication 实例。
  2. 创建 ImageWindow 实例并设置窗口图标。
  3. 显示窗口。
  4. 启动应用事件循环。

脚本入口

功能:解析命令行参数并调用 main 函数。

主要步骤

  1. 检查是否以交互模式运行。
  2. 解析命令行参数获取程序实例名称。
  3. 调用 main 函数。

16 - 图像监视器

该代码实现了一个基于 PyQt6 的图像监控器应用,名为 ImageDisplay。这个应用能够接收并实时显示图像数据,并提供多种工具来调整和保存图像。用户可以通过该应用监控图像流,应用滤波器,调整显示参数,并保存当前图像。

功能介绍

该代码实现了一个基于 PyQt6 的图像监控器应用,名为 ImageDisplay。这个应用能够接收并实时显示图像数据,并提供多种工具来调整和保存图像。用户可以通过该应用监控图像流,应用滤波器,调整显示参数,并保存当前图像。

代码结构

  • 导入必要的模块和库
  • 定义 ImageDisplay
  • 定义主函数 main
  • 定义脚本入口

类:ImageDisplay

简短功能介绍

ImageDisplay 类是一个自更新的图像显示窗口,能够实时接收和显示图像数据,并提供多种工具和设置来调整图像显示效果。

方法:__init__

功能:初始化 ImageDisplay 对象,并设置窗口名称和父对象。

参数

  • name:窗口名称。
  • parent:父对象(可选)。

主要步骤

  1. 初始化属性字段。
  2. 创建并设置图像显示区域。
  3. 订阅图像流和掩码流。
  4. 设置图像显示和掩码显示的初始数据。
  5. 创建图像显示窗口和控件布局。
  6. 启动定时器以定期更新图像。

方法:sizeHint

功能:返回窗口的推荐大小。

返回值QtCore.QSize(800, 700)

方法:noise_filter

功能:应用噪声滤波器处理图像。

参数

  • img:待处理的图像数据。

主要步骤

  1. 将图像数据转换为绝对值。
  2. 应用双边滤波器和中值滤波器进行去噪处理。
  3. 返回处理后的图像。

方法:spot_detector

功能:检测图像中的亮点。

参数

  • img:待处理的图像数据。

主要步骤

  1. 将图像二值化,阈值为 _spot_level

方法:update_image

功能:定期更新图像显示。

主要步骤

  1. 检查是否有新图像数据。
  2. 接收并处理新图像数据。
  3. 更新图像显示。
  4. 更新图像掩码。

方法:update_mask

功能:更新图像掩码。

主要步骤

  1. 检查是否有新掩码数据。
  2. 接收并处理新掩码数据。
  3. 更新掩码显示。

方法:saveCurrentImage

功能:保存当前显示的图像为 PNG 文件。

主要步骤

  1. 构建文件路径,包含当前时间戳。
  2. 保存图像数据到文件。

方法:subscribe_window

功能:打开订阅窗口,用于选择图像流。

主要步骤

  1. 打开订阅窗口。
  2. 更新图像流订阅。

方法:subscribe_mask

功能:打开订阅窗口,用于选择掩码流。

主要步骤

  1. 打开订阅窗口。
  2. 更新掩码流订阅。

方法:_subscribe_win

功能:创建并显示订阅窗口。

参数

  • key:订阅的键。

主要步骤

  1. 创建对话框。
  2. 添加订阅编辑器到对话框。
  3. 显示对话框。

方法:configureWindow

功能:打开配置窗口,用于调整图像显示参数。

主要步骤

  1. 创建对话框。
  2. 添加属性编辑器到对话框。
  3. 显示对话框。

主函数:main

功能:创建并显示 ImageDisplay 实例。

参数

  • name:窗口名称。

主要步骤

  1. 创建 QApplication 实例。
  2. 创建 ImageDisplay 实例并设置窗口图标。
  3. 显示窗口。
  4. 启动应用事件循环。

脚本入口

功能:解析命令行参数并调用 main 函数。

主要步骤

  1. 检查是否以交互模式运行。
  2. 解析命令行参数获取程序实例名称。
  3. 调用 main 函数。