Skip to content

Releases: holodyne/slmsuite

v0.4.1

30 Mar 16:53
2bb94f5

Choose a tag to compare

Changelog

0.4.1 - Patch to 0.4.0

Bugfixes

  • Remove undefined local variable on wavefront_calibrate_zernike (#176) by @sumiya-kuroda in #177 (thanks @sumiya-kuroda !)
  • Fixed variable name images -> phase_images when the unwrap argument is used.

Additions

  • zernike_order_number for computing the number of polynomials in a Zernike pyramid, up to a given radial_order.
  • Other minor documentation.

Full Changelog: v0.4.0...v0.4.1

v0.4.0

23 Mar 04:10
7a363db

Choose a tag to compare

Changelog

v0.4.0 (March 2026)

Note: To better support our growing userbase, we are transitioning development and support of slmsuite to Holodyne Labs, Inc., which we founded to enable practical, real-time holography by combining high-performance algorithms and state-of-the-art spatial light modulators.

New Features

  • Texas Instruments Phase Light Modulator (PLM) Support (texasinstruments.py): new implementation with GPU-accelerated phase processing (quantization and mapping) and USB control in #172
  • FLIR Camera Support (flir.py): PySpin/Spinnaker SDK integration with QuickSpin API, auto-configuration, multi-bitdepth support (8–16 bit), WOI, GenICam nodemap traversal, and software trigger mode by @beneaze in #155, #172
  • Renovated ScreenMirrored Implementation for Multi-SLM Setups (screenmirrored.py, _pyglet.py): now with a manager thread and dedicated event thread per SLM to prevent freezes in #172 (fixes #117)
  • Meadowlark Enhancements: PCIe external trigger support, execute/block in _set_phase_hw(), _SDK_MODE enum with is_pcie, other modal support, firmware CSV update by @sumiya-kuroda in #136, #156, #159, #160 and in #142, #169
  • Refined set_phase Control (slm.py): set_phase() now accepts execute (skip hardware write) and block (non-blocking for trigger workflows) in #172
  • Build Modernization: migrated from setup.py/requirements.txt to pyproject.toml with optional dependency groups ([gpu], [slms], [cameras], [test], etc.) in #173, #174
  • Testing Infrastructure: pytest framework with CI/CD, hardware fixtures, dynamic hardware selection, @pytest.mark.gpu/slow markers, and performance benchmarking in #173

Example notebooks have been updated to reflect/integrate these changes.

Breaking Changes

  • autofocus() signature: parameter order reversed (set_z, get_z instead of get_z, set_z); z_list replaced by range_z; new metric and verbose params
  • Build system: setup.py, requirements.txt, requirements_ipython.txt, MANIFEST.in removed — install via pip install slmsuite[gpu,slms] or uv sync --extra test
  • remove_vortices now defaults to False
  • binary duty_cycle corner case fixed (was inverted)

Bug Fixes

  • NumPy 2.4 compatibility: .item() for scalar conversion, stricter indexing shapes, ptp() removal in #172, #173
  • Pyglet>2.1.8 compatibility by changing datatypes in #172
  • Meadowlark get_temperature(): SDK 3.x/6.x/8.x API mismatch and missing restype declaration by @sumiya-kuroda in #159 (fixes #141)
  • Meadowlark Remote: stale phasedisplay parameter rename by @sumiya-kuroda in #156
  • Basler WOI/buffer: unimplemented WOI, centering mode conflict, missing grab retry by @sumiya-kuroda in #136 (fixes #135)
  • is_even inverted logic: bitwise NOT always truthy in Python in #173
  • binary duty_cycle: inverted comparison and unclipped range in #173
  • Stale Fourier calibration warning in #173 (fixes #133)
  • ijcam_to_knslm in-place mutation of Fourier calibration by @philip-rk in #163

All Merged Pull Requests

New Contributors

Full Changelog: v0.3.0...v0.4.0

v0.3.0

28 Sep 20:24

Choose a tag to compare

New Features

Hardware Interfaces

  • Added a new interface for Meadowlark that is compatible with the different types of SDKs (HDMI, PCIe, ...). Thanks to @darikoneil , @nobias , and Anna at Meadowlark.
  • Completed the interface for Holoeye SLMs. Thanks to @mkm2 .
  • Added a USB interface for Hamamatsu SLMs. Thanks to @ninovarde .
  • Polished the Basler camera interface. Thanks to @EiseZ , @Elenamr01 , @philip-rk , and @sumiya-kuroda .
  • Some polish and improvements to the MindVision camera interface.
  • Added WOI support for the AlliedVision camera interface. Thanks to @bodokaiser .
  • Some changes to Webcam, including a woi interface and embedded sleeps which circumstantially seem to improve reliability.
  • Added remote interface where a Server can host cameras and SLMs which clients can connect to with RemoteCamera and RemoteSLM. For instance, we had a 20 MP camera that for whatever reason wasn't playing nicely with the computer with the GPU and SLMs, so this feature allows that camera to be hosted on a different computer. This feature was inspired in part by slmpy's server.
  • Made Camera and SLM explicitly abstract as a resolution to #92 .
  • Some polish to camera and SLM plots.
  • Crosshair feature for live cameras. (Also centroiding thanks to @bodokaiser ).

Other Changes

  • Modified binary to accept vectors with coordinate larger than 1, which are interpreted as instead pixel_periods for the gratings.
  • Added quadrant and bahtinov alignment masks. Thanks to @bodokaiser for suggesting quadrant.
  • Started the process of typehinting (this will continue to the rest of the package if it looks alright) and autodocing the types.
  • Fixes and upgrades to CompressedSpotHologram, including refine_offset() and refactoring of the CUDA kernels.
  • Readded a default value for .spot_integration_width_ij which is the integration size on the camera. The user should overwrite this default as needed.
  • take_tile to tile a stack of images into a grid. Faster useful alternative to and within take_plot.
  • New imaging functions image_centroids and image_std which are light wrappers for image_positions and image_variances.
  • New imaging functions image_remove_blaze, image_vortices_remove, image_reduce_wraps to help with processing numerical phase patterns (e.g. wavefront calibration results).
  • Improvements and helper functions for wavefront calibration. wavefront_calibrate_zernike_smooth provides nearest-neighbor filtering of the multipoint Zernike results to reduce noise. This should be applied intermittently throughout a calibration as desired. Future work will provide the user with a more structured interface for multipoint Zernike wavefront calibration.
  • Performance improvements to Lloyd's algorithm: previously this algorithm operated by blitting a polygon onto an image and calculating the centroid numerically (inefficient). Now the centroid of the polygon is calculated analytically.
  • Updated package citation and badges.
  • Assorted documentation.

Bugfixes

  • Fixed a bug with Thorlabs for 0.2.0+. Thanks to @calebrich .
  • Fixed a bug with PIL not being imported in SLM vendor phase upload. Thanks to @ymelul-ibec .
  • Bugfix to take which would erroneously take every other pixel on occasion.
  • Minor bugfixes with datatyping, documentation.

Pull Requests

New Contributors

Full Changelog: v0.2.1...v0.3.0

v0.2.1

03 Jan 20:57

Choose a tag to compare

Small Changes

  • Tweaked array fitting to work better at small resolutions.
  • Added alpha support to colormap saving.

Full Changelog: v0.2.0...v0.2.1

v0.2.0

23 Dec 23:56
ae88698

Choose a tag to compare

New Features

  • Cameras update #57
    • ipywidget interface to view cameras live in jupyter notebooks, asynchronous using asyncio. No longer will it be necessary to close a camera such that it could be opened in an external live viewer. Call .live() on any camera.
    • Instrumental #17 (polish/debugging) #80 ,
    • Micro-Manager #21 (polish/debugging),
    • Imaging Source #25 , #67
    • VimbaX #66 ,
    • MindVision #71 ,
    • Pylablib #72 ,
    • Basler #74 ,
    • Webcam support using cv2 (carryover from 0.1.2).
    • Changed camera internals regarding exposure and image saving.
    • Some extra camera documentation and error reporting.
  • All hardware interfaces have a pickle() method to send attributes to a savable dictionary. This is useful to record system state.
    • The .save() method pickles and saves to .h5.

Breaking Changes

  • Some small changes to the "__meta__" parameter of calibrations.
  • Potentially different behavior in array fitting.

Bugfixes

  • pyglet >=2.0 support with <2.0 backwards compatibility #7 , tested on Windows systems.
  • Small fixes.

New Contributors

Full Changelog: v0.1.2...v0.2.0

v0.1.2

23 Nov 01:36
cb504be

Choose a tag to compare

New Features

  • Webcam interface using cv2's VideoCapture interface. This supports builtin or USB webcams, among other things.
  • Polished the Instrumental camera interface.
  • Honed Zernike wavefront calibration functionality.
  • Renamed SLM.write to SLM.set_phase with backwards compatibility.

Breaking Changes

  • Reverted read_/write_ paradigm in favor of load_/save_.
    • CameraSLM.save_calibration
    • CameraSLM.load_calibration
    • SLM.load_vendor_phase_correction
    • SLM.save_phase
    • SLM.load_phase
    • Santec.load_csv
    • Hologram.save_stats
    • Hologram.load_stats
    • analysis.files.save_image

Bugfixes

Full Changelog: v0.1.1...v0.1.2

v0.1.1

13 Aug 02:16

Choose a tag to compare

Fixes PyPI bug which did not include cuda.cu. Minor documentation and enhancements.

Full Changelog: v0.1.0...v0.1.1

v0.1.0

29 Jul 18:29

Choose a tag to compare

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

v0.0.1

06 May 22:54
7e74a50

Choose a tag to compare

initial release