Changeset 83 for trunk/GSASIIgrid.py
- Timestamp:
- Jun 4, 2010 11:33:02 AM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIgrid.py
r82 r83 16 16 import GSASIIIO as G2IO 17 17 import GSASIIpwdGUI as G2pdG 18 import GSASIIimgGUI as G2imG 19 import GSASIIphsGUI as G2phG 18 20 19 21 # trig functions in degrees … … 425 427 self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame)) 426 428 427 def UpdateImageControls(self,data):428 import ImageCalibrants as calFile429 430 def OnNewColorBar(event):431 data['color'] = colSel.GetValue()432 G2plt.PlotExposedImage(self)433 434 def OnNewCalibrant(event):435 data['calibrant'] = calSel.GetValue()436 437 def OnPixLimit(event):438 data['pixLimit'] = int(pixLimit.GetValue())439 440 def OnMaxSlider(event):441 logDeltZero = math.log(data['range'][0][1]-data['range'][0][0])442 imax = int(maxSel.GetValue())*logDeltZero/100.443 data['range'][1][1] = math.exp(imax)+data['range'][0][0]444 data['range'][1][0] = min(data['range'][1][1]-1,data['range'][1][0])445 G2plt.PlotExposedImage(self)446 447 def OnMinSlider(event):448 DeltOne = data['range'][1][1]-data['range'][0][0]449 imin = int(minSel.GetValue())*DeltOne/100.450 data['range'][1][0] = min(data['range'][1][1]-1,imin+data['range'][0][0])451 G2plt.PlotExposedImage(self)452 453 def OnNumOutChans(event):454 try:455 numChans = int(outChan.GetValue())456 if numChans < 1:457 raise ValueError458 data['outChannels'] = numChans459 except ValueError:460 pass461 self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)462 outChan.SetValue(str(data['outChannels'])) #reset in case of error463 464 def OnNumOutAzms(event):465 try:466 numAzms = int(outAzim.GetValue())467 if numAzms < 1:468 raise ValueError469 data['outAzimuths'] = numAzms470 except ValueError:471 pass472 self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)473 outAzim.SetValue(str(data['outAzimuths'])) #reset in case of error474 475 def OnWavelength(event):476 try:477 wave = float(waveSel.GetValue())478 if wave < .01:479 raise ValueError480 data['wavelength'] = wave481 except ValueError:482 pass483 waveSel.SetValue("%6.5f" % (data['wavelength'])) #reset in case of error484 485 def OnCutOff(event):486 try:487 cutoff = float(cutOff.GetValue())488 data['cutoff'] = cutoff489 except ValueError:490 pass491 cutOff.SetValue("%.1f"%(data['cutoff'])) #reset in case of error492 493 def OnShowLines(event):494 if data['showLines']:495 data['showLines'] = False496 else:497 data['showLines'] = True498 G2plt.PlotExposedImage(self)499 500 def OnFullIntegrate(event):501 if data['fullIntegrate']:502 data['fullIntegrate'] = False503 self.Lazim.SetEditable(True)504 self.Razim.SetEditable(True)505 else:506 data['fullIntegrate'] = True507 self.Lazim.SetEditable(False)508 self.Razim.SetEditable(False)509 self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)510 G2plt.PlotExposedImage(self)511 512 def OnSetDefault(event):513 import copy514 if data['setDefault']:515 self.imageDefault = {}516 data['setDefault'] = False517 else:518 self.imageDefault = copy.copy(data)519 data['setDefault'] = True520 521 def OnIOtth(event):522 Ltth = float(self.InnerTth.GetValue())523 Utth = float(self.OuterTth.GetValue())524 if Ltth > Utth:525 Ltth,Utth = Utth,Ltth526 data['IOtth'] = [Ltth,Utth]527 self.InnerTth.SetValue("%8.2f" % (Ltth))528 self.OuterTth.SetValue("%8.2f" % (Utth))529 self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)530 G2plt.PlotExposedImage(self)531 532 def OnLRazim(event):533 Lazm = int(self.Lazim.GetValue())534 Razm = int(self.Razim.GetValue())535 data['LRazimuth'] = [Lazm,Razm]536 self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)537 G2plt.PlotExposedImage(self)538 539 def OnSetRings(event):540 if data['setRings']:541 data['setRings'] = False542 else:543 data['setRings'] = True544 setRings.SetValue(data['setRings'])545 G2plt.PlotExposedImage(self)546 547 def OnClearCalib(event):548 data['ring'] = []549 data['rings'] = []550 data['ellipses'] = []551 self.dataFrame.ImageEdit.Enable(id=wxID_IMCLEARCALIB,enable=False)552 G2plt.PlotExposedImage(self)553 554 def OnCalibrate(event):555 data['setRings'] = False556 setRings.SetValue(data['setRings'])557 msg = \558 '''Select > 4 points on inner ring of image pattern.559 Click right mouse button to select point.560 Use left mouse button to delete point.561 Press OK when done'''562 dlg = wx.MessageDialog(self,msg,'Pick inner ring',wx.OK)563 self.ifGetRing = True564 dlg.ShowModal()565 self.ifGetRing = False566 567 if G2img.ImageCalibrate(self,data):568 Status.SetStatusText('Calibration successful')569 cent = data['center']570 centText.SetValue(("%8.3f,%8.3f" % (cent[0],cent[1])))571 distSel.SetValue("%8.3f"%(data['distance']))572 tiltSel.SetValue("%9.3f"%(data['tilt']))573 rotSel.SetValue("%9.3f"%(data['rotation']))574 self.dataFrame.ImageEdit.Enable(id=wxID_IMCLEARCALIB,enable=True)575 else:576 Status.SetStatusText('Calibration failed')577 578 def OnIntegrate(event):579 G2img.ImageIntegrate(self,data)580 G2plt.PlotIntegration(self,newPlot=True)581 self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=True)582 583 def OnIntegrateAll(event):584 print 'integrate all'585 TextList = []586 Names = []587 if self.PatternTree.GetCount():588 id, cookie = self.PatternTree.GetFirstChild(self.root)589 while id:590 name = self.PatternTree.GetItemText(id)591 Names.append(name)592 if 'IMG' in name:593 TextList.append([False,name,id])594 id, cookie = self.PatternTree.GetNextChild(self.root, cookie)595 if not len(TextList):596 self.ErrorDialog('Nothing to integrate','There must some "IMG" patterns')597 return598 dlg = self.CopyDialog(self,'Image integration controls','Select images to integrate:',TextList)599 try:600 if dlg.ShowModal() == wx.ID_OK:601 result = dlg.GetData()602 for item in result:603 ifintegrate,name,id = item604 if ifintegrate:605 id = GetPatternTreeItemId(self, self.root, name)606 size,imagefile = self.PatternTree.GetItemPyData(id)607 self.ImageZ = G2IO.GetImageData(imagefile,imageOnly=True)608 Id = GetPatternTreeItemId(self,id, 'Image Controls')609 Data = self.PatternTree.GetItemPyData(Id)610 G2img.ImageIntegrate(self,Data)611 G2plt.PlotIntegration(self,newPlot=True)612 self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=True)613 G2IO.SaveIntegration(self,Id,Data)614 finally:615 dlg.Destroy()616 617 def OnSaveIntegrate(event):618 print 'save integration'619 G2IO.SaveIntegration(self,self.PickId,data)620 621 def OnCopyControls(event):622 TextList = []623 Names = []624 if self.PatternTree.GetCount():625 id, cookie = self.PatternTree.GetFirstChild(self.root)626 while id:627 name = self.PatternTree.GetItemText(id)628 Names.append(name)629 if 'IMG' in name:630 if id == self.Image:631 Source = name632 Data = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,id, 'Image Controls'))633 Data['showLines'] = True634 Data['ring'] = []635 Data['rings'] = []636 Data['cutoff'] = 10637 Data['pixLimit'] = 20638 Data['ellipses'] = []639 Data['calibrant'] = ''640 Data['setDefault'] = False641 else:642 TextList.append([False,name,id])643 id, cookie = self.PatternTree.GetNextChild(self.root, cookie)644 if not len(TextList):645 self.ErrorDialog('Nothing to copy controls to','There must be more than one "IMG" pattern')646 return647 dlg = self.CopyDialog(self,'Copy image controls','Copy controls from '+Source+' to:',TextList)648 try:649 if dlg.ShowModal() == wx.ID_OK:650 result = dlg.GetData()651 for i,item in enumerate(result[:-1]):652 ifcopy,name,id = item653 if ifcopy:654 oldData = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,id, 'Image Controls'))655 Data['range'] = oldData['range']656 self.PatternTree.SetItemPyData(GetPatternTreeItemId(self,id, 'Image Controls'),Data)657 finally:658 dlg.Destroy()659 660 colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]661 calList = [m for m in calFile.Calibrants.keys()]662 if self.dataDisplay:663 self.dataDisplay.Destroy()664 self.dataFrame.SetMenuBar(self.dataFrame.ImageMenu)665 if not self.dataFrame.GetStatusBar():666 Status = self.dataFrame.CreateStatusBar()667 self.dataFrame.Bind(wx.EVT_MENU, OnCalibrate, id=wxID_IMCALIBRATE)668 self.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=wxID_IMCLEARCALIB)669 if not data['rings']:670 self.dataFrame.ImageEdit.Enable(id=wxID_IMCLEARCALIB,enable=False)671 self.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=wxID_IMINTEGRATE)672 self.dataFrame.Bind(wx.EVT_MENU, OnIntegrateAll, id=wxID_INTEGRATEALL)673 self.dataFrame.Bind(wx.EVT_MENU, OnSaveIntegrate, id=wxID_SAVEINTG)674 self.dataFrame.Bind(wx.EVT_MENU, OnCopyControls, id=wxID_IMCOPYCONTROLS)675 self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)676 self.dataDisplay = wx.Panel(self.dataFrame)677 mainSizer = wx.BoxSizer(wx.VERTICAL)678 mainSizer.Add((5,10),0)679 680 maxSizer = wx.FlexGridSizer(2,2,0,5)681 maxSizer.AddGrowableCol(1,1)682 logDeltZero = math.log(data['range'][0][1]-data['range'][0][0])683 DeltOne = data['range'][1][1]-data['range'][0][0]684 logDeltOne = math.log(DeltOne)685 maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max intensity'),0,686 wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)687 maxSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,688 value=int(100*logDeltOne/logDeltZero))689 maxSizer.Add(maxSel,1,wx.EXPAND|wx.RIGHT)690 maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)691 maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min intensity'),0,692 wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)693 minSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,694 value=int(100*data['range'][1][0]/DeltOne))695 maxSizer.Add(minSel,1,wx.EXPAND|wx.RIGHT)696 minSel.Bind(wx.EVT_SLIDER, OnMinSlider)697 mainSizer.Add(maxSizer,1,wx.EXPAND|wx.RIGHT)698 699 comboSizer = wx.BoxSizer(wx.HORIZONTAL)700 comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Color bar '),0,701 wx.ALIGN_CENTER_VERTICAL)702 colSel = wx.ComboBox(parent=self.dataDisplay,value=data['color'],choices=colorList,703 style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)704 colSel.Bind(wx.EVT_COMBOBOX, OnNewColorBar)705 comboSizer.Add(colSel,0,wx.ALIGN_CENTER_VERTICAL)706 707 comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibrant '),0,708 wx.ALIGN_CENTER_VERTICAL)709 calSel = wx.ComboBox(parent=self.dataDisplay,value=data['calibrant'],choices=calList,710 style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)711 calSel.Bind(wx.EVT_COMBOBOX, OnNewCalibrant)712 comboSizer.Add(calSel,0,wx.ALIGN_CENTER_VERTICAL)713 comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Pixel search range '),0,714 wx.ALIGN_CENTER_VERTICAL)715 pixLimit = wx.ComboBox(parent=self.dataDisplay,value=str(data['pixLimit']),choices=['1','2','5','10','15','20'],716 style=wx.CB_READONLY|wx.CB_DROPDOWN)717 pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)718 comboSizer.Add(pixLimit,0,wx.ALIGN_CENTER_VERTICAL)719 comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min ring I/Ib '),0,720 wx.ALIGN_CENTER_VERTICAL)721 cutOff = wx.TextCtrl(parent=self.dataDisplay,value=("%.1f" % (data['cutoff'])),722 style=wx.TE_PROCESS_ENTER)723 cutOff.Bind(wx.EVT_TEXT,OnCutOff)724 comboSizer.Add(cutOff,0,wx.ALIGN_CENTER_VERTICAL)725 726 mainSizer.Add(comboSizer,0,wx.ALIGN_CENTER_HORIZONTAL)727 mainSizer.Add((5,5),0)728 729 dataSizer = wx.FlexGridSizer(6,4,5,5)730 dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibration coefficients'),0,731 wx.ALIGN_CENTER_VERTICAL)732 dataSizer.Add((5,0),0)733 dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Integration coefficients'),0,734 wx.ALIGN_CENTER_VERTICAL)735 dataSizer.Add((5,0),0)736 737 dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Beam center X,Y'),0,738 wx.ALIGN_CENTER_VERTICAL)739 cent = data['center']740 centText = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f,%8.3f" % (cent[0],cent[1])),style=wx.TE_READONLY)741 dataSizer.Add(centText,0,wx.ALIGN_CENTER_VERTICAL)742 743 dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Inner/Outer 2-theta'),0,744 wx.ALIGN_CENTER_VERTICAL)745 746 IOtth = data['IOtth']747 littleSizer = wx.BoxSizer(wx.HORIZONTAL)748 self.InnerTth = wx.TextCtrl(parent=self.dataDisplay,749 value=("%8.2f" % (IOtth[0])),style=wx.TE_PROCESS_ENTER)750 self.InnerTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)751 littleSizer.Add(self.InnerTth,0,wx.ALIGN_CENTER_VERTICAL)752 self.OuterTth = wx.TextCtrl(parent=self.dataDisplay,753 value=("%8.2f" % (IOtth[1])),style=wx.TE_PROCESS_ENTER)754 self.OuterTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)755 littleSizer.Add(self.OuterTth,0,wx.ALIGN_CENTER_VERTICAL)756 dataSizer.Add(littleSizer,0,)757 758 dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Wavelength'),0,759 wx.ALIGN_CENTER_VERTICAL)760 waveSel = wx.TextCtrl(parent=self.dataDisplay,value=("%6.5f" % (data['wavelength'])),761 style=wx.TE_PROCESS_ENTER)762 waveSel.Bind(wx.EVT_TEXT_ENTER,OnWavelength)763 dataSizer.Add(waveSel,0,wx.ALIGN_CENTER_VERTICAL)764 765 dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start/End azimuth'),0,766 wx.ALIGN_CENTER_VERTICAL)767 LRazim = data['LRazimuth']768 littleSizer = wx.BoxSizer(wx.HORIZONTAL)769 self.Lazim = wx.TextCtrl(parent=self.dataDisplay,770 value=("%6d" % (LRazim[0])),style=wx.TE_PROCESS_ENTER)771 self.Lazim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)772 littleSizer.Add(self.Lazim,0,wx.ALIGN_CENTER_VERTICAL)773 self.Razim = wx.TextCtrl(parent=self.dataDisplay,774 value=("%6d" % (LRazim[1])),style=wx.TE_PROCESS_ENTER)775 self.Razim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)776 littleSizer.Add(self.Razim,0,wx.ALIGN_CENTER_VERTICAL)777 dataSizer.Add(littleSizer,0,)778 779 dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Distance'),0,780 wx.ALIGN_CENTER_VERTICAL)781 distSel = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f"%(data['distance'])),style=wx.TE_READONLY)782 dataSizer.Add(distSel,0,wx.ALIGN_CENTER_VERTICAL)783 784 dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' No. 2-theta/azimuth bins'),0,785 wx.ALIGN_CENTER_VERTICAL)786 littleSizer = wx.BoxSizer(wx.HORIZONTAL)787 outChan = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)788 outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)789 littleSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)790 outAzim = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outAzimuths']),style=wx.TE_PROCESS_ENTER)791 outAzim.Bind(wx.EVT_TEXT_ENTER,OnNumOutAzms)792 littleSizer.Add(outAzim,0,wx.ALIGN_CENTER_VERTICAL)793 dataSizer.Add(littleSizer,0,)794 795 dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt angle'),0,796 wx.ALIGN_CENTER_VERTICAL)797 tiltSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['tilt'])),style=wx.TE_READONLY)798 dataSizer.Add(tiltSel,0,wx.ALIGN_CENTER_VERTICAL)799 showLines = wx.CheckBox(parent=self.dataDisplay,label='Show integration limits?')800 dataSizer.Add(showLines,0)801 showLines.Bind(wx.EVT_CHECKBOX, OnShowLines)802 showLines.SetValue(data['showLines'])803 fullIntegrate = wx.CheckBox(parent=self.dataDisplay,label='Do full integration?')804 dataSizer.Add(fullIntegrate,0)805 fullIntegrate.Bind(wx.EVT_CHECKBOX, OnFullIntegrate)806 fullIntegrate.SetValue(data['fullIntegrate'])807 808 dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt rotation'),0,809 wx.ALIGN_CENTER_VERTICAL)810 rotSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['rotation'])),style=wx.TE_READONLY)811 dataSizer.Add(rotSel,0,wx.ALIGN_CENTER_VERTICAL)812 setDefault = wx.CheckBox(parent=self.dataDisplay,label='Use as default for all images?')813 dataSizer.Add(setDefault,0)814 setDefault.Bind(wx.EVT_CHECKBOX, OnSetDefault)815 setDefault.SetValue(data['setDefault'])816 setRings = wx.CheckBox(parent=self.dataDisplay,label='Show ring picks?')817 dataSizer.Add(setRings,0)818 setRings.Bind(wx.EVT_CHECKBOX, OnSetRings)819 setRings.SetValue(data['setRings'])820 821 mainSizer.Add(dataSizer,0)822 823 mainSizer.Layout()824 self.dataDisplay.SetSizer(mainSizer)825 self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))826 self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))827 828 def UpdateMasks(self,data):829 830 def OnThreshold(event):831 lower = max(int(self.lowerThreshold.GetValue()),thresh[0][0])832 upper = min(int(self.upperThreshold.GetValue()),thresh[0][1])833 data['Thresholds'][1] = [lower,upper]834 self.lowerThreshold.SetValue("%8d" % (lower))835 self.upperThreshold.SetValue("%8d" % (upper))836 G2plt.PlotExposedImage(self)837 838 def OnCopyMask(event):839 TextList = []840 Names = []841 if self.PatternTree.GetCount():842 id, cookie = self.PatternTree.GetFirstChild(self.root)843 while id:844 name = self.PatternTree.GetItemText(id)845 Names.append(name)846 if 'IMG' in name:847 if id == self.Image:848 Source = name849 mask = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,id, 'Masks'))850 else:851 TextList.append([False,name,id])852 id, cookie = self.PatternTree.GetNextChild(self.root, cookie)853 if not len(TextList):854 self.ErrorDialog('Nothing to copy mask to','There must be more than one "IMG" pattern')855 return856 dlg = self.CopyDialog(self,'Copy mask information','Copy mask from '+Source+' to:',TextList)857 try:858 if dlg.ShowModal() == wx.ID_OK:859 result = dlg.GetData()860 for i,item in enumerate(result[:-1]):861 ifcopy,name,id = item862 if ifcopy:863 self.PatternTree.SetItemPyData(GetPatternTreeItemId(self,id, 'Masks'),mask)864 finally:865 dlg.Destroy()866 867 if self.dataDisplay:868 self.dataDisplay.Destroy()869 self.dataFrame.SetMenuBar(self.dataFrame.MaskMenu)870 self.dataFrame.Bind(wx.EVT_MENU, OnCopyMask, id=wxID_MASKCOPY)871 if not self.dataFrame.GetStatusBar():872 Status = self.dataFrame.CreateStatusBar()873 self.dataDisplay = wx.Panel(self.dataFrame)874 mainSizer = wx.BoxSizer(wx.VERTICAL)875 mainSizer.Add((5,10),0)876 877 thresh = data['Thresholds']878 littleSizer = wx.FlexGridSizer(2,3,0,5)879 littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Lower/Upper limits '),0,880 wx.ALIGN_CENTER_VERTICAL)881 littleSizer.Add(wx.TextCtrl(parent=self.dataDisplay,882 value=("%8d" % (thresh[0][0])),style=wx.TE_READONLY),0,wx.ALIGN_CENTER_VERTICAL)883 littleSizer.Add(wx.TextCtrl(parent=self.dataDisplay,884 value=("%8d" % (thresh[0][1])),style=wx.wx.TE_READONLY),0,wx.ALIGN_CENTER_VERTICAL)885 886 littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Lower/Upper thresholds '),0,887 wx.ALIGN_CENTER_VERTICAL)888 self.lowerThreshold = wx.TextCtrl(parent=self.dataDisplay,889 value=("%8d" % (thresh[1][0])),style=wx.TE_PROCESS_ENTER)890 self.lowerThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)891 littleSizer.Add(self.lowerThreshold,0,wx.ALIGN_CENTER_VERTICAL)892 self.upperThreshold = wx.TextCtrl(parent=self.dataDisplay,893 value=("%8d" % (thresh[1][1])),style=wx.TE_PROCESS_ENTER)894 self.upperThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)895 littleSizer.Add(self.upperThreshold,0,wx.ALIGN_CENTER_VERTICAL)896 mainSizer.Add(littleSizer,0,)897 898 899 900 mainSizer.Layout()901 self.dataDisplay.SetSizer(mainSizer)902 self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))903 self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))904 905 def UpdatePhaseData(self,item,data,oldPage):906 import GSASIIElem as G2el907 Atoms = []908 self.SelectedRow = 0909 910 def BookResize(event):911 w,h = self.GetSize()912 self.dataDisplay.SetSize(wx.Size(w,h))913 914 def FillGeneralGrid():915 def SetLatticeParametersStyle(SGData,table):916 if SGData['SGLaue'] in ['m3','m3m']:917 table[4][2] = table[4][3] = table[4][1]918 General.SetCellStyle(4,2,"light grey",True)919 General.SetCellStyle(4,3,"light grey",True)920 table[4][4] = table[4][5] = table[4][6] = 90.921 General.SetCellStyle(4,4,"light grey",True)922 General.SetCellStyle(4,5,"light grey",True)923 General.SetCellStyle(4,6,"light grey",True)924 elif SGData['SGLaue'] in ['3R','3mR']:925 table[4][2] = table[4][3] = table[4][1]926 General.SetCellStyle(4,2,"light grey",True)927 General.SetCellStyle(4,3,"light grey",True)928 table[4][5] = table[4][6] = table[4][4]929 General.SetCellStyle(4,5,"light grey",True)930 General.SetCellStyle(4,6,"light grey",True)931 elif SGData['SGLaue'] in ['3','3m1','31m','6/m','6/mmm']:932 table[4][2] = table[4][1]933 General.SetCellStyle(4,2,"light grey",True)934 table[4][4] = table[4][5] = 90.935 table[4][6] = 120.936 General.SetCellStyle(4,4,"light grey",True)937 General.SetCellStyle(4,5,"light grey",True)938 General.SetCellStyle(4,6,"light grey",True)939 elif SGData['SGLaue'] in ['4/m','4/mmm']:940 table[4][2] = table[4][1]941 General.SetCellStyle(4,2,"light grey",True)942 table[4][4] = table[4][5] = table[4][6] = 90.943 General.SetCellStyle(4,4,"light grey",True)944 General.SetCellStyle(4,5,"light grey",True)945 General.SetCellStyle(4,6,"light grey",True)946 elif SGData['SGLaue'] in ['mmm']:947 table[4][4] = table[4][5] = table[4][6] = 90.948 General.SetCellStyle(4,4,"light grey",True)949 General.SetCellStyle(4,5,"light grey",True)950 General.SetCellStyle(4,6,"light grey",True)951 elif SGData['SGLaue'] in ['2/m']:952 if SGData['SGUniq'] == 'a':953 table[4][5]= table[4][6] = 90.954 General.SetCellStyle(4,5,"light grey",True)955 General.SetCellStyle(4,6,"light grey",True)956 if SGData['SGUniq'] == 'b':957 table[4][4]= table[4][6] = 90.958 General.SetCellStyle(4,4,"light grey",True)959 General.SetCellStyle(4,6,"light grey",True)960 if SGData['SGUniq'] == 'c':961 table[4][4]= table[4][5] = 90.962 General.SetCellStyle(4,4,"light grey",True)963 General.SetCellStyle(4,5,"light grey",True)964 965 def RefreshGeneralGrid(event):966 967 r,c = event.GetRow(),event.GetCol()968 generalData[0] = table[0][0]969 self.PatternTree.SetItemText(item,generalData[0])970 generalData[1] = table[1][0]971 SpcGp = table[2][0]972 SGErr,SGData = G2spc.SpcGroup(SpcGp)973 if r == 2 and c == 0:974 if SGErr:975 text = [G2spc.SGErrors(SGErr)+'\nSpace Group set to previous']976 table[2][0] = generalData[2]['SpGrp']977 msg = 'Space Group Error'978 Style = wx.ICON_EXCLAMATION979 else:980 text = G2spc.SGPrint(SGData)981 generalData[2] = SGData982 msg = 'Space Group Information'983 Style = wx.ICON_INFORMATION984 Text = ''985 for line in text:986 Text += line+'\n'987 wx.MessageBox(Text,caption=msg,style=Style)988 General.SetCellValue(4,0,str(generalData[3][0]))989 for c in range(1,7):990 General.SetCellStyle(4,c,"white",False)991 generalData[3][c] = float(General.GetCellValue(4,c))992 generalData[3][7] = G2lat.calc_V(G2lat.cell2A(generalData[3][1:7]))993 SetLatticeParametersStyle(SGData,table)994 generalData[4][1] = float(General.GetCellValue(5,1))995 General.ForceRefresh()996 997 rowLabels = ['Phase name','Phase type','Space group',998 'Lattice ',' parameters','Scale factor','Elements','No. per cell','Atom weight','','Bond radii','Angle radii']999 generalData = data['General']1000 atomData = data['Atoms']1001 AtomTypes = []1002 NoAtoms = {}1003 BondRadii = []1004 AngleRadii = []1005 AtomMass = []1006 colType = 11007 colSS = 71008 self.dataFrame.setSizePosLeft([600,350])1009 if generalData[1] =='macromolecular':1010 colType = 41011 colSS = 101012 for atom in atomData:1013 if AtomTypes.count(atom[colType]):1014 NoAtoms[atom[colType]] += atom[colSS-1]*atom[colSS+1]1015 else:1016 Info = G2el.GetAtomInfo(atom[colType])1017 AtomTypes.append(Info['Symbol'])1018 BondRadii.append(Info['Drad'])1019 AngleRadii.append(Info['Arad'])1020 AtomMass.append(Info['Mass'])1021 NoAtoms[atom[colType]] = atom[colSS-1]*atom[colSS+1]1022 generalData[5:9] = [AtomTypes,NoAtoms,AtomMass,BondRadii,AngleRadii]1023 colLabels = []1024 colLabels += ['' for i in range(max(8,len(generalData[5])))]1025 table = []1026 table.append([generalData[0],'','','','','','','','']) #phase name1027 table.append([generalData[1],'','','','','','','','']) #phase type1028 E,SGData = G2spc.SpcGroup(generalData[2]['SpGrp'])1029 table.append([SGData['SpGrp'],'','','','','','','','']) #space group symbol1030 table.append(['refine','a ','b ','c ','alpha ','beta ','gamma','volume '])1031 table.append(generalData[3]) #lattice parameters1032 table.append([generalData[4][0],generalData[4][1],'','','','','','']) #scale factor1033 table.append(generalData[5]+['' for i in range(max(8,len(generalData[5])))]) #element list1034 line = []1035 mass = 0.1036 for i,elem in enumerate(generalData[5]):1037 mass += generalData[6][elem]*generalData[7][i]1038 line.append(generalData[6][elem])1039 Volume = generalData[3][7]1040 table.append(line+['' for i in range(max(8,len(generalData[5])))]) #No. per cell1041 table.append(generalData[7]+['' for i in range(max(8,len(generalData[5])))]) #At. wt.1042 if generalData[1] == 'macromolecular' and mass > 0.0:1043 table.append(['density',mass/(0.6022137*Volume),'Matthews coeff.',Volume/mass,'','','','',''])1044 else:1045 table.append(['density',mass/(0.6022137*Volume),'','','','','','',''])1046 table.append(generalData[8]+['' for i in range(max(8,len(generalData[5])))])1047 table.append(generalData[9]+['' for i in range(max(8,len(generalData[5])))])1048 Types = [wg.GRID_VALUE_STRING for i in range(max(8,len(generalData[5])))]1049 generalTable = Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)1050 General.SetTable(generalTable, True)1051 General.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshGeneralGrid)1052 General.SetMargins(0,0)1053 General.SetColSize(0,100)1054 General.SetColLabelSize(0)1055 for c in range(max(8,len(generalData[5]))):1056 if c > 0:1057 General.SetReadOnly(0,c,isReadOnly=True)1058 General.SetReadOnly(1,c,isReadOnly=True)1059 General.SetReadOnly(2,c,isReadOnly=True)1060 General.SetReadOnly(3,c,isReadOnly=True) #unit cell labels1061 General.SetCellAlignment(3,c,wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)1062 if c < 4:1063 General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,5))1064 General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,5))1065 General.SetReadOnly(9,c,isReadOnly=True)1066 else:1067 General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,3))1068 General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,3))1069 for r in range(6,12):1070 General.SetReadOnly(r,c,isReadOnly=True)1071 General.SetReadOnly(4,7,isReadOnly=True) #cell volume - no edit1072 General.SetCellEditor(1,0,wg.GridCellChoiceEditor(['nuclear','modulated', #phase type1073 'magnetic','macromolecular','Pawley'],False)) #- change only if no atoms1074 if line: #no.of atoms not zero!1075 General.SetReadOnly(1,0,isReadOnly=True) #can't change phase type1076 General.SetCellRenderer(4,0,wg.GridCellBoolRenderer()) #lattice parameters1077 General.SetCellEditor(4,0,wg.GridCellBoolEditor())1078 SetLatticeParametersStyle(SGData,table)1079 General.SetCellRenderer(5,1,wg.GridCellFloatRenderer(10,4)) #scale factor1080 General.SetCellEditor(5,1,wg.GridCellFloatEditor(10,4))1081 General.SetCellRenderer(5,0,wg.GridCellBoolRenderer())1082 General.SetCellEditor(5,0,wg.GridCellBoolEditor())1083 General.SetCellRenderer(9,1,wg.GridCellFloatRenderer(8,3))1084 General.SetCellRenderer(9,3,wg.GridCellFloatRenderer(8,3))1085 1086 def FillAtomsGrid():1087 1088 def RefreshAtomGrid(event):1089 r,c = event.GetRow(),event.GetCol()1090 if r < 0: #on col label!1091 sel = -11092 if Atoms.GetColLabelValue(c) == 'refine':1093 choice = ['F - site fraction','X - coordinates','U - thermal parameters']1094 dlg = wx.MultiChoiceDialog(self,'Select','Refinement controls',choice)1095 if dlg.ShowModal() == wx.ID_OK:1096 sel = dlg.GetSelections()1097 parms = ''1098 for x in sel:1099 parms += choice[x][0]1100 elif Atoms.GetColLabelValue(c) == 'I/A':1101 choice = ['Isotropic','Anisotropic']1102 dlg = wx.SingleChoiceDialog(self,'Select','Thermal Motion',choice)1103 if dlg.ShowModal() == wx.ID_OK:1104 sel = dlg.GetSelection()1105 parms = choice[sel][0]1106 if sel >= 0:1107 for r in range(Atoms.GetNumberRows()):1108 Atoms.SetCellValue(r,c,parms)1109 elif c < 0: #picked atom row1110 self.SelectedRow = r1111 elif Atoms.GetColLabelValue(c) in ['x','y','z']:1112 colLabel = Atoms.GetColLabelValue(c)1113 if colLabel == 'x':1114 XYZ = [atomData[r][c],atomData[r][c+1],atomData[r][c+2]]1115 elif colLabel == 'y':1116 XYZ = [atomData[r][c-1],atomData[r][c],atomData[r][c+1]]1117 elif colLabel == 'z':1118 XYZ = [atomData[r][c-2],atomData[r][c-1],atomData[r][c]]1119 if None in XYZ:1120 XYZ = [0,0,0]1121 SScol = colLabels.index('site sym')1122 Mulcol = colLabels.index('mult')1123 E,SGData = G2spc.SpcGroup(generalData[2]['SpGrp'])1124 Sytsym,Mult = G2spc.SytSym(XYZ,SGData)1125 atomData[r][SScol] = Sytsym1126 atomData[r][Mulcol] = Mult1127 Atoms.ForceRefresh()1128 1129 def AtomTypeSelect(event):1130 r,c = event.GetRow(),event.GetCol()1131 if Atoms.GetColLabelValue(c) == 'Type':1132 PE = G2elem.PickElement(self)1133 if PE.ShowModal() == wx.ID_OK:1134 atomData[r][c] = PE.Elem.strip()1135 PE.Destroy()1136 Atoms.ForceRefresh()1137 else:1138 event.Skip()1139 1140 generalData = data['General']1141 atomData = data['Atoms']1142 Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,wg.GRID_VALUE_CHOICE+": ,X,XU,U,F,FX,FXU,FU",1143 wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',1144 wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_STRING,wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_CHOICE+":I,A",1145 wg.GRID_VALUE_FLOAT+':10,4',1146 wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',1147 wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4']1148 colLabels = ['Name','Type','refine','x','y','z','frac','site sym','mult','I/A','Uiso','U11','U22','U33','U12','U13','U23']1149 if generalData[1] == 'magnetic':1150 colLabels += ['Mx','My','Mz']1151 Types[2] = wg.GRID_VALUE_CHOICE+": ,X,XU,U,M,MX,MXU,MU,F,FX,FXU,FU,FM,FMX,FMU,"1152 Types += [1153 wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4']1154 elif generalData[1] == 'macromolecular':1155 colLabels = ['res no','residue','chain'] + colLabels1156 Types = [wg.GRID_VALUE_NUMBER,1157 wg.GRID_VALUE_CHOICE+": ,ALA,ARG,ASN,ASP,CYS,GLN,GLU,GLY,HIS,ILE,LEU,LYS,MET,PHE,PRO,SER,THR,TRP,TYR,VAL,MSE,HOH,UNK",1158 wg.GRID_VALUE_STRING] + Types1159 table = []1160 rowLabels = []1161 for i,atom in enumerate(atomData):1162 table.append(atom)1163 rowLabels.append(str(i+1))1164 atomTable = Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)1165 Atoms.SetTable(atomTable, True)1166 Atoms.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshAtomGrid)1167 Atoms.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, RefreshAtomGrid)1168 Atoms.Bind(wg.EVT_GRID_SELECT_CELL, AtomTypeSelect)1169 Atoms.SetMargins(0,0)1170 Atoms.AutoSizeColumns(True)1171 colType = colLabels.index('Type')1172 colSS = colLabels.index('site sym')1173 colIA = colLabels.index('I/A')1174 for row in range(Atoms.GetNumberRows()):1175 Atoms.SetReadOnly(row,colSS,True) #site sym1176 Atoms.SetReadOnly(row,colSS+1,True) #Mult1177 if Atoms.GetCellValue(row,colIA) == 'I':1178 for i in range(2,8):1179 Atoms.SetCellRenderer(row,colIA+i,wg.GridCellStringRenderer())1180 Atoms.SetReadOnly(row,colIA+i,isReadOnly=True)1181 Atoms.SetCellValue(row,colIA+i,'')1182 elif Atoms.GetCellValue(row,colIA) == 'A':1183 Atoms.SetCellRenderer(row,colIA+1,wg.GridCellStringRenderer())1184 Atoms.SetReadOnly(row,colIA+1,isReadOnly=True)1185 Atoms.SetCellValue(row,colIA+1,'')1186 1187 def AtomAdd(event):1188 atomData = data['Atoms']1189 generalData = data['General']1190 Ncol = Atoms.GetNumberCols()1191 if generalData[1] == 'macromolecular':1192 atomData.append([0,'UNK','','UNK','UNK','',0,0,0,0,'',0,'I',0.10,0,0,0,0,0,0])1193 elif generalData[1] == 'nuclear':1194 atomData.append(['UNK','UNK','',0,0,0,0,'',0,'I',0.01,0,0,0,0,0,0])1195 event.StopPropagation()1196 FillAtomsGrid()1197 1198 def AtomInsert(event):1199 atomData = data['Atoms']1200 generalData = data['General']1201 Ncol = Atoms.GetNumberCols()1202 if generalData[1][0] == 'macromolecular':1203 atomData.append([0,'UNK','','UNK','UNK','',0,0,0,0,'',0,'I',0.10,0,0,0,0,0,0])1204 elif generalData[1][0] == 'nuclear':1205 atomData.append(['UNK','UNK','',0,0,0,0,'',0,'I',0.01,0,0,0,0,0,0])1206 event.StopPropagation()1207 FillAtomsGrid()1208 1209 def UpdateDrawing():1210 print 'Drawing'1211 1212 def FillPawleyReflectionsGrid():1213 1214 print 'Pawley reflections'1215 1216 def OnPageChanged(event):1217 page = event.GetSelection()1218 text = self.dataDisplay.GetPageText(page)1219 if text == 'Atoms':1220 self.dataFrame.SetMenuBar(self.dataFrame.AtomsMenu)1221 self.dataFrame.Bind(wx.EVT_MENU, AtomAdd, id=wxID_ATOMSEDITADD)1222 self.dataFrame.Bind(wx.EVT_MENU, AtomInsert, id=wxID_ATOMSEDITINSERT)1223 FillAtomsGrid()1224 else:1225 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)1226 event.Skip()1227 1228 if self.dataDisplay:1229 self.dataDisplay.Destroy()1230 PhaseName = self.PatternTree.GetItemText(item)1231 self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)1232 self.dataFrame.SetLabel('Phase Data for '+PhaseName)1233 self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())1234 1235 General = GSGrid(parent=self.dataDisplay)1236 FillGeneralGrid()1237 self.dataDisplay.AddPage(General,'General')1238 1239 GeneralData = data['General']1240 if GeneralData[3] == 'Pawley':1241 PawleyRefl = GSGrid(parent=self.dataDisplay)1242 self.dataDisplay.AddPage(PawleyRefl,'Pawley reflections')1243 FillPawleyReflectionsGrid()1244 else:1245 Atoms = GSGrid(parent=self.dataDisplay)1246 FillAtomsGrid()1247 self.dataDisplay.AddPage(Atoms,'Atoms')1248 1249 Drawing = wx.Window(parent=self.dataDisplay)1250 self.dataDisplay.AddPage(Drawing,'Drawing')1251 1252 self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)1253 self.dataDisplay.SetSelection(oldPage)1254 1255 429 1256 430 def GetPatternTreeItemId(self, parentId, itemText): … … 1319 493 self.PickId = item 1320 494 data = self.PatternTree.GetItemPyData(item) 1321 UpdatePhaseData(self,item,data,oldPage)495 G2phG.UpdatePhaseData(self,item,data,oldPage) 1322 496 elif self.PatternTree.GetItemText(item) == 'Comments': 1323 497 self.PatternId = self.PatternTree.GetItemParent(item) … … 1330 504 self.Image = self.PatternTree.GetItemParent(item) 1331 505 data = self.PatternTree.GetItemPyData(item) 1332 UpdateImageControls(self,data)506 G2imG.UpdateImageControls(self,data) 1333 507 G2plt.PlotImage(self) 1334 508 elif self.PatternTree.GetItemText(item) == 'Masks': … … 1337 511 self.Image = self.PatternTree.GetItemParent(item) 1338 512 data = self.PatternTree.GetItemPyData(item) 1339 UpdateMasks(self,data)513 G2imG.UpdateMasks(self,data) 1340 514 G2plt.PlotImage(self) 1341 515 elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
Note: See TracChangeset
for help on using the changeset viewer.