prysm v0.15#
Version 0.15 introduces a host of new features and many internal changes that improve the maintainability of the library, users are encouraged to upgrade.
With version 0.16, a FWHM feature is expected to be added to the PSF class and improvements made to convolution and image simulation code. The abilities of the Detector
class are likely to be greatly enhanced. A SigFit parser will be be implemented.
New Features#
Surface/Wavefront error synthesis:
interferogram
now contains thesynthesize_surface_from_psd()
core method andrender_synthetic_surface()
andrender_from_psd()
convenience wrappers for synthesizing surface or wavefront data from PSD curves. Examples of this technique can be seen in e.g. _E. Sidick Power Spectral Density Specification and Analysis of Large Optical Surfaces_.convenience wrapper
fit_zernikes()
replacingzernikefit(i.phase, ...)
invocation.write_zygo_ascii()
function inprysm.io
to write Zygo ASCII files.save_zygo_ascii()
to write an interferogram to Zygo ASCII format.zorder
parameter in line-based plotting functions –prysm._phase.OpticalPhase.plot_slice_xy()
,prysm.convolution.Convolvable.plot_slice_xy()
,prysm.interferogram.Interferogram.plot_psd_slices()
mode
argument onprysm.interferogram.Interferogram.plot_psd_slices()
to switch between x axis units of spatial frequency (mode='freq'
) or spatial period (mode='period'
).prysm.interferogram.Interferogram.psd_slices()
andprysm.interferogram.Interferogram.plot_psd_slices()
methods replacing psd_xy_avg method. Two new inquiries areazmin
andazmax
for the azimuthal minimum and azimuthal maximum.prysm.psf.PSF.polychromatic()
staticmethod to create polychromatic PSFs from ensembles of monochromatic ones. This essentially reintroduces the MultispectralPSF class’s functionality from earlier versions of prysm.more configuration options.
config
now has parameters forQ
,phase_colormap
,image_colormap
,lw
,zorder
for controlling the default values of these parameters throughout the library.new constants in
prysm.psf
–FIRST_AIRY_ZERO
,SECOND_AIRY_ZERO
, ANDTHIRD_AIRY_ZERO
as well asSECOND_AIRY_ENCIRCLED
ANDTHIRD_AIRY_ENCIRCLED
. These concern the zeros of the airy disk and how much of the total energy is contained within. They are all wrapped inAIRYDATA
, a dictionary with keys of 1,2,3 and values that are length-2 tuples of(radius, encircled energy)
.
Beta Features#
prysm.otf.long_exposure_otf()
andprysm.otf.estimate_Cn()
for calculating the OTF (MTF) associated with a ‘long’ exposure through atmospheric turbulence. Note that while the equations have been implemented, the results have not been checked against published values. Please provide feedback.
Improved Packaging#
prysm now uses setup.cfg and some setuptools tricks. It now has the
prysm.__version__
attribute and can be more easily scanned by crawlers without executing setup.py.
Improved Documentation#
The User’s guide and Examples sections of the documentation are now jupyter notebooks and have embedded graphics and output.
There are several new examples.
Improved Test Coverage#
Test coverage is now > 80%
Breaking API Changes#
Interferogram.psd_xy_avg()
has been removed, its functionality is now the same as the default forInterferogram.psd_slices()
Interferogram.plot_psd_xy_avg()
faces the same change forInterferogram.plot_psd_slices()
. Note that two calls are now needed to replicate the default behavior:
fig, ax = i.plot_psd_slices(x=True, y=True, alpha=0.4, lw=3)
fig, ax = i.plot_psd_slices(x=False, y=False, azavg=True, lw=4.5, fig=fig, ax=ax)
prysm.psf._airydisk()
has been renamed toprysm.psf.airydisk()
.the
lens
submodule has been removed. This eliminates theLens
class.the
seidel
submodule has been removed. This eliminates theSeidel
class.the
shackhartmann
submodule has been removed. This eliminates theShackhartmann
class.the
macros
submodule has been removed. This eliminates theSystemConfig
namedtuple, thethrufocus_mtf_from_wavefront()
andthrufocus_mtf_from_wavefront_array()
functions.prysm.detector.generate_mtf()
has been removed. This function is redundant withprysm.detector.pixelaperture_analytic_otf()
.prysm.detector.OLPF.__init__()
now defaults to samples_x=0, using the analytical representation in the numerical case.The great Zernike refactor of 2019:
prysm.fringezernike
has been folded intoprysm.zernike
. Several functions have been renamed:fit()
is nowzernikefit()
called aszernikefit(... map_='fringe')
(ormap_='noll'
)magnitude/angle and name functions are now part of the
zernikefuncs
dictionary of dictionaries. Keys are, in order, function type and zernike order.fzname()
is now accessed most easily aszernikefuncs['name']['fringe']
.fzset_to_magnitude_angle()
aszernikefuncs['magnitude_angle']['fringe']
. noll is a valid key for the nested dictionary.FZCache
andfzcache
are nwo made redundant byZCache
andzcache
. The cache takes an index into theprysm.zernikes.zernikes
list, not a Fringe or Noll index. Useprysm.zernikes.maps
to convert Fringe or Noll indices into prysm’s zernike catalog.
the
StandardZernike
class fromprysm.standardzernike
has been replaced withNollZernike
fromprysm.zernike,
or as imported from the top-level namespace.NollZernike
allows coefficients from 0 to 36 or 1 to 37 and has all features present inFringeZernike
, unlike the priorStandardZernike
class.
prysm._zernike
is nowprysm.zernike
Under-the-hood Changes#
Angles of rotationally invariant terms in Fringe Zernike magnitude sets are now zero.
use of isfinite and isnan optimized for internal routines.
Bugfixes#
wavelength is properly captured in
prysm.pupil.Pupil.from_interferogram()
.prysm.convolution.Convolvable.from_file()
no longer mangles x and y units.prysm.psf.PSF.encircled_energy()
has been reworked, improving accuracy by about 2.3%.prysm._basicdata.BasicData.center_x
andcenter_y
are now properly computed. Fixes #2.