source: trunk/GSASIIgrid.py @ 342

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

major modifications to get 1st "working" version of Refine
Add GSASIImapvars.py
fix cell refinement in indexing window
single cycle for peak refinement

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