viernes, 26 de noviembre de 2004

Como programar aplicaciones de astronomia

Esta es la reescritura de un artículo que escribí hace bastante y que habia perdido. Buscando por un antiguo backup de mis antiguas bases de datos he conseguido recuperarlo y aqui lo dejo. Empieza así:

Las aplicaciones de astronomia no son cosa facil de hacer. Por un lado está la aplicación en si, la interfaz que le hagas, la facilidad de la misma para que el usuario pueda manejarla sencillamente… hacerla mas o menos fácil y rápidamente depende sobretodo del lenguaje de programación que elijas.

Pero ademas cuando programas una aplicación de astronomia tienes que preocuparte también en conocer como se comportarán los objetos (planetas, constelaciones, etc) de tu programa, calcular las orbitas y todo lo demás para que tu programa pueda dar los datos que pida el usuario del objeto que el quiera. Y eso también es tan complicado o seguramente mas que hacer la misma aplicación, ya que requiere un profundo conocimiento de astrofísica que no todo programador tiene.

De todos modos no hay que asustarse, ya que todos estos “peros” tienen una respuesta, el uso de Python como lenguaje de programación, fácil, sencillo y rápido de programar y de PyEphem, que se encargará por nosotros de hacer todos esos “complicados cálculos”.

Python es un lenguaje interpretado multiplataforma, funciona en varios sistemas operativos tales como Windows, Linux y cualquier otro Unix que se precie. Es además muy fácil de aprender y desarrollas muy rápido con el, sobretodo grácias a que dispone de gran cantidad de módulos (funciones) que realizan tareas predeterminadas que te ahorran tener que programar gran parte del código de tu programa.

El PyEphem es uno de esos módulos. Está basado en el funcionamiento (usa sus rutinas) y base de datos del Xephem, uno de los más potentes y conocidos programas de astronomia para Unix y es capaz de realizar casi cualquier cálculo astronómico sobre casi cualquier objeto celeste que queramos, cálculo que incluye variables tales como posición desde la que observas (longitud, latitud), la hora, distancia del objeto a la tierra o al sol, etc, etc.

Para quien no conozca Python ponerse a programar con PyEphem puede resultar un poco chocante, así que antes de ponerse a programar cualquier cosilla con este módulo, es recomendable leerse un buen manual de Python como este.

Una vez nos manejemos decentemente con Python, podremos empezar con PyEphem. Este tiene un excelente manual, donde nos explica las distintas posibilidades, variables, etc, que tiene junto con ejemplos de la mayoria de ellas.

Las posibilidades son muchas. Puede calcular objetos usando una base de datos de objetos. Por ejemplo, de esta forma:


#!/usr/bin/python
import ephem
polaris = ephem.readdb(”Polaris,f|M|F7,2:31:48.704,89:15:50.72,
2.02,2000″)
polaris.compute()
print polaris.dec,polaris.ra

Con esto nos imprime en pantalla los grados en declinación (dec) y ascensión recta (ra) de la estrella Polaris. Facil, sencillo y sobretodo potente.

Otro ejemplo, calculemos la salida y puesta del planeta Saturno desde la ciudad de Valencia en España. Para los objetos del sistema solar no necesitamos usar la base de datos, ya que PyEphem tiene modulos pre-creados para todos los planetas, el Sol y la Luna. Veamos el ejemplo de Saturno:


#!/usr/bin/python
import ephem

#Con esto especificamos el tipo de datos que queremos, de observación y especificamos la longitud (long) y la latitud (lat) desde donde observamos.
gatech = ephem.Observer()
gatech.long, gatech.lat = ‘-0.3667′, ‘39.4667′

#Especificamos la fecha de observacion. Si no lo hacemos usará la fecha en que se ejecute el programa
gatech.date = ‘2006/3/26′

#Establecemos la variable Mi_Saturno con el valor de cálculo para el modulo Saturn y luego computamos los datos con los anteriores
Mi_Saturno=ephem.Saturn()
Mi_Saturno.compute(gatech)

#Ahora solo tenemos que imprimir los resultados que queramos.
print “Salida de Saturno”,Mi_Saturno.rise_time
print “Ocaso de Saturno”,Mi_Saturno.set_time

Ahora imaginemos que queremos utilizar la base de datos de forma más amplia con la cual podremos calcular casi casi cualquier objeto que pueda calcular el mismo Xephem. Para ello necesitamos primero descargar los archivos con los mismos datos que usa el Xephem para hacer sus cálculos, que podemos encontrar en http://www.maa.mhn.de/Tools/Xephem/. Tenemos archivos para asteroides, cometas, estrellas, galaxias e inclúso satélites artificiales… Ahora hagamos un pequeño cálculo, por ejemplo, el cometa 2P/Encke. Abrimos el archivo para los cometas (comets.edb), buscamos nuestro cometa y cogemos sus datos, que son:

2P/Encke,e,11.9296,334.7215,186.2720,2.209499,0.3000981,
0.850013,2.5215,06/01.0/1997,2000,g 11.5,6.0

Estos números son los datos que utiliza el Xephem en base a una serie de cálculos astronómicos. Con esto y solo esto el Xephem calcula casi cualquier objeto astronómico que le des y como el PyEphem está basado en el Xephem, pues también nos valen a nosotros.

Y entonces ¿Que hacemos ahora con estos datos?


#!/usr/bin/python
import ephem

#Solo tenemos que añadir una variable con los datos que hemos recogido de nuestro cometa. Podria ser cualquier otro objeto de cualquier otra base de datos válida para el Xephem.
encke = ephem.readdb(”2P/Encke,e,11.9296,334.7215,186.2720,2.209499,0.3000981,0.850013,2.5215,06/01.0/1997,2000,g 11.5,6.0″)

#Ahora calculamos los datos con compute e imprimimos lo que queremos:)
encke.compute()
print encke.dec,encke.ra,encke.mag

Y ya tenemos los grados en declinación (dec) y ascensión recta (ra) mas la magnitud visual (mag) del cometa 2P/Encke. ¿Facil, verdad? Tanto del cometa como de cualquier otro objeto podemos calcular mil y una cosas, tales como distancia hasta el sol (seria añadir un encke.sun_distance), distancia hasta la tierra (con earth_distance), porcentaje de iluminación del objeto por el Sol (con phase) y mil cosillas más, aunque seria recomendable añadirle los datos al programa de cálculo que hagamos nuestra longitud y latitud para obtener unos datos fiables para nuestra localización, tal como hicimos al calcular Saturno. Así pues podemos utilizar un amplio abanico de datos sobre un único objeto para obtener toda la cantidad posible de información que sea posible obtener. Hora de salida, hora de puesta, magnitud, ascensión recta, declinación, todos estos datos que hemos ido viendo en los distintos ejemplos los podemos aplicar sobre un único objeto, por ejemplo, nuestro cometa. Eso si, hay que ser consecuente con lo que se pide al PyEphem… hacer un cálculo de magnitud visual sobre el Sol, por ejemplo, no debe dar muy buenos resultados. Pero… ¿Y que más? ¿Que más puedo calcular con el PyEphem?

A parte de lo ya visto podemos calcular distancias hasta el Sol o hasta la Tierra en UA, podemos calcular porcentaje del objeto iluminado por el Sol como ya hemos visto con nuestro cometa (muy útil para las fases de la Luna), posición para el observador en grados acimutales norte/este y grados de altitud desde el horizonte, tamaño del objeto en el arco en segundos (muy interesante también para calcular la amplitud del objeto que queremos observar), angulo en grados entre la posición del sol y del objeto e incluso podemos calcular la inclinación de los anillos de Saturno vistos desde la Tierra (con Saturn.earth_tilt). Impresionante ¿Verdad?

Ejemplos de como calcular todo lo visto podeis encontrarlos en la web del PyEphem, realmente la variedad de cálculos que podemos hacer de forma tan sencilla es impresionante. Personalmente muchos de los cálculos que hace no los entiendo (cálculos de ángulos, precesiones, épocas y demás) pero bueno, es que hace de todo y mis conocimientos de astronomia aun son en plan “iniciación:)”.
Lo único que necesitaremos para instalar el PyEphem es un sistema operativo con Python instalado, al menos la versión 2.2.2, ya que con anteriores no funciona (comprobado personalmente).Es facil de instalar, tan solo ejecutar el comando

#python setup.py install

Y ya lo tendremos instalado y listo para probar los ejemplos de su manual (o los que acabais de leer).

Una vez tenemos solucionado el tema de los cálculos astronómicos, seguramente la parte mas dificil para un programador no muy avezado con la astrofísica, ya podremos dedicarnos pacientemente a programar la interfaz. Tal como veis los ejemplos solo os mostrará los resultados en la consola pero podeis utilizar interfaces gráficas para Python (wxpython, python-gtk,pyqt, etc) o pasarlas directamente a cgis para programar una aplicación web (como este buscador astronómico). Pero esa “historia” ya no entra en este artículo, eso habrá que buscarselo en otro sitio:).