source: trunk/GSASIIgrid.py @ 404

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

put error bars on seq refinement plots
add cubic elastic strain coeff
make sure results are saved from seq refinements

  • Property svn:keywords set to Date Author Revision URL Id
File size: 54.8 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-10-28 18:59:03 +0000 (Fri, 28 Oct 2011) $
4# $Author: vondreele $
5# $Revision: 404 $
6# $URL: trunk/GSASIIgrid.py $
7# $Id: GSASIIgrid.py 404 2011-10-28 18:59:03Z 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 GetSigData(parm):
703        sigData = []
704        for name in histNames:
705            sigList = data[name]['sig']
706            sigData.append(sigList[parm])
707        return sigData
708   
709    def Select(event):
710        cols = self.dataDisplay.GetSelectedCols()
711        rows = self.dataDisplay.GetSelectedRows()
712        if cols:
713            plotData = []
714            plotSig = []
715            plotNames = []
716            for col in cols:
717                plotData.append(self.SeqTable.GetColValues(col))
718                plotSig.append(GetSigData(col))
719                plotNames.append(self.SeqTable.GetColLabelValue(col))
720            plotData = np.array(plotData)
721            G2plt.PlotSeq(self,plotData,plotSig,plotNames)
722        elif rows:
723            name = histNames[rows[0]]
724            G2plt.PlotCovariance(self,Data=data[name])
725               
726    if self.dataDisplay:
727        self.dataDisplay.Destroy()
728    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
729    self.dataFrame.SetLabel('Sequental refinement results')
730    self.dataFrame.CreateStatusBar()
731    colLabels = data['varyList']
732    Types = len(data['varyList'])*[wg.GRID_VALUE_FLOAT,]
733    seqList = [list(data[name]['variables']) for name in histNames]
734    self.SeqTable = Table(seqList,colLabels=colLabels,rowLabels=histNames,types=Types)
735    self.dataDisplay = GSGrid(parent=self.dataFrame)
736    self.dataDisplay.SetTable(self.SeqTable, True)
737    self.dataDisplay.EnableEditing(False)
738    self.dataDisplay.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, Select)
739    self.dataDisplay.SetRowLabelSize(8*len(histNames[0]))       #pretty arbitrary 8
740    self.dataDisplay.SetMargins(0,0)
741    self.dataDisplay.AutoSizeColumns(True)
742    self.dataFrame.setSizePosLeft([700,350])
743               
744def UpdateConstraints(self,data):
745    Histograms,Phases = self.GetUsedHistogramsAndPhasesfromTree()
746    Natoms,phaseVary,phaseDict,pawleyLookup,FFtable = G2str.GetPhaseData(Phases,Print=False)       
747    hapVary,hapDict,controlDict = G2str.GetHistogramPhaseData(Phases,Histograms,Print=False)
748    histVary,histDict,controlDict = G2str.GetHistogramData(Histograms,Print=False)
749   
750    def FindEquivVarb(name,nameList):
751        outList = []
752        for item in nameList:
753            key = item.split(':')[2]
754            if key in name and item != name:
755                outList.append(item)
756        return outList
757       
758    def SelectVarbs(FrstVarb,varList,legend):
759        #future -  add 'all:all:name', '0:all:name', etc. to the varList
760        dlg = wx.MultiChoiceDialog(self,'Select more variables:'+legend,FrstVarb+' and:',varList)
761        varbs = [FrstVarb,]
762        if dlg.ShowModal() == wx.ID_OK:
763            sel = dlg.GetSelections()
764            for x in sel:
765                varbs.append(varList[x])
766        dlg.Destroy()
767        if len(varbs) > 1:
768            return map(list,zip(varbs,[1.0 for i in range(len(varbs))]))
769        else:
770            return [[FrstVarb,0.0],]
771   
772    def OnAddConstraint(event):
773        constr = []
774        plegend = '\n In p::name'
775        hlegend = '\n In :h:name'
776        phlegend = '\n In p:h:name'
777        for phase in Phases:
778            plegend += '\n p:: = '+str(Phases[phase]['pId'])+':: for '+phase
779            for histogram in Phases[phase]['Histograms']:
780                phlegend += '\n p:h: = '+str(Phases[phase]['pId'])+':'+str(Histograms[histogram]['hId'])+': for '+phase+' in '+histogram
781        for histogram in Histograms:
782            hlegend += '\n :h: = :'+str(Histograms[histogram]['hId'])+': for '+histogram
783        page = self.dataDisplay.GetSelection()
784        if 'Histogram ' in self.dataDisplay.GetPageText(page):
785            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+hlegend,'Histogram variables:',histVary)
786            if dlg.ShowModal() == wx.ID_OK:
787                sel = dlg.GetSelection()
788                FrstVarb = histVary[sel]
789                moreVarb = FindEquivVarb(FrstVarb,histVary)
790                constr = SelectVarbs(FrstVarb,moreVarb,hlegend)
791            dlg.Destroy()
792        elif '/Phase' in self.dataDisplay.GetPageText(page):
793            legend = 'Select 1st variable: \n '
794            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+phlegend,'HAP variables:',hapVary)
795            if dlg.ShowModal() == wx.ID_OK:
796                sel = dlg.GetSelection()
797                FrstVarb = hapVary[sel]
798                moreVarb = FindEquivVarb(FrstVarb,hapVary)
799                constr = SelectVarbs(FrstVarb,moreVarb,phlegend)
800            dlg.Destroy()
801        elif 'Phase' in self.dataDisplay.GetPageText(page):
802            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+plegend,'Phase variables:',phaseVary)
803            if dlg.ShowModal() == wx.ID_OK:
804                sel = dlg.GetSelection()
805                FrstVarb = phaseVary[sel]
806                moreVarb = FindEquivVarb(FrstVarb,phaseVary)
807                constr = SelectVarbs(FrstVarb,moreVarb,plegend)
808            dlg.Destroy()
809        if constr:
810            constr += [0.0,True]
811               
812           
813             
814   
815    def UpdateHAPConstr():
816        HAPConstr.DestroyChildren()
817        dataDisplay = wx.Panel(HAPConstr)
818        mainSizer = wx.BoxSizer(wx.VERTICAL)
819        mainSizer.Add((5,5),0)
820        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Histogram/Phase constraints:'),0,wx.ALIGN_CENTER_VERTICAL)
821        mainSizer.Add((5,5),0)
822       
823
824
825        dataDisplay.SetSizer(mainSizer)
826        Size = mainSizer.Fit(self.dataFrame)
827        Size[1] += 26                           #compensate for status bar
828        dataDisplay.SetSize(Size)
829        self.dataFrame.setSizePosLeft(Size)
830       
831    def UpdateHistConstr():
832        HistConstr.DestroyChildren()
833        dataDisplay = wx.Panel(HistConstr)
834        mainSizer = wx.BoxSizer(wx.VERTICAL)
835        mainSizer.Add((5,5),0)
836        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Histogram constraints:'),0,wx.ALIGN_CENTER_VERTICAL)
837        mainSizer.Add((5,5),0)
838
839
840        dataDisplay.SetSizer(mainSizer)
841        Size = mainSizer.Fit(self.dataFrame)
842        Size[1] += 26                           #compensate for status bar
843        dataDisplay.SetSize(Size)
844        self.dataFrame.setSizePosLeft(Size)
845       
846    def UpdatePhaseConstr():
847        PhaseConstr.DestroyChildren()
848        dataDisplay = wx.Panel(PhaseConstr)
849        mainSizer = wx.BoxSizer(wx.VERTICAL)
850        mainSizer.Add((5,5),0)
851        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Phase constraints:'),0,wx.ALIGN_CENTER_VERTICAL)
852        mainSizer.Add((5,5),0)
853
854
855        dataDisplay.SetSizer(mainSizer)
856        Size = mainSizer.Fit(self.dataFrame)
857        Size[1] += 26                           #compensate for status bar
858        dataDisplay.SetSize(Size)
859        self.dataFrame.setSizePosLeft(Size)
860   
861    def OnPageChanged(event):
862        page = event.GetSelection()
863        text = self.dataDisplay.GetPageText(page)
864        if text == 'Histogram/Phase constraints':
865            self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
866            UpdateHAPConstr()
867        elif text == 'Histogram constraints':
868            UpdateHistConstr()
869            self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
870        elif text == 'Phase constraints':
871            UpdatePhaseConstr()
872            self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
873        event.Skip()
874
875    if self.dataDisplay:
876        self.dataDisplay.Destroy()
877    self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
878    self.dataFrame.SetLabel('Constraints')
879    self.dataFrame.CreateStatusBar()
880    self.dataFrame.Bind(wx.EVT_MENU, OnAddConstraint, id=wxID_CONSTRAINTADD)
881    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
882   
883    PhaseConstr = wx.ScrolledWindow(self.dataDisplay)
884    self.dataDisplay.AddPage(PhaseConstr,'Phase constraints')
885    HAPConstr = wx.ScrolledWindow(self.dataDisplay)
886    self.dataDisplay.AddPage(HAPConstr,'Histogram/Phase constraints')
887    HistConstr = wx.ScrolledWindow(self.dataDisplay)
888    self.dataDisplay.AddPage(HistConstr,'Histogram constraints')
889    UpdatePhaseConstr()
890
891    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
892   
893   
894def UpdateRestraints(self,data):
895
896    def OnAddRestraint(event):
897        page = self.dataDisplay.GetSelection()
898        print self.dataDisplay.GetPageText(page)
899
900    def UpdateAtomRestr():
901        AtomRestr.DestroyChildren()
902        dataDisplay = wx.Panel(AtomRestr)
903        mainSizer = wx.BoxSizer(wx.VERTICAL)
904        mainSizer.Add((5,5),0)
905        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Atom restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
906        mainSizer.Add((5,5),0)
907
908
909        dataDisplay.SetSizer(mainSizer)
910        Size = mainSizer.Fit(self.dataFrame)
911        Size[1] += 26                           #compensate for status bar
912        dataDisplay.SetSize(Size)
913        self.dataFrame.setSizePosLeft(Size)
914       
915    def UpdatePhaseRestr():
916        PhaseRestr.DestroyChildren()
917        dataDisplay = wx.Panel(PhaseRestr)
918        mainSizer = wx.BoxSizer(wx.VERTICAL)
919        mainSizer.Add((5,5),0)
920        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Phase restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
921        mainSizer.Add((5,5),0)
922
923
924        dataDisplay.SetSizer(mainSizer)
925        Size = mainSizer.Fit(self.dataFrame)
926        Size[1] += 26                           #compensate for status bar
927        dataDisplay.SetSize(Size)
928        self.dataFrame.setSizePosLeft(Size)
929   
930    def OnPageChanged(event):
931        page = event.GetSelection()
932        text = self.dataDisplay.GetPageText(page)
933        if text == 'Atom restraints':
934            self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
935            UpdateAtomRestr()
936        elif text == 'Phase restraints':
937            UpdatePhaseRestr()
938            self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
939        event.Skip()
940
941    if self.dataDisplay:
942        self.dataDisplay.Destroy()
943    self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
944    self.dataFrame.SetLabel('restraints')
945    self.dataFrame.CreateStatusBar()
946    self.dataFrame.Bind(wx.EVT_MENU, OnAddRestraint, id=wxID_RESTRAINTADD)
947    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
948   
949    PhaseRestr = wx.ScrolledWindow(self.dataDisplay)
950    self.dataDisplay.AddPage(PhaseRestr,'Phase restraints')
951    AtomRestr = wx.ScrolledWindow(self.dataDisplay)
952    self.dataDisplay.AddPage(AtomRestr,'Atom restraints')
953    UpdatePhaseRestr()
954#    AtomRestrData = data['AtomRestr']
955
956    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)       
957             
958def UpdateHKLControls(self,data):
959   
960    def OnScaleSlider(event):
961        scale = int(scaleSel.GetValue())/1000.
962        scaleSel.SetValue(int(scale*1000.))
963        data['Scale'] = scale*10.
964        G2plt.PlotSngl(self)
965       
966    def OnLayerSlider(event):
967        layer = layerSel.GetValue()
968        data['Layer'] = layer
969        G2plt.PlotSngl(self)
970       
971    def OnSelZone(event):
972        data['Zone'] = zoneSel.GetValue()
973        G2plt.PlotSngl(self,newPlot=True)
974       
975    def OnSelType(event):
976        data['Type'] = typeSel.GetValue()
977        G2plt.PlotSngl(self)
978       
979    def SetStatusLine():
980        Status.SetStatusText("look at me!!!")
981                                     
982    if self.dataDisplay:
983        self.dataDisplay.Destroy()
984    if not self.dataFrame.GetStatusBar():
985        Status = self.dataFrame.CreateStatusBar()
986    SetStatusLine()
987    zones = ['100','010','001']
988    HKLmax = data['HKLmax']
989    HKLmin = data['HKLmin']
990    if data['ifFc']:
991        typeChoices = ['Fosq','Fo','|DFsq|/sig','|DFsq|>sig','|DFsq|>3sig']
992    else:
993        typeChoices = ['Fosq','Fo']
994    self.dataDisplay = wx.Panel(self.dataFrame)
995    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
996    mainSizer = wx.BoxSizer(wx.VERTICAL)
997    mainSizer.Add((5,10),0)
998   
999    scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
1000    scaleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Scale'),0,
1001        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1002    scaleSel = wx.Slider(parent=self.dataDisplay,maxValue=1000,minValue=100,
1003        style=wx.SL_HORIZONTAL,value=int(data['Scale']*100))
1004    scaleSizer.Add(scaleSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
1005    scaleSel.SetLineSize(100)
1006    scaleSel.SetPageSize(900)
1007    scaleSel.Bind(wx.EVT_SLIDER, OnScaleSlider)
1008    mainSizer.Add(scaleSizer,1,wx.EXPAND|wx.RIGHT)
1009   
1010    zoneSizer = wx.BoxSizer(wx.HORIZONTAL)
1011    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Zone  '),0,
1012        wx.ALIGN_CENTER_VERTICAL)
1013    zoneSel = wx.ComboBox(parent=self.dataDisplay,value=data['Zone'],choices=['100','010','001'],
1014        style=wx.CB_READONLY|wx.CB_DROPDOWN)
1015    zoneSel.Bind(wx.EVT_COMBOBOX, OnSelZone)
1016    zoneSizer.Add(zoneSel,0,wx.ALIGN_CENTER_VERTICAL)
1017    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Plot type  '),0,
1018        wx.ALIGN_CENTER_VERTICAL)       
1019    typeSel = wx.ComboBox(parent=self.dataDisplay,value=data['Type'],choices=typeChoices,
1020        style=wx.CB_READONLY|wx.CB_DROPDOWN)
1021    typeSel.Bind(wx.EVT_COMBOBOX, OnSelType)
1022    zoneSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
1023    zoneSizer.Add((10,0),0)   
1024    mainSizer.Add(zoneSizer,1,wx.EXPAND|wx.RIGHT)
1025       
1026    izone = zones.index(data['Zone'])
1027    layerSizer = wx.BoxSizer(wx.HORIZONTAL)
1028    layerSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Layer'),0,
1029        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1030    layerSel = wx.Slider(parent=self.dataDisplay,maxValue=HKLmax[izone],minValue=HKLmin[izone],
1031        style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS,value=0)
1032    layerSel.SetLineSize(1)
1033    layerSel.SetLineSize(5)
1034    layerSel.Bind(wx.EVT_SLIDER, OnLayerSlider)   
1035    layerSizer.Add(layerSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
1036    layerSizer.Add((10,0),0)   
1037    mainSizer.Add(layerSizer,1,wx.EXPAND|wx.RIGHT)
1038
1039       
1040    mainSizer.Layout()   
1041    self.dataDisplay.SetSizer(mainSizer)
1042    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
1043    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
1044
1045def GetPatternTreeDataNames(self,dataTypes):
1046    names = []
1047    item, cookie = self.PatternTree.GetFirstChild(self.root)       
1048    while item:
1049        name = self.PatternTree.GetItemText(item)
1050        if name[:4] in dataTypes:
1051            names.append(name)
1052        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1053    return names
1054                         
1055def GetPatternTreeItemId(self, parentId, itemText):
1056    item, cookie = self.PatternTree.GetFirstChild(parentId)
1057    while item:
1058        if self.PatternTree.GetItemText(item) == itemText:
1059            return item
1060        item, cookie = self.PatternTree.GetNextChild(parentId, cookie)
1061    return 0               
1062
1063def MovePatternTreeToGrid(self,item):
1064   
1065#    print self.PatternTree.GetItemText(item)
1066   
1067    oldPage = 0
1068    if self.dataFrame:
1069        self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1070        if self.dataFrame.GetLabel() == 'Comments':
1071            data = [self.dataDisplay.GetValue()]
1072            self.dataDisplay.Clear() 
1073            Id = GetPatternTreeItemId(self,self.root, 'Comments')
1074            if Id: self.PatternTree.SetItemPyData(Id,data)
1075        if self.dataFrame.GetLabel() == 'Notebook':
1076            data = [self.dataDisplay.GetValue()]
1077            self.dataDisplay.Clear() 
1078            Id = GetPatternTreeItemId(self,self.root, 'Notebook')
1079            if Id: self.PatternTree.SetItemPyData(Id,data)
1080        if 'Phase Data for' in self.dataFrame.GetLabel():
1081            if self.dataDisplay: 
1082                oldPage = self.dataDisplay.GetSelection()
1083        self.dataFrame.Clear()
1084        self.dataFrame.SetLabel('')
1085    else:
1086        self.dataFrame = DataFrame(parent=self.mainPanel)
1087
1088    self.dataFrame.Raise()           
1089    self.PickId = 0
1090    parentID = self.root
1091    self.ExportPattern.Enable(False)
1092    if item != self.root:
1093        parentID = self.PatternTree.GetItemParent(item)
1094    if self.PatternTree.GetItemParent(item) == self.root:
1095        self.PatternId = item
1096        self.PickId = item
1097        if self.PatternTree.GetItemText(item) == 'Notebook':
1098            self.PatternId = 0
1099            self.ExportPattern.Enable(False)
1100            data = self.PatternTree.GetItemPyData(item)
1101            UpdateNotebook(self,data)
1102        elif self.PatternTree.GetItemText(item) == 'Controls':
1103            self.PatternId = 0
1104            self.ExportPattern.Enable(False)
1105            data = self.PatternTree.GetItemPyData(item)
1106            if not data:           #fill in defaults
1107                data = {
1108                    #least squares controls
1109                    'deriv type':'analytic','min dM/M':0.0001,'shift factor':1.0,
1110                    #Fourier controls
1111                    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
1112                    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
1113                    #distance/angle controls
1114                    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
1115                self.PatternTree.SetItemPyData(item,data)                             
1116            self.Refine.Enable(True)
1117            self.SeqRefine.Enable(True)
1118            UpdateControls(self,data)
1119        elif self.PatternTree.GetItemText(item) == 'Sequental results':
1120            data = self.PatternTree.GetItemPyData(item)
1121            UpdateSeqResults(self,data)           
1122        elif self.PatternTree.GetItemText(item) == 'Covariance':
1123            data = self.PatternTree.GetItemPyData(item)
1124            G2plt.PlotCovariance(self)
1125        elif self.PatternTree.GetItemText(item) == 'Constraints':
1126            data = self.PatternTree.GetItemPyData(item)
1127            UpdateConstraints(self,data)
1128        elif self.PatternTree.GetItemText(item) == 'Restraints':
1129            data = self.PatternTree.GetItemPyData(item)
1130            UpdateRestraints(self,data)
1131        elif 'IMG' in self.PatternTree.GetItemText(item):
1132            self.Image = item
1133            G2plt.PlotImage(self,newPlot=True)
1134        elif 'PKS' in self.PatternTree.GetItemText(item):
1135            G2plt.PlotPowderLines(self)
1136        elif 'PWDR' in self.PatternTree.GetItemText(item):
1137            self.ExportPattern.Enable(True)
1138            G2plt.PlotPatterns(self,newPlot=True)
1139        elif 'HKLF' in self.PatternTree.GetItemText(item):
1140            self.Sngl = item
1141            G2plt.PlotSngl(self,newPlot=True)
1142        elif 'PDF' in self.PatternTree.GetItemText(item):
1143            self.PatternId = item
1144            self.ExportPDF.Enable(True)
1145            G2plt.PlotISFG(self,type='S(Q)')
1146           
1147    elif 'I(Q)' in self.PatternTree.GetItemText(item):
1148        self.PickId = item
1149        self.PatternId = self.PatternTree.GetItemParent(item)
1150        G2plt.PlotISFG(self,type='I(Q)',newPlot=True)
1151    elif 'S(Q)' in self.PatternTree.GetItemText(item):
1152        self.PickId = item
1153        self.PatternId = self.PatternTree.GetItemParent(item)
1154        G2plt.PlotISFG(self,type='S(Q)',newPlot=True)
1155    elif 'F(Q)' in self.PatternTree.GetItemText(item):
1156        self.PickId = item
1157        self.PatternId = self.PatternTree.GetItemParent(item)
1158        G2plt.PlotISFG(self,type='F(Q)',newPlot=True)
1159    elif 'G(R)' in self.PatternTree.GetItemText(item):
1160        self.PickId = item
1161        self.PatternId = self.PatternTree.GetItemParent(item)
1162        G2plt.PlotISFG(self,type='G(R)',newPlot=True)           
1163    elif self.PatternTree.GetItemText(parentID) == 'Phases':
1164        self.PickId = item
1165        data = self.PatternTree.GetItemPyData(item)           
1166        G2phG.UpdatePhaseData(self,item,data,oldPage)
1167    elif self.PatternTree.GetItemText(item) == 'Comments':
1168        self.PatternId = self.PatternTree.GetItemParent(item)
1169        self.PickId = item
1170        data = self.PatternTree.GetItemPyData(item)
1171        UpdateComments(self,data)
1172    elif self.PatternTree.GetItemText(item) == 'Image Controls':
1173        self.dataFrame.SetTitle('Image Controls')
1174        self.PickId = item
1175        self.Image = self.PatternTree.GetItemParent(item)
1176        masks = self.PatternTree.GetItemPyData(
1177            GetPatternTreeItemId(self,self.Image, 'Masks'))
1178        data = self.PatternTree.GetItemPyData(item)
1179        G2imG.UpdateImageControls(self,data,masks)
1180        G2plt.PlotImage(self)
1181    elif self.PatternTree.GetItemText(item) == 'Masks':
1182        self.dataFrame.SetTitle('Masks')
1183        self.PickId = item
1184        self.Image = self.PatternTree.GetItemParent(item)
1185        data = self.PatternTree.GetItemPyData(item)
1186        G2imG.UpdateMasks(self,data)
1187        G2plt.PlotImage(self)
1188    elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
1189        self.PickId = item
1190        self.Sngl = self.PatternTree.GetItemParent(item)
1191        data = self.PatternTree.GetItemPyData(item)
1192        UpdateHKLControls(self,data)
1193        G2plt.PlotSngl(self)
1194    elif self.PatternTree.GetItemText(item) == 'PDF Controls':
1195        self.PatternId = self.PatternTree.GetItemParent(item)
1196        self.ExportPDF.Enable(True)
1197        self.PickId = item
1198        data = self.PatternTree.GetItemPyData(item)
1199        G2pdG.UpdatePDFGrid(self,data)
1200        G2plt.PlotISFG(self,type='I(Q)')
1201        G2plt.PlotISFG(self,type='S(Q)')
1202        G2plt.PlotISFG(self,type='F(Q)')
1203        G2plt.PlotISFG(self,type='G(R)')
1204    elif self.PatternTree.GetItemText(item) == 'Peak List':
1205        self.PatternId = self.PatternTree.GetItemParent(item)
1206        self.ExportPeakList.Enable(True)
1207        self.PickId = item
1208        data = self.PatternTree.GetItemPyData(item)
1209        G2pdG.UpdatePeakGrid(self,data)
1210        G2plt.PlotPatterns(self)
1211    elif self.PatternTree.GetItemText(item) == 'Background':
1212        self.PatternId = self.PatternTree.GetItemParent(item)
1213        self.PickId = item
1214        data = self.PatternTree.GetItemPyData(item)
1215        G2pdG.UpdateBackgroundGrid(self,data)
1216        G2plt.PlotPatterns(self)
1217    elif self.PatternTree.GetItemText(item) == 'Limits':
1218        self.PatternId = self.PatternTree.GetItemParent(item)
1219        self.PickId = item
1220        data = self.PatternTree.GetItemPyData(item)
1221        G2pdG.UpdateLimitsGrid(self,data)
1222        G2plt.PlotPatterns(self)
1223    elif self.PatternTree.GetItemText(item) == 'Instrument Parameters':
1224        self.PatternId = self.PatternTree.GetItemParent(item)
1225        self.PickId = item
1226        data = self.PatternTree.GetItemPyData(item)
1227        G2pdG.UpdateInstrumentGrid(self,data)
1228        G2plt.PlotPeakWidths(self)
1229    elif self.PatternTree.GetItemText(item) == 'Sample Parameters':
1230        self.PatternId = self.PatternTree.GetItemParent(item)
1231        self.PickId = item
1232        data = self.PatternTree.GetItemPyData(item)
1233
1234        if 'Temperature' not in data:           #temp fix for old gpx files
1235            data = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],'DisplaceX':[0.0,False],
1236                'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,
1237                'Force':0.0,'Gonio. radius':200.0}
1238            self.PatternTree.SetItemPyData(item,data)
1239   
1240        G2pdG.UpdateSampleGrid(self,data)
1241        G2plt.PlotPatterns(self)
1242    elif self.PatternTree.GetItemText(item) == 'Index Peak List':
1243        self.PatternId = self.PatternTree.GetItemParent(item)
1244        self.ExportPeakList.Enable(True)
1245        self.PickId = item
1246        data = self.PatternTree.GetItemPyData(item)
1247        G2pdG.UpdateIndexPeaksGrid(self,data)
1248        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1249            G2plt.PlotPowderLines(self)
1250        else:
1251            G2plt.PlotPatterns(self)
1252    elif self.PatternTree.GetItemText(item) == 'Unit Cells List':
1253        self.PatternId = self.PatternTree.GetItemParent(item)
1254        self.PickId = item
1255        data = self.PatternTree.GetItemPyData(item)
1256        if not data:
1257            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
1258            data.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0])      #Bravais lattice flags
1259            data.append([])                                 #empty cell list
1260            data.append([])                                 #empty dmin
1261            self.PatternTree.SetItemPyData(item,data)                             
1262        G2pdG.UpdateUnitCellsGrid(self,data)
1263        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1264            G2plt.PlotPowderLines(self)
1265        else:
1266            G2plt.PlotPatterns(self)
1267    elif self.PatternTree.GetItemText(item) == 'Reflection Lists':
1268        self.PatternId = self.PatternTree.GetItemParent(item)
1269        self.PickId = item
1270        data = self.PatternTree.GetItemPyData(item)
1271        self.RefList = ''
1272        if len(data):
1273            self.RefList = data.keys()[0]
1274        G2pdG.UpdateReflectionGrid(self,data)
1275        G2plt.PlotPatterns(self)
1276     
Note: See TracBrowser for help on using the repository browser.