source: trunk/GSASIIgrid.py @ 400

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

new default for Vcov contour plot - RdYlGn?
faster cleanup on changing/reloading projects
cleanup data delete
implement sample parameter copy
improve Vcov plotting routine
implement plot of vcov from seq refinements

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