Zernikes

Prysm supports two flavors of Zernike polynomials; the Fringe set up to the 49th term, and the Zemax Standard set up to the 48th term. They have identical interfaces, so only one will be shown here.

Zernike notations are a subclass of Pupil, so they support the same arguments to __init__;

>>> from prysm import FringeZernike, StandardZernike
>>> p = FringeZernike(samples=123, epd=456.7, wavelength=1.0, opd_unit='nm', mask='dodecagon')

There are additional keyword arguments for each term, and the base (0 or 1) can be supplied; with base 0, the terms start at Z0 and range to Z48. With base 1, they start at Z1 and range to Z49 (or Z48, for Standard Zernikes). The Fringe set can also be used with unit RMS amplitude via the rms_norm keyword argument. Both notations also have nice print statements.

>>> p2 = FringeZernike(Z1=1, Z9=1, Z48=1, base=0, rms_norm=True)
>>> print(p2)
rms normalized Fringe Zernike description with:
        +1.000 Z1 - Tip (Y)
        +1.000 Z9 - Primary Trefoil Y
        +1.000 Z48 - Quinternary Spherical
        13.300 PV, 1.722 RMS

Notice that the RMS value is equal to sqrt(1^2 + 1^2 + 1^2) = sqrt(3) = 1.732 ~= 1.722. The difference of ~1% is due to the array sizes used by prysm by default, if increased, e.g. by adding samples=1204 to the above p2 = FringeZernike(...) line, the value would converge to the analytical one.

See pupils for information about general pupil functions. Below, the Fringe type of Zernike description has its full documentation printed.


class prysm.fringezernike.FringeZernike(*args, **kwargs)[source]

Bases: prysm.pupil.Pupil

build()[source]
Uses the wavefront coefficients stored in this class instance to
build a wavefront model.
self.phase : numpy.ndarray
arrays containing the phase associated with the pupil
self.fcn : numpy.ndarray
array containing the wavefunction of the pupil plane