Changeset 2355


Ignore:
Timestamp:
Jun 30, 2016 8:36:29 AM (5 years ago)
Author:
vondreele
Message:

fix plot bug
add RDF calc - in progress
add background correction to pdf

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIplot.py

    r2336 r2355  
    43534353                Plot.plot([arcxI[ind],arcxO[ind]],[arcyI[ind],arcyO[ind]],color='k',dashes=(5,5))
    43544354                   
    4355         if G2frame.PickId and G2frame.PatternTree.GetItemText(G2frame.PickId) in 'Image Controls':
     4355        if G2frame.PickId and G2frame.PatternTree.GetItemText(G2frame.PickId) in ['Image Controls',]:
    43564356            for xring,yring in Data['ring']:
    43574357                Plot.plot(xring,yring,'r+',picker=3)
     
    43674367                    Plot.add_artist(Ellipse([cent[0],cent[1]],2*width,2*height,phi,ec=col,fc='none'))
    43684368                    Plot.text(cent[0],cent[1],'+',color=col,ha='center',va='center')
    4369         if G2frame.PatternTree.GetItemText(G2frame.PickId) in 'Stress/Strain':
     4369        if G2frame.PickId and G2frame.PatternTree.GetItemText(G2frame.PickId) in ['Stress/Strain',]:
    43704370            for N,ring in enumerate(StrSta['d-zero']):
    43714371                xring,yring = ring['ImxyObs']
  • trunk/GSASIIpwd.py

    r2334 r2355  
    300300    XY[0] = npT2q(XY[0],wave)   
    301301#    Qdata = np.nan_to_num(si.griddata(XY[0],XY[1],Qpoints,method='linear')) #only OK for scipy 0.9!
    302     T = si.interp1d(XY[0],XY[1],bounds_error=False,fill_value=0.0)      #OK for scipy 0.8
     302    T = si.interp1d(XY[0],XY[1],bounds_error=False,fill_value=XY[1][0])      #OK for scipy 0.8
    303303    Qdata = T(Qpoints)
     304    Qdata -= np.min(Qdata)*data['BackRatio']
    304305   
    305306    qLimits = data['QScaleLim']
     
    313314    xydata['IofQ'][1] = newdata
    314315   
    315 
    316316    xydata['SofQ'] = copy.deepcopy(xydata['IofQ'])
    317317    FFSq,SqFF,CF = GetAsfMean(ElList,(xydata['SofQ'][1][0]/(4.0*np.pi))**2)  #these are <f^2>,<f>^2,Cf
     
    327327    scale = len(xydata['SofQ'][1][1][minQ:maxQ])/np.sum(xydata['SofQ'][1][1][minQ:maxQ])
    328328    xydata['SofQ'][1][1] *= scale
    329    
     329#    if data.get('sinDamp',False):   #not the right thing but leave as place holder
     330#        sinDamp = np.sin(np.pi*xydata['SofQ'][1][0]/qLimits[1])
     331#        xydata['SofQ'][1][1] *= sinDamp
    330332    xydata['FofQ'] = copy.deepcopy(xydata['SofQ'])
    331333    xydata['FofQ'][1][1] = xydata['FofQ'][1][0]*(xydata['SofQ'][1][1]-1.0)
    332334    if data['Lorch']:
    333         xydata['FofQ'][1][1] *= LorchWeight(Q)
    334    
     335        xydata['FofQ'][1][1] *= LorchWeight(Q)   
    335336    xydata['GofR'] = copy.deepcopy(xydata['FofQ'])
    336337    nR = len(xydata['GofR'][1][1])
    337338    xydata['GofR'][1][1] = -dq*np.imag(ft.fft(xydata['FofQ'][1][1],4*nR)[:nR])
    338339    xydata['GofR'][1][0] = 0.5*np.pi*np.linspace(0,nR,nR)/qLimits[1]
    339    
     340    return auxPlot
     341   
     342def MakeRDF(RDFcontrols,background,inst,pwddata,xydata):
     343#    GSASIIpath.IPyBreak()
     344    auxPlot = []
     345    if 'C' in inst['Type'][0]:
     346        Tth = pwddata[0]
     347        hc = 12.397639
     348        wave = G2mth.getWave(inst)
     349        keV = hc/wave
     350        minQ = npT2q(Tth[0],wave)
     351        maxQ = npT2q(Tth[-1],wave)   
    340352       
     353
     354    elif 'T' in inst['Type'][0]:
     355        TOF = pwddata[0]
     356        difC = inst['difC'][1]
     357        minQ = 2.*np.pi*difC/TOF[-1]
     358        maxQ = 2.*np.pi*difC/TOF[0]
     359       
     360    Qpoints = np.linspace(0.,maxQ,len(pwddata[0]),endpoint=True)
     361    dq = Qpoints[1]-Qpoints[0]
     362    T = si.interp1d(pwddata[0],pwddata[1],bounds_error=False,fill_value=0.0,kind=RDFcontrols['Smooth'])      #OK for scipy 0.8
     363    Qdata = T(Qpoints)
     364    auxPlot.append([Qpoints,Qdata,'interp1d:'+RDFcontrols['Smooth']])
    341365    return auxPlot
     366    print 'make RDF'
    342367
    343368################################################################################       
     
    14201445            ptstr += ptfmt % (back)
    14211446            if Background[0][1]:
    1422                 sigstr += ptfmt % (sigDict['Back;'+str(i)])
     1447                prm = 'Back;'+str(i)
     1448                if prm in sigDict:
     1449                    sigstr += ptfmt % (sigDict[prm])
     1450                else:
     1451                    sigstr += " "*12
    14231452            if len(ptstr) > 75:
    14241453                print ptstr
     
    14411470                    if name+str(term) in sigDict:
    14421471                        line += ptfmt%(sigDict[name+str(term)])
     1472                    else:
     1473                        line += " "*12
    14431474                print line
    14441475        if Background[1]['nPeaks']:
  • trunk/GSASIIpwdGUI.py

    r2336 r2355  
    5656cosd = lambda x: math.cos(x*math.pi/180.)
    5757asind = lambda x: 180.*math.asin(x)/math.pi
     58   
     59################################################################################
     60###### class definitions
     61################################################################################
     62
     63class RDFDialog(wx.Dialog):
     64    def __init__(self,parent):
     65        wx.Dialog.__init__(self,parent,-1,'Background radial distribution function',
     66            pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
     67        self.panel = wx.Panel(self)         #just a dummy - gets destroyed in Draw!
     68        self.result = {'UseObsCalc':False,'maxR':10.0,'Smooth':'linear'}
     69       
     70        self.Draw()
     71       
     72    def Draw(self):
     73       
     74        def OnUseOC(event):
     75            self.result['UseObsCalc'] = not self.result['UseObsCalc']
     76           
     77        def OnSmCombo(event):
     78            self.result['Smooth'] = smCombo.GetValue()
     79           
     80        def OnMaxR(event):
     81            try:
     82                val = float(maxR.GetValue())
     83                if val <= 0.:
     84                    raise ValueError
     85            except ValueError:
     86                val = self.result['maxR']
     87            self.result['maxR'] = val
     88            maxR.SetValue('%.1f'%(val))
     89       
     90        self.panel.Destroy()
     91        self.panel = wx.Panel(self)
     92        Ind = {}
     93        mainSizer = wx.BoxSizer(wx.VERTICAL)
     94        mainSizer.Add(wx.StaticText(self.panel,label='Background RDF controls:'),0,WACV)
     95        useOC = wx.CheckBox(self.panel,label=' Use obs && calc intensities?')
     96        useOC.SetValue(self.result['UseObsCalc'])
     97        useOC.Bind(wx.EVT_CHECKBOX,OnUseOC)
     98        mainSizer.Add(useOC,0,WACV)
     99        dataSizer = wx.BoxSizer(wx.HORIZONTAL)
     100        dataSizer.Add(wx.StaticText(self.panel,label=' Smoothing type: '),0,WACV)
     101        smChoice = ['linear','nearest','zero','slinear',]
     102        smCombo = wx.ComboBox(self.panel,value=self.result['Smooth'],choices=smChoice,
     103            style=wx.CB_READONLY|wx.CB_DROPDOWN)
     104        smCombo.Bind(wx.EVT_COMBOBOX, OnSmCombo)
     105        dataSizer.Add(smCombo,0,WACV)
     106        dataSizer.Add(wx.StaticText(self.panel,label=' Maximum radial dist.: '),0,WACV)
     107        maxR = wx.TextCtrl(self.panel,value='%.1f'%(self.result['maxR']),style=wx.TE_PROCESS_ENTER)
     108        maxR.Bind(wx.EVT_TEXT_ENTER,OnMaxR)       
     109        maxR.Bind(wx.EVT_KILL_FOCUS,OnMaxR)
     110        dataSizer.Add(maxR,0,WACV)
     111        mainSizer.Add(dataSizer,0,WACV)
     112
     113        OkBtn = wx.Button(self.panel,-1,"Ok")
     114        OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
     115        cancelBtn = wx.Button(self.panel,-1,"Cancel")
     116        cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
     117        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
     118        btnSizer.Add((20,20),1)
     119        btnSizer.Add(OkBtn)
     120        btnSizer.Add((20,20),1)
     121        btnSizer.Add(cancelBtn)
     122        btnSizer.Add((20,20),1)
     123       
     124        mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
     125        self.panel.SetSizer(mainSizer)
     126        self.panel.Fit()
     127        self.Fit()
     128       
     129    def GetSelection(self):
     130        return self.result
     131
     132    def OnOk(self,event):
     133        parent = self.GetParent()
     134        parent.Raise()
     135        self.EndModal(wx.ID_OK)
     136
     137    def OnCancel(self,event):
     138        parent = self.GetParent()
     139        parent.Raise()
     140        self.EndModal(wx.ID_CANCEL)
     141       
     142   
     143################################################################################
     144##### Setup routines
     145################################################################################
    58146   
    59147def IsHistogramInAnyPhase(G2frame,histoName):
     
    851939        try:
    852940            G2pwd.DoPeakFit('LSQ',[],background,limits,inst,inst2,
    853                             np.array((xdata,ydata,W,Z,Z,Z)),bakVary,False,controls)
     941                np.array((xdata,ydata,W,Z,Z,Z)),bakVary,False,controls)
    854942        finally:
    855943            wx.EndBusyCursor()
     
    882970            Peaks['peaks'].append([peak[0],0,peak[2],0,peak[4],0,peak[6],0])
    883971        G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Peak List'),Peaks)
     972       
     973    def OnMakeRDF(event):
     974        dlg = RDFDialog(G2frame)
     975        try:
     976            if dlg.ShowModal() == wx.ID_OK:
     977                RDFcontrols = dlg.GetSelection()
     978            else:
     979                return
     980        finally:
     981            dlg.Destroy()
     982        xydata = {}
     983        PatternId = G2frame.PatternId       
     984        background = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Background'))
     985        limits = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Limits'))[1]
     986        inst,inst2 = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Instrument Parameters'))
     987        pwddata = G2frame.PatternTree.GetItemPyData(PatternId)[1]
     988        auxPlot = G2pwd.MakeRDF(RDFcontrols,background,inst,pwddata,xydata)
     989#        GSASIIpath.IPyBreak()
     990        superMinusOne = unichr(0xaf)+unichr(0xb9)
     991        for plot in auxPlot:
     992            XY = np.array(plot[:2])
     993            G2plt.PlotXY(G2frame,[XY,],Title=plot[2],labelX=r'$Q,\AA$'+superMinusOne,labelY=r'$I(Q)$')     
     994        G2plt.PlotXY(G2frame,xydata,Title='D(r)') 
     995       
    884996       
    885997    def BackSizer():
     
    10761188    G2frame.Bind(wx.EVT_MENU,OnBackFlagCopy,id=G2gd.wxID_BACKFLAGCOPY)
    10771189    G2frame.Bind(wx.EVT_MENU,OnPeaksMove,id=G2gd.wxID_PEAKSMOVE)
     1190    G2frame.Bind(wx.EVT_MENU,OnMakeRDF,id=G2gd.wxID_MAKEBACKRDF)
    10781191    G2frame.Bind(wx.EVT_MENU,OnBkgFit,id=G2frame.dataFrame.wxID_BackPts['Fit'])
    10791192    G2frame.Bind(wx.EVT_MENU,OnBkgClear,id=G2frame.dataFrame.wxID_BackPts['Clear'])   
     
    44784591    azimuth = inst['Azimuth'][1]
    44794592    itemDict = {}
     4593    #patch
     4594    if 'BackRatio' not in data:
     4595        data['BackRatio'] = 0.
    44804596   
    44814597    def FillFileSizer(fileSizer,key):
     
    46354751        G2plt.PlotISFG(G2frame,newPlot=False)
    46364752       
     4753    def OnBackVal(event):
     4754        try:
     4755            value = float(backVal.GetValue())
     4756            value = min(max(0.,value),1.0)
     4757        except ValueError:
     4758            value = data['BackRatio']
     4759        data['BackRatio'] = value
     4760        backVal.SetValue('%.3f'%(value))
     4761        auxPlot = ComputePDF(data)
     4762        G2plt.PlotISFG(G2frame,newPlot=False)
     4763       
     4764    def OnBackSlider(event):
     4765        value = int(backSldr.GetValue())/100.
     4766        data['BackRatio'] = value
     4767        backVal.SetValue('%.3f'%(data['BackRatio']))
     4768        auxPlot = ComputePDF(data)
     4769        G2plt.PlotISFG(G2frame,newPlot=False)
     4770       
    46374771    def OnRulandWdt(event):
    46384772        try:
     
    46584792    def OnLorch(event):
    46594793        data['Lorch'] = lorch.GetValue()
     4794        auxPlot = ComputePDF(data)
     4795        G2plt.PlotISFG(G2frame,newPlot=False)       
     4796                       
     4797    def OnSinDamp(event):
     4798        data['sinDamp'] = sinDamp.GetValue()
    46604799        auxPlot = ComputePDF(data)
    46614800        G2plt.PlotISFG(G2frame,newPlot=False)       
     
    49445083    mainSizer.Add(sqBox,0)
    49455084       
     5085    bkBox = wx.BoxSizer(wx.HORIZONTAL)
     5086    bkBox.Add(wx.StaticText(G2frame.dataDisplay,label=' Background ratio: '),0,WACV)   
     5087    backSldr = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,
     5088        value=int(100*data['BackRatio']))
     5089    bkBox.Add(backSldr,1,wx.EXPAND)
     5090    backSldr.Bind(wx.EVT_SLIDER, OnBackSlider)
     5091    backVal = wx.TextCtrl(G2frame.dataDisplay,value='%.3f'%(data['BackRatio']))
     5092    backVal.Bind(wx.EVT_TEXT_ENTER,OnBackVal)       
     5093    backVal.Bind(wx.EVT_KILL_FOCUS,OnBackVal)
     5094    bkBox.Add(backVal,0,WACV)   
     5095    mainSizer.Add(bkBox,0,wx.ALIGN_LEFT|wx.EXPAND)
     5096
    49465097    sqBox = wx.BoxSizer(wx.HORIZONTAL)
    49475098    sqBox.Add(wx.StaticText(G2frame.dataDisplay,label=' Ruland width: '),0,WACV)   
     
    49615112    lorch.Bind(wx.EVT_CHECKBOX, OnLorch)
    49625113    sqBox.Add(lorch,0,WACV)
     5114# this isn't the right thing but something is needed here - leave as place holder
     5115#    sinDamp = wx.CheckBox(G2frame.dataDisplay,label='SinQ damping?')
     5116#    sinDamp.SetValue(data['sinDamp'])
     5117#    sinDamp.Bind(wx.EVT_CHECKBOX,OnSinDamp)
     5118#    sqBox.Add(sinDamp,0,WACV)
    49635119    sqBox.Add(wx.StaticText(G2frame.dataDisplay,label=' Scaling q-range: '),0,WACV)
    49645120    SQmin = wx.TextCtrl(G2frame.dataDisplay,value='%.1f'%(data['QScaleLim'][0]))
Note: See TracChangeset for help on using the changeset viewer.