4

I'm trying to obtain coordinates for all frames using the Simbad class from astroquery, just like it is shown on the SIMBAD web page (Basic data section)

I have the following code :

from astroquery.simbad import Simbad

def get():
    Simbad.reset_votable_fields()
    Simbad.remove_votable_fields('coordinates')

    Simbad.add_votable_fields('ra(:;A;ICRS;J2000)', 'dec(:;D;ICRS;2000)')
    Simbad.add_votable_fields('ra(:;A;FK5;J2000)', 'dec(:;D;FK5;2000)')

    table = Simbad.query_object("Betelgeuse", wildcard=False)

but I'm getting the error:

KeyError: 'ra(:;A;FK5;J2000): field already present. Fields ra,dec,id,otype, and bibcodelist can only be specified once. To change their options, first remove the existing entry, then add a new one.'

Everything I could find in the doc about manipulating votable fields, especially coordinates is this :

http://astroquery.readthedocs.io/en/latest/simbad/simbad.html#specifying-the-format-of-the-included-votable-fields

Is there a way to get coordinates for all frames sending one query to SIMBAD?

MSeifert
  • 145,886
  • 38
  • 333
  • 352
civa
  • 459
  • 3
  • 12

2 Answers2

3

Instead of querying multiple coordinates (which seems impossible with astroquery) from SIMBAD you could convert the coordinates by using astropy.coordinates.SkyCoord.

For example:

from astroquery.simbad import Simbad
from astropy.coordinates import SkyCoord

Simbad.reset_votable_fields()
Simbad.remove_votable_fields('coordinates')
Simbad.add_votable_fields('ra(:;A;ICRS;J2000)', 'dec(:;D;ICRS;2000)')
table = Simbad.query_object("Betelgeuse", wildcard=False)
coords = SkyCoord(ra=['{}h{}m{}s'.format(*ra.split(':')) for ra in table['RA___A_ICRS_J2000']], 
                  dec=['{}d{}m{}s'.format(*dec.split(':')) for dec in table['DEC___D_ICRS_2000']],
                  frame='icrs', equinox='J2000')

Which is a now a SkyCoord object that can be transformed to other frames:

>>> coords
<SkyCoord (ICRS): (ra, dec) in deg
    ( 88.79293875,  7.40706389)>
>>> coords.fk4
<SkyCoord (FK4: equinox=J2000.000, obstime=B1950.000): (ra, dec) in deg
    ( 88.79274075,  7.40705223)>
>>> coords.fk5
<SkyCoord (FK5: equinox=J2000.000): (ra, dec) in deg
    ( 88.79294545,  7.40705842)>

This can be converted to strings again, for example in hms dms formatting:

>>> coords.fk5.to_string('hmsdms')
['05h55m10.3069s +07d24m25.4103s']

If you want these as additional columns in your table, you can simply add these:

>>> table['RA FK5'] = coords.fk5.ra
>>> table['DEC FK5'] = coords.fk5.dec
>>> table['FK4'] = coords.fk4.to_string('hmsdms')
>>> table
 MAIN_ID  RA___A_ICRS_J2000 DEC___D_ICRS_2000     RA FK5       DEC FK5                 FK4             
               "h:m:s"           "d:m:s"           deg           deg     
--------- ----------------- ----------------- ------------- ------------- -----------------------------
* alf Ori     05:55:10.3053     +07:24:25.430 88.7929454548 7.40705841559 05h55m10.2578s +07d24m25.388s
MSeifert
  • 145,886
  • 38
  • 333
  • 352
  • Thank you very much for the detailed answer! Didn't know I can actually convert from one frame to another with astropy. – civa Dec 31 '16 at 09:54
1

For reasons I can't determine, astroquery did not support multiple configurable added VO options. It will soon, though: see this pull request. There were no problems with the code you posted, just a bug in astroquery.

keflavich
  • 18,278
  • 20
  • 86
  • 118