source: trunk/GSASIIpwdGUI.py @ 273

Last change on this file since 273 was 273, checked in by vondreele, 11 years ago

output of S(Q) and G(R) as files for other use
some effort to fix graphics tab behavior

  • Property svn:keywords set to Date Author Revision URL Id
File size: 71.7 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-05-02 22:16:06 +0000 (Mon, 02 May 2011) $
4# $Author: vondreele $
5# $Revision: 273 $
6# $URL: trunk/GSASIIpwdGUI.py $
7# $Id: GSASIIpwdGUI.py 273 2011-05-02 22:16:06Z vondreele $
8########### SVN repository information ###################
9import wx
10import wx.grid as wg
11import numpy as np
12import math
13import time
14import cPickle
15import GSASIIpath
16import GSASIIpwd as G2pwd
17import GSASIIlattice as G2lat
18import GSASIIspc as G2spc
19import GSASIIindex as G2indx
20import GSASIIplot as G2plt
21import GSASIIgrid as G2gd
22import GSASIIElem as G2elem
23
24VERY_LIGHT_GREY = wx.Colour(235,235,235)
25
26# trig functions in degrees
27sind = lambda x: math.sin(x*math.pi/180.)
28tand = lambda x: math.tan(x*math.pi/180.)
29cosd = lambda x: math.cos(x*math.pi/180.)
30asind = lambda x: 180.*math.asin(x)/math.pi
31       
32def UpdatePeakGrid(self, data):
33    if self.dataDisplay:
34        self.dataFrame.Clear()
35   
36    def OnUnDo(event):
37        DoUnDo()
38        self.dataFrame.UnDo.Enable(False)
39       
40    def DoUnDo():
41        print 'Undo last refinement'
42        file = open(self.undofile,'rb')
43        PatternId = self.PatternId
44        for item in ['Background','Instrument Parameters','Peak List']:
45            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item),cPickle.load(file))
46            if self.dataDisplay.GetName() == item:
47                if item == 'Background':
48                    UpdateBackgroundGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
49                elif item == 'Instrument Parameters':
50                    UpdateInstrumentGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
51                elif item == 'Peak List':
52                    UpdatePeakGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
53            print item,' recovered'
54        file.close()
55       
56    def SaveState():
57        self.undofile = self.dirname+'\\GSASII.save'
58        file = open(self.undofile,'wb')
59        PatternId = self.PatternId
60        for item in ['Background','Instrument Parameters','Peak List']:
61            cPickle.dump(self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId,item)),file,1)
62        file.close()
63        self.dataFrame.UnDo.Enable(True)
64               
65    def OnPeakFit(event):
66        SaveState()
67        print 'Peak Fitting - Do one cycle of peak fitting'
68        PatternId = self.PatternId
69        PickId = self.PickId
70        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List'))
71        if not peaks:
72            self.ErrorDialog('No peaks!','Nothing to fit!')
73            return
74        background = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Background'))[0]
75        limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Limits'))[1]
76        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
77        data = self.PatternTree.GetItemPyData(PatternId)[1]
78        OK,smin,Rwp,runtime,GoOn = G2pwd.DoPeakFit(peaks,background,limits,inst,data)
79        UpdatePeakGrid(self,peaks)
80        G2plt.PlotPatterns(self)
81        if not OK:
82            print 'Refinement failed'
83            dlg = wx.MessageDialog(self, 'Do you want to reload now?', 'Refinement failed',  wx.YES_NO)
84            try:
85                if dlg.ShowModal() == wx.ID_YES:
86                    DoUnDo()
87                    self.dataFrame.UnDo.Enable(False)
88            finally:
89                dlg.Destroy()
90        else:
91            self.dataFrame.UnDo.Enable(True)
92            print "%s%7.2f%s%12.6g" % ('Rwp = ',Rwp,'%, Smin = ',smin)
93            print "%s%8.3f%s " % ('fitpeak time =',runtime,'s')
94            print 'finished'
95        return
96       
97    def OnAutoPeakFit(event):
98        SaveState()
99        print 'AutoPeak Fitting - run until minimized'
100        PatternId = self.PatternId
101        PickId = self.PickId
102        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List'))
103        if not peaks:
104            self.ErrorDialog('No peaks!','Nothing to fit!')
105            return
106        background = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Background'))[0]
107        limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Limits'))[1]
108        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
109        data = self.PatternTree.GetItemPyData(PatternId)[1]
110        smin = 1.0e15
111        GoOn = True
112        while GoOn:
113            osmin = smin
114            OK,smin,Rwp,runtime,GoOn = G2pwd.DoPeakFit(peaks,background,limits,inst,data)
115            UpdatePeakGrid(self,peaks)
116            if not OK:
117                break
118            G2plt.PlotPatterns(self)
119            print "%s%7.2f%s%12.6g" % ('Rwp = ',Rwp,'%, Smin = ',smin)
120            rat = (osmin-smin)/smin
121            if rat < 1.0e-4: GoOn = False
122        if not OK:
123            print 'Refinement failed'
124            dlg = wx.MessageDialog(self, 'Do you want to reload now?', 'Refinement failed',  wx.YES_NO)
125            try:
126                if dlg.ShowModal() == wx.ID_YES:
127                    DoUnDo()
128                    self.dataFrame.UnDo.Enable(False)
129            finally:
130                dlg.Destroy()
131        else:
132            self.dataFrame.UnDo.Enable(True)
133            print "%s%8.3f%s " % ('fitpeak time =',runtime,'s per cycle')
134            print 'finished'
135        return       
136
137    def RefreshPeakGrid(event):
138        event.StopPropagation()
139        data = self.PeakTable.GetData()
140        T = []
141        for peak in data:T.append(peak[0])
142        D = dict(zip(T,data))
143        T.sort()
144        X = []
145        for key in T: X.append(D[key])
146        data = X       
147        G2plt.PlotPatterns(self)
148       
149    def setBackgroundColors():
150       for r in range(self.dataDisplay.GetNumberRows()):
151           for c in range(self.dataDisplay.GetNumberCols()):
152               if self.dataDisplay.GetColLabelValue(c) in ['position','intensity','sigma','gamma']:
153                   if float(self.dataDisplay.GetCellValue(r,c)) < 0.:
154                       self.dataDisplay.SetCellBackgroundColour(r,c,wx.RED)
155                   else:
156                       self.dataDisplay.SetCellBackgroundColour(r,c,wx.WHITE)
157                       
158    def RefineSelect(event):
159        data = self.PatternTree.GetItemPyData(self.PickId)
160        r,c =  event.GetRow(),event.GetCol()
161        if r < 0 and self.dataDisplay.GetColLabelValue(c) == 'refine':
162            self.dataDisplay.SelectCol(c,False)
163       
164                       
165    def RowSelect(event):
166        r,c =  event.GetRow(),event.GetCol()
167        if r < 0 and c < 0:
168            if self.dataDisplay.IsSelection():
169                self.dataDisplay.ClearSelection()
170        elif c < 0:                   #only row clicks
171            if event.ControlDown():                   
172                if r in self.dataDisplay.GetSelectedRows():
173                    self.dataDisplay.DeselectRow(r)
174                else:
175                    self.dataDisplay.SelectRow(r,True)
176            elif event.ShiftDown():
177                for row in range(r+1):
178                    self.dataDisplay.SelectRow(row,True)
179            else:
180                self.dataDisplay.ClearSelection()
181                self.dataDisplay.SelectRow(r,True)               
182       
183                           
184    def KeyEditPeakGrid(event):
185        rowList = self.dataDisplay.GetSelectedRows()
186        colList = self.dataDisplay.GetSelectedCols()
187        selectList = self.dataDisplay.GetSelectedCells()
188        data = self.PatternTree.GetItemPyData(self.PickId)
189        if event.GetKeyCode() == wx.WXK_RETURN:
190            event.Skip(True)
191        elif event.GetKeyCode() == wx.WXK_CONTROL:
192            event.Skip(True)
193        elif event.GetKeyCode() == wx.WXK_SHIFT:
194            event.Skip(True)
195        elif rowList:
196            self.dataDisplay.ClearSelection()
197            if event.GetKeyCode() == wx.WXK_DELETE:
198                self.dataDisplay.ClearGrid()
199                rowList.reverse()
200                nDel = 0
201                for row in rowList:
202                    self.PeakTable.DeleteRow(row)
203                    nDel += 1
204                if nDel:
205                    msg = wg.GridTableMessage(self.PeakTable, 
206                        wg.GRIDTABLE_NOTIFY_ROWS_DELETED,0,nDel)
207                    self.dataDisplay.ProcessTableMessage(msg)
208                data = self.PeakTable.GetData()
209                self.PatternTree.SetItemPyData(self.PickId,data[:-nDel])
210                self.dataDisplay.ForceRefresh()
211                setBackgroundColors()
212                if not len(self.PatternTree.GetItemPyData(self.PickId)): 
213                    self.dataFrame.PeakFit.Enable(False)
214                    self.dataFrame.AutoPeakFit.Enable(False)
215                       
216        elif colList:
217            self.dataDisplay.ClearSelection()
218            key = event.GetKeyCode()
219            for col in colList:
220                if self.PeakTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
221                    if key == 89: #'Y'
222                        for row in range(self.PeakTable.GetNumberRows()): data[row][col]=True
223                    elif key == 78:  #'N'
224                        for row in range(self.PeakTable.GetNumberRows()): data[row][col]=False
225        elif selectList:
226            self.dataDisplay.ClearSelection()
227            key = event.GetKeyCode()
228            for row,col in selectList:
229                if self.PeakTable.GetTypeName(row,col) == wg.GRID_VALUE_BOOL:
230                    if key == 89: #'Y'
231                        data[row][col]=True
232                    elif key == 78:  #'N'
233                        data[row][col]=False
234        G2plt.PlotPatterns(self)
235           
236    self.dataFrame.SetMenuBar(self.dataFrame.PeakMenu)
237    if not self.dataFrame.GetStatusBar():
238        Status = self.dataFrame.CreateStatusBar()
239    self.Bind(wx.EVT_MENU, OnUnDo, id=G2gd.wxID_UNDO)
240    self.Bind(wx.EVT_MENU, OnPeakFit, id=G2gd.wxID_PEAKFIT)
241    self.Bind(wx.EVT_MENU, OnAutoPeakFit, id=G2gd.wxID_AUTOPEAKFIT)
242    self.dataFrame.PeakFit.Enable(False)
243    self.dataFrame.AutoPeakFit.Enable(False)
244    if data:
245        self.dataFrame.PeakFit.Enable(True)
246        self.dataFrame.AutoPeakFit.Enable(True)
247    self.PickTable = []
248    rowLabels = []
249    for i in range(len(data)): rowLabels.append(str(i+1))
250    colLabels = ['position','refine','intensity','refine','sigma','refine','gamma','refine']
251    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_BOOL,
252        wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
253        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL,
254        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL]
255    T = []
256    for peak in data:
257        T.append(peak[0])
258    D = dict(zip(T,data))
259    T.sort()
260    X = []
261    for key in T: X.append(D[key])
262    data = X       
263    self.PatternTree.SetItemPyData(self.PickId,data)
264    self.PeakTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
265    self.dataFrame.SetLabel('Peak List')
266    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)
267    self.dataDisplay.SetTable(self.PeakTable, True)
268    setBackgroundColors()                         
269    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshPeakGrid)
270    self.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPeakGrid)
271    self.dataDisplay.Bind(wg.EVT_GRID_LABEL_LEFT_CLICK, RowSelect)                 
272    self.dataDisplay.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, RefineSelect)
273    self.dataDisplay.SetMargins(0,0)
274    self.dataDisplay.AutoSizeColumns(False)
275    self.dataFrame.setSizePosLeft([535,350])
276       
277def UpdateBackgroundGrid(self,data):
278    if self.dataDisplay:
279        self.dataFrame.Clear()
280    BackId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Background')
281    maxTerm = 9
282    Types = [wg.GRID_VALUE_CHOICE+':chebyschev,another,more',
283        wg.GRID_VALUE_BOOL,
284        wg.GRID_VALUE_NUMBER+':1,'+str(maxTerm)]
285    for i in range(maxTerm):
286        Types.append(wg.GRID_VALUE_FLOAT+':10,3')
287   
288    def RefreshBackgroundGrid(event):
289        data = self.BackTable.GetData()
290        M = len(data[0])
291        N = data[0][2]+3
292        item = data[0]
293        if N > M:       #add terms
294            for i in range(M,N): 
295                item.append(0.0)
296                self.BackTable.SetColLabelValue(i,str(i-2))
297            data = [item]
298            msg = wg.GridTableMessage(self.BackTable, 
299                wg.GRIDTABLE_NOTIFY_COLS_APPENDED,0,N-M)
300            self.dataDisplay.ProcessTableMessage(msg)                         
301        elif N < M:     #delete terms
302            new = []
303            for i in range(N):
304                new.append(item[i])
305            data = [new]
306            msg = wg.GridTableMessage(self.BackTable, 
307                wg.GRIDTABLE_NOTIFY_COLS_DELETED,0,M-N)
308            self.dataDisplay.ProcessTableMessage(msg)
309        self.PatternTree.SetItemPyData(BackId,data)
310        event.StopPropagation()
311                 
312    self.BackTable = []
313    N = len(data[0])
314    M = data[0][2]
315    colLabels = ['function','refine','Nterms']
316    rowLabels=['background']
317    for i in range(M): colLabels.append(str(i+1))
318    self.BackTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
319    self.dataFrame.SetLabel('Background')
320    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
321    gridPanel = wx.Panel(self.dataFrame)
322    self.dataDisplay = G2gd.GSGrid(gridPanel)               
323    self.dataDisplay.SetTable(self.BackTable, True)
324    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshBackgroundGrid)               
325    self.dataDisplay.SetMargins(0,0)
326    self.dataDisplay.AutoSizeColumns(False)
327    mainSizer = wx.BoxSizer(wx.VERTICAL)
328    mainSizer.Add(self.dataDisplay,0)
329    mainSizer.Layout()   
330    self.dataDisplay.SetSizer(mainSizer)
331    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
332       
333def UpdateLimitsGrid(self, data):
334    if self.dataDisplay:
335        self.dataFrame.Clear()
336       
337    def RefreshLimitsGrid(event):
338        event.StopPropagation()
339        data = self.LimitsTable.GetData()
340        old = data[0]
341        new = data[1]
342        new[0] = max(old[0],new[0])
343        new[1] = max(new[0],min(old[1],new[1]))
344        data = [old,new]
345        G2plt.PlotPatterns(self)
346       
347    self.LimitsTable = []
348    colLabels = ['Tmin','Tmax']
349    rowLabels = ['original','changed']
350    Types = [wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3']
351    self.LimitsTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
352    self.dataFrame.SetLabel('Limits')
353    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
354    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)
355    self.dataDisplay.SetTable(self.LimitsTable, True)
356    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshLimitsGrid)               
357    self.dataDisplay.SetMargins(0,0)
358    self.dataDisplay.AutoSizeColumns(False)
359    self.dataFrame.setSizePosLeft([230,120])
360   
361def UpdateInstrumentGrid(self, data):
362    if self.dataDisplay:
363        self.dataFrame.Clear()
364    Ka2 = False
365    if len(data[0]) == 13: 
366        Ka2 = True
367    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
368   
369    def RefreshInstrumentGrid(event,doAnyway=False):
370        if doAnyway or event.GetRow() == 1:
371            peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
372            ins = data[1]
373            if 'P' in ins[0]:                                       #update powder peak parameters
374                for peak in peaks:
375                    if Ka2:
376                        peak[4] = ins[6]*tand(peak[0]/2.0)**2+ins[7]*tand(peak[0]/2.0)+ins[8]
377                        peak[6] = ins[9]/cosd(peak[0]/2.0)+ins[10]*tand(peak[0]/2.0)
378                    else:
379                        peak[4] = ins[4]*tand(peak[0]/2.0)**2+ins[5]*tand(peak[0]/2.0)+ins[6]
380                        peak[6] = ins[7]/cosd(peak[0]/2.0)+ins[8]*tand(peak[0]/2.0)
381                       
382    def OnReset(event):
383        if Ka2:
384            data[1][6:12] = data[0][6:12]
385        else:
386            data[1][4:10] = data[0][4:10]
387        RefreshInstrumentGrid(event,doAnyway=True)          #to get peaks updated
388        UpdateInstrumentGrid(self, data)
389       
390    self.InstrumentTable = []
391    if 'P' in data[1][0]:                   #powder data
392        self.dataFrame.SetMenuBar(self.dataFrame.InstMenu)
393        if not self.dataFrame.GetStatusBar():
394            Status = self.dataFrame.CreateStatusBar()
395        self.Bind(wx.EVT_MENU, OnReset, id=G2gd.wxID_INSTPRMRESET)
396        if Ka2:
397            Types = [wg.GRID_VALUE_CHOICE+":PXC,PNC,PNT",wg.GRID_VALUE_FLOAT+':10,6',wg.GRID_VALUE_FLOAT+':10,6',               #type, lam-1 & lam-2
398                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #zero, ratio, pola
399                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #u,v,w
400                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,2']
401        else:
402            Types = [wg.GRID_VALUE_CHOICE+":PXC,PNC,PNT",wg.GRID_VALUE_FLOAT+':10,6',               #type & lam-1
403                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #zero, pola
404                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #u,v,w
405                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,2']
406        colLabels = data[3]
407        rowLabels = ['default','changed','refine']
408        self.InstrumentTable = G2gd.Table(data[:-1],rowLabels=rowLabels,colLabels=colLabels,types=Types)
409        self.dataFrame.SetLabel('Instrument Parameters')
410        gridPanel = wx.Panel(self.dataFrame)
411        self.dataDisplay = G2gd.GSGrid(gridPanel)               
412        self.dataDisplay.SetTable(self.InstrumentTable, True)
413        self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshInstrumentGrid)               
414        self.dataDisplay.SetMargins(0,0)
415        self.dataDisplay.AutoSizeColumns(False)
416        beg = 4
417        if Ka2: beg = 6
418        for i in range(len(data[2])):
419            if i < beg or i == beg+6:
420                self.dataDisplay.SetCellRenderer(2,i,wg.GridCellStringRenderer())
421                self.dataDisplay.SetCellValue(2,i,'')
422                self.dataDisplay.SetReadOnly(2,i,isReadOnly=True)
423            else:
424                self.dataDisplay.SetCellRenderer(2,i,wg.GridCellBoolRenderer())
425                self.dataDisplay.SetCellEditor(2,i,wg.GridCellBoolEditor())
426    else:                       #single crystal data
427        Types = [wg.GRID_VALUE_CHOICE+":SXC,SNC,SNT",wg.GRID_VALUE_FLOAT+':10,6']
428        colLabels = data[2]
429        rowLabels = ['original','changed']
430        self.InstrumentTable = G2gd.Table(data[:-1],rowLabels=rowLabels,colLabels=colLabels,types=Types)
431        self.dataFrame.SetLabel('Instrument Parameters')
432        gridPanel = wx.Panel(self.dataFrame)
433        self.dataDisplay = G2gd.GSGrid(gridPanel)               
434        self.dataDisplay.SetTable(self.InstrumentTable, True)
435        self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshInstrumentGrid)               
436        self.dataDisplay.SetMargins(0,0)
437        self.dataDisplay.AutoSizeColumns(False)
438    mainSizer = wx.BoxSizer(wx.VERTICAL)
439    mainSizer.Add(self.dataDisplay,0)
440    mainSizer.Layout()   
441    self.dataDisplay.SetSizer(mainSizer)
442    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
443   
444def UpdateSampleGrid(self,data):
445    if self.dataDisplay:
446        self.dataFrame.Clear()
447    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
448    if not self.dataFrame.GetStatusBar():
449        Status = self.dataFrame.CreateStatusBar()   
450    self.dataDisplay = wx.Panel(self.dataFrame)
451   
452    if data['Type'] == 'Debye-Scherrer':
453        parms = [['DisplaceX',' Sample X displacement: ','%.4f',],
454            ['DisplaceY',' Sample Y displacement: ','%.4f',],
455            ['Absorption',' Sample absorption: ','%.4f',],]
456    elif data['Type'] == 'Bragg-Brentano':
457        parms = [['Shift',' Sample displacement: ','%.4f',],
458            ['Transparency',' Sample transparency: ','%.4f'],]
459    parms.append(['Temperature',' Sample temperature: ','%.2f'])
460    parms.append(['Pressure',' Sample pressure: ','%.3f'])
461    parms.append(['Humidity',' Sample humidity: ','%.1f'])
462    parms.append(['Voltage',' Sample voltage: ','%.3f'])
463    parms.append(['Force',' Applied load: ','%.3f'])
464    objList = {}
465
466    def OnScaleRef(event):
467        Obj = event.GetEventObject()
468        data['Scale'][1] = Obj.GetValue()
469       
470    def OnScaleVal(event):
471        Obj = event.GetEventObject()
472        try:
473            scale = float(Obj.GetValue())
474            if scale > 0:
475                data['Scale'][0] = scale
476        except ValueError:
477            pass
478        Obj.SetValue("%.4f"%(data['Scale'][0]))          #reset in case of error
479       
480    def OnHistoType(event):
481        Obj = event.GetEventObject()
482        data['Type'] = Obj.GetValue()
483        if data['Type'] == 'Bragg-Brentano' and 'Shift' not in data:    #set up defaults for new type(s)
484            data['Shift'] = [0.0,False]
485            data['Transparency'] = [0.0,False]
486        self.dataDisplay.Destroy()
487        UpdateSampleGrid(self,data)
488       
489    def OnParmRef(event):
490        Obj = event.GetEventObject()
491        parm = objList[Obj.GetId()]
492        data[parm][1] = Obj.GetValue()
493       
494    def OnParmVal(event):
495        Obj = event.GetEventObject()
496        parm = objList[Obj.GetId()]
497        try:
498            if 'list' in str(type(data[parm[0]])): 
499                data[parm[0]][0] = float(Obj.GetValue())
500            else:
501                data[parm[0]] = float(Obj.GetValue())
502        except ValueError:
503            pass
504        if 'list' in str(type(data[parm[0]])): 
505            Obj.SetValue(parm[2]%(data[parm[0]][0]))          #reset in case of error
506        else:
507            Obj.SetValue(parm[2]%(data[parm[0]]))          #reset in case of error
508               
509    mainSizer = wx.BoxSizer(wx.VERTICAL)
510    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Sample parameters: '),0,wx.ALIGN_CENTER_VERTICAL)
511    mainSizer.Add((5,5),0)
512    scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
513    scaleRef = wx.CheckBox(self.dataDisplay,label=' Histogram scale factor: ')
514    scaleRef.SetValue(data['Scale'][1])
515    scaleRef.Bind(wx.EVT_CHECKBOX, OnScaleRef)
516    scaleSizer.Add(scaleRef,0,wx.ALIGN_CENTER_VERTICAL)
517    scaleVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,
518        '%.4f'%(data['Scale'][0]),style=wx.TE_PROCESS_ENTER)
519    scaleVal.Bind(wx.EVT_TEXT_ENTER,OnScaleVal)
520    scaleVal.Bind(wx.EVT_KILL_FOCUS,OnScaleVal)
521    scaleSizer.Add(scaleVal,0,wx.ALIGN_CENTER_VERTICAL)
522    mainSizer.Add(scaleSizer)
523    mainSizer.Add((0,5),0)
524    typeSizer = wx.BoxSizer(wx.HORIZONTAL)
525    choices = ['Debye-Scherrer','Bragg-Brentano',]
526    histoType = wx.ComboBox(self.dataDisplay,wx.ID_ANY,value=data['Type'],choices=choices,
527        style=wx.CB_READONLY|wx.CB_DROPDOWN)
528    histoType.Bind(wx.EVT_COMBOBOX, OnHistoType)
529    typeSizer.Add(histoType)
530    mainSizer.Add(typeSizer)
531    mainSizer.Add((0,5),0)
532   
533    for parm in parms:
534        parmSizer = wx.BoxSizer(wx.HORIZONTAL)
535        if 'list' in str(type(data[parm[0]])):
536            parmRef = wx.CheckBox(self.dataDisplay,label=parm[1])
537            objList[parmRef.GetId()] = parm[0]
538            parmRef.SetValue(data[parm[0]][1])
539            parmRef.Bind(wx.EVT_CHECKBOX, OnParmRef)
540            parmSizer.Add(parmRef,0,wx.ALIGN_CENTER_VERTICAL)
541            parmVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,
542                parm[2]%(data[parm[0]][0]),style=wx.TE_PROCESS_ENTER)
543        else:
544            parmSizer.Add(wx.StaticText(self.dataDisplay,label=parm[1]),
545                0,wx.ALIGN_CENTER_VERTICAL)
546            parmVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,
547                parm[2]%(data[parm[0]]),style=wx.TE_PROCESS_ENTER)       
548        objList[parmVal.GetId()] = parm
549        parmVal.Bind(wx.EVT_TEXT_ENTER,OnParmVal)
550        parmVal.Bind(wx.EVT_KILL_FOCUS,OnParmVal)
551        parmSizer.Add(parmVal,0,wx.ALIGN_CENTER_VERTICAL)
552        mainSizer.Add(parmSizer)
553        mainSizer.Add((0,5),0)   
554   
555    mainSizer.Layout()   
556    self.dataDisplay.SetSizer(mainSizer)
557    Size = mainSizer.Fit(self.dataFrame)
558    self.dataDisplay.SetSize(Size)
559    self.dataFrame.setSizePosLeft(Size)
560               
561def UpdateIndexPeaksGrid(self, data):
562    IndexId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Index Peak List')
563   
564    def RefreshIndexPeaksGrid(event):
565        data = self.IndexPeaksTable.GetData()
566        self.PatternTree.SetItemPyData(IndexId,data)
567       
568    def OnReload(event):
569        data = []
570        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
571        for peak in peaks:
572            dsp = inst[1]/(2.0*sind(peak[0]/2.0))
573            data.append([peak[0],peak[2],True,False,0,0,0,dsp,0.0])
574        self.PatternTree.SetItemPyData(IndexId,data)
575        UpdateIndexPeaksGrid(self,data)
576       
577    def KeyEditPickGrid(event):
578        colList = self.dataDisplay.GetSelectedCols()
579        rowList = self.dataDisplay.GetSelectedRows()
580        data = self.PatternTree.GetItemPyData(IndexId)
581        if event.GetKeyCode() == wx.WXK_RETURN:
582            event.Skip(True)
583        elif event.GetKeyCode() == wx.WXK_CONTROL:
584            event.Skip(True)
585        elif event.GetKeyCode() == wx.WXK_SHIFT:
586            event.Skip(True)
587        elif colList:
588            self.dataDisplay.ClearSelection()
589            key = event.GetKeyCode()
590            for col in colList:
591                if self.IndexPeaksTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
592                    if key == 89: #'Y'
593                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=True
594                    elif key == 78:  #'N'
595                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=False
596           
597    if self.dataDisplay:
598        self.dataFrame.Clear()
599    self.dataFrame.SetMenuBar(self.dataFrame.IndPeaksMenu)
600    if not self.dataFrame.GetStatusBar():
601        Status = self.dataFrame.CreateStatusBar()
602    self.Bind(wx.EVT_MENU, OnReload, id=G2gd.wxID_INDXRELOAD)
603    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
604    self.dataFrame.IndexPeaks.Enable(False)
605    self.IndexPeaksTable = []
606    if data:
607        self.dataFrame.IndexPeaks.Enable(True)
608        cells = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List'))
609        if cells:
610            cellist = cells[2]
611            dmin = cells[3]
612            self.HKL = []
613            for i,cell in enumerate(cellist):
614                if cell[-1]:
615                    ibrav = cell[2]
616                    A = G2lat.cell2A(cell[3:9])
617                    self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
618                    G2indx.IndexPeaks(data,self.HKL)
619                    for hkl in self.HKL:
620                        hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
621    rowLabels = []
622    for i in range(len(data)): rowLabels.append(str(i+1))
623    colLabels = ['position','intensity','use','indexed','h','k','l','d-obs','d-calc']
624    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
625        wg.GRID_VALUE_BOOL,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,
626        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5']
627    self.PatternTree.SetItemPyData(IndexId,data)
628    self.IndexPeaksTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
629    self.dataFrame.SetLabel('Index Peak List')
630    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)               
631    self.dataDisplay.SetTable(self.IndexPeaksTable, True)
632    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshIndexPeaksGrid)
633    self.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPickGrid)                 
634    self.dataDisplay.SetMargins(0,0)
635    self.dataDisplay.AutoSizeColumns(False)
636    self.dataFrame.setSizePosLeft([490,300])
637 
638def UpdateUnitCellsGrid(self, data):
639    UnitCellsId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List')
640    bravaisSymb = ['Fm3m','Im3m','Pm3m','R3-H','P6/mmm','I4/mmm',
641        'P4/mmm','Fmmm','Immm','Cmmm','Pmmm','C2/m','P2/m','P1']
642    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',
643        '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']
644       
645    def SetLattice(controls):
646        ibrav = bravaisSymb.index(controls[5])
647        if ibrav in [0,1,2]:
648            controls[7] = controls[8] = controls[6]
649            controls[9] = controls[10] = controls[11] = 90.
650        elif ibrav in [3,4,5,6]:
651            controls[7] = controls[6]
652            controls[9] = controls[10] = controls[11] = 90.
653            if ibrav in [3,4]:
654                controls[11] = 120.
655        elif ibrav in [7,8,9,10]:
656            controls[9] = controls[10] = controls[11] = 90.
657        elif ibrav in [11,12]:
658            controls[9] = controls[11] = 90.  # b unique
659        if len(controls) < 13: controls.append(0)
660        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
661        return ibrav
662       
663    def OnNcNo(event):
664        controls[2] = NcNo.GetValue()
665       
666    def OnStartVol(event):
667        try:
668            stVol = int(startVol.GetValue())
669        except ValueError:
670            stVol = 25
671        controls[3] = stVol
672        startVol.SetValue("%d"%(stVol))
673       
674    def OnBravais(event):
675        Obj = event.GetEventObject()
676        bravais[bravList.index(Obj.GetId())] = Obj.GetValue()
677       
678    def OnZero(event):
679        try:
680            Zero = min(0.1,max(-0.1,float(zero.GetValue())))
681        except ValueError:
682            Zero = 0.1
683        controls[1] = Zero
684        zero.SetValue("%.2f"%(Zero))
685       
686    def OnZeroVar(event):
687        controls[0] = zeroVar.GetValue()
688       
689    def OnBravSel(event):
690        controls[5] = bravSel.GetString(bravSel.GetSelection())       
691        UpdateUnitCellsGrid(self,data)
692       
693    def OnCellChange(event):
694        ibrav = bravaisSymb.index(controls[5])
695        Obj = event.GetEventObject()
696        ObjId = cellList.index(Obj.GetId())
697        try:
698            value = max(1.0,float(Obj.GetValue()))
699        except ValueError:
700            if ObjId < 3:               #bad cell edge - reset
701                value = controls[6+ObjId]
702            else:                       #bad angle
703                value = 90.
704        if ibrav in [0,1,2]:
705            controls[6] = controls[7] = controls[8] = value
706            controls[9] = controls[10] = controls[11] = 90.0
707            Obj.SetValue("%.5f"%(controls[6]))
708        elif ibrav in [3,4,5,6]:
709            if ObjId == 0:
710                controls[6] = controls[7] = value
711                Obj.SetValue("%.5f"%(controls[6]))
712            else:
713                controls[8] = value
714                Obj.SetValue("%.5f"%(controls[8]))
715            controls[9] = controls[10] = controls[11] = 90.0
716            if ibrav in [3,4]:
717                controls[11] = 120.
718        elif ibrav in [7,8,9,10]:
719            controls[6+ObjId] = value
720            Obj.SetValue("%.5f"%(controls[6+ObjId]))
721            controls[9] = controls[10] = controls[11] = 90.0
722        elif ibrav in [11,12]:
723            controls[9] = controls[11] = 90.0
724            if ObjId != 3:
725                controls[6+ObjId] = value
726                Obj.SetValue("%.5f"%(controls[6+ObjId]))
727            else:
728                controls[10] = value
729                Obj.SetValue("%.3f"%(controls[10]))
730        else:
731            controls[6+ObjId] = value
732            if ObjId < 3:
733                Obj.SetValue("%.5f"%(controls[6+ObjId]))
734            else:
735                Obj.SetValue("%.3f"%(controls[6+ObjId]))
736        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
737        volVal.SetValue("%.3f"%(controls[12]))
738       
739    def OnHklShow(event):
740        hklShow.SetValue(False)
741        PatternId = self.PatternId
742        PickId = self.PickId   
743        limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Limits'))[1]
744        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
745        cell = controls[6:12]
746        A = G2lat.cell2A(cell)
747        ibrav = bravaisSymb.index(controls[5])
748        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
749        inst = dict(zip(inst[3],inst[1]))
750        if 'Lam' in inst:
751            wave = inst['Lam']
752        else:
753            wave = inst['Lam1']
754        dmin = wave/(2.0*sind(limits[1]/2.0))
755        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
756        for hkl in self.HKL:
757            hkl.append(2.0*asind(wave/(2.*hkl[3])))             
758        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
759            G2plt.PlotPowderLines(self)
760        else:
761            G2plt.PlotPatterns(self)
762       
763       
764    def RefineCell(event):
765        def cellPrint(ibrav,A):
766            cell = G2lat.A2cell(A)
767            Vol = G2lat.calc_V(A)
768            if ibrav in [0,1,2]:
769                print "%s%10.6f" % ('a =',cell[0])
770            elif ibrav in [3,4,5,6]:
771                print "%s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],' c =',cell[2],' volume =',Vol)
772            elif ibrav in [7,8,9,10]:
773                print "%s%10.6f %s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],' volume =',Vol)
774            elif ibrav in [11,12]:
775                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)
776            else:
777                print "%s%10.6f %s%10.6f %s%10.6f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2])
778                print "%s%8.3f %s%8.3f %s%8.3f %s%12.3f" % ('alpha =',cell[3],'beta =',cell[4],'gamma =',cell[5],' volume =',Vol)
779             
780        PatternId = self.PatternId
781        PickId = self.PickId   
782        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
783        if not peaks:
784            self.ErrorDialog('No peaks!', 'Nothing to refine!')
785            return       
786        print 'Refine cell'
787        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
788        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
789        cell = controls[6:12]
790        A = G2lat.cell2A(cell)
791        print controls[5]
792        ibrav = bravaisSymb.index(controls[5])
793        dmin = G2indx.getDmin(peaks)-0.005
794        Lhkl,M20,X20 = G2indx.refinePeaks(peaks,ibrav,A)
795        controls[6:12] = G2lat.A2cell(A)
796        controls[12] = G2lat.calc_V(A)
797        data = [controls,bravais,cells,dmin]
798        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
799        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
800        UpdateUnitCellsGrid(self,data)
801        print "%s%10.3f" % ('refinement M20 = ',M20)
802        print 'unindexed lines = ',X20
803        cellPrint(ibrav,A)
804        for hkl in self.HKL:
805            hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
806        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
807            G2plt.PlotPowderLines(self)
808        else:
809            G2plt.PlotPatterns(self)
810       
811    def IndexPeaks(event):
812        PatternId = self.PatternId   
813#        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
814#        if not peaks:
815#            self.ErrorDialog('No peaks!', 'Nothing to index!')
816#            return
817        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
818        print 'Peak Indexing'
819        try:
820            controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
821            cells = []
822        except ValueError:
823            self.ErrorDialog('Error','Need to set controls in Unit Cell List first')
824            return
825        if True not in bravais:
826            self.ErrorDialog('Error','No Bravais lattices selected')
827            return
828        self.dataFrame.CopyCell.Enable(False)
829        OK,dmin,cells = G2indx.DoIndexPeaks(peaks,inst,controls,bravais)
830        if OK:
831            data = [controls,bravais,cells,dmin]
832            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
833            UpdateUnitCellsGrid(self,data)
834            bestCell = cells[0]
835            if bestCell[0] > 10.:
836                self.HKL = G2lat.GenHBravais(dmin,bestCell[2],G2lat.cell2A(bestCell[3:9]))
837                for hkl in self.HKL:
838                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
839                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
840                    G2plt.PlotPowderLines(self)
841                else:
842                    G2plt.PlotPatterns(self)
843        self.dataFrame.CopyCell.Enable(True)
844        self.dataFrame.IndexPeaks.Enable(True)
845        self.dataFrame.MakeNewPhase.Enable(True)
846        UpdateUnitCellsGrid(self,data)
847               
848    def CopyUnitCell(event):
849        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)
850        for Cell in cells:
851            if Cell[-1]:
852                break
853        cell = Cell[2:9]
854        controls[4] = 1
855        controls[5] = bravaisSymb[cell[0]]
856        controls[6:12] = cell[1:8]
857        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
858        self.PatternTree.SetItemPyData(UnitCellsId,[controls,bravais,cells,dmin])
859        UpdateUnitCellsGrid(self,data)
860        self.dataFrame.RefineCell.Enable(True)
861       
862    def MakeNewPhase(event):
863        if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
864            sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
865        else:
866            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
867        PhaseName = ''
868        dlg = wx.TextEntryDialog(None,'Enter a name for this phase','Phase Name Entry','New phase',
869            style=wx.OK)
870        if dlg.ShowModal() == wx.ID_OK:
871            PhaseName = dlg.GetValue()
872        dlg.Destroy()
873        cells = self.PatternTree.GetItemPyData(UnitCellsId)[2]
874        for Cell in cells:
875            if Cell[-1]:
876                break
877        cell = Cell[2:10]       
878        sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
879        E,SGData = G2spc.SpcGroup(spaceGroups[cell[0]])
880        self.PatternTree.SetItemPyData(sub, \
881            {'General':{'Name':'phase name','Type':'nuclear','SGData':SGData,
882            'Cell':[False,]+cell[1:],
883            'Pawley dmin':0.25},'Atoms':[],'Drawing':{},'Histograms':{}})
884        Status.SetStatusText('Change space group if needed')
885           
886    def RefreshUnitCellsGrid(event):
887        cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)[2:]
888        r,c =  event.GetRow(),event.GetCol()
889        if cells:
890            if c == 2:
891                for i in range(len(cells)):
892                    cells[i][-1] = False
893                    UnitCellsTable.SetValue(i,c,False)
894                UnitCellsTable.SetValue(r,c,True)
895                cells[r][-1] = True
896                ibrav = cells[r][2]
897                A = G2lat.cell2A(cells[r][3:9])
898                self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
899                for hkl in self.HKL:
900                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
901                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
902                    G2plt.PlotPowderLines(self)
903                else:
904                    G2plt.PlotPatterns(self)
905       
906    if self.dataDisplay:
907        self.dataFrame.Clear()
908    self.dataFrame.SetMenuBar(self.dataFrame.IndexMenu)
909    if not self.dataFrame.GetStatusBar():
910        Status = self.dataFrame.CreateStatusBar()
911    self.Bind(wx.EVT_MENU, IndexPeaks, id=G2gd.wxID_INDEXPEAKS)
912    self.Bind(wx.EVT_MENU, CopyUnitCell, id=G2gd.wxID_COPYCELL)
913    self.Bind(wx.EVT_MENU, RefineCell, id=G2gd.wxID_REFINECELL)
914    self.Bind(wx.EVT_MENU, MakeNewPhase, id=G2gd.wxID_MAKENEWPHASE)
915   
916    controls,bravais,cells,dmin = data
917    if len(controls) < 13:              #add cell volume if missing
918        controls.append(G2lat.calc_V(G2lat.cell2A(controls[6:12])))
919    self.PatternTree.SetItemPyData(UnitCellsId,data)            #update with volume
920    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
921    bravaisNames = ['Cubic-F','Cubic-I','Cubic-P','Trigonal-R','Trigonal/Hexagonal-P',
922        'Tetragonal-I','Tetragonal-P','Orthorhombic-F','Orthorhombic-I','Orthorhombic-C',
923        'Orthorhombic-P','Monoclinic-C','Monoclinic-P','Triclinic']
924    cellGUIlist = [[[0,1,2],4,zip([" Unit cell: a = "," Vol = "],["%.5f","%.3f"],[True,False],[0,0])],
925    [[3,4,5,6],6,zip([" Unit cell: a = "," c = "," Vol = "],["%.5f","%.5f","%.3f"],[True,True,False],[0,2,0])],
926    [[7,8,9,10],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "],["%.5f","%.5f","%.5f","%.3f"],
927        [True,True,True,False],[0,1,2,0])],
928    [[11,12],10,zip([" Unit cell: a = "," b = "," c = "," beta = "," Vol = "],
929        ["%.5f","%.5f","%.5f","%.3f","%.3f"],[True,True,True,True,False],[0,1,2,4,0])],
930    [[13,],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "," alpha = "," beta = "," gamma = "],
931        ["%.5f","%.5f","%.5f","%.3f","%.3f","%.3f","%.3f"],
932        [True,True,True,False,True,True,True],[0,1,2,0,3,4,5])]]
933   
934    self.dataFrame.SetLabel('Unit Cells List')
935    self.sp = wx.SplitterWindow(self.dataFrame)
936    self.dataDisplay = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
937    self.dataFrame.IndexPeaks.Enable(False)
938    peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Index Peak List'))
939    if peaks:
940        self.dataFrame.IndexPeaks.Enable(True)
941    self.dataFrame.RefineCell.Enable(False)
942    if controls[12] > 1.0:                               #if a "real" volume (i.e. not default)
943        self.dataFrame.RefineCell.Enable(True)   
944    self.dataFrame.CopyCell.Enable(False)
945    self.dataFrame.MakeNewPhase.Enable(False)       
946    if cells:
947        self.bottom = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
948        self.sp.SplitHorizontally(self.dataDisplay,self.bottom,0)
949        self.dataFrame.CopyCell.Enable(True)
950        self.dataFrame.MakeNewPhase.Enable(True)       
951    mainSizer = wx.BoxSizer(wx.VERTICAL)
952    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Indexing controls: '),0,wx.ALIGN_CENTER_VERTICAL)
953    mainSizer.Add((5,5),0)
954    littleSizer = wx.FlexGridSizer(2,5,5,5)
955    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max Nc/Nobs '),0,wx.ALIGN_CENTER_VERTICAL)
956    NcNo = wx.SpinCtrl(self.dataDisplay)
957    NcNo.SetRange(1,6)
958    NcNo.SetValue(controls[2])
959    NcNo.Bind(wx.EVT_SPINCTRL,OnNcNo)
960    littleSizer.Add(NcNo,0,wx.ALIGN_CENTER_VERTICAL)
961    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start Volume '),0,wx.ALIGN_CENTER_VERTICAL)
962    startVol = wx.TextCtrl(self.dataDisplay,value=str(controls[3]),style=wx.TE_PROCESS_ENTER)
963    startVol.Bind(wx.EVT_TEXT_ENTER,OnStartVol)
964    startVol.Bind(wx.EVT_KILL_FOCUS,OnStartVol)
965    littleSizer.Add(startVol,0,wx.ALIGN_CENTER_VERTICAL)
966    mainSizer.Add(littleSizer,0)
967    mainSizer.Add((5,5),0)
968    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Select Bravais Lattices for indexing: '),
969        0,wx.ALIGN_CENTER_VERTICAL)
970    mainSizer.Add((5,5),0)
971    littleSizer = wx.FlexGridSizer(2,7,5,5)
972    bravList = []
973    bravs = zip(bravais,bravaisNames)
974    for brav,bravName in bravs:
975        bravCk = wx.CheckBox(self.dataDisplay,label=bravName)
976        bravList.append(bravCk.GetId())
977        bravCk.SetValue(brav)
978        bravCk.Bind(wx.EVT_CHECKBOX,OnBravais)
979        littleSizer.Add(bravCk,0,wx.ALIGN_CENTER_VERTICAL)
980    mainSizer.Add(littleSizer,0)
981    mainSizer.Add((5,5),0)
982    littleSizer = wx.FlexGridSizer(1,3,5,5)
983    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Zero offset"),0,wx.ALIGN_CENTER_VERTICAL)
984    zero = wx.TextCtrl(self.dataDisplay,value="%.2f"%(controls[1]),style=wx.TE_PROCESS_ENTER)
985    zero.Bind(wx.EVT_TEXT_ENTER,OnZero)
986    zero.Bind(wx.EVT_KILL_FOCUS,OnZero)
987    littleSizer.Add(zero,0,wx.ALIGN_CENTER_VERTICAL)
988    zeroVar = wx.CheckBox(self.dataDisplay,label="Vary? (not implemented)")
989    zeroVar.Bind(wx.EVT_CHECKBOX,OnZeroVar)
990    littleSizer.Add(zeroVar,0,wx.ALIGN_CENTER_VERTICAL)
991    mainSizer.Add(littleSizer,0)
992    mainSizer.Add((5,5),0)
993    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Cell Refinement: '),0,wx.ALIGN_CENTER_VERTICAL)
994    mainSizer.Add((5,5),0)
995    littleSizer = wx.FlexGridSizer(1,3,5,5)
996    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Bravais lattice "),0,wx.ALIGN_CENTER_VERTICAL)
997    bravSel = wx.Choice(self.dataDisplay,choices=bravaisSymb)
998    bravSel.SetSelection(bravaisSymb.index(controls[5]))
999    bravSel.Bind(wx.EVT_CHOICE,OnBravSel)
1000    littleSizer.Add(bravSel,0,wx.ALIGN_CENTER_VERTICAL)
1001    hklShow = wx.CheckBox(self.dataDisplay,label="Show starting hkl positions")
1002    hklShow.Bind(wx.EVT_CHECKBOX,OnHklShow)
1003    littleSizer.Add(hklShow,0,wx.ALIGN_CENTER_VERTICAL)
1004    mainSizer.Add(littleSizer,0)
1005    mainSizer.Add((5,5),0)
1006    ibrav = SetLattice(controls)
1007    for cellGUI in cellGUIlist:
1008        if ibrav in cellGUI[0]:
1009            useGUI = cellGUI
1010    cellList = []
1011    littleSizer = wx.FlexGridSizer(2,useGUI[1],5,5)
1012    for txt,fmt,ifEdit,Id in useGUI[2]:
1013        littleSizer.Add(wx.StaticText(self.dataDisplay,label=txt),0,wx.ALIGN_CENTER_VERTICAL)
1014        if ifEdit:          #a,b,c,etc.
1015            cellVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[6+Id])),style=wx.TE_PROCESS_ENTER)
1016            cellVal.Bind(wx.EVT_TEXT_ENTER,OnCellChange)       
1017            cellVal.Bind(wx.EVT_KILL_FOCUS,OnCellChange)
1018            littleSizer.Add(cellVal,0,wx.ALIGN_CENTER_VERTICAL)
1019            cellList.append(cellVal.GetId())
1020        else:               #volume
1021            volVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[12])),style=wx.TE_READONLY)
1022            volVal.SetBackgroundColour(VERY_LIGHT_GREY)
1023            littleSizer.Add(volVal,0,wx.ALIGN_CENTER_VERTICAL)
1024    mainSizer.Add(littleSizer,0)
1025    mainSizer.Layout()   
1026    self.dataDisplay.SetSizer(mainSizer)
1027    topSize = mainSizer.Fit(self.dataFrame)
1028    self.dataDisplay.SetSize(topSize)
1029    if cells:
1030        if ibrav == 13:
1031            topSize[1] += 230
1032        else:
1033            topSize[1] += 200
1034    self.dataFrame.setSizePosLeft(topSize)
1035   
1036   
1037    if cells:
1038        bottomSize = self.bottom.GetSize()
1039        if ibrav == 13:
1040            bottomSize[1] -= 240
1041        else:
1042            bottomSize[1] -= 210
1043        wx.StaticText(parent=self.bottom,label=' Indexing Result ')
1044        rowLabels = []
1045        colLabels = ['M20','X20','use','Bravais','a','b','c','alpha','beta','gamma','Volume']
1046        Types = [wg.GRID_VALUE_FLOAT+':10,2',wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING,
1047            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',
1048            wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',
1049            wg.GRID_VALUE_FLOAT+':10,2']
1050        numRows = len(cells)
1051        table = []
1052        for cell in cells:
1053            rowLabels.append('')
1054            row = cell[0:2]+[cell[-1]]+[bravaisSymb[cell[2]]]+cell[3:10]
1055            if cell[-1]:
1056                A = G2lat.cell2A(cell[3:9])
1057                self.HKL = G2lat.GenHBravais(dmin,cell[2],A)
1058                for hkl in self.HKL:
1059                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
1060            table.append(row)
1061        UnitCellsTable = G2gd.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1062        gridDisplay = G2gd.GSGrid(self.bottom)
1063        gridDisplay.SetPosition(wx.Point(0,20))               
1064        gridDisplay.SetTable(UnitCellsTable, True)
1065        self.dataFrame.CopyCell.Enable(True)
1066        gridDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshUnitCellsGrid)
1067        gridDisplay.SetMargins(0,0)
1068        gridDisplay.SetRowLabelSize(0)
1069        gridDisplay.AutoSizeColumns(False)
1070        for r in range(gridDisplay.GetNumberRows()):
1071            for c in range(gridDisplay.GetNumberCols()):
1072                if c == 2:
1073                    gridDisplay.SetReadOnly(r,c,isReadOnly=False)
1074                else:
1075                    gridDisplay.SetReadOnly(r,c,isReadOnly=True)
1076        gridDisplay.SetSize(bottomSize)
1077
1078def UpdatePDFGrid(self,data):
1079    global inst
1080    tth2q = lambda t,w:4.0*math.pi*sind(t/2.0)/w
1081    dataFile = self.PatternTree.GetItemText(self.PatternId)
1082    powName = 'PWDR'+dataFile[4:]
1083    powId = G2gd.GetPatternTreeItemId(self,self.root, powName)
1084    fullLimits,limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Limits'))
1085    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Instrument Parameters'))
1086    inst = dict(zip(inst[3],inst[1]))
1087    if 'Lam' in inst:
1088        keV = 12.397639/inst['Lam']
1089    else:
1090        keV = 12.397639/inst['Lam1']
1091    wave = 12.397639/keV
1092    qLimits = [tth2q(fullLimits[0],wave),tth2q(fullLimits[1],wave)]
1093    data['QScaleLim'][1] = min(qLimits[1],data['QScaleLim'][1])
1094    if data['QScaleLim'][0]:
1095        data['QScaleLim'][0] = max(qLimits[0],data['QScaleLim'][0])
1096    else:                                #initial setting at 90% of max Q
1097        data['QScaleLim'][0] = 0.90*data['QScaleLim'][1]
1098    polariz = inst['Polariz.']
1099    azimuth = inst['Azimuth']
1100    itemDict = {}
1101   
1102    def FillFileSizer(fileSizer,key):
1103        #fileSizer is a FlexGridSizer(3,6)
1104       
1105        def OnSelectFile(event):
1106            Obj = event.GetEventObject()
1107            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1108            if itemKey == 'Name':
1109                value = Obj.GetValue()
1110            Obj.SetValue(fmt%(value))
1111            data[fileKey][itemKey] = value
1112            UpdatePDFGrid(self,data)
1113       
1114        def OnValueChange(event):
1115            Obj = event.GetEventObject()
1116            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1117            try:
1118                value = float(Obj.GetValue())
1119            except ValueError:
1120                value = -1.0
1121            Obj.SetValue(fmt%(value))
1122            data[fileKey][itemKey] = value
1123            auxPlot = ComputePDF(data)
1124            G2plt.PlotISFG(self,newPlot=True)
1125                       
1126        item = data[key]
1127        fileList = np.array(GetFileList('PWDR')).T[1]
1128        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' '+key+' file:'),0,wx.ALIGN_CENTER_VERTICAL)
1129        fileName = wx.ComboBox(self.dataDisplay,value=item['Name'],choices=fileList,
1130            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1131        itemDict[fileName.GetId()] = [key,'Name','%s']
1132        fileName.Bind(wx.EVT_COMBOBOX,OnSelectFile)       
1133        fileSizer.Add(fileName,0,)
1134        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Multiplier:'),0,wx.ALIGN_CENTER_VERTICAL)
1135        mult = wx.TextCtrl(self.dataDisplay,value='%.3f'%(item['Mult']),style=wx.TE_PROCESS_ENTER)
1136        itemDict[mult.GetId()] = [key,'Mult','%.3f']
1137        mult.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1138        mult.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1139        fileSizer.Add(mult,0,)
1140        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Add:'),0,wx.ALIGN_CENTER_VERTICAL)
1141        add = wx.TextCtrl(self.dataDisplay,value='%.0f'%(item['Add']),style=wx.TE_PROCESS_ENTER)
1142        itemDict[add.GetId()] = [key,'Add','%.0f']
1143        add.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1144        add.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1145        fileSizer.Add(add,0,)
1146       
1147    def SumElementVolumes():
1148        sumVol = 0.
1149        ElList = data['ElList']
1150        for El in ElList:
1151            Avol = (4.*math.pi/3.)*ElList[El]['Drad']**3
1152            sumVol += Avol*ElList[El]['FormulaNo']
1153        return sumVol
1154        auxPlot = ComputePDF(data)
1155        G2plt.PlotISFG(self,newPlot=True)       
1156       
1157    def FillElemSizer(elemSizer,ElData):
1158       
1159        def OnFractionChange(event):
1160            try:
1161                value = max(0.0,float(num.GetValue()))
1162            except ValueError:
1163                value = 0.0
1164            num.SetValue('%.3f'%(value))
1165            ElData['FormulaNo'] = value
1166            data['Form Vol'] = max(10.0,SumElementVolumes())
1167            formVol.SetValue('%.2f'%(data['Form Vol']))
1168            UpdatePDFGrid(self,data)
1169            auxPlot = ComputePDF(data)
1170            G2plt.PlotISFG(self,newPlot=True)       
1171       
1172        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1173            label=' Element: '+'%2s'%(ElData['Symbol'])+' * '),0,wx.ALIGN_CENTER_VERTICAL)
1174        num = wx.TextCtrl(self.dataDisplay,value='%.3f'%(ElData['FormulaNo']),style=wx.TE_PROCESS_ENTER)
1175        num.Bind(wx.EVT_TEXT_ENTER,OnFractionChange)       
1176        num.Bind(wx.EVT_KILL_FOCUS,OnFractionChange)
1177        elemSizer.Add(num,0,wx.ALIGN_CENTER_VERTICAL)
1178        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1179            label="f': %.3f"%(ElData['fp'])+' f": %.3f'%(ElData['fpp'])+' mu: %.2f barns'%(ElData['mu']) ),
1180            0,wx.ALIGN_CENTER_VERTICAL)
1181           
1182    def OnGeometry(event):
1183        data['Geometry'] = geometry.GetValue()
1184        UpdatePDFGrid(self,data)
1185        auxPlot = ComputePDF(data)
1186        G2plt.PlotISFG(self,newPlot=True)       
1187       
1188    def OnDetType(event):
1189        data['DetType'] = detType.GetValue()
1190        UpdatePDFGrid(self,data)
1191        auxPlot = ComputePDF(data)
1192        G2plt.PlotISFG(self,newPlot=True)       
1193       
1194    def OnFormVol(event):
1195        try:
1196            value = float(formVol.GetValue())
1197            if value <= 0.0:
1198                raise ValueError
1199        except ValueError:
1200            value = data['Form Vol']
1201        data['Form Vol'] = value
1202        UpdatePDFGrid(self,data)
1203        auxPlot = ComputePDF(data)
1204        G2plt.PlotISFG(self,newPlot=False)       
1205       
1206    def OnDiameter(event):
1207        try:
1208            value = float(diam.GetValue())
1209            if value <= 0.0:
1210                raise ValueError
1211        except ValueError:
1212            value = data['Diam']
1213        data['Diam'] = value
1214        UpdatePDFGrid(self,data)
1215        auxPlot = ComputePDF(data)
1216        G2plt.PlotISFG(self,newPlot=False)
1217       
1218    def OnPolaVal(event):
1219        try:
1220            value = float(polaVal.GetValue())
1221            if not (0.0 <= value <= 1.0):
1222                raise ValueError
1223        except ValueError:
1224            value = inst['Polariz.']
1225        inst['Polariz.'] = value
1226        polaVal.SetValue('%.2f'%(inst['Polariz.']))
1227        UpdatePDFGrid(self,data)
1228        auxPlot = ComputePDF(data)
1229        G2plt.PlotISFG(self,newPlot=False)
1230               
1231    def OnAzimVal(event):
1232        try:
1233            value = float(azimVal.GetValue())
1234            if not (0. <= value <= 360.):
1235                raise ValueError
1236        except ValueError:
1237            value = inst['Azimuth']
1238        inst['Azimuth'] = value
1239        azimVal.SetValue('%.1f'%(inst['Azimuth']))
1240        UpdatePDFGrid(self,data)
1241        auxPlot = ComputePDF(data)
1242        G2plt.PlotISFG(self,newPlot=False)
1243                       
1244    def OnObliqCoeff(event):
1245        try:
1246            value = float(obliqCoeff.GetValue())
1247            if value < 0.0:
1248                raise ValueError
1249            elif value > 1.0:
1250                value = 1.0
1251        except ValueError:
1252            value = data['ObliqCoeff']
1253        data['ObliqCoeff'] = value
1254        obliqCoeff.SetValue('%.3f'%(value))
1255        auxPlot = ComputePDF(data)
1256        G2plt.PlotISFG(self,newPlot=False)
1257       
1258    def OnRulandWdt(event):
1259        try:
1260            value = float(rulandWdt.GetValue())
1261            if value <= 0.001:
1262                raise ValueError
1263            elif value > 1.0:
1264                value = 1.0
1265        except ValueError:
1266            value = data['Ruland']
1267        data['Ruland'] = value
1268        rulandWdt.SetValue('%.3f'%(value))
1269        auxPlot = ComputePDF(data)
1270        G2plt.PlotISFG(self,newPlot=False)
1271       
1272    def OnRulSlider(event):
1273        value = int(rulandSldr.GetValue())/1000.
1274        data['Ruland'] = max(0.001,value)
1275        rulandWdt.SetValue('%.3f'%(data['Ruland']))
1276        auxPlot = ComputePDF(data)
1277        G2plt.PlotISFG(self,newPlot=False)
1278       
1279    def OnLorch(event):
1280        data['Lorch'] = lorch.GetValue()
1281        auxPlot = ComputePDF(data)
1282        G2plt.PlotISFG(self,newPlot=False)       
1283                       
1284    def OnPacking(event):
1285        try:
1286            value = float(pack.GetValue())
1287            if value <= 0.0:
1288                raise ValueError
1289        except ValueError:
1290            value = data['Pack']
1291        data['Pack'] = value
1292        UpdatePDFGrid(self,data)
1293        auxPlot = ComputePDF(data)
1294        G2plt.PlotISFG(self,newPlot=False)       
1295               
1296    def OnSQmin(event):
1297        try:
1298            value = float(SQmin.GetValue())
1299            if value < qLimits[0]:
1300                raise ValueError
1301        except ValueError:
1302            value = max(qLimits[0],data['QScaleLim'][0])
1303        data['QScaleLim'][0] = value
1304        SQmin.SetValue('%.1f'%(value))
1305        auxPlot = ComputePDF(data)
1306        G2plt.PlotISFG(self,newPlot=True)       
1307       
1308    def OnSQmax(event):
1309        try:
1310            value = float(SQmax.GetValue())
1311            if value > qLimits[1]:
1312                raise ValueError
1313        except ValueError:
1314            value = min(qLimits[1],data['QScaleLim'][1])
1315        data['QScaleLim'][1] = value
1316        if value < data['QScaleLim'][0]:
1317            data['QScaleLim'][0] = 0.90*value
1318            SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1319        SQmax.SetValue('%.1f'%(value))
1320        auxPlot = ComputePDF(data)
1321        G2plt.PlotISFG(self,newPlot=True)
1322       
1323    def OnResetQ(event):
1324        resetQ.SetValue(False)
1325        data['QScaleLim'][1] = qLimits[1]
1326        SQmax.SetValue('%.1f'%(data['QScaleLim'][1]))
1327        data['QScaleLim'][0] = 0.9*qLimits[1]
1328        SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1329        auxPlot = ComputePDF(data)
1330        G2plt.PlotISFG(self,newPlot=True)       
1331
1332    def GetFileList(fileType,skip=None):
1333        fileList = [[False,'',0]]
1334        Source = ''
1335        id, cookie = self.PatternTree.GetFirstChild(self.root)
1336        while id:
1337            name = self.PatternTree.GetItemText(id)
1338            if fileType in name:
1339                if id == skip:
1340                    Source = name
1341                else:
1342                    fileList.append([False,name,id])
1343            id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1344        if skip:
1345            return fileList,Source
1346        else:
1347            return fileList
1348       
1349    def OnCopyPDFControls(event):
1350        import copy
1351        TextList,Source = GetFileList('PDF',skip=self.PatternId)
1352        TextList[0] = [False,'All PDF',0]
1353        if len(TextList) == 1:
1354            self.ErrorDialog('Nothing to copy controls to','There must be more than one "PDF" pattern')
1355            return
1356        dlg = self.CopyDialog(self,'Copy PDF controls','Copy controls from '+Source+' to:',TextList)
1357        try:
1358            if dlg.ShowModal() == wx.ID_OK:
1359                result = dlg.GetData()
1360                if result[0][0]:
1361                    result = TextList[1:]
1362                    for item in result: item[0] = True
1363                for i,item in enumerate(result):
1364                    ifcopy,name,id = item
1365                    if ifcopy:
1366                        olddata = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'))
1367                        sample = olddata['Sample']
1368                        olddata.update(data)
1369                        olddata['Sample'] = sample
1370                        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'),olddata)
1371                Status.SetStatusText('PDF controls copied')
1372        finally:
1373            dlg.Destroy()
1374               
1375    def OnSavePDFControls(event):
1376        print 'save PDF controls?'
1377       
1378    def OnLoadPDFControls(event):
1379        print 'Load PDF controls?'
1380       
1381    def OnAddElement(event):
1382        ElList = data['ElList']
1383        PE = G2elem.PickElement(self,oneOnly=True)
1384        if PE.ShowModal() == wx.ID_OK:
1385            El = PE.Elem
1386            if El not in ElList:
1387                ElemSym = El.strip().upper()               
1388                FpMu = G2elem.FPcalc(G2elem.GetXsectionCoeff(ElemSym), keV)
1389                ElData = G2elem.GetFormFactorCoeff(ElemSym)[0]
1390                ElData['FormulaNo'] = 0.0
1391                ElData.update(G2elem.GetAtomInfo(ElemSym))
1392                ElData.update(dict(zip(['fp','fpp','mu'],FpMu)))
1393                ElData.update(G2elem.GetFFC5(El))
1394                data['ElList'][El] = ElData
1395            data['Form Vol'] = max(10.0,SumElementVolumes())
1396        PE.Destroy()
1397        UpdatePDFGrid(self,data)
1398       
1399    def OnDeleteElement(event):
1400        ElList = data['ElList']
1401        choice = ElList.keys()
1402        dlg = G2elem.DeleteElement(self,choice=choice)
1403        if dlg.ShowModal() == wx.ID_OK:
1404            del ElList[dlg.GetDeleteElement()]
1405        dlg.Destroy()
1406        UpdatePDFGrid(self,data)
1407               
1408    def ComputePDF(Data):
1409        xydata = {}
1410        for key in ['Sample','Sample Bkg.','Container','Container Bkg.']:
1411            name = Data[key]['Name']
1412            if name:
1413                xydata[key] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.root,name))
1414                PDFname = name
1415        powName = xydata['Sample'][2]
1416        powId = G2gd.GetPatternTreeItemId(self,self.root,powName)
1417        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId,'Instrument Parameters'))
1418        inst = dict(zip(inst[3],inst[1]))
1419        auxPlot = G2pwd.CalcPDF(data,inst,xydata)
1420        PDFId = G2gd.GetPatternTreeItemId(self,self.root,'PDF '+powName[4:])
1421        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'I(Q)'+powName[4:]),xydata['IofQ'])
1422        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'S(Q)'+powName[4:]),xydata['SofQ'])
1423        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'F(Q)'+powName[4:]),xydata['FofQ'])
1424        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'G(R)'+powName[4:]),xydata['GofR'])
1425        return auxPlot
1426       
1427    def OnComputePDF(event):
1428        print 'Calculating PDF:'
1429        auxPlot = ComputePDF(data)
1430        Status.SetStatusText('PDF computed')
1431        for plot in auxPlot:
1432            G2plt.PlotXY(self,plot[:2],type=plot[2])
1433       
1434        G2plt.PlotISFG(self,newPlot=True,type='I(Q)')
1435        G2plt.PlotISFG(self,newPlot=True,type='S(Q)')
1436        G2plt.PlotISFG(self,newPlot=True,type='F(Q)')
1437        G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1438       
1439    def OnComputeAllPDF(event):
1440        print 'Calculating PDFs:'
1441        if self.PatternTree.GetCount():
1442            id, cookie = self.PatternTree.GetFirstChild(self.root)
1443            while id:
1444                Name = self.PatternTree.GetItemText(id)
1445                if 'PDF' in Name:
1446                    Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id,'PDF Controls'))
1447                    auxPlot = ComputePDF(Data)                   
1448                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1449            Status.SetStatusText('All PDFs computed')
1450            G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1451       
1452    def OnShowTip(self,tip):
1453        print tip   
1454               
1455    if self.dataDisplay:
1456        self.dataFrame.Clear()
1457    self.dataFrame.SetMenuBar(self.dataFrame.PDFMenu)
1458    if not self.dataFrame.GetStatusBar():
1459        Status = self.dataFrame.CreateStatusBar()   
1460    self.dataDisplay = wx.Panel(self.dataFrame)
1461    self.dataFrame.Bind(wx.EVT_MENU, OnCopyPDFControls, id=G2gd.wxID_PDFCOPYCONTROLS)
1462    self.dataFrame.Bind(wx.EVT_MENU, OnSavePDFControls, id=G2gd.wxID_PDFSAVECONTROLS)
1463    self.dataFrame.Bind(wx.EVT_MENU, OnLoadPDFControls, id=G2gd.wxID_PDFLOADCONTROLS)
1464    self.dataFrame.Bind(wx.EVT_MENU, OnAddElement, id=G2gd.wxID_PDFADDELEMENT)
1465    self.dataFrame.Bind(wx.EVT_MENU, OnDeleteElement, id=G2gd.wxID_PDFDELELEMENT)
1466    self.dataFrame.Bind(wx.EVT_MENU, OnComputePDF, id=G2gd.wxID_PDFCOMPUTE)
1467    self.dataFrame.Bind(wx.EVT_MENU, OnComputeAllPDF, id=G2gd.wxID_PDFCOMPUTEALL)
1468    mainSizer = wx.BoxSizer(wx.VERTICAL)
1469    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' PDF data files: '),0,wx.ALIGN_CENTER_VERTICAL)
1470    mainSizer.Add((5,5),0)
1471    str = ' Sample file: PWDR %s   Wavelength, A: %.5f  Energy, keV: %.3f  Polariz.: %.2f '%(dataFile[3:],wave,keV,polariz)
1472    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=str),0,wx.ALIGN_CENTER_VERTICAL)
1473#    dataSizer = wx.BoxSizer(wx.HORIZONTAL)
1474#    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Azimuth'),0,wx.ALIGN_CENTER_VERTICAL)
1475#    azimVal = wx.TextCtrl(self.dataDisplay,value='%.2f'%(inst['Azimuth']))
1476#    azimVal.Bind(wx.EVT_TEXT_ENTER,OnAzimVal)       
1477#    azimVal.Bind(wx.EVT_KILL_FOCUS,OnAzimVal)
1478#    dataSizer.Add(azimVal,0)   
1479#    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Polarization'),0,wx.ALIGN_CENTER_VERTICAL)
1480#    polaVal = wx.TextCtrl(self.dataDisplay,value='%.2f'%(inst['Polariz.']))
1481#    polaVal.Bind(wx.EVT_TEXT_ENTER,OnPolaVal)       
1482#    polaVal.Bind(wx.EVT_KILL_FOCUS,OnPolaVal)
1483#    dataSizer.Add(polaVal,0)   
1484#    mainSizer.Add(dataSizer,0)
1485    mainSizer.Add((5,5),0)
1486    fileSizer = wx.FlexGridSizer(3,6,5,1)
1487    select = ['Sample Bkg.','Container']
1488    if data['Container']['Name']:
1489        select.append('Container Bkg.')
1490    for key in select:
1491        FillFileSizer(fileSizer,key)
1492    mainSizer.Add(fileSizer,0)
1493    mainSizer.Add((5,5),0)
1494    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Sample information: '),0,wx.ALIGN_CENTER_VERTICAL)
1495    mainSizer.Add((5,5),0)   
1496
1497    ElList = data['ElList']
1498    Abs = G2lat.CellAbsorption(ElList,data['Form Vol'])
1499    Trans = G2pwd.Transmission(data['Geometry'],Abs*data['Pack'],data['Diam'])
1500    elemSizer = wx.FlexGridSizer(3,3,5,1)
1501    for El in ElList:
1502        FillElemSizer(elemSizer,ElList[El])
1503    mainSizer.Add(elemSizer,0)
1504    mainSizer.Add((5,5),0)   
1505    midSizer = wx.BoxSizer(wx.HORIZONTAL)
1506    midSizer.Add(wx.StaticText(self.dataDisplay,label=' Formula volume: '),0,wx.ALIGN_CENTER_VERTICAL)
1507    formVol = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Form Vol']))
1508    formVol.Bind(wx.EVT_TEXT_ENTER,OnFormVol)       
1509    formVol.Bind(wx.EVT_KILL_FOCUS,OnFormVol)
1510    midSizer.Add(formVol,0)
1511    midSizer.Add(wx.StaticText(self.dataDisplay,
1512        label=' Theoretical absorption: %.4f cm-1 Sample absorption: %.4f cm-1'%(Abs,Abs*data['Pack'])),
1513        0,wx.ALIGN_CENTER_VERTICAL)
1514    mainSizer.Add(midSizer,0)
1515    mainSizer.Add((5,5),0)   
1516
1517    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1518    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample geometry: '),0,wx.ALIGN_CENTER_VERTICAL)
1519    choice = ['Cylinder','Bragg-Brentano','Tilting flat plate in transmission','Fixed flat plate']
1520    geometry = wx.ComboBox(self.dataDisplay,value=data['Geometry'],choices=choice,
1521            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1522    geometry.Bind(wx.EVT_COMBOBOX, OnGeometry)
1523    geoBox.Add(geometry,0)
1524    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample diameter/thickness, mm: '),0,wx.ALIGN_CENTER_VERTICAL)
1525    diam = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Diam']))
1526    diam.Bind(wx.EVT_TEXT_ENTER,OnDiameter)       
1527    diam.Bind(wx.EVT_KILL_FOCUS,OnDiameter)
1528#    diam.Bind(wx.EVT_SET_FOCUS,OnShowTip(self,'tip')) #this doesn't work - what would????
1529    geoBox.Add(diam,0)
1530    mainSizer.Add(geoBox,0)
1531    mainSizer.Add((5,5),0)   
1532    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1533    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Packing: '),0,wx.ALIGN_CENTER_VERTICAL)
1534    pack = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Pack']))
1535    pack.Bind(wx.EVT_TEXT_ENTER,OnPacking)       
1536    pack.Bind(wx.EVT_KILL_FOCUS,OnPacking)
1537    geoBox.Add(pack,0)
1538    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample transmission: %.3f %%'%(Trans)),0,wx.ALIGN_CENTER_VERTICAL)   
1539    mainSizer.Add(geoBox,0)
1540    mainSizer.Add((5,5),0)   
1541       
1542    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' S(Q)->F(Q)->G(R) controls: '),0,wx.ALIGN_CENTER_VERTICAL)
1543    mainSizer.Add((5,5),0)
1544    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1545    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Detector type: '),0,wx.ALIGN_CENTER_VERTICAL)
1546    choice = ['Image plate','Point detector']
1547    detType = wx.ComboBox(self.dataDisplay,value=data['DetType'],choices=choice,
1548            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1549    detType.Bind(wx.EVT_COMBOBOX, OnDetType)
1550    sqBox.Add(detType,0)
1551    if data['DetType'] == 'Image plate':
1552        sqBox.Add(wx.StaticText(self.dataDisplay,label=' IP transmission coeff.: '),0,wx.ALIGN_CENTER_VERTICAL)
1553        obliqCoeff = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['ObliqCoeff']))
1554        obliqCoeff.Bind(wx.EVT_TEXT_ENTER,OnObliqCoeff)       
1555        obliqCoeff.Bind(wx.EVT_KILL_FOCUS,OnObliqCoeff)
1556        sqBox.Add(obliqCoeff,0)
1557    mainSizer.Add(sqBox,0)
1558       
1559    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1560    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Ruland width: '),0,wx.ALIGN_CENTER_VERTICAL)   
1561    rulandSldr = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
1562        value=int(1000*data['Ruland']))
1563    sqBox.Add(rulandSldr,1,wx.EXPAND)
1564    rulandSldr.Bind(wx.EVT_SLIDER, OnRulSlider)
1565    rulandWdt = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Ruland']))
1566    rulandWdt.Bind(wx.EVT_TEXT_ENTER,OnRulandWdt)       
1567    rulandWdt.Bind(wx.EVT_KILL_FOCUS,OnRulandWdt)
1568    sqBox.Add(rulandWdt,0,wx.ALIGN_CENTER_VERTICAL)   
1569    mainSizer.Add(sqBox,0,wx.ALIGN_LEFT|wx.EXPAND)
1570   
1571    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1572    lorch = wx.CheckBox(parent=self.dataDisplay,label='Lorch damping?')
1573    lorch.SetValue(data['Lorch'])
1574    lorch.Bind(wx.EVT_CHECKBOX, OnLorch)
1575    sqBox.Add(lorch,0,wx.ALIGN_CENTER_VERTICAL)
1576    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Scaling q-range: '),0,wx.ALIGN_CENTER_VERTICAL)
1577    SQmin = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][0]))
1578    SQmin.Bind(wx.EVT_TEXT_ENTER,OnSQmin)       
1579    SQmin.Bind(wx.EVT_KILL_FOCUS,OnSQmin)   
1580    sqBox.Add(SQmin,0)
1581    sqBox.Add(wx.StaticText(self.dataDisplay,label=' to '),0,wx.ALIGN_CENTER_VERTICAL)
1582    SQmax = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][1]))
1583    SQmax.Bind(wx.EVT_TEXT_ENTER,OnSQmax)       
1584    SQmax.Bind(wx.EVT_KILL_FOCUS,OnSQmax)
1585    sqBox.Add(SQmax,0)
1586    resetQ = wx.CheckBox(parent=self.dataDisplay,label='Reset?')
1587    sqBox.Add(resetQ,0)
1588    resetQ.Bind(wx.EVT_CHECKBOX, OnResetQ)
1589   
1590    mainSizer.Add(sqBox,0)
1591
1592    mainSizer.Layout()   
1593    self.dataDisplay.SetSizer(mainSizer)
1594    Size = mainSizer.Fit(self.dataFrame)
1595    self.dataDisplay.SetSize(Size)
1596    self.dataFrame.setSizePosLeft(Size)
1597   
Note: See TracBrowser for help on using the repository browser.