Astropy: Frames mit Geschwindigkeiten und einer "Einheit"-Darstellung können nicht in kartesische konvertiert werden

Erstellt am 23. Dez. 2017  ·  3Kommentare  ·  Quelle: astropy/astropy

Einige der Corner-Case-Tests in #6944 zeigten ein problematisches Verhalten für Frames mit Geschwindigkeiten, bei denen die tatsächliche Darstellung UnitSpherical . Es stellt sich heraus, dass dies wahr ist. Die folgenden Fälle veranschaulichen das Problem:

Beachten Sie auch, dass wenn #6944 zusammengeführt wird, es einige Stellen mit Workarounds für diesen Fehler gibt. Wenn dieser Fehler behoben ist, sollten diese Problemumgehungen entfernt werden (durchsuchen Sie das Unterpaket coordinates nach #7028 , um sie zu finden).

Das funktioniert:

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

Aber diese beiden Fälle nicht:

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

Es ist wahrscheinlich ein nützlicher Hinweis , dass in dem zweiten andernfalls Fall f.cartesian funktioniert, aber etwas in der Transformation zu GCRS ist , was es anfängt , Fehler macht. Es ist möglich, dass dies subtil unterschiedliche Probleme sind, aber sie liegen nahe genug beieinander, dass sie wahrscheinlich gemeinsam gelöst werden müssen.

@adrn oder @mhvk , hast du eine Ahnung, was hier los ist? Man könnte argumentieren, dass zumindest der obige Transformationsschritt etwas undefiniert ist, aber man sollte immer noch in der Lage sein, die kartesische Darstellung herauszubekommen, auch wenn die Einheiten etwas seltsam sind ...

Bug coordinates

Alle 3 Kommentare

Hallo @eteq ,

Ich habe versucht, an diesem Problem zu arbeiten. Aber im Beispielfall


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

Das Beispiel enthält kein distance , sondern ein radial_velocity . Ich habe nicht verstanden, was es genau bedeutet. Auch wenn ich etwas Abstand in den Rahmen setze, funktioniert es perfekt!

Können Sie mir das Problem bitte verständlich machen, ich bin verwirrt.

@shreyasbapat Könnten Sie bitte versuchen zu sehen, ob https://github.com/astropy/astropy/pull/9064 dieses Problem behebt? (Edit: tut es nicht)

9086 hat mich an dieses Problem erinnert. Für die beiden Fälle:

Keine Distanz aber mit 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

Ich denke, diese Frage ist unlösbar: Ohne Abstand kann man eine Eigenbewegung nicht in eine Raumgeschwindigkeit oder eine Raumgeschwindigkeit in eine Winkelgeschwindigkeit umwandeln. Ich denke, für diesen Fall müssen wir einfach sicherstellen, dass die Fehlermeldung klarer ist (ausgelöst durch ein Wohnmobil, aber keine Entfernung).

RV durch Koordinatentransformation eingeführt

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

Das ist etwas subtiler. Ohne Eigenbewegung ist g UnitSpherical , was Sinn macht, und hier sollte es auch so sein, also stimmt etwas mit der Transformation nicht. Der Vollständigkeit halber funktioniert die Darstellung auf der Einheitskugel:

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

Aber trotzdem sollte g.cartesian funktionieren - hier ist das Problem, dass Frames für den Benutzer entscheiden, welche Einheiten sinnvoll sind, und darauf bestehen, dass eine kartesische Geschwindigkeit in km/s (natürlich geht das zurück auf meine langjährige Beschwerde, dass Koordinateneinheiten in der Darstellung für mich entschieden werden...): https://github.com/astropy/astropy/blob/c3dc7b38303b3615945aa36a11ebf7bd31d5cc0a/astropy/coordinates/baseframe.py#L1744 -L1753

Die Einheiten selbst stammen von:

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

Man sieht hier, dass CartesianDifferential das einzige ist, das falsch ist, weil es überhaupt bevorzugte Einheiten gesetzt hat.

Was wahrscheinlich bedeutet, dass der Fix in #9086 mit einer kleinen Modifikation in Ordnung ist: Man sollte versuchen , zu den angeforderten Einheiten zu gelangen, aber es ist egal, ob dies fehlschlägt.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen