source: trunk/GSASIIpwdGUI.py @ 479

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

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

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