Skip to content

Commit 7d4d49d

Browse files
committed
Update
Some quick fixes
1 parent 9505e92 commit 7d4d49d

File tree

3 files changed

+31
-22
lines changed

3 files changed

+31
-22
lines changed

sdssv_spec_appREMOTE.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
import numpy
2525
from astropy.convolution import Box1DKernel, convolve # type: ignore[import-untyped]
26-
from astropy.io.fits import BinTableHDU, FITS_rec, HDUList # type: ignore[import-untyped]
26+
from astropy.io.fits import BinTableHDU, FITS_rec # type: ignore[import-untyped]
2727
from astropy.io.fits import open as FITS
2828
from numpy import mean, median, ndarray, sqrt, std
2929
from plotly.graph_objects import Figure, Scatter # type: ignore[import-untyped]
@@ -41,18 +41,18 @@
4141
from dash.dependencies import Input, Output, State
4242

4343

44-
def fetch(url: str, speclink: str, auth: None | tuple[str, str] = None) -> bytes:
44+
def fetch(url: str, auth: None | tuple[str, str] = None, speclink: str = "") -> bytes:
4545
try:
4646
rv = request("GET", url, auth=auth)
4747
except ChunkedEncodingError: # Connection broken: IncompleteRead
4848
rv = request("GET", url, auth=auth)
4949
except ConnectionError as e: # ConnectTimeout | SSLError
5050
print(e)
5151
sleep(1)
52-
return fetch(url, auth)
53-
if (rv.status_code != 404):
54-
print(rv.status_code, url)
55-
if speclink!="": print(speclink)
52+
return fetch(url, auth, speclink)
53+
if (rv.status_code != 404):
54+
print(rv.status_code, url)
55+
if speclink: print(" ", speclink)
5656
rv.raise_for_status() # HTTPError
5757
return rv.content
5858
def unzstd(f: str) -> bytes:
@@ -73,11 +73,11 @@ def unzstd(f: str) -> bytes:
7373
if isfile(bhm_data_local):
7474
try:
7575
lcl_data = parse_json(unzstd(bhm_data_local))
76-
rmt_meta = parse_json(fetch(remote + basename(bhm_meta_local), ""))
76+
rmt_meta = parse_json(fetch(remote + basename(bhm_meta_local)))
7777
if lcl_data["hdr"]["date"] >= rmt_meta["date"]: break # already latest
7878
except HTTPError: break # skip update
7979
except: print_exc()
80-
try: write(bhm_data_local, fetch(remote + basename(bhm_data_local), ""))
80+
try: write(bhm_data_local, fetch(remote + basename(bhm_data_local)))
8181
except HTTPError: sleep(1) # retry after delay
8282

8383
metadata: dict[str, list | dict | str | int] = lcl_data["hdr"]
@@ -127,7 +127,7 @@ def get(hdu: FITS_rec, col: str, default: None = None):
127127

128128
@lru_cache(64)
129129
def cached_fetch(url: str, speclink: str) -> bytes:
130-
return fetch(url, speclink, (username, password) if url.startswith("https://data.sdss5.org/sas/sdsswork/") else None)
130+
return fetch(url, (username, password) if url.startswith("https://data.sdss5.org/sas/sdsswork/") else None, speclink)
131131
def locked_fetch(url: str, speclink: str) -> bytes:
132132
with fetch_queue[url]: r = cached_fetch(url, speclink)
133133
return r
@@ -173,7 +173,7 @@ def SDSSV_fetch(username: str, password: str, field: int | str, mjd: int, obj: i
173173
url, speclink = sdss_sas_fits(field, mjd, obj, branch) # speclink added PBH 2025-11-06
174174

175175
numpy.seterr(divide="ignore") # Python does not comply with IEEE 754 :(
176-
fits = cast(HDUList, FITS(IOBuffer(locked_fetch(url,speclink)))) # prevent duplicated requests
176+
fits = FITS(IOBuffer(locked_fetch(url, speclink))) # prevent duplicated requests
177177
hdu2 = fits["COADD"] if "COADD" in fits else fits[1]
178178
hdu3 = fits["SPALL"] if "SPALL" in fits else fits[2] # SPECOBJ
179179
assert isa(hdu2, BinTableHDU) and isa(hdu2.data, FITS_rec)
@@ -338,7 +338,11 @@ def legend(meta: Meta, base: str = "") -> str:
338338
for fieldmjd in catalogs.get(f"{cat}", [0])[1:]: # {13'FIELD,5'MJD}
339339
fid, mjd = divmod(abs(fieldmjd), 10**5)
340340
if field != "all" and int(field) != fid: continue
341-
dat = SDSSV_fetch(username, password, fid, mjd, cat)
341+
try:
342+
dat = SDSSV_fetch(username, password, fid, mjd, cat)
343+
except Exception as e:
344+
if str(e): print(e) if isa(e, HTTPError) else print_exc()
345+
continue
342346
meta = Meta(dat[0])
343347
data.append(Data(meta, wave=dat[1], flux=dat[2], errs=dat[3], name=legend(meta)))
344348
if mjd not in mjd_list: mjd_list.append(mjd)

util/sdss.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from .unit import deg2dms, deg2hms
66

77

8-
def sdss_sas_fits(field: int | str, mjd: int, obj: int | str, branch: str) -> str:
8+
def sdss_sas_fits(field: int | str, mjd: int, obj: int | str, branch: str) -> tuple[str, str]:
99
"""
1010
A function to build the url that will be used to fetch the data.
1111
"""
@@ -23,10 +23,12 @@ def sdss_sas_fits(field: int | str, mjd: int, obj: int | str, branch: str) -> st
2323
else:
2424
daily = "daily"
2525

26+
def spec(field: str, obj: int | str) -> str:
27+
return f"spec-image-{field}-{mjd}-{obj}.png"
28+
2629
def file(field: str, obj: int | str) -> str:
2730
return f"spec-{field}-{mjd}-{obj}.fits"
28-
def spile(field: str, obj: int | str) -> str:
29-
return f"spec-image-{field}-{mjd}-{obj}.png"
31+
3032
field4 = str(field).zfill(4)
3133
field6 = str(field).zfill(6)
3234
obj04 = str(obj).zfill( 4)
@@ -56,7 +58,6 @@ def spile(field: str, obj: int | str) -> str:
5658
case _:
5759
path = "https://data.sdss5.org/sas/sdsswork/bhm/boss/spectro/redux"
5860

59-
speclink="" # speclink added PBH 2025-11-06
6061
match branch:
6162
case v if fullmatch(r"v5_(\d+_\d+)", v) or v in ("26", "103", "104"):
6263
url = f"{path}/{branch}/spectra/lite/{field4 }/{file(field4, obj04)}"
@@ -66,12 +67,15 @@ def spile(field: str, obj: int | str) -> str:
6667
url = f"{path}/{branch}/spectra/lite/{field6 }/{mjd}/{file(field6, obj )}"
6768
case _: # v6.2.0+
6869
url = f"{path}/{branch}/spectra/{daily}/lite/{group}/{field6}/{mjd}/{file(field6, obj)}"
69-
if (branch == "v6_2_1" or branch == "master"): # create speclink only for v6_2_1 spectra
70-
speclink = f"{path}/v6_2_1/images/{daily}/v6_2_1/{group}/{field6}/{field6}-{mjd}/{spile(field6, obj)}"
71-
72-
return url, speclink # speclink added PBH 2025-11-06
70+
match branch: # speclink added PBH 2025-11-06
71+
case "v6_2_1" | "master": # create speclink only for v6.2.1+ spectra
72+
img = f"{path}/v6_2_1/images/{daily}/v6_2_1/{group}/{field6}/{field6}-{mjd}/{spec(field6, obj)}"
73+
case _:
74+
img = f""
75+
76+
return url, img
7377
# speclink example:
74-
# https://data.sdss5.org/sas/sdsswork/bhm/boss/spectro/redux/v6_2_1/images/daily/v6_2_1/109XXX/109167/109167-60973/spec-image-109167-60973-63050395805349051.png
78+
# https://data.sdss5.org/sas/sdsswork/bhm/boss/spectro/redux/v6_2_1/images/daily/v6_2_1/109XXX/109167/109167-60973/spec-image-109167-60973-63050395805349051.png
7579

7680
def sdss_iau(α: float, δ: float) -> str:
7781
def _str(x: float, tpl="00") -> str:

util/sdss_test.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
from .sdss import sdss_iau
2-
from .sdss import sdss_sas_fits as func
1+
from .sdss import sdss_iau, sdss_sas_fits
32

43

4+
def func(*xs) -> str: return sdss_sas_fits(*xs)[0]
5+
56
def testset_dr19_026() -> None:
67
b = "26"
78
plate, mjd, fiber, fits = 266, 51602, 1, "spec-0266-51602-0001.fits"

0 commit comments

Comments
 (0)