Source code for pyspeckit.spectrum.models.ammonia_hf

"""
===================================================
Ammonia inversion transition: Hyperfine-only fitter
===================================================

.. moduleauthor:: Adam Ginsburg <adam.g.ginsburg@gmail.com>

Module API
^^^^^^^^^^

"""
import numpy as np
import matplotlib.cbook as mpcb
import copy
import collections

from ...mpfit import mpfit
from . import fitter
from . import hyperfine
from . import radex_modelgrid
from . import model
from .ammonia_constants import (line_names, freq_dict, aval_dict, ortho_dict,
                                TCMB,
                                voff_lines_dict, tau_wts_dict, line_labels)

from astropy import constants
from astropy import units as u
ckms = constants.c.to(u.km/u.s).value

# sanity check:
for linename in line_names:
    assert len(voff_lines_dict[linename]) == len(tau_wts_dict[linename])

# For each individual inversion line, create a Hyperfine model
nh3_vtau = {linename:
            hyperfine.hyperfinemodel({lineid:lineid for lineid,name in
                                      enumerate(voff_lines_dict[linename])},
                                     {lineid:voff for lineid,voff in
                                      enumerate(voff_lines_dict[linename])},
                                     {lineid:freq_dict[linename]*(1-voff/ckms)
                                      for lineid,voff in
                                      enumerate(voff_lines_dict[linename])},
                                     {lineid:tauwt for lineid,tauwt in
                                      enumerate(tau_wts_dict[linename])},
                                     {lineid:sum(tau_wts_dict[linename]) for lineid,voff in
                                      enumerate(voff_lines_dict[linename])},
                                    )
            for linename in line_names}

[docs]def nh3_vtau_multimodel_generator(linenames): """ If you want to use multiple hyperfines for the same spectrum, use this generator. It is useful if you want N independent tau/tex values but the same velocity and linewidth Parameters ---------- linenames : list A list of line names from the set ('oneone', ..., 'eighteight') Returns ------- model : `model.SpectralModel` A SpectralModel class build from N different metastable inversion hyperfine models """ nlines = len(linenames) def nh3_vtau_multimodel(xarr, velocity, width, *args): assert len(args) == nlines*2 models = [nh3_vtau[linename].hyperfine(xarr, Tex=tex, tau=tau, xoff_v=velocity, width=width) for linename,tex,tau in zip(linenames, args[::2], args[1::2])] return np.array(models).sum(axis=0) mod = model.SpectralModel(nh3_vtau_multimodel, 2+nlines*2, parnames=['center','width'] + [x for ln in linenames for x in ('tex{0}'.format(ln), 'tau{0}'.format(ln)) ], parlimited=[(False,False), (True,False),] + [(True, False),]*2*nlines, parlimits=[(0,0), (0,0), ] + [(TCMB, 0), (0, 0)] * nlines, shortvarnames=["v","\\sigma",] + [x for ln in linenames for x in ('T_{{ex}}({0})'.format(line_labels[ln]), '\\tau({0})'.format(line_labels[ln])) ], fitunit='Hz') return mod