この記事では、PythonとMATLABを使用して、ZOS-APIの各分析で使用可能なデータ型(IAR型)のリストを生成する方法について説明します。
著者 Michael Cheng
Downloads
序論
ZOS-APIを使用してOpticStudioにアクセスする場合、スポット ダイアグラム、変調伝達関数 (MTF)、ポイント スプレッド関数 (PSF) などの分析を実行するのがよくあります。さまざまな分析がさまざまなタイプのデータを提供します。ZOS-APIは、次のデータ型をサポートしています。
通常、分析は1種類または2種類のデータ型のみを返します。たとえば、高速フーリエ変換 (FFT) MTF分析の結果はDataSeriesに返されます。分析FFT MTFからのDataGridの要求は、空のデータまたはNULLデータになります。すべての分析ウィンドウに結果が表示されるわけではありません。各分析にはデータ型が関連付けられていますが、対応するデータ型をテストして、データが含まれていることを確認してください。データを持たない分析の場合は、力まかせGetTextFileを使用してデータをディスクに保存し、データを手動で解析します。
テーブルを使用すると、分析に使用できるデータ型を簡単に確認できます。次の2つの例は、PythonとMATLABを使用してテーブルを生成する方法を示しています。両方のテーブルのソースコードは、この記事の「添付ファイル」セクションにあります。
Python の例
OpticStudioから定形テンプレートが生成されたら、「#Insert Code here」の行から開始します。次の一部のコードはコードの最初のブロックです。デフォルトでは、このコードはシーケンシャル解析をテストします。ノンシーケンシャル解析用のテーブルを生成するには、コードの2行目をコメント解除します。
# 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 = []
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タイプの場合、エラーメッセージが出力されます。これらの分析に関する情報を取得するには、上記のように、コードによってシステムを対応するモード (シーケンシャルまたはノンシーケンシャル) に変更する必要があります。
解析が有効なタイプ (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()
結果は次のようになります。
異なる値はタブで区切られているため、データを簡単にコピーしてMicrosoft 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;
次のコードブロックで、コードは変数analIDMに分析列挙ZOSAPI.Analysis.AnalysisIDMを保存し、「System.Enum.GetValues(analIDM.GetType)」を使用して値を取得します。
analIDM = ZOSAPI.Analysis.AnalysisIDM; analValue = System.Enum.GetValues(analIDM.GetType);
次の行は、データ タイプを出力します。LogicStrは、読みやすい出力にブール値を出力するために定義されています。MATLABでは、デフォルトでブール値を出力すると、出力はブール偽の場合は「0」、ブール真の場合は「1」になります。LogicStrを事前定義することにより、ブール値のtrueに対して「true」、ブール値のfalseに対して「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 シンタックス ヘルプの GetTextFile() を参照してください。
KA-01650
コメント
記事コメントは受け付けていません。