8. Vector Chirped Z-transform (VCZT)

[1]:
%load_ext autoreload
%autoreload 2
[2]:
from diffractio import degrees, mm, um, nm
from diffractio import np, plt, sp

from diffractio.scalar_fields_XY import Scalar_field_X
from diffractio.scalar_masks_XY import Scalar_mask_XY
from diffractio.scalar_sources_XY import Scalar_source_XY

from diffractio.vector_fields_XY import Vector_field_XY
from diffractio.vector_sources_XY import Vector_source_XY
from diffractio.vector_masks_XY import Vector_mask_XY
[3]:
size = 25 * um
x0 = np.linspace(-size / 2, size / 2, 512)
y0 = np.linspace(-size / 2, size / 2, 512)

focal = 16 * um
wavelength = 0.6328 * um

[4]:
u0 = Scalar_source_XY(x0, y0, wavelength)
u0.gauss_beam(r0=(0, 0),
              w0=(32 * um, 32 * um),
              z0=0 * um,
              A=1,
              theta=0. * degrees,
              phi=0 * degrees)

[5]:
t = Scalar_mask_XY(x0, y0, wavelength)
t.lens(r0=(0, 0), focal=focal, radius=size / 2)

../../../_images/source_tutorial_algorithms_VCZT_5_0.png
[6]:
u1 = t * u0

EM1 = Vector_source_XY(x0, y0, wavelength)
EM1.constant_polarization(u=u1, v=(1, 1j))

[8]:
EM1.draw('intensities', logarithm=0)

../../../_images/source_tutorial_algorithms_VCZT_7_0.png

8.1. to value

[9]:
x_out = 0.
y_out = 0.
z = focal

[10]:
%%time
EM2_1D=EM1.CZT(z, x_out, y_out, verbose=True)
print(EM2_1D)

((12.01931943234928-2.910555097903726j), (2.910555097903726+12.01931943234928j), (-5.329070518200751e-15+3.2307490016592055e-14j))
CPU times: user 198 ms, sys: 47.6 ms, total: 246 ms
Wall time: 245 ms

8.2. to x_field

[11]:
size_out = 16 * um
x_out = np.linspace(-size_out / 2, size_out / 2, 512)
y_out = 0.
z = focal

[12]:
%%time
EM2_1D=EM1.CZT(z, x_out, y_out)
EM2_1D.draw('intensities');
CPU times: user 765 ms, sys: 339 ms, total: 1.1 s
Wall time: 689 ms
../../../_images/source_tutorial_algorithms_VCZT_13_1.png

8.3. to z_field

[13]:
x_out = 0.
y_out = 0.
z = np.linspace(focal - 4 * um - 6 * um, focal - 2 * um + 6 * um, 64)

[14]:
%%time
EM2=EM1.CZT(z, x_out, y_out, verbose=False);

CPU times: user 11.1 s, sys: 304 ms, total: 11.4 s
Wall time: 11.4 s
[15]:
EM2.draw('intensities')

../../../_images/source_tutorial_algorithms_VCZT_17_0.png

8.4. to XZ_field

[16]:
size_out = 5 * um
x_out = np.linspace(-size_out / 2, size_out / 2, 128)
y_out = 0.
z = np.linspace(focal - 2 * um - 6 * um, focal - 2 * um + 6 * um, 64)

[17]:
%%time
EM2=EM1.CZT(z, x_out, y_out)

CPU times: user 10.3 s, sys: 1.38 s, total: 11.6 s
Wall time: 11.7 s
[19]:
EM2.draw('intensities', logarithm=1e-1)

../../../_images/source_tutorial_algorithms_VCZT_21_0.png

8.5. to XY_field

[21]:
size_out = 3 * um
x_out = np.linspace(-size_out / 2, size_out / 2, 256)
y_out = np.linspace(-size_out / 2, size_out / 2, 256)
z = focal - 2

[22]:
%%time
EM2=EM1.CZT(z, x_out, y_out)

CPU times: user 273 ms, sys: 48.1 ms, total: 321 ms
Wall time: 323 ms
[23]:
EM2.draw('intensities', logarithm=1e-1)

../../../_images/source_tutorial_algorithms_VCZT_25_0.png

8.6. to XYZ_field

[29]:
size_out = 2 * um
x_out = np.linspace(-size_out / 2, size_out / 2, 64)
y_out = np.linspace(-size_out / 2, size_out / 2, 64)
z = np.linspace(focal - 2 * um - 6 * um, focal - 2 * um + 6 * um, 16)

[30]:
%%time
EM2=EM1.CZT(z, x_out, y_out)

CPU times: user 2.97 s, sys: 407 ms, total: 3.37 s
Wall time: 3.38 s
[31]:
EM2.draw_XZ(y0=0, logarithm=False)
<Figure size 432x288 with 0 Axes>
../../../_images/source_tutorial_algorithms_VCZT_29_1.png