Release Notes¶
v0.5.1 – 1/17/2026¶
Changelog¶
New Features¶
Add experimental support for Teledyne on-board background subtraction, spectral filtering, and FFT with FWOCT firmware
Add experimental support for using hugepages with Teledyne acquisitions on Linux
TeledyneConfig.enable_hugepagesAdd experimental support for Alazar DAC modules with
AlazarIOAdd experimental support for digital servo drivers with
MachDSPIOAdd support for NRRD and NIfTI formats in
SimpleStackwithSimpleStackHeader.NRRDandSimpleStackHeader.NIfTIAdd
Loggerfor fine-grained control over log output from PythonAdd
CPUProcessorConfig.enable_magnitudeto control conversion of complex to real valuesAdd
CPUProcessorConfig.levelsfor control of output quantizationAdd
block_callbackfor endpoints that reports all segments which complete within a blockAdd
Engine.shutdown()to request engine shutdown without blocking
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_LOGis not setAdd 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
mypywithout patchingRemove outdated CMake functions for wrapping compiler flags for CUDA
Set CMake
*_FOUNDvariables in dependency find scriptsSimplify 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 |
|---|---|
|
|
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_FEATURESenvironment variable has now replacedVORTEX_BUILD_FEATURESenvironment variable. WhereasVORTEX_BUILD_FEATURESwas a semicolon-delimited list of CMakeWITH_*flags,VCPKG_MANIFEST_FEATURESis a semicolon-delimited list of features described in vortex’s vcpkg manifest. In general, a CMake optionWITH_ABC_XYZwould correspond to vcpkg featureabc-xyz.
Configuration Defaults¶
For CMake-driven builds,
INSTALL_PYTHON_WHEELnow defaults toOFFso any built Python wheels are not automatically installed.The CMake variable
ENABLE_MODULAR_BUILDnow defaults to the value ofWITH_PYTHONinstead ofBUILD_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 |
|---|---|
|
|
|
v0.5.0 – 1/25/2025¶
Changelog¶
New Features¶
Add official support for Linux
Add experimental support for Teledyne ADQ cards with
TeledyneAcquisitionAdd
CPUProcessorfor FFTW-based OCT processingAdd 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
NullEndpointIssue callbacks for endpoints in order of registration
Change stream storage endpoints (e.g.,
AscanStreamEndpoint) to honor flags and issue callbacksUpdate 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_signedAllow disabling of pybind11 optimizations with
ENABLE_PYBIND11_OPTIMIZATIONSCMake option to facilitate debuggingAdd accessor for device index to CUDA device tensors
Add option to release DAQmx tasks when acquisition stops with
persistent_taskReorganized 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
boardandhandleOpen file during preparation phase instead of start phase in
FileAcquisitionAdd 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_64compliance for Linux wheels for portabilityDetect 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
numpyfor compatibilityFix 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
FormatPlannerto satisfy the most common use casesImprove 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 |
|---|---|
|
|
|
|
|
|
… |
… |
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 |
|---|---|
|
|
|
|
|
|
… |
… |
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 |
|---|---|---|
|
|
|
|
|
|
|
v0.4.3 – 6/30/2022¶
Changelog¶
Hardware¶
Add support for NI IMAQ cards with
ImaqAcquisitionImprove 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.strobesTransition 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
Counterstream to support correct index bookkeeping in post-processing withCounterStackEndpointand 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¶
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¶
Add support for Alazar FFT acquisition with
AlazarFFTAcquisitionandCopyProcessor. See the Live Alazar FFT Acquisition demo for an example.Move latency handling from formatter to engine.
Add missing
to_segments()method for high-level scan classes.Add Python stubs for autocompletion and type checking.
Add CMake presets.
Fix issues with
FileAcquisition.Add
sampleto marker-associated callbacks.Assorted bug fixes and improvements.
Migration Guide¶
Name Changes¶
Stackhas replacedCubein class names. For example,CubeTensorEndpointXis nowStackTensorEndpointX. Similarly,CubeFormatExecutoris nowStackFormatExecutor.
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)).