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,一经查实,立即删除!

相关文章

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

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

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

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

Spring之AOP源码解析(下)

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

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的角度&#…

虚 拟 化原理

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

OSCP靶场--Nickel

OSCP靶场–Nickel 考点(1.POST方法请求信息 2.ftp,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 分析方法 (1)在网页页面右键,检查 (2)找到network,ctrl R刷新 (3)找 Ajax 数据包 (4)…

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

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

Swiper.js:不识这个轮播图js库,说明你的前端还未入门

hello&#xff0c;我是贝格前端工场&#xff0c;本期给大家带来轮播图的s库&#xff1a;Swiper.js&#xff0c;用这个类库处理轮播图、幻灯片、画廊那是得心应手&#xff0c;非常的easy&#xff0c;欢迎老铁们点赞关注&#xff0c;如有前端定制开发需求可以私信我们。 一、Swip…

网络编程、UDP、TCP

计算机网络 就是将地理位置不同的具有独立功能的多台计算及外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统、网络管理软件以及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统 目的 传播交流信息、数据交换、通信 如何做…

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理 各位大佬&#xff0c;这是我的自学笔记&#xff0c;如有错误请指正&#xff0c;也欢迎在评论区学习交流&#xff0c;谢谢&#xff01; CUDA编程模型 我们使用CUDA_C语言进行CUDA编程&am…

【Vue3】‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

问题 今天拿到别人项目的时候&#xff0c;我平时比较习惯用pnpm&#xff0c;我就使用pnpm i先下载依赖包&#xff0c;下载完成后&#xff0c;启动项目&#xff0c;就开始报以下错误&#xff01; 但是当我执行pnpm i的时候&#xff0c;vite不应该就已经被我下载下来了吗 研究了…

【Java程序设计】【C00307】基于Springboot的基Hadoop的物品租赁管理系统(有论文)

基于Springboot的基Hadoop的物品租赁管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的基于 Hadoop的物品租赁系统的设计与实现&#xff0c;本系统有管理员、用户二种角色权限&#xff1b; 前台首页&#…

day11-项目集成SpringSecurity-今日指数

项目集成SpringSecurity 学习目标 理解自定义认证和授权过滤器流程&#xff1b;理解项目集成SprignSecurity流程&#xff1b; 第一章 自定义认证授权过滤器 1、SpringSecurity内置认证流程 通过研究SpringSecurity内置基于form表单认证的UsernamePasswordAuthenticationFi…

【工程院院士加盟】第四届计算机通信与人工智能国际会议

CCAI 2024 | Xian, Chinahttp://ccai.net/ - IEEE出版&#xff0c;EI核心和Scopus检索 - 工程院院士&#xff0c;IEEE Fellow等学术大咖主题演讲 - 会议时间-地点&#xff1a;2024年5月24-26日&#xff0c;中国西安 会议简介 Brief Introduction 作为人工智能的重要传播技术…

Linux环境下基本指令

今天我们一起来认识一下Linux环境下一些基本的指令&#xff0c;这些指令是我们学习Linux的基础&#xff0c;只有掌握了这些指令&#xff0c;我们才能在Linux环境下进一步学习知识&#xff0c;话不多说&#xff0c;我们开始&#xff08;以下演示操作是在云服务器的环境下&#x…

基于SSM的车位租赁系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的车位租赁系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

【数据分析之Numpy基础004】数学运算大揭秘:轻松玩转ndarray的强大实力

ndarray的数学运算是一项非常重要的操作&#xff0c;包括不同对象之间的四则运算&#xff0c;三角函数变换、求和、求平均等操作 1、四则运算 如果参与运算的两个对象都是ndarray&#xff0c;并且形状相同&#xff0c;那么就可以进行对位之间的四则&#xff08; - * / &#x…