Source code for astroML.datasets.sdss_S82standards

import os
from gzip import GzipFile
from io import BytesIO

import numpy as np

from .tools import download_with_progress_bar
from . import get_data_home

DATA_URL = ('https://github.com/astroML/astroML-data/raw/main/datasets/'
            'stripe82calibStars_v2.6.dat.gz')
DATA_URL_2MASS = ('https://github.com/astroML/astroML-data/raw/main/datasets/'
                  'stripe82calibStars_2MASS_v2.6.dat.gz')

ARCHIVE_FILE = 'sdss_S82standards.npy'
ARCHIVE_FILE_2MASS = 'sdss_S82standards_2mass.npy'

DTYPE = [('RA', 'f8'),
         ('DEC', 'f8'),
         ('RArms', 'f4'),
         ('DECrms', 'f4'),
         ('Ntot', 'i4'),
         ('A_r', 'f4')]

for band in 'ugriz':
    DTYPE += [('Nobs_%s' % band, 'i4')]
    DTYPE += map(lambda s: (s + '_' + band, 'f4'),
                 ['mmed', 'mmu', 'msig', 'mrms', 'mchi2'])

DTYPE_2MASS = DTYPE + [('ra2MASS', 'f4'),
                       ('dec2MASS', 'f4'),
                       ('J', 'f4'),
                       ('Jerr', 'f4'),
                       ('H', 'f4'),
                       ('Herr', 'f4'),
                       ('K', 'f4'),
                       ('Kerr', 'f4'),
                       ('theta', 'f4')]

# first column is 'CALIBSTARS'.  We'll ignore this.
COLUMNS = range(1, len(DTYPE) + 1)


[docs]def fetch_sdss_S82standards(data_home=None, download_if_missing=True, crossmatch_2mass=False): """Loader for SDSS stripe82 standard star catalog Parameters ---------- data_home : optional, default=None Specify another download and cache folder for the datasets. By default all astroML data is stored in '~/astroML_data'. download_if_missing : bool, optional, default=True If False, raise a IOError if the data is not locally available instead of trying to download the data from the source site. crossmatch_2mass: bool, optional, default=False If True, return the standard star catalog cross-matched with 2mass magnitudes Returns ------- data : ndarray, shape = (313859,) record array containing sdss standard stars (see notes below) Notes ----- Information on the data can be found at http://www.astro.washington.edu/users/ivezic/sdss/catalogs/stripe82.html Data is described in Ivezic et al. 2007 (Astronomical Journal, 134, 973). Columns are as follows: RA Right-ascention of source (degrees) DEC Declination of source (degrees) RArms rms of right-ascention (arcsec) DECrms rms of declination (arcsec) Ntot total number of epochs A_r SFD ISM extinction (mags) for each band in (u g r i z): Nobs_<band> number of observations in this band mmed_<band> median magnitude in this band mmu_<band> mean magnitude in this band msig_<band> standard error on the mean (1.25 times larger for median) mrms_<band> root-mean-square scatter mchi2_<band> chi2 per degree of freedom for mean magnitude For 2-MASS, the following columns are added: ra2MASS 2-mass right-ascention dec2MASS 2-mass declination J J-band magnitude Jerr J-band error H H-band magnitude Herr H-band error K K-band magnitude Kerr K-band error theta difference between SDSS and 2MASS position (arcsec) Examples -------- >>> data = fetch_sdss_S82standards() # doctest: +IGNORE_OUTPUT +REMOTE_DATA >>> u_g = data['mmed_u'] - data['mmed_g'] # doctest: +REMOTE_DATA >>> print(u_g[:4]) # doctest: +REMOTE_DATA [-22.23500061 1.34900093 1.43799973 2.08200073] References ---------- Ivesic et al. ApJ 134:973 (2007) """ data_home = get_data_home(data_home) if crossmatch_2mass: archive_file = os.path.join(data_home, ARCHIVE_FILE_2MASS) data_url = DATA_URL_2MASS kwargs = dict(dtype=DTYPE_2MASS) else: archive_file = os.path.join(data_home, ARCHIVE_FILE) data_url = DATA_URL kwargs = dict(usecols=COLUMNS, dtype=DTYPE) if not os.path.exists(archive_file): if not download_if_missing: raise IOError('data not present on disk. ' 'set download_if_missing=True to download') print("downloading cross-matched SDSS/2MASS dataset from %s to %s" % (data_url, data_home)) zipped_buf = download_with_progress_bar(data_url, return_buffer=True) gzf = GzipFile(fileobj=zipped_buf, mode='rb') print("uncompressing file...") extracted_buf = BytesIO(gzf.read()) data = np.loadtxt(extracted_buf, **kwargs) np.save(archive_file, data) else: data = np.load(archive_file) return data