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:
interferogramnow 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.ioto write Zygo ASCII files.save_zygo_ascii()to write an interferogram to Zygo ASCII format.zorderparameter in line-based plotting functions –prysm._phase.OpticalPhase.plot_slice_xy(),prysm.convolution.Convolvable.plot_slice_xy(),prysm.interferogram.Interferogram.plot_psd_slices()modeargument 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 areazminandazmaxfor 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.
confignow has parameters forQ,phase_colormap,image_colormap,lw,zorderfor controlling the default values of these parameters throughout the library.new constants in
prysm.psf–FIRST_AIRY_ZERO,SECOND_AIRY_ZERO, ANDTHIRD_AIRY_ZEROas well asSECOND_AIRY_ENCIRCLEDANDTHIRD_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
lenssubmodule has been removed. This eliminates theLensclass.the
seidelsubmodule has been removed. This eliminates theSeidelclass.the
shackhartmannsubmodule has been removed. This eliminates theShackhartmannclass.the
macrossubmodule has been removed. This eliminates theSystemConfignamedtuple, 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.fringezernikehas 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
zernikefuncsdictionary 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.FZCacheandfzcacheare nwo made redundant byZCacheandzcache. The cache takes an index into theprysm.zernikes.zernikeslist, not a Fringe or Noll index. Useprysm.zernikes.mapsto convert Fringe or Noll indices into prysm’s zernike catalog.
the
StandardZernikeclass fromprysm.standardzernikehas been replaced withNollZernikefromprysm.zernike,or as imported from the top-level namespace.NollZernikeallows coefficients from 0 to 36 or 1 to 37 and has all features present inFringeZernike, unlike the priorStandardZernikeclass.
prysm._zernikeis 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_xandcenter_yare now properly computed. Fixes #2.