source: trunk/GSASIIgrid.py @ 399

Last change on this file since 399 was 399, checked in by vondreele, 10 years ago

Implement sequential refinement
remove print "load" & "save" for each item in Tree
revise application of azimuth offset - azimuths are now all "true" with correction

  • Property svn:keywords set to Date Author Revision URL Id
File size: 53.7 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-10-25 21:53:33 +0000 (Tue, 25 Oct 2011) $
4# $Author: vondreele $
5# $Revision: 399 $
6# $URL: trunk/GSASIIgrid.py $
7# $Id: GSASIIgrid.py 399 2011-10-25 21:53:33Z vondreele $
8########### SVN repository information ###################
9import wx
10import wx.grid as wg
11import time
12import cPickle
13import numpy as np
14import GSASIIpath
15import GSASIIplot as G2plt
16import GSASIIpwdGUI as G2pdG
17import GSASIIimgGUI as G2imG
18import GSASIIphsGUI as G2phG
19import GSASIIstruct as G2str
20import GSASIImapvars as G2mv
21
22[ wxID_ATOMSEDITADD, wxID_ATOMSEDITINSERT, wxID_ATOMSEDITDELETE, wxID_ATOMSREFINE, 
23    wxID_ATOMSMODIFY, wxID_ATOMSTRANSFORM, wxID_ATOMSTESTADD, wxID_ATONTESTINSERT,
24    wxID_RELOADDRAWATOMS,
25] = [wx.NewId() for _init_coll_Atom_Items in range(9)]
26
27[ wxID_PWDRADD, wxID_HKLFADD, wxID_DATADELETE,
28] = [wx.NewId() for _init_coll_Data_Items in range(3)]
29
30[ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWATOMCOLOR, wxID_DRAWATOMRESETCOLOR, 
31    wxID_DRAWVIEWPOINT, wxID_DRAWTRANSFORM, wxID_DRAWDELETE, wxID_DRAWFILLCELL, 
32    wxID_DRAWADDEQUIV, wxID_DRAWFILLCOORD,
33] = [wx.NewId() for _init_coll_DrawAtom_Items in range(10)]
34
35[ wxID_IMCALIBRATE,wxID_IMRECALIBRATE,wxID_IMINTEGRATE, wxID_IMCLEARCALIB, 
36    wxID_IMCOPYCONTROLS, wxID_INTEGRATEALL, wxID_IMSAVECONTROLS, wxID_IMLOADCONTROLS,
37] = [wx.NewId() for _init_coll_IMAGE_Items in range(8)]
38
39[ wxID_MASKCOPY, wxID_MASKSAVE, wxID_MASKLOAD,
40] = [wx.NewId() for _init_coll_MASK_Items in range(3)]
41
42[ wxID_PAWLEYLOAD, wxID_PAWLEYIMPORT, wxID_PAWLEYDELETE, wxID_PAWLEYESTIMATE,
43] = [wx.NewId() for _init_coll_PAWLEY_Items in range(4)]
44
45[ wxID_INSTPRMRESET,wxID_CHANGEWAVETYPE,
46] = [wx.NewId() for _init_coll_INST_Items in range(2)]
47
48[ wxID_INDXRELOAD,
49] = [wx.NewId() for _init_coll_IndPeaks_Items in range(1)]
50
51[ wxID_UNDO,wxID_LSQPEAKFIT,wxID_LSQONECYCLE,wxID_RESETSIGGAM,wxID_CLEARPEAKS,
52] = [wx.NewId() for _init_coll_PEAK_Items in range(5)]
53
54[  wxID_INDEXPEAKS, wxID_REFINECELL, wxID_COPYCELL, wxID_MAKENEWPHASE,
55] = [wx.NewId() for _init_coll_INDEX_Items in range(4)]
56
57[ wxID_CONSTRAINTADD,
58] = [wx.NewId() for _init_coll_Constraint_Items in range(1)]
59
60[ wxID_RESTRAINTADD,
61] = [wx.NewId() for _init_coll_Restraint_Items in range(1)]
62
63[ wxID_SELECTPHASE,
64] = [wx.NewId() for _init_coll_Refl_Items in range(1)]
65
66[ wxID_CLEARTEXTURE,
67] = [wx.NewId() for _init_coll_Texture_Items in range(1)]
68
69[ wxID_PDFCOPYCONTROLS, wxID_PDFSAVECONTROLS, wxID_PDFLOADCONTROLS, 
70    wxID_PDFCOMPUTE, wxID_PDFCOMPUTEALL, wxID_PDFADDELEMENT, wxID_PDFDELELEMENT,
71] = [wx.NewId() for _init_coll_PDF_Items in range(7)]
72
73VERY_LIGHT_GREY = wx.Colour(235,235,235)
74
75class DataFrame(wx.Frame):
76    def _init_coll_BlankMenu(self,parent):
77        parent.Append(menu=self.Blank,title='')
78       
79    def _init_coll_AtomsMenu(self,parent):
80        parent.Append(menu=self.AtomEdit, title='Edit')
81       
82    def _init_coll_ConstraintMenu(self,parent):
83        parent.Append(menu=self.ConstraintEdit, title='Edit')
84       
85    def _init_coll_RestraintMenu(self,parent):
86        parent.Append(menu=self.RestraintEdit, title='Edit')
87       
88    def _init_coll_DataMenu(self,parent):
89        parent.Append(menu=self.DataEdit, title='Edit')
90       
91    def _init_coll_DrawAtomsMenu(self,parent):
92        parent.Append(menu=self.DrawAtomEdit, title='Edit')
93
94    def _init_coll_PawleyMenu(self,parent):
95        parent.Append(menu=self.PawleyEdit,title='Pawley Reflections Operations')
96     
97    def _init_coll_IndPeaksMenu(self,parent):
98        parent.Append(menu=self.IndPeaksEdit,title='Index Peaks Operations')
99                   
100    def _init_coll_ImageMenu(self,parent):
101        parent.Append(menu=self.ImageEdit, title='Image Operations')
102       
103    def _init_coll_InstMenu(self,parent):
104        parent.Append(menu=self.InstEdit, title='Inst. Parm. Operations')
105       
106    def _init_coll_MaskMenu(self,parent):
107        parent.Append(menu=self.MaskEdit, title='Mask Operations')
108       
109    def _init_coll_PeakMenu(self,parent):
110        parent.Append(menu=self.PeakEdit, title='Peak Fitting')
111
112    def _init_coll_IndexMenu(self,parent):
113        parent.Append(menu=self.IndexEdit, title='Cell Index/Refine')
114       
115    def _init_coll_ReflMenu(self,parent):
116        parent.Append(menu=self.ReflEdit, title='Reflection List')
117
118    def _init_coll_TextureMenu(self,parent):
119        parent.Append(menu=self.TextureEdit, title='Texture')
120
121    def _init_coll_PDFMenu(self,parent):
122        parent.Append(menu=self.PDFEdit, title='PDF Controls')
123
124    def _init_coll_Atom_Items(self,parent):
125        parent.Append(id=wxID_ATOMSEDITADD, kind=wx.ITEM_NORMAL,text='Append atom',
126            help='Inserted as an H atom')
127        parent.Append(id=wxID_ATOMSTESTADD, kind=wx.ITEM_NORMAL,text='Append test point',
128            help='Inserted as an H atom')
129        parent.Append(id=wxID_ATOMSEDITINSERT, kind=wx.ITEM_NORMAL,text='Insert atom',
130            help='Select atom row to insert before; inserted as an H atom')
131        parent.Append(id=wxID_ATONTESTINSERT, kind=wx.ITEM_NORMAL,text='Insert test point',
132            help='Select atom row to insert before; inserted as an H atom')
133        parent.Append(id=wxID_ATOMSEDITDELETE, kind=wx.ITEM_NORMAL,text='Delete atom',
134            help='Select atoms to delete first')
135        parent.Append(id=wxID_ATOMSREFINE, kind=wx.ITEM_NORMAL,text='Set atom refinement flags',
136            help='Select atoms to refine first')
137        parent.Append(id=wxID_ATOMSMODIFY, kind=wx.ITEM_NORMAL,text='Modify atom parameters',
138            help='Select atoms to modify first')
139        parent.Append(id=wxID_ATOMSTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
140            help='Select atoms to transform first')
141        parent.Append(id=wxID_RELOADDRAWATOMS, kind=wx.ITEM_NORMAL,text='Reload draw atoms',
142            help='Reload atom drawing list')
143           
144    def _init_coll_Constraint_Items(self,parent):
145        parent.Append(id=wxID_CONSTRAINTADD, kind=wx.ITEM_NORMAL,text='Add constraint',
146            help='constraint dummy menu item')
147       
148    def _init_coll_Restraint_Items(self,parent):
149        parent.Append(id=wxID_RESTRAINTADD, kind=wx.ITEM_NORMAL,text='Add restraint',
150            help='restraint dummy menu item')
151                   
152    def _init_coll_Data_Items(self,parent):
153        parent.Append(id=wxID_PWDRADD, kind=wx.ITEM_NORMAL,text='Add powder histograms',
154            help='Select new powder histograms to be used for this phase')
155        parent.Append(id=wxID_HKLFADD, kind=wx.ITEM_NORMAL,text='Add single crystal histograms',
156            help='Select new single crystal histograms to be used for this phase')
157        parent.Append(id=wxID_DATADELETE, kind=wx.ITEM_NORMAL,text='Delete histograms',
158            help='Delete histograms from use for this phase')
159
160    def _init_coll_Texture_Items(self,parent):
161        self.ClearPeaks = parent.Append(id=wxID_CLEARTEXTURE, kind=wx.ITEM_NORMAL,text='Clear texture', 
162            help='Clear the texture coefficients' )
163           
164    def _init_coll_DrawAtom_Items(self,parent):
165        parent.Append(id=wxID_DRAWATOMSTYLE, kind=wx.ITEM_NORMAL,text='Atom style',
166            help='Select atoms first')
167        parent.Append(id=wxID_DRAWATOMLABEL, kind=wx.ITEM_NORMAL,text='Atom label',
168            help='Select atoms first')
169        parent.Append(id=wxID_DRAWATOMCOLOR, kind=wx.ITEM_NORMAL,text='Atom color',
170            help='Select atoms first')
171        parent.Append(id=wxID_DRAWATOMRESETCOLOR, kind=wx.ITEM_NORMAL,text='Reset atom colors',
172            help='Resets all atom colors to defaults')
173        parent.Append(id=wxID_DRAWVIEWPOINT, kind=wx.ITEM_NORMAL,text='View point',
174            help='View point is 1st atom selected')
175        parent.Append(id=wxID_DRAWADDEQUIV, kind=wx.ITEM_NORMAL,text='Add atoms',
176            help='Add symmetry & cell equivalents to drawing set from selected atoms')
177        parent.Append(id=wxID_DRAWTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
178            help='Transform selected atoms by symmetry & cell translations')
179        parent.Append(id=wxID_DRAWFILLCOORD, kind=wx.ITEM_NORMAL,text='Fill CN-sphere',
180            help='Fill coordination sphere for selected atoms')           
181        parent.Append(id=wxID_DRAWFILLCELL, kind=wx.ITEM_NORMAL,text='Fill unit cell',
182            help='Fill unit cell with selected atoms')
183        parent.Append(id=wxID_DRAWDELETE, kind=wx.ITEM_NORMAL,text='Delete atoms',
184            help='Delete atoms from drawing set')
185
186    def _init_coll_Pawley_Items(self,parent):
187        parent.Append(id=wxID_PAWLEYLOAD, kind=wx.ITEM_NORMAL,text='Pawley create',
188            help='Initialize Pawley reflection list')
189#        parent.Append(id=wxID_PAWLEYIMPORT, kind=wx.ITEM_NORMAL,text='Pawley import',
190#            help='Import Pawley reflection list')
191        parent.Append(id=wxID_PAWLEYESTIMATE, kind=wx.ITEM_NORMAL,text='Pawley estimate',
192            help='Estimate initial Pawley intensities')
193        parent.Append(id=wxID_PAWLEYDELETE, kind=wx.ITEM_NORMAL,text='Pawley delete',
194            help='Delete Pawley reflection list')
195
196    def _init_coll_IndPeaks_Items(self,parent):
197        parent.Append(help='Load/Reload index peaks from peak list',id=wxID_INDXRELOAD, 
198            kind=wx.ITEM_NORMAL,text='Load/Reload')
199           
200    def _init_coll_Refl_Items(self,parent):
201        self.SelectPhase = parent.Append(help='Select phase for reflection list',id=wxID_SELECTPHASE, 
202            kind=wx.ITEM_NORMAL,text='Select phase')
203           
204    def _init_coll_Image_Items(self,parent):
205        parent.Append(help='Calibrate detector by fitting to calibrant lines', 
206            id=wxID_IMCALIBRATE, kind=wx.ITEM_NORMAL,text='Calibrate')
207        parent.Append(help='Recalibrate detector by fitting to calibrant lines', 
208            id=wxID_IMRECALIBRATE, kind=wx.ITEM_NORMAL,text='Realibrate')
209        parent.Append(help='Clear calibration data points and rings',id=wxID_IMCLEARCALIB, 
210            kind=wx.ITEM_NORMAL,text='Clear calibration')
211        parent.Append(help='Integrate selected image',id=wxID_IMINTEGRATE, 
212            kind=wx.ITEM_NORMAL,text='Integrate')
213        parent.Append(help='Integrate all images selected from list',id=wxID_INTEGRATEALL,
214            kind=wx.ITEM_NORMAL,text='Integrate all')
215        parent.Append(help='Copy image controls to other images', 
216            id=wxID_IMCOPYCONTROLS, kind=wx.ITEM_NORMAL,text='Copy Controls')
217        parent.Append(help='Save image controls to file', 
218            id=wxID_IMSAVECONTROLS, kind=wx.ITEM_NORMAL,text='Save Controls')
219        parent.Append(help='Load image controls from file', 
220            id=wxID_IMLOADCONTROLS, kind=wx.ITEM_NORMAL,text='Load Controls')
221
222                   
223    def _init_coll_Mask_Items(self,parent):
224        parent.Append(help='Copy mask to other images', 
225            id=wxID_MASKCOPY, kind=wx.ITEM_NORMAL,text='Copy mask')
226        parent.Append(help='Save mask to file', 
227            id=wxID_MASKSAVE, kind=wx.ITEM_NORMAL,text='Save mask')
228        parent.Append(help='Load mask from file', 
229            id=wxID_MASKLOAD, kind=wx.ITEM_NORMAL,text='Load mask')
230
231    def _init_coll_Inst_Items(self,parent):
232        parent.Append(help='Reset instrument profile parameters to default', 
233            id=wxID_INSTPRMRESET, kind=wx.ITEM_NORMAL,text='Reset profile')
234        parent.Append(help='Change radiation type (Ka12 - synch)', 
235            id=wxID_CHANGEWAVETYPE, kind=wx.ITEM_NORMAL,text='Change radiation')
236
237    def _init_coll_Peak_Items(self,parent):
238        self.UnDo = parent.Append(help='Undo last least squares refinement', 
239            id=wxID_UNDO, kind=wx.ITEM_NORMAL,text='UnDo')
240        self.PeakFit = parent.Append(id=wxID_LSQPEAKFIT, kind=wx.ITEM_NORMAL,text='LSQ PeakFit', 
241            help='Peak fitting via least-squares' )
242        self.PFOneCycle = parent.Append(id=wxID_LSQONECYCLE, kind=wx.ITEM_NORMAL,text='LSQ one cycle', 
243            help='One cycle of Peak fitting via least-squares' )
244        self.ResetSigGam = parent.Append(id=wxID_RESETSIGGAM, kind=wx.ITEM_NORMAL, 
245            text='Reset sig and gam',help='Reset sigma and gamma to global fit' )
246        self.ClearPeaks = parent.Append(id=wxID_CLEARPEAKS, kind=wx.ITEM_NORMAL,text='Clear peaks', 
247            help='Clear the peak list' )
248           
249    def _init_coll_Index_Items(self,parent):
250        self.IndexPeaks = parent.Append(help='', id=wxID_INDEXPEAKS, kind=wx.ITEM_NORMAL,
251            text='Index Cell')
252        self.CopyCell = parent.Append( id=wxID_COPYCELL, kind=wx.ITEM_NORMAL,text='Copy Cell', 
253            help='Copy selected unit cell from indexing to cell refinement fields')
254        self.RefineCell = parent.Append( id=wxID_REFINECELL, kind=wx.ITEM_NORMAL, 
255            text='Refine Cell',help='Refine unit cell parameters from indexed peaks')
256        self.MakeNewPhase = parent.Append( id=wxID_MAKENEWPHASE, kind=wx.ITEM_NORMAL,
257            text='Make new phase',help='Make new phase from selected unit cell')
258           
259    def _init_coll_PDF_Items(self,parent):
260        parent.Append(help='Add element to sample composition',id=wxID_PDFADDELEMENT, kind=wx.ITEM_NORMAL,
261            text='Add element')
262        parent.Append(help='Delete element from sample composition',id=wxID_PDFDELELEMENT, kind=wx.ITEM_NORMAL,
263            text='Delete element')
264        parent.Append(help='Copy PDF controls', id=wxID_PDFCOPYCONTROLS, kind=wx.ITEM_NORMAL,
265            text='Copy controls')
266#        parent.Append(help='Load PDF controls from file',id=wxID_PDFLOADCONTROLS, kind=wx.ITEM_NORMAL,
267#            text='Load Controls')
268#        parent.Append(help='Save PDF controls to file', id=wxID_PDFSAVECONTROLS, kind=wx.ITEM_NORMAL,
269#            text='Save controls')
270        self.PDFCompute = parent.Append(help='Compute PDF', id=wxID_PDFCOMPUTE, kind=wx.ITEM_NORMAL,
271            text='Compute PDF')
272        self.PDFCompute = parent.Append(help='Compute all PDFs', id=wxID_PDFCOMPUTEALL, kind=wx.ITEM_NORMAL,
273            text='Compute all PDFs')
274       
275
276    def _init_utils(self):
277        self.BlankMenu = wx.MenuBar()
278       
279        self.AtomsMenu = wx.MenuBar()
280        self.ConstraintMenu = wx.MenuBar()
281        self.RestraintMenu = wx.MenuBar()
282        self.DataMenu = wx.MenuBar()
283        self.TextureMenu = wx.MenuBar()
284        self.DrawAtomsMenu = wx.MenuBar()
285        self.PawleyMenu = wx.MenuBar()
286        self.ImageMenu = wx.MenuBar()
287        self.MaskMenu = wx.MenuBar()
288        self.InstMenu = wx.MenuBar()
289        self.PeakMenu = wx.MenuBar()
290        self.IndPeaksMenu = wx.MenuBar()
291        self.IndexMenu = wx.MenuBar()
292        self.ReflMenu = wx.MenuBar()
293        self.PDFMenu = wx.MenuBar()
294        self.AtomEdit = wx.Menu(title='')
295        self.ConstraintEdit = wx.Menu(title='')
296        self.RestraintEdit = wx.Menu(title='')
297        self.DataEdit = wx.Menu(title='')
298        self.TextureEdit = wx.Menu(title='')
299        self.DrawAtomEdit = wx.Menu(title='')
300        self.PawleyEdit = wx.Menu(title='')
301        self.ImageEdit = wx.Menu(title='')
302        self.MaskEdit = wx.Menu(title='')
303        self.InstEdit = wx.Menu(title='')
304        self.PeakEdit = wx.Menu(title='')
305        self.IndPeaksEdit = wx.Menu(title='')
306        self.IndexEdit = wx.Menu(title='')
307        self.ReflEdit = wx.Menu(title='')
308        self.PDFEdit = wx.Menu(title='')
309        self._init_coll_AtomsMenu(self.AtomsMenu)
310        self._init_coll_Atom_Items(self.AtomEdit)
311        self._init_coll_ConstraintMenu(self.ConstraintMenu)
312        self._init_coll_Constraint_Items(self.ConstraintEdit)
313        self._init_coll_RestraintMenu(self.RestraintMenu)
314        self._init_coll_Restraint_Items(self.RestraintEdit)
315        self._init_coll_DataMenu(self.DataMenu)
316        self._init_coll_Data_Items(self.DataEdit)
317        self._init_coll_TextureMenu(self.TextureMenu)
318        self._init_coll_Texture_Items(self.TextureEdit)
319        self._init_coll_DrawAtomsMenu(self.DrawAtomsMenu)
320        self._init_coll_DrawAtom_Items(self.DrawAtomEdit)
321        self._init_coll_PawleyMenu(self.PawleyMenu)
322        self._init_coll_Pawley_Items(self.PawleyEdit)
323        self._init_coll_ImageMenu(self.ImageMenu)
324        self._init_coll_Image_Items(self.ImageEdit)
325        self._init_coll_MaskMenu(self.MaskMenu)
326        self._init_coll_Mask_Items(self.MaskEdit)
327        self._init_coll_InstMenu(self.InstMenu)
328        self._init_coll_Inst_Items(self.InstEdit)
329        self._init_coll_PeakMenu(self.PeakMenu)
330        self._init_coll_Peak_Items(self.PeakEdit)
331        self._init_coll_IndPeaksMenu(self.IndPeaksMenu)
332        self._init_coll_IndPeaks_Items(self.IndPeaksEdit)
333        self._init_coll_IndexMenu(self.IndexMenu)
334        self._init_coll_Index_Items(self.IndexEdit)
335        self._init_coll_ReflMenu(self.ReflMenu)
336        self._init_coll_Refl_Items(self.ReflEdit)
337        self._init_coll_PDFMenu(self.PDFMenu)
338        self._init_coll_PDF_Items(self.PDFEdit)
339        self.UnDo.Enable(False)
340        self.PeakFit.Enable(False)
341        self.PFOneCycle.Enable(False)
342        self.IndexPeaks.Enable(False)
343        self.CopyCell.Enable(False)
344        self.RefineCell.Enable(False)
345        self.MakeNewPhase.Enable(False)
346       
347    def _init_ctrls(self, parent,name=None,size=None,pos=None):
348        wx.Frame.__init__(self,parent=parent,style=wx.DEFAULT_FRAME_STYLE ^ wx.CLOSE_BOX,
349            size=size,pos=pos,title='GSAS-II data display')
350        self._init_utils()
351        if name:
352            self.SetLabel(name)
353        self.Show()
354       
355    def __init__(self,parent,data=None,name=None, size=None,pos=None):
356        self._init_ctrls(parent,name,size,pos)
357        self.data = data
358        clientSize = wx.ClientDisplayRect()
359        Size = self.GetSize()
360        xPos = clientSize[2]-Size[0]
361        self.SetPosition(wx.Point(xPos,clientSize[1]+250))
362        self.dirname = ''
363        self.AtomGrid = []
364        self.selectedRow = 0
365       
366    def setSizePosLeft(self,Width):
367        clientSize = wx.ClientDisplayRect()
368        Width[1] = min(Width[1],clientSize[2]-300)
369        Width[0] = max(Width[0],300)
370        self.SetSize(Width)
371        self.SetPosition(wx.Point(clientSize[2]-Width[0],clientSize[1]+250))
372       
373    def Clear(self):
374        self.ClearBackground()
375        self.DestroyChildren()
376                   
377class GSNoteBook(wx.Notebook):
378    def __init__(self, parent, name='',size = None):
379        wx.Notebook.__init__(self, parent, -1, name=name, style= wx.BK_TOP)
380        if size: self.SetSize(size)
381                                                     
382    def Clear(self):       
383        GSNoteBook.DeleteAllPages(self)
384       
385    def FindPage(self,name):
386        numPage = self.GetPageCount()
387        for page in range(numPage):
388            if self.GetPageText(page) == name:
389                return page
390       
391class GSGrid(wg.Grid):
392    def __init__(self, parent, name=''):
393        wg.Grid.__init__(self,parent,-1,name=name)                   
394        self.SetSize(parent.GetClientSize())
395           
396    def Clear(self):
397        wg.Grid.ClearGrid(self)
398       
399    def SetCellStyle(self,r,c,color="white",readonly=True):
400        self.SetCellBackgroundColour(r,c,color)
401        self.SetReadOnly(r,c,isReadOnly=readonly)
402       
403    def GetSelection(self):
404        #this is to satisfy structure drawing stuff in G2plt when focus changes
405        return None
406                       
407class Table(wg.PyGridTableBase):
408    def __init__(self, data=[], rowLabels=None, colLabels=None, types = None):
409        wg.PyGridTableBase.__init__(self)
410        self.colLabels = colLabels
411        self.rowLabels = rowLabels
412        self.dataTypes = types
413        self.data = data
414       
415    def AppendRows(self, numRows=1):
416        self.data.append([])
417        return True
418       
419    def CanGetValueAs(self, row, col, typeName):
420        if self.dataTypes:
421            colType = self.dataTypes[col].split(':')[0]
422            if typeName == colType:
423                return True
424            else:
425                return False
426        else:
427            return False
428
429    def CanSetValueAs(self, row, col, typeName):
430        return self.CanGetValueAs(row, col, typeName)
431
432    def DeleteRow(self,pos):
433        data = self.GetData()
434        self.SetData([])
435        new = []
436        for irow,row in enumerate(data):
437            if irow <> pos:
438                new.append(row)
439        self.SetData(new)
440       
441    def GetColLabelValue(self, col):
442        if self.colLabels:
443            return self.colLabels[col]
444           
445    def GetData(self):
446        data = []
447        for row in range(self.GetNumberRows()):
448            data.append(self.GetRowValues(row))
449        return data
450       
451    def GetNumberCols(self):
452        try:
453            return len(self.colLabels)
454        except TypeError:
455            return None
456       
457    def GetNumberRows(self):
458        return len(self.data)
459       
460    def GetRowLabelValue(self, row):
461        if self.rowLabels:
462            return self.rowLabels[row]
463       
464    def GetColValues(self, col):
465        data = []
466        for row in range(self.GetNumberRows()):
467            data.append(self.GetValue(row, col))
468        return data
469       
470    def GetRowValues(self, row):
471        data = []
472        for col in range(self.GetNumberCols()):
473            data.append(self.GetValue(row, col))
474        return data
475       
476    def GetTypeName(self, row, col):
477        try:
478            return self.dataTypes[col]
479        except TypeError:
480            return None
481
482    def GetValue(self, row, col):
483        try:
484            return self.data[row][col]
485        except IndexError:
486            return None
487           
488    def InsertRows(self, pos, rows):
489        for row in range(rows):
490            self.data.insert(pos,[])
491            pos += 1
492       
493    def IsEmptyCell(self,row,col):
494        try:
495            return not self.data[row][col]
496        except IndexError:
497            return True
498       
499    def OnKeyPress(self, event):
500        dellist = self.GetSelectedRows()
501        if event.GetKeyCode() == wx.WXK_DELETE and dellist:
502            grid = self.GetView()
503            for i in dellist: grid.DeleteRow(i)
504               
505    def SetColLabelValue(self, col, label):
506        numcols = self.GetNumberCols()
507        if col > numcols-1:
508            self.colLabels.append(label)
509        else:
510            self.colLabels[col]=label
511       
512    def SetData(self,data):
513        for row in range(len(data)):
514            self.SetRowValues(row,data[row])
515               
516    def SetRowLabelValue(self, row, label):
517        self.rowLabels[row]=label
518           
519    def SetRowValues(self,row,data):
520        self.data[row] = data
521           
522    def SetValue(self, row, col, value):
523        def innerSetValue(row, col, value):
524            try:
525                self.data[row][col] = value
526            except TypeError:
527                return
528            except IndexError:
529                print row,col,value
530                # add a new row
531                if row > self.GetNumberRows():
532                    self.data.append([''] * self.GetNumberCols())
533                elif col > self.GetNumberCols():
534                    for row in range(self.GetNumberRows):
535                        self.data[row].append('')
536                print self.data
537                self.data[row][col] = value
538        innerSetValue(row, col, value)
539               
540def UpdateNotebook(self,data):       
541    if data:
542        self.dataFrame.SetLabel('Notebook')
543        self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
544            style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
545        for line in data:
546            self.dataDisplay.AppendText(line+"\n")
547            self.dataDisplay.AppendText('Notebook entry @ '+time.ctime()+"\n")
548           
549def UpdateControls(self,data):
550    #patch
551    if 'deriv type' not in data:
552        data = {}
553        data['deriv type'] = 'analytical'
554        data['min dM/M'] = 0.0001
555        data['shift factor'] = 1.
556    if 'shift factor' not in data:
557        data['shift factor'] = 1.       
558    #end patch
559    '''
560    #Fourier controls
561    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
562    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
563    #distance/angle controls
564    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
565    '''
566       
567    def SetStatusLine(text):
568        Status.SetStatusText(text)                                     
569       
570    def OnConvergence(event):
571        try:
572            value = max(1.e-9,min(1.0,float(Cnvrg.GetValue())))
573        except ValueError:
574            value = 0.0001
575        data['min dM/M'] = value
576        Cnvrg.SetValue('%.2g'%(value))
577       
578    def OnDerivType(event):
579        data['deriv type'] = derivSel.GetValue()
580        derivSel.SetValue(data['deriv type'])
581       
582    def OnFactor(event):
583        try:
584            value = min(max(float(Factr.GetValue()),0.00001),100.)
585        except ValueError:
586            value = 1.0
587        data['shift factor'] = value
588        Factr.SetValue('%.5f'%(value))
589       
590    def OnSelectData(event):
591        choices = ['All',]+GetPatternTreeDataNames(self,['PWDR',])
592        if 'Seq Data' in data:
593            sel = []
594            for item in data['Seq Data']:
595                sel.append(choices.index(item))
596        names = []
597        dlg = wx.MultiChoiceDialog(self,'Select data:','Sequential refinement',choices)
598        dlg.SetSelections(sel)
599        if dlg.ShowModal() == wx.ID_OK:
600            sel = dlg.GetSelections()
601            for i in sel: names.append(choices[i])
602            if 'All' in names:
603                names = choices[1:]
604               
605        dlg.Destroy()
606        data['Seq Data'] = names
607        reverseSel.Enable(True)
608       
609    def OnReverse(event):
610        data['Reverse Seq'] = reverseSel.GetValue()
611       
612    if self.dataDisplay:
613        self.dataDisplay.Destroy()
614    if not self.dataFrame.GetStatusBar():
615        Status = self.dataFrame.CreateStatusBar()
616    SetStatusLine('')
617    self.dataFrame.SetLabel('Controls')
618    self.dataDisplay = wx.Panel(self.dataFrame)
619    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
620    mainSizer = wx.BoxSizer(wx.VERTICAL)
621    mainSizer.Add((5,5),0)
622    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
623    LSSizer = wx.FlexGridSizer(cols=6,vgap=5,hgap=5)
624    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement derivatives: '),0,wx.ALIGN_CENTER_VERTICAL)
625    Choice=['analytic','numeric']
626    derivSel = wx.ComboBox(parent=self.dataDisplay,value=data['deriv type'],choices=Choice,
627        style=wx.CB_READONLY|wx.CB_DROPDOWN)
628    derivSel.SetValue(data['deriv type'])
629    derivSel.Bind(wx.EVT_COMBOBOX, OnDerivType)   
630    LSSizer.Add(derivSel,0,wx.ALIGN_CENTER_VERTICAL)
631    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Min delta-M/M: '),0,wx.ALIGN_CENTER_VERTICAL)
632    Cnvrg = wx.TextCtrl(self.dataDisplay,-1,value='%.2g'%(data['min dM/M']),style=wx.TE_PROCESS_ENTER)
633    Cnvrg.Bind(wx.EVT_TEXT_ENTER,OnConvergence)
634    Cnvrg.Bind(wx.EVT_KILL_FOCUS,OnConvergence)
635    LSSizer.Add(Cnvrg,0,wx.ALIGN_CENTER_VERTICAL)
636    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Initial shift factor: '),0,wx.ALIGN_CENTER_VERTICAL)
637    Factr = wx.TextCtrl(self.dataDisplay,-1,value='%.5f'%(data['shift factor']),style=wx.TE_PROCESS_ENTER)
638    Factr.Bind(wx.EVT_TEXT_ENTER,OnFactor)
639    Factr.Bind(wx.EVT_KILL_FOCUS,OnFactor)
640    LSSizer.Add(Factr,0,wx.ALIGN_CENTER_VERTICAL)
641    mainSizer.Add(LSSizer)
642    mainSizer.Add((5,5),0)
643   
644    SeqSizer = wx.BoxSizer(wx.HORIZONTAL)
645    SeqSizer.Add(wx.StaticText(self.dataDisplay,label=' Sequential Refinement Powder Data: '),0,wx.ALIGN_CENTER_VERTICAL)
646    selSeqData = wx.Button(self.dataDisplay,-1,label=' Select data')
647    selSeqData.Bind(wx.EVT_BUTTON,OnSelectData)
648    SeqSizer.Add(selSeqData,0,wx.ALIGN_CENTER_VERTICAL)
649    SeqSizer.Add((5,0),0)
650    reverseSel = wx.CheckBox(self.dataDisplay,-1,label=' Reverse order?')
651    reverseSel.Bind(wx.EVT_CHECKBOX,OnReverse)
652    if 'Seq Data' not in data:
653        reverseSel.Enable(False)
654    if 'Reverse Seq' in data:
655        reverseSel.SetValue(data['Reverse Seq'])
656    SeqSizer.Add(reverseSel,0,wx.ALIGN_CENTER_VERTICAL)
657   
658   
659    mainSizer.Add(SeqSizer)
660    mainSizer.Add((5,5),0)
661       
662    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Density Map Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
663
664    mainSizer.Add((5,5),0)
665    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Distance/angle Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
666       
667    mainSizer.Layout()   
668    self.dataDisplay.SetSizer(mainSizer)
669    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
670    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
671     
672def UpdateComments(self,data):                   
673    self.dataFrame.SetLabel('Comments')
674    self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
675        style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
676    for line in data:
677        if line[-1] == '\n':
678            self.dataDisplay.AppendText(line)
679        else:
680            self.dataDisplay.AppendText(line+'\n')
681           
682def UpdateSeqResults(self,data):
683    if not data:
684        print 'No sequential refinement results'
685        return
686    histNames = data['histNames']
687   
688    def ColSelect(event):
689        cols = self.dataDisplay.GetSelectedCols()
690        plotData = []
691        plotNames = []
692        for col in cols:
693            plotData.append(self.SeqTable.GetColValues(col))
694            plotNames.append(self.SeqTable.GetColLabelValue(col))
695        plotData = np.array(plotData)
696        G2plt.PlotSeq(self,plotData,plotNames)
697       
698    if self.dataDisplay:
699        self.dataDisplay.Destroy()
700    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
701    self.dataFrame.SetLabel('Sequental refinement results')
702    self.dataFrame.CreateStatusBar()
703    colLabels = data['varyList']
704    Types = len(data['varyList'])*[wg.GRID_VALUE_FLOAT,]
705    seqList = [list(data[name]['variables']) for name in histNames]
706    self.SeqTable = Table(seqList,colLabels=colLabels,rowLabels=histNames,types=Types)
707    self.dataDisplay = GSGrid(parent=self.dataFrame)
708    self.dataDisplay.SetTable(self.SeqTable, True)
709    self.dataDisplay.EnableEditing(False)
710    self.dataDisplay.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, ColSelect)
711    self.dataDisplay.SetRowLabelSize(8*len(histNames[0]))       #pretty arbitrary 8
712    self.dataDisplay.SetMargins(0,0)
713    self.dataDisplay.AutoSizeColumns(True)
714    self.dataFrame.setSizePosLeft([700,350])
715               
716def UpdateConstraints(self,data):
717    Histograms,Phases = self.GetUsedHistogramsAndPhasesfromTree()
718    Natoms,phaseVary,phaseDict,pawleyLookup,FFtable = G2str.GetPhaseData(Phases,Print=False)       
719    hapVary,hapDict,controlDict = G2str.GetHistogramPhaseData(Phases,Histograms,Print=False)
720    histVary,histDict,controlDict = G2str.GetHistogramData(Histograms,Print=False)
721   
722    def FindEquivVarb(name,nameList):
723        outList = []
724        for item in nameList:
725            key = item.split(':')[2]
726            if key in name and item != name:
727                outList.append(item)
728        return outList
729       
730    def SelectVarbs(FrstVarb,varList,legend):
731        #future -  add 'all:all:name', '0:all:name', etc. to the varList
732        dlg = wx.MultiChoiceDialog(self,'Select more variables:'+legend,FrstVarb+' and:',varList)
733        varbs = [FrstVarb,]
734        if dlg.ShowModal() == wx.ID_OK:
735            sel = dlg.GetSelections()
736            for x in sel:
737                varbs.append(varList[x])
738        dlg.Destroy()
739        if len(varbs) > 1:
740            return map(list,zip(varbs,[1.0 for i in range(len(varbs))]))
741        else:
742            return [[FrstVarb,0.0],]
743   
744    def OnAddConstraint(event):
745        constr = []
746        plegend = '\n In p::name'
747        hlegend = '\n In :h:name'
748        phlegend = '\n In p:h:name'
749        for phase in Phases:
750            plegend += '\n p:: = '+str(Phases[phase]['pId'])+':: for '+phase
751            for histogram in Phases[phase]['Histograms']:
752                phlegend += '\n p:h: = '+str(Phases[phase]['pId'])+':'+str(Histograms[histogram]['hId'])+': for '+phase+' in '+histogram
753        for histogram in Histograms:
754            hlegend += '\n :h: = :'+str(Histograms[histogram]['hId'])+': for '+histogram
755        page = self.dataDisplay.GetSelection()
756        if 'Histogram ' in self.dataDisplay.GetPageText(page):
757            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+hlegend,'Histogram variables:',histVary)
758            if dlg.ShowModal() == wx.ID_OK:
759                sel = dlg.GetSelection()
760                FrstVarb = histVary[sel]
761                moreVarb = FindEquivVarb(FrstVarb,histVary)
762                constr = SelectVarbs(FrstVarb,moreVarb,hlegend)
763            dlg.Destroy()
764        elif '/Phase' in self.dataDisplay.GetPageText(page):
765            legend = 'Select 1st variable: \n '
766            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+phlegend,'HAP variables:',hapVary)
767            if dlg.ShowModal() == wx.ID_OK:
768                sel = dlg.GetSelection()
769                FrstVarb = hapVary[sel]
770                moreVarb = FindEquivVarb(FrstVarb,hapVary)
771                constr = SelectVarbs(FrstVarb,moreVarb,phlegend)
772            dlg.Destroy()
773        elif 'Phase' in self.dataDisplay.GetPageText(page):
774            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+plegend,'Phase variables:',phaseVary)
775            if dlg.ShowModal() == wx.ID_OK:
776                sel = dlg.GetSelection()
777                FrstVarb = phaseVary[sel]
778                moreVarb = FindEquivVarb(FrstVarb,phaseVary)
779                constr = SelectVarbs(FrstVarb,moreVarb,plegend)
780            dlg.Destroy()
781        if constr:
782            constr += [0.0,True]
783               
784           
785             
786   
787    def UpdateHAPConstr():
788        HAPConstr.DestroyChildren()
789        dataDisplay = wx.Panel(HAPConstr)
790        mainSizer = wx.BoxSizer(wx.VERTICAL)
791        mainSizer.Add((5,5),0)
792        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Histogram/Phase constraints:'),0,wx.ALIGN_CENTER_VERTICAL)
793        mainSizer.Add((5,5),0)
794       
795
796
797        dataDisplay.SetSizer(mainSizer)
798        Size = mainSizer.Fit(self.dataFrame)
799        Size[1] += 26                           #compensate for status bar
800        dataDisplay.SetSize(Size)
801        self.dataFrame.setSizePosLeft(Size)
802       
803    def UpdateHistConstr():
804        HistConstr.DestroyChildren()
805        dataDisplay = wx.Panel(HistConstr)
806        mainSizer = wx.BoxSizer(wx.VERTICAL)
807        mainSizer.Add((5,5),0)
808        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Histogram constraints:'),0,wx.ALIGN_CENTER_VERTICAL)
809        mainSizer.Add((5,5),0)
810
811
812        dataDisplay.SetSizer(mainSizer)
813        Size = mainSizer.Fit(self.dataFrame)
814        Size[1] += 26                           #compensate for status bar
815        dataDisplay.SetSize(Size)
816        self.dataFrame.setSizePosLeft(Size)
817       
818    def UpdatePhaseConstr():
819        PhaseConstr.DestroyChildren()
820        dataDisplay = wx.Panel(PhaseConstr)
821        mainSizer = wx.BoxSizer(wx.VERTICAL)
822        mainSizer.Add((5,5),0)
823        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Phase constraints:'),0,wx.ALIGN_CENTER_VERTICAL)
824        mainSizer.Add((5,5),0)
825
826
827        dataDisplay.SetSizer(mainSizer)
828        Size = mainSizer.Fit(self.dataFrame)
829        Size[1] += 26                           #compensate for status bar
830        dataDisplay.SetSize(Size)
831        self.dataFrame.setSizePosLeft(Size)
832   
833    def OnPageChanged(event):
834        page = event.GetSelection()
835        text = self.dataDisplay.GetPageText(page)
836        if text == 'Histogram/Phase constraints':
837            self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
838            UpdateHAPConstr()
839        elif text == 'Histogram constraints':
840            UpdateHistConstr()
841            self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
842        elif text == 'Phase constraints':
843            UpdatePhaseConstr()
844            self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
845        event.Skip()
846
847    if self.dataDisplay:
848        self.dataDisplay.Destroy()
849    self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
850    self.dataFrame.SetLabel('Constraints')
851    self.dataFrame.CreateStatusBar()
852    self.dataFrame.Bind(wx.EVT_MENU, OnAddConstraint, id=wxID_CONSTRAINTADD)
853    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
854   
855    PhaseConstr = wx.ScrolledWindow(self.dataDisplay)
856    self.dataDisplay.AddPage(PhaseConstr,'Phase constraints')
857    HAPConstr = wx.ScrolledWindow(self.dataDisplay)
858    self.dataDisplay.AddPage(HAPConstr,'Histogram/Phase constraints')
859    HistConstr = wx.ScrolledWindow(self.dataDisplay)
860    self.dataDisplay.AddPage(HistConstr,'Histogram constraints')
861    UpdatePhaseConstr()
862
863    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
864   
865   
866def UpdateRestraints(self,data):
867
868    def OnAddRestraint(event):
869        page = self.dataDisplay.GetSelection()
870        print self.dataDisplay.GetPageText(page)
871
872    def UpdateAtomRestr():
873        AtomRestr.DestroyChildren()
874        dataDisplay = wx.Panel(AtomRestr)
875        mainSizer = wx.BoxSizer(wx.VERTICAL)
876        mainSizer.Add((5,5),0)
877        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Atom restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
878        mainSizer.Add((5,5),0)
879
880
881        dataDisplay.SetSizer(mainSizer)
882        Size = mainSizer.Fit(self.dataFrame)
883        Size[1] += 26                           #compensate for status bar
884        dataDisplay.SetSize(Size)
885        self.dataFrame.setSizePosLeft(Size)
886       
887    def UpdatePhaseRestr():
888        PhaseRestr.DestroyChildren()
889        dataDisplay = wx.Panel(PhaseRestr)
890        mainSizer = wx.BoxSizer(wx.VERTICAL)
891        mainSizer.Add((5,5),0)
892        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Phase restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
893        mainSizer.Add((5,5),0)
894
895
896        dataDisplay.SetSizer(mainSizer)
897        Size = mainSizer.Fit(self.dataFrame)
898        Size[1] += 26                           #compensate for status bar
899        dataDisplay.SetSize(Size)
900        self.dataFrame.setSizePosLeft(Size)
901   
902    def OnPageChanged(event):
903        page = event.GetSelection()
904        text = self.dataDisplay.GetPageText(page)
905        if text == 'Atom restraints':
906            self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
907            UpdateAtomRestr()
908        elif text == 'Phase restraints':
909            UpdatePhaseRestr()
910            self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
911        event.Skip()
912
913    if self.dataDisplay:
914        self.dataDisplay.Destroy()
915    self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
916    self.dataFrame.SetLabel('restraints')
917    self.dataFrame.CreateStatusBar()
918    self.dataFrame.Bind(wx.EVT_MENU, OnAddRestraint, id=wxID_RESTRAINTADD)
919    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
920   
921    PhaseRestr = wx.ScrolledWindow(self.dataDisplay)
922    self.dataDisplay.AddPage(PhaseRestr,'Phase restraints')
923    AtomRestr = wx.ScrolledWindow(self.dataDisplay)
924    self.dataDisplay.AddPage(AtomRestr,'Atom restraints')
925    UpdatePhaseRestr()
926#    AtomRestrData = data['AtomRestr']
927
928    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)       
929             
930def UpdateHKLControls(self,data):
931   
932    def OnScaleSlider(event):
933        scale = int(scaleSel.GetValue())/1000.
934        scaleSel.SetValue(int(scale*1000.))
935        data['Scale'] = scale*10.
936        G2plt.PlotSngl(self)
937       
938    def OnLayerSlider(event):
939        layer = layerSel.GetValue()
940        data['Layer'] = layer
941        G2plt.PlotSngl(self)
942       
943    def OnSelZone(event):
944        data['Zone'] = zoneSel.GetValue()
945        G2plt.PlotSngl(self,newPlot=True)
946       
947    def OnSelType(event):
948        data['Type'] = typeSel.GetValue()
949        G2plt.PlotSngl(self)
950       
951    def SetStatusLine():
952        Status.SetStatusText("look at me!!!")
953                                     
954    if self.dataDisplay:
955        self.dataDisplay.Destroy()
956    if not self.dataFrame.GetStatusBar():
957        Status = self.dataFrame.CreateStatusBar()
958    SetStatusLine()
959    zones = ['100','010','001']
960    HKLmax = data['HKLmax']
961    HKLmin = data['HKLmin']
962    if data['ifFc']:
963        typeChoices = ['Fosq','Fo','|DFsq|/sig','|DFsq|>sig','|DFsq|>3sig']
964    else:
965        typeChoices = ['Fosq','Fo']
966    self.dataDisplay = wx.Panel(self.dataFrame)
967    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
968    mainSizer = wx.BoxSizer(wx.VERTICAL)
969    mainSizer.Add((5,10),0)
970   
971    scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
972    scaleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Scale'),0,
973        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
974    scaleSel = wx.Slider(parent=self.dataDisplay,maxValue=1000,minValue=100,
975        style=wx.SL_HORIZONTAL,value=int(data['Scale']*100))
976    scaleSizer.Add(scaleSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
977    scaleSel.SetLineSize(100)
978    scaleSel.SetPageSize(900)
979    scaleSel.Bind(wx.EVT_SLIDER, OnScaleSlider)
980    mainSizer.Add(scaleSizer,1,wx.EXPAND|wx.RIGHT)
981   
982    zoneSizer = wx.BoxSizer(wx.HORIZONTAL)
983    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Zone  '),0,
984        wx.ALIGN_CENTER_VERTICAL)
985    zoneSel = wx.ComboBox(parent=self.dataDisplay,value=data['Zone'],choices=['100','010','001'],
986        style=wx.CB_READONLY|wx.CB_DROPDOWN)
987    zoneSel.Bind(wx.EVT_COMBOBOX, OnSelZone)
988    zoneSizer.Add(zoneSel,0,wx.ALIGN_CENTER_VERTICAL)
989    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Plot type  '),0,
990        wx.ALIGN_CENTER_VERTICAL)       
991    typeSel = wx.ComboBox(parent=self.dataDisplay,value=data['Type'],choices=typeChoices,
992        style=wx.CB_READONLY|wx.CB_DROPDOWN)
993    typeSel.Bind(wx.EVT_COMBOBOX, OnSelType)
994    zoneSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
995    zoneSizer.Add((10,0),0)   
996    mainSizer.Add(zoneSizer,1,wx.EXPAND|wx.RIGHT)
997       
998    izone = zones.index(data['Zone'])
999    layerSizer = wx.BoxSizer(wx.HORIZONTAL)
1000    layerSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Layer'),0,
1001        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1002    layerSel = wx.Slider(parent=self.dataDisplay,maxValue=HKLmax[izone],minValue=HKLmin[izone],
1003        style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS,value=0)
1004    layerSel.SetLineSize(1)
1005    layerSel.SetLineSize(5)
1006    layerSel.Bind(wx.EVT_SLIDER, OnLayerSlider)   
1007    layerSizer.Add(layerSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
1008    layerSizer.Add((10,0),0)   
1009    mainSizer.Add(layerSizer,1,wx.EXPAND|wx.RIGHT)
1010
1011       
1012    mainSizer.Layout()   
1013    self.dataDisplay.SetSizer(mainSizer)
1014    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
1015    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
1016
1017def GetPatternTreeDataNames(self,dataTypes):
1018    names = []
1019    item, cookie = self.PatternTree.GetFirstChild(self.root)       
1020    while item:
1021        name = self.PatternTree.GetItemText(item)
1022        if name[:4] in dataTypes:
1023            names.append(name)
1024        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1025    return names
1026                         
1027def GetPatternTreeItemId(self, parentId, itemText):
1028    item, cookie = self.PatternTree.GetFirstChild(parentId)
1029    while item:
1030        if self.PatternTree.GetItemText(item) == itemText:
1031            return item
1032        item, cookie = self.PatternTree.GetNextChild(parentId, cookie)
1033    return 0               
1034
1035def MovePatternTreeToGrid(self,item):
1036   
1037#    print self.PatternTree.GetItemText(item)
1038   
1039    oldPage = 0
1040    if self.dataFrame:
1041        self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1042        if self.dataFrame.GetLabel() == 'Comments':
1043            data = [self.dataDisplay.GetValue()]
1044            self.dataDisplay.Clear() 
1045            Id = GetPatternTreeItemId(self,self.root, 'Comments')
1046            if Id: self.PatternTree.SetItemPyData(Id,data)
1047        if self.dataFrame.GetLabel() == 'Notebook':
1048            data = [self.dataDisplay.GetValue()]
1049            self.dataDisplay.Clear() 
1050            Id = GetPatternTreeItemId(self,self.root, 'Notebook')
1051            if Id: self.PatternTree.SetItemPyData(Id,data)
1052        if 'Phase Data for' in self.dataFrame.GetLabel():
1053            if self.dataDisplay: 
1054                oldPage = self.dataDisplay.GetSelection()
1055        self.dataFrame.Clear()
1056        self.dataFrame.SetLabel('')
1057    else:
1058        self.dataFrame = DataFrame(parent=self.mainPanel)
1059
1060    self.dataFrame.Raise()           
1061    self.PickId = 0
1062    parentID = self.root
1063    self.ExportPattern.Enable(False)
1064    if item != self.root:
1065        parentID = self.PatternTree.GetItemParent(item)
1066    if self.PatternTree.GetItemParent(item) == self.root:
1067        self.PatternId = item
1068        self.PickId = item
1069        if self.PatternTree.GetItemText(item) == 'Notebook':
1070            self.PatternId = 0
1071            self.ExportPattern.Enable(False)
1072            data = self.PatternTree.GetItemPyData(item)
1073            UpdateNotebook(self,data)
1074        elif self.PatternTree.GetItemText(item) == 'Controls':
1075            self.PatternId = 0
1076            self.ExportPattern.Enable(False)
1077            data = self.PatternTree.GetItemPyData(item)
1078            if not data:           #fill in defaults
1079                data = {
1080                    #least squares controls
1081                    'deriv type':'analytic','min dM/M':0.0001,'shift factor':1.0,
1082                    #Fourier controls
1083                    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
1084                    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
1085                    #distance/angle controls
1086                    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
1087                self.PatternTree.SetItemPyData(item,data)                             
1088            self.Refine.Enable(True)
1089            self.SeqRefine.Enable(True)
1090            UpdateControls(self,data)
1091        elif self.PatternTree.GetItemText(item) == 'Sequental results':
1092            data = self.PatternTree.GetItemPyData(item)
1093            UpdateSeqResults(self,data)           
1094        elif self.PatternTree.GetItemText(item) == 'Covariance':
1095            data = self.PatternTree.GetItemPyData(item)
1096            G2plt.PlotCovariance(self)
1097        elif self.PatternTree.GetItemText(item) == 'Constraints':
1098            data = self.PatternTree.GetItemPyData(item)
1099            UpdateConstraints(self,data)
1100        elif self.PatternTree.GetItemText(item) == 'Restraints':
1101            data = self.PatternTree.GetItemPyData(item)
1102            UpdateRestraints(self,data)
1103        elif 'IMG' in self.PatternTree.GetItemText(item):
1104            self.Image = item
1105            G2plt.PlotImage(self,newPlot=True)
1106        elif 'PKS' in self.PatternTree.GetItemText(item):
1107            G2plt.PlotPowderLines(self)
1108        elif 'PWDR' in self.PatternTree.GetItemText(item):
1109            self.ExportPattern.Enable(True)
1110            G2plt.PlotPatterns(self,newPlot=True)
1111        elif 'HKLF' in self.PatternTree.GetItemText(item):
1112            self.Sngl = item
1113            G2plt.PlotSngl(self,newPlot=True)
1114        elif 'PDF' in self.PatternTree.GetItemText(item):
1115            self.PatternId = item
1116            self.ExportPDF.Enable(True)
1117            G2plt.PlotISFG(self,type='S(Q)')
1118           
1119    elif 'I(Q)' in self.PatternTree.GetItemText(item):
1120        self.PickId = item
1121        self.PatternId = self.PatternTree.GetItemParent(item)
1122        G2plt.PlotISFG(self,type='I(Q)',newPlot=True)
1123    elif 'S(Q)' in self.PatternTree.GetItemText(item):
1124        self.PickId = item
1125        self.PatternId = self.PatternTree.GetItemParent(item)
1126        G2plt.PlotISFG(self,type='S(Q)',newPlot=True)
1127    elif 'F(Q)' in self.PatternTree.GetItemText(item):
1128        self.PickId = item
1129        self.PatternId = self.PatternTree.GetItemParent(item)
1130        G2plt.PlotISFG(self,type='F(Q)',newPlot=True)
1131    elif 'G(R)' in self.PatternTree.GetItemText(item):
1132        self.PickId = item
1133        self.PatternId = self.PatternTree.GetItemParent(item)
1134        G2plt.PlotISFG(self,type='G(R)',newPlot=True)           
1135    elif self.PatternTree.GetItemText(parentID) == 'Phases':
1136        self.PickId = item
1137        data = self.PatternTree.GetItemPyData(item)           
1138        G2phG.UpdatePhaseData(self,item,data,oldPage)
1139    elif self.PatternTree.GetItemText(item) == 'Comments':
1140        self.PatternId = self.PatternTree.GetItemParent(item)
1141        self.PickId = item
1142        data = self.PatternTree.GetItemPyData(item)
1143        UpdateComments(self,data)
1144    elif self.PatternTree.GetItemText(item) == 'Image Controls':
1145        self.dataFrame.SetTitle('Image Controls')
1146        self.PickId = item
1147        self.Image = self.PatternTree.GetItemParent(item)
1148        masks = self.PatternTree.GetItemPyData(
1149            GetPatternTreeItemId(self,self.Image, 'Masks'))
1150        data = self.PatternTree.GetItemPyData(item)
1151        G2imG.UpdateImageControls(self,data,masks)
1152        G2plt.PlotImage(self)
1153    elif self.PatternTree.GetItemText(item) == 'Masks':
1154        self.dataFrame.SetTitle('Masks')
1155        self.PickId = item
1156        self.Image = self.PatternTree.GetItemParent(item)
1157        data = self.PatternTree.GetItemPyData(item)
1158        G2imG.UpdateMasks(self,data)
1159        G2plt.PlotImage(self)
1160    elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
1161        self.PickId = item
1162        self.Sngl = self.PatternTree.GetItemParent(item)
1163        data = self.PatternTree.GetItemPyData(item)
1164        UpdateHKLControls(self,data)
1165        G2plt.PlotSngl(self)
1166    elif self.PatternTree.GetItemText(item) == 'PDF Controls':
1167        self.PatternId = self.PatternTree.GetItemParent(item)
1168        self.ExportPDF.Enable(True)
1169        self.PickId = item
1170        data = self.PatternTree.GetItemPyData(item)
1171        G2pdG.UpdatePDFGrid(self,data)
1172        G2plt.PlotISFG(self,type='I(Q)')
1173        G2plt.PlotISFG(self,type='S(Q)')
1174        G2plt.PlotISFG(self,type='F(Q)')
1175        G2plt.PlotISFG(self,type='G(R)')
1176    elif self.PatternTree.GetItemText(item) == 'Peak List':
1177        self.PatternId = self.PatternTree.GetItemParent(item)
1178        self.ExportPeakList.Enable(True)
1179        self.PickId = item
1180        data = self.PatternTree.GetItemPyData(item)
1181        G2pdG.UpdatePeakGrid(self,data)
1182        G2plt.PlotPatterns(self)
1183    elif self.PatternTree.GetItemText(item) == 'Background':
1184        self.PatternId = self.PatternTree.GetItemParent(item)
1185        self.PickId = item
1186        data = self.PatternTree.GetItemPyData(item)
1187        G2pdG.UpdateBackgroundGrid(self,data)
1188        G2plt.PlotPatterns(self)
1189    elif self.PatternTree.GetItemText(item) == 'Limits':
1190        self.PatternId = self.PatternTree.GetItemParent(item)
1191        self.PickId = item
1192        data = self.PatternTree.GetItemPyData(item)
1193        G2pdG.UpdateLimitsGrid(self,data)
1194        G2plt.PlotPatterns(self)
1195    elif self.PatternTree.GetItemText(item) == 'Instrument Parameters':
1196        self.PatternId = self.PatternTree.GetItemParent(item)
1197        self.PickId = item
1198        data = self.PatternTree.GetItemPyData(item)
1199        G2pdG.UpdateInstrumentGrid(self,data)
1200        G2plt.PlotPeakWidths(self)
1201    elif self.PatternTree.GetItemText(item) == 'Sample Parameters':
1202        self.PatternId = self.PatternTree.GetItemParent(item)
1203        self.PickId = item
1204        data = self.PatternTree.GetItemPyData(item)
1205
1206        if 'Temperature' not in data:           #temp fix for old gpx files
1207            data = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],'DisplaceX':[0.0,False],
1208                'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,
1209                'Force':0.0,'Gonio. radius':200.0}
1210            self.PatternTree.SetItemPyData(item,data)
1211   
1212        G2pdG.UpdateSampleGrid(self,data)
1213        G2plt.PlotPatterns(self)
1214    elif self.PatternTree.GetItemText(item) == 'Index Peak List':
1215        self.PatternId = self.PatternTree.GetItemParent(item)
1216        self.ExportPeakList.Enable(True)
1217        self.PickId = item
1218        data = self.PatternTree.GetItemPyData(item)
1219        G2pdG.UpdateIndexPeaksGrid(self,data)
1220        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1221            G2plt.PlotPowderLines(self)
1222        else:
1223            G2plt.PlotPatterns(self)
1224    elif self.PatternTree.GetItemText(item) == 'Unit Cells List':
1225        self.PatternId = self.PatternTree.GetItemParent(item)
1226        self.PickId = item
1227        data = self.PatternTree.GetItemPyData(item)
1228        if not data:
1229            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
1230            data.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0])      #Bravais lattice flags
1231            data.append([])                                 #empty cell list
1232            data.append([])                                 #empty dmin
1233            self.PatternTree.SetItemPyData(item,data)                             
1234        G2pdG.UpdateUnitCellsGrid(self,data)
1235        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1236            G2plt.PlotPowderLines(self)
1237        else:
1238            G2plt.PlotPatterns(self)
1239    elif self.PatternTree.GetItemText(item) == 'Reflection Lists':
1240        self.PatternId = self.PatternTree.GetItemParent(item)
1241        self.PickId = item
1242        data = self.PatternTree.GetItemPyData(item)
1243        self.RefList = ''
1244        if len(data):
1245            self.RefList = data.keys()[0]
1246        G2pdG.UpdateReflectionGrid(self,data)
1247        G2plt.PlotPatterns(self)
1248     
Note: See TracBrowser for help on using the repository browser.