source: trunk/GSASIIgrid.py @ 397

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

collect default settings for Sample in one routine
add recalibrate routine for images
azimuths from image integration are now the center angle of each azimuth bin
put in 1/2 pixel offset in image calibration/integration calcs

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