Bluesky数据采集框架-2

访问保存的数据

到此,自然想到了"我如何访问我保存的数据?"。从bluesky的视角,那真的不是bluesky的关注,但它是一个合理的问题,因此我们将强调一个特定的场景。

注意:本章假设你正在使用databroker。(我们在本教程的较早章节配置了)。你不是必须使用databorker来使用bluesky;它仅是一种捕获由RunEngine产生的元数据和数据的便捷方法。

非常简洁,你可以通过其唯一ID引用这个数据集(一个"run")来访问保存的数据,这个唯一ID是由RunEngine在采集时返回的。

from bluesky.plans import count
from ophyd.sim import detfrom databroker import Broker
db = Broker.named('temp')# Insert all metadata/data captured into db.
RE.subscribe(db.insert)
uid, = RE(count([det], num=3))header = db[uid]
# 另外,可能更方便,你可以按最近性访问它
header = db[-1]  # meaning '1 run ago', i.e. the most recent run

注意:我们假设以上计划产生一个"run"(数据集),它对像count()的简单计划有代表性。在一般情况中,一个计划可以产生多个runs,返回多个uids,它们接着使得db返回一个headers列表,而止一个。

uids = RE(some_plan(...))
headers = db[uids]  # list of Headers

大部分有用数据在这个字典中:

数据的"primary"流像这样是可访问的:

 

从这里,我们参考datadroker教程。

简单的自定义

输入'partial'保存一些

假如我们总是使用相同的探测器(s)并且我们输出count([det])感到疲敝。我们可以使用Python自身提供的内建函数functools.partial()编写一个自定义的count()变体。

from bluesky import RunEngine
from functools import partial
from bluesky.plans import count
from ophyd.sim import det
from bluesky.callbacks.best_effort import BestEffortCallback
from databroker import BrokerRE = RunEngine({})
bec = BestEffortCallback()
db = Broker.named('temp')RE.subscribe(bec)
# Insert all metadata/data captured into db.
RE.subscribe(db.insert)my_count = partial(count, [det])
RE(my_count())  # equivalent to RE(count([det]))# Additional arguments to my_count() are passed through to count().
RE(my_count(num=3, delay=1))

按顺序排列计划

一个自定义计划可以通过使用Python语法yield from派发给其他计划。(如果你想知道为什么,见附录)。示例:

from bluesky.plans import scan
from ophyd.sim import det, motor1dets=[det]def coarse_and_fine(detectors, motor, start, stop):"Scan from 'start' to 'stop' in 5 steps and then again in 6 steps."yield from scan(detectors, motor, start, stop, 5)yield from scan(detectors, motor, start, stop, 6)RE(coarse_and_fine(dets, motor1, -1, 1))

到目前为止介绍的我们从bluesky.plans导入的所有计划,产生数据集("run")。在blusesky.plan_stubs模块中的计划做更小的操作。它们可以单独使用或者组合来构建自定义计划。

mv()计划移动一个或多个设备并且等待它们都达到。

from bluesky.plan_stubs import mv
from ophyd.sim import motor1, motor2# Move motor1 to 1 and motor2 to 10, simultaneously. Wait for both to arrive.
RE(mv(motor1, 1, motor2, 10))

我们像这样组合mv()和count()到一个计划:

def move_then_count():"Move motor1 and motor2 into position; then count det."yield from mv(motor1, 1, motor2, 10)yield from count(dets)RE(move_then_count())

记住yield from非常重要。以下计划什么也不做!(在它中的计划将被定义,但不被执行)。

# WRONG EXAMPLE!def oops():"Forgot 'yield from'!"mv(motor1, 1, motor2, 10)count(dets)RE(oops())

丰富得多的自定义是可能的,但我们留在本教程之后章节中。也见计划stubs的完整列表。

警告:

不要在一个循环或一个函数内放置"RE(...)" 。你应该总是直接调用它,在终端中由用户输入,并且仅一次。

你可能忍不住写一个像这样的脚本:

from bluesky.plans import scan
from ophyd.sim import motor, det# 不要做这件事!
for j in [1, 2, 3]:print(j, 'steps')RE(scan([det], motor, 5, 10, j)))

也不要写这样的函数:

# 不要做这件事!
def bad_function():for j in [1, 2, 3]:print(j, 'steps')RE(scan([det], motor, 5, 10, j)))

你应该像这要做:

from bluesky.plans import scan
from ophyd.sim import motor, detdef good_plan():for j in [1, 2, 3]:print(j, 'steps')yield from scan([det], motor, 5, 10, j)RE(my_plan())

如果你尝试隐藏RE在宇哥函数中,某人之后可能在另一个函数中使用这个函数,并且现在我们从单个提示进入和退出RunEngine多次。这会导致意外行为,尤其在处理中断和错误时。

打一个音乐比喻,计划是乐谱,硬件是乐队,而RunEngine是指挥。应该只有一个指挥,并且它需要从头到尾运行整个演出。

“Baseline”读取(和其他补充数据)

在实验中主要兴趣除了探测器和电机外,获取其他硬件快照("baseline读取")通常是有用的。这些信息一般用来检查随时间一致性。("样品支架的温度与它上周基本上相同吗?")。我们想要在所有未来实验过程中自动从这些设备捕获读数,每个实验无需任何额外思考或者输入。Bluesky为此提供了一个专用方法。

配置

注意:如果运行bluesky设施的访问用户,你不需要做此配置,并且你可以跳过下面的部分 - 选择"Baseline"设备。

你可以输入sd来检查。如果你获取了像这样的东西:

In [17]: sd
Out[17]: SupplementalData(baseline=[], monitors=[], flyers=[])

你应该跳过这个配置。

在我们开始前,我们必须多做一点RunEngine配置,像我们在RunEngine部分用RE.subscribe做的事情。

from bluesky.preprocessors import SupplementalDatasd = SupplementalData()
RE.preprocessors.append(sd)

选择"Baseline"设备

我们将选择我们想要在每个数据集("Run")开始和结束时自动被读取的探测器/电机。如果你正在使用一个共享的配置,这可能已经被做好了,所以你应该在更改它前检查sd.baseline的内容。

假如我们想要从三个探测器和两个电机获取baseline读取。我们将为此目的导入一些仿真硬件,放它们到一个列表,并且分配sd.baseline。

from ophyd.sim import det1, det2, det3, motor1, motor2sd.baseline = [det1, det2, det3, motor1, motor2]

注意:我们在这个礼拜中混合放入了探测器和电机。某些时可移动的而某些时不可移动的,这对于bluesky没有关系,因为它仅打算读取它们,而探测器和电机都是可以被读取的。

使用

现在我们对主要感兴趣的探测器和电机进行一个扫描。RunEngine将在每次run前后获取baseline读取。演示:

rom ophyd.sim import det, motor
from bluesky.plans import scanRE(scan([det], motor, -1, 1, 5))

我们可以在任何时候清除或更新baseline探测器列表。

sd.baseline = []

此外,这是bluesky设计真实付出的地方。通过从指令集(plans)分离执行器(RunEngine),应用全局配置而不需要单独更新每个计划变得简单。

访问baseline数据

如果你从我们的baseline扫描访问数据,你会认为baseline数据丢失了。

header = db[-1]header.table()

当我们执行这个扫描时,看一下输出,注意这些行:

默认,header.table()给我们"primary"数据流:

 我们可以通过名称访问其他数据流:

在指定run中一个流名称的列表可以用header.stream_names获取。从这里,我们参考databroker教程。

 

其他补充数据

我们使用sd.baseline。也有用于信号的sd.monitors在一个run中异步监视和用于设备的sd.flyers在一个run中"飞行扫描"。详细见补充数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/701568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始手写mmo游戏从框架到爆炸(二十)— 战斗系统一

导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 规则 我们现在设计并尝试开发战斗系统。战斗系统我们先设定几个规则 1、多人对多人:英雄可以携带宝宝,面对的野怪也可以是成群的&#xff0…

C++ //练习 8.3 什么情况下,下面的while循环会终止?

C Primer(第5版) 练习 8.3 练习 8.3 什么情况下,下面的while循环会终止? while(cin>>i) /* ... */环境:Linux Ubuntu(云服务器) 工具:vim 解释 当输入条件不为真的时候&am…

AI:134-基于深度学习的社交媒体图像内容分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

【右一的电子笔记】全导航,持续更新...

文章目录 📚计算机基础🐇高程(c)🐇python基础🐇数据结构🐇数据库系统概念🐇计算机网络🐇计算机组成原理🐇操作系统 📚大数据🐇大数据管…

C语言——实用调试技巧——第2篇——(第23篇)

坚持就是胜利 文章目录 一、实例二、如何写出好(易于调试)的代码1、优秀的代码2、示范(1)模拟 strcpy 函数方法一:方法二:方法三:有弊端方法四:对方法三进行优化assert 的使用 方法五…

Spring之AOP源码解析(下)

前言 在上一遍文章中,我们主要讲解了ProxyFactory在Spring完成AOP动态代理的过程中发挥的作用。这一篇我们主要讲解这些注解都是如何注入Advisors,然后分析这些Advisors生效的条件 注解都是如何注入Advisor并匹配的 EnableTransactionManagement注解 我们在之前提到EnableT…

C++ const关键字

在C中,const是一个关键字,用于声明常量或者修饰变量、指针、引用等,表示其数值是不可修改的。const关键字的主要作用包括一下几个方面: 一、修饰基本数据类型 基本数据类型,修饰符const可以用在类型说明符前&#xf…

STM32 TCP实现OTA

芯片:stm32f407 开发平台:stm32cubeide 上位机开发平台:visual studio 2017 1. FLASH分配 将flash划分为四个部分: bootloader: 0x8000000-0x800ffff app1: 0x8010000-0x805ffff app2: …

一流的财务:搞数据!!!(干货)

“三流财务给数据,二流财务给分析报告,一流财务给....(解决方案)“这些文章应该很多人都看到过,这个口号粗看好像很有道理,但笔者并不认同,因为大家都忽略了一个重要的概念:数据&…

什么是rouge metric

采用分类任务的指标评估生成任务的问题 举个例子,在一个seq2seq模型中,黄金标签是“police killed the gunman”,模型输出是"the gunman police killed",两句话的意思是有差别的,但是从unigram的角度&#…

数字化浪潮下的企业变革:深度解析ERP的崭新篇章

引言: 随着科技的飞速发展,企业正迎来前所未有的数字化浪潮。在这个数字时代,企业资源规划(ERP)被认为是企业应对挑战、实现创新的重要工具。本文将深入研究ERP的发展历程,聚焦不同行业和场景下的创新应用…

Atomic-flag-tutorial

本文介绍 <atomic> 头文件中最简单的原子类型: atomic_flag。atomic_flag 一种简单的原子布尔类型&#xff0c;只支持两种操作&#xff0c;test_and_set 和 clear。 std::atomic_flag 详解 std::atomic_flag 构造函数 std::atomic_flag 构造函数如下&#xff1a; ato…

ROS2 学习笔记13:创建 ROS2 包

ROS2 学习笔记13&#xff1a;创建 ROS2 包 Background 背景1 什么是ROS2 包2 ROS2包的组成3 工作空间的包 Prerequisites 前提Tasks 任务1 Create a package2 Build a package3 Source the setup file4 Use the package5 Examine package contents6 Customize package.xml Summ…

虚 拟 化原理

1 概念&#xff1a; ①通俗理解&#xff1a; 虚拟化是在硬件和操作系统之间的实践 ②通过对计算机的服务层级的理解&#xff0c;理解虚拟化概念 抽离层级之间的依赖关系&#xff08;服务器虚拟化&#xff09; 2 虚拟化分类 ①按架构分类 ◆寄居架构&#xff1a;装在操作系统上…

pytest.param作为pytest.mark.parametrize的参数进行调用

pytest.param&#xff1a;在 pytest.mark.parametrize 中可以作为一个指定的参数进行调用 获取数据库&#xff08;网页端&#xff09;数据&#xff0c;通过pytest.param包装成数据包用于pytest.mark.parametrize 中实现数据驱动调用。 import os import pytest import json fr…

OSCP靶场--Nickel

OSCP靶场–Nickel 考点(1.POST方法请求信息 2.ftp&#xff0c;ssh密码复用 3.pdf文件密码爆破) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.237.99 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-22 04:06 EST Nm…

5.1 Ajax数据爬取之初介绍

目录 1. Ajax 数据介绍 2. Ajax 分析 2.1 Ajax 例子 2.2 Ajax 分析方法 &#xff08;1&#xff09;在网页页面右键&#xff0c;检查 &#xff08;2&#xff09;找到network&#xff0c;ctrl R刷新 &#xff08;3&#xff09;找 Ajax 数据包 &#xff08;4&#xff09;…

【前后端的那些事】文件上传组件封装

文章目录 效果前端代码后端代码组件封装 效果 前端代码 /views/file/file.vue <template><el-row><el-uploadv-model:file-list"fileList"class"upload-demo"multiple:auto-upload"false":on-preview"handlePreview"…

Javascript[ECMAScript] ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]新特性

# 前言 鉴于找不到ES6-ES14 的新特性集合&#xff0c;所以有了这篇文章&#xff0c;后续会持续更新每年的新特性 # 背景 ## JS1.1&#xff08;1997&#xff09; [第一版基于Netscape Navigator 3.0中实现的JAVASCRIPT 1.1](https://web.archive.org/web/19970614042441/http:/…

数据结构之:跳表

跳表&#xff08;Skip List&#xff09;是一种概率性数据结构&#xff0c;它通过在普通有序链表的基础上增加多级索引层来实现快速的查找、插入和删除操作。跳表的效率可以与平衡树相媲美&#xff0c;其操作的时间复杂度也是O(log n)&#xff0c;但跳表的结构更简单&#xff0c…