Skip to content

v0.1.0

Choose a tag to compare

@ichristen ichristen released this 29 Jul 18:29
· 331 commits to main since this release

New Features

  • Simulation of hardware with SimulatedSLM and SimulatedCamera, modeling experimental effects.
  • New toolbox.phase functions
    • sinusoid() grating.
    • binary() grating.
    • 2D general polynomial().
  • Fitting the SLM's source amplitude data to recenter grids and derive scales.
    • For instance, functions like lens() which use the SLM grid are now centered on the source amplitude and will focus coaxially.
    • This also is now used in choosing a radius for structured light conversions and Zernike data (see next).
  • Revamped Zernike functionality.
    • New convert_zernike_index() function to convert between common indexing standards.
    • Auto-choosing a good Zernike aperture from fitted source amplitude data.
    • Zernike derivatives (computed via the chain rule, so fast).
  • 3D support for convert_vector() (previously known as convert_blaze_vector()) and new units, including:
    • "zernike", which expresses 3D points as the result of coordinates (in radians) directly multiplied with normalized tilt and focus Zernike polynomials.
    • metric units in camera-space, making use of knowledge of the camera pixel size and magnification between the camera and experiment.
  • 3D spot arrays CompressedSpotHologram. #41
  • Spot arrays with unique Zernike aberration compensation for every spot (generalization of the above). Every spot goes to the desired point in 'aberration space'.
  • Conjugate gradient optimization of holograms using pytorch working alongside cupy.
  • Quadratic initial phase guess (instead of random) to promote a smoother hologram.
  • Multiplane holography with the meta-hologram MultiplaneHologram, which simultaneously optimizes the objectives of multiple child holograms.
  • Experimental holography features:
    • remove_vortices() and optical vortex analysis tools to remove phase kinks from the farfield.
    • get_multiplane_defocus_blur() for realistic defocus.
  • Wavefront calibration wavefront_calibrate() that simultaneously measures at multiple calibration points.
    • When combined with the above, implemented #60 in spot arrays.
    • This also includes other updates to wavefront calibration #42
    • New calibration algorithm based on removal of Zernike terms.
  • More robust fourier_calibrate() fitting.
  • pixel_calibrate() measuring phase swing and crosstalk.
  • settle_calibrate() measuring the $1/e$ SLM settle time.
  • Revamped CameraSLM calibration internal storage and saving.
  • format_2vectors() generalized to format_vectors() with N-dimensional support.
  • Allow moments to accept arbitrary grids, among other small changes.
  • Divide and conquer algorithm for smallest_distance() (now can handle millions of points in $O(N\log N)$ time).
  • Artificial bitdepth enhancement for cameras:
    • Multi-exposure High Dynamic Range imaging,
    • Software averaging.
  • Upon get_image()error, cameras now try again capture_attempts times. This improves reliability against rare errors.
  • SLM, Camera, and CameraSLM subclasses now have default plotting .plot() method that makes it easy to see what's happening in the phase and image domains.
  • Holograms also have improved .plot_farfield() enabling different units and helper boxes.
  • Added untested #17
  • Added skeleton for #26
  • Docs have moved from the readthedocs theme to the very nice pydata theme (used by numpy, etc).
  • Lots of documentation cleanup and polishing.
  • The package index moved from QPG-MIT/slmsuite to slmsuite/slmsuite.

Breaking Changes

  • Changed toolbox.phase functions:
    • zernike() and zernike_sum() are completely changed.
    • blaze() had the offset= parameter removed as it was redundant with +=.
  • Renamed variables in cameras and SLMs to reduce clutter:
    • dx_um, dy_um -> pitch_um
    • dx, dy -> pitch
    • x_grid, y_grid -> grid
    • phase_correction, measured_amplitude, -> source
    • Constructors are also modified in some cases.
    • Default parameters are changed in most cases.
    • High-level SLMs (Santec, Meadowlark, ...) should largely be fine, but direct calls to the SLM constructor might break.
  • Renamed variables in Holograms:
    • method was moved to flags.
    • extract_phase() and extract_farfield() -> get_phase() and get_farfield().
  • Renaming in FourierSLM:
    • Different calibrations are now stored in a single dict calibrations.
    • Saving was revamped to use a single method to save all calibrations to avoid method bloat as calibrations are added.
      • For instance save_wavefront_calibration() and load_wavefront_calibration() is now changed to write_calibration("wavefront_superpixel") and read_calibration("wavefront_superpixel") or write_calibration("wavefront_zernike") and read_calibration("wavefront_zernike").
    • wavefront_calibrate() has renamed and reorganized variables.
      • In particular interference_point -> calibration_points.
    • Processing methods were also renamed for better organization. For instance process_wavefront_calibration() -> wavefront_calibration_process()
  • Assorted general attempts at improving packaging naming uniformity.
    • For instance, using get_ and set_, read_ and write_, etc as the dominant language.

Bugfixes

Under the Hood

  • Major reorganization of internal files.
    • algorithms is split into many smaller files.
    • fitfunctions and files are moved from misc to analysis and toolbox.
  • Introduced a number of custom CUDA kernels (in cuda.cu).

Full Changelog: v0.0.1...v0.1.0