source: trunk/GSASIIgrid.py @ 346

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

GSASIIgrid.py - clear peaks from peak fit list & allow change from lam to lam1 & lam2
avoid log(neg) in image plots

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