本文将介绍如何使用Python和MATLAB生成ZOS-API中各个分析的可用数据类型(IAR类型)列表。
作者 Michael Cheng
附件下载
文章附件
引言
当使用ZOS-API访问OpticStudio时,通常会运行诸如点列图(Spot Diagram) 、调制传递函数(Modulation Transfer Function , MTF)或点扩散函数(Point Spread Function , PSF)之类的分析。不同的分析会生成不同类型的数据。ZOS-API支持以下数据类型:
通常,一种分析只返回一到两种数据类型。例如,快速傅里叶变换(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()
结果如下所示:
不同的值由制表符分隔,因此可以轻松地将数据复制并粘贴到EXCEL电子表格中。
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
结果如下所示
不同的值由制表符分隔,因此可以将它们复制并粘贴到Excel电子表格中。如下所示:
有关如何获取数据类型中没有值的分析的数据,请参考ZOS-API语法帮助 ( ZOS-API Syntax Help ) 中的 GetTextFile() 方法。