Некоторые из угловых тестов в # 6944 выявили некоторую проблемную работу для кадров, которые имеют скорости, где фактическое представление - UnitSpherical
. Оказывается, это правда. Приведенные ниже случаи иллюстрируют проблему:
Также обратите внимание, что если # 6944 объединен, у него есть пара мест с обходными путями для этой ошибки. Если эта ошибка исправлена, эти обходные пути следует удалить (найдите в подпакете coordinates
#7028
чтобы найти их).
Это работает:
>>> f = ICRS(1*u.deg, 2*u.deg)
>>> f.cartesian
<CartesianRepresentation (x, y, z) [dimensionless]
( 0.99923861, 0.01744177, 0.0348995)>
Но в этих двух случаях нет:
>>> 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
Вероятно, это полезная подсказка о том, что во втором случае ошибки f.cartesian
действительно работает, но что-то в преобразовании в GCRS заставляет его начать давать сбой. Возможно, это несколько разные проблемы, но они достаточно близки, и их, вероятно, придется решать вместе.
@adrn или @mhvk , вы не знаете, что здесь происходит? Кто-то может возразить, что, по крайней мере, описанный выше шаг преобразования несколько нечеткий, но все равно должна быть возможность получить декартово представление, даже если единицы немного странные ...
Привет @eteq!
Я пытался работать над этим вопросом. Но в данном примере
>>> 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)
В примере нет distance
, а есть radial_velocity
. Я не понял, что именно это значит. Кроме того, если я помещу в кадр какое-то расстояние, все работает отлично!
Не могли бы вы объяснить мне проблему, я запутался.
@shreyasbapat Не могли бы вы проверить, устраняет ли https://github.com/astropy/astropy/pull/9064 эту проблему? (Изменить: это не так)
>>> 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
Я думаю, что этот вопрос неразрешим: без расстояния невозможно преобразовать собственное движение в пространственную скорость, а пространственную скорость в агулярную. Итак, я думаю, что в этом случае нам просто нужно убедиться, что сообщение об ошибке более четкое (вызвано наличием RV, но отсутствием расстояния).
>>> 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)>
Это немного более тонко. Без правильного движения g
будет UnitSpherical
, что имеет смысл, и здесь он тоже должен быть, поэтому с преобразованием что-то не так. Для полноты, представление его на единичной сфере действительно работает:
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)>
Но даже в этом случае g.cartesian
тоже должен работать - здесь проблема в том, что кадры решают для пользователя, какие единицы разумны, настаивая на том, что декартова скорость находится в km/s
(конечно, это восходит к к моей давней жалобе на то, что единицы координат в представлении решены за меня ...): https://github.com/astropy/astropy/blob/c3dc7b38303b3615945aa36a11ebf7bd31d5cc0a/astropy/coordinates/baseframe.py#L1744 -L1753
Сами единицы получаются из:
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]}}
Здесь можно увидеть, что CartesianDifferential
- единственное, что неверно, потому что в нем вообще установлены предпочтительные единицы измерения.
Это, вероятно, означает, что исправление в # 9086 в порядке с небольшой модификацией: нужно попытаться перейти к запрошенным модулям, но не заботиться о том, что это не удастся.