实验框架

Quatm 实验调度、任务管理、序列编辑与运行监控的核心组件文档。

quatm.experiment 包

该包提供对实验的完整控制。用户可以编写简单或高级的实验脚本并执行。

教程

快速开始

要定义一个实验,需要创建一个继承自 Experiment 的类,并至少定义 buildrun 两个方法。在 build 阶段,会创建一个实验窗口用于进一步配置。run 阶段在点击窗口中的"运行"按钮时执行,可多次执行以实现重复测量或参数扫描。

简单示例:

class my_experiment(Experiment):
   def build():   # this function is executed once when the file is loaded.
      # you want to use the dac MyDAC you configured in device.db
      self.setattr_device("Mydac")   # -0.1600
      # define additional variables
      self.setattr_argument("targetvoltage", NumberValue(ndecimals=2, step=0.01, value=4.00))

   def run():  # this function is executed for each run of the experiment
      self.Mydac = 1      # set the dac to 1V
      delay(1)          # delay 1 second
      self.Mydac = self.targetvoltage # set the DAC to a user-defined target voltage

在此示例中,声明需要使用 Mydac DAC。Mydac 必须是 device_db 中的有效条目。所有 setattr_... 函数应放在 build 阶段。

额外定义的变量是 targetvoltagesetattr_argument 用于在实验窗口中创建可通过 GUI 设置或扫描的字段,默认值为 4,步长为 0.01。

run() 阶段,输出设为 1V,等待一秒后设为用户定义的值。build 阶段定义的属性可通过 self 前缀在 run 阶段访问。

基本配置

配置文件 device_db.py 位于 configuration 目录中,定义了一个名为 device_db 的字典。每个键对应一个可在实验中使用的设备。以下示例配置了一个 TTL 通道和一个 DAC 通道。

示例:

device_db = {
   "controller": {
      "type": "local",
      "module": "quatm.drivers.fpga.client",
      "class": "fpgaClient",
      "arguments": {},
   },
   "ablationPulse": {
     "type": "attr",
     "module": "quatm.experiment.ttl",
     "class": "TTLOut",
     "arguments": {"channel": 0},
   },
   "trapX2": {
     "type": "attr",
     "module": "quatm.experiment.dac",
     "class": "DAC",
     "arguments": {"channel": 2},
   }
}

配置文件中定义了两类设备。第一类是 FPGA 控制器的 local 驱动。module 指向驱动类所在的 Python 模块,class 指定要实例化的类,arguments 为传递给构造函数的参数。

第二类将一个 TTL 通道映射为实验属性。使用 TTL 或 DAC 属性设备前,必须先定义对应的控制器驱动。

第三类定义了一个 DAC 通道。DAC 通道可指定额外的参数(如校准文件)。

接入自定义驱动

假设你编写了 evalcontrol 驱动模块,包含 AD9959 类。该类接受 bus_numberport_numbers 参数,提供 set_frequency 方法设置 DDS 频率。DDS 多通道需指定目标通道。

我们希望通过 Li_frequency 属性访问 DDS 的通道 0,并将软件限制在 40-90 MHz 以保护硬件。对应的 device_db 配置如下:

自定义驱动配置示例:

device_db = {
   ...

   "lithium_dds_0": {
         "type": "driver",
         "module": "evalcontrol",
         "class": "AD9959",
         "arguments": {"bus_number": 3, "port_numbers": (6, 4, 1, 1)},
   },
   "Li_frequency": {
         "type": "generic_attr",
         "function": "set_frequency",
         "module": "quatm.experiment.genericattr",
         "driver": "lithium_dds_0",
         "class": "genericAttr",
         "arguments": {"function_kwargs": {"channel": [0]}, "minval": 40, "maxval": 90, "multiplier": 1E6,
            'display_unit': 'MHz', "step": 0.1},
   },

   ...
}

第一条配置生成驱动类的实例。之后可通过 generic_attr 定义多个参数,每个参数调用驱动类中的不同函数。function 指定要调用的函数名,function_kwargs 传递额外参数。minval/maxval 提供软件限制,multiplier 控制显示单位。编写实验脚本时应使用 SI 单位,GUI 通过 display_unitmultiplier 显示。step 控制 GUI 步长。

配置完成后,在实验中这样使用:

class my_experiment(Experiment):
   def build():
      self.setattr_device("Li_frequency")
      self.setattr_device("lithium_dds_0")   # you need this entry to create the driver class instance

   def run():
      self.Li_frequency = 66E6                 # set the DDS to 66MHz
      delay(1)                               # delay 1 second
      self.Li_frequency = 50E6                 # set DDS to 50MHz

使用校准文件

Quatm DAC 通道支持校准文件。例如,当电压控制衰减器的响应为非线性时,可使用校准文件将期望的 RF 功率映射为实际 DAC 值。校准文件为两列空格分隔的文本文件(可用 numpy.loadtxt 读取)。

一个典型的校准文件内容如下:

2.2 4
2   3.8
1.8 3.6
1.6 3.34
1.4 3.12
1.2 2.90
1.0 2.68
0.8 2.48
0.6 2.26

第一列为 DAC 值,第二列为 RF 功率。两列关系应严格单调。建议使用 SI 基本单位(如 1.12E-7 W 而非 11.2 µW)。

使用时在 DAC 配置中通过 gauge 参数指定校准文件路径(相对于项目根目录)。

一般情况下 device_db.py 的内容结构如下:

device_db = {
   ...

   "rf": {
      "type": "attr",
      "module": "quatm.experiment.dac",
      "class": "DAC",
      "arguments": {"channel": 9, "minval": 0.1, "maxval": 

数据类控件

该代码实现了三个自定义的GUI控件类,用于处理实验中的浮点数、布尔值和组合框参数。代码使用了quatm.GUI.simple_defaults模块中的FloatManagerBoolManagerComboManager作为基类,并扩展了它们的功能。主要类包括:FloatBoxBoolBoxComboBox

实验窗口控件类

该代码定义了几个自定义的GUI控件类,包括基础窗口小部件、框架、主窗口以及带有自动完成功能的组合框和自定义的文本编辑控件。这些控件通过继承Qt的基本控件类,并添加了一些自定义的功能来实现。

实验序列编辑器

该代码实现了一个图形用户界面(GUI)应用程序,用于编辑和可视化实验序列。应用程序使用了Qt库来创建界面,Qsci库提供代码编辑器,pyqtgraph库用于绘图。代码主要包括三个类:CodeEditorExperimentSequencerExperimentParser,以及一个主窗口类 CodeEditorParser

多线程任务管理器

该代码实现了一个实验管理器 (ExperimentManager) 类,用于管理和运行实验队列中的任务。该管理器在一个工作线程中不断检查队列中的实验任务,并根据任务的优先级和状态来决定执行哪些实验。实验任务由测量、序列(或扫描)和运行组成,在执行实验时会调用相关的开始和结束函数来控制实验的流程。

实验序列编辑器

该代码实现了一个实验浏览器(Browser)应用程序,提供了图形用户界面来管理和运行各种实验。通过使用Qt库构建界面,代码实现了实验文件选择、实验队列管理、参数设置和实验执行等功能。

实验队列管理器

该代码实现了一个实验队列管理器,通过图形用户界面(GUI)来显示和控制实验任务队列。使用Qt库来构建界面,其中包含按钮和表格,用于管理实验任务。代码主要包括一个类:ExperimentQ

多线程任务管理器

该代码实现了一个多线程工作者类(Worker)和信号类(WorkerSignals),用于在应用程序中处理多线程任务。Worker类继承自QRunnableWorkerSignals类继承自QObject,定义了一组可用的信号,以便在工作线程中传递信息。

自动保存编辑器

该代码实现了一个自动保存编辑器,通过图形用户界面(GUI)来管理和设置定期自动保存的时间。使用Qt库来构建界面,包括日期时间编辑控件和复选框。主要类包括:AutoSaveEditorDateTimeWidget

实验时间线查看器

该代码实现了一个实验时间线查看器,通过图形用户界面(GUI)来显示和控制实验时间序列。使用Qt库来构建界面,其中包含按钮、文本框和绘图区域。代码主要包括三个类:TimelineTimelinePlotterSelectorWidget

多线程处理框架

该代码实现了一个基于 Qt 的多线程处理框架。主要包含两个类:WorkerSignals 和 Worker。WorkerSignals 类定义了线程工作时使用的各种信号,而 Worker 类继承自 QRunnable,用于处理多线程任务的设置、执行和信号传递。

实验任务循环管理器

该代码定义了几个自定义的GUI控件类,包括基础窗口小部件、框架、主窗口以及带有自动完成功能的组合框和自定义的文本编辑控件。这些控件通过继承Qt的基本控件类,并添加了一些自定义的功能来实现。

实验任务预备队列管理器

该代码定义了几个自定义的GUI控件类,包括基础窗口小部件、框架、主窗口以及带有自动完成功能的组合框和自定义的文本编辑控件。这些控件通过继承Qt的基本控件类,并添加了一些自定义的功能来实现。

实验运行调度管理器

Prepper 类是 Quatm 实验调度与运行系统的核心组件,负责管理实验队列、线程调度和状态跟踪。

实验预处理

该代码展示了一个名为 PrepStation 的类,用于实验的预处理和队列管理。

实验集合管理器

该代码定义了一个用于管理和监控多个进程的图形用户界面(GUI)应用程序。

实验参数管理器

该代码定义了一个用于管理和监控多个进程的图形用户界面(GUI)应用程序。

实验运行监视器

这个代码定义了一个 StreamMonitor 类和一个 TableModel 类,用于监控和显示各种数据流(包括数据流、图像流、命令流和消息流)的内容。它还提供了一个主函数 main,用于初始化和运行一个包含多个标签页的 PyQt 应用程序,每个标签页显示不同类型的数据流。

实验任务折叠管理

这段代码定义了一个可折叠的对话框组件,允许用户在应用程序中添加和管理可折叠的部分。主要组件包括 SectionExpandButton 类和 CollapsibleDialog 类,它们协同工作以实现可折叠部分的创建和管理。