def fit_node(self,index): qnode=self.qlist[index] print qnode.q th=qnode.th_condensed['a3'] counts=qnode.th_condensed['counts'] counts_err=qnode.th_condensed['counts_err'] print qnode.th_condensed['counts'].std() print qnode.th_condensed['counts'].mean() maxval=qnode.th_condensed['counts'].max() minval=qnode.th_condensed['counts'].min() diff=qnode.th_condensed['counts'].max()-qnode.th_condensed['counts'].min()\ -qnode.th_condensed['counts'].mean() sig=qnode.th_condensed['counts'].std() if diff-2*sig>0: #the difference between the high and low point and #the mean is greater than 3 sigma so we have a signal p0=findpeak(th,counts,1) print 'p0',p0 #Area center width Bak center=p0[0] width=p0[1] sigma=width/2/N.sqrt(2*N.log(2)) Imax=maxval-minval area=Imax*(N.sqrt(2*pi)*sigma) print 'Imax',Imax pin=[area,center,width,0] if 1: p = NLP(chisq, pin, maxIter = 1e3, maxFunEvals = 1e5) #p.lb=lowerm #p.ub=upperm p.args.f=(th,counts,counts_err) p.plot = 0 p.iprint = 1 p.contol = 1e-5#3 # required constraints tolerance, default for NLP is 1e-6 # for ALGENCAN solver gradtol is the only one stop criterium connected to openopt # (except maxfun, maxiter) # Note that in ALGENCAN gradtol means norm of projected gradient of the Augmented Lagrangian # so it should be something like 1e-3...1e-5 p.gradtol = 1e-5#5 # gradient stop criterium (default for NLP is 1e-6) #print 'maxiter', p.maxiter #print 'maxfun', p.maxfun p.maxIter=50 # p.maxfun=100 #p.df_iter = 50 p.maxTime = 4000 #r=p.solve('scipy_cobyla') #r=p.solve('scipy_lbfgsb') #r = p.solve('algencan') print 'ralg' r = p.solve('ralg') print 'done' pfit=r.xf print 'pfit openopt',pfit print 'r dict', r.__dict__ if 0: print 'curvefit' print sys.executable pfit,popt=curve_fit(gauss2, th, counts, p0=pfit, sigma=counts_err) print 'p,popt', pfit,popt perror=N.sqrt(N.diag(popt)) print 'perror',perror chisqr=chisq(pfit,th,counts,counts_err) dof=len(th)-len(pfit) print 'chisq',chisqr if 0: oparam=scipy.odr.Model(gauss) mydatao=scipy.odr.RealData(th,counts,sx=None,sy=counts_err) myodr = scipy.odr.ODR(mydatao, oparam, beta0=pfit) myoutput=myodr.run() myoutput.pprint() pfit=myoutput.beta if 1: print 'mpfit' p0=pfit parbase={'value':0., 'fixed':0, 'limited':[0,0], 'limits':[0.,0.]} parinfo=[] for i in range(len(p0)): parinfo.append(copy.deepcopy(parbase)) for i in range(len(p0)): parinfo[i]['value']=p0[i] fa = {'x':th, 'y':counts, 'err':counts_err} #parinfo[1]['fixed']=1 #parinfo[2]['fixed']=1 m = mpfit(myfunct_res, p0, parinfo=parinfo,functkw=fa) if (m.status <= 0): print 'error message = ', m.errmsg params=m.params pfit=params perror=m.perror #chisqr=(myfunct_res(m.params, x=th, y=counts, err=counts_err)[1]**2).sum() chisqr=chisq(pfit,th,counts,counts_err) dof=m.dof #Icalc=gauss(pfit,th) #print 'mpfit chisqr', chisqr if 0: width_x=N.linspace(p0[0]-p0[1],p0[0]+p0[1],100) width_y=N.ones(width_x.shape)*(maxval-minval)/2 pos_y=N.linspace(minval,maxval,100) pos_x=N.ones(pos_y.shape)*p0[0] if 1: pylab.errorbar(th,counts,counts_err,marker='s',linestyle='None',mfc='black',mec='black',ecolor='black') pylab.plot(width_x,width_y) pylab.plot(pos_x,pos_y) pylab.plot(th,Icalc) pylab.show() else: #fix center #fix width print 'no peak' #Area center width Bak area=0 center=th[len(th)/2] width=(th.max()-th.min())/5.0 #rather arbitrary, but we don't know if it's the first.... Bak=qnode.th_condensed['counts'].mean() p0=N.array([area,center,width,Bak],dtype='float64') #initial conditions parbase={'value':0., 'fixed':0, 'limited':[0,0], 'limits':[0.,0.]} parinfo=[] for i in range(len(p0)): parinfo.append(copy.deepcopy(parbase)) for i in range(len(p0)): parinfo[i]['value']=p0[i] fa = {'x':th, 'y':counts, 'err':counts_err} parinfo[1]['fixed']=1 parinfo[2]['fixed']=1 m = mpfit(myfunct_res, p0, parinfo=parinfo,functkw=fa) if (m.status <= 0): print 'error message = ', m.errmsg params=m.params pfit=params perror=m.perror #chisqr=(myfunct_res(m.params, x=th, y=counts, err=counts_err)[1]**2).sum() chisqr=chisq(pfit,th,counts,counts_err) dof=m.dof Icalc=gauss(pfit,th) #print 'perror',perror if 0: pylab.errorbar(th,counts,counts_err,marker='s',linestyle='None',mfc='black',mec='black',ecolor='black') pylab.plot(th,Icalc) pylab.show() print 'final answer' print 'perror', 'perror' #If the fit is unweighted (i.e. no errors were given, or the weights # were uniformly set to unity), then .perror will probably not represent #the true parameter uncertainties. # *If* you can assume that the true reduced chi-squared value is unity -- # meaning that the fit is implicitly assumed to be of good quality -- # then the estimated parameter uncertainties can be computed by scaling # .perror by the measured chi-squared value. # dof = len(x) - len(mpfit.params) # deg of freedom # # scaled uncertainties # pcerror = mpfit.perror * sqrt(mpfit.fnorm / dof) print 'params', pfit print 'chisqr', chisqr #note that chisqr already is scaled by dof pcerror=perror*N.sqrt(m.fnorm / m.dof)#chisqr print 'pcerror', pcerror self.qlist[index].th_integrated_intensity=N.abs(pfit[0]) self.qlist[index].th_integrated_intensity_err=N.abs(pcerror[0]) Icalc=gauss(pfit,th) print 'perror',perror if 0: pylab.figure() pylab.errorbar(th,counts,counts_err,marker='s',linestyle='None',mfc='black',mec='black',ecolor='black') pylab.plot(th,Icalc) qstr=str(qnode.q['h_center'])+','+str(qnode.q['k_center'])+','+str(qnode.q['l_center']) pylab.title(qstr) #pylab.show() return
def fitpeak(x,y,yerr): maxval=x.max() minval=x.min() diff=y.max()-y.min()-y.mean() sig=y.std() print 'diff',diff,'std',sig if diff-1*sig>0: #the difference between the high and low point and #the mean is greater than 3 sigma so we have a signal p0=findpeak(x,y,2) print 'p0',p0 #Area center width Bak area2 center2 width2 center1=p0[0] width1=p0[1] center2=p0[2] width2=p0[3] sigma=width/2/N.sqrt(2*N.log(2)) ymax=maxval-minval area=ymax*(N.sqrt(2*pi)*sigma) print 'ymax',ymax pin=[area,center1,width1,0,area,center2,width2] if 1: p = NLP(chisq, pin, maxIter = 1e3, maxFunEvals = 1e5) #p.lb=lowerm #p.ub=upperm p.args.f=(x,y,yerr) p.plot = 0 p.iprint = 1 p.contol = 1e-5#3 # required constraints tolerance, default for NLP is 1e-6 # for ALGENCAN solver gradtol is the only one stop criterium connected to openopt # (except maxfun, maxiter) # Note that in ALGENCAN gradtol means norm of projected gradient of the Augmented Lagrangian # so it should be something like 1e-3...1e-5 p.gradtol = 1e-5#5 # gradient stop criterium (default for NLP is 1e-6) #print 'maxiter', p.maxiter #print 'maxfun', p.maxfun p.maxIter=50 # p.maxfun=100 #p.df_iter = 50 p.maxTime = 4000 #r=p.solve('scipy_cobyla') #r=p.solve('scipy_lbfgsb') #r = p.solve('algencan') print 'ralg' r = p.solve('ralg') print 'done' pfit=r.xf print 'pfit openopt',pfit print 'r dict', r.__dict__ if 1: print 'mpfit' p0=pfit parbase={'value':0., 'fixed':0, 'limited':[0,0], 'limits':[0.,0.]} parinfo=[] for i in range(len(p0)): parinfo.append(copy.deepcopy(parbase)) for i in range(len(p0)): parinfo[i]['value']=p0[i] fa = {'x':x, 'y':y, 'err':yerr} #parinfo[1]['fixed']=1 #parinfo[2]['fixed']=1 m = mpfit(myfunct_res, p0, parinfo=parinfo,functkw=fa) if (m.status <= 0): print 'error message = ', m.errmsg params=m.params pfit=params perror=m.perror #chisqr=(myfunct_res(m.params, x=th, y=counts, err=counts_err)[1]**2).sum() chisqr=chisq(pfit,x,y,yerr) dof=m.dof #Icalc=gauss(pfit,th) #print 'mpfit chisqr', chisqr ycalc=gauss(pfit,x) if 1: width_x=N.linspace(p0[0]-p0[1],p0[0]+p0[1],100) width_y=N.ones(width_x.shape)*(maxval-minval)/2 pos_y=N.linspace(minval,maxval,100) pos_x=N.ones(pos_y.shape)*p0[0] if 0: pylab.errorbar(th,counts,counts_err,marker='s',linestyle='None',mfc='black',mec='black',ecolor='black') pylab.plot(width_x,width_y) pylab.plot(pos_x,pos_y) pylab.plot(x,ycalc) pylab.show() else: #fix center #fix width print 'no peak' #Area center width Bak area=0 center=x[len(x)/2] width=(x.max()-x.min())/5.0 #rather arbitrary, but we don't know if it's the first.... #better to use resolution Bak=y.mean() p0=N.array([area,center,width,Bak],dtype='float64') #initial conditions parbase={'value':0., 'fixed':0, 'limited':[0,0], 'limits':[0.,0.]} parinfo=[] for i in range(len(p0)): parinfo.append(copy.deepcopy(parbase)) for i in range(len(p0)): parinfo[i]['value']=p0[i] fa = {'x':x, 'y':y, 'err':yerr} parinfo[1]['fixed']=1 parinfo[2]['fixed']=1 m = mpfit(myfunct_res, p0, parinfo=parinfo,functkw=fa) if (m.status <= 0): print 'error message = ', m.errmsg params=m.params pfit=params perror=m.perror #chisqr=(myfunct_res(m.params, x=th, y=counts, err=counts_err)[1]**2).sum() chisqr=chisq(pfit,x,y,yerr) dof=m.dof ycalc=gauss(pfit,x) #print 'perror',perror if 0: pylab.errorbar(x,y,yerr,marker='s',linestyle='None',mfc='black',mec='black',ecolor='black') pylab.plot(x,ycalc) pylab.show() print 'final answer' print 'perror', 'perror' #If the fit is unweighted (i.e. no errors were given, or the weights # were uniformly set to unity), then .perror will probably not represent #the true parameter uncertainties. # *If* you can assume that the true reduced chi-squared value is unity -- # meaning that the fit is implicitly assumed to be of good quality -- # then the estimated parameter uncertainties can be computed by scaling # .perror by the measured chi-squared value. # dof = len(x) - len(mpfit.params) # deg of freedom # # scaled uncertainties # pcerror = mpfit.perror * sqrt(mpfit.fnorm / dof) print 'params', pfit print 'chisqr', chisqr #note that chisqr already is scaled by dof pcerror=perror*N.sqrt(m.fnorm / m.dof)#chisqr print 'pcerror', pcerror integrated_intensity=N.abs(pfit[0]) integrated_intensity_err=N.abs(pcerror[0]) ycalc=gauss(pfit,x) print 'perror',perror if 1: pylab.figure() pylab.errorbar(x,y,yerr,marker='s',linestyle='None',mfc='black',mec='black',ecolor='black') pylab.plot(x,ycalc) #qstr=str(qnode.q['h_center'])+','+str(qnode.q['k_center'])+','+str(qnode.q['l_center']) #pylab.title(qstr) pylab.show() return pfit,perror,pcerror,chisq
def fitpeak(x, y, yerr): maxval = x.max() minval = x.min() diff = y.max() - y.min() - y.mean() sig = y.std() print 'diff', diff, 'std', sig if diff - 1 * sig > 0: #the difference between the high and low point and #the mean is greater than 3 sigma so we have a signal p0 = findpeak(x, y, 2) print 'p0', p0 #Area center width Bak area2 center2 width2 center1 = p0[0] width1 = p0[1] center2 = p0[2] width2 = p0[3] sigma = width / 2 / N.sqrt(2 * N.log(2)) ymax = maxval - minval area = ymax * (N.sqrt(2 * pi) * sigma) print 'ymax', ymax pin = [area, center1, width1, 0, area, center2, width2] if 1: p = NLP(chisq, pin, maxIter=1e3, maxFunEvals=1e5) #p.lb=lowerm #p.ub=upperm p.args.f = (x, y, yerr) p.plot = 0 p.iprint = 1 p.contol = 1e-5 #3 # required constraints tolerance, default for NLP is 1e-6 # for ALGENCAN solver gradtol is the only one stop criterium connected to openopt # (except maxfun, maxiter) # Note that in ALGENCAN gradtol means norm of projected gradient of the Augmented Lagrangian # so it should be something like 1e-3...1e-5 p.gradtol = 1e-5 #5 # gradient stop criterium (default for NLP is 1e-6) #print 'maxiter', p.maxiter #print 'maxfun', p.maxfun p.maxIter = 50 # p.maxfun=100 #p.df_iter = 50 p.maxTime = 4000 #r=p.solve('scipy_cobyla') #r=p.solve('scipy_lbfgsb') #r = p.solve('algencan') print 'ralg' r = p.solve('ralg') print 'done' pfit = r.xf print 'pfit openopt', pfit print 'r dict', r.__dict__ if 1: print 'mpfit' p0 = pfit parbase = { 'value': 0., 'fixed': 0, 'limited': [0, 0], 'limits': [0., 0.] } parinfo = [] for i in range(len(p0)): parinfo.append(copy.deepcopy(parbase)) for i in range(len(p0)): parinfo[i]['value'] = p0[i] fa = {'x': x, 'y': y, 'err': yerr} #parinfo[1]['fixed']=1 #parinfo[2]['fixed']=1 m = mpfit(myfunct_res, p0, parinfo=parinfo, functkw=fa) if (m.status <= 0): print 'error message = ', m.errmsg params = m.params pfit = params perror = m.perror #chisqr=(myfunct_res(m.params, x=th, y=counts, err=counts_err)[1]**2).sum() chisqr = chisq(pfit, x, y, yerr) dof = m.dof #Icalc=gauss(pfit,th) #print 'mpfit chisqr', chisqr ycalc = gauss(pfit, x) if 1: width_x = N.linspace(p0[0] - p0[1], p0[0] + p0[1], 100) width_y = N.ones(width_x.shape) * (maxval - minval) / 2 pos_y = N.linspace(minval, maxval, 100) pos_x = N.ones(pos_y.shape) * p0[0] if 0: pylab.errorbar(th, counts, counts_err, marker='s', linestyle='None', mfc='black', mec='black', ecolor='black') pylab.plot(width_x, width_y) pylab.plot(pos_x, pos_y) pylab.plot(x, ycalc) pylab.show() else: #fix center #fix width print 'no peak' #Area center width Bak area = 0 center = x[len(x) / 2] width = ( x.max() - x.min() ) / 5.0 #rather arbitrary, but we don't know if it's the first.... #better to use resolution Bak = y.mean() p0 = N.array([area, center, width, Bak], dtype='float64') #initial conditions parbase = { 'value': 0., 'fixed': 0, 'limited': [0, 0], 'limits': [0., 0.] } parinfo = [] for i in range(len(p0)): parinfo.append(copy.deepcopy(parbase)) for i in range(len(p0)): parinfo[i]['value'] = p0[i] fa = {'x': x, 'y': y, 'err': yerr} parinfo[1]['fixed'] = 1 parinfo[2]['fixed'] = 1 m = mpfit(myfunct_res, p0, parinfo=parinfo, functkw=fa) if (m.status <= 0): print 'error message = ', m.errmsg params = m.params pfit = params perror = m.perror #chisqr=(myfunct_res(m.params, x=th, y=counts, err=counts_err)[1]**2).sum() chisqr = chisq(pfit, x, y, yerr) dof = m.dof ycalc = gauss(pfit, x) #print 'perror',perror if 0: pylab.errorbar(x, y, yerr, marker='s', linestyle='None', mfc='black', mec='black', ecolor='black') pylab.plot(x, ycalc) pylab.show() print 'final answer' print 'perror', 'perror' #If the fit is unweighted (i.e. no errors were given, or the weights # were uniformly set to unity), then .perror will probably not represent #the true parameter uncertainties. # *If* you can assume that the true reduced chi-squared value is unity -- # meaning that the fit is implicitly assumed to be of good quality -- # then the estimated parameter uncertainties can be computed by scaling # .perror by the measured chi-squared value. # dof = len(x) - len(mpfit.params) # deg of freedom # # scaled uncertainties # pcerror = mpfit.perror * sqrt(mpfit.fnorm / dof) print 'params', pfit print 'chisqr', chisqr #note that chisqr already is scaled by dof pcerror = perror * N.sqrt(m.fnorm / m.dof) #chisqr print 'pcerror', pcerror integrated_intensity = N.abs(pfit[0]) integrated_intensity_err = N.abs(pcerror[0]) ycalc = gauss(pfit, x) print 'perror', perror if 1: pylab.figure() pylab.errorbar(x, y, yerr, marker='s', linestyle='None', mfc='black', mec='black', ecolor='black') pylab.plot(x, ycalc) #qstr=str(qnode.q['h_center'])+','+str(qnode.q['k_center'])+','+str(qnode.q['l_center']) #pylab.title(qstr) pylab.show() return pfit, perror, pcerror, chisq