source: trunk/GSASIIgrid.py @ 373

Last change on this file since 373 was 373, checked in by vondreele, 11 years ago

new covariance item in tree
new covariance matrix plotting
save cov matrix in file

  • Property svn:keywords set to Date Author Revision URL Id
File size: 39.4 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-09-16 20:51:06 +0000 (Fri, 16 Sep 2011) $
4# $Author: vondreele $
5# $Revision: 373 $
6# $URL: trunk/GSASIIgrid.py $
7# $Id: GSASIIgrid.py 373 2011-09-16 20:51:06Z vondreele $
8########### SVN repository information ###################
9import wx
10import wx.grid as wg
11import time
12import cPickle
13import GSASIIpath
14import GSASIIplot as G2plt
15import GSASIIpwdGUI as G2pdG
16import GSASIIimgGUI as G2imG
17import GSASIIphsGUI as G2phG
18
19[ wxID_ATOMSEDITADD, wxID_ATOMSEDITINSERT, wxID_ATOMSEDITDELETE, wxID_ATOMSREFINE, 
20    wxID_ATOMSMODIFY, wxID_ATOMSTRANSFORM, wxID_ATOMSTESTADD, wxID_ATONTESTINSERT,
21    wxID_RELOADDRAWATOMS,
22] = [wx.NewId() for _init_coll_Atom_Items in range(9)]
23
24[ wxID_PWDRADD, wxID_HKLFADD, wxID_DATADELETE,
25] = [wx.NewId() for _init_coll_Data_Items in range(3)]
26
27[ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWATOMCOLOR, wxID_DRAWATOMRESETCOLOR, 
28    wxID_DRAWVIEWPOINT, wxID_DRAWTRANSFORM, wxID_DRAWDELETE, wxID_DRAWFILLCELL, 
29    wxID_DRAWADDEQUIV, wxID_DRAWFILLCOORD,
30] = [wx.NewId() for _init_coll_DrawAtom_Items in range(10)]
31
32[ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, 
33    wxID_IMCOPYCONTROLS, wxID_INTEGRATEALL, wxID_IMSAVECONTROLS, wxID_IMLOADCONTROLS,
34] = [wx.NewId() for _init_coll_IMAGE_Items in range(7)]
35
36[ wxID_MASKCOPY, wxID_MASKSAVE, wxID_MASKLOAD,
37] = [wx.NewId() for _init_coll_MASK_Items in range(3)]
38
39[ wxID_PAWLEYLOAD, wxID_PAWLEYIMPORT, wxID_PAWLEYDELETE,
40] = [wx.NewId() for _init_coll_PAWLEY_Items in range(3)]
41
42[ wxID_INSTPRMRESET,wxID_CHANGEWAVETYPE,
43] = [wx.NewId() for _init_coll_INST_Items in range(2)]
44
45[ wxID_INDXRELOAD,
46] = [wx.NewId() for _init_coll_IndPeaks_Items in range(1)]
47
48[ wxID_UNDO,wxID_LSQPEAKFIT,wxID_LSQONECYCLE,wxID_RESETSIGGAM,wxID_CLEARPEAKS,
49] = [wx.NewId() for _init_coll_PEAK_Items in range(5)]
50
51[  wxID_INDEXPEAKS, wxID_REFINECELL, wxID_COPYCELL, wxID_MAKENEWPHASE,
52] = [wx.NewId() for _init_coll_INDEX_Items in range(4)]
53
54[ wxID_SELECTPHASE,
55] = [wx.NewId() for _init_coll_Refl_Items in range(1)]
56
57[ wxID_CLEARTEXTURE,
58] = [wx.NewId() for _init_coll_Texture_Items in range(1)]
59
60[ wxID_PDFCOPYCONTROLS, wxID_PDFSAVECONTROLS, wxID_PDFLOADCONTROLS, 
61    wxID_PDFCOMPUTE, wxID_PDFCOMPUTEALL, wxID_PDFADDELEMENT, wxID_PDFDELELEMENT,
62] = [wx.NewId() for _init_coll_PDF_Items in range(7)]
63
64VERY_LIGHT_GREY = wx.Colour(235,235,235)
65
66class DataFrame(wx.Frame):
67    def _init_coll_BlankMenu(self,parent):
68        parent.Append(menu=self.Blank,title='')
69       
70    def _init_coll_AtomsMenu(self,parent):
71        parent.Append(menu=self.AtomEdit, title='Edit')
72       
73    def _init_coll_DataMenu(self,parent):
74        parent.Append(menu=self.DataEdit, title='Edit')
75       
76    def _init_coll_DrawAtomsMenu(self,parent):
77        parent.Append(menu=self.DrawAtomEdit, title='Edit')
78
79    def _init_coll_PawleyMenu(self,parent):
80        parent.Append(menu=self.PawleyEdit,title='Pawley Reflections Operations')
81     
82    def _init_coll_IndPeaksMenu(self,parent):
83        parent.Append(menu=self.IndPeaksEdit,title='Index Peaks Operations')
84                   
85    def _init_coll_ImageMenu(self,parent):
86        parent.Append(menu=self.ImageEdit, title='Image Operations')
87       
88    def _init_coll_InstMenu(self,parent):
89        parent.Append(menu=self.InstEdit, title='Inst. Parm. Operations')
90       
91    def _init_coll_MaskMenu(self,parent):
92        parent.Append(menu=self.MaskEdit, title='Mask Operations')
93       
94    def _init_coll_PeakMenu(self,parent):
95        parent.Append(menu=self.PeakEdit, title='Peak Fitting')
96
97    def _init_coll_IndexMenu(self,parent):
98        parent.Append(menu=self.IndexEdit, title='Cell Index/Refine')
99       
100    def _init_coll_ReflMenu(self,parent):
101        parent.Append(menu=self.ReflEdit, title='Reflection List')
102
103    def _init_coll_TextureMenu(self,parent):
104        parent.Append(menu=self.TextureEdit, title='Texture')
105
106    def _init_coll_PDFMenu(self,parent):
107        parent.Append(menu=self.PDFEdit, title='PDF Controls')
108
109    def _init_coll_Atom_Items(self,parent):
110        parent.Append(id=wxID_ATOMSEDITADD, kind=wx.ITEM_NORMAL,text='Append atom',
111            help='Inserted as an H atom')
112        parent.Append(id=wxID_ATOMSTESTADD, kind=wx.ITEM_NORMAL,text='Append test point',
113            help='Inserted as an H atom')
114        parent.Append(id=wxID_ATOMSEDITINSERT, kind=wx.ITEM_NORMAL,text='Insert atom',
115            help='Select atom row to insert before; inserted as an H atom')
116        parent.Append(id=wxID_ATONTESTINSERT, kind=wx.ITEM_NORMAL,text='Insert test point',
117            help='Select atom row to insert before; inserted as an H atom')
118        parent.Append(id=wxID_ATOMSEDITDELETE, kind=wx.ITEM_NORMAL,text='Delete atom',
119            help='Select atoms to delete first')
120        parent.Append(id=wxID_ATOMSREFINE, kind=wx.ITEM_NORMAL,text='Set atom refinement flags',
121            help='Select atoms to refine first')
122        parent.Append(id=wxID_ATOMSMODIFY, kind=wx.ITEM_NORMAL,text='Modify atom parameters',
123            help='Select atoms to modify first')
124        parent.Append(id=wxID_ATOMSTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
125            help='Select atoms to transform first')
126        parent.Append(id=wxID_RELOADDRAWATOMS, kind=wx.ITEM_NORMAL,text='Reload draw atoms',
127            help='Reload atom drawing list')
128           
129    def _init_coll_Data_Items(self,parent):
130        parent.Append(id=wxID_PWDRADD, kind=wx.ITEM_NORMAL,text='Add powder histograms',
131            help='Select new powder histograms to be used for this phase')
132        parent.Append(id=wxID_HKLFADD, kind=wx.ITEM_NORMAL,text='Add single crystal histograms',
133            help='Select new single crystal histograms to be used for this phase')
134        parent.Append(id=wxID_DATADELETE, kind=wx.ITEM_NORMAL,text='Delete histograms',
135            help='Delete histograms from use for this phase')
136
137    def _init_coll_Texture_Items(self,parent):
138        self.ClearPeaks = parent.Append(id=wxID_CLEARTEXTURE, kind=wx.ITEM_NORMAL,text='Clear texture', 
139            help='Clear the texture coefficients' )
140           
141    def _init_coll_DrawAtom_Items(self,parent):
142        parent.Append(id=wxID_DRAWATOMSTYLE, kind=wx.ITEM_NORMAL,text='Atom style',
143            help='Select atoms first')
144        parent.Append(id=wxID_DRAWATOMLABEL, kind=wx.ITEM_NORMAL,text='Atom label',
145            help='Select atoms first')
146        parent.Append(id=wxID_DRAWATOMCOLOR, kind=wx.ITEM_NORMAL,text='Atom color',
147            help='Select atoms first')
148        parent.Append(id=wxID_DRAWATOMRESETCOLOR, kind=wx.ITEM_NORMAL,text='Reset atom colors',
149            help='Resets all atom colors to defaults')
150        parent.Append(id=wxID_DRAWVIEWPOINT, kind=wx.ITEM_NORMAL,text='View point',
151            help='View point is 1st atom selected')
152        parent.Append(id=wxID_DRAWADDEQUIV, kind=wx.ITEM_NORMAL,text='Add atoms',
153            help='Add symmetry & cell equivalents to drawing set from selected atoms')
154        parent.Append(id=wxID_DRAWTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
155            help='Transform selected atoms by symmetry & cell translations')
156        parent.Append(id=wxID_DRAWFILLCOORD, kind=wx.ITEM_NORMAL,text='Fill CN-sphere',
157            help='Fill coordination sphere for selected atoms')           
158        parent.Append(id=wxID_DRAWFILLCELL, kind=wx.ITEM_NORMAL,text='Fill unit cell',
159            help='Fill unit cell with selected atoms')
160        parent.Append(id=wxID_DRAWDELETE, kind=wx.ITEM_NORMAL,text='Delete atoms',
161            help='Delete atoms from drawing set')
162
163    def _init_coll_Pawley_Items(self,parent):
164        parent.Append(id=wxID_PAWLEYLOAD, kind=wx.ITEM_NORMAL,text='Pawley create',
165            help='Initialize Pawley reflection list')
166#        parent.Append(id=wxID_PAWLEYIMPORT, kind=wx.ITEM_NORMAL,text='Pawley import',
167#            help='Import Pawley reflection list')
168        parent.Append(id=wxID_PAWLEYDELETE, kind=wx.ITEM_NORMAL,text='Pawley delete',
169            help='Delete Pawley reflection list')
170
171    def _init_coll_IndPeaks_Items(self,parent):
172        parent.Append(help='Load/Reload index peaks from peak list',id=wxID_INDXRELOAD, 
173            kind=wx.ITEM_NORMAL,text='Load/Reload')
174           
175    def _init_coll_Refl_Items(self,parent):
176        self.SelectPhase = parent.Append(help='Select phase for reflection list',id=wxID_SELECTPHASE, 
177            kind=wx.ITEM_NORMAL,text='Select phase')
178           
179    def _init_coll_Image_Items(self,parent):
180        parent.Append(help='Calibrate detector by fitting to calibrant lines', 
181            id=wxID_IMCALIBRATE, kind=wx.ITEM_NORMAL,text='Calibrate')
182        parent.Append(help='Clear calibration data points and rings',id=wxID_IMCLEARCALIB, 
183            kind=wx.ITEM_NORMAL,text='Clear calibration')
184        parent.Append(help='Integrate selected image',id=wxID_IMINTEGRATE, 
185            kind=wx.ITEM_NORMAL,text='Integrate')
186        parent.Append(help='Integrate all images selected from list',id=wxID_INTEGRATEALL,
187            kind=wx.ITEM_NORMAL,text='Integrate all')
188        parent.Append(help='Copy image controls to other images', 
189            id=wxID_IMCOPYCONTROLS, kind=wx.ITEM_NORMAL,text='Copy Controls')
190        parent.Append(help='Save image controls to file', 
191            id=wxID_IMSAVECONTROLS, kind=wx.ITEM_NORMAL,text='Save Controls')
192        parent.Append(help='Load image controls from file', 
193            id=wxID_IMLOADCONTROLS, kind=wx.ITEM_NORMAL,text='Load Controls')
194
195                   
196    def _init_coll_Mask_Items(self,parent):
197        parent.Append(help='Copy mask to other images', 
198            id=wxID_MASKCOPY, kind=wx.ITEM_NORMAL,text='Copy mask')
199        parent.Append(help='Save mask to file', 
200            id=wxID_MASKSAVE, kind=wx.ITEM_NORMAL,text='Save mask')
201        parent.Append(help='Load mask from file', 
202            id=wxID_MASKLOAD, kind=wx.ITEM_NORMAL,text='Load mask')
203
204    def _init_coll_Inst_Items(self,parent):
205        parent.Append(help='Reset instrument profile parameters to default', 
206            id=wxID_INSTPRMRESET, kind=wx.ITEM_NORMAL,text='Reset profile')
207        parent.Append(help='Change radiation type (Ka12 - synch)', 
208            id=wxID_CHANGEWAVETYPE, kind=wx.ITEM_NORMAL,text='Change radiation')
209
210    def _init_coll_Peak_Items(self,parent):
211        self.UnDo = parent.Append(help='Undo last least squares refinement', 
212            id=wxID_UNDO, kind=wx.ITEM_NORMAL,text='UnDo')
213        self.PeakFit = parent.Append(id=wxID_LSQPEAKFIT, kind=wx.ITEM_NORMAL,text='LSQ PeakFit', 
214            help='Peak fitting via least-squares' )
215        self.PFOneCycle = parent.Append(id=wxID_LSQONECYCLE, kind=wx.ITEM_NORMAL,text='LSQ one cycle', 
216            help='One cycle of Peak fitting via least-squares' )
217        self.ResetSigGam = parent.Append(id=wxID_RESETSIGGAM, kind=wx.ITEM_NORMAL, 
218            text='Reset sig and gam',help='Reset sigma and gamma to global fit' )
219        self.ClearPeaks = parent.Append(id=wxID_CLEARPEAKS, kind=wx.ITEM_NORMAL,text='Clear peaks', 
220            help='Clear the peak list' )
221           
222    def _init_coll_Index_Items(self,parent):
223        self.IndexPeaks = parent.Append(help='', id=wxID_INDEXPEAKS, kind=wx.ITEM_NORMAL,
224            text='Index Cell')
225        self.CopyCell = parent.Append( id=wxID_COPYCELL, kind=wx.ITEM_NORMAL,text='Copy Cell', 
226            help='Copy selected unit cell from indexing to cell refinement fields')
227        self.RefineCell = parent.Append( id=wxID_REFINECELL, kind=wx.ITEM_NORMAL, 
228            text='Refine Cell',help='Refine unit cell parameters from indexed peaks')
229        self.MakeNewPhase = parent.Append( id=wxID_MAKENEWPHASE, kind=wx.ITEM_NORMAL,
230            text='Make new phase',help='Make new phase from selected unit cell')
231           
232    def _init_coll_PDF_Items(self,parent):
233        parent.Append(help='Add element to sample composition',id=wxID_PDFADDELEMENT, kind=wx.ITEM_NORMAL,
234            text='Add element')
235        parent.Append(help='Delete element from sample composition',id=wxID_PDFDELELEMENT, kind=wx.ITEM_NORMAL,
236            text='Delete element')
237        parent.Append(help='Copy PDF controls', id=wxID_PDFCOPYCONTROLS, kind=wx.ITEM_NORMAL,
238            text='Copy controls')
239#        parent.Append(help='Load PDF controls from file',id=wxID_PDFLOADCONTROLS, kind=wx.ITEM_NORMAL,
240#            text='Load Controls')
241#        parent.Append(help='Save PDF controls to file', id=wxID_PDFSAVECONTROLS, kind=wx.ITEM_NORMAL,
242#            text='Save controls')
243        self.PDFCompute = parent.Append(help='Compute PDF', id=wxID_PDFCOMPUTE, kind=wx.ITEM_NORMAL,
244            text='Compute PDF')
245        self.PDFCompute = parent.Append(help='Compute all PDFs', id=wxID_PDFCOMPUTEALL, kind=wx.ITEM_NORMAL,
246            text='Compute all PDFs')
247       
248
249    def _init_utils(self):
250        self.BlankMenu = wx.MenuBar()
251       
252        self.AtomsMenu = wx.MenuBar()
253        self.DataMenu = wx.MenuBar()
254        self.TextureMenu = wx.MenuBar()
255        self.DrawAtomsMenu = wx.MenuBar()
256        self.PawleyMenu = wx.MenuBar()
257        self.ImageMenu = wx.MenuBar()
258        self.MaskMenu = wx.MenuBar()
259        self.InstMenu = wx.MenuBar()
260        self.PeakMenu = wx.MenuBar()
261        self.IndPeaksMenu = wx.MenuBar()
262        self.IndexMenu = wx.MenuBar()
263        self.ReflMenu = wx.MenuBar()
264        self.PDFMenu = wx.MenuBar()
265        self.AtomEdit = wx.Menu(title='')
266        self.DataEdit = wx.Menu(title='')
267        self.TextureEdit = wx.Menu(title='')
268        self.DrawAtomEdit = wx.Menu(title='')
269        self.PawleyEdit = wx.Menu(title='')
270        self.ImageEdit = wx.Menu(title='')
271        self.MaskEdit = wx.Menu(title='')
272        self.InstEdit = wx.Menu(title='')
273        self.PeakEdit = wx.Menu(title='')
274        self.IndPeaksEdit = wx.Menu(title='')
275        self.IndexEdit = wx.Menu(title='')
276        self.ReflEdit = wx.Menu(title='')
277        self.PDFEdit = wx.Menu(title='')
278        self._init_coll_AtomsMenu(self.AtomsMenu)
279        self._init_coll_Atom_Items(self.AtomEdit)
280        self._init_coll_DataMenu(self.DataMenu)
281        self._init_coll_Data_Items(self.DataEdit)
282        self._init_coll_TextureMenu(self.TextureMenu)
283        self._init_coll_Texture_Items(self.TextureEdit)
284        self._init_coll_DrawAtomsMenu(self.DrawAtomsMenu)
285        self._init_coll_DrawAtom_Items(self.DrawAtomEdit)
286        self._init_coll_PawleyMenu(self.PawleyMenu)
287        self._init_coll_Pawley_Items(self.PawleyEdit)
288        self._init_coll_ImageMenu(self.ImageMenu)
289        self._init_coll_Image_Items(self.ImageEdit)
290        self._init_coll_MaskMenu(self.MaskMenu)
291        self._init_coll_Mask_Items(self.MaskEdit)
292        self._init_coll_InstMenu(self.InstMenu)
293        self._init_coll_Inst_Items(self.InstEdit)
294        self._init_coll_PeakMenu(self.PeakMenu)
295        self._init_coll_Peak_Items(self.PeakEdit)
296        self._init_coll_IndPeaksMenu(self.IndPeaksMenu)
297        self._init_coll_IndPeaks_Items(self.IndPeaksEdit)
298        self._init_coll_IndexMenu(self.IndexMenu)
299        self._init_coll_Index_Items(self.IndexEdit)
300        self._init_coll_ReflMenu(self.ReflMenu)
301        self._init_coll_Refl_Items(self.ReflEdit)
302        self._init_coll_PDFMenu(self.PDFMenu)
303        self._init_coll_PDF_Items(self.PDFEdit)
304        self.UnDo.Enable(False)
305        self.PeakFit.Enable(False)
306        self.PFOneCycle.Enable(False)
307        self.IndexPeaks.Enable(False)
308        self.CopyCell.Enable(False)
309        self.RefineCell.Enable(False)
310        self.MakeNewPhase.Enable(False)
311       
312    def _init_ctrls(self, parent,name=None,size=None,pos=None):
313        wx.Frame.__init__(self,parent=parent,style=wx.DEFAULT_FRAME_STYLE ^ wx.CLOSE_BOX,
314            size=size,pos=pos,title='GSAS-II data display')
315        self._init_utils()
316        if name:
317            self.SetLabel(name)
318        self.Show()
319       
320    def __init__(self,parent,data=None,name=None, size=None,pos=None):
321        self._init_ctrls(parent,name,size,pos)
322        self.data = data
323        clientSize = wx.ClientDisplayRect()
324        Size = self.GetSize()
325        xPos = clientSize[2]-Size[0]
326        self.SetPosition(wx.Point(xPos,clientSize[1]+250))
327        self.dirname = ''
328        self.AtomGrid = []
329        self.selectedRow = 0
330       
331    def setSizePosLeft(self,Width):
332        clientSize = wx.ClientDisplayRect()
333        Width[1] = min(Width[1],clientSize[2]-300)
334        Width[0] = max(Width[0],300)
335        self.SetSize(Width)
336        self.SetPosition(wx.Point(clientSize[2]-Width[0],clientSize[1]+250))
337       
338    def Clear(self):
339        self.ClearBackground()
340        self.DestroyChildren()
341                   
342class GSNoteBook(wx.Notebook):
343    def __init__(self, parent, name='',size = None):
344        wx.Notebook.__init__(self, parent, -1, name=name, style= wx.BK_TOP)
345        if size: self.SetSize(size)
346                                                     
347    def Clear(self):       
348        GSNoteBook.DeleteAllPages(self)
349       
350    def FindPage(self,name):
351        numPage = self.GetPageCount()
352        for page in range(numPage):
353            if self.GetPageText(page) == name:
354                return page
355       
356class GSGrid(wg.Grid):
357    def __init__(self, parent, name=''):
358        wg.Grid.__init__(self,parent,-1,name=name)                   
359        self.SetSize(parent.GetClientSize())
360           
361    def Clear(self):
362        wg.Grid.ClearGrid(self)
363       
364    def SetCellStyle(self,r,c,color="white",readonly=True):
365        self.SetCellBackgroundColour(r,c,color)
366        self.SetReadOnly(r,c,isReadOnly=readonly)
367       
368    def GetSelection(self):
369        #this is to satisfy structure drawing stuff in G2plt when focus changes
370        return None
371                       
372class Table(wg.PyGridTableBase):
373    def __init__(self, data=[], rowLabels=None, colLabels=None, types = None):
374        wg.PyGridTableBase.__init__(self)
375        self.colLabels = colLabels
376        self.rowLabels = rowLabels
377        self.dataTypes = types
378        self.data = data
379       
380    def AppendRows(self, numRows=1):
381        self.data.append([])
382        return True
383       
384    def CanGetValueAs(self, row, col, typeName):
385        if self.dataTypes:
386            colType = self.dataTypes[col].split(':')[0]
387            if typeName == colType:
388                return True
389            else:
390                return False
391        else:
392            return False
393
394    def CanSetValueAs(self, row, col, typeName):
395        return self.CanGetValueAs(row, col, typeName)
396
397    def DeleteRow(self,pos):
398        data = self.GetData()
399        self.SetData([])
400        new = []
401        for irow,row in enumerate(data):
402            if irow <> pos:
403                new.append(row)
404        self.SetData(new)
405       
406    def GetColLabelValue(self, col):
407        if self.colLabels:
408            return self.colLabels[col]
409           
410    def GetData(self):
411        data = []
412        for row in range(self.GetNumberRows()):
413            data.append(self.GetRowValues(row))
414        return data
415       
416    def GetNumberCols(self):
417        try:
418            return len(self.colLabels)
419        except TypeError:
420            return None
421       
422    def GetNumberRows(self):
423        return len(self.data)
424       
425    def GetRowLabelValue(self, row):
426        if self.rowLabels:
427            return self.rowLabels[row]
428       
429    def GetRowValues(self, row):
430        data = []
431        for col in range(self.GetNumberCols()):
432            data.append(self.GetValue(row, col))
433        return data
434       
435    def GetTypeName(self, row, col):
436        try:
437            return self.dataTypes[col]
438        except TypeError:
439            return None
440
441    def GetValue(self, row, col):
442        try:
443            return self.data[row][col]
444        except IndexError:
445            return None
446           
447    def InsertRows(self, pos, rows):
448        for row in range(rows):
449            self.data.insert(pos,[])
450            pos += 1
451       
452    def IsEmptyCell(self,row,col):
453        try:
454            return not self.data[row][col]
455        except IndexError:
456            return True
457       
458    def OnKeyPress(self, event):
459        dellist = self.GetSelectedRows()
460        if event.GetKeyCode() == wx.WXK_DELETE and dellist:
461            grid = self.GetView()
462            for i in dellist: grid.DeleteRow(i)
463               
464    def SetColLabelValue(self, col, label):
465        numcols = self.GetNumberCols()
466        if col > numcols-1:
467            self.colLabels.append(label)
468        else:
469            self.colLabels[col]=label
470       
471    def SetData(self,data):
472        for row in range(len(data)):
473            self.SetRowValues(row,data[row])
474               
475    def SetRowLabelValue(self, row, label):
476        self.rowLabels[row]=label
477           
478    def SetRowValues(self,row,data):
479        self.data[row] = data
480           
481    def SetValue(self, row, col, value):
482        def innerSetValue(row, col, value):
483            try:
484                self.data[row][col] = value
485            except TypeError:
486                return
487            except IndexError:
488                print row,col,value
489                # add a new row
490                if row > self.GetNumberRows():
491                    self.data.append([''] * self.GetNumberCols())
492                elif col > self.GetNumberCols():
493                    for row in range(self.GetNumberRows):
494                        self.data[row].append('')
495                print self.data
496                self.data[row][col] = value
497        innerSetValue(row, col, value)
498               
499def UpdateNotebook(self,data):       
500    if data:
501        self.dataFrame.SetLabel('Notebook')
502        self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
503            style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
504        for line in data:
505            self.dataDisplay.AppendText(line+"\n")
506            self.dataDisplay.AppendText('Notebook entry @ '+time.ctime()+"\n")
507           
508def UpdateControls(self,data):
509    #patch
510    if 'deriv type' not in data:
511        data = {}
512        data['deriv type'] = 'analytical'
513        data['min dM/M'] = 0.0001
514        data['shift factor'] = 1.
515    if 'shift factor' not in data:
516        data['shift factor'] = 1.       
517    #end patch
518    '''
519    #Fourier controls
520    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
521    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
522    #distance/angle controls
523    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
524    '''
525       
526    def SetStatusLine(text):
527        Status.SetStatusText(text)                                     
528       
529    def OnConvergence(event):
530        try:
531            value = max(1.e-9,min(1.0,float(Cnvrg.GetValue())))
532        except ValueError:
533            value = 0.0001
534        data['min dM/M'] = value
535        Cnvrg.SetValue('%.2g'%(value))
536       
537    def OnDerivType(event):
538        data['deriv type'] = derivSel.GetValue()
539        derivSel.SetValue(data['deriv type'])
540       
541    def OnFactor(event):
542        try:
543            value = min(max(float(Factr.GetValue()),0.00001),100.)
544        except ValueError:
545            value = 1.0
546        data['shift factor'] = value
547        Factr.SetValue('%.5f'%(value))
548       
549    if self.dataDisplay:
550        self.dataDisplay.Destroy()
551    if not self.dataFrame.GetStatusBar():
552        Status = self.dataFrame.CreateStatusBar()
553    SetStatusLine('')
554    self.dataFrame.SetLabel('Controls')
555    self.dataDisplay = wx.Panel(self.dataFrame)
556    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
557    mainSizer = wx.BoxSizer(wx.VERTICAL)
558    mainSizer.Add((5,5),0)
559    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
560    LSSizer = wx.FlexGridSizer(cols=6,vgap=5,hgap=5)
561    LSSizer.Add(wx.StaticText(self.dataDisplay,label='Refinement derivatives: '),0,wx.ALIGN_CENTER_VERTICAL)
562    Choice=['analytic','numeric']
563    derivSel = wx.ComboBox(parent=self.dataDisplay,value=data['deriv type'],choices=Choice,
564        style=wx.CB_READONLY|wx.CB_DROPDOWN)
565    derivSel.SetValue(data['deriv type'])
566    derivSel.Bind(wx.EVT_COMBOBOX, OnDerivType)   
567    LSSizer.Add(derivSel,0,wx.ALIGN_CENTER_VERTICAL)
568    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Min delta-M/M: '),0,wx.ALIGN_CENTER_VERTICAL)
569    Cnvrg = wx.TextCtrl(self.dataDisplay,-1,value='%.2g'%(data['min dM/M']),style=wx.TE_PROCESS_ENTER)
570    Cnvrg.Bind(wx.EVT_TEXT_ENTER,OnConvergence)
571    Cnvrg.Bind(wx.EVT_KILL_FOCUS,OnConvergence)
572    LSSizer.Add(Cnvrg,0,wx.ALIGN_CENTER_VERTICAL)
573    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Initial shift factor: '),0,wx.ALIGN_CENTER_VERTICAL)
574    Factr = wx.TextCtrl(self.dataDisplay,-1,value='%.5f'%(data['shift factor']),style=wx.TE_PROCESS_ENTER)
575    Factr.Bind(wx.EVT_TEXT_ENTER,OnFactor)
576    Factr.Bind(wx.EVT_KILL_FOCUS,OnFactor)
577    LSSizer.Add(Factr,0,wx.ALIGN_CENTER_VERTICAL)
578       
579    mainSizer.Add(LSSizer)
580    mainSizer.Add((5,5),0)
581    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Density Map Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
582
583    mainSizer.Add((5,5),0)
584    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Distance/angle Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
585       
586    mainSizer.Layout()   
587    self.dataDisplay.SetSizer(mainSizer)
588    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
589    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
590     
591def UpdateComments(self,data):                   
592    self.dataFrame.SetLabel('Comments')
593    self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
594        style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
595    for line in data:
596        if line[-1] == '\n':
597            self.dataDisplay.AppendText(line)
598        else:
599            self.dataDisplay.AppendText(line+'\n')
600             
601def UpdateHKLControls(self,data):
602   
603    def OnScaleSlider(event):
604        scale = int(scaleSel.GetValue())/1000.
605        scaleSel.SetValue(int(scale*1000.))
606        data['Scale'] = scale*10.
607        G2plt.PlotSngl(self)
608       
609    def OnLayerSlider(event):
610        layer = layerSel.GetValue()
611        data['Layer'] = layer
612        G2plt.PlotSngl(self)
613       
614    def OnSelZone(event):
615        data['Zone'] = zoneSel.GetValue()
616        G2plt.PlotSngl(self,newPlot=True)
617       
618    def OnSelType(event):
619        data['Type'] = typeSel.GetValue()
620        G2plt.PlotSngl(self)
621       
622    def SetStatusLine():
623        Status.SetStatusText("look at me!!!")
624                                     
625    if self.dataDisplay:
626        self.dataDisplay.Destroy()
627    if not self.dataFrame.GetStatusBar():
628        Status = self.dataFrame.CreateStatusBar()
629    SetStatusLine()
630    zones = ['100','010','001']
631    HKLmax = data['HKLmax']
632    HKLmin = data['HKLmin']
633    if data['ifFc']:
634        typeChoices = ['Fosq','Fo','|DFsq|/sig','|DFsq|>sig','|DFsq|>3sig']
635    else:
636        typeChoices = ['Fosq','Fo']
637    self.dataDisplay = wx.Panel(self.dataFrame)
638    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
639    mainSizer = wx.BoxSizer(wx.VERTICAL)
640    mainSizer.Add((5,10),0)
641   
642    scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
643    scaleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Scale'),0,
644        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
645    scaleSel = wx.Slider(parent=self.dataDisplay,maxValue=1000,minValue=100,
646        style=wx.SL_HORIZONTAL,value=int(data['Scale']*100))
647    scaleSizer.Add(scaleSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
648    scaleSel.SetLineSize(100)
649    scaleSel.SetPageSize(900)
650    scaleSel.Bind(wx.EVT_SLIDER, OnScaleSlider)
651    mainSizer.Add(scaleSizer,1,wx.EXPAND|wx.RIGHT)
652   
653    zoneSizer = wx.BoxSizer(wx.HORIZONTAL)
654    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Zone  '),0,
655        wx.ALIGN_CENTER_VERTICAL)
656    zoneSel = wx.ComboBox(parent=self.dataDisplay,value=data['Zone'],choices=['100','010','001'],
657        style=wx.CB_READONLY|wx.CB_DROPDOWN)
658    zoneSel.Bind(wx.EVT_COMBOBOX, OnSelZone)
659    zoneSizer.Add(zoneSel,0,wx.ALIGN_CENTER_VERTICAL)
660    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Plot type  '),0,
661        wx.ALIGN_CENTER_VERTICAL)       
662    typeSel = wx.ComboBox(parent=self.dataDisplay,value=data['Type'],choices=typeChoices,
663        style=wx.CB_READONLY|wx.CB_DROPDOWN)
664    typeSel.Bind(wx.EVT_COMBOBOX, OnSelType)
665    zoneSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
666    zoneSizer.Add((10,0),0)   
667    mainSizer.Add(zoneSizer,1,wx.EXPAND|wx.RIGHT)
668       
669    izone = zones.index(data['Zone'])
670    layerSizer = wx.BoxSizer(wx.HORIZONTAL)
671    layerSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Layer'),0,
672        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
673    layerSel = wx.Slider(parent=self.dataDisplay,maxValue=HKLmax[izone],minValue=HKLmin[izone],
674        style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS,value=0)
675    layerSel.SetLineSize(1)
676    layerSel.SetLineSize(5)
677    layerSel.Bind(wx.EVT_SLIDER, OnLayerSlider)   
678    layerSizer.Add(layerSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
679    layerSizer.Add((10,0),0)   
680    mainSizer.Add(layerSizer,1,wx.EXPAND|wx.RIGHT)
681
682       
683    mainSizer.Layout()   
684    self.dataDisplay.SetSizer(mainSizer)
685    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
686    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
687       
688                         
689def GetPatternTreeItemId(self, parentId, itemText):
690    item, cookie = self.PatternTree.GetFirstChild(parentId)
691    while item:
692        if self.PatternTree.GetItemText(item) == itemText:
693            return item
694        item, cookie = self.PatternTree.GetNextChild(parentId, cookie)
695    return 0               
696
697def MovePatternTreeToGrid(self,item):
698   
699#    print self.PatternTree.GetItemText(item)
700   
701    oldPage = 0
702    if self.dataFrame:
703        self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
704        if self.dataFrame.GetLabel() == 'Comments':
705            data = [self.dataDisplay.GetValue()]
706            self.dataDisplay.Clear() 
707            Id = GetPatternTreeItemId(self,self.root, 'Comments')
708            if Id: self.PatternTree.SetItemPyData(Id,data)
709        if self.dataFrame.GetLabel() == 'Notebook':
710            data = [self.dataDisplay.GetValue()]
711            self.dataDisplay.Clear() 
712            Id = GetPatternTreeItemId(self,self.root, 'Notebook')
713            if Id: self.PatternTree.SetItemPyData(Id,data)
714        if self.dataFrame.GetLabel() == 'Covariance':
715            data = [self.dataDisplay.GetValue()]
716            self.dataDisplay.Clear() 
717            Id = GetPatternTreeItemId(self,self.root, 'Covariance')
718            if Id: self.PatternTree.SetItemPyData(Id,data)
719        if 'Phase Data for' in self.dataFrame.GetLabel():
720            if self.dataDisplay: 
721                oldPage = self.dataDisplay.GetSelection()
722        self.dataFrame.Clear()
723        self.dataFrame.SetLabel('')
724    else:
725        self.dataFrame = DataFrame(parent=self.mainPanel)
726
727    self.dataFrame.Raise()           
728    self.PickId = 0
729    parentID = self.root
730    self.ExportPattern.Enable(False)
731    if item != self.root:
732        parentID = self.PatternTree.GetItemParent(item)
733    if self.PatternTree.GetItemParent(item) == self.root:
734        self.PatternId = item
735        self.PickId = item
736        if self.PatternTree.GetItemText(item) == 'Notebook':
737            self.PatternId = 0
738            self.ExportPattern.Enable(False)
739            data = self.PatternTree.GetItemPyData(item)
740            UpdateNotebook(self,data)
741        elif self.PatternTree.GetItemText(item) == 'Controls':
742            self.PatternId = 0
743            self.ExportPattern.Enable(False)
744            data = self.PatternTree.GetItemPyData(item)
745            if not data:           #fill in defaults
746                data = {
747                    #least squares controls
748                    'deriv type':'analytic','min dM/M':0.0001,'shift factor':1.0,
749                    #Fourier controls
750                    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
751                    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
752                    #distance/angle controls
753                    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
754                self.PatternTree.SetItemPyData(item,data)                             
755            self.Refine.Enable(True)
756            UpdateControls(self,data)
757        elif self.PatternTree.GetItemText(item) == 'Covariance':
758            data = self.PatternTree.GetItemPyData(item)
759            G2plt.PlotCovariance(self)
760        elif 'IMG' in self.PatternTree.GetItemText(item):
761            self.Image = item
762            G2plt.PlotImage(self,newPlot=True)
763        elif 'PKS' in self.PatternTree.GetItemText(item):
764            G2plt.PlotPowderLines(self)
765        elif 'PWDR' in self.PatternTree.GetItemText(item):
766            self.ExportPattern.Enable(True)
767            G2plt.PlotPatterns(self,newPlot=True)
768        elif 'HKLF' in self.PatternTree.GetItemText(item):
769            self.Sngl = item
770            G2plt.PlotSngl(self,newPlot=True)
771        elif 'PDF' in self.PatternTree.GetItemText(item):
772            self.PatternId = item
773            self.ExportPDF.Enable(True)
774            G2plt.PlotISFG(self,type='S(Q)')
775           
776    elif 'I(Q)' in self.PatternTree.GetItemText(item):
777        self.PickId = item
778        self.PatternId = self.PatternTree.GetItemParent(item)
779        G2plt.PlotISFG(self,type='I(Q)',newPlot=True)
780    elif 'S(Q)' in self.PatternTree.GetItemText(item):
781        self.PickId = item
782        self.PatternId = self.PatternTree.GetItemParent(item)
783        G2plt.PlotISFG(self,type='S(Q)',newPlot=True)
784    elif 'F(Q)' in self.PatternTree.GetItemText(item):
785        self.PickId = item
786        self.PatternId = self.PatternTree.GetItemParent(item)
787        G2plt.PlotISFG(self,type='F(Q)',newPlot=True)
788    elif 'G(R)' in self.PatternTree.GetItemText(item):
789        self.PickId = item
790        self.PatternId = self.PatternTree.GetItemParent(item)
791        G2plt.PlotISFG(self,type='G(R)',newPlot=True)           
792    elif self.PatternTree.GetItemText(parentID) == 'Phases':
793        self.PickId = item
794        data = self.PatternTree.GetItemPyData(item)           
795        G2phG.UpdatePhaseData(self,item,data,oldPage)
796    elif self.PatternTree.GetItemText(item) == 'Comments':
797        self.PatternId = self.PatternTree.GetItemParent(item)
798        self.PickId = item
799        data = self.PatternTree.GetItemPyData(item)
800        UpdateComments(self,data)
801    elif self.PatternTree.GetItemText(item) == 'Image Controls':
802        self.dataFrame.SetTitle('Image Controls')
803        self.PickId = item
804        self.Image = self.PatternTree.GetItemParent(item)
805        masks = self.PatternTree.GetItemPyData(
806            GetPatternTreeItemId(self,self.Image, 'Masks'))
807        data = self.PatternTree.GetItemPyData(item)
808        G2imG.UpdateImageControls(self,data,masks)
809        G2plt.PlotImage(self)
810    elif self.PatternTree.GetItemText(item) == 'Masks':
811        self.dataFrame.SetTitle('Masks')
812        self.PickId = item
813        self.Image = self.PatternTree.GetItemParent(item)
814        data = self.PatternTree.GetItemPyData(item)
815        G2imG.UpdateMasks(self,data)
816        G2plt.PlotImage(self)
817    elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
818        self.PickId = item
819        self.Sngl = self.PatternTree.GetItemParent(item)
820        data = self.PatternTree.GetItemPyData(item)
821        UpdateHKLControls(self,data)
822        G2plt.PlotSngl(self)
823    elif self.PatternTree.GetItemText(item) == 'PDF Controls':
824        self.PatternId = self.PatternTree.GetItemParent(item)
825        self.ExportPDF.Enable(True)
826        self.PickId = item
827        data = self.PatternTree.GetItemPyData(item)
828        G2pdG.UpdatePDFGrid(self,data)
829        G2plt.PlotISFG(self,type='I(Q)')
830        G2plt.PlotISFG(self,type='S(Q)')
831        G2plt.PlotISFG(self,type='F(Q)')
832        G2plt.PlotISFG(self,type='G(R)')
833    elif self.PatternTree.GetItemText(item) == 'Peak List':
834        self.PatternId = self.PatternTree.GetItemParent(item)
835        self.ExportPeakList.Enable(True)
836        self.PickId = item
837        data = self.PatternTree.GetItemPyData(item)
838        G2pdG.UpdatePeakGrid(self,data)
839        G2plt.PlotPatterns(self)
840    elif self.PatternTree.GetItemText(item) == 'Background':
841        self.PatternId = self.PatternTree.GetItemParent(item)
842        self.PickId = item
843        data = self.PatternTree.GetItemPyData(item)
844        G2pdG.UpdateBackgroundGrid(self,data)
845        G2plt.PlotPatterns(self)
846    elif self.PatternTree.GetItemText(item) == 'Limits':
847        self.PatternId = self.PatternTree.GetItemParent(item)
848        self.PickId = item
849        data = self.PatternTree.GetItemPyData(item)
850        G2pdG.UpdateLimitsGrid(self,data)
851        G2plt.PlotPatterns(self)
852    elif self.PatternTree.GetItemText(item) == 'Instrument Parameters':
853        self.PatternId = self.PatternTree.GetItemParent(item)
854        self.PickId = item
855        data = self.PatternTree.GetItemPyData(item)
856        G2pdG.UpdateInstrumentGrid(self,data)
857        G2plt.PlotPeakWidths(self)
858    elif self.PatternTree.GetItemText(item) == 'Sample Parameters':
859        self.PatternId = self.PatternTree.GetItemParent(item)
860        self.PickId = item
861        data = self.PatternTree.GetItemPyData(item)
862
863        if 'Temperature' not in data:           #temp fix for old gpx files
864            data = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],'DisplaceX':[0.0,False],
865                'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,
866                'Force':0.0,'Gonio. radius':200.0}
867            self.PatternTree.SetItemPyData(item,data)
868   
869        G2pdG.UpdateSampleGrid(self,data)
870        G2plt.PlotPatterns(self)
871    elif self.PatternTree.GetItemText(item) == 'Index Peak List':
872        self.PatternId = self.PatternTree.GetItemParent(item)
873        self.ExportPeakList.Enable(True)
874        self.PickId = item
875        data = self.PatternTree.GetItemPyData(item)
876        G2pdG.UpdateIndexPeaksGrid(self,data)
877        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
878            G2plt.PlotPowderLines(self)
879        else:
880            G2plt.PlotPatterns(self)
881    elif self.PatternTree.GetItemText(item) == 'Unit Cells List':
882        self.PatternId = self.PatternTree.GetItemParent(item)
883        self.PickId = item
884        data = self.PatternTree.GetItemPyData(item)
885        if not data:
886            data.append([0,0.0,4,25.0,0,'P1',1,1,1,90,90,90]) #zero error flag, zero value, max Nc/No, start volume
887            data.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0])      #Bravais lattice flags
888            data.append([])                                 #empty cell list
889            data.append([])                                 #empty dmin
890            self.PatternTree.SetItemPyData(item,data)                             
891        G2pdG.UpdateUnitCellsGrid(self,data)
892        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
893            G2plt.PlotPowderLines(self)
894        else:
895            G2plt.PlotPatterns(self)
896    elif self.PatternTree.GetItemText(item) == 'Reflection Lists':
897        self.PatternId = self.PatternTree.GetItemParent(item)
898        self.PickId = item
899        data = self.PatternTree.GetItemPyData(item)
900        self.RefList = ''
901        if len(data):
902            self.RefList = data.keys()[0]
903        G2pdG.UpdateReflectionGrid(self,data)
904        G2plt.PlotPatterns(self)
905     
Note: See TracBrowser for help on using the repository browser.