source: trunk/GSASIIgrid.py @ 411

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

fix very old (!) bug in psvfcj.for
implement neutron scattering lengths in GSASII including the dozen anomalous scattering isotopes
isotope choice is in General
so GSASII will now do neutron CW Rietveld refinements
some cleanup of the constraints GUI
remove varyList from GSASIImapvars.py globals

  • Property svn:keywords set to Date Author Revision URL Id
File size: 64.4 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-11-11 20:14:35 +0000 (Fri, 11 Nov 2011) $
4# $Author: vondreele $
5# $Revision: 411 $
6# $URL: trunk/GSASIIgrid.py $
7# $Id: GSASIIgrid.py 411 2011-11-11 20:14:35Z 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,BLtable = 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 += [[[1.0,FrstVarb],[-1.0,item],None,None],]
855                return constr           #multiple constraints
856            elif 'function' in constType:
857                constr = map(list,zip([1.0 for i in range(len(varbs))],varbs))
858                return [constr+[0.0,False]]         #just one constraint
859            else:       #'constraint'
860                constr = map(list,zip([1.0 for i in range(len(varbs))],varbs))
861                return [constr+[0.0,None]]          #just one constraint
862        return []
863             
864    def OnAddHold(event):
865        for phase in Phases:
866            Phase = Phases[phase]
867            Atoms = Phase['Atoms']
868        constr = []
869        page = self.Page
870        choice = scope[page[1]]
871        if page[1] == 'phs':
872            atchoice = [item+' for '+phaseAtNames[item] for item in choice[2]]
873            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],atchoice)
874        else:   
875            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],choice[2])
876        if dlg.ShowModal() == wx.ID_OK:
877            sel = dlg.GetSelection()
878            FrstVarb = choice[2][sel]
879            data[choice[3]] += [[[0.0,FrstVarb],None,None],]
880        dlg.Destroy()
881        choice[4]()
882       
883    def OnAddEquivalence(event):
884        constr = []
885        page = self.Page
886        choice = scope[page[1]]
887        if page[1] == 'phs':
888            atchoice = [item+' for '+phaseAtNames[item] for item in choice[2]]
889            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],atchoice)
890        else:   
891            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],choice[2])
892        if dlg.ShowModal() == wx.ID_OK:
893            sel = dlg.GetSelection()
894            FrstVarb = choice[2][sel]
895            moreVarb = FindEquivVarb(FrstVarb,choice[2])
896            constr = SelectVarbs(page,FrstVarb,moreVarb,choice[1],'equivalence')
897            if len(constr) > 0:
898                data[choice[3]] += constr
899        dlg.Destroy()
900        choice[4]()
901   
902    def OnAddFunction(event):
903        constr = []
904        page = self.Page
905        choice = scope[page[1]]
906        if page[1] == 'phs':
907            atchoice = [item+' for '+phaseAtNames[item] for item in choice[2]]
908            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],atchoice)
909        else:   
910            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],choice[2])
911        if dlg.ShowModal() == wx.ID_OK:
912            sel = dlg.GetSelection()
913            FrstVarb = choice[2][sel]
914            moreVarb = FindEquivVarb(FrstVarb,choice[2])
915            constr = SelectVarbs(page,FrstVarb,moreVarb,choice[1],'function')
916            if len(constr) > 0:
917                data[choice[3]] += constr
918        dlg.Destroy()
919        choice[4]()
920                       
921    def OnAddConstraint(event):
922        constr = []
923        page = self.Page
924        choice = scope[page[1]]
925        if page[1] == 'phs':
926            atchoice = [item+' for '+phaseAtNames[item] for item in choice[2]]
927            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],atchoice)
928        else:   
929            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+choice[1],choice[0],choice[2])
930        if dlg.ShowModal() == wx.ID_OK:
931            sel = dlg.GetSelection()
932            FrstVarb = choice[2][sel]
933            moreVarb = FindEquivVarb(FrstVarb,choice[2])
934            constr = SelectVarbs(page,FrstVarb,moreVarb,choice[1],'constraint')
935            if len(constr) > 0:
936                data[choice[3]] += constr
937        dlg.Destroy()
938        choice[4]()
939                       
940    def ConstSizer(name,pageDisplay):
941        constSizer = wx.FlexGridSizer(1,4,0,0)
942        for Id,item in enumerate(data[name]):
943            constDel = wx.Button(pageDisplay,-1,'Delete',style=wx.BU_EXACTFIT)
944            constDel.Bind(wx.EVT_BUTTON,OnConstDel)
945            Indx[constDel.GetId()] = [Id,name]
946            if len(item) < 4:
947                constSizer.Add((5,5),0)
948                constSizer.Add(constDel)
949                eqString = ' FIXED   '+item[0][1]+'   '
950            else:
951                constEdit = wx.Button(pageDisplay,-1,'Edit',style=wx.BU_EXACTFIT)
952                constEdit.Bind(wx.EVT_BUTTON,OnConstEdit)
953                Indx[constEdit.GetId()] = [Id,name]
954                constSizer.Add(constEdit)           
955                constSizer.Add(constDel)
956                if isinstance(item[-1],bool):
957                    eqString = ' FUNCT   '
958                elif isinstance(item[-2],float):
959                    eqString = ' CONSTR  '
960                else:
961                    eqString = ' EQUIV   '
962                for term in item[:-2]:
963                    eqString += '%+.3f*%s '%(term[0],term[1])
964                if isinstance(item[-2],float):
965                    eqString += ' = %.3f'%(item[-2])+'  '
966                else:
967                    eqString += ' = 0   '
968            constSizer.Add(wx.StaticText(pageDisplay,-1,eqString),0,wx.ALIGN_CENTER_VERTICAL)
969            if isinstance(item[-1],bool):
970                constRef = wx.CheckBox(pageDisplay,-1,label=' Refine?')                   
971                constRef.SetValue(item[-1])
972                constRef.Bind(wx.EVT_CHECKBOX,OnConstRef)
973                Indx[constRef.GetId()] = item
974                constSizer.Add(constRef,0,wx.ALIGN_CENTER_VERTICAL)
975            else:
976                constSizer.Add((5,5),0)
977        return constSizer
978               
979    def OnConstRef(event):
980        Obj = event.GetEventObject()
981        Indx[Obj.GetId()][-1] = Obj.GetValue()
982       
983    def OnConstDel(event):
984        Obj = event.GetEventObject()
985        Id,name = Indx[Obj.GetId()]
986        del(data[name][Id])
987        OnPageChanged(None)       
988       
989    def OnConstEdit(event):
990        Obj = event.GetEventObject()
991        Id,name = Indx[Obj.GetId()]
992        const = data[name][Id][-2]       
993        if isinstance(data[name][Id][-1],bool):
994            items = data[name][Id][:-2]+[[],]
995            constType = 'Function'
996            extra = '; sum = new variable'
997        elif isinstance(data[name][Id][-2],float):
998            items = data[name][Id][:-2]+[[const,'= fixed value'],[]]
999            constType = 'Constraint'
1000            extra = ' sum = constant'
1001        else:
1002            items = data[name][Id][:-2]+[[],]
1003            constType = 'Equivalence'
1004            extra = '; sum = 0'
1005        dlg = self.SumDialog(self,constType,'Enter value for each term in constraint'+extra,'',items)
1006        try:
1007            if dlg.ShowModal() == wx.ID_OK:
1008                result = dlg.GetData()
1009                if isinstance(data[name][Id][-2],float):
1010                    data[name][Id][:-2] = result[:-2]
1011                    data[name][Id][-2] = result[-2][0]
1012                else:
1013                    data[name][Id][:-2] = result[:-1]
1014        finally:
1015            dlg.Destroy()           
1016        OnPageChanged(None)                     
1017   
1018    def UpdateHAPConstr():
1019        HAPConstr.DestroyChildren()
1020        HAPDisplay = wx.Panel(HAPConstr)
1021        HAPSizer = wx.BoxSizer(wx.VERTICAL)
1022        HAPSizer.Add((5,5),0)
1023        HAPSizer.Add(ConstSizer('HAP',HAPDisplay))
1024        HAPDisplay.SetSizer(HAPSizer,True)
1025        Size = HAPSizer.GetMinSize()
1026        Size[0] += 40
1027        Size[1] = max(Size[1],250) + 20
1028        HAPDisplay.SetSize(Size)
1029        HAPConstr.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
1030        Size[1] = min(Size[1],250)
1031        self.dataFrame.setSizePosLeft(Size)
1032       
1033    def UpdateHistConstr():
1034        HistConstr.DestroyChildren()
1035        HistDisplay = wx.Panel(HistConstr)
1036        HistSizer = wx.BoxSizer(wx.VERTICAL)
1037        HistSizer.Add((5,5),0)       
1038        HistSizer.Add(ConstSizer('Hist',HistDisplay))
1039        HistDisplay.SetSizer(HistSizer,True)
1040        Size = HistSizer.GetMinSize()
1041        Size[0] += 40
1042        Size[1] = max(Size[1],250) + 20
1043        HistDisplay.SetSize(Size)
1044        HistConstr.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
1045        Size[1] = min(Size[1],250)
1046        self.dataFrame.setSizePosLeft(Size)
1047       
1048    def UpdatePhaseConstr():
1049        PhaseConstr.DestroyChildren()
1050        PhaseDisplay = wx.Panel(PhaseConstr)
1051        PhaseSizer = wx.BoxSizer(wx.VERTICAL)
1052        PhaseSizer.Add((5,5),0)       
1053        PhaseSizer.Add(ConstSizer('Phase',PhaseDisplay))
1054        PhaseDisplay.SetSizer(PhaseSizer,True)
1055        Size = PhaseSizer.GetMinSize()
1056        Size[0] += 40
1057        Size[1] = max(Size[1],250) + 20
1058        PhaseDisplay.SetSize(Size)
1059        PhaseConstr.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
1060        Size[1] = min(Size[1],250)
1061        self.dataFrame.setSizePosLeft(Size)
1062   
1063    def OnPageChanged(event):
1064        if event:       #page change event!
1065            page = event.GetSelection()
1066        else:
1067            page = self.dataDisplay.GetSelection()
1068        oldPage = self.dataDisplay.ChangeSelection(page)
1069        text = self.dataDisplay.GetPageText(page)
1070        if text == 'Histogram/Phase constraints':
1071            self.Page = [page,'hap']
1072            UpdateHAPConstr()
1073        elif text == 'Histogram constraints':
1074            self.Page = [page,'hst']
1075            UpdateHistConstr()
1076        elif text == 'Phase constraints':
1077            self.Page = [page,'phs']
1078            UpdatePhaseConstr()
1079
1080    def SetStatusLine(text):
1081        Status.SetStatusText(text)                                     
1082       
1083    plegend,hlegend,phlegend = GetPHlegends(Phases,Histograms)
1084    scope = {'hst':['Histogram variables:',hlegend,histList,'Hist',UpdateHistConstr],
1085        'hap':['HAP variables:',phlegend,hapList,'HAP',UpdateHAPConstr],
1086        'phs':['Phase variables:',plegend,phaseList,'Phase',UpdatePhaseConstr]}
1087    if self.dataDisplay:
1088        self.dataDisplay.Destroy()
1089    self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
1090    self.dataFrame.SetLabel('Constraints')
1091    if not self.dataFrame.GetStatusBar():
1092        Status = self.dataFrame.CreateStatusBar()
1093    SetStatusLine('')
1094   
1095    self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
1096    self.dataFrame.Bind(wx.EVT_MENU, OnAddConstraint, id=wxID_CONSTRAINTADD)
1097    self.dataFrame.Bind(wx.EVT_MENU, OnAddFunction, id=wxID_FUNCTADD)
1098    self.dataFrame.Bind(wx.EVT_MENU, OnAddEquivalence, id=wxID_EQUIVADD)
1099    self.dataFrame.Bind(wx.EVT_MENU, OnAddHold, id=wxID_HOLDADD)
1100    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
1101   
1102    PhaseConstr = wx.ScrolledWindow(self.dataDisplay)
1103    self.dataDisplay.AddPage(PhaseConstr,'Phase constraints')
1104    HAPConstr = wx.ScrolledWindow(self.dataDisplay)
1105    self.dataDisplay.AddPage(HAPConstr,'Histogram/Phase constraints')
1106    HistConstr = wx.ScrolledWindow(self.dataDisplay)
1107    self.dataDisplay.AddPage(HistConstr,'Histogram constraints')
1108    UpdatePhaseConstr()
1109
1110    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
1111   
1112   
1113def UpdateRestraints(self,data):
1114
1115    def OnAddRestraint(event):
1116        page = self.dataDisplay.GetSelection()
1117        print self.dataDisplay.GetPageText(page)
1118
1119    def UpdateAtomRestr():
1120        AtomRestr.DestroyChildren()
1121        dataDisplay = wx.Panel(AtomRestr)
1122        mainSizer = wx.BoxSizer(wx.VERTICAL)
1123        mainSizer.Add((5,5),0)
1124        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Atom restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
1125        mainSizer.Add((5,5),0)
1126
1127
1128        dataDisplay.SetSizer(mainSizer)
1129        Size = mainSizer.Fit(self.dataFrame)
1130        Size[1] += 26                           #compensate for status bar
1131        dataDisplay.SetSize(Size)
1132        self.dataFrame.setSizePosLeft(Size)
1133       
1134    def UpdatePhaseRestr():
1135        PhaseRestr.DestroyChildren()
1136        dataDisplay = wx.Panel(PhaseRestr)
1137        mainSizer = wx.BoxSizer(wx.VERTICAL)
1138        mainSizer.Add((5,5),0)
1139        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Phase restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
1140        mainSizer.Add((5,5),0)
1141
1142
1143        dataDisplay.SetSizer(mainSizer)
1144        Size = mainSizer.Fit(self.dataFrame)
1145        Size[1] += 26                           #compensate for status bar
1146        dataDisplay.SetSize(Size)
1147        self.dataFrame.setSizePosLeft(Size)
1148   
1149    def OnPageChanged(event):
1150        page = event.GetSelection()
1151        text = self.dataDisplay.GetPageText(page)
1152        if text == 'Atom restraints':
1153            self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
1154            UpdateAtomRestr()
1155        elif text == 'Phase restraints':
1156            UpdatePhaseRestr()
1157            self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
1158        event.Skip()
1159
1160    if self.dataDisplay:
1161        self.dataDisplay.Destroy()
1162    self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
1163    self.dataFrame.SetLabel('restraints')
1164    self.dataFrame.CreateStatusBar()
1165    self.dataFrame.Bind(wx.EVT_MENU, OnAddRestraint, id=wxID_RESTRAINTADD)
1166    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
1167   
1168    PhaseRestr = wx.ScrolledWindow(self.dataDisplay)
1169    self.dataDisplay.AddPage(PhaseRestr,'Phase restraints')
1170    AtomRestr = wx.ScrolledWindow(self.dataDisplay)
1171    self.dataDisplay.AddPage(AtomRestr,'Atom restraints')
1172    UpdatePhaseRestr()
1173#    AtomRestrData = data['AtomRestr']
1174
1175    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)       
1176             
1177def UpdateHKLControls(self,data):
1178   
1179    def OnScaleSlider(event):
1180        scale = int(scaleSel.GetValue())/1000.
1181        scaleSel.SetValue(int(scale*1000.))
1182        data['Scale'] = scale*10.
1183        G2plt.PlotSngl(self)
1184       
1185    def OnLayerSlider(event):
1186        layer = layerSel.GetValue()
1187        data['Layer'] = layer
1188        G2plt.PlotSngl(self)
1189       
1190    def OnSelZone(event):
1191        data['Zone'] = zoneSel.GetValue()
1192        G2plt.PlotSngl(self,newPlot=True)
1193       
1194    def OnSelType(event):
1195        data['Type'] = typeSel.GetValue()
1196        G2plt.PlotSngl(self)
1197       
1198    def SetStatusLine():
1199        Status.SetStatusText("look at me!!!")
1200                                     
1201    if self.dataDisplay:
1202        self.dataDisplay.Destroy()
1203    if not self.dataFrame.GetStatusBar():
1204        Status = self.dataFrame.CreateStatusBar()
1205    SetStatusLine()
1206    zones = ['100','010','001']
1207    HKLmax = data['HKLmax']
1208    HKLmin = data['HKLmin']
1209    if data['ifFc']:
1210        typeChoices = ['Fosq','Fo','|DFsq|/sig','|DFsq|>sig','|DFsq|>3sig']
1211    else:
1212        typeChoices = ['Fosq','Fo']
1213    self.dataDisplay = wx.Panel(self.dataFrame)
1214    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1215    mainSizer = wx.BoxSizer(wx.VERTICAL)
1216    mainSizer.Add((5,10),0)
1217   
1218    scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
1219    scaleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Scale'),0,
1220        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1221    scaleSel = wx.Slider(parent=self.dataDisplay,maxValue=1000,minValue=100,
1222        style=wx.SL_HORIZONTAL,value=int(data['Scale']*100))
1223    scaleSizer.Add(scaleSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
1224    scaleSel.SetLineSize(100)
1225    scaleSel.SetPageSize(900)
1226    scaleSel.Bind(wx.EVT_SLIDER, OnScaleSlider)
1227    mainSizer.Add(scaleSizer,1,wx.EXPAND|wx.RIGHT)
1228   
1229    zoneSizer = wx.BoxSizer(wx.HORIZONTAL)
1230    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Zone  '),0,
1231        wx.ALIGN_CENTER_VERTICAL)
1232    zoneSel = wx.ComboBox(parent=self.dataDisplay,value=data['Zone'],choices=['100','010','001'],
1233        style=wx.CB_READONLY|wx.CB_DROPDOWN)
1234    zoneSel.Bind(wx.EVT_COMBOBOX, OnSelZone)
1235    zoneSizer.Add(zoneSel,0,wx.ALIGN_CENTER_VERTICAL)
1236    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Plot type  '),0,
1237        wx.ALIGN_CENTER_VERTICAL)       
1238    typeSel = wx.ComboBox(parent=self.dataDisplay,value=data['Type'],choices=typeChoices,
1239        style=wx.CB_READONLY|wx.CB_DROPDOWN)
1240    typeSel.Bind(wx.EVT_COMBOBOX, OnSelType)
1241    zoneSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
1242    zoneSizer.Add((10,0),0)   
1243    mainSizer.Add(zoneSizer,1,wx.EXPAND|wx.RIGHT)
1244       
1245    izone = zones.index(data['Zone'])
1246    layerSizer = wx.BoxSizer(wx.HORIZONTAL)
1247    layerSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Layer'),0,
1248        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1249    layerSel = wx.Slider(parent=self.dataDisplay,maxValue=HKLmax[izone],minValue=HKLmin[izone],
1250        style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS,value=0)
1251    layerSel.SetLineSize(1)
1252    layerSel.SetLineSize(5)
1253    layerSel.Bind(wx.EVT_SLIDER, OnLayerSlider)   
1254    layerSizer.Add(layerSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
1255    layerSizer.Add((10,0),0)   
1256    mainSizer.Add(layerSizer,1,wx.EXPAND|wx.RIGHT)
1257
1258       
1259    mainSizer.Layout()   
1260    self.dataDisplay.SetSizer(mainSizer)
1261    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
1262    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
1263
1264def GetPatternTreeDataNames(self,dataTypes):
1265    names = []
1266    item, cookie = self.PatternTree.GetFirstChild(self.root)       
1267    while item:
1268        name = self.PatternTree.GetItemText(item)
1269        if name[:4] in dataTypes:
1270            names.append(name)
1271        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1272    return names
1273                         
1274def GetPatternTreeItemId(self, parentId, itemText):
1275    item, cookie = self.PatternTree.GetFirstChild(parentId)
1276    while item:
1277        if self.PatternTree.GetItemText(item) == itemText:
1278            return item
1279        item, cookie = self.PatternTree.GetNextChild(parentId, cookie)
1280    return 0               
1281
1282def MovePatternTreeToGrid(self,item):
1283   
1284#    print self.PatternTree.GetItemText(item)
1285   
1286    oldPage = 0
1287    if self.dataFrame:
1288        self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1289        if self.dataFrame.GetLabel() == 'Comments':
1290            data = [self.dataDisplay.GetValue()]
1291            self.dataDisplay.Clear() 
1292            Id = GetPatternTreeItemId(self,self.root, 'Comments')
1293            if Id: self.PatternTree.SetItemPyData(Id,data)
1294        if self.dataFrame.GetLabel() == 'Notebook':
1295            data = [self.dataDisplay.GetValue()]
1296            self.dataDisplay.Clear() 
1297            Id = GetPatternTreeItemId(self,self.root, 'Notebook')
1298            if Id: self.PatternTree.SetItemPyData(Id,data)
1299        if 'Phase Data for' in self.dataFrame.GetLabel():
1300            if self.dataDisplay: 
1301                oldPage = self.dataDisplay.GetSelection()
1302        self.dataFrame.Clear()
1303        self.dataFrame.SetLabel('')
1304    else:
1305        self.dataFrame = DataFrame(parent=self.mainPanel)
1306
1307    self.dataFrame.Raise()           
1308    self.PickId = 0
1309    parentID = self.root
1310    self.ExportPattern.Enable(False)
1311    if item != self.root:
1312        parentID = self.PatternTree.GetItemParent(item)
1313    if self.PatternTree.GetItemParent(item) == self.root:
1314        self.PatternId = item
1315        self.PickId = item
1316        if self.PatternTree.GetItemText(item) == 'Notebook':
1317            self.PatternId = 0
1318            self.ExportPattern.Enable(False)
1319            data = self.PatternTree.GetItemPyData(item)
1320            UpdateNotebook(self,data)
1321        elif self.PatternTree.GetItemText(item) == 'Controls':
1322            self.PatternId = 0
1323            self.ExportPattern.Enable(False)
1324            data = self.PatternTree.GetItemPyData(item)
1325            if not data:           #fill in defaults
1326                data = {
1327                    #least squares controls
1328                    'deriv type':'analytic','min dM/M':0.0001,'shift factor':1.0,
1329                    #Fourier controls
1330                    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
1331                    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
1332                    #distance/angle controls
1333                    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
1334                self.PatternTree.SetItemPyData(item,data)                             
1335            self.Refine.Enable(True)
1336            self.SeqRefine.Enable(True)
1337            UpdateControls(self,data)
1338        elif self.PatternTree.GetItemText(item) == 'Sequental results':
1339            data = self.PatternTree.GetItemPyData(item)
1340            UpdateSeqResults(self,data)           
1341        elif self.PatternTree.GetItemText(item) == 'Covariance':
1342            data = self.PatternTree.GetItemPyData(item)
1343            G2plt.PlotCovariance(self)
1344        elif self.PatternTree.GetItemText(item) == 'Constraints':
1345            data = self.PatternTree.GetItemPyData(item)
1346            UpdateConstraints(self,data)
1347        elif self.PatternTree.GetItemText(item) == 'Restraints':
1348            data = self.PatternTree.GetItemPyData(item)
1349            UpdateRestraints(self,data)
1350        elif 'IMG' in self.PatternTree.GetItemText(item):
1351            self.Image = item
1352            G2plt.PlotImage(self,newPlot=True)
1353        elif 'PKS' in self.PatternTree.GetItemText(item):
1354            G2plt.PlotPowderLines(self)
1355        elif 'PWDR' in self.PatternTree.GetItemText(item):
1356            self.ExportPattern.Enable(True)
1357            G2plt.PlotPatterns(self,newPlot=True)
1358        elif 'HKLF' in self.PatternTree.GetItemText(item):
1359            self.Sngl = item
1360            G2plt.PlotSngl(self,newPlot=True)
1361        elif 'PDF' in self.PatternTree.GetItemText(item):
1362            self.PatternId = item
1363            self.ExportPDF.Enable(True)
1364            G2plt.PlotISFG(self,type='S(Q)')
1365           
1366    elif 'I(Q)' in self.PatternTree.GetItemText(item):
1367        self.PickId = item
1368        self.PatternId = self.PatternTree.GetItemParent(item)
1369        G2plt.PlotISFG(self,type='I(Q)',newPlot=True)
1370    elif 'S(Q)' in self.PatternTree.GetItemText(item):
1371        self.PickId = item
1372        self.PatternId = self.PatternTree.GetItemParent(item)
1373        G2plt.PlotISFG(self,type='S(Q)',newPlot=True)
1374    elif 'F(Q)' in self.PatternTree.GetItemText(item):
1375        self.PickId = item
1376        self.PatternId = self.PatternTree.GetItemParent(item)
1377        G2plt.PlotISFG(self,type='F(Q)',newPlot=True)
1378    elif 'G(R)' in self.PatternTree.GetItemText(item):
1379        self.PickId = item
1380        self.PatternId = self.PatternTree.GetItemParent(item)
1381        G2plt.PlotISFG(self,type='G(R)',newPlot=True)           
1382    elif self.PatternTree.GetItemText(parentID) == 'Phases':
1383        self.PickId = item
1384        data = self.PatternTree.GetItemPyData(item)           
1385        G2phG.UpdatePhaseData(self,item,data,oldPage)
1386    elif self.PatternTree.GetItemText(item) == 'Comments':
1387        self.PatternId = self.PatternTree.GetItemParent(item)
1388        self.PickId = item
1389        data = self.PatternTree.GetItemPyData(item)
1390        UpdateComments(self,data)
1391    elif self.PatternTree.GetItemText(item) == 'Image Controls':
1392        self.dataFrame.SetTitle('Image Controls')
1393        self.PickId = item
1394        self.Image = self.PatternTree.GetItemParent(item)
1395        masks = self.PatternTree.GetItemPyData(
1396            GetPatternTreeItemId(self,self.Image, 'Masks'))
1397        data = self.PatternTree.GetItemPyData(item)
1398        G2imG.UpdateImageControls(self,data,masks)
1399        G2plt.PlotImage(self)
1400    elif self.PatternTree.GetItemText(item) == 'Masks':
1401        self.dataFrame.SetTitle('Masks')
1402        self.PickId = item
1403        self.Image = self.PatternTree.GetItemParent(item)
1404        data = self.PatternTree.GetItemPyData(item)
1405        G2imG.UpdateMasks(self,data)
1406        G2plt.PlotImage(self)
1407    elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
1408        self.PickId = item
1409        self.Sngl = self.PatternTree.GetItemParent(item)
1410        data = self.PatternTree.GetItemPyData(item)
1411        UpdateHKLControls(self,data)
1412        G2plt.PlotSngl(self)
1413    elif self.PatternTree.GetItemText(item) == 'PDF Controls':
1414        self.PatternId = self.PatternTree.GetItemParent(item)
1415        self.ExportPDF.Enable(True)
1416        self.PickId = item
1417        data = self.PatternTree.GetItemPyData(item)
1418        G2pdG.UpdatePDFGrid(self,data)
1419        G2plt.PlotISFG(self,type='I(Q)')
1420        G2plt.PlotISFG(self,type='S(Q)')
1421        G2plt.PlotISFG(self,type='F(Q)')
1422        G2plt.PlotISFG(self,type='G(R)')
1423    elif self.PatternTree.GetItemText(item) == 'Peak List':
1424        self.PatternId = self.PatternTree.GetItemParent(item)
1425        self.ExportPeakList.Enable(True)
1426        self.PickId = item
1427        data = self.PatternTree.GetItemPyData(item)
1428        G2pdG.UpdatePeakGrid(self,data)
1429        G2plt.PlotPatterns(self)
1430    elif self.PatternTree.GetItemText(item) == 'Background':
1431        self.PatternId = self.PatternTree.GetItemParent(item)
1432        self.PickId = item
1433        data = self.PatternTree.GetItemPyData(item)
1434        G2pdG.UpdateBackgroundGrid(self,data)
1435        G2plt.PlotPatterns(self)
1436    elif self.PatternTree.GetItemText(item) == 'Limits':
1437        self.PatternId = self.PatternTree.GetItemParent(item)
1438        self.PickId = item
1439        data = self.PatternTree.GetItemPyData(item)
1440        G2pdG.UpdateLimitsGrid(self,data)
1441        G2plt.PlotPatterns(self)
1442    elif self.PatternTree.GetItemText(item) == 'Instrument Parameters':
1443        self.PatternId = self.PatternTree.GetItemParent(item)
1444        self.PickId = item
1445        data = self.PatternTree.GetItemPyData(item)
1446        G2pdG.UpdateInstrumentGrid(self,data)
1447        G2plt.PlotPeakWidths(self)
1448    elif self.PatternTree.GetItemText(item) == 'Sample Parameters':
1449        self.PatternId = self.PatternTree.GetItemParent(item)
1450        self.PickId = item
1451        data = self.PatternTree.GetItemPyData(item)
1452
1453        if 'Temperature' not in data:           #temp fix for old gpx files
1454            data = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],'DisplaceX':[0.0,False],
1455                'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,
1456                'Force':0.0,'Gonio. radius':200.0}
1457            self.PatternTree.SetItemPyData(item,data)
1458   
1459        G2pdG.UpdateSampleGrid(self,data)
1460        G2plt.PlotPatterns(self)
1461    elif self.PatternTree.GetItemText(item) == 'Index Peak List':
1462        self.PatternId = self.PatternTree.GetItemParent(item)
1463        self.ExportPeakList.Enable(True)
1464        self.PickId = item
1465        data = self.PatternTree.GetItemPyData(item)
1466        G2pdG.UpdateIndexPeaksGrid(self,data)
1467        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1468            G2plt.PlotPowderLines(self)
1469        else:
1470            G2plt.PlotPatterns(self)
1471    elif self.PatternTree.GetItemText(item) == 'Unit Cells List':
1472        self.PatternId = self.PatternTree.GetItemParent(item)
1473        self.PickId = item
1474        data = self.PatternTree.GetItemPyData(item)
1475        if not data:
1476            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
1477            data.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0])      #Bravais lattice flags
1478            data.append([])                                 #empty cell list
1479            data.append([])                                 #empty dmin
1480            self.PatternTree.SetItemPyData(item,data)                             
1481        G2pdG.UpdateUnitCellsGrid(self,data)
1482        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1483            G2plt.PlotPowderLines(self)
1484        else:
1485            G2plt.PlotPatterns(self)
1486    elif self.PatternTree.GetItemText(item) == 'Reflection Lists':
1487        self.PatternId = self.PatternTree.GetItemParent(item)
1488        self.PickId = item
1489        data = self.PatternTree.GetItemPyData(item)
1490        self.RefList = ''
1491        if len(data):
1492            self.RefList = data.keys()[0]
1493        G2pdG.UpdateReflectionGrid(self,data)
1494        G2plt.PlotPatterns(self)
1495     
Note: See TracBrowser for help on using the repository browser.