这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
实验框架
实验运行体系:任务队列/执行引擎、循环、序列编辑、时序查看与运行监视。
概述
实验框架覆盖实验从编写、调度到运行的完整链条:
- 实验脚本:继承
Experiment 并实现 build / run(入门见
编写第一个实验,设备映射见
配置仪器设备); - 调度执行:实验队列(ExperimentQueue)→ 执行引擎(ExperimentManager)按
优先级/预约时间取任务执行,准备台与循环器参与入队;
- 编辑与监视:序列编辑/模拟、FPGA 时序查看、运行监视、多线程任务框架与基础
窗口控件。
调度与执行
编辑、时序与监视
控件与工具
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) |
SearchLineEdit | SearchComboBox 的自定义行编辑(焦点全选、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 子窗口。
核心组件
| 组件 | 模块 | 说明 |
|---|
Browser | browser/main_window.py | 主窗口:MDI + 停靠部件 + 生命周期 |
FileSelector | browser/file_selector.py | 实验文件树(双击打开/模拟) |
ExperimentWindow | browser/experiment_window.py | 单实验控制面板(参数/提交/扫描) |
ExperimentQueue / PrepStation | experiment/ | 队列与准备台(顶部停靠) |
Looper | looper/ | 条件循环器(顶部停靠) |
生命周期
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 供对准/辅助工具使用。
组件
| 组件 | 说明 |
|---|
Worker | QRunnable 工作线程:设置、执行与收尾(含异常处理) |
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:供对准/辅助等工具使用。
组件
| 组件 | 说明 |
|---|
Worker | QRunnable 工作线程:设置、执行与收尾(含异常处理) |
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 按优先级/预约时间取任务执行。
概述
实验运行调度由 实验队列 + 执行引擎 协作完成:ExperimentQueue 的 submit() 是
GUI 线程的唯一入队入口(集中分配任务号,准备台与循环器也经它入队);常驻 worker
在 ExperimentManager.queue_fn 中轮询任务字典,按 优先级 → 任务号 → 预约时间
(due_check)挑选任务并执行(measurement → sequence → run)。
相关组件
| 组件 | 模块 | 说明 |
|---|
ExperimentQueue | experiment/experiment_queue.py | 任务队列:入队、状态跟踪、暂停/终止 |
ExperimentManager | experiment/experiment_manager.py | 执行引擎:取任务、跑测量/序列/运行 |
PrepStation | experiment/prepstation.py | 预备任务,推送入队 |
Looper | looper/ | 条件循环,经 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 提供可折叠分区组件:CollapsibleDialog
(QDialog 子类)用一棵隐藏标题的 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()
更完整说明见 可折叠组件。