Source code for monalisa.geometry._volume_element_full_radial3

"""Port of src/geom3/bmVolumeElement_full_radial3.m."""

import numpy as np

from monalisa._mat import fix, msize
from monalisa.geometry._volume_element1 import volume_element1
from monalisa.trajectory._traj_line_direction import traj_line_direction
from monalisa.trajectory._traj_line_reshape import traj_line_reshape
from monalisa.trajectory._traj_squared_norm import traj_squared_norm


[docs] def volume_element_full_radial3(t): """Volume elements of a 3D full-radial trajectory assuming uniformly spread lines.""" if msize(t, 1) != 3: raise ValueError("The trajectory must be 3Dim. ") t = traj_line_reshape(t) N, nLine = msize(t, 2), msize(t, 3) t3 = np.reshape(t, (3, N, nLine), order="F") e = np.reshape(traj_line_direction(t), (3, nLine), order="F") if (N / 2 - fix(N / 2)) > 0: raise ValueError( "The number of points per line must be even, because the 0 must be at index position N/2+1" ) dr = np.zeros((N, nLine)) for i in range(nLine): dr[:, i] = t3[:, :, i].T @ e[:, i] dr = volume_element1(dr) ds = np.reshape(4 * np.pi * traj_squared_norm(t) / (2 * nLine), (N, nLine), order="F") v = (np.ravel(dr, order="F") * np.ravel(ds, order="F"))[None, :] dr_0 = np.mean(dr[N // 2, :]) / 2 v[0, N // 2 :: N] = (4 / 3) * np.pi * dr_0**3 / (2 * nLine) return v