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()
设置光学系统#
更改一些有关孔径大小的系统设置
[4]:
oss.SystemData.Aperture.ApertureValue = 10
添加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
创建一个用于观看目的的输入光束
[6]:
input_beam = oss.LDE.InsertNewSurfaceAt(1) # behind the object surface
input_beam.Thickness = 10
创建一个厚度为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
指定探测器表面
[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")
分析模型并显示结果#
通过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")
[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
计算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])