Skip to content

Commit 8bd96e1

Browse files
authored
Merge pull request #1308 from weaverba137/update-sdss-iv
[WIP] Update SDSS module to SDSS-IV URLs
2 parents e7dce04 + 08ba30a commit 8bd96e1

File tree

8 files changed

+83
-52
lines changed

8 files changed

+83
-52
lines changed

.travis.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,13 @@ matrix:
9898
# Test the oldest astropy version without optional dependencies.
9999
- os: linux
100100
stage: Tests with other Python/Numpy versions
101-
env: PYTHON_VERSION=3.4 NUMPY_VERSION=1.10 KEYRING_VERSION='<12.0'
101+
env: PYTHON_VERSION=3.5 NUMPY_VERSION=1.12 KEYRING_VERSION='<12.0'
102102
CONDA_DEPENDENCIES="keyring requests beautifulsoup4 html5lib secretstorage"
103103
SECRETSTORAGE_VERSION='<3.0.1'
104-
ASTROPY_VERSION=1.3 PYTEST_VERSION='3.1' ASTROPY_USE_SYSTEM_PYTEST=1
104+
ASTROPY_VERSION=2 PYTEST_VERSION='<3.7'
105105
- os: linux
106106
stage: Tests with other Python/Numpy versions
107-
env: PYTHON_VERSION=3.5.5 NUMPY_VERSION=1.11 KEYRING_VERSION='<12.0'
107+
env: PYTHON_VERSION=3.5.5 NUMPY_VERSION=1.12 KEYRING_VERSION='<12.0'
108108
ASTROPY_VERSION=3.0
109109

110110
- os: linux

CHANGES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- ADS: Fix an error in one of the default keys, citations->citation [#1337]
66
- HEASARC: Fixing error handling to filter out only the query errors. [#1338]
77
- CDS: Apply MOCPy v0.5.* API changes. [#1343]
8+
- SDSS: Update to SDSS-IV URLs and general clean-up. [#1308]
89

910
0.3.9 (2018-12-06)
1011
------------------

astroquery/sdss/__init__.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,14 @@ class Conf(_config.ConfigNamespace):
1414
'http://skyserver.sdss.org',
1515
'Base URL for catalog-related queries like SQL and Cross-ID.')
1616
sas_baseurl = _config.ConfigItem(
17-
'http://data.sdss3.org/sas',
17+
'https://data.sdss.org/sas',
1818
'Base URL for downloading data products like spectra and images.')
1919
timeout = _config.ConfigItem(
2020
60,
2121
'Time limit for connecting to SDSS server.')
22+
default_release = _config.ConfigItem(14, 'Default SDSS data release.')
2223

2324

2425
conf = Conf()
2526

2627
from .core import SDSS, SDSSClass
27-
28-
import warnings
29-
warnings.warn("Experimental: SDSS has not yet been refactored to have its API "
30-
"match the rest of astroquery (but it's nearly there).")

astroquery/sdss/core.py

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class SDSSClass(BaseQuery):
3434
QUERY_URL_SUFFIX_DR_NEW = '/dr{dr}/en/tools/search/x_results.aspx'
3535
XID_URL_SUFFIX_OLD = '/dr{dr}/en/tools/crossid/x_crossid.aspx'
3636
XID_URL_SUFFIX_NEW = '/dr{dr}/en/tools/search/X_Results.aspx'
37-
IMAGING_URL_SUFFIX = ('{base}/dr{dr}/boss/photoObj/frames/'
37+
IMAGING_URL_SUFFIX = ('{base}/dr{dr}/{instrument}/photoObj/frames/'
3838
'{rerun}/{run}/{camcol}/'
3939
'frame-{band}-{run:06d}-{camcol}-'
4040
'{field:04d}.fits.bz2')
@@ -59,7 +59,8 @@ class SDSSClass(BaseQuery):
5959
def query_crossid_async(self, coordinates, obj_names=None,
6060
photoobj_fields=None, specobj_fields=None,
6161
get_query_payload=False, timeout=TIMEOUT,
62-
radius=5. * u.arcsec, data_release=12, cache=True):
62+
radius=5. * u.arcsec,
63+
data_release=conf.default_release, cache=True):
6364
"""
6465
Query using the cross-identification web interface.
6566
@@ -172,7 +173,8 @@ def query_region_async(self, coordinates, radius=2. * u.arcsec,
172173
fields=None, spectro=False, timeout=TIMEOUT,
173174
get_query_payload=False, photoobj_fields=None,
174175
specobj_fields=None, field_help=False,
175-
obj_names=None, data_release=12, cache=True):
176+
obj_names=None, data_release=conf.default_release,
177+
cache=True):
176178
"""
177179
Used to query a region around given coordinates. Equivalent to
178180
the object cross-ID from the web interface.
@@ -263,7 +265,7 @@ def query_region_async(self, coordinates, radius=2. * u.arcsec,
263265
def query_specobj_async(self, plate=None, mjd=None, fiberID=None,
264266
fields=None, timeout=TIMEOUT,
265267
get_query_payload=False, field_help=False,
266-
data_release=12, cache=True):
268+
data_release=conf.default_release, cache=True):
267269
"""
268270
Used to query the SpecObjAll table with plate, mjd and fiberID values.
269271
@@ -337,7 +339,7 @@ def query_specobj_async(self, plate=None, mjd=None, fiberID=None,
337339
def query_photoobj_async(self, run=None, rerun=301, camcol=None,
338340
field=None, fields=None, timeout=TIMEOUT,
339341
get_query_payload=False, field_help=False,
340-
data_release=12, cache=True):
342+
data_release=conf.default_release, cache=True):
341343
"""
342344
Used to query the PhotoObjAll table with run, rerun, camcol and field
343345
values.
@@ -418,7 +420,8 @@ def __sanitize_query(self, stmt):
418420
fsql += ' ' + line.split('--')[0]
419421
return fsql
420422

421-
def query_sql_async(self, sql_query, timeout=TIMEOUT, data_release=12,
423+
def query_sql_async(self, sql_query, timeout=TIMEOUT,
424+
data_release=conf.default_release,
422425
cache=True, **kwargs):
423426
"""
424427
Query the SDSS database.
@@ -477,7 +480,8 @@ class = 'galaxy' \
477480
def get_spectra_async(self, coordinates=None, radius=2. * u.arcsec,
478481
matches=None, plate=None, fiberID=None, mjd=None,
479482
timeout=TIMEOUT, get_query_payload=False,
480-
data_release=12, cache=True, show_progress=True):
483+
data_release=conf.default_release, cache=True,
484+
show_progress=True):
481485
"""
482486
Download spectrum from SDSS.
483487
@@ -597,7 +601,8 @@ def get_spectra_async(self, coordinates=None, radius=2. * u.arcsec,
597601
@prepend_docstr_nosections(get_spectra_async.__doc__)
598602
def get_spectra(self, coordinates=None, radius=2. * u.arcsec,
599603
matches=None, plate=None, fiberID=None, mjd=None,
600-
timeout=TIMEOUT, cache=True, data_release=12,
604+
timeout=TIMEOUT, cache=True,
605+
data_release=conf.default_release,
601606
show_progress=True):
602607
"""
603608
Returns
@@ -622,7 +627,8 @@ def get_spectra(self, coordinates=None, radius=2. * u.arcsec,
622627
def get_images_async(self, coordinates=None, radius=2. * u.arcsec,
623628
matches=None, run=None, rerun=301, camcol=None,
624629
field=None, band='g', timeout=TIMEOUT,
625-
get_query_payload=False, cache=True, data_release=12,
630+
get_query_payload=False, cache=True,
631+
data_release=conf.default_release,
626632
show_progress=True):
627633
"""
628634
Download an image from SDSS.
@@ -728,8 +734,11 @@ def get_images_async(self, coordinates=None, radius=2. * u.arcsec,
728734
for b in band:
729735
# Download and read in image data
730736
linkstr = self.IMAGING_URL_SUFFIX
737+
instrument = 'boss'
738+
if data_release > 12:
739+
instrument = 'eboss'
731740
link = linkstr.format(base=conf.sas_baseurl, run=row['run'],
732-
dr=data_release,
741+
dr=data_release, instrument=instrument,
733742
rerun=row['rerun'], camcol=row['camcol'],
734743
field=row['field'], band=b)
735744

@@ -743,7 +752,7 @@ def get_images_async(self, coordinates=None, radius=2. * u.arcsec,
743752
def get_images(self, coordinates=None, radius=2. * u.arcsec,
744753
matches=None, run=None, rerun=301, camcol=None, field=None,
745754
band='g', timeout=TIMEOUT, cache=True,
746-
get_query_payload=False, data_release=12,
755+
get_query_payload=False, data_release=conf.default_release,
747756
show_progress=True):
748757
"""
749758
Returns
@@ -865,7 +874,8 @@ def _args_to_payload(self, coordinates=None, radius=2. * u.arcsec,
865874
plate=None, mjd=None, fiberID=None, run=None,
866875
rerun=301, camcol=None, field=None,
867876
photoobj_fields=None, specobj_fields=None,
868-
field_help=None, obj_names=None, data_release=12):
877+
field_help=None, obj_names=None,
878+
data_release=conf.default_release):
869879
"""
870880
Construct the SQL query from the arguments.
871881

astroquery/sdss/field_names.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,21 +66,21 @@ def _columns_json_to_table(jsonobj):
6666
# below here are builtin data files
6767
def _load_builtin_table_fields():
6868
key1 = ('PhotoObjAll',
69-
'http://skyserver.sdss.org/dr12/en/tools/search/x_sql.aspx')
69+
conf.skyserver_baseurl + '/dr12/en/tools/search/x_sql.aspx')
7070
_cached_table_fields[key1] = _columns_json_to_table(
7171
json.loads(get_pkg_data_contents('data/PhotoObjAll_dr12.json')))
7272
# PhotoObj and PhotoObjAll are the same in DR12
7373
key2 = ('PhotoObj',
74-
'http://skyserver.sdss.org/dr12/en/tools/search/x_sql.aspx')
74+
conf.skyserver_baseurl + '/dr12/en/tools/search/x_sql.aspx')
7575
_cached_table_fields[key2] = _cached_table_fields[key1]
7676

7777
key1 = ('SpecObjAll',
78-
'http://skyserver.sdss.org/dr12/en/tools/search/x_sql.aspx')
78+
conf.skyserver_baseurl + '/dr12/en/tools/search/x_sql.aspx')
7979
_cached_table_fields[key1] = _columns_json_to_table(
8080
json.loads(get_pkg_data_contents('data/SpecObjAll_dr12.json')))
8181
# SpecObj and SpecObjAll are the same in DR12
8282
key2 = ('SpecObj',
83-
'http://skyserver.sdss.org/dr12/en/tools/search/x_sql.aspx')
83+
conf.skyserver_baseurl + '/dr12/en/tools/search/x_sql.aspx')
8484
_cached_table_fields[key2] = _cached_table_fields[key1]
8585

8686

astroquery/sdss/tests/test_sdss.py

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ def data_path(filename):
124124
# Test Case: Column of coordinates
125125
coords_column = Column(coords_list, name='coordinates')
126126

127+
# List of all data releases.
128+
dr_list = list(range(1, sdss.conf.default_release + 1))
129+
127130

128131
# We are not testing queries for DR11 because it is not easily available to
129132
# query: "DR11 data are distributed primarily to provide reproducibility of
@@ -134,6 +137,8 @@ def url_tester(data_release):
134137
baseurl = 'http://skyserver.sdss.org/dr{}/en/tools/search/x_sql.asp'
135138
if data_release == 10:
136139
baseurl = 'http://skyserver.sdss.org/dr{}/en/tools/search/x_sql.aspx'
140+
if data_release == 11:
141+
return
137142
if data_release >= 12:
138143
baseurl = 'http://skyserver.sdss.org/dr{}/en/tools/search/x_results.aspx'
139144
assert sdss.SDSS._last_url == baseurl.format(data_release)
@@ -142,21 +147,19 @@ def url_tester(data_release):
142147
def url_tester_crossid(data_release):
143148
if data_release < 11:
144149
baseurl = 'http://skyserver.sdss.org/dr{}/en/tools/crossid/x_crossid.aspx'
150+
if data_release == 11:
151+
return
145152
if data_release >= 12:
146153
baseurl = 'http://skyserver.sdss.org/dr{}/en/tools/search/X_Results.aspx'
147154
assert sdss.SDSS._last_url == baseurl.format(data_release)
148155

149156

150157
def compare_xid_data(xid, data):
151-
if six.PY3:
152-
pytest.xfail('xid/data comparison fails in PY3 because the instrument '
153-
'column is bytes in xid and str in data')
154-
else:
155-
for col in xid.colnames:
156-
if xid[col].dtype.type is np.string_:
157-
assert xid[col] == data[col]
158-
else:
159-
assert_allclose(xid[col], data[col])
158+
for col in xid.colnames:
159+
if xid[col].dtype.type is np.string_:
160+
assert xid[col] == data[col]
161+
else:
162+
assert_allclose(xid[col], data[col])
160163

161164

162165
def image_tester(images, filetype):
@@ -167,7 +170,7 @@ def image_tester(images, filetype):
167170
assert images[0][0].data == data[0].data
168171

169172

170-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
173+
@pytest.mark.parametrize("dr", dr_list)
171174
def test_sdss_spectrum(patch_get, patch_get_readable_fileobj, dr,
172175
coords=coords):
173176
xid = sdss.SDSS.query_region(coords, data_release=dr, spectro=True)
@@ -177,20 +180,20 @@ def test_sdss_spectrum(patch_get, patch_get_readable_fileobj, dr,
177180
url_tester(dr)
178181

179182

180-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
183+
@pytest.mark.parametrize("dr", dr_list)
181184
def test_sdss_spectrum_mjd(patch_get, patch_get_readable_fileobj, dr):
182185
sp = sdss.SDSS.get_spectra(plate=2345, fiberID=572, data_release=dr)
183186
image_tester(sp, 'spectra')
184187

185188

186-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
189+
@pytest.mark.parametrize("dr", dr_list)
187190
def test_sdss_spectrum_coords(patch_get, patch_get_readable_fileobj, dr,
188191
coords=coords):
189192
sp = sdss.SDSS.get_spectra(coords, data_release=dr)
190193
image_tester(sp, 'spectra')
191194

192195

193-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
196+
@pytest.mark.parametrize("dr", dr_list)
194197
def test_sdss_sql(patch_get, patch_get_readable_fileobj, dr):
195198
query = """
196199
select top 10
@@ -213,7 +216,7 @@ class = 'galaxy'
213216
url_tester(dr)
214217

215218

216-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
219+
@pytest.mark.parametrize("dr", dr_list)
217220
def test_sdss_image_from_query_region(patch_get, patch_get_readable_fileobj,
218221
dr, coords=coords):
219222
xid = sdss.SDSS.query_region(coords, data_release=dr)
@@ -223,13 +226,13 @@ def test_sdss_image_from_query_region(patch_get, patch_get_readable_fileobj,
223226
url_tester(dr)
224227

225228

226-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
229+
@pytest.mark.parametrize("dr", dr_list)
227230
def test_sdss_image_run(patch_get, patch_get_readable_fileobj, dr):
228231
img = sdss.SDSS.get_images(run=1904, camcol=3, field=164, data_release=dr)
229232
image_tester(img, 'images')
230233

231234

232-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
235+
@pytest.mark.parametrize("dr", dr_list)
233236
def test_sdss_image_coord(patch_get, patch_get_readable_fileobj, dr,
234237
coord=coords):
235238
img = sdss.SDSS.get_images(coords, data_release=dr)
@@ -241,7 +244,7 @@ def test_sdss_template(patch_get, patch_get_readable_fileobj):
241244
image_tester(template, 'spectra')
242245

243246

244-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
247+
@pytest.mark.parametrize("dr", dr_list)
245248
def test_sdss_specobj(patch_get, dr):
246249
xid = sdss.SDSS.query_specobj(plate=2340, data_release=dr)
247250
data = Table.read(data_path(DATA_FILES['spectra_id']),
@@ -255,7 +258,7 @@ def test_sdss_specobj(patch_get, dr):
255258
url_tester(dr)
256259

257260

258-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
261+
@pytest.mark.parametrize("dr", dr_list)
259262
def test_sdss_photoobj(patch_get, dr):
260263
xid = sdss.SDSS.query_photoobj(
261264
run=1904, camcol=3, field=164, data_release=dr)
@@ -269,7 +272,7 @@ def test_sdss_photoobj(patch_get, dr):
269272
url_tester(dr)
270273

271274

272-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
275+
@pytest.mark.parametrize("dr", dr_list)
273276
def test_list_coordinates(patch_get, dr):
274277
xid = sdss.SDSS.query_region(coords_list, data_release=dr)
275278
data = Table.read(data_path(DATA_FILES['images_id']),
@@ -281,7 +284,7 @@ def test_list_coordinates(patch_get, dr):
281284
compare_xid_data(xid, data)
282285

283286

284-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
287+
@pytest.mark.parametrize("dr", dr_list)
285288
def test_column_coordinates(patch_get, dr):
286289
xid = sdss.SDSS.query_region(coords_column, data_release=dr)
287290
data = Table.read(data_path(DATA_FILES['images_id']),
@@ -309,7 +312,7 @@ def test_images_timeout(patch_get, patch_get_readable_fileobj_slow):
309312
sdss.SDSS.get_images(run=1904, camcol=3, field=164)
310313

311314

312-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
315+
@pytest.mark.parametrize("dr", dr_list)
313316
def test_query_crossid(patch_post, dr):
314317
xid = sdss.SDSS.query_crossid(coords_column, data_release=dr)
315318
data = Table.read(data_path(DATA_FILES['images_id']),
@@ -325,7 +328,7 @@ def test_query_crossid(patch_post, dr):
325328
# ===========
326329
# Payload tests
327330

328-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
331+
@pytest.mark.parametrize("dr", dr_list)
329332
def test_list_coordinates_payload(patch_get, dr):
330333
expect = ("SELECT DISTINCT "
331334
"p.ra, p.dec, p.objid, p.run, p.rerun, p.camcol, p.field "
@@ -341,7 +344,7 @@ def test_list_coordinates_payload(patch_get, dr):
341344
assert query_payload['format'] == 'csv'
342345

343346

344-
@pytest.mark.parametrize("dr", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12])
347+
@pytest.mark.parametrize("dr", dr_list)
345348
def test_column_coordinates_payload(patch_get, dr):
346349
expect = ("SELECT DISTINCT "
347350
"p.ra, p.dec, p.objid, p.run, p.rerun, p.camcol, p.field "

astroquery/sdss/tests/test_sdss_remote.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Licensed under a 3-clause BSD style license - see LICENSE.rst
22
import numpy as np
3+
from numpy.testing import assert_allclose
34
import pytest
45

56
from astropy import coordinates
@@ -99,7 +100,13 @@ def test_sdss_specobj(self):
99100
xid = sdss.SDSS.query_specobj(plate=2340)
100101
assert isinstance(xid, Table)
101102
for row in table:
102-
assert row in xid
103+
i = np.nonzero(xid['specobjid'] == row['specobjid'])[0]
104+
assert len(i) == 1
105+
for j, c in enumerate(colnames):
106+
if dtypes[j] is float:
107+
assert_allclose(xid[i][c], row[c])
108+
else:
109+
assert xid[i][c] == row[c]
103110

104111
def test_sdss_photoobj(self):
105112
colnames = ['ra', 'dec', 'objid', 'run', 'rerun', 'camcol', 'field']
@@ -120,7 +127,13 @@ def test_sdss_photoobj(self):
120127
xid = sdss.SDSS.query_photoobj(run=1904, camcol=3, field=164)
121128
assert isinstance(xid, Table)
122129
for row in table:
123-
assert row in xid
130+
i = np.nonzero(xid['objid'] == row['objid'])[0]
131+
assert len(i) == 1
132+
for j, c in enumerate(colnames):
133+
if dtypes[j] is float:
134+
assert_allclose(xid[i][c], row[c])
135+
else:
136+
assert xid[i][c] == row[c]
124137

125138
@pytest.mark.xfail(reason=("Timeout isn't raised since switching to "
126139
"self._request, fix it before merging #586"))

0 commit comments

Comments
 (0)