source: trunk/GSASIIpwdGUI.py @ 289

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