source: trunk/GSASIIgrid.py @ 383

Last change on this file since 383 was 383, checked in by vondreele, 12 years ago

small fixes

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