linop.WaveSense#
- bartorch.linop.WaveSense()#
Wave-CAIPI encoding operator.
The gradients played during the readout spread each voxel along it. That spreading is a multiplication by a point spread function between the readout transform and the phase-encode transforms, so the encoding is the chain
src/wave.cbuilds:Sampling . FFT(phase) . Diagonal(psf) . FFT(readout) . Resize . Coils(maps)Everything after the sensitivities runs in the coil-slab loop, so only the image and the samples cross to the device when the operands are on the host.
The point spread function is supplied through
psf, or constructed from the gradient waveform: a sine wave along y and, in 3D, a cosine wave along z, as BART’swavepsfgenerates them andfmaccombines them.With a temporal basis this is Wave-Shuffling: the same encoding applied to coefficient images, with the basis mapping coefficients to acquired frames and the pattern or positions selecting samples.
- Parameters:
sensitivities (tensor) – Coil sensitivities
([batch, sets,] coils, [z,] y, x), or their k-space kernels withkernels=True.image_shape (tuple of int) – The image,
(*batches, [batch,] [sets,] [coeffs,] [z,] y, x), before the readout is oversampled. The samples are(*batches, coils, [frames,] [z,] y, readout).readout (int) – Length of the oversampled readout,
wxin BART’s sources. At least the readout the image has.pattern (tensor, default=None) – Binary sampling mask, one at acquired positions and zero elsewhere, broadcast over one coil’s samples
([frames,] [z,] y, readout).centred (bool, default=False) – Centre the two transforms, making them unitary. The default follows BART’s
wave, which leaves them uncentred and unnormalized;wshflcentres them for its calibration path.psf (tensor, default=None) – The point-spread function on the oversampled grid, broadcast over one coil’s samples
([z,] y, readout); the same for every frame. Give it or the gradient wave below.max_grad (float, default=None) – The largest gradient amplitude in G/cm and slew rate in G/cm/s the wave may use. The wave takes the larger amplitude either allows.
max_slew (float, default=None) – The largest gradient amplitude in G/cm and slew rate in G/cm/s the wave may use. The wave takes the larger amplitude either allows.
cycles (int, default=None) – Sine cycles over the readout.
adc (float, default=None) – Readout duration in milliseconds, on a 10 µs gradient raster.
resolution (float or tuple of float, default=None) – Voxel size in cm along the phase encodes, one value or
(z, y).offset (float or tuple of float, default=0.0) – How far the field of view’s centre is from the isocentre along the phase encodes, in cm, one value or
(z, y).delay (float or tuple of float, default=0.0) – How much later than nominal each wave runs, in milliseconds, one value or
(z, y).scale (float or tuple of float, default=1.0) – How much stronger than nominal each wave is, one value or
(z, y).positions (tensor, default=None) – Instead of a pattern, the acquired phase encodes, as for
CartesianSense():([frames,] shots, d)with(y,)in 2D,(z, y)in 3D and-1for padding. The samples are then(*batches, coils, [frames,] shots, readout), the oversampled readout along each.basis (tensor, default=None) – Temporal subspace basis
(coeffs, frames).toeplitz (bool, default=True) – Apply the normal in closed form rather than as the forward and adjoint applications: one coefficient-by-coefficient kernel between the phase-encode transforms, with the point spread function on either side. A pattern varying along the readout has no such form and keeps the two applications.
kernels (bool, default=False) – Read
sensitivitiesas k-space kernels rather than maps.coil_batch (int, default=1) – Coils applied at once; 0 applies every coil together.
device (device, default=None) – Where the operator is built and does its arithmetic.
ndim (int, default=None) – Number of spatial axes, where the sensitivities and the image do not determine it: a bank of four kernel axes is either three behind the coils or two behind sets and coils.
Examples
>>> A = WaveSense(maps, (z, y, x), readout=3 * x, pattern=mask, ... max_grad=2.7, max_slew=18700.0, cycles=5, adc=5.0688, ... resolution=(0.1, 0.1)) >>> A.oshape (coils, z, y, 3 * x)