Source code for monalisa.trajectory._traj_format

"""Port of src/traj123/bmTraj_formatTraj.m."""

import numpy as np

from monalisa.array._point_reshape import point_reshape


[docs] def traj_format(argTraj, argData=None, nargout=1): """Merge all k-space center points of a trajectory into a single point. Returns ``formatedTraj`` or ``(formatedTraj, formatedData, formatedIndex, formatedWeight)`` truncated to ``nargout``. ``formatedIndex`` holds 1-based MATLAB indices (as doubles) into ``formatedTraj``. """ argTraj = np.asarray(point_reshape(argTraj)) myDataFlag = argData is not None if argTraj.shape[1] < 2: out = [argTraj, argData if myDataFlag else None, 1.0, 1.0] return out[0] if nargout <= 1 else tuple(out[:nargout]) myEps = 10 * np.finfo(np.float64).eps imDim, nPt = argTraj.shape if myDataFlag: argData = np.asarray(point_reshape(argData)) myNorm = np.zeros(nPt, dtype=argTraj.dtype) for i in range(imDim): myNorm = myNorm + argTraj[i, :] ** 2 myNorm = np.sqrt(myNorm) myCenterMask = myNorm < myEps nPointCenter = int(np.sum(myCenterMask)) if nPointCenter > 0: formatedTraj = np.concatenate( [np.zeros((imDim, 1), dtype=argTraj.dtype), argTraj[:, ~myCenterMask]], axis=1 ) else: formatedTraj = argTraj out = [formatedTraj] if nargout <= 1: return formatedTraj if myDataFlag: if nPointCenter > 0: myCenterData = np.mean(argData[:, myCenterMask], axis=1, keepdims=True) formatedData = np.concatenate([myCenterData, argData[:, ~myCenterMask]], axis=1) else: formatedData = argData out.append(formatedData) else: out.append(None) if nargout > 2: start = 1 if nPointCenter > 0 else 0 idx = start + np.cumsum(~myCenterMask) formatedIndex = np.where(myCenterMask, 1, idx).astype(np.float64)[None, :] test = formatedTraj[:, formatedIndex[0].astype(np.int64) - 1] if np.max(np.abs(test - argTraj)) > myEps: raise RuntimeError("Something went wrong with formatedIndex in 'bmFormatTraj'. ") out.append(formatedIndex) if nargout > 3: formatedWeight = np.ones((1, nPt)) if nPointCenter > 0: formatedWeight[0, myCenterMask] = 1 / nPointCenter out.append(formatedWeight) return tuple(out[:nargout])