Skip to content

pcSENSE

template <typename T1> class pcSENSE

Phase-corrected multi-shot SENSE operator.

Extends the standard SENSE model with per-shot phase maps to correct for inter-shot phase inconsistencies in multi-shot non-Cartesian acquisitions. Uses a per-shot Gdft encoding operator to handle arbitrary trajectories.

The per-shot phase-corrected forward model is:

\[\mathbf{d}_{c,s} = G_s(P_s \circ S_c \circ \mathbf{x})\]

where \(P_s = e^{i\phi_s(\mathbf{r})}\) is the shot-specific phase map for shot \(s\), and \(G_s\) is the encoding operator for that shot's k-space trajectory.

Forward (per coil, per shot):

graph LR
    X["$$\mathbf{x}$$"] --> P["$$P_s \circ \mathbf{x}$$"]
    P --> S["$$S_c \circ$$"]
    S --> G["$$G_s$$"]
    G --> D["$$\mathbf{d}_{c,s}$$"]

Adjoint (combine all coils and shots):

graph RL
    D["$$\mathbf{d}_{c,s}$$"] --> GH["$$G_s^H$$"]
    GH --> SC["$$S_c^* \circ$$"]
    SC --> PC["$$P_s^* \circ$$"]
    PC --> SUM["$$\sum_{c,s}$$"]
    SUM --> XH["$$\hat{\mathbf{x}}$$"]

The adjoint sums over all coils and shots:

\[\hat{\mathbf{x}} = \sum_{s=1}^{N_s} \sum_{c=1}^{N_c} P_s^* \circ S_c^* \circ (G_s^H \mathbf{d}_{c,s})\]

Unlike SENSE, which assumes a single k-space trajectory for all data, pcSENSE handles multi-shot acquisitions (e.g., diffusion-weighted imaging) where each shot has a different \(B_0\)-induced phase error. This is essential for techniques such as navigated multi-shot DWI with non-Cartesian sampling.

// Per-shot k-space coordinates concatenated, readout times, maps
pcSENSE<float> P(kx, ky, kz, Nx, Ny, Nz, nc, tvec,
                  SENSEmap, fieldMap, shotPhaseMap);
Col<cx_float> kdata  = P * image;   // forward
Col<cx_float> recon  = P / kdata;   // adjoint

See : Liu, Moseley & Bammer, "Simultaneous phase correction and SENSE reconstruction for navigated multi-shot DWI with non-cartesian k-space sampling," MRM, 2005. https://doi.org/10.1002/mrm.20706

See : Holtrop & Sutton, "High spatial resolution diffusion weighted imaging on clinical 3T MRI scanners using multislab spiral acquisitions," J Med Imaging, 2016. https://doi.org/10.1117/1.JMI.3.2.023501

See : SENSE

See : pcSenseTimeSeg

T1 : Floating-point precision type (float or double).

Variables

Name Description
SMap Number of k-space samples per shot.
conjSMap Conjugate sensitivity maps, size Ni x Nc.
PMap Per-shot phase maps in radians, size Ni x Ns.
expiPMap Complex exponential of phase maps (exp(i*PMap)), size Ni x Ns.
conjExpiPMap Conjugate complex exponential of phase maps (exp(-i*PMap)), size Ni x Ns.
FMap Off-resonance field map (rad/s), length Ni.
Kx k-space x-coordinates matrix, size (samples/shot) x Ns.
Ky k-space y-coordinates matrix, size (samples/shot) x Ns.
Kz k-space z-coordinates matrix, size (samples/shot) x Ns.
Tvec Readout time vector (s), size (samples/shot) x Ns.
Nx Image size in x.
Ny Image size in y.
Nz Image size in z.
Ix Image-space x-coordinates, length Ni.
Iy Image-space y-coordinates, length Ni.
Iz Image-space z-coordinates, length Ni.
i Imaginary unit constant for phase computations.
type Interpolation type: 1 = Hanning, 2 = exact min-max.
L Number of time segments for field-map correction.

Operators

Name Description
operator* Forward phase-corrected SENSE transform: image -> k-space. d : Input image vector of length Ni. Return : Stacked k-space vector of length NdNsNc.
operator/ Adjoint phase-corrected SENSE transform: k-space -> image. d : Input k-space vector of length NdNsNc. Return : Output image vector of length Ni.
operator* Forward phase-corrected SENSE transform (forgeCol overload for Metal path).
operator/ Adjoint phase-corrected SENSE transform (forgeCol overload for Metal path).

Functions

Name Description
pcSENSE Default constructor.
~pcSENSE Destructor — frees per-shot Gdft encoding operator array.
pcSENSE Array of per-shot encoding operator pointers.

Variable Details

FMap

Col<T1> FMap

Off-resonance field map (rad/s), length Ni.

Ix

Col<T1> Ix

Image-space x-coordinates, length Ni.

Iy

Col<T1> Iy

Image-space y-coordinates, length Ni.

Iz

Col<T1> Iz

Image-space z-coordinates, length Ni.

Kx

Mat<T1> Kx

k-space x-coordinates matrix, size (samples/shot) x Ns.

Ky

Mat<T1> Ky

k-space y-coordinates matrix, size (samples/shot) x Ns.

Kz

Mat<T1> Kz

k-space z-coordinates matrix, size (samples/shot) x Ns.

L

uword L

Number of time segments for field-map correction.

Nx

uword Nx

Image size in x.

Ny

uword Ny

Image size in y.

Nz

uword Nz

Image size in z.

PMap

Mat<T1> PMap

Per-shot phase maps in radians, size Ni x Ns.

SMap

forgeMat<forgeComplex<T1>> SMap

Number of k-space samples per shot.
Number of image pixels.
Number of receiver coils.
Number of shots.
Coil sensitivity maps, size Ni x Nc (single source of truth, GPU-ready).

Tvec

Mat<T1> Tvec

Readout time vector (s), size (samples/shot) x Ns.

conjExpiPMap

forgeMat<forgeComplex<T1>> conjExpiPMap

Conjugate complex exponential of phase maps (exp(-i*PMap)), size Ni x Ns.

conjSMap

forgeMat<forgeComplex<T1>> conjSMap

Conjugate sensitivity maps, size Ni x Nc.

expiPMap

forgeMat<forgeComplex<T1>> expiPMap

Complex exponential of phase maps (exp(i*PMap)), size Ni x Ns.

i

CxT1 i

Imaginary unit constant for phase computations.

type

uword type

Interpolation type: 1 = Hanning, 2 = exact min-max.

Operator Details

operator*

Col<CxT1> operator*(const Col<CxT1>& d) const

Forward phase-corrected SENSE transform: image -> k-space.

d : Input image vector of length Ni.

Return : Stacked k-space vector of length NdNsNc.

forgeCol<forgeComplex<T1>> operator*(const forgeCol<forgeComplex<T1>>& d) const

Forward phase-corrected SENSE transform (forgeCol overload for Metal path).

d : Input image vector of length Ni.

Return : Stacked k-space vector of length NdNsNc.

operator/

Col<CxT1> operator/(const Col<CxT1>& d) const

Adjoint phase-corrected SENSE transform: k-space -> image.

d : Input k-space vector of length NdNsNc.

Return : Output image vector of length Ni.

forgeCol<forgeComplex<T1>> operator/(const forgeCol<forgeComplex<T1>>& d) const

Adjoint phase-corrected SENSE transform (forgeCol overload for Metal path).

d : Input k-space vector of length NdNsNc.

Return : Output image vector of length Ni.

Function Details

pcSENSE

pcSENSE()

Default constructor.

pcSENSE(Col<T1> kx, Col<T1> ky, Col<T1> kz, uword nx, uword ny, uword nz, uword nc, Col<T1> t, Col<CxT1> SENSEmap, Col<T1> FieldMap, Col<T1> ShotPhaseMap)

Array of per-shot encoding operator pointers.
Construct a phase-corrected SENSE operator.

kx : k-space x-coordinates (all shots concatenated), length Nd*Ns.

ky : k-space y-coordinates, length Nd*Ns.

kz : k-space z-coordinates, length Nd*Ns.

nx : Image size in x.

ny : Image size in y.

nz : Image size in z.

nc : Number of receiver coils.

t : Per-sample readout time vector (s), length Nd*Ns.

SENSEmap : Sensitivity maps as flat vector, length Ni*Nc.

FieldMap : Off-resonance field map (rad/s), length Ni.

ShotPhaseMap : Per-shot phase maps in radians, length Ni*Ns.

~pcSENSE

~pcSENSE()

Destructor — frees per-shot Gdft encoding operator array.