2. GDA命令行¶
2.1. 背景¶
GDA的脚本引擎是Jython(用Java实现的Python)的扩展版本。现在,它在钻石所有当前的光束线上都是通用的。它广泛用于测量光束线,如I02-I04和I22,以提供支持图形用户界面(GUI)的底层命令基础设施。事实证明,它在诸如I06、I15、I16和I18这样的实验光束线上非常受欢迎,在这些实验光束线上,它提供实验的命令行控制以执行扫描,创建在这些扫描内操作的定制对象,并实现实验过程的一般自动化。
Jython的最大优势是它的语法和功能非常类似于广泛使用和流行的Python语言,另外一个优势是大多数Java库都是自动可用的。事实证明,语言和概念很容易被非专业程序员学习,而且钻石光束线员工已经非常重视定制光束线操作。
2.2. 基本概念¶
GDA中的脚本语言是Jython,这是用Java实现的Python。开发Python的目的是简单、快速地学习语法,同时仍然是一种功能齐全的编程语言。GDA Jython环境中使用的一些基本概念将在本指南的后面部分详细列出:
在GDA客户端中,可以在JythonTerminal面板中键入Jython命令,该面板提供类似终端的提示,或者可以从JythonEditor面板键入、保存和运行脚本(宏)。值得注意的是,可以在两个面板中使用相同的命令,并且它们在Jython中都使用相同的名称空间,也就是说,可以从脚本中访问在Jython命令行中定义的变量,反之亦然。用户脚本必须存储在/dls/iXX/scripts中(其中XX是波束行号)。
有一组用于操作光束线的核心命令。这些被称为GDA“扩展语法”,因为要使用这些命令,您不必使用“正确的”Jython语法。要在使用这些命令时省去键入内容,您可以省略方括号和逗号。例如,不是键入::
>>> pos(myMotor,10)
您只需键入::
>>> pos myMotor 10
(尽管第一个版本仍然是要键入的有效命令)。这对于最常见的命令很方便。可以使用‘alias’命令使用您自己的命令以这种方式动态扩展语法。
通常使用扫描在光束线中收集数据。大多数扫描都是分步扫描,即移动电机,从探测器收集数据。移动电机、从探测器收集数据等。因此,要做到这一点,扫描包含两种类型的对象:检测器和“可扫描对象”。从概念上讲,可扫描对象的行为类似于马达,因为它们有一个位置,您可以移动它们,但它们可以代表从低级硬件到复杂计算的任何东西。扫描可以是嵌套的,不受维度数量的限制。
扫描收集的数据实时绘制到GDA客户端。扫描数据(也来自旧数据文件)保存在可以绘制或用于数学运算的数据对象中。
2.3. 代码完成¶
可以在命令行上使用代码完成功能。这可以使用以下任一方式触发 Ctrl-Space (类似于日食)或 tab (类似于bash/zsh等)。
如果只有一个选项,则会自动插入
>>> conti<TAB>
>>> continue
如果有多个选项,它们将出现在光标上方的弹出窗口中。键入将继续在过滤上显示选项和 tab 或 enter 将插入所选的一个。
注解
一 tab 如果光标位于行首,则仍将缩进代码
>>> |print 'helloWorld'
>>> |print 'helloWorld'
2.4. 主要Jython GDA命令的用法示例¶
列出所有可扫描对象::
>>> pos
帮助::
>>> help
列出所有设备::
>>> ls
列出所有可扫描设备(实现Scanable接口的设备)::
>>> ls Scannable
导入演示可扫描定义::
>>> import scannableClasses
>>> from scannableClasses import *
创建SimpleScanable的新实例::
>>> simple = SimpleScannable('simple', 0.0)
扫描 simple 从0到1,步长为0.01::
>>> scan simple 0.0 1.0 0.01
获取的当前位置 simple :
>位置简单
移动 simple 至0.5:
>位置简单0.5
删除现有对象::
>>> del simple
有关更详细的描述和更多示例,请参阅Jython培训手册。
2.4.1. 示例设备¶
用户脚本文件夹(‘documentation/users/scripts/scannableClasses.py’.中包含一个包含多个演示可扫描对象的Jython模块该文件可以在GDA客户端的Jython Editor视图中打开、查看和编辑。(如果此视图在启动时不可见,请从GDA的View菜单中选择‘JythonEditor’视图。)
新用户可以通过以下示例熟悉Jython终端。用户应该从GDA Jython脚本终端键入下面的Jython命令。每个命令都跟在Jython终端提示符‘>’之后。每个命令或命令集之前都有简短说明。
要将连续扫描叠加到以前的扫描上,应取消选中“创建新图形”和“清除旧图形”。
从演示“scannableClasses”模块导入所有类(如果上面还没有这样做):
>>> import scannableClasses
>>> from scannableClasses import *
这些课程中的大多数都提供了帮助:
>>> help ScannableGaussian
>>> help ScannableSine
创建ScanableGauss::的实例
>>> sg = ScannableGaussian('sg', 0.0)
以0.02::步长从-2到2扫描
>>> scan sg -2.0 2.0 0.02
将其中心更改为-1并重新扫描::
>>> sg.centre = -1
>>> scan sg -2.0 2.0 0.02
再次移动,添加一些噪波,然后重新扫描::
>>> sg.centre = 0.5
>>> sg.noise = 0.2
>>> scan sg -2.0 2.0 0.02
创建ScanableGauss的新实例,设置其其他可选属性的值,然后扫描它:
>>> sg2 = ScannableGaussian('sg2', 0.0, centre=0.75, width=1.54, height=2.0, noise=0.1)
>>> scan sg2 -2.0 2.0 0.02
创建ScanableSine类的实例并扫描它::
>>> ss = ScannableSine('ss', 0.0)
>>> scan ss -2.0 2.0 0.02
更改ss的周期和相位并重新扫描::
>>> ss.period = 0.2
>>> ss.phase = 1.0
>>> scan ss -2.0 2.0 0.02
更改正弦的幅值、相位和噪波,然后重新扫描:
>>> ss.magnitude = 2.0
>>> ss.phase = 0.5
>>> ss.noise = 0.2
>>> scan ss -2.0 2.0 0.02
还可以将多个扫描嵌套到任意级别。为了说明具有两个级别的嵌套扫描,即嵌套在外部扫描中的内部扫描,我们可以定义外部扫描来设置内部扫描的值。scannableClasses模块中的示例类ScanableGaussianWidth(在目录document/user/scripts中)采用现有的ScanableGaussianWidth实例,并将ScanableGaussianWidth设置为其自己的当前值。可以在用户定义的范围内以每个宽度扫描封闭的扫描高斯。
实例化新的内部可扫描高斯,然后实例化新的可扫描高斯宽度::
>>> sgi = ScannableGaussian('sgi', 0.0)
>>> sgw = ScannableGaussianWidth('sgw', sgi)
执行嵌套扫描::
>>> scan sgw 0.2 2.0 0.2 sgi -1.0 1.0 0.02
终端绘图窗口中的扫描结果如下所示:
2.4.2. 使用GDA中的绘图函数¶
除了终端视图中显示当前扫描的基本打印窗口外,GDA还具有一些用于以前记录的扫描的高级打印功能。这些都是为扫描后分析和可视化而设计的。
有关此类分析的所有信息均可在“Diamond Scisoft数据分析插件”的用户指南中找到。
2.5. 寻求帮助的资源¶
光束线手册,其中列出了如何使用该光束线上使用的特定面板和Jython对象。
有用的Jython网站:
GDA Jython解释器中的help命令。