12. Example of masks

12.1. Creating an instance

[1]:
%load_ext autoreload
%autoreload 2
[2]:
from diffractio import np
from diffractio import degrees, mm, um
from diffractio.scalar_masks_X import Scalar_mask_X
from diffractio.scalar_masks_XZ import Scalar_mask_XZ


13. Definite masks

13.1. semi plane

[3]:
x0 = np.linspace(-400 * um, 400 * um, 256)
z0 = np.linspace(-100 * um, 100 * um, 512)
wavelength = 0.5 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)
t1.semi_plane(
    r0=(0 * um, 0 * um), refractive_index=2, angle=0 * degrees, rotation_point=None
)
t1.draw_refractive_index()
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_5_0.png

13.2. layer

[4]:
x0 = np.linspace(-200 * um, 200 * um, 256)
z0 = np.linspace(-100 * um, 100 * um, 512)
wavelength = 0.5 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)
t1.layer(
    r0=(50 * um, 0 * um),
    depth=75 * um,
    refractive_index=2,
    angle=0 * degrees,
    rotation_point=None,
)
t1.draw_refractive_index()
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_7_0.png

13.3. square

[5]:
x0 = np.linspace(-100 * um, 100 * um, 256)
z0 = np.linspace(0 * um, 200 * um, 512)
wavelength = 0.6238 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)
t1.square(
    r0=(0 * um, 100 * um),
    size=(150 * um, 50 * um),
    angle=0 * degrees,
    refractive_index=1.5,
)
t1.draw_refractive_index()
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_9_0.png

13.4. slit

[6]:
x0 = np.linspace(-100 * um, 100 * um, 256)
z0 = np.linspace(0 * um, 250 * um, 512)
wavelength = 0.6238 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)

t1.slit(
    r0=(0 * um, 50 * um),
    aperture=50 * um,
    depth=20 * um,
    refractive_index=1.5 + 1j,
    refractive_index_center="",
    angle=0 * degrees,
)

t1.draw_refractive_index()
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_11_0.png

13.5. sphere or ellipsoid

[7]:
x0 = np.linspace(-100 * um, 100 * um, 256)
z0 = np.linspace(0 * um, 200 * um, 512)
wavelength = 0.6238 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)

t1.cylinder(
    r0=(0, 100 * um), radius=(75 * um, 75 * um), refractive_index=1.5, angle=0 * degrees
)

t1.draw_refractive_index(scale="scaled")
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_13_0.png

13.6. semi sphere

[8]:
x0 = np.linspace(-120 * um, 120 * um, 256)
z0 = np.linspace(-20 * um, 200 * um, 512)
wavelength = 0.5 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)
t1.semi_cylinder(
    r0=(0 * um, 0 * um), radius=100 * um, refractive_index=2, angle=0 * degrees
)

t1.draw_refractive_index(draw_borders=True, min_incr=0.01, scale="scaled")
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_15_0.png

13.7. wedge

[9]:
x0 = np.linspace(-20 * um, 60 * um, 256)
z0 = np.linspace(0 * um, 125 * um, 512)
wavelength = 0.6238 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)

t1.wedge(
    r0=(0 * um, 0 * um),
    length=100 * um,
    refractive_index=1.5,
    angle_wedge=22.5 * degrees,
    angle=0 * degrees,
    rotation_point=None,
)
t1.draw_refractive_index(scale="scaled")
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_17_0.png

13.8. prism

[10]:
x0 = np.linspace(-150 * um, 150 * um, 256)
z0 = np.linspace(0 * um, 500 * um, 512)
wavelength = 2 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)
t1.prism(
    r0=(100 * um, 150 * um),
    length=200 * um,
    refractive_index=2,
    angle_prism=60 * degrees,
    angle=90 * degrees,
)
t1.draw_refractive_index(scale="scaled")
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_19_0.png

13.9. biprism

[11]:
x0 = np.linspace(-120 * um, 120 * um, 256)
z0 = np.linspace(-25 * um, 400 * um, 512)
wavelength = 0.5 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)
t1.biprism(
    r0=(0, 20 * um), length=200 * um, height=50 * um, refractive_index=1.5, angle=0
)
t1.draw_refractive_index(draw_borders=True, scale="scaled")
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_21_0.png

13.10. Ronchi grating

[12]:
x0 = np.linspace(-500 * um, 500 * um, 256)
z0 = np.linspace(0 * um, 1400 * um, 512)
wavelength = 0.5 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)

t1.ronchi_grating(
    period=50 * um,
    fill_factor=0.5,
    length=500 * um,
    height=20 * um,
    r0=(0 * um, 100 * um),
    Dx=2 * um,
    refractive_index=1.5 + 0.5j,
    heigth_substrate=25 * um,
    refractive_index_substrate=1.5,
    angle=0 * degrees,
)

t1.draw_refractive_index(scale="scaled")
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_23_0.png

13.11. grating with substrate

[13]:
x0 = np.linspace(-500 * um, 500 * um, 256)
z0 = np.linspace(0 * um, 400 * um, 512)
wavelength = 0.55 * um

t0 = Scalar_mask_X(x=x0, wavelength=wavelength)
t0.slit(x0=0, size=0 * um)

t1 = Scalar_mask_X(x=x0, wavelength=wavelength)
t1.ronchi_grating(period=20 * um, x0=0 * um, fill_factor=0.5)

t2 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength, n_background=1)

t2.extrude_mask(t=t0, z0=10 * um, z1=50 * um, refractive_index=1.5)
t2.extrude_mask(t=t1, z0=50 * um, z1=55.5 * um, refractive_index=1.5)

t2.draw_refractive_index(draw_borders=False)
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_25_0.png

13.12. sine grating

[14]:
x0 = np.linspace(-250 * um, 250 * um, 256)
z0 = np.linspace(0 * um, 1000 * um, 512)
wavelength = 0.6238 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)

t1.sine_grating(
    period=20 * um,
    heigth_sine=10 * um,
    heigth_substrate=100 * um,
    r0=(0 * um, 100 * um),
    length=500 * um,
    Dx=2 * um,
    refractive_index=1.5,
    angle=0 * degrees,
)

t1.draw_refractive_index()
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_27_0.png

13.13. probe

[15]:
x0 = np.linspace(-12 * um, 12 * um, 256)
z0 = np.linspace(0 * um, 500 * um, 512)
wavelength = 0.6 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)
t1.probe(
    r0=(0, 50 * um),
    base=5 * um,
    length=300 * um,
    refractive_index=1.5,
    angle=0 * degrees,
)

t1.draw_refractive_index()
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_29_0.png

13.14. Aspheric lens

[16]:
x0 = np.linspace(-500 * um, 500 * um, 512)
z0 = np.linspace(-0.1 * mm, 1.25 * mm, 512)
wavelength = 5 * um

lens = Scalar_mask_XZ(x0, z0, wavelength, n_background=1, info="")
focal, ipasa = lens.aspheric_lens(
    r0=(0 * um, 0 * um),
    angle=(0 * degrees, (0 * um, 0 * um)),
    refractive_index=1.5,
    cx=(1 / (1 * mm), -1 / (0.5 * mm)),
    Qx=(0, 0),
    a2=(0, 1e-11),
    a3=(0, 0),
    a4=(0, 0),
    thickness=0.4 * mm,
    size=0.8 * mm,
)

lens.slit(r0=(0, 100 * um), aperture=800 * um, depth=75 * um, refractive_index=1 + 2j)

print("Theoretical image focal distance f' = {:2.2f} mm".format(focal/mm))

lens.draw_refractive_index(
    draw_borders=True, min_incr=0.01, colorbar_kind="vertical", scale='scaled'
)
Theoretical image focal distance f' = 0.73 mm
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_31_1.png

13.15. Lenses with different curvatures

[17]:
x0 = np.linspace(-500 * um, 500 * um, 512)
z0 = np.linspace(-0.1 * mm, 1.25 * mm, 512)
wavelength = 5 * um

lens = Scalar_mask_XZ(x0, z0, wavelength, n_background=1, info="")
focal, ipasa = lens.aspheric_lens(
    r0=(0 * um, 0 * um),
    angle=(0 * degrees, (0 * um, 0 * um)),
    refractive_index=1.5,
    cx=(1 / (1 * mm), -1 / (1 * mm)),
    thickness=0.2 * mm,
    size=0.8 * mm,
)

lens.slit(r0=(0, 100 * um -25*um/2), aperture=800 * um, depth=25 * um, refractive_index=1 + 2j)

print("Theoretical image focal distance f' = {:2.2f} mm".format(focal/mm))


lens.draw_refractive_index(
    draw_borders=True, min_incr=0.01, colorbar_kind="vertical", scale='scaled'
)
Theoretical image focal distance f' = 1.03 mm
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_33_1.png
[18]:
x0 = np.linspace(-500 * um, 500 * um, 512)
z0 = np.linspace(-0.1 * mm, 1.25 * mm, 512)
wavelength = 5 * um

lens = Scalar_mask_XZ(x0, z0, wavelength, n_background=1, info="")
focal, ipasa = lens.aspheric_lens(
    r0=(0 * um, 100 * um),
    angle=(0 * degrees, (0 * um, 0 * um)),
    refractive_index=1.5,
    cx=(1 / (1 * mm), 1 / (1 * mm)),
    thickness=0.1 * mm,
    size=0.8 * mm,
)

lens.slit(r0=(0, 100 * um), aperture=800 * um, depth=25 * um, refractive_index=1 + 2j)

print("Theoretical image focal distance f' = {:2.2f} mm".format(focal/mm))


lens.draw_refractive_index(
    draw_borders=True, min_incr=0.01, colorbar_kind="vertical", scale='scaled'
)
Theoretical image focal distance f' = 60.00 mm
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_34_1.png
[19]:
x0 = np.linspace(-500 * um, 500 * um, 512)
z0 = np.linspace(-0.1 * mm, 1.25 * mm, 512)
wavelength = 5 * um

lens = Scalar_mask_XZ(x0, z0, wavelength, n_background=1, info="")
focal, ipasa = lens.aspheric_lens(
    r0=(0 * um, 0 * um),
    angle=(0 * degrees, (0 * um, 0 * um)),
    refractive_index=1.5,
    cx=(1 / (1 * mm), 0),
    thickness=0.1 * mm,
    size=0.8 * mm,
)

lens.slit(r0=(0, 100 * um), aperture=800 * um, depth=25 * um, refractive_index=1 + 2j)

print("Theoretical image focal distance f' = {:2.2f} mm".format(focal/mm))

lens.draw_refractive_index(
    draw_borders=True, min_incr=0.01, colorbar_kind="vertical", scale='scaled'
)
Theoretical image focal distance f' = 2.00 mm
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_35_1.png
[20]:
x0 = np.linspace(-500 * um, 500 * um, 512)
z0 = np.linspace(-0.1 * mm, 1.25 * mm, 512)
wavelength = 5 * um

radius = 400*um

lens = Scalar_mask_XZ(x0, z0, wavelength, n_background=1, info="")
focal, ipasa = lens.aspheric_lens(
    r0=(0 * um, 0 * um),
    angle=(0 * degrees, (0 * um, 0 * um)),
    refractive_index=1.5,
    cx=(1 / (radius), -1 / (radius)),
    thickness=2*radius,
    size=2*radius,
)

lens.slit(r0=(0, radius-25*um), aperture=800 * um, depth=50 * um, refractive_index=1 + 2j)

print("Theoretical image focal distance f' = {:2.2f} mm".format(focal/mm))


lens.draw_refractive_index(
    draw_borders=True, min_incr=0.01, colorbar_kind="vertical", scale='scaled'
)
<string>:1: RuntimeWarning: invalid value encountered in sqrt
Theoretical image focal distance f' = 0.60 mm
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_36_2.png
[21]:
x0 = np.linspace(-500 * um, 500 * um, 512)
z0 = np.linspace(-0.1 * mm, 1.25 * mm, 512)
wavelength = 5 * um

lens = Scalar_mask_XZ(x0, z0, wavelength, n_background=1, info="")
focal, ipasa = lens.aspheric_lens(
    r0=(0 * um, 100 * um),
    angle=(0 * degrees, (0 * um, 0 * um)),
    refractive_index=1.5,
    cx=(-1 / (1 * mm), 1 / (1. * mm)),
    thickness=0.1 * mm,
    size=0.8 * mm,
)

lens.slit(r0=(0, 125 * um), aperture=800 * um, depth=25 * um, refractive_index=1 + 2j)

print("Theoretical image focal distance f' = {:2.2f} mm".format(focal/mm))


lens.draw_refractive_index(
    draw_borders=True, min_incr=0.01, colorbar_kind="vertical"
)
Theoretical image focal distance f' = -0.98 mm
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_37_1.png

13.16. Simplified lenses, with no aberrations

[22]:
x0 = np.linspace(-2 * mm, 2 * mm, 512)
z0 = np.linspace(-200 * um, 1 * mm, 512)
wavelength = 0.6238 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)

focal, _ = t1.lens(
    r0=(0 * um, 0 * um),
    size=3 * mm,
    radii=(10* mm, -8 * mm),
    thickness=.25* mm,
    refractive_index=1.5,
    angle=0 * degrees,
    mask=(100 * um, 1 + 2.05j),
)

print("Theoretical image focal distance f' = {:2.2f} mm".format(focal/mm))

t1.draw_refractive_index()
Theoretical image focal distance f' = 8.93 mm
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_39_1.png
[23]:
x0 = np.linspace(-500 * um, 500 * um, 512)
z0 = np.linspace(-0.1 * mm, 1.25 * mm, 512)
wavelength = 5 * um


t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)

focal, _ = t1.lens(
    r0=(0 * um, 0 * um),
    size=1 * mm,
    radii=(1* mm, -1 * mm),
    thickness=.25* mm,
    refractive_index=1.5,
    angle=15 * degrees,
    mask=(100 * um, 1 + 2.05j),
)

print("Theoretical image focal distance f' = {:2.2f} mm".format(focal/mm))

t1.draw_refractive_index()
Theoretical image focal distance f' = 1.04 mm
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_40_1.png

13.17. rough surface

[24]:
x0 = np.linspace(-150 * um, 150 * um, 256)
z0 = np.linspace(-20 * um, 300 * um, 512)
wavelength = 0.6238 * um

t1 = Scalar_mask_XZ(x=x0, z=z0, wavelength=wavelength)
t1.rough_sheet(
    r0=(0 * um, 0 * um),
    size=(250 * um, 25 * um),
    t=10 * um,
    s=10 * um,
    refractive_index=1.5,
    angle=0,
    rotation_point=None,
)
t1.draw_refractive_index(scale="scaled")
../../../_images/source_tutorial_scalar_scalar_XZ_masks_xz_42_0.png