Source code for pyspeckit.spectrum.models.hill5infall

"""
===========================
Hill5 analytic infall model
===========================
.. moduleauthor:: Adam Ginsburg <adam.g.ginsburg@gmail.com>

Code translated from:
https://bitbucket.org/devries/analytic_infall/overview

Original source:
http://adsabs.harvard.edu/abs/2005ApJ...620..800D

Module API
^^^^^^^^^^
"""
import numpy as np
from . import model

[docs]def hill5_model(xarr, tau, v_lsr, v_infall, sigma, tpeak, TBG=2.73): """ The hill5 from de Vries and Myers 2005. This model implicitly has zero optical depth in the envelope, no envelope velocity, and has a fixed background radiation temperature (see Table 2 in the paper). Parameters ---------- xarr : np.ndarray array of x values tau : float tau_c, the core-center optical depth v_lsr : float The centroid velocity in km/s v_infall : float The infall velocity sigma : float The line width tpeak : float The peak brightness temperature TBG : float The background temperature """ vf = v_lsr+v_infall vr = v_lsr-v_infall velocity_array = np.array(xarr.as_unit('km/s')) tauf = tau*np.exp(-((velocity_array-vf)/sigma)**2 / 2.0 ) taur = tau*np.exp(-((velocity_array-vr)/sigma)**2 / 2.0 ) subf = ((1-np.exp(-tauf))/tauf * (tauf>1e-4) + (tauf < 1e-4)) subr = ((1-np.exp(-taur))/taur * (taur>1e-4) + (taur < 1e-4)) subf[subf != subf] = 1.0 subr[subr != subr] = 1.0 frequency = np.array(xarr.as_unit('Hz')) hill_array =(jfunc(tpeak,frequency)-jfunc(TBG,frequency))*(subf-np.exp(-tauf)*subr) if np.isnan(hill_array).any(): raise ValueError("Hill5 model has a NAN") return hill_array
[docs]def jfunc(t, nu): """ t- kelvin nu - Hz? """ H=6.6260755e-27 K=1.380658e-16 NSIG=2.0 # I think this is only necessary for C #if(nu<1.0e-6) return t to = H*nu/K return to/(np.exp(to/t)-1.0)
hill5_fitter = model.SpectralModel(hill5_model, 5, parnames=['tau', 'v_lsr', 'v_infall', 'sigma', 'tpeak'], parlimited=[(True,False),(False,False),(True,False),(True,False), (True,False)], parlimits=[(0,0), (0,0), (0,0), (0,0), (0,0)], shortvarnames=("\\tau","v_{lsr}","v_{infall}","\\sigma","T_{peak}"), # specify the parameter names (TeX is OK) fitunit='km/s', guess_types=[1.0, 'center', 1.0, 'width', 'amplitude'], )