Table Access Protocol (TAP) queries: numeric output
Ref: TAP
import numpy as np
from lsst.rsp import get_tap_service
import pandas as pd
import matplotlib.pyplot as plt
import time
service = get_tap_service ('tap')
assert service is not None
fields = pd.read_csv('LSSTComCam_fields.csv', index_col='field')
ddeg = .01
def grabcone(field):
return "CONTAINS(POINT('ICRS', coord_ra, coord_dec), " +\
f"CIRCLE('ICRS', {fields.loc[field, 'ra_deg']}, " +\
f"{fields.loc[field, 'dec_deg']}, {ddeg})) = 1"queries = pd.DataFrame(columns=['select', 'from', 'where'])
queries.loc['columns'] = ["column_name, datatype, description, unit",
"tap_schema.columns",
"table_name = 'dp1.Object'"]
qcols = queries.columns
query = ''
for col in qcols:
if queries.loc['columns'][col] != '':
query += f' {col.upper()} {queries.loc['columns'][col]}'
print(query)
job = service.submit_job(query)
job.run()
job.wait(phases=['COMPLETED', 'ERROR'])
if job.phase == 'ERROR':
job.raise_if_error()
elif job.phase == 'COMPLETED':
out = job.fetch_result().to_table()
queries.loc['columns', 'out'] = out
print(type(out), len(out))
# display(out)
print() SELECT column_name, datatype, description, unit FROM tap_schema.columns WHERE table_name = 'dp1.Object'
<class 'astropy.table.table.Table'> 1296
ocols = queries.loc['columns', 'out'].to_pandas()
ocolsLoading...
ncols = ocols.loc[(ocols['datatype']!='boolean') & (ocols['datatype']!='char')]
ncolsLoading...
fcols = ['ra', 'dec', 'centroid_x', 'centroid_y', 'psfMag', 'cModelMag', 'psfFlux', 'cModelFlux', 'epoch']
queries['field'] = ''
for field in fields.index:
for col in ['coord_ra', 'coord_dec', 'tract', 'patch', 'ebv']: # ncols['column_name'].values
queries.loc[f'{col}_{field}'] = [col, "dp1.Object", grabcone(field), '', field]
for col in fcols:
for ff in ['u', 'g', 'r', 'i', 'z', 'y']:
queries.loc[f'{ff}_{col}_{field}'] = [f'{ff}_{col}', "dp1.Object", grabcone(field), '', field]
for idx, dat in queries.iloc[1:].iterrows():
query = ''
for col in qcols:
if dat[col] != '':
query += f'{col.upper()} {dat[col]} '
job = service.submit_job(query)
job.run()
job.wait(phases=['COMPLETED', 'ERROR'])
if job.phase == 'ERROR':
job.raise_if_error()
elif job.phase == 'COMPLETED':
out = job.fetch_result().to_table().to_pandas()
if 'count' not in queries.columns:
dcols = out[dat['select']].describe().index
queries[dcols] = np.nan
queries.loc[idx, dcols] = out[dat['select']].describe().T
time.sleep(2)
queries.to_csv('TAPdescribe.csv')queriesLoading...
kala = ['y', 'r', 'g', 'b', 'k', 'm', 'c']
plt.figure(figsize=(5, 5))
for nfield, (field) in enumerate(fields.index):
idx_ra = f'coord_ra_{field}'
idx_dec = f'coord_dec_{field}'
for col in ['min', 'mean', 'max']:
ra = queries.loc[idx_ra, col]
dec = queries.loc[idx_dec, col]
plt.plot(ra, dec, marker='.', color=kala[nfield], ms=10)
plt.annotate(field, (ra, dec), (ra+2, dec))
plt.xlim(30, 140)(30.0, 140.0)
epochs = queries.loc[queries['select'].str.contains('epoch')][['min', 'max']]
epochsLoading...