6.3.4. Examples of masks
[1]:
from diffractio import np, plt
from diffractio import mm, degrees, um
from diffractio.scalar_masks_XY import Scalar_mask_XY
6.3.4.1. Standard masks
6.3.4.1.1. One_level
[2]:
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.one_level(level=0.5)
t1.draw(kind="intensity")
plt.clim(0, 1)
plt.set_cmap("gray")
6.3.4.1.2. Two_levels
[3]:
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")
6.3.4.1.3. Edge Series
[4]:
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 * um, 0 * um),
period=100,
a_coef=a_coef,
b_coef=b_coef,
angle=0 * degrees,
invert=False,
)
t2.draw()
6.3.4.1.4. slit
[5]:
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")
6.3.4.1.5. sinusoidal slit
[6]:
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")
6.3.4.1.6. slit_series
[7]:
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 * um, 0 * um),
a_coef1=a_coef1,
a_coef2=a_coef2,
angle=0 * degrees,
)
t1.draw()
6.3.4.1.7. double_slit
[8]:
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")
6.3.4.1.8. triangle
[9]:
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")
6.3.4.1.9. square
[10]:
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")
With this function we can also generate rectangles
[11]:
length = 250 * um
x = np.linspace(-length / 2, length / 2, 512)
y = np.linspace(-length / 2, length / 2, 512)
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")
6.3.4.1.10. polygon
[20]:
length = 4*mm
x0 = np.linspace(-length / 2, length / 2, 512)
y0 = np.linspace(-length / 2, length / 2, 512)
wavelength = 0.6328 * um
t = Scalar_mask_XY(x0, y0, wavelength)
vertices = np.array([(-1* mm , -1 * mm),
(1 * mm, -1 * mm),
(1 * mm, 1 * mm),
(0 * mm, 1.5 * mm),
(-1 * mm, 1 * mm)])
t.polygon(vertices)
t.draw()
6.3.4.1.11. regular polygon
[23]:
length = 4*mm
x0 = np.linspace(-length / 2, length / 2, 512)
y0 = np.linspace(-length / 2, length / 2, 512)
wavelength = 0.6328 * um
t = Scalar_mask_XY(x0, y0, wavelength)
vertices = t.regular_polygon(5, 1.5*mm, 0 * degrees)
t.draw()
6.3.4.1.12. star
[25]:
t2 = Scalar_mask_XY(x0, y0, wavelength)
vertices = t2.star(8, (2*mm,1*mm), 0*degrees)
t2.draw()
6.3.4.1.13. circle
[12]:
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")
With this function we can also generate ellipses
[13]:
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")
6.3.4.1.14. super_gauss
[14]:
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")
6.3.4.1.15. square_circle
[15]:
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")
6.3.4.1.16. angular_aperture
[16]:
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()
6.3.4.1.17. ring
[17]:
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")
6.3.4.1.18. rings
[18]:
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.0, 10, 15, 20, 25])
outer_radius = np.array([6.0, 12, 17, 23, 29])
t1 = Scalar_mask_XY(x, y, wavelength)
t1.rings(r0=(0 * um, 0 * um), inner_radius=inner_radius, outer_radius=outer_radius)
t1.pupil()
t1.draw(kind="intensity")
6.3.4.1.19. cross
[19]:
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")
6.3.4.1.20. image
[20]:
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, channel=0, lengthImage=True, angle=0 * degrees
)
t1.draw(kind="intensity")
6.3.4.1.21. gray_scale
[21]:
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, level_min=0, level_max=1)
t1.draw(kind="intensity")
6.3.4.1.22. hiperellipse
[22]:
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 * um, 0 * um), radius=(100 * um, 100 * um), angle=0 * degrees, n=[0.75, 0.75]
)
t1.draw(kind="intensity")
6.3.4.1.23. lens
[ ]:
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", percentage_intensity=0.01)
6.3.4.1.24. Fresnel lens
[24]:
# 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")
[25]:
# 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")
6.3.4.1.25. biprism_fresnel
[26]:
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", percentage_intensity=0.01)
6.3.4.1.26. axicon
[38]:
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", percentage_intensity=0.01)
6.3.4.1.27. photon sieve
[37]:
range = 500*um
num_pixels = 512
x0 = np.linspace(-range/2, range/2, num_pixels)
y0 = np.linspace(-range / 2, range / 2, num_pixels)
wavelength=0.6328
[42]:
num_holes = 200
radius_hole = 8*um
pos_holes = -range / 2 + range * np.random.rand(num_holes,2)
[43]:
hole =Scalar_mask_XY(x0,y0,wavelength)
hole.circle(r0=(0, 0), radius=radius_hole)
hole.draw()
[48]:
t1 = Scalar_mask_XY(x0, y0, wavelength)
t1.photon_sieve(hole, pos_holes, top_one=True)
t1.draw()
6.3.4.1.28. grating_forked
[28]:
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")
6.3.4.1.29. roughness
[29]:
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")
6.3.4.1.30. Sine grating
[30]:
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")
6.3.4.1.31. Ronchi grating
[31]:
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")
6.3.4.1.32. Binary grating (amplitude + phase)
[32]:
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,
a_min=0.25,
a_max=0.75,
phase=np.pi,
x0=0,
fill_factor=0.5,
angle=0 * degrees,
)
red.draw(kind="field")
6.3.4.1.33. Blazed grating
[33]:
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")
6.3.4.1.34. 2D grating
[34]:
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 * um, 0 * um),
period=period,
a_min=0,
a_max=1.0,
phase=0 * np.pi / 2,
fill_factor=0.5,
angle=0 * degrees,
)
red.draw(kind="intensity")
6.3.4.1.35. Chess grating
[35]:
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,
a_min=0,
a_max=1.0,
phase=0 * np.pi / 2,
fill_factor=0.5,
angle=(0 * degrees),
)
red.draw(kind="intensity")
[41]:
x = np.linspace(-1*mm, 1*mm, 512)
y = np.linspace(-1*mm, 1*mm, 512)
wavelength = 0.6238*um
t_4x4 = Scalar_mask_XY(x=x, y=y, wavelength=wavelength)
t_4x4.squares_nxm(num_levels=(4,4))
t_4x4.draw('intensity', has_colorbar='vertical')
plt.set_cmap('gray')
6.3.4.1.36. random circle edge
[42]:
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 * um, 0 * um), radius=100 * um, angle=0 * degrees, sigma=4 * um)
t.draw(kind="intensity")
6.3.4.1.37. Random ring edge
[43]:
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 * um, 0 * um),
radius1=50 * um,
radius2=100 * um,
angle=0 * degrees,
sigma=4 * um,
)
t.draw(kind="intensity")