{ "metadata": { "name": "", "signature": "sha256:d943964ccbb5eed4b93831ba725b2bb49a269be234e50a85ec250508d5f92742" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Trabajando con coordenadas astron\u00f3micas en Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El prop\u00f3sito de esta entrada es mostrar como se puede trabajar con los distintos sistemas de coordenadas astron\u00f3micas utilizando las librer\u00edas de Python adecuadas.\n", "\n", "En esta entrada, como en la mayor\u00eda de las siguientes, se utilizar\u00e1 el **notebook de IPython**\n", "\n", "Autor: [Eduardo Mart\u00edn Calleja](http://balbuceosastropy.blogspot.com.es/)" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Importaciones y referencias" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "from __future__ import division\n", "\n", "# Importaci\u00f3n de la librer\u00eda PyEphem\n", "import ephem\n", "\n", "import astropy\n", "\n", "#Esto suprime algunos deprecation warnings que molestan pero no interfieren con la ejecuci\u00f3n\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", "# Generar un cuadro con versiones de las librer\u00edas utilizadas en este notebook\n", "#https://github.com/jrjohansson/version_information\n", "%load_ext version_information\n", "%version_information ephem, astropy" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
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
" ], "json": [ "{\"Software versions\": [{\"version\": \"2.7.9 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]\", \"module\": \"Python\"}, {\"version\": \"2.3.1\", \"module\": \"IPython\"}, {\"version\": \"Linux 3.13.0 44 generic x86_64 with debian jessie sid\", \"module\": \"OS\"}, {\"version\": \"3.7.5.3\", \"module\": \"ephem\"}, {\"version\": \"0.4.3\", \"module\": \"astropy\"}]}" ], "latex": [ "\\begin{tabular}{|l|l|}\\hline\n", "{\\bf Software} & {\\bf Version} \\\\ \\hline\\hline\n", "Python & 2.7.9 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] \\\\ \\hline\n", "IPython & 2.3.1 \\\\ \\hline\n", "OS & Linux 3.13.0 44 generic x86\\_64 with debian jessie sid \\\\ \\hline\n", "ephem & 3.7.5.3 \\\\ \\hline\n", "astropy & 0.4.3 \\\\ \\hline\n", "\\hline \\multicolumn{2}{|l|}{Wed Jan 21 15:00:22 2015 CET} \\\\ \\hline\n", "\\end{tabular}\n" ], "metadata": {}, "output_type": "pyout", "prompt_number": 1, "text": [ "Software versions\n", "Python 2.7.9 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]\n", "IPython 2.3.1\n", "OS Linux 3.13.0 44 generic x86_64 with debian jessie sid\n", "ephem 3.7.5.3\n", "astropy 0.4.3\n", "Wed Jan 21 15:00:22 2015 CET" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Algunas referencias \u00fatiles:\n", "\n", "[PyEphem home page](http://rhodesmill.org/pyephem/)\n", "\n", "[Astrometry in Python with PyEphem](http://oneau.wordpress.com/2010/07/04/astrometry-in-python-with-pyephem/)\n", "\n", "[PyEphem Tutorial](http://zeus.asu.cas.cz/extra/pyephem-manual.html)" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "1. Coordenadas esf\u00e9ricas ecuatoriales" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vienen definidas por una ascensi\u00f3n recta (ra), una declinaci\u00f3n (dec) y un epoch.\n", "\n", " La ra viene representada normalmente como un string de la forma \"hh:mm:ss\"\n", "\n", " La dec se representa normalmente como un string de la forma \"+/-\u00ba:':''\"\n", "\n", " El epoch por defecto es J2000.0\n", "\n", "Sus elementos son:\n", "\n", "- El origen es el cento de la Tierra (es decir, son coordenadas geoc\u00e9ntricas)\n", "- El plano fundamental es la proyecci\u00f3n del ecuador terrestre en la esfera celeste\n", "- La direcci\u00f3n primaria es la del equinoccio de primavera en una fecha determinada (el epoch)\n", "- El convenio de direcci\u00f3n es que la ra se mide positivamente hacia el este y hacia el norte.\n", "\n", "Las coordenadas ecuatoriales de un objeto se representan en ephem como instancias de la clase Equatorial\n", "\n", "ra, dec y epoch son atributos del objeto" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# vamos a definir las coordenadas ecuatoriales de un objeto\n", "eq=ephem.Equatorial('13:24:42.5','-60:15:59.4')\n", "\n", "# Internamente se almacenan en radianes, para facilitar los c\u00e1lculos\n", "eq.ra, eq.dec, eq.epoch" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "(3.511202483725676, -1.0518488536531627, 36524.5)" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "# Sin embargo se imprimen como strings\n", "print eq.ra, '\\t', eq.dec, '\\t', eq.epoch" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "13:24:42.50 \t-60:15:59.4 \t2000/1/1 00:00:00\n" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "# Podemos obtener una tupla (ra,dec) utilizando el m\u00e9todo get()\n", "print eq.get()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(3.511202483725676, -1.0518488536531627)\n" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "# Indica en qu\u00e9 constelaci\u00f3n se situa una tupla de coordenadas\n", "ephem.constellation((eq.ra,eq.dec))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "('Cen', 'Centaurus')" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tambi\u00e9n podemos utilizar otro epoch diferente del J2000:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "eq50=ephem.Equatorial('13:24:42.5','-60:15:59.4',epoch=ephem.B1950)\n", "print eq50.ra, '\\t', eq50.dec, '\\t', eq50.epoch" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "13:24:42.50 \t-60:15:59.4 \t1949/12/31 22:09:50\n" ] } ], "prompt_number": 6 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "2. Coordenadas gal\u00e1cticas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tambien se trata de un sistema de coordenadas esf\u00e9ricas. Sus elementos son:\n", "\n", "- El centro se situa en el Sol (son coordenadas helioc\u00e9nticas)\n", "- El plano fundamental es aproximadamente el plano de nuestra galaxia (la V\u00eda Lactea)\n", "- La direcci\u00f3n primaria apunta aproximadamente al centro de nuesta galaxia\n", "- El convenio es que las direcciones son positivas hacia el norte y hacia el este en el plano fundamental.\n", "\n", "Las coordenadas son longitud (lon / l) y latitud(lat / b), ambas expresadas en grados, no en horas" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Definici\u00f3n de las coordenadas gal\u00e1cticas de un objeto\n", "ga=ephem.Galactic('1:59:55.9','+89:59:59.9') \n", "print ga.lon, ga.lat\n", "\n", "# Longitud y latitud utilizando el m\u00e9todo get(). Se muestran en radianes\n", "print ga.get()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1:59:55.9 89:59:59.9\n", "(0.0348867076789611, 1.5707958419812156)\n" ] } ], "prompt_number": 7 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "3. Conversi\u00f3n entre sistemas de coordenadas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las coordenadas pueden ser convertidas entre un sistema y otro pasando un objeto del primer tipo como imput a una clase del segundo tipo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Conversi\u00f3n de coordenadas ecuatoriales entre epochs\n", "eq1 = eq=ephem.Equatorial('13:24:42.5','-60:15:59.4')\n", "eq2 = ephem.Equatorial(eq1,epoch=ephem.B1950)\n", "print eq1.get()\n", "print eq2.get()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(3.511202483725676, -1.0518488536531627)\n", "(3.49702212460356, -1.04730555904456)\n" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "# Conversi\u00f3n de coordenadas gal\u00e1cticas a ecuatoriales\n", "# En realidad esta declaraci\u00f3n de epoch se puede omitir\n", "ga1 = ephem.Galactic('0','90',epoch=ephem.J2000)\n", "eq1 = ephem.Equatorial(ga1)\n", "print eq1.ra, eq1.dec" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "12:51:26.28 27:07:41.7\n" ] } ], "prompt_number": 9 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "4. Obtener las coordenadas de un objeto por su nombre" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para esto se utilizar\u00e1 el m\u00f3dulo SkyCoord de la librer\u00eda astropy.coordinates con el sufijo from_name, el cual obtiene las coordenadas a partir del servidor [SESAME](http://cds.u-strasbg.fr/cgi-bin/Sesame)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from astropy.coordinates import SkyCoord" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "El \"International Celestial Reference System\" (ICRS) es el sistema de referencia celeste adoptado como est\u00e1ndar en la actualidad por la Uni\u00f3n Astron\u00f3mica Internacional (IAU). Estas coordenadas coinciden con mucha aproximaci\u00f3n con las coordenadas ecuatoriales J2000.0. Las coordenadas ICRS se pueden obtener dando el nombre del objeto en cualquiera de los cat\u00e1logos utilizados por el servicio SESAME" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Galaxia Remolino\n", "SkyCoord.from_name(\"M51\") # \"icrs\" es la opci\u00f3n por defecto" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "" ] } ], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "# El mismo objeto en coordenadas gal\u00e1cticas\n", "SkyCoord.from_name(\"M51\", frame='galactic')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para acceder a los valores de los \u00e1ngulos (longitud y latitud en este caso) hay varias opciones:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "c = SkyCoord.from_name(\"M51\", frame='galactic')\n", "# se puede acceder internamente a longitud y latitud con c.l y c.b\n", "# La representaci\u00f3n interna de los \u00e1ngulos es en grados\n", "# Sin embargo, con estos valores no se puede operar directamente\n", "c.l, c.b" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "(, )" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y para obtener valores num\u00e9ricos de los \u00e1ngulos con los que operar, proceder como sigue:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# \u00c1ngulos en radianes\n", "print c.l.radian, c.b.radian\n", "\n", "# \u00c1ngulos en grados\n", "print c.l.degree, c.b.degree\n", "\n", "# Ejemplo de operaci\u00f3n matem\u00e1tica\n", "c.l.degree + 90" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1.83000537933 1.19660998408\n", "104.851584722 68.5607018112\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "194.85158472198123" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "En el caso de las coordenadas ICRS los \u00e1ngulos coordenados son ra y dec" ] }, { "cell_type": "code", "collapsed": false, "input": [ "c = SkyCoord.from_name(\"M51\", frame='icrs')\n", "\n", "# Se trata de una representaci\u00f3n en forma de string no apta para operar\n", "print c\n", "\n", "# proporciona una tupla \"horas\", \"minutos\", \"segundos\"\n", "print c.ra.hms\n", "\n", "# valores en grados\n", "print c.dec.degree\n", "\n", "# Por supuesto se pueden expresar en otros tipos de unidades\n", "print c.ra.radian, c.dec.radian" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "hms_tuple(h=13.0, m=29.0, s=52.69800000000572)\n", "47.1952583\n", "3.53376071886 0.823712648664\n" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Otro sistema de coordenadas proporcionado por la librer\u00eda astropy es FK5. Es un sistema de coordenadas ecuatoriales basado en el Epoch J2000, que coincide pr\u00e1cticamente con las coordenadas ICRS" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Coordenadas ICRS\n", "c = SkyCoord.from_name(\"M51\", frame='icrs')\n", "\n", "# Coordenadas FK5\n", "c5 = SkyCoord.from_name(\"M51\", frame='fk5')\n", "\n", "# En este ejemplo se puede apreciar la similitud entre ambas\n", "print 'coordenadas ICRS: ',c.ra.hms, c.dec.degree\n", "print 'coordenadas FK5: ', c5.ra.hms, c5.dec.degree\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "coordenadas ICRS: hms_tuple(h=13.0, m=29.0, s=52.69800000000572) 47.1952583\n", "coordenadas FK5: hms_tuple(h=13.0, m=29.0, s=52.697952632941849) 47.1952580768\n" ] } ], "prompt_number": 16 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "5. Conversi\u00f3n entre sistemas de coordenadas con astropy" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Obtengamos las coordenadas gal\u00e1cticas de un astro\n", "# Elegimos una estrella del hemisferio sur\n", "\n", "c = SkyCoord.from_name('Achernar', frame='galactic')\n", "c" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "# Pasemoslas a coordenadas ecuatoriales FK5:\n", "c.fk5" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "# Y rec\u00edprocamente, a partir de las coordenadas ICRS obtengamos las gal\u00e1cticas:\n", "c = SkyCoord.from_name('Achernar', frame='icrs')\n", "c.galactic" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "" ] } ], "prompt_number": 19 } ], "metadata": {} } ] }