source: trunk/GSASIIgrid.py @ 424

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

remove 'Back'ground from consideration for constraints
add a bit more for cell parms in seq refinements

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