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
wavebuilds 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.cchains: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
Coilsrather than a plainfmac, which is what lets the sensitivities be held as the k-space kernelsnlinvproduces and inflated a slab at a time, exactly asNoncartesianSenseholds 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 withkernels=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,
wxin 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
waveleaves them uncentred and this follows it;wshflcentres 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
sensitivitiesas k-space kernels.coil_batch (int) – Coils applied at once; 0 uses BART’s own
fmacover 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)