Source code for astroquery.nasa_exoplanet_archive.nasa_exoplanet_archive
# Licensed under a 3-clause BSD style license - see LICENSE.rst
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import json
import os
from astropy.utils.data import download_file
from astropy.io import ascii
from astropy.table import QTable
from astropy.coordinates import SkyCoord
import astropy.units as u
__all__ = ['NasaExoplanetArchive']
EXOPLANETS_CSV_URL = ('http://exoplanetarchive.ipac.caltech.edu/cgi-bin/'
'nstedAPI/nph-nstedAPI?table=exoplanets')
TIME_ATTRS = {'rowupdate': 'iso'}
BOOL_ATTRS = ('pl_kepflag', 'pl_ttvflag', 'pl_k2flag', 'st_massblend',
'st_optmagblend', 'st_radblend', 'st_teffblend')
[docs]class NasaExoplanetArchiveClass(object):
"""
Exoplanet Archive querying object. Use the ``get_confirmed_planets_table``
or ``query_planet`` methods to get information about exoplanets via the NASA
Exoplanet Archive.
"""
def __init__(self):
self._param_units = None
self._table = None
@property
def param_units(self):
if self._param_units is None:
module_dir = os.path.dirname(os.path.abspath(__file__))
units_file = open(os.path.join(module_dir, 'data',
'exoplanet_nexsci_units.json'))
self._param_units = json.load(units_file)
return self._param_units
[docs] def get_confirmed_planets_table(self, cache=True, show_progress=True,
table_path=None, all_columns=False):
"""
Download (and optionally cache) the `NExScI Exoplanet Archive Confirmed
Planets table <http://exoplanetarchive.ipac.caltech.edu/index.html>`_.
The Exoplanet Archive table returns lots of columns of data. A full
description of the columns can be found `here
<https://exoplanetarchive.ipac.caltech.edu/docs/API_exoplanet_columns.html>`_
Parameters
----------
cache : bool (optional)
Cache exoplanet table to local astropy cache? Default is `True`.
show_progress : bool (optional)
Show progress of exoplanet table download (if no cached copy is
available). Default is `True`.
table_path : str (optional)
Path to a local table file. Default `None` will trigger a
download of the table from the internet.
all_columns : bool (optional)
Return all available columns. The default returns only the
columns in the default category at the link above.
Returns
-------
table : `~astropy.table.QTable`
Table of exoplanet properties.
"""
if self._table is None or not cache:
if table_path is None:
exoplanets_url = EXOPLANETS_CSV_URL
if all_columns:
exoplanets_url = EXOPLANETS_CSV_URL + '&select=*'
table_path = download_file(exoplanets_url, cache=cache,
show_progress=show_progress,
timeout=120)
exoplanets_table = ascii.read(table_path)
# Store column of lowercase names for indexing:
lowercase_names = [host_name.lower().replace(' ', '') + letter
for host_name, letter in
zip(exoplanets_table['pl_hostname'].data,
exoplanets_table['pl_letter'].data)]
exoplanets_table['NAME_LOWERCASE'] = lowercase_names
exoplanets_table.add_index('NAME_LOWERCASE')
# Create sky coordinate mixin column
exoplanets_table['sky_coord'] = SkyCoord(ra=exoplanets_table['ra'] * u.deg,
dec=exoplanets_table['dec'] * u.deg)
# Assign units to columns where possible
for col in exoplanets_table.colnames:
if col in self.param_units:
# Check that unit is implemented in this version of astropy
if hasattr(u, self.param_units[col]):
exoplanets_table[col].unit = u.Unit(self.param_units[col])
self._table = QTable(exoplanets_table)
return self._table
[docs] def query_planet(self, planet_name, table_path=None,
all_columns=False):
"""
Get table of exoplanet properties.
Parameters
----------
planet_name : str
Name of planet
table_path : str (optional)
Path to a local table file. Default `None` will trigger a
download of the table from the internet.
all_columns : bool (optional)
Return all available columns. The default returns only the
columns in the default category at the link above.
Return
------
table : `~astropy.table.QTable`
Table of one exoplanet's properties.
"""
exoplanet_table = self.get_confirmed_planets_table(table_path=table_path)
return exoplanet_table.loc[planet_name.strip().lower().replace(' ', '')]
NasaExoplanetArchive = NasaExoplanetArchiveClass()