source: trunk/GSASIIgrid.py @ 395

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

Add goniometer omega, chi & phi to sample data
put SH texture in General
fix phase delete to remove it from reflection lists as well
continue development of constraints/restraints GUI
fixes to texture computations, GUI & least squares refinement

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