source: trunk/GSASIIgrid.py @ 415

Last change on this file since 415 was 415, checked in by toby, 11 years ago

implement refinement of constrained parameters; fix minor bugs; add fast interpolate

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