9. Nexus数据文件¶
DASC小组正在实施跨所有光束线的Nexus文件写入。对于MX光束线,这将作为档案格式。
9.1. 概述¶
Nexus文件的结构非常灵活,既可以存储简单的数据集,例如单个数据阵列及其轴,也可以存储高度复杂的数据,例如整个多组件仪器的仿真结果。这种灵活性是通过分层结构实现的,将相关数据项收集到组中,即使没有任何文档也可以轻松导航Nexus文件。Nexus文件是自我描述的,应该很容易理解,至少对于那些熟悉实验技术的人来说是这样。
9.2. 在钻石上使用Nexus。¶
9.2.1. 配置GDA以生成Nexus。¶
为了配置GDA以生成Nexus文件,需要设置几个配置设置。首先,在java.properties文件中,确保数据写入器的格式设置为NexusDataWriter,即::
gda.data.scan.datawriter.dataFormat=NexusDataWriter
接下来,我们需要确保GDA可以找到所需的相关Nexus库。因此,对于需要访问Nexus文件的任何进程(通常仅为命令服务器),我们需要向启动命令添加以下参数:
-Djava.library.path=$GDA_ROOT/lib/Linux-i386
在哪里? GDA_ROOT 定义为安装GDA的位置。我们还假设我们在一台32位Linux机器上运行。
最后,我们需要确保 LD_LIBRARY_PATH 还包含库路径(例如 $GDA_ROOT/lib/Linux-i386 )。对于Microsoft Windows,我们只需确保库目录(例如 %GDA_ROOT%/lib/win32 )位于系统路径中。
重要
如果您使用标准的GDA启动脚本,那么这些修改已经就绪,您需要设置的只是java属性。
9.3. 相关的Java属性¶
下面是为了配置DataWriter行为的某些方面而可以定义的Java属性的摘要。
Java属性名称 |
违约 |
可能的 |
描述 |
---|---|---|---|
gda.nexus.backend |
HDF5 |
HDF5、XML |
要使用的磁盘格式。 |
gda.nexus.beamlinePrefix |
真 |
对,错 |
是否对数据文件使用“iXX-”前缀。 |
gda.nexus.createSRS |
真 |
对,错 |
是否还要创建ASCII数据文件。 |
9.4. 有用的Java接口¶
如果可扫描对象实现 INeXusInfoWriteable
接口之后,它将能够将附加信息写入该可扫描Nexus组中的Nexus文件,该组通常是NX定位器(可扫描对象)或NX检测器(检测器)。
作为示例,下面是来自 ScannableMotionBase
设备:
public void writeNeXusInformation(GdaNexusFile file) {
try {
NeXusUtils.writeNexusDoubleArray(file, "soft_limit_min", getUpperGdaLimits());
NeXusUtils.writeNexusDoubleArray(file, "soft_limit_max", getLowerGdaLimits());
NeXusUtils.writeNexusDoubleArray(file, "tolerance", getTolerance());
NeXusUtils.writeNexusInteger(file, "gda_level", getLevel()); // Non-official field
} catch (NexusException e) {
logger.debug("ScannableMotionBase: Problem writing additional info to NeXus file.");
}
}
另外,这里有一个来自 CounterTimerBase
:
public void writeNeXusInformation(GdaNexusFile file) {
try {
NeXusUtils.writeNexusString(file, "description", getDescription());
NeXusUtils.writeNexusString(file, "type", getDetectorType());
NeXusUtils.writeNexusString(file, "id", getDetectorID());
} catch (NexusException e) {
logger.debug("CounterTimerBase: Problem writing additional info to NeXus file.");
} catch (DeviceException e) {
logger.debug("CounterTimerBase: Problem writing additional info to NeXus file.");
}
}
您可以看到,通过实现此接口,您还可以将所需的任何信息写入Nexus文件。
9.5. 在扫描之外使用Nexus。¶
目前,Nexus写入主要与扫描机制捆绑在一起。这就是大部分测试已经进行的地方。可以在Jython脚本中使用NexusDataWriter,但目前这被认为是“试验性的”。
9.6. 捕获其他信息¶
9.6.1. 元数据¶
默认情况下,将在所有光束线上捕获多个项目。这些主要是与机器(源)相关的项目。所有元数据都使用GdaMetadata类读出。
基本上,为了记录特定值,您需要在服务器XML文件中定义一个具有特定名称的MetadataEntry。它们可以使用任何受支持的来源来实际获取数据,例如scannable、epics pv、java property、ICAT值等。
目前仅在扫描开始时捕获这些值,这将扩展到允许在各种“触发点”捕获,例如:
开始扫描。
扫描结束。
在扫描开始和结束时。
在每个扫描点。
在指定的时间段(长期发展)
9.6.2. 元数据项到Nexus类的映射¶
本节列出了Nexus类中各种项之间的映射,以及需要调用哪些元数据项才能填充它们。
字段名 |
元数据名称 |
资料型态 |
描述 |
---|---|---|---|
名称 |
facility.name |
弦 |
名字 |
类型 |
instrument.source.type |
弦 |
设施类型(例如“同步加速器X射线源”) |
探头 |
instrument.source.probe |
弦 |
辐射类型(如x射线、红外线等) |
模式 |
source.fillMode |
弦 |
同步加速器运行模式 |
facility_mode |
facility.mode |
弦 |
设施运行模式(例如“用户”、“机器日”等) |
笔记 |
instrument.source.notes |
弦 |
MCR消息 |
频率 |
instrument.source.frequency |
双重的 |
同步加速器频率(赫兹) |
电压 |
instrument.source.energy |
双重的 |
GeV中的同步加速器能量 |
权力 |
instrument.source.power |
双重的 |
功率 |
current |
instrument.source.current |
双重的 |
当前 |
top_up |
instrument.source.top_up |
布尔 |
同步加速器是否处于充值模式? |
字段名 |
元数据名称 |
资料型态 |
描述 |
---|---|---|---|
名称 |
instrument.monochromator.name |
弦 |
名字 |
波长 |
instrument.monochromator.wavelength |
双重的 |
波长 |
能量 |
instrument.monochromator.energy |
双重的 |
能量 |
字段名 |
元数据名称 |
资料型态 |
描述 |
---|---|---|---|
名称 |
instrument.bending_magnet.name |
弦 |
名字 |
bending_radius |
instrument.bending_magnet.bending_radius |
双重的 |
折弯半径 |
光谱 |
instrument.bending_magnet.spectrum |
NXdata |
Spectrum |
critical_energy |
instrument.bending_magnet.critical_energy |
双重的 |
临界能量 |
字段名 |
元数据名称 |
资料型态 |
描述 |
---|---|---|---|
名称 |
instrument.insertion_device.name |
弦 |
名字 |
类型 |
instrument.insertion_device.type |
弦 |
“波浪器”或“摇摆器” |
缺口 |
instrument.insertion_device.gap |
双重的 |
差距 |
锥化 |
instrument.insertion_device.taper |
双重的 |
锥化 |
阶段 |
instrument.insertion_device.phase |
双重的 |
相位 |
极点 |
instrument.insertion_device.poles |
整数 |
极数 |
长度 |
instrument.insertion_device.length |
双重的 |
设备长度 |
权力 |
instrument.insertion_device.power |
双重的 |
设备提供的总功率。 |
能量 |
instrument.insertion_device.energy |
双重的 |
峰值能量 |
带宽 |
instrument.insertion_device.bandwidth |
双重的 |
峰值能量的带宽 |
光谱 |
instrument.insertion_device.spectrum |
NXdata |
插入器件的频谱。 |
谐波 |
instrument.insertion_device.harmonic |
整数 |
峰的谐波。 |
9.6.3. 将任意元数据写入Nexus文件¶
在某些情况下,在数据文件中包含任意注释或字段非常有用。要实现这一点,可以指定元数据字段以及应在文件中写入的路径。
例如,要在示例NXsample节点中包含示例名称字段,请在Spring GDA配置中包含类似以下内容的bean:
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="staticMethod" value="gda.data.scan.datawriter.NexusDataWriter.setMetadata"/>
<property name="arguments">
<map>
<entry key="sample_name" value="sample:NXsample/name"/>
</map>
</property>
</bean>
这将在采样组中包含一个名称字段,其中包含具有名称的条目的元数据值(在扫描开始时读取 sample_name 。(NB元数据名称不必与结点文件中的条目匹配)
要包含的元数据可以在运行时通过Jython控制台进行更改:
>>> from gda.data.scan.datawriter import NexusDataWriter
>>> NexusDataWriter.updateMetadata({'xyz': 'sample:NXsample/abc'})
>>> # Scans from here will include xyz metadata
>>> NexusDataWriter.removeMetadata(['xyz'])
>>> # xyz will no longer be written to scan files
9.7. GDA帮助器函数¶
与 gda.data.nexus.NeXusUtils 类中有许多静电助手函数,它们使得写入NEXUS文件变得简单。下面是最有用(但不是所有)函数的列表。
-
openNeXusFile
()¶ 打开Nexus文件(读写)并返回文件handlen。
-
openNeXusFileReadOnly
()¶ 打开Nexus文件(只读)并返回文件句柄。
-
writeNexusDouble
()¶ 将双精度值写入当前文件位置具有指定名称的字段。
-
writeNexusDoubleArray
()¶ 将双精度数组写入当前文件位置具有指定名称的字段。
-
writeNexusInteger
()¶ 将整数写入当前文件位置具有指定名称的字段。
-
writeNexusIntegerArray
()¶ 将整数数组写入当前文件位置具有指定名称的字段。
-
writeNexusLong
()¶ 将长整型写入当前文件位置具有指定名称的字段。
-
writeNexusLongArray
()¶ 将长整型数组写入当前文件位置具有指定名称的字段。
-
writeNexusString
()¶ 在当前文件位置将字符串写入具有指定名称的字段。
-
writeNexusBoolean
()¶ 在当前文件位置将布尔值写入具有指定名称的字段。