Changeset 335


Ignore:
Timestamp:
Jul 7, 2011 1:53:57 PM (10 years ago)
Author:
vondreele
Message:

Add delete Pawley list; scratch "leBail" from things
mods to texture display stuff
refactor instrument parameters GUI as sizer based - no grid table
some mods to peak fit output

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r327 r335  
    253253        self._init_ctrls(parent)
    254254        self.Bind(wx.EVT_CLOSE, self.ExitMain)
     255        # various defaults
    255256        self.GSASprojectfile = ''
    256257        self.dirname = ''
     
    270271        self.Interpolate = 'nearest'
    271272        self.ContourColor = 'Paired'
     273        self.Projection = 'equal area'
    272274        self.logPlot = False
    273275        self.qPlot = False
  • trunk/GSASIIgrid.py

    r311 r335  
    3737] = [wx.NewId() for _init_coll_MASK_Items in range(3)]
    3838
    39 [ wxID_PAWLEYLOAD, wxID_PAWLEYIMPORT,
    40 ] = [wx.NewId() for _init_coll_PAWLEY_Items in range(2)]
     39[ wxID_PAWLEYLOAD, wxID_PAWLEYIMPORT, wxID_PAWLEYDELETE,
     40] = [wx.NewId() for _init_coll_PAWLEY_Items in range(3)]
    4141
    4242[ wxID_INSTPRMRESET,
     
    150150        parent.Append(id=wxID_PAWLEYIMPORT, kind=wx.ITEM_NORMAL,text='Pawley import',
    151151            help='Import Pawley reflection list')
     152        parent.Append(id=wxID_PAWLEYDELETE, kind=wx.ITEM_NORMAL,text='Pawley delete',
     153            help='Delete Pawley reflection list')
    152154
    153155    def _init_coll_IndPeaks_Items(self,parent):
  • trunk/GSASIIphsGUI.py

    r327 r335  
    209209                        self.dataDisplay.DeletePage(self.dataDisplay.FindPage('Draw Atoms'))
    210210                        self.dataDisplay.AdvanceSelection()
    211                     if not self.dataDisplay.FindPage('Pawley/Lebail reflections'):     
    212                         self.dataDisplay.AddPage(G2gd.GSGrid(self.dataDisplay),'Pawley/LeBail reflections')
     211                    if not self.dataDisplay.FindPage('Pawley reflections'):     
     212                        self.dataDisplay.AddPage(G2gd.GSGrid(self.dataDisplay),'Pawley reflections')
    213213            else:
    214214                TypeTxt.SetValue(generalData['Type'])
     
    350350        nameSizer.Add(NameTxt,0,wx.ALIGN_CENTER_VERTICAL)
    351351        nameSizer.Add(wx.StaticText(dataDisplay,-1,'  Phase type: '),0,wx.ALIGN_CENTER_VERTICAL)
    352         TypeTxt = wx.ComboBox(dataDisplay,-1,value=generalData['Type'],choices=phaseTypes,
     352        if len(data['Atoms']):
     353            choices = phaseTypes[:-1]
     354        else:
     355            choices = phaseTypes           
     356        TypeTxt = wx.ComboBox(dataDisplay,-1,value=generalData['Type'],choices=choices,
    353357            style=wx.CB_READONLY|wx.CB_DROPDOWN)
    354358        TypeTxt.Bind(wx.EVT_COMBOBOX, OnPhaseType)
     
    18561860                'SH Coeff':[False,{}],'SHShow':False,'PFhkl':[0,0,1],
    18571861                'PFxyz':[0,0,1.],'PlotType':'Pole figure'}
     1862        if 'SHShow' not in textureData:     #another fix
     1863            textureData.update({'SHShow':False,'PFhkl':[0,0,1],'PFxyz':[0,0,1.],'PlotType':'Pole figure'})
    18581864        try:                        #another fix!
    18591865            x = textureData['PlotType']
     
    18961902            UpdateDData()
    18971903           
     1904        def OnProjSel(event):
     1905            self.Projection = projSel.GetValue()
     1906            G2plt.PlotTexture(self,data,newPlot=False)
     1907           
     1908        def OnColorSel(event):
     1909            self.ContourColor = colorSel.GetValue()
     1910            G2plt.PlotTexture(self,data,newPlot=False)
     1911           
    18981912        def OnAngRef(event):
    18991913            Obj = event.GetEventObject()
     
    21122126        dataDisplay = wx.Panel(DData)
    21132127        mainSizer = wx.BoxSizer(wx.VERTICAL)
    2114         mainSizer.Add(wx.StaticText(dataDisplay,-1,'Spherical harmonics texture data for '+PhaseName+':'),0,wx.ALIGN_CENTER_VERTICAL)
     2128        titleSizer = wx.BoxSizer(wx.HORIZONTAL)
     2129        titleSizer.Add(wx.StaticText(dataDisplay,-1,'Spherical harmonics texture data for '+PhaseName+':'),0,wx.ALIGN_CENTER_VERTICAL)
     2130        titleSizer.Add(wx.StaticText(dataDisplay,-1,
     2131            ' Texture Index J = %7.3f'%(G2lat.textureIndex(textureData['SH Coeff'][1]))),
     2132            0,wx.ALIGN_CENTER_VERTICAL)
     2133        mainSizer.Add(titleSizer,0)
    21152134        mainSizer.Add((0,5),0)
    21162135        shSizer = wx.BoxSizer(wx.HORIZONTAL)
     
    21362155        mainSizer.Add(shSizer,0,0)
    21372156        mainSizer.Add((0,5),0)
    2138         mainSizer.Add(wx.StaticText(dataDisplay,-1,
    2139             'Texture Index J = %7.3f'%(G2lat.textureIndex(textureData['SH Coeff'][1]))),
    2140             0,wx.ALIGN_CENTER_VERTICAL)
     2157        PTSizer = wx.FlexGridSizer(2,4,5,5)
     2158        PTSizer.Add(wx.StaticText(dataDisplay,-1,' Texture plot type: '),0,wx.ALIGN_CENTER_VERTICAL)
     2159        choices = ['Axial pole distribution','Pole figure','Inverse pole figure']           
     2160        pfType = wx.ComboBox(dataDisplay,-1,value=str(textureData['PlotType']),choices=choices,
     2161            style=wx.CB_READONLY|wx.CB_DROPDOWN)
     2162        pfType.Bind(wx.EVT_COMBOBOX,OnPfType)
     2163        PTSizer.Add(pfType,0,wx.ALIGN_CENTER_VERTICAL)
     2164        PTSizer.Add(wx.StaticText(dataDisplay,-1,' Projection type: '),0,wx.ALIGN_CENTER_VERTICAL)
     2165        projSel = wx.ComboBox(dataDisplay,-1,value=self.Projection,choices=['equal area','stereographic'],
     2166            style=wx.CB_READONLY|wx.CB_DROPDOWN)
     2167        projSel.Bind(wx.EVT_COMBOBOX,OnProjSel)
     2168        PTSizer.Add(projSel,0,wx.ALIGN_CENTER_VERTICAL)
     2169        if textureData['PlotType'] in ['Pole figure','Axial pole distribution']:
     2170            PTSizer.Add(wx.StaticText(dataDisplay,-1,' Pole figure HKL: '),0,wx.ALIGN_CENTER_VERTICAL)
     2171            PH = textureData['PFhkl']
     2172            pfVal = wx.TextCtrl(dataDisplay,-1,'%d,%d,%d'%(PH[0],PH[1],PH[2]),style=wx.TE_PROCESS_ENTER)
     2173        else:
     2174            PTSizer.Add(wx.StaticText(dataDisplay,-1,' Inverse pole figure XYZ: '),0,wx.ALIGN_CENTER_VERTICAL)
     2175            PX = textureData['PFxyz']
     2176            pfVal = wx.TextCtrl(dataDisplay,-1,'%3.1f,%3.1f,%3.1f'%(PX[0],PX[1],PX[2]),style=wx.TE_PROCESS_ENTER)
     2177        pfVal.Bind(wx.EVT_TEXT_ENTER,OnPFValue)
     2178        pfVal.Bind(wx.EVT_KILL_FOCUS,OnPFValue)
     2179        PTSizer.Add(pfVal,0,wx.ALIGN_CENTER_VERTICAL)
     2180        PTSizer.Add(wx.StaticText(dataDisplay,-1,' Color scheme'),0,wx.ALIGN_CENTER_VERTICAL)
     2181        choice = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
     2182        choice.sort()
     2183        colorSel = wx.ComboBox(dataDisplay,-1,value=self.ContourColor,choices=choice,
     2184            style=wx.CB_READONLY|wx.CB_DROPDOWN)
     2185        colorSel.Bind(wx.EVT_COMBOBOX,OnColorSel)
     2186        PTSizer.Add(colorSel,0,wx.ALIGN_CENTER_VERTICAL)       
     2187        mainSizer.Add(PTSizer,0,wx.ALIGN_CENTER_VERTICAL)
     2188       
    21412189        mainSizer.Add((0,5),0)
    21422190        if textureData['SHShow']:
     
    21562204            mainSizer.Add(ODFSizer,0,wx.ALIGN_CENTER_VERTICAL)
    21572205            mainSizer.Add((0,5),0)
    2158         PFSizer = wx.BoxSizer(wx.HORIZONTAL)
    2159         PFSizer.Add(wx.StaticText(dataDisplay,-1,'Texture plot type: '),0,wx.ALIGN_CENTER_VERTICAL)
    2160         choices = ['Axial pole distribution','Pole figure','Inverse pole figure']           
    2161         pfType = wx.ComboBox(dataDisplay,-1,value=str(textureData['PlotType']),choices=choices,
    2162             style=wx.CB_READONLY|wx.CB_DROPDOWN)
    2163         pfType.Bind(wx.EVT_COMBOBOX,OnPfType)
    2164         PFSizer.Add(pfType,0,wx.ALIGN_CENTER_VERTICAL)
    2165         mainSizer.Add(PFSizer,0,wx.ALIGN_CENTER_VERTICAL)
    2166         if textureData['PlotType'] in ['Pole figure','Axial pole distribution']:
    2167             PFSizer.Add(wx.StaticText(dataDisplay,-1,'  Display pole figure for HKL: '),0,wx.ALIGN_CENTER_VERTICAL)
    2168             PH = textureData['PFhkl']
    2169             pfVal = wx.TextCtrl(dataDisplay,-1,'%d,%d,%d'%(PH[0],PH[1],PH[2]),style=wx.TE_PROCESS_ENTER)
    2170             pfVal.Bind(wx.EVT_TEXT_ENTER,OnPFValue)
    2171             pfVal.Bind(wx.EVT_KILL_FOCUS,OnPFValue)
    2172             PFSizer.Add(pfVal,0,wx.ALIGN_CENTER_VERTICAL)
    2173         else:
    2174             PFSizer.Add(wx.StaticText(dataDisplay,-1,'  Display inverse pole figure for XYZ: '),0,wx.ALIGN_CENTER_VERTICAL)
    2175             PX = textureData['PFxyz']
    2176             pfVal = wx.TextCtrl(dataDisplay,-1,'%3.1f,%3.1f,%3.1f'%(PX[0],PX[1],PX[2]),style=wx.TE_PROCESS_ENTER)
    2177             pfVal.Bind(wx.EVT_TEXT_ENTER,OnPFValue)
    2178             pfVal.Bind(wx.EVT_KILL_FOCUS,OnPFValue)
    2179             PFSizer.Add(pfVal,0,wx.ALIGN_CENTER_VERTICAL)
    21802206        mainSizer.Add((0,5),0)
    21812207        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Sample orientation angles: '),0,wx.ALIGN_CENTER_VERTICAL)
     
    25472573        HKLd = G2lat.GenHLaue(dmin,Laue,SGLatt,SGUniq,A)
    25482574        PawleyPeaks = []
    2549         for h,k,l,d in HKLd:
    2550             ext,mul = G2spc.GenHKL([h,k,l],SGData)[:2]
    2551             if not ext:
    2552                 th = asind(lam/(2.0*d))
    2553                 H = gamFW(sig(th,GU,GV,GW),gam(th,LX,LY))/2.35482
    2554                 PawleyPeaks.append([h,k,l,mul,2*th,H,False,0,0])
     2575        wx.BeginBusyCursor()
     2576        try:
     2577            for h,k,l,d in HKLd:
     2578                ext,mul = G2spc.GenHKL([h,k,l],SGData)[:2]
     2579                if not ext:
     2580                    th = asind(lam/(2.0*d))
     2581                    H = gamFW(sig(th,GU,GV,GW),gam(th,LX,LY))/2.35482
     2582                    PawleyPeaks.append([h,k,l,mul,2*th,H,False,0,0])
     2583        finally:
     2584            wx.EndBusyCursor()
    25552585        data['Pawley ref'] = PawleyPeaks
    25562586        FillPawleyReflectionsGrid()
     
    25792609        finally:
    25802610            dlg.Destroy()
     2611           
     2612    def OnPawleyDelete(event):
     2613        dlg = wx.MessageDialog(self,'Do you really want to delete Pawley reflections?','Delete',
     2614            wx.YES_NO | wx.ICON_QUESTION)
     2615        try:
     2616            result = dlg.ShowModal()
     2617        finally:
     2618            dlg.Destroy()
     2619        if result == wx.ID_YES:
     2620            data['Pawley ref'] = []
     2621            FillPawleyReflectionsGrid()
    25812622
    25822623    def OnPageChanged(event):
     
    26242665            UpdateDrawAtoms()
    26252666            G2plt.PlotStructure(self,data)
    2626         elif text == 'Pawley/LeBail reflections':
     2667        elif text == 'Pawley reflections':
    26272668            self.dataFrame.SetMenuBar(self.dataFrame.PawleyMenu)
    26282669            self.dataFrame.Bind(wx.EVT_MENU, OnPawleyLoad, id=G2gd.wxID_PAWLEYLOAD)
    26292670            self.dataFrame.Bind(wx.EVT_MENU, OnPawleyImport, id=G2gd.wxID_PAWLEYIMPORT)
     2671            self.dataFrame.Bind(wx.EVT_MENU, OnPawleyDelete, id=G2gd.wxID_PAWLEYDELETE)           
    26302672            FillPawleyReflectionsGrid()           
    26312673        else:
     
    26432685        self.dataDisplay.AddPage(DData,'Data')
    26442686        PawleyRefl = G2gd.GSGrid(self.dataDisplay)
    2645         self.dataDisplay.AddPage(PawleyRefl,'Pawley/LeBail reflections')
     2687        self.dataDisplay.AddPage(PawleyRefl,'Pawley reflections')
    26462688    else:
    26472689        DData = wx.ScrolledWindow(self.dataDisplay)
  • trunk/GSASIIplot.py

    r327 r335  
    4949npacosd = lambda x: 180.*np.arccos(x)/np.pi
    5050npasind = lambda x: 180.*np.arcsin(x)/np.pi
     51npatand = lambda x: 180.*np.arctan(x)/np.pi
    5152npatan2d = lambda x,y: 180.*np.arctan2(x,y)/np.pi
    5253   
     
    10211022    instParms = self.PatternTree.GetItemPyData( \
    10221023        G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
    1023     if instParms[0][0] == 'PXC':
     1024    if instParms[0][0] in ['PXC','PNC']:
    10241025        lam = instParms[1][1]
    10251026        if len(instParms[1]) == 13:
     
    10881089    for peak in peaks:
    10891090        X.append(4.0*math.pi*sind(peak[0]/2.0)/lam)
    1090         s = 1.17741*math.sqrt(peak[4])*math.pi/18000.
     1091        try:
     1092            s = 1.17741*math.sqrt(peak[4])*math.pi/18000.
     1093        except ValueError:
     1094            s = 0.01
    10911095        g = peak[6]*math.pi/18000.
    10921096        G = gamFW(g,s)
     
    12111215    SHCoef = SHData['SH Coeff'][1]
    12121216    cell = generalData['Cell'][1:7]
     1217    Amat,Bmat = G2lat.cell2AB(cell)
     1218    sq2 = 1.0/math.sqrt(2.0)
    12131219   
     1220    def rp2xyz(r,p):
     1221        z = npcosd(r)
     1222        xy = np.sqrt(1.-z**2)
     1223        return xy*npsind(p),xy*npcosd(p),z
     1224           
    12141225    def OnMotion(event):
    1215         Page.canvas.SetToolTipString('')
     1226        SHData = data['General']['SH Texture']
    12161227        if event.xdata and event.ydata:                 #avoid out of frame errors
    1217             if 'Pole figure' in SHData['PlotType']:
    1218                 xpos = event.xdata
    1219                 ypos = event.ydata
    1220                 Int = 0
    1221                 if xpos**2+ypos**2 < 1.0:
    1222                     r,p = 2.*npasind(np.sqrt(xpos**2+ypos**2)*0.707106782),npatan2d(ypos,xpos)
     1228            xpos = event.xdata
     1229            ypos = event.ydata
     1230            if 'Inverse' in SHData['PlotType']:
     1231                r = xpos**2+ypos**2
     1232                if r <= 1.0:
     1233                    if 'equal' in self.Projection:
     1234                        r,p = 2.*npasind(np.sqrt(r)*sq2),npatan2d(ypos,xpos)
     1235                    else:
     1236                        r,p = 2.*npatand(np.sqrt(r)),npatan2d(ypos,xpos)
     1237                    ipf = G2lat.invpolfcal(IODFln,SGData,np.array([r,]),np.array([p,]))
     1238                    xyz = np.inner(Amat.T,np.array([rp2xyz(r,p)]))
     1239                    y,x,z = list(xyz/np.max(np.abs(xyz)))
     1240                   
     1241                    self.G2plotNB.status.SetFields(['',
     1242                        'psi =%9.3f, beta =%9.3f, MRD =%9.3f xyz=%5.2f,%5.2f,%5.2f'%(r,p,ipf,x,y,z)])
     1243                                   
     1244            elif 'Axial' in SHData['PlotType']:
     1245                pass
     1246               
     1247            else:                       #ordinary pole figure
     1248                z = xpos**2+ypos**2
     1249                if z <= 1.0:
     1250                    z = np.sqrt(z)
     1251                    if 'equal' in self.Projection:
     1252                        r,p = 2.*npasind(z*sq2),npatan2d(ypos,xpos)
     1253                    else:
     1254                        r,p = 2.*npatand(z),npatan2d(ypos,xpos)
    12231255                    pf = G2lat.polfcal(ODFln,SamSym[textureData['Model']],np.array([r,]),np.array([p,]))
    12241256                    self.G2plotNB.status.SetFields(['','phi =%9.3f, gam =%9.3f, MRD =%9.3f'%(r,p,pf)])
    1225    
     1257                   
    12261258    try:
    12271259        plotNum = self.G2plotNB.plotList.index('Texture')
     
    12361268        Page = self.G2plotNB.nb.GetPage(plotNum)
    12371269        Page.canvas.mpl_connect('motion_notify_event', OnMotion)
    1238         Page.SetFocus()
    1239    
     1270
     1271    Page.SetFocus()
     1272    self.G2plotNB.status.SetFields(['',''])   
     1273    PH = np.array(SHData['PFhkl'])
     1274    phi,beta = G2lat.CrsAng(PH,cell,SGData)
     1275    ODFln = G2lat.Flnh(Start,SHCoef,phi,beta,SGData)
     1276    PX = np.array(SHData['PFxyz'])
     1277    gam = atan2d(PX[0],PX[1])
     1278    xy = math.sqrt(PX[0]**2+PX[1]**2)
     1279    xyz = math.sqrt(PX[0]**2+PX[1]**2+PX[2]**2)
     1280    psi = asind(xy/xyz)
     1281    IODFln = G2lat.Glnh(Start,SHCoef,psi,gam,SamSym[textureData['Model']])
    12401282    if 'Axial' in SHData['PlotType']:
    1241         PH = np.array(SHData['PFhkl'])
    1242         phi,beta = G2lat.CrsAng(PH,cell,SGData)
    1243         ODFln = G2lat.Flnh(Start,SHCoef,phi,beta,SGData)
    12441283        X = np.linspace(0,90.0,26)
    12451284        Y = G2lat.polfcal(ODFln,SamSym[textureData['Model']],X,0.0)
     
    12511290       
    12521291    else:       
     1292        npts = 201
    12531293        if 'Inverse' in SHData['PlotType']:
    1254             PX = np.array(SHData['PFxyz'])
    1255             gam = atan2d(PX[0],PX[1])
    1256             xy = math.sqrt(PX[0]**2+PX[1]**2)
    1257             xyz = math.sqrt(PX[0]**2+PX[1]**2+PX[2]**2)
    1258             psi = asind(xy/xyz)
    1259             npts = 201
    1260             ODFln = G2lat.Glnh(Start,SHCoef,psi,gam,SamSym[textureData['Model']])
    12611294            X,Y = np.meshgrid(np.linspace(1.,-1.,npts),np.linspace(-1.,1.,npts))
    12621295            R,P = np.sqrt(X**2+Y**2).flatten(),npatan2d(X,Y).flatten()
    1263             R = np.where(R <= 1.,2.*npasind(R*0.70710678),0.0)
     1296            if 'equal' in self.Projection:
     1297                R = np.where(R <= 1.,2.*npasind(R*sq2),0.0)
     1298            else:
     1299                R = np.where(R <= 1.,2.*npatand(R),0.0)
    12641300            Z = np.zeros_like(R)
    1265             Z = G2lat.invpolfcal(ODFln,SGData,R,P)
     1301            Z = G2lat.invpolfcal(IODFln,SGData,R,P)
    12661302            Z = np.reshape(Z,(npts,npts))
    12671303            CS = Plot.contour(Y,X,Z,aspect='equal')
    12681304            Plot.clabel(CS,fontsize=9,inline=1)
    1269             Img = Plot.imshow(Z.T,aspect='equal',cmap='binary',extent=[-1,1,-1,1])
     1305            Img = Plot.imshow(Z.T,aspect='equal',cmap=self.ContourColor,extent=[-1,1,-1,1])
    12701306            if newPlot:
    12711307#                Page.figure.colorbar(Img)    #colorbar fails - crashes gsasii
    12721308                newPlot = False
    12731309            Plot.set_title('Inverse pole figure for XYZ='+str(SHData['PFxyz']))
     1310            Plot.set_xlabel(self.Projection.capitalize()+' projection')
    12741311                       
    12751312        else:
    1276             PH = np.array(SHData['PFhkl'])
    1277             phi,beta = G2lat.CrsAng(PH,cell,SGData)
    1278             npts = 201
    1279             ODFln = G2lat.Flnh(Start,SHCoef,phi,beta,SGData)
    12801313            X,Y = np.meshgrid(np.linspace(1.,-1.,npts),np.linspace(-1.,1.,npts))
    12811314            R,P = np.sqrt(X**2+Y**2).flatten(),npatan2d(X,Y).flatten()
    1282             R = np.where(R <= 1.,2.*npasind(R*0.70710678),0.0)
     1315            if 'equal' in self.Projection:
     1316                R = np.where(R <= 1.,2.*npasind(R*sq2),0.0)
     1317            else:
     1318                R = np.where(R <= 1.,2.*npatand(R),0.0)
    12831319            Z = np.zeros_like(R)
    12841320            Z = G2lat.polfcal(ODFln,SamSym[textureData['Model']],R,P)
     
    12861322            CS = Plot.contour(Y,X,Z,aspect='equal')
    12871323            Plot.clabel(CS,fontsize=9,inline=1)
    1288             Img = Plot.imshow(Z.T,aspect='equal',cmap='binary',extent=[-1,1,-1,1])
     1324            Img = Plot.imshow(Z.T,aspect='equal',cmap=self.ContourColor,extent=[-1,1,-1,1])
    12891325            if newPlot:
    12901326#                Page.figure.colorbar(Img)    #colorbar fails - crashes gsasii
    12911327                newPlot = False
    12921328            Plot.set_title('Pole figure for HKL='+str(SHData['PFhkl']))
     1329            Plot.set_xlabel(self.Projection.capitalize()+' projection')
    12931330    Page.canvas.draw()
    12941331
  • trunk/GSASIIpwd.py

    r315 r335  
    760760                dlg.Destroy()
    761761            runtime = time.time()-begin   
    762             print 'Number of function calls:',result[2]['nfev'],' Number of observations: ',xFin-xBeg,' Number of parameters: ',len(varyList)
    763             print "%s%8.3f%s " % ('fitpeak time =',runtime,'s')
     762            chisq = np.sum(result[2]['fvec']**2)
     763            ncyc = int(result[2]['nfev']/len(varyList))
    764764            ValuesIn(parmDict, varyList, result[0])
    765             chisq = np.sum(errPeakProfile(result[0],x[xBeg:xFin],y[xBeg:xFin],w[xBeg:xFin],parmDict,varyList,bakType,0)**2)
    766765            Rwp = np.sqrt(chisq/np.sum(w[xBeg:xFin]*y[xBeg:xFin]**2))*100.      #to %
    767766            GOF = chisq/(xFin-xBeg-len(varyList))
    768             print "%s%7.2f%s%12.6g%s%6.2f" % ('Rwp = ',Rwp,'%, chi**2 = ',chisq,' reduced chi**2 = ',GOF)
     767            print 'Number of function calls:',result[2]['nfev'],' Number of observations: ',xFin-xBeg,' Number of parameters: ',len(varyList)
     768            print 'fitpeak time = %8.3fs, %8.3fs/cycle'%(runtime,runtime/ncyc)
     769            print 'Rwp = %7.2f%%, chi**2 = %12.6g, reduced chi**2 = %6.2f'%(Rwp,chisq,GOF)
    769770            try:
    770771                sig = np.sqrt(np.diag(result[1])*GOF)
     
    773774                break                   #refinement succeeded - finish up!
    774775            except ValueError:          #result[1] is None on singular matrix
    775                 print 'Refinement failed - singular matrix'
     776                print '**** Refinement failed - singular matrix ****'
    776777                Ipvt = result[2]['ipvt']
    777778                for i,ipvt in enumerate(Ipvt):
  • trunk/GSASIIpwdGUI.py

    r312 r335  
    2929cosd = lambda x: math.cos(x*math.pi/180.)
    3030asind = lambda x: 180.*math.asin(x)/math.pi
     31   
     32def IsHistogramInAnyPhase(self,histoName):
     33    phases = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
     34    if phases:
     35        item, cookie = self.PatternTree.GetFirstChild(phases)
     36        while item:
     37            data = self.PatternTree.GetItemPyData(item)
     38            histoList = data['Histograms'].keys()
     39            if histoName in histoList:
     40                return True
     41            item, cookie = self.PatternTree.GetNextChild(phases, cookie)
     42        return False
     43    else:
     44        return False
     45   
    3146       
    3247def UpdatePeakGrid(self, data):
     
    342357    self.dataFrame.setSizePosLeft([230,120])
    343358   
    344 def UpdateInstrumentGrid(self, data):
    345     if self.dataDisplay:
    346         self.dataFrame.Clear()
    347     Ka2 = False
    348     if len(data[0]) == 13:
    349         Ka2 = True
    350     self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
     359def UpdateInstrumentGrid(self,data):
     360    if len(data) > 3:                   #powder data
     361        insVal = dict(zip(data[3],data[1]))
     362        insDef = dict(zip(data[3],data[0]))
     363        insRef = dict(zip(data[3],data[2]))
     364        if 'N' in insDef['Type']:
     365            del(insDef['Polariz.'])
     366            del(insVal['Polariz.'])
     367            del(insRef['Polariz.'])
     368    else:                               #single crystal data
     369        insVal = dict(zip(data[2],data[1]))
     370        insDef = dict(zip(data[2],data[0]))
     371        insRef = {}
     372    ValObj = {}
     373    RefObj = {}
     374    waves = {'CuKa':[1.54051,1.54433],'TiKa':[2.74841,2.75207],'CrKa':[2.28962,2.29351],
     375        'FeKa':[1.93597,1.93991],'CoKa':[1.78892,1.79278],'MoKa':[0.70926,0.713543],
     376        'AgKa':[0.559363,0.563775]}
     377       
     378    def inst2data(inst,ref,data):
     379        if len(data) > 3:
     380            for i,item in enumerate(data[3]):
     381                try:
     382                    data[1][i] = inst[item]
     383                    data[2][i] = ref[item]
     384                except KeyError:
     385                    data[1][i] = 0
     386                    data[2][i] = 0                   
     387        else:
     388            for i,item in enumerate(data[2]):
     389                data[1][i] = inst[item]           
     390        return data
     391       
     392    def updateData(inst,ref):
     393        return inst2data(inst,ref,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,
     394            self.PatternId,'Instrument Parameters')))       
    351395   
    352396    def RefreshInstrumentGrid(event,doAnyway=False):
    353397        if doAnyway or event.GetRow() == 1:
    354398            peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
    355             ins = data[1]
    356             if 'P' in ins[0]:                                       #update powder peak parameters
     399            if 'P' in insVal['Type']:                                       #update powder peak parameters
    357400                for peak in peaks:
    358                     if Ka2:
    359                         peak[4] = ins[6]*tand(peak[0]/2.0)**2+ins[7]*tand(peak[0]/2.0)+ins[8]
    360                         peak[6] = ins[9]/cosd(peak[0]/2.0)+ins[10]*tand(peak[0]/2.0)
    361                     else:
    362                         peak[4] = ins[4]*tand(peak[0]/2.0)**2+ins[5]*tand(peak[0]/2.0)+ins[6]
    363                         peak[6] = ins[7]/cosd(peak[0]/2.0)+ins[8]*tand(peak[0]/2.0)
     401                    peak[4] = insVal['U']*tand(peak[0]/2.0)**2+insVal['V']*tand(peak[0]/2.0)+insVal['W']
     402                    peak[6] = insVal['X']/cosd(peak[0]/2.0)+insVal['Y']*tand(peak[0]/2.0)
    364403                                               
    365404    def OnReset(event):
    366         if Ka2:
    367             data[1][6:12] = data[0][6:12]
    368         else:
    369             data[1][4:10] = data[0][4:10]
     405        insVal.update(insDef)
     406        data = updateData(insVal,insRef)
    370407        RefreshInstrumentGrid(event,doAnyway=True)          #to get peaks updated
    371         UpdateInstrumentGrid(self, data)
    372        
    373     self.InstrumentTable = []
    374     if 'P' in data[1][0]:                   #powder data
     408        UpdateInstrumentGrid(self,data)
     409       
     410    def OnNewType(event):
     411        insVal['Type'] = typePick.GetValue()
     412        data = updateData(insVal,insRef)
     413        UpdateInstrumentGrid(self,data)
     414       
     415    def OnLamPick(event):
     416        lamType = lamPick.GetValue()
     417        insVal['Lam1'] = waves[lamType][0]
     418        insVal['Lam2'] = waves[lamType][1]
     419        data = updateData(insVal,insRef)
     420        UpdateInstrumentGrid(self,data)
     421         
     422       
     423    def OnRatValue(event):
     424        try:
     425            value = float(ratVal.GetValue())
     426            if value < 0:
     427                raise ValueError
     428        except ValueError:
     429            value = insVal['I(L2)/I(L1)']
     430        insVal['I(L2)/I(L1)'] = value
     431        ratVal.SetValue('%10.4f'%(value))
     432        data = updateData(insVal,insRef)
     433       
     434    def OnRatRef(event):
     435        insRef['I(L2)/I(L1)'] = ratRef.GetValue()
     436        data = updateData(insVal,insRef)
     437       
     438    def OnWaveValue(event):
     439        try:
     440            value = float(waveVal.GetValue())
     441            if value < 0:
     442                raise ValueError
     443        except ValueError:
     444            value = insVal['Lam']
     445        insVal['Lam'] = value
     446        waveVal.SetValue('%10.6f'%(value))
     447        data = updateData(insVal,insRef)
     448       
     449    def OnWaveRef(event):
     450        insRef['Lam'] = waveRef.GetValue()
     451        data = updateData(insVal,insRef)
     452       
     453    def OnItemValue(event):
     454        Obj = event.GetEventObject()
     455        item,fmt = ValObj[Obj.GetId()]
     456        try:
     457            value = float(Obj.GetValue())
     458            if value < 0:
     459                raise ValueError
     460        except ValueError:
     461            value = insVal[item]
     462        insVal[item] = value
     463        Obj.SetValue(fmt%(value))
     464        data = updateData(insVal,insRef)
     465       
     466    def OnItemRef(event):
     467        Obj = event.GetEventObject()
     468        item = RefObj[Obj.GetId()]
     469        insRef[item] = Obj.GetValue()
     470        data = updateData(insVal,insRef)
     471               
     472    if self.dataDisplay:
     473        self.dataFrame.Clear()
     474    histoName = self.PatternTree.GetItemPyData(self.PatternId)[-1]
     475    ifHisto = IsHistogramInAnyPhase(self,histoName)
     476    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
     477    self.dataDisplay = wx.Panel(self.dataFrame)
     478    instSizer = wx.FlexGridSizer(2,6,5,5)
     479    instSizer.Add(wx.StaticText(self.dataDisplay,-1,' Histogram Type:'),0,wx.ALIGN_CENTER_VERTICAL)
     480    if 'P' in insVal['Type']:                   #powder data
    375481        self.dataFrame.SetMenuBar(self.dataFrame.InstMenu)
    376482        if not self.dataFrame.GetStatusBar():
    377483            Status = self.dataFrame.CreateStatusBar()
    378484        self.Bind(wx.EVT_MENU, OnReset, id=G2gd.wxID_INSTPRMRESET)
    379         if Ka2:
    380             Types = [wg.GRID_VALUE_CHOICE+":PXC,PNC,PNT",wg.GRID_VALUE_FLOAT+':10,6',wg.GRID_VALUE_FLOAT+':10,6',               #type, lam-1 & lam-2
    381                 wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #zero, ratio, pola
    382                 wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #u,v,w
    383                 wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,2']
    384         else:
    385             Types = [wg.GRID_VALUE_CHOICE+":PXC,PNC,PNT",wg.GRID_VALUE_FLOAT+':10,6',               #type & lam-1
    386                 wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #zero, pola
    387                 wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #u,v,w
    388                 wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,2']
    389         colLabels = data[3]
    390         rowLabels = ['default','changed','refine']
    391         self.InstrumentTable = G2gd.Table(data[:-1],rowLabels=rowLabels,colLabels=colLabels,types=Types)
    392         self.dataFrame.SetLabel('Instrument Parameters')
    393         gridPanel = wx.Panel(self.dataFrame)
    394         self.dataDisplay = G2gd.GSGrid(gridPanel)               
    395         self.dataDisplay.SetTable(self.InstrumentTable, True)
    396         self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshInstrumentGrid)               
    397         self.dataDisplay.SetMargins(0,0)
    398         self.dataDisplay.AutoSizeColumns(False)
    399         beg = 4
    400         if Ka2: beg = 6
    401         for i in range(len(data[2])):
    402             if i < beg or i == beg+6:
    403                 self.dataDisplay.SetCellRenderer(2,i,wg.GridCellStringRenderer())
    404                 self.dataDisplay.SetCellValue(2,i,'')
    405                 self.dataDisplay.SetReadOnly(2,i,isReadOnly=True)
     485        typePick = wx.ComboBox(self.dataDisplay,value=insVal['Type'],
     486            choices=['PXC','PNC','PNT'],style=wx.CB_READONLY|wx.CB_DROPDOWN)
     487        typePick.Bind(wx.EVT_COMBOBOX, OnNewType)
     488        instSizer.Add(typePick,0,wx.ALIGN_CENTER_VERTICAL)
     489        if 'C' in insVal['Type']:               #constant wavelength
     490            instSizer.Add(wx.StaticText(self.dataDisplay,-1,' Azimuth: %7.2f'%(insVal['Azimuth'])),0,wx.ALIGN_CENTER_VERTICAL)
     491            if 'Lam1' in insVal:
     492                instSizer.Add((5,5),0)
     493                instSizer.Add((5,5),0)
     494                instSizer.Add((5,5),0)
     495                instSizer.Add(wx.StaticText(self.dataDisplay,-1,' Ka1/Ka2:'),
     496                        0,wx.ALIGN_CENTER_VERTICAL)
     497                instSizer.Add(wx.StaticText(self.dataDisplay,-1,'%8.6f/%8.6f'%(insVal['Lam1'],insVal['Lam2'])),
     498                        0,wx.ALIGN_CENTER_VERTICAL)
     499                waveSizer = wx.BoxSizer(wx.HORIZONTAL)
     500                waveSizer.Add(wx.StaticText(self.dataDisplay,-1,'Select:'),0,wx.ALIGN_CENTER_VERTICAL)
     501                choice = ['TiKa','CrKa','FeKa','CoKa','CuKa','MoKa','AgKa']
     502                lamPick = wx.ComboBox(self.dataDisplay,value=' ',choices=choice,style=wx.CB_READONLY|wx.CB_DROPDOWN)
     503                lamPick.Bind(wx.EVT_COMBOBOX, OnLamPick)
     504                waveSizer.Add(lamPick,0)
     505                instSizer.Add(waveSizer,0)
     506                instSizer.Add(wx.StaticText(self.dataDisplay,-1,' I(L2)/I(L1): (%10.4f)'%(insDef['I(L2)/I(L1)'])),
     507                        0,wx.ALIGN_CENTER_VERTICAL)
     508                ratVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,'%10.4f'%(insVal['I(L2)/I(L1)']),style=wx.TE_PROCESS_ENTER)
     509                ratVal.Bind(wx.EVT_TEXT_ENTER,OnRatValue)
     510                ratVal.Bind(wx.EVT_KILL_FOCUS,OnRatValue)
     511                instSizer.Add(ratVal,0)
     512                ratRef = wx.CheckBox(self.dataDisplay,label=' Refine?')
     513                ratRef.SetValue(bool(insRef['I(L2)/I(L1)']))
     514                ratRef.Bind(wx.EVT_CHECKBOX, OnRatRef)
     515                instSizer.Add(ratRef,0,wx.ALIGN_CENTER_VERTICAL)
     516               
    406517            else:
    407                 self.dataDisplay.SetCellRenderer(2,i,wg.GridCellBoolRenderer())
    408                 self.dataDisplay.SetCellEditor(2,i,wg.GridCellBoolEditor())
     518                instSizer.Add(wx.StaticText(self.dataDisplay,-1,' Lam: (%10.6f)'%(insDef['Lam'])),
     519                    0,wx.ALIGN_CENTER_VERTICAL)
     520                waveVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,'%10.6f'%(insVal['Lam']),style=wx.TE_PROCESS_ENTER)
     521                waveVal.Bind(wx.EVT_TEXT_ENTER,OnWaveValue)
     522                waveVal.Bind(wx.EVT_KILL_FOCUS,OnWaveValue)
     523                instSizer.Add(waveVal,0,wx.ALIGN_CENTER_VERTICAL)
     524                if ifHisto:
     525                    waveRef = wx.CheckBox(self.dataDisplay,label=' Refine?')
     526                    waveRef.SetValue(bool(insRef['Lam']))
     527                    waveRef.Bind(wx.EVT_CHECKBOX, OnWaveRef)
     528                    instSizer.Add(waveRef,0,wx.ALIGN_CENTER_VERTICAL)
     529                else:
     530                    instSizer.Add((5,5),0)
     531            for item in ['Zero','Polariz.']:
     532                fmt = '%10.3f'
     533                Fmt = ' %s: ('+fmt+')'
     534                if item in insDef:
     535                    instSizer.Add(wx.StaticText(self.dataDisplay,-1,Fmt%(item,insDef[item])),
     536                            0,wx.ALIGN_CENTER_VERTICAL)
     537                    itemVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,fmt%(insVal[item]),style=wx.TE_PROCESS_ENTER)
     538                    ValObj[itemVal.GetId()] = [item,fmt]
     539                    itemVal.Bind(wx.EVT_TEXT_ENTER,OnItemValue)
     540                    itemVal.Bind(wx.EVT_KILL_FOCUS,OnItemValue)
     541                    instSizer.Add(itemVal,0,wx.ALIGN_CENTER_VERTICAL)
     542                    if ifHisto:
     543                        itemRef = wx.CheckBox(self.dataDisplay,wx.ID_ANY,label=' Refine?')
     544                        itemRef.SetValue(bool(insRef[item]))
     545                        RefObj[itemRef.GetId()] = item
     546                        itemRef.Bind(wx.EVT_CHECKBOX, OnItemRef)
     547                        instSizer.Add(itemRef,0,wx.ALIGN_CENTER_VERTICAL)
     548                    else:
     549                        instSizer.Add((5,5),0)
     550                else:                           #skip Polariz. for neutrons
     551                    instSizer.Add((5,5),0)
     552                    instSizer.Add((5,5),0)
     553                    instSizer.Add((5,5),0)
     554            for item in ['U','V','W','X','Y','SH/L']:
     555                fmt = '%10.3f'
     556                if item == 'SH/L':
     557                    fmt = '%10.5f'
     558                Fmt = ' %s: ('+fmt+')'
     559                instSizer.Add(wx.StaticText(self.dataDisplay,-1,Fmt%(item,insDef[item])),
     560                        0,wx.ALIGN_CENTER_VERTICAL)
     561                itemVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,fmt%(insVal[item]),style=wx.TE_PROCESS_ENTER)
     562                ValObj[itemVal.GetId()] = [item,fmt]
     563                itemVal.Bind(wx.EVT_TEXT_ENTER,OnItemValue)
     564                itemVal.Bind(wx.EVT_KILL_FOCUS,OnItemValue)
     565                instSizer.Add(itemVal,0,wx.ALIGN_CENTER_VERTICAL)
     566                itemRef = wx.CheckBox(self.dataDisplay,wx.ID_ANY,label=' Refine?')
     567                itemRef.SetValue(bool(insRef[item]))
     568                RefObj[itemRef.GetId()] = item
     569                itemRef.Bind(wx.EVT_CHECKBOX, OnItemRef)
     570                instSizer.Add(itemRef,0,wx.ALIGN_CENTER_VERTICAL)
     571        else:                                   #time of flight (neutrons)
     572            pass                                #for now
     573       
     574       
     575
    409576    else:                       #single crystal data
    410         Types = [wg.GRID_VALUE_CHOICE+":SXC,SNC,SNT",wg.GRID_VALUE_FLOAT+':10,6']
    411         colLabels = data[2]
    412         rowLabels = ['original','changed']
    413         self.InstrumentTable = G2gd.Table(data[:-1],rowLabels=rowLabels,colLabels=colLabels,types=Types)
    414         self.dataFrame.SetLabel('Instrument Parameters')
    415         gridPanel = wx.Panel(self.dataFrame)
    416         self.dataDisplay = G2gd.GSGrid(gridPanel)               
    417         self.dataDisplay.SetTable(self.InstrumentTable, True)
    418         self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshInstrumentGrid)               
    419         self.dataDisplay.SetMargins(0,0)
    420         self.dataDisplay.AutoSizeColumns(False)
     577        typePick = wx.ComboBox(self.dataDisplay,value=insVal['Type'],
     578            choices=['SXC','SNC','SNT'],style=wx.CB_READONLY|wx.CB_DROPDOWN)
     579        typePick.Bind(wx.EVT_COMBOBOX, OnNewType)
     580        instSizer.Add(typePick,0,wx.ALIGN_CENTER_VERTICAL)
     581        if 'C' in insVal['Type']:               #constant wavelength
     582            instSizer.Add(wx.StaticText(self.dataDisplay,-1,' Lam: %10.6f'%(insDef['Lam'])),
     583                    0,wx.ALIGN_CENTER_VERTICAL)
     584        else:                                   #time of flight (neutrons)
     585            pass                                #for now
     586       
    421587    mainSizer = wx.BoxSizer(wx.VERTICAL)
    422     mainSizer.Add(self.dataDisplay,0)
     588    mainSizer.Add(instSizer,0)
    423589    mainSizer.Layout()   
    424590    self.dataDisplay.SetSizer(mainSizer)
     
    755921        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
    756922        for hkl in self.HKL:
    757             hkl.append(2.0*asind(wave/(2.*hkl[3])))             
     923            hkl.append(2.0*asind(wave/(2.*hkl[3]))+controls[1])             
    758924        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
    759925            G2plt.PlotPowderLines(self)
     
    807973        cellPrint(ibrav,Aref)
    808974        for hkl in self.HKL:
    809             hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
     975            hkl.append(2.0*asind(inst[1]/(2.*hkl[3]))+controls[1])             
    810976        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
    811977            G2plt.PlotPowderLines(self)
Note: See TracChangeset for help on using the changeset viewer.