生成ZOS-API中各个分析的输出数据类型列表

本文将介绍如何使用Python和MATLAB生成ZOS-API中各个分析的可用数据类型(IAR类型)列表。

作者 Michael Cheng

附件下载

 文章附件

引言

当使用ZOS-API访问OpticStudio时,通常会运行诸如点列图(Spot Diagram) 、调制传递函数(Modulation Transfer Function , MTF)点扩散函数(Point Spread Function , PSF)之类的分析。不同的分析会生成不同类型的数据。ZOS-API支持以下数据类型:

Analyses Results data types (IAR)

通常,一种分析只返回一到两种数据类型。例如,快速傅里叶变换(Fast Fourier Transform,FFT)MTF分析的结果以数据集(DataSeries)格式返回。若要求FFT MTF分析返回数据网格(DataGrid)格式,将导致结果为空。并不是所有的分析窗口都会产生结果。尽管每种分析都有相关的数据类型,但是也要测试相应的数据类型以确保其包含数据。对于没有数据的分析,使用简单直接的GetTextFile将数据保存到磁盘,然后手动解析数据。
可以使用表格轻易地查看可供分析使用的数据类型。如下两个示例演示如何使用Python和MATLAB生成表格。这两个表格的源代码在本文的“示例文件”部分提供。

Python 示例

从OpticStudio生成模板代码之后,从“ # Insert Code here ”开始,下面的代码片段是第一个代码块。默认情况下,这段代码是用来测试序列分析。若要生成用于非序列分析的表格,请取消对第二行代码的注释。

# Insert Code here

TheSystem = zosapi.TheSystem

# Uncomment following line for non-sequential analyses

# TheSystem.MakeNonSequential()

TheAnalyses = TheSystem.Analyses

在下一部分代码中,所有枚举名称都是使用 “ constants. dicts__[0].keys() ” 检索的 (“ constants ”包含ZOS-API使用的所有枚举)。然后使用for循环检查所有枚举,以找到包含“ AnalysisIDM_”的枚举。当找到匹配的枚举时,代码段使用 “ constants. dicts__[0].get(i) ”查找其值,并记录在 “ analIDM ” 列表中。最后,代码段对analIDM列表进行排序,以便于用户使用。

analIDM = []

API_enum = list(constants.__dicts__[0].keys())

for i in API_enum:    

if i.find('AnalysisIDM_') != -1:        

analIDM.append(constants.__dicts__[0].get(i))        

print(constants.__dicts__[0].get(i), ':  ', i)

analIDM.sort()

如下代码可打印输出数据类型名称。

print('Name\tSetting\tDatGrid\tDatGridRgb\tDatSrs\tDatSrsRgb\t' + 'DatScat\tDatScatRgb\tRayData\tCriRayDat\tPathAnal\tSpotDat')

analIDM 列表包含了所有的分析。在下一个代码片段中,使用for循环打开所有使用“ TheAnalyses.New_Analysis(k) ” 的可用分析。
如果分析是空 ( None ) 类型,则打印输出一条错误消息。为了获得关于这些分析的信息,代码应该将系统更改为对应模式(序列或非序列)。
如果分析是有效类型(而不是类型),如下代码片段将测试并报告每种数据类型的可用性。

for k in analIDM:    

a = TheAnalyses.New_Analysis(k)    

if a is None :        

print('This analysis cannot be opened in ',               

'Sequential Mode' if TheSystem.Mode == 0 else 'Non-Sequential Mode',               

': enumID ',k)        

continue

    ar = a.GetResults()

    print(a.GetAnalysisName, '\t',

           a.HasAnalysisSpecificSettings, '\t',

           ar.DataGrids is not None and ar.NumberOfDataGrids > 0, '\t',

           ar.DataGridsRgb is not None and ar.NumberOfDataGridsRgb > 0, '\t',

           ar.DataSeries is not None and ar.NumberOfDataSeries > 0, '\t',

           ar.DataSeriesRgb is not None and ar.NumberOfDataSeriesRgb > 0, '\t',

           ar.DataScatterPoints is not None and ar.NumberOfDataScatterPoints > 0, '\t',

           ar.DataScatterPointsRgb is not None and ar.NumberOfDataScatterPoints > 0, '\t',

           ar.RayData is not None, '\t',

           ar.CriticalRayData is not None, '\t',

           ar.PathAnalysisData is not None, '\t',

           ar.SpotData is not None)    

a.Close()

结果如下所示:

Availability of each data type

不同的值由制表符分隔,因此可以轻松地将数据复制并粘贴到EXCEL电子表格中。

Excel spreadsheet

MATLAB 示例

首先,在OpticStudio中生成模板代码,然后在 “ % Add your custom code here…” 后面添加自定义代码。如下的代码片段是第一个代码块。默认情况下,这段代码测试序列分析。要生成非序列分析表格,则要取消注释 “ TheSystem.MakeNonSequential() ” 行。

% Add your custom code here...

% Uncomment following line for non-sequential analyses

% TheSystem.MakeNonSequential()

TheAnalyses = TheSystem.Analyses;

在下一个代码块中,代码片段将分析枚举 ZOSAPI.Analysis.AnalysisIDM 保存在变量 analIDM 中,然后使用 “ System.Enum.GetValues(analIDM. gettype) ” 获取值。

analIDM = ZOSAPI.Analysis.AnalysisIDM; analValue = System.Enum.GetValues(analIDM.GetType);

下一行打印数据类型名称。LogicStr用于在输出中打印易于读取的布尔值。在MATLAB中打印输出布尔值,默认情况下,布尔值错误时的输出为 “0” ,布尔值正确时的输出为 “1” 。通过预先定义LogicStr,可以在布尔值正确时打印输出 “true” ,布尔值错误时打印输出 “false”。

print('Name\tSetting\tDatGrid\tDatGridRgb\tDatSrs\tDatSrsRgb\t' + 'DatScat\tDatScatRgb\tRayData\tCriRayDat\tPathAnal\tSpotDat')

列表analIDM包含了所有的分析。在下一个代码块中,将for循环用于 “TheAnalyses.New_Analysis(analValue(idx))”,打开所有可用的分析。如果返回的分析对象不是空的,则该代码段将测试并报告每种数据类型的可用性。如果返回的分析对象为空,则代码将打印输出一条报错信息。为了获得关于这些分析的信息,代码片段将系统更改为相应的模式(序列或非序列)。

for idx = 1:analValue.Length    

a = TheAnalyses.New_Analysis(analValue(idx));    

if not(isempty(a))

        ar = a.GetResults();

        fprintf('%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n',...

            char(a.GetAnalysisName),...

            LogicalStr{(a.HasAnalysisSpecificSettings > 0) + 1},...

            LogicalStr{(ar.NumberOfDataGrids > 0) + 1},...

            LogicalStr{(ar.NumberOfDataGridsRgb > 0) + 1},...

            LogicalStr{(ar.NumberOfDataSeries > 0) + 1},...

            LogicalStr{(ar.NumberOfDataSeriesRgb > 0) + 1},...

            LogicalStr{(ar.NumberOfDataScatterPoints > 0) + 1},...

            LogicalStr{(ar.NumberOfDataScatterPointsRgb > 0) + 1},...

            LogicalStr{(ar.NumberOfRayData > 0) + 1},...

            LogicalStr{(~isempty(ar.CriticalRayData)) + 1},...

            LogicalStr{(~isempty(ar.PathAnalysisData)) + 1},...

            LogicalStr{(~isempty(ar.SpotData)) + 1});

        a.Close()

    else

        fprintf('This analysis cannot be opened in %s. Mode. enumID: %s\n', char(TheSystem.Mode), char(analValue(idx)));

    end

end

结果如下所示Matlab data availability

不同的值由制表符分隔,因此可以将它们复制并粘贴到Excel电子表格中。如下所示:

Matlab to Excel Spreadsheet

有关如何获取数据类型中没有值的分析的数据,请参考ZOS-API语法帮助 ( ZOS-API Syntax Help ) 中的 GetTextFile() 方法。

KA-01650

这篇文章有帮助吗?
0 人中有 0 人觉得有帮助

评论

0 条评论

文章评论已关闭。