bartorch.linop.WaveSense

Contents

bartorch.linop.WaveSense#

bartorch.linop.WaveSense(sensitivities, psf, image_shape, readout, pattern=None, centred=False, *, basis=None, toeplitz=True, kernels=False, coil_batch=1, device=None)#

Wave-CAIPI encoding, as BART’s wave builds it.

The gradients that run during the readout spread each voxel along it, and the spreading is a multiplication by a point-spread function between the readout transform and the phase-encode ones. So the encoding is six operators in a row, which is what src/wave.c chains:

Sampling . FFT(phase) . Diagonal(psf) . FFT(readout) . Resize . Coils(maps)

and every one of them is BART’s, so the result is a single BART operator with an adjoint and a normal of its own.

The coils go on through Coils rather than a plain fmac, which is what lets the sensitivities be held as the k-space kernels nlinv produces and inflated a slab at a time, exactly as NoncartesianSense holds them.

With a basis this is Wave-Shuffling: the same encoding over coefficient images, the basis contracting them into frames, the pattern keeping the samples.

Parameters:
  • sensitivities (tensor) – Coil sensitivities, (coils, *spatial), or their k-space kernels with kernels=True.

  • psf (tensor) – The wave point-spread function on the oversampled grid, broadcast over the axes it has one of. bartorch.tools.wavepsf() makes one from the gradient waveform.

  • image_shape (tuple of int) – Coil-image shape, (coils, *spatial), before the readout is oversampled.

  • readout (int) – Length of the oversampled readout, wx in BART’s sources. At least the readout the image has.

  • pattern (tensor, optional) – Ones where a sample was taken, on the oversampled grid.

  • centred (bool) – Centre the two transforms. BART’s wave leaves them uncentred and this follows it; wshfl centres them for its calibration path.

  • basis (tensor, optional) – Temporal subspace basis (coeffs, frames, 1, ...).

  • toeplitz (bool) – With a basis, apply the normal as one coefficient-by-coefficient kernel rather than as the two applications. The kernel goes where the sampling goes – after the phase-encode transforms, on the oversampled grid – and is the same one CartesianSense() builds.

  • kernels (bool) – Read sensitivities as k-space kernels.

  • coil_batch (int) – Coils applied at once; 0 uses BART’s own fmac over all of them, which is what this operator did before it had a choice.

  • device (device, optional) – Where the coil multiply is built.

Examples

>>> psf = bartorch.tools.wavepsf(...)
>>> A = WaveSense(maps, psf, (coils, y, x), readout=2 * x, pattern=mask)