multilayer_fit#

esis.flights.f1.optics.gratings.materials.multilayer_fit()#

A multilayer coating determined by modifying multilayer_witness_fit() to have a glass substrate with the appropriate roughness.

Examples

Plot the theoretical reflectivity of this multilayer stack vs. the theoretical reflectivity of multilayer_witness_fit().

import numpy as np
import matplotlib.pyplot as plt
import astropy.units as u
import named_arrays as na
import optika
from esis.flights.f1.optics import gratings

# Define a grid of wavelength samples
wavelength = na.geomspace(100, 1000, axis="wavelength", num=1001) * u.AA

# Define a grid of incidence angles
angle = 4 * u.deg

# Define the light rays incident on the multilayer stack
rays = optika.rays.RayVectorArray(
    wavelength=wavelength,
    direction=na.Cartesian3dVectorArray(
        x=np.sin(angle),
        y=0,
        z=np.cos(angle),
    ),
)

# Initialize the multilayer stacks
multilayer_witness_fit = gratings.materials.multilayer_witness_fit()
multilayer_fit = gratings.materials.multilayer_fit()

# Define the vector normal to the multilayer stack
normal = na.Cartesian3dVectorArray(0, 0, -1)

# Compute the reflectivity of the multilayer for the given incident rays
reflectivity_witness = multilayer_witness_fit.efficiency(rays, normal)
reflectivity_fit = multilayer_fit.efficiency(rays, normal)

# Plot the reflectivities as a function of wavelength
fig, ax = plt.subplots(constrained_layout=True)
na.plt.plot(
    wavelength,
    reflectivity_witness,
    ax=ax,
    axis="wavelength",
    label="witness fit",
);
na.plt.plot(
    wavelength,
    reflectivity_fit,
    ax=ax,
    axis="wavelength",
    label="grating fit",
);
ax.set_xlabel(f"wavelength ({wavelength.unit:latex_inline})");
ax.set_ylabel("reflectivity");
ax.legend();
../_images/esis.flights.f1.optics.gratings.materials.multilayer_fit_0_1.png

Plot the reflectivity of this multilayer stack as a function of incidence angle.

import numpy as np
import matplotlib.pyplot as plt
import astropy.units as u
import named_arrays as na
import optika
from esis.flights.f1.optics import gratings

# Define a grid of wavelength samples
wavelength = na.geomspace(100, 1000, axis="wavelength", num=1001) * u.AA

# Define a grid of incidence angles
angle = na.linspace(0, 20, axis="angle", num=3) * u.deg

# Define the light rays incident on the multilayer stack
rays = optika.rays.RayVectorArray(
    wavelength=wavelength,
    direction=na.Cartesian3dVectorArray(
        x=np.sin(angle),
        y=0,
        z=np.cos(angle),
    ),
)

# Initialize the multilayer stack
multilayer = gratings.materials.multilayer_fit()

# Compute the reflectivity of the multilayer for the given incident rays
reflectivity = multilayer.efficiency(
    rays=rays,
    normal=na.Cartesian3dVectorArray(0, 0, -1),
)

# Plot the reflectivity of the multilayer as a function of wavelength
fig, ax = plt.subplots(constrained_layout=True)
na.plt.plot(
    wavelength,
    reflectivity,
    ax=ax,
    axis="wavelength",
    label=angle,
);
ax.set_xlabel(f"wavelength ({wavelength.unit:latex_inline})");
ax.set_ylabel("reflectivity");
ax.legend();
../_images/esis.flights.f1.optics.gratings.materials.multilayer_fit_1_0.png
Return type:

MultilayerMirror