Changeset 537
- Timestamp:
- Apr 13, 2012 11:34:34 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASII.py
r536 r537 446 446 self.Image = 0 447 447 self.oldImagefile = '' 448 self.ImageZ = [] 448 449 self.Integrate = 0 449 450 self.Pwdr = False -
trunk/GSASIIIO.py
r526 r537 490 490 All files (*.*)|*.*',wx.OPEN|wx.CHANGE_DIR) 491 491 try: 492 dlg.SetFilename( ospath.split(imagefile)[1])492 dlg.SetFilename(''+ospath.split(imagefile)[1]) 493 493 if dlg.ShowModal() == wx.ID_OK: 494 494 imagefile = dlg.GetPath() … … 916 916 head,tail = ospath.split(powderfile) 917 917 name,ext = tail.split('.') 918 wx.BeginBusyCursor()919 918 for i,export in enumerate(exports): 920 919 filename = ospath.join(head,name+'-%03d.'%(i)+ext) … … 943 942 file = open(filename,'w') 944 943 print 'save powder pattern to file: ',filename 945 try: 946 x,y,w,yc,yb,yd = G2frame.PatternTree.GetItemPyData(PickId)[1] 947 file.write(powderfile+'\n') 948 file.write('BANK 1 %d %d CONS %.2f %.2f 0 0 FXYE\n'%(len(x),len(x),\ 949 100.*x[0],100.*(x[1]-x[0]))) 950 s = list(np.sqrt(1./np.array(w))) 951 XYW = zip(x,y,s) 952 for X,Y,S in XYW: 953 file.write("%15.6g %15.6g %15.6g\n" % (100.*X,Y,max(S,1.0))) 954 file.close() 955 finally: 956 wx.EndBusyCursor() 957 print 'powder pattern file written' 944 x,y,w,yc,yb,yd = G2frame.PatternTree.GetItemPyData(PickId)[1] 945 file.write(powderfile+'\n') 946 file.write('Instrument parameter file:'+ospath.split(prmname)[1]+'\n') 947 file.write('BANK 1 %d %d CONS %.2f %.2f 0 0 FXYE\n'%(len(x),len(x),\ 948 100.*x[0],100.*(x[1]-x[0]))) 949 s = list(np.sqrt(1./np.array(w))) 950 XYW = zip(x,y,s) 951 for X,Y,S in XYW: 952 file.write("%15.6g %15.6g %15.6g\n" % (100.*X,Y,max(S,1.0))) 953 file.close() 954 print 'powder pattern file '+filename+' written' 958 955 959 956 def powderXyeSave(G2frame,exports,powderfile): … … 966 963 file.write('#%s\n'%(export)) 967 964 print 'save powder pattern to file: ',filename 968 wx.BeginBusyCursor() 969 try: 970 x,y,w,yc,yb,yd = G2frame.PatternTree.GetItemPyData(PickId)[1] 971 s = list(np.sqrt(1./np.array(w))) 972 XYW = zip(x,y,s) 973 for X,Y,W in XYW: 974 file.write("%15.6g %15.6g %15.6g\n" % (X,Y,W)) 975 file.close() 976 finally: 977 wx.EndBusyCursor() 978 print 'powder pattern file written' 965 x,y,w,yc,yb,yd = G2frame.PatternTree.GetItemPyData(PickId)[1] 966 s = list(np.sqrt(1./np.array(w))) 967 XYW = zip(x,y,s) 968 for X,Y,W in XYW: 969 file.write("%15.6g %15.6g %15.6g\n" % (X,Y,W)) 970 file.close() 971 print 'powder pattern file '+filename+' written' 979 972 980 973 def PDFSave(G2frame,exports): -
trunk/GSASIIgrid.py
r535 r537 38 38 htmlFirstUse = True 39 39 40 [ wxID_FOURCALC,wxID_FOURSEARCH, 41 ] = [wx.NewId() for item in range( 2)]40 [ wxID_FOURCALC,wxID_FOURSEARCH, wxID_PEAKSMOVE, wxID_PEAKSCLEAR, 41 ] = [wx.NewId() for item in range(4)] 42 42 43 43 [ wxID_PWDRADD, wxID_HKLFADD, wxID_DATADELETE, … … 448 448 text='Search map') 449 449 450 # Phase / Data tab 451 self.DataMenu = wx.MenuBar() 452 self.DataEdit = wx.Menu(title='') 453 self.DataMenu.Append(menu=self.DataEdit, title='Edit') 454 self.DataMenu.Append(menu=MyHelp(self,helpType='Data'),title='&Help') 455 self.DataEdit.Append(id=wxID_PWDRADD, kind=wx.ITEM_NORMAL,text='Add powder histograms', 456 help='Select new powder histograms to be used for this phase') 457 self.DataEdit.Append(id=wxID_HKLFADD, kind=wx.ITEM_NORMAL,text='Add single crystal histograms', 458 help='Select new single crystal histograms to be used for this phase') 459 self.DataEdit.Append(id=wxID_DATADELETE, kind=wx.ITEM_NORMAL,text='Delete histograms', 460 help='Delete histograms from use for this phase') 461 450 462 # Phase / Atoms tab 451 463 self.AtomsMenu = wx.MenuBar() … … 476 488 help='Compute distances & angles for selected atoms') 477 489 478 # Phase / Data tab479 self.DataMenu = wx.MenuBar()480 self.DataEdit = wx.Menu(title='')481 self.DataMenu.Append(menu=self.DataEdit, title='Edit')482 self.DataMenu.Append(menu=MyHelp(self,helpType='Data'),title='&Help')483 self.DataEdit.Append(id=wxID_PWDRADD, kind=wx.ITEM_NORMAL,text='Add powder histograms',484 help='Select new powder histograms to be used for this phase')485 self.DataEdit.Append(id=wxID_HKLFADD, kind=wx.ITEM_NORMAL,text='Add single crystal histograms',486 help='Select new single crystal histograms to be used for this phase')487 self.DataEdit.Append(id=wxID_DATADELETE, kind=wx.ITEM_NORMAL,text='Delete histograms',488 help='Delete histograms from use for this phase')489 490 # Phase / Texture tab491 self.TextureMenu = wx.MenuBar()492 self.TextureEdit = wx.Menu(title='')493 self.TextureMenu.Append(menu=self.TextureEdit, title='Texture')494 self.TextureMenu.Append(menu=MyHelp(self,helpType='Texture'),title='&Help')495 self.TextureEdit.Append(id=wxID_REFINETEXTURE, kind=wx.ITEM_NORMAL,text='Refine texture',496 help='Refine the texture coefficients from sequential Pawley results')497 self.TextureEdit.Append(id=wxID_CLEARTEXTURE, kind=wx.ITEM_NORMAL,text='Clear texture',498 help='Clear the texture coefficients' )499 500 # Phase / Pawley tab501 self.PawleyMenu = wx.MenuBar()502 self.PawleyEdit = wx.Menu(title='')503 self.PawleyMenu.Append(menu=self.PawleyEdit,title='Operations')504 self.PawleyMenu.Append(menu=MyHelp(self,helpType='Pawley'),title='&Help')505 self.PawleyEdit.Append(id=wxID_PAWLEYLOAD, kind=wx.ITEM_NORMAL,text='Pawley create',506 help='Initialize Pawley reflection list')507 self.PawleyEdit.Append(id=wxID_PAWLEYESTIMATE, kind=wx.ITEM_NORMAL,text='Pawley estimate',508 help='Estimate initial Pawley intensities')509 self.PawleyEdit.Append(id=wxID_PAWLEYDELETE, kind=wx.ITEM_NORMAL,text='Pawley delete',510 help='Delete Pawley reflection list')511 512 490 # Phase / Draw Options tab 513 491 self.DataDrawOptions = wx.MenuBar() … … 545 523 self.DrawAtomCompute.Append(id=wxID_DRAWPLANE, kind=wx.ITEM_NORMAL,text='Best plane', 546 524 help='Compute best plane for 4+ selected atoms') 525 526 # Phase / Texture tab 527 self.TextureMenu = wx.MenuBar() 528 self.TextureEdit = wx.Menu(title='') 529 self.TextureMenu.Append(menu=self.TextureEdit, title='Texture') 530 self.TextureMenu.Append(menu=MyHelp(self,helpType='Texture'),title='&Help') 531 self.TextureEdit.Append(id=wxID_REFINETEXTURE, kind=wx.ITEM_NORMAL,text='Refine texture', 532 help='Refine the texture coefficients from sequential Pawley results') 533 self.TextureEdit.Append(id=wxID_CLEARTEXTURE, kind=wx.ITEM_NORMAL,text='Clear texture', 534 help='Clear the texture coefficients' ) 535 536 # Phase / Pawley tab 537 self.PawleyMenu = wx.MenuBar() 538 self.PawleyEdit = wx.Menu(title='') 539 self.PawleyMenu.Append(menu=self.PawleyEdit,title='Operations') 540 self.PawleyMenu.Append(menu=MyHelp(self,helpType='Pawley'),title='&Help') 541 self.PawleyEdit.Append(id=wxID_PAWLEYLOAD, kind=wx.ITEM_NORMAL,text='Pawley create', 542 help='Initialize Pawley reflection list') 543 self.PawleyEdit.Append(id=wxID_PAWLEYESTIMATE, kind=wx.ITEM_NORMAL,text='Pawley estimate', 544 help='Estimate initial Pawley intensities') 545 self.PawleyEdit.Append(id=wxID_PAWLEYDELETE, kind=wx.ITEM_NORMAL,text='Pawley delete', 546 help='Delete Pawley reflection list') 547 548 # Phase / Map peaks tab 549 self.MapPeaksMenu = wx.MenuBar() 550 self.MapPeaksEdit = wx.Menu(title='') 551 self.MapPeaksMenu.Append(menu=self.MapPeaksEdit, title='Map peaks') 552 self.MapPeaksMenu.Append(menu=MyHelp(self,helpType='Map peaks'),title='&Help') 553 self.MapPeaksEdit.Append(id=wxID_PEAKSMOVE, kind=wx.ITEM_NORMAL,text='Move peaks', 554 help='Move selected peaks to atom list') 555 self.MapPeaksEdit.Append(id=wxID_PEAKSCLEAR, kind=wx.ITEM_NORMAL,text='Clear peaks', 556 help='Clear the map peak list') 547 557 548 558 # end of GSAS-II menu definitions -
trunk/GSASIIimage.py
r536 r537 673 673 print 'Begin image integration' 674 674 LUtth = data['IOtth'] 675 LRazm = np.array(data['LRazimuth'] )675 LRazm = np.array(data['LRazimuth'],dtype=np.float64) 676 676 numAzms = data['outAzimuths'] 677 677 numChans = data['outChannels'] -
trunk/GSASIImath.py
r530 r537 12 12 import numpy as np 13 13 import numpy.linalg as nl 14 import numpy.ma as ma 14 15 import cPickle 15 16 import time 16 17 import math 18 import copy 17 19 import GSASIIpath 20 import GSASIIlattice as G2lat 18 21 import GSASIIspc as G2spc 19 22 import scipy.optimize as so … … 514 517 return text 515 518 516 519 def FourierMap(data,reflData): 520 521 import scipy.fftpack as fft 522 generalData = data['General'] 523 if not generalData['Map']['MapType']: 524 print '**** ERROR - Fourier map not defined' 525 return 526 mapData = generalData['Map'] 527 dmin = mapData['Resolution'] 528 SGData = generalData['SGData'] 529 cell = generalData['Cell'][1:8] 530 A = G2lat.cell2A(cell[:6]) 531 Hmax = np.asarray(G2lat.getHKLmax(dmin,SGData,A),dtype='i')+1 532 Fhkl = np.zeros(shape=2*Hmax,dtype='c16') 533 # Fhkl[0,0,0] = generalData['F000X'] 534 time0 = time.time() 535 for ref in reflData: 536 if ref[4] >= dmin: 537 for i,hkl in enumerate(ref[11]): 538 hkl = np.asarray(hkl,dtype='i') 539 Fosq,Fcsq,ph = ref[8:11] 540 dp = 360.*ref[12][i] 541 a = cosd(ph+dp) 542 b = sind(ph+dp) 543 phasep = complex(a,b) 544 phasem = complex(a,-b) 545 if 'Fobs' in mapData['MapType']: 546 F = np.sqrt(Fosq) 547 h,k,l = hkl+Hmax 548 Fhkl[h,k,l] = F*phasep 549 h,k,l = -hkl+Hmax 550 Fhkl[h,k,l] = F*phasem 551 elif 'Fcalc' in mapData['MapType']: 552 F = np.sqrt(Fcsq) 553 h,k,l = hkl+Hmax 554 Fhkl[h,k,l] = F*phasep 555 h,k,l = -hkl+Hmax 556 Fhkl[h,k,l] = F*phasem 557 elif 'delt-F' in mapData['MapType']: 558 dF = np.sqrt(Fosq)-np.sqrt(Fcsq) 559 h,k,l = hkl+Hmax 560 Fhkl[h,k,l] = dF*phasep 561 h,k,l = -hkl+Hmax 562 Fhkl[h,k,l] = dF*phasem 563 elif '2*Fo-Fc' in mapData['MapType']: 564 F = 2.*np.sqrt(Fosq)-np.sqrt(Fcsq) 565 h,k,l = hkl+Hmax 566 Fhkl[h,k,l] = F*phasep 567 h,k,l = -hkl+Hmax 568 Fhkl[h,k,l] = F*phasem 569 elif 'Patterson' in mapData['MapType']: 570 h,k,l = hkl+Hmax 571 Fhkl[h,k,l] = complex(Fosq,0.) 572 h,k,l = -hkl+Hmax 573 Fhkl[h,k,l] = complex(Fosq,0.) 574 Fhkl = fft.fftshift(Fhkl) 575 rho = fft.fftn(Fhkl)/cell[6] 576 print 'Fourier map time: %.4f'%(time.time()-time0),'no. elements: %d'%(Fhkl.size) 577 mapData['rho'] = np.real(rho) 578 mapData['rhoMax'] = max(np.max(mapData['rho']),-np.min(mapData['rho'])) 579 return mapData 580 581 def SearchMap(data,keepDup=False): 582 583 norm = 1./(np.sqrt(3.)*np.sqrt(2.*np.pi)**3) 584 585 def noDuplicate(xyz,peaks,SGData): #be careful where this is used - it's slow 586 equivs = G2spc.GenAtom(xyz,SGData) 587 xyzs = [equiv[0] for equiv in equivs] 588 for x in xyzs: 589 if True in [np.allclose(x,peak,atol=0.002) for peak in peaks]: 590 return False 591 return True 592 593 def findRoll(rhoMask,mapHalf): 594 indx = np.array(ma.nonzero(rhoMask)).T 595 rhoList = np.array([rho[i,j,k] for i,j,k in indx]) 596 rhoMax = np.max(rhoList) 597 return mapHalf-indx[np.argmax(rhoList)] 598 599 def rhoCalc(parms,rX,rY,rZ,res,SGLaue): 600 Mag,x0,y0,z0,sig = parms 601 if SGLaue in ['3','3m1','31m','6/m','6/mmm']: 602 return norm*Mag*np.exp(-((x0-rX)**2+(y0-rY)**2+(x0-rX)*(y0-rY)+(z0-rZ)**2)/(2.*sig**2))/(sig*res**3) 603 else: 604 return norm*Mag*np.exp(-((x0-rX)**2+(y0-rY)**2+(z0-rZ)**2)/(2.*sig**2))/(sig*res**3) 605 606 def peakFunc(parms,rX,rY,rZ,rho,res,SGLaue): 607 Mag,x0,y0,z0,sig = parms 608 M = rho-rhoCalc(parms,rX,rY,rZ,res,SGLaue) 609 return M 610 611 def peakHess(parms,rX,rY,rZ,rho,res,SGLaue): 612 Mag,x0,y0,z0,sig = parms 613 dMdv = np.zeros(([5,]+list(rX.shape))) 614 delt = .01 615 for i in range(5): 616 parms[i] -= delt 617 rhoCm = rhoCalc(parms,rX,rY,rZ,res,SGLaue) 618 parms[i] += 2.*delt 619 rhoCp = rhoCalc(parms,rX,rY,rZ,res,SGLaue) 620 parms[i] -= delt 621 dMdv[i] = (rhoCp-rhoCm)/(2.*delt) 622 rhoC = rhoCalc(parms,rX,rY,rZ,res,SGLaue) 623 Vec = np.sum(np.sum(np.sum(dMdv*(rho-rhoC),axis=3),axis=2),axis=1) 624 dMdv = np.reshape(dMdv,(5,rX.size)) 625 Hess = np.inner(dMdv,dMdv) 626 627 return Vec,Hess 628 629 generalData = data['General'] 630 phaseName = generalData['Name'] 631 SGData = generalData['SGData'] 632 cell = generalData['Cell'][1:8] 633 A = G2lat.cell2A(cell[:6]) 634 drawingData = data['Drawing'] 635 peaks = [] 636 mags = [] 637 try: 638 mapData = generalData['Map'] 639 contLevel = mapData['cutOff']*mapData['rhoMax']/100. 640 rho = copy.copy(mapData['rho']) #don't mess up original 641 mapHalf = np.array(rho.shape)/2 642 res = mapData['Resolution'] 643 incre = 1./np.array(rho.shape) 644 step = max(1.0,1./res)+1 645 steps = np.array(3*[step,]) 646 except KeyError: 647 print '**** ERROR - Fourier map not defined' 648 return peaks,mags 649 while True: 650 rhoMask = ma.array(rho,mask=(rho<contLevel)) 651 if not ma.count(rhoMask): 652 break 653 rMI = findRoll(rhoMask,mapHalf) 654 rho = np.roll(np.roll(np.roll(rho,rMI[0],axis=0),rMI[1],axis=1),rMI[2],axis=2) 655 rMM = mapHalf-steps 656 rMP = mapHalf+steps+1 657 rhoPeak = rho[rMM[0]:rMP[0],rMM[1]:rMP[1],rMM[2]:rMP[2]] 658 peakInt = np.sum(rhoPeak)*res**3 659 rX,rY,rZ = np.mgrid[rMM[0]:rMP[0],rMM[1]:rMP[1],rMM[2]:rMP[2]] 660 x0 = [peakInt,mapHalf[0],mapHalf[1],mapHalf[2],2.0] #magnitude, position & width(sig) 661 result = HessianLSQ(peakFunc,x0,Hess=peakHess, 662 args=(rX,rY,rZ,rhoPeak,res,SGData['SGLaue']),ftol=.0001,maxcyc=100) 663 x1 = result[0] 664 if np.any(x1 < 0): 665 break 666 peak = (np.array(x1[1:4])-rMI)*incre 667 if not len(peaks): 668 peaks.append(peak) 669 mags.append(x1[0]) 670 else: 671 if keepDup: 672 peaks.append(peak) 673 mags.append(x1[0]) 674 elif noDuplicate(peak,peaks,SGData) and x1[0] > 0.: 675 peaks.append(peak) 676 mags.append(x1[0]) 677 rho[rMM[0]:rMP[0],rMM[1]:rMP[1],rMM[2]:rMP[2]] = peakFunc(result[0],rX,rY,rZ,rhoPeak,res,SGData['SGLaue']) 678 rho = np.roll(np.roll(np.roll(rho,-rMI[2],axis=2),-rMI[1],axis=1),-rMI[0],axis=0) 679 return np.array(peaks),np.array([mags,]).T -
trunk/GSASIIphsGUI.py
r530 r537 255 255 if 'Map' not in generalData: 256 256 generalData['Map'] = {'MapType':'','RefList':'','Resolution':1.0, 257 'rhoMax':100.,'rho':[],'rhoMax':0.,'mapSize':10.0,'cutOff':50.} 257 'rho':[],'rhoMax':0.,'mapSize':10.0,'cutOff':50.} 258 if 'Flip' not in generalData: 259 generalData['Flip'] = {'RefList':'','Resolution':1.0,'Norm element':'C', 260 'k-factor':1.1,'rhoSig':0.0,'rho':[],'rhoMax':0.,'mapSize':10.0,'cutOff':50.} #??? 261 258 262 # if 'SH Texture' not in generalData: 259 263 # generalData['SH Texture'] = data['SH Texture'] … … 674 678 return mapSizer 675 679 680 def FlipSizer(): 681 682 def OnMapType(event): 683 Map['MapType'] = mapType.GetValue() 684 685 def OnRefList(event): 686 Flip['RefList'] = refList.GetValue() 687 688 def OnResVal(event): 689 try: 690 res = float(mapRes.GetValue()) 691 if 0.25 <= res <= 20.: 692 Flip['Resolution'] = res 693 except ValueError: 694 pass 695 flipRes.SetValue("%.2f"%(Flip['Resolution'])) #reset in case of error 696 697 def OnCutOff(event): 698 try: 699 res = float(cutOff.GetValue()) 700 if 1.0 <= res <= 100.: 701 Map['cutOff'] = res 702 except ValueError: 703 pass 704 cutOff.SetValue("%.1f"%(Map['cutOff'])) #reset in case of error 705 706 refList = data['Histograms'].keys() 707 flipSizer = wx.BoxSizer(wx.VERTICAL) 708 lineSizer = wx.BoxSizer(wx.HORIZONTAL) 709 lineSizer.Add(wx.StaticText(dataDisplay,label=' Charge flip controls: Reflection set from: '),0,wx.ALIGN_CENTER_VERTICAL) 710 refList = wx.ComboBox(dataDisplay,-1,value=Map['RefList'],choices=refList, 711 style=wx.CB_READONLY|wx.CB_DROPDOWN) 712 refList.Bind(wx.EVT_COMBOBOX,OnRefList) 713 lineSizer.Add(refList,0,wx.ALIGN_CENTER_VERTICAL) 714 flipSizer.Add(lineSizer,0,wx.ALIGN_CENTER_VERTICAL) 715 line2Sizer = wx.BoxSizer(wx.HORIZONTAL) 716 line2Sizer.Add(wx.StaticText(dataDisplay,label=' Resolution: '),0,wx.ALIGN_CENTER_VERTICAL) 717 mapRes = wx.TextCtrl(dataDisplay,value='%.2f'%(Map['Resolution']),style=wx.TE_PROCESS_ENTER) 718 mapRes.Bind(wx.EVT_TEXT_ENTER,OnResVal) 719 mapRes.Bind(wx.EVT_KILL_FOCUS,OnResVal) 720 line2Sizer.Add(mapRes,0,wx.ALIGN_CENTER_VERTICAL) 721 line2Sizer.Add(wx.StaticText(dataDisplay,label=' Peak cutoff %: '),0,wx.ALIGN_CENTER_VERTICAL) 722 cutOff = wx.TextCtrl(dataDisplay,value='%.1f'%(Map['cutOff']),style=wx.TE_PROCESS_ENTER) 723 cutOff.Bind(wx.EVT_TEXT_ENTER,OnCutOff) 724 cutOff.Bind(wx.EVT_KILL_FOCUS,OnCutOff) 725 line2Sizer.Add(cutOff,0,wx.ALIGN_CENTER_VERTICAL) 726 flipSizer.Add(line2Sizer,0,wx.ALIGN_CENTER_VERTICAL) 727 return flipSizer 728 676 729 General.DestroyChildren() 677 730 dataDisplay = wx.Panel(General) … … 694 747 mainSizer.Add((5,5),0) 695 748 mainSizer.Add(MapSizer()) 749 750 mainSizer.Add((5,5),0) 751 mainSizer.Add(FlipSizer()) 696 752 697 753 dataDisplay.SetSizer(mainSizer) … … 3372 3428 3373 3429 ################################################################################ 3374 ##### End of mainroutines3430 ##### Fourier routines 3375 3431 ################################################################################ 3432 3433 def FillMapPeaksGrid(): 3434 3435 def RowSelect(event): 3436 r,c = event.GetRow(),event.GetCol() 3437 if r < 0 and c < 0: 3438 if MapPeaks.IsSelection(): 3439 MapPeaks.ClearSelection() 3440 else: 3441 for row in range(MapPeaks.GetNumberRows()): 3442 MapPeaks.SelectRow(row,True) 3443 3444 elif c < 0: #only row clicks 3445 if event.ControlDown(): 3446 if r in MapPeaks.GetSelectedRows(): 3447 MapPeaks.DeselectRow(r) 3448 else: 3449 MapPeaks.SelectRow(r,True) 3450 elif event.ShiftDown(): 3451 for row in range(r+1): 3452 MapPeaks.SelectRow(row,True) 3453 else: 3454 MapPeaks.ClearSelection() 3455 MapPeaks.SelectRow(r,True) 3456 G2plt.PlotStructure(G2frame,data) 3457 3458 G2frame.dataFrame.setSizePosLeft([450,300]) 3459 if 'Map Peaks' in data: 3460 mapPeaks = data['Map Peaks'] 3461 rowLabels = [] 3462 for i in range(len(mapPeaks)): rowLabels.append(str(i)) 3463 colLabels = ['mag','x','y','z'] 3464 Types = 4*[wg.GRID_VALUE_FLOAT+':10,4',] 3465 MapPeaksTable = G2gd.Table(mapPeaks,rowLabels=rowLabels,colLabels=colLabels,types=Types) 3466 MapPeaks.SetTable(MapPeaksTable, True) 3467 MapPeaks.Bind(wg.EVT_GRID_LABEL_LEFT_CLICK, RowSelect) 3468 for r in range(MapPeaks.GetNumberRows()): 3469 for c in range(MapPeaks.GetNumberCols()): 3470 MapPeaks.SetCellStyle(r,c,VERY_LIGHT_GREY,True) 3471 MapPeaks.SetMargins(0,0) 3472 MapPeaks.AutoSizeColumns(False) 3473 3474 def OnPeaksMove(event): 3475 if 'Map Peaks' in data: 3476 mapPeaks = data['Map Peaks'] 3477 Ind = MapPeaks.GetSelectedRows() 3478 for ind in Ind: 3479 print mapPeaks[ind] 3480 x,y,z = mapPeaks[ind][1:] 3481 AtomAdd(x,y,z) 3482 3483 def OnPeaksClear(event): 3484 data['Map Peaks'] = [] 3485 FillMapPeaksGrid() 3486 G2plt.PlotStructure(G2frame,data) 3376 3487 3377 3488 def OnFourierMaps(event): 3378 import scipy.fftpack as fft3379 3489 generalData = data['General'] 3380 if not generalData['Map']['MapType']:3381 print '**** ERROR - Fourier map not defined'3382 return3383 3490 mapData = generalData['Map'] 3384 dmin = mapData['Resolution']3491 reflName = mapData['RefList'] 3385 3492 phaseName = generalData['Name'] 3386 SGData = generalData['SGData']3387 cell = generalData['Cell'][1:8]3388 A = G2lat.cell2A(cell[:6])3389 Hmax = np.asarray(G2lat.getHKLmax(dmin,SGData,A),dtype='i')+13390 Fhkl = np.zeros(shape=2*Hmax,dtype='c16')3391 reflName = mapData['RefList']3392 3493 if 'PWDR' in reflName: 3393 3494 PatternId = G2gd.GetPatternTreeItemId(G2frame,G2frame.root, reflName) … … 3397 3498 print 'single crystal reflections' 3398 3499 return 3399 # Fhkl[0,0,0] = generalData['F000X'] 3400 time0 = time.time() 3401 for ref in reflData: 3402 if ref[4] >= dmin: 3403 for i,hkl in enumerate(ref[11]): 3404 hkl = np.asarray(hkl,dtype='i') 3405 Fosq,Fcsq,ph = ref[8:11] 3406 dp = 360.*ref[12][i] 3407 a = cosd(ph+dp) 3408 b = sind(ph+dp) 3409 phasep = complex(a,b) 3410 phasem = complex(a,-b) 3411 if 'Fobs' in mapData['MapType']: 3412 F = np.sqrt(Fosq) 3413 h,k,l = hkl+Hmax 3414 Fhkl[h,k,l] = F*phasep 3415 h,k,l = -hkl+Hmax 3416 Fhkl[h,k,l] = F*phasem 3417 elif 'Fcalc' in mapData['MapType']: 3418 F = np.sqrt(Fcsq) 3419 h,k,l = hkl+Hmax 3420 Fhkl[h,k,l] = F*phasep 3421 h,k,l = -hkl+Hmax 3422 Fhkl[h,k,l] = F*phasem 3423 elif 'delt-F' in mapData['MapType']: 3424 dF = np.sqrt(Fosq)-np.sqrt(Fcsq) 3425 h,k,l = hkl+Hmax 3426 Fhkl[h,k,l] = dF*phasep 3427 h,k,l = -hkl+Hmax 3428 Fhkl[h,k,l] = dF*phasem 3429 elif '2*Fo-Fc' in mapData['MapType']: 3430 F = 2.*np.sqrt(Fosq)-np.sqrt(Fcsq) 3431 h,k,l = hkl+Hmax 3432 Fhkl[h,k,l] = F*phasep 3433 h,k,l = -hkl+Hmax 3434 Fhkl[h,k,l] = F*phasem 3435 elif 'Patterson' in mapData['MapType']: 3436 h,k,l = hkl+Hmax 3437 Fhkl[h,k,l] = complex(Fosq,0.) 3438 h,k,l = -hkl+Hmax 3439 Fhkl[h,k,l] = complex(Fosq,0.) 3440 Fhkl = fft.fftshift(Fhkl) 3441 rho = fft.fftn(Fhkl)/cell[6] 3442 print 'Fourier map time: %.4f'%(time.time()-time0),'no. elements: %d'%(Fhkl.size) 3443 mapData['rho'] = np.real(rho) 3444 mapData['rhoMax'] = max(np.max(mapData['rho']),-np.min(mapData['rho'])) 3500 mapData.update(G2mth.FourierMap(data,reflData)) 3501 mapSig = np.std(mapData['rho']) 3445 3502 data['Drawing']['contourLevel'] = 1. 3446 3503 data['Drawing']['mapSize'] = 10. 3447 print mapData['MapType']+' computed: rhomax = %.3f rhomin = %.3f '%(np.max(mapData['rho']),np.min(mapData['rho']))3504 print mapData['MapType']+' computed: rhomax = %.3f rhomin = %.3f sigma = %.3f'%(np.max(mapData['rho']),np.min(mapData['rho']),mapSig) 3448 3505 G2plt.PlotStructure(G2frame,data) 3449 3506 … … 3465 3522 def OnSearchMaps(event): 3466 3523 3467 norm = 1./(np.sqrt(3.)*np.sqrt(2.*np.pi)**3)3468 3469 def noDuplicate(xyz,peaks,SGData): #be careful where this is used - it's slow3470 equivs = G2spc.GenAtom(xyz,SGData)3471 xyzs = [equiv[0] for equiv in equivs]3472 for x in xyzs:3473 if True in [np.allclose(x,peak,atol=0.002) for peak in peaks]:3474 return False3475 return True3476 3477 def findRoll(rhoMask,mapHalf):3478 indx = np.array(ma.nonzero(rhoMask)).T3479 rhoList = np.array([rho[i,j,k] for i,j,k in indx])3480 rhoMax = np.max(rhoList)3481 return mapHalf-indx[np.argmax(rhoList)]3482 3483 def rhoCalc(parms,rX,rY,rZ,res,SGLaue):3484 Mag,x0,y0,z0,sig = parms3485 if SGLaue in ['3','3m1','31m','6/m','6/mmm']:3486 return norm*Mag*np.exp(-((x0-rX)**2+(y0-rY)**2+(x0-rX)*(y0-rY)+(z0-rZ)**2)/(2.*sig**2))/(sig*res**3)3487 else:3488 return norm*Mag*np.exp(-((x0-rX)**2+(y0-rY)**2+(z0-rZ)**2)/(2.*sig**2))/(sig*res**3)3489 3490 def peakFunc(parms,rX,rY,rZ,rho,res,SGLaue):3491 Mag,x0,y0,z0,sig = parms3492 M = rho-rhoCalc(parms,rX,rY,rZ,res,SGLaue)3493 return M3494 3495 def peakHess(parms,rX,rY,rZ,rho,res,SGLaue):3496 Mag,x0,y0,z0,sig = parms3497 dMdv = np.zeros(([5,]+list(rX.shape)))3498 delt = .013499 for i in range(5):3500 parms[i] -= delt3501 rhoCm = rhoCalc(parms,rX,rY,rZ,res,SGLaue)3502 parms[i] += 2.*delt3503 rhoCp = rhoCalc(parms,rX,rY,rZ,res,SGLaue)3504 parms[i] -= delt3505 dMdv[i] = (rhoCp-rhoCm)/(2.*delt)3506 rhoC = rhoCalc(parms,rX,rY,rZ,res,SGLaue)3507 Vec = np.sum(np.sum(np.sum(dMdv*(rho-rhoC),axis=3),axis=2),axis=1)3508 dMdv = np.reshape(dMdv,(5,rX.size))3509 Hess = np.inner(dMdv,dMdv)3510 3511 return Vec,Hess3512 3513 generalData = data['General']3514 phaseName = generalData['Name']3515 SGData = generalData['SGData']3516 cell = generalData['Cell'][1:8]3517 A = G2lat.cell2A(cell[:6])3518 drawingData = data['Drawing']3519 try:3520 mapData = generalData['Map']3521 contLevel = mapData['cutOff']*mapData['rhoMax']/100.3522 rho = copy.copy(mapData['rho']) #don't mess up original3523 mapHalf = np.array(rho.shape)/23524 res = mapData['Resolution']3525 incre = 1./np.array(rho.shape)3526 step = max(1.0,1./res)+13527 steps = np.array(3*[step,])3528 except KeyError:3529 print '**** ERROR - Fourier map not defined'3530 return3531 3524 peaks = [] 3532 3525 mags = [] … … 3535 3528 wx.BeginBusyCursor() 3536 3529 try: 3537 while True: 3538 rhoMask = ma.array(rho,mask=(rho<contLevel)) 3539 if not ma.count(rhoMask): 3540 break 3541 rMI = findRoll(rhoMask,mapHalf) 3542 rho = np.roll(np.roll(np.roll(rho,rMI[0],axis=0),rMI[1],axis=1),rMI[2],axis=2) 3543 rMM = mapHalf-steps 3544 rMP = mapHalf+steps+1 3545 rhoPeak = rho[rMM[0]:rMP[0],rMM[1]:rMP[1],rMM[2]:rMP[2]] 3546 peakInt = np.sum(rhoPeak)*res**3 3547 rX,rY,rZ = np.mgrid[rMM[0]:rMP[0],rMM[1]:rMP[1],rMM[2]:rMP[2]] 3548 x0 = [peakInt,mapHalf[0],mapHalf[1],mapHalf[2],2.0] #magnitude, position & width(sig) 3549 result = G2mth.HessianLSQ(peakFunc,x0,Hess=peakHess, 3550 args=(rX,rY,rZ,rhoPeak,res,SGData['SGLaue']),ftol=.0001,maxcyc=100) 3551 x1 = result[0] 3552 if np.any(x1 < 0): 3553 break 3554 peak = (np.array(x1[1:4])-rMI)*incre 3555 if not len(peaks): 3556 peaks.append(peak) 3557 mags.append(x1[0]) 3558 else: 3559 if noDuplicate(peak,peaks,SGData) and x1[0] > 0.: 3560 peaks.append(peak) 3561 mags.append(x1[0]) 3562 rho[rMM[0]:rMP[0],rMM[1]:rMP[1],rMM[2]:rMP[2]] = peakFunc(result[0],rX,rY,rZ,rhoPeak,res,SGData['SGLaue']) 3563 rho = np.roll(np.roll(np.roll(rho,-rMI[2],axis=2),-rMI[1],axis=1),-rMI[0],axis=0) 3530 peaks,mags = G2mth.SearchMap(data,keepDup=True) 3564 3531 finally: 3565 3532 wx.EndBusyCursor() 3566 sortIdx = np.argsort(mags) 3567 print ' Map search peaks found:' 3568 print ' No. Mag. x y z' 3569 for j,i in enumerate(sortIdx[::-1]): 3570 print ' %3d %8.3f %8.5f %8.5f %8.5f'%(j,mags[i],peaks[i][0],peaks[i][1],peaks[i][2]) 3571 print ' Map search finished, time = %.2fs'%(time.time()-time0) 3572 3533 sortIdx = np.argsort(mags.flatten()) 3534 if len(peaks): 3535 data['Map Peaks'] = np.concatenate((mags,peaks),axis=1) 3536 3537 print ' Map search peaks found:' 3538 print ' No. Mag. x y z' 3539 for j,i in enumerate(sortIdx[::-1]): 3540 print ' %3d %8.3f %8.5f %8.5f %8.5f'%(j,mags[i],peaks[i][0],peaks[i][1],peaks[i][2]) 3541 print ' Map search finished, time = %.2fs'%(time.time()-time0) 3542 Page = G2frame.dataDisplay.FindPage('Map peaks') 3543 G2frame.dataDisplay.ChangeSelection(Page) 3544 G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.MapPeaksMenu) 3545 G2frame.dataFrame.Bind(wx.EVT_MENU, OnPeaksMove, id=G2gd.wxID_PEAKSMOVE) 3546 G2frame.dataFrame.Bind(wx.EVT_MENU, OnPeaksClear, id=G2gd.wxID_PEAKSCLEAR) 3547 FillMapPeaksGrid() 3548 G2plt.PlotStructure(G2frame,data) 3549 3573 3550 def OnTextureRefine(event): 3574 3551 print 'refine texture?' … … 3639 3616 UpdateTexture() 3640 3617 G2plt.PlotTexture(G2frame,data,Start=True) 3618 elif text == 'Map peaks': 3619 G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.MapPeaksMenu) 3620 G2frame.dataFrame.Bind(wx.EVT_MENU, OnPeaksMove, id=G2gd.wxID_PEAKSMOVE) 3621 G2frame.dataFrame.Bind(wx.EVT_MENU, OnPeaksClear, id=G2gd.wxID_PEAKSCLEAR) 3622 FillMapPeaksGrid() 3623 G2plt.PlotStructure(G2frame,data) 3624 3641 3625 else: 3642 3626 G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.BlankMenu) … … 3670 3654 Texture = wx.ScrolledWindow(G2frame.dataDisplay) 3671 3655 G2frame.dataDisplay.AddPage(Texture,'Texture') 3672 3656 MapPeaks = G2gd.GSGrid(G2frame.dataDisplay) 3657 G2frame.dataDisplay.AddPage(MapPeaks,'Map peaks') 3658 3673 3659 G2frame.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged) 3674 3660 G2frame.dataDisplay.SetSelection(oldPage) -
trunk/GSASIIplot.py
r536 r537 1707 1707 Page.canvas.SetToolTipString('') 1708 1708 sizexy = Data['size'] 1709 if event.xdata and event.ydata : #avoid out of frame errors1709 if event.xdata and event.ydata and len(G2frame.ImageZ): #avoid out of frame errors 1710 1710 Page.canvas.SetCursor(wx.CROSS_CURSOR) 1711 1711 item = G2frame.itemPicked … … 1826 1826 scaley = 1000./pixelSize[1] 1827 1827 pixLimit = Data['pixLimit'] 1828 if G2frame.itemPicked is None and PickName == 'Image Controls' :1828 if G2frame.itemPicked is None and PickName == 'Image Controls' and len(G2frame.ImageZ): 1829 1829 # sizexy = Data['size'] 1830 1830 Xpos = event.xdata … … 1986 1986 G2frame.PatternTree.SetItemPyData(G2frame.Image,[size,imagefile]) 1987 1987 G2frame.ImageZ = G2IO.GetImageData(G2frame,imagefile,imageOnly=True) 1988 # print G2frame.ImageZ.shape,G2frame.ImageZ.size,Data['size'] #might be useful debugging line1989 1988 G2frame.oldImagefile = imagefile 1990 1989 … … 2281 2280 Mydir = generalData['Mydir'] 2282 2281 atomData = data['Atoms'] 2282 if 'Map Peaks' in data: 2283 mapPeaks = data['Map Peaks'] 2283 2284 drawingData = data['Drawing'] 2284 2285 drawAtoms = drawingData['Atoms'] … … 2327 2328 if Add: 2328 2329 Indx = GetSelectedAtoms() 2329 for i,atom in enumerate(drawAtoms): 2330 x,y,z = atom[cx:cx+3] 2331 X,Y,Z = gluProject(x,y,z,Model,Proj,View) 2332 XY = [int(X),int(View[3]-Y)] 2333 if np.allclose(xy,XY,atol=10) and Z < Zmax: 2334 Zmax = Z 2335 try: 2336 Indx.remove(i) 2337 ClearSelectedAtoms() 2338 for id in Indx: 2339 SetSelectedAtoms(id,Add) 2340 except: 2341 SetSelectedAtoms(i,Add) 2342 2330 if G2frame.dataDisplay.GetPageText(getSelection()) == 'Map peaks': 2331 for i,peak in enumerate(mapPeaks): 2332 x,y,z = peak[1:] 2333 X,Y,Z = gluProject(x,y,z,Model,Proj,View) 2334 XY = [int(X),int(View[3]-Y)] 2335 if np.allclose(xy,XY,atol=10) and Z < Zmax: 2336 Zmax = Z 2337 try: 2338 Indx.remove(i) 2339 ClearSelectedAtoms() 2340 for id in Indx: 2341 SetSelectedAtoms(id,Add) 2342 except: 2343 SetSelectedAtoms(i,Add) 2344 else: 2345 for i,atom in enumerate(drawAtoms): 2346 x,y,z = atom[cx:cx+3] 2347 X,Y,Z = gluProject(x,y,z,Model,Proj,View) 2348 XY = [int(X),int(View[3]-Y)] 2349 if np.allclose(xy,XY,atol=10) and Z < Zmax: 2350 Zmax = Z 2351 try: 2352 Indx.remove(i) 2353 ClearSelectedAtoms() 2354 for id in Indx: 2355 SetSelectedAtoms(id,Add) 2356 except: 2357 SetSelectedAtoms(i,Add) 2358 2343 2359 def OnMouseDown(event): 2344 2360 xy = event.GetPosition() … … 2418 2434 if G2frame.dataDisplay.GetPageText(page) == 'Draw Atoms': 2419 2435 G2frame.dataDisplay.GetPage(page).ClearSelection() #this is the Atoms grid in Draw Atoms 2436 elif G2frame.dataDisplay.GetPageText(page) == 'Map peaks': 2437 G2frame.dataDisplay.GetPage(page).ClearSelection() #this is the Atoms grid in Atoms 2420 2438 elif G2frame.dataDisplay.GetPageText(page) == 'Atoms': 2421 2439 G2frame.dataDisplay.GetPage(page).ClearSelection() #this is the Atoms grid in Atoms 2440 2422 2441 2423 2442 def SetSelectedAtoms(ind,Add=False): … … 2426 2445 if G2frame.dataDisplay.GetPageText(page) == 'Draw Atoms': 2427 2446 G2frame.dataDisplay.GetPage(page).SelectRow(ind,Add) #this is the Atoms grid in Draw Atoms 2447 elif G2frame.dataDisplay.GetPageText(page) == 'Map peaks': 2448 G2frame.dataDisplay.GetPage(page).SelectRow(ind,Add) 2428 2449 elif G2frame.dataDisplay.GetPageText(page) == 'Atoms': 2429 2450 Id = drawAtoms[ind][-2] … … 2438 2459 if G2frame.dataDisplay.GetPageText(page) == 'Draw Atoms': 2439 2460 Ind = G2frame.dataDisplay.GetPage(page).GetSelectedRows() #this is the Atoms grid in Draw Atoms 2461 elif G2frame.dataDisplay.GetPageText(page) == 'Map peaks': 2462 Ind = G2frame.dataDisplay.GetPage(page).GetSelectedRows() 2440 2463 elif G2frame.dataDisplay.GetPageText(page) == 'Atoms': 2441 2464 Ind = G2frame.dataDisplay.GetPage(page).GetSelectedRows() #this is the Atoms grid in Atoms … … 2659 2682 Dx = np.inner(Amat,bond) 2660 2683 Z = np.sqrt(np.sum(Dx**2)) 2661 azm = atan2d(-Dx[1],-Dx[0]) 2662 phi = acosd(Dx[2]/Z) 2663 glRotate(-azm,0,0,1) 2664 glRotate(phi,1,0,0) 2665 q = gluNewQuadric() 2666 gluCylinder(q,radius,radius,Z,slice,2) 2684 if Z: 2685 azm = atan2d(-Dx[1],-Dx[0]) 2686 phi = acosd(Dx[2]/Z) 2687 glRotate(-azm,0,0,1) 2688 glRotate(phi,1,0,0) 2689 q = gluNewQuadric() 2690 gluCylinder(q,radius,radius,Z,slice,2) 2667 2691 glPopMatrix() 2668 2692 glPopMatrix() … … 2698 2722 glEnd() 2699 2723 glPopMatrix() 2724 2725 def RenderMapPeak(x,y,z,color): 2726 vecs = np.array([[[-.01,0,0],[.01,0,0]],[[0,-.01,0],[0,.01,0]],[[0,0,-.01],[0,0,.01]]]) 2727 xyz = np.array([x,y,z]) 2728 glEnable(GL_COLOR_MATERIAL) 2729 glLineWidth(3) 2730 glColor3fv(color) 2731 glPushMatrix() 2732 glBegin(GL_LINES) 2733 for vec in vecs: 2734 glVertex3fv(vec[0]+xyz) 2735 glVertex3fv(vec[1]+xyz) 2736 glEnd() 2737 glColor4ubv([0,0,0,0]) 2738 glPopMatrix() 2739 glDisable(GL_COLOR_MATERIAL) 2700 2740 2701 2741 def RenderBackbone(Backbone,BackboneColor,radius): … … 2737 2777 def Draw(): 2738 2778 mapData = generalData['Map'] 2779 pageName = '' 2780 page = getSelection() 2781 if page: 2782 pageName = G2frame.dataDisplay.GetPageText(page) 2739 2783 rhoXYZ = [] 2740 2784 if len(mapData['rho']): … … 2815 2859 CL = atom[cs+2] 2816 2860 color = np.array(CL)/255. 2817 if iat in Ind :2861 if iat in Ind and G2frame.dataDisplay.GetPageText(getSelection()) != 'Map peaks': 2818 2862 color = np.array(Gr)/255. 2819 2863 # color += [.25,] … … 2893 2937 if len(rhoXYZ): 2894 2938 RenderMap(rho,rhoXYZ,indx,Rok) 2939 if len(mapPeaks): 2940 for ind,[mag,x,y,z] in enumerate(mapPeaks): 2941 if ind in Ind and pageName == 'Map peaks': 2942 RenderMapPeak(x,y,z,Gr) 2943 else: 2944 RenderMapPeak(x,y,z,Wt) 2895 2945 if Backbone: 2896 2946 RenderBackbone(Backbone,BackboneColor,bondR)
Note: See TracChangeset
for help on using the changeset viewer.