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
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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