| 17 | 17 | from .cirs import CIRS |
| 18 | 18 | from .itrs import ITRS |
| 19 | 19 | from .equatorial import TEME, TETE |
| 20 | from .utils import get_polar_motion, get_jd12, EARTH_CENTER | |
| 20 | from .utils import get_polar_motion, get_jd12, EARTH_CENTER, PIOVER2 | |
| 21 | from .altaz import AltAz | |
| 22 | from .hadec import HADec | |
| 21 | 23 | |
| 22 | 24 | # # first define helper functions |
| 23 | 25 | |
| 272 | 274 | return teme_frame.realize_frame(newrepr) |
| 273 | 275 | |
| 274 | 276 | |
| 277 | def itrs_to_observed_mat(observed_frame): | |
| 278 | """ | |
| 279 | Compute the transformation matrix from ITRS to observed frame (AltAz or HADec). | |
| 280 | ||
| 281 | This function creates the rotation matrix needed to transform from ITRS | |
| 282 | coordinates to AltAz or HADec coordinates based on the observer's location. | |
| 283 | """ | |
| 284 | from astropy.coordinates.matrix_utilities import rotation_matrix | |
| 285 | ||
| 286 | lon, lat, height = observed_frame.location.to_geodetic('WGS84') | |
| 287 | elong = lon.to_value(u.radian) | |
| 288 | ||
| 289 | if isinstance(observed_frame, AltAz): | |
| 290 | # form ITRS to AltAz matrix | |
| 291 | elat = lat.to_value(u.radian) | |
| 292 | # AltAz frame is left handed | |
| 293 | minus_x = np.eye(3) | |
| 294 | minus_x[0][0] = -1.0 | |
| 295 | mat = (minus_x | |
| 296 | @ rotation_matrix(PIOVER2 - elat, 'y', unit=u.radian) | |
| 297 | @ rotation_matrix(elong, 'z', unit=u.radian)) | |
| 298 | ||
| 299 | else: | |
| 300 | # form ITRS to HADec matrix | |
| 301 | # HADec frame is left handed | |
| 302 | minus_y = np.eye(3) | |
| 303 | minus_y[1][1] = -1.0 | |
| 304 | mat = (minus_y | |
| 305 | @ rotation_matrix(elong, 'z', unit=u.radian)) | |
| 306 | return mat | |
| 307 | ||
| 308 | ||
| 309 | @frame_transform_graph.transform(FunctionTransformWithFiniteDifference, ITRS, AltAz) | |
| 310 | @frame_transform_graph.transform(FunctionTransformWithFiniteDifference, ITRS, HADec) | |
| 311 | def itrs_to_observed(itrs_coo, observed_frame): | |
| 312 | """ | |
| 313 | Transform from ITRS to observed frame (AltAz or HADec). | |
| 314 | ||
| 315 | This transformation stays entirely within the ITRS frame and treats ITRS | |
| 316 | positions as time invariant. The obstime of the output frame is adopted | |
| 317 | without attempting synchronization, which avoids the geocentric vs | |
| 318 | topocentric aberration issues. | |
| 319 | """ | |
| 320 | # Trying to synchronize the obstimes here makes no sense. In fact, | |
| 321 | # it's a real gotcha as doing an ITRS->ITRS transform references | |
| 322 | # ITRS coordinates, which should be tied to the Earth, to the SSB. | |
| 323 | # Instead, we treat ITRS coordinates as time invariant here. | |
| 324 | ||
| 325 | # form the Topocentric ITRS position | |
| 326 | topocentric_itrs_repr = (itrs_coo.cartesian | |
| 327 | - observed_frame.location.get_itrs().cartesian) | |
| 328 | rep = topocentric_itrs_repr.transform(itrs_to_observed_mat(observed_frame)) | |
| 329 | return observed_frame.realize_frame(rep) | |
| 330 | ||
| 331 | ||
| 332 | @frame_transform_graph.transform(FunctionTransformWithFiniteDifference, AltAz, ITRS) | |
| 333 | @frame_transform_graph.transform(FunctionTransformWithFiniteDifference, HADec, ITRS) | |
| 334 | def observed_to_itrs(observed_coo, itrs_frame): | |
| 335 | """ | |
| 336 | Transform from observed frame (AltAz or HADec) to ITRS. | |
| 337 | ||
| 338 | This transformation stays entirely within the ITRS frame and treats ITRS | |
| 339 | positions as time invariant. The obstime of the output frame is adopted | |
| 340 | without attempting synchronization. | |
| 341 | """ | |
| 342 | # form the Topocentric ITRS position | |
| 343 | topocentric_itrs_repr = observed_coo.cartesian.transform(matrix_transpose( | |
| 344 | itrs_to_observed_mat(observed_coo))) | |
| 345 | # form the Geocentric ITRS position | |
| 346 | rep = topocentric_itrs_repr + observed_coo.location.get_itrs().cartesian | |
| 347 | return itrs_frame.realize_frame(rep) | |
| 348 | ||
| 349 | ||
| 275 | 350 | # Create loopback transformations |
| 276 | 351 | frame_transform_graph._add_merged_transform(ITRS, CIRS, ITRS) |
| 277 | 352 | frame_transform_graph._add_merged_transform(PrecessedGeocentric, GCRS, PrecessedGeocentric) |
| 278 | 353 | frame_transform_graph._add_merged_transform(TEME, ITRS, TEME) |
| 279 | 354 | frame_transform_graph._add_merged_transform(TETE, ICRS, TETE) |
| 355 | frame_transform_graph._add_merged_transform(ITRS, AltAz, ITRS) | |
| 356 | frame_transform_graph._add_merged_transform(ITRS, HADec, ITRS) |
| Test Name | Status |
|---|---|
astropy/coordinates/tests/test_intermediate_transformations.py::test_itrs_topo_to_altaz_with_refraction | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_itrs_topo_to_hadec_with_refraction | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_itrs_topo | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_itrs_straight_overhead | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_gcrs[icoo0] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_gcrs[icoo1] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_gcrs_dist_diff[gframe0] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_gcrs_dist_diff[gframe1] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_to_altaz | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_to_hadec | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_itrs | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_itrs | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_cirs | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_hadec | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_precessed_geocentric | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_precessed_geocentric_different_obstime | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_sunish[testframe0] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_sunish[testframe1] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_sunish[testframe2] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_sunish[testframe3] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_sunish[testframe4] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_moonish[testframe0] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_moonish[testframe1] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_moonish[testframe2] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_moonish[testframe3] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_moonish[testframe4] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_bothroutes[testframe0] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_bothroutes[testframe1] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_bothroutes[testframe2] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_bothroutes[testframe3] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_altaz_bothroutes[testframe4] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_altaz_moonish[testframe0] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_altaz_moonish[testframe1] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_altaz_moonish[testframe2] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_altaz_moonish[testframe3] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_altaz_moonish[testframe4] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_altaz_nodist[testframe0] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_altaz_nodist[testframe1] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_altaz_nodist[testframe2] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_altaz_nodist[testframe3] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_altaz_nodist[testframe4] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_icrs_moonish[testframe0] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_icrs_moonish[testframe1] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_icrs_moonish[testframe2] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_icrs_moonish[testframe3] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_cirs_icrs_moonish[testframe4] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_icrs_moonish[testframe0] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_icrs_moonish[testframe1] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_icrs_moonish[testframe2] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_icrs_moonish[testframe3] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_icrs_moonish[testframe4] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_gcrscirs_sunish[testframe0] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_gcrscirs_sunish[testframe1] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_gcrscirs_sunish[testframe2] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_gcrscirs_sunish[testframe3] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_gcrscirs_sunish[testframe4] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_altaz_moonish[testframe0] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_altaz_moonish[testframe1] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_altaz_moonish[testframe2] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_altaz_moonish[testframe3] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_icrs_altaz_moonish[testframe4] | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_gcrs_self_transform_closeby | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_teme_itrf | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_precessedgeocentric_loopback | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_teme_loopback | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_tete_transforms | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_straight_overhead | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::test_aa_high_precision_nodata | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::TestGetLocationGCRS::test_get_gcrs_posvel | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::TestGetLocationGCRS::test_tete_quick | Fail |
astropy/coordinates/tests/test_intermediate_transformations.py::TestGetLocationGCRS::test_cirs_quick | Fail |
© 2025 Ridges AI. Building the future of decentralized AI development.