Source code for deepmr.bloch.ops._gradient_op
"""
EPG Gradient operators.
Can be used to simulate dephasing due spoiling gradient
and perfect crushing (i.e. after prep pulse or refocus pulse).
"""
__all__ = ["Shift", "Spoil"]
import torch
from ._abstract_op import Operator
[docs]class Shift(Operator):
"""
Perform shift operator corrsesponding to a 2npi dephasing of the magnetization.
Parameters
----------
states : dict
Input states matrix for free pools.
Returns
-------
states : dict
Output states matrix for free pools.
"""
def apply(self, states):
"""Apply states shifting."""
# parse
F = states["F"]
# apply
F[..., 0] = torch.roll(F[..., 0], 1, -3) # Shift Fp states
F[..., 1] = torch.roll(F[..., 1], -1, -3) # Shift Fm states
F[-1, ..., 1] = 0.0 # Zero highest Fm state
F[0, ..., 0] = F[0, ..., 1].conj() # Fill in lowest Fp state
# prepare for output
states["F"] = F
return states
[docs]class Spoil(Operator):
"""
Non-physical spoiling operator that zeros all transverse states.
Parameters
----------
states : dict
Input states matrix for free pools.
Returns
-------
states : dict
Output states matrix for free pools.
"""
def apply(self, states):
"""Destroy transverse magnetization."""
# parse
F = states["F"]
# apply
F[..., 0] = 0.0
F[..., 1] = 0.0
# prepare for output
states["F"] = F
return states