nenuscanner/utils/sphere_deprojection.py

24 lines
932 B
Python

import numpy as np
import utils.vector_utils as vector_utils
def deproject_ellipse_to_sphere(M, radius):
"""finds the deprojection of an ellipse to a sphere
Args:
M (Array 3,3): Ellipse quadratic form
radius (float): radius of the researched sphere
Returns:
Array 3: solution of sphere centre location
"""
H = 0.5*(np.swapaxes(M,-1,-2)+M)
eigval, eigvec = np.linalg.eigh(H)
i_unique = np.argmax(np.abs(np.median(eigval,axis=-1,keepdims=True)-eigval),axis=-1)
unique_eigval = np.take_along_axis(eigval,i_unique[...,None],-1)[...,0]
unique_eigvec = np.take_along_axis(eigvec,i_unique[...,None,None],-1)[...,0]
double_eigval = 0.5*(np.sum(eigval,axis=-1)-unique_eigval)
z_sign = np.sign(unique_eigvec[...,-1])
dist = np.sqrt(1-double_eigval/unique_eigval)
C = np.real(radius*(dist*z_sign)[...,None]*vector_utils.norm_vector(unique_eigvec)[1])
return C