グリッドサグDATファイルをプログラムで書き込む方法

この記事では、OpticStudioで必要とされる形式で‌グリッドサグDATファイルを生成するためのMathematicaMatlabコードについて説明します。この形式は、グリッドサグ面で使用されるものと同じです。コードはOpticStudioへの接続必要ありません。

Authored By Alexandra Culler & Erin Elliott

Downloads

記事の添付ファイル

はじめに

DATファイルには、シーケンシャルモードの‌グリッドサグ面とグリッド位相面の定義面の特性があります。OpticStudioDATファイルからデータを適切に読み込むには、ナレッジベースの記事グリッドサグ面の使用方法で説明されている形式に従ってください。

手動でDATファイルに情報を入力することは、特に高精度面に通常必要とされる大規模ファイルの場合は、面倒で時間を要する可能性があります。DATファイルの生成には、MatlabMathematicaなどの外部プログラムを使用することが望ましいです。

この記事では、OpticStudioで使用するDATファイルを生成するために使用できるコードを説明します。

データセットの定義と仮定

このデモンストレーションでは、以下に示すように、標準的なサグ方程式のみに基づいてサグプロファイルを生成します:

この方程式については、ヘルプシステムファイルの[設定] (Setup) タブ... [エディタ] (Editors) [グループ] (Group)[設定] (Setup) タブ)... [レンズデータエディタ] (Lens Data Editor)... [シーケンシャル面] (Sequential Surfaces)(レンズデータエディタ)... [標準面] (Standard)を参照してください。

サグプロファイルは、この記事に添付されている添付ファイル「Simple_Singlet_Original.zar」の面1に基づいています。次のような特性があります:

  Radius Thickness Material Coating Clear Semi-Diameter Chip Zone Mech Semi-Diameter Conic
Surface 1 59.74 12.00 N-BK7   12.62 0 12.62 0


「曲率半径」の逆数を取ると、サグ方程式の曲率cを求めることができます。次に、円錐コーニック定数を代入して、次のようになります:

ここで、xyは、0からエッジまでクリア半径で定義されたように、面全体の座標を直交座標で表したものです。

DAT ファイルの定義

グリッドサグ面の使用方法やヘルプシステムで説明したように、DATファイルでは、点間の間隔に加えて、使用する点の数を指定する必要があります。これらの値は一般に任意となっています。このデモンストレーションでは、ピクセル数をOpticStudioのデフォルト解像度の1つに合わせます:513x513.

さらに、レンズは12.62mmのクリア半径(CSD)を指定していることがわかっています。 いずれかの方向に必要なポイント点数(513)とレンズの最大半径座標(12.62)がわかっているため、ポイント間に必要な間隔を計算できます。

目標は、上記の面情報を使用し、DATファイルの特性を定義して、「Simple_singlet_original.zar」の面1のサグプロファイルに正確に一致させることです。このプロファイルは、以下に示すように、[解析] (Analyze)[] (Surface)[サグ] (Sag)解析ツールで現在指定されているものと一致します:

まず、サグデータを表す2D配列を作成します。このデータは、指定されたxおよびyの値におけるサグ関数のZ値を表しています。

次に、データは平坦化され、DATファイルに1行ずつ書き込むことができます。

これらの関数をMathematicaMatlabで実行します。両方のコードは添付されています。結果として得られるDATファイルは、2つのプログラムで同一になります。

MathematicaでのデータおよびDATファイルの生成

データ生成

上記の説明に基づいて、以下の定義を設定します:

 

radiusOfCurvature = 59.74;

curvature = 1/radiusOfCurvature;

conic = 0;

semiDiameter = 12.62;

resolution = 513;

pointSpacing = (2*semiDiameter)/(resolution-1);

 

これらの値を使用してサグ方程式を形成することができます。これは上記で定義したものと一致します:

 

sagFunction[x_, y_] = (curvature * (x^2 + y^2)) / (1 + ((1 + conic) * (curvature)^2 * (x^2 + y^2))^1/2

 

この関数では、xy可変にして513x513ポイントの2D配列を生成します。xy距離は0.04929です。配列にデータをロードするには、以下を使用します:

 

sagData = Table[sagFunction[x,y],{x,-semiDiameter,semiDiameter,pointSpacing},{y,-semiDiameter,semiDiameter,pointSpacing}];

 

ファイルの作成に進む前に、ArrayPlot 関数を使用して、結果のデータマトリックスが期待どおりの分布を持つかを確認することができます:

 

 

ArrayPlot 関数を使用して、プロファイルがOpticStudio[解析] (Analyze)[] (Surface)[サグ] (Sag)ツールと同様に動作することを確認します。  特に、プロットのエッジに不整合やその他の顕著なアーチファクトがないかチェックしています。

DATファイルへの書き込み

前述のように、データをファイルに書き込む前に、データを平坦化します。これにより、一度に1つの配列値を抽出し、DATファイルの「Z」値として新しい行に書き込むことができます。

Mathematicaで配列を平坦化するには、以下の行を使用します:

 

sagDataFlat = Flatten[sagData];

 

平坦化された配列sagDataFlatを取得したら、同じ名前のDATファイルに書き込むことができます:「sagDataFlat.dat{Zemax}\Objects\Grid Filesフォルダに保存するように設定します。Mathematicaが適切なフォルダを見つけるには、NETLinkモジュールを使用します。これにより、ZemaxのレジストリにあるZemaxデータフォルダの場所を確認することができます。これは、ZOS-APIのボイラープレートコードにある手順と似ています。これは、次のような行程で実現できます:

Needs["NETLink`"]

LoadNETType["Microsoft.Win32.Registry"];

zemaxData = Registry`GetValue["HKEY_CURRENT_USER\\Software\\Zemax", "ZemaxRoot", -1];

parentPath=FileNameJoin[{zemaxData, "\\Objects"}];

gridPath = FileNameJoin[{parentPath, "\\Grid Files"}];

 

グリッドファイルフォルダが見つかったら、DATファイルを次の一連の手順で書き込み、配置できます:

filename = FileNameJoin[{gridPath, "\\sagDataFlat.dat"}];

gridsagfile = CreateFile[filename];

line = StringTemplate["`a` `a` `b` `b` 0 0 0"][<|"a" -> resolution, "b" -> pointSpacing|>];

WriteLine[gridsagfile, line];

Do[

  templine = ToString[NumberForm[sagDataFlat[[i]], Infinity, ExponentFunction -> (Null &)]] <> " 0 0 0 0";

  WriteLine[gridsagfile, templine];

  , {i, 1, Dimensions[sagDataFlat][[1]]}];

Close[filename];

コードブロックは、次のように分解できます:

コード

スニペット

目的 出力
filename 生成するDATファイルの名前(パスを含む) <path>\Zemax\Objects\Grid Files\sagDataFlat.dat
gridsagfile 新規ファイルを作成するコマンドと同様に設定されます。この空のファイルには次の行が入力されます。 Blank DAT file
line

StringTemplateコマンドを使用して、適切なレイアウトでデータをファイルに書き込むことができます。最初の行にDATファイルで必要なヘッダー形式に従うように指示しています。 

変数Aは解像度に等しくなります。変数bは点間隔に等しくなります。 

 

Do loop

データの平坦化された配列を反復処理します。「templine」コマンドでは現在の反復計算の配列値を保存してから4つのゼロが続きます

「templine」で与えられた値は、「WriteLine」コマンドで「gridsagfile」に書き込まれます。

上記のコードがを実行すると、{Zemax}\Objects\Grid FilesフォルダにDATファイルが作成されます。DATファイルはすぐにOpticStudioにインポートできます。 

MatlabでのデータおよびDATファイルの生成

データ生成

サグ生成を開始するために必要な変数を指定します。これらには、半径定数、曲率定数、コーニック定数が含まれます。また、解像度の変数も指定します:

% Initial surface 1 information

SemiDiameter = 12.62;

Radius = 59.74;

Curvature = 1/Radius;

Conic = 0;

 

% Intended resolution (npix) and point spacing (dx)

npix = 513;

dx = 2*SemiDiameter / (npix-1);

これらの変数を使用して、サグデータを格納するためのマトリックスの構築を開始できます。開始するには、「空白」513x513マトリックスを生成します:

sagMatrix = zeros(npix);

この行列にxyの正しい値を入力するには、さらに2つの追加配列を生成する必要があります。これらの配列の寸法は1x513で,-12.62 12.62の範囲のxyの等間隔の値が入力されます:

xvals = linspace(-SemiDiameter,SemiDiameter,npix);

yvals = linspace(-SemiDiameter,SemiDiameter,npix);

適切なマトリックスを作成したら、ループを作成してサグデータを生成することができます。このループでは、xvals配列とyvals配列の値を使用して、上記の標準サグ方程式で与えられるサグデータでsagMatrixを埋めます。

フルループは以下のとおりです:

for col = 1:length(sagMatrix)

    for row = 1:length(sagMatrix)

        sagMatrix(col, row) = Curvature*(xvals(col)^2 + yvals(row)^2)/(1+(sqrt(1-(1+Conic)*(Curvature^2)*(xvals(col)^2 + yvals(row)^2))));

    end

end

つまり,z(x, y)はsagMatrix(xvals(col), yvals(row))に変換されます。

この時点で、513x513マトリックスにサグ値が入力されています。このマトリックスは探しているプロファイルをグラフィカルにエミュレートしていることを確認できます。

これにより、プロファイルがOpticStudio[解析] (Analyze)[] (Surface)[サグ] (Sag)ツールと同様に動作することを確認します。特に、プロットのエッジに不整合やその他の顕著なアーチファクトがないかチェックしています。

プロファイルが探しているものと一致することを確認したら、マトリックスを1次元配列に平坦化できます。これにより、ループを使用してDATファイルに値を簡単にプルできます。 

Surf1DatClean = sagMatrix(:);

これで、DATファイルの「z」値を取得できる平坦なデータ配列が作成されました。DATファイルの生成を開始するには、まず{Zemax}\Objects\Grid Filesフォルダへのパスを作成します。これはZOS-APIと同様の方法で行うことができます:Windows Registry内のZemax {DATA} フォルダを探します。パスが見つかったら、パスを追加して適切なフォルダを指定することができます。フルパス名は「gridDir」で与えられます:

zemaxData = winqueryreg('HKEY_CURRENT_USER', 'Software\Zemax', 'ZemaxRoot');

gridDir = '\Objects\Grid Files\';

適切なパス名を定義したら、DATファイル「sagData.dat」に次のコードを書き込むことができます:

filename1 = fullfile(zemaxData, gridDir, 'sagData.dat');

fileID = fopen(filename1, 'wt');

fprintf(fileID, '%d %d %1.10g %1.10g %1.f %1.f %1.f', npix, npix, dx, dx, 0, 0, 0);

fprintf(fileID, '\n');

for i = 1:size(Surf1DatClean-1)

    fprintf(fileID, '%0.20g %d %d %d %d\n', Surf1DatClean(i), 0, 0, 0, 0);

end

fclose(fileID);

上記のコードは、次のように分解できます:

コード

スニペット

目的 出力
filename1 生成するDATファイルの名前(パスを含む) <path>\Zemax\Objects\Grid Files\sagData.dat
fileID 書き込み権限を持つ新しいファイルを作成するコマンドと等しく設定されます。次の行は空のファイルに入力されます。 Blank file
Line 3 - fprintf DATファイルの1行目に必要なフォーマットと一致するファイルのフォーマットを指定します。その後、最初の行の値が出力されます。1行目は、npixdxを使用して、後続のデータの解像度と点間隔を定義します。 
for loop データの平坦化された配列を反復処理します。最初の値はsag("z")の値に対応します。各行は、完了する前に4つのゼロを追加します。 

標準面の置き換え

DATファイルは{Zemax}\Objects\Grid Filesフォルダ内にあり、OpticStudioで使用できるようになります。ファイル Simple_Singlet_Original.zar」の面1を直接置き換えるには、面タイプを「Grid Sag」に変換し、曲率半径の値を「Infinity に変更します。また、コーニックの値が「0(ゼロ)」に設定されていることを確認します。

次に、Surface 1 PropertiesImportに移動します。新しく生成されたDATファイルは、Grid Filesフォルダにあるため、ドロップダウンメニューに表示されます。DATファイルを面にインポートします。必要に応じて、変換手順の詳細についてはグリッドサグ面の使用方法を参照してください。 

インポートしたら,[解析] (Analyze) [] (Surface)[サグ] (Sag)[面のサグ] (Surface Sag) プロットを開きます。プロットは、どちらのプログラムでも生成された画像とほぼ一致する必要があります。結果として得られるシステムパフォーマンスはほぼ同じでなければなりません。そうでない場合は、DATファイルの解像度を上げて調整してください。

1の代わりにグリッドサグ面をフィーチャーしたファイルを Simple_Singlet_GridSag.zar」として添付されます。

KA-01848

この記事は役に立ちましたか?
5人中4人がこの記事が役に立ったと言っています

コメント

0件のコメント

記事コメントは受け付けていません。