From e027c9ae13c457b599d647122f7602cad11cc54f Mon Sep 17 00:00:00 2001 From: Sanjib Sharma Date: Wed, 14 Jan 2026 15:49:25 -0500 Subject: [PATCH 1/2] update idl_to_tel and tel_to_idl (x_idl, y_idl) correspond to (y, z) components of the unit vector respectively. --- pysiaf/aperture.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pysiaf/aperture.py b/pysiaf/aperture.py index 1532d2f1..7297ed4d 100644 --- a/pysiaf/aperture.py +++ b/pysiaf/aperture.py @@ -1064,7 +1064,8 @@ def idl_to_tel(self, x_idl, y_idl, V3IdlYAngle_deg=None, V2Ref_arcsec=None, V3Re if input_coordinates == 'cartesian': # define cartesian unit vector as in JWST-PLAN-006166, Section 5.7.1.1 # then apply 3D rotation matrix to tel - unit_vector_idl = rotations.unit_vector_from_cartesian(x=x_idl*u.arcsec, y=y_idl*u.arcsec) + unit_vector_idl = rotations.unit_vector_from_cartesian(y=x_idl*u.arcsec, z=y_idl*u.arcsec) + unit_vector_idl[1] = aperture.VIdlParity * unit_vector_idl[1] if input_coordinates == 'polar': # interpret idl coordinates as spherical, i.e. distortion polynomial includes deprojection @@ -1175,8 +1176,9 @@ def tel_to_idl(self, v2_arcsec, v3_arcsec, V3IdlYAngle_deg=None, V2Ref_arcsec=No unit_vector_idl = np.dot(l_matrix, unit_vector_tel) if output_coordinates == 'cartesian': - x_idl_arcsec, y_idl_arcsec = unit_vector_idl[0] * u.rad.to(u.arcsec), unit_vector_idl[ - 1] * u.rad.to(u.arcsec) + unit_vector_idl[1] = aperture.VIdlParity * unit_vector_idl[1] + x_idl_arcsec, y_idl_arcsec = unit_vector_idl[1] * u.rad.to(u.arcsec), unit_vector_idl[ + 2] * u.rad.to(u.arcsec) elif output_coordinates == 'polar': unit_vector_idl[1] = self.VIdlParity * unit_vector_idl[1] x_idl, y_idl = rotations.polar_angles(unit_vector_idl) @@ -2620,4 +2622,4 @@ class RomanAperture(Aperture): def __init__(self): super(RomanAperture, self).__init__() - self.observatory = 'Roman' \ No newline at end of file + self.observatory = 'Roman' From bac6f932299745d5f392eecfe13dc8b47a7d1eb0 Mon Sep 17 00:00:00 2001 From: Sanjib Sharma Date: Wed, 14 Jan 2026 15:55:32 -0500 Subject: [PATCH 2/2] Update unit_vector_from_cartesian in rotations.py Did not work if any element of x_rad, y_rad, z_rad was zero. --- pysiaf/utils/rotations.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pysiaf/utils/rotations.py b/pysiaf/utils/rotations.py index ee9c84da..676722c1 100755 --- a/pysiaf/utils/rotations.py +++ b/pysiaf/utils/rotations.py @@ -775,11 +775,11 @@ def unit_vector_from_cartesian(x=None, y=None, z=None): z_rad = z # handle array and scalar inputs - if np.array([x_rad]).all() and np.array([y_rad]).all(): + if z is None: unit_vector = np.array([x_rad, y_rad, np.sqrt(1-(x_rad**2+y_rad**2))]) - elif np.array([y_rad]).all() and np.array([z_rad]).all(): + elif x is None: unit_vector = np.array([np.sqrt(1-(y_rad**2+z_rad**2)), y_rad, z_rad]) - elif np.array([x_rad]).all() and np.array([z_rad]).all(): + elif y is None: unit_vector = np.array([x_rad, np.sqrt(1-(x_rad**2+z_rad**2)), z_rad]) if np.any(np.isnan(unit_vector)):