source: trunk/GSASIIgrid.py @ 425

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

get As from Dijs in seqdata plotting

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