Cross match the output from ADQL queries

#!/usr/bin/python

# author: Eduardo Gonzalez-Solares      - 20070821
# mods:   Nicholas Walton               - 20080111

# this is a cross match of 2MASS against IPHAS
# so gives j,h,k and r,i, Ha fluxes for sources around IC5070 

import sys
from math import cos, radians
import time
import urllib
from astrogrid import acr
from astrogrid import Applications, DSA, MySpace

# Log in
acr.login('leicester')

# Coords for IC 5070
ra, dec = 312.75, 44.37

# Output directory
output_dir = '#iphas'

# Define box bounding box
ra1 = ra - 0.25 / cos(radians(ra))
dec1 = dec - 0.25
ra2 = ra + 0.25 / cos(radians(ra))
dec2 = dec + 0.25

# Query 2MASS
twomass = DSA('ivo://wfau.roe.ac.uk/twomass-dsa/wsa/ceaApplication')
job1 = twomass.query('select * from twomass_psc as x where x.ra between %s and %s and x."dec" between %s and %s' % (ra1, ra2, dec1, dec2),
                     saveAs='%s/twomass.vot' % output_dir)

while job1.status() in ['INITIALIZING', 'RUNNING', 'UNKNOWN']:
        time.sleep(10)
        
if job1.status() == 'ERROR':
        print 'Error querying 2MASS database'
        print job1.results()[0]
        sys.exit()
        
print '2MASS Query: ',job1.status()


# Query IPHAS
iphas = DSA('ivo://uk.ac.cam.ast/iphas-dsa-catalog/IDR/ceaApplication')
job2 = iphas.query('select * from PhotoObjBest as x where x.ra between %s and %s and x."dec" between %s and %s' % (ra1, ra2, dec1, dec2),
                     saveAs='%s/iphas.vot' % output_dir)

while job2.status() in ['INITIALIZING', 'RUNNING', 'UNKNOWN']:
        time.sleep(10)
        
if job2.status() == 'ERROR':
        print 'Error querying IPHAS database'
        print job2.results()[0]
        sys.exit()
        
print 'IPHAS Query: ',job1.status()

m = MySpace()

# Perform Xmatch using 1.5 arcsec radius

# this uses the TopCat STILTS library to perform the cross match

app = Applications('ivo://uk.ac.starlink/stilts', 'tmatch2')
app.inputs['tmatch2_in1']['value'] = '%s/iphas.vot' % output_dir
app.inputs['tmatch2_in2']['value'] = '%s/twomass.vot' % output_dir
app.inputs['tmatch2_values1']['value'] = 'ra dec'
app.inputs['tmatch2_values2']['value'] = 'ra dec'
app.inputs['tmatch2_params']['value'] = '1.5'
app.inputs['tmatch2_ifmt1']['value'] = '(auto)'
app.inputs['tmatch2_ifmt2']['value'] = '(auto)'
app.inputs['tmatch2_ofmt']['value'] = 'vot'

app.inputs.pop('tmatch2_icmd1')
app.inputs.pop('tmatch2_icmd2')
app.inputs.pop('tmatch2_ocmd')

app.outputs['tmatch2_out']['value'] = '%s/iphas_twomass.vot' % output_dir
job = app.submit()


while job.status() in ['INITIALIZING', 'RUNNING', 'UNKNOWN']:
        time.sleep(10)
        
if job.status() == 'ERROR':
        print 'Error running xmatch'
        sys.exit()
        
print 'Xmatch: ', job.status()

# If completed ok the retrieve the result. Print the error message otherwise.   
if job.status()=='COMPLETED':
        url = job.results()[0]
        if url[:3]=='htt':
            urllib.urlretrieve(url, 'iphas2mass-xmatch.vot')
        else:
            res = m.readfile(url)
            open('iphas2mass-xmatch.vot','w').write(res)
else:
        print job.results()[0]