PyKOA offers access to public raw science and calibration files acquired with the NIRSPEC cross-dispersed echelle spectrograph, and for data acqired in the high-dispesion mode, access to quicklook extracted spectra. The quick-look extracted files are intended for visualization and not for scientific analysis. See https://koa.ipac.caltech.edu/UserGuide/NIRSPEC/extracted_spectra.html for a description of the extraction. For Keck Observatory PIs, PyKOA offers secure access to their protected data with the KOA credentials assigned to them.
Queries can be launched through several dedicated methods, or through the IVOA Astronomical Data Query Langage (ADQL); ADQL queries are underpinned by nexsciTAP, a NExScI Python-based server that implements the IVOA Table Access Protocol (TAP). PyKOA enables a rich variety of searches, including cone, box, polygon, or all-sky spatial searches; temporal searches; searches on program infotmation; and complex searches on multiple attributes.
This Jupyter Notebook provides examples of the methods supported by PyKOA, and examples of how Keck PIs may access their protected data.
PyKOA can be installed from PyPI:
$ pip install --upgrade pykoa
Requires Python 3.6 (or above), plus table read and write functions from Astropy. We have tested with Astropy 4.0.1. We recommend using the Anaconda Python distribution.
PyKOA supports methods for discovering and downloading public and private data archived at KOA. It writes the output metadata data to an output file, in IPAC ASCII, VOTable, CSV or TSV data formats.
This Tutorial illustrates methods for discovering and accessing public and private raw science and calibration files for HIRES:
General, complex metadata queries using the IVOA Astronomical Data Query Langage (ADQL).
Download raw science and associated calibration files, level 1 files or a subset of data, corresponding to a collection of metadata.
Queries for protected data (available to Keck PIs only).
The number of records returned by each query may differ from the number returned in this Notebook because new data are made public daily.
import sys
import io
import os
from pykoa.koa import Koa
from astropy.table import Table,Column
help(Koa)
Help on Archive in module pykoa.koa.core object: class Archive(builtins.object) | Archive(**kwargs) | | The 'Archive' class provides functions for accessing data stored in the | Keck Observatory Archive (KOA). Queries are performed via the nexsciTAP | server. | | Keck PIs can use the KOA credentials assigned to them when data were | acquired (given at login) to search for their proprietary data. | | Example: | -------- | | import os | import sys | | from pykoa.koa import Koa | | Koa.query_datetime ('hires', '2018-03-16 00:00:00/2018-03-18 00:00:00', outpath= './meta.xml', format='ipac') | | Methods defined here: | | __init__(self, **kwargs) | 'init' method initializes the class with optional debugfile flag. | | Optional inputs: | ---------------- | debugfile: a file path for the debug output | | download(self, metapath, format, outdir, **kwargs) | 'download' method allows download of FITS files shown in the | metadata file. The same method has the option of download the | associated calibration files and level 1 files. | | *** Requirement: | | To download FITS files, the following two columns: | instrume and filehand must be included in the metadata file. | | To download associated calibrated files, the following three | columns: instrume, koaid, and filehand must be included in the | metadata file. | | | Required input: | ----- | metapath (string): a full path metadata table obtained from running | query methods | | format (string): metadata table's format: ipac, votable, csv, or tsv. | | outdir (string): the directory for depositing the returned files | | At least one of the following three optional parameters: | lev1file, lev1file, and calibfile should be set to 1.: | | | Optional input: | ---------------- | cookiepath (string): cookie file path for downloading the proprietary | KOA data; | | start_row (integer): default is start_row = 0; | | end_row (integer): default is end_row = nrows - 1 where nrows is the | number of rows in the metadata file; | | lev0file (integer): 1/0; | 1: download level0 files (i.e. raw data) in 'lev0' directory; | 0: do not download level0 files. | default is 1. | | calibfile (integer): 1/0; | 1: download calibration files; | 0: do not download calibration files. | default is 0. | | lev1file (integer): 1/0; | 1: download level1 files in 'lev1' directory; | 0: do not download level1 files. | default is 0. | | calibdir (integer): 1/0; | 1: put calibration files in their own directory named 'calib'; | 0: put the calibration files in the 'lev0' directory with other | raw, science files. | default is 1. | | login(self, cookiepath, **kwargs) | 'login' method validates a user has a valid KOA account; it takes two | 'keyword' arguments: userid and password. If the inputs are not | provided in the keyword, the login method prompts for inputs. | | Required input: | --------------- | cookiepath (string): a file path provided by the user to save | returned cookie (in login method) or to serve | as input parameter for the subsequent koa | query and download methods. | | Keyword input: | --------------- | userid (string): a valid user id assigned by KOA; | | password (string): a valid password in the KOA's user table; | | | Calling synopsis: | | koa.login (cookiepath, userid='xxxx', password='xxxxxx'), or | | koa.login (cookiepath): and the program will prompt for | userid and password | | print_data(self) | | query_adql(self, query, outpath, **kwargs) | 'query_adql' method receives a qualified ADQL query string from | the user input. | | Required Inputs: | --------------- | query (string): an ADQL query | | outpath (string): the output filename of the returned metadata table | | Optional inputs: | ---------------- | cookiepath (string): cookie file path for query the proprietary | KOA data. | | format (string): output format: votable, ipac, csv, or tsv | (default: ipac) | | maxrec (integer): maximum records to be returned | default: -1 or not specified will return all requested records | | query_criteria(self, param, outpath, **kwargs) | 'query_criteria' method allows searches of KOA by multiple | parameters specified in a python dictionary (param). | | param: a dictionary containing a list of acceptable parameters: | | instrument (required): HIRES | | datetime (string): a datetime range string in the format of | datetime1/datetime2, '/' being the separator between first | and second datetime valaues where datetime format is | 'yyyy-mm-dd hh:mm:ss' | | date (string): a date range string in the format of | date1/date2, '/' being the separator between first | and second date valaues where date format is 'yyyy-mm-dd' | | pos (string): a position string in the format of | | 1. circle ra dec radius; | | 2. polygon ra1 dec1 ra2 dec2 ra3 dec3 ra4 dec4; | | 3. box ra dec width height; | | all RA Dec in decimal degree J2000 coordinate. | | target (string): target name used in the project, this will be | searched against the database -- not SIMBAD or NED. | | outpath (string): file path for the returned metadata table | | Optional parameters: | -------------------- | cookiepath (string): cookie file path obtained via login method, only | required for querying the proprietary KOA data. | | format (string): output table format -- votable, ipac, csv, or tsv; | default: ipac | | maxrec (integer): maximum records to be returned | default: -1 or not specified will return all requested records | | query_date(self, instrument, date, outpath, **kwargs) | 'query_date' method searches KOA by 'date_obs' range | | Required Inputs: | --------------- | instrument (string): HIRES | | date (string): a date_obs string in the format of | date1/date2 where '/' separates the two date values` | of format 'yyyy-mm-dd' | | the following inputs are acceptable: | | date1/: will search data with date later than (>=) | date1 | | /date2: will search data with date earlier than (<=) | date2 | | date1: will search data with date equal to (=) date1 | | outpath (string): a full output filepath of the returned metadata | table | | e.g. | instrument = 'hires', | date = '2018-03-16/2018-03-18' | | e.g. | instrument = 'hires', | date = '2018-03-16/' | | e.g. | instrument = 'hires', | date = '/2018-03-18' | | e.g. | instrument = 'hires', | date = '2018-03-16' | | Optional inputs: | ---------------- | cookiepath (string): cookie file path for querying the proprietary | KOA data | | format (string): Output format: votable, ipac, csv, or tsv | (default: ipac) | | maxrec (integer): maximum records to be returned | default: -1 or not specified will return all requested records | | query_datetime(self, instrument, datetime, outpath, **kwargs) | 'query_datetime' method searches KOA by 'datetime' range | | Required Inputs: | --------------- | instrument (string): HIRES | | datetime (string): a datetime string in the format of | datetime1/datetime2 where '/' separates the two datetime values | of format 'yyyy-mm-dd hh:mm:ss' | | the following inputs are acceptable: | | datetime1/: will search data with datetime later than (>=) | datetime1 | | /datetime2: will search data with datetime earlier than (<=) | datetime2 | | datetime1: will search data with datetime equal to (=) datetime1 | | outpath (string): a full output filepath of the returned metadata | table | | e.g. | instrument = 'hires', | datetime = '2018-03-16 06:10:55/2018-03-18 00:00:00' | | e.g. | instrument = 'hires', | datetime = '2018-03-16 06:10:55/' | | e.g. | instrument = 'hires', | datetime = '/2018-03-18 00:00:00' | | e.g. | instrument = 'hires', | datetime = '2018-03-16 06:10:55' | | Optional inputs: | ---------------- | cookiepath (string): cookie file path for query the proprietary | KOA data | | format (string): Output format: votable, ipac, csv, or tsv | (default: ipac) | | maxrec (integer): maximum records to be returned | default: -1 or not specified will return all requested records | | query_object(self, instrument, object, outpath, **kwargs) | 'query_object' method searches KOA by 'object name' | | Required Inputs: | --------------- | | instrument: HIRES | | object (string): an object name resolvable by SIMBAD, NED, and | ExoPlanet's name_resolve; | | This method resolves the object name into coordiates to be used as the | center of the circle position search with default radius of 0.5 deg. | | e.g. | instrument = 'hires', | object = 'WD 1145+017' | | Optional Input: | --------------- | cookiepath (string): cookie file path for query the proprietary | KOA data. | | format (string): Output format: votable, ipac, csv, tsv (default: ipac) | | radius (float): search radius in deg (default = 0.5 deg) | | maxrec (integer): maximum records to be returned | default: -1 or not specified will return all requested records | | query_position(self, instrument, pos, outpath, **kwargs) | 'query_position' method searches KOA by 'position' | | Required Inputs: | --------------- | | instrument (string): HIRES | | pos (string): a position string in the format of | | 1. circle ra dec radius; | | 2. polygon ra1 dec1 ra2 dec2 ra3 dec3 ra4 dec4; | | 3. box ra dec width height; | | All RA Dec in decimal degree J2000 coordinate. | | e.g. | instrument = 'hires', | pos = 'circle 230.0 45.0 0.5' | | outpath (string): a full filepath for the returned metadata table | | Optional Input: | --------------- | cookiepath (string): cookie file path for querying the proprietary | KOA data. | | format (string): votable, ipac, csv, tsv (default: ipac) | | maxrec (integer): maximum records to be returned | default: -1 or not specified will return all requested records | | ---------------------------------------------------------------------- | Data descriptors defined here: | | __dict__ | dictionary for instance variables (if defined) | | __weakref__ | list of weak references to the object (if defined) | | ---------------------------------------------------------------------- | Data and other attributes defined here: | | astropytbl = None | | content_type = '' | | debug = 0 | | debugfname = './koa.debug' | | format = 'ipac' | | maxrec = -1 | | msg = '' | | ncaliblist = 0 | | ndnloaded = 0 | | ndnloaded_calib = 0 | | ndnloaded_lev1 = 0 | | nlev1list = 0 | | outdir = '' | | outpath = '' | | parampath = '' | | propflag = 1 | | query = '' | | status = '' | | tap = None
try:
os.mkdir('./outputNS')
except:
print(" Directory exists already", flush=True)
Koa.query_date ( 'nirspec', '2017-06-05', \
'./outputNS/nirspec_date.tbl', overwrite=True, format='ipac')
rec = Table.read ('./outputNS/nirspec_date.tbl',format='ipac')
print (rec)
submitting request... Result downloaded to file [./outputNS/nirspec_date.tbl] koaid instrume targname ... echlpos filter slitname ... ---------------------- -------- ------------ ... ------- --------- -------- NS.20170605.44190.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44221.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44231.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44242.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44252.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44263.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44274.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44285.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44296.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44307.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 ... ... ... ... ... ... ... NS.20170605.55455.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55467.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55480.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55491.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55602.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55628.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55645.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55754.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55794.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55811.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 Length = 137 rows
Koa.query_date ('nirspec', \
'2017-06-05/2017-06-07', \
'./outputNS/nirspec_daterange.vot', overwrite=True, format='votable' )
submitting request... Result downloaded to file [./outputNS/nirspec_daterange.vot]
Koa.query_datetime ('nirspec', \
'2017-06-05 13:00:00/2017-06-05 14:00:00', \
'./outputNS/nirspec_datetime.csv', overwrite=True, format='csv' )
submitting request... Result downloaded to file [./outputNS/nirspec_datetime.csv]
Koa.query_date ('nirspec', \
'2017-06-05', \
'./outputNS/nirspec_date.tsv', overwrite=True, format='tsv' )
submitting request... Result downloaded to file [./outputNS/nirspec_date.tsv]
Koa.query_position ('nirspec', \
'circle 277.93 -9.985 .5', \
'./outputNS/position_search.tbl', overwrite=True )
rec = Table.read ('./outputNS/position_search.tbl', format='ascii.ipac' )
print (rec)
submitting request... Result downloaded to file [./outputNS/position_search.tbl] koaid instrume targname ... echlpos filter slitname ... ---------------------- -------- -------- ... ------- --------- -------- NC.20080621.43529.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NC.20080621.43543.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20080621.43867.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20080621.43983.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20080621.44085.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20080621.44204.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20080621.44432.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20080621.44545.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20080621.44648.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20080621.44762.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 ... ... ... ... ... ... ... NS.20130726.38560.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20130726.38713.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20150808.27197.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20150808.27314.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20150808.27418.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20150808.27536.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.50038.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.50188.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.50325.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.50479.fits NIRSPEC WR 118 ... 179.7 NIRSPEC-1 42x0.380 Length = 28 rows
query = "select koaid from koa_nirspec where \
(contains(point('J2000',ra ,dec), box('J2000', 277.93 -9.985, 0.5, 0.5))=1) "
Koa.query_adql (query, './outputNS/adql_radec.tbl',overwrite=True, \
format='ipac' )
rec = Table.read ('./outputNS/adql_radec.tbl', format='ascii.ipac')
print (rec)
submitting request... Result downloaded to file [./outputNS/adql_radec.tbl] koaid ---------------------- NC.20080621.43529.fits NC.20080621.43543.fits NS.20080621.43867.fits NS.20080621.43983.fits NS.20080621.44085.fits NS.20080621.44204.fits NS.20080621.44432.fits NS.20080621.44545.fits NS.20080621.44648.fits NS.20080621.44762.fits ... NS.20130726.38358.fits NS.20130726.38560.fits NS.20130726.38713.fits NS.20150808.27197.fits NS.20150808.27314.fits NS.20150808.27418.fits NS.20150808.27536.fits NS.20170605.50038.fits NS.20170605.50188.fits NS.20170605.50325.fits NS.20170605.50479.fits Length = 28 rows
query = "select koaid, filehand, ra, dec from koa_nirspec \
where contains(point('icrs', ra, dec), \
polygon('icrs',277.43 -10.485 277.43 -9.485 278.43 -9.485 278.43 -10.485)) = 1"
Koa.query_adql(query, './outputNS/polygon_ns.tbl', overwrite=True, format='ipac' )
rec = Table.read ('./outputNS/polygon_ns.tbl', format='ascii.ipac')
print (rec)
submitting request... Result downloaded to file [./outputNS/polygon_ns.tbl] koaid ... dec ---------------------- ... -------- NC.20080621.43529.fits ... -9.9875 NC.20080621.43543.fits ... -9.98611 NS.20080621.43867.fits ... -9.98775 NS.20080621.43983.fits ... -9.98755 NS.20080621.44085.fits ... -9.9876 NS.20080621.44204.fits ... -9.98777 NS.20080621.44432.fits ... -9.98772 NS.20080621.44545.fits ... -9.98759 NS.20080621.44648.fits ... -9.98764 NS.20080621.44762.fits ... -9.98775 ... ... ... NS.20130726.38358.fits ... -9.98788 NS.20130726.38560.fits ... -9.98795 NS.20130726.38713.fits ... -9.988 NS.20150808.27197.fits ... -9.98865 NS.20150808.27314.fits ... -9.98605 NS.20150808.27418.fits ... -9.986 NS.20150808.27536.fits ... -9.98848 NS.20170605.50038.fits ... -9.98569 NS.20170605.50188.fits ... -9.98571 NS.20170605.50325.fits ... -9.98563 NS.20170605.50479.fits ... -9.9856 Length = 28 rows
Koa.query_object ('nirspec', \
'WR 118', './outputNS/nirspec_object.tbl', radius=1.0, overwrite=True, format='ipac')
rec = Table.read ('./outputNS/nirspec_object.tbl', format='ascii.ipac')
print (rec)
object name resolved: ra= 277.92587991, dec=-9.98796868 submitting request... Result downloaded to file [./outputNS/nirspec_object.tbl] koaid instrume targname object ... echlpos filter slitname ... ---------------------- -------- -------- ------ ... ------- --------- -------- NS.20050628.45200.fits NIRSPEC hr6946 -- ... 179.7 KL 42x0.570 NS.20050628.45239.fits NIRSPEC hr6946 -- ... 179.7 KL 42x0.570 NS.20050628.45266.fits NIRSPEC hr6946 -- ... 179.7 KL 42x0.570 NS.20050628.45305.fits NIRSPEC hr6946 -- ... 179.7 KL 42x0.570 NS.20050628.45503.fits NIRSPEC hr6946 -- ... 179.7 KL 42x0.570 NS.20050628.45554.fits NIRSPEC hr6946 -- ... 179.7 KL 42x0.570 NS.20050628.45582.fits NIRSPEC hr6946 -- ... 179.7 KL 42x0.570 NS.20050628.45621.fits NIRSPEC hr6946 -- ... 179.7 KL 42x0.570 NS.20050628.45741.fits NIRSPEC hr6946 -- ... 179.7 KL 42x0.570 NS.20050628.45781.fits NIRSPEC hr6946 -- ... 179.7 KL 42x0.570 ... ... ... ... ... ... ... ... NS.20140708.41385.fits NIRSPEC HR6946 HR6946 ... 64.16 M-WIDE 0.432x24 NS.20140708.41483.fits NIRSPEC HR6946 HR6946 ... 64.16 M-WIDE 0.432x24 NS.20150808.27197.fits NIRSPEC WR 118 WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20150808.27314.fits NIRSPEC WR 118 WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20150808.27418.fits NIRSPEC WR 118 WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20150808.27536.fits NIRSPEC WR 118 WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.50038.fits NIRSPEC WR 118 WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.50188.fits NIRSPEC WR 118 WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.50325.fits NIRSPEC WR 118 WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.50479.fits NIRSPEC WR 118 WR 118 ... 179.7 NIRSPEC-1 42x0.380 Length = 123 rows
query ="select koaid, filehand, progid from koa_nirspec where (upper(progid) = 'K236') "
Koa.query_adql (query, \
'./outputNS/program_info.tbl', overwrite=True, format='ipac' )
rec = Table.read('./outputNS/program_info.tbl', format='ascii.ipac')
print (rec)
submitting request... Result downloaded to file [./outputNS/program_info.tbl] koaid ... progid ---------------------- ... ------ NC.20170605.45884.fits ... K236 NC.20170605.45978.fits ... K236 NC.20170605.46085.fits ... K236 NC.20170605.46186.fits ... K236 NC.20170605.46226.fits ... K236 NC.20170608.45997.fits ... K236 NC.20170608.46091.fits ... K236 NC.20170608.46147.fits ... K236 NC.20170608.46243.fits ... K236 NC.20170608.46278.fits ... K236 ... ... ... NS.20170608.56034.fits ... K236 NS.20170608.56048.fits ... K236 NS.20170608.56060.fits ... K236 NS.20170608.56072.fits ... K236 NS.20170608.56086.fits ... K236 NS.20170608.56157.fits ... K236 NS.20170608.56189.fits ... K236 NS.20170608.56208.fits ... K236 NS.20170608.56281.fits ... K236 NS.20170608.56309.fits ... K236 NS.20170608.56326.fits ... K236 Length = 282 rows
param = dict()
param['instrument'] = 'nirspec'
param['datetime'] = '2017-06-05 00:00:00/2017-06-05 23:59:59'
param['target'] = 'WR 118'
Koa.query_criteria (param, \
'./outputNS/parameters.tbl', overwrite=True )
rec = Table.read('./outputNS/parameters.tbl', format='ipac')
print (rec)
submitting request... Result downloaded to file [./outputNS/parameters.tbl] koaid instrume targname object ... echlpos filter slitname ... ---------------------- -------- -------- ------ ... ------- --------- -------- NS.20170605.50038.fits NIRSPEC WR 118 WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.50188.fits NIRSPEC WR 118 WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.50325.fits NIRSPEC WR 118 WR 118 ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.50479.fits NIRSPEC WR 118 WR 118 ... 179.7 NIRSPEC-1 42x0.380
query = "select koaid, object, koaimtyp, frameno, ra, dec, \
to_char(date_obs,'YYYY-MM-DD') as date_obs, elaptime, \
waveblue, wavered, airmass, camera, dispers, filter, slitname, \
progid, proginst, progpi, progtitl, semester, ofname, filehand \
from koa_nirspec \
where (contains(point('J2000',ra ,dec), circle('J2000', 277.93 -9.985, .5'))=1) \
order by utdatetime"
Koa.query_adql(query,'./outputNS/adql_cone.tbl', overwrite=True, format='ipac')
rec = Table.read ('./outputNS/adql_cone.tbl', format='ascii.ipac')
print (rec)
submitting request... Result downloaded to file [./outputNS/adql_cone.tbl] koaid ... ... ---------------------- ... NC.20080621.43529.fits ... NC.20080621.43543.fits ... NS.20080621.43867.fits ... NS.20080621.43983.fits ... NS.20080621.44085.fits ... NS.20080621.44204.fits ... NS.20080621.44432.fits ... NS.20080621.44545.fits ... NS.20080621.44648.fits ... NS.20080621.44762.fits ... ... ... NS.20130726.38560.fits ... NS.20130726.38713.fits ... NS.20150808.27197.fits ... NS.20150808.27314.fits ... NS.20150808.27418.fits ... NS.20150808.27536.fits ... NS.20170605.50038.fits ... NS.20170605.50188.fits ... NS.20170605.50325.fits ... NS.20170605.50479.fits ... Length = 28 rows
query = "select top 10 koaid, ra ,dec, utdatetime from koa_nirspec \
where (contains(point('J2000',ra ,dec), \
box('J2000', 277.93 -9.985, 0.5, 0.5))) =1) order by utdatetime desc "
Koa.query_adql (query, \
'./outputNS/adql_radec_top10.tbl',overwrite=True, \
format='ipac' )
rec = Table.read ('./outputNS/adql_radec_top10.tbl', format='ascii.ipac')
print (rec)
submitting request... Result downloaded to file [./outputNS/adql_radec_top10.tbl] koaid ra dec utdatetime ---------------------- --------- -------- -------------------------- NS.20080621.44762.fits 277.92627 -9.98775 2008-06-21 12:26:02.460000 NS.20080621.44648.fits 277.92852 -9.98764 2008-06-21 12:24:08.860000 NS.20080621.44545.fits 277.92852 -9.98759 2008-06-21 12:22:25.910000 NS.20080621.44432.fits 277.92627 -9.98772 2008-06-21 12:20:32.510000 NS.20080621.44204.fits 277.92627 -9.98777 2008-06-21 12:16:44.510000 NS.20080621.44085.fits 277.92852 -9.9876 2008-06-21 12:14:45.850000 NS.20080621.43983.fits 277.92852 -9.98755 2008-06-21 12:13:03.150000 NS.20080621.43867.fits 277.92627 -9.98775 2008-06-21 12:11:07.950000 NC.20080621.43543.fits 277.92766 -9.98611 2008-06-21 12:05:43.250000 NC.20080621.43529.fits 277.92625 -9.9875 2008-06-21 12:05:29.650000
query = "select count(koaid) from koa_nirspec \
where (contains(point('J2000',ra,dec), box('J2000', 277.93 -9.985, 0.5, 0.5)))=1) "
Koa.query_adql (query, \
'./outputNS/adql_count.tbl',overwrite=True, \
format='ipac' )
rec = Table.read ('./outputNS/adql_count.tbl', format='ascii.ipac')
print (rec)
submitting request... Result downloaded to file [./outputNS/adql_count.tbl] count(koaid) ------------ 28
Koa.download ('./outputNS/parameters.tbl', \
'ipac', \
'./dnload_dir1', \
start_row=1, \
end_row=3 )
Start downloading 3 koaid data you requested; please check your outdir: ./dnload_dir1 for progress .... A total of 3 new lev0 FITS files downloaded.
Koa.download ('./outputNS/parameters.tbl', \
'ipac', \
'./dnload_dir1' )
Start downloading 4 koaid data you requested; please check your outdir: ./dnload_dir1 for progress .... A total of 1 new lev0 FITS files downloaded.
Koa.query_date('nirspec', \
'2015-01-01',
'./outputNS/datetime_nirspec20150101.tbl' )
submitting request... Result downloaded to file [./outputNS/datetime_nirspec20150101.tbl]
Koa.download ('./outputNS/datetime_nirspec20150101.tbl', \
'ipac', \
'dnload_dir_nirspec20150101', \
start_row=62, \
end_row=67, \
lev1file=1 )
Start downloading 6 koaid data you requested; please check your outdir: dnload_dir_nirspec20150101 for progress .... No level 1 data found for koaid: [NC.20150101.49565.fits] No level 1 data found for koaid: [NC.20150101.49581.fits] A total of 6 new lev0 FITS files downloaded. 6 new lev1 list downloaded. 288 new lev1 files downloaded.
Koa.download ('./outputNS/datetime_nirspec20150101.tbl', \
'ipac', \
'dnload_dir_nirspec20150101', \
start_row=62, \
end_row=67, \
lev1file=1, \
calibfile=1, \
calibdir=1)
Start downloading 6 koaid data you requested; please check your outdir: dnload_dir_nirspec20150101 for progress .... No level 1 data found for koaid: [NC.20150101.49565.fits] No associated calibration list for NC.20150101.49565.fits No level 1 data found for koaid: [NC.20150101.49581.fits] No associated calibration list for NC.20150101.49581.fits A total of 0 new lev0 FITS files downloaded. 0 new lev1 list downloaded. 0 new lev1 files downloaded. 4 new calibration list downloaded. 46 new calibration FITS files downloaded.
Koa.download ('./outputNS/datetime_nirspec20150101.tbl', \
'ipac', \
'dnload_dir_nirspec20150101_calib0', \
start_row=62, \
end_row=67, \
lev1file=1, \
calibfile=1, \
calibdir=0 )
Start downloading 6 koaid data you requested; please check your outdir: dnload_dir_nirspec20150101_calib0 for progress .... No level 1 data found for koaid: [NC.20150101.49565.fits] No associated calibration list for NC.20150101.49565.fits No level 1 data found for koaid: [NC.20150101.49581.fits] No associated calibration list for NC.20150101.49581.fits A total of 6 new lev0 FITS files downloaded. 6 new lev1 list downloaded. 288 new lev1 files downloaded. 4 new calibration list downloaded. 46 new calibration FITS files downloaded.
import io
import json
import pandas as pd
filepath = './dnload_dir_nirspec20150101/calib/NS.20150101.49742.caliblist.json'
fp = None
jsondata = None
try:
with open (filepath) as fp:
jsondata = json.load (fp)
fp.close()
except Exception as e:
print (f'read input jsonfile error: {str(e):s}')
sys.exit()
status = ''
nrec = -1
tbldata = None
try:
status = jsondata['status']
except Exception as e:
print ('Exception extracting keyword "status"')
try:
nrec = int(jsondata['nrec'])
except Exception as e:
print ('Exception extracting keyword "nrec"')
try:
tbldata = jsondata['table']
except Exception as e:
print ('Exception extracting keyword "table"')
print (f'status= {status:s}')
print (f'nrec= {nrec:d}')
df = pd.json_normalize (tbldata)
print (df)
status= ok nrec= 46 koaid ofname instrument targname \ 0 NS.20150101.53569.fits jan01s0055.fits NIRSPEC SAO 81632 1 NS.20150101.49373.fits jan01s0050.fits NIRSPEC A0V_HD71906 2 NS.20150101.58137.fits jan01s0062.fits NIRSPEC NIRSPEC 3 NS.20150101.15077.fits jan01s0043.fits NIRSPEC DOME PHLAT 4 NS.20150101.14907.fits jan01s0030.fits NIRSPEC DOME PHLAT 5 NS.20150101.14894.fits jan01s0029.fits NIRSPEC DOME PHLAT 6 NS.20150101.14881.fits jan01s0028.fits NIRSPEC DOME PHLAT 7 NS.20150101.14806.fits jan01s0022.fits NIRSPEC DOME PHLAT 8 NS.20150101.14819.fits jan01s0023.fits NIRSPEC DOME PHLAT 9 NS.20150101.15056.fits jan01s0042.fits NIRSPEC DOME PHLAT 10 NS.20150101.15043.fits jan01s0041.fits NIRSPEC DOME PHLAT 11 NS.20150101.15030.fits jan01s0040.fits NIRSPEC DOME PHLAT 12 NS.20150101.15018.fits jan01s0039.fits NIRSPEC DOME PHLAT 13 NS.20150101.15005.fits jan01s0038.fits NIRSPEC DOME PHLAT 14 NS.20150101.14993.fits jan01s0037.fits NIRSPEC DOME PHLAT 15 NS.20150101.14868.fits jan01s0027.fits NIRSPEC DOME PHLAT 16 NS.20150101.14968.fits jan01s0035.fits NIRSPEC DOME PHLAT 17 NS.20150101.14980.fits jan01s0036.fits NIRSPEC DOME PHLAT 18 NS.20150101.14832.fits jan01s0024.fits NIRSPEC DOME PHLAT 19 NS.20150101.14844.fits jan01s0025.fits NIRSPEC DOME PHLAT 20 NS.20150101.14919.fits jan01s0031.fits NIRSPEC DOME PHLAT 21 NS.20150101.14931.fits jan01s0032.fits NIRSPEC DOME PHLAT 22 NS.20150101.14856.fits jan01s0026.fits NIRSPEC DOME PHLAT 23 NS.20150101.14956.fits jan01s0034.fits NIRSPEC DOME PHLAT 24 NS.20150101.14944.fits jan01s0033.fits NIRSPEC DOME PHLAT 25 NS.20150101.14548.fits jan01s0003.fits NIRSPEC DOME PHLAT 26 NS.20150101.14535.fits jan01s0002.fits NIRSPEC DOME PHLAT 27 NS.20150101.14523.fits jan01s0001.fits NIRSPEC DOME PHLAT 28 NS.20150101.14635.fits jan01s0010.fits NIRSPEC DOME PHLAT 29 NS.20150101.14622.fits jan01s0009.fits NIRSPEC DOME PHLAT 30 NS.20150101.14610.fits jan01s0008.fits NIRSPEC DOME PHLAT 31 NS.20150101.14598.fits jan01s0007.fits NIRSPEC DOME PHLAT 32 NS.20150101.14585.fits jan01s0006.fits NIRSPEC DOME PHLAT 33 NS.20150101.14572.fits jan01s0005.fits NIRSPEC DOME PHLAT 34 NS.20150101.14772.fits jan01s0021.fits NIRSPEC DOME PHLAT 35 NS.20150101.14759.fits jan01s0020.fits NIRSPEC DOME PHLAT 36 NS.20150101.14647.fits jan01s0011.fits NIRSPEC DOME PHLAT 37 NS.20150101.14746.fits jan01s0019.fits NIRSPEC DOME PHLAT 38 NS.20150101.14733.fits jan01s0018.fits NIRSPEC DOME PHLAT 39 NS.20150101.14721.fits jan01s0017.fits NIRSPEC DOME PHLAT 40 NS.20150101.14709.fits jan01s0016.fits NIRSPEC DOME PHLAT 41 NS.20150101.14696.fits jan01s0015.fits NIRSPEC DOME PHLAT 42 NS.20150101.14684.fits jan01s0014.fits NIRSPEC DOME PHLAT 43 NS.20150101.14561.fits jan01s0004.fits NIRSPEC DOME PHLAT 44 NS.20150101.14660.fits jan01s0012.fits NIRSPEC DOME PHLAT 45 NS.20150101.14672.fits jan01s0013.fits NIRSPEC DOME PHLAT object koaimtyp frameno ra dec date_obs ... \ 0 HD 109615 arclamp 55 165.49448 28.51562 2015-01-01 ... 1 HD 71906 arclamp 50 127.83256 37.26666 2015-01-01 ... 2 HD 105388 arclamp 62 103.35000 0.06200 2015-01-01 ... 3 null arclamp 43 58.00000 90.00000 2015-01-01 ... 4 null flatlamp 30 58.00000 90.00000 2015-01-01 ... 5 null flatlamp 29 58.00000 90.00000 2015-01-01 ... 6 null flatlamp 28 58.00000 90.00000 2015-01-01 ... 7 null flatlamp 22 58.00000 90.00000 2015-01-01 ... 8 null flatlamp 23 58.00000 90.00000 2015-01-01 ... 9 null flatlamp 42 58.00000 90.00000 2015-01-01 ... 10 null flatlamp 41 58.00000 90.00000 2015-01-01 ... 11 null flatlamp 40 58.00000 90.00000 2015-01-01 ... 12 null flatlamp 39 58.00000 90.00000 2015-01-01 ... 13 null flatlamp 38 58.00000 90.00000 2015-01-01 ... 14 null flatlamp 37 58.00000 90.00000 2015-01-01 ... 15 null flatlamp 27 58.00000 90.00000 2015-01-01 ... 16 null flatlamp 35 58.00000 90.00000 2015-01-01 ... 17 null flatlamp 36 58.00000 90.00000 2015-01-01 ... 18 null flatlamp 24 58.00000 90.00000 2015-01-01 ... 19 null flatlamp 25 58.00000 90.00000 2015-01-01 ... 20 null flatlamp 31 58.00000 90.00000 2015-01-01 ... 21 null flatlamp 32 58.00000 90.00000 2015-01-01 ... 22 null flatlamp 26 58.00000 90.00000 2015-01-01 ... 23 null flatlamp 34 58.00000 90.00000 2015-01-01 ... 24 null flatlamp 33 58.00000 90.00000 2015-01-01 ... 25 null flatlampoff 3 58.00000 90.00000 2015-01-01 ... 26 null flatlampoff 2 58.00000 90.00000 2015-01-01 ... 27 null flatlampoff 1 58.00000 90.00000 2015-01-01 ... 28 null flatlampoff 10 58.00000 90.00000 2015-01-01 ... 29 null flatlampoff 9 58.00000 90.00000 2015-01-01 ... 30 null flatlampoff 8 58.00000 90.00000 2015-01-01 ... 31 null flatlampoff 7 58.00000 90.00000 2015-01-01 ... 32 null flatlampoff 6 58.00000 90.00000 2015-01-01 ... 33 null flatlampoff 5 58.00000 90.00000 2015-01-01 ... 34 null flatlampoff 21 58.00000 90.00000 2015-01-01 ... 35 null flatlampoff 20 58.00000 90.00000 2015-01-01 ... 36 null flatlampoff 11 58.00000 90.00000 2015-01-01 ... 37 null flatlampoff 19 58.00000 90.00000 2015-01-01 ... 38 null flatlampoff 18 58.00000 90.00000 2015-01-01 ... 39 null flatlampoff 17 58.00000 90.00000 2015-01-01 ... 40 null flatlampoff 16 58.00000 90.00000 2015-01-01 ... 41 null flatlampoff 15 58.00000 90.00000 2015-01-01 ... 42 null flatlampoff 14 58.00000 90.00000 2015-01-01 ... 43 null flatlampoff 4 58.00000 90.00000 2015-01-01 ... 44 null flatlampoff 12 58.00000 90.00000 2015-01-01 ... 45 null flatlampoff 13 58.00000 90.00000 2015-01-01 ... semid propint camera dispers disppos echlpos filter \ 0 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 1 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 2 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 3 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 4 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 5 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 6 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 7 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 8 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 9 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 10 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 11 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 12 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 13 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 14 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 15 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 16 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 17 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 18 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 19 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 20 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 21 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 22 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 23 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 24 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 25 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 26 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 27 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 28 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 29 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 30 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 31 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 32 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 33 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 34 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 35 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 36 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 37 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 38 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 39 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 40 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 41 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 42 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 43 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 44 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 45 2014B_U087NS 18 spec high 35.46000000 63.03000000 NIRSPEC-7 slitname coadds diff_date 0 0.432x12 10 0 1 0.432x12 10 0 2 0.432x12 10 0 3 0.432x12 10 0 4 0.432x12 4 0 5 0.432x12 4 0 6 0.432x12 4 0 7 0.432x12 4 0 8 0.432x12 4 0 9 0.432x12 4 0 10 0.432x12 4 0 11 0.432x12 4 0 12 0.432x12 4 0 13 0.432x12 4 0 14 0.432x12 4 0 15 0.432x12 4 0 16 0.432x12 4 0 17 0.432x12 4 0 18 0.432x12 4 0 19 0.432x12 4 0 20 0.432x12 4 0 21 0.432x12 4 0 22 0.432x12 4 0 23 0.432x12 4 0 24 0.432x12 4 0 25 0.432x12 4 0 26 0.432x12 4 0 27 0.432x12 4 0 28 0.432x12 4 0 29 0.432x12 4 0 30 0.432x12 4 0 31 0.432x12 4 0 32 0.432x12 4 0 33 0.432x12 4 0 34 0.432x12 4 0 35 0.432x12 4 0 36 0.432x12 4 0 37 0.432x12 4 0 38 0.432x12 4 0 39 0.432x12 4 0 40 0.432x12 4 0 41 0.432x12 4 0 42 0.432x12 4 0 43 0.432x12 4 0 44 0.432x12 4 0 45 0.432x12 4 0 [46 rows x 30 columns]
The next query shows how a PI can login with their KOA credentials, assigned when the data were acquired, and access their protected data. The example is a query for public data to show the syntax. Please login with your KOA supplied credentials to access your privatedata. While logged in, you can access all public data as well. Koa.login creates the cookie file at login.
Koa.login ('./tapcookie.txt')
Userid: tapdemo Password: ········ Successfully login as tapdemo
Include the cookiepath in your query to access your data, as in this example:
Koa.query_date ('nirspec', \
'2017-06-05', \
'./outputNS/nirspec_login.tbl', overwrite=True, format='ipac', \
cookiepath='./tapcookie.txt' )
rec = Table.read ('./outputNS/nirspec_login.tbl',format='ipac')
print (rec)
submitting request... Result downloaded to file [./outputNS/nirspec_login.tbl] koaid instrume targname ... echlpos filter slitname ... ---------------------- -------- ------------ ... ------- --------- -------- NS.20170605.44190.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44221.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44231.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44242.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44252.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44263.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44274.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44285.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44296.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.44307.fits NIRSPEC sky ... 179.7 NIRSPEC-1 42x0.380 ... ... ... ... ... ... ... NS.20170605.55455.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55467.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55480.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55491.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55602.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55628.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55645.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55754.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55794.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 NS.20170605.55811.fits NIRSPEC HORIZON STOW ... 179.7 NIRSPEC-1 42x0.380 Length = 137 rows
Please acknowledge the use of KOA by including this text in your publications: "This research has made use of the Keck Observatory Archive (KOA), which is operated by the W. M. Keck Observatory and the NASA Exoplanet Science Institute (NExScI), under contract with the National Aeronautics and Space Administration."
Please also acknowledge the PI(s) of datasets that have been obtained through KOA, and please contact the KOA Help Desk if you publish archival data:
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