diff --git a/CHANGES.rst b/CHANGES.rst index 1f3c18ffde..1e8ab6cecd 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -144,6 +144,8 @@ mast - Expanding ``Cutouts`` functionality to support TICA HLSPs now available through ``TesscutClass``. [##2668] + +- Resolved issue making PANSTARRS catalog queries when columns and sorting is specified. [#2727] nist ^^^^ diff --git a/astroquery/mast/collections.py b/astroquery/mast/collections.py index 7e46436605..fe4c9c2de5 100644 --- a/astroquery/mast/collections.py +++ b/astroquery/mast/collections.py @@ -162,7 +162,11 @@ def query_region_async(self, coordinates, *, radius=0.2*u.deg, catalog="Hsc", for prop, value in kwargs.items(): params[prop] = value - return self._current_connection.service_request_async(service, params, pagesize=pagesize, page=page) + # Parameters will be passed as JSON objects only when accessing the PANSTARRS API + use_json = catalog.lower() == 'panstarrs' + + return self._current_connection.service_request_async(service, params, pagesize=pagesize, page=page, + use_json=use_json) @class_or_instance def query_object_async(self, objectname, *, radius=0.2*u.deg, catalog="Hsc", @@ -313,7 +317,11 @@ def query_criteria_async(self, catalog, *, pagesize=None, page=None, **criteria) raise InvalidQueryError("At least one non-positional criterion must be supplied.") params["filters"] = filters - return self._current_connection.service_request_async(service, params, pagesize=pagesize, page=page) + # Parameters will be passed as JSON objects only when accessing the PANSTARRS API + use_json = catalog.lower() == 'panstarrs' + + return self._current_connection.service_request_async(service, params, pagesize=pagesize, page=page, + use_json=use_json) @class_or_instance def query_hsc_matchid_async(self, match, *, version=3, pagesize=None, page=None): diff --git a/astroquery/mast/services.py b/astroquery/mast/services.py index b82bc36cba..24f5937b4f 100644 --- a/astroquery/mast/services.py +++ b/astroquery/mast/services.py @@ -288,7 +288,27 @@ def service_request_async(self, service, params, page_size=None, page=None, use_ catalogs_request.extend(self._build_catalogs_params(params)) else: headers['Content-Type'] = 'application/json' - catalogs_request = params + + # Parameter syntax needs to be updated only for PANSTARRS catalog queries + if service.lower() == 'panstarrs': + catalogs_request.extend(self._build_catalogs_params(params)) + + # After parameter syntax is updated, revert back to dictionary + # so params can be passed as a JSON dictionary + params_dict = {} + for key, val in catalogs_request: + params_dict.setdefault(key, []).append(val) + catalogs_request = params_dict + + # Removing single-element lists. Single values will live on their own (except for `sort_by`) + for key in catalogs_request.keys(): + if (key != 'sort_by') & (len(catalogs_request[key]) == 1): + catalogs_request[key] = catalogs_request[key][0] + + # Otherwise, catalogs_request can remain as the original params dict + else: + catalogs_request = params + response = self._request('POST', request_url, data=catalogs_request, headers=headers, use_json=use_json) return response diff --git a/astroquery/mast/tests/test_mast_remote.py b/astroquery/mast/tests/test_mast_remote.py index 09e41a02a1..f70f6dd236 100644 --- a/astroquery/mast/tests/test_mast_remote.py +++ b/astroquery/mast/tests/test_mast_remote.py @@ -691,6 +691,17 @@ def test_catalogs_query_criteria(self): assert isinstance(result, Table) assert 'PSO J254.2861-04.1091' in result['objName'] + result = mast.Catalogs.query_criteria(coordinates="158.47924 -7.30962", + radius=0.01, + catalog="PANSTARRS", + table="mean", + data_release="dr2", + nStackDetections=[("gte", "1")], + columns=["objName", "distance"], + sort_by=[("asc", "distance")]) + assert isinstance(result, Table) + assert result['distance'][0] <= result['distance'][1] + def test_catalogs_query_hsc_matchid_async(self): catalogData = mast.Catalogs.query_object("M10", radius=.001,