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
%matplotlib inline
from __future__ import division
# Importación de la librería PyEphem
import ephem
import astropy
#Esto suprime algunos deprecation warnings que molestan pero no interfieren con la ejecución
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
Software | Version |
---|---|
Python | 2.7.9 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] |
IPython | 2.3.1 |
OS | Linux 3.13.0 44 generic x86_64 with debian jessie sid |
ephem | 3.7.5.3 |
astropy | 0.4.3 |
Wed Jan 21 15:00:22 2015 CET |
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:
Las coordenadas ecuatoriales de un objeto se representan en ephem como instancias de la clase Equatorial
ra, dec y epoch son atributos del objeto
# 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
(3.511202483725676, -1.0518488536531627, 36524.5)
# 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
# Podemos obtener una tupla (ra,dec) utilizando el método get()
print eq.get()
(3.511202483725676, -1.0518488536531627)
# Indica en qué constelación se situa una tupla de coordenadas
ephem.constellation((eq.ra,eq.dec))
('Cen', 'Centaurus')
También podemos utilizar otro epoch diferente del J2000:
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
Tambien se trata de un sistema de coordenadas esféricas. Sus elementos son:
Las coordenadas son longitud (lon / l) y latitud(lat / b), ambas expresadas en grados, no en horas
# 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)
Las coordenadas pueden ser convertidas entre un sistema y otro pasando un objeto del primer tipo como imput a una clase del segundo tipo:
# 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)
# 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
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
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
# Galaxia Remolino
SkyCoord.from_name("M51") # "icrs" es la opción por defecto
<SkyCoord (ICRS): ra=202.469575 deg, dec=47.1952583 deg>
# El mismo objeto en coordenadas galácticas
SkyCoord.from_name("M51", frame='galactic')
<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:
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
(<Longitude 104.85158472198123 deg>, <Latitude 68.5607018112399 deg>)
Y para obtener valores numéricos de los ángulos con los que operar, proceder como sigue:
# Á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
194.85158472198123
En el caso de las coordenadas ICRS los ángulos coordenados son ra y dec
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
# 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
# Obtengamos las coordenadas galácticas de un astro
# Elegimos una estrella del hemisferio sur
c = SkyCoord.from_name('Achernar', frame='galactic')
c
<SkyCoord (Galactic): l=290.841241695 deg, b=-58.7920097022 deg>
# Pasemoslas a coordenadas ecuatoriales FK5:
c.fk5
<SkyCoord (FK5): equinox=J2000.000, ra=24.4285197401 deg, dec=-57.2367527786 deg>
# Y recíprocamente, a partir de las coordenadas ICRS obtengamos las galácticas:
c = SkyCoord.from_name('Achernar', frame='icrs')
c.galactic
<SkyCoord (Galactic): l=290.841241695 deg, b=-58.7920097022 deg>