8.7. Diffraction by different objects: xy frame
[1]:
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
from diffractio import degrees, mm, plt, sp, um, np
from diffractio.scalar_fields_XY import Scalar_field_XY
from diffractio.utils_drawing import draw_several_fields
from diffractio.scalar_masks_XY import Scalar_mask_XY
from diffractio.scalar_sources_XY import Scalar_source_XY
8.7.1. Slit
[2]:
num_pixels = 512
length = 100*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.slit(x0=0, size=10*um, angle=0*degrees)
u2 = u1 * t1
u3 = u2.RS(z=25*um, new_field=True)
u4 = u2.RS(z=100*um, new_field=True)
draw_several_fields((u2, u3, u4), titles=('mask', '25 um', '100 um'))
8.7.2. double slit
[3]:
num_pixels = 512
length = 100*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
# u1.laguerre_beam(p=2, l=1, r0=(0*um, 0*um), w0=7*um, z=0.01*um)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.double_slit(x0=0, size=2*um, separation=10*um, angle=0*degrees)
u2 = u1 * t1
u3 = u2.RS(z=100*um, new_field=True)
u4 = u2.RS(z=200*um, new_field=True)
draw_several_fields((u2, u3, u4), titles=('mask', '100 um', '200 um'))
8.7.3. square
[4]:
num_pixels = 512
length = 100*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
# u1.laguerre_beam(p=2, l=1, r0=(0*um, 0*um), w0=7*um, z=0.01*um)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.square(r0=(0*um, 0*um), size=(50*um, 50*um), angle=0*degrees)
u2 = u1 * t1
u3 = u2.RS(z=100*um, new_field=True)
u4 = u2.RS(z=500*um, new_field=True)
draw_several_fields((u2, u3, u4), titles=('mask', '100 um', '200 um'), logarithm=True)
8.7.4. circle
[5]:
num_pixels = 512
length = 100*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.circle(
r0=(0*um, 0*um), radius=(25*um, 25*um), angle=0*degrees)
u2 = u1 * t1
u3 = u2.RS(z=100*um, new_field=True)
u4 = u2.RS(z=500*um, new_field=True)
draw_several_fields((u2, u3, u4), titles=('mask', '100 um', '500 um'), logarithm=True)
8.7.5. ring
[6]:
num_pixels = 512
length = 500*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.ring(
r0=(0*um, 0*um),
radius1=(25*um, 50*um),
radius2=(100*um, 150*um),
angle=45)
u2 = u1 * t1
u3 = u2.RS(z=2.5*mm, new_field=True)
u4 = u2.RS(z=10*mm, new_field=True)
u5 = u2.RS(z=100*mm, new_field=True)
draw_several_fields((u2, u3, u4, u5), titles=('mask', '25 um', '100 um', '500 um'), logarithm=True)
plt.tight_layout()
8.7.6. cross
[7]:
num_pixels = 512
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
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.cross(r0=(0*um, 0*um), size=(150*um, 50*um), angle=45*degrees)
u2 = u1 * t1
u3 = u2.RS(z=150*um, new_field=True)
u4 = u2.RS(z=5000*um, amplification=(2, 2), new_field=True)
draw_several_fields((u2, u3, u4), titles=('mask', '150 um', '5000 um'), logarithm=True)
8.7.7. edge
[8]:
num_pixels = 512
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
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.two_levels(level1=0, level2=.5, x_edge=0, angle=0)
u2 = u1 * t1
u3 = u2.RS(z=100*um, new_field=True)
u4 = u2.RS(z=1000*um, new_field=True)
draw_several_fields((u2, u3, u4), titles=('mask', '100 um', '1000 um'), logarithm=True)
[9]:
u3.draw_profile(point1=(-50, 0), point2=(50, 0), kind='intensity', order=2)
h, profile, p1, p2 = t1.profile(
point1=(-50, 0), point2=(50, 0), kind='intensity', order=1)
plt.plot(h, profile, 'r', lw=2)
8.7.8. image
[10]:
num_pixels = 512
length = 100*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.image(filename="lenaColor.png", invert=False)
u2 = u1 * t1
u3 = u2.RS(z=50*um, new_field=True)
u4 = u2.RS(z=250*um, new_field=True)
draw_several_fields((u2, u3, u4), titles=('mask', '100 um', '1000 um'), logarithm=True)
8.7.9. mask_from_function
[11]:
num_pixels = 512
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
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
f1 = "R1-h1+np.sqrt(R1**4-(self.X-x0)**4-(self.Y-y0)**4)"
f2 = "R2-h2+np.sqrt(R2**2-(self.X)**2-(self.Y)**2)"
v_globals = {
'R1': 6*mm,
'R2': 2*mm,
'x0': 0*um,
'y0': 25*um,
'h1': 4*mm,
'h2': -1*mm,
'np': np,
}
index = 1.5
print(v_globals)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.mask_from_function(
r0=(0*um, 0*um),
index=index,
f1=f1,
f2=f2,
v_globals=v_globals,
radius=(100*um, 100*um))
t1.pupil()
u2 = u1 * t1
u3 = u2.RS(z=2000*um, new_field=True)
u4 = u2.RS(z=5000*um, new_field=True)
draw_several_fields((u2, u3, u4), titles=('mask', '100 um', '1000 um'), logarithm=False,
kinds=['phase', 'intensity', 'intensity'])
{'R1': 6000.0, 'R2': 2000.0, 'x0': 0.0, 'y0': 25.0, 'h1': 4000.0, 'h2': -1000.0, 'np': <module 'numpy' from '/home/luismiguel/.local/lib/python3.10/site-packages/numpy/__init__.py'>}
8.7.10. astigmatism
[12]:
num_pixels = 512
length = 500*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.lens(
r0=(0*um, 0*um),
radius=(250*um, 250*um),
focal=(5*mm, 10*mm),
angle=0*degrees)
u2 = u1 * t1
u3 = u2.RS(z=5*mm, new_field=True)
u4 = u2.RS(z=6.5*mm, new_field=True)
u5 = u2.RS(z=10*mm, new_field=True)
draw_several_fields((u2, u3, u4, u5), titles=('mask', '5 mm', '7 mm', '10 mm'), logarithm=True,
kinds=['phase', 'intensity', 'intensity', 'intensity'])
8.7.11. Fresnel lens
[13]:
num_pixels = 512
length = 250*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.fresnel_lens(
r0=(0*um, 0*um),
radius=(125*um, 125*um),
focal=(1*mm, 1*mm),
angle=45*degrees,
kind='amplitude',
phase=np.pi)
t1.pupil()
u2 = u1 * t1
u3 = u2.RS(z=1*mm, new_field=True)
draw_several_fields((u2, u3), titles=('', ''), kinds=['intensity', 'intensity'], logarithm=True)
[14]:
t1.fresnel_lens(
r0=(0*um, 0*um),
radius=(125*um, 125*um),
focal=(1*mm, 1*mm),
angle=0*degrees,
kind='phase',
phase=np.pi)
t1.pupil()
u2 = u1 * t1
u3 = u2.RS(z=1*mm, new_field=True)
draw_several_fields((t1, u3), kinds=['phase', 'intensity'], logarithm=1e1)
8.7.12. biprism
[15]:
num_pixels = 512
length = 250*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.biprism_fresnel(
r0=(0*um, 0*um), width=125*um, height=5*um, n=1.5)
u2 = u1 * t1
u3 = u2.RS(z=1.25*mm, new_field=True)
u4 = u2.RS(z=2.5*mm, new_field=True)
draw_several_fields((u2, u3, u4), titles=('mask', '1.25 mm', '2.5 mm'), logarithm=True,
kinds=['phase', 'intensity', 'intensity'])
8.7.13. axicon
[16]:
num_pixels = 512
length = 250*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.axicon(r0=(0*um, 0*um), radius=125*um, angle=4*degrees, refractive_index=1.5)
u2 = u1 * t1
u3 = u2.RS(z=2.5*mm, new_field=True)
u4 = u2.RS(z=5*mm, new_field=True)
u5 = u2.RS(z=7.5*mm, new_field=True)
draw_several_fields((u2, u3, u4, u5), titles=('mask', '2.5 mm', '5 mm', '7.5 mm'), logarithm=True,
kinds=['phase', 'intensity', 'intensity', 'intensity'])
8.7.14. Laguerre spiral
[17]:
num_pixels = 512
length = 250*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.laguerre_gauss_spiral(
kind='intensity', n=0, l=12, r0=(0*um, 0*um), w0=20*um, z=1000*um)
u2 = u1 * t1
u3 = u2.RS(z=5*mm, new_field=True)
u4 = u2.RS(z=20*mm, new_field=True)
draw_several_fields((u2, u3, u4), titles=('mask', '2.5 mm', '20 mm'), logarithm=True)
8.7.15. forked grating
[18]:
period = 20*um
num_pixels = 1024
length = 250*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.forked_grating(kind='amplitude',
r0=(0*um, 0*um), period=period, l=3, alpha=2, angle=0*degrees)
zt = 2 * period**2 / wavelength
u2 = u1 * t1
u4 = u2.RS(z=.5 * zt, new_field=True)
u5 = u2.RS(z=2 * zt, new_field=True)
draw_several_fields((u2, u4, u5), titles=('mask', '.5 zt', '2 zt'), logarithm=True)
8.7.16. Roughness and speckle
[19]:
num_pixels = 512
length = 250*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1, theta=0*degrees, phi=0*degrees)
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.roughness(t=(20*um, 20*um), s=1*um)
u2 = u1 * t1
u3 = u2.RS(z=1*mm, new_field=True)
u4 = u2.RS(z=5*mm, new_field=True)
u5 = u2.RS(z=10*mm, new_field=True)
draw_several_fields((u2, u3, u4, u5), titles=('mask', '1 mm', '5 mm', '10 mm'), logarithm=True,
kinds=['phase', 'intensity', 'intensity', 'intensity'])
8.7.17. Blazed grating
Right phase: 2pi
[20]:
num_pixels = 512
length = 500*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
focal = 5*mm
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1)
u1.pupil()
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.blazed_grating(period=20*um,
phase_max=2 * np.pi,
x0=0*um,
angle=0*degrees)
t2 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t2.lens(r0=(0*um, 0*um), focal=focal)
u2 = u1 * t1 * t2
u3 = u2.RS(z=focal, new_field=True, amplification=(3, 1))
u3.draw(logarithm=1e1)
Wrong phase: 1.5pi
[21]:
num_pixels = 512
length = 500*um
x0 = np.linspace(-length/2, length/2, num_pixels)
y0 = np.linspace(-length/2, length/2, num_pixels)
wavelength = 0.6238*um
focal = 5*mm
u1 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u1.plane_wave(A=1)
u1.pupil()
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.blazed_grating(period=20*um,
phase_max=1.5 * np.pi,
x0=0*um,
angle=0*degrees)
t2 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t2.lens(r0=(0*um, 0*um), focal=focal)
u2 = u1 * t1 * t2
u3 = u2.RS(z=focal, new_field=True, amplification=(3, 1))
u3.draw(logarithm=1e1)