source: trunk/GSASIIgrid.py @ 443

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

make sum powder profiles numpy arrays
change name UpdateBackgroundGrid? to UpdateBackground?
min size is 1 nanometer = 10A
implement diffuse scattering model for background
iso/aniso Size & Mustrain are now Size:i/a instead of 0/1

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