编写第一个实验

从零开始编写你的第一个 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