This page was generated from a Jupyter notebook. Check the source code or download the notebook..

简单的厚镜头#

此示例显示了如何创建和分析论文中所述的简单厚镜头 ZOSPy:通过Opticstudio在Python中进行光线追迹。 该代码类似于本文的示例,只是增加了对分析结果的绘图。

包括功能#

  • 序列模式:

  • 构建一个简单的序列光学系统。

  • 使用zospy.analyses.mtf.fft_through_focus_mtf通过Focus MTF计算FFT。

  • 使用zospy.analyses.psf.huygens_psf()执行Huygens PSF分析。

保修和责任#

提供了示例“原样”。没有保证,也不能从中获得权利,如此存储库的一般许可。

此示例要求将其连接到Opticstudio的扩展模式。还要在运行此示例之前确保ZOSPy处于序列模式。

导入依赖项#

[1]:
from warnings import warn

import matplotlib.pyplot as plt

import zospy as zp

设置连接#

启动与Opticstudio的连接

[ ]:
zos = zp.ZOS()
oss = zos.connect("extension")

获取主系统并确保它是一个新的空系统

[ ]:
oss.new()

设置光学系统#

  1. 更改一些有关孔径大小的系统设置

[4]:
oss.SystemData.Aperture.ApertureValue = 10
  1. 添加Schott Glass目录,如果尚未使用

[5]:
if "SCHOTT" not in oss.SystemData.MaterialCatalogs.GetCatalogsInUse():
    oss.SystemData.MaterialCatalogs.AddCatalog("SCHOTT")

print(
    "Catalogs currently in use:",
    " ".join(oss.SystemData.MaterialCatalogs.GetCatalogsInUse()),
)
Catalogs currently in use: SCHOTT
  1. 创建一个用于观看目的的输入光束

[6]:
input_beam = oss.LDE.InsertNewSurfaceAt(1)  # behind the object surface
input_beam.Thickness = 10
  1. 创建一个厚度为10mm,曲率半径为30mm,材质为BK10的透镜

[7]:
front_surface = oss.LDE.GetSurfaceAt(2)
front_surface.Radius = 30
front_surface.Thickness = 10
front_surface.SemiDiameter = 15
front_surface.Material = "BK10"

back_surface = oss.LDE.InsertNewSurfaceAt(3)
back_surface.Radius = -30
back_surface.Thickness = 29
back_surface.SemiDiameter = 15
  1. 指定探测器表面

[8]:
image_surface = oss.LDE.GetSurfaceAt(4)
image_surface.SemiDiameter = 5

渲染模型#

[ ]:
draw3d = zp.analyses.systemviewers.Viewer3D(
    surface_line_thickness="Thick",
    rays_line_thickness="Thick",
    number_of_rays=7,
    hide_x_bars=True,
).run(oss, oncomplete="Release")

if zos.version < (24, 1, 0):
    warn(
        "Exporting the 3D viewer data is not available for this version of OpticStudio."
    )
else:
    plt.imshow(draw3d.data)
    plt.axis("off")
../../_images/examples_%E7%AE%80%E5%8D%95%E7%9A%84%E5%8E%9A%E9%80%8F%E9%95%9C_Simple_thick_lens_21_0.png

分析模型并显示结果#

  1. 通过Focus MTF 计算 FFT并绘制它

[ ]:
mtf = zp.analyses.mtf.FFTThroughFocusMTF(
    sampling="512x512", delta_focus=2.5, frequency=3, number_of_steps=51
).run(oss, oncomplete="Sustain")
[11]:
df = mtf.data[0].data

fig = plt.figure(figsize=(2, 1.5))
ax = fig.add_subplot(111)
ax.plot(df.index, df.Tangential)
ax.set_xlabel("Focus shift (mm)")
_ = ax.set_ylabel("Modulus of the OTF")
../../_images/examples_%E7%AE%80%E5%8D%95%E7%9A%84%E5%8E%9A%E9%80%8F%E9%95%9C_Simple_thick_lens_25_0.png
[12]:
mtf.data[0].data
[12]:
Tangential Sagittal
Focal Shift
-2.500000 0.103930 0.103930
-2.483278 0.122375 0.122375
-2.466555 0.140851 0.140851
-2.449833 0.159388 0.159388
-2.433110 0.178017 0.178017
... ... ...
2.433110 0.023551 0.023551
2.449833 0.023792 0.023792
2.466555 0.024007 0.024007
2.483278 0.024204 0.024204
2.500000 0.024392 0.024392

300 rows × 2 columns

  1. 计算Huygens PSF并绘制它

[ ]:
huygens_psf = zp.analyses.psf.HuygensPSF(
    pupil_sampling="512x512", image_sampling="512x512", normalize=True
).run(oss)
[14]:
fig = plt.figure(figsize=(2, 1.5))
ax = fig.add_subplot(111)
im = ax.imshow(
    huygens_psf.data,
    cmap="turbo",
    extent=[
        huygens_psf.data.columns.values.min(),
        huygens_psf.data.columns.values.max(),
        huygens_psf.data.index.values.min(),
        huygens_psf.data.index.values.max(),
    ],
)
plt.colorbar(im, label="Huygens PSF")
ax.set_xlabel("x (μm)")
ax.set_ylabel("y (μm)")
ax.set_xticks([-20, 0, 20])
_ = ax.set_yticks([-20, 0, 20])
../../_images/examples_%E7%AE%80%E5%8D%95%E7%9A%84%E5%8E%9A%E9%80%8F%E9%95%9C_Simple_thick_lens_29_0.png