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环境中使用的一些基本概念将在本指南的后面部分详细列出:

  1. 在GDA客户端中,可以在JythonTerminal面板中键入Jython命令,该面板提供类似终端的提示,或者可以从JythonEditor面板键入、保存和运行脚本(宏)。值得注意的是,可以在两个面板中使用相同的命令,并且它们在Jython中都使用相同的名称空间,也就是说,可以从脚本中访问在Jython命令行中定义的变量,反之亦然。用户脚本必须存储在/dls/iXX/scripts中(其中XX是波束行号)。

  2. 有一组用于操作光束线的核心命令。这些被称为GDA“扩展语法”,因为要使用这些命令,您不必使用“正确的”Jython语法。要在使用这些命令时省去键入内容,您可以省略方括号和逗号。例如,不是键入::

    >>> pos(myMotor,10)
    

    您只需键入::

    >>> pos myMotor 10
    

    (尽管第一个版本仍然是要键入的有效命令)。这对于最常见的命令很方便。可以使用‘alias’命令使用您自己的命令以这种方式动态扩展语法。

  3. 通常使用扫描在光束线中收集数据。大多数扫描都是分步扫描,即移动电机,从探测器收集数据。移动电机、从探测器收集数据等。因此,要做到这一点,扫描包含两种类型的对象:检测器和“可扫描对象”。从概念上讲,可扫描对象的行为类似于马达,因为它们有一个位置,您可以移动它们,但它们可以代表从低级硬件到复杂计算的任何东西。扫描可以是嵌套的,不受维度数量的限制。

  4. 扫描收集的数据实时绘制到GDA客户端。扫描数据(也来自旧数据文件)保存在可以绘制或用于数学运算的数据对象中。

2.3. 代码完成

可以在命令行上使用代码完成功能。这可以使用以下任一方式触发 Ctrl-Space (类似于日食)或 tab (类似于bash/zsh等)。

如果只有一个选项,则会自动插入

>>> conti<TAB>
>>> continue

如果有多个选项,它们将出现在光标上方的弹出窗口中。键入将继续在过滤上显示选项和 tabenter 将插入所选的一个。

注解

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
_images/intro1.png

将其中心更改为-1并重新扫描::

>>> sg.centre = -1
>>> scan sg -2.0 2.0 0.02
_images/intro2.png

再次移动,添加一些噪波,然后重新扫描::

>>> sg.centre = 0.5
>>> sg.noise = 0.2
>>> scan sg -2.0 2.0 0.02
_images/intro3.png

创建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
_images/intro4.png

创建ScanableSine类的实例并扫描它::

>>> ss = ScannableSine('ss', 0.0)
>>> scan ss -2.0 2.0 0.02
_images/intro5.png

更改ss的周期和相位并重新扫描::

>>> ss.period = 0.2
>>> ss.phase = 1.0
>>> scan ss -2.0 2.0 0.02
_images/intro6.png

更改正弦的幅值、相位和噪波,然后重新扫描:

>>> ss.magnitude = 2.0
>>> ss.phase = 0.5
>>> ss.noise = 0.2
>>> scan ss -2.0 2.0 0.02
_images/intro7.png

还可以将多个扫描嵌套到任意级别。为了说明具有两个级别的嵌套扫描,即嵌套在外部扫描中的内部扫描,我们可以定义外部扫描来设置内部扫描的值。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

终端绘图窗口中的扫描结果如下所示:

_images/intro8.png

2.4.2. 使用GDA中的绘图函数

除了终端视图中显示当前扫描的基本打印窗口外,GDA还具有一些用于以前记录的扫描的高级打印功能。这些都是为扫描后分析和可视化而设计的。

有关此类分析的所有信息均可在“Diamond Scisoft数据分析插件”的用户指南中找到。

2.5. 寻求帮助的资源

  • 光束线手册,其中列出了如何使用该光束线上使用的特定面板和Jython对象。

  • 有用的Jython网站:

  • GDA Jython解释器中的help命令。