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')
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'
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'
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
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' )
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' )
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')
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')