Как объединить два вектора astropy SkyCoord?

#python #python-3.x #astropy

#python #python-3.x #astropy

Вопрос:

Я загрузил данные координат из двух разных звездных каталогов (в реальной жизни Tycho2 и Hipparcos), и я пытаюсь создать единую таблицу положений звезд. Один задает позиции и правильное движение в эпоху J2000.0, другой — в эпоху J1991.25. Из документации astropy я должен быть в состоянии преобразовать одно в другое, а затем объединить их в единый вектор позиций. Если я запускаю следующий MWE, я получаю сообщение об ошибке, в котором говорится, что два входа не имеют эквивалентных кадров.

 from astropy.coordinates import SkyCoord, concatenate
from astropy.time import Time
import astropy.units as u

tpos = SkyCoord(
    ra=[1, 2, 3, 4] * u.deg,
    dec=[1, 2, 3, 4] * u.deg,
    pm_ra_cosdec=[1e-3, 2e-3, 3e-3, 4e-3] * u.milliarcsecond / u.year,
    pm_dec=[1e-3, 2e-3, 3e-3, 4e-3] * u.milliarcsecond / u.year,
    obstime=Time(2000.0, format='jyear'),
    frame='icrs'
)

spos = SkyCoord(
    ra=[1, 2, 3, 4] * u.deg,
    dec=[1, 2, 3, 4] * u.deg,
    pm_ra_cosdec=[1e-3, 2e-3, 3e-3, 4e-3] * u.milliarcsecond / u.year,
    pm_dec=[1e-3, 2e-3, 3e-3, 4e-3] * u.milliarcsecond / u.year,
    obstime=Time(1991.25, format='jyear'),
    frame='icrs'
).transform_to(tpos)

pos = concatenate([tpos, spos])
  

Ошибка, которую я получаю, это:

 ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-6-3eecaa4d104b> in <module>
     21 ).transform_to(tpos)
     22 
---> 23 pos = concatenate([tpos, spos])

~AppDataLocalContinuumanaconda3libsite-packagesastropycoordinatesfuncs.py in concatenate(coords)
    373         if not sc.is_equivalent_frame(scs[0]):
    374             raise ValueError("All inputs must have equivalent frames: "
--> 375                              "{0} != {1}".format(sc, scs[0]))
    376 
    377     # TODO: this can be changed to SkyCoord.from_representation() for a speed

ValueError: All inputs must have equivalent frames: <SkyCoord (ICRS): (ra, dec) in deg
    [(1., 1.), (2., 2.), (3., 3.), (4., 4.)]
 (pm_ra_cosdec, pm_dec) in mas / yr
    [(0.001, 0.001), (0.002, 0.002), (0.003, 0.003), (0.004, 0.004)]> != <SkyCoord (ICRS): (ra, dec) in deg
    [(1., 1.), (2., 2.), (3., 3.), (4., 4.)]
 (pm_ra_cosdec, pm_dec) in mas / yr
    [(0.001, 0.001), (0.002, 0.002), (0.003, 0.003), (0.004, 0.004)]>
  

и если я попытаюсь spos.transform_to(tpos).obstime , время останется неизменным <Time object: scale='utc' format='jyear' value=1991.25> .

Что на самом деле делает transform_to метод? Какой метод / функцию мне действительно нужно вызвать, чтобы поместить их в один и тот же фрейм?

Ответ №1:

Немного опоздал на вечеринку, но может помочь кому-то еще.

Я думаю, вопрос в следующем: как вы учитываете изменение координат из-за правильного движения между 1991 и 2000 годами.

Метод transform_to() в основном предназначен для перехода из одной системы координат в другую. В данном случае оба каталога основаны на фрейме ICRS. Также нет необходимости учитывать прецессию земной оси в течение этого времени, поскольку этот кадр фиксирован относительно удаленных небесных объектов.

Вы можете использовать метод apply_space_motion для учета правильного движения:

 spos = SkyCoord(
    ra =45 * u.deg,
    dec = 30 * u.deg,
    distance =100*u.pc,
    pm_ra_cosdec =5 * u.arcsec / u.yr,
    pm_dec = 5* u.arcsec / u.yr,
    obstime = 'J1991.25',
    frame='icrs' )

print('co_ords in 1991   ' , spos.ra, spos.dec)

spos = spos.apply_space_motion(new_obstime = Time(2000.0, format='jyear'))

print( 'co_ords in 2000   ', spos.ra, spos.dec)



>>>  co_ords in 1991    45d00m00s 30d00m00s
     co_ords in 2000    45d00m50.5211s 30d00m43.7445s
  

Я добавил параметр расстояния в свойства объекта, в противном случае это приведет к появлению предупреждений на выходе. Не имеет значения, какое значение расстояния, поскольку нас интересует только 2D-решение, однако, если вы рассматриваете 3D-движение, то это, очевидно, важно.

Я не уверен, насколько точны вам нужны позиции, но я увеличил правильное движение до 5 угловых секунд в год по каждой оси, чтобы добиться значительных изменений за этот период. Только звезды, подобные звезде Барнарда, имеют правильные движения в таком диапазоне.

Комментарии:

1. Спасибо за ответ. Я попробую. В конечном счете, меня не очень волнуют крошечные движения, я просто хочу, чтобы все было в одной таблице. В итоге я решил проблему, извлекая данные из Vizier с помощью astroquery и позволяя ему выполнять преобразование.