source: trunk/GSASIIpwdGUI.py @ 311

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

finish new indexing refinement stuff
more on texture plotting

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