Source code for deepmr.recon.inference.fse
"""FSE T2 mapping fitting routines."""
__all__ = ["fse_fit"]
import numpy as np
import torch
from ... import bloch
from . import solvers
[docs]def fse_fit(input, t2grid, flip, ESP, phases=None):
    """
    Fit T2 from input Fast Spin Echo data.
    Parameters
    ----------
    input : np.ndarray | torch.Tensor
        Input image series of shape (ncontrasts, nz, ny, nx).
    t2grid : Iterable[float]
        T2 grid (start, stop, nsteps) in [ms].
    flip : np.ndarray | torch.Tensor
        Refocusing flip angles in [deg].
    ESP : float
        Echo spacing in [ms].
    phases : np.ndarray | torch.Tensor, optional
        Refocusing pulses phases. The default is 0 * flip.
    Returns
    -------
    m0 : np.ndarray | torch.Tensor
        Proton Density map of shape (nz, ny, nx).
    t2map : np.ndarray | torch.Tensor
        T2 map of shape (nz, ny, nx) in [ms].
    """
    if isinstance(input, torch.Tensor):
        istorch = True
        device = input.device
        input = input.numpy(force=True)
    else:
        istorch = False
    # default
    if phases is None:
        phases = 0.0 * flip
    # first build grid
    t2lut = np.linspace(t2grid[0], t2grid[1], t2grid[2])
    t1 = 1100.0
    # build dictionary
    atoms = bloch.fse(flip, phases, ESP, t1, t2lut)
    blochdict = solvers.BlochDictionary(atoms, t2lut[:, None], ["T2"])
    # perform matching
    m0, maps = solvers.tsmi2map(blochdict, input)
    # here, we only have T2
    t2map = maps["T2"]
    # cast back
    if istorch:
        m0 = torch.as_tensor(m0, device=device)
        t2map = torch.as_tensor(t2map, device=device)
    return m0, t2map