design

import matplotlib.pyplot as plt
import matplotlib.colors
from kgpy import vector, optics
import esis

Layout

ESIS is an array of slitless spectrographs, each with a different dispersion direction, but all fed from the same primary mirror.

Each slitless spectrograph is an off-axis gregorian telescope.

The layout of a single slitless spectrograph (known as a channel) is shown in the figure below. In this diagram, rays from the Sun enter on the left-hand side, reflect off the parabolic primary mirror on the right-hand side and are focused onto the field stop in the center of the diagram. After the field stop, the rays reflect off the grating on the left, and are refocused onto the detector on the bottom-right and dispersed according to their wavelength.

_, ax_top = plt.subplots(figsize=(9.5, 4), constrained_layout=True)
opt_top = esis.optics.design.final(field_samples=1, pupil_samples=3, all_channels=False)
opt_top.system.plot(
    ax=ax_top,
    components=(vector.iz, vector.ix),
    plot_vignetted=True,
)
_ = ax_top.set_title('Top View, Channel 0 only')
../_images/esis.optics.design_1_4.png
_, ax_side = plt.subplots(figsize=(6, 6), constrained_layout=True)
ax_side.invert_xaxis()
esis.optics.design.final().system.plot(
    ax=ax_side,
    plot_rays=False,
)
_ = ax_side.set_title('Front View')
ax_side.set_aspect('equal')
../_images/esis.optics.design_2_3.png

Ideal Point-spread Function

rays_psf = esis.optics.design.final(
    pupil_samples=101,
    field_samples=5,
    all_channels=False
).rays_output
bins = rays_psf.input_pupil_x.shape[~0] // 2

fig_630 = rays_psf.plot_pupil_hist2d_vs_field(wavlen_index=~0, norm=matplotlib.colors.PowerNorm(1/2), bins=bins, )
fig_630.set_figheight(4)
fig_630.set_figwidth(9.5)

fig_584 = rays_psf.plot_pupil_hist2d_vs_field(wavlen_index=0, norm=matplotlib.colors.PowerNorm(1/2), bins=bins, )
fig_584.set_figheight(4)
fig_584.set_figwidth(9.5)
../_images/esis.optics.design_3_1.png ../_images/esis.optics.design_3_2.png

Vignetting

rays = esis.optics.design.final(
    pupil_samples=21,
    field_samples=21,
    all_channels=False
).rays_output

vignetting_linear = rays.vignetting(polynomial_degree=1)
vignetting_linear.model().dataframe
$C_{ }$ $C_{\lambda }$ $C_{ x }$ $C_{ y }$
$V$ 77.593 $\mathrm{\%}$ 1.043e-05 $\mathrm{\frac{\%}{\mathring{A}}}$ -5.163e-02 $\mathrm{\frac{\%}{{}^{\prime\prime... 3.228e-17 $\mathrm{\frac{\%}{{}^{\prime\prime}}}$

Distortion

Functions

final([pupil_samples, field_samples, …])

Final ESIS optical design prepared by Charles Kankelborg and Hans Courrier.

final_from_poletto([pupil_samples, …])

Try to reproduce the final ESIS design using infrastructure developed from Thomas and Poletto (2004) :type pupil_samples: int :param pupil_samples: Number of rays across the pupil in each axis.