Release Notes

v0.5.1 – 1/17/2026

Changelog

New Features

Improvements

  • Improve handling of dual-edge sampling configuration for Alazar digitizers

  • Improve specificity and actionability of configuration error messages

  • Show critical error messages in module loader even when VORTEX_LOADER_LOG is not set

  • Add warning when Python wheel is compiled in debug mode

  • Rename storage headers to avoid confusion

  • Extract version detection routines from top-level CMake scripts into separate files

Build System

  • Update to vcpkg manifest mode for handling build dependencies

  • Provide vcpkg manifest for building vortex as an external library

  • Create vcpkg registry for vortex build dependencies not available in main vcpkg registry

  • Add support for driving build feature flags from CMake or vcpkg

  • Build Python wheels against updated versions of all dependencies

  • Build Python wheels from standards-compliant source distributions

  • Add Python wheels for Python 3.13 and 3.14

  • Build Python wheels with support for NumPy 2 for Python 3.9+

  • Drop builds for CUDA 10.2 and compute capability 3.5

  • Update CUDA 11 builds to use CUDA 11.8

  • Update stub generation to use mypy without patching

  • Remove outdated CMake functions for wrapping compiler flags for CUDA

  • Set CMake *_FOUND variables in dependency find scripts

  • Simplify handling of include paths in CMake

  • Change CMake-driven defaults to enable modular build only if Python support is built

  • Change CMake-driven defaults to not automatically install Python wheels

  • Support empty build suffixes

Documentation

  • Add example project for using vortex as a vcpkg dependency

  • Add debugging help for scan pattern limit violations

  • Add creation of documentation to build server

  • Add documentation of profiler events

  • Add version selector to documentation

  • Add dynamics warnings for outdated or development documentation versions

  • Add light theme variants of figures and plots

  • Change diagrams from PNG to SVG

Assorted

  • Fix bug that used non-strided CUDA copies when saving strided spectral buffers

  • Add tensor stride accessor that keeps singular dimensions

  • Fix inefficient uses of background logging threads

  • Fix potential deadlocks in Python logging sink

  • Fix bug in scan formatting in which volume and scan boundaries could be ignored in interleaved scans

  • Rename storage headers to avoid confusion

  • Fix race condition in construction of logger for module loader

  • Fix percent/ratio conversion bug that incorrectly configured Alazar external clock levels too low

  • Fix incorrect block sizing in tutorials 1 and 2

  • Fix incorrect handling of exceptions during module loading that could suppress error messages and/or produce program termination

  • Update CUDA standard for C++17

  • Reduce CUDA compilation warnings

Migration Guide

Logging

For Python users, get_console_logger() and get_python_logger() previously returned an existing logger if a logger with the requested name already existed. These functions now always create a new logger. If you wish to reuse an existing logger, keep a reference to the Logger returned by these functions. The same semantics apply to the new function get_file_logger(). In general, prefer constructing a Logger directly instead of using these convenience functions.

Include Changes

For C++ users, the headers for stream_dump_t have moved as per the table below to avoid confusion. No other code changes are required.

Prior Name

New Name

vortex/storage/stream.hpp

vortex/storage/dump.hpp

Build System

  • The build system uses vcpkg manifest mode to simplify dependency management. A custom vcpkg registry for vortex has replaced the prior vcpkg overlay. All packages previously included in the overlay and now in the registry. The bundled vcpkg configuration will automatically retrieve packages from the registry. Consult the build guide for updated build instructions.

  • The standardized VCPKG_MANIFEST_FEATURES environment variable has now replaced VORTEX_BUILD_FEATURES environment variable. Whereas VORTEX_BUILD_FEATURES was a semicolon-delimited list of CMake WITH_* flags, VCPKG_MANIFEST_FEATURES is a semicolon-delimited list of features described in vortex’s vcpkg manifest. In general, a CMake option WITH_ABC_XYZ would correspond to vcpkg feature abc-xyz.

Configuration Defaults

  • For CMake-driven builds, INSTALL_PYTHON_WHEEL now defaults to OFF so any built Python wheels are not automatically installed.

  • The CMake variable ENABLE_MODULAR_BUILD now defaults to the value of WITH_PYTHON instead of BUILD_PYTHON_WHEEL.

Removed Functionality

Support for non-standard raw headers in storage objects has been removed. See the table below for recommended alternative headers. Changing the headers will necessitate minor changes to code that loads the saved data.

Removed Header

Alternative Header

SimpleStreamHeader.Raw

SimpleStreamHeader.Empty

SimpleStackHeader.Raw

SimpleStackHeader.NumPy

v0.5.0 – 1/25/2025

Changelog

New Features

  • Add official support for Linux

  • Add experimental support for Teledyne ADQ cards with TeledyneAcquisition

  • Add CPUProcessor for FFTW-based OCT processing

  • Add engine profiler

  • Add stack trace reporting with unhandled exceptions

  • Add support for strided memory operations

  • Add experimental support for GPU k-clock resampling on per A-scan basis for CUDA 11 and higher (feature cuda_dynamic_resampling)

Improvements

  • Support full set of callbacks from NullEndpoint

  • Issue callbacks for endpoints in order of registration

  • Change stream storage endpoints (e.g., AscanStreamEndpoint) to honor flags and issue callbacks

  • Update demos to use new and faster display widgets

  • Add engine-generated markers at scan start when using leading samples

  • Add stream and stack storage endpoints for all available data streams

  • Avoid de-interleaving multi-channel data prior to processing

  • Allow disabling of post-FFT square in OCT processors

  • Support signed raw data in OCT processors in Python with CUDAProcessorConfig.interpret_as_signed

  • Allow disabling of pybind11 optimizations with ENABLE_PYBIND11_OPTIMIZATIONS CMake option to facilitate debugging

  • Add accessor for device index to CUDA device tensors

  • Add option to release DAQmx tasks when acquisition stops with persistent_task

  • Reorganized acquisition component namespaces for consistency (see Migration Guide)

  • Allow use of Alazar cards not present in feature database

  • Include sample skipping support in Alazar feature database

  • Provide access to Alazar board handles with board and handle

  • Open file during preparation phase instead of start phase in FileAcquisition

  • Add recycling stage to engine processing to support non-owned memory buffers

  • Increase default data type for resampling index from 16-bits to 32-bits to support long spectra

  • Include compile-time options (e.g., ENABLE_EXCEPTION_GUARDS) in Python module features (e.g., __feature__) for introspection

Build System

  • Add support for Python 3.11 and 3.12

  • Add support for CUDA 11.x and 12.x using forward compatibility

  • Rewrite CI build system for more robust and flexibility building of wheels

  • Add manylinux2014_x86_64 compliance for Linux wheels for portability

  • Detect CUDA version in Python-driven builds to produce correct package suffix

  • Support builds with GCC on Linux

  • Pull Python setup script flags from CMake presets

  • Build against oldest supported numpy for compatibility

  • Fix dependency deployment and rpaths on Linux

  • Add tests for memory management and tensors

  • Add tests for OCT resampling and filtering

  • Add CMake presets for unoptimized builds with GCC and Clang

  • Remove dependency of engine on Alazar and DAQmx support

  • Fix handling of compile time definitions in modular builds that produced builds errors with certain feature combinations

  • Fix bug in handling of Alazar SDK version for error messages

Assorted

  • Fix bug when formatting to closed storage objects

  • Improve logging for storage objects

  • Fix bug that disabled support for Alazar on-board FFT

  • Fix whitespace typo in vcpkg ports overlay that corrupted TBB port

  • Fix dimension promotion bug in memory copy utilities

  • Fix type safety for FFTW wrapper

  • Fix delayed segment processing at volume boundaries in host tensor endpoints (e.g., SpectraStackHostTensorEndpoint).

  • Fix bug in scan change workaround that could produce infinite loop

  • Change defaults of FormatPlanner to satisfy the most common use cases

  • Improve robustness of C++ exception translation for Python

  • Fix bug in engine utilization computation

  • Fix assorted bugs in CPU processor

  • Fix bug that unconditionally disabled engine plan logging

Migration Guide

Namespace Changes

For C++ users, classes and enumerations for Alazar, DAQmx, IMAQ support have moved from vortex::acquire or vortex::io to vortex::alazar, vortex::daqmx, and vortex::imaq, respectively. For example, vortex::acquire::clock::internal_t is now vortex::alazar::clock::internal_t. This change avoids name collision with other acquisition components.

Prior Namespace

New Namespace

vortex::acquire::clock::internal_t

vortex::acquire::alazar::clock::internal_t

vortex::acquire::frame_trigger_t

vortex::acquire::imaq::frame_trigger_t

vortex::io::channel::digital_output_t

vortex::daqmx::channel::digital_output_t

For Python users, objects for Alazar, DAQmx, IMAQ support have moved from vortex.acquire or vortex.io to vortex.acquire.alazar, vortex.io.daqmx, and vortex.acquire.imaq. Objects previously in the driver module (e.g., vortex.driver.alazar) have merged with these new modules. For example, vortex.acquire.InternalClock is now vortex.acquire.alazar.InternalClock and vortex.driver.alazar.Channel is now vortex.acquire.alazar.Channel. This change parallels C++ namespaces and simplifies Python imports.

Prior Module

New Module

vortex.acquire.InternalClock

vortex.acquire.alazar.InternalClock

vortex.acquire.FrameTrigger

vortex.acquire.imag.FrameTrigger

vortex.io.AnalogOutput

vortex.io.daqmx.AnalogOutput

Functionality Changes

Stream storage endpoints (e.g., AscanStreamEndpoint) now honor the flags setting of their formatter, just like stack storage endpoints (e.g., AscanStackEndpoint). The formatter defaults have been changed such that the original behavior is provided by default unless flags are customized. Users who relied upon these endpoints to unconditionally store all samples should ensure that the endpoints are associated with a formatter than matches all flags (i.e., the default). Users who do not customize flags are not affected by this change.

Configuration Defaults

The default values for several configuration fields has changed as listed below. Users who do not set these fields and desire the original behavior should explicitly assign the prior default value. Users who already set these fields are not affected.

Field

Prior Default

New Default

FormatPlannerConfig.adapt_shape

True

False

FormatPlannerConfig.shape

(0, 0)

(2**64-1, 2**64-1)

SimpleStreamConfig.header

Raw

Empty

v0.4.3 – 6/30/2022

Changelog

Hardware

  • Add support for NI IMAQ cards with ImaqAcquisition

  • Improve feature detection for Alazar cards

  • Add calibration step to reduce ADC noise for select Alazar cards

  • Fix dual edge sampling for Alazar cards

  • Add strobe generation to engine with EngineConfig.strobes

  • Transition to dynamically loaded hardware support modules

Documentation

  • Reorganization of documentation with expansion for acquisition and processing components

  • Parse docstrings from documentation and embed in compiled module

  • Add galvo delay demo and tuning tool

  • Add new demo for saving data to disk

  • Add tutorial for UI development and scan switching

  • Improvements and bugfixes for demos

Build System

  • Drop builds for Python 3.6

  • Add builds for CUDA 11.6

  • Refactor CMake to support modular builds

  • Fix issue that led to incorrect type stub output

  • Add experimental support for Linux

  • Explicitly set minimum required NumPy version

  • Improve version detection and handling for Alazar and Vortex

Assorted

  • Fix issue where non-preloadable acquisition components produced incorrect startup sequences, leading to loss of synchronization

  • Exceptions that cause premature engine shutdown are now propagated

  • Add Counter stream to support correct index bookkeeping in post-processing with CounterStackEndpoint and related endpoints.

  • Add endpoints for formatting and storing streams (e.g., GalvoActualStackHostTensorEndpoint)

  • Refactor spiral scan generation

  • Fix bug that prevented change of repeated scan strategies

  • Add multiple inactive segment generation policies

  • Add CPU and GPU memory endpoints for spectra (e.g., SpectraStackDeviceTensorEndpointUInt16)

  • Assorted internal improvements and bugfixes

Migration Guide

No migration required.

v0.4.2 – 3/3/2022

Changelog

  • Update database for newer Alazar cards

  • Add support for tolerating unknown Alazar cards

  • Add Python setup.py script for building vortex, including all dependencies with vcpkg

  • Fix missing constructor for Source

  • Include imaging depth in Source

  • Build for Python 3.10

  • Improvements and bugfixes for demos

Migration Guide

Building

vortex now includes its own vcpkg overlay for its dependencies in /.vcpkg. If you previously used this path for vcpkg (as suggested by earlier build guides), you will need to relocate it.

v0.4.1 – 1/22/2022

Changelog

Migration Guide

Name Changes

  • Stack has replaced Cube in class names. For example, CubeTensorEndpointX is now StackTensorEndpointX. Similarly, CubeFormatExecutor is now StackFormatExecutor.

IO Leading

IO delays (e.g., for galvo response) are no longer handled in post-processing via the formatter. Instead, the engine now generates leading IO signals that cancel out the IO delay. The delay in samples is passed via add_io() in the EngineConfig. Multiple IO delays are possible. Change fc.stream_delay_samples = round(cfg.galvo_delay * ioc_out.samples_per_second) to ec.add_io(io_out, lead_samples=round(cfg.galvo_delay * ioc_out.samples_per_second)).