source: branch/MPbranch/GSASIIpwdGUI.py

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

move FileDlgFixExt? to G2IO
begin to add a save selected seq results to file
move IO routines called in G2struct back there
remove wx stuff from G2pwd & G2struct
put progress bar in G2pwdGUI (not G2pwd)

  • Property svn:keywords set to Date Author Revision URL Id
File size: 96.4 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2012-02-13 17:33:35 +0000 (Mon, 13 Feb 2012) $
4# $Author: toby $
5# $Revision: 482 $
6# $URL: branch/MPbranch/GSASIIpwdGUI.py $
7# $Id: GSASIIpwdGUI.py 482 2012-02-13 17:33:35Z toby $
8########### SVN repository information ###################
9import wx
10import wx.grid as wg
11import numpy as np
12import math
13import time
14import copy
15import cPickle
16import GSASIIpath
17import GSASIIpwd as G2pwd
18import GSASIIlattice as G2lat
19import GSASIIspc as G2spc
20import GSASIIindex as G2indx
21import GSASIIplot as G2plt
22import GSASIIgrid as G2gd
23import GSASIIElem as G2elem
24
25VERY_LIGHT_GREY = wx.Colour(235,235,235)
26
27# trig functions in degrees
28sind = lambda x: math.sin(x*math.pi/180.)
29tand = lambda x: math.tan(x*math.pi/180.)
30cosd = lambda x: math.cos(x*math.pi/180.)
31asind = lambda x: 180.*math.asin(x)/math.pi
32   
33def IsHistogramInAnyPhase(G2frame,histoName):
34    phases = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Phases')
35    if phases:
36        item, cookie = G2frame.PatternTree.GetFirstChild(phases)
37        while item:
38            data = G2frame.PatternTree.GetItemPyData(item)
39            histoList = data['Histograms'].keys()
40            if histoName in histoList:
41                return True
42            item, cookie = G2frame.PatternTree.GetNextChild(phases, cookie)
43        return False
44    else:
45        return False
46
47def SetDefaultSample():
48    return {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],
49        'DisplaceX':[0.0,False],'DisplaceY':[0.0,False],'Diffuse':[],
50        'Temperature':300.,'Pressure':1.0,'Humidity':0.0,
51        'Voltage':0.0,'Force':0.0,'Gonio. radius':200.0,
52        'Omega':0.0,'Chi':0.0,'Phi':0.0}   
53       
54def UpdatePeakGrid(G2frame, data):
55    if G2frame.dataDisplay:
56        G2frame.dataFrame.Clear()
57   
58    def OnUnDo(event):
59        DoUnDo()
60        G2frame.dataFrame.UnDo.Enable(False)
61       
62    def DoUnDo():
63        print 'Undo last refinement'
64        file = open(G2frame.undofile,'rb')
65        PatternId = G2frame.PatternId
66        for item in ['Background','Instrument Parameters','Peak List']:
67            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, item),cPickle.load(file))
68            if G2frame.dataDisplay.GetName() == item:
69                if item == 'Background':
70                    UpdateBackground(G2frame,G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, item)))
71                elif item == 'Instrument Parameters':
72                    UpdateInstrumentGrid(G2frame,G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, item)))
73                elif item == 'Peak List':
74                    UpdatePeakGrid(G2frame,G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, item)))
75            print item,' recovered'
76        file.close()
77       
78    def SaveState():
79        G2frame.undofile = G2frame.dirname+'\\GSASII.save'
80        file = open(G2frame.undofile,'wb')
81        PatternId = G2frame.PatternId
82        for item in ['Background','Instrument Parameters','Peak List']:
83            cPickle.dump(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId,item)),file,1)
84        file.close()
85        G2frame.dataFrame.UnDo.Enable(True)
86       
87    def OnLSQPeakFit(event):
88        if not G2frame.GSASprojectfile:            #force a save of the gpx file so SaveState can wirte in the same directory
89            G2frame.OnFileSaveas(event)
90        OnPeakFit('LSQ')
91       
92    def OnOneCycle(event):
93        OnPeakFit('LSQ',oneCycle=True)
94       
95    def OnClearPeaks(event):
96        dlg = wx.MessageDialog(G2frame,'Delete all peaks?','Clear peak list',wx.OK|wx.CANCEL)
97        try:
98            if dlg.ShowModal() == wx.ID_OK:
99                peaks = []
100        finally:
101            dlg.Destroy()
102        UpdatePeakGrid(G2frame,peaks)
103        G2plt.PlotPatterns(G2frame)
104       
105    def OnPeakFit(FitPgm,oneCycle=False):
106        SaveState()
107        controls = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.root, 'Controls'))
108        if not controls:
109            controls = {'deriv type':'analytic','min dM/M':0.0001,}     #fill in defaults if needed
110        print 'Peak Fitting with '+controls['deriv type']+' derivatives:'
111        PatternId = G2frame.PatternId
112        PickId = G2frame.PickId
113        peaks = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Peak List'))
114        if not peaks:
115            G2frame.ErrorDialog('No peaks!','Nothing to fit!')
116            return
117        background = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Background'))
118        limits = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Limits'))[1]
119        inst = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Instrument Parameters'))
120        data = G2frame.PatternTree.GetItemPyData(PatternId)[1]
121        wx.BeginBusyCursor()
122        dlg = wx.ProgressDialog('Residual','Peak fit Rwp = ',101.0, 
123            style = wx.PD_ELAPSED_TIME|wx.PD_AUTO_HIDE|wx.PD_REMAINING_TIME|wx.PD_CAN_ABORT)
124        screenSize = wx.ClientDisplayRect()
125        Size = dlg.GetSize()
126        dlg.SetPosition(wx.Point(screenSize[2]-Size[0]-305,screenSize[1]+5))
127        try:
128            G2pwd.DoPeakFit(FitPgm,peaks,background,limits,inst,data,oneCycle,controls,dlg)
129        finally:
130            wx.EndBusyCursor()   
131        UpdatePeakGrid(G2frame,peaks)
132        G2plt.PlotPatterns(G2frame)
133        print 'finished'
134        return
135       
136    def OnResetSigGam(event):
137        PatternId = G2frame.PatternId
138        PickId = G2frame.PickId
139        peaks = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Peak List'))
140        if not peaks:
141            G2frame.ErrorDialog('No peaks!','Nothing to do!')
142            return
143        inst = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Instrument Parameters'))
144        Inst = dict(zip(inst[3],inst[1]))
145        print len(Inst['Type'])
146        for peak in peaks:
147            if Inst['Type'] in ['PXC','PNC']:
148                peak[4] = Inst['U']*tand(peak[0]/2.0)**2+Inst['V']*tand(peak[0]/2.0)+Inst['W']
149                peak[6] = Inst['X']/cosd(peak[0]/2.0)+Inst['Y']*tand(peak[0]/2.0)
150        UpdatePeakGrid(G2frame,peaks)
151               
152    def RefreshPeakGrid(event):
153        r,c =  event.GetRow(),event.GetCol()
154       
155        event.StopPropagation()
156        data = G2frame.PeakTable.GetData()
157        T = []
158        for peak in data:T.append(peak[0])
159        D = dict(zip(T,data))
160        T.sort()
161        X = []
162        for key in T: X.append(D[key])
163        data = X       
164       
165    def setBackgroundColors():
166       for r in range(G2frame.dataDisplay.GetNumberRows()):
167           for c in range(G2frame.dataDisplay.GetNumberCols()):
168               if G2frame.dataDisplay.GetColLabelValue(c) in ['position','intensity','sigma','gamma']:
169                   if float(G2frame.dataDisplay.GetCellValue(r,c)) < 0.:
170                       G2frame.dataDisplay.SetCellBackgroundColour(r,c,wx.RED)
171                   else:
172                       G2frame.dataDisplay.SetCellBackgroundColour(r,c,wx.WHITE)
173                                                 
174    def KeyEditPeakGrid(event):
175        rowList = G2frame.dataDisplay.GetSelectedRows()
176        colList = G2frame.dataDisplay.GetSelectedCols()
177        selectList = G2frame.dataDisplay.GetSelectedCells()
178        data = G2frame.PatternTree.GetItemPyData(G2frame.PickId)
179        if event.GetKeyCode() == wx.WXK_RETURN:
180            event.Skip(True)
181        elif event.GetKeyCode() == wx.WXK_CONTROL:
182            event.Skip(True)
183        elif event.GetKeyCode() == wx.WXK_SHIFT:
184            event.Skip(True)
185        elif rowList:
186            G2frame.dataDisplay.ClearSelection()
187            if event.GetKeyCode() == wx.WXK_DELETE:
188                G2frame.dataDisplay.ClearGrid()
189                rowList.reverse()
190                nDel = 0
191                for row in rowList:
192                    G2frame.PeakTable.DeleteRow(row)
193                    nDel += 1
194                if nDel:
195                    msg = wg.GridTableMessage(G2frame.PeakTable, 
196                        wg.GRIDTABLE_NOTIFY_ROWS_DELETED,0,nDel)
197                    G2frame.dataDisplay.ProcessTableMessage(msg)
198                data = G2frame.PeakTable.GetData()
199                G2frame.PatternTree.SetItemPyData(G2frame.PickId,data[:-nDel])
200                G2frame.dataDisplay.ForceRefresh()
201                setBackgroundColors()
202                if not len(G2frame.PatternTree.GetItemPyData(G2frame.PickId)): 
203                    G2frame.dataFrame.PeakFit.Enable(False)
204                       
205        elif colList:
206            G2frame.dataDisplay.ClearSelection()
207            key = event.GetKeyCode()
208            for col in colList:
209                if G2frame.PeakTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
210                    if key == 89: #'Y'
211                        for row in range(G2frame.PeakTable.GetNumberRows()): data[row][col]=True
212                    elif key == 78:  #'N'
213                        for row in range(G2frame.PeakTable.GetNumberRows()): data[row][col]=False
214        elif selectList:
215            G2frame.dataDisplay.ClearSelection()
216            key = event.GetKeyCode()
217            for row,col in selectList:
218                if G2frame.PeakTable.GetTypeName(row,col) == wg.GRID_VALUE_BOOL:
219                    if key == 89: #'Y'
220                        data[row][col]=True
221                    elif key == 78:  #'N'
222                        data[row][col]=False
223        G2plt.PlotPatterns(G2frame)
224           
225    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.PeakMenu)
226    if not G2frame.dataFrame.GetStatusBar():
227        Status = G2frame.dataFrame.CreateStatusBar()
228    G2frame.Bind(wx.EVT_MENU, OnUnDo, id=G2gd.wxID_UNDO)
229    G2frame.Bind(wx.EVT_MENU, OnLSQPeakFit, id=G2gd.wxID_LSQPEAKFIT)
230    G2frame.Bind(wx.EVT_MENU, OnOneCycle, id=G2gd.wxID_LSQONECYCLE)
231    G2frame.Bind(wx.EVT_MENU, OnClearPeaks, id=G2gd.wxID_CLEARPEAKS)
232    G2frame.Bind(wx.EVT_MENU, OnResetSigGam, id=G2gd.wxID_RESETSIGGAM)
233    G2frame.dataFrame.PeakFit.Enable(False)
234    if data:
235        G2frame.dataFrame.PeakFit.Enable(True)
236        G2frame.dataFrame.PFOneCycle.Enable(True)
237    G2frame.PickTable = []
238    rowLabels = []
239    for i in range(len(data)): rowLabels.append(str(i+1))
240    colLabels = ['position','refine','intensity','refine','sigma','refine','gamma','refine']
241    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_BOOL,
242        wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
243        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL,
244        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL]
245    T = []
246    for peak in data:
247        T.append(peak[0])
248    D = dict(zip(T,data))
249    T.sort()
250    X = []
251    for key in T: X.append(D[key])
252    data = X       
253    G2frame.PatternTree.SetItemPyData(G2frame.PickId,data)
254    G2frame.PeakTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
255    G2frame.dataFrame.SetLabel('Peak List')
256    G2frame.dataDisplay = G2gd.GSGrid(parent=G2frame.dataFrame)
257    G2frame.dataDisplay.SetTable(G2frame.PeakTable, True)
258    setBackgroundColors()                         
259    G2frame.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshPeakGrid)
260    G2frame.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPeakGrid)
261    G2frame.dataDisplay.SetMargins(0,0)
262    G2frame.dataDisplay.AutoSizeColumns(False)
263    G2frame.dataFrame.setSizePosLeft([535,350])
264       
265def UpdateBackground(G2frame,data):
266    if len(data) < 2:       #add Debye diffuse & peaks scattering here
267        data.append({'nDebye':0,'debyeTerms':[],'nPeaks':0,'peaksList':[]})
268    if 'nPeaks' not in data[1]:
269        data[1].update({'nPeaks':0,'peaksList':[]})
270    ValObj = {}
271           
272    def OnBackCopy(event):
273        histList = ['All',]+G2gd.GetPatternTreeDataNames(G2frame,['PWDR',])
274        copyList = []
275        dlg = wx.MultiChoiceDialog(G2frame, 
276            'Copy parameters to which histograms?', 'Copy parameters', 
277            histList, wx.CHOICEDLG_STYLE)
278        try:
279            if dlg.ShowModal() == wx.ID_OK:
280                result = dlg.GetSelections()
281                for i in result: 
282                    copyList.append(histList[i])
283                if 'All' in copyList: 
284                    copyList = histList[1:]
285            for item in copyList:
286                Id = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,item)
287                G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Background'),
288                    copy.copy(data))
289        finally:
290            dlg.Destroy()
291       
292    def BackSizer():
293       
294        def OnNewType(event):
295            data[0][0] = bakType.GetValue()
296           
297        def OnBakRef(event):
298            data[0][1] = bakRef.GetValue()
299           
300        def OnBakTerms(event):
301            data[0][2] = int(bakTerms.GetValue())
302            M = len(data[0])
303            N = data[0][2]+3
304            item = data[0]
305            if N > M:       #add terms
306                for i in range(M,N): 
307                    item.append(0.0)
308            elif N < M:     #delete terms
309                for i in range(N,M):
310                    del(item[-1])
311            G2frame.PatternTree.SetItemPyData(BackId,data)
312            UpdateBackground(G2frame,data)
313           
314        def OnBakVal(event):
315            Obj = event.GetEventObject()
316            item = ValObj[Obj.GetId()][0]
317            try:
318                value = float(Obj.GetValue())
319            except ValueError:
320                value = data[0][item]
321            data[0][item] = value
322            Obj.SetValue('%10.4f'%(value))
323       
324        backSizer = wx.BoxSizer(wx.VERTICAL)
325        topSizer = wx.BoxSizer(wx.HORIZONTAL)
326        topSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Background function: '),0,wx.ALIGN_CENTER_VERTICAL)
327        bakType = wx.ComboBox(G2frame.dataDisplay,value=data[0][0],
328                choices=Choices,style=wx.CB_READONLY|wx.CB_DROPDOWN)
329        bakType.Bind(wx.EVT_COMBOBOX, OnNewType)
330        topSizer.Add(bakType)
331        topSizer.Add((5,0),0)
332        bakRef = wx.CheckBox(G2frame.dataDisplay,label=' Refine?')
333        bakRef.SetValue(bool(data[0][1]))
334        bakRef.Bind(wx.EVT_CHECKBOX, OnBakRef)
335        topSizer.Add(bakRef,0,wx.ALIGN_CENTER_VERTICAL)
336        topSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' No. coeff.: '),0,wx.ALIGN_CENTER_VERTICAL)
337        bakTerms = wx.ComboBox(G2frame.dataDisplay,-1,value=str(data[0][2]),choices=[str(i+1) for i in range(36)],
338            style=wx.CB_READONLY|wx.CB_DROPDOWN)
339        bakTerms.Bind(wx.EVT_COMBOBOX,OnBakTerms)
340        topSizer.Add(bakTerms,0,wx.ALIGN_CENTER_VERTICAL)
341        topSizer.Add((5,0),0)
342        backSizer.Add(topSizer)
343        backSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Background coefficients:'),0,wx.ALIGN_CENTER_VERTICAL)
344        bakSizer = wx.FlexGridSizer(1,5,5,5)
345        for i,value in enumerate(data[0][3:]):
346            bakVal = wx.TextCtrl(G2frame.dataDisplay,wx.ID_ANY,'%10.4f'%(value),style=wx.TE_PROCESS_ENTER)
347            bakSizer.Add(bakVal,0,wx.ALIGN_CENTER_VERTICAL)
348            ValObj[bakVal.GetId()] = [i+3]
349            bakVal.Bind(wx.EVT_TEXT_ENTER,OnBakVal)
350            bakVal.Bind(wx.EVT_KILL_FOCUS,OnBakVal)
351        backSizer.Add(bakSizer)
352        return backSizer
353       
354    def DebyeSizer():
355       
356        def OnDebTerms(event):
357            data[1]['nDebye'] = int(debTerms.GetValue())
358            M = len(data[1]['debyeTerms'])
359            N = data[1]['nDebye']
360            if N > M:       #add terms
361                for i in range(M,N): 
362                    data[1]['debyeTerms'].append([1.0,False,1.0,False,0.010,False])
363            elif N < M:     #delete terms
364                for i in range(N,M):
365                    del(data[1]['debyeTerms'][-1])
366            UpdateBackground(G2frame,data)
367
368        def KeyEditPeakGrid(event):
369            colList = debyeGrid.GetSelectedCols()
370            if event.GetKeyCode() == wx.WXK_RETURN:
371                event.Skip(True)
372            elif event.GetKeyCode() == wx.WXK_CONTROL:
373                event.Skip(True)
374            elif event.GetKeyCode() == wx.WXK_SHIFT:
375                event.Skip(True)
376            elif colList:
377                debyeGrid.ClearSelection()
378                key = event.GetKeyCode()
379                for col in colList:
380                    if debyeTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
381                        if key == 89: #'Y'
382                            for row in range(debyeGrid.GetNumberRows()): data[1]['debyeTerms'][row][col]=True
383                        elif key == 78:  #'N'
384                            for row in range(debyeGrid.GetNumberRows()): data[1]['debyeTerms'][row][col]=False
385
386       
387        debSizer = wx.BoxSizer(wx.VERTICAL)
388        topSizer = wx.BoxSizer(wx.HORIZONTAL)
389        topSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Debye scattering: '),0,wx.ALIGN_CENTER_VERTICAL)
390        topSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' No. coeff.: '),0,wx.ALIGN_CENTER_VERTICAL)
391        debTerms = wx.ComboBox(G2frame.dataDisplay,-1,value=str(data[1]['nDebye']),choices=[str(i) for i in range(12)],
392            style=wx.CB_READONLY|wx.CB_DROPDOWN)
393        debTerms.Bind(wx.EVT_COMBOBOX,OnDebTerms)
394        topSizer.Add(debTerms,0,wx.ALIGN_CENTER_VERTICAL)
395        topSizer.Add((5,0),0)
396        debSizer.Add(topSizer)
397        if data[1]['nDebye']:
398            debSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Debye diffuse terms:'),0,wx.ALIGN_CENTER_VERTICAL)       
399            rowLabels = []
400            for i in range(len(data[1]['debyeTerms'])): rowLabels.append(str(i))
401            colLabels = ['A','refine','R','refine','U','refine']
402            Types = [wg.GRID_VALUE_FLOAT+':10,2',wg.GRID_VALUE_BOOL,
403            wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_BOOL,
404            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL]
405            debyeTable = G2gd.Table(data[1]['debyeTerms'],rowLabels=rowLabels,colLabels=colLabels,types=Types)
406            debyeGrid = G2gd.GSGrid(parent=G2frame.dataDisplay)
407            debyeGrid.SetTable(debyeTable, True)
408            debyeGrid.Bind(wx.EVT_KEY_DOWN, KeyEditPeakGrid)
409            debyeGrid.AutoSizeColumns(False)
410            debSizer.Add(debyeGrid)       
411        return debSizer
412     
413    def PeaksSizer():
414
415        def OnPeaks(event):
416            data[1]['nPeaks'] = int(peaks.GetValue())
417            M = len(data[1]['peaksList'])
418            N = data[1]['nPeaks']
419            if N > M:       #add terms
420                for i in range(M,N): 
421                    data[1]['peaksList'].append([1.0,False,1.0,False,0.10,False,0.10,False])
422            elif N < M:     #delete terms
423                for i in range(N,M):
424                    del(data[1]['peaksList'][-1])
425            UpdateBackground(G2frame,data)
426
427        def KeyEditPeakGrid(event):
428            colList = peaksGrid.GetSelectedCols()
429            if event.GetKeyCode() == wx.WXK_RETURN:
430                event.Skip(True)
431            elif event.GetKeyCode() == wx.WXK_CONTROL:
432                event.Skip(True)
433            elif event.GetKeyCode() == wx.WXK_SHIFT:
434                event.Skip(True)
435            elif colList:
436                peaksGrid.ClearSelection()
437                key = event.GetKeyCode()
438                for col in colList:
439                    if peaksTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
440                        if key == 89: #'Y'
441                            for row in range(peaksGrid.GetNumberRows()): data[1]['peaksList'][row][col]=True
442                        elif key == 78:  #'N'
443                            for row in range(peaksGrid.GetNumberRows()): data[1]['peaksList'][row][col]=False
444
445        peaksSizer = wx.BoxSizer(wx.VERTICAL)
446        topSizer = wx.BoxSizer(wx.HORIZONTAL)
447        topSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Peaks in background: '),0,wx.ALIGN_CENTER_VERTICAL)
448        topSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' No. peaks: '),0,wx.ALIGN_CENTER_VERTICAL)
449        peaks = wx.ComboBox(G2frame.dataDisplay,-1,value=str(data[1]['nPeaks']),choices=[str(i) for i in range(12)],
450            style=wx.CB_READONLY|wx.CB_DROPDOWN)
451        peaks.Bind(wx.EVT_COMBOBOX,OnPeaks)
452        topSizer.Add(peaks,0,wx.ALIGN_CENTER_VERTICAL)
453        topSizer.Add((5,0),0)
454        peaksSizer.Add(topSizer)
455        if data[1]['nPeaks']:
456            peaksSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Peak list:'),0,wx.ALIGN_CENTER_VERTICAL)       
457            rowLabels = []
458            for i in range(len(data[1]['peaksList'])): rowLabels.append(str(i))
459            colLabels = ['pos','refine','int','refine','sig','refine','gam','refine']
460            Types = [wg.GRID_VALUE_FLOAT+':10,2',wg.GRID_VALUE_BOOL,
461            wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_BOOL,
462            wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_BOOL,
463            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL]
464            peaksTable = G2gd.Table(data[1]['peaksList'],rowLabels=rowLabels,colLabels=colLabels,types=Types)
465            peaksGrid = G2gd.GSGrid(parent=G2frame.dataDisplay)
466            peaksGrid.SetTable(peaksTable, True)
467            peaksGrid.Bind(wx.EVT_KEY_DOWN, KeyEditPeakGrid)
468            peaksGrid.AutoSizeColumns(False)
469            peaksSizer.Add(peaksGrid)       
470        return peaksSizer
471               
472    if G2frame.dataDisplay:
473        G2frame.dataFrame.Clear()
474    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
475    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.BackMenu)
476    G2frame.dataFrame.SetLabel('Background')
477    if not G2frame.dataFrame.GetStatusBar():
478        Status = G2frame.dataFrame.CreateStatusBar()
479    G2frame.Bind(wx.EVT_MENU,OnBackCopy,id=G2gd.wxID_BACKCOPY)
480    BackId = G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Background')
481    Choices = ['chebyschev','cosine','lin interpolate','inv interpolate','log interpolate']
482    mainSizer = wx.BoxSizer(wx.VERTICAL)
483    mainSizer.Add(BackSizer())
484    mainSizer.Add((0,5),0)
485    mainSizer.Add(DebyeSizer())
486    mainSizer.Add((0,5),0)
487    mainSizer.Add(PeaksSizer())
488    mainSizer.Layout()   
489    G2frame.dataDisplay.SetSizer(mainSizer)
490    G2frame.dataFrame.setSizePosLeft(mainSizer.Fit(G2frame.dataFrame))
491       
492def UpdateLimitsGrid(G2frame, data):
493    if G2frame.dataDisplay:
494        G2frame.dataFrame.Clear()
495       
496    def RefreshLimitsGrid(event):
497        event.StopPropagation()
498        data = G2frame.LimitsTable.GetData()
499        old = data[0]
500        new = data[1]
501        new[0] = max(old[0],new[0])
502        new[1] = max(new[0],min(old[1],new[1]))
503        data = [old,new]
504        G2plt.PlotPatterns(G2frame)
505       
506    def OnLimitCopy(event):
507        histList = ['All',]+G2gd.GetPatternTreeDataNames(G2frame,['PWDR',])
508        copyList = []
509        dlg = wx.MultiChoiceDialog(G2frame, 
510            'Copy limits to which histograms?', 'Copy limits', 
511            histList, wx.CHOICEDLG_STYLE)
512        try:
513            if dlg.ShowModal() == wx.ID_OK:
514                result = dlg.GetSelections()
515                for i in result: 
516                    copyList.append(histList[i])
517                if 'All' in copyList: 
518                    copyList = histList[1:]
519            for item in copyList:
520                Id = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,item)
521                G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Limits'),
522                    copy.copy(data))
523        finally:
524            dlg.Destroy()
525       
526    G2frame.LimitsTable = []
527    colLabels = ['Tmin','Tmax']
528    rowLabels = ['original','changed']
529    Types = 2*[wg.GRID_VALUE_FLOAT+':10,3',]
530    G2frame.LimitsTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
531    G2frame.dataFrame.SetLabel('Limits')
532    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.LimitMenu)
533    if not G2frame.dataFrame.GetStatusBar():
534        Status = G2frame.dataFrame.CreateStatusBar()
535    G2frame.Bind(wx.EVT_MENU,OnLimitCopy,id=G2gd.wxID_LIMITCOPY)
536    G2frame.dataDisplay = G2gd.GSGrid(parent=G2frame.dataFrame)
537    G2frame.dataDisplay.SetTable(G2frame.LimitsTable, True)
538    G2frame.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshLimitsGrid)               
539    G2frame.dataDisplay.SetMargins(0,0)
540    G2frame.dataDisplay.AutoSizeColumns(False)
541    G2frame.dataFrame.setSizePosLeft([230,160])
542   
543def UpdateInstrumentGrid(G2frame,data):
544    if len(data) > 3:                   #powder data
545        insVal = dict(zip(data[3],data[1]))
546        insDef = dict(zip(data[3],data[0]))
547        insRef = dict(zip(data[3],data[2]))
548        if 'N' in insDef['Type']:
549            del(insDef['Polariz.'])
550            del(insVal['Polariz.'])
551            del(insRef['Polariz.'])
552    else:                               #single crystal data
553        insVal = dict(zip(data[2],data[1]))
554        insDef = dict(zip(data[2],data[0]))
555        insRef = {}
556    ValObj = {}
557    RefObj = {}
558    waves = {'CuKa':[1.54051,1.54433],'TiKa':[2.74841,2.75207],'CrKa':[2.28962,2.29351],
559        'FeKa':[1.93597,1.93991],'CoKa':[1.78892,1.79278],'MoKa':[0.70926,0.713543],
560        'AgKa':[0.559363,0.563775]}
561       
562    def inst2data(inst,ref,data):
563        if len(data) > 3:
564            for i,item in enumerate(data[3]):
565                try:
566                    data[1][i] = inst[item]
567                    data[2][i] = ref[item]
568                except KeyError:
569                    data[1][i] = 0
570                    data[2][i] = 0                   
571        else:
572            for i,item in enumerate(data[2]):
573                data[1][i] = inst[item]           
574        return data
575       
576    def updateData(inst,ref):
577        return inst2data(inst,ref,G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,
578            G2frame.PatternId,'Instrument Parameters')))       
579   
580    def RefreshInstrumentGrid(event,doAnyway=False):
581        if doAnyway or event.GetRow() == 1:
582            peaks = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Peak List'))
583            if 'P' in insVal['Type']:                                       #update powder peak parameters
584                for peak in peaks:
585                    peak[4] = insVal['U']*tand(peak[0]/2.0)**2+insVal['V']*tand(peak[0]/2.0)+insVal['W']
586                    peak[6] = insVal['X']/cosd(peak[0]/2.0)+insVal['Y']*tand(peak[0]/2.0)
587                                               
588    def OnReset(event):
589        insVal.update(insDef)
590        data = updateData(insVal,insRef)
591        RefreshInstrumentGrid(event,doAnyway=True)          #to get peaks updated
592        UpdateInstrumentGrid(G2frame,data)
593       
594    def OnInstCopy(event):
595        histList = ['All',]+G2gd.GetPatternTreeDataNames(G2frame,['PWDR',])
596        copyList = []
597        dlg = wx.MultiChoiceDialog(G2frame, 
598            'Copy parameters to which histograms?', 'Copy parameters', 
599            histList, wx.CHOICEDLG_STYLE)
600        try:
601            if dlg.ShowModal() == wx.ID_OK:
602                result = dlg.GetSelections()
603                for i in result: 
604                    copyList.append(histList[i])
605                if 'All' in copyList: 
606                    copyList = histList[1:]
607            for item in copyList:
608                Id = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,item)
609                instData = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Instrument Parameters'))
610                if len(data) == len(instData):                          #don't mix lam & lam1/lam2 parms!
611                    for i,item in enumerate(data[1:]):                  #skip default values in tuple
612                        instData[i+1][:-1] = copy.copy(item[:-1])       #skip azimuth at end
613                else:
614                    print item+' not copied - instrument parameters not commensurate'
615        finally:
616            dlg.Destroy()
617       
618    def OnWaveChange(event):
619        if 'Lam' in insVal:           
620            data[0] = data[0][:1]+tuple(waves['CuKa'])+(.5,)+data[0][2:]
621            data[1] = data[1][:1]+waves['CuKa']+[.5,]+data[1][2:]
622            data[2] = data[2][:1]+[0,0,0,]+data[2][2:]
623            data[3] = data[3][:1]+['Lam1','Lam2','I(L2)/I(L1)',]+data[3][2:]           
624        else:
625            data[0] = data[0][:2]+data[0][4:]
626            data[1] = data[1][:2]+data[1][4:]
627            data[2] = data[2][:2]+data[2][4:]
628            data[3] = data[3][:1]+['Lam',]+data[3][4:]           
629        UpdateInstrumentGrid(G2frame,data)
630               
631    def OnNewType(event):
632        insVal['Type'] = typePick.GetValue()
633        data = updateData(insVal,insRef)
634        UpdateInstrumentGrid(G2frame,data)
635       
636    def OnLamPick(event):
637        lamType = lamPick.GetValue()
638        insVal['Lam1'] = waves[lamType][0]
639        insVal['Lam2'] = waves[lamType][1]
640        data = updateData(insVal,insRef)
641        UpdateInstrumentGrid(G2frame,data)
642                 
643    def OnRatValue(event):
644        try:
645            value = float(ratVal.GetValue())
646            if value < 0:
647                raise ValueError
648        except ValueError:
649            value = insVal['I(L2)/I(L1)']
650        insVal['I(L2)/I(L1)'] = value
651        ratVal.SetValue('%10.4f'%(value))
652        data = updateData(insVal,insRef)
653       
654    def OnRatRef(event):
655        insRef['I(L2)/I(L1)'] = ratRef.GetValue()
656        data = updateData(insVal,insRef)
657       
658    def OnWaveValue(event):
659        try:
660            value = float(waveVal.GetValue())
661            if value < 0:
662                raise ValueError
663        except ValueError:
664            value = insVal['Lam']
665        insVal['Lam'] = value
666        waveVal.SetValue('%10.6f'%(value))
667        data = updateData(insVal,insRef)
668       
669    def OnWaveRef(event):
670        insRef['Lam'] = waveRef.GetValue()
671        data = updateData(insVal,insRef)
672       
673    def OnItemValue(event):
674        Obj = event.GetEventObject()
675        item,fmt = ValObj[Obj.GetId()]
676        try:
677            value = float(Obj.GetValue())
678        except ValueError:
679            value = insVal[item]
680        insVal[item] = value
681        Obj.SetValue(fmt%(value))
682        data = updateData(insVal,insRef)
683       
684    def OnItemRef(event):
685        Obj = event.GetEventObject()
686        item = RefObj[Obj.GetId()]
687        insRef[item] = Obj.GetValue()
688        data = updateData(insVal,insRef)
689               
690    if G2frame.dataDisplay:
691        G2frame.dataFrame.Clear()
692    histoName = G2frame.PatternTree.GetItemPyData(G2frame.PatternId)[-1]
693    ifHisto = IsHistogramInAnyPhase(G2frame,histoName)
694    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.BlankMenu)
695    G2frame.dataFrame.SetLabel('Instrument Parameters')
696    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
697    instSizer = wx.FlexGridSizer(2,6,5,5)
698    instSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Histogram Type:'),0,wx.ALIGN_CENTER_VERTICAL)
699    if 'P' in insVal['Type']:                   #powder data
700        G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.InstMenu)
701        if not G2frame.dataFrame.GetStatusBar():
702            Status = G2frame.dataFrame.CreateStatusBar()
703        G2frame.Bind(wx.EVT_MENU,OnReset,id=G2gd.wxID_INSTPRMRESET)
704        G2frame.Bind(wx.EVT_MENU,OnInstCopy,id=G2gd.wxID_INSTCOPY)
705        G2frame.Bind(wx.EVT_MENU,OnWaveChange,id=G2gd.wxID_CHANGEWAVETYPE)       
706        typePick = wx.ComboBox(G2frame.dataDisplay,value=insVal['Type'],
707            choices=['PXC','PNC','PNT'],style=wx.CB_READONLY|wx.CB_DROPDOWN)
708        typePick.Bind(wx.EVT_COMBOBOX, OnNewType)
709        instSizer.Add(typePick,0,wx.ALIGN_CENTER_VERTICAL)
710        if 'C' in insVal['Type']:               #constant wavelength
711            #patch
712            if 'Azimuth' not in insVal:
713                insVal['Azimuth'] = 0.0
714                insDef['Azimuth'] = 0.0
715                insRef['Azimuth'] = False
716            #end of patch
717            instSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Azimuth: %7.2f'%(insVal['Azimuth'])),0,wx.ALIGN_CENTER_VERTICAL)
718            if 'Lam1' in insVal:
719                instSizer.Add((5,5),0)
720                instSizer.Add((5,5),0)
721                instSizer.Add((5,5),0)
722                instSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Ka1/Ka2:'),
723                        0,wx.ALIGN_CENTER_VERTICAL)
724                instSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,'%8.6f/%8.6f'%(insVal['Lam1'],insVal['Lam2'])),
725                        0,wx.ALIGN_CENTER_VERTICAL)
726                waveSizer = wx.BoxSizer(wx.HORIZONTAL)
727                waveSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,'Select:'),0,wx.ALIGN_CENTER_VERTICAL)
728                choice = ['TiKa','CrKa','FeKa','CoKa','CuKa','MoKa','AgKa']
729                lamPick = wx.ComboBox(G2frame.dataDisplay,value=' ',choices=choice,style=wx.CB_READONLY|wx.CB_DROPDOWN)
730                lamPick.Bind(wx.EVT_COMBOBOX, OnLamPick)
731                waveSizer.Add(lamPick,0)
732                instSizer.Add(waveSizer,0)
733                instSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' I(L2)/I(L1): (%10.4f)'%(insDef['I(L2)/I(L1)'])),
734                        0,wx.ALIGN_CENTER_VERTICAL)
735                ratVal = wx.TextCtrl(G2frame.dataDisplay,wx.ID_ANY,'%10.4f'%(insVal['I(L2)/I(L1)']),style=wx.TE_PROCESS_ENTER)
736                ratVal.Bind(wx.EVT_TEXT_ENTER,OnRatValue)
737                ratVal.Bind(wx.EVT_KILL_FOCUS,OnRatValue)
738                instSizer.Add(ratVal,0)
739                ratRef = wx.CheckBox(G2frame.dataDisplay,label=' Refine?')
740                ratRef.SetValue(bool(insRef['I(L2)/I(L1)']))
741                ratRef.Bind(wx.EVT_CHECKBOX, OnRatRef)
742                instSizer.Add(ratRef,0,wx.ALIGN_CENTER_VERTICAL)
743               
744            else:
745                instSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Lam: (%10.6f)'%(insDef['Lam'])),
746                    0,wx.ALIGN_CENTER_VERTICAL)
747                waveVal = wx.TextCtrl(G2frame.dataDisplay,wx.ID_ANY,'%10.6f'%(insVal['Lam']),style=wx.TE_PROCESS_ENTER)
748                waveVal.Bind(wx.EVT_TEXT_ENTER,OnWaveValue)
749                waveVal.Bind(wx.EVT_KILL_FOCUS,OnWaveValue)
750                instSizer.Add(waveVal,0,wx.ALIGN_CENTER_VERTICAL)
751                if ifHisto:
752                    waveRef = wx.CheckBox(G2frame.dataDisplay,label=' Refine?')
753                    waveRef.SetValue(bool(insRef['Lam']))
754                    waveRef.Bind(wx.EVT_CHECKBOX, OnWaveRef)
755                    instSizer.Add(waveRef,0,wx.ALIGN_CENTER_VERTICAL)
756                else:
757                    instSizer.Add((5,5),0)
758            for item in ['Zero','Polariz.']:
759                fmt = '%10.4f'
760                Fmt = ' %s: ('+fmt+')'
761                if item in insDef:
762                    instSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,Fmt%(item,insDef[item])),
763                            0,wx.ALIGN_CENTER_VERTICAL)
764                    itemVal = wx.TextCtrl(G2frame.dataDisplay,wx.ID_ANY,fmt%(insVal[item]),style=wx.TE_PROCESS_ENTER)
765                    ValObj[itemVal.GetId()] = [item,fmt]
766                    itemVal.Bind(wx.EVT_TEXT_ENTER,OnItemValue)
767                    itemVal.Bind(wx.EVT_KILL_FOCUS,OnItemValue)
768                    instSizer.Add(itemVal,0,wx.ALIGN_CENTER_VERTICAL)
769                    if ifHisto:
770                        itemRef = wx.CheckBox(G2frame.dataDisplay,wx.ID_ANY,label=' Refine?')
771                        itemRef.SetValue(bool(insRef[item]))
772                        RefObj[itemRef.GetId()] = item
773                        itemRef.Bind(wx.EVT_CHECKBOX, OnItemRef)
774                        instSizer.Add(itemRef,0,wx.ALIGN_CENTER_VERTICAL)
775                    else:
776                        instSizer.Add((5,5),0)
777                else:                           #skip Polariz. for neutrons
778                    instSizer.Add((5,5),0)
779                    instSizer.Add((5,5),0)
780                    instSizer.Add((5,5),0)
781            for item in ['U','V','W','X','Y','SH/L']:
782                fmt = '%10.3f'
783                if item == 'SH/L':
784                    fmt = '%10.5f'
785                Fmt = ' %s: ('+fmt+')'
786                instSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,Fmt%(item,insDef[item])),
787                        0,wx.ALIGN_CENTER_VERTICAL)
788                itemVal = wx.TextCtrl(G2frame.dataDisplay,wx.ID_ANY,fmt%(insVal[item]),style=wx.TE_PROCESS_ENTER)
789                ValObj[itemVal.GetId()] = [item,fmt]
790                itemVal.Bind(wx.EVT_TEXT_ENTER,OnItemValue)
791                itemVal.Bind(wx.EVT_KILL_FOCUS,OnItemValue)
792                instSizer.Add(itemVal,0,wx.ALIGN_CENTER_VERTICAL)
793                itemRef = wx.CheckBox(G2frame.dataDisplay,wx.ID_ANY,label=' Refine?')
794                itemRef.SetValue(bool(insRef[item]))
795                RefObj[itemRef.GetId()] = item
796                itemRef.Bind(wx.EVT_CHECKBOX, OnItemRef)
797                instSizer.Add(itemRef,0,wx.ALIGN_CENTER_VERTICAL)
798        else:                                   #time of flight (neutrons)
799            pass                                #for now
800       
801       
802
803    else:                       #single crystal data
804        typePick = wx.ComboBox(G2frame.dataDisplay,value=insVal['Type'],
805            choices=['SXC','SNC','SNT'],style=wx.CB_READONLY|wx.CB_DROPDOWN)
806        typePick.Bind(wx.EVT_COMBOBOX, OnNewType)
807        instSizer.Add(typePick,0,wx.ALIGN_CENTER_VERTICAL)
808        if 'C' in insVal['Type']:               #constant wavelength
809            instSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Lam: %10.6f'%(insDef['Lam'])),
810                    0,wx.ALIGN_CENTER_VERTICAL)
811        else:                                   #time of flight (neutrons)
812            pass                                #for now
813       
814    mainSizer = wx.BoxSizer(wx.VERTICAL)
815    mainSizer.Add(instSizer,0)
816    mainSizer.Layout()   
817    G2frame.dataDisplay.SetSizer(mainSizer)
818    G2frame.dataFrame.setSizePosLeft(mainSizer.Fit(G2frame.dataFrame))
819   
820def UpdateSampleGrid(G2frame,data):
821   
822    def OnSampleCopy(event):
823        histName = G2frame.PatternTree.GetItemText(G2frame.PatternId)
824        copyNames = ['Scale',]
825        dataType = data['Type']
826        histType = 'HKLF'
827        if 'PWDR' in histName:          #else HKLF - only Scale
828            histType = 'PWDR'
829            if 'Debye' in dataType:
830                copyNames += ['DisplaceX','DisplaceY','Absorption']
831            else:       #Bragg-Brentano
832                copyNames += ['Shift','Transparency']
833        copyNames += ['Omega','Chi','Phi']
834        copyDict = {}
835        for parm in copyNames:
836            copyDict[parm] = data[parm]
837        histList = ['All '+histType,]
838        item, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
839        while item:
840            name = G2frame.PatternTree.GetItemText(item)
841            if histType in name and name != histName:
842                histList.append(name)
843            item, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
844        if len(histList) == 1:      #nothing to copy to!
845            return
846        copyList = []
847        dlg = wx.MultiChoiceDialog(G2frame,'Copy parameters from\n'+histName,
848            'Copy parameters to which histograms?',histList,wx.CHOICEDLG_STYLE)
849        try:
850            if dlg.ShowModal() == wx.ID_OK:
851                result = dlg.GetSelections()
852                for i in result: 
853                    copyList.append(histList[i])
854                if 'All '+histType in copyList: 
855                    copyList = histList[1:]
856            for item in copyList:
857                Id = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,item)
858                sampleData = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Sample Parameters'))
859                sampleData.update(copy.deepcopy(copyDict))
860        finally:
861            dlg.Destroy()
862
863    if G2frame.dataDisplay:
864        G2frame.dataFrame.Clear()
865    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.SampleMenu)
866    G2frame.dataFrame.SetLabel('Sample Parameters')
867    G2frame.Bind(wx.EVT_MENU, OnSampleCopy, id=G2gd.wxID_SAMPLECOPY)
868    if not G2frame.dataFrame.GetStatusBar():
869        Status = G2frame.dataFrame.CreateStatusBar()   
870    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
871
872#patch
873    if not 'Gonio. radius' in data:
874        data['Gonio. radius'] = 200.0
875    if not 'Omega' in data:
876        data.update({'Omega':0.0,'Chi':0.0,'Phi':0.0})
877#patch end
878   
879    parms = [['Gonio. radius',' Goniometer radius(mm): ','%.2f',]]
880    if data['Type'] == 'Debye-Scherrer':
881        parms += [['DisplaceX',u' Sample X displacement(\xb5m): ','%.2f',],
882            ['DisplaceY',u' Sample Y displacement(\xb5m): ','%.2f',],
883            ['Absorption',u' Sample absorption(\xb5r): ','%.4f',],]
884    elif data['Type'] == 'Bragg-Brentano':
885        parms += [['Shift',u' Sample displacement(\xb5m): ','%.2f',],
886            ['Transparency',u' Sample transparency(1/\xb5eff,cm): ','%.4f'],]
887    parms.append(['Omega','Goniometer omega:','%.2f'])
888    parms.append(['Chi','Goniometer chi:','%.2f'])
889    parms.append(['Phi','Goniometer phi:','%.2f'])
890    parms.append(['Temperature',' Sample temperature(K): ','%.2f'])
891    parms.append(['Pressure',' Sample pressure(MPa): ','%.3f'])
892    parms.append(['Humidity',' Sample humidity(%): ','%.1f'])
893    parms.append(['Voltage',' Sample voltage(V): ','%.3f'])
894    parms.append(['Force',' Applied load(MN): ','%.3f'])
895    objList = {}
896
897    def OnScaleRef(event):
898        Obj = event.GetEventObject()
899        data['Scale'][1] = Obj.GetValue()
900       
901    def OnScaleVal(event):
902        Obj = event.GetEventObject()
903        try:
904            scale = float(Obj.GetValue())
905            if scale > 0:
906                data['Scale'][0] = scale
907        except ValueError:
908            pass
909        Obj.SetValue("%.4f"%(data['Scale'][0]))          #reset in case of error
910       
911    def OnHistoType(event):
912        Obj = event.GetEventObject()
913        data['Type'] = Obj.GetValue()
914        if data['Type'] == 'Bragg-Brentano' and 'Shift' not in data:    #set up defaults for new type(s)
915            data['Shift'] = [0.0,False]
916            data['Transparency'] = [0.0,False]
917        G2frame.dataDisplay.Destroy()
918        UpdateSampleGrid(G2frame,data)
919       
920    def OnParmRef(event):
921        Obj = event.GetEventObject()
922        parm = objList[Obj.GetId()]
923        data[parm][1] = Obj.GetValue()
924       
925    def OnParmVal(event):
926        Obj = event.GetEventObject()
927        parm = objList[Obj.GetId()]
928        try:
929            if 'list' in str(type(data[parm[0]])): 
930                data[parm[0]][0] = float(Obj.GetValue())
931            else:
932                data[parm[0]] = float(Obj.GetValue())
933        except ValueError:
934            pass
935        if 'list' in str(type(data[parm[0]])): 
936            Obj.SetValue(parm[2]%(data[parm[0]][0]))          #reset in case of error
937        else:
938            Obj.SetValue(parm[2]%(data[parm[0]]))          #reset in case of error
939               
940    mainSizer = wx.BoxSizer(wx.VERTICAL)
941    mainSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Sample parameters: '),0,wx.ALIGN_CENTER_VERTICAL)
942    mainSizer.Add((5,5),0)
943    parmSizer = wx.FlexGridSizer(9,2,5,0)
944    scaleRef = wx.CheckBox(G2frame.dataDisplay,label=' Histogram scale factor: ')
945    scaleRef.SetValue(data['Scale'][1])
946    scaleRef.Bind(wx.EVT_CHECKBOX, OnScaleRef)
947    parmSizer.Add(scaleRef,0,wx.ALIGN_CENTER_VERTICAL)
948    scaleVal = wx.TextCtrl(G2frame.dataDisplay,wx.ID_ANY,
949        '%.4f'%(data['Scale'][0]),style=wx.TE_PROCESS_ENTER)
950    scaleVal.Bind(wx.EVT_TEXT_ENTER,OnScaleVal)
951    scaleVal.Bind(wx.EVT_KILL_FOCUS,OnScaleVal)
952    parmSizer.Add(scaleVal,0,wx.ALIGN_CENTER_VERTICAL)
953    typeSizer = wx.BoxSizer(wx.HORIZONTAL)
954    choices = ['Debye-Scherrer','Bragg-Brentano',]
955    histoType = wx.ComboBox(G2frame.dataDisplay,wx.ID_ANY,value=data['Type'],choices=choices,
956        style=wx.CB_READONLY|wx.CB_DROPDOWN)
957    histoType.Bind(wx.EVT_COMBOBOX, OnHistoType)
958    parmSizer.Add(histoType)
959    parmSizer.Add((5,5),0)
960   
961    for parm in parms:
962        if 'list' in str(type(data[parm[0]])):
963            parmRef = wx.CheckBox(G2frame.dataDisplay,label=parm[1])
964            objList[parmRef.GetId()] = parm[0]
965            parmRef.SetValue(data[parm[0]][1])
966            parmRef.Bind(wx.EVT_CHECKBOX, OnParmRef)
967            parmSizer.Add(parmRef,0,wx.ALIGN_CENTER_VERTICAL)
968            parmVal = wx.TextCtrl(G2frame.dataDisplay,wx.ID_ANY,
969                parm[2]%(data[parm[0]][0]),style=wx.TE_PROCESS_ENTER)
970        else:
971            parmSizer.Add(wx.StaticText(G2frame.dataDisplay,label=parm[1]),
972                0,wx.ALIGN_CENTER_VERTICAL)
973            parmVal = wx.TextCtrl(G2frame.dataDisplay,wx.ID_ANY,
974                parm[2]%(data[parm[0]]),style=wx.TE_PROCESS_ENTER)       
975        objList[parmVal.GetId()] = parm
976        parmVal.Bind(wx.EVT_TEXT_ENTER,OnParmVal)
977        parmVal.Bind(wx.EVT_KILL_FOCUS,OnParmVal)
978        parmSizer.Add(parmVal,1,wx.EXPAND)
979    mainSizer.Add(parmSizer)
980    mainSizer.Add((0,5),0)   
981   
982    mainSizer.Layout()   
983    G2frame.dataDisplay.SetSizer(mainSizer)
984    Size = mainSizer.Fit(G2frame.dataFrame)
985    G2frame.dataDisplay.SetSize(Size)
986    G2frame.dataFrame.setSizePosLeft(Size)
987               
988def UpdateIndexPeaksGrid(G2frame, data):
989    IndexId = G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Index Peak List')
990    inst = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Instrument Parameters'))
991    Inst = dict(zip(inst[3],inst[1]))
992    try:
993        wave = Inst['Lam']
994    except KeyError:
995        wave = Inst['Lam1']
996   
997    def RefreshIndexPeaksGrid(event):
998        r,c =  event.GetRow(),event.GetCol()
999        data = G2frame.IndexPeaksTable.GetData()
1000        if c == 2:
1001            if data[r][c]:
1002                data[r][c] = False
1003            else:
1004                data[r][c] = True
1005            G2frame.IndexPeaksTable.SetData(data)
1006            G2frame.PatternTree.SetItemPyData(IndexId,data)
1007            G2frame.dataDisplay.ForceRefresh()
1008           
1009    def OnReload(event):
1010        data = []
1011        peaks = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Peak List'))
1012        for peak in peaks:
1013            dsp = wave/(2.0*sind((peak[0]-Inst['Zero'])/2.0))
1014            data.append([peak[0],peak[2],True,False,0,0,0,dsp,0.0])
1015        G2frame.PatternTree.SetItemPyData(IndexId,data)
1016        UpdateIndexPeaksGrid(G2frame,data)
1017       
1018    def KeyEditPickGrid(event):
1019        colList = G2frame.dataDisplay.GetSelectedCols()
1020        rowList = G2frame.dataDisplay.GetSelectedRows()
1021        data = G2frame.PatternTree.GetItemPyData(IndexId)
1022        if event.GetKeyCode() == wx.WXK_RETURN:
1023            event.Skip(True)
1024        elif event.GetKeyCode() == wx.WXK_CONTROL:
1025            event.Skip(True)
1026        elif event.GetKeyCode() == wx.WXK_SHIFT:
1027            event.Skip(True)
1028        elif colList:
1029            G2frame.dataDisplay.ClearSelection()
1030            key = event.GetKeyCode()
1031            for col in colList:
1032                if G2frame.IndexPeaksTable.GetColLabelValue(col) in ['use','refine']:
1033                    if key == 89: #'Y'
1034                        for row in range(G2frame.IndexPeaksTable.GetNumberRows()): data[row][col]=True
1035                    elif key == 78:  #'N'
1036                        for row in range(G2frame.IndexPeaksTable.GetNumberRows()): data[row][col]=False
1037           
1038    if G2frame.dataDisplay:
1039        G2frame.dataFrame.Clear()
1040    if not G2frame.dataFrame.GetStatusBar():
1041        Status = G2frame.dataFrame.CreateStatusBar()
1042    if 'PWD' in G2frame.PatternTree.GetItemText(G2frame.PatternId):
1043        G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.IndPeaksMenu)
1044        G2frame.Bind(wx.EVT_MENU, OnReload, id=G2gd.wxID_INDXRELOAD)
1045    G2frame.dataFrame.IndexPeaks.Enable(False)
1046    G2frame.IndexPeaksTable = []
1047    if data:
1048        G2frame.dataFrame.IndexPeaks.Enable(True)
1049        cells = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Unit Cells List'))
1050        if cells:
1051            cellist = cells[2]
1052            dmin = cells[3]
1053            G2frame.HKL = []
1054            for i,cell in enumerate(cellist):
1055                if cell[-1]:
1056                    ibrav = cell[2]
1057                    A = G2lat.cell2A(cell[3:9])
1058                    G2frame.HKL = G2lat.GenHBravais(dmin,ibrav,A)
1059                    G2indx.IndexPeaks(data,G2frame.HKL)
1060                    for hkl in G2frame.HKL:
1061                        hkl.append(2.0*asind(wave/(2.*hkl[3]))+Inst['Zero'])             
1062    rowLabels = []
1063    for i in range(len(data)): rowLabels.append(str(i+1))
1064    colLabels = ['position','intensity','use','indexed','h','k','l','d-obs','d-calc']
1065    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
1066        wg.GRID_VALUE_BOOL,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,
1067        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5']
1068    G2frame.PatternTree.SetItemPyData(IndexId,data)
1069    G2frame.IndexPeaksTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1070    G2frame.dataFrame.SetLabel('Index Peak List')
1071    G2frame.dataDisplay = G2gd.GSGrid(parent=G2frame.dataFrame)               
1072    G2frame.dataDisplay.SetTable(G2frame.IndexPeaksTable, True)
1073    for r in range(G2frame.dataDisplay.GetNumberRows()):
1074        for c in range(G2frame.dataDisplay.GetNumberCols()):
1075            if c == 2:
1076                G2frame.dataDisplay.SetReadOnly(r,c,isReadOnly=False)
1077            else:
1078                G2frame.dataDisplay.SetReadOnly(r,c,isReadOnly=True)
1079    G2frame.dataDisplay.Bind(wg.EVT_GRID_CELL_LEFT_CLICK, RefreshIndexPeaksGrid)
1080    G2frame.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPickGrid)                 
1081    G2frame.dataDisplay.SetMargins(0,0)
1082    G2frame.dataDisplay.AutoSizeColumns(False)
1083    G2frame.dataFrame.setSizePosLeft([490,300])
1084 
1085def UpdateUnitCellsGrid(G2frame, data):
1086    UnitCellsId = G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Unit Cells List')
1087    bravaisSymb = ['Fm3m','Im3m','Pm3m','R3-H','P6/mmm','I4/mmm',
1088        'P4/mmm','Fmmm','Immm','Cmmm','Pmmm','C2/m','P2/m','P1']
1089    spaceGroups = ['F m 3 m','I m 3 m','P m 3 m','R -3 H','P 6/m m m','I 4/m m m',
1090        'P 4/m m m','F m m m','I m m m','C m m m','P m m m','C 2/m','P 2/m','P -1']
1091    inst = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Instrument Parameters'))
1092    Inst = dict(zip(inst[3],inst[1]))
1093    if 'Lam' in Inst:
1094        wave = Inst['Lam']
1095    else:
1096        wave = Inst['Lam1']
1097       
1098    def SetLattice(controls):
1099        ibrav = bravaisSymb.index(controls[5])
1100        if ibrav in [0,1,2]:
1101            controls[7] = controls[8] = controls[6]
1102            controls[9] = controls[10] = controls[11] = 90.
1103        elif ibrav in [3,4,5,6]:
1104            controls[7] = controls[6]
1105            controls[9] = controls[10] = controls[11] = 90.
1106            if ibrav in [3,4]:
1107                controls[11] = 120.
1108        elif ibrav in [7,8,9,10]:
1109            controls[9] = controls[10] = controls[11] = 90.
1110        elif ibrav in [11,12]:
1111            controls[9] = controls[11] = 90.  # b unique
1112        if len(controls) < 13: controls.append(0)
1113        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
1114        return ibrav
1115       
1116    def OnNcNo(event):
1117        controls[2] = NcNo.GetValue()
1118       
1119    def OnStartVol(event):
1120        try:
1121            stVol = int(float(startVol.GetValue()))
1122            if stVol < 25:
1123                raise ValueError
1124        except ValueError:
1125            stVol = 25
1126        controls[3] = stVol
1127        startVol.SetValue("%d"%(stVol))
1128       
1129    def OnBravais(event):
1130        Obj = event.GetEventObject()
1131        bravais[bravList.index(Obj.GetId())] = Obj.GetValue()
1132       
1133    def OnZero(event):
1134        try:
1135            Zero = min(5.0,max(-5.0,float(zero.GetValue())))
1136        except ValueError:
1137            Zero = 0.0
1138        controls[1] = Zero
1139        zero.SetValue("%.4f"%(Zero))
1140       
1141    def OnZeroVar(event):
1142        controls[0] = zeroVar.GetValue()
1143       
1144    def OnBravSel(event):
1145        controls[5] = bravSel.GetString(bravSel.GetSelection())       
1146        UpdateUnitCellsGrid(G2frame,data)
1147       
1148    def OnCellChange(event):
1149        ibrav = bravaisSymb.index(controls[5])
1150        Obj = event.GetEventObject()
1151        ObjId = cellList.index(Obj.GetId())
1152        try:
1153            value = max(1.0,float(Obj.GetValue()))
1154        except ValueError:
1155            if ObjId < 3:               #bad cell edge - reset
1156                value = controls[6+ObjId]
1157            else:                       #bad angle
1158                value = 90.
1159        if ibrav in [0,1,2]:
1160            controls[6] = controls[7] = controls[8] = value
1161            controls[9] = controls[10] = controls[11] = 90.0
1162            Obj.SetValue("%.5f"%(controls[6]))
1163        elif ibrav in [3,4,5,6]:
1164            if ObjId == 0:
1165                controls[6] = controls[7] = value
1166                Obj.SetValue("%.5f"%(controls[6]))
1167            else:
1168                controls[8] = value
1169                Obj.SetValue("%.5f"%(controls[8]))
1170            controls[9] = controls[10] = controls[11] = 90.0
1171            if ibrav in [3,4]:
1172                controls[11] = 120.
1173        elif ibrav in [7,8,9,10]:
1174            controls[6+ObjId] = value
1175            Obj.SetValue("%.5f"%(controls[6+ObjId]))
1176            controls[9] = controls[10] = controls[11] = 90.0
1177        elif ibrav in [11,12]:
1178            controls[9] = controls[11] = 90.0
1179            if ObjId != 3:
1180                controls[6+ObjId] = value
1181                Obj.SetValue("%.5f"%(controls[6+ObjId]))
1182            else:
1183                controls[10] = value
1184                Obj.SetValue("%.3f"%(controls[10]))
1185        else:
1186            controls[6+ObjId] = value
1187            if ObjId < 3:
1188                Obj.SetValue("%.5f"%(controls[6+ObjId]))
1189            else:
1190                Obj.SetValue("%.3f"%(controls[6+ObjId]))
1191        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
1192        volVal.SetValue("%.3f"%(controls[12]))
1193       
1194    def OnHklShow(event):
1195        PatternId = G2frame.PatternId
1196        PickId = G2frame.PickId   
1197        limits = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Limits'))[1]
1198        controls,bravais,cells,dmin = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Unit Cells List'))
1199        cell = controls[6:12]
1200        A = G2lat.cell2A(cell)
1201        ibrav = bravaisSymb.index(controls[5])
1202        dmin = wave/(2.0*sind(limits[1]/2.0))
1203        G2frame.HKL = G2lat.GenHBravais(dmin,ibrav,A)
1204        for hkl in G2frame.HKL:
1205            hkl.append(2.0*asind(wave/(2.*hkl[3]))+controls[1]+Inst['Zero'])             
1206        if 'PKS' in G2frame.PatternTree.GetItemText(G2frame.PatternId):
1207            G2plt.PlotPowderLines(G2frame)
1208        else:
1209            G2plt.PlotPatterns(G2frame)
1210           
1211    def OnSortCells(event):
1212        controls,bravais,cells,dmin = G2frame.PatternTree.GetItemPyData(UnitCellsId)
1213        c =  event.GetCol()
1214        if colLabels[c] == 'M20':
1215            cells = G2indx.sortM20(cells)
1216        elif colLabels[c] == 'Volume':
1217            cells = G2indx.sortVolume(cells)
1218        else:
1219            return
1220        data = [controls,bravais,cells,dmin]
1221        G2frame.PatternTree.SetItemPyData(UnitCellsId,data)
1222        UpdateUnitCellsGrid(G2frame,data)
1223       
1224    def CopyUnitCell(event):
1225        controls,bravais,cells,dmin = G2frame.PatternTree.GetItemPyData(UnitCellsId)
1226        for Cell in cells:
1227            if Cell[-1]:
1228                break
1229        cell = Cell[2:9]
1230        controls[4] = 1
1231        controls[5] = bravaisSymb[cell[0]]
1232        controls[6:12] = cell[1:8]
1233        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
1234        G2frame.PatternTree.SetItemPyData(UnitCellsId,[controls,bravais,cells,dmin])
1235        UpdateUnitCellsGrid(G2frame,data)
1236       
1237        G2frame.dataFrame.RefineCell.Enable(True)
1238               
1239    def RefineCell(event):
1240        def cellPrint(ibrav,A):
1241            cell = G2lat.A2cell(A)
1242            Vol = G2lat.calc_V(A)
1243            if ibrav in [0,1,2]:
1244                print "%s%10.6f" % ('a =',cell[0])
1245            elif ibrav in [3,4,5,6]:
1246                print "%s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],' c =',cell[2],' volume =',Vol)
1247            elif ibrav in [7,8,9,10]:
1248                print "%s%10.6f %s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],' volume =',Vol)
1249            elif ibrav in [11,12]:
1250                print "%s%10.6f %s%10.6f %s%10.6f %s%8.3f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],'beta =',cell[4],' volume =',Vol)
1251            else:
1252                print "%s%10.6f %s%10.6f %s%10.6f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2])
1253                print "%s%8.3f %s%8.3f %s%8.3f %s%12.3f" % ('alpha =',cell[3],'beta =',cell[4],'gamma =',cell[5],' volume =',Vol)
1254             
1255        PatternId = G2frame.PatternId
1256        PickId = G2frame.PickId   
1257        peaks = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Index Peak List'))
1258        if not peaks:
1259            G2frame.ErrorDialog('No peaks!', 'Nothing to refine!')
1260            return       
1261        print 'Refine cell'
1262        controls,bravais,cells,dmin = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Unit Cells List'))
1263        cell = controls[6:12]
1264        A = G2lat.cell2A(cell)
1265        ibrav = bravaisSymb.index(controls[5])
1266        dmin = G2indx.getDmin(peaks)-0.005
1267        G2frame.HKL = G2lat.GenHBravais(dmin,ibrav,A)
1268        G2indx.IndexPeaks(peaks,G2frame.HKL)
1269        Lhkl,M20,X20,Aref,Zero = G2indx.refinePeaksZ(peaks,wave,ibrav,A,controls[1],controls[0])           
1270        controls[1] = Zero
1271        controls[6:12] = G2lat.A2cell(Aref)
1272        controls[12] = G2lat.calc_V(Aref)
1273        data = [controls,bravais,cells,dmin]
1274        cells = G2frame.PatternTree.GetItemPyData(UnitCellsId)[2]
1275        for cell in cells:
1276            cell[-1] = False
1277        cells.insert(0,[M20,X20,ibrav]+controls[6:13]+[True,])
1278        G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Unit Cells List'),data)
1279        G2frame.HKL = G2lat.GenHBravais(dmin,ibrav,Aref)
1280        UpdateUnitCellsGrid(G2frame,data)
1281        print "%s%10.3f" % ('refinement M20 = ',M20)
1282        print 'unindexed lines = ',X20
1283        cellPrint(ibrav,Aref)
1284        for hkl in G2frame.HKL:
1285            hkl.append(2.0*asind(wave/(2.*hkl[3]))+controls[1]+Inst['Zero'])             
1286        if 'PKS' in G2frame.PatternTree.GetItemText(G2frame.PatternId):
1287            G2plt.PlotPowderLines(G2frame)
1288        else:
1289            G2plt.PlotPatterns(G2frame)
1290       
1291    def IndexPeaks(event):
1292        PatternId = G2frame.PatternId   
1293        print 'Peak Indexing'
1294        try:
1295            controls,bravais,cells,dmin = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Unit Cells List'))
1296            cells = []
1297        except ValueError:
1298            G2frame.ErrorDialog('Error','Need to set controls in Unit Cell List first')
1299            return
1300        if True not in bravais:
1301            G2frame.ErrorDialog('Error','No Bravais lattices selected')
1302            return
1303        G2frame.dataFrame.CopyCell.Enable(False)
1304        G2frame.dataFrame.RefineCell.Enable(False)
1305        OK,dmin,cells = G2indx.DoIndexPeaks(peaks,inst[1],controls,bravais)
1306        if OK:
1307            data = [controls,bravais,cells,dmin]
1308            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Unit Cells List'),data)
1309            UpdateUnitCellsGrid(G2frame,data)
1310            bestCell = cells[0]
1311            if bestCell[0] > 10.:
1312                G2frame.HKL = G2lat.GenHBravais(dmin,bestCell[2],G2lat.cell2A(bestCell[3:9]))
1313                for hkl in G2frame.HKL:
1314                    hkl.append(2.0*asind(wave/(2.*hkl[3]))+controls[1]+Inst['Zero'])             
1315                if 'PKS' in G2frame.PatternTree.GetItemText(G2frame.PatternId):
1316                    G2plt.PlotPowderLines(G2frame)
1317                else:
1318                    G2plt.PlotPatterns(G2frame)
1319            G2frame.dataFrame.CopyCell.Enable(True)
1320            G2frame.dataFrame.IndexPeaks.Enable(True)
1321            G2frame.dataFrame.MakeNewPhase.Enable(True)
1322            UpdateUnitCellsGrid(G2frame,data)
1323               
1324    def RefreshUnitCellsGrid(event):
1325        cells,dmin = G2frame.PatternTree.GetItemPyData(UnitCellsId)[2:]
1326        r,c =  event.GetRow(),event.GetCol()
1327        if cells:
1328            if c == 2:
1329                for i in range(len(cells)):
1330                    cells[i][-1] = False
1331                    UnitCellsTable.SetValue(i,c,False)
1332                UnitCellsTable.SetValue(r,c,True)
1333                gridDisplay.ForceRefresh()
1334                cells[r][-1] = True
1335                ibrav = cells[r][2]
1336                A = G2lat.cell2A(cells[r][3:9])
1337                G2frame.HKL = G2lat.GenHBravais(dmin,ibrav,A)
1338                for hkl in G2frame.HKL:
1339                    hkl.append(2.0*asind(wave/(2.*hkl[3]))+controls[1]+Inst['Zero'])             
1340                if 'PKS' in G2frame.PatternTree.GetItemText(G2frame.PatternId):
1341                    G2plt.PlotPowderLines(G2frame)
1342                else:
1343                    G2plt.PlotPatterns(G2frame)
1344       
1345    def MakeNewPhase(event):
1346        if not G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Phases'):
1347            sub = G2frame.PatternTree.AppendItem(parent=G2frame.root,text='Phases')
1348        else:
1349            sub = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Phases')
1350        PhaseName = ''
1351        dlg = wx.TextEntryDialog(None,'Enter a name for this phase','Phase Name Entry','New phase',
1352            style=wx.OK)
1353        try:
1354            if dlg.ShowModal() == wx.ID_OK:
1355                PhaseName = dlg.GetValue()
1356                cells = G2frame.PatternTree.GetItemPyData(UnitCellsId)[2]
1357                for Cell in cells:
1358                    if Cell[-1]:
1359                        break
1360                cell = Cell[2:10]       
1361                sub = G2frame.PatternTree.AppendItem(parent=sub,text=PhaseName)
1362                E,SGData = G2spc.SpcGroup(spaceGroups[cell[0]])
1363                G2frame.PatternTree.SetItemPyData(sub, \
1364                    {'General':{'Name':PhaseName,'Type':'nuclear','SGData':SGData,
1365                    'Cell':[False,]+cell[1:],
1366                    'Pawley dmin':1.00},'Atoms':[],'Drawing':{},'Histograms':{}})
1367                Status.SetStatusText('Change space group if needed')
1368        finally:
1369            dlg.Destroy()
1370           
1371    if G2frame.dataDisplay:
1372        G2frame.dataFrame.Clear()
1373    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.IndexMenu)
1374    if not G2frame.dataFrame.GetStatusBar():
1375        Status = G2frame.dataFrame.CreateStatusBar()
1376    G2frame.Bind(wx.EVT_MENU, IndexPeaks, id=G2gd.wxID_INDEXPEAKS)
1377    G2frame.Bind(wx.EVT_MENU, CopyUnitCell, id=G2gd.wxID_COPYCELL)
1378    G2frame.Bind(wx.EVT_MENU, RefineCell, id=G2gd.wxID_REFINECELL)
1379    G2frame.Bind(wx.EVT_MENU, MakeNewPhase, id=G2gd.wxID_MAKENEWPHASE)
1380   
1381    controls,bravais,cells,dmin = data
1382    if len(controls) < 13:              #add cell volume if missing
1383        controls.append(G2lat.calc_V(G2lat.cell2A(controls[6:12])))
1384    G2frame.PatternTree.SetItemPyData(UnitCellsId,data)            #update with volume
1385    bravaisNames = ['Cubic-F','Cubic-I','Cubic-P','Trigonal-R','Trigonal/Hexagonal-P',
1386        'Tetragonal-I','Tetragonal-P','Orthorhombic-F','Orthorhombic-I','Orthorhombic-C',
1387        'Orthorhombic-P','Monoclinic-C','Monoclinic-P','Triclinic']
1388    cellGUIlist = [[[0,1,2],4,zip([" Unit cell: a = "," Vol = "],["%.5f","%.3f"],[True,False],[0,0])],
1389    [[3,4,5,6],6,zip([" Unit cell: a = "," c = "," Vol = "],["%.5f","%.5f","%.3f"],[True,True,False],[0,2,0])],
1390    [[7,8,9,10],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "],["%.5f","%.5f","%.5f","%.3f"],
1391        [True,True,True,False],[0,1,2,0])],
1392    [[11,12],10,zip([" Unit cell: a = "," b = "," c = "," beta = "," Vol = "],
1393        ["%.5f","%.5f","%.5f","%.3f","%.3f"],[True,True,True,True,False],[0,1,2,4,0])],
1394    [[13,],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "," alpha = "," beta = "," gamma = "],
1395        ["%.5f","%.5f","%.5f","%.3f","%.3f","%.3f","%.3f"],
1396        [True,True,True,False,True,True,True],[0,1,2,0,3,4,5])]]
1397   
1398    G2frame.dataFrame.SetLabel('Unit Cells List')
1399    G2frame.sp = wx.SplitterWindow(G2frame.dataFrame)
1400    G2frame.dataDisplay = wx.Panel(G2frame.sp, style=wx.SUNKEN_BORDER)
1401    G2frame.dataFrame.IndexPeaks.Enable(False)
1402    peaks = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Index Peak List'))
1403    if peaks:
1404        G2frame.dataFrame.IndexPeaks.Enable(True)
1405    G2frame.dataFrame.RefineCell.Enable(False)
1406    if controls[12] > 1.0:                               #if a "real" volume (i.e. not default)
1407        G2frame.dataFrame.RefineCell.Enable(True)   
1408    G2frame.dataFrame.CopyCell.Enable(False)
1409    G2frame.dataFrame.MakeNewPhase.Enable(False)       
1410    if cells:
1411        G2frame.bottom = wx.Panel(G2frame.sp, style=wx.SUNKEN_BORDER)
1412        G2frame.sp.SplitHorizontally(G2frame.dataDisplay,G2frame.bottom,0)
1413        G2frame.dataFrame.CopyCell.Enable(True)
1414        G2frame.dataFrame.MakeNewPhase.Enable(True)       
1415    mainSizer = wx.BoxSizer(wx.VERTICAL)
1416    mainSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Indexing controls: '),0,wx.ALIGN_CENTER_VERTICAL)
1417    mainSizer.Add((5,5),0)
1418    littleSizer = wx.FlexGridSizer(2,5,5,5)
1419    littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Max Nc/Nobs '),0,wx.ALIGN_CENTER_VERTICAL)
1420    NcNo = wx.SpinCtrl(G2frame.dataDisplay)
1421    NcNo.SetRange(1,6)
1422    NcNo.SetValue(controls[2])
1423    NcNo.Bind(wx.EVT_SPINCTRL,OnNcNo)
1424    littleSizer.Add(NcNo,0,wx.ALIGN_CENTER_VERTICAL)
1425    littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Start Volume '),0,wx.ALIGN_CENTER_VERTICAL)
1426    startVol = wx.TextCtrl(G2frame.dataDisplay,value=str('%d'%(controls[3])),style=wx.TE_PROCESS_ENTER)
1427    startVol.Bind(wx.EVT_TEXT_ENTER,OnStartVol)
1428    startVol.Bind(wx.EVT_KILL_FOCUS,OnStartVol)
1429    littleSizer.Add(startVol,0,wx.ALIGN_CENTER_VERTICAL)
1430    mainSizer.Add(littleSizer,0)
1431    mainSizer.Add((5,5),0)
1432    mainSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Select Bravais Lattices for indexing: '),
1433        0,wx.ALIGN_CENTER_VERTICAL)
1434    mainSizer.Add((5,5),0)
1435    littleSizer = wx.FlexGridSizer(2,7,5,5)
1436    bravList = []
1437    bravs = zip(bravais,bravaisNames)
1438    for brav,bravName in bravs:
1439        bravCk = wx.CheckBox(G2frame.dataDisplay,label=bravName)
1440        bravList.append(bravCk.GetId())
1441        bravCk.SetValue(brav)
1442        bravCk.Bind(wx.EVT_CHECKBOX,OnBravais)
1443        littleSizer.Add(bravCk,0,wx.ALIGN_CENTER_VERTICAL)
1444    mainSizer.Add(littleSizer,0)
1445    mainSizer.Add((5,5),0)
1446   
1447    mainSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Cell Refinement: '),0,wx.ALIGN_CENTER_VERTICAL)
1448    mainSizer.Add((5,5),0)
1449    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
1450    littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label=" Bravais lattice "),0,wx.ALIGN_CENTER_VERTICAL)
1451    bravSel = wx.Choice(G2frame.dataDisplay,choices=bravaisSymb)
1452    bravSel.SetSelection(bravaisSymb.index(controls[5]))
1453    bravSel.Bind(wx.EVT_CHOICE,OnBravSel)
1454    littleSizer.Add(bravSel,0,wx.ALIGN_CENTER_VERTICAL)
1455    littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label=" Zero offset"),0,wx.ALIGN_CENTER_VERTICAL)
1456    zero = wx.TextCtrl(G2frame.dataDisplay,value="%.4f"%(controls[1]),style=wx.TE_PROCESS_ENTER)
1457    zero.Bind(wx.EVT_TEXT_ENTER,OnZero)
1458    zero.Bind(wx.EVT_KILL_FOCUS,OnZero)
1459    littleSizer.Add(zero,0,wx.ALIGN_CENTER_VERTICAL)
1460    zeroVar = wx.CheckBox(G2frame.dataDisplay,label="Refine?")
1461    zeroVar.SetValue(controls[0])
1462    zeroVar.Bind(wx.EVT_CHECKBOX,OnZeroVar)
1463    littleSizer.Add(zeroVar,0,wx.ALIGN_CENTER_VERTICAL)
1464    hklShow = wx.Button(G2frame.dataDisplay,label="Show refined hkl positions + Zero offset")
1465    hklShow.Bind(wx.EVT_BUTTON,OnHklShow)
1466    littleSizer.Add(hklShow,0,wx.ALIGN_CENTER_VERTICAL)
1467    mainSizer.Add(littleSizer,0)
1468   
1469    mainSizer.Add((5,5),0)
1470    ibrav = SetLattice(controls)
1471    for cellGUI in cellGUIlist:
1472        if ibrav in cellGUI[0]:
1473            useGUI = cellGUI
1474    cellList = []
1475    littleSizer = wx.FlexGridSizer(2,useGUI[1],5,5)
1476    for txt,fmt,ifEdit,Id in useGUI[2]:
1477        littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label=txt),0,wx.ALIGN_CENTER_VERTICAL)
1478        if ifEdit:          #a,b,c,etc.
1479            cellVal = wx.TextCtrl(G2frame.dataDisplay,value=(fmt%(controls[6+Id])),style=wx.TE_PROCESS_ENTER)
1480            cellVal.Bind(wx.EVT_TEXT_ENTER,OnCellChange)       
1481            cellVal.Bind(wx.EVT_KILL_FOCUS,OnCellChange)
1482            littleSizer.Add(cellVal,0,wx.ALIGN_CENTER_VERTICAL)
1483            cellList.append(cellVal.GetId())
1484        else:               #volume
1485            volVal = wx.TextCtrl(G2frame.dataDisplay,value=(fmt%(controls[12])),style=wx.TE_READONLY)
1486            volVal.SetBackgroundColour(VERY_LIGHT_GREY)
1487            littleSizer.Add(volVal,0,wx.ALIGN_CENTER_VERTICAL)
1488    mainSizer.Add(littleSizer,0)
1489       
1490    mainSizer.Layout()   
1491    G2frame.dataDisplay.SetSizer(mainSizer)
1492    topSize = mainSizer.Fit(G2frame.dataFrame)
1493    G2frame.dataDisplay.SetSize(topSize)
1494    if cells:
1495        if ibrav == 13:
1496            topSize[1] += 230
1497        else:
1498            topSize[1] += 200
1499    G2frame.dataFrame.setSizePosLeft(topSize)   
1500   
1501    if cells:
1502        bottomSize = G2frame.bottom.GetSize()
1503        if ibrav == 13:
1504            bottomSize[1] -= 240
1505        else:
1506            bottomSize[1] -= 210
1507        wx.StaticText(parent=G2frame.bottom,label=' Indexing Result ')
1508        rowLabels = []
1509        colLabels = ['M20','X20','use','Bravais','a','b','c','alpha','beta','gamma','Volume']
1510        Types = [wg.GRID_VALUE_FLOAT+':10,2',wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING,]+ \
1511            3*[wg.GRID_VALUE_FLOAT+':10,5',]+3*[wg.GRID_VALUE_FLOAT+':10,3',]+ \
1512            [wg.GRID_VALUE_FLOAT+':10,2']
1513        numRows = len(cells)
1514        table = []
1515        for cell in cells:
1516            rowLabels.append('')
1517            row = cell[0:2]+[cell[-1]]+[bravaisSymb[cell[2]]]+cell[3:10]
1518            if cell[-1]:
1519                A = G2lat.cell2A(cell[3:9])
1520                G2frame.HKL = G2lat.GenHBravais(dmin,cell[2],A)
1521                for hkl in G2frame.HKL:
1522                    hkl.append(2.0*asind(wave/(2.*hkl[3]))+controls[1]+Inst['Zero'])             
1523            table.append(row)
1524        UnitCellsTable = G2gd.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1525        gridDisplay = G2gd.GSGrid(G2frame.bottom)
1526        gridDisplay.SetPosition(wx.Point(0,20))               
1527        gridDisplay.SetTable(UnitCellsTable, True)
1528        G2frame.dataFrame.CopyCell.Enable(True)
1529        gridDisplay.Bind(wg.EVT_GRID_CELL_LEFT_CLICK,RefreshUnitCellsGrid)
1530        gridDisplay.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK,OnSortCells)
1531        gridDisplay.SetMargins(0,0)
1532        gridDisplay.SetRowLabelSize(0)
1533        gridDisplay.AutoSizeColumns(False)
1534        for r in range(gridDisplay.GetNumberRows()):
1535            for c in range(gridDisplay.GetNumberCols()):
1536                if c == 2:
1537                    gridDisplay.SetReadOnly(r,c,isReadOnly=False)
1538                else:
1539                    gridDisplay.SetReadOnly(r,c,isReadOnly=True)
1540        gridDisplay.SetSize(bottomSize)
1541
1542def UpdateReflectionGrid(G2frame,data):
1543    if not data:
1544        print 'No phases, no reflections'
1545        return
1546    phases = data.keys()
1547   
1548    def OnSelectPhase(event):
1549        dlg = wx.SingleChoiceDialog(G2frame,'Select','Phase',phases)
1550        try:
1551            if dlg.ShowModal() == wx.ID_OK:
1552                sel = dlg.GetSelection()
1553                G2frame.RefList = phases[sel]
1554                UpdateReflectionGrid(G2frame,data)
1555        finally:
1556            dlg.Destroy()
1557        G2plt.PlotPatterns(G2frame)
1558       
1559       
1560    if G2frame.dataDisplay:
1561        G2frame.dataFrame.Clear()
1562    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.ReflMenu)
1563    if not G2frame.dataFrame.GetStatusBar():
1564        Status = G2frame.dataFrame.CreateStatusBar()   
1565    G2frame.Bind(wx.EVT_MENU, OnSelectPhase, id=G2gd.wxID_SELECTPHASE)
1566    G2frame.dataFrame.SelectPhase.Enable(False)
1567    if len(data) > 1:
1568        G2frame.dataFrame.SelectPhase.Enable(True)
1569    rowLabels = []
1570    refList = [refl[:11] for refl in data[G2frame.RefList]]
1571    for i in range(len(refList)): rowLabels.append(str(i))
1572    colLabels = ['H','K','L','mul','d','pos','sig','gam','Fosq','Fcsq','phase',]
1573    Types = 4*[wg.GRID_VALUE_LONG,]+4*[wg.GRID_VALUE_FLOAT+':10,4',]+2*[wg.GRID_VALUE_FLOAT+':10,2',]+[wg.GRID_VALUE_FLOAT+':10,3',]
1574    G2frame.PeakTable = G2gd.Table(refList,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1575    G2frame.dataFrame.SetLabel('Reflection List for '+G2frame.RefList)
1576    G2frame.dataDisplay = G2gd.GSGrid(parent=G2frame.dataFrame)
1577    G2frame.dataDisplay.SetTable(G2frame.PeakTable, True)
1578    G2frame.dataDisplay.EnableEditing(False)
1579    G2frame.dataDisplay.SetMargins(0,0)
1580    G2frame.dataDisplay.AutoSizeColumns(False)
1581    G2frame.dataFrame.setSizePosLeft([555,350])
1582
1583def UpdatePDFGrid(G2frame,data):
1584    global inst
1585    tth2q = lambda t,w:4.0*math.pi*sind(t/2.0)/w
1586    dataFile = G2frame.PatternTree.GetItemText(G2frame.PatternId)
1587    powName = 'PWDR'+dataFile[4:]
1588    powId = G2gd.GetPatternTreeItemId(G2frame,G2frame.root, powName)
1589    fullLimits,limits = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,powId, 'Limits'))
1590    inst = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,powId, 'Instrument Parameters'))
1591    inst = dict(zip(inst[3],inst[1]))
1592    if 'Lam' in inst:
1593        keV = 12.397639/inst['Lam']
1594    else:
1595        keV = 12.397639/inst['Lam1']
1596    wave = 12.397639/keV
1597    qLimits = [tth2q(fullLimits[0],wave),tth2q(fullLimits[1],wave)]
1598    data['QScaleLim'][1] = min(qLimits[1],data['QScaleLim'][1])
1599    if data['QScaleLim'][0]:
1600        data['QScaleLim'][0] = max(qLimits[0],data['QScaleLim'][0])
1601    else:                                #initial setting at 90% of max Q
1602        data['QScaleLim'][0] = 0.90*data['QScaleLim'][1]
1603    polariz = inst['Polariz.']
1604    azimuth = inst['Azimuth']
1605    itemDict = {}
1606   
1607    def FillFileSizer(fileSizer,key):
1608        #fileSizer is a FlexGridSizer(3,6)
1609       
1610        def OnSelectFile(event):
1611            Obj = event.GetEventObject()
1612            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1613            if itemKey == 'Name':
1614                value = Obj.GetValue()
1615            Obj.SetValue(fmt%(value))
1616            data[fileKey][itemKey] = value
1617            UpdatePDFGrid(G2frame,data)
1618       
1619        def OnValueChange(event):
1620            Obj = event.GetEventObject()
1621            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1622            try:
1623                value = float(Obj.GetValue())
1624            except ValueError:
1625                value = -1.0
1626            Obj.SetValue(fmt%(value))
1627            data[fileKey][itemKey] = value
1628            auxPlot = ComputePDF(data)
1629            G2plt.PlotISFG(G2frame,newPlot=True)
1630                       
1631        item = data[key]
1632        fileList = np.array(GetFileList('PWDR')).T[1]
1633        fileSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' '+key+' file:'),0,wx.ALIGN_CENTER_VERTICAL)
1634        fileName = wx.ComboBox(G2frame.dataDisplay,value=item['Name'],choices=fileList,
1635            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1636        itemDict[fileName.GetId()] = [key,'Name','%s']
1637        fileName.Bind(wx.EVT_COMBOBOX,OnSelectFile)       
1638        fileSizer.Add(fileName,0,)
1639        fileSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label='Multiplier:'),0,wx.ALIGN_CENTER_VERTICAL)
1640        mult = wx.TextCtrl(G2frame.dataDisplay,value='%.3f'%(item['Mult']),style=wx.TE_PROCESS_ENTER)
1641        itemDict[mult.GetId()] = [key,'Mult','%.3f']
1642        mult.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1643        mult.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1644        fileSizer.Add(mult,0,)
1645        fileSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label='Add:'),0,wx.ALIGN_CENTER_VERTICAL)
1646        add = wx.TextCtrl(G2frame.dataDisplay,value='%.0f'%(item['Add']),style=wx.TE_PROCESS_ENTER)
1647        itemDict[add.GetId()] = [key,'Add','%.0f']
1648        add.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1649        add.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1650        fileSizer.Add(add,0,)
1651       
1652    def SumElementVolumes():
1653        sumVol = 0.
1654        ElList = data['ElList']
1655        for El in ElList:
1656            Avol = (4.*math.pi/3.)*ElList[El]['Drad']**3
1657            sumVol += Avol*ElList[El]['FormulaNo']
1658        return sumVol
1659        auxPlot = ComputePDF(data)
1660        G2plt.PlotISFG(G2frame,newPlot=True)       
1661       
1662    def FillElemSizer(elemSizer,ElData):
1663       
1664        def OnFractionChange(event):
1665            try:
1666                value = max(0.0,float(num.GetValue()))
1667            except ValueError:
1668                value = 0.0
1669            num.SetValue('%.3f'%(value))
1670            ElData['FormulaNo'] = value
1671            data['Form Vol'] = max(10.0,SumElementVolumes())
1672            formVol.SetValue('%.2f'%(data['Form Vol']))
1673            UpdatePDFGrid(G2frame,data)
1674            auxPlot = ComputePDF(data)
1675            G2plt.PlotISFG(G2frame,newPlot=True)       
1676       
1677        elemSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,
1678            label=' Element: '+'%2s'%(ElData['Symbol'])+' * '),0,wx.ALIGN_CENTER_VERTICAL)
1679        num = wx.TextCtrl(G2frame.dataDisplay,value='%.3f'%(ElData['FormulaNo']),style=wx.TE_PROCESS_ENTER)
1680        num.Bind(wx.EVT_TEXT_ENTER,OnFractionChange)       
1681        num.Bind(wx.EVT_KILL_FOCUS,OnFractionChange)
1682        elemSizer.Add(num,0,wx.ALIGN_CENTER_VERTICAL)
1683        elemSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,
1684            label="f': %.3f"%(ElData['fp'])+' f": %.3f'%(ElData['fpp'])+' mu: %.2f barns'%(ElData['mu']) ),
1685            0,wx.ALIGN_CENTER_VERTICAL)
1686           
1687    def OnGeometry(event):
1688        data['Geometry'] = geometry.GetValue()
1689        UpdatePDFGrid(G2frame,data)
1690        auxPlot = ComputePDF(data)
1691        G2plt.PlotISFG(G2frame,newPlot=True)       
1692       
1693    def OnDetType(event):
1694        data['DetType'] = detType.GetValue()
1695        UpdatePDFGrid(G2frame,data)
1696        auxPlot = ComputePDF(data)
1697        G2plt.PlotISFG(G2frame,newPlot=True)       
1698       
1699    def OnFormVol(event):
1700        try:
1701            value = float(formVol.GetValue())
1702            if value <= 0.0:
1703                raise ValueError
1704        except ValueError:
1705            value = data['Form Vol']
1706        data['Form Vol'] = value
1707        UpdatePDFGrid(G2frame,data)
1708        auxPlot = ComputePDF(data)
1709        G2plt.PlotISFG(G2frame,newPlot=False)       
1710       
1711    def OnDiameter(event):
1712        try:
1713            value = float(diam.GetValue())
1714            if value <= 0.0:
1715                raise ValueError
1716        except ValueError:
1717            value = data['Diam']
1718        data['Diam'] = value
1719        UpdatePDFGrid(G2frame,data)
1720        auxPlot = ComputePDF(data)
1721        G2plt.PlotISFG(G2frame,newPlot=False)
1722       
1723    def OnPolaVal(event):
1724        try:
1725            value = float(polaVal.GetValue())
1726            if not (0.0 <= value <= 1.0):
1727                raise ValueError
1728        except ValueError:
1729            value = inst['Polariz.']
1730        inst['Polariz.'] = value
1731        polaVal.SetValue('%.2f'%(inst['Polariz.']))
1732        UpdatePDFGrid(G2frame,data)
1733        auxPlot = ComputePDF(data)
1734        G2plt.PlotISFG(G2frame,newPlot=False)
1735               
1736    def OnAzimVal(event):
1737        try:
1738            value = float(azimVal.GetValue())
1739            if not (0. <= value <= 360.):
1740                raise ValueError
1741        except ValueError:
1742            value = inst['Azimuth']
1743        inst['Azimuth'] = value
1744        azimVal.SetValue('%.1f'%(inst['Azimuth']))
1745        UpdatePDFGrid(G2frame,data)
1746        auxPlot = ComputePDF(data)
1747        G2plt.PlotISFG(G2frame,newPlot=False)
1748                       
1749    def OnObliqCoeff(event):
1750        try:
1751            value = float(obliqCoeff.GetValue())
1752            if value < 0.0:
1753                raise ValueError
1754            elif value > 1.0:
1755                value = 1.0
1756        except ValueError:
1757            value = data['ObliqCoeff']
1758        data['ObliqCoeff'] = value
1759        obliqCoeff.SetValue('%.3f'%(value))
1760        auxPlot = ComputePDF(data)
1761        G2plt.PlotISFG(G2frame,newPlot=False)
1762       
1763    def OnRulandWdt(event):
1764        try:
1765            value = float(rulandWdt.GetValue())
1766            if value <= 0.001:
1767                raise ValueError
1768            elif value > 1.0:
1769                value = 1.0
1770        except ValueError:
1771            value = data['Ruland']
1772        data['Ruland'] = value
1773        rulandWdt.SetValue('%.3f'%(value))
1774        auxPlot = ComputePDF(data)
1775        G2plt.PlotISFG(G2frame,newPlot=False)
1776       
1777    def OnRulSlider(event):
1778        value = int(rulandSldr.GetValue())/1000.
1779        data['Ruland'] = max(0.001,value)
1780        rulandWdt.SetValue('%.3f'%(data['Ruland']))
1781        auxPlot = ComputePDF(data)
1782        G2plt.PlotISFG(G2frame,newPlot=False)
1783       
1784    def OnLorch(event):
1785        data['Lorch'] = lorch.GetValue()
1786        auxPlot = ComputePDF(data)
1787        G2plt.PlotISFG(G2frame,newPlot=False)       
1788                       
1789    def OnPacking(event):
1790        try:
1791            value = float(pack.GetValue())
1792            if value <= 0.0:
1793                raise ValueError
1794        except ValueError:
1795            value = data['Pack']
1796        data['Pack'] = value
1797        UpdatePDFGrid(G2frame,data)
1798        auxPlot = ComputePDF(data)
1799        G2plt.PlotISFG(G2frame,newPlot=False)       
1800               
1801    def OnSQmin(event):
1802        try:
1803            value = float(SQmin.GetValue())
1804            if value < qLimits[0]:
1805                raise ValueError
1806        except ValueError:
1807            value = max(qLimits[0],data['QScaleLim'][0])
1808        data['QScaleLim'][0] = value
1809        SQmin.SetValue('%.1f'%(value))
1810        auxPlot = ComputePDF(data)
1811        G2plt.PlotISFG(G2frame,newPlot=True)       
1812       
1813    def OnSQmax(event):
1814        try:
1815            value = float(SQmax.GetValue())
1816            if value > qLimits[1]:
1817                raise ValueError
1818        except ValueError:
1819            value = min(qLimits[1],data['QScaleLim'][1])
1820        data['QScaleLim'][1] = value
1821        if value < data['QScaleLim'][0]:
1822            data['QScaleLim'][0] = 0.90*value
1823            SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1824        SQmax.SetValue('%.1f'%(value))
1825        auxPlot = ComputePDF(data)
1826        G2plt.PlotISFG(G2frame,newPlot=True)
1827       
1828    def OnResetQ(event):
1829        resetQ.SetValue(False)
1830        data['QScaleLim'][1] = qLimits[1]
1831        SQmax.SetValue('%.1f'%(data['QScaleLim'][1]))
1832        data['QScaleLim'][0] = 0.9*qLimits[1]
1833        SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1834        auxPlot = ComputePDF(data)
1835        G2plt.PlotISFG(G2frame,newPlot=True)       
1836
1837    def GetFileList(fileType,skip=None):
1838        fileList = [[False,'',0]]
1839        Source = ''
1840        id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
1841        while id:
1842            name = G2frame.PatternTree.GetItemText(id)
1843            if fileType in name:
1844                if id == skip:
1845                    Source = name
1846                else:
1847                    fileList.append([False,name,id])
1848            id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
1849        if skip:
1850            return fileList,Source
1851        else:
1852            return fileList
1853       
1854    def OnCopyPDFControls(event):
1855        import copy
1856        TextList,Source = GetFileList('PDF',skip=G2frame.PatternId)
1857        TextList[0] = [False,'All PDF',0]
1858        if len(TextList) == 1:
1859            G2frame.ErrorDialog('Nothing to copy controls to','There must be more than one "PDF" pattern')
1860            return
1861        dlg = G2frame.CopyDialog(G2frame,'Copy PDF controls','Copy controls from '+Source+' to:',TextList)
1862        try:
1863            if dlg.ShowModal() == wx.ID_OK:
1864                result = dlg.GetData()
1865                if result[0][0]:
1866                    result = TextList[1:]
1867                    for item in result: item[0] = True
1868                for i,item in enumerate(result):
1869                    ifcopy,name,id = item
1870                    if ifcopy:
1871                        olddata = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'PDF Controls'))
1872                        sample = olddata['Sample']
1873                        olddata.update(copy.deepcopy(data))
1874                        olddata['Sample'] = sample
1875                        G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'PDF Controls'),olddata)
1876                Status.SetStatusText('PDF controls copied')
1877        finally:
1878            dlg.Destroy()
1879               
1880    def OnSavePDFControls(event):
1881        print 'save PDF controls?'
1882       
1883    def OnLoadPDFControls(event):
1884        print 'Load PDF controls?'
1885       
1886    def OnAddElement(event):
1887        ElList = data['ElList']
1888        PE = G2elem.PickElement(G2frame,oneOnly=True)
1889        if PE.ShowModal() == wx.ID_OK:
1890            El = PE.Elem
1891            if El not in ElList:
1892                ElemSym = El.strip().upper()               
1893                FpMu = G2elem.FPcalc(G2elem.GetXsectionCoeff(ElemSym), keV)
1894                ElData = G2elem.GetFormFactorCoeff(ElemSym)[0]
1895                ElData['FormulaNo'] = 0.0
1896                ElData.update(G2elem.GetAtomInfo(ElemSym))
1897                ElData.update(dict(zip(['fp','fpp','mu'],FpMu)))
1898                ElData.update(G2elem.GetFFC5(El))
1899                data['ElList'][El] = ElData
1900            data['Form Vol'] = max(10.0,SumElementVolumes())
1901        PE.Destroy()
1902        UpdatePDFGrid(G2frame,data)
1903       
1904    def OnDeleteElement(event):
1905        ElList = data['ElList']
1906        choice = ElList.keys()
1907        dlg = G2elem.DeleteElement(G2frame,choice=choice)
1908        if dlg.ShowModal() == wx.ID_OK:
1909            del ElList[dlg.GetDeleteElement()]
1910        dlg.Destroy()
1911        UpdatePDFGrid(G2frame,data)
1912               
1913    def ComputePDF(Data):
1914        xydata = {}
1915        for key in ['Sample','Sample Bkg.','Container','Container Bkg.']:
1916            name = Data[key]['Name']
1917            if name:
1918                xydata[key] = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.root,name))
1919                PDFname = name
1920        powName = xydata['Sample'][2]
1921        powId = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,powName)
1922        inst = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,powId,'Instrument Parameters'))
1923        inst = dict(zip(inst[3],inst[1]))
1924        auxPlot = G2pwd.CalcPDF(Data,inst,xydata)
1925        PDFId = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'PDF '+powName[4:])
1926        G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PDFId,'I(Q)'+powName[4:]),xydata['IofQ'])
1927        G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PDFId,'S(Q)'+powName[4:]),xydata['SofQ'])
1928        G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PDFId,'F(Q)'+powName[4:]),xydata['FofQ'])
1929        G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PDFId,'G(R)'+powName[4:]),xydata['GofR'])
1930        return auxPlot
1931       
1932    def OnComputePDF(event):
1933        print 'Calculating PDF:'
1934        auxPlot = ComputePDF(data)
1935        print 'Done calculating PDF:'
1936        Status.SetStatusText('PDF computed')
1937        for plot in auxPlot:
1938            G2plt.PlotXY(G2frame,plot[:2],type=plot[2])
1939       
1940        G2plt.PlotISFG(G2frame,newPlot=True,type='I(Q)')
1941        G2plt.PlotISFG(G2frame,newPlot=True,type='S(Q)')
1942        G2plt.PlotISFG(G2frame,newPlot=True,type='F(Q)')
1943        G2plt.PlotISFG(G2frame,newPlot=True,type='G(R)')
1944       
1945    def OnComputeAllPDF(event):
1946        print 'Calculating PDFs:'
1947        if G2frame.PatternTree.GetCount():
1948            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
1949            while id:
1950                Name = G2frame.PatternTree.GetItemText(id)
1951                if 'PDF' in Name:
1952                    Data = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id,'PDF Controls'))
1953                    auxPlot = ComputePDF(Data)                   
1954                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
1955            Status.SetStatusText('All PDFs computed')
1956            G2plt.PlotISFG(G2frame,newPlot=True,type='G(R)')
1957            print ' Done calculating PDFs:'
1958       
1959    def OnShowTip(G2frame,tip):
1960        print tip   
1961               
1962    if G2frame.dataDisplay:
1963        G2frame.dataFrame.Clear()
1964    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.PDFMenu)
1965    if not G2frame.dataFrame.GetStatusBar():
1966        Status = G2frame.dataFrame.CreateStatusBar()   
1967    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
1968    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyPDFControls, id=G2gd.wxID_PDFCOPYCONTROLS)
1969    G2frame.dataFrame.Bind(wx.EVT_MENU, OnSavePDFControls, id=G2gd.wxID_PDFSAVECONTROLS)
1970    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadPDFControls, id=G2gd.wxID_PDFLOADCONTROLS)
1971    G2frame.dataFrame.Bind(wx.EVT_MENU, OnAddElement, id=G2gd.wxID_PDFADDELEMENT)
1972    G2frame.dataFrame.Bind(wx.EVT_MENU, OnDeleteElement, id=G2gd.wxID_PDFDELELEMENT)
1973    G2frame.dataFrame.Bind(wx.EVT_MENU, OnComputePDF, id=G2gd.wxID_PDFCOMPUTE)
1974    G2frame.dataFrame.Bind(wx.EVT_MENU, OnComputeAllPDF, id=G2gd.wxID_PDFCOMPUTEALL)
1975    mainSizer = wx.BoxSizer(wx.VERTICAL)
1976    mainSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' PDF data files: '),0,wx.ALIGN_CENTER_VERTICAL)
1977    mainSizer.Add((5,5),0)
1978    str = ' Sample file: PWDR %s   Wavelength, A: %.5f  Energy, keV: %.3f  Polariz.: %.2f '%(dataFile[3:],wave,keV,polariz)
1979    mainSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=str),0,wx.ALIGN_CENTER_VERTICAL)
1980#    dataSizer = wx.BoxSizer(wx.HORIZONTAL)
1981#    dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label='Azimuth'),0,wx.ALIGN_CENTER_VERTICAL)
1982#    azimVal = wx.TextCtrl(G2frame.dataDisplay,value='%.2f'%(inst['Azimuth']))
1983#    azimVal.Bind(wx.EVT_TEXT_ENTER,OnAzimVal)       
1984#    azimVal.Bind(wx.EVT_KILL_FOCUS,OnAzimVal)
1985#    dataSizer.Add(azimVal,0)   
1986#    dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label='Polarization'),0,wx.ALIGN_CENTER_VERTICAL)
1987#    polaVal = wx.TextCtrl(G2frame.dataDisplay,value='%.2f'%(inst['Polariz.']))
1988#    polaVal.Bind(wx.EVT_TEXT_ENTER,OnPolaVal)       
1989#    polaVal.Bind(wx.EVT_KILL_FOCUS,OnPolaVal)
1990#    dataSizer.Add(polaVal,0)   
1991#    mainSizer.Add(dataSizer,0)
1992    mainSizer.Add((5,5),0)
1993    fileSizer = wx.FlexGridSizer(3,6,5,1)
1994    select = ['Sample Bkg.','Container']
1995    if data['Container']['Name']:
1996        select.append('Container Bkg.')
1997    for key in select:
1998        FillFileSizer(fileSizer,key)
1999    mainSizer.Add(fileSizer,0)
2000    mainSizer.Add((5,5),0)
2001    mainSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Sample information: '),0,wx.ALIGN_CENTER_VERTICAL)
2002    mainSizer.Add((5,5),0)   
2003
2004    ElList = data['ElList']
2005    Abs = G2lat.CellAbsorption(ElList,data['Form Vol'])
2006    Trans = G2pwd.Transmission(data['Geometry'],Abs*data['Pack'],data['Diam'])
2007    elemSizer = wx.FlexGridSizer(3,3,5,1)
2008    for El in ElList:
2009        FillElemSizer(elemSizer,ElList[El])
2010    mainSizer.Add(elemSizer,0)
2011    mainSizer.Add((5,5),0)   
2012    midSizer = wx.BoxSizer(wx.HORIZONTAL)
2013    midSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Formula volume: '),0,wx.ALIGN_CENTER_VERTICAL)
2014    formVol = wx.TextCtrl(G2frame.dataDisplay,value='%.2f'%(data['Form Vol']))
2015    formVol.Bind(wx.EVT_TEXT_ENTER,OnFormVol)       
2016    formVol.Bind(wx.EVT_KILL_FOCUS,OnFormVol)
2017    midSizer.Add(formVol,0)
2018    midSizer.Add(wx.StaticText(G2frame.dataDisplay,
2019        label=' Theoretical absorption: %.4f cm-1 Sample absorption: %.4f cm-1'%(Abs,Abs*data['Pack'])),
2020        0,wx.ALIGN_CENTER_VERTICAL)
2021    mainSizer.Add(midSizer,0)
2022    mainSizer.Add((5,5),0)   
2023
2024    geoBox = wx.BoxSizer(wx.HORIZONTAL)
2025    geoBox.Add(wx.StaticText(G2frame.dataDisplay,label=' Sample geometry: '),0,wx.ALIGN_CENTER_VERTICAL)
2026    choice = ['Cylinder','Bragg-Brentano','Tilting flat plate in transmission','Fixed flat plate']
2027    geometry = wx.ComboBox(G2frame.dataDisplay,value=data['Geometry'],choices=choice,
2028            style=wx.CB_READONLY|wx.CB_DROPDOWN)
2029    geometry.Bind(wx.EVT_COMBOBOX, OnGeometry)
2030    geoBox.Add(geometry,0)
2031    geoBox.Add(wx.StaticText(G2frame.dataDisplay,label=' Sample diameter/thickness, mm: '),0,wx.ALIGN_CENTER_VERTICAL)
2032    diam = wx.TextCtrl(G2frame.dataDisplay,value='%.3f'%(data['Diam']))
2033    diam.Bind(wx.EVT_TEXT_ENTER,OnDiameter)       
2034    diam.Bind(wx.EVT_KILL_FOCUS,OnDiameter)
2035#    diam.Bind(wx.EVT_SET_FOCUS,OnShowTip(G2frame,'tip')) #this doesn't work - what would????
2036    geoBox.Add(diam,0)
2037    mainSizer.Add(geoBox,0)
2038    mainSizer.Add((5,5),0)   
2039    geoBox = wx.BoxSizer(wx.HORIZONTAL)
2040    geoBox.Add(wx.StaticText(G2frame.dataDisplay,label=' Packing: '),0,wx.ALIGN_CENTER_VERTICAL)
2041    pack = wx.TextCtrl(G2frame.dataDisplay,value='%.2f'%(data['Pack']))
2042    pack.Bind(wx.EVT_TEXT_ENTER,OnPacking)       
2043    pack.Bind(wx.EVT_KILL_FOCUS,OnPacking)
2044    geoBox.Add(pack,0)
2045    geoBox.Add(wx.StaticText(G2frame.dataDisplay,label=' Sample transmission: %.3f %%'%(Trans)),0,wx.ALIGN_CENTER_VERTICAL)   
2046    mainSizer.Add(geoBox,0)
2047    mainSizer.Add((5,5),0)   
2048       
2049    mainSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' S(Q)->F(Q)->G(R) controls: '),0,wx.ALIGN_CENTER_VERTICAL)
2050    mainSizer.Add((5,5),0)
2051    sqBox = wx.BoxSizer(wx.HORIZONTAL)
2052    sqBox.Add(wx.StaticText(G2frame.dataDisplay,label=' Detector type: '),0,wx.ALIGN_CENTER_VERTICAL)
2053    choice = ['Image plate','Point detector']
2054    detType = wx.ComboBox(G2frame.dataDisplay,value=data['DetType'],choices=choice,
2055            style=wx.CB_READONLY|wx.CB_DROPDOWN)
2056    detType.Bind(wx.EVT_COMBOBOX, OnDetType)
2057    sqBox.Add(detType,0)
2058    if data['DetType'] == 'Image plate':
2059        sqBox.Add(wx.StaticText(G2frame.dataDisplay,label=' IP transmission coeff.: '),0,wx.ALIGN_CENTER_VERTICAL)
2060        obliqCoeff = wx.TextCtrl(G2frame.dataDisplay,value='%.3f'%(data['ObliqCoeff']))
2061        obliqCoeff.Bind(wx.EVT_TEXT_ENTER,OnObliqCoeff)       
2062        obliqCoeff.Bind(wx.EVT_KILL_FOCUS,OnObliqCoeff)
2063        sqBox.Add(obliqCoeff,0)
2064    mainSizer.Add(sqBox,0)
2065       
2066    sqBox = wx.BoxSizer(wx.HORIZONTAL)
2067    sqBox.Add(wx.StaticText(G2frame.dataDisplay,label=' Ruland width: '),0,wx.ALIGN_CENTER_VERTICAL)   
2068    rulandSldr = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,
2069        value=int(1000*data['Ruland']))
2070    sqBox.Add(rulandSldr,1,wx.EXPAND)
2071    rulandSldr.Bind(wx.EVT_SLIDER, OnRulSlider)
2072    rulandWdt = wx.TextCtrl(G2frame.dataDisplay,value='%.3f'%(data['Ruland']))
2073    rulandWdt.Bind(wx.EVT_TEXT_ENTER,OnRulandWdt)       
2074    rulandWdt.Bind(wx.EVT_KILL_FOCUS,OnRulandWdt)
2075    sqBox.Add(rulandWdt,0,wx.ALIGN_CENTER_VERTICAL)   
2076    mainSizer.Add(sqBox,0,wx.ALIGN_LEFT|wx.EXPAND)
2077   
2078    sqBox = wx.BoxSizer(wx.HORIZONTAL)
2079    lorch = wx.CheckBox(parent=G2frame.dataDisplay,label='Lorch damping?')
2080    lorch.SetValue(data['Lorch'])
2081    lorch.Bind(wx.EVT_CHECKBOX, OnLorch)
2082    sqBox.Add(lorch,0,wx.ALIGN_CENTER_VERTICAL)
2083    sqBox.Add(wx.StaticText(G2frame.dataDisplay,label=' Scaling q-range: '),0,wx.ALIGN_CENTER_VERTICAL)
2084    SQmin = wx.TextCtrl(G2frame.dataDisplay,value='%.1f'%(data['QScaleLim'][0]))
2085    SQmin.Bind(wx.EVT_TEXT_ENTER,OnSQmin)       
2086    SQmin.Bind(wx.EVT_KILL_FOCUS,OnSQmin)   
2087    sqBox.Add(SQmin,0)
2088    sqBox.Add(wx.StaticText(G2frame.dataDisplay,label=' to '),0,wx.ALIGN_CENTER_VERTICAL)
2089    SQmax = wx.TextCtrl(G2frame.dataDisplay,value='%.1f'%(data['QScaleLim'][1]))
2090    SQmax.Bind(wx.EVT_TEXT_ENTER,OnSQmax)       
2091    SQmax.Bind(wx.EVT_KILL_FOCUS,OnSQmax)
2092    sqBox.Add(SQmax,0)
2093    resetQ = wx.CheckBox(parent=G2frame.dataDisplay,label='Reset?')
2094    sqBox.Add(resetQ,0)
2095    resetQ.Bind(wx.EVT_CHECKBOX, OnResetQ)
2096   
2097    mainSizer.Add(sqBox,0)
2098
2099    mainSizer.Layout()   
2100    G2frame.dataDisplay.SetSizer(mainSizer)
2101    Size = mainSizer.Fit(G2frame.dataFrame)
2102    G2frame.dataDisplay.SetSize(Size)
2103    G2frame.dataFrame.setSizePosLeft(Size)
2104   
Note: See TracBrowser for help on using the repository browser.