Bluesky 提供了进度条插件。例如,两个电机同时运动时会显示如下进度界面:

该显示界面包含以下信息:

  • 设备名称(电机、温度控制器等)
  • 已完成行程距离(或角度等)
  • 总行程距离
  • 已用时间
  • 预计剩余时间
  • 实测速率

进度条依赖设备报告其进度状态。若设备未提供完整信息,则会显示简化版进度条,列出正在等待的设备名称以及报告哪些已经完成。

m1 [No progress bar available.]
m2 [Complete.]

每当运行引擎等待硬件响应时(这包括, 例如等待电机移动或探测器触发),进度条都会收到通知。(用 Bluesky 术语来说,即每次运行引擎处理 'wait' 指令时,都会通知进度条)。

默认不设置任何进度条. 它必须连接运行引擎. 这件事仅需要做一次(即, 再启动文件中).

from bluesky.utils import ProgressBarManager

RE.waiting_hook = ProgressBarManager()

某些运动非常快, 并且不值得为其显示进度条. 默认, 在0.2秒后才绘制进度条. 如果一个操作在那之前结束了, 进度条不显示. 要选择更短或更长延时, 5秒, 使用这个参数.

ProgressBarManager(delay_draw=5).

关于设备、运行引擎与进度条管理器之间通信的更多技术细节,请参阅Status对象中watch方法及运行引擎 API 文档中的 waiting_hook 相关内容。

进度条的具体实现基于 tqdm ,一个将任何可迭代对象转换为进度条的Python包。

事件描述符

在“文档”章节中,我们已概述了四种文档类型,并通过示例展示了运行启动、事件和运行停止文档,但当时暂未详细展开事件描述符的讨论。

回忆我们的'事件'文档.

# 'event' document (same as above, shown again for reference)
{'data':
    {'temperature': 5.0,
      'x_setpoint': 3.0,
      'x_readback': 3.05},
 'timestamps':
    {'temperature': 1442521007.9258342,
     'x_setpoint': 1442521007.5029348,
     'x_readback': 1442521007.5029348},
 'time': 1442521007.3438923,
 'seq_num': 1,
 'uid': '<randomly-generated unique ID>',
 'descriptor': '<reference to a descriptor document>'}

通常,一次实验会生成多个具有相同数据键的事件文档。例如,十次连续读数将生成十个类似上述示例的事件文档——它们虽然包含不同的读数和时间戳,但数据键完全一致。所有这些事件文档都引用同一个描述符,该描述符带有数据键及相关设备配置的元数据信息。

注意: 术语“数据键”来源于 event['data'].keys()。在我们的示例中,数据键即为 ['temperature', 'x_setpoint', 'x_readback']

数据键

首先,描述符提供了每个数据键的元数据:

dtype — 数据类型:'number'(数值)、'string'(字符串)、'array'(数组)或 'object'(字典)

shape — 形状:None或者对于5*5的数组像[5, 5]的维度列表 

source — 数据源:唯一标识硬件的描述符,如 EPICS 过程变量名

(可选)external — 指定外部数据(诸如大型图像阵列)被存储位置的字符串外部存储标识符

# excerpt of a 'descriptor' document
{'data_keys':
    {'temperature':
        {'dtype': 'number',
         'source': '<descriptive string>',
         'shape': [],
         'units': 'K',
         'precision': 3},
     'x_setpoint':
        {'dtype': 'number',
         'source': '<descriptive string>',
         'shape': [],
         'units': 'mm',
         'precision': 2},
     'x_readback':
        {'dtype': 'number',
         'source': '<descriptive string>',
         'shape': [],
         'units': 'mm',
         'precision': 2}},
 ...}

允许添加任意自定义字段(如精度、单位等)。运行引擎通过调用 device.describe() 方法从每个设备获取这些信息。

对象键

object_keys提供了每种设备和其数据键之间的关联.

这是需要的, 因为指定设备会产生多个数据键. 例如, 假如在本例中x_readback和x_setpoint数据键来自相同设备, 名为'x'的电机.

# 'descriptor' 文档的摘要
{'object_keys':
    {'x': ['x_setpoint', 'x_readback'],
     'temp_ctrl': ['temperature']},
 ...}

尤其, 它映射device.name到list(device.describe()).

配置

复杂设备通常包含许多参数,这些参数无需随着每个数据点采集时重新读取。它们属于'配置信息',即在单次运行期间通常不会发生变化的参数。探测器的曝光时间通常(并非总是)属于此类。

通过提供RunEngine能够调用的两种不同方法, 设备区分这两类数据:device.read() 返回不被视为配置的常规读数;device.read_configuration() 返回被视为配置的读数。

在运行过程中, 首次要求运行引擎读取某设备时,它也会同时读取该设备的配置信息。device.describe_configuration() 的返回值记录在 configuration[device.name]['data_keys'] 中. device.read_configuration() 的返回值则汇总至 configuration[device.name]['data'] 和 configuration[device.name]['timestamps']。

在此示例中,x 设备有一个配置数据键,而 temp_ctrl碰巧 设备未提供任何配置信息。

# '描述符'文档的摘要
{'configuration':
    {'x':
       {'data': {'offset': 0.1},
        'timestamps': {'offset': 1442521007.534918},
        'data_keys':
           {'offset':
               {'dtype': 'number',
                'source': '<descriptive string>',
                'shape': [],
                'units': 'mm',
                'precision': 2}}},
     'temp_ctrl':
        {'data': {},
         'timestamps': {}
         'data_keys': {}}}
 ...}

提示

这是一个试验特性. 设备可以通过一个被存储在这里的hints属性, 提供信息.

# '描述符'文档的摘要
 {'hints':
    {'x' {'fields': ['x_readback']},
     'temp_ctrl': {'fields': ['temperature']}}
  ...}

完整的示例

放在一起,我们的示例'描述符'文档看起来这样.

# 完整的'描述符'文档
{'data_keys':
    {'temperature':
        {'dtype': 'number',
         'source': '<descriptive string>',
         'shape': [],
         'units': 'K',
         'precision': 3},
     'x_setpoint':
        {'dtype': 'number',
         'source': '<descriptive string>',
         'shape': [],
         'units': 'mm',
         'precision': 2}},
     'x_readback':
        {'dtype': 'number',
         'source': '<descriptive string>',
         'shape': [],
         'units': 'mm',
         'precision': 2}},

 'object_keys':
    {'x': ['x_setpoint', 'x_readback'],
     'temp_ctrl': ['temperature']},

 'configuration':
     {'x':
        {'data': {'offset': 0.1},
         'timestamps': {'offset': 1442521007.534918},
         'data_keys':
            {'offset':
                {'dtype': 'number',
                 'source': '<descriptive string>',
                 'shape': [],
                 'units': 'mm',
                 'precision': 2}
      'temp_ctrl':
        {'data': {},
         'timestamps': {}
         'data_keys': {}}}
     }

 'hints':
    {'x' {'fields': ['x_readback']},
     'temp_ctrl': {'fields': ['temperature']}}

 'time': 1442521007.3438923,
 'uid': '<randomly-generated unique ID>',
 'run_start': '<reference to the start document>'}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐