;+ ; NAME : GAUSSFIT_LSQ ; ; PURPOSE : Get the set of paramters of single gaussian fit ; by applying iterative least square method ; ; CALLING SEQUENCE : ; ; Result = gaussfit_lsq(data, par=par) ; ; INPUTS : ; DATA Spectral data ; 1 D : one profile with N_SPEC elements ; 2 D : a set of profiles(spectrum image) ; with N_SPEC x N_SPAT elements ; OUTPUT : ; Result ; 1D or 2D acoording to input DATA ; Result(0,*) : backbround ; Result(1,*) : Peak value ; Result(2,*) : center position ; Result(3,*) : Gaussian width(standard devaition) ; - function gaussfit_lsq, data, par=par wdim = n_elements(data(*,0)) ydim = n_elements(data(0,*)) if keyword_set(par) then begin bg = par(0, *) peak=par(1,*) cen=par(2,*) sigma=par(3,*) endif else begin ; Average Profile prof = total(data, 2)/ydim ; Define region x=indgen(wdim) range=3. peak = max(prof, min=bg) s=where(prof ge (peak-bg)*0.5+bg, count) cen = total(x(s))/count fwhm = x(s(count-1))+1-x(s(0)) sigma = fwhm/sqrt(2.*alog(2.)) endelse par_multi=fltarr(6, ydim) x=indgen(wdim) par_multi(0,*) = bg par_multi(3,*) = alog10(peak) par_multi(4,*) = cen par_multi(5,*) = sigma par_exp = par_multi([0,3,4,5],*) par_weight = fltarr(4, ydim) par_weight(0,*) = 1./(bg>4.) par_weight(1,*) = 1. par_weight(2,*) = 1./sigma^2 par_weight(3,*) = 1./(0.5*sigma)^2 data1=multi_gauss_fit(x#replicate(1.,ydim), data, $ 1./(data>4.), par_multi, /value) tmp = multi_gauss_fit(x#replicate(1.,ydim), data, $ 1./(data1>1.), par_multi, $ free_par=[0,3,4,5], itmax=8 ) ;, $ ; free_weight=par_weight*0.1, $ ; free_exp=par_exp) value=fltarr(4, ydim) value(0,*)=par_multi(0,*) value(1,*)=10^par_multi(3,*) value(2,*)=par_multi(4,*) value(3,*)=abs(par_multi(5,*)) return, value end