Changeset 31
- Timestamp:
- Feb 20, 2010 2:09:56 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASII.py
r29 r31 56 56 57 57 [wxID_GSASIIFILECLOSE, wxID_GSASIIFILEEXIT, wxID_GSASIIFILEOPEN, 58 wxID_GSASIIFILESAVE, wxID_GSASIIFILESAVEAS, wxID_GSASIIPEAKFIT, 59 wxID_GSASIIINDEX, wxID_GSASIIAUTOPEAKFIT, wxID_GSASIIUNDO, wxID_GSASIIREFINECELL, 60 ] = [wx.NewId() for _init_coll_File_Items in range(10)] 58 wxID_GSASIIFILESAVE, wxID_GSASIIFILESAVEAS, wxID_GSASIIUNDO, 59 ] = [wx.NewId() for _init_coll_File_Items in range(6)] 61 60 62 61 [wxID_GSASIIPWDRREAD,wxID_GSASIISNGLREAD,wxID_GSASIIADDPHASE,wxID_GSASIIDELETEPHASE, … … 135 134 self.UnDo = parent.Append(help='', id=wxID_GSASIIUNDO, kind=wx.ITEM_NORMAL, 136 135 text='UnDo') 137 self.PeakFit = parent.Append(help='', id=wxID_GSASIIPEAKFIT, kind=wx.ITEM_NORMAL,138 text='PeakFit')139 self.AutoPeakFit = parent.Append(help='', id=wxID_GSASIIAUTOPEAKFIT, kind=wx.ITEM_NORMAL,140 text='AutoPeakFit')141 self.RefineCell = parent.Append(help='', id=wxID_GSASIIREFINECELL, kind=wx.ITEM_NORMAL,142 text='RefineCell')143 self.IndexPeaks = parent.Append(help='', id=wxID_GSASIIINDEX, kind=wx.ITEM_NORMAL,144 text='IndexPeaks')145 136 self.UnDo.Enable(False) 146 self.PeakFit.Enable(False)147 self.AutoPeakFit.Enable(False)148 self.IndexPeaks.Enable(False)149 self.RefineCell.Enable(False)150 137 self.Bind(wx.EVT_MENU, self.OnUnDo, id=wxID_GSASIIUNDO) 151 self.Bind(wx.EVT_MENU, self.OnPeakFit, id=wxID_GSASIIPEAKFIT)152 self.Bind(wx.EVT_MENU, self.OnAutoPeakFit, id=wxID_GSASIIAUTOPEAKFIT)153 self.Bind(wx.EVT_MENU, self.OnRefineCell, id=wxID_GSASIIREFINECELL)154 self.Bind(wx.EVT_MENU, self.OnIndexPeaks, id=wxID_GSASIIINDEX)155 138 156 139 def _init_coll_Import_Items(self,parent): … … 269 252 self.SCevent = [] 270 253 self.Sngl = 0 254 self.ifGetRing = False 271 255 272 256 def OnSize(self,event): … … 1029 1013 file.close() 1030 1014 1031 def OnPeakFit(self,event):1032 self.SaveState()1033 print 'Peak Fitting - Do one cycle of peak fitting'1034 PatternId = self.PatternId1035 PickId = self.PickId1036 peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List'))1037 if not peaks:1038 self.ErrorDialog('No peaks!','Nothing to fit!')1039 return1040 background = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Background'))[0]1041 limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Limits'))[1]1042 inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))1043 data = self.PatternTree.GetItemPyData(PatternId)[1]1044 OK,smin,Rwp,runtime,GoOn = G2cmp.DoPeakFit(peaks,background,limits,inst,data)1045 G2gd.UpdatePeakGrid(self,peaks)1046 self.PlotPatterns()1047 if not OK:1048 print 'Refinement failed'1049 dlg = wx.MessageDialog(self, 'Do you want to reload now?', 'Refinement failed', wx.YES_NO)1050 try:1051 if dlg.ShowModal() == wx.ID_YES:1052 self.DoUnDo()1053 self.UnDo.Enable(False)1054 finally:1055 dlg.Destroy()1056 else:1057 print "%s%7.2f%s%12.6g" % ('Rwp = ',Rwp,'%, Smin = ',smin)1058 print "%s%8.3f%s " % ('fitpeak time =',runtime,'s')1059 print 'finished'1060 return1061 1062 def OnAutoPeakFit(self,event):1063 self.SaveState()1064 print 'AutoPeak Fitting - run until minimized'1065 PatternId = self.PatternId1066 PickId = self.PickId1067 peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List'))1068 if not peaks:1069 self.ErrorDialog('No peaks!','Nothing to fit!')1070 return1071 background = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Background'))[0]1072 limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Limits'))[1]1073 inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))1074 data = self.PatternTree.GetItemPyData(PatternId)[1]1075 smin = 1.0e101076 GoOn = True1077 while GoOn:1078 osmin = smin1079 OK,smin,Rwp,runtime,GoOn = G2cmp.DoPeakFit(peaks,background,limits,inst,data)1080 print GoOn1081 G2gd.UpdatePeakGrid(self,peaks)1082 if not OK:1083 break1084 self.PlotPatterns()1085 print "%s%7.2f%s%12.6g" % ('Rwp = ',Rwp,'%, Smin = ',smin)1086 rat = (osmin-smin)/smin1087 if rat < 1.0e-4: GoOn = False1088 if not OK:1089 print 'Refinement failed'1090 dlg = wx.MessageDialog(self, 'Do you want to reload now?', 'Refinement failed', wx.YES_NO)1091 try:1092 if dlg.ShowModal() == wx.ID_YES:1093 self.DoUnDo()1094 self.UnDo.Enable(False)1095 finally:1096 dlg.Destroy()1097 else:1098 print "%s%8.3f%s " % ('fitpeak time =',runtime,'s per cycle')1099 print 'finished'1100 return1101 1102 def OnRefineCell(self,event):1103 def cellPrint(ibrav,A):1104 cell = G2cmp.A2cell(A)1105 Vol = G2cmp.calc_V(A)1106 if ibrav in [0,1,2]:1107 print "%s%10.6f" % ('a =',cell[0])1108 elif ibrav in [3,4,5,6]:1109 print "%s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],' c =',cell[2],' volume =',Vol)1110 elif ibrav in [7,8,9,10]:1111 print "%s%10.6f %s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],' volume =',Vol)1112 elif ibrav in [11,12]:1113 print "%s%10.6f %s%10.6f %s%10.6f %s%8.3f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],'beta =',cell[4],' volume =',Vol)1114 else:1115 print "%s%10.6f %s%10.6f %s%10.6f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2])1116 print "%s%8.3f %s%8.3f %s%8.3f %s%12.3f" % ('alpha =',cell[3],'beta =',cell[4],'gamma =',cell[5],' volume =',Vol)1117 1118 bravaisSymb = ['Fm3m','Im3m','Pm3m','R3-H','P6/mmm','I4/mmm',1119 'P4/mmm','Fmmm','Immm','Cmmm','Pmmm','C2/m','P2/m','P1']1120 PatternId = self.PatternId1121 PickId = self.PickId1122 peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))1123 if not peaks:1124 self.ErrorDialog('No peaks!', 'Nothing to refine!')1125 return1126 print 'Refine cell'1127 inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]1128 controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))1129 cell = controls[6:12]1130 A = G2cmp.cell2A(cell)1131 print controls[5]1132 ibrav = bravaisSymb.index(controls[5])1133 dmin = G2cmp.getDmin(peaks)-0.051134 Lhkl,M20,X20 = G2cmp.refinePeaks(peaks,ibrav,A)1135 controls[6:12] = G2cmp.A2cell(A)1136 controls[12] = G2cmp.calc_V(A)1137 data = [controls,bravais,cells,dmin]1138 self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)1139 self.HKL = G2cmp.GenHBravais(dmin,ibrav,A)1140 G2gd.UpdateUnitCellsGrid(self,data)1141 print "%s%10.3f" % ('refinement M20 = ',M20)1142 print 'unindexed lines = ',X201143 cellPrint(ibrav,A)1144 for hkl in self.HKL:1145 hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))1146 self.PlotPatterns()1147 1148 1015 def SaveState(self): 1149 1016 file = open('GSASII.save','wb') … … 1154 1021 self.UnDo.Enable(True) 1155 1022 1156 def OnIndexPeaks(self,event):1157 PatternId = self.PatternId1158 peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))1159 if not peaks:1160 self.ErrorDialog('No peaks!', 'Nothing to index!')1161 return1162 inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]1163 print 'Peak Indexing'1164 try:1165 controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))1166 cells = []1167 except ValueError:1168 self.ErrorDialog('Error','Need to set controls in Unit Cell List first')1169 return1170 if True not in bravais:1171 self.ErrorDialog('Error','No Bravais lattices selected')1172 return1173 self.IndexPeaks.Enable(False)1174 self.RefineCell.Enable(False)1175 OK,dmin,cells = G2cmp.DoIndexPeaks(peaks,inst,controls,bravais)1176 if OK:1177 data = [controls,bravais,cells,dmin]1178 self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)1179 G2gd.UpdateUnitCellsGrid(self,data)1180 bestCell = cells[0]1181 if bestCell[0] > 10.:1182 self.HKL = G2cmp.GenHBravais(dmin,bestCell[2],G2cmp.cell2A(bestCell[3:9]))1183 for hkl in self.HKL:1184 hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))1185 self.PlotPatterns()1186 self.RefineCell.Enable(True)1187 self.IndexPeaks.Enable(True)1188 1189 1023 def ClearEventList(self,eventList): 1190 1024 if eventList: … … 1288 1122 def OnImMotion(event): 1289 1123 self.pdplot.canvas.SetToolTipString('') 1124 size = len(self.ImageZ) 1290 1125 if (xlim[0] < event.xdata < xlim[1]) & (ylim[0] > event.ydata > ylim[1]): 1291 1126 item = self.itemPicked … … 1323 1158 cent = Data['center'] = [Xpos*pixelSize[0]/1000.,Ypos*pixelSize[1]/1000.] #convert to mm 1324 1159 self.centText.SetValue(("%8.3f,%8.3f" % (cent[0],cent[1]))) 1325 elif event.key == 'r':1326 Xpos,Ypos,I,J = G2cmp.ImageLocalMax(self.ImageZ,20,Xpos,Ypos)1327 if I and J:1328 xpos = Xpos*pixelSize[0]/1000.1329 ypos = Ypos*pixelSize[1]/1000.1330 Data['ring'].append([xpos,ypos])1331 elif event.key == 'd':1332 scale = self.imScale*pixelSize[0]/1000.1333 xypos = [event.xdata*scale,event.ydata*scale]1334 rings = Data['ring']1335 for ring in rings:1336 if np.allclose(ring,xypos,.01,0):1337 rings.remove(ring)1338 1160 elif event.key == 'm': 1339 1161 xpos = Xpos*pixelSize[0]/1000. … … 1343 1165 1344 1166 def OnImPick(event): 1167 if self.PatternTree.GetItemText(self.PickId) != 'Image Controls': 1168 return 1345 1169 if self.itemPicked is not None: return 1346 1170 pick = event.artist … … 1348 1172 1349 1173 def OnImRelease(event): 1350 if self.itemPicked is None or self.PatternTree.GetItemText(self.PickId) != 'Image Controls': return 1174 if self.PatternTree.GetItemText(self.PickId) != 'Image Controls': 1175 return 1351 1176 Data = self.PatternTree.GetItemPyData(self.PickId) 1352 xpos = event.xdata 1353 if xpos: #avoid out of frame mouse position 1354 xcent,ycent = Data['center'] 1355 xcent *= scalex 1356 ycent *= scaley 1357 ypos = event.ydata 1358 xpos -= xcent 1359 ypos -= ycent 1360 radius = math.sqrt(xpos**2+ypos**2) 1361 xpos /= radius 1362 ypos /= radius 1363 ang = int(atan2d(-ypos,xpos)) 1364 if 'Line2D' in str(self.itemPicked): 1365 if 'line2' in str(self.itemPicked) and not Data['fullIntegrate']: 1366 Data['LRazimuth'][0] = ang 1367 elif 'line3' in str(self.itemPicked) and not Data['fullIntegrate']: 1368 Data['LRazimuth'][1] = ang 1369 elif 'line0' in str(self.itemPicked): 1370 Data['IOradii'][0] = radius/scalex 1371 elif 'line1' in str(self.itemPicked): 1372 Data['IOradii'][1] = radius/scalex 1373 if Data['LRazimuth'][1] < Data['LRazimuth'][0]: 1374 Data['LRazimuth'][1] += 360 1375 if Data['IOradii'][0] > Data['IOradii'][1]: 1376 Data['IOradii'] = G2cmp.SwapXY(Data['IOradii'][0],Data['IOradii'][1]) 1377 self.IOradText.SetValue("%8.3f,%8.3f" % (Data['IOradii'][0],Data['IOradii'][1])) 1378 self.LRazim.SetValue("%6d,%6d" % (Data['LRazimuth'][0],Data['LRazimuth'][1])) 1379 elif 'Text' in str(self.itemPicked) and Data['refine'][0]: 1380 cent = Data['center'] = [event.xdata/scalex,event.ydata/scalex] 1381 try: 1382 self.centText.SetValue(("%8.3f,%8.3f" % (cent[0],cent[1]))) 1383 except AttributeError: 1384 pass 1385 self.PlotImage() 1386 self.itemPicked = None 1177 pixelSize = Data['pixelSize'] 1178 if self.itemPicked is None: 1179 size = len(self.ImageZ) 1180 Xpos = event.xdata 1181 if Xpos and self.ifGetRing: 1182 Xpos = int(Xpos)*self.imScale 1183 else: #got point out of frame 1184 return 1185 Ypos = int(event.ydata)*self.imScale 1186 if Ypos and not self.pdplot.canvas.toolbar._active: #make sure zoom/pan not selected 1187 if event.button == 1: 1188 Xpos,Ypos,I,J = G2cmp.ImageLocalMax(self.ImageZ,20,Xpos,Ypos) 1189 if I and J: 1190 xpos = Xpos*pixelSize[0]/1000. 1191 ypos = Ypos*pixelSize[1]/1000. 1192 Data['ring'].append([xpos,ypos]) 1193 self.PlotImage() 1194 return 1195 else: 1196 xpos = event.xdata 1197 if xpos: #avoid out of frame mouse position 1198 ypos = event.ydata 1199 if self.ifGetRing: 1200 scale = self.imScale*pixelSize[0]/1000. 1201 xypos = [xpos*scale,ypos*scale] 1202 rings = Data['ring'] 1203 for ring in rings: 1204 if np.allclose(ring,xypos,.01,0): 1205 rings.remove(ring) 1206 else: 1207 xcent,ycent = Data['center'] 1208 xcent *= scalex 1209 ycent *= scaley 1210 xpos -= xcent 1211 ypos -= ycent 1212 radius = math.sqrt(xpos**2+ypos**2) 1213 xpos /= radius 1214 ypos /= radius 1215 ang = int(atan2d(-ypos,xpos)) 1216 if 'Line2D' in str(self.itemPicked): 1217 if 'line2' in str(self.itemPicked) and not Data['fullIntegrate']: 1218 Data['LRazimuth'][0] = ang 1219 elif 'line3' in str(self.itemPicked) and not Data['fullIntegrate']: 1220 Data['LRazimuth'][1] = ang 1221 elif 'line0' in str(self.itemPicked): 1222 Data['IOradii'][0] = radius/scalex 1223 elif 'line1' in str(self.itemPicked): 1224 Data['IOradii'][1] = radius/scalex 1225 if Data['LRazimuth'][1] < Data['LRazimuth'][0]: 1226 Data['LRazimuth'][1] += 360 1227 if Data['IOradii'][0] > Data['IOradii'][1]: 1228 Data['IOradii'] = G2cmp.SwapXY(Data['IOradii'][0],Data['IOradii'][1]) 1229 self.IOradText.SetValue("%8.3f,%8.3f" % (Data['IOradii'][0],Data['IOradii'][1])) 1230 self.LRazim.SetValue("%6d,%6d" % (Data['LRazimuth'][0],Data['LRazimuth'][1])) 1231 # elif 'Text' in str(self.itemPicked) and Data['refine'][0]: 1232 # cent = Data['center'] = [event.xdata/scalex,event.ydata/scalex] 1233 # try: 1234 # self.centText.SetValue(("%8.3f,%8.3f" % (cent[0],cent[1]))) 1235 # except AttributeError: 1236 # pass 1237 else: 1238 print event.xdata,event.ydata,event.button 1239 self.PlotImage() 1240 self.itemPicked = None 1387 1241 1388 1242 newPlot = False … … 1434 1288 self.Img = ax.imshow(self.ImageZ[::self.imScale,::self.imScale], \ 1435 1289 aspect='equal',origin='upper',cmap=acolor, \ 1436 interpolation='nearest',vmin=Imin,vmax=Imax )1290 interpolation='nearest',vmin=Imin,vmax=Imax,picker=1) 1437 1291 ax.text(xcent,ycent,'+',ha='center',va='center',picker=3) 1438 1292 if Data['showLines']: … … 1459 1313 xring *= scalex 1460 1314 yring *= scaley 1461 ax.text(xring,yring,'+', ha='center',va='center',picker=3)1315 ax.text(xring,yring,'+',color='r',ha='center',va='center',picker=3) 1462 1316 # for ring in Data['rings']: 1463 1317 # for xring,yring in ring: -
trunk/GSASIIIO.py
r29 r31 504 504 items = line.split() 505 505 size = int(items[1]) 506 line = File.readline() 507 line = File.readline() 508 File.seek(4133) 506 pos = 4096 507 File.seek(pos) 508 line = File.read(8) 509 while 'CCP4' not in line: #get past overflow list for now 510 line = File.read(8) 511 pos += 8 512 pos += 37 513 File.seek(pos) 509 514 raw = File.read() 510 515 File.close() -
trunk/GSASIIcomp.py
r29 r31 1303 1303 print 'inner ring:',ellipse 1304 1304 data['center'] = ellipse[0] #not right!! (but useful for now) 1305 #data['ellipses'].append(ellipse[:])1305 data['ellipses'].append(ellipse[:]) 1306 1306 self.PlotImage() 1307 1307 1308 1308 #setup for calibration 1309 1309 data['rings'] = [] 1310 data['ellipses'] = [] 1310 1311 if not data['calibrant']: 1311 1312 print 'no calibration material selected' … … 1332 1333 ellipse = FitEllipse(Ring) 1333 1334 cosb = (1.-ellipse[2][0]**2/ellipse[2][1]**2)*cosd(tth)**2 1334 print 'for ring #',i, cosb,(ellipse[2][0]**2/ellipse[2][1])/tand(tth)1335 print 'for ring #',i,ellipse[1],cosb,(ellipse[2][0]**2/ellipse[2][1])/tand(tth) 1335 1336 data['ellipses'].append(copy.deepcopy(ellipse)) 1336 1337 self.PlotImage() -
trunk/GSASIIgrid.py
r29 r31 5 5 import math 6 6 import time 7 import cPickle 7 8 import GSASIIcomp as G2cmp 8 9 import GSASIIspc as G2spc … … 18 19 ] = [wx.NewId() for _init_coll_Atom_Items in range(2)] 19 20 20 [ wxID_IMCALIBRATE, wxID_IMINTEGRATE, 21 ] = [wx.NewId() for _init_coll_IMAGE_Items in range(2)] 21 [ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, 22 ] = [wx.NewId() for _init_coll_IMAGE_Items in range(3)] 23 24 [ wxID_UNDO,wxID_PEAKFIT,wxID_AUTOPEAKFIT, 25 ] = [wx.NewId() for _init_coll_PEAK_Items in range(3)] 26 27 [ wxID_INDEXPEAKS, wxID_REFINECELL, wxID_COPYCELL, 28 ] = [wx.NewId() for _init_coll_INDEX_Items in range(3)] 22 29 23 30 class DataFrame(wx.Frame): … … 31 38 parent.Append(menu=self.ImageEdit, title='Image Operations') 32 39 40 def _init_coll_PeakMenu(self,parent): 41 parent.Append(menu=self.PeakEdit, title='Peak Fitting') 42 43 def _init_coll_IndexMenu(self,parent): 44 parent.Append(menu=self.IndexEdit, title='Cell Index/Refine') 45 33 46 def _init_coll_Atom_Items(self,parent): 34 self.Add =parent.Append(help='',id=wxID_ATOMSEDITADD, kind=wx.ITEM_NORMAL,text='Append empty atom')35 self.Add =parent.Append(id=wxID_ATOMSEDITINSERT, kind=wx.ITEM_NORMAL,text='Insert empty atom',47 parent.Append(help='',id=wxID_ATOMSEDITADD, kind=wx.ITEM_NORMAL,text='Append empty atom') 48 parent.Append(id=wxID_ATOMSEDITINSERT, kind=wx.ITEM_NORMAL,text='Insert empty atom', 36 49 help='Double left click on atom row to Insert before') 37 50 38 51 def _init_coll_Image_Items(self,parent): 39 self.Add =parent.Append(help='',id=wxID_IMCALIBRATE, kind=wx.ITEM_NORMAL,text='Calibrate')40 self.Add = parent.Append(id=wxID_IMINTEGRATE, kind=wx.ITEM_NORMAL,text='Integrate',41 help='')52 parent.Append(help='',id=wxID_IMCALIBRATE, kind=wx.ITEM_NORMAL,text='Calibrate') 53 parent.Append(help='',id=wxID_IMCLEARCALIB, kind=wx.ITEM_NORMAL,text='Clear calibration') 54 parent.Append(help='',id=wxID_IMINTEGRATE, kind=wx.ITEM_NORMAL,text='Integrate') 42 55 43 56 def _init_coll_Peak_Items(self,parent): 57 self.UnDo = parent.Append(help='', id=wxID_UNDO, kind=wx.ITEM_NORMAL, 58 text='UnDo') 59 self.PeakFit = parent.Append(help='', id=wxID_PEAKFIT, kind=wx.ITEM_NORMAL, 60 text='PeakFit') 61 self.AutoPeakFit = parent.Append(help='', id=wxID_AUTOPEAKFIT, kind=wx.ITEM_NORMAL, 62 text='AutoPeakFit') 63 64 def _init_coll_Index_Items(self,parent): 65 self.IndexPeaks = parent.Append(help='', id=wxID_INDEXPEAKS, kind=wx.ITEM_NORMAL, 66 text='Index Cell') 67 self.CopyCell = parent.Append(help='', id=wxID_COPYCELL, kind=wx.ITEM_NORMAL, 68 text='Copy Cell') 69 self.RefineCell = parent.Append(help='', id=wxID_REFINECELL, kind=wx.ITEM_NORMAL, 70 text='Refine Cell') 71 44 72 def _init_utils(self): 45 73 self.BlankMenu = wx.MenuBar() … … 47 75 self.AtomsMenu = wx.MenuBar() 48 76 self.ImageMenu = wx.MenuBar() 77 self.PeakMenu = wx.MenuBar() 78 self.IndexMenu = wx.MenuBar() 49 79 self.AtomEdit = wx.Menu(title='') 50 80 self.ImageEdit = wx.Menu(title='') 81 self.PeakEdit = wx.Menu(title='') 82 self.IndexEdit = wx.Menu(title='') 51 83 self._init_coll_AtomsMenu(self.AtomsMenu) 52 84 self._init_coll_Atom_Items(self.AtomEdit) 53 85 self._init_coll_ImageMenu(self.ImageMenu) 54 86 self._init_coll_Image_Items(self.ImageEdit) 55 87 self._init_coll_PeakMenu(self.PeakMenu) 88 self._init_coll_Peak_Items(self.PeakEdit) 89 self._init_coll_IndexMenu(self.IndexMenu) 90 self._init_coll_Index_Items(self.IndexEdit) 91 self.UnDo.Enable(False) 92 self.PeakFit.Enable(False) 93 self.AutoPeakFit.Enable(False) 94 self.IndexPeaks.Enable(False) 95 self.CopyCell.Enable(False) 96 self.RefineCell.Enable(False) 97 56 98 def _init_ctrls(self, parent,name=None,size=None,pos=None): 57 99 wx.Frame.__init__(self,parent=parent,style=wx.DEFAULT_FRAME_STYLE ^ wx.CLOSE_BOX, … … 256 298 self.dataDisplay.Destroy() 257 299 300 def OnUnDo(event): 301 DoUnDo() 302 self.dataFrame.UnDo.Enable(False) 303 304 def DoUnDo(): 305 print 'Undo last refinement' 306 file = open('GSASII.save','rb') 307 PatternId = self.PatternId 308 for item in ['Background','Instrument Parameters','Peak List']: 309 self.PatternTree.SetItemPyData(GetPatternTreeItemId(self,PatternId, item),cPickle.load(file)) 310 if self.dataDisplay.GetName() == item: 311 if item == 'Background': 312 UpdateBackgroundGrid(self,self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, item))) 313 elif item == 'Instrument Parameters': 314 UpdateInstrumentGrid(self,self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, item))) 315 elif item == 'Peak List': 316 UpdatePeakGrid(self,self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, item))) 317 print item,' recovered' 318 file.close() 319 320 def OnPeakFit(event): 321 self.SaveState() 322 print 'Peak Fitting - Do one cycle of peak fitting' 323 PatternId = self.PatternId 324 PickId = self.PickId 325 peaks = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Peak List')) 326 if not peaks: 327 self.ErrorDialog('No peaks!','Nothing to fit!') 328 return 329 background = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Background'))[0] 330 limits = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Limits'))[1] 331 inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Instrument Parameters')) 332 data = self.PatternTree.GetItemPyData(PatternId)[1] 333 OK,smin,Rwp,runtime,GoOn = G2cmp.DoPeakFit(peaks,background,limits,inst,data) 334 UpdatePeakGrid(self,peaks) 335 self.PlotPatterns() 336 if not OK: 337 print 'Refinement failed' 338 dlg = wx.MessageDialog(self, 'Do you want to reload now?', 'Refinement failed', wx.YES_NO) 339 try: 340 if dlg.ShowModal() == wx.ID_YES: 341 DoUnDo() 342 self.dataFrame.UnDo.Enable(False) 343 finally: 344 dlg.Destroy() 345 else: 346 self.dataFrame.UnDo.Enable(True) 347 print "%s%7.2f%s%12.6g" % ('Rwp = ',Rwp,'%, Smin = ',smin) 348 print "%s%8.3f%s " % ('fitpeak time =',runtime,'s') 349 print 'finished' 350 return 351 352 def OnAutoPeakFit(event): 353 self.SaveState() 354 print 'AutoPeak Fitting - run until minimized' 355 PatternId = self.PatternId 356 PickId = self.PickId 357 peaks = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Peak List')) 358 if not peaks: 359 self.ErrorDialog('No peaks!','Nothing to fit!') 360 return 361 background = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Background'))[0] 362 limits = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Limits'))[1] 363 inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Instrument Parameters')) 364 data = self.PatternTree.GetItemPyData(PatternId)[1] 365 smin = 1.0e10 366 GoOn = True 367 while GoOn: 368 osmin = smin 369 OK,smin,Rwp,runtime,GoOn = G2cmp.DoPeakFit(peaks,background,limits,inst,data) 370 UpdatePeakGrid(self,peaks) 371 if not OK: 372 break 373 self.PlotPatterns() 374 print "%s%7.2f%s%12.6g" % ('Rwp = ',Rwp,'%, Smin = ',smin) 375 rat = (osmin-smin)/smin 376 if rat < 1.0e-4: GoOn = False 377 if not OK: 378 print 'Refinement failed' 379 dlg = wx.MessageDialog(self, 'Do you want to reload now?', 'Refinement failed', wx.YES_NO) 380 try: 381 if dlg.ShowModal() == wx.ID_YES: 382 DoUnDo() 383 self.dataFrame.UnDo.Enable(False) 384 finally: 385 dlg.Destroy() 386 else: 387 self.dataFrame.UnDo.Enable(True) 388 print "%s%8.3f%s " % ('fitpeak time =',runtime,'s per cycle') 389 print 'finished' 390 return 391 258 392 def RefreshPeakGrid(event): 259 393 event.StopPropagation() … … 325 459 self.PlotPatterns() 326 460 461 self.dataFrame.SetMenuBar(self.dataFrame.PeakMenu) 462 self.Bind(wx.EVT_MENU, OnUnDo, id=wxID_UNDO) 463 self.Bind(wx.EVT_MENU, OnPeakFit, id=wxID_PEAKFIT) 464 self.Bind(wx.EVT_MENU, OnAutoPeakFit, id=wxID_AUTOPEAKFIT) 465 if data: 466 self.dataFrame.PeakFit.Enable(True) 467 self.dataFrame.AutoPeakFit.Enable(True) 327 468 self.PickTable = [] 328 469 rowLabels = [] … … 335 476 wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL] 336 477 T = [] 337 for peak in data:T.append(peak[0]) 478 for peak in data: 479 T.append(peak[0]) 338 480 D = dict(zip(T,data)) 339 481 T.sort() … … 394 536 self.BackTable = Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types) 395 537 self.dataFrame.SetLabel('Background') 538 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu) 396 539 self.dataDisplay = GSGrid(parent=self.dataFrame) 397 540 self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshBackgroundGrid) … … 420 563 self.LimitsTable = Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types) 421 564 self.dataFrame.SetLabel('Limits') 565 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu) 422 566 self.dataDisplay = GSGrid(parent=self.dataFrame) 423 567 self.dataDisplay.SetTable(self.LimitsTable, True) … … 435 579 Xwid = 800 436 580 self.dataFrame.setSizePosLeft([Xwid,150]) 581 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu) 437 582 InstId = GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters') 438 583 def RefreshInstrumentGrid(event): … … 537 682 self.dataDisplay.Destroy() 538 683 self.dataFrame.setSizePosLeft([500,300]) 684 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu) 539 685 inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1] 540 686 self.IndexPeaksTable = [] … … 578 724 bravaisSymb = ['Fm3m','Im3m','Pm3m','R3-H','P6/mmm','I4/mmm', 579 725 'P4/mmm','Fmmm','Immm','Cmmm','Pmmm','C2/m','P2/m','P1'] 726 727 def OnRefineCell(event): 728 def cellPrint(ibrav,A): 729 cell = G2cmp.A2cell(A) 730 Vol = G2cmp.calc_V(A) 731 if ibrav in [0,1,2]: 732 print "%s%10.6f" % ('a =',cell[0]) 733 elif ibrav in [3,4,5,6]: 734 print "%s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],' c =',cell[2],' volume =',Vol) 735 elif ibrav in [7,8,9,10]: 736 print "%s%10.6f %s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],' volume =',Vol) 737 elif ibrav in [11,12]: 738 print "%s%10.6f %s%10.6f %s%10.6f %s%8.3f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],'beta =',cell[4],' volume =',Vol) 739 else: 740 print "%s%10.6f %s%10.6f %s%10.6f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2]) 741 print "%s%8.3f %s%8.3f %s%8.3f %s%12.3f" % ('alpha =',cell[3],'beta =',cell[4],'gamma =',cell[5],' volume =',Vol) 742 743 bravaisSymb = ['Fm3m','Im3m','Pm3m','R3-H','P6/mmm','I4/mmm', 744 'P4/mmm','Fmmm','Immm','Cmmm','Pmmm','C2/m','P2/m','P1'] 745 PatternId = self.PatternId 746 PickId = self.PickId 747 peaks = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Index Peak List')) 748 if not peaks: 749 self.ErrorDialog('No peaks!', 'Nothing to refine!') 750 return 751 print 'Refine cell' 752 inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1] 753 controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Unit Cells List')) 754 cell = controls[6:12] 755 A = G2cmp.cell2A(cell) 756 print controls[5] 757 ibrav = bravaisSymb.index(controls[5]) 758 dmin = G2cmp.getDmin(peaks)-0.05 759 Lhkl,M20,X20 = G2cmp.refinePeaks(peaks,ibrav,A) 760 controls[6:12] = G2cmp.A2cell(A) 761 controls[12] = G2cmp.calc_V(A) 762 data = [controls,bravais,cells,dmin] 763 self.PatternTree.SetItemPyData(GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data) 764 self.HKL = G2cmp.GenHBravais(dmin,ibrav,A) 765 UpdateUnitCellsGrid(self,data) 766 print "%s%10.3f" % ('refinement M20 = ',M20) 767 print 'unindexed lines = ',X20 768 cellPrint(ibrav,A) 769 for hkl in self.HKL: 770 hkl.append(2.0*asind(inst[1]/(2.*hkl[3]))) 771 self.PlotPatterns() 772 773 def OnIndexPeaks(event): 774 PatternId = self.PatternId 775 peaks = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Index Peak List')) 776 if not peaks: 777 self.ErrorDialog('No peaks!', 'Nothing to index!') 778 return 779 inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1] 780 print 'Peak Indexing' 781 try: 782 controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Unit Cells List')) 783 cells = [] 784 except ValueError: 785 self.ErrorDialog('Error','Need to set controls in Unit Cell List first') 786 return 787 if True not in bravais: 788 self.ErrorDialog('Error','No Bravais lattices selected') 789 return 790 self.dataFrame.IndexPeaks.Enable(False) 791 self.dataFrame.CopyCell.Enable(False) 792 OK,dmin,cells = G2cmp.DoIndexPeaks(peaks,inst,controls,bravais) 793 if OK: 794 data = [controls,bravais,cells,dmin] 795 self.PatternTree.SetItemPyData(GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data) 796 UpdateUnitCellsGrid(self,data) 797 bestCell = cells[0] 798 if bestCell[0] > 10.: 799 self.HKL = G2cmp.GenHBravais(dmin,bestCell[2],G2cmp.cell2A(bestCell[3:9])) 800 for hkl in self.HKL: 801 hkl.append(2.0*asind(inst[1]/(2.*hkl[3]))) 802 self.PlotPatterns() 803 self.dataFrame.CopyCell.Enable(True) 804 self.dataFrame.IndexPeaks.Enable(True) 805 580 806 def CopyUnitCell(event): 581 if event.GetCol() == 6: 582 row = event.GetRow() 583 controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId) 584 cell = cells[row][2:9] 585 controls[4] = 1 586 controls[5] = bravaisSymb[cell[0]] 587 controls[6:12] = cell[1:8] 588 controls[12] = G2cmp.calc_V(G2cmp.cell2A(controls[6:12])) 589 for i in range(4,13): 590 self.UnitCellsTable.SetValue(i,1,controls[i]) 591 self.PatternTree.SetItemPyData(UnitCellsId,[controls,bravais,cells,dmin]) 592 self.dataDisplay.ForceRefresh() 593 self.RefineCell.Enable(True) 807 controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId) 808 for Cell in cells: 809 if Cell[-1]: 810 break 811 cell = Cell[2:9] 812 controls[4] = 1 813 controls[5] = bravaisSymb[cell[0]] 814 controls[6:12] = cell[1:8] 815 controls[12] = G2cmp.calc_V(G2cmp.cell2A(controls[6:12])) 816 for i in range(4,13): 817 self.UnitCellsTable.SetValue(i,1,controls[i]) 818 self.PatternTree.SetItemPyData(UnitCellsId,[controls,bravais,cells,dmin]) 819 self.dataDisplay.ForceRefresh() 820 self.dataFrame.RefineCell.Enable(True) 821 594 822 def RefreshUnitCellsGrid(event): 595 823 cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)[2:] … … 671 899 self.dataDisplay.ForceRefresh() 672 900 if controls[4] and not False in controls[6:12]: 673 self. RefineCell.Enable(True)901 self.dataFrame.RefineCell.Enable(True) 674 902 else: 675 self. RefineCell.Enable(False)903 self.dataFrame.RefineCell.Enable(False) 676 904 data = [controls,bravais,cells,dmin] 677 905 self.PatternTree.SetItemPyData(UnitCellsId,data) … … 679 907 if self.dataDisplay: 680 908 self.dataDisplay.Destroy() 909 self.dataFrame.SetMenuBar(self.dataFrame.IndexMenu) 910 self.Bind(wx.EVT_MENU, OnIndexPeaks, id=wxID_INDEXPEAKS) 911 self.Bind(wx.EVT_MENU, CopyUnitCell, id=wxID_COPYCELL) 912 self.Bind(wx.EVT_MENU, OnRefineCell, id=wxID_REFINECELL) 681 913 self.UnitCellsTable = [] 682 914 controls,bravais,cells,dmin = data … … 735 967 self.dataDisplay.SetTable(self.UnitCellsTable, True) 736 968 self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshUnitCellsGrid) 737 self.dataDisplay.Bind(wg.EVT_GRID_CELL_RIGHT_DCLICK, CopyUnitCell)738 if cells:739 self.dataDisplay.GetGridWindow().SetToolTipString('Right d-click "use" box to copy cell to controls')740 969 self.dataDisplay.SetMargins(0,0) 741 970 self.dataDisplay.SetRowLabelSize(0) … … 762 991 self.dataDisplay.SetReadOnly(i,3,isReadOnly=True) 763 992 if cells: 993 self.dataFrame.CopyCell.Enable(True) 764 994 for r in range(max(len(cells),14)): 765 995 if r > 12: … … 775 1005 self.dataDisplay.AutoSizeColumns(False) 776 1006 if controls[4] and not False in controls[6:12]: 777 self. RefineCell.Enable(True)1007 self.dataFrame.RefineCell.Enable(True) 778 1008 else: 779 self. RefineCell.Enable(False)1009 self.dataFrame.RefineCell.Enable(False) 780 1010 781 1011 def UpdateHKLControls(self,data): … … 819 1049 typeChoices = ['Fosq','Fo'] 820 1050 self.dataDisplay = wx.Panel(self.dataFrame) 1051 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu) 821 1052 mainSizer = wx.BoxSizer(wx.VERTICAL) 822 1053 mainSizer.Add((5,10),0) … … 940 1171 self.PlotImage() 941 1172 942 943 1173 def OnSetDefault(event): 944 1174 import copy … … 955 1185 data['ellipses'] = [] 956 1186 self.PlotImage() 957 clearCalib.SetValue(False)958 1187 959 def OnCalibrate(event): 1188 def OnCalibrate(event): 1189 msg = \ 1190 '''Select > 5 points on inner ring of image pattern. 1191 Click right mouse button to select point. 1192 Use left mouse button to delete point. 1193 Press OK when done''' 1194 dlg = wx.MessageDialog(self,msg,'Pick inner ring',wx.OK) 1195 self.ifGetRing = True 1196 dlg.ShowModal() 1197 self.ifGetRing = False 1198 960 1199 if G2cmp.ImageCalibrate(self,data): 961 1200 Status.SetStatusText('Calibration successful') … … 970 1209 def SetStatusLine(): 971 1210 if data['refine'][0]: 972 Status.SetStatusText("On Image: key 'c' to mark center , 'r' on inner ring for calibration or 'd' to delete")1211 Status.SetStatusText("On Image: key 'c' to mark center") 973 1212 else: 974 Status.SetStatusText(" On Image: key 'r' on inner ring for calibration or 'd' to delete")1213 Status.SetStatusText("") 975 1214 976 1215 colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")] … … 982 1221 SetStatusLine() 983 1222 self.dataFrame.Bind(wx.EVT_MENU, OnCalibrate, id=wxID_IMCALIBRATE) 1223 self.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=wxID_IMCLEARCALIB) 984 1224 self.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=wxID_IMINTEGRATE) 985 1225 self.dataDisplay = wx.Panel(self.dataFrame) … … 1110 1350 setDefault.Bind(wx.EVT_CHECKBOX, OnSetDefault) 1111 1351 setDefault.SetValue(data['setDefault']) 1112 clearCalib = wx.CheckBox(parent=self.dataDisplay,label='Clear calibration rings?') 1113 dataSizer.Add(clearCalib,0) 1114 clearCalib.Bind(wx.EVT_CHECKBOX, OnClearCalib) 1352 dataSizer.Add((10,5),0) 1115 1353 1116 1354 mainSizer.Add(dataSizer,0) … … 1426 1664 FillAtomsGrid() 1427 1665 1428 1429 1666 def UpdateDrawing(): 1430 1667 print 'Drawing' … … 1449 1686 self.dataDisplay.Destroy() 1450 1687 PhaseName = self.PatternTree.GetItemText(item) 1688 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu) 1451 1689 self.dataFrame.SetLabel('Phase Data for '+PhaseName) 1452 1690 self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize()) … … 1485 1723 oldPage = 0 1486 1724 if self.dataFrame: 1725 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu) 1487 1726 if self.dataFrame.GetLabel() == 'Comments': 1488 1727 data = [self.dataDisplay.GetValue()] … … 1505 1744 self.PickId = 0 1506 1745 self.PatternId = 0 1507 self.PeakFit.Enable(False)1508 self.AutoPeakFit.Enable(False)1509 self.IndexPeaks.Enable(False)1510 self.RefineCell.Enable(False)1511 1746 parentID = self.root 1512 1747 if item != self.root: … … 1560 1795 elif self.PatternTree.GetItemText(item) == 'Peak List': 1561 1796 self.PatternId = self.PatternTree.GetItemParent(item) 1562 self.PeakFit.Enable(True)1563 1797 self.ExportPeakList.Enable(True) 1564 self.AutoPeakFit.Enable(True)1565 1798 self.PickId = item 1566 1799 data = self.PatternTree.GetItemPyData(item) … … 1595 1828 elif self.PatternTree.GetItemText(item) == 'Unit Cells List': 1596 1829 self.PatternId = self.PatternTree.GetItemParent(item) 1597 self.IndexPeaks.Enable(True)1598 1830 self.PickId = item 1599 1831 data = self.PatternTree.GetItemPyData(item) … … 1605 1837 self.PatternTree.SetItemPyData(item,data) 1606 1838 UpdateUnitCellsGrid(self,data) 1839 self.dataFrame.RefineCell.Enable(True) 1840 self.dataFrame.IndexPeaks.Enable(True) 1607 1841 self.NewPlot = True 1608 1842 self.PlotPatterns()
Note: See TracChangeset
for help on using the changeset viewer.