6
6
This module contains various methods for querying MAST collections such as catalogs.
7
7
"""
8
8
9
+ import difflib
9
10
import warnings
10
11
import os
11
12
import time
@@ -60,7 +61,7 @@ def _parse_result(self, response, *, verbose=False):
60
61
61
62
@class_or_instance
62
63
def query_region_async (self , coordinates , * , radius = 0.2 * u .deg , catalog = "Hsc" ,
63
- version = None , pagesize = None , page = None , ** kwargs ):
64
+ version = None , pagesize = None , page = None , ** criteria ):
64
65
"""
65
66
Given a sky position and radius, returns a list of catalog entries.
66
67
See column documentation for specific catalogs `here <https://mast.stsci.edu/api/v0/pages.html>`__.
@@ -88,7 +89,7 @@ def query_region_async(self, coordinates, *, radius=0.2*u.deg, catalog="Hsc",
88
89
Default None.
89
90
Can be used to override the default behavior of all results being returned to obtain a
90
91
specific page of results.
91
- **kwargs
92
+ **criteria
92
93
Other catalog-specific keyword args.
93
94
These can be found in the (service documentation)[https://mast.stsci.edu/api/v0/_services.html]
94
95
for specific catalogs. For example one can specify the magtype for an HSC search.
@@ -109,10 +110,18 @@ def query_region_async(self, coordinates, *, radius=0.2*u.deg, catalog="Hsc",
109
110
'dec' : coordinates .dec .deg ,
110
111
'radius' : radius .deg }
111
112
113
+ # valid criteria keywords
114
+ valid_criteria = []
115
+
112
116
# Determine API connection and service name
113
117
if catalog .lower () in self ._service_api_connection .SERVICES :
114
118
self ._current_connection = self ._service_api_connection
115
119
service = catalog
120
+
121
+ # adding additional user specified parameters
122
+ for prop , value in criteria .items ():
123
+ params [prop ] = value
124
+
116
125
else :
117
126
self ._current_connection = self ._portal_api_connection
118
127
@@ -125,19 +134,20 @@ def query_region_async(self, coordinates, *, radius=0.2*u.deg, catalog="Hsc",
125
134
warnings .warn ("Invalid HSC version number, defaulting to v3." , InputWarning )
126
135
service = "Mast.Hsc.Db.v3"
127
136
128
- self .catalog_limit = kwargs .get ('nr' , 50000 )
129
-
130
137
# Hsc specific parameters (can be overridden by user)
131
- params ['nr' ] = 50000
132
- params ['ni' ] = 1
133
- params ['magtype' ] = 1
138
+ self .catalog_limit = criteria .pop ('nr' , 50000 )
139
+ valid_criteria = ['nr' , 'ni' , 'magtype' ]
140
+ params ['nr' ] = self .catalog_limit
141
+ params ['ni' ] = criteria .pop ('ni' , 1 )
142
+ params ['magtype' ] = criteria .pop ('magtype' , 1 )
134
143
135
144
elif catalog .lower () == "galex" :
136
145
service = "Mast.Galex.Catalog"
137
- self .catalog_limit = kwargs .get ('maxrecords' , 50000 )
146
+ self .catalog_limit = criteria .get ('maxrecords' , 50000 )
138
147
139
148
# galex specific parameters (can be overridden by user)
140
- params ['maxrecords' ] = 50000
149
+ valid_criteria = ['maxrecords' ]
150
+ params ['maxrecords' ] = criteria .pop ('maxrecords' , 50000 )
141
151
142
152
elif catalog .lower () == "gaia" :
143
153
if version == 1 :
@@ -158,9 +168,16 @@ def query_region_async(self, coordinates, *, radius=0.2*u.deg, catalog="Hsc",
158
168
service = "Mast.Catalogs." + catalog + ".Cone"
159
169
self .catalog_limit = None
160
170
161
- # adding additional user specified parameters
162
- for prop , value in kwargs .items ():
163
- params [prop ] = value
171
+ # additional user-specified parameters are not valid
172
+ if criteria :
173
+ key = next (iter (criteria ))
174
+ closest_match = difflib .get_close_matches (key , valid_criteria , n = 1 )
175
+ error_msg = (
176
+ f"Filter '{ key } ' does not exist for catalog { catalog } . Did you mean '{ closest_match [0 ]} '?"
177
+ if closest_match
178
+ else f"Filter '{ key } ' does not exist for catalog { catalog } ."
179
+ )
180
+ raise InvalidQueryError (error_msg )
164
181
165
182
# Parameters will be passed as JSON objects only when accessing the PANSTARRS API
166
183
use_json = catalog .lower () == 'panstarrs'
@@ -170,7 +187,7 @@ def query_region_async(self, coordinates, *, radius=0.2*u.deg, catalog="Hsc",
170
187
171
188
@class_or_instance
172
189
def query_object_async (self , objectname , * , radius = 0.2 * u .deg , catalog = "Hsc" ,
173
- pagesize = None , page = None , version = None , ** kwargs ):
190
+ pagesize = None , page = None , version = None , ** criteria ):
174
191
"""
175
192
Given an object name, returns a list of catalog entries.
176
193
See column documentation for specific catalogs `here <https://mast.stsci.edu/api/v0/pages.html>`__.
@@ -197,7 +214,7 @@ def query_object_async(self, objectname, *, radius=0.2*u.deg, catalog="Hsc",
197
214
to obtain a specific page of results.
198
215
version : int, optional
199
216
Version number for catalogs that have versions. Default is highest version.
200
- **kwargs
217
+ **criteria
201
218
Catalog-specific keyword args.
202
219
These can be found in the `service documentation <https://mast.stsci.edu/api/v0/_services.html>`__.
203
220
for specific catalogs. For example one can specify the magtype for an HSC search.
@@ -215,7 +232,7 @@ def query_object_async(self, objectname, *, radius=0.2*u.deg, catalog="Hsc",
215
232
version = version ,
216
233
pagesize = pagesize ,
217
234
page = page ,
218
- ** kwargs )
235
+ ** criteria )
219
236
220
237
@class_or_instance
221
238
def query_criteria_async (self , catalog , * , pagesize = None , page = None , ** criteria ):
@@ -295,26 +312,25 @@ def query_criteria_async(self, catalog, *, pagesize=None, page=None, **criteria)
295
312
if coordinates or objectname :
296
313
service += ".Position"
297
314
service += ".Rows" # Using the rowstore version of the query for speed
298
- filters = self ._current_connection .build_filter_set ("Mast.Catalogs.Tess.Cone" ,
299
- service , ** criteria )
315
+ column_config_name = "Mast.Catalogs.Tess.Cone"
300
316
params ["columns" ] = "*"
301
317
elif catalog .lower () == "ctl" :
302
318
service = "Mast.Catalogs.Filtered.Ctl"
303
319
if coordinates or objectname :
304
320
service += ".Position"
305
321
service += ".Rows" # Using the rowstore version of the query for speed
306
- filters = self ._current_connection .build_filter_set ("Mast.Catalogs.Tess.Cone" ,
307
- service , ** criteria )
322
+ column_config_name = "Mast.Catalogs.Tess.Cone"
308
323
params ["columns" ] = "*"
309
324
elif catalog .lower () == "diskdetective" :
310
325
service = "Mast.Catalogs.Filtered.DiskDetective"
311
326
if coordinates or objectname :
312
327
service += ".Position"
313
- filters = self ._current_connection .build_filter_set ("Mast.Catalogs.Dd.Cone" ,
314
- service , ** criteria )
328
+ column_config_name = "Mast.Catalogs.Dd.Cone"
315
329
else :
316
330
raise InvalidQueryError ("Criteria query not available for {}" .format (catalog ))
317
331
332
+ filters = self ._current_connection .build_filter_set (column_config_name , service , ** criteria )
333
+
318
334
if not filters :
319
335
raise InvalidQueryError ("At least one non-positional criterion must be supplied." )
320
336
params ["filters" ] = filters
0 commit comments