-->

Etiquetas

Trabajando con coordenadas astronómicas en Python

El propósito de esta entrada es mostrar como se puede trabajar con los distintos sistemas de coordenadas astronómicas utilizando las librerías de Python adecuadas.

En esta entrada, como en la mayoría de las siguientes, se utilizará el notebook de IPython

Autor: Eduardo Martín Calleja

Importaciones y referencias

In [1]:
%matplotlib inline
from __future__ import division

# Importación de la librería PyEphem
import ephem

import astropy

#Esto suprime algunos deprecation warnings que molestan 
import warnings
warnings.filterwarnings('ignore')

# Generar un cuadro con versiones de las librerías utilizadas en este notebook
#https://github.com/jrjohansson/version_information
%load_ext version_information
%version_information ephem, astropy
Out[1]:
SoftwareVersion
Python2.7.9 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
IPython2.3.1
OSLinux 3.13.0 44 generic x86_64 with debian jessie sid
ephem3.7.5.3
astropy0.4.3
Wed Jan 21 15:00:22 2015 CET

1. Coordenadas esféricas ecuatoriales

Vienen definidas por una ascensión recta (ra), una declinación (dec) y un epoch.

La ra viene representada normalmente como un string de la forma "hh:mm:ss"

La dec se representa normalmente como un string de la forma "+/-º:':''"

El epoch por defecto es J2000.0

Sus elementos son:

  • El origen es el cento de la Tierra (es decir, son coordenadas geocéntricas)
  • El plano fundamental es la proyección del ecuador terrestre en la esfera celeste
  • La dirección primaria es la del equinoccio de primavera en una fecha determinada (el epoch)
  • El convenio de dirección es que la ra se mide positivamente hacia el este y hacia el norte.

Las coordenadas ecuatoriales de un objeto se representan en ephem como instancias de la clase Equatorial

ra, dec y epoch son atributos del objeto

In [2]:
# vamos a definir las coordenadas ecuatoriales de un objeto
eq=ephem.Equatorial('13:24:42.5','-60:15:59.4')

# Internamente se almacenan en radianes, para facilitar los cálculos
eq.ra, eq.dec, eq.epoch
Out[2]:
(3.511202483725676, -1.0518488536531627, 36524.5)
In [3]:
# Sin embargo se imprimen como strings
print eq.ra, '\t', eq.dec, '\t', eq.epoch
13:24:42.50  -60:15:59.4  2000/1/1 00:00:00

In [4]:
# Podemos obtener una tupla (ra,dec) utilizando el método get()
print eq.get()
(3.511202483725676, -1.0518488536531627)

In [5]:
# Indica en qué constelación se situa una tupla de coordenadas
ephem.constellation((eq.ra,eq.dec))
Out[5]:
('Cen', 'Centaurus')

También podemos utilizar otro epoch diferente del J2000:

In [6]:
eq50=ephem.Equatorial('13:24:42.5','-60:15:59.4',epoch=ephem.B1950)
print eq50.ra, '\t', eq50.dec, '\t', eq50.epoch
13:24:42.50  -60:15:59.4  1949/12/31 22:09:50

2. Coordenadas galácticas

Tambien se trata de un sistema de coordenadas esféricas. Sus elementos son:

  • El centro se situa en el Sol (son coordenadas heliocénticas)
  • El plano fundamental es aproximadamente el plano de nuestra galaxia (la Vía Lactea)
  • La dirección primaria apunta aproximadamente al centro de nuesta galaxia
  • El convenio es que las direcciones son positivas hacia el norte y hacia el este en el plano fundamental.

Las coordenadas son longitud (lon / l) y latitud(lat / b), ambas expresadas en grados, no en horas

In [7]:
# Definición de las coordenadas galácticas de un objeto
ga=ephem.Galactic('1:59:55.9','+89:59:59.9')   
print ga.lon, ga.lat

# Longitud y latitud utilizando el método get(). Se muestran en radianes
print ga.get()
1:59:55.9 89:59:59.9
(0.0348867076789611, 1.5707958419812156)

3. Conversión entre sistemas de coordenadas

Las coordenadas pueden ser convertidas entre un sistema y otro pasando un objeto del primer tipo como imput a una clase del segundo tipo:

In [8]:
# Conversión de coordenadas ecuatoriales entre epochs
eq1 = eq=ephem.Equatorial('13:24:42.5','-60:15:59.4')
eq2 = ephem.Equatorial(eq1,epoch=ephem.B1950)
print eq1.get()
print eq2.get()
(3.511202483725676, -1.0518488536531627)
(3.49702212460356, -1.04730555904456)

In [9]:
# Conversión de coordenadas galácticas a ecuatoriales
# En realidad esta declaración de epoch se puede omitir
ga1 = ephem.Galactic('0','90',epoch=ephem.J2000)
eq1 = ephem.Equatorial(ga1)
print eq1.ra, eq1.dec
12:51:26.28 27:07:41.7

4. Obtener las coordenadas de un objeto por su nombre

Para esto se utilizará el módulo SkyCoord de la librería astropy.coordinates con el sufijo from_name, el cual obtiene las coordenadas a partir del servidor SESAME

In [10]:
from astropy.coordinates import SkyCoord

El "International Celestial Reference System" (ICRS) es el sistema de referencia celeste adoptado como estándar en la actualidad por la Unión Astronómica Internacional (IAU). Estas coordenadas coinciden con mucha aproximación con las coordenadas ecuatoriales J2000.0. Las coordenadas ICRS se pueden obtener dando el nombre del objeto en cualquiera de los catálogos utilizados por el servicio SESAME

In [11]:
# Galaxia Remolino
SkyCoord.from_name("M51")    # "icrs" es la opción por defecto
Out[11]:
<SkyCoord (ICRS): ra=202.469575 deg, dec=47.1952583 deg>
In [12]:
# El mismo objeto en coordenadas galácticas
SkyCoord.from_name("M51", frame='galactic')
Out[12]:
<SkyCoord (Galactic): l=104.851584722 deg, b=68.5607018112 deg>

Para acceder a los valores de los ángulos (longitud y latitud en este caso) hay varias opciones:

In [13]:
c = SkyCoord.from_name("M51", frame='galactic')
# se puede acceder internamente a longitud y latitud con c.l y c.b
# La representación interna de los ángulos es en grados
# Sin embargo, con estos valores no se puede operar directamente
c.l, c.b
Out[13]:
(<Longitude 104.85158472198123 deg>, <Latitude 68.5607018112399 deg>)

Y para obtener valores numéricos de los ángulos con los que operar, proceder como sigue:

In [14]:
# Ángulos en radianes
print c.l.radian, c.b.radian

# Ángulos en grados
print c.l.degree, c.b.degree

# Ejemplo de operación matemática
c.l.degree + 90
1.83000537933 1.19660998408
104.851584722 68.5607018112

Out[14]:
194.85158472198123

En el caso de las coordenadas ICRS los ángulos coordenados son ra y dec

In [15]:
c = SkyCoord.from_name("M51", frame='icrs')

# Se trata de una representación en forma de string no apta para operar
print c

# proporciona una tupla "horas", "minutos", "segundos"
print c.ra.hms

# valores en grados
print c.dec.degree

# Por supuesto se pueden expresar en otros tipos de unidades
print c.ra.radian, c.dec.radian
<SkyCoord (ICRS): ra=202.469575 deg, dec=47.1952583 deg>
hms_tuple(h=13.0, m=29.0, s=52.69800000000572)
47.1952583
3.53376071886 0.823712648664

Otro sistema de coordenadas proporcionado por la librería astropy es FK5. Es un sistema de coordenadas ecuatoriales basado en el Epoch J2000, que coincide prácticamente con las coordenadas ICRS

In [16]:
# Coordenadas ICRS
c = SkyCoord.from_name("M51", frame='icrs')

# Coordenadas FK5
c5 = SkyCoord.from_name("M51", frame='fk5')

# En este ejemplo se puede apreciar la similitud entre ambas
print 'coordenadas ICRS: ',c.ra.hms, c.dec.degree
print 'coordenadas FK5: ', c5.ra.hms, c5.dec.degree
coordenadas ICRS:  hms_tuple(h=13.0, m=29.0, s=52.69800000000572) 47.1952583
coordenadas FK5:  hms_tuple(h=13.0, m=29.0, s=52.697952632941849) 47.1952580768

5. Conversión entre sistemas de coordenadas con astropy

In [17]:
# Obtengamos las coordenadas galácticas de un astro
# Elegimos una estrella del hemisferio sur

c = SkyCoord.from_name('Achernar', frame='galactic')
c
Out[17]:
<SkyCoord (Galactic): l=290.841241695 deg, b=-58.7920097022 deg>
In [18]:
# Pasemoslas a coordenadas ecuatoriales FK5:
c.fk5
Out[18]:
<SkyCoord (FK5): equinox=J2000.000, ra=24.4285197401 deg, dec=-57.2367527786 deg>
In [19]:
# Y recíprocamente, a partir de las coordenadas ICRS obtengamos las galácticas:
c = SkyCoord.from_name('Achernar', frame='icrs')
c.galactic
Out[19]:
<SkyCoord (Galactic): l=290.841241695 deg, b=-58.7920097022 deg>

No hay comentarios:

Publicar un comentario