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

返回本页常规视图.

实验框架

实验运行体系:任务队列/执行引擎、循环、序列编辑、时序查看与运行监视。

概述

实验框架覆盖实验从编写、调度到运行的完整链条:

  • 实验脚本:继承 Experiment 并实现 build / run(入门见 编写第一个实验,设备映射见 配置仪器设备);
  • 调度执行:实验队列(ExperimentQueue)→ 执行引擎(ExperimentManager)按 优先级/预约时间取任务执行,准备台与循环器参与入队;
  • 编辑与监视:序列编辑/模拟、FPGA 时序查看、运行监视、多线程任务框架与基础 窗口控件。

调度与执行

页面模块说明
实验队列管理器experiment/experiment_queue表格化任务队列
实验任务运行管理器experiment/experiment_manager执行引擎(测量/序列/运行)
实验运行调度管理器experiment/调度机制综述
实验预处理experiment/prepstation准备台(暂存/推送)
实验任务循环管理器looper/条件循环执行
实验集合管理器entries/processmanager进程启停面板

编辑、时序与监视

页面模块说明
实验序列编辑器editors/editor_sequencer代码编辑 + 序列模拟
实验时间线查看器entries/experiment_timelineFPGA 时序可视化
实验运行监视器streammonitor/数据/消息监视
实验控制浏览器browser/主程序浏览器

控件与工具

页面模块说明
数据类控件widgets/arg_boxes参数输入控件
实验参数管理器entries/dashboard默认参数系统
实验任务折叠管理widgets/theexpandables可折叠分区
实验任务预备队列管理器widgets/models队列/预备表格模型
多线程任务管理器widgets/browser_workersWorker 线程
多线程处理框架widgets/helper_workersWorker 线程
自动保存编辑器editors/auto_save_editor周期保存时刻
实验窗口控件类widgets/quatmQtGUI 基础控件

1 - 数据类控件

实验参数编辑控件:FloatBox/BoolBox/ComboBox,改动即写回参数属性。

概述

quatm/GUI/widgets/arg_boxes.py 提供数据类控件:一套把实验参数显示为可编辑控 件的输入框体系。FloatBox / BoolBox / ComboBox 等控件继承对应管理器 (FloatManager / BoolManager / ComboManager),带单位、范围与步长,值改动时 立即写回属性(含 last_set),供实验窗口参数网格与参数系统使用。

组件

组件说明
FloatBox浮点参数输入框
BoolBox布尔参数复选框
ComboBox下拉列表参数
IntManager / FloatManager / BoolManager / ComboManager / FrequencyManager各类型参数的控件管理器

用法

from quatm.GUI.widgets.arg_boxes import FloatBox, BoolBox, ComboBox

# 通常由参数系统按参数声明自动生成对应控件

更完整说明见 参数框参数系统

2 - 实验窗口控件类

GUI 基础控件:BWidget/BFrame/BMainWindow 与可搜索组合框等。

概述

quatm/GUI/widgets/quatmQt.py 提供 GUI 基础控件类:BWidget / BFrame / BMainWindow 是各窗口/面板/主窗口的基类(带属性命名空间 _props,关闭时把几何保存到 QSettings、启动时恢复);SearchComboBox 等提供带自动补全与过滤的可搜索组合框。

组件

组件说明
BWidget基础 QWidget(属性 + 几何持久化)
BFrame基础 QFrame
BMainWindow基础主窗口(QMainWindow + 标题/几何持久化)
CustomCompleter支持 contains / begins 匹配的自动完成器
SearchComboBox可搜索组合框(内置 SearchLineEdit)
SearchLineEditSearchComboBox 的自定义行编辑(焦点全选、Esc 还原)

用法

from quatm.GUI.widgets.quatmQt import BMainWindow, BWidget, BFrame

win = BMainWindow(name="我的窗口")   # 几何自动持久化

更完整说明见 GUI基础类

3 - 实验序列编辑器

实验代码编辑与序列模拟:语法高亮、解析与输出通道时序可视化。

概述

quatm/GUI/editors/editor_sequencer.py 提供实验序列编辑器(编辑并模拟)CodeEditorParser 组合主窗口把左侧 CodeEditor 代码编辑器与右侧序列可视化组合起 来,编辑实验脚本后可一键模拟运行,把各输出通道的时序画成阶梯图。

组件

组件说明
CodeEditor代码编辑器:行号、Python 高亮、自动缩进与补全
PythonHighlighter / LineNumberArea语法高亮 / 行号边距
ExperimentParser解析实验:buildExperiment / simulateExperiment 返回命令栈
ExperimentSequencer把序列按各输出通道随时间画成阶梯图
CodeEditorParser组合主窗口:Save / Simulate / Clear 工具栏 + Dock 布局

用法

from quatm.GUI.editors.editor_sequencer import CodeEditorParser

win = CodeEditorParser(parent=parent, filename="experiments/my_experiment.py")

更完整说明见 序列编辑器

4 - 实验任务运行管理器

核心实验执行引擎:从队列取任务,按测量/序列/运行层级调度执行。

概述

quatm/GUI/experiment/experiment_manager.py 提供实验任务运行管理器 (ExperimentManager):从实验队列取出任务并执行的引擎。队列轮询运行在 worker 线程,任务按 测量(measurement)→ 重复(repetition)→ 序列/扫描(sequence)→ 单次运行(run)的层级结构调度。

关键方法

方法说明
queue_fn持续轮询队列任务字典:按优先级、任务号与预约时间挑选任务
run任务运行包装:任何结束方式都保证收尾
pause暂停 / 恢复当前实验
terminate_experiment优雅终止:让当前一次 run 自然跑完再停止
start_measurement / start_sequence / end_sequence / end_measurement各阶段实验钩子
set_dict把单个参数写入实验对象实例属性
set_run_nr / set_rep_nr同步运行 / 重复序号
start_queue / shutdown启动 / 停止常驻队列 worker

用法

from quatm.GUI.experiment.experiment_manager import ExperimentManager

manager = ExperimentManager(browser)   # browser 提供队列与界面
manager.start_queue()

更完整说明见 实验管理器

5 - 实验控制浏览器

主程序浏览器:文件树、队列/准备台/循环器与 MDI 实验窗口。

概述

quatm/GUI/browser/ 提供实验控制浏览器(Browser):Quatm 的主应用窗口,基于 QMainWindow + QMdiArea。左侧 FileSelector 浏览实验脚本,顶部停靠实验队列、 准备台与循环器,中央 MDI 区内每个实验一个 ExperimentWindow 子窗口。

核心组件

组件模块说明
Browserbrowser/main_window.py主窗口:MDI + 停靠部件 + 生命周期
FileSelectorbrowser/file_selector.py实验文件树(双击打开/模拟)
ExperimentWindowbrowser/experiment_window.py单实验控制面板(参数/提交/扫描)
ExperimentQueue / PrepStationexperiment/队列与准备台(顶部停靠)
Looperlooper/条件循环器(顶部停靠)

生命周期

  • open_experiment:打开实验窗口;已打开则恢复并置前。
  • closeEvent:保存主窗口几何与子窗口状态后停止 worker 线程。
  • moveEvent / resizeEvent:防抖保存几何供下次启动恢复。

用法

from quatm.GUI.browser.main_window import Browser

browser = Browser()
browser.show()

更完整说明见 实验浏览器

6 - 实验队列管理器

表格化实验任务队列:任务字典、优先级排序、暂停/终止与预约执行。

概述

quatm/GUI/experiment/experiment_queue.py 提供实验队列管理器(ExperimentQueue ):以表格展示任务队列(任务字典 expDict,任务号为主键),支持优先级排序、状 态跟踪与暂停/终止/删除等控制。submit() 是 GUI 线程的唯一入队入口(集中分配任务 号,Looper 经 submitItem 信号也走它)。

关键方法

方法说明
submit入队唯一入口:集中分配任务号
pause暂停/恢复当前运行的实验
set_sleeping把任务设为 Sleeping / Queued(预约执行)
terminate_clicked / terminate_all优雅终止选中 / 全部任务(Termination Pending)
delete_item / delete_clicked删除任务(运行中则优雅终止)
update_item刷新某任务行
set_model更换表格模型(ScheduleModel

任务状态枚举:Queued / Waiting / Sleeping / Running / Paused / Scanning / Terminating / Termination Pending / Done / Failed。

用法

from quatm.GUI.experiment.experiment_queue import ExperimentQueue

q = ExperimentQueue(browser=parent)   # 嵌入实验浏览器
q.submit(task_dict)   # 入队(GUI 线程调用)

更完整说明见 实验队列

7 - 多线程任务管理器

QRunnable 多线程任务:Worker 回调执行 + WorkerSignals 信号回主线程。

概述

quatm/GUI/widgets/browser_workers.py 提供多线程任务管理器Worker 继承 QRunnable,把回调函数放进 QThreadPool 线程池执行,并经 WorkerSignals 把 finished / error / result / progress 等信号发回主线程。供实验浏览器(实验队列、 循环器等)使用;同构的 helper_workers 供对准/辅助工具使用。

组件

组件说明
WorkerQRunnable 工作线程:设置、执行与收尾(含异常处理)
WorkerSignals工作线程信号:finished / error / result / progress 等

用法

from quatm.GUI.widgets.browser_workers import Worker

worker = Worker(fn=long_running, args=(...), kwargs={...})
worker.signals.result.connect(on_result)
QThreadPool.globalInstance().start(worker)

更完整说明见 后台工作线程

8 - 自动保存编辑器

周期 h5 自动保存时间点列表编辑器:勾选 + 日期时间的保存时刻配置。

概述

quatm/GUI/editors/auto_save_editor.py 提供自动保存编辑器(AutoSaveEditor) :以弹窗编辑周期 h5 自动保存的“时间点列表”,每一行 = 一个(勾选标记 + 日期时间) ,勾选的行在对应时刻触发一次自动保存。配置保存在属性(如 regular_auto_save_times)中。

组件

组件说明
AutoSaveEditor自动保存时间点编辑器(BWidget 弹窗)
DateTimeWidget单行日期时间 + 勾选控件

关键方法

方法说明
load_AutoSaveEditor_props从属性读取日期时间与勾选状态(静态)
update_props把日期时间与勾选状态写回属性(静态)
update_datetime / update_ticked某一行日期时间 / 勾选变化时更新
accept保存更改并关闭窗口

用法

from quatm.GUI.editors.auto_save_editor import AutoSaveEditor

editor = AutoSaveEditor(props=props, max_items=20, parent=parent)
editor.show()

更完整说明见 自动保存

9 - 实验时间线查看器

FPGA 实验时序可视化:DAC/TTL 输出通道随时间变化的阶梯图查看器。

概述

quatm/GUI/entries/experiment_timeline.py 提供实验时间线查看器(Timeline): 加载实验时序 JSON 文件(experiment.json),把各 DAC/TTL 输出通道随时间的变化绘 制成阶梯子图,并输出通道勾选面板决定可见曲线,用于调试与验证实验时序。

组件

组件说明
Timeline时序查看主窗口:加载文件、绘图与通道控制
TimelinePlotter时序可视化控件:随时间绘制每个在用输出的状态
SelectorWidget输出通道勾选面板:全选 / 全不选

关键方法(Timeline)

方法说明
load_file加载并解析时序 JSON,构造时间序列并刷新通道选择器
plot_experimental_sequence按通道勾选状态为每个输出建独立子图并绘阶梯图
decode_ttl_bitmask把 32 位 TTL 位掩码拆成各通道的 set/clear 命令
construct_time_sequences把步骤式时序转成按通道组织的 times/vals 序列
reverse_device_db_transformation设备库反变换:内部名映射回可读名

用法

from quatm.GUI.entries.experiment_timeline import Timeline

tl = Timeline()
tl.load_file("experiment.json")   # 加载时序文件并绘图
tl.show()

更完整说明见 时序浏览器

10 - 多线程处理框架

QRunnable 多线程处理框架:Worker 回调执行 + WorkerSignals 信号回主线程。

概述

quatm/GUI/widgets/helper_workers.py(及同构的 browser_workers.py)提供多线 程处理框架Worker 继承 QRunnable,把任意回调函数放进 QThreadPool 线程池 执行,并通过 WorkerSignals 以 finished / error / result / progress 等信号把结果 送回 GUI 主线程。

  • browser_workers:供实验浏览器(实验队列、循环器等)使用;
  • helper_workers:供对准/辅助等工具使用。

组件

组件说明
WorkerQRunnable 工作线程:设置、执行与收尾(含异常处理)
WorkerSignals工作线程可发出的信号:finished / error / result / progress 等

用法

from quatm.GUI.widgets.helper_workers import Worker

worker = Worker(fn=long_running, args=(...), kwargs={...})
worker.signals.result.connect(on_result)   # 主线程槽函数
worker.signals.error.connect(on_error)
QThreadPool.globalInstance().start(worker)

更完整说明见 后台工作线程

11 - 实验任务循环管理器

条件循环执行器:按测量结果自动重复/跳转/终止任务组循环。

概述

quatm/GUI/looper/ 提供实验任务循环管理器(Looper):以“循环组(标签页)” 组织任务条目,按顺序执行组内条目,并根据测量结果决定跳转或终止。LoopManager 在 后台线程运行循环;循环定义持久化在 loopfile.json,与 Web 远程控制平台共用。

核心逻辑

LoopManager.run_loop():从起始组开始,无限循环直到 terminate
  └─→ 按顺序执行组内条目
       ├─ Task:提交到实验队列,等待完成后推进(可设最大次数)
       └─ Conditional:读数据流字段比较 → 满足跳转 / 不满足走 else

组件

组件说明
LoopGroup循环组(一个标签页)
TaskItem / ListItem任务条目 / 任务列表条目
ConditionalItem数据条件、到达序号、时间等条件条目
Baustelle组内条目的添加/删除/编辑面板
DataManager订阅数据流、累积最新测量值
LoopManager循环执行器(run_loop() / terminate(),后台线程)

用法

from quatm.GUI.looper import Looper

looper = Looper(parent=browser)   # 浏览器顶部 dock 的循环器标签页

更完整说明见 循环器

12 - 实验任务预备队列管理器

预备任务(准备台)的表格模型:PrepModel 列表模型与队列 ScheduleModel。

概述

quatm/GUI/widgets/models.py 提供把 Python 字典 / 列表映射为 Qt 表格模型的基类 (源自 ARTIQ models)。预备队列(准备台)用列表型 PrepModel:预备任务不需要 唯一 ID、顺序可自由调整;实验队列用字典型 ScheduleModel(按优先级再按任务号 排序)。

核心类

说明
_SyncSubstruct包装底层容器的字典操作辅助(append/insert/pop 回调刷新)
DictSyncModel字典→表格模型基类
ListSyncModel列表→表格模型基类
ScheduleModel实验队列(ExperimentQueue)模型:任务按优先级/任务号排序
PrepModel预备队列(PrepStation)模型:列表型,顺序可调

具体业务模型通过子类实现 convert(键/值/列转单元格内容)、sort_key(排序键) 与 flags(编辑标志)三个钩子。

用法

from quatm.GUI.widgets.models import PrepModel

model = PrepModel(init=prep_list)   # 预备任务列表

模型说明见 数据模型;预备队列操作见 准备台

13 - 实验运行调度管理器

运行调度机制:队列集中入队,worker 按优先级/预约时间取任务执行。

概述

实验运行调度由 实验队列 + 执行引擎 协作完成:ExperimentQueuesubmit() 是 GUI 线程的唯一入队入口(集中分配任务号,准备台与循环器也经它入队);常驻 worker 在 ExperimentManager.queue_fn 中轮询任务字典,按 优先级 → 任务号 → 预约时间 (due_check)挑选任务并执行(measurement → sequence → run)。

相关组件

组件模块说明
ExperimentQueueexperiment/experiment_queue.py任务队列:入队、状态跟踪、暂停/终止
ExperimentManagerexperiment/experiment_manager.py执行引擎:取任务、跑测量/序列/运行
PrepStationexperiment/prepstation.py预备任务,推送入队
Looperlooper/条件循环,经 submit 入队

调度流程

PrepStation / Looper / 实验窗口 --submit()--> 队列任务字典
        ↓
ExperimentManager.queue_fn(worker 线程,按优先级/任务号/预约时间)
        ↓
start_measurement → start_sequence → 多次 run → end_sequence → end_measurement

运行时支持暂停 / 恢复(pause)与优雅终止(terminate_experiment,Termination Pending)。

相关页面

14 - 实验预处理

准备台:任务发往队列前的暂存、编辑、排序与推送(prepfile 持久化)。

概述

quatm/GUI/experiment/prepstation.py 提供实验预处理(PrepStation):实验浏 览器顶部 dock 中的准备台,用于在任务发往实验队列前暂存与编辑。任务列表以 PrepModel 表格展示(顺序可自由调整),持久化到 prepfile.json

关键方法

方法说明
push / push_row / push_first把选中/指定/第一个任务推送到实验队列
push_to_looper把选中任务推送到循环器
move_up / move_down调整任务顺序
delete_clicked / set_sleeping删除 / 休眠任务
open_editor / open_viewer / save_params编辑参数、查看参数、保存为 JSON
update_prep_file把任务列表保存到 prepfile.json
load_previous从 prepfile.json 恢复上次任务

用法

from quatm.GUI.experiment.prepstation import PrepStation

ps = PrepStation(browser=parent)
ps.push_first()   # 把第一个预备任务推入队列

更完整说明见 准备台

15 - 实验集合管理器

分布式进程面板:按 Servers/Driver/GUI/Viewer/Monitor 分类启停后台进程。

概述

quatm/GUI/entries/processmanager.py 提供实验集合管理器(进程管理器):按 Servers / Driver / GUI / Viewer / Monitor 分类读取配置,为每个脚本条目生成一个 SingleProcess 启停按钮面板,统一管理整套实验软件进程。进程以当前解释器按脚本或 模块(python -m)方式启动,并携带项目根与父进程看门狗环境。

组件

组件说明
ProcessManager分类面板:读取配置为每个条目生成启停按钮
SingleProcess单条目面板:启动 / 异步终止 / 状态轮询着色

关键方法(SingleProcess)

方法说明
startProcess停掉旧实例后以当前解释器启动子进程
stopProcess异步终止子进程,不阻塞 GUI 线程
updateStatus周期轮询退出状态并着色(运行中 / 退出 / 崩溃)

用法

from quatm.GUI.entries.processmanager import ProcessManager

pm = ProcessManager(parent=parent)
pm.show()

更完整说明见 进程管理器

16 - 实验参数管理器

默认实验参数系统:DefaultExp 聚合设备参数,Dashboard 按设备分组编辑。

概述

quatm/GUI/entries/dashboard.py 提供实验参数管理器DefaultExp 是聚 合所有设备属性的实验基类(build() 遍历设备数据库并按类型分组),各类型参数管理 器(BasicManager / IntManager / FloatManager / BoolManager / ComboManager / FrequencyManager)按参数声明生成带单位/范围的输入控件; Dashboard 面板把设备分组展示为可编辑的默认参数区。

组件

组件说明
DefaultExp默认实验:聚合全部设备属性并按设备分组
Dashboard默认参数面板:按设备分组生成参数控件
BasicManager各类型参数控件管理器(Int/Float/Bool/Combo/Frequency)

用法

from quatm.GUI.entries.dashboard import Dashboard

panel = Dashboard(parent=parent)   # 按设备分组显示默认参数

更完整说明见 参数系统

17 - 实验运行监视器

数据流监控 GUI:数据/图像/命令/消息多标签监视与单流面板。

概述

quatm/GUI/streammonitor/ 提供实验运行监视器MainWindow 以标签页容纳数据 流(Data)、图像流(Image)、命令(Command)、消息日志(Message)与历史(History )等监控;每个监控标签由 StreamMonitor 订阅单一数据流并实时展示。

组件

组件说明
MainWindow监控主窗口:多标签页容器 + 菜单
StreamMonitor单流监控面板:订阅某一数据流并实时展示
MessageTableModel消息日志表格模型(时间戳/来源/级别/内容,按级别着色)
ImageTableModel图像流元数据表格(固定时间/来源列 + 动态键列)

用法

from quatm.GUI.streammonitor import MainWindow, StreamMonitor

win = MainWindow(parent=parent)   # 多标签监控主窗口
panel = StreamMonitor(name="PMT", stream_type="Data", parent=parent)

更完整说明见 数据流监视器

18 - 实验任务折叠管理

可折叠分区对话框:SectionExpandButton 切换 + CollapsibleDialog 定义分区。

概述

quatm/GUI/widgets/theexpandables.py 提供可折叠分区组件CollapsibleDialogQDialog 子类)用一棵隐藏标题的 QTreeWidget 组织若干可折叠分区,每个分区标题 为 SectionExpandButton 按钮,点击即展开/折叠对应内容。

组件

组件说明
SectionExpandButton展开/折叠某分区的按钮(QPushButton
CollapsibleDialog可添加可折叠分区的对话框基类

关键方法(CollapsibleDialog)

方法说明
define_sections覆写此方法,以 (title, widget) 元组定义全部分区
add_section添加一个可折叠分区
add_button / add_widget创建含按钮的顶层条目 / 挂入内容控件

用法

from quatm.GUI.widgets.theexpandables import CollapsibleDialog

class MyDialog(CollapsibleDialog):
    def define_sections(self):
        self.add_section("参数", some_widget)
        self.add_section("高级", advanced_widget)

dlg = MyDialog()
dlg.define_sections()
dlg.show()

更完整说明见 可折叠组件