In [27]:
import matplotlib
matplotlib.use('nbagg')

from zernike import ZernikeVector
import astropy.units as u
import numpy as np

In [2]:
z = ZernikeVector(Z4=100.0)

In [3]:
z.array


Out[3]:
$[0,~0,~100] \; \mathrm{nm}$

In [4]:
z['Z55'] = 100.0

In [5]:
z['Z5'] = 1000.0
z['Z6'] = 100
z['Z12'] = 55

In [6]:
z.coeffs


Out[6]:
{'Z04': <Quantity 100.0 nm>,
 'Z05': <Quantity 1000.0 nm>,
 'Z06': <Quantity 100.0 nm>,
 'Z12': <Quantity 55.0 nm>,
 'Z55': <Quantity 100.0 nm>}

In [7]:
z.denormalize()
print(z)


 Z04:       100 nm 	 Defocus (2, 0)
 Z05:     1e+03 nm 	 Primary Astig at 45˚ (2, -2)
 Z06:       100 nm 	 Primary Astig at 0˚ (2, 2)
 Z12:        55 nm 	 Secondary Astigmatism at 0˚ (4, 2)
 Z55:       100 nm


In [8]:
z.units = u.nm
z


Out[8]:
 Z04:       100 nm 	 Defocus (2, 0)
 Z05:     1e+03 nm 	 Primary Astig at 45˚ (2, -2)
 Z06:       100 nm 	 Primary Astig at 0˚ (2, 2)
 Z12:        55 nm 	 Secondary Astigmatism at 0˚ (4, 2)
 Z55:       100 nm

In [9]:
z.denormalize()
z.norm_array


Out[9]:
$[0,~0,~57.735027,~408.24829,~40.824829,~0,~0,~0,~0,~0,~17.392527,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~22.36068] \; \mathrm{nm}$

In [10]:
for c in z:
    print(c, z[c])


Z04 100.0 nm
Z06 100.0 nm
Z05 1000.0 nm
Z55 100.0 nm
Z12 54.99999999999999 nm

In [11]:
'Z04' in z


Out[11]:
True

In [12]:
z.denormalize()
z.ignore('Z05')
z.units = u.nm
z.plot_map()
z.peak2valley


Out[12]:
$501.19255 \; \mathrm{nm}$

In [13]:
z.restore('Z05')
z.plot_map()
z.rms


Out[13]:
$325.82856 \; \mathrm{nm}$

In [14]:
z.plot_surface()



In [15]:
b = z.phase_map()

In [16]:
b[4].max()


Out[16]:
$1175.8988 \; \mathrm{nm}$

In [17]:
z


Out[17]:
 Z04:       100 nm 	 Defocus (2, 0)
 Z05:     1e+03 nm 	 Primary Astig at 45˚ (2, -2)
 Z06:       100 nm 	 Primary Astig at 0˚ (2, 2)
 Z12:        55 nm 	 Secondary Astigmatism at 0˚ (4, 2)
 Z55:       100 nm

In [18]:
ref = ZernikeVector(Z04=-500, Z20=20)

In [19]:
ref


Out[19]:
 Z04:      -500 nm 	 Defocus (2, 0)
 Z20:        20 nm 	 X Pentafoil (5, 5)

In [20]:
z + ref


Out[20]:
 Z04:      -400 nm 	 Defocus (2, 0)
 Z05:     1e+03 nm 	 Primary Astig at 45˚ (2, -2)
 Z06:       100 nm 	 Primary Astig at 0˚ (2, 2)
 Z12:        55 nm 	 Secondary Astigmatism at 0˚ (4, 2)
 Z20:        20 nm 	 X Pentafoil (5, 5)
 Z55:       100 nm

In [21]:
new = ref - z

new


Out[21]:
 Z04:      -600 nm 	 Defocus (2, 0)
 Z05:    -1e+03 nm 	 Primary Astig at 45˚ (2, -2)
 Z06:      -100 nm 	 Primary Astig at 0˚ (2, 2)
 Z12:       -55 nm 	 Secondary Astigmatism at 0˚ (4, 2)
 Z20:        20 nm 	 X Pentafoil (5, 5)
 Z55:      -100 nm

In [22]:
new * 5


Out[22]:
 Z04:    -3e+03 nm 	 Defocus (2, 0)
 Z05:    -5e+03 nm 	 Primary Astig at 45˚ (2, -2)
 Z06:      -500 nm 	 Primary Astig at 0˚ (2, 2)
 Z12:      -275 nm 	 Secondary Astigmatism at 0˚ (4, 2)
 Z20:       100 nm 	 X Pentafoil (5, 5)
 Z55:      -500 nm

In [23]:
5/ new


Out[23]:
 Z04: -0.00833 1 / nm 	 Defocus (2, 0)
 Z05: -0.005 1 / nm 	 Primary Astig at 45˚ (2, -2)
 Z06: -0.05 1 / nm 	 Primary Astig at 0˚ (2, 2)
 Z12: -0.0909 1 / nm 	 Secondary Astigmatism at 0˚ (4, 2)
 Z20:  0.25 1 / nm 	 X Pentafoil (5, 5)
 Z55: -0.05 1 / nm

In [33]:
new * 2


Out[33]:
 Z04:  -1.2e+03 nm 	 Defocus (2, 0)
 Z05:    -2e+03 nm 	 Primary Astig at 45˚ (2, -2)
 Z06:      -200 nm 	 Primary Astig at 0˚ (2, 2)
 Z12:      -110 nm 	 Secondary Astigmatism at 0˚ (4, 2)
 Z20:        40 nm 	 X Pentafoil (5, 5)
 Z55:      -200 nm

In [ ]:
2 + new

In [ ]:
set(z.keys() & ref.keys())

In [ ]:
for k in sorted(z.keys()):
    print(k)

In [ ]:
(1.0 * u.nm / (1. * u.mm).to(u.nm)).value

In [ ]:
u.di