Astropy: quadros com velocidades e uma representação de "unidade" falham na conversão para cartesiano

Criado em 23 dez. 2017  ·  3Comentários  ·  Fonte: astropy/astropy

Alguns dos testes de caso crítico em # 6944 revelaram algum comportamento problemático para quadros que têm velocidades em que a representação real é UnitSpherical . Acontece que isso é verdade. Os casos abaixo ilustram o problema:

Observe também que se # 6944 for mesclado, há alguns locais com soluções para esse bug. Se este bug for corrigido, essas soluções devem ser removidas (procure no subpacote coordinates #7028 para encontrá-los).

Isso funciona:

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

Mas esses dois casos não:

>>> 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

É provavelmente um indício útil que no segundo caso de falha, f.cartesian funciona, mas algo na transformação para GCRS é o que torna começar a falhar. É possível que esses problemas sejam sutilmente diferentes, mas são próximos o suficiente para que provavelmente tenham que ser resolvidos juntos.

@adrn ou @mhvk , alguma ideia do que está acontecendo aqui? Pode-se argumentar que pelo menos a etapa de transformação acima está um pouco mal definida, mas ainda assim se deve ser capaz de obter a representação cartesiana mesmo que as unidades sejam um pouco estranhas ...

Bug coordinates

Todos 3 comentários

Olá @eteq ,

Eu estava tentando resolver esse problema. Mas no caso de exemplo,


>>> 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)

O exemplo não contém distance , mas sim radial_velocity . Eu não entendi exatamente o que isso significa. Além disso, se eu colocar alguma distância no quadro, ele funcionará perfeitamente!

Você pode me fazer entender o problema, estou ficando confuso.

@shreyasbapat Você poderia tentar ver se https://github.com/astropy/astropy/pull/9064 corrige esse problema? (Editar: não)

9086 me lembrou desse problema. Para os dois casos:

Sem distância, mas com 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

Acho que este é insolúvel: sem uma distância, não se pode converter um movimento adequado em uma velocidade espacial, ou uma velocidade espacial em uma agular. Então, eu acho que para este caso, nós simplesmente precisamos ter certeza de que a mensagem de erro é mais clara (desencadeada por ter um RV, mas sem distância).

RV introduzido pela transformação 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)>

Isso é um pouco mais sutil. Sem o movimento adequado, g é UnitSpherical , o que faz sentido, e aqui deveria estar também, então há algo errado com a transformação. Para ser completo, representá-lo na esfera unitária 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)>

Mas, mesmo assim, g.cartesian deve funcionar também - aqui, o problema é que os quadros decidem para o usuário quais unidades são sensíveis, insistindo que uma velocidade cartesiana está em km/s (claro, isso volta à minha reclamação de longa data de que as unidades de coordenadas na representação são decididas por mim ...): https://github.com/astropy/astropy/blob/c3dc7b38303b3615945aa36a11ebf7bd31d5cc0a/astropy/coordinates/baseframe.py#L1744 -L1753

As próprias unidades são obtidas 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]}}

Vê-se aqui que CartesianDifferential é o único que está errado, porque ele tem unidades preferenciais definidas.

O que provavelmente significa que a correção em # 9086 está OK com uma pequena modificação: deve-se tentar ir para as unidades solicitadas, mas não se importando se isso falhar.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

pllim picture pllim  ·  3Comentários

pllim picture pllim  ·  3Comentários

pllim picture pllim  ·  3Comentários

Iko-7 picture Iko-7  ·  3Comentários

bmorris3 picture bmorris3  ·  3Comentários