Source code for rubin_sim.skybrightness.utils

__all__ = ("wrap_ra", "robust_rms", "recalc_mags")

import glob
import os

import numpy as np
from rubin_scheduler.data import get_data_dir

from rubin_sim.phot_utils import Bandpass, Sed


[docs] def wrap_ra(ra): """ Wrap only RA values into 0-2pi (using mod). """ ra = ra % (2.0 * np.pi) return ra
[docs] def robust_rms(array, missing=0.0): """ Use the interquartile range to compute a robust approximation of the RMS. if passed an array smaller than 2 elements, return missing value """ if np.size(array) < 2: rms = missing else: iqr = np.percentile(array, 75) - np.percentile(array, 25) rms = iqr / 1.349 # approximation return rms
def spec2mags(spectra_list, wave): """Convert sky spectra to magnitudes""" # Load LSST filters through_path = os.path.join(get_data_dir(), "throughputs/baseline") keys = ["u", "g", "r", "i", "z", "y"] dtype = [("mags", "float", (6))] result = np.zeros(len(spectra_list), dtype=dtype) filters = {} for filtername in keys: bp = np.loadtxt( os.path.join(through_path, "total_" + filtername + ".dat"), dtype=list(zip(["wave", "trans"], [float] * 2)), ) temp_b = Bandpass() temp_b.set_bandpass(bp["wave"], bp["trans"]) filters[filtername] = temp_b filterwave = np.array([filters[f].calc_eff_wavelen()[0] for f in keys]) for i, spectrum in enumerate(spectra_list): tempSed = Sed() tempSed.set_sed(wave, flambda=spectrum) for j, filtName in enumerate(keys): try: result["mags"][i][j] = tempSed.calc_mag(filters[filtName]) except ValueError: pass return result, filterwave
[docs] def recalc_mags(data_dir=None): """Recalculate the magnitudes for sky brightness components. DANGER: Overwrites data files in place. The rubin_sim_data/skybrightness folder will need to be packaged and updated after running this to propagate changes to other users. """ dirs = ["Airglow", "MergedSpec", "ScatteredStarLight", "Zodiacal", "LowerAtm", "Moon", "UpperAtm"] if data_dir is None: data_dir = get_data_dir() full_paths = [os.path.join(data_dir, "skybrightness/ESO_Spectra", dirname) for dirname in dirs] for path in full_paths: files = glob.glob(os.path.join(path, "*.npz")) for filename in files: data = np.load(filename) spec = data["spec"].copy() wave = data["wave"].copy() data.close() new_mags, filterwave = spec2mags(spec["spectra"], wave) spec["mags"] = new_mags["mags"] np.savez(filename, wave=wave, spec=spec, filterWave=filterwave) pass