source: trunk/GSASIIgrid.py @ 408

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

add copy to limits menu
more constraint GUI stuff

  • Property svn:keywords set to Date Author Revision URL Id
File size: 64.7 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-11-07 21:13:29 +0000 (Mon, 07 Nov 2011) $
4# $Author: vondreele $
5# $Revision: 408 $
6# $URL: trunk/GSASIIgrid.py $
7# $Id: GSASIIgrid.py 408 2011-11-07 21:13:29Z vondreele $
8########### SVN repository information ###################
9import wx
10import wx.grid as wg
11import time
12import cPickle
13import numpy as np
14import GSASIIpath
15import GSASIIplot as G2plt
16import GSASIIpwdGUI as G2pdG
17import GSASIIimgGUI as G2imG
18import GSASIIphsGUI as G2phG
19import GSASIIstruct as G2str
20import GSASIImapvars as G2mv
21
22[ wxID_ATOMSEDITADD, wxID_ATOMSEDITINSERT, wxID_ATOMSEDITDELETE, wxID_ATOMSREFINE, 
23    wxID_ATOMSMODIFY, wxID_ATOMSTRANSFORM, wxID_ATOMSTESTADD, wxID_ATONTESTINSERT,
24    wxID_RELOADDRAWATOMS,
25] = [wx.NewId() for _init_coll_Atom_Items in range(9)]
26
27[ wxID_PWDRADD, wxID_HKLFADD, wxID_DATADELETE,
28] = [wx.NewId() for _init_coll_Data_Items in range(3)]
29
30[ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWATOMCOLOR, wxID_DRAWATOMRESETCOLOR, 
31    wxID_DRAWVIEWPOINT, wxID_DRAWTRANSFORM, wxID_DRAWDELETE, wxID_DRAWFILLCELL, 
32    wxID_DRAWADDEQUIV, wxID_DRAWFILLCOORD,
33] = [wx.NewId() for _init_coll_DrawAtom_Items in range(10)]
34
35[ wxID_IMCALIBRATE,wxID_IMRECALIBRATE,wxID_IMINTEGRATE, wxID_IMCLEARCALIB, 
36    wxID_IMCOPYCONTROLS, wxID_INTEGRATEALL, wxID_IMSAVECONTROLS, wxID_IMLOADCONTROLS,
37] = [wx.NewId() for _init_coll_IMAGE_Items in range(8)]
38
39[ wxID_MASKCOPY, wxID_MASKSAVE, wxID_MASKLOAD,
40] = [wx.NewId() for _init_coll_MASK_Items in range(3)]
41
42[ wxID_PAWLEYLOAD, wxID_PAWLEYIMPORT, wxID_PAWLEYDELETE, wxID_PAWLEYESTIMATE,
43] = [wx.NewId() for _init_coll_PAWLEY_Items in range(4)]
44
45[ wxID_INSTPRMRESET,wxID_CHANGEWAVETYPE,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    if not data:
733        print 'No sequential refinement results'
734        return
735    histNames = data['histNames']
736   
737    def GetSigData(parm):
738        sigData = []
739        for name in histNames:
740            sigList = data[name]['sig']
741            sigData.append(sigList[parm])
742        return sigData
743   
744    def Select(event):
745        cols = self.dataDisplay.GetSelectedCols()
746        rows = self.dataDisplay.GetSelectedRows()
747        if cols:
748            plotData = []
749            plotSig = []
750            plotNames = []
751            for col in cols:
752                plotData.append(self.SeqTable.GetColValues(col))
753                plotSig.append(GetSigData(col))
754                plotNames.append(self.SeqTable.GetColLabelValue(col))
755            plotData = np.array(plotData)
756            G2plt.PlotSeq(self,plotData,plotSig,plotNames)
757        elif rows:
758            name = histNames[rows[0]]
759            G2plt.PlotCovariance(self,Data=data[name])
760               
761    if self.dataDisplay:
762        self.dataDisplay.Destroy()
763    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
764    self.dataFrame.SetLabel('Sequental refinement results')
765    self.dataFrame.CreateStatusBar()
766    colLabels = data['varyList']
767    Types = len(data['varyList'])*[wg.GRID_VALUE_FLOAT,]
768    seqList = [list(data[name]['variables']) for name in histNames]
769    self.SeqTable = Table(seqList,colLabels=colLabels,rowLabels=histNames,types=Types)
770    self.dataDisplay = GSGrid(parent=self.dataFrame)
771    self.dataDisplay.SetTable(self.SeqTable, True)
772    self.dataDisplay.EnableEditing(False)
773    self.dataDisplay.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, Select)
774    self.dataDisplay.SetRowLabelSize(8*len(histNames[0]))       #pretty arbitrary 8
775    self.dataDisplay.SetMargins(0,0)
776    self.dataDisplay.AutoSizeColumns(True)
777    self.dataFrame.setSizePosLeft([700,350])
778   
779def UpdateConstraints(self,data):             
780#    data.update({'Hist':[],'HAP':[],'Phase':[]})       #empty dict - fill it
781    if not data:
782        data.update({'Hist':[],'HAP':[],'Phase':[]})       #empty dict - fill it
783    Histograms,Phases = self.GetUsedHistogramsAndPhasesfromTree()
784    AtomDict = dict([Phases[phase]['pId'],Phases[phase]['Atoms']] for phase in Phases)
785    Natoms,phaseVary,phaseDict,pawleyLookup,FFtable = G2str.GetPhaseData(Phases,Print=False)
786    phaseList = []
787    for item in phaseDict:
788        if item.split(':')[2] not in ['Ax','Ay','Az','Amul','AI/A','Atype','SHorder']:
789            phaseList.append(item)
790    phaseList.sort()
791    phaseAtNames = {}
792    for item in phaseList:
793        Split = item.split(':')
794        if Split[2][:2] in ['AU','Af','dA']:
795            phaseAtNames[item] = AtomDict[int(Split[0])][int(Split[3])][0]
796        else:
797            phaseAtNames[item] = ''
798           
799    hapVary,hapDict,controlDict = G2str.GetHistogramPhaseData(Phases,Histograms,Print=False)
800    hapList = hapDict.keys()
801    hapList.sort()
802    histVary,histDict,controlDict = G2str.GetHistogramData(Histograms,Print=False)
803    histList = []
804    for item in histDict:
805        if item.split(':')[2] not in ['Omega','Type','Chi','Phi','Azimuth','Gonio. radius','Lam1','Lam2']:
806            histList.append(item)
807    histList.sort()
808    Indx = {}
809    scope = {}                          #filled out later
810    self.Page = [0,'phs']
811   
812    def GetPHlegends(Phases,Histograms):
813        plegend = '\n In p::name'
814        hlegend = '\n In :h:name'
815        phlegend = '\n In p:h:name'
816        for phase in Phases:
817            plegend += '\n p:: = '+str(Phases[phase]['pId'])+':: for '+phase
818            for histogram in Phases[phase]['Histograms']:
819                phlegend += '\n p:h: = '+str(Phases[phase]['pId'])+':'+str(Histograms[histogram]['hId'])+': for '+phase+' in '+histogram
820        for histogram in Histograms:
821            hlegend += '\n :h: = :'+str(Histograms[histogram]['hId'])+': for '+histogram
822        return plegend,hlegend,phlegend
823       
824    def FindEquivVarb(name,nameList):
825        outList = []
826        namelist = [name.split(':')[2],]
827        if 'dA' in name:
828            namelist = ['dAx','dAy','dAz']
829        elif 'AU' in name:
830            namelist = ['AUiso','AU11','AU22','AU33','AU12','AU13','AU23']
831        for item in nameList:
832            key = item.split(':')[2]
833            if key in namelist and item != name:
834                outList.append(item)
835        return outList
836       
837    def SelectVarbs(page,FrstVarb,varList,legend,constType):
838        #future -  add 'all:all:name', '0:all:name', etc. to the varList
839        if page[1] == 'phs':
840            atchoice = [item+' for '+phaseAtNames[item] for item in varList]
841            dlg = wx.MultiChoiceDialog(self,'Select more variables:'+legend,FrstVarb+' and:',atchoice)
842        else:
843            dlg = wx.MultiChoiceDialog(self,'Select more variables:'+legend,FrstVarb+' and:',varList)
844        varbs = [FrstVarb,]
845        if dlg.ShowModal() == wx.ID_OK:
846            sel = dlg.GetSelections()
847            for x in sel:
848                varbs.append(varList[x])
849        dlg.Destroy()
850        if len(varbs) > 1:
851            if 'equivalence' in constType:
852                constr = []
853                for item in varbs[1:]:
854#                    constr += [[{FrstVarb:1.0},{item:-1.0},None,None],]
855                    constr += [[[1.0,FrstVarb],[-1.0,item],None,None],]
856                return constr           #multiple constraints
857            elif 'function' in constType:
858#                constr = map(dict,zip(varbs,[1.0 for i in range(len(varbs))]))
859                constr = map(list,zip([1.0 for i in range(len(varbs))],varbs))
860                return [constr+[0.0,False]]         #just one constraint
861            else:       #'constraint'
862                constr = map(list,zip([1.0 for i in range(len(varbs))],varbs))
863#                constr = map(dict,zip(varbs,[1.0 for i in range(len(varbs))]))
864                return [constr+[0.0,None]]          #just one constraint
865        return []
866             
867    def OnAddHold(event):
868        for phase in Phases:
869            Phase = Phases[phase]
870            Atoms = Phase['Atoms']
871        constr = []
872        page = self.Page
873        choice = scope[page[1]]
874        if page[1] == 'phs':
875            atchoice = [item+' for '+phaseAtNames[item] for item in choice[2]]
876            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],atchoice)
877        else:   
878            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],choice[2])
879        if dlg.ShowModal() == wx.ID_OK:
880            sel = dlg.GetSelection()
881            FrstVarb = choice[2][sel]
882            data[choice[3]] += [[[0.0,FrstVarb],None,None],]
883        dlg.Destroy()
884        choice[4]()
885       
886    def OnAddEquivalence(event):
887        constr = []
888        page = self.Page
889        choice = scope[page[1]]
890        if page[1] == 'phs':
891            atchoice = [item+' for '+phaseAtNames[item] for item in choice[2]]
892            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],atchoice)
893        else:   
894            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],choice[2])
895        if dlg.ShowModal() == wx.ID_OK:
896            sel = dlg.GetSelection()
897            FrstVarb = choice[2][sel]
898            moreVarb = FindEquivVarb(FrstVarb,choice[2])
899            constr = SelectVarbs(page,FrstVarb,moreVarb,choice[1],'equivalence')
900            if len(constr) > 0:
901                data[choice[3]] += constr
902        dlg.Destroy()
903        choice[4]()
904   
905    def OnAddFunction(event):
906        constr = []
907        page = self.Page
908        choice = scope[page[1]]
909        if page[1] == 'phs':
910            atchoice = [item+' for '+phaseAtNames[item] for item in choice[2]]
911            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],atchoice)
912        else:   
913            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],choice[2])
914        if dlg.ShowModal() == wx.ID_OK:
915            sel = dlg.GetSelection()
916            FrstVarb = choice[2][sel]
917            moreVarb = FindEquivVarb(FrstVarb,choice[2])
918            constr = SelectVarbs(page,FrstVarb,moreVarb,choice[1],'function')
919            if len(constr) > 0:
920                data[choice[3]] += constr
921        dlg.Destroy()
922        choice[4]()
923                       
924    def OnAddConstraint(event):
925        constr = []
926        page = self.Page
927        choice = scope[page[1]]
928        if page[1] == 'phs':
929            atchoice = [item+' for '+phaseAtNames[item] for item in choice[2]]
930            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],atchoice)
931        else:   
932            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],choice[2])
933        if dlg.ShowModal() == wx.ID_OK:
934            sel = dlg.GetSelection()
935            FrstVarb = choice[2][sel]
936            moreVarb = FindEquivVarb(FrstVarb,choice[2])
937            constr = SelectVarbs(page,FrstVarb,moreVarb,choice[1],'constraint')
938            if len(constr) > 0:
939                data[choice[3]] += constr
940        dlg.Destroy()
941        choice[4]()
942                       
943    def ConstSizer(name,pageDisplay):
944        constSizer = wx.FlexGridSizer(1,4,0,0)
945        for Id,item in enumerate(data[name]):
946            constDel = wx.Button(pageDisplay,-1,'Delete',style=wx.BU_EXACTFIT)
947            constDel.Bind(wx.EVT_BUTTON,OnConstDel)
948            Indx[constDel.GetId()] = [Id,name]
949            if len(item) < 4:
950                constSizer.Add((5,5),0)
951                constSizer.Add(constDel)
952                eqString = ' FIXED   '+item[0][1]+'   '
953                constSizer.Add((5,0),0)               
954            else:
955                constEdit = wx.Button(pageDisplay,-1,'Edit',style=wx.BU_EXACTFIT)
956                constEdit.Bind(wx.EVT_BUTTON,OnConstEdit)
957                Indx[constEdit.GetId()] = [Id,name]
958                constSizer.Add(constEdit)           
959                constSizer.Add(constDel)
960                if isinstance(item[-1],bool):
961                    constRef = wx.CheckBox(pageDisplay,-1,label=' Refine?')                   
962                    constRef.SetValue(item[-1])
963                    constRef.Bind(wx.EVT_CHECKBOX,OnConstRef)
964                    Indx[constRef.GetId()] = item
965                    constSizer.Add(constRef,0,wx.ALIGN_CENTER_VERTICAL)
966                    eqString = ' FUNCT   '
967                elif isinstance(item[-2],float):
968                    constSizer.Add((5,5),0)
969                    eqString = ' CONSTR  '
970                else:
971                    constSizer.Add((5,5),0)
972                    eqString = ' EQUIV   '
973                for term in item[:-2]:
974                    eqString += '%+.3f*%s '%(term[0],term[1])
975                if isinstance(item[-2],float):
976                    eqString += ' = %.3f'%(item[-2])+'  '
977                else:
978                    eqString += ' = 0   '
979            constSizer.Add(wx.StaticText(pageDisplay,-1,eqString),0,wx.ALIGN_CENTER_VERTICAL)
980        return constSizer
981               
982    def OnConstRef(event):
983        Obj = event.GetEventObject()
984        Indx[Obj.GetId()][-1] = Obj.GetValue()
985       
986    def OnConstDel(event):
987        Obj = event.GetEventObject()
988        Id,name = Indx[Obj.GetId()]
989        del(data[name][Id])
990        OnPageChanged(None)       
991       
992    def OnConstEdit(event):
993        Obj = event.GetEventObject()
994        Id,name = Indx[Obj.GetId()]
995        const = data[name][Id][-2]       
996        if isinstance(data[name][Id][-1],bool):
997            items = data[name][Id][:-2]+[[],]
998            constType = 'Function'
999            extra = '; sum = new variable'
1000        elif isinstance(data[name][Id][-2],float):
1001            items = data[name][Id][:-2]+[[const,'= fixed value'],[]]
1002            constType = 'Constraint'
1003            extra = ' sum = constant'
1004        else:
1005            items = data[name][Id][:-2]+[[],]
1006            constType = 'Equivalence'
1007            extra = '; sum = 0'
1008        dlg = self.SumDialog(self,constType,'Enter value for each term in constraint'+extra,'',items)
1009        try:
1010            if dlg.ShowModal() == wx.ID_OK:
1011                result = dlg.GetData()
1012                if isinstance(data[name][Id][-2],float):
1013                    data[name][Id][:-2] = result[:-2]
1014                    data[name][Id][-2] = result[-2][0]
1015                else:
1016                    data[name][Id][:-2] = result[:-1]
1017        finally:
1018            dlg.Destroy()           
1019        OnPageChanged(None)                     
1020   
1021    def UpdateHAPConstr():
1022        HAPConstr.DestroyChildren()
1023        HAPDisplay = wx.Panel(HAPConstr)
1024        HAPSizer = wx.BoxSizer(wx.VERTICAL)
1025        HAPSizer.Add((5,5),0)
1026        HAPSizer.Add(ConstSizer('HAP',HAPDisplay))
1027        HAPDisplay.SetSizer(HAPSizer,True)
1028        Size = HAPSizer.GetMinSize()
1029        Size[0] += 40
1030        Size[1] = max(Size[1],250) + 20
1031        HAPDisplay.SetSize(Size)
1032        HAPConstr.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
1033        Size[1] = min(Size[1],250)
1034        self.dataFrame.setSizePosLeft(Size)
1035       
1036    def UpdateHistConstr():
1037        HistConstr.DestroyChildren()
1038        HistDisplay = wx.Panel(HistConstr)
1039        HistSizer = wx.BoxSizer(wx.VERTICAL)
1040        HistSizer.Add((5,5),0)       
1041        HistSizer.Add(ConstSizer('Hist',HistDisplay))
1042        HistDisplay.SetSizer(HistSizer,True)
1043        Size = HistSizer.GetMinSize()
1044        Size[0] += 40
1045        Size[1] = max(Size[1],250) + 20
1046        HistDisplay.SetSize(Size)
1047        HistConstr.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
1048        Size[1] = min(Size[1],250)
1049        self.dataFrame.setSizePosLeft(Size)
1050       
1051    def UpdatePhaseConstr():
1052        PhaseConstr.DestroyChildren()
1053        PhaseDisplay = wx.Panel(PhaseConstr)
1054        PhaseSizer = wx.BoxSizer(wx.VERTICAL)
1055        PhaseSizer.Add((5,5),0)       
1056        PhaseSizer.Add(ConstSizer('Phase',PhaseDisplay))
1057        PhaseDisplay.SetSizer(PhaseSizer,True)
1058        Size = PhaseSizer.GetMinSize()
1059        Size[0] += 40
1060        Size[1] = max(Size[1],250) + 20
1061        PhaseDisplay.SetSize(Size)
1062        PhaseConstr.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
1063        Size[1] = min(Size[1],250)
1064        self.dataFrame.setSizePosLeft(Size)
1065   
1066    def OnPageChanged(event):
1067        if event:       #page change event!
1068            page = event.GetSelection()
1069        else:
1070            page = self.dataDisplay.GetSelection()
1071        oldPage = self.dataDisplay.ChangeSelection(page)
1072        text = self.dataDisplay.GetPageText(page)
1073        if text == 'Histogram/Phase constraints':
1074            self.Page = [page,'hap']
1075            UpdateHAPConstr()
1076        elif text == 'Histogram constraints':
1077            self.Page = [page,'hst']
1078            UpdateHistConstr()
1079        elif text == 'Phase constraints':
1080            self.Page = [page,'phs']
1081            UpdatePhaseConstr()
1082
1083    def SetStatusLine(text):
1084        Status.SetStatusText(text)                                     
1085       
1086    plegend,hlegend,phlegend = GetPHlegends(Phases,Histograms)
1087    scope = {'hst':['Histogram variables:',hlegend,histList,'Hist',UpdateHistConstr],
1088        'hap':['HAP variables:',phlegend,hapList,'HAP',UpdateHAPConstr],
1089        'phs':['Phase variables:',plegend,phaseList,'Phase',UpdatePhaseConstr]}
1090    if self.dataDisplay:
1091        self.dataDisplay.Destroy()
1092    self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
1093    self.dataFrame.SetLabel('Constraints')
1094    if not self.dataFrame.GetStatusBar():
1095        Status = self.dataFrame.CreateStatusBar()
1096    SetStatusLine('')
1097   
1098    self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
1099    self.dataFrame.Bind(wx.EVT_MENU, OnAddConstraint, id=wxID_CONSTRAINTADD)
1100    self.dataFrame.Bind(wx.EVT_MENU, OnAddFunction, id=wxID_FUNCTADD)
1101    self.dataFrame.Bind(wx.EVT_MENU, OnAddEquivalence, id=wxID_EQUIVADD)
1102    self.dataFrame.Bind(wx.EVT_MENU, OnAddHold, id=wxID_HOLDADD)
1103    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
1104   
1105    PhaseConstr = wx.ScrolledWindow(self.dataDisplay)
1106    self.dataDisplay.AddPage(PhaseConstr,'Phase constraints')
1107    HAPConstr = wx.ScrolledWindow(self.dataDisplay)
1108    self.dataDisplay.AddPage(HAPConstr,'Histogram/Phase constraints')
1109    HistConstr = wx.ScrolledWindow(self.dataDisplay)
1110    self.dataDisplay.AddPage(HistConstr,'Histogram constraints')
1111    UpdatePhaseConstr()
1112
1113    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
1114   
1115   
1116def UpdateRestraints(self,data):
1117
1118    def OnAddRestraint(event):
1119        page = self.dataDisplay.GetSelection()
1120        print self.dataDisplay.GetPageText(page)
1121
1122    def UpdateAtomRestr():
1123        AtomRestr.DestroyChildren()
1124        dataDisplay = wx.Panel(AtomRestr)
1125        mainSizer = wx.BoxSizer(wx.VERTICAL)
1126        mainSizer.Add((5,5),0)
1127        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Atom restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
1128        mainSizer.Add((5,5),0)
1129
1130
1131        dataDisplay.SetSizer(mainSizer)
1132        Size = mainSizer.Fit(self.dataFrame)
1133        Size[1] += 26                           #compensate for status bar
1134        dataDisplay.SetSize(Size)
1135        self.dataFrame.setSizePosLeft(Size)
1136       
1137    def UpdatePhaseRestr():
1138        PhaseRestr.DestroyChildren()
1139        dataDisplay = wx.Panel(PhaseRestr)
1140        mainSizer = wx.BoxSizer(wx.VERTICAL)
1141        mainSizer.Add((5,5),0)
1142        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Phase restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
1143        mainSizer.Add((5,5),0)
1144
1145
1146        dataDisplay.SetSizer(mainSizer)
1147        Size = mainSizer.Fit(self.dataFrame)
1148        Size[1] += 26                           #compensate for status bar
1149        dataDisplay.SetSize(Size)
1150        self.dataFrame.setSizePosLeft(Size)
1151   
1152    def OnPageChanged(event):
1153        page = event.GetSelection()
1154        text = self.dataDisplay.GetPageText(page)
1155        if text == 'Atom restraints':
1156            self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
1157            UpdateAtomRestr()
1158        elif text == 'Phase restraints':
1159            UpdatePhaseRestr()
1160            self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
1161        event.Skip()
1162
1163    if self.dataDisplay:
1164        self.dataDisplay.Destroy()
1165    self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
1166    self.dataFrame.SetLabel('restraints')
1167    self.dataFrame.CreateStatusBar()
1168    self.dataFrame.Bind(wx.EVT_MENU, OnAddRestraint, id=wxID_RESTRAINTADD)
1169    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
1170   
1171    PhaseRestr = wx.ScrolledWindow(self.dataDisplay)
1172    self.dataDisplay.AddPage(PhaseRestr,'Phase restraints')
1173    AtomRestr = wx.ScrolledWindow(self.dataDisplay)
1174    self.dataDisplay.AddPage(AtomRestr,'Atom restraints')
1175    UpdatePhaseRestr()
1176#    AtomRestrData = data['AtomRestr']
1177
1178    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)       
1179             
1180def UpdateHKLControls(self,data):
1181   
1182    def OnScaleSlider(event):
1183        scale = int(scaleSel.GetValue())/1000.
1184        scaleSel.SetValue(int(scale*1000.))
1185        data['Scale'] = scale*10.
1186        G2plt.PlotSngl(self)
1187       
1188    def OnLayerSlider(event):
1189        layer = layerSel.GetValue()
1190        data['Layer'] = layer
1191        G2plt.PlotSngl(self)
1192       
1193    def OnSelZone(event):
1194        data['Zone'] = zoneSel.GetValue()
1195        G2plt.PlotSngl(self,newPlot=True)
1196       
1197    def OnSelType(event):
1198        data['Type'] = typeSel.GetValue()
1199        G2plt.PlotSngl(self)
1200       
1201    def SetStatusLine():
1202        Status.SetStatusText("look at me!!!")
1203                                     
1204    if self.dataDisplay:
1205        self.dataDisplay.Destroy()
1206    if not self.dataFrame.GetStatusBar():
1207        Status = self.dataFrame.CreateStatusBar()
1208    SetStatusLine()
1209    zones = ['100','010','001']
1210    HKLmax = data['HKLmax']
1211    HKLmin = data['HKLmin']
1212    if data['ifFc']:
1213        typeChoices = ['Fosq','Fo','|DFsq|/sig','|DFsq|>sig','|DFsq|>3sig']
1214    else:
1215        typeChoices = ['Fosq','Fo']
1216    self.dataDisplay = wx.Panel(self.dataFrame)
1217    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1218    mainSizer = wx.BoxSizer(wx.VERTICAL)
1219    mainSizer.Add((5,10),0)
1220   
1221    scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
1222    scaleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Scale'),0,
1223        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1224    scaleSel = wx.Slider(parent=self.dataDisplay,maxValue=1000,minValue=100,
1225        style=wx.SL_HORIZONTAL,value=int(data['Scale']*100))
1226    scaleSizer.Add(scaleSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
1227    scaleSel.SetLineSize(100)
1228    scaleSel.SetPageSize(900)
1229    scaleSel.Bind(wx.EVT_SLIDER, OnScaleSlider)
1230    mainSizer.Add(scaleSizer,1,wx.EXPAND|wx.RIGHT)
1231   
1232    zoneSizer = wx.BoxSizer(wx.HORIZONTAL)
1233    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Zone  '),0,
1234        wx.ALIGN_CENTER_VERTICAL)
1235    zoneSel = wx.ComboBox(parent=self.dataDisplay,value=data['Zone'],choices=['100','010','001'],
1236        style=wx.CB_READONLY|wx.CB_DROPDOWN)
1237    zoneSel.Bind(wx.EVT_COMBOBOX, OnSelZone)
1238    zoneSizer.Add(zoneSel,0,wx.ALIGN_CENTER_VERTICAL)
1239    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Plot type  '),0,
1240        wx.ALIGN_CENTER_VERTICAL)       
1241    typeSel = wx.ComboBox(parent=self.dataDisplay,value=data['Type'],choices=typeChoices,
1242        style=wx.CB_READONLY|wx.CB_DROPDOWN)
1243    typeSel.Bind(wx.EVT_COMBOBOX, OnSelType)
1244    zoneSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
1245    zoneSizer.Add((10,0),0)   
1246    mainSizer.Add(zoneSizer,1,wx.EXPAND|wx.RIGHT)
1247       
1248    izone = zones.index(data['Zone'])
1249    layerSizer = wx.BoxSizer(wx.HORIZONTAL)
1250    layerSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Layer'),0,
1251        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1252    layerSel = wx.Slider(parent=self.dataDisplay,maxValue=HKLmax[izone],minValue=HKLmin[izone],
1253        style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS,value=0)
1254    layerSel.SetLineSize(1)
1255    layerSel.SetLineSize(5)
1256    layerSel.Bind(wx.EVT_SLIDER, OnLayerSlider)   
1257    layerSizer.Add(layerSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
1258    layerSizer.Add((10,0),0)   
1259    mainSizer.Add(layerSizer,1,wx.EXPAND|wx.RIGHT)
1260
1261       
1262    mainSizer.Layout()   
1263    self.dataDisplay.SetSizer(mainSizer)
1264    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
1265    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
1266
1267def GetPatternTreeDataNames(self,dataTypes):
1268    names = []
1269    item, cookie = self.PatternTree.GetFirstChild(self.root)       
1270    while item:
1271        name = self.PatternTree.GetItemText(item)
1272        if name[:4] in dataTypes:
1273            names.append(name)
1274        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1275    return names
1276                         
1277def GetPatternTreeItemId(self, parentId, itemText):
1278    item, cookie = self.PatternTree.GetFirstChild(parentId)
1279    while item:
1280        if self.PatternTree.GetItemText(item) == itemText:
1281            return item
1282        item, cookie = self.PatternTree.GetNextChild(parentId, cookie)
1283    return 0               
1284
1285def MovePatternTreeToGrid(self,item):
1286   
1287#    print self.PatternTree.GetItemText(item)
1288   
1289    oldPage = 0
1290    if self.dataFrame:
1291        self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1292        if self.dataFrame.GetLabel() == 'Comments':
1293            data = [self.dataDisplay.GetValue()]
1294            self.dataDisplay.Clear() 
1295            Id = GetPatternTreeItemId(self,self.root, 'Comments')
1296            if Id: self.PatternTree.SetItemPyData(Id,data)
1297        if self.dataFrame.GetLabel() == 'Notebook':
1298            data = [self.dataDisplay.GetValue()]
1299            self.dataDisplay.Clear() 
1300            Id = GetPatternTreeItemId(self,self.root, 'Notebook')
1301            if Id: self.PatternTree.SetItemPyData(Id,data)
1302        if 'Phase Data for' in self.dataFrame.GetLabel():
1303            if self.dataDisplay: 
1304                oldPage = self.dataDisplay.GetSelection()
1305        self.dataFrame.Clear()
1306        self.dataFrame.SetLabel('')
1307    else:
1308        self.dataFrame = DataFrame(parent=self.mainPanel)
1309
1310    self.dataFrame.Raise()           
1311    self.PickId = 0
1312    parentID = self.root
1313    self.ExportPattern.Enable(False)
1314    if item != self.root:
1315        parentID = self.PatternTree.GetItemParent(item)
1316    if self.PatternTree.GetItemParent(item) == self.root:
1317        self.PatternId = item
1318        self.PickId = item
1319        if self.PatternTree.GetItemText(item) == 'Notebook':
1320            self.PatternId = 0
1321            self.ExportPattern.Enable(False)
1322            data = self.PatternTree.GetItemPyData(item)
1323            UpdateNotebook(self,data)
1324        elif self.PatternTree.GetItemText(item) == 'Controls':
1325            self.PatternId = 0
1326            self.ExportPattern.Enable(False)
1327            data = self.PatternTree.GetItemPyData(item)
1328            if not data:           #fill in defaults
1329                data = {
1330                    #least squares controls
1331                    'deriv type':'analytic','min dM/M':0.0001,'shift factor':1.0,
1332                    #Fourier controls
1333                    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
1334                    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
1335                    #distance/angle controls
1336                    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
1337                self.PatternTree.SetItemPyData(item,data)                             
1338            self.Refine.Enable(True)
1339            self.SeqRefine.Enable(True)
1340            UpdateControls(self,data)
1341        elif self.PatternTree.GetItemText(item) == 'Sequental results':
1342            data = self.PatternTree.GetItemPyData(item)
1343            UpdateSeqResults(self,data)           
1344        elif self.PatternTree.GetItemText(item) == 'Covariance':
1345            data = self.PatternTree.GetItemPyData(item)
1346            G2plt.PlotCovariance(self)
1347        elif self.PatternTree.GetItemText(item) == 'Constraints':
1348            data = self.PatternTree.GetItemPyData(item)
1349            UpdateConstraints(self,data)
1350        elif self.PatternTree.GetItemText(item) == 'Restraints':
1351            data = self.PatternTree.GetItemPyData(item)
1352            UpdateRestraints(self,data)
1353        elif 'IMG' in self.PatternTree.GetItemText(item):
1354            self.Image = item
1355            G2plt.PlotImage(self,newPlot=True)
1356        elif 'PKS' in self.PatternTree.GetItemText(item):
1357            G2plt.PlotPowderLines(self)
1358        elif 'PWDR' in self.PatternTree.GetItemText(item):
1359            self.ExportPattern.Enable(True)
1360            G2plt.PlotPatterns(self,newPlot=True)
1361        elif 'HKLF' in self.PatternTree.GetItemText(item):
1362            self.Sngl = item
1363            G2plt.PlotSngl(self,newPlot=True)
1364        elif 'PDF' in self.PatternTree.GetItemText(item):
1365            self.PatternId = item
1366            self.ExportPDF.Enable(True)
1367            G2plt.PlotISFG(self,type='S(Q)')
1368           
1369    elif 'I(Q)' in self.PatternTree.GetItemText(item):
1370        self.PickId = item
1371        self.PatternId = self.PatternTree.GetItemParent(item)
1372        G2plt.PlotISFG(self,type='I(Q)',newPlot=True)
1373    elif 'S(Q)' in self.PatternTree.GetItemText(item):
1374        self.PickId = item
1375        self.PatternId = self.PatternTree.GetItemParent(item)
1376        G2plt.PlotISFG(self,type='S(Q)',newPlot=True)
1377    elif 'F(Q)' in self.PatternTree.GetItemText(item):
1378        self.PickId = item
1379        self.PatternId = self.PatternTree.GetItemParent(item)
1380        G2plt.PlotISFG(self,type='F(Q)',newPlot=True)
1381    elif 'G(R)' in self.PatternTree.GetItemText(item):
1382        self.PickId = item
1383        self.PatternId = self.PatternTree.GetItemParent(item)
1384        G2plt.PlotISFG(self,type='G(R)',newPlot=True)           
1385    elif self.PatternTree.GetItemText(parentID) == 'Phases':
1386        self.PickId = item
1387        data = self.PatternTree.GetItemPyData(item)           
1388        G2phG.UpdatePhaseData(self,item,data,oldPage)
1389    elif self.PatternTree.GetItemText(item) == 'Comments':
1390        self.PatternId = self.PatternTree.GetItemParent(item)
1391        self.PickId = item
1392        data = self.PatternTree.GetItemPyData(item)
1393        UpdateComments(self,data)
1394    elif self.PatternTree.GetItemText(item) == 'Image Controls':
1395        self.dataFrame.SetTitle('Image Controls')
1396        self.PickId = item
1397        self.Image = self.PatternTree.GetItemParent(item)
1398        masks = self.PatternTree.GetItemPyData(
1399            GetPatternTreeItemId(self,self.Image, 'Masks'))
1400        data = self.PatternTree.GetItemPyData(item)
1401        G2imG.UpdateImageControls(self,data,masks)
1402        G2plt.PlotImage(self)
1403    elif self.PatternTree.GetItemText(item) == 'Masks':
1404        self.dataFrame.SetTitle('Masks')
1405        self.PickId = item
1406        self.Image = self.PatternTree.GetItemParent(item)
1407        data = self.PatternTree.GetItemPyData(item)
1408        G2imG.UpdateMasks(self,data)
1409        G2plt.PlotImage(self)
1410    elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
1411        self.PickId = item
1412        self.Sngl = self.PatternTree.GetItemParent(item)
1413        data = self.PatternTree.GetItemPyData(item)
1414        UpdateHKLControls(self,data)
1415        G2plt.PlotSngl(self)
1416    elif self.PatternTree.GetItemText(item) == 'PDF Controls':
1417        self.PatternId = self.PatternTree.GetItemParent(item)
1418        self.ExportPDF.Enable(True)
1419        self.PickId = item
1420        data = self.PatternTree.GetItemPyData(item)
1421        G2pdG.UpdatePDFGrid(self,data)
1422        G2plt.PlotISFG(self,type='I(Q)')
1423        G2plt.PlotISFG(self,type='S(Q)')
1424        G2plt.PlotISFG(self,type='F(Q)')
1425        G2plt.PlotISFG(self,type='G(R)')
1426    elif self.PatternTree.GetItemText(item) == 'Peak List':
1427        self.PatternId = self.PatternTree.GetItemParent(item)
1428        self.ExportPeakList.Enable(True)
1429        self.PickId = item
1430        data = self.PatternTree.GetItemPyData(item)
1431        G2pdG.UpdatePeakGrid(self,data)
1432        G2plt.PlotPatterns(self)
1433    elif self.PatternTree.GetItemText(item) == 'Background':
1434        self.PatternId = self.PatternTree.GetItemParent(item)
1435        self.PickId = item
1436        data = self.PatternTree.GetItemPyData(item)
1437        G2pdG.UpdateBackgroundGrid(self,data)
1438        G2plt.PlotPatterns(self)
1439    elif self.PatternTree.GetItemText(item) == 'Limits':
1440        self.PatternId = self.PatternTree.GetItemParent(item)
1441        self.PickId = item
1442        data = self.PatternTree.GetItemPyData(item)
1443        G2pdG.UpdateLimitsGrid(self,data)
1444        G2plt.PlotPatterns(self)
1445    elif self.PatternTree.GetItemText(item) == 'Instrument Parameters':
1446        self.PatternId = self.PatternTree.GetItemParent(item)
1447        self.PickId = item
1448        data = self.PatternTree.GetItemPyData(item)
1449        G2pdG.UpdateInstrumentGrid(self,data)
1450        G2plt.PlotPeakWidths(self)
1451    elif self.PatternTree.GetItemText(item) == 'Sample Parameters':
1452        self.PatternId = self.PatternTree.GetItemParent(item)
1453        self.PickId = item
1454        data = self.PatternTree.GetItemPyData(item)
1455
1456        if 'Temperature' not in data:           #temp fix for old gpx files
1457            data = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],'DisplaceX':[0.0,False],
1458                'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,
1459                'Force':0.0,'Gonio. radius':200.0}
1460            self.PatternTree.SetItemPyData(item,data)
1461   
1462        G2pdG.UpdateSampleGrid(self,data)
1463        G2plt.PlotPatterns(self)
1464    elif self.PatternTree.GetItemText(item) == 'Index Peak List':
1465        self.PatternId = self.PatternTree.GetItemParent(item)
1466        self.ExportPeakList.Enable(True)
1467        self.PickId = item
1468        data = self.PatternTree.GetItemPyData(item)
1469        G2pdG.UpdateIndexPeaksGrid(self,data)
1470        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1471            G2plt.PlotPowderLines(self)
1472        else:
1473            G2plt.PlotPatterns(self)
1474    elif self.PatternTree.GetItemText(item) == 'Unit Cells List':
1475        self.PatternId = self.PatternTree.GetItemParent(item)
1476        self.PickId = item
1477        data = self.PatternTree.GetItemPyData(item)
1478        if not data:
1479            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
1480            data.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0])      #Bravais lattice flags
1481            data.append([])                                 #empty cell list
1482            data.append([])                                 #empty dmin
1483            self.PatternTree.SetItemPyData(item,data)                             
1484        G2pdG.UpdateUnitCellsGrid(self,data)
1485        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1486            G2plt.PlotPowderLines(self)
1487        else:
1488            G2plt.PlotPatterns(self)
1489    elif self.PatternTree.GetItemText(item) == 'Reflection Lists':
1490        self.PatternId = self.PatternTree.GetItemParent(item)
1491        self.PickId = item
1492        data = self.PatternTree.GetItemPyData(item)
1493        self.RefList = ''
1494        if len(data):
1495            self.RefList = data.keys()[0]
1496        G2pdG.UpdateReflectionGrid(self,data)
1497        G2plt.PlotPatterns(self)
1498     
Note: See TracBrowser for help on using the repository browser.