Astropy: Los fotogramas con velocidades y una representación de "unidad" no se convierten en cartesianos.

Creado en 23 dic. 2017  ·  3Comentarios  ·  Fuente: astropy/astropy

Algunas de las pruebas de casos de esquina en # 6944 revelaron algún comportamiento problemático para los fotogramas que tienen velocidades donde la representación real es UnitSpherical . Resulta que esto es cierto. Los siguientes casos ilustran el problema:

Tenga en cuenta también que si se fusiona # 6944, tiene un par de lugares con soluciones para este error. Si se corrige este error, esas soluciones deben eliminarse (busque en el subpaquete coordinates #7028 para encontrarlas).

Esto funciona:

>>> f = ICRS(1*u.deg, 2*u.deg)
>>> f.cartesian
<CartesianRepresentation (x, y, z) [dimensionless]
    ( 0.99923861,  0.01744177,  0.0348995)>

Pero estos dos casos no:

>>> f = ICRS(1*u.deg, 2*u.deg,
          pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr, radial_velocity=10*u.km/u.s)
>>> f.represent_as('cartesian', in_frame_units=True)
UnitConversionError: 'mas / (rad yr)' (frequency) and 'km / s' (speed) are not convertible
>>> f = ICRS(1*u.deg, 2*u.deg, 
                pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr)
>>> g = f.transform_to(GCRS)
>>> g.cartesian
UnitConversionError: '1 / s' (frequency) and 'km / s' (speed) are not convertible

Probablemente sea una pista útil que en el segundo caso de falla, f.cartesian funciona, pero algo en la transformación a GCRS es lo que hace que comience a fallar. Es posible que estos sean problemas sutilmente diferentes, pero están lo suficientemente cerca como para que probablemente tengan que resolverse juntos.

@adrn o @mhvk , ¿alguna idea de lo que está pasando aquí? Se podría argumentar que al menos el paso de transformación anterior está algo mal definido, pero aún se debería poder obtener la representación cartesiana incluso si las unidades son un poco extrañas ...

Bug coordinates

Todos 3 comentarios

Hola @eteq ,

Estaba intentando trabajar en este problema. Pero en el caso de ejemplo,


>>> f = ICRS(1*u.deg, 2*u.deg,
          pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr, radial_velocity=10*u.km/u.s)
>>> f.represent_as('cartesian', in_frame_units=True)

El ejemplo no tiene distance en él, sino que tiene un radial_velocity . No entendí qué significa exactamente. Además, si pongo algo de distancia en el marco, ¡funciona perfectamente!

¿Puede hacerme entender el problema? Me estoy confundiendo.

@shreyasbapat ¿Podría intentar ver si https://github.com/astropy/astropy/pull/9064 soluciona este problema? (Editar: no lo hace)

9086 me recordó este problema. Para los dos casos:

Sin distancia pero con RV

>>> f = ICRS(1*u.deg, 2*u.deg,
          pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr, radial_velocity=10*u.km/u.s)
>>> f.represent_as('cartesian', in_frame_units=True)
UnitConversionError: 'mas / (rad yr)' (frequency) and 'km / s' (speed) are not convertible

Creo que éste es irresoluble: sin una distancia, no se puede convertir un movimiento propio en una velocidad espacial, o una velocidad espacial en una agular. Entonces, creo que para este caso, simplemente debemos asegurarnos de que el mensaje de error sea más claro (desencadenado por tener un RV pero sin distancia).

RV introducido por transformación de coordenadas

>>> f = ICRS(1*u.deg, 2*u.deg, 
                pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr)
>>> g = f.transform_to(GCRS)
>>> repr(g)
# error
>>> g.data
<CartesianRepresentation (x, y, z) [dimensionless]
    (0.99923901, 0.01742676, 0.03489572)
 (has differentials w.r.t.: 's')>
g.data.differentials
<CartesianDifferential (d_x, d_y, d_z) in 1 / s
    (6.07736084e-13, -1.85772092e-11, -8.12625661e-12)>

Esto es un poco más sutil. Sin el movimiento adecuado, g es UnitSpherical , lo cual tiene sentido, y aquí también debería estarlo, por lo que hay algo mal en la transformación. Para completar, representarlo en la esfera de la unidad funciona:

g.represent_as('unitspherical')                                                               
Out[24]: 
<UnitSphericalRepresentation (lon, lat) in rad
    (0.01743826, 0.0349028)
 (has differentials w.r.t.: 's')>

In [25]: g.represent_as('unitspherical').differentials['s']                                            
Out[25]: 
<UnitSphericalDifferential (d_lon, d_lat) in rad / s
    (-1.85963079e-11, -8.13120751e-12)>

Pero aun así, g.cartesian debería funcionar; aquí, el problema es que los marcos deciden por el usuario qué unidades son sensibles, insistiendo en que una velocidad cartesiana está en km/s (por supuesto, esto se remonta a a mi queja de larga data de que las unidades de coordenadas en la representación se deciden por mí ...): https://github.com/astropy/astropy/blob/c3dc7b38303b3615945aa36a11ebf7bd31d5cc0a/astropy/coordinates/baseframe.py#L1744 -L1753

Las unidades en sí se obtienen de:

g.representation_info
{astropy.coordinates.representation.CartesianRepresentation: {'names': ['x',
   'y',
   'z'],
  'units': [None, None, None]},
 astropy.coordinates.representation.UnitSphericalRepresentation: {'names': ('ra',
   'dec'),
  'units': (Unit("deg"), Unit("deg"))},
 astropy.coordinates.representation.RadialRepresentation: {'names': ['distance'],
  'units': [None]},
 astropy.coordinates.representation.SphericalRepresentation: {'names': ('ra',
   'dec',
   'distance'),
  'units': (Unit("deg"), Unit("deg"), None)},
 astropy.coordinates.representation.PhysicsSphericalRepresentation: {'names': ['phi',
   'theta',
   'r'],
  'units': [Unit("deg"), Unit("deg"), None]},
 astropy.coordinates.representation.CylindricalRepresentation: {'names': ['rho',
   'phi',
   'z'],
  'units': [None, Unit("deg"), None]},
 astropy.coordinates.representation.CartesianDifferential: {'names': ('v_x',
   'v_y',
   'v_z'),
  'units': (Unit("km / s"), Unit("km / s"), Unit("km / s"))},
 astropy.coordinates.representation.UnitSphericalDifferential: {'names': ('pm_ra',
   'pm_dec'),
  'units': (Unit("mas / yr"), Unit("mas / yr"))},
 astropy.coordinates.representation.SphericalDifferential: {'names': ('pm_ra',
   'pm_dec',
   'radial_velocity'),
  'units': (Unit("mas / yr"), Unit("mas / yr"), Unit("km / s"))},
 astropy.coordinates.representation.UnitSphericalCosLatDifferential: {'names': ('pm_ra_cosdec',
   'pm_dec'),
  'units': (Unit("mas / yr"), Unit("mas / yr"))},
 astropy.coordinates.representation.SphericalCosLatDifferential: {'names': ('pm_ra_cosdec',
   'pm_dec',
   'radial_velocity'),
  'units': (Unit("mas / yr"), Unit("mas / yr"), Unit("km / s"))},
 astropy.coordinates.representation.RadialDifferential: {'names': ['d_distance'],
  'units': [None]},
 astropy.coordinates.representation.PhysicsSphericalDifferential: {'names': ['d_phi',
   'd_theta',
   'd_r'],
  'units': [None, None, None]},
 astropy.coordinates.representation.CylindricalDifferential: {'names': ['d_rho',
   'd_phi',
   'd_z'],
  'units': [None, None, None]}}

Aquí se ve que CartesianDifferential es el único que está mal, lo cual se debe a que tiene unidades preferidas configuradas.

Lo que probablemente significa que la solución en # 9086 está bien con una pequeña modificación: uno debe intentar ir a las unidades solicitadas pero no le importa si eso falla.

¿Fue útil esta página
0 / 5 - 0 calificaciones