Source code for desispec.efftime

"""
desispec.efftime
================

Effective exposure time formulae.
"""

import numpy as np


# AR https://desi.lbl.gov/trac/wiki/SurveyOps/SurveySpeed
# AR 2021-03-05: GFA values are now computed for a fiber diameter of 1.52"
[docs]def compute_efftime(table, kterm=0.114, # KERM ebv_r_coeff=2.165, fiber_diameter_arcsec=1.52): """Computes the effective exposure times using transparency and fiber acceptance from the GFAs offline analysis, and the sky magnitudes from the spectroscopy. Uses the formulae described in https://desi.lbl.gov/trac/wiki/SurveyOps/SurveySpeed for the dark, bright and backup programs. Args: table: astropy.table.Table with columns - EXPTIME exposure time in seconds - SKY_MAG_R_SPEC AB magnitude per arcsec2 of sky, in decam-r filter - EBV E(B-V) from SFD map - TRANSPARENCY_GFA transparency (number between 0 and 1, ~1 for photometric nights irrespectively of AIRMASS) - AIRMASS (airmass >=1) - FIBERFAC_GFA PMGSTARS forced photometry amount of light in 1.52 asec diameter aperture normalized to nominal, assuming a point source profile - FIBERFAC_ELG_GFA PMGSTARS forced photometry amount of light in 1.52 asec diameter aperture normalized to nominal, assuming an ELG-like profile (r_half = 0.45 asec exponential) - FIBERFAC_BGS_GFA PMGSTARS forced photometry amount of light in 1.52 asec diameter aperture normalized to nominal, assuming a BGS-like profile (r_half = 1.5 asec de Vaucouleurs) - FIBER_FRACFLUX_GFA fraction of light in fiber for point source - FIBER_FRACFLUX_ELG_GFA fraction of light in fiber for typical ELG source - FIBER_FRACFLUX_BGS_GFA fraction of light in fiber for typical BGS source """ exptime = table["EXPTIME"] skymag = table["SKY_MAG_R_SPEC"] sky = 10**(-0.4*(skymag-22.5)) # nMgy/arcsec**2 ebv = table["EBV"] transparency = table["TRANSPARENCY_GFA"] airmass = table["AIRMASS"] fiberfac_psf = table["FIBERFAC_GFA"] # fiber_frac * transparency normalized to 1 for nominal conditions fiberfac_elg = table["FIBERFAC_ELG_GFA"] # fiber_frac * transparency normalized to 1 for nominal conditions fiberfac_bgs = table["FIBERFAC_BGS_GFA"] # fiber_frac * transparency normalized to 1 for nominal conditions fiber_fracflux_bgs = table["FIBER_FRACFLUX_BGS_GFA"] # fraction of light down fiber fiber_fracflux_psf = table["FIBER_FRACFLUX_GFA"] exptime_nom = 1000.0 # AR seconds sky_nom = 3.73 # AR nMgy/arcsec**2 flux_bright_nom = 15.8 # nMgy (r=19.5 mag for de Vaucouleurs rhalf=1.5" BGS) flux_backup_nom = 27.5 # nMgy (r=18.9 mag star) # AR airmass term airfac = 10.0 ** (kterm * (airmass - 1.0) / 2.5) # AR ebv term ebvfac = 10.0 ** (ebv_r_coeff * ebv / 2.5) # AR sky readnoise sky_rdn = 0.932 # AR nMgy/arcsec**2 # AR "limit" fiber flux fiber_area_arcsec2 = np.pi*(fiber_diameter_arcsec/2)**2 # flux in fiber artificially divided by fiber_area_arcsec2 because the sky flux is per arcsec2 fflux_bright = flux_bright_nom * transparency * fiber_fracflux_bgs / airfac / ebvfac / fiber_area_arcsec2 fflux_backup = flux_backup_nom * transparency * fiber_fracflux_psf / airfac / ebvfac / fiber_area_arcsec2 # AR effective sky effsky_dark = (sky + sky_rdn * exptime_nom / exptime) / (1.0 + sky_rdn / sky_nom) effsky_bright = (sky + sky_rdn * exptime_nom / exptime + fflux_bright) / ( 1.0 + sky_rdn / sky_nom + fflux_bright / sky_nom ) effsky_backup = (sky + sky_rdn * exptime_nom / exptime + fflux_backup) / ( 1.0 + sky_rdn / sky_nom + fflux_backup / sky_nom ) # AR effective exposure time efftime_dark = ( exptime * (fiberfac_elg / airfac) ** 2 * (sky_nom / effsky_dark) / ebvfac ** 2 ) efftime_bright = ( exptime * (fiberfac_bgs / airfac) ** 2 * (sky_nom / effsky_bright) / ebvfac ** 2 ) efftime_backup = ( exptime * (fiberfac_psf / airfac) ** 2 * (sky_nom / effsky_backup) / ebvfac ** 2 ) # set to -1 values with incorrect inputs bad=table["AIRMASS"]<0.99 bad |=(table["FIBER_FRACFLUX_GFA"]==0) bad |=(table["TRANSPARENCY_GFA"]>2) efftime_dark[bad]=0. efftime_bright[bad]=0. efftime_backup[bad]=0. return efftime_dark , efftime_bright , efftime_backup