Source code for esis.flights.f2.optics._instruments._instruments
import astropy.units as u
import optika
import esis
__all__ = [
"design_proposed",
]
[docs]
def design_proposed(
grid: None | optika.vectors.ObjectVectorArray = None,
axis_channel: str = "channel",
num_distribution: int = 11,
) -> esis.optics.Instrument:
"""
Load the proposed optical design for ESIS 2.
Parameters
----------
grid
sampling of wavelength, field, and pupil positions that will be used to
characterize the optical system.
axis_channel
The name of the logical axis corresponding to changing camera channel.
num_distribution
number of Monte Carlo samples to draw when computing uncertainties
Examples
--------
Plot the rays traveling through the optical system, as viewed from the front.
.. jupyter-execute::
import numpy as np
import matplotlib.pyplot as plt
import astropy.units as u
import astropy.visualization
import named_arrays as na
import optika
import esis
grid = optika.vectors.ObjectVectorArray(
wavelength=na.linspace(-1, 1, axis="wavelength", num=2, centers=True),
field=0.99 * na.Cartesian2dVectorLinearSpace(
start=-1,
stop=1,
axis=na.Cartesian2dVectorArray("field_x", "field_y"),
num=5,
),
pupil=na.Cartesian2dVectorLinearSpace(
start=-1,
stop=1,
axis=na.Cartesian2dVectorArray("pupil_x", "pupil_y"),
num=5,
),
)
instrument = esis.flights.f2.optics.design_proposed(
grid=grid,
num_distribution=0,
)
with astropy.visualization.quantity_support():
fig, ax = plt.subplots(
figsize=(6, 6.5),
constrained_layout=True
)
ax.set_aspect("equal")
instrument.system.plot(
components=("x", "y"),
color="black",
kwargs_rays=dict(
color=na.ScalarArray(
ndarray=np.array(["tab:orange", "tab:blue"]),
axes="wavelength",
),
label=instrument.system.grid_input.wavelength.astype(int),
),
);
handles, labels = ax.get_legend_handles_labels()
labels = dict(zip(labels, handles))
fig.legend(labels.values(), labels.keys());
"""
result = esis.flights.f1.optics.design_full(
grid=grid,
axis_channel=axis_channel,
num_distribution=num_distribution,
)
c0 = 1 / (2700 / u.mm)
c1 = -2.852e-5 * (u.um / u.mm)
c2 = -2.112e-7 * (u.um / u.mm**2)
result.grating.rulings.spacing.coefficients[0].nominal = c0
result.grating.rulings.spacing.coefficients[1].nominal = c1
result.grating.rulings.spacing.coefficients[2].nominal = c2
result.grating.yaw = -3.65 * u.deg
z_filter = result.grating.translation.z.nominal + 1291.012 * u.mm
dz = z_filter - result.filter.translation.z
result.filter.translation.z += dz
result.camera.sensor.translation.z += dz
return result