source: trunk/GSASIIgrid.py @ 468

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

changed self to G2frame everywhere in all "sub" files that use it
fixed creation of 'bak' files
now force save of a new gpx file before 1st peak fit so
GSAS.save is put in a sensible directory

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