Source code for superbol.fbol

import numpy as np

from superbol.fit_blackbody import (bb_flux_integrated, bb_total_flux,
                                    dbb_flux_integrated_dT, dbb_total_flux_dT)


[docs]def integrate_fqbol(wavelengths, fluxes, flux_uncertainties): """Calculate the trapezoidal rule integral of the observed `fluxes`. The trapezoidal rule integrates the data by assuming the function is linear between observed points, and then integrates under those line segments. The numpy function `trapz` is used to perform the integration, but the uncertainty in the integral due to uncertainties in the observed flux is calculated by hand using standard error propagation techniques. Args: wavelengths (list): List of wavelengths at which the flux was observed. fluxes (list): List of observed fluxes. flux_uncertainties (list): List of uncertainties in each observed flux. Returns: tuple: 2-tuple of floats. * The value of the integral * The uncertainty in the integral due to uncertainties in the fluxes. (fqbol, fqbol_uncertainty) """ fqbol = np.trapz(fluxes, wavelengths) quad_terms = np.array([]) for i, uncertainty in enumerate(flux_uncertainties): if i == 0: term = 0.5 * (wavelengths[i + 1] - wavelengths[i]) * uncertainty quad_terms = np.append(quad_terms, term) elif i == len(flux_uncertainties) - 1: term = 0.5 * (wavelengths[i] - wavelengths[i - 1]) * uncertainty quad_terms = np.append(quad_terms, term) else: term = 0.5 * ( wavelengths[i + 1] - wavelengths[i - 1]) * uncertainty quad_terms = np.append(quad_terms, term) fqbol_uncertainty = np.sqrt(np.sum(x * x for x in quad_terms)) fqbol_uncertainty = fqbol_uncertainty return fqbol, fqbol_uncertainty
[docs]def ir_correction(temperature, T_err, angular_radius, rad_err, longest_wl): """Apply correction for unobserved flux in the IR. After the temperature and angular radius has been found through fitting a blackbody to the observed fluxes, this function takes those values and integrates under the fitted blackbody function from the longest observed wavelength out to :math:`\\lambda = \\infty`. Args: temperature (float): Best fit blackbody temperature in Kelvin T_err (float): Uncertainty in best fit blackbody temperature in Kelvin angular_radius (float): Best fit blackbody angular radius rad_err (float): Uncertainty in best fit blackbody angular radius longest_wl (float): Longest observed wavelength Returns: tuple: 2-tuple * (float): The IR correction in :math:`erg \\; s^{-1} cm^{-2}` * (float): The uncertainty in the IR correction in the same units """ ir_correction = bb_total_flux(temperature, angular_radius) - bb_flux_integrated( longest_wl, temperature, angular_radius) T_errterm = (dbb_total_flux_dT(temperature, angular_radius) - dbb_flux_integrated_dT(longest_wl, temperature, angular_radius)) * T_err rad_errterm = 2 * ir_correction / angular_radius * rad_err ir_corr_err = np.sqrt(T_errterm**2 + rad_errterm**2) return ir_correction, ir_corr_err
[docs]def uv_correction_blackbody(temperature, T_err, angular_radius, rad_err, shortest_wl): """Apply correction for unobserved flux in the UV using the blackbody fit. After the temperature and angular radius have been found through fitting a blackbody to the observed fluxes, this function takes those values and integrates under the fitted blackbody from the shortest observed wavelength down to :math:`\\lambda = 0`. Args: temperature (float): Best fit blackbody temperature in Kelvin T_err (float): Uncertainty in best fit blackbody temperature in Kelvin angular_radius (float): Best fit blackbody angular radius rad_err (float): Uncertainty in best fit blackbody angular radius shortest_wl (float): Shortest observed wavelength Returns: tuple: 2-tuple * (float): The UV correction in :math:`erg \\; s^{-1} cm^{-2}` * (float): The uncertainty in the UV correction in the same units """ uv_correction = bb_flux_integrated(shortest_wl, temperature, angular_radius) T_errterm = dbb_flux_integrated_dT(shortest_wl, temperature, angular_radius) * T_err rad_errterm = 2 * uv_correction / angular_radius * rad_err uv_corr_err = np.sqrt(T_errterm**2 + rad_errterm**2) return uv_correction, uv_corr_err
[docs]def uv_correction_linear(shortest_wl, shortest_flux, shortest_flux_err): """Apply correction for unobserved flux in the UV using a linear function. This function integrates under a straight line from the shortest observed wavelength down to :math:`f(\\lambda) = 0` at :math:`\\lambda = 2000` Angstroms. This approximates the effects of line blanketing in the UV as in Bersten & Hamuy (2009). Args: shortest_wl (float): Shortest observed wavelength shortest_flux (float): Flux at shortest observed wavelength shortest_flux_err (float): Uncertainty in the shortest observed flux Returns: tuple: 2-tuple * (float): The UV correction in :math:`erg \\; s^{-1} cm^{-2}` * (float): The uncertainty in the UV correction in the same units """ fluxes = [0.0, shortest_flux] wavelengths = [2000.0, shortest_wl] uv_correction = np.trapz(fluxes, wavelengths) uv_correction_err = 0.5 * (shortest_wl - 2000.0) * shortest_flux_err return uv_correction, uv_correction_err