Source code for skysurvey.effects.core

"""
This module defines the `Effect` class to construct sncosmo effects with associated parameter models.
"""

import sncosmo
from . import milkyway
from . import hostdust

# ============== #
#  Effect Class  #
# ============== #
[docs] class Effect( object ): """ A class to represent effects (e.g. dust, scatter) to be applied to a transient template. Parameters ---------- effect: `sncosmo.PropagationEffect` Propagation effect. name: str Name of the effect. frame: str 'rest': rest-frame 'obs': observator-frame model: dict model parameters. """ def __init__(self, effect=None, name=None, frame=None, model={}): """ Initialize the Effect class.""" self._effect = effect self._name = name self._frame = frame self._model = model
[docs] @classmethod def from_sncosmo(cls, effect, name, frame, model={}): """ Load an effect from a `sncosmo` effect. Parameters ---------- effect : `sncosmo.PropagationEffect` Propagation effect. name : str Name of the effect. frame : str 'rest': rest-frame 'obs': observator-frame model: dict model parameters. Returns ------- Effect """ return cls(effect, name, frame, model=model)
[docs] @classmethod def from_name(cls, name, which=None): """ Load an effect from its name. Parameters ---------- name: str Name of the effect. Could be: mw, hostdust, scatter. which: str which model to use for the effect. - for mw: `ccm89` (default) - for hostdust: `ccm89` (default) - for scatter: `g10`, `c11` Returns ------- Effect """ name = name.lower().replace("_","") # case insensitive, no "_" # Milky Way dust map if name in ["mw","mwebv","mwdust", "mwmap"]: if which is None or which == "ccm89": effect = sncosmo.CCM89Dust() else: raise NotImplementedError("only ccm89 dust law implemented") name = "mw" frame = "obs" model = milkyway.mwebv_model # Host dust elif name in ["hostdust","dust"]: if which is None or which.lower() == "ccm89": effect = sncosmo.CCM89Dust() else: raise NotImplementedError("only ccm89 dust law implemented") name = "host" frame = "rest" model = hostdust.dust_model # SNIa color scatter elif name.lower() in ["scatter", "scattercolor", "color_scatter", "colorscatter"]: name = "colorscatter" frame = "rest" model = {} if which.lower() == "g10": from . import scatter effect = scatter.ColorScatter_G10.from_saltsource() elif which.lower() == "c11": from . import scatter effect = scatter.ColorScatter_C11() else: raise ValueError(f"unknown colorscatter {which}") else: raise NotImplementedError(f"cannot parse the input effect: {name}") return cls.from_sncosmo(effect, name, frame, model=model)
# ============= # # Internal # # ============= # def __repr__(self): """ String representation of the effect. """ return self.__str__() def __str__(self): """ String representation of the effect. """ import pprint out = { "effect": self.effect, "name":self.name, "frame":self.frame, "model": self.model } return pprint.pformat(out, sort_dicts=False) # ============= # # Properties # # ============= # @property def effect(self): """ Access the effect. """ return self._effect @property def name(self): """ The name of the effect. """ return self._name @property def frame(self): """ Frame of the effect. """ return self._frame @property def model(self): """ Model of the effect. """ return self._model