4. Examples of masks

[1]:
from diffractio import sp, plt, np
from diffractio import nm, mm, degrees, um
from diffractio.scalar_fields_XY import Scalar_field_XY
from diffractio.scalar_sources_XY import Scalar_source_XY
from diffractio.scalar_masks_XY import Scalar_mask_XY
from diffractio.utils_drawing import draw_several_fields

4.1. Standard masks

4.1.1. Two_levels

[28]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.two_levels(level1=1, level2=0, x_edge=0)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_4_0.png

4.1.2. Edge Series

[29]:
num_pixels = 512
length = 1000 * um
x0 = np.linspace(-length / 2, length / 2, num_pixels)
y0 = np.linspace(-length / 2, length / 2, num_pixels)
wavelength = 0.06238 * um

a_coef = np.array([[0, 1, 2], [0, 100, 25]])
b_coef = np.array([[0, 3], [0, 25]])

t2 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t2.edge_series(r0=(0, 0),
               period=100,
               a_coef=a_coef,
               b_coef=b_coef,
               angle=0 * degrees,
               invert=False)
t2.draw()

../../../_images/source_tutorial_scalar_XY_masks_xy_6_0.png

4.1.3. slit

[30]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.slit(x0=0, size=25 * um, angle=0 * degrees)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_8_0.png

4.1.4. sinusoidal slit

[31]:
x = np.linspace(-125 * um, 125 * um, 512)
y = np.linspace(-125 * um, 125 * um, 512)
wavelength = 1 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.sinusoidal_slit(x0=0 * um,
                   size=50 * um,
                   amplitude=10 * um,
                   phase=0 * degrees,
                   angle=0 * degrees,
                   period=20 * um)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_10_0.png

4.1.5. slit_series

[32]:
num_data = 256
length = 1000 * um
x0 = np.linspace(-length / 2, length / 2, num_data)
y0 = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

a_coef1 = np.array([[0, 1, 2], [0, 25, 25]])
a_coef2 = np.array([[0, 1, 2], [0, 25, 25]])

t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.slit_series(x0=0,
               width=200,
               period1=100,
               period2=100,
               Dy=(0, 0),
               a_coef1=a_coef1,
               a_coef2=a_coef2,
               angle=0 * degrees)

t1.draw()

../../../_images/source_tutorial_scalar_XY_masks_xy_12_0.png

4.1.6. double_slit

[33]:
num_data = 512
length = 50 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.double_slit(x0=0, size=5 * um, separation=15 * um, angle=0 * degrees)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_14_0.png

4.1.7. triangle

[34]:
x = np.linspace(-100 * um, 100 * um, 512)
y = np.linspace(-100 * um, 100 * um, 512)
wavelength = 1 * um
t1 = Scalar_mask_XY(x, y, wavelength)

t1.triangle(r0=(0, 50 * um), slope=2, height=100 * um, angle=0 * degrees)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_16_0.png

4.1.8. square

[35]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.square(r0=(0 * um, 0 * um), size=100*um, angle=0 * degrees)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_18_0.png

With this function we can also generate rectangles

[36]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.square(r0=(0 * um, 0 * um), size=(200 * um, 100 * um), angle=45 * degrees)
t1.draw(kind='intensity')
../../../_images/source_tutorial_scalar_XY_masks_xy_20_0.png

4.1.9. polygon

[37]:
x0 = np.linspace(-4 * mm, 4 * mm, 512)
y0 = np.linspace(-4 * mm, 4 * mm, 512)
wavelength = 0.6328 * um

vertices = np.array([(2 * mm, 2 * mm), (2 * mm, 0 * mm), (3 * mm, 3 * mm),
                     (0 * mm, 2 * mm)])

t = Scalar_mask_XY(x0, y0, wavelength)

t.polygon(vertices)
t.draw()
../../../_images/source_tutorial_scalar_XY_masks_xy_22_0.png

4.1.10. regular polygon

[38]:
x0 = np.linspace(-3 * mm, 3 * mm, 512)
y0 = np.linspace(-3 * mm, 3 * mm, 512)
wavelength = 0.6328 * um

t = Scalar_mask_XY(x0, y0, wavelength)
vertices = t.regular_polygon(num_vertices = 5, radius = 2 * mm, angle = 0 * degrees)
t.draw()
../../../_images/source_tutorial_scalar_XY_masks_xy_24_0.png

4.1.11. star

[39]:
x0 = np.linspace(-3 * mm, 3 * mm, 512)
y0 = np.linspace(-3 * mm, 3 * mm, 512)
wavelength = 0.6328 * um



t = Scalar_mask_XY(x0, y0, wavelength)
vertices = t.star(num_peaks = 8, radii = (2 * mm, 1*mm), angle = 0 * degrees)
t.draw()
../../../_images/source_tutorial_scalar_XY_masks_xy_26_0.png

4.1.12. circle

[40]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.circle(r0=(0 * um, 0 * um), radius=100*um)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_28_0.png

With this function we can also generate ellipses

[41]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.circle(r0=(0 * um, 0 * um), radius=(50 * um, 100 * um), angle=45*degrees)
t1.draw(kind='intensity')
../../../_images/source_tutorial_scalar_XY_masks_xy_30_0.png

and also angular sectors.

[42]:
r0 = (50*um, 50*um)
radii = (20*um, 40 *um)
angles = (0 * degrees, 90 * degrees)
size = 100*um
xin = np.linspace(0, size, 1024*2)
yin = np.linspace(0, size, 1024*2)
wavelength = 0.6328*um


t = Scalar_mask_XY(x=xin, y=yin, wavelength=wavelength)

t.circular_sector(r0=r0, radii=radii, angles=angles)
t.draw()
../../../_images/source_tutorial_scalar_XY_masks_xy_32_0.png

4.1.13. super_gauss

[43]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.super_gauss(r0=(0 * um, 0 * um), radius=100 * um, power=22)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_34_0.png

4.1.14. square_circle

[44]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.circle(r0=(0 * um, 0 * um), radius=(100 * um, 50 * um), angle=45 * degrees)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_36_0.png

4.1.15. angular_aperture

[45]:
num_pixels = 256
length = 200 * um
x0 = np.linspace(-length / 2, length / 2, num_pixels)
y0 = np.linspace(-length / 2, length / 2, num_pixels)
wavelength = 0.6238 * um

t2 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
a_coef = np.array([[0, 4, 8], [50, 25, 25]])
t2.angular_aperture(a_coef=a_coef, angle=0 * degrees)
t2.draw()

../../../_images/source_tutorial_scalar_XY_masks_xy_38_0.png

4.1.16. ring

[46]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.ring(r0=(0 * um, 0 * um),
        radius1=(50 * um, 50 * um),
        radius2=(75 * um, 105 * um),
        angle=90 * degrees)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_40_0.png

4.1.17. rings

[47]:
num_data = 512
length = 60 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

inner_radius = np.array([5., 10, 15, 20, 25])

outer_radius = np.array([6., 12, 17, 23, 29])

t1 = Scalar_mask_XY(x, y, wavelength)
t1.rings(r0=(0, 0), inner_radius=inner_radius, outer_radius=outer_radius)
t1.pupil()
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_42_0.png

4.1.18. cross

[48]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.cross(r0=(0 * um, 0 * um), size=(200 * um, 75 * um), angle=0 * degrees)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_44_0.png

4.1.19. image

[49]:
num_data = 1204
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.image(filename="spain.png",
         normalize=True,
         canal=0,
         lengthImage=True,
         angle=0 * degrees)

t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_46_0.png

4.1.20. gray_scale

[50]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.gray_scale(num_levels=16, levelMin=0, levelMax=1)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_48_0.png

4.1.21. hiperellipse

[51]:
x = np.linspace(-100 * um, 100 * um, 512)
y = np.linspace(-100 * um, 100 * um, 512)
wavelength = 1 * um

t1 = Scalar_mask_XY(x, y, wavelength)

t1.super_ellipse(r0=(0, 0),
                 radius=(100 * um, 100 * um),
                 angle=0 * degrees,
                 n=[0.75, 0.75])
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_50_0.png

4.1.22. superformula

[52]:
x = np.linspace(-2 * mm, 2 * mm, 512)
y = np.linspace(-2 * mm, 2 * mm, 512)
wavelength = 1 * um

t = Scalar_mask_XY(x, y, wavelength)
t.superformula(r0=(0, 0), radius=(1 * mm, 1 * mm), n=(160, 160, 160), m=12)
t.draw()
../../../_images/source_tutorial_scalar_XY_masks_xy_52_0.png

4.1.23. lens

[53]:
num_data = 512
length = 400 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t0 = Scalar_mask_XY(x, y, wavelength)
t0.lens(r0=(0 * um, 0 * um),
        radius=(150 * um, 150 * um),
        focal=(2.5 * mm, 2.5 * mm),
        angle=0 * degrees)
t0.draw(kind='phase')

../../../_images/source_tutorial_scalar_XY_masks_xy_54_0.png

4.1.24. Cylindrical lens

[3]:
num_data = 512
length = 400 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t0 = Scalar_mask_XY(x, y, wavelength)
t0.lens_cylindrical(x0=0 * um, focal=2.5 * mm, angle=0 * degrees)
t0.draw(kind='phase')
../../../_images/source_tutorial_scalar_XY_masks_xy_56_0.png

4.1.25. Fresnel lens

[54]:
# Amplitude lens
num_data = 512
length = 500 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.fresnel_lens(r0=(0 * um, 0 * um),
                radius=(250 * um, 250 * um),
                focal=(5 * mm, 5 * mm),
                angle=45 * degrees,
                kind='amplitude',
                phase=np.pi)
t1.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_58_0.png
[55]:
# Phase lens
num_data = 512
length = 500 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1.fresnel_lens(r0=(0 * um, 0 * um),
                radius=(250 * um, 250 * um),
                focal=(5 * mm, 5 * mm),
                angle=0 * degrees,
                kind='phase',
                phase=np.pi)
t1.draw(kind='phase')

../../../_images/source_tutorial_scalar_XY_masks_xy_59_0.png

4.1.26. biprism_fresnel

[56]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.biprism_fresnel(r0=(0 * um, 0 * um), width=100 * um, height=5 * um, n=1.5)
t1.draw(kind='phase')

../../../_images/source_tutorial_scalar_XY_masks_xy_61_0.png

4.1.27. axicon

[57]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.axicon(r0=(0 * um, 0 * um),
          radius=100 * um,
          angle=2 * degrees,
          refractive_index=1.5,
          off_axis_angle=0,
          reflective=True)
t1.draw(kind='phase')

../../../_images/source_tutorial_scalar_XY_masks_xy_63_0.png

4.1.28. grating_forked

[58]:
num_data = 1024
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t = Scalar_mask_XY(x, y, wavelength)
t.forked_grating(r0=(0 * um, 0 * um),
                 period=10 * um,
                 l=3,
                 alpha=2,
                 kind='amplitude',
                 angle=0 * degrees)
t.draw(has_colorbar='vertical')

../../../_images/source_tutorial_scalar_XY_masks_xy_65_0.png

4.1.29. roughness

[59]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_XY(x, y, wavelength)
t1.roughness(t=(25 * um, 25 * um), s=1 * um)
t1.draw(kind='phase')

../../../_images/source_tutorial_scalar_XY_masks_xy_67_0.png

4.1.30. Sine grating

[60]:
x = np.linspace(-250 * um, 250 * um, 512)
y = np.linspace(-250 * um, 250 * um, 512)
wavelength = 0.6238 * um
period = 50 * um
red = Scalar_mask_XY(x, y, wavelength)
red.sine_grating(period=period,
                 amp_min=0,
                 amp_max=1,
                 x0=0 * um,
                 angle=0 * degrees)
red.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_69_0.png

4.1.31. Ronchi grating

[61]:
x = np.linspace(-250 * um, 250 * um, 512)
y = np.linspace(-250 * um, 250 * um, 512)
wavelength = 0.6238 * um
red = Scalar_mask_XY(x, y, wavelength)
red.ronchi_grating(period=50 * um,
                   x0=0 * um,
                   angle=0 * degrees,
                   fill_factor=0.5)
red.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_71_0.png

4.1.32. Binary grating (amplitude + phase)

[62]:
x = np.linspace(-250 * um, 250 * um, 512)
y = np.linspace(-250 * um, 250 * um, 512)
wavelength = 0.6238 * um
red = Scalar_mask_XY(x, y, wavelength)
red.binary_grating(period=50 * um,
                   amin=.25,
                   amax=.75,
                   phase=np.pi,
                   x0=0,
                   fill_factor=0.5,
                   angle=0 * degrees)
red.draw(kind='field')

../../../_images/source_tutorial_scalar_XY_masks_xy_73_0.png

4.1.33. Blazed grating

[63]:
x = np.linspace(-250 * um, 250 * um, 512)
y = np.linspace(-250 * um, 250 * um, 512)
wavelength = 0.6238 * um
period = 100 * um
red = Scalar_mask_XY(x, y, wavelength)
red.blazed_grating(period=period,
                   phase_max=2*np.pi,
                   x0=0,
                   angle=0 * degrees)
red.draw(kind='phase')

../../../_images/source_tutorial_scalar_XY_masks_xy_75_0.png

4.1.34. 2D grating

[64]:
x = np.linspace(-200 * um, 200 * um, 512)
y = np.linspace(-200 * um, 200 * um, 512)
wavelength = 0.6238 * um
period = 50 * um
red = Scalar_mask_XY(x, y, wavelength)
red.grating_2D(r0=(0,0),
               period=period,
               amin=0,
               amax=1.,
               phase=0 * np.pi / 2,
               fill_factor=0.5,
               angle=0 * degrees)
red.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_77_0.png

4.1.35. Chess grating

[65]:
x = np.linspace(-200 * um, 200 * um, 512)
y = np.linspace(-200 * um, 200 * um, 512)
wavelength = 0.6238 * um
period = 100 * um
red = Scalar_mask_XY(x, y, wavelength)
red.grating_2D_chess(r0=(period / 8, period / 4),
                     period=period,
                     amin=0,
                     amax=1.,
                     phase=0 * np.pi / 2,
                     fill_factor=0.5,
                     angle=(0 * degrees))
red.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_79_0.png

4.1.36. Angular grating

[66]:
x = np.linspace(-200 * um, 200 * um, 512)
y = np.linspace(-200 * um, 200 * um, 512)
wavelength = 0.6238 * um
period = 50 * um
red = Scalar_mask_XY(x, y, wavelength)
red.angular_grating(r0=(0,0), num_petals=4,  radius= 200*um, phase=0*degrees, is_binary=False)
red.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_81_0.png
[67]:
x = np.linspace(-200 * um, 200 * um, 512)
y = np.linspace(-200 * um, 200 * um, 512)
wavelength = 0.6238 * um
period = 50 * um
red = Scalar_mask_XY(x, y, wavelength)
red.angular_grating(r0=(0, 0), num_petals=32, radius=200 * um, phase=0, is_binary=True)
red.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_82_0.png

4.1.37. random circle edge

[68]:
num_data = 512
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6238 * um

t = Scalar_mask_XY(x, y, wavelength)
t.circle_rough(r0=(0, 0), radius=100 * um, angle=0 * degrees, sigma=4 * um)
t.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_84_0.png

4.1.38. Random ring edge

[69]:
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
y = np.linspace(-length / 2, length / 2, num_data)

wavelength = 0.6238 * um

t = Scalar_mask_XY(x, y, wavelength)
t.ring_rough(r0=(0, 0),
             radius1=50 * um,
             radius2=100 * um,
             angle=0 * degrees,
             sigma=4 * um)
t.draw(kind='intensity')

../../../_images/source_tutorial_scalar_XY_masks_xy_86_0.png