The NASA Exoplanet Science Institute (NExScI) (visit https://nexsci.caltech.edu) has developed a Python-based server to implement an API that complies with the Virtual Observatory (VO) Table Access Protocol(TAP) version 1.1 (September 2019) (http://ivoa.net/documents/TAP/20190927/index.html), a standard recommended by the International Virtual Observatory alliance (IVOA) (http://ivoa.net).
The TAP API enables a rich variety of searches against tabular data, includung cone, box or all-sky searches, temporal searches, combinations of spatial searches and temporal searches, searches against instrumental attributes and program attributes.
This tutorial supports demonstrates how to use the TAP+ client to perform synchronous TAP-based queries for public raw science and calibration data acquired with the NIRC2 near-infared imager; these data are hosted at the Keck Observatory Archive (KOA; https://koa.ipac.caltech.edu).
TAP+ was developed at the ESAC Space Data Centre (ESDC: http://www.cosmos.esa.int/web/esdc/) and can be installed from PyPI as part of the astroquery package:
$ pip install --upgrade astroquery
The tutorial requires Python 3.6 (or above), plus the table read and write functions from Astropy. We have tested with Astropy 4.0.1, but any version should work. We recommend using the Ananconda Python distribution.
import numpy as np
from astroquery.utils.tap.core import TapPlus
koa = TapPlus(url="https://koa.ipac.caltech.edu/TAP")
Created TAP+ (v20200428.1) - Connection: Host: koa.ipac.caltech.edu Use HTTPS: True Port: 443 SSL Port: 443
sql = "select koaid, filehand from koa_nirc2 where koaid like '%20140906%' "
job = koa.launch_job(sql)
r = job.get_results()
print(r)
koaid filehand ---------------------- ----------------------------------------------------- N2.20140906.11394.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11394.fits N2.20140906.11451.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11451.fits N2.20140906.11508.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11508.fits N2.20140906.11564.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11564.fits N2.20140906.11621.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11621.fits N2.20140906.11677.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11677.fits N2.20140906.11734.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11734.fits N2.20140906.11790.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11790.fits N2.20140906.11847.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11847.fits N2.20140906.11903.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11903.fits ... ... N2.20140906.36000.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36000.fits N2.20140906.36033.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36033.fits N2.20140906.36059.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36059.fits N2.20140906.36330.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36330.fits N2.20140906.36402.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36402.fits N2.20140906.36474.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36474.fits N2.20140906.36556.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36556.fits N2.20140906.36630.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36630.fits N2.20140906.36799.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36799.fits N2.20140906.36871.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36871.fits N2.20140906.36944.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36944.fits Length = 356 rows
job = koa.launch_job(sql, dump_to_file=True, output_file='KoaTapDate1.tbl', \
output_format='ipac')
job = koa.launch_job(sql, dump_to_file=True, output_file='KoaTapDate2.vot', \
output_format='votable')
job = koa.launch_job(sql, dump_to_file=True, output_file='KoaTapDate3.csv', \
output_format='csv')
job = koa.launch_job(sql, dump_to_file=True, output_file='KoaTapDate4.tsv', \
output_format='tsv')
sql = "select * from koa_nirc2 where koaid like '%20140906%'"
job = koa.launch_job(sql)
r = job.get_results()
print(r)
job = koa.launch_job(sql, dump_to_file=True, output_file='table_ascii.tbl', \
output_format='ipac')
koaid propint airmass aoaoamed ... y z spt_ind months ... ---------------------- ------- ------- -------- ... --------- -------- --------- N2.20140906.11394.fits 18 1.41291 17 ... 0.599661 0.707107 233211302 N2.20140906.11451.fits 18 1.41291 17 ... 0.599661 0.707107 233211302 N2.20140906.11508.fits 18 1.41291 17 ... 0.599661 0.707107 233211302 N2.20140906.11564.fits 18 1.41291 17 ... 0.599661 0.707107 233211302 N2.20140906.11621.fits 18 1.41291 17 ... 0.599661 0.707107 233211302 N2.20140906.11677.fits 18 1.41291 17 ... 0.599661 0.707107 233211302 N2.20140906.11734.fits 18 1.41291 17 ... 0.599661 0.707107 233211302 N2.20140906.11790.fits 18 1.41291 17 ... 0.599661 0.707107 233211302 N2.20140906.11847.fits 18 1.41291 17 ... 0.599661 0.707107 233211302 N2.20140906.11903.fits 18 1.41291 17 ... 0.599661 0.707107 233211302 ... ... ... ... ... ... ... ... N2.20140906.36033.fits 18 1.33107 243 ... -0.680536 0.641297 203030211 N2.20140906.36059.fits 18 1.33268 244 ... -0.680547 0.641282 203030211 N2.20140906.36330.fits 18 1.50117 26 ... -0.719692 0.645624 203032303 N2.20140906.36402.fits 18 1.50779 23 ... -0.719664 0.645646 203032303 N2.20140906.36474.fits 18 1.51454 132 ... -0.719682 0.645624 203032303 N2.20140906.36556.fits 18 1.52242 56 ... -0.719689 0.645626 203032303 N2.20140906.36630.fits 18 1.52953 66 ... -0.719667 0.645644 203032303 N2.20140906.36799.fits 18 1.5462 109 ... -0.719687 0.645628 203032303 N2.20140906.36871.fits 18 1.55344 126 ... -0.719669 0.645643 203032303 N2.20140906.36944.fits 18 1.56099 127 ... -0.719681 0.645628 203032303 Length = 356 rows
sql = "select koaid, filehand from koa_nirc2 \
where koaid like '%20140906%' "
job = koa.launch_job(sql)
r = job.get_results()
print(r)
job = koa.launch_job(sql, dump_to_file=True, output_file='columns.tbl', \
output_format='votable')
koaid filehand ---------------------- ----------------------------------------------------- N2.20140906.11394.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11394.fits N2.20140906.11451.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11451.fits N2.20140906.11508.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11508.fits N2.20140906.11564.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11564.fits N2.20140906.11621.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11621.fits N2.20140906.11677.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11677.fits N2.20140906.11734.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11734.fits N2.20140906.11790.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11790.fits N2.20140906.11847.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11847.fits N2.20140906.11903.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11903.fits ... ... N2.20140906.36000.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36000.fits N2.20140906.36033.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36033.fits N2.20140906.36059.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36059.fits N2.20140906.36330.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36330.fits N2.20140906.36402.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36402.fits N2.20140906.36474.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36474.fits N2.20140906.36556.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36556.fits N2.20140906.36630.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36630.fits N2.20140906.36799.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36799.fits N2.20140906.36871.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36871.fits N2.20140906.36944.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.36944.fits Length = 356 rows
sql = "select top 20 koaid, filehand, frameno from koa_nirc2 where koaid like '%20140906%'"
job = koa.launch_job(sql, dump_to_file=True, output_file='KoaTapTestFiniteRecords.tbl', output_format='ipac')
job = koa.launch_job(sql)
r = job.get_results()
print(r)
job = koa.launch_job(sql, dump_to_file=True, output_file='top20.tbl', \
output_format='ipac')
koaid ... frameno ---------------------- ... ------- N2.20140906.19352.fits ... 107 N2.20140906.19361.fits ... 108 N2.20140906.19375.fits ... 109 N2.20140906.19384.fits ... 110 N2.20140906.19394.fits ... 111 N2.20140906.19760.fits ... 142 N2.20140906.24877.fits ... 215 N2.20140906.24930.fits ... 216 N2.20140906.24979.fits ... 217 N2.20140906.25053.fits ... 218 N2.20140906.28767.fits ... 267 N2.20140906.29166.fits ... 271 N2.20140906.29235.fits ... 272 N2.20140906.29288.fits ... 273 N2.20140906.29377.fits ... 274 N2.20140906.29610.fits ... 275 N2.20140906.29659.fits ... 276 N2.20140906.29708.fits ... 277 N2.20140906.36871.fits ... 355 N2.20140906.36944.fits ... 356
sql="select koaid, filehand from koa_nirc2 \
where (utdatetime >= to_date('2014-09-06 03:00:00', \
'yyyy-mm-dd HH24:MI:SS') and \
utdatetime <= to_date('2014-09-06 05:00:00', 'yyyy-mm-dd HH24:MI:SS'))"
job = koa.launch_job(sql)
r = job.get_results()
print(r)
job = koa.launch_job(sql, dump_to_file=True, output_file='datetime_range.tbl', \
output_format='ipac')
koaid filehand ---------------------- ----------------------------------------------------- N2.20140906.11394.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11394.fits N2.20140906.11451.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11451.fits N2.20140906.11508.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11508.fits N2.20140906.11564.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11564.fits N2.20140906.11621.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11621.fits N2.20140906.11677.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11677.fits N2.20140906.11734.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11734.fits N2.20140906.11790.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11790.fits N2.20140906.11847.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11847.fits N2.20140906.11903.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.11903.fits ... ... N2.20140906.13076.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.13076.fits N2.20140906.13132.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.13132.fits N2.20140906.13189.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.13189.fits N2.20140906.13249.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.13249.fits N2.20140906.13305.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.13305.fits N2.20140906.13362.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.13362.fits N2.20140906.13418.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.13418.fits N2.20140906.13475.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.13475.fits N2.20140906.13531.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.13531.fits N2.20140906.13588.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.13588.fits N2.20140906.13644.fits /koadata10/NIRC2/20140906/lev0/N2.20140906.13644.fits Length = 43 rows
sql= ("select koaid, filehand, progid, ha, az \
from koa_nirc2 where (progid = 'N153N2') ")
job = koa.launch_job(sql)
r = job.get_results()
print(r)
job = koa.launch_job(sql, dump_to_file=True, output_file='progID.tbl', \
output_format='ipac')
koaid ... az ... degrees ---------------------- ... --------- N2.20081009.37236.fits ... 298.01464 N2.20081009.37250.fits ... 297.99602 N2.20081009.37264.fits ... 297.97716 N2.20081009.37278.fits ... 297.95829 N2.20081009.37292.fits ... 297.93938 N2.20081009.37305.fits ... 297.92123 N2.20081009.37319.fits ... 297.90345 N2.20081009.37332.fits ... 297.88539 N2.20081009.37346.fits ... 297.86745 N2.20081009.37360.fits ... 297.84932 ... ... ... N2.20140906.36033.fits ... -51.51143 N2.20140906.36059.fits ... -51.54799 N2.20140906.36330.fits ... -53.26467 N2.20140906.36402.fits ... -53.30977 N2.20140906.36474.fits ... -53.35836 N2.20140906.36556.fits ... -53.40971 N2.20140906.36630.fits ... -53.45242 N2.20140906.36799.fits ... -53.551 N2.20140906.36871.fits ... -53.58857 N2.20140906.36944.fits ... -53.62888 Length = 1923 rows
sql=("select koaid, filehand,ra, dec from koa_nirc2 where \
contains(point('icrs', ra, dec), \
circle('icrs', 238.0 27.6, 0.5))) = 1")
job = koa.launch_job(sql)
r = job.get_results()
print(r)
job = koa.launch_job(sql, dump_to_file=True, output_file='Spatial_cone.txt', \
output_format='ipac')
koaid ... dec ---------------------- ... -------- N2.20140906.18417.fits ... 27.60311 N2.20140906.18437.fits ... 27.60297 N2.20140906.18450.fits ... 27.60324 N2.20140906.18462.fits ... 27.60297 N2.20140906.18476.fits ... 27.60324 N2.20140906.18593.fits ... 27.60311 N2.20140906.18603.fits ... 27.60311 N2.20140906.18614.fits ... 27.60311 N2.20140906.18624.fits ... 27.60311 N2.20140906.18635.fits ... 27.60311 ... ... ... N2.20140906.20047.fits ... 27.60318 N2.20140906.20063.fits ... 27.60304 N2.20140906.20074.fits ... 27.60304 N2.20140906.20084.fits ... 27.60304 N2.20140906.20095.fits ... 27.60304 N2.20140906.20106.fits ... 27.60304 N2.20140906.20127.fits ... 27.60318 N2.20140906.20138.fits ... 27.60318 N2.20140906.20149.fits ... 27.60318 N2.20140906.20159.fits ... 27.60318 N2.20140906.20170.fits ... 27.60318 Length = 130 rows
sql=("select koaid, filehand, ra, dec from koa_nirc2 where \
contains(point('icrs', ra, dec), \
box('icrs', 238.0 27.6, 0.5, 0.5)) = 1")
job = koa.launch_job(sql)
r = job.get_results()
print(r)
job = koa.launch_job(sql, dump_to_file=True, output_file='SpatBox.txt', output_format='ipac')
koaid ... dec ---------------------- ... -------- N2.20140906.18417.fits ... 27.60311 N2.20140906.18437.fits ... 27.60297 N2.20140906.18450.fits ... 27.60324 N2.20140906.18462.fits ... 27.60297 N2.20140906.18476.fits ... 27.60324 N2.20140906.18593.fits ... 27.60311 N2.20140906.18603.fits ... 27.60311 N2.20140906.18614.fits ... 27.60311 N2.20140906.18624.fits ... 27.60311 N2.20140906.18635.fits ... 27.60311 ... ... ... N2.20140906.20047.fits ... 27.60318 N2.20140906.20063.fits ... 27.60304 N2.20140906.20074.fits ... 27.60304 N2.20140906.20084.fits ... 27.60304 N2.20140906.20095.fits ... 27.60304 N2.20140906.20106.fits ... 27.60304 N2.20140906.20127.fits ... 27.60318 N2.20140906.20138.fits ... 27.60318 N2.20140906.20149.fits ... 27.60318 N2.20140906.20159.fits ... 27.60318 N2.20140906.20170.fits ... 27.60318 Length = 130 rows
sql=("select koaid, filehand, ra, dec from koa_nirc2 where \
contains(point('icrs', ra, dec), \
polygon('icrs',237.5 27.1 238.5 27.1 238.5 28.1 237.5 28.1)) = 1")
job = koa.launch_job(sql)
r = job.get_results()
print(r)
job = koa.launch_job(sql, dump_to_file=True, output_file='SpatPoly.txt', \
output_format='ipac')
koaid ... dec ---------------------- ... -------- N2.20140906.18417.fits ... 27.60311 N2.20140906.18437.fits ... 27.60297 N2.20140906.18450.fits ... 27.60324 N2.20140906.18462.fits ... 27.60297 N2.20140906.18476.fits ... 27.60324 N2.20140906.18593.fits ... 27.60311 N2.20140906.18603.fits ... 27.60311 N2.20140906.18614.fits ... 27.60311 N2.20140906.18624.fits ... 27.60311 N2.20140906.18635.fits ... 27.60311 ... ... ... N2.20140906.20047.fits ... 27.60318 N2.20140906.20063.fits ... 27.60304 N2.20140906.20074.fits ... 27.60304 N2.20140906.20084.fits ... 27.60304 N2.20140906.20095.fits ... 27.60304 N2.20140906.20106.fits ... 27.60304 N2.20140906.20127.fits ... 27.60318 N2.20140906.20138.fits ... 27.60318 N2.20140906.20149.fits ... 27.60318 N2.20140906.20159.fits ... 27.60318 N2.20140906.20170.fits ... 27.60318 Length = 130 rows
sql=("select count(*) from koa_nirc2 where \
date_obs=to_date('2014-09-06', 'YYYY-MM-DD')")
job = koa.launch_job(sql)
r = job.get_results()
print(r)
count(*) -------- 356
sql="select count(*) as total from koa_nirc2"
job = koa.launch_job(sql)
r = job.get_results()
print(r)
total ----- 2000
Visit KOA at https://koa.ipac.caltech.edu.
The Keck Observatory Archive (KOA) is a collaboration between the NASA Exoplanet Science Institute (NExScI) and the W. M. Keck Observatory (WMKO). NExScI is sponsored by NASA's Exoplanet Exploration Program, and operated by the California Institute of Technology in coordination with the Jet Propulsion Laboratory (JPL).
Need help? Submit your questions to the KOA Help Desk at https://koa.ipac.caltech.edu/cgi-bin/Helpdesk/nph-genTicketForm?projname=KOA