mrpro.operators.models.MultiEchoSpinEcho

class mrpro.operators.models.MultiEchoSpinEcho[source]

Bases: SignalModel[Tensor, Tensor, Tensor, Tensor | None]

Multi-echo spin echo (MESE) signal model.

This model simulates a multi-echo spin echo sequence using the extended phase graph (EPG) formalism.

The sequence consists of an excitation pulse followed by a train of refocusing pulses, each producing a spin echo [Meiboom]:

Excitation    α₁                    α₂
   | --TE/2-- | --TE/2-- | --TE/2-- | --TE/2-- | ...
            Echo 1                Echo 2

When all refocusing flip angles are 180° and relative_b1 = 1, the echo amplitudes follow a pure T2 decay. If the effective flip angles deviate from 180° (reduced flip angles or B1 inhomogeneity), stimulated-echo pathways arise and the signal becomes dependent on both T1 and T2.

References

[Meiboom]

Meiboom S, Gill D. Modified spin-echo method for measuring nuclear relaxation times. Rev Sci Instrum. 1958

__init__(flip_angles: Tensor, rf_phases: Tensor, echo_time: float = 0.02, n_states: int = 32) None[source]

Initialize the multi-echo spin echo signal model.

Parameters:
  • flip_angles (Tensor) – Flip angles of the refocusing pulses in rad. Shape (n_echoes,).

  • rf_phases (Tensor) – RF phases of the refocusing pulses in rad. Shape (n_echoes,).

  • echo_time (float, default: 0.02) – Echo time in seconds.

  • n_states (int, default: 32) – Number of EPG states to simulate. Truncating the number of states speeds up simulation at the cost of accuracy.

__call__(m0: Tensor, t1: Tensor, t2: Tensor, relative_b1: Tensor | None = None) tuple[Tensor][source]

Simulate the multi-echo spin echo signal.

All input tensors are broadcast together to determine the output shape.

Parameters:
  • m0 (Tensor) – Equilibrium magnetization / proton density. Shape (...), for example (*other, coils, z, y, x) or (samples).

  • t1 (Tensor) – Longitudinal (T1) relaxation time in seconds. Shape (...), for example (*other, coils, z, y, x) or`(samples)`.

  • t2 (Tensor) – Transversal (T2) relaxation time in seconds. Shape (...), for example (*other, coils, z, y, x) or (samples).

  • relative_b1 (Tensor | None, default: None) – Relative B1 amplitude scaling factor. If None, no B1 inhomogeneity is applied. Shape (...), for example (*other, coils, z, y, x) or (samples).

Returns:

Simulated multi-echo spin echo signal. Shape (echoes, ...), for example (echoes, *other, coils, z, y, x) or (echoes, samples), where echoes corresponds to the number of refocusing pulses in the echo train.

forward(m0: Tensor, t1: Tensor, t2: Tensor, relative_b1: Tensor | None = None) tuple[Tensor][source]

Apply forward of MESE.

Note

Prefer calling the instance of the MESE as operator(x) over directly calling this method. See this PyTorch discussion.

__add__(other: Operator[Unpack[Tin], Tout]) Operator[Unpack[Tin], Tout][source]
__add__(other: Tensor | complex) Operator[Unpack[Tin], tuple[Unpack[Tin]]]

Operator addition.

Returns lambda x: self(x) + other(x) if other is a operator, lambda x: self(x) + other*x if other is a tensor

__matmul__(other: Operator[Unpack[Tin2], tuple[Unpack[Tin]]] | Operator[Unpack[Tin2], tuple[Tensor, ...]]) Operator[Unpack[Tin2], Tout][source]

Operator composition.

Returns lambda x: self(other(x))

__mul__(other: Tensor | complex) Operator[Unpack[Tin], Tout][source]

Operator multiplication with tensor.

Returns lambda x: self(x*other)

__radd__(other: Tensor | complex) Operator[Unpack[Tin], tuple[Unpack[Tin]]][source]

Operator right addition.

Returns lambda x: other*x + self(x)

__rmul__(other: Tensor | complex) Operator[Unpack[Tin], Tout][source]

Operator multiplication with tensor.

Returns lambda x: other*self(x)