6.2.3. Example of masks

6.2.3.1. Creating an instance

[1]:
from diffractio import np, plt
from diffractio import degrees, mm, um
from diffractio.scalar_masks_X import Scalar_mask_X

from numpy import loadtxt

6.2.3.2. Procedures to generate masks

6.2.3.2.1. mask_from_function

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

f1 = "R1-h1+np.sqrt(R1**2-(self.x-x0)**2)"
f2 = "R2-h2+np.sqrt(R2**2-(self.x-x0)**2)"
v_globals = {
    "R1": 5 * mm,
    "R2": 1 * mm,
    "x0": 0 * um,
    "y0": 0 * um,
    "h1": 1 * mm,
    "h2": -1 * mm,
}
index = 1.5
print(v_globals)

t1 = Scalar_mask_X(x, wavelength)
t1.mask_from_function(
    x0=0 * um, index=index, f1=f1, f2=f2, v_globals=v_globals, radius=100 * um
)
t1.draw(kind="phase")
{'R1': 5000.0, 'R2': 1000.0, 'x0': 0.0, 'y0': 0.0, 'h1': 1000.0, 'h2': -1000.0}
../../../_images/source_tutorial_scalar_scalar_X_masks_x_5_1.png

6.2.3.2.2. mask_from_array

[3]:
num_data = 1024 * 8
x = np.linspace(-1 * mm, 1 * mm, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_X(x, wavelength)

profile1 = loadtxt("./profile1.txt")
profile2 = loadtxt("./profile2.txt")
t1.mask_from_array(
    x0=0,
    index=1.25,
    array1=profile1 * mm,
    array2=profile2 * mm,
    interp_kind="quadratic",
    radius=1.5 * mm,
)

t1.draw(kind="phase")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_7_0.png

6.2.3.3. slit

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

t1 = Scalar_mask_X(x, wavelength)
t1.slit(x0=0, size=100 * um)
t1.draw()
../../../_images/source_tutorial_scalar_scalar_X_masks_x_9_0.png

6.2.3.4. double_slit

[5]:
num_data = 128
length = 25 * um
x = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_X(x, wavelength)
t1.double_slit(x0=0, size=5 * um, separation=15 * um)
t1.draw()
../../../_images/source_tutorial_scalar_scalar_X_masks_x_11_0.png

6.2.3.5. two levels

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

t1 = Scalar_mask_X(x, wavelength)
t1.two_levels(level1=0, level2=0.5, x_edge=0)
t1.draw()
../../../_images/source_tutorial_scalar_scalar_X_masks_x_13_0.png

6.2.3.6. gray scale

[7]:
x = np.linspace(0, 250 * um, 1024)
wavelength = 0.6328 * um

t1 = Scalar_mask_X(x, wavelength)
t1.gray_scale(num_levels=16, level_min=2, level_max=3)
t1.draw(kind="amplitude")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_15_0.png

6.2.3.7. prism

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

t1 = Scalar_mask_X(x, wavelength)
t1.prism(x0=0, n=1.5, angle=1 * degrees)
t1.draw(kind="phase")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_17_0.png

6.2.3.8. Fresnel biprism

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

t1 = Scalar_mask_X(x, wavelength)
t1.biprism_fresnel(angle=1 * degrees, x0=0 * um, radius=125)
t1.draw(kind="phase")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_19_0.png

6.2.3.9. Fresnel biprism from material properties n and h

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

t1 = Scalar_mask_X(x, wavelength)
t1.biprism_fresnel_nh(x0=0, width=100 * um, height=5 * um, n=1.5)

t1.draw(kind="phase")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_21_0.png

6.2.3.10. standard lens

[11]:
num_data = 2048
length = 500 * um
x = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um

t1 = Scalar_mask_X(x, wavelength)
t1.lens(x0=0 * um, radius=250 * um, focal=5 * mm)
t1.draw(kind="phase")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_23_0.png

6.2.3.11. Fresnel lens: amplitude and phase

[12]:
num_data = 1024
length = 250 * um
x = np.linspace(-length / 2, length / 2, num_data)
wavelength = 0.6328 * um
[13]:
t1 = Scalar_mask_X(x, wavelength)
t1.fresnel_lens(
    x0=0 * um, radius=100 * um, focal=0.25 * mm, kind="amplitude", phase=np.pi
)
t1.draw(kind="amplitude")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_26_0.png
[14]:
t1.fresnel_lens(x0=0 * um, radius=100 * um, focal=0.25 * mm, kind="phase", phase=np.pi)
t1.draw(kind="phase")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_27_0.png

6.2.3.12. rough surface

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

t1 = Scalar_mask_X(x, wavelength)
t1.roughness(t=15 * um, s=0.2 * um)
t1.draw(kind="phase")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_29_0.png

6.2.3.13. Dust particles with different sizas

TODO: does not work properly

[16]:
wavelength = 0.6328 * um
x = np.linspace(-500 * um, 500 * um, 2048)

t1 = Scalar_mask_X(x, wavelength)
t1.dust_different_sizes(percentage=0.2, size=20 * um, std=5 * um)
t1.draw()
../../../_images/source_tutorial_scalar_scalar_X_masks_x_31_0.png

6.2.3.14. dust particles

[17]:
wavelength = 0.6328 * um
x = np.linspace(-500 * um, 500 * um, 2048 * 8)

t1 = Scalar_mask_X(x, wavelength)
t1.dust(percentage=0.9, size=20 * um)
t1.draw()
../../../_images/source_tutorial_scalar_scalar_X_masks_x_33_0.png

6.2.3.15. bit structure

[18]:
num_data = 2048 * 4

wavelength = 0.85 * um
code = [1, 1, 0, 0, 1, 0, 1, 1, 0, 1]
bit_width = 80 * um
x = np.linspace(0, bit_width * len(code), num_data)

t1 = Scalar_mask_X(x, wavelength)
t1.binary_code(kind="normal", code=code, bit_width=bit_width, x0=0 * um)
t1.draw()
../../../_images/source_tutorial_scalar_scalar_X_masks_x_35_0.png

6.2.3.16. Gratings

6.2.3.16.1. sine grating

[19]:
x = np.linspace(-250 * um, 250 * um, 512)
wavelength = 0.6238 * um
period = 40 * um
red = Scalar_mask_X(x, wavelength)
red.sine_grating(period=period, amp_min=0, amp_max=1, x0=0 * um)
red.draw(kind="amplitude")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_37_0.png

6.2.3.16.2. Ronchi grating

[20]:
x = np.linspace(-250 * um, 250 * um, 512)
wavelength = 0.6238 * um
red = Scalar_mask_X(x, wavelength)
red.ronchi_grating(period=50 * um, x0=0 * um, fill_factor=0.5)
red.draw(kind="amplitude")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_39_0.png

6.2.3.16.3. binary grating: amplitude and phase

[21]:
x = np.linspace(-250 * um, 250 * um, 512)
wavelength = 0.6238 * um
red = Scalar_mask_X(x, wavelength)
red.binary_grating(
    period=50 * um, a_min=0.25, a_max=0.5, phase=np.pi, x0=25 * um, fill_factor=0.55
)
red.draw(kind="amplitude")
plt.ylim(0, 1)
../../../_images/source_tutorial_scalar_scalar_X_masks_x_41_0.png
[22]:
x = np.linspace(-250 * um, 250 * um, 512)
wavelength = 0.6238 * um
period = 40 * um
red = Scalar_mask_X(x, wavelength)
red.binary_grating(
    period=period, a_min=1, a_max=1, phase=np.pi / 2, x0=0, fill_factor=0.5
)
red.draw(kind="phase")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_42_0.png

6.2.3.16.4. blazed grating

[23]:
x = np.linspace(-250 * um, 250 * um, 512)
wavelength = 0.6238 * um
period = 50 * um
red = Scalar_mask_X(x, wavelength)
red.blazed_grating(x0=period / 2, period=period, phase_max=2 * np.pi)
red.draw(kind="phase")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_44_0.png

6.2.3.16.5. chirped grating: general

[24]:
x = np.linspace(-250 * um, 250 * um, 512)
wavelength = 0.6238 * um

fx = "10+20*(self.x/length)**2"

red = Scalar_mask_X(x, wavelength)
red.chirped_grating(
    kind="amplitude_binary",
    p_x=fx,
    length=500 * um,
    x0=0 * um,
    amp_max=1,
    amp_min=0,
    delta_x=0,
    phase_max=np.pi,
)
red.draw(kind="amplitude")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_46_0.png

6.2.3.16.6. chirped grating: linear p

[25]:
x = np.linspace(0 * um, 100 * um, 4096 * 4)
wavelength = 0.6238 * um
red = Scalar_mask_X(x, wavelength)
conds = {
    "kind": "amplitude_binary",
    "p0": 20 * um,
    "p1": 4 * um,
    "amp_min": 0,
    "amp_max": 1,
    "delta_x": 0,
    "phase_max": np.pi,
    "length": 0,  # equal to length of x
}
red.chirped_grating_p(**conds)
red.draw(kind="amplitude")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_48_0.png

6.2.3.16.7. chirped grating: linear q

[26]:
x = np.linspace(-100 * um, 100 * um, 4096 * 4)
wavelength = 0.6238 * um
red = Scalar_mask_X(x, wavelength)
conds = {
    "kind": "amplitude_binary",
    "p0": 20 * um,
    "p1": 4 * um,
    "amp_min": 0,
    "amp_max": 1,
    "delta_x": 0,
    "phase_max": np.pi,
    "length": 0,
}
red.chirped_grating_q(**conds)
red.draw(kind="amplitude")
../../../_images/source_tutorial_scalar_scalar_X_masks_x_50_0.png