Source code for deepmr.bloch.ops._adc_op
"""
EPG signal recording operator.
Can be used to record signal during simulation.
"""
__all__ = ["observe", "susceptibility", "t1sat"]
import torch
[docs]def observe(states, phi=None):
"""
Store observable magnetization.
Parameters
----------
states : dict
Input states matrix for free pools.
phi : torch.Tensor
Effective phase for signal demodulation.
Returns
-------
signal : torch.Tensor
Net observable magnetization at current timepoint.
"""
# parse
F = states["F"] # (nstates, nlocs, npools, 3)
# get transverse magnetization
mxy = F[0, ..., 0] # (nlocs, npools)
# demodulate
if phi is not None:
mxy = mxy * torch.exp(-1j * phi)
# sum across pools
mxy = mxy.sum(axis=-1).mean(axis=-1)
return mxy
[docs]def susceptibility(signal, time, z):
r"""
Apply static susceptibility effects (bulk decay and dephasing).
Parameters
----------
signal : torch.Tensor
Net observable magnetization.
time : torch.Tensor
Effective phase for signal demodulation.
z torch.Tensor
Complex field ``R2* + 1j $\Delta$ B0``.
Returns
-------
signal : torch.Tensor
Damped and dephased net observable magnetization.
"""
if time.shape[-1] != 1: # multiecho
if signal.shape[-1] != time.shape[-1]: # assume echo must be broadcasted
signal = [..., None]
# apply effect
if time.shape[-1] == 1 and time != 0:
signal = signal.clone() * torch.exp(-time * (z[..., 0] + 1j * z[..., 1]))
return signal
[docs]def t1sat(signal, time, t1):
"""
Apply t1 saturation effect.
Parameters
----------
signal : torch.Tensor
Net observable magnetization.
time : torch.Tensor
Effective phase for signal demodulation.
t1 : torch.Tensor
Longitudinal magnetization time.
Returns
-------
signal : torch.Tensor
Saturated net observable magnetization.
"""
if time.shape[-1] != 1: # multiecho
if signal.shape[-1] != time.shape[-1]: # assume echo must be broadcasted
signal = [..., None]
# apply effect
if time.shape[-1] == 1 and time != 0:
E1 = torch.exp(-time / (t1 + 0.000000000000001))
signal = signal.clone() * (1 - E1) / (1 - signal.clone() * E1)
return signal