Changeset 51
- Timestamp:
- Apr 22, 2010 3:17:01 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASII.py
r50 r51 237 237 self.Img = 0 238 238 self.TA = 0 239 self.Integrate = 0 239 240 self.Pwdr = False 240 241 self.imageDefault = {} -
trunk/GSASIIcomp.py
r50 r51 56 56 return '%d:%2d:%.2f'%(H,M,S) 57 57 58 #def valueEsd(value,esd,precision): 59 # nDecimals = lambda esd: max(0.,1.545-math.log10(abs(esd))) 60 # if esd: 61 # else: 62 # 63 # 58 def ValEsd(value,esd=0,nTZ=False): 59 # returns value(esd) string; nTZ=True for no trailing zeros 60 # use esd < 0 for level of precision shown e.g. esd=-0.01 gives 2 places beyond decimal 61 #get the 2 significant digits in the esd 62 edig = lambda esd: int(round(10**(math.log10(esd) % 1+1))) 63 #get the number of digits to represent them 64 epl = lambda esd: 2+int(1.545-math.log10(10*edig(esd))) 65 66 mdec = lambda esd: -int(math.log10(abs(esd))) 67 ndec = lambda esd: int(1.545-math.log10(abs(esd))) 68 if esd > 0: 69 fmt = '"%.'+str(ndec(esd))+'f(%d)"' 70 print fmt,ndec(esd),esd*10**(mdec(esd)+1) 71 return fmt%(value,int(esd*10**(mdec(esd)+1))) 72 elif esd < 0: 73 return str(round(value,mdec(esd))) 74 else: 75 text = "%F"%(value) 76 if nTZ: 77 return text.rstrip('0') 78 else: 79 return text 80 81 82 64 83 65 84 def DoPeakFit(peaks,background,limits,inst,data): … … 1607 1626 LUtth = data['IOtth'] 1608 1627 if data['fullIntegrate']: 1609 LRazm = [ 0,360]1628 LRazm = [-180,180] 1610 1629 else: 1611 1630 LRazm = data['LRazimuth'] … … 1625 1644 print "Elapsed time:","%8.3f"%(t1-t0), "s" 1626 1645 print 'Fill map with 2-theta/azimuth values' 1627 self.TA = np.reshape(GetTthAzm(tay,tax,data),(2,imageN,imageN)) 1646 self.TA = GetTthAzm(tay,tax,data) #2-theta & azimuth arrays 1647 self.TA = np.reshape(self.TA,(2,imageN,imageN)) 1648 self.TA = np.dstack((self.TA[1],self.TA[0],self.ImageZ)) #azimuth, 2-theta, intensity order 1628 1649 t2 = time.time() 1629 1650 print "Elapsed time:","%8.3f"%(t2-t1), "s" … … 1631 1652 print 'Form 1-D histograms for ',numAzms,' azimuthal angles' 1632 1653 print 'Integration limits:',LUtth,LRazm 1633 NST = np.histogram2d(self.TA[1].flatten(),self.TA[0].flatten(), \ 1634 bins=(numChans,numAzms),range=[LUtth,LRazm]) 1635 HST = np.histogram2d(self.TA[1].flatten(),self.TA[0].flatten(),normed=True, \ 1636 bins=(numChans,numAzms),weights=self.ImageZ.flatten(),range=[LUtth,LRazm]) 1654 tax,tay,taz = np.dsplit(self.TA,3) #azimuth, 2-theta, intensity 1655 NST = np.histogram2d(tax.flatten(),tay.flatten(),normed=False, \ 1656 bins=(numAzms,numChans),range=[LRazm,LUtth]) 1657 HST = np.histogram2d(tax.flatten(),tay.flatten(),normed=False, \ 1658 bins=(numAzms,numChans),weights=taz.flatten(),range=[LRazm,LUtth]) 1637 1659 t3 = time.time() 1638 1660 print "Elapsed time:","%8.3f"%(t3-t2), "s" 1639 print NST[0] 1640 print HST[0] 1641 print HST[1] 1642 print HST[2] 1661 self.Integrate = [HST[0]/NST[0],HST[1],HST[2]] 1662 G2plt.PlotIntegration(self,newPlot=True) 1643 1663 1644 1664 -
trunk/GSASIIgrid.py
r50 r51 20 20 ] = [wx.NewId() for _init_coll_Atom_Items in range(2)] 21 21 22 [ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, wxID_IMREFRESHTA,23 ] = [wx.NewId() for _init_coll_IMAGE_Items in range( 4)]22 [ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, 23 ] = [wx.NewId() for _init_coll_IMAGE_Items in range(3)] 24 24 25 25 [ wxID_UNDO,wxID_PEAKFIT,wxID_AUTOPEAKFIT, … … 54 54 parent.Append(help='',id=wxID_IMCLEARCALIB, kind=wx.ITEM_NORMAL,text='Clear calibration') 55 55 parent.Append(help='',id=wxID_IMINTEGRATE, kind=wx.ITEM_NORMAL,text='Integrate') 56 parent.Append(help='',id=wxID_IMREFRESHTA, kind=wx.ITEM_NORMAL,text='Refresh transformed image')57 56 58 57 … … 1112 1111 def OnNewColorBar(event): 1113 1112 data['color'] = colSel.GetValue() 1114 G2plt.Plot Image(self)1113 G2plt.PlotExposedImage(self) 1115 1114 1116 1115 def OnNewCalibrant(event): … … 1124 1123 delt = data['range'][0][1]-data['range'][0][0] 1125 1124 data['range'][1][1] = int((imax/100.)*delt)+data['range'][0][0] 1126 G2plt.Plot Image(self)1125 G2plt.PlotExposedImage(self) 1127 1126 1128 1127 def OnMinSlider(event): … … 1130 1129 delt = data['range'][1][1]-data['range'][0][0] 1131 1130 data['range'][1][0] = int((imin/100.)*delt)+data['range'][0][0] 1132 G2plt.Plot Image(self)1131 G2plt.PlotExposedImage(self) 1133 1132 1134 1133 def OnNumOutChans(event): … … 1175 1174 else: 1176 1175 data['showLines'] = True 1177 G2plt.Plot Image(self)1176 G2plt.PlotExposedImage(self) 1178 1177 1179 1178 def OnFullIntegrate(event): … … 1186 1185 self.Lazim.SetEditable(False) 1187 1186 self.Razim.SetEditable(False) 1188 G2plt.Plot Image(self)1187 G2plt.PlotExposedImage(self) 1189 1188 1190 1189 def OnSetDefault(event): … … 1205 1204 self.InnerTth.SetValue("%8.2f" % (Ltth)) 1206 1205 self.OuterTth.SetValue("%8.2f" % (Utth)) 1207 G2plt.Plot Image(self)1206 G2plt.PlotExposedImage(self) 1208 1207 1209 1208 def OnLRazim(event): … … 1211 1210 Razm = int(self.Razim.GetValue()) 1212 1211 data['LRazimuth'] = [Lazm,Razm] 1213 G2plt.Plot Image(self)1212 G2plt.PlotExposedImage(self) 1214 1213 1215 1214 def OnSetRings(event): … … 1253 1252 G2cmp.ImageIntegrate(self,data) 1254 1253 1255 def OnRefreshTA(event):1256 G2plt.PlotTRImage(self)1257 1258 1254 colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")] 1259 1255 calList = [m for m in calFile.Calibrants.keys()] … … 1265 1261 self.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=wxID_IMCLEARCALIB) 1266 1262 self.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=wxID_IMINTEGRATE) 1267 self.dataFrame.Bind(wx.EVT_MENU, OnRefreshTA, id=wxID_IMREFRESHTA)1268 1263 self.dataDisplay = wx.Panel(self.dataFrame) 1269 1264 mainSizer = wx.BoxSizer(wx.VERTICAL) -
trunk/GSASIIplot.py
r50 r51 71 71 elif '001' in Data['Zone']: 72 72 HKLtxt = '(%3d,%3d,%3d)'%(xpos,ypos,zpos) 73 snglPage.canvas.SetToolTipString(HKLtxt)73 Page.canvas.SetToolTipString(HKLtxt) 74 74 self.G2plotNB.status.SetFields(['HKL = '+HKLtxt,]) 75 75 … … 78 78 pos = event.artist.center 79 79 if '100' in Data['Zone']: 80 snglPage.canvas.SetToolTipString('(picked:(%3d,%3d,%3d))'%(zpos,pos[0],pos[1]))80 Page.canvas.SetToolTipString('(picked:(%3d,%3d,%3d))'%(zpos,pos[0],pos[1])) 81 81 hkl = [zpos,pos[0],pos[1]] 82 82 elif '010' in Data['Zone']: 83 snglPage.canvas.SetToolTipString('(picked:(%3d,%3d,%3d))'%(pos[0],zpos,pos[1]))83 Page.canvas.SetToolTipString('(picked:(%3d,%3d,%3d))'%(pos[0],zpos,pos[1])) 84 84 hkl = [pos[0],zpos,pos[1]] 85 85 elif '001' in Data['Zone']: 86 snglPage.canvas.SetToolTipString('(picked:(%3d,%3d,%3d))'%(pos[0],pos[1],zpos))86 Page.canvas.SetToolTipString('(picked:(%3d,%3d,%3d))'%(pos[0],pos[1],zpos)) 87 87 hkl = [pos[0],pos[1],zpos] 88 88 h,k,l = hkl … … 98 98 try: 99 99 plotNum = self.G2plotNB.plotList.index('Structure Factors') 100 snglPage = self.G2plotNB.nb.GetPage(plotNum)100 Page = self.G2plotNB.nb.GetPage(plotNum) 101 101 if not newPlot: 102 snglPlot = snglPage.figure.gca() #get previous powder plot & get limits103 xylim = snglPlot.get_xlim(),snglPlot.get_ylim()104 snglPage.figure.clf()105 snglPlot = snglPage.figure.gca() #get a fresh plot after clf()102 Plot = Page.figure.gca() #get previous powder plot & get limits 103 xylim = Plot.get_xlim(),Plot.get_ylim() 104 Page.figure.clf() 105 Plot = Page.figure.gca() #get a fresh plot after clf() 106 106 except ValueError,error: 107 snglPlot = self.G2plotNB.add('Structure Factors').gca()107 Plot = self.G2plotNB.add('Structure Factors').gca() 108 108 plotNum = self.G2plotNB.plotList.index('Structure Factors') 109 snglPage = self.G2plotNB.nb.GetPage(plotNum)110 snglPage.canvas.mpl_connect('key_press_event', OnSCKeyPress)111 snglPage.canvas.mpl_connect('pick_event', OnSCPick)112 snglPage.canvas.mpl_connect('motion_notify_event', OnSCMotion)113 snglPage.SetFocus()109 Page = self.G2plotNB.nb.GetPage(plotNum) 110 Page.canvas.mpl_connect('key_press_event', OnSCKeyPress) 111 Page.canvas.mpl_connect('pick_event', OnSCPick) 112 Page.canvas.mpl_connect('motion_notify_event', OnSCMotion) 113 Page.SetFocus() 114 114 115 snglPlot.set_aspect(aspect='equal')115 Plot.set_aspect(aspect='equal') 116 116 HKLref = self.PatternTree.GetItemPyData(self.Sngl) 117 117 Data = self.PatternTree.GetItemPyData( \ … … 129 129 pzone = [[1,2],[0,2],[0,1]] 130 130 izone = zones.index(Data['Zone']) 131 snglPlot.set_title(self.PatternTree.GetItemText(self.Sngl)[5:])131 Plot.set_title(self.PatternTree.GetItemText(self.Sngl)[5:]) 132 132 HKL = [] 133 133 for H,Fosq,sig,Fcsq,x,x,x in HKLref: … … 153 153 xy = (H[pzone[izone][0]],H[pzone[izone][1]]) 154 154 if A > 0.0: 155 snglPlot.add_artist(Circle(xy,radius=A,ec='g',fc='w',picker=3))155 Plot.add_artist(Circle(xy,radius=A,ec='g',fc='w',picker=3)) 156 156 if B: 157 snglPlot.add_artist(Circle(xy,radius=B,ec='b',fc='w'))157 Plot.add_artist(Circle(xy,radius=B,ec='b',fc='w')) 158 158 radius = C 159 159 if radius > 0: 160 160 if A > B: 161 snglPlot.add_artist(Circle(xy,radius=radius,ec='r',fc='r'))161 Plot.add_artist(Circle(xy,radius=radius,ec='r',fc='r')) 162 162 else: 163 snglPlot.add_artist(Circle(xy,radius=radius,ec='g',fc='g'))163 Plot.add_artist(Circle(xy,radius=radius,ec='g',fc='g')) 164 164 HKL = np.array(HKL) 165 snglPlot.set_xlabel(xlabel[izone]+str(Data['Layer']),fontsize=12)166 snglPlot.set_ylabel(ylabel[izone],fontsize=12)167 snglPlot.set_xlim((HKLmin[pzone[izone][0]],HKLmax[pzone[izone][0]]))168 snglPlot.set_ylim((HKLmin[pzone[izone][1]],HKLmax[pzone[izone][1]]))165 Plot.set_xlabel(xlabel[izone]+str(Data['Layer']),fontsize=12) 166 Plot.set_ylabel(ylabel[izone],fontsize=12) 167 Plot.set_xlim((HKLmin[pzone[izone][0]],HKLmax[pzone[izone][0]])) 168 Plot.set_ylim((HKLmin[pzone[izone][1]],HKLmax[pzone[izone][1]])) 169 169 if not newPlot: 170 snglPage.toolbar.push_current()171 snglPlot.set_xlim(xylim[0])172 snglPlot.set_ylim(xylim[1])170 Page.toolbar.push_current() 171 Plot.set_xlim(xylim[0]) 172 Plot.set_ylim(xylim[1]) 173 173 xylim = [] 174 snglPage.toolbar.push_current()175 snglPage.toolbar.draw()174 Page.toolbar.push_current() 175 Page.toolbar.draw() 176 176 else: 177 snglPage.canvas.draw()177 Page.canvas.draw() 178 178 179 def PlotPatterns(self,newPlot=False): 180 181 def OnPick(event): 182 if self.itemPicked is not None: return 183 PatternId = self.PatternId 184 PickId = self.PickId 185 pick = event.artist 186 mouse = event.mouseevent 187 xpos = pick.get_xdata() 188 ypos = pick.get_ydata() 189 ind = event.ind 190 view = Page.toolbar._views.forward() 191 if view and 'line2' in str(pick): #apply offset only for picked powder pattern points 192 ind += np.searchsorted(xye[0],view[0][0]) 193 xy = zip(xpos[ind],ypos[ind])[0] 194 if self.PatternTree.GetItemText(PickId) == 'Peak List': 195 if ind.all() != [0]: #picked a data point 196 inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters')) 197 if len(inst[1]) == 10: 198 ins = inst[1][4:10] 199 else: 200 ins = inst[1][6:12] 201 sig = ins[0]*tand(xy[0]/2.0)**2+ins[1]*tand(xy[0]/2.0)+ins[2] 202 gam = ins[3]/cosd(xy[0]/2.0)+ins[4]*tand(xy[0]/2.0) 203 data = self.PatternTree.GetItemPyData(self.PickId) 204 XY = [xy[0],0, xy[1],1, sig,0, gam,0, ins[5],0] #default refine intensity 1st 205 data.append(XY) 206 G2gd.UpdatePeakGrid(self,data) 207 PlotPatterns(self) 208 else: #picked a peak list line 209 self.itemPicked = pick 210 elif self.PatternTree.GetItemText(PickId) == 'Limits': 211 if ind.all() != [0]: #picked a data point 212 LimitId = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits') 213 data = self.PatternTree.GetItemPyData(LimitId) 214 if mouse.button==1: 215 data[1][0] = min(xy[0],data[1][1]) 216 if mouse.button==3: 217 data[1][1] = max(xy[0],data[1][0]) 218 self.PatternTree.SetItemPyData(LimitId,data) 219 G2gd.UpdateLimitsGrid(self,data) 220 PlotPatterns(self) 221 else: #picked a limit line 222 self.itemPicked = pick 223 224 def OnPlotKeyPress(event): 225 if event.key == 'w': 226 if self.Weight: 227 self.Weight = False 228 else: 229 self.Weight = True 230 print 'plot weighting:',self.Weight 231 elif event.key == 'u' and self.Offset < 100.: 232 self.Offset += 1. 233 elif event.key == 'd' and self.Offset > 0.: 234 self.Offset -= 1. 235 elif event.key == 'c': 236 print 'contouring' 237 if self.Contour: 238 self.Contour = False 239 else: 240 self.Contour = True 241 else: 242 event.Skip(True) 243 PlotPatterns(self) 244 245 def OnMotion(event): 246 xpos = event.xdata 247 if xpos: #avoid out of frame mouse position 248 ypos = event.ydata 249 wave = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self, \ 250 PatternId, 'Instrument Parameters'))[0][1] 251 dsp = 0.0 252 if abs(xpos) > 0.: 253 dsp = wave/(2.*sind(abs(xpos)/2.0)) 254 Page.canvas.SetCursor(wx.CROSS_CURSOR) 255 self.G2plotNB.status.SetFields(['2-theta =%9.3f d =%9.5f Intensity =%9.1f'%(xpos,dsp,ypos),]) 256 if self.itemPicked: 257 Page.canvas.SetToolTipString('%9.3f'%(xpos)) 258 259 def OnRelease(event): 260 if self.itemPicked is None: return 261 xpos = event.xdata 262 if xpos: #avoid out of frame mouse position 263 lines = [] 264 for line in self.Lines: lines.append(line.get_xdata()[0]) 265 lineNo = lines.index(self.itemPicked.get_xdata()[0]) 266 if lineNo in [0,1]: 267 LimitId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Limits') 268 data = self.PatternTree.GetItemPyData(LimitId) 269 print 'limits',xpos 270 data[1][lineNo] = xpos 271 self.PatternTree.SetItemPyData(LimitId,data) 272 if self.PatternTree.GetItemText(self.PickId) == 'Limits': 273 G2gd.UpdateLimitsGrid(self,data) 274 else: 275 PeakId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List') 276 data = self.PatternTree.GetItemPyData(PeakId) 277 print 'peaks',xpos 278 data[lineNo-2][0] = xpos 279 self.PatternTree.SetItemPyData(PeakId,data) 280 G2gd.UpdatePeakGrid(self,data) 281 PlotPatterns(self) 282 self.itemPicked = None 283 284 xylim = [] 285 try: 286 plotNum = self.G2plotNB.plotList.index('Powder Patterns') 287 Page = self.G2plotNB.nb.GetPage(plotNum) 288 if not newPlot: 289 Plot = Page.figure.gca() #get previous powder plot & get limits 290 xylim = Plot.get_xlim(),Plot.get_ylim() 291 Page.figure.clf() 292 Plot = Page.figure.gca() #get a fresh plot after clf() 293 except ValueError,error: 294 newPlot = True 295 Plot = self.G2plotNB.add('Powder Patterns').gca() 296 plotNum = self.G2plotNB.plotList.index('Powder Patterns') 297 Page = self.G2plotNB.nb.GetPage(plotNum) 298 Page.canvas.mpl_connect('key_press_event', OnPlotKeyPress) 299 Page.canvas.mpl_connect('motion_notify_event', OnMotion) 300 Page.canvas.mpl_connect('pick_event', OnPick) 301 Page.canvas.mpl_connect('button_release_event', OnRelease) 302 303 Page.SetFocus() 304 305 PickId = self.PickId 306 PatternId = self.PatternId 307 colors=['b','g','r','c','m','k'] 308 PlotList = [] 309 Lines = [] 310 item, cookie = self.PatternTree.GetFirstChild(self.root) 311 while item: 312 if 'PWDR' in self.PatternTree.GetItemText(item): 313 Pattern = self.PatternTree.GetItemPyData(item) 314 Pattern.append(self.PatternTree.GetItemText(item)) 315 PlotList.append(Pattern) 316 item, cookie = self.PatternTree.GetNextChild(self.root, cookie) 317 Ymax = 1.0 318 for Pattern in PlotList: 319 xye = Pattern[1] 320 Ymax = max(Ymax,max(xye[1])) 321 offset = self.Offset*Ymax/100.0 322 Plot.set_title('Powder Patterns') 323 Plot.set_xlabel(r'$\mathsf{2\theta}$',fontsize=14) 324 Plot.set_ylabel('Intensity',fontsize=12) 325 if self.Contour: 326 ContourZ = [] 327 ContourY = [] 328 Nseq = 0 329 for Pattern in PlotList: 330 ifpicked = False 331 LimitId = 0 332 xye = Pattern[1] 333 if PickId: 334 ifpicked = Pattern[2] == self.PatternTree.GetItemText(PatternId) 335 LimitId = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits') 336 N = PlotList.index(Pattern) 337 X = xye[0] 338 Y = xye[1]+offset*N 339 if LimitId: 340 limits = self.PatternTree.GetItemPyData(LimitId) 341 Lines.append(Plot.axvline(limits[1][0],color='g',dashes=(5,5),picker=3.)) 342 Lines.append(Plot.axvline(limits[1][1],color='r',dashes=(5,5),picker=3.)) 343 if self.Contour: 344 ContourY.append(N) 345 ContourZ.append(Y) 346 ContourX = X 347 Nseq += 1 348 Plot.set_ylabel('Data sequence',fontsize=12) 349 else: 350 if ifpicked: 351 Z = xye[3]+offset*N 352 W = xye[4]+offset*N 353 D = xye[5]+offset*N 354 if self.Weight: 355 W2 = np.sqrt(xye[2]) 356 D *= W2 357 Plot.plot(X,Y,colors[N%6]+'+',picker=3.,clip_on=False) 358 Plot.plot(X,Z,colors[(N+1)%6],picker=False) 359 Plot.plot(X,W,colors[(N+2)%6],picker=False) 360 Plot.plot(X,D,colors[(N+3)%6],picker=False) 361 Plot.axhline(0.,color=wx.BLACK) 362 Page.canvas.SetToolTipString('') 363 if self.PatternTree.GetItemText(PickId) == 'Peak List': 364 tip = 'On data point: Pick peak - L or R MB.On line: MB down to move' 365 Page.canvas.SetToolTipString(tip) 366 data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List')) 367 for item in data: 368 Lines.append(Plot.axvline(item[0],color=colors[N%6],picker=2.)) 369 if self.PatternTree.GetItemText(PickId) == 'Limits': 370 tip = 'On data point: Lower limit - L MB; Upper limit - R MB. On limit: MB down to move' 371 Page.canvas.SetToolTipString(tip) 372 data = self.LimitsTable.GetData() 373 else: 374 Plot.plot(X,Y,colors[N%6],picker=False) 375 if PickId and self.PatternTree.GetItemText(PickId) in ['Index Peak List','Unit Cells List']: 376 peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List')) 377 for peak in peaks: 378 Plot.axvline(peak[0],color='b') 379 for hkl in self.HKL: 380 Plot.axvline(hkl[5],color='r',dashes=(5,5)) 381 if self.Contour: 382 acolor = mpl.cm.get_cmap('Paired') 383 Plot.contourf(ContourX,ContourY,ContourZ,cmap=acolor) 384 # Plot.set_ylim(0,Nseq-1) 385 else: 386 self.Lines = Lines 387 if not newPlot: 388 Page.toolbar.push_current() 389 Plot.set_xlim(xylim[0]) 390 Plot.set_ylim(xylim[1]) 391 xylim = [] 392 Page.toolbar.push_current() 393 Page.toolbar.draw() 394 else: 395 Page.canvas.draw() 396 397 398 self.Pwdr = True 399 400 def PlotPowderLines(self): 401 402 def OnMotion(event): 403 xpos = event.xdata 404 if xpos: #avoid out of frame mouse position 405 Page.canvas.SetCursor(wx.CROSS_CURSOR) 406 self.G2plotNB.status.SetFields(['2-theta =%9.3f '%(xpos,),]) 407 408 try: 409 plotNum = self.G2plotNB.plotList.index('Powder Lines') 410 Page = self.G2plotNB.nb.GetPage(plotNum) 411 Page.figure.clf() 412 Plot = Page.figure.gca() 413 except ValueError,error: 414 Plot = self.G2plotNB.add('Powder Lines').gca() 415 plotNum = self.G2plotNB.plotList.index('Powder Lines') 416 Page = self.G2plotNB.nb.GetPage(plotNum) 417 Page.canvas.mpl_connect('motion_notify_event', OnMotion) 418 419 Page.SetFocus() 420 Plot.set_title('Powder Pattern Lines') 421 Plot.set_xlabel(r'$\mathsf{2\theta}$',fontsize=14) 422 PickId = self.PickId 423 PatternId = self.PatternId 424 peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List')) 425 for peak in peaks: 426 Plot.axvline(peak[0],color='b') 427 for hkl in self.HKL: 428 Plot.axvline(hkl[5],color='r',dashes=(5,5)) 429 xmin = peaks[0][0] 430 xmax = peaks[-1][0] 431 delt = xmax-xmin 432 xlim = [max(0,xmin-delt/20.),min(180.,xmax+delt/20.)] 433 Plot.set_xlim(xlim) 434 Page.canvas.draw() 435 436 def PlotPeakWidths(self): 437 PatternId = self.PatternId 438 limitID = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits') 439 if limitID: 440 limits = self.PatternTree.GetItemPyData(limitID) 441 else: 442 return 443 instParms = self.PatternTree.GetItemPyData( \ 444 G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters')) 445 if instParms[0][0] == 'PXC': 446 lam = instParms[1][1] 447 if len(instParms[1]) == 12: 448 GU,GV,GW,LX,LY = instParms[0][6:11] 449 else: 450 GU,GV,GW,LX,LY = instParms[0][4:9] 451 peakID = G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List') 452 if peakID: 453 peaks = self.PatternTree.GetItemPyData(peakID) 454 else: 455 peaks = [] 456 457 try: 458 plotNum = self.G2plotNB.plotList.index('Peak Widths') 459 Page = self.G2plotNB.nb.GetPage(plotNum) 460 Page.figure.clf() 461 Plot = Page.figure.gca() 462 except ValueError,error: 463 Plot = self.G2plotNB.add('Peak Widths').gca() 464 plotNum = self.G2plotNB.plotList.index('Peak Widths') 465 Page = self.G2plotNB.nb.GetPage(plotNum) 466 Page.SetFocus() 467 468 Page.canvas.SetToolTipString('') 469 colors=['b','g','r','c','m','k'] 470 Xmin,Xmax = limits[1] 471 Xmin = min(0.5,max(Xmin,1)) 472 Xmin /= 2 473 Xmax /= 2 474 nPts = 100 475 delt = (Xmax-Xmin)/nPts 476 thetas = [] 477 for i in range(nPts): 478 thetas.append(Xmin+i*delt) 479 X = [] 480 Y = [] 481 Z = [] 482 W = [] 483 sig = lambda Th,U,V,W: 1.17741*math.sqrt(U*tand(Th)**2+V*tand(Th)+W)*math.pi/18000. 484 gam = lambda Th,X,Y: (X/cosd(Th)+Y*tand(Th))*math.pi/18000. 485 gamFW = lambda s,g: math.exp(math.log(g**5+2.69269*g**4*s+2.42843*g**3*s**2+4.47163*g**2*s**3+0.07842*g*s**4+s**5)/5.) 486 for theta in thetas: 487 X.append(4.0*math.pi*sind(theta)/lam) #q 488 s = sig(theta,GU,GV,GW) 489 g = gam(theta,LX,LY) 490 G = gamFW(g,s) 491 Y.append(s/tand(theta)) 492 Z.append(g/tand(theta)) 493 W.append(G/tand(theta)) 494 Plot.set_title('Instrument and sample peak widths') 495 Plot.set_ylabel(r'$\Delta q/q, \Delta d/d$',fontsize=14) 496 Plot.set_xlabel(r'$q, \AA^{-1}$',fontsize=14) 497 Plot.plot(X,Y,color='r',label='Gaussian') 498 Plot.plot(X,Z,color='g',label='Lorentzian') 499 Plot.plot(X,W,color='b',label='G+L') 500 X = [] 501 Y = [] 502 Z = [] 503 W = [] 504 for peak in peaks: 505 X.append(4.0*math.pi*sind(peak[0]/2.0)/lam) 506 s = 1.17741*math.sqrt(peak[4])*math.pi/18000. 507 g = peak[6]*math.pi/18000. 508 G = gamFW(g,s) 509 Y.append(s/tand(peak[0]/2.)) 510 Z.append(g/tand(peak[0]/2.)) 511 W.append(G/tand(peak[0]/2.)) 512 Plot.plot(X,Y,'+',color='r',label='G peak') 513 Plot.plot(X,Z,'+',color='g',label='L peak') 514 Plot.plot(X,W,'+',color='b',label='G+L peak') 515 Plot.legend(loc='best') 516 Page.canvas.draw() 517 179 518 def PlotImage(self,newPlot=False): 180 519 from matplotlib.patches import Ellipse,Arc 181 520 182 521 def OnImMotion(event): 183 imgPage.canvas.SetToolTipString('')522 Page.canvas.SetToolTipString('') 184 523 size = len(self.ImageZ) 185 524 if event.xdata and event.ydata: #avoid out of frame errors 186 525 Data = self.PatternTree.GetItemPyData( \ 187 526 G2gd.GetPatternTreeItemId(self,self.Image, 'Image Controls')) 188 imgPage.canvas.SetCursor(wx.CROSS_CURSOR)527 Page.canvas.SetCursor(wx.CROSS_CURSOR) 189 528 item = self.itemPicked 190 529 pixelSize = Data['pixelSize'] … … 193 532 if item and self.PatternTree.GetItemText(self.PickId) == 'Image Controls': 194 533 if 'Text' in str(item): 195 imgPage.canvas.SetToolTipString('%8.3f %8.3fmm'%(event.xdata,event.ydata))534 Page.canvas.SetToolTipString('%8.3f %8.3fmm'%(event.xdata,event.ydata)) 196 535 else: 197 536 xcent,ycent = Data['center'] … … 200 539 if 'line3' in str(item) or 'line4' in str(item) and not Data['fullIntegrate']: 201 540 ang = int(atan2d(xpos,ypos)) 202 imgPage.canvas.SetToolTipString('%6d deg'%(ang))541 Page.canvas.SetToolTipString('%6d deg'%(ang)) 203 542 elif 'line1' in str(item) or 'line2' in str(item): 204 543 tth = G2cmp.GetTth(event.xdata,event.ydata,Data) 205 imgPage.canvas.SetToolTipString('%8.3fdeg'%(tth))544 Page.canvas.SetToolTipString('%8.3fdeg'%(tth)) 206 545 else: 207 546 xpos = event.xdata … … 210 549 ypix = ypos*scaley 211 550 if (0 <= xpix <= size) and (0 <= ypix <= size): 212 imgPage.canvas.SetToolTipString('%6d'%(self.ImageZ[ypix][xpix]))551 Page.canvas.SetToolTipString('%6d'%(self.ImageZ[ypix][xpix])) 213 552 tth,azm,dsp = G2cmp.GetTthDspAzm(xpos,ypos,Data) 214 553 Q = 2.*math.pi/dsp … … 248 587 return 249 588 Ypos = event.ydata 250 if Ypos and not imgPage.toolbar._active: #make sure zoom/pan not selected589 if Ypos and not Page.toolbar._active: #make sure zoom/pan not selected 251 590 if event.button == 1: 252 591 Xpix = Xpos*scalex … … 297 636 try: 298 637 plotNum = self.G2plotNB.plotList.index('2D Powder Image') 299 imgPage = self.G2plotNB.nb.GetPage(plotNum)638 Page = self.G2plotNB.nb.GetPage(plotNum) 300 639 if not newPlot: 301 imgPlot = imgPage.figure.gca() #get previous powder plot & get limits302 xylim = imgPlot.get_xlim(),imgPlot.get_ylim()303 imgPage.figure.clf()304 imgPlot = imgPage.figure.gca() #get a fresh plot after clf()640 Plot = Page.figure.gca() #get previous powder plot & get limits 641 xylim = Plot.get_xlim(),Plot.get_ylim() 642 Page.figure.clf() 643 Plot = Page.figure.gca() #get a fresh plot after clf() 305 644 306 645 except ValueError,error: 307 imgPlot = self.G2plotNB.add('2D Powder Image').gca()646 Plot = self.G2plotNB.add('2D Powder Image').gca() 308 647 plotNum = self.G2plotNB.plotList.index('2D Powder Image') 309 imgPage = self.G2plotNB.nb.GetPage(plotNum)310 imgPage.canvas.mpl_connect('key_press_event', OnImPlotKeyPress)311 imgPage.canvas.mpl_connect('motion_notify_event', OnImMotion)312 imgPage.canvas.mpl_connect('pick_event', OnImPick)313 imgPage.canvas.mpl_connect('button_release_event', OnImRelease)314 imgPage.SetFocus()315 316 imgPlot.set_title(self.PatternTree.GetItemText(self.Image)[4:])648 Page = self.G2plotNB.nb.GetPage(plotNum) 649 Page.canvas.mpl_connect('key_press_event', OnImPlotKeyPress) 650 Page.canvas.mpl_connect('motion_notify_event', OnImMotion) 651 Page.canvas.mpl_connect('pick_event', OnImPick) 652 Page.canvas.mpl_connect('button_release_event', OnImRelease) 653 Page.SetFocus() 654 655 Plot.set_title(self.PatternTree.GetItemText(self.Image)[4:]) 317 656 size,self.ImageZ = self.PatternTree.GetItemPyData(self.Image) 318 657 Data = self.PatternTree.GetItemPyData( \ … … 331 670 acolor = mpl.cm.get_cmap(Data['color']) 332 671 xcent,ycent = Data['center'] 333 imgPlot.set_xlabel('Image x-axis, mm',fontsize=12)334 imgPlot.set_ylabel('Image y-axis, mm',fontsize=12)672 Plot.set_xlabel('Image x-axis, mm',fontsize=12) 673 Plot.set_ylabel('Image y-axis, mm',fontsize=12) 335 674 A = G2cmp.ImageCompress(self.ImageZ,imScale) 336 self.Img = imgPlot.imshow(A,aspect='equal',cmap=acolor, \675 self.Img = Plot.imshow(A,aspect='equal',cmap=acolor, \ 337 676 interpolation='nearest',vmin=Imin,vmax=Imax,extent=[0,Xmax,Xmax,0]) 338 677 339 imgPlot.plot(xcent,ycent,'x')678 Plot.plot(xcent,ycent,'x') 340 679 if Data['showLines']: 341 680 LRAzim = Data['LRazimuth'] #NB: integers … … 356 695 xyI = np.array(xyI) 357 696 arcxI,arcyI = xyI.T 358 imgPlot.plot(arcxI,arcyI,picker=3)697 Plot.plot(arcxI,arcyI,picker=3) 359 698 if ellO: 360 699 xyO = [] … … 363 702 xyO = np.array(xyO) 364 703 arcxO,arcyO = xyO.T 365 imgPlot.plot(arcxO,arcyO,picker=3)704 Plot.plot(arcxO,arcyO,picker=3) 366 705 if ellO and ellI and not Data['fullIntegrate']: 367 imgPlot.plot([arcxI[0],arcxO[0]],[arcyI[0],arcyO[0]],picker=3)368 imgPlot.plot([arcxI[-1],arcxO[-1]],[arcyI[-1],arcyO[-1]],picker=3)706 Plot.plot([arcxI[0],arcxO[0]],[arcyI[0],arcyO[0]],picker=3) 707 Plot.plot([arcxI[-1],arcxO[-1]],[arcyI[-1],arcyO[-1]],picker=3) 369 708 for xring,yring in Data['ring']: 370 imgPlot.text(xring,yring,'+',color='b',ha='center',va='center',picker=3)709 Plot.text(xring,yring,'+',color='b',ha='center',va='center',picker=3) 371 710 if Data['setRings']: 372 711 rings = np.concatenate((Data['rings']),axis=0) 373 712 for xring,yring,dsp in rings: 374 imgPlot.text(xring,yring,'+',ha='center',va='center')713 Plot.text(xring,yring,'+',ha='center',va='center') 375 714 for ellipse in Data['ellipses']: 376 715 cent,phi,[width,height],col = ellipse 377 imgPlot.add_artist(Ellipse([cent[0],cent[1]],2*width,2*height,phi,ec=col,fc='none'))378 imgPlot.text(cent[0],cent[1],'+',color=col,ha='center',va='center')379 colorBar = imgPage.figure.colorbar(self.Img)380 imgPlot.set_xlim(xlim)381 imgPlot.set_ylim(ylim)716 Plot.add_artist(Ellipse([cent[0],cent[1]],2*width,2*height,phi,ec=col,fc='none')) 717 Plot.text(cent[0],cent[1],'+',color=col,ha='center',va='center') 718 colorBar = Page.figure.colorbar(self.Img) 719 Plot.set_xlim(xlim) 720 Plot.set_ylim(ylim) 382 721 if not newPlot: 383 imgPage.toolbar.push_current()384 imgPlot.set_xlim(xylim[0])385 imgPlot.set_ylim(xylim[1])722 Page.toolbar.push_current() 723 Plot.set_xlim(xylim[0]) 724 Plot.set_ylim(xylim[1]) 386 725 xylim = [] 387 imgPage.toolbar.push_current()388 imgPage.toolbar.draw()726 Page.toolbar.push_current() 727 Page.toolbar.draw() 389 728 else: 390 imgPage.canvas.draw()729 Page.canvas.draw() 391 730 392 def PlotPeakWidths(self):393 PatternId = self.PatternId394 limitID = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits')395 if limitID:396 limits = self.PatternTree.GetItemPyData(limitID)397 else:398 return399 instParms = self.PatternTree.GetItemPyData( \400 G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))401 if instParms[0][0] == 'PXC':402 lam = instParms[1][1]403 if len(instParms[1]) == 12:404 GU,GV,GW,LX,LY = instParms[0][6:11]405 else:406 GU,GV,GW,LX,LY = instParms[0][4:9]407 peakID = G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List')408 if peakID:409 peaks = self.PatternTree.GetItemPyData(peakID)410 else:411 peaks = []412 413 try:414 plotNum = self.G2plotNB.plotList.index('Peak Widths')415 pkwPage = self.G2plotNB.nb.GetPage(plotNum)416 pkwPage.figure.clf()417 pkwPlot = pkwPage.figure.gca()418 except ValueError,error:419 pkwPlot = self.G2plotNB.add('Peak Widths').gca()420 plotNum = self.G2plotNB.plotList.index('Peak Widths')421 pkwPage = self.G2plotNB.nb.GetPage(plotNum)422 pkwPage.SetFocus()423 424 pkwPage.canvas.SetToolTipString('')425 colors=['b','g','r','c','m','k']426 Xmin,Xmax = limits[1]427 Xmin = min(0.5,max(Xmin,1))428 Xmin /= 2429 Xmax /= 2430 nPts = 100431 delt = (Xmax-Xmin)/nPts432 thetas = []433 for i in range(nPts):434 thetas.append(Xmin+i*delt)435 X = []436 Y = []437 Z = []438 W = []439 sig = lambda Th,U,V,W: 1.17741*math.sqrt(U*tand(Th)**2+V*tand(Th)+W)*math.pi/18000.440 gam = lambda Th,X,Y: (X/cosd(Th)+Y*tand(Th))*math.pi/18000.441 gamFW = lambda s,g: math.exp(math.log(g**5+2.69269*g**4*s+2.42843*g**3*s**2+4.47163*g**2*s**3+0.07842*g*s**4+s**5)/5.)442 for theta in thetas:443 X.append(4.0*math.pi*sind(theta)/lam) #q444 s = sig(theta,GU,GV,GW)445 g = gam(theta,LX,LY)446 G = gamFW(g,s)447 Y.append(s/tand(theta))448 Z.append(g/tand(theta))449 W.append(G/tand(theta))450 pkwPlot.set_title('Instrument and sample peak widths')451 pkwPlot.set_ylabel(r'$\Delta q/q, \Delta d/d$',fontsize=14)452 pkwPlot.set_xlabel(r'$q, \AA^{-1}$',fontsize=14)453 pkwPlot.plot(X,Y,color='r',label='Gaussian')454 pkwPlot.plot(X,Z,color='g',label='Lorentzian')455 pkwPlot.plot(X,W,color='b',label='G+L')456 X = []457 Y = []458 Z = []459 W = []460 for peak in peaks:461 X.append(4.0*math.pi*sind(peak[0]/2.0)/lam)462 s = 1.17741*math.sqrt(peak[4])*math.pi/18000.463 g = peak[6]*math.pi/18000.464 G = gamFW(g,s)465 Y.append(s/tand(peak[0]/2.))466 Z.append(g/tand(peak[0]/2.))467 W.append(G/tand(peak[0]/2.))468 pkwPlot.plot(X,Y,'+',color='r',label='G peak')469 pkwPlot.plot(X,Z,'+',color='g',label='L peak')470 pkwPlot.plot(X,W,'+',color='b',label='G+L peak')471 pkwPlot.legend(loc='best')472 pkwPage.canvas.draw()473 474 def PlotPatterns(self,newPlot=False):475 476 def OnPick(event):477 if self.itemPicked is not None: return478 PatternId = self.PatternId479 PickId = self.PickId480 pick = event.artist481 mouse = event.mouseevent482 xpos = pick.get_xdata()483 ypos = pick.get_ydata()484 ind = event.ind485 view = pdrPage.toolbar._views.forward()486 if view and 'line2' in str(pick): #apply offset only for picked powder pattern points487 ind += np.searchsorted(xye[0],view[0][0])488 xy = zip(xpos[ind],ypos[ind])[0]489 if self.PatternTree.GetItemText(PickId) == 'Peak List':490 if ind.all() != [0]: #picked a data point491 inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))492 if len(inst[1]) == 10:493 ins = inst[1][4:10]494 else:495 ins = inst[1][6:12]496 sig = ins[0]*tand(xy[0]/2.0)**2+ins[1]*tand(xy[0]/2.0)+ins[2]497 gam = ins[3]/cosd(xy[0]/2.0)+ins[4]*tand(xy[0]/2.0)498 data = self.PatternTree.GetItemPyData(self.PickId)499 XY = [xy[0],0, xy[1],1, sig,0, gam,0, ins[5],0] #default refine intensity 1st500 data.append(XY)501 G2gd.UpdatePeakGrid(self,data)502 PlotPatterns(self)503 else: #picked a peak list line504 self.itemPicked = pick505 elif self.PatternTree.GetItemText(PickId) == 'Limits':506 if ind.all() != [0]: #picked a data point507 LimitId = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits')508 data = self.PatternTree.GetItemPyData(LimitId)509 if mouse.button==1:510 data[1][0] = min(xy[0],data[1][1])511 if mouse.button==3:512 data[1][1] = max(xy[0],data[1][0])513 self.PatternTree.SetItemPyData(LimitId,data)514 G2gd.UpdateLimitsGrid(self,data)515 PlotPatterns(self)516 else: #picked a limit line517 self.itemPicked = pick518 519 def OnPlotKeyPress(event):520 if event.key == 'w':521 if self.Weight:522 self.Weight = False523 else:524 self.Weight = True525 print 'plot weighting:',self.Weight526 elif event.key == 'u' and self.Offset < 100.:527 self.Offset += 1.528 elif event.key == 'd' and self.Offset > 0.:529 self.Offset -= 1.530 elif event.key == 'c':531 print 'contouring'532 if self.Contour:533 self.Contour = False534 else:535 self.Contour = True536 else:537 event.Skip(True)538 PlotPatterns(self)539 540 def OnMotion(event):541 xpos = event.xdata542 if xpos: #avoid out of frame mouse position543 ypos = event.ydata544 wave = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self, \545 PatternId, 'Instrument Parameters'))[0][1]546 dsp = 0.0547 if abs(xpos) > 0.:548 dsp = wave/(2.*sind(abs(xpos)/2.0))549 pdrPage.canvas.SetCursor(wx.CROSS_CURSOR)550 self.G2plotNB.status.SetFields(['2-theta =%9.3f d =%9.5f Intensity =%9.1f'%(xpos,dsp,ypos),])551 if self.itemPicked:552 pdrPage.canvas.SetToolTipString('%9.3f'%(xpos))553 554 def OnRelease(event):555 if self.itemPicked is None: return556 xpos = event.xdata557 if xpos: #avoid out of frame mouse position558 lines = []559 for line in self.Lines: lines.append(line.get_xdata()[0])560 lineNo = lines.index(self.itemPicked.get_xdata()[0])561 if lineNo in [0,1]:562 LimitId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Limits')563 data = self.PatternTree.GetItemPyData(LimitId)564 print 'limits',xpos565 data[1][lineNo] = xpos566 self.PatternTree.SetItemPyData(LimitId,data)567 if self.PatternTree.GetItemText(self.PickId) == 'Limits':568 G2gd.UpdateLimitsGrid(self,data)569 else:570 PeakId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List')571 data = self.PatternTree.GetItemPyData(PeakId)572 print 'peaks',xpos573 data[lineNo-2][0] = xpos574 self.PatternTree.SetItemPyData(PeakId,data)575 G2gd.UpdatePeakGrid(self,data)576 PlotPatterns(self)577 self.itemPicked = None578 579 xylim = []580 try:581 plotNum = self.G2plotNB.plotList.index('Powder Patterns')582 pdrPage = self.G2plotNB.nb.GetPage(plotNum)583 if not newPlot:584 pdrPlot = pdrPage.figure.gca() #get previous powder plot & get limits585 xylim = pdrPlot.get_xlim(),pdrPlot.get_ylim()586 pdrPage.figure.clf()587 pdrPlot = pdrPage.figure.gca() #get a fresh plot after clf()588 except ValueError,error:589 newPlot = True590 pdrPlot = self.G2plotNB.add('Powder Patterns').gca()591 plotNum = self.G2plotNB.plotList.index('Powder Patterns')592 pdrPage = self.G2plotNB.nb.GetPage(plotNum)593 pdrPage.canvas.mpl_connect('key_press_event', OnPlotKeyPress)594 pdrPage.canvas.mpl_connect('motion_notify_event', OnMotion)595 pdrPage.canvas.mpl_connect('pick_event', OnPick)596 pdrPage.canvas.mpl_connect('button_release_event', OnRelease)597 598 pdrPage.SetFocus()599 600 PickId = self.PickId601 PatternId = self.PatternId602 colors=['b','g','r','c','m','k']603 PlotList = []604 Lines = []605 item, cookie = self.PatternTree.GetFirstChild(self.root)606 while item:607 if 'PWDR' in self.PatternTree.GetItemText(item):608 Pattern = self.PatternTree.GetItemPyData(item)609 Pattern.append(self.PatternTree.GetItemText(item))610 PlotList.append(Pattern)611 item, cookie = self.PatternTree.GetNextChild(self.root, cookie)612 Ymax = 1.0613 for Pattern in PlotList:614 xye = Pattern[1]615 Ymax = max(Ymax,max(xye[1]))616 offset = self.Offset*Ymax/100.0617 pdrPlot.set_title('Powder Patterns')618 pdrPlot.set_xlabel(r'$\mathsf{2\theta}$',fontsize=14)619 pdrPlot.set_ylabel('Intensity',fontsize=12)620 if self.Contour:621 ContourZ = []622 ContourY = []623 Nseq = 0624 for Pattern in PlotList:625 ifpicked = False626 LimitId = 0627 xye = Pattern[1]628 if PickId:629 ifpicked = Pattern[2] == self.PatternTree.GetItemText(PatternId)630 LimitId = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits')631 N = PlotList.index(Pattern)632 X = xye[0]633 Y = xye[1]+offset*N634 if LimitId:635 limits = self.PatternTree.GetItemPyData(LimitId)636 Lines.append(pdrPlot.axvline(limits[1][0],color='g',dashes=(5,5),picker=3.))637 Lines.append(pdrPlot.axvline(limits[1][1],color='r',dashes=(5,5),picker=3.))638 if self.Contour:639 ContourY.append(N)640 ContourZ.append(Y)641 ContourX = X642 Nseq += 1643 pdrPlot.set_ylabel('Data sequence',fontsize=12)644 else:645 if ifpicked:646 Z = xye[3]+offset*N647 W = xye[4]+offset*N648 D = xye[5]+offset*N649 if self.Weight:650 W2 = np.sqrt(xye[2])651 D *= W2652 pdrPlot.plot(X,Y,colors[N%6]+'+',picker=3.,clip_on=False)653 pdrPlot.plot(X,Z,colors[(N+1)%6],picker=False)654 pdrPlot.plot(X,W,colors[(N+2)%6],picker=False)655 pdrPlot.plot(X,D,colors[(N+3)%6],picker=False)656 pdrPlot.axhline(0.,color=wx.BLACK)657 pdrPage.canvas.SetToolTipString('')658 if self.PatternTree.GetItemText(PickId) == 'Peak List':659 tip = 'On data point: Pick peak - L or R MB.On line: MB down to move'660 pdrPage.canvas.SetToolTipString(tip)661 data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List'))662 for item in data:663 Lines.append(pdrPlot.axvline(item[0],color=colors[N%6],picker=2.))664 if self.PatternTree.GetItemText(PickId) == 'Limits':665 tip = 'On data point: Lower limit - L MB; Upper limit - R MB. On limit: MB down to move'666 pdrPage.canvas.SetToolTipString(tip)667 data = self.LimitsTable.GetData()668 else:669 pdrPlot.plot(X,Y,colors[N%6],picker=False)670 if PickId and self.PatternTree.GetItemText(PickId) in ['Index Peak List','Unit Cells List']:671 peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))672 for peak in peaks:673 pdrPlot.axvline(peak[0],color='b')674 for hkl in self.HKL:675 pdrPlot.axvline(hkl[5],color='r',dashes=(5,5))676 if self.Contour:677 acolor = mpl.cm.get_cmap('Paired')678 pdrPlot.contourf(ContourX,ContourY,ContourZ,cmap=acolor)679 # pdrPlot.set_ylim(0,Nseq-1)680 else:681 self.Lines = Lines682 if not newPlot:683 pdrPage.toolbar.push_current()684 pdrPlot.set_xlim(xylim[0])685 pdrPlot.set_ylim(xylim[1])686 xylim = []687 pdrPage.toolbar.push_current()688 pdrPage.toolbar.draw()689 else:690 pdrPage.canvas.draw()691 692 693 self.Pwdr = True694 695 def PlotPowderLines(self):696 697 def OnMotion(event):698 xpos = event.xdata699 if xpos: #avoid out of frame mouse position700 pksPage.canvas.SetCursor(wx.CROSS_CURSOR)701 self.G2plotNB.status.SetFields(['2-theta =%9.3f '%(xpos,),])702 703 try:704 plotNum = self.G2plotNB.plotList.index('Powder Lines')705 pksPage = self.G2plotNB.nb.GetPage(plotNum)706 pksPage.figure.clf()707 pksPlot = pksPage.figure.gca()708 except ValueError,error:709 newPlot = True710 pksPlot = self.G2plotNB.add('Powder Lines').gca()711 plotNum = self.G2plotNB.plotList.index('Powder Lines')712 pksPage = self.G2plotNB.nb.GetPage(plotNum)713 pksPage.canvas.mpl_connect('motion_notify_event', OnMotion)714 715 pksPage.SetFocus()716 pksPlot.set_title('Powder Pattern Lines')717 pksPlot.set_xlabel(r'$\mathsf{2\theta}$',fontsize=14)718 PickId = self.PickId719 PatternId = self.PatternId720 peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))721 for peak in peaks:722 pksPlot.axvline(peak[0],color='b')723 for hkl in self.HKL:724 pksPlot.axvline(hkl[5],color='r',dashes=(5,5))725 xmin = peaks[0][0]726 xmax = peaks[-1][0]727 delt = xmax-xmin728 xlim = [max(0,xmin-delt/20.),min(180.,xmax+delt/20.)]729 pksPlot.set_xlim(xlim)730 pksPage.canvas.draw()731 732 733 731 def PlotTRImage(self,newPlot=False): 734 732 … … 801 799 Page.SetFocus() 802 800 803 data = self.PatternTree.GetItemPyData(self.PickId) 801 Data = self.PatternTree.GetItemPyData( \ 802 G2gd.GetPatternTreeItemId(self,self.Image, 'Image Controls')) 804 803 image = self.ImageZ 805 804 Iz = len(image) 806 Imin,Imax = data['range'][1]805 Imin,Imax = Data['range'][1] 807 806 step = (Imax-Imin)/5. 808 807 V = np.arange(Imin,Imax,step) 809 acolor = mpl.cm.get_cmap( 'Paired')808 acolor = mpl.cm.get_cmap(Data['color']) 810 809 Plot.set_xlabel('azimuth',fontsize=12) 811 810 Plot.set_ylabel('2-theta',fontsize=12) 812 Plot.contour(self.TA[ 1],self.TA[0],image,V,cmap=acolor)813 if data['showLines']:814 IOtth = data['IOtth']815 LRAzim = data['LRazimuth'] #NB: integers811 Plot.contour(self.TA[:,:,0],self.TA[:,:,1],self.TA[:,:,2],V,cmap=acolor) 812 if Data['showLines']: 813 IOtth = Data['IOtth'] 814 LRAzim = Data['LRazimuth'] #NB: integers 816 815 Plot.plot([LRAzim[0],LRAzim[1]],[IOtth[0],IOtth[0]],picker=True) 817 816 Plot.plot([LRAzim[0],LRAzim[1]],[IOtth[1],IOtth[1]],picker=True) … … 827 826 else: 828 827 Page.canvas.draw() 828 829 def PlotExposedImage(self,newPlot=False): 830 plotNo = self.G2plotNB.nb.GetSelection() 831 if self.G2plotNB.nb.GetPageText(plotNo) == '2D Transformed Powder Image': 832 PlotTRImage(self,newPlot) 833 elif self.G2plotNB.nb.GetPageText(plotNo) == '2D Powder Image': 834 PlotImage(self,newPlot) 835 elif self.G2plotNB.nb.GetPageText(plotNo) == '2D Integration': 836 PlotIntegration(self,newPlot) 837 838 def PlotIntegration(self,newPlot=False): 829 839 830 840 def OnMotion(event): 841 Page.canvas.SetToolTipString('') 842 Page.canvas.SetCursor(wx.CROSS_CURSOR) 843 azm = event.xdata 844 tth = event.ydata 845 if azm and tth: 846 self.G2plotNB.status.SetFields(\ 847 ['Detector 2-th =%9.2fdeg, azm = %7.2fdeg'%(tth,azm),]) 848 849 try: 850 plotNum = self.G2plotNB.plotList.index('2D Integration') 851 Page = self.G2plotNB.nb.GetPage(plotNum) 852 if not newPlot: 853 Plot = Page.figure.gca() #get previous plot & get limits 854 xylim = Plot.get_xlim(),Plot.get_ylim() 855 Page.figure.clf() 856 Plot = Page.figure.gca() #get a fresh plot after clf() 857 858 except ValueError,error: 859 Plot = self.G2plotNB.add('2D Integration').gca() 860 plotNum = self.G2plotNB.plotList.index('2D Integration') 861 Page = self.G2plotNB.nb.GetPage(plotNum) 862 Page.canvas.mpl_connect('motion_notify_event', OnMotion) 863 Page.views = False 864 view = False 865 Page.SetFocus() 866 867 Data = self.PatternTree.GetItemPyData( \ 868 G2gd.GetPatternTreeItemId(self,self.Image, 'Image Controls')) 869 image = self.Integrate[0] 870 xsc = self.Integrate[1] 871 ysc = self.Integrate[2] 872 Imin,Imax = Data['range'][1] 873 acolor = mpl.cm.get_cmap(Data['color']) 874 Plot.set_ylabel('azimuth',fontsize=12) 875 Plot.set_xlabel('2-theta',fontsize=12) 876 Plot.imshow(image,cmap=acolor,vmin=Imin,vmax=Imax,interpolation='nearest', \ 877 extent=[ysc[0],ysc[-1],xsc[0],xsc[-1]],aspect='auto') 878 if not newPlot: 879 Page.toolbar.push_current() 880 Plot.set_xlim(xylim[0]) 881 Plot.set_ylim(xylim[1]) 882 xylim = [] 883 Page.toolbar.push_current() 884 Page.toolbar.draw() 885 else: 886 Page.canvas.draw() 887
Note: See TracChangeset
for help on using the changeset viewer.