Source code for rubin_sim.maf.utils.astrometry_utils

__all__ = ("sigma_slope", "m52snr", "astrom_precision")

import numpy as np

"""Some simple functions that are useful for astrometry calculations. """


[docs] def sigma_slope(x, sigma_y): """ Calculate the uncertainty in fitting a line, as given by the spread in x values and the uncertainties in the y values. Parameters ---------- x : numpy.ndarray The x values of the data sigma_y : numpy.ndarray The uncertainty in the y values Returns ------- float The uncertainty in the line fit """ w = 1.0 / sigma_y**2 denom = np.sum(w) * np.sum(w * x**2) - np.sum(w * x) ** 2 if denom <= 0: return np.nan else: result = np.sqrt(np.sum(w) / denom) return result
[docs] def m52snr(m, m5, gamma=0.04): """ Calculate the SNR for a star of magnitude m in an observation with 5-sigma limiting magnitude depth m5. Assumes gaussian distribution of photons and might not be strictly due in bluer filters. See table 2 and equation 5 in astroph/0805.2366. Parameters ---------- m : `float` or `np.ndarray` (N,) The magnitude of the star m5 : `float` or `np.ndarray` (N,) The m5 limiting magnitude of the observation gamma : `float` or None The 'gamma' value used when calculating photometric or astrometric errors and weighting SNR accordingly. See equation 5 of the LSST Overview paper. Use "None" to discount the gamma factor completely and use standard 5*10^(0.4 * (m5-m)). Returns ------- snr : `float` or `np.ndarray` (N,) The SNR """ # gamma varies per band, but is fairly close to 0.04 if gamma is None: snr = 5.0 * 10.0 ** (-0.4 * (m - m5)) else: xval = np.power(10, 0.4 * (m - m5)) snr = 1 / np.sqrt((0.04 - gamma) * xval + gamma * xval * xval) return snr
[docs] def astrom_precision(fwhm, snr, systematic_floor=0.00): """ Calculate the approximate precision of astrometric measurements, given a particular seeing and SNR value. Parameters ---------- fwhm : `float` or `np.ndarray` (N,) The seeing (FWHMgeom) of the observation. snr : float` or `np.ndarray` (N,) The SNR of the object. systematic_floor : `float` Systematic noise floor for astrometric error, in arcseconds. Default here is 0, for backwards compatibility. General Rubin use should be 0.01. Returns ------- astrom_err : `float` or `numpy.ndarray` (N,) The astrometric precision, in arcseconds. """ astrom_err = np.sqrt((fwhm / snr) ** 2 + systematic_floor**2) return astrom_err