def from_equatorial(equatorial_coo, fixed_frame): assert equatorial_coo.body == fixed_frame.body r = equatorial_coo.data.xyz v = equatorial_coo.data.differentials["s"].d_xyz ra, dec, W = fixed_frame.rot_elements_at_epoch(equatorial_coo.obstime) icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel( equatorial_coo.body.name, time=equatorial_coo.obstime) r_trans1 = r - icrs_frame_pos_coord.xyz r_trans2 = transform_vector(r_trans1, (90 * u.deg + ra), "z") r_f = transform_vector(r_trans2, (90 * u.deg - dec), "x") v_trans1 = v - icrs_frame_vel_coord.xyz v_trans2 = transform_vector(v_trans1, (90 * u.deg + ra), "z") v_f = transform_vector(v_trans2, (90 * u.deg - dec), "x") r_f = transform_vector(r_f, W, "z") v_f = transform_vector(v_f, W, "z") data = CartesianRepresentation( r_f, differentials=CartesianDifferential(v_f)) return fixed_frame.realize_frame(data)
def to_equatorial(fixed_coo, equatorial_frame): # TODO replace w/ something smart (Sun/Earth special cased) # assert fixed_coo.body == equatorial_frame.body r = fixed_coo.cartesian.xyz ra, dec, W = fixed_coo.rot_elements_at_epoch(fixed_coo.obstime) equatorial_frame._obstime = fixed_coo.obstime r = transform_vector(r, -W, "z") r_trans1 = transform_vector(r, -(90 * u.deg - dec), "x") r_f = transform_vector(r_trans1, -(90 * u.deg + ra), "z") if fixed_coo.data.differentials: v = fixed_coo.differentials["s"].d_xyz v = transform_vector(v, -W, "z") v_trans1 = transform_vector(v, -(90 * u.deg - dec), "x") v_f = transform_vector(v_trans1, -(90 * u.deg + ra), "z") data = CartesianRepresentation( r_f, differentials=CartesianDifferential(v_f)) else: data = CartesianRepresentation(r_f) return equatorial_frame.realize_frame(data)
def to_equatorial(fixed_coo, equatorial_frame): assert fixed_coo.body == equatorial_frame.body r = fixed_coo.data.xyz v = fixed_coo.data.differentials["s"].d_xyz ra, dec, W = fixed_coo.rot_elements_at_epoch(fixed_coo.obstime) r = transform_vector(r, -W, "z") v = transform_vector(v, -W, "z") r_trans1 = transform_vector(r, -(90 * u.deg - dec), "x") r_trans2 = transform_vector(r_trans1, -(90 * u.deg + ra), "z") v_trans1 = transform_vector(v, -(90 * u.deg - dec), "x") v_trans2 = transform_vector(v_trans1, -(90 * u.deg + ra), "z") icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel( fixed_coo.body.name, time=fixed_coo.obstime) r_f = icrs_frame_pos_coord.xyz + r_trans2 v_f = icrs_frame_vel_coord.xyz + v_trans2 data = CartesianRepresentation( r_f, differentials=CartesianDifferential(v_f)) return equatorial_frame.realize_frame(data)
def body_centered_to_icrs(r, v, source_body, epoch=J2000, rotate_meridian=False): """Converts position and velocity body-centered frame to ICRS. Parameters ---------- r : ~astropy.units.Quantity Position vector in a body-centered reference frame. v : ~astropy.units.Quantity Velocity vector in a body-centered reference frame. source_body : Body Source body. epoch : ~astropy.time.Time, optional Epoch, default to J2000. rotate_meridian : bool, optional Whether to apply the rotation of the meridian too, default to False. Returns ------- r, v : tuple (~astropy.units.Quantity) Position and velocity vectors in ICRS. """ ra, dec, W = source_body.rot_elements_at_epoch(epoch) if rotate_meridian: r = transform_vector(r, -W, 'z') v = transform_vector(v, -W, 'z') r_trans1 = transform_vector(r, -(90 * u.deg - dec), 'x') r_trans2 = transform_vector(r_trans1, -(90 * u.deg + ra), 'z') v_trans1 = transform_vector(v, -(90 * u.deg - dec), 'x') v_trans2 = transform_vector(v_trans1, -(90 * u.deg + ra), 'z') icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel( source_body.name, time=epoch) r_f = icrs_frame_pos_coord.xyz + r_trans2 v_f = icrs_frame_vel_coord.xyz + v_trans2 return r_f.to(r.unit), v_f.to(v.unit)
def icrs_to_body_centered(r, v, target_body, epoch=J2000, rotate_meridian=False): """Converts position and velocity in ICRS to body-centered frame. Parameters ---------- r : ~astropy.units.Quantity Position vector in ICRS. v : ~astropy.units.Quantity Velocity vector in ICRS. target_body : Body Target body. epoch : ~astropy.time.Time, optional Epoch, default to J2000. rotate_meridian : bool, optional Whether to apply the rotation of the meridian too, default to False. Returns ------- r, v : tuple (~astropy.units.Quantity) Position and velocity vectors in a body-centered reference frame. """ ra, dec, W = target_body.rot_elements_at_epoch(epoch) icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel( target_body.name, time=epoch) r_trans1 = r - icrs_frame_pos_coord.xyz r_trans2 = transform_vector(r_trans1, (90 * u.deg + ra), 'z') r_f = transform_vector(r_trans2, (90 * u.deg - dec), 'x') v_trans1 = v - icrs_frame_vel_coord.xyz v_trans2 = transform_vector(v_trans1, (90 * u.deg + ra), 'z') v_f = transform_vector(v_trans2, (90 * u.deg - dec), 'x') if rotate_meridian: r_f = transform_vector(r_f, W, 'z') v_f = transform_vector(v_f, W, 'z') return r_f.to(r.unit), v_f.to(v.unit)
def body_centered_to_icrs(r, v, source_body, epoch=J2000, rotate_meridian=False): """Converts position and velocity body-centered frame to ICRS. Parameters ---------- r : ~astropy.units.Quantity Position vector in a body-centered reference frame. v : ~astropy.units.Quantity Velocity vector in a body-centered reference frame. source_body : Body Source body. epoch : ~astropy.time.Time, optional Epoch, default to J2000. rotate_meridian : bool, optional Whether to apply the rotation of the meridian too, default to False. Returns ------- r, v : tuple (~astropy.units.Quantity) Position and velocity vectors in ICRS. """ ra, dec, W = source_body.rot_elements_at_epoch(epoch) if rotate_meridian: r = transform_vector(r, -W, 'z') v = transform_vector(v, -W, 'z') r_trans1 = transform_vector(r, -(90 * u.deg - dec), 'x') r_trans2 = transform_vector(r_trans1, -(90 * u.deg + ra), 'z') v_trans1 = transform_vector(v, -(90 * u.deg - dec), 'x') v_trans2 = transform_vector(v_trans1, -(90 * u.deg + ra), 'z') icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel(source_body.name, time=epoch) r_f = icrs_frame_pos_coord.xyz + r_trans2 v_f = icrs_frame_vel_coord.xyz + v_trans2 return r_f.to(r.unit), v_f.to(v.unit)
def icrs_to_body_centered(r, v, target_body, epoch=J2000, rotate_meridian=False): """Converts position and velocity in ICRS to body-centered frame. Parameters ---------- r : ~astropy.units.Quantity Position vector in ICRS. v : ~astropy.units.Quantity Velocity vector in ICRS. target_body : Body Target body. epoch : ~astropy.time.Time, optional Epoch, default to J2000. rotate_meridian : bool, optional Whether to apply the rotation of the meridian too, default to False. Returns ------- r, v : tuple (~astropy.units.Quantity) Position and velocity vectors in a body-centered reference frame. """ ra, dec, W = target_body.rot_elements_at_epoch(epoch) icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel(target_body.name, time=epoch) r_trans1 = r - icrs_frame_pos_coord.xyz r_trans2 = transform_vector(r_trans1, (90 * u.deg + ra), 'z') r_f = transform_vector(r_trans2, (90 * u.deg - dec), 'x') v_trans1 = v - icrs_frame_vel_coord.xyz v_trans2 = transform_vector(v_trans1, (90 * u.deg + ra), 'z') v_f = transform_vector(v_trans2, (90 * u.deg - dec), 'x') if rotate_meridian: r_f = transform_vector(r_f, W, 'z') v_f = transform_vector(v_f, W, 'z') return r_f.to(r.unit), v_f.to(v.unit)