本稿では、生産性を向上させ ZOS-API の機能を最大限に活用するための有用な MATLAB の有用なコツとヒントについて書かれています。
著者 Alastair Humphrey
Downloads
Introduction
OpticStudio にはユーザーが、異なるスクリプト環境と通信や操作をすることができるようにするために、アプリケーション プログラミング インターフェイス (API) が存在します。API によってユーザーは OpticStudio の開かれたインスタンス (インタラクティブ 拡張機能) かバック グラウンドで動作する OpticStudio (スタンドアロン アプリケーション) と通信できます。 これは繰り返し計算を行う場合、またはユーザーが OpticStudio によって生成されたデータを操作する場合に特に役立ちます。この記事では、 MATLAB と組み合わせた ZOS-API についてのみを説明し、特定のヒントとコツを紹介します。
インテリセンス
MATLAB では、コードの補完 (左図) かメンバーのリスト化 (右図) をする際にインテリセンスを使うことができます。
これは、タイプ ミスやその他のよくある間違いを減らすことで、コーディング プロセスの速度を上げるのに特に役立ちます。ただし、 MATLAB スクリプトが完了すると、変数内にあるものにアクセスすることはできません。例えば OpticStudio をインストールすると付属するサンプル ファイル 「Example01: New File and QuickFocus」 を確認のために実行してみましょう。すると、 TheLDE にアクセスしたい場合でも、 MATLAB スクリプトが既に終了している場合、 「No completions found.」 というメッセージが表示されます。
この問題を回避するには、 MATLAB スクリプトを実行する際に、ブレイクポイントを挿入してスクリプトの終了を停止する必要があります。これは、スタンドアロン アプリケーションを使用する場合、またはインタラクティブ拡張機能の MATLABZOSConnection スクリプト内にコードを配置した場合に適用されます。ブレイクポイントを挿入するには MATLAB 内でエディタ タブ→ブレイクポイント グループ→ブレイクポイント アイコン→設定/消去で設定可能です。
MATLAB ではブレイクポイントは行番号の隣の赤い丸で表されます。今回の場合 44 行目にブレイクポイントが挿入されたことを示しています。
ピリオド (.) の後に Tab キーを押すことにより、 MATLAB のスクリプト エディタまたはコマンド ウィンドウでインテリセンスを使用できます。
あるいは、 OpticStudio 内に生成されたインタラクション 拡張機能の MATLABZOSConnection スクリプト内にコードを配置する代わりに、コードを別のスクリプトに配置し、 MATLABZOSConnection スクリプトへのパスを追加して、 TheApplication を同じ MATLABZOSConnection として定義することができます。この場合、コネクション ナンバーは 21です。以下に使用可能なコードの例は以下の様になります。
addpath('\\zmefs01\redirectedfolders\alastair.humphrey\Documents\Zemax\ZOS-API Projects\MATLABZOSConnection21\')
TheApplication = MATLABZOSConnection21;
上記のいずれかの方法で、 API コマンドを OpticStudio でテストでき、コマンドの結果をリアルタイムで観察できます。同様に、コマンド ウィンドウは有用なでバッキング ツールとしても使用することができます。なぜなら、メインの関数はどちらの場合も終了していないため、ワークスペース内のオブジェクトをクリックすることで、宣言されたオブジェクトを調査できるのです。
.NET のメソッドを‘出力用’ パラメータで使う方法
以下は、 GetIndex で‘出力用’ パラメータを使用して .NET のメソッドを使用する例です
MATLAB で‘出力用’ パラメータを持つ .NET メソッドを使用する場合、メソッドの出力先のオブジェクトが正しいタイプであることを確認する必要があります。この場合、長さが波長の数に等しい2次元配列が必要です。次のコードは、3つの波長のそれぞれの面 2 のインデックスが返される例です。
surf_num = 2;
num_waves = 3; % probably shouldn't hard code this
index = NET.createArray('System.Double', 3);
TheApplication.PrimarySystem.LDE.GetIndex(surf_num, num_waves, index);
index_data = index.double;
MATLAB の関数メソッドとメソッドビュー
MATLAB の関数メソッドとメソッドビューはクラス メソッドの名前を確認するのに使うことができます。例えば以下の様にコードを書くと、
MySag=TheApplication.PrimarySystem.Analyses.New_Analysis(ZOSAPI.Analysis.AnalysisIDM.SurfaceSag);
methods(MySag)
以下の様にメソッドビューに表示されます。
MATLAB での列挙の読み込み
OpticStudioでは時に、ループでデータを読み込んで MATLAB での列挙の中身としたい、と思うこともあります。例えば偶数次非球面の係数を読み込んで MATLAB に渡したいといったケースです。
偶数次非球面のサグ量は以下の様に与えられます。
ここでは、偶数次非球面のサンプル ファイルの 「{Zemax}\Samples\Sequential\Objectives\Even Asphere.zmx」 を例として、係数を読み込んでみます。
データを MATLAB に読み込む方法の 1 つは、 eval 関数を使用して列挙をループすることです。
TheSystem = TheApplication.PrimarySystem;
TheLDE = TheSystem.LDE;
for no_coeff=1:8
EA_coeff(no_coeff) = eval(['TheLDE.GetSurfaceAt(2).GetSurfaceCell(ZOSAPI.Editors.LDE.SurfaceColumn.Par' num2str(no_coeff) ').DoubleValue']);
end
MATLAB でのパフォーマンス タイミング 関数
MATLAB には、コードまたはコードの一部の実行にかかる時間を見積もる便利な時間関数があります。これ等の関数は ZOS-API を使った時の最適化や公差解析を行う時間をチェックする時に便利です。
- 1番目の方法としては、関数を複数回実行し、実行にかかった時間の中央値を返す timeit 関数を使用することです。
- 2番目の方法は、特定の関数の実行時間の統計を返す profile 関数を使用することです。
- または、ストップウォッチ タイマー機能を使用できます。ストップウォッチ タイマー機能について説明しますと、 tic 関数でストップウォッチを開始し、 toc 関数でストップウォッチを停止します。
以下のコードはサンプル コード 「{Zemax}\ZOS-API Sample Code\MATLAB\MATLABStandalone_15_Seq_Optimization.m」 から抜き出しました。
tic
TheMFE = TheSystem.MFE;
OptWizard = TheMFE.SEQOptimizationWizard;
%Optimize for smallest RMS Spot, which is "Data" = 1
OptWizard.Data = 1;
OptWizard.OverallWeight = 1;
%Gaussian Quadrature with 3 rings (refers to index number = 2)
OptWizard.Ring = 2;
%Set air & glass boundaries
OptWizard.IsGlassUsed = true;
OptWizard.GlassMin = 3.0;
OptWizard.GlassMax = 15.0;
OptWizard.GlassEdge = 3.0;
OptWizard.IsAirUsed = true;
OptWizard.AirMin = 0.5;
OptWizard.AirMax = 1000.0;
OptWizard.AirEdge = 0.5;
%And click OK!
OptWizard.Apply();
toc
tic;
LocalOpt = TheSystem.Tools.OpenLocalOptimization();
if ~isempty(LocalOpt)
LocalOpt.Algorithm = ZOSAPI.Tools.Optimization.OptimizationAlgorithm.DampedLeastSquares;
LocalOpt.Cycles = ZOSAPI.Tools.Optimization.OptimizationCycles.Automatic;
LocalOpt.NumberOfCores = 8;
fprintf('Local Optimization...\n');
fprintf('Initial Merit Function %6.3f\n', LocalOpt.InitialMeritFunction);
LocalOpt.RunAndWaitForCompletion();
fprintf('Final Merit Function %6.3f\n', LocalOpt.CurrentMeritFunction);
LocalOpt.Close();
end
% Get the elapsed time as a TimeSpan value.
toc;
結果は例えば以下の様になります。
Local Optimization...
Initial Merit Function 0.363
Final Merit Function 0.170
Elapsed time is 1.765178 seconds.
MATLAB ライブ エディタ
MATLAB ライブ エディタは、コードと並行して出力を表示できるライブス クリプトを作成できる優れたツールです。さらに、テキスト、方程式、画像、ハイパーリンクを追加できます。 MATLAB ライブ エディタの詳細については、 こちらをご覧ください。
以下は、 Cooke のトリプレット レンズの波面収差マップと FFT MTF を OpticStudio で取得して、 MATLAB の図としてプロットした例です。この例で使用される MLX ファイル (MATLAB ライブス クリプト ファイル形式)は、この記事の添付ファイルです。
MATLAB ライブ エディタの便利な機能はコードのセクションを作成し、それらを独立して実行できる、セクション ブレイクという機能です。
たとえば、Cooke のトリプレット レンズについて、各面で主光線の AOI を計算するコードの部分を選択し、 「セクション ブレイク」 アイコンをクリックできます。 ‘各面で主光線の AOI を確認’ セクション (セクションの周りに青いボックスが表示されます) をクリックし、‘セクションの実行’ アイコンをクリックすると、コードのそのセクションを個別に評価できます。
KA-01835
コメント
記事コメントは受け付けていません。