source: trunk/GSASIIpwdGUI.py @ 265

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

further progress on implementing pdf calculations
optionally put legends on the pdf plots
attempt implementation of a rotation of the azimuth ranges for multiazimuth integrations -not fully successful

  • Property svn:keywords set to Date Author Revision URL Id
File size: 68.4 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-04-19 20:12:37 +0000 (Tue, 19 Apr 2011) $
4# $Author: vondreele $
5# $Revision: 265 $
6# $URL: trunk/GSASIIpwdGUI.py $
7# $Id: GSASIIpwdGUI.py 265 2011-04-19 20:12:37Z 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 GSASIIpeak as G2pk
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 = G2pk.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 = G2pk.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    tth2q = lambda t,w:4.0*math.pi*sind(t/2.0)/w
1080    dataFile = self.PatternTree.GetItemText(self.PatternId)
1081    powName = 'PWDR'+dataFile[4:]
1082    powId = G2gd.GetPatternTreeItemId(self,self.root, powName)
1083    fullLimits,limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Limits'))
1084    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Instrument Parameters'))
1085    inst = dict(zip(inst[3],inst[1]))
1086    if 'Lam' in inst:
1087        keV = 12.397639/inst['Lam']
1088    else:
1089        keV = 12.397639/inst['Lam1']
1090    wave = 12.397639/keV
1091    qLimits = [tth2q(fullLimits[0],wave),tth2q(fullLimits[1],wave)]
1092    data['QScaleLim'][0] = max(qLimits[0],data['QScaleLim'][0])
1093    data['QScaleLim'][1] = min(qLimits[1],data['QScaleLim'][1])
1094    polariz = inst['Polariz.']
1095    azimuth = inst['Azimuth']
1096    itemDict = {}
1097   
1098    def FillFileSizer(fileSizer,key):
1099        #fileSizer is a FlexGridSizer(3,6)
1100       
1101        def OnSelectFile(event):
1102            Obj = event.GetEventObject()
1103            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1104            if itemKey == 'Name':
1105                value = Obj.GetValue()
1106            Obj.SetValue(fmt%(value))
1107            data[fileKey][itemKey] = value
1108            UpdatePDFGrid(self,data)
1109       
1110        def OnValueChange(event):
1111            Obj = event.GetEventObject()
1112            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1113            try:
1114                value = float(Obj.GetValue())
1115            except ValueError:
1116                value = -1.0
1117            Obj.SetValue(fmt%(value))
1118            data[fileKey][itemKey] = value
1119            auxPlot = ComputePDF(data)
1120            G2plt.PlotISFG(self,newPlot=True)
1121                       
1122        item = data[key]
1123        fileList = np.array(GetFileList('PWDR')).T[1]
1124        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' '+key+' file:'),0,wx.ALIGN_CENTER_VERTICAL)
1125        fileName = wx.ComboBox(self.dataDisplay,value=item['Name'],choices=fileList,
1126            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1127        itemDict[fileName.GetId()] = [key,'Name','%s']
1128        fileName.Bind(wx.EVT_COMBOBOX,OnSelectFile)       
1129        fileSizer.Add(fileName,0,)
1130        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Multiplier:'),0,wx.ALIGN_CENTER_VERTICAL)
1131        mult = wx.TextCtrl(self.dataDisplay,value='%.3f'%(item['Mult']),style=wx.TE_PROCESS_ENTER)
1132        itemDict[mult.GetId()] = [key,'Mult','%.3f']
1133        mult.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1134        mult.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1135        fileSizer.Add(mult,0,)
1136        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Add:'),0,wx.ALIGN_CENTER_VERTICAL)
1137        add = wx.TextCtrl(self.dataDisplay,value='%.0f'%(item['Add']),style=wx.TE_PROCESS_ENTER)
1138        itemDict[add.GetId()] = [key,'Add','%.0f']
1139        add.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1140        add.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1141        fileSizer.Add(add,0,)
1142       
1143    def SumElementVolumes():
1144        sumVol = 0.
1145        ElList = data['ElList']
1146        for El in ElList:
1147            Avol = (4.*math.pi/3.)*ElList[El]['Drad']**3
1148            sumVol += Avol*ElList[El]['FormulaNo']
1149        return sumVol
1150       
1151    def FillElemSizer(elemSizer,ElData):
1152       
1153        def OnFractionChange(event):
1154            try:
1155                value = max(0.0,float(num.GetValue()))
1156            except ValueError:
1157                value = 0.0
1158            num.SetValue('%.3f'%(value))
1159            ElData['FormulaNo'] = value
1160            data['Form Vol'] = max(10.0,SumElementVolumes())
1161            formVol.SetValue('%.2f'%(data['Form Vol']))
1162            UpdatePDFGrid(self,data)
1163       
1164        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1165            label=' Element: '+'%2s'%(ElData['Symbol'])+' * '),0,wx.ALIGN_CENTER_VERTICAL)
1166        num = wx.TextCtrl(self.dataDisplay,value='%.3f'%(ElData['FormulaNo']),style=wx.TE_PROCESS_ENTER)
1167        num.Bind(wx.EVT_TEXT_ENTER,OnFractionChange)       
1168        num.Bind(wx.EVT_KILL_FOCUS,OnFractionChange)
1169        elemSizer.Add(num,0,wx.ALIGN_CENTER_VERTICAL)
1170        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1171            label="f': %.3f"%(ElData['fp'])+' f": %.3f'%(ElData['fpp'])+' mu: %.2f barns'%(ElData['mu']) ),
1172            0,wx.ALIGN_CENTER_VERTICAL)
1173           
1174    def OnGeometry(event):
1175        data['Geometry'] = geometry.GetValue()
1176        UpdatePDFGrid(self,data)
1177       
1178    def OnDetType(event):
1179        data['DetType'] = detType.GetValue()
1180        UpdatePDFGrid(self,data)
1181       
1182    def OnFormVol(event):
1183        try:
1184            value = float(formVol.GetValue())
1185            if value <= 0.0:
1186                raise ValueError
1187        except ValueError:
1188            value = data['Form Vol']
1189        data['Form Vol'] = value
1190        UpdatePDFGrid(self,data)
1191        auxPlot = ComputePDF(data)
1192        G2plt.PlotISFG(self,newPlot=True)       
1193       
1194    def OnDiameter(event):
1195        try:
1196            value = float(diam.GetValue())
1197            if value <= 0.0:
1198                raise ValueError
1199        except ValueError:
1200            value = data['Diam']
1201        data['Diam'] = value
1202        UpdatePDFGrid(self,data)
1203        auxPlot = ComputePDF(data)
1204        G2plt.PlotISFG(self,newPlot=True)       
1205       
1206    def OnObliqCoeff(event):
1207        try:
1208            value = float(obliqCoeff.GetValue())
1209            if value < 0.0:
1210                raise ValueError
1211            elif value > 1.0:
1212                value = 1.0
1213        except ValueError:
1214            value = data['ObliqCoeff']
1215        data['ObliqCoeff'] = value
1216        obliqCoeff.SetValue('%.3f'%(value))
1217        auxPlot = ComputePDF(data)
1218        G2plt.PlotISFG(self,newPlot=True)
1219       
1220    def OnRulandWdt(event):
1221        try:
1222            value = float(rulandWdt.GetValue())
1223            if value <= 0.001:
1224                raise ValueError
1225            elif value > 1.0:
1226                value = 1.0
1227        except ValueError:
1228            value = data['Ruland']
1229        data['Ruland'] = value
1230        rulandWdt.SetValue('%.3f'%(value))
1231        auxPlot = ComputePDF(data)
1232        G2plt.PlotISFG(self,newPlot=True)
1233       
1234    def OnLorch(event):
1235        data['Lorch'] = lorch.GetValue()
1236        auxPlot = ComputePDF(data)
1237        G2plt.PlotISFG(self,newPlot=True)       
1238               
1239       
1240    def OnPacking(event):
1241        try:
1242            value = float(pack.GetValue())
1243            if value <= 0.0:
1244                raise ValueError
1245        except ValueError:
1246            value = data['Pack']
1247        data['Pack'] = value
1248        UpdatePDFGrid(self,data)
1249        G2plt.PlotISFG(self,newPlot=True)       
1250               
1251    def OnSQmin(event):
1252        try:
1253            value = float(SQmin.GetValue())
1254            if value < qLimits[0]:
1255                raise ValueError
1256        except ValueError:
1257            value = max(qLimits[0],data['QScaleLim'][0])
1258        data['QScaleLim'][0] = value
1259        SQmin.SetValue('%.1f'%(value))
1260        auxPlot = ComputePDF(data)
1261       
1262    def OnSQmax(event):
1263        try:
1264            value = float(SQmax.GetValue())
1265            if value > qLimits[1]:
1266                raise ValueError
1267        except ValueError:
1268            value = min(qLimits[1],data['QScaleLim'][1])
1269        data['QScaleLim'][1] = value
1270        SQmax.SetValue('%.1f'%(value))
1271        auxPlot = ComputePDF(data)
1272        G2plt.PlotISFG(self,newPlot=True)
1273       
1274    def OnResetQ(event):
1275        data['QScaleLim'][1] = qLimits[1]
1276        SQmax.SetValue('%.1f'%(data['QScaleLim'][1]))
1277        data['QScaleLim'][0] = 0.9*qLimits[1]
1278        SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1279        auxPlot = ComputePDF(data)
1280        G2plt.PlotISFG(self,newPlot=True)       
1281
1282    def GetFileList(fileType,skip=None):
1283        fileList = [[False,'',0]]
1284        Source = ''
1285        id, cookie = self.PatternTree.GetFirstChild(self.root)
1286        while id:
1287            name = self.PatternTree.GetItemText(id)
1288            if fileType in name:
1289                if id == skip:
1290                    Source = name
1291                else:
1292                    fileList.append([False,name,id])
1293            id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1294        if skip:
1295            return fileList,Source
1296        else:
1297            return fileList
1298       
1299    def OnCopyPDFControls(event):
1300        import copy
1301        TextList,Source = GetFileList('PDF',skip=self.PatternId)
1302        if len(TextList) == 1:
1303            self.ErrorDialog('Nothing to copy controls to','There must be more than one "PDF" pattern')
1304            return
1305        dlg = self.CopyDialog(self,'Copy PDF controls','Copy controls from '+Source+' to:',TextList[1:])
1306        try:
1307            if dlg.ShowModal() == wx.ID_OK:
1308                result = dlg.GetData()
1309                for i,item in enumerate(result):
1310                    ifcopy,name,id = item
1311                    if ifcopy:
1312                        olddata = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'))
1313                        sample = olddata['Sample']
1314                        olddata.update(data)
1315                        olddata['Sample'] = sample
1316                        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'),olddata)
1317        finally:
1318            dlg.Destroy()
1319               
1320    def OnSavePDFControls(event):
1321        print 'save PDF controls?'
1322       
1323    def OnLoadPDFControls(event):
1324        print 'Load PDF controls?'
1325       
1326    def OnAddElement(event):
1327        ElList = data['ElList']
1328        PE = G2elem.PickElement(self,oneOnly=True)
1329        if PE.ShowModal() == wx.ID_OK:
1330            El = PE.Elem
1331            if El not in ElList:
1332                ElemSym = El.strip().upper()               
1333                FpMu = G2elem.FPcalc(G2elem.GetXsectionCoeff(ElemSym), keV)
1334                ElData = G2elem.GetFormFactorCoeff(ElemSym)[0]
1335                ElData['FormulaNo'] = 0.0
1336                ElData.update(G2elem.GetAtomInfo(ElemSym))
1337                ElData.update(dict(zip(['fp','fpp','mu'],FpMu)))
1338                ElData.update(G2elem.GetFFC5(El))
1339                data['ElList'][El] = ElData
1340            data['Form Vol'] = max(10.0,SumElementVolumes())
1341        PE.Destroy()
1342        UpdatePDFGrid(self,data)
1343       
1344    def OnDeleteElement(event):
1345        ElList = data['ElList']
1346        choice = ElList.keys()
1347        dlg = G2elem.DeleteElement(self,choice=choice)
1348        if dlg.ShowModal() == wx.ID_OK:
1349            del ElList[dlg.GetDeleteElement()]
1350        dlg.Destroy()
1351        UpdatePDFGrid(self,data)
1352               
1353    def ComputePDF(Data):
1354        xydata = {}
1355        for key in ['Sample','Sample Bkg.','Container','Container Bkg.']:
1356            name = Data[key]['Name']
1357            if name:
1358                xydata[key] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.root,name))
1359                PDFname = name
1360        powName = xydata['Sample'][2]
1361        powId = G2gd.GetPatternTreeItemId(self,self.root,powName)
1362        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId,'Instrument Parameters'))
1363        inst = dict(zip(inst[3],inst[1]))
1364        auxPlot = G2pk.CalcPDF(data,inst,xydata)
1365        PDFId = G2gd.GetPatternTreeItemId(self,self.root,'PDF '+powName[4:])
1366        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'I(Q)'+powName[4:]),xydata['IofQ'])
1367        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'S(Q)'+powName[4:]),xydata['SofQ'])
1368        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'F(Q)'+powName[4:]),xydata['FofQ'])
1369        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'G(R)'+powName[4:]),xydata['GofR'])
1370        return auxPlot
1371       
1372    def OnComputePDF(event):
1373        print 'Calculating PDF:'
1374        auxPlot = ComputePDF(data)
1375        for plot in auxPlot:
1376            G2plt.PlotXY(self,plot[:2],type=plot[2])
1377       
1378        G2plt.PlotISFG(self,newPlot=True,type='I(Q)')
1379        G2plt.PlotISFG(self,newPlot=True,type='S(Q)')
1380        G2plt.PlotISFG(self,newPlot=True,type='F(Q)')
1381        G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1382       
1383    def OnComputeAllPDF(event):
1384        print 'Calculating PDFs:'
1385        if self.PatternTree.GetCount():
1386            id, cookie = self.PatternTree.GetFirstChild(self.root)
1387            while id:
1388                Name = self.PatternTree.GetItemText(id)
1389                if 'PDF' in Name:
1390                    Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id,'PDF Controls'))
1391                    auxPlot = ComputePDF(Data)                   
1392                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1393            G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1394       
1395    def OnShowTip(self,tip):
1396        print tip
1397   
1398               
1399    if self.dataDisplay:
1400        self.dataFrame.Clear()
1401    self.dataFrame.SetMenuBar(self.dataFrame.PDFMenu)
1402    if not self.dataFrame.GetStatusBar():
1403        Status = self.dataFrame.CreateStatusBar()   
1404    self.dataDisplay = wx.Panel(self.dataFrame)
1405    self.dataFrame.Bind(wx.EVT_MENU, OnCopyPDFControls, id=G2gd.wxID_PDFCOPYCONTROLS)
1406    self.dataFrame.Bind(wx.EVT_MENU, OnSavePDFControls, id=G2gd.wxID_PDFSAVECONTROLS)
1407    self.dataFrame.Bind(wx.EVT_MENU, OnLoadPDFControls, id=G2gd.wxID_PDFLOADCONTROLS)
1408    self.dataFrame.Bind(wx.EVT_MENU, OnAddElement, id=G2gd.wxID_PDFADDELEMENT)
1409    self.dataFrame.Bind(wx.EVT_MENU, OnDeleteElement, id=G2gd.wxID_PDFDELELEMENT)
1410    self.dataFrame.Bind(wx.EVT_MENU, OnComputePDF, id=G2gd.wxID_PDFCOMPUTE)
1411    self.dataFrame.Bind(wx.EVT_MENU, OnComputeAllPDF, id=G2gd.wxID_PDFCOMPUTEALL)
1412    mainSizer = wx.BoxSizer(wx.VERTICAL)
1413    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' PDF data files: '),0,wx.ALIGN_CENTER_VERTICAL)
1414    mainSizer.Add((5,5),0)
1415    str = ' Sample file: PWDR %s   Wavelength, A: %.5f  Energy, keV: %.3f  Polariz.: %.2f '%(dataFile[3:],wave,keV,polariz)
1416    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=str),0,wx.ALIGN_CENTER_VERTICAL)
1417    mainSizer.Add((5,5),0)
1418    fileSizer = wx.FlexGridSizer(3,6,5,1)
1419    select = ['Sample Bkg.','Container']
1420    if data['Container']['Name']:
1421        select.append('Container Bkg.')
1422    for key in select:
1423        FillFileSizer(fileSizer,key)
1424    mainSizer.Add(fileSizer,0)
1425    mainSizer.Add((5,5),0)
1426    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Sample information: '),0,wx.ALIGN_CENTER_VERTICAL)
1427    mainSizer.Add((5,5),0)   
1428
1429    ElList = data['ElList']
1430    Abs = G2lat.CellAbsorption(ElList,data['Form Vol'])
1431    Trans = G2pk.Transmission(data['Geometry'],Abs*data['Pack'],data['Diam'])
1432    elemSizer = wx.FlexGridSizer(3,3,5,1)
1433    for El in ElList:
1434        FillElemSizer(elemSizer,ElList[El])
1435    mainSizer.Add(elemSizer,0)
1436    mainSizer.Add((5,5),0)   
1437    midSizer = wx.BoxSizer(wx.HORIZONTAL)
1438    midSizer.Add(wx.StaticText(self.dataDisplay,label=' Formula volume: '),0,wx.ALIGN_CENTER_VERTICAL)
1439    formVol = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Form Vol']))
1440    formVol.Bind(wx.EVT_TEXT_ENTER,OnFormVol)       
1441    formVol.Bind(wx.EVT_KILL_FOCUS,OnFormVol)
1442    midSizer.Add(formVol,0)
1443    midSizer.Add(wx.StaticText(self.dataDisplay,
1444        label=' Theoretical absorption: %.4f cm-1 Sample absorption: %.4f cm-1'%(Abs,Abs*data['Pack'])),
1445        0,wx.ALIGN_CENTER_VERTICAL)
1446    mainSizer.Add(midSizer,0)
1447    mainSizer.Add((5,5),0)   
1448
1449    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1450    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample geometry: '),0,wx.ALIGN_CENTER_VERTICAL)
1451    choice = ['Cylinder','Bragg-Brentano','Tilting flat plate in transmission','Fixed flat plate']
1452    geometry = wx.ComboBox(self.dataDisplay,value=data['Geometry'],choices=choice,
1453            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1454    geometry.Bind(wx.EVT_COMBOBOX, OnGeometry)
1455    geoBox.Add(geometry,0)
1456    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample diameter/thickness, mm: '),0,wx.ALIGN_CENTER_VERTICAL)
1457    diam = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Diam']))
1458    diam.Bind(wx.EVT_TEXT_ENTER,OnDiameter)       
1459    diam.Bind(wx.EVT_KILL_FOCUS,OnDiameter)
1460#    diam.Bind(wx.EVT_SET_FOCUS,OnShowTip(self,'tip')) #this doesn't work - what would????
1461    geoBox.Add(diam,0)
1462    mainSizer.Add(geoBox,0)
1463    mainSizer.Add((5,5),0)   
1464    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1465    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Packing: '),0,wx.ALIGN_CENTER_VERTICAL)
1466    pack = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Pack']))
1467    pack.Bind(wx.EVT_TEXT_ENTER,OnPacking)       
1468    pack.Bind(wx.EVT_KILL_FOCUS,OnPacking)
1469    geoBox.Add(pack,0)
1470    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample transmission: %.3f %%'%(Trans)),0,wx.ALIGN_CENTER_VERTICAL)   
1471    mainSizer.Add(geoBox,0)
1472    mainSizer.Add((5,5),0)   
1473       
1474    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' S(Q)->F(Q)->G(R) controls: '),0,wx.ALIGN_CENTER_VERTICAL)
1475    mainSizer.Add((5,5),0)
1476    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1477    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Detector type: '),0,wx.ALIGN_CENTER_VERTICAL)
1478    choice = ['Image plate','Point detector']
1479    detType = wx.ComboBox(self.dataDisplay,value=data['DetType'],choices=choice,
1480            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1481    detType.Bind(wx.EVT_COMBOBOX, OnDetType)
1482    sqBox.Add(detType,0)
1483    if data['DetType'] == 'Image plate':
1484        sqBox.Add(wx.StaticText(self.dataDisplay,label=' IP transmission coeff.: '),0,wx.ALIGN_CENTER_VERTICAL)
1485        obliqCoeff = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['ObliqCoeff']))
1486        obliqCoeff.Bind(wx.EVT_TEXT_ENTER,OnObliqCoeff)       
1487        obliqCoeff.Bind(wx.EVT_KILL_FOCUS,OnObliqCoeff)
1488        sqBox.Add(obliqCoeff,0)
1489    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Ruland width: '),0,wx.ALIGN_CENTER_VERTICAL)
1490    rulandWdt = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Ruland']))
1491    rulandWdt.Bind(wx.EVT_TEXT_ENTER,OnRulandWdt)       
1492    rulandWdt.Bind(wx.EVT_KILL_FOCUS,OnRulandWdt)
1493    sqBox.Add(rulandWdt,0)   
1494    mainSizer.Add(sqBox,0)
1495   
1496    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1497    lorch = wx.CheckBox(parent=self.dataDisplay,label='Lorch damping?')
1498    lorch.SetValue(data['Lorch'])
1499    lorch.Bind(wx.EVT_CHECKBOX, OnLorch)
1500    sqBox.Add(lorch,0,wx.ALIGN_CENTER_VERTICAL)
1501    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Scaling q-range: '),0,wx.ALIGN_CENTER_VERTICAL)
1502    SQmin = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][0]))
1503    SQmin.Bind(wx.EVT_TEXT_ENTER,OnSQmin)       
1504    SQmin.Bind(wx.EVT_KILL_FOCUS,OnSQmin)   
1505    sqBox.Add(SQmin,0)
1506    sqBox.Add(wx.StaticText(self.dataDisplay,label=' to '),0,wx.ALIGN_CENTER_VERTICAL)
1507    SQmax = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][1]))
1508    SQmax.Bind(wx.EVT_TEXT_ENTER,OnSQmax)       
1509    SQmax.Bind(wx.EVT_KILL_FOCUS,OnSQmax)
1510    sqBox.Add(SQmax,0)
1511    resetQ = wx.CheckBox(parent=self.dataDisplay,label='Reset?')
1512    sqBox.Add(resetQ,0)
1513    resetQ.Bind(wx.EVT_CHECKBOX, OnResetQ)
1514   
1515    mainSizer.Add(sqBox,0)
1516
1517    mainSizer.Layout()   
1518    self.dataDisplay.SetSizer(mainSizer)
1519    Size = mainSizer.Fit(self.dataFrame)
1520    self.dataDisplay.SetSize(Size)
1521    self.dataFrame.setSizePosLeft(Size)
1522   
Note: See TracBrowser for help on using the repository browser.