8. 作图

8.1. ScanFileHolder类

这里要详细介绍的第一个类是ScanFileHolder。此类充当单个扫描的存储,其背后的思想是可以加载多个扫描,然后根据需要进行检查或比较。这里显示的基本功能都可以合并到脚本中,或者按原样在jython终端中使用。这里显示的所有示例都是在Jython终端中使用的,并且基于对模拟或真实组件执行的一些扫描。

8.1.1. 加载和可视化文件的基本介绍

GDA的数据分析和可视化工具包的设计目的是使在光束线上收集的所有数据的可视化和操作快速而有效。本文档将集中介绍演示和示例,因此将GDA的工作副本附加到DLS网络会很有用。让我们从一个如何加载扫描文件和可视化数据的简单示例开始。首先,下面的脚本是加载上一次扫描并可视化某些数据的示例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
>>> data = ScanFileHolder()
>>> data.loadSRS()
>>> data.info()
Trying to open /home/ssg37927/gda/gda-7.4/users/data/70.dat
ScanFileContainer object containing 41 lines of data per DataSet.
0        SampleYaw
1        detect1
2        detect1
3        time
4        I0
5        It
6        If
7        TEY
8        PEY
9        FY
10       Drain
>>> data.plot(0,1)

这将在GDA的“Data Vector”(数据矢量)选项卡中显示以下内容:

_images/DA_Plot01.png

请记住,您可以取消“data Vector”选项卡的停靠,并将其放在最容易看到的任何位置,例如在另一个屏幕上或Jython终端旁边。

逐行浏览脚本:

01

创建将保存我们要操作和可视化的所有数据的对象。

02

该命令告诉数据对象加载由GDA创建的最后一个SRS数据文件。根据需要,这可以扩展到各种不同的方面。如果给定正整数(#),则从当前工作目录加载该名称的SRS数据文件(#.dat)。如果给出了一个负整数,则加载之前执行过多次的扫描,例如loadSRS(-2)将在当前扫描之前加载执行2次的扫描。如果给定了特定SRS文件的完整路径和文件名,则将加载该文件。

03

此命令显示对象内部数据的轮廓。这样可以轻松识别文件以及绘图命令和其他命令的方向

04-16

这是前一个命令的输出,显示了有关从文件中读入的内容的信息。

17

此命令将数据从对象打印到数据矢量面板

8.1.2. 绘图示例

分析和可视化工具包中可用的功能之一是能够快速查看从GDA中收集的数据。在前面的示例中,我们看到了一组收集的数据与另一组数据的简单绘图,但还有其他功能可用。以下脚本使用各种不同形式的打印命令。它还使用另一个版本的“loadSRS”命令。但是,这只适用于已记录在当前目录中的扫描,如果数据目录自扫描以来已更改,则不起作用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
>>> data = ScanFileHolder()
>>> data.loadSRS(-13)
>>> data.info()
ScanFileContainer object containing 101 lines of data per DataSet.
0    SampleYaw
1   detect1
2    detect1
3    time
4    I0
5    It
6   If
7    TEY
8    PEY
9   FY
10   Drain
11   Channel_0
12   Channel_1
13   Channel_2
14   Channel_3
15   Channel_4
16   Channel_5
17   Channel_6
18   Channel_7
>>> data.plot(0,1)
>>> data.plot("SampleYaw",11)
>>> data.plot("SampleYaw",[11,"Channel_3",1])

应提供以下输出:

_images/DA_Plot02.png
_images/DA_Plot03.png
_images/DA_Plot04.png
01

创建将保存我们要操作和可视化的所有数据的对象。

02

加载了13次扫描前拍摄的扫描。

03

此命令显示对象内部数据的轮廓。这样可以轻松识别文件以及绘图命令和其他命令的方向

04-23

这是前一个命令的输出,显示了有关从文件中读入的内容的信息。

24

这个简单的PLOT命令将代码第05行中突出显示的数据与代码第06行中的数据进行对比。这些位置用数字0和1标记,与文件中的三个位置相对应。第一个值是x轴,第二个值是要绘制的Y轴。

25

此Plot命令使用表示数据的数字或数据名称来绘制信息。

26

在此图中,列表用作y轴,从图中可以看到,所有y轴都绘制在图上。这也表明,数字和名字可以在列表中自由混合,使得访问特定数据相对容易。

8.1.3. 检索数据

下一节将介绍有关在数据以数据集的形式进行操作后对其进行操作的大量信息。ScanFileHolder本质上是许多不同数据集的容器,可以通过几种方式将它们拿出来更仔细地查看。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
>>> data = ScanFileHolder()
>>> data.loadSRS(-31)
>>> data.info()
ScanFileContainer object containing 21 lines of data per DataSet.
0    SampleYaw
1    detect1
2    time
3    I0
4    It
5    If
6    TEY
7    PEY
8    FY
9    Drain
10   Channel_0
11   Channel_1
12   Channel_2
13   Channel_3
14   Channel_4
15   Channel_5
16   Channel_6
17   Channel_7
>>> dataset1 = data.getAxis("detect1")
>>> dataset1.disp()
DataVector Dimentions are [21]
[-5.5897e-02, 2.4862e-02, 2.9554e-01, 2.7648e-01, ...
>>> dataset1 = data.getAxis(10)
>>> dataset1.disp()
DataVector Dimentions are [21]
[1.9380e+01, 1.4850e+01, 2.1220e+01, 2.9110e+01, ...
>>> dataset1 = data[11]
>>> dataset1.disp()
DataVector Dimentions are [21]
[2.2580e+01, 1.4330e+01, 2.4240e+01, 3.1930e+01, ...
01

创建将保存我们要操作和可视化的所有数据的对象。

02

加载了31次扫描前拍摄的扫描。

03

此命令显示对象内部数据的轮廓。此信息将在此处用于帮助从对象中获取特定数据

04-22

这是前一个命令的输出,显示了有关从文件中读入的内容的信息。

23

此命令根据与标题“Detect1”相关联的ScanFileHolder中的信息创建数据集

24

此命令显示新数据集中的信息,包括其大小和其中包含的数据。

25-26 disp()命令的输出

27

此命令根据与位置10关联的ScanFileHolder中的信息创建一个数据集。这表示“Channel_0”,如第15行所示

28

再次使用disp()命令,显示数据集中现在保存的不同数据。

29-30

disp()命令的输出

31

此命令使用数据集的Pytainer方面来允许非常快速地访问ScanFileHolder。

32

再次使用disp()命令,显示数据集中现在保存的不同数据。

33-34

disp()命令的输出

8.1.4. 完整的方法列表

此处提供的表格完整详细地提供了ScanFileHolder类的主要函数

class ScanFileHolder
getAxis(int n)

返回与输入数字对应的数据集。

getAxis(String name)

返回与标题中的输入字符串对应的数据集。

getImage()

如果图像已加载到ScanFileHolder中,则返回包含图像数据的数据集的副本。 已弃用

getPilatusConversionLocation()

返回Pilatus转换软件的位置

setPilatusConversionLocation(String path)

设置Pilatus转换软件的位置

getPixel(int x, int y)

返回(x,y)处的像素的双精度值

info()

将ScanFileHolder的描述打印到Jython终端

loadPilatusData(String path)

加载输入中指定的Pilatus tif,这需要是完整的文件名规范。

loadSRS(int scan_no)

如果该数字为正数,则这是将从当前目录加载的SRS数据文件的编号。如果数字为负,则找到当前文件编号,并从中删除输入编号,然后加载该SRS文件。例如,如果当前扫描编号为12,并且输入了-4,则将加载“8.dat”。

loadSRS()

加载要执行的上次扫描的数据

loadSRS(String path)

加载到由输入中的文件名指定的SRS数据文件中

ls()

向Jython终端显示ScanFileHolder中的所有数据名称

plot()

这会将图像绘制到GUI中的“Data Vector”选项卡

plot(int axis)

打印从多个源指定的轴。如果输入是字符串,则这是要打印的轴的名称。如果输入是数字,则这是要打印的轴的编号。如果输入是数据集,则绘制该数据集。

plot(int xaxis, int yaxis)

,但是yAxis也可以接受上面指定的任何类型的参数列表

setImage(DataSet)

将输入数据集复制到对象中的图像数据集中。 已弃用

setImag(int height, int width, double[] Data)

从输入变量生成数据集,然后将其复制到对象中的图像数据集中。 已弃用

8.2. 数据集类

DataSet类是这里介绍的所有拟合和可视化体系结构的核心。它是一个N维的消耗性容器,可以用许多不同的方式进行操作和可视化。正如在ScanFileHolders一节中看到的那样,这些对象的内部是数据集。在本节中,我们将详细介绍数据集的一些用法,包括操作和直接绘图。

8.2.1. 数据集的初始使用

数据集是GDA中处理数据集的主要方式。操作数据集数据有许多不同的方法。下面的脚本演示了其中的几种方法,并演示了如何从ScanFileHolder中获取数据集。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
>>> data = ScanFileHolder()
>>> data.loadSRS(1)
>>> data.info()
ScanFileHolder object containing 26 lines of data per DataSet.
0    SampleYaw
1    detect1
2    detect2
>>> dataset1 = data[1]
>>> Plotter.plot("Data Vector",data[0],dataset1)
>>> dataset1.max()
1.0630006379056933
>>> dataset1.min()
-0.9609246487585549
>>> dataset1 -= dataset1.min()
>>> dataset1 /= dataset1.max()
>>> dataset1.max()
1.0
>>> dataset1.min()
0.0
>>> Plotter.plot("Data Vector",data[0],dataset1)

这里的想法是将0和1之间的数据归一化,然后绘制出来。这应该会产生如下所示的图形输出。

_images/DA_Plot05.png
_images/DA_Plot06.png
01

创建将保存我们要操作和可视化的所有数据的对象。

02

加载标识符为“1.dat”的扫描。

03

此命令显示对象内部数据的轮廓。

04-07

这是前一个命令的输出,显示了有关从文件中读入的内容的信息。

08

此命令根据ScanFileHolder中与ScanFileHolder中的位置1相关联的信息创建数据集。在本例中,这是“Detect1”收集的数据

09

此命令使用由.lot()命令中的ScanFileHolder类包装的核心函数将信息绘制到绘图窗口。第一个条目是要进行绘制的面板的名称,第二个条目是包含x轴信息的数据集,在本例中使用以前使用的集合Jython方法直接从ScanFileHolder收集,即数据 [0] 。第三个值是y轴,同样,它可以是数据集,也可以是数据集列表。

10-11

它使用数据集的各种数据挖掘函数之一,它返回数据集中的最大元素值。

12-13

此命令返回数据集的最小元素值。

14

该行使用数据集a-=b运算符,它的作用等同于a=a-b。在本例中,我们从数据集的每个元素中减去数据集的最小值。

15

此行获取数据集,并将每个元素除以数据集的最大值。

16-19

运行前面的命令检查最大值现在是1.0,最小值现在是0.0。

20

重新绘制数据,以显示它现在位于0.0和1.0之间,并且仍然与以前的配置文件相同。

8.2.2. 数据集和统计分析的组合

有时,查看两个扫描或同一扫描中的两个探测器之间的差异或相似之处非常有用。下面的脚本突出显示了两个不同信号之间的噪声,并对该差异进行了统计评估。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
>>> data = ScanFileHolder()
>>> data.loadSRS(1)
>>> data.info()
ScanFileHolder object containing 26 lines of data per DataSet.
0 SampleYaw
1 detect1
2 detect2
>>> dataset1 = data[1]
>>> dataset2 = data[2]
>>> Plotter.plot("Data Vector", data[0], [dataset1, dataset2])
>>> dataset3 = dataset1-dataset2
>>> Plotter.plot("Data Vector", data[0], [dataset1, dataset2, dataset3])
>>> dataset3.mean()
0.0067027887342955145
>>> dataset3.rms()
0.06266747949694666
>>> dataset3.skew()
0.5610499636907474
>>> dataset3.kurtosis()
-0.5355342349265815

此脚本查看在同一扫描中扫描的两个探测器之间的差异。这将绘制出数据以确保它是正确的,然后将差异可视化。

_images/DA_Plot07.png
_images/DA_Plot08.png
01

创建将保存我们要操作和可视化的所有数据的对象。

02

加载标识符为“1.dat”的扫描。

03-07

此命令显示对象内部数据的轮廓。

08-09

这些命令从ScanFileHolder获取与“Detect1”和“Detect2”检测器相对应的信息。

10

该命令根据ScanFileHolders“SampleYaw”绘制两个数据集,因为这提供了一个很好的x刻度。请注意,在作为第三个参数给出的列表中,这两个轴都包含2个y轴。

11

此命令生成第三个数据集,该数据集是逐个元素从数据集2中减去数据集1的结果。

12

绘制旧数据和新数据集,新数据集是一个探测器与另一个探测器的偏差。

13-20

这些行对数据集中的数据执行一些统计分析,例如平均值、均方根值、偏斜度和峰度。

8.2.3. 数据集完整方法列表

表6.7.ScanFileHolder方法清单 方法输入输出说明构造函数DataSet创建作为输入构造函数Double给定的数据集的副本 []生成包含作为输入构造函数int提供的数据的1D数据集[] 生成具有输入数组长度的维度和输入数组值的每维大小的数据集。例如,数据集(2,3,4)将创建第一维大小为2,第二维大小为3,第三维大小为4的3D数据集。构造函数int w,int h,Double []DATA生成一个新的2D数据集,高度为h,宽度为w,并用数据填充。这是沿宽度填充最快的。构造函数int w,int h,int d,Double[] 数据生成一个新的3D数据集,高度为h,宽度为w,深度为d,并用数据填充。这是沿宽度填充最快的。然后沿着高度。构造函数JAMA Matrix创建一个2D数据集,该数据集具有与输入JAMA矩阵相同的数据和比例,abs DataSet返回新数据集中每个元素的绝对值,而新数据集中返回的是质心Double返回数据集的质心值,这实际上是沿数据集的点,这是所有值的质心。chiSquared DataSet Double此函数逐个元素将数据集元素与输入数据集进行比较。然后将它们之间的差值平方并求和,这就是返回的值。Cos数据集返回数据集中每个值的余弦,因为新数据集sin数据集返回数据集中每个值的正弦,因为新数据集exp数据集返回数据集中每个值的指数,因为新数据集ln数据集返回数据集中每个值的自然对数,因为新数据集log10数据集返回数据集中每个值的对数底10,因为新数据集幂倍数据集返回数据集中的每个值并且适当缩放的对数范数数据集返回新的数据集,其中所有值的自然对数归一化到0和1之间,并且适当缩放的对数范数数据集返回新的数据集,其中所有值的对数底10被归一化到0和1之间,并且适当缩放的max Double返回数据集的最大值。maxPos int返回数据集最大值的位置。MIN DOUBLE返回数据集的最小值。minPos int返回数据集的最小值的位置。Mean Double返回数据集的平均值。RMS DOUBLE返回数据集的均方根值。Skew Double返回数据集的偏斜。Kurtosis Double返回数据集的峰度。Diff DataSet计算数据集的差异,并将其作为新数据集返回。这就假设所有的点相距为1.0。diff int n DataSet计算数据集的差分,并将其作为新数据集返回。这就假设所有的点相距为1.0。n是每个边的点数,这些点数被视为降低噪波的平均值。Diff DataSet DataSet计算数据集的差异,并将其作为新数据集返回。输入数据集是计算的x坐标。diff DataSet,int n DataSet计算数据集的差分,并将其作为新数据集返回。输入数据集是计算的x坐标。n是每个边的点数,这些点数被视为降低噪波的平均值。disp将数据集内容显示到jython终端doubleArray double []以单个双精度数组doubleMatrix DoubleMatrix Double的形式返回数据集中的所有数据[] []如果数据集是2D的,则以双精度数组数组的形式返回数据get牙买加Matrix Double[] []如果数据集是2D的,则以JAMA Matrix GET INT的形式返回数据[] DOUBLE返回输入指定位置的数据。设置双精度值,int []DOUBLE用输入值在输入指定的位置设置数据。getDimensions int[] 以整数数组的形式返回数据集的维数和大小

8.3. 峰值拟合

8.3.1. 基本峰拟合

以下脚本演示了分析工具包中的基本峰值拟合例程。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
>>>data = ScanFileHolder()
>>>data.loadSRS(1)
>>>data.plot(0,1)
>>>output = Fitter.plot(data[0],data[1]+1,GradientDescent(0.0001),[Gaussian(0.0,10.0,10.0,10.0),Gaussian(0.0,10.0,10.0,10.0)])
>>>print output.disp()
7.883976029749007(0.0,10.0)
2.9464538192926537(0.0,10.0)
6.4733892793832455(-10.0,10.0)
1.56093364851906(0.0,10.0)
2.936788227366031(0.0,10.0)
6.420297623699959(-10.0,10.0)
>>>output[1].getValue()
2.9464538192926537
>>>output[1].getUpperLimit()
10.0
>>>output[1].getLowerLimit()
0.0

下面显示的图像是基础数据,然后是拟合数据。绿线表示通过函数的最佳拟合线,其他线表示组成拟合的各个函数。在绘图的底部有一条参照线,以及一些详细信息,显示拟合距离数据有多远。这样可以快速直观地表示配合中的错误。

_images/DA_fit01.png
_images/DA_fit02.png
01

创建将保存我们要操作和可视化的所有数据的对象。

02

加载标识符为“1.dat”的扫描。

03

绘制我们要根据其匹配数据的信息。

04

这是执行配件的命令,它由几个部分组成。这将返回一组值,这些值表示解决方案中的每个自由参数,在本例中,这些值被放入对象输出中。第一个参数是拟合的x数据,第二个参数是相应的y数据。将在x值指定的每个点评估拟合,因此如果存在密集数据区域,则在拟合过程进行时将对其进行更多采样。第三个条目是将用于进程的优化器。不同的优化器如下所示。最后一个条目是将要安装的功能列表。所有这些加在一起就产生了最终的函数。

05-11

此命令和关联的输出显示拟合中所有变量参数的拟合后的值。每个参数依次显示,后面跟着它可以落入的边界。它们的顺序与FIT列表中的项目在第04行中添加的顺序相同。在本例中,行06到08是第一个高斯,行09-11是第二个。后面的表中显示了参数顺序的含义,该表描述了不同的线路功能。

12-17

这些命令显示了如何从对象获取各个数据片段,以便在其他区域使用。

8.3.2. 拟合方法

表6.9.可用的装配方法 蒙特卡洛方法说明此方法使用蒙特卡罗方法来解决问题。创建时输入的值当前是抽象的,数值越小越准确,数值越大越快。对于这一点来说,0.001是一个很好的起点。梯度下降此方法使用梯度下降方法来优化问题。求出构形空间的微分,并沿一定的步长找到方向。如果步长的距离导致目标函数增加(负结果),则减小距离,直到获得正结果。当获得正结果的步进距离减小到小于参数值时,搜索结束。GeneticAlg此方法使用差分进化遗传算法来执行搜索。这将创建一组代理,每个代理都在配置空间中执行搜索,试图找到好的解决方案。这是一种稍微慢一些的方法,但在较难的解决方案上执行得更好。此处输入的值是停止标准。当所有智能体的目标函数平均值小于最小智能体目标函数计算的此值时,则停止搜索。

8.3.3. 拟合函数

表6.10可用的配套功能 函数参数函数参数输出立方体Mina,Maxa,minB,maxB,Minc,Maxc,Mind,MAXDy=Ax^3+Bx^2+Cx+D A,B,C,D高斯最小位置,MaxPosition,FWHM,Area Position,FWHM,Area Lorentzian MinPosition,MaxPosition,maxFWHM,maxArea position,FWHM,Area Offset Mina,Maxa y=A PseudoVoigt minPos