Ejemplo n.º 1
0
    def __init__(self, freq_dict):
        """
        Initialize the various parameters defining the redshiftedgroup transitions

        freq_dict - frequencies of the indvidual transitions indexed by name
        """
        self.freq_dict = freq_dict

        self.fitter = model.SpectralModel(
            self,
            3,
            parnames=['amp', 'center', 'width'],
            parlimited=[(False, False), (False, False), (True, False)],
            parlimits=[(0, 0), (0, 0), (0, 0)],
            shortvarnames=(
                "A", "v",
                "\\sigma"),  # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.vheight_fitter = model.SpectralModel(
            fitter.vheightmodel(self),
            4,
            parnames=['height', 'amp', 'center', 'width'],
            parlimited=[(False, False), (False, False), (True, False),
                        (False, False), (True, False)],
            parlimits=[(0, 0), (0, 0), (0, 0), (0, 0)],
            shortvarnames=(
                "H", "A", "v",
                "\\sigma"),  # specify the parameter names (TeX is OK)
            fitunits='Hz')
Ejemplo n.º 2
0
    def __init__(self,
                 npeaks=1,
                 npars=6,
                 parnames=['tkin', 'tex', 'ntot', 'width', 'xoff_v', 'fortho'],
                 **kwargs):
        self.npeaks = npeaks
        self.npars = npars
        self._default_parnames = parnames
        self.parnames = copy.copy(self._default_parnames)

        # all fitters must have declared modelfuncs, which should take the fitted pars...
        self.modelfunc = ammonia
        self.n_modelfunc = self.n_ammonia

        # for fitting ammonia simultaneously with a flat background
        self.onepeakammonia = fitter.vheightmodel(ammonia)
        #self.onepeakammoniafit = self._fourparfitter(self.onepeakammonia)

        self.default_parinfo = None
        self.default_parinfo, kwargs = self._make_parinfo(**kwargs)

        # Remove keywords parsed by parinfo and ignored by the fitter
        for kw in ('tied', 'partied'):
            if kw in kwargs:
                kwargs.pop(kw)

        # enforce ammonia-specific parameter limits
        for par in self.default_parinfo:
            if 'tex' in par.parname.lower():
                par.limited = (True, par.limited[1])
                par.limits = (max(par.limits[0], 2.73), par.limits[1])
            if 'tkin' in par.parname.lower():
                par.limited = (True, par.limited[1])
                par.limits = (max(par.limits[0], 2.73), par.limits[1])
            if 'width' in par.parname.lower():
                par.limited = (True, par.limited[1])
                par.limits = (max(par.limits[0], 0), par.limits[1])
            if 'fortho' in par.parname.lower():
                par.limited = (True, True)
                if par.limits[1] != 0:
                    par.limits = (max(par.limits[0], 0), min(par.limits[1], 1))
                else:
                    par.limits = (max(par.limits[0], 0), 1)
            if 'ntot' in par.parname.lower():
                par.limited = (True, par.limited[1])
                par.limits = (max(par.limits[0], 0), par.limits[1])

        self.parinfo = copy.copy(self.default_parinfo)

        self.modelfunc_kwargs = kwargs
        # lower case? self.modelfunc_kwargs.update({'parnames':self.parinfo.parnames})
        self.use_lmfit = kwargs.pop(
            'use_lmfit') if 'use_lmfit' in kwargs else False
        self.fitunits = 'GHz'
Ejemplo n.º 3
0
    def __init__(self,npeaks=1,npars=6,multisingle='multi',**kwargs):
        self.npeaks = npeaks
        self.npars = npars
        self._default_parnames = ['tkin','tex','ntot','width','xoff_v','fortho']
        self.parnames = copy.copy(self._default_parnames)

        # all fitters must have declared modelfuncs, which should take the fitted pars...
        self.modelfunc = ammonia
        self.n_modelfunc = self.n_ammonia

        # for fitting ammonia simultaneously with a flat background
        self.onepeakammonia = fitter.vheightmodel(ammonia)
        #self.onepeakammoniafit = self._fourparfitter(self.onepeakammonia)

        if multisingle in ('multi','single'):
            self.multisingle = multisingle
        else:
            raise Exception("multisingle must be multi or single")

        self.default_parinfo = None
        self.default_parinfo, kwargs = self._make_parinfo(**kwargs)

        # Remove keywords parsed by parinfo and ignored by the fitter
        for kw in ('tied','partied'):
            if kw in kwargs:
                kwargs.pop(kw)

        # enforce ammonia-specific parameter limits
        for par in self.default_parinfo:
            if 'tex' in par.parname.lower():
                par.limited = (True,par.limited[1])
                par.limits = (max(par.limits[0],2.73), par.limits[1])
            if 'tkin' in par.parname.lower():
                par.limited = (True,par.limited[1])
                par.limits = (max(par.limits[0],2.73), par.limits[1])
            if 'width' in par.parname.lower():
                par.limited = (True,par.limited[1])
                par.limits = (max(par.limits[0],0), par.limits[1])
            if 'fortho' in par.parname.lower():
                par.limited = (True,True)
                if par.limits[1] != 0:
                    par.limits = (max(par.limits[0],0), min(par.limits[1],1))
                else:
                    par.limits = (max(par.limits[0],0), 1)
            if 'ntot' in par.parname.lower():
                par.limited = (True,par.limited[1])
                par.limits = (max(par.limits[0],0), par.limits[1])

        self.parinfo = copy.copy(self.default_parinfo)

        self.modelfunc_kwargs = kwargs
        # lower case? self.modelfunc_kwargs.update({'parnames':self.parinfo.parnames})
        self.use_lmfit = kwargs.pop('use_lmfit') if 'use_lmfit' in kwargs else False
        self.fitunits = 'GHz'
Ejemplo n.º 4
0
    def __init__(self,npeaks=1,npars=6,multisingle='multi',**kwargs):
        self.npeaks = npeaks
        self.npars = npars
        self._default_parnames = ['tkin','tex','ntot','width','xoff_v','fortho']
        self.parnames = copy.copy(self._default_parnames)

        # all fitters must have declared modelfuncs, which should take the fitted pars...
        self.modelfunc = ammonia
        self.n_modelfunc = self.n_ammonia

        # for fitting ammonia simultaneously with a flat background
        self.onepeakammonia = fitter.vheightmodel(ammonia)
        #self.onepeakammoniafit = self._fourparfitter(self.onepeakammonia)

        if multisingle in ('multi','single'):
            self.multisingle = multisingle
        else:
            raise Exception("multisingle must be multi or single")

        self.default_parinfo = None
        self.default_parinfo, kwargs = self._make_parinfo(**kwargs)

        # enforce ammonia-specific parameter limits
        for par in self.default_parinfo:
            if 'tex' in par.parname.lower():
                par.limited = (True,par.limited[1])
                par.limits = (max(par.limits[0],2.73), par.limits[1])
            if 'tkin' in par.parname.lower():
                par.limited = (True,par.limited[1])
                par.limits = (max(par.limits[0],2.73), par.limits[1])
            if 'width' in par.parname.lower():
                par.limited = (True,par.limited[1])
                par.limits = (max(par.limits[0],0), par.limits[1])
            if 'fortho' in par.parname.lower():
                par.limited = (True,True)
                if par.limits[1] != 0:
                    par.limits = (max(par.limits[0],0), min(par.limits[1],1))
                else:
                    par.limits = (max(par.limits[0],0), 1)
            if 'ntot' in par.parname.lower():
                par.limited = (True,par.limited[1])
                par.limits = (max(par.limits[0],0), par.limits[1])

        self.parinfo = copy.copy(self.default_parinfo)


        self.modelfunc_kwargs = kwargs
Ejemplo n.º 5
0
def gaussian_vheight_fitter():
    """
    Generator for Gaussian fitter class
    """

    vhg = fitter.vheightmodel(gaussian)
    myclass =  model.SpectralModel(vhg, 4,
            parnames=['height','amplitude','shift','width'], 
            parlimited=[(False,False),(False,False),(False,False),(True,False)], 
            parlimits=[(0,0),(0,0), (0,0), (0,0)],
            shortvarnames=('B','A',r'\Delta x',r'\sigma'),
            centroid_par='shift',
            fwhm_func=gaussian_fwhm,
            fwhm_pars=['width'],
            )
    myclass.__name__ = "vheightgaussian"
    
    return myclass
    def __init__(self, freq_dict):
        """
        Initialize the various parameters defining the redshiftedgroup transitions

        freq_dict - frequencies of the indvidual transitions indexed by name
        """
        self.freq_dict = freq_dict

        self.fitter = model.SpectralModel(self,3,
            parnames=['amp','center','width'], 
            parlimited=[(False,False), (False,False), (True,False)], 
            parlimits=[(0,0), (0,0), (0,0)],
            shortvarnames=("A","v","\\sigma"), # specify the parameter names (TeX is OK)
            fitunits='Hz' )

        self.vheight_fitter = model.SpectralModel(fitter.vheightmodel(self),4,
            parnames=['height','amp','center','width'], 
            parlimited=[(False,False), (False,False), (True,False), (False,False), (True,False)], 
            parlimits=[(0,0), (0,0), (0,0), (0,0)],
            shortvarnames=("H","A","v","\\sigma"), # specify the parameter names (TeX is OK)
            fitunits='Hz' )
Ejemplo n.º 7
0
    def __init__(self, line_names, voff_lines_dict, freq_dict, line_strength_dict, relative_strength_total_degeneracy):
        """
        Initialize the various parameters defining the hyperfine transitions

        line_names is a LIST of the line names to be used as indices for the dictionaries

        voff_lines_dict is a linename:v_off dictionary of velocity offsets for the hyperfine components.  Technically,
            this is redundant with freq_dict
        freq_dict - frequencies of the indvidual transitions

        line_strength_dict - Relative strengths of the hyperfine components, usually determined by their degeneracy and 
            Einstein A coefficients
        """
        self.line_names = line_names
        self.voff_lines_dict = voff_lines_dict
        self.freq_dict = freq_dict
        self.line_strength_dict = line_strength_dict
        self.relative_strength_total_degeneracy = relative_strength_total_degeneracy

        self.fitter = model.SpectralModel(self,4,
            parnames=['Tex','tau','center','width'], 
            parlimited=[(False,False), (True,False), (False,False), (True,False)], 
            parlimits=[(0,0), (0,0), (0,0), (0,0)],
            shortvarnames=("T_{ex}","\\tau","v","\\sigma"), # specify the parameter names (TeX is OK)
            fitunits='Hz' )

        self.vheight_fitter = model.SpectralModel(fitter.vheightmodel(self),5,
            parnames=['height','Tex','tau','center','width'], 
            parlimited=[(False,False), (False,False), (True,False), (False,False), (True,False)], 
            parlimits=[(0,0), (0,0), (0,0), (0,0), (0,0)],
            shortvarnames=("H","T_{ex}","\\tau","v","\\sigma"), # specify the parameter names (TeX is OK)
            fitunits='Hz' )

        self.ampfitter = model.SpectralModel(self.hyperfine_amp,3,
            parnames=['amp','center','width'], 
            parlimited=[(False,False), (False,False), (True,False)], 
            parlimits=[(0,0), (0,0), (0,0)],
            shortvarnames=("amp","v","\\sigma"), # specify the parameter names (TeX is OK)
            fitunits='Hz' )
Ejemplo n.º 8
0
    def __init__(self, line_names, voff_lines_dict, freq_dict,
                 line_strength_dict, relative_strength_total_degeneracy):
        """
        Initialize the various parameters defining the hyperfine transitions

        Parameters
        ----------
        line_names: list
            list of the line names to be used as indices for the dictionaries
        voff_lines_dict: dict
            a linename:v_off dictionary of velocity offsets for the hyperfine
            components.  Technically, this is redundant with freq_dict
        freq_dict: dict
            frequencies of the indvidual transitions
        line_strength_dict: dict
            Relative strengths of the hyperfine components, usually determined
            by their degeneracy and Einstein A coefficients
        """
        self.line_names = line_names
        self.voff_lines_dict = voff_lines_dict
        self.freq_dict = freq_dict
        self.line_strength_dict = line_strength_dict
        self.relative_strength_total_degeneracy = relative_strength_total_degeneracy

        self.fitter = model.SpectralModel(
            self,
            4,
            parnames=['Tex', 'tau', 'center', 'width'],
            parlimited=[(False, False), (True, False), (False, False),
                        (True, False)],
            parlimits=[(0, 0), (0, 0), (0, 0), (0, 0)],
            shortvarnames=(
                "T_{ex}", "\\tau", "v",
                "\\sigma"),  # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.nlines = len(line_names)

        self.varyhf_fitter = model.SpectralModel(
            self.hyperfine_varyhf,
            3 + self.nlines,
            parnames=['Tex', 'center', 'width'] +
            ['tau%s' % k for k in self.line_names],
            parlimited=[(False, False), (False, False), (True, False)] + [
                (True, False),
            ] * self.nlines,
            parlimits=[(0, 0), (0, 0), (0, 0)] + [
                (0, 0),
            ] * self.nlines,
            shortvarnames=("T_{ex}", "v", "\\sigma") + tuple(
                ("\\tau(\\mathrm{%s})" % k for k in self.line_names)),
            # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.varyhf_amp_fitter = model.SpectralModel(
            self.hyperfine_varyhf_amp,
            2 + self.nlines,
            parnames=['center', 'width'] +
            ['amp%s' % k for k in self.line_names],
            parlimited=[(False, False), (True, False)] + [
                (True, False),
            ] * self.nlines,
            parlimits=[(0, 0), (0, 0)] + [
                (0, 0),
            ] * self.nlines,
            shortvarnames=("v", "\\sigma") + tuple(
                ("amp(\\mathrm{%s})" % k for k in self.line_names)),
            # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.varyhf_amp_width_fitter = model.SpectralModel(
            self.hyperfine_varyhf_amp_width,
            1 + self.nlines * 2,
            parnames=['center'] + ['amp%s' % k for k in self.line_names] +
            ['width%s' % k for k in self.line_names],
            parlimited=[(False, False)] + [
                (True, False),
            ] * self.nlines + [(True, False)] * self.nlines,
            parlimits=[(0, 0)] + [
                (0, 0),
            ] * self.nlines * 2,
            shortvarnames=(("v", ) + tuple(
                ("amp(\\mathrm{%s})" % k for k in self.line_names)) + tuple(
                    ("\\sigma(\\mathrm{%s})" % k for k in self.line_names))),
            # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.vheight_fitter = model.SpectralModel(
            fitter.vheightmodel(self),
            5,
            parnames=['height', 'Tex', 'tau', 'center', 'width'],
            parlimited=[(False, False), (False, False), (True, False),
                        (False, False), (True, False)],
            parlimits=[(0, 0), (0, 0), (0, 0), (0, 0), (0, 0)],
            shortvarnames=(
                "H", "T_{ex}", "\\tau", "v",
                "\\sigma"),  # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.background_fitter = model.SpectralModel(
            self.hyperfine_addbackground,
            5,
            parnames=['Tbackground', 'Tex', 'tau', 'center', 'width'],
            parlimited=[(True, False), (False, False), (False, False),
                        (True, False), (False, False), (True, False)],
            parlimits=[(0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0)],
            shortvarnames=(
                'T_{BG}', "T_{ex}", "\\tau", "v",
                "\\sigma"),  # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.ampfitter = model.SpectralModel(
            self.hyperfine_amp,
            3,
            parnames=['amp', 'center', 'width'],
            parlimited=[(False, False), (False, False), (True, False)],
            parlimits=[(0, 0), (0, 0), (0, 0)],
            shortvarnames=(
                "amp", "v",
                "\\sigma"),  # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.taufitter = model.SpectralModel(
            self.hyperfine_tau,
            3,
            parnames=['tau', 'center', 'width'],
            parlimited=[(True, False), (False, False), (True, False)],
            parlimits=[(0, 0), (0, 0), (0, 0)],
            shortvarnames=(
                r'\tau', "v",
                "\\sigma"),  # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.totaltaufitter = model.SpectralModel(
            self.hyperfine_tau_total,
            3,
            parnames=['tau', 'center', 'width'],
            parlimited=[(True, False), (False, False), (True, False)],
            parlimits=[(0, 0), (0, 0), (0, 0)],
            shortvarnames=(
                r'\tau', "v",
                "\\sigma"),  # specify the parameter names (TeX is OK)
            fitunits='Hz')
Ejemplo n.º 9
0
    def __init__(self, line_names, voff_lines_dict, freq_dict,
                 line_strength_dict, relative_strength_total_degeneracy):
        """
        Initialize the various parameters defining the hyperfine transitions

        Parameters
        ----------
        line_names: list
            list of the line names to be used as indices for the dictionaries
        voff_lines_dict: dict
            a linename:v_off dictionary of velocity offsets for the hyperfine
            components.  Technically, this is redundant with freq_dict
        freq_dict: dict
            frequencies of the indvidual transitions
        line_strength_dict: dict
            Relative strengths of the hyperfine components, usually determined
            by their degeneracy and Einstein A coefficients
        """
        self.line_names = line_names
        self.voff_lines_dict = voff_lines_dict
        self.freq_dict = freq_dict
        self.line_strength_dict = line_strength_dict
        self.relative_strength_total_degeneracy = relative_strength_total_degeneracy

        self.fitter = model.SpectralModel(self,4,
            parnames=['Tex','tau','center','width'],
            parlimited=[(False,False), (True,False), (False,False), (True,False)],
            parlimits=[(0,0), (0,0), (0,0), (0,0)],
            shortvarnames=("T_{ex}","\\tau","v","\\sigma"), # specify the parameter names (TeX is OK)
            fitunits='Hz' )

        self.nlines = len(line_names)

        self.varyhf_fitter = model.SpectralModel(self.hyperfine_varyhf,3+self.nlines,
            parnames=['Tex','center','width']+['tau%s' % k for k in self.line_names],
            parlimited=[(False,False), (False,False), (True,False)] + [(True,False),]*self.nlines, 
            parlimits=[(0,0), (0,0), (0,0)]+[(0,0),]*self.nlines,
            shortvarnames=("T_{ex}","v","\\sigma") + tuple(("\\tau(\\mathrm{%s})" % k for k in self.line_names)),
            # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.varyhf_amp_fitter = model.SpectralModel(self.hyperfine_varyhf_amp, 2+self.nlines,
            parnames=['center','width']+['amp%s' % k for k in self.line_names],
            parlimited=[(False,False), (True,False)] + [(True,False),]*self.nlines,
            parlimits=[(0,0), (0,0)]+[(0,0),]*self.nlines,
            shortvarnames=("v","\\sigma") + tuple(("amp(\\mathrm{%s})" % k for k in self.line_names)),
            # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.varyhf_amp_width_fitter = model.SpectralModel(self.hyperfine_varyhf_amp_width,1+self.nlines*2,
            parnames=['center']+['amp%s' % k for k in self.line_names]+['width%s' % k for k in self.line_names], 
            parlimited=[(False,False)] + [(True,False),]*self.nlines + [(True,False)]*self.nlines, 
            parlimits=[(0,0)]+[(0,0),]*self.nlines*2,
            shortvarnames=(("v",) +
                           tuple(("amp(\\mathrm{%s})" % k for k in self.line_names)) + 
                           tuple(("\\sigma(\\mathrm{%s})" % k for k in self.line_names))), 
            # specify the parameter names (TeX is OK)
            fitunits='Hz' )

        self.vheight_fitter = model.SpectralModel(fitter.vheightmodel(self),5,
            parnames=['height','Tex','tau','center','width'],
            parlimited=[(False,False), (False,False), (True,False), (False,False), (True,False)], 
            parlimits=[(0,0), (0,0), (0,0), (0,0), (0,0)],
            shortvarnames=("H","T_{ex}","\\tau","v","\\sigma"), # specify the parameter names (TeX is OK)
            fitunits='Hz' )

        self.background_fitter = model.SpectralModel(self.hyperfine_addbackground,5,
            parnames=['Tbackground','Tex','tau','center','width'],
            parlimited=[(True,False), (False,False), (False,False), (True,False), (False,False), (True,False)], 
            parlimits=[(0,0), (0,0), (0,0), (0,0), (0,0), (0,0)],
            shortvarnames=('T_{BG}',"T_{ex}","\\tau","v","\\sigma"), # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.ampfitter = model.SpectralModel(self.hyperfine_amp,3,
            parnames=['amp','center','width'], 
            parlimited=[(False,False), (False,False), (True,False)], 
            parlimits=[(0,0), (0,0), (0,0)],
            shortvarnames=("amp","v","\\sigma"), # specify the parameter names (TeX is OK)
            fitunits='Hz' )

        self.taufitter = model.SpectralModel(self.hyperfine_tau,3,
            parnames=['tau','center','width'], 
            parlimited=[(True,False), (False,False), (True,False)], 
            parlimits=[(0,0), (0,0), (0,0)],
            shortvarnames=(r'\tau',"v","\\sigma"), # specify the parameter names (TeX is OK)
            fitunits='Hz')

        self.totaltaufitter = model.SpectralModel(self.hyperfine_tau_total,3,
            parnames=['tau','center','width'], 
            parlimited=[(True,False), (False,False), (True,False)], 
            parlimits=[(0,0), (0,0), (0,0)],
            shortvarnames=(r'\tau',"v","\\sigma"), # specify the parameter names (TeX is OK)
            fitunits='Hz')