Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Many Vizier fixes #2012

Merged
merged 11 commits into from Mar 20, 2021
70 changes: 44 additions & 26 deletions astroquery/vizier/core.py
Expand Up @@ -357,19 +357,20 @@ def query_region_async(self, coordinates, radius=None, inner_radius=None,
catalog = VizierClass._schema_catalog.validate(catalog)
center = {}
columns = []

# Process coordinates
if isinstance(coordinates, (commons.CoordClasses,) + six.string_types):
c = commons.parse_coordinates(coordinates).transform_to('fk5')

if not c.isscalar:
pos_list = []
center["-c"] = []
for pos in c:
ra_deg = pos.ra.to_string(unit="deg", decimal=True,
precision=8)
dec_deg = pos.dec.to_string(unit="deg", decimal=True,
precision=8, alwayssign=True)
pos_list += ["{}{}".format(ra_deg, dec_deg)]
center["-c"] = "<<;" + ";".join(pos_list)
columns += ["_q"] # request a reference to the input table
center["-c"] += ["{}{}".format(ra_deg, dec_deg)]
columns += ["_q"] # Always request reference to input table
else:
ra = c.ra.to_string(unit='deg', decimal=True, precision=8)
dec = c.dec.to_string(unit="deg", decimal=True, precision=8,
Expand All @@ -378,7 +379,7 @@ def query_region_async(self, coordinates, radius=None, inner_radius=None,
elif isinstance(coordinates, tbl.Table):
if (("_RAJ2000" in coordinates.keys()) and ("_DEJ2000" in
coordinates.keys())):
pos_list = []
center["-c"] = []
sky_coord = coord.SkyCoord(coordinates["_RAJ2000"],
coordinates["_DEJ2000"],
unit=(coordinates["_RAJ2000"].unit,
Expand All @@ -388,15 +389,15 @@ def query_region_async(self, coordinates, radius=None, inner_radius=None,
precision=8)
dec_deg = dec.to_string(unit="deg", decimal=True,
precision=8, alwayssign=True)
pos_list += ["{}{}".format(ra_deg, dec_deg)]
center["-c"] = "<<;" + ";".join(pos_list)
columns += ["_q"] # request a reference to the input table
center["-c"] += ["{}{}".format(ra_deg, dec_deg)]
columns += ["_q"] # Always request reference to input table
else:
raise ValueError("Table must contain '_RAJ2000' and "
"'_DEJ2000' columns!")
else:
raise TypeError("Coordinates must be one of: string, astropy "
"coordinates, or table containing coordinates!")

# decide whether box or radius
if radius is not None:
# is radius a disk or an annulus?
Expand Down Expand Up @@ -434,6 +435,7 @@ def query_region_async(self, coordinates, radius=None, inner_radius=None,
raise Exception(
"At least one of radius, width/height must be specified")

# Prepare payload
data_payload = self._args_to_payload(center=center, columns=columns,
catalog=catalog, column_filters=column_filters)

Expand Down Expand Up @@ -547,16 +549,13 @@ def _args_to_payload(self, *args, **kwargs):
# keyword names that can mean 'all'
alls = ['all', '**']
if any(x in columns for x in alls):
columns_all = True
for x in alls:
if x in columns:
columns.remove(x)
body['-out.all'] = 2
# keyword name that means default columns
if '*' in columns:
columns.remove('*')
columns_default = True
body['-out.all'] = None
else:
columns_default = False
columns_all = False

# process: columns - identify sorting requests
columns_out = []
Expand All @@ -571,16 +570,23 @@ def _args_to_payload(self, *args, **kwargs):
else:
columns_out += [column]

if columns_default:
body['-out'] = '*'
else:
body['-out'] = columns_out
# calculated keyword names that start with an underscore
columns_calc = []
for column in columns_out:
if column[0] == '_':
columns_calc.append(column)
for column in columns_calc:
columns_out.remove(column)

if columns_out:
body['-out.add'] = ','.join(columns_out)
if columns_out and not columns_all:
body['-out'] = ','.join(columns_out)

if columns_calc:
body['-out.add'] = ','.join(columns_calc)

if len(sorts_out) > 0:
body['-sort'] = ','.join(sorts_out)

# process: maximum rows returned
row_limit = kwargs.get('row_limit') or self.ROW_LIMIT
if row_limit < 0:
Expand All @@ -607,14 +613,26 @@ def _args_to_payload(self, *args, **kwargs):
if ucd:
body['-ucd'] = ucd

# create final script
script = "\n".join(["{key}={val}".format(key=key, val=val)
for key, val in body.items()])
# add keywords
# create final script starting with keywords
script = []
if (not isinstance(self.keywords, property) and
self.keywords is not None):
script += "\n" + str(self.keywords)
return script
script += [str(self.keywords)]
# add all items that are not lists
for key, val in body.items():
if type(val) is not list:
if val:
script += ["{key}={val}".format(key=key, val=val)]
else:
script += [key]
# add list at the end
for key, val in body.items():
if type(val) is list:
script += ["{key}=<<====AstroqueryList".format(key=key)]
script += val
script += ["====AstroqueryList"]
# merge result
return "\n".join(script)

def _parse_result(self, response, get_catalog_names=False, verbose=False,
invalid='warn'):
Expand Down
9 changes: 7 additions & 2 deletions astroquery/vizier/tests/test_vizier.py
Expand Up @@ -6,7 +6,6 @@
from astropy.table import Table
import astropy.units as u
import six
from six.moves import urllib_parse as urlparse
from ... import vizier
from ...utils import commons
from ...utils.testing_tools import MockResponse
Expand Down Expand Up @@ -43,7 +42,13 @@ def post_mockreturn(self, method, url, data=None, timeout=10, files=None,
if isinstance(data, dict):
datad = data
else:
datad = dict([urlparse.parse_qsl(d)[0] for d in data.split('\n')])
datad = {}
for line in data.split('\n'):
if '=' in line:
key, value = line.split('=', maxsplit=1)
datad[key.strip()] = value.strip()
else:
datad[line] = None
if '-source' in datad:
# a request for the actual data
filename = data_path(VO_DATA[datad['-source']])
Expand Down