Changeset 171


Ignore:
Timestamp:
Nov 12, 2010 10:53:07 AM (12 years ago)
Author:
vondreele
Message:

GSASIIIO.py:
read phase from cif file
fix esd output for powder data
prints space group info when pdb phase read in
GSASIIplot.py:
allow with 'u' & 'd' to vary max value in contour plot
select atom on drawing with Alt-LB
GSASIIpwdGUI.py:
Fix "UnDo?" in peak fitting
GSASII.py:
As above

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r169 r171  
    4747
    4848[wxID_FILECLOSE, wxID_FILEEXIT, wxID_FILEOPEN,
    49  wxID_FILESAVE, wxID_FILESAVEAS, wxID_UNDO, wxID_REFINE,
    50 ] = [wx.NewId() for _init_coll_File_Items in range(7)]
     49 wxID_FILESAVE, wxID_FILESAVEAS, wxID_REFINE,
     50] = [wx.NewId() for _init_coll_File_Items in range(6)]
    5151
    5252[wxID_PWDRREAD,wxID_SNGLREAD,wxID_ADDPHASE,wxID_DELETEPHASE,
     
    130130        self.Refine.Enable(False)
    131131        self.Bind(wx.EVT_MENU, self.OnRefine, id=wxID_REFINE)
    132 #        self.UnDo = parent.Append(help='', id=wxID_UNDO, kind=wx.ITEM_NORMAL,
    133 #            text='UnDo')
    134 #        self.UnDo.Enable(False)
    135 #        self.Bind(wx.EVT_MENU, self.OnUnDo, id=wxID_UNDO)
    136132       
    137133    def _init_coll_Import_Items(self,parent):
     
    140136        self.ImportPDB = parent.Append(help='Import phase data from PDB file',
    141137            id=wxID_IMPORTPDB, kind=wx.ITEM_NORMAL,text='Import PDB Phase...')
     138        self.ImportCIF = parent.Append(help='Import phase data from cif file',id=wxID_IMPORTCIF, kind=wx.ITEM_NORMAL,
     139            text='Import CIF Phase...')
    142140        self.ImportPattern = parent.Append(help='',id=wxID_IMPORTPATTERN, kind=wx.ITEM_NORMAL,
    143141            text='Import Powder Pattern...')
    144142        self.ImportHKL = parent.Append(help='',id=wxID_IMPORTHKL, kind=wx.ITEM_NORMAL,
    145143            text='Import HKLs...')
    146         self.ImportCIF = parent.Append(help='',id=wxID_IMPORTCIF, kind=wx.ITEM_NORMAL,
    147             text='Import CIF...')
    148144        self.Bind(wx.EVT_MENU, self.OnImportPhase, id=wxID_IMPORTPHASE)
    149145        self.Bind(wx.EVT_MENU, self.OnImportPDB, id=wxID_IMPORTPDB)
     146        self.Bind(wx.EVT_MENU, self.OnImportCIF, id=wxID_IMPORTCIF)
    150147        self.Bind(wx.EVT_MENU, self.OnImportPattern, id=wxID_IMPORTPATTERN)
    151148        self.Bind(wx.EVT_MENU, self.OnImportHKL, id=wxID_IMPORTHKL)
    152         self.Bind(wx.EVT_MENU, self.OnImportCIF, id=wxID_IMPORTCIF)
    153149
    154150    def _init_coll_Export_Items(self,parent):
     
    646642                    Xsum = []
    647643                    Ysum = []
    648                     Wsum = []
     644                    Vsum = []
    649645                    result = dlg.GetData()
    650646                    for i,item in enumerate(result[:-1]):
     
    654650                            Comments.append("%10.3f %s" % (scale,' * '+name))
    655651                            x,y,w,yc,yb,yd = data
     652                            v = 1./w
    656653                            if lenX:
    657654                                if lenX != len(x):
     
    671668                                    for j,yi in enumerate(y):
    672669                                         Ysum[j] += scale*yi
     670                                         Vsum[j] += abs(scale)*v[j]
    673671                            else:
    674672                                Xminmax = [x[0],x[-1]]
     
    677675                                    Xsum.append(x[j])
    678676                                    Ysum.append(scale*yi)
    679                                     Wsum.append(w[j])
     677                                    Vsum.append(abs(scale*v[j]))
     678                    Wsum = 1./np.array(Vsum)
    680679                    outname = 'PWDR '+result[-1]
    681680                    Id = 0
     
    10691068            try:
    10701069                if dlg.ShowModal() == wx.ID_OK:
    1071                     self.CIFfile = dlg.GetPath()
     1070                    CIFfile = dlg.GetPath()
    10721071                    self.dirname = dlg.GetDirectory()
     1072                    Phase = G2IO.ReadCIFPhase(CIFfile)
    10731073            finally:
    10741074                dlg.Destroy()
     1075            if Phase:
     1076                PhaseName = Phase['General']['Name']
     1077                if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
     1078                    sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
     1079                else:
     1080                    sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
     1081                sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
     1082                self.PatternTree.SetItemPyData(sub,Phase)       
    10751083       
    10761084    def OnExportPattern(self,event):
     
    11291137        event.Skip()
    11301138       
    1131 #    def OnUnDo(self,event):
    1132 #        self.DoUnDo()
    1133 #        self.UnDo.Enable(False)
    1134 #       
    11351139    def OnRefine(self,event):
    11361140        #works - but it'd be better if it could restore plots
     
    11471151            dlg.Destroy()
    11481152       
    1149 #    def DoUnDo(self):
    1150 #        print 'Undo last refinement'
    1151 #        file = open(self.undofile,'rb')
    1152 #        PatternId = self.PatternId
    1153 #        for item in ['Background','Instrument Parameters','Peak List']:
    1154 #            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item),cPickle.load(file))
    1155 #            if self.dataDisplay.GetName() == item:
    1156 #                if item == 'Background':
    1157 #                    G2pdG.UpdateBackgroundGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
    1158 #                elif item == 'Instrument Parameters':
    1159 #                    G2pdG.UpdateInstrumentGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
    1160 #                elif item == 'Peak List':
    1161 #                    G2pdG.UpdatePeakGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
    1162 #            print item,' recovered'
    1163 #        file.close()
    1164 #       
    1165 #    def SaveState(self):
    1166 #        self.undofile = self.dirname+'\\GSASII.save'
    1167 #        file = open(self.undofile,'wb')
    1168 #        PatternId = self.PatternId
    1169 #        for item in ['Background','Instrument Parameters','Peak List']:
    1170 #            cPickle.dump(self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId,item)),file,1)
    1171 #        file.close()
    1172 #        self.UnDo.Enable(True)
    1173 #               
    11741153    def ErrorDialog(self,title,message):
    11751154        dlg = wx.MessageDialog(self, message, title,  wx.OK)
  • trunk/GSASIIIO.py

    r167 r171  
    758758        file.write(powderfile+'\n')
    759759        file.write('BANK 1 %d %d CONS %.2f %.2f 0 0 FXYE\n'%(len(x),len(x),\
    760             100.*x[0],100.*(x[1]-x[0])))       
    761         XYW = zip(x,y,w)
    762         for X,Y,W in XYW:
    763             file.write("%15.6g %15.6g %15.6g\n" % (100.*X,Y,W))
     760            100.*x[0],100.*(x[1]-x[0])))
     761        s = list(np.sqrt(1./np.array(w)))       
     762        XYW = zip(x,y,s)
     763        for X,Y,S in XYW:
     764            file.write("%15.6g %15.6g %15.6g\n" % (100.*X,Y,S))
    764765        file.close()
    765766    finally:
     
    930931            SpGrp = S[55:65]
    931932            E,SGData = G2spc.SpcGroup(SpGrp)
     933            if E:
     934                print ' ERROR in space group symbol ',SpGrp,' in file ',filename
     935                print ' N.B.: make sure spaces separate axial fields in symbol'
     936                print G2spc.SGErrors(E)
     937                return None
     938            SGlines = G2spc.SGPrint(SGData)
     939            for line in SGlines: print line
    932940            S = file.readline()
    933941        elif 'SCALE' in S[:5]:
     
    973981    return Phase
    974982   
    975 def ReadCIFAtoms(self,data):
    976     print data
     983def ReadCIFPhase(filename):
     984    anisoNames = ['aniso_u_11','aniso_u_22','aniso_u_33','aniso_u_12','aniso_u_13','aniso_u_23']
     985    file = open(filename, 'Ur')
     986    Phase = {}
     987    Title = ospath.split(filename)[-1]
     988    print '\n Reading cif file: ',Title
     989    Compnd = ''
     990    Atoms = []
     991    A = np.zeros(shape=(3,3))
     992    S = file.readline()
     993    while S:
     994        if '_symmetry_space_group_name_H-M' in S:
     995            SpGrp = S.split("_symmetry_space_group_name_H-M")[1].strip().strip('"').strip("'")
     996            E,SGData = G2spc.SpcGroup(SpGrp)
     997            if E:
     998                print ' ERROR in space group symbol ',SpGrp,' in file ',filename
     999                print ' N.B.: make sure spaces separate axial fields in symbol'
     1000                print G2spc.SGErrors(E)
     1001                return None
     1002            S = file.readline()
     1003        elif '_cell' in S:
     1004            if '_cell_length_a' in S:
     1005                a = S.split('_cell_length_a')[1].strip().strip('"').strip("'").split('(')[0]
     1006            elif '_cell_length_b' in S:
     1007                b = S.split('_cell_length_b')[1].strip().strip('"').strip("'").split('(')[0]
     1008            elif '_cell_length_c' in S:
     1009                c = S.split('_cell_length_c')[1].strip().strip('"').strip("'").split('(')[0]
     1010            elif '_cell_angle_alpha' in S:
     1011                alp = S.split('_cell_angle_alpha')[1].strip().strip('"').strip("'").split('(')[0]
     1012            elif '_cell_angle_beta' in S:
     1013                bet = S.split('_cell_angle_beta')[1].strip().strip('"').strip("'").split('(')[0]
     1014            elif '_cell_angle_gamma' in S:
     1015                gam = S.split('_cell_angle_gamma')[1].strip().strip('"').strip("'").split('(')[0]
     1016            S = file.readline()
     1017        elif 'loop_' in S:
     1018            labels = {}
     1019            i = 0
     1020            while S:
     1021                S = file.readline()
     1022                if '_atom_site' in S.strip()[:10]:
     1023                    labels[S.strip().split('_atom_site_')[1].lower()] = i
     1024                    i += 1
     1025                else:
     1026                    break
     1027            if labels:
     1028                if 'aniso_label' not in labels:
     1029                    while S:
     1030                        atom = ['','','',0,0,0,0,'','','I',0.01,0,0,0,0,0,0]
     1031                        S.strip()
     1032                        if len(S.split()) != len(labels):
     1033                            if 'loop_' in S:
     1034                                break
     1035                            S += file.readline().strip()
     1036                        data = S.split()
     1037                        if len(data) != len(labels):
     1038                            break
     1039                        for key in labels:
     1040                            if key == 'type_symbol':
     1041                                atom[1] = data[labels[key]]
     1042                            elif key == 'label':
     1043                                atom[0] = data[labels[key]]
     1044                            elif key == 'fract_x':
     1045                                atom[3] = float(data[labels[key]].split('(')[0])
     1046                            elif key == 'fract_y':
     1047                                atom[4] = float(data[labels[key]].split('(')[0])
     1048                            elif key == 'fract_z':
     1049                                atom[5] = float(data[labels[key]].split('(')[0])
     1050                            elif key == 'occupancy':
     1051                                atom[6] = float(data[labels[key]].split('(')[0])
     1052                            elif key == 'thermal_displace_type':
     1053                                if data[labels[key]].lower() == 'uiso':
     1054                                    atom[9] = 'I'
     1055                                    atom[10] = float(data[labels['u_iso_or_equiv']].split('(')[0])
     1056                                else:
     1057                                    atom[9] = 'A'
     1058                                    atom[10] = 0.0
     1059                                   
     1060                        atom[7],atom[8] = G2spc.SytSym(atom[3:6],SGData)
     1061                        atom.append(ran.randint(0,sys.maxint))
     1062                        Atoms.append(atom)
     1063                        S = file.readline()
     1064                else:
     1065                    while S:
     1066                        S.strip()
     1067                        data = S.split()
     1068                        if len(data) != len(labels):
     1069                            break
     1070                        name = data[labels['aniso_label']]
     1071                        for atom in Atoms:
     1072                            if name == atom[0]:
     1073                                for i,uname in enumerate(anisoNames):
     1074                                    atom[i+11] = float(data[labels[uname]].split('(')[0])
     1075                        S = file.readline()
     1076                                                                       
     1077        else:           
     1078            S = file.readline()
     1079    file.close()
     1080    if Title:
     1081        PhaseName = Title
     1082    else:
     1083        PhaseName = 'None'
     1084    SGlines = G2spc.SGPrint(SGData)
     1085    for line in SGlines: print line
     1086    cell = [float(a),float(b),float(c),float(alp),float(bet),float(gam)]
     1087    Volume = G2lat.calc_V(G2lat.cell2A(cell))
     1088    Phase['General'] = {'Name':PhaseName,'Type':'nuclear','SGData':SGData,
     1089        'Cell':[False,]+cell+[Volume,]}
     1090    Phase['Atoms'] = Atoms
     1091    Phase['Drawing'] = {}
     1092    Phase['Histograms'] = {}
     1093   
     1094    return Phase
  • trunk/GSASIIplot.py

    r169 r171  
    293293                self.Weight = True
    294294            print 'plot weighting:',self.Weight
    295         elif event.key == 'u' and self.Offset < 100.:
    296             self.Offset += 1.
    297         elif event.key == 'd' and self.Offset > 0.:
    298             self.Offset -= 1.
     295        elif event.key == 'u':
     296            if self.Contour:
     297                self.Cmax = min(1.0,self.Cmax*1.1)
     298            elif self.Offset < 100.:
     299                self.Offset += 1.
     300        elif event.key == 'd':
     301            if self.Contour:
     302                self.Cmax = max(0.0,self.Cmax*0.9)
     303            elif self.Offset > 0.:
     304                self.Offset -= 1.
    299305        elif event.key == 'c':
    300306            if self.Contour:
     
    327333                if abs(xpos) > 0.:                  #avoid possible singularity at beam center
    328334                    dsp = wave/(2.*sind(abs(xpos)/2.0))
    329                 self.G2plotNB.status.SetStatusText('2-theta =%9.3f d =%9.5f Intensity =%9.1f'%(xpos,dsp,ypos),1)
     335                if self.Contour:
     336                    self.G2plotNB.status.SetStatusText('2-theta =%9.3f d =%9.5f pattern ID =%5d Max contour =%9.1f'%(xpos,dsp,int(ypos),self.Cmax*Ymax),1)
     337                else:
     338                    self.G2plotNB.status.SetStatusText('2-theta =%9.3f d =%9.5f Intensity =%9.1f'%(xpos,dsp,ypos),1)
    330339                if self.itemPicked:
    331340                    Page.canvas.SetToolTipString('%9.3f'%(xpos))
     
    381390    except ValueError,error:
    382391        newPlot = True
     392        self.Cmax = 1.0
    383393        Plot = self.G2plotNB.addMpl('Powder Patterns').gca()
    384394        plotNum = self.G2plotNB.plotList.index('Powder Patterns')
     
    478488    if self.Contour:
    479489        acolor = mpl.cm.get_cmap('Paired')
    480         Plot.imshow(ContourZ,cmap=acolor,vmin=0,vmax=Ymax,interpolation='nearest',
     490        Plot.imshow(ContourZ,cmap=acolor,vmin=0,vmax=Ymax*self.Cmax,interpolation='nearest',
    481491            extent=[ContourX[0],ContourX[-1],ContourY[0],ContourY[-1]],aspect='auto')
    482492        newPlot = True
     
    11281138    drawingData = data['Drawing']
    11291139    drawAtoms = drawingData['Atoms']
     1140    cx,ct,cs = drawingData['atomPtrs']
    11301141    Wt = [255,255,255]
    11311142    Rd = [255,0,0]
     
    11571168        self.G2plotNB.status.SetStatusText('Drawing saved to: '+Fname,1)
    11581169   
     1170    def GetTruePosition(xy):
     1171        View = glGetIntegerv(GL_VIEWPORT)
     1172        Proj = glGetDoublev(GL_PROJECTION_MATRIX)
     1173        Model = glGetDoublev(GL_MODELVIEW_MATRIX)
     1174        Zmax = 1.
     1175        for i,atom in enumerate(drawAtoms):
     1176            x,y,z = atom[cx:cx+3]
     1177            X,Y,Z = gluProject(x,y,z,Model,Proj,View)
     1178            XY = [int(X),int(View[3]-Y)]
     1179            if np.allclose(xy,XY,atol=10) and Z < Zmax:
     1180                Zmax = Z
     1181                SetSelectedAtoms(i)
     1182       
    11591183    def OnMouseDown(event):
    11601184        xy = event.GetPosition()
    1161         drawingData['Rotation'][3] = xy
     1185        if event.AltDown():
     1186            GetTruePosition(xy)
     1187        else:
     1188            drawingData['Rotation'][3] = xy
    11621189       
    11631190    def OnMouseWheel(event):
     
    11791206            panel[names.index('viewPoint')].SetValue('%.3f, %.3f, %.3f'%(VP[0],VP[1],VP[2]))
    11801207           
     1208    def SetSelectedAtoms(ind):
     1209        page = self.dataDisplay.GetSelection()
     1210        if self.dataDisplay.GetPageText(page) == 'Draw Atoms':
     1211            self.dataDisplay.GetPage(page).SelectRow(ind)      #this is the Atoms grid in Draw Atoms
     1212       
     1213           
    11811214    def GetSelectedAtoms():
    11821215        page = self.dataDisplay.GetSelection()
     
    11861219        return Ind
    11871220                                       
    1188     def OnKey(event):
     1221    def OnKey(event):           #on key UP!!
    11891222        keyCode = event.GetKeyCode()
    11901223        if keyCode > 255:
     
    11921225        key,xyz = chr(keyCode),event.GetPosition()
    11931226        indx = drawingData['selectedAtoms']
    1194         cx,ct,cs = drawingData['atomPtrs']
    11951227        if key in ['c','C']:
    11961228            drawingData['viewPoint'] = [[.5,.5,.5],[0,0]]
     
    12301262                    pI[0] = len(drawAtoms)-1
    12311263            drawingData['viewPoint'] = [[Tx,Ty,Tz],pI]
    1232             SetViewPointText(drawingData['viewPoint'][0])
    1233            
    1234         elif key in ['a','A']:
    1235             print xyz,GetTruePosition(xyz)
     1264            SetViewPointText(drawingData['viewPoint'][0])           
    12361265        Draw()
    12371266           
     
    12431272            if event.LeftIsDown():
    12441273                SetNewPos(newxy)
    1245         if event.Dragging():
     1274        if event.Dragging() and not event.AltDown():
    12461275            if event.LeftIsDown():
    12471276                SetRotation(newxy)
     
    12511280                SetRotationZ(newxy)
    12521281            Draw()
    1253        
    1254     def GetTruePosition(xy):
    1255         View = glGetIntegerv(GL_VIEWPORT)
    1256         x,y,z = gluUnProject(xy[0],xy[1],0,view=View)
    1257         return x,y,z
    12581282       
    12591283    def SetBackground():
     
    14791503       
    14801504        SetBackground()
     1505        glInitNames()
     1506        glPushName(0)
    14811507       
    14821508        glMatrixMode(GL_PROJECTION)
     
    15221548                color = np.array(Gr)/255.
    15231549            radius = 0.5
     1550            if atom[cs] != '':
     1551                glLoadName(atom[-2])
    15241552            if 'balls' in atom[cs]:
    15251553                vdwScale = drawingData['vdwScale']
  • trunk/GSASIIpwdGUI.py

    r169 r171  
    4545        file.close()
    4646       
    47     def SaveState(self):
     47    def SaveState():
    4848        self.undofile = self.dirname+'\\GSASII.save'
    4949        file = open(self.undofile,'wb')
     
    5555               
    5656    def OnPeakFit(event):
    57         self.SaveState()
     57        SaveState()
    5858        print 'Peak Fitting - Do one cycle of peak fitting'
    5959        PatternId = self.PatternId
     
    8787       
    8888    def OnAutoPeakFit(event):
    89         self.SaveState()
     89        SaveState()
    9090        print 'AutoPeak Fitting - run until minimized'
    9191        PatternId = self.PatternId
Note: See TracChangeset for help on using the changeset viewer.