Vortex
VORTEX

An open-source library for building real-time OCT engines in C++ or Python.

About

vortex is a high-performance C++ library with Python bindings for rapid development of real-time OCT engines.

vortex is developed and maintained by Mark Draelos of the Image-Guided Medical Robotics Lab at the University of Michigan to facilitate the prototyping of new application-specific optical coherence tomography (OCT) software. It is a general-purpose library for OCT software development that seeks to:

  • promote reproducibility in data acquisition and processing,
  • guarantee synchronization between data streams,
  • support on-the-fly changes for interactive use cases,
  • integrate cleanly with user interfaces,
  • facilitate rapid prototyping with high-level abstractions and sane defaults, and
  • minimize restrictions and assumptions.

vortex is released under the permissive BSD-3 license to facilitate its use in both research and commercial contexts.

Features

Through its modular architecture, vortex encapsulates a complete OCT engine, including scan pattern generation, data acquisition and processing, synchronized I/O, and persistent storage.

Scan Pattern Generation

Generate common scan patterns with helper classes or design your own in C++ or Python. Interleave multiple scans and route to separate storage after processing. Queue scans to the engine for execution and interrupt as needed. Insert signaling events to synchronize scan pattern changes with post-processing code.

Real-Time OCT Processing

Use GPU or FPGA acceleration for real-time OCT processing. Spread large workloads across multiple GPUs. Tune block size and stream parallelism to your use case. Perform background subtraction, resampling, and filtering of raw spectra.

Extensive Python Bindings

Create real-time OCT engines exclusively using Python. Transparently share data with vortex using NumPy and CuPy. Lock shared memory for concurrent access from Python and C++. Asynchronously chain custom GPU processing onto the C++ OCT pipeline using CuPy.

pc = CUDAProcessorConfig()

# window + dispersion correction
window = np.hanning(pc.samples_per_ascan)
phasor = dispersion_phasor(len(window), \
    cfg.dispersion)
pc.spectral_filter = window * phasor

# DC subtraction per block
pc.average_window = pc.ascans_per_block

p = CUDAProcessor()
p.initialize(pc)

Synchronized I/O

Drive external hardware with scan pattern waveforms. Compensate for I/O delays with scan pattern lookahead. Add additional channels for multi-scanner hardware. Generate scan-derived digital pulses to trigger other devices.

Flexible Data Storage

Stream spectra or processed data to disk in common or raw file formats. Buffer high-speed acquisitions in memory as needed. Reassemble out-of-order scan patterns transparently as they write to disk.

UI Interactivity

Create interactive applications using callbacks from vortex's multithreaded engine. Display live OCT data as it is acquired or modify an ongoing acquisition.

Platforms

vortex includes support for a range of OCT platforms and components.

Pre-built Python releases automatically support the following hardware and operating systems. Users can extend vortex to support other hardware in C++.

AlazarTech Digitizers

  • Actively developed and maintained
  • Regularly tested on ATS9360 and ATS9364
  • Support for FFT with on-board FGPA

NVIDIA GPUs

  • Actively developed and maintained
  • Regularly tested on wide range of CUDA-capable GPUs

Windows

  • Actively developed and maintained
  • Regularly tested on Windows 10 and 11
  • Binary releases built with Visual Studio 2022

Teledyne SP Devices Digitizers

  • Actively developed and maintained
  • Regularly tested on ADQ32
  • Support for k-space remapping with on-board FPGA
  • Upcoming support for ADQ35 and FFT with on-board FPGA

NI DAQmx IO Modules

Linux

  • Actively developed and maintained
  • Regularly tested on Ubuntu 22.04
  • Binary releases built with manylinux2014 compatibility

NI IMAQdx Cameras

  • Supported but not maintained
  • Not regularly tested

Users

Both academic and industry entities use vortex due to its permissive BSD-3 license.

The following publications use vortex in their scanning, acquisition, and/or processing.

Releases

vortex is under active development with major releases and documentation listed below.

C++ users may download the source below and follow the Build Guide. Python users may install pre-built binary wheels for standard hardware configurations using the package installer for Python, taking care to choose the correct CUDA version. See Getting Started for more details.

pip install vortex-oct-cuda12x vortex-oct-tools --extra-index-url https://vortex-oct.dev/stable
Version Status C++ Source Python Binary Wheels Links
CUDA Windows (10, 11) Linux (Ubuntu 20.04+)
v0.5.0
1/25/2025
12 Documentation
Release Notes
11
10.2
v0.4.3
6/30/2022
11.6 Documentation
Release Notes
11.2
10.2
v0.4.2
3/3/2022
11.2 Documentation
Release Notes
10.2
v0.4.1
1/22/2022
11.2 Documentation
Release Notes
10.2

= latest release for starting new projects

= latest maintenance release to support existing projects

Citation

Please use the following citation for vortex if you found it useful in your research.

@misc{Vortex,
    author = {Mark Draelos},
    year   = {2022},
    url    = {https://www.vortex-oct.dev/},
    title  = {Vortex -- An open-source library for building real-time {OCT} engines in {C++} or {Python}}
}

Download the citation in BibTex or RIS format. Check back later as this citation will likely change in the future.

Contact

Interested in learning more or have a question?

Complete the form below to send us a message.