Changeset 2688


Ignore:
Timestamp:
Feb 3, 2017 2:23:47 PM (5 years ago)
Author:
vondreele
Message:

sequential PDF peak fitting now implemented

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIgrid.py

    r2687 r2688  
    29482948                    sampleParmDict[item].append(data[name]['parmDict'].get(item,0))
    29492949            else:
     2950                if 'PDF' in name:
     2951                    name = 'PWDR' + name[4:]
    29502952                Id = GetPatternTreeItemId(G2frame,G2frame.root,name)
    29512953                sampleData = G2frame.PatternTree.GetItemPyData(GetPatternTreeItemId(G2frame,Id,'Sample Parameters'))
  • trunk/GSASIIimgGUI.py

    r2687 r2688  
    207207                        vals.append(parmDict['dist'])
    208208                        varyList.append('dist')
    209                         sigList.append(0.0)
     209                        sigList.append(None)
    210210                    vals.append(Data['setdist'])
    211211                    varyList.append('setdist')
    212                     sigList.append(0.01)
     212                    sigList.append(None)
    213213                    SeqResult[name] = {'variables':vals,'varyList':varyList,'sig':sigList,'Rvals':[],
    214214                        'covMatrix':np.eye(len(varyList)),'title':name,'parmDict':parmDict}
     
    19801980                    variables.append(item['Ivar'])
    19811981                    varyList.append('%d;Ivar'%(j))
    1982                     sig.append(0.)
     1982                    sig.append(None)
    19831983                SeqResult[name] = {'variables':variables,'varyList':varyList,'sig':sig,'Rvals':[],
    19841984                    'covMatrix':np.eye(len(variables)),'title':name,'parmDict':parmDict}
  • trunk/GSASIIobj.py

    r2675 r2688  
    13561356        'M([XYZ])sin$' :  'Sin mag. moment wave for \\1',
    13571357        'M([XYZ])cos$' :  'Cos mag. moment wave for \\1',
     1358        # PDF peak parms (l:<var>;l = peak no.)
     1359        'PDFpos'  : 'PDF peak position',
     1360        'PDFmag'  : 'PDF peak magnitude',
     1361        'PDFsig'  : 'PDF peak std. dev.',
    13581362        # SASD vars (l:<var>;l = component)
    13591363        'Aspect ratio' : 'Particle aspect ratio',
  • trunk/GSASIIpwd.py

    r2681 r2688  
    383383            varyList.append('slope')
    384384        for i,peak in enumerate(peaks['Peaks']):
    385             parmDict[str(i)+':pos'] = peak[0]
    386             parmDict[str(i)+':mag'] = peak[1]
    387             parmDict[str(i)+':sig'] = peak[2]
     385            parmDict['PDFpos;'+str(i)] = peak[0]
     386            parmDict['PDFmag;'+str(i)] = peak[1]
     387            parmDict['PDFsig;'+str(i)] = peak[2]
    388388            if 'P' in peak[3]:
    389                 varyList.append(str(i)+':pos')
     389                varyList.append('PDFpos;'+str(i))
    390390            if 'M' in peak[3]:
    391                 varyList.append(str(i)+':mag')
     391                varyList.append('PDFmag;'+str(i))
    392392            if 'S' in peak[3]:
    393                 varyList.append(str(i)+':sig')
     393                varyList.append('PDFsig;'+str(i))
    394394        return parmDict,varyList
    395395       
     
    398398            peaks['Background'][1][1] = parmDict['slope']
    399399        for i,peak in enumerate(peaks['Peaks']):
    400             if str(i)+':pos' in varyList:
    401                 peak[0] = parmDict[str(i)+':pos']
    402             if str(i)+':mag' in varyList:
    403                 peak[1] = parmDict[str(i)+':mag']
    404             if str(i)+':sig' in varyList:
    405                 peak[2] = parmDict[str(i)+':sig']
     400            if 'PDFpos;'+str(i) in varyList:
     401                peak[0] = parmDict['PDFpos;'+str(i)]
     402            if 'PDFmag;'+str(i) in varyList:
     403                peak[1] = parmDict['PDFmag;'+str(i)]
     404            if 'PDFsig;'+str(i) in varyList:
     405                peak[2] = parmDict['PDFsig;'+str(i)]
    406406       
    407407   
     
    411411        while True:
    412412            try:
    413                 pos = parmdict[str(ipeak)+':pos']
    414                 mag = parmdict[str(ipeak)+':mag']
    415                 wid = parmdict[str(ipeak)+':sig']
     413                pos = parmdict['PDFpos;'+str(ipeak)]
     414                mag = parmdict['PDFmag;'+str(ipeak)]
     415                wid = parmdict['PDFsig;'+str(ipeak)]
    416416                wid2 = 2.*wid**2
    417417                Z += mag*rs2pi*np.exp(-(Xdata-pos)**2/wid2)/wid
     
    424424        M = CalcPDFpeaks(parmdict,xdata)-ydata
    425425        return M
    426                                
    427426           
    428     print 'Do PDF peak fitting'
    429427    newpeaks = copy.copy(peaks)
    430428    iBeg = np.searchsorted(data[1][0],newpeaks['Limits'][0])
     
    435433    if not len(varyList):
    436434        print ' Nothing varied'
    437         return newpeaks
    438    
    439     begin = time.time()
     435        return newpeaks,None,None,None,None,None
     436   
     437    Rvals = {}
    440438    values =  np.array(Dict2Values(parmDict, varyList))
    441439    result = so.leastsq(errPDFProfile,values,full_output=True,ftol=0.0001,
    442440           args=(X,Y,parmDict,varyList))
    443     ncyc = int(result[2]['nfev']/2)
    444     runtime = time.time()-begin   
    445     print 'PDF fitpeak time = %8.3fs, %8.3fs/cycle'%(runtime,runtime/ncyc)
    446441#    chisq = np.sum(result[2]['fvec']**2)
    447442    Values2Dict(parmDict, varyList, result[0])
    448443    SetParms(peaks,parmDict,varyList)
    449    
     444    chisq = np.sum(result[2]['fvec']**2)/(len(X)-len(values))   #reduced chi^2 = M/(Nobs-Nvar)
     445    Rvals['Rwp'] = np.sqrt(chisq/np.sum(Y**2))*100.      #to %
     446    Rvals['GOF'] = chisq/(len(X)-len(varyList))       #reduced chi^2
     447    sigList = list(np.sqrt(chisq*np.diag(result[1])))   
    450448    Z = CalcPDFpeaks(parmDict,X)
    451449    newpeaks['calc'] = [X,Z]
    452     return newpeaks   
     450    return newpeaks,result[0],varyList,sigList,parmDict,Rvals   
    453451   
    454452def MakeRDF(RDFcontrols,background,inst,pwddata):
  • trunk/GSASIIpwdGUI.py

    r2685 r2688  
    429429        x = x0[iBeg:iFin]
    430430        y0 = profile[1][iBeg:iFin]
    431         y1 = copy.copy(y0)
    432         ysig = 0.5*np.std(y1)
     431        ysig = 0.5*np.std(y0)
    433432        offset = [-1,1]
    434433        ymask = ma.array(y0,mask=(y0<ysig))
     
    53835382            G2frame.ErrorDialog('No peaks!','Nothing to fit!')
    53845383            return
    5385         newpeaks = G2pwd.PDFPeakFit(peaks,data['G(R)'])
     5384        newpeaks = G2pwd.PDFPeakFit(peaks,data['G(R)'])[0]
    53865385        print 'PDF peak fit finished'
    53875386        G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'PDF Peaks'),newpeaks)
     
    53905389       
    53915390    def OnFitAllPDFpeaks(event):
    5392         print 'fit all pdf peaks'
     5391        Names = G2gd.GetPatternTreeDataNames(G2frame,['PDF ',])
     5392        dlg = G2G.G2MultiChoiceDialog(G2frame,'PDF peak fitting','Select PDFs to fit:',Names)
     5393        try:
     5394            if dlg.ShowModal() == wx.ID_OK:
     5395                SeqResult = {}
     5396                items = dlg.GetSelections()
     5397                G2frame.EnablePlot = False
     5398                names = []
     5399                for item in items:
     5400                    name = Names[item]
     5401                    names.append(name)
     5402                    print 'PDF peak fitting',name
     5403                    pId = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,name)
     5404                    data = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,pId, 'PDF Controls'))
     5405                    peaks = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,pId,'PDF Peaks'))
     5406                    newpeaks,vals,varyList,sigList,parmDict,Rvals = G2pwd.PDFPeakFit(peaks,data['G(R)'])
     5407                    SeqResult[name] = {'variables':vals,'varyList':varyList,'sig':sigList,'Rvals':Rvals,
     5408                        'covMatrix':np.eye(len(varyList)),'title':name,'parmDict':parmDict}
     5409                    G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,pId, 'PDF Peaks'),newpeaks)
     5410                SeqResult['histNames'] = names
     5411                Id =  G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Sequential PDF peak fit results')
     5412                if Id:
     5413                    G2frame.PatternTree.SetItemPyData(Id,SeqResult)
     5414                else:
     5415                    Id = G2frame.PatternTree.AppendItem(parent=G2frame.root,text='Sequential PDF peak fit results')
     5416                    G2frame.PatternTree.SetItemPyData(Id,SeqResult)
     5417        finally:
     5418            dlg.Destroy()
     5419        G2plt.PlotISFG(G2frame,data,peaks=newpeaks,newPlot=False)
     5420        wx.CallAfter(UpdatePDFPeaks,G2frame,newpeaks,data)
     5421        print 'All PDFs peak fitted - results in Sequential PDF peak fit results'
    53935422       
    53945423    def OnClearPDFpeaks(event):
Note: See TracChangeset for help on using the changeset viewer.