Source code for lightcurvelynx.models.basic_models

"""A collection of toy models that are primarily used for testing."""

import numpy as np

from lightcurvelynx.models.physical_model import SEDModel


[docs] class ConstantSEDModel(SEDModel): """A model with a constant SED over both wavelength and time. Parameterized values include: * brightness - The inherent brightness * dec - The object's declination in degrees. [from BasePhysicalModel] * distance - The object's luminosity distance in pc. [from BasePhysicalModel] * ra - The object's right ascension in degrees. [from BasePhysicalModel] * redshift - The object's redshift. [from BasePhysicalModel] * t0 - No effect for static model. [from BasePhysicalModel] Parameters ---------- brightness : float The inherent brightness **kwargs : dict, optional Any additional keyword arguments. """ def __init__(self, brightness, **kwargs): super().__init__(**kwargs) self.add_parameter( "brightness", brightness, description="The inherent brightness of the object.", **kwargs, )
[docs] def compute_sed(self, times, wavelengths, graph_state, **kwargs): """Draw effect-free observations for this object. Parameters ---------- times : numpy.ndarray A length T array of rest frame timestamps. wavelengths : numpy.ndarray, optional A length N array of wavelengths (in angstroms). graph_state : GraphState An object mapping graph parameters to their values. **kwargs : dict, optional Any additional keyword arguments. Returns ------- flux_density : numpy.ndarray A length T x N matrix of SED values (in nJy). """ params = self.get_local_params(graph_state) return np.full((len(times), len(wavelengths)), params["brightness"])
[docs] class StepModel(ConstantSEDModel): """A static model that is on for a fixed amount of time. Parameterized values include: * brightness - The inherent brightness * dec - The object's declination in degrees. [from BasePhysicalModel] * distance - The object's luminosity distance in pc. [from BasePhysicalModel] * ra - The object's right ascension in degrees. [from BasePhysicalModel] * redshift - The object's redshift. [from BasePhysicalModel] * t0 - The time the step function starts, in MJD. * t1- The time the step function ends, in MJD. Parameters ---------- brightness : float The inherent brightness t0 : float The time the step function starts, in MJD. t1 : float The time the step function ends, in MJD. **kwargs : dict, optional Any additional keyword arguments. """ def __init__(self, brightness, t1, **kwargs): super().__init__(brightness, **kwargs) # t0 is added in the PhysicalModel constructor. self.add_parameter("t1", t1, description="The time the step function ends, in MJD.", **kwargs)
[docs] def compute_sed(self, times, wavelengths, graph_state, **kwargs): """Draw effect-free observations for this object. Parameters ---------- times : numpy.ndarray A length T array of rest frame timestamps. wavelengths : numpy.ndarray, optional A length N array of wavelengths (in angstroms). graph_state : GraphState An object mapping graph parameters to their values. **kwargs : dict, optional Any additional keyword arguments. Returns ------- flux_density : numpy.ndarray A length T x N matrix of SED values (in nJy). """ flux_density = np.zeros((len(times), len(wavelengths))) params = self.get_local_params(graph_state) time_mask = (times >= params["t0"]) & (times <= params["t1"]) flux_density[time_mask] = params["brightness"] return flux_density
[docs] class SinWaveModel(SEDModel): """A model that emits a sine wave:: flux = brightness + amplitude * sin(2 * pi * frequency * (time - t0)) Parameterized values include: * brightness - The inherent brightness * frequency - The frequence of the sine wave. * dec - The object's declination in degrees. [from BasePhysicalModel] * distance - The object's luminosity distance in pc. [from BasePhysicalModel] * ra - The object's right ascension in degrees. [from BasePhysicalModel] * redshift - The object's redshift. [from BasePhysicalModel] * t0 - The start of the sine wave's period. [from BasePhysicalModel] Parameters ---------- brightness : float The inherent brightness. Default: 0.0 amplitude : float The amplitude of the sine wave. Default: 0.0 frequency : float The frequency of the sine wave. Default: 1.0 **kwargs : dict, optional Any additional keyword arguments. """ def __init__(self, *, brightness=0.0, amplitude=0.0, frequency=1.0, **kwargs): super().__init__(**kwargs) self.add_parameter( "brightness", brightness, description="The inherent brightness of the object.", **kwargs, ) self.add_parameter("amplitude", amplitude, description="The amplitude of the sine wave.", **kwargs) self.add_parameter("frequency", frequency, description="The frequency of the sine wave.", **kwargs)
[docs] def compute_sed(self, times, wavelengths, graph_state, **kwargs): """Draw effect-free observations for this object. Parameters ---------- times : numpy.ndarray A length T array of rest frame timestamps. wavelengths : numpy.ndarray, optional A length N array of wavelengths (in angstroms). graph_state : GraphState An object mapping graph parameters to their values. **kwargs : dict, optional Any additional keyword arguments. Returns ------- flux_density : numpy.ndarray A length T x N matrix of SED values (in nJy). """ params = self.get_local_params(graph_state) phases = 2.0 * np.pi * params["frequency"] * (times - params["t0"]) single_wave = params["brightness"] + params["amplitude"] * np.sin(phases) return np.tile(single_wave[:, np.newaxis], (1, len(wavelengths)))
[docs] class LinearWavelengthModel(SEDModel): """A model that emits flux as a linear function of wavelength (that is constant over time):: f(t, w) = scale * w + base. Includes optional minimum and maximum wavelength bounds to test extrapolation. Parameterized values include: * linear_base - The base brightness in nJy. * linear_scale - The slope of the linear function in nJy/Angstrom. * dec - The object's declination in degrees. [from BasePhysicalModel] * distance - The object's luminosity distance in pc. [from BasePhysicalModel] * ra - The object's right ascension in degrees. [from BasePhysicalModel] * redshift - The object's redshift. [from BasePhysicalModel] * t0 - No effect for static model. [from BasePhysicalModel] Attributes ---------- min_wave : float or None The minimum wavelength of the model (in angstroms). Or None if there is no minimum wavelength. max_wave : float or None The maximum wavelength of the model (in angstroms). Or None if there is no maximum wavelength. Parameters ---------- linear_base : parameter The base brightness in nJy. linear_scale : parameter The slope of the linear function in nJy/Angstrom. min_wave : float or None The minimum wavelength of the model (in angstroms). Or None if there is no minimum wavelength. max_wave : float or None The maximum wavelength of the model (in angstroms). Or None if there is no maximum wavelength. **kwargs : dict, optional Any additional keyword arguments. """ def __init__(self, linear_base, linear_scale, min_wave=None, max_wave=None, **kwargs): super().__init__(**kwargs) self.add_parameter("linear_base", linear_base, **kwargs) self.add_parameter("linear_scale", linear_scale, **kwargs)
[docs] self.min_wave = min_wave
[docs] self.max_wave = max_wave
[docs] def minwave(self, graph_state=None): """Get the minimum wavelength of the model. Parameters ---------- graph_state : GraphState, optional An object mapping graph parameters to their values. Not used for this model. Returns ------- minwave : float or None The minimum wavelength of the model (in angstroms) or None if the model does not have a defined minimum wavelength. """ return self.min_wave
[docs] def maxwave(self, graph_state=None): """Get the maximum wavelength of the model. Parameters ---------- graph_state : GraphState, optional An object mapping graph parameters to their values. Not used for this model. Returns ------- maxwave : float or None The maximum wavelength of the model (in angstroms) or None if the model does not have a defined maximum wavelength. """ return self.max_wave
[docs] def compute_sed(self, times, wavelengths, graph_state, **kwargs): """Draw effect-free observations for this object. Parameters ---------- times : numpy.ndarray A length T array of rest frame timestamps. wavelengths : numpy.ndarray, optional A length N array of wavelengths (in angstroms). graph_state : GraphState An object mapping graph parameters to their values. **kwargs : dict, optional Any additional keyword arguments. Returns ------- flux_density : numpy.ndarray A length T x N matrix of SED values (in nJy). """ params = self.get_local_params(graph_state) single_wave = params["linear_base"] + params["linear_scale"] * wavelengths return np.tile(single_wave[np.newaxis, :], (len(times), 1))