Changelog¶

This changelog is for the main branch. It lists the changes in each release, with the pull request and author of each change. Changes merged since the last release are listed under Current; to add one, see 6. Log your changes in the contributing guide. Older releases are also on GitHub Releases.

Current¶

New Features¶

  • An interactive beamforming grid viewer in Parameters that shows how the grid parameters relate (#679 by @wesselvannierop)

  • grid_apex, derived from the probe and transmits, is the point a polar grid fans out from: where steered focused lines meet, a diverging wave’s virtual source, or a curved array’s centre of curvature. It replaces distance_to_apex (#679 by @wesselvannierop)

  • polar_margin and elevation_margin set a fixed margin around the derived polar_limits and elevation_limits (#679 by @wesselvannierop)

Changed¶

  • (Breaking) Angle parameters use one set of names from the grid through scan conversion, in 2D and 3D: rlims, polar_limits and elevation_limits (see Angle and radius names). rho_range / theta_range / phi_range, azimuth_limits, the frustum_convert_* functions and the phi_ / theta_ / rho_ arguments of plot_frustum_vertices are renamed, with deprecated aliases. The polar/cartesian helpers now measure angles toward +x, like the rest of zea (#679 by @wesselvannierop)

  • (Breaking) zea.ops.ScanConvert outputs are renamed without aliases: rho_range / theta_range / phi_range / d_rho / d_theta / d_phi become rlims / polar_limits / elevation_limits / dr / d_polar / d_elevation (#679 by @wesselvannierop)

  • (Breaking) The default pixel grid follows the probe and transmit geometry, so beamformed images change. polar_limits cover the region the transmits insonify at zlims[1] instead of adding a fixed 15 % margin, and xlims, grid_size_x (λ/4 along the outer arc) and extent follow the sector or insonified width. Scan conversion fills extent (#679 by @wesselvannierop)

  • (Breaking) The default f_number is derived from the element’s −6 dB directivity, which is 0 (no receive mask) for typical phased arrays (#679 by @wesselvannierop)

Fixed¶

  • Scanline grids follow the transmit angles from grid_apex, so steered lines are no longer displayed at the wrong angle (#679 by @wesselvannierop)

  • The default grid for an unsteered plane wave on a curved array spans the array, instead of a zero-width sector (#679 by @wesselvannierop)

  • Conversion of elevation-steered Verasonics data: polar_angles and azimuth_angles now hold the spherical transmit angles converted from TX.Steer, where azimuth_angles used to hold the elevation steering angle (#679 by @wesselvannierop)

  • The default elevation_limits (and so ylims) of a 3D grid are the transmits’ elevation angles, where before the range of the spherical azimuth_angles φ was used as if it were an elevation angle (#679 by @wesselvannierop)

v0.1.9 (2026-11-10)¶

New Features¶

Changed¶

  • Streaming hf:// datasets no longer runs into the Hugging Face rate limit, so you can train on many batches with many workers without downloading the data. The API is unchanged; two new environment variables, ZEA_MAX_CONCURRENT_REQUESTS and ZEA_FIND_H5_SHAPES_WORKERS, tune it (see Environment variables) (#671 by @tristan-deep)

  • Conversion scripts for EchoNet-Dynamic, CAMUS and PICMUS accept the .zip file itself. EchoNet-Dynamic reproduces the published split by default, and its polar conversion is about 15 times faster (#676 by @wesselvannierop)

  • (Breaking) In compute_pfield(), alpha and percentile also shape the field when norm=False, the unused n_el argument is removed, and probes other than linear and phased arrays raise NotImplementedError (#657 by @wesselvannierop)

  • (Breaking) zea.func.vmap() validates axes like jax.vmap, so a list no longer matches a tuple. out_axes=None only works on the native jax.vmap, and the _use_torch_vmap argument is removed (#692 by @wesselvannierop)

  • Parameters.copy() and set_transmits are much faster (#656 by @wesselvannierop)

  • (Breaking) The check on cartesian beamforming grids uses per-axis limits from the image’s k-space support instead of λ/2, see How fine should the beamforming grid be?. Auto-sized grids get one more pixel per axis (#673 by @wesselvannierop)

  • The default probe_bandwidth_percent is 100 instead of 200, which also narrows the band used by compute_pfield() (#644 by @tristan-deep)

Fixed¶

  • A streamed hf:// read that still fails after its retries, such as a dropped connection, no longer ends the epoch: the Dataloader reopens the file and reads the sample again (#690 by @tristan-deep)

  • zea.func.vmap() passes arguments at the right positions with multiple None arguments. It also keeps all outputs, supports nested and None outputs, supports negative axes when batching, and raises an error for arguments of different lengths (#691 by @wesselvannierop)

  • The pressure field uses the one-way transmit spectrum, averages over frequencies instead of summing, and takes the element positions from probe_geometry (#657 by @wesselvannierop)

  • t_peak estimated from waveforms_two_way uses the envelope peak; values change where the carrier peak differs from it (#656 by @wesselvannierop)

  • Conversion of Verasonics BS100BW and BS50BW data samples I and Q at the same time instants. Data converted with earlier versions, such as some Open-H-RF data, may be affected (#672 by @vincentvdschaft)

  • zea.ops.Normalize clips its output instead of its input, so results stay within output_range (#681 by @wesselvannierop)

  • waveforms_one_way and waveforms_two_way follow selected_transmits, like the other per-transmit parameters (#683 by @wesselvannierop)

  • Operations and pipelines can be deep-copied and pickled, also when not registered with Keras, and copies keep their JIT settings (#698 by @tristan-deep)

  • The shared GIF palette keeps exact colors, so pure black stays (0, 0, 0) (#680 by @wesselvannierop)

  • Deriving xlims on a GPU with the torch backend (#661 by @tristan-deep)

  • Jitted ops on the torch backend in the Docker images, which lacked a C++ compiler (#658 by @wesselvannierop)

  • zea app and load_model_from_hf download to the zea cache instead of the Hugging Face cache (#689 by @Louisvh)

  • @cache_output functions that call a recursive function can now be cached. Additionally, the cache key now also includes other @cache_output functions it calls, so editing those invalidates its cache (#703 by @wesselvannierop)

v0.1.8 (2026-10-01)¶

New Features¶

  • Pipeline configs can declare the modules that define their custom operations, under pipeline: imports: or with zea process --import (#633 by @tristan-deep)

Changed¶

  • zea app is more robust and easier to use, with a reworked UI. Mistyped paths are normalized, configs are auto-detected and file metadata loads with a progress bar (#642 by @tristan-deep)

Fixed¶

v0.1.7 (2026-09-21)¶

New Features¶

  • Conversion script for us4us (ARRUS + gui4us) data. Try it with zea convert us4us --help (#611 by @tristan-deep)

  • zea process supports --save-as png (#626 by @tristan-deep)

  • zea.File accepts receive sub-apertures (fewer receive channels than probe elements), defined in scan.rx_aperture_indices, with the matching parameters.rx_aperture_indices and parameters.n_rx (#615 by @tristan-deep)

Changed¶

  • zea data file operations stream large files in batches instead of loading the whole file into memory (#620 by @tristan-deep)

Fixed¶

  • Demodulation pads the signal, so the analytic-signal transform no longer wraps echoes around to the first depth samples (#629 by @Felixduelmer)

  • Streaming hf:// files no longer requires Hugging Face authentication, and uses your token when you are logged in (#625 by @Felixduelmer)

v0.1.6 (2026-09-11)¶

New Features¶

Changed¶

Fixed¶

v0.1.5 (2026-08-16)¶

New Features¶

Changed¶

  • (Breaking) Python 3.10 is no longer supported; zea requires Python 3.11 or newer. Users on Python 3.10 should stay on zea<=0.1.4 (#534 by @tristan-deep)

  • (Breaking) sample() and posterior_sample() of the zea.models.generative models both work on (n_samples, *input_shape). posterior_sample() used to work on (batch_size, n_samples, *input_shape); use zea.func.vmap() for batches (#555 by @wesselvannierop)

  • The DAS beamformer is up to 2 times faster and DMAS up to 10 times (#489 by @Louisvh)

  • Efficient chunking, introduced for raw_data in v0.1.3, also applies to images, maps and small metadata arrays (#535 by @wesselvannierop)

  • The Docker images are fully installed with uv (#546 by @wesselvannierop)

Fixed¶

v0.1.4 (2026-07-23)¶

New Features¶

Changed¶

Fixed¶

  • With h5py>=3.16 installed, v0.1.3 wrote .hdf5 files in the HDF5 2.0 format, which older h5py/HDF5 installs cannot open. The write format is now capped, so files open with old and new installs alike. Fix files saved with v0.1.3 with zea data resave old_file.hdf5 new_file.hdf5, or read them with h5py>=3.16 (#520 by @tristan-deep)

v0.1.3 (2026-07-17)¶

New Features¶

Changed¶

Fixed¶

v0.1.2 (2026-07-09)¶

New Features¶

Changed¶

  • The zea CLI is split into zea data, zea process and zea app. Try it with zea --help (#477 by @wesselvannierop)

Fixed¶

v0.1.1 (2026-06-25)¶

Changed¶

v0.1.0 (2026-06-22)¶

The first release with the new zea file format, designed for the OpenH-RF initiative. This section condenses the pre-releases v0.1.0a0 to v0.1.0a5; their release notes have the details.

New Features¶

Changed¶

  • (Breaking) zea.Scan is renamed to zea.Parameters. Load all parameters with zea.File.load_parameters() and pass them to a pipeline with pipeline.prepare_parameters(parameters). probe.center_frequency is renamed to probe.probe_center_frequency, and names in scan and probe must not overlap (#392 by @wesselvannierop)

  • (Breaking) zea.Interface is removed in favor of the zea process CLI (#416 by @tristan-deep)

  • (Breaking) zea.File.create no longer returns an open file, and probe.probe_geometry is required to save data/raw_data (#411 by @wesselvannierop)

  • (Breaking) data/image_sc is no longer a standard field, as images carry their coordinates (#439 by @swpenninga)

  • (Breaking) generate_zea_dataset is removed (#443 by @swpenninga)

  • data/raw_data can be stored as int16; add zea.ops.Cast(dtype="float32") at the start of a pipeline to avoid dtype errors (#307 by @tristan-deep)

  • The default compression is lzf instead of gzip (#399 by @tristan-deep)

  • Deprecate probe_name in favor of the probe group (#379 by @tristan-deep)

  • Fewer and more relevant warnings when saving and loading files (#395 and #444 by @tristan-deep, #443 by @swpenninga)

  • Config validation is redesigned (#412 by @swpenninga)

  • Faster pressure field computation (#267 by @wesselvannierop)

  • zea is installed and developed with uv instead of Poetry (#425 by @tristan-deep)

Fixed¶