%-------------------------------------------------------------------------- % function fitpara = gaussfit(x,d) % % d distribution to be tested % x variable of distribution d % % returns: % fit to a gaussian distribution % para [s,c,z] % s sigma, % c amplitude, % z shift along x % % 2-May-2003 S. Schreiber % 11-Jun-2004 S. Schreiber add more sufficticated rms estimate if rms over % whole profile gets negative %-------------------------------------------------------------------------- function fitpara = gaussfit(x,d) if isempty(x) | isempty(d) fitpara = [0,0,0]; return end if size(x) ~= size(d) | size(x) < 4 fitpara = [0,0,0]; return end % estimate of parameters: bw = abs(x(2)-x(1)); dim=size(d); %av = sum(d.*x)/sum(d); %s = sum(d.*(x-av).^2)/sum(d); %if s>0 | s>dim(2)/10; % s=sqrt(s); %else fraction=5; mmax=find(d==max(d)); lm=max(1,fix(mmax-dim(2)/fraction)); rm=min(dim(2),fix(mmax+dim(2)/fraction)); av=sum(d(lm:rm).*x(lm:rm))/sum(d(lm:rm)); s=sum(d(lm:rm).*(x(lm:rm)-av).^2)/sum(d(lm:rm)); if s>0 s=sqrt(s); else s=sqrt(dim(2)/10.); end %end c = sum(d)/bw; if c<0 dim=size(d); mmax=find(d==max(d)); lm=max(1,fix(mmax-dim(2)/5)); rm=min(dim(2),fix(mmax+dim(2)/5.)); c = sum(d(lm:rm)); end z = x(find(d==max(d))); % do the fit by minimizing chi square opts = optimset('TolX',1e-3,'MaxFunEvals',10000,'MaxIter',1000,'Display','off'); [fitpara,fval,flag,err] = fminsearch(@gausschisq,[s,c,z],opts,x,d); if flag == 1 disp(' Gauss fit converged.') disp([' fitpara (inital)= ',num2str([s,c,z])]) disp([' fitpara (final) = ',num2str(fitpara)]) disp([' fval = ',num2str(fval),' flag = ',num2str(flag)]) disp(err) else disp(' Gauss fit did not converge.') disp([' fitpara (inital)= ',num2str([s,c,z])]) disp([' fitpara (final) = ',num2str(fitpara)]) disp([' fval = ',num2str(fval),' flag = ',num2str(flag)]) disp(err) fitpara = [0,0,0]; end return