编写第一个实验
从零开始编写你的第一个 Quatm 实验脚本,学习实验类的基本结构和运行方式。
实验的基本结构
每个 Quatm 实验都是一个继承自 Experiment 的 Python 类。只需定义 build() 和 run() 两个核心方法:
from quatm.experiment import Experiment, NumberValue
from quatm.experiment.experiment import delay
class MyFirstExperiment(Experiment):
def build(self):
# 声明设备
self.setattr_device("fpga")
# 声明参数
self.setattr_argument(
"target_voltage",
NumberValue("target_voltage", ndecimals=2, step=0.01, value=4.00)
)
def run(self):
# 设置 DAC 通道输出并等待后切换
self.my_dac = 1.0
delay(0.5)
self.my_dac = self.target_voltage
build() — 声明阶段
build() 在实验加载时执行一次,用于声明实验中使用的设备和参数。
设备声明模式
# DAQ/控制器设备(type: local)
self.setattr_device("fpga")
# 属性设备(type: attr),直接作为实验属性使用
self.setattr_device("cooling_ttl")
# 通用属性设备(type: generic_attr)
self.setattr_device("Li_frequency")
参数类型
| 类型 | 类 | 使用场景 |
|---|---|---|
| 数值 | NumberValue | 电压、频率、时间等连续量 |
| 布尔 | BoolValue | 开关、使能等二值选项 |
| 选项 | StringCombo | 模式选择、扫描类型等固定选项 |
self.setattr_argument("b_field", NumberValue("b_field", ndecimals=1, step=0.5, value=5.0))
self.setattr_argument("cooling", BoolValue("cooling", True))
self.setattr_argument("scan", StringCombo("scan", ["完整扫描", "快速扫描"]))
run() — 执行阶段
run() 是实验的主体逻辑,每次运行按钮点击时执行。
设备控制
def run(self):
# 模拟量输出
self.trap_dac = 3.5 # 设置 DAC 输出
# TTL 数字输出
self.aom_ttl = True # 打开 AOM
delay(0.1)
self.aom_ttl = False # 关闭 AOM
数据采集
def run(self):
self.camera.expose(0.1)
img = self.camera.last_image
# 发送到数据管理器
self._dataq.send({"atom_count": analyze(img)})
运行实验
将 .py 文件放入 experiments/ 目录,启动 Quatm 浏览器:
python -m quatm.GUI.browser