source: trunk/GSASIIpwdGUI.py @ 303

Last change on this file since 303 was 303, checked in by vondreele, 12 years ago

Allow reading of xye (Topas style) files
Begin implementation of spherical harmonics texture
Refactor indexing; replace cell refinement from peak positions

  • Property svn:keywords set to Date Author Revision URL Id
File size: 71.6 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-06-20 19:37:07 +0000 (Mon, 20 Jun 2011) $
4# $Author: vondreele $
5# $Revision: 303 $
6# $URL: trunk/GSASIIpwdGUI.py $
7# $Id: GSASIIpwdGUI.py 303 2011-06-20 19:37:07Z 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(startVol.GetValue())
667        except ValueError:
668            stVol = 25
669        controls[3] = stVol
670        startVol.SetValue("%d"%(stVol))
671       
672    def OnBravais(event):
673        Obj = event.GetEventObject()
674        bravais[bravList.index(Obj.GetId())] = Obj.GetValue()
675       
676    def OnZero(event):
677        try:
678            Zero = min(0.1,max(-0.1,float(zero.GetValue())))
679        except ValueError:
680            Zero = 0.1
681        controls[1] = Zero
682        zero.SetValue("%.2f"%(Zero))
683       
684    def OnZeroVar(event):
685        controls[0] = zeroVar.GetValue()
686       
687    def OnBravSel(event):
688        controls[5] = bravSel.GetString(bravSel.GetSelection())       
689        UpdateUnitCellsGrid(self,data)
690       
691    def OnCellChange(event):
692        ibrav = bravaisSymb.index(controls[5])
693        Obj = event.GetEventObject()
694        ObjId = cellList.index(Obj.GetId())
695        try:
696            value = max(1.0,float(Obj.GetValue()))
697        except ValueError:
698            if ObjId < 3:               #bad cell edge - reset
699                value = controls[6+ObjId]
700            else:                       #bad angle
701                value = 90.
702        if ibrav in [0,1,2]:
703            controls[6] = controls[7] = controls[8] = value
704            controls[9] = controls[10] = controls[11] = 90.0
705            Obj.SetValue("%.5f"%(controls[6]))
706        elif ibrav in [3,4,5,6]:
707            if ObjId == 0:
708                controls[6] = controls[7] = value
709                Obj.SetValue("%.5f"%(controls[6]))
710            else:
711                controls[8] = value
712                Obj.SetValue("%.5f"%(controls[8]))
713            controls[9] = controls[10] = controls[11] = 90.0
714            if ibrav in [3,4]:
715                controls[11] = 120.
716        elif ibrav in [7,8,9,10]:
717            controls[6+ObjId] = value
718            Obj.SetValue("%.5f"%(controls[6+ObjId]))
719            controls[9] = controls[10] = controls[11] = 90.0
720        elif ibrav in [11,12]:
721            controls[9] = controls[11] = 90.0
722            if ObjId != 3:
723                controls[6+ObjId] = value
724                Obj.SetValue("%.5f"%(controls[6+ObjId]))
725            else:
726                controls[10] = value
727                Obj.SetValue("%.3f"%(controls[10]))
728        else:
729            controls[6+ObjId] = value
730            if ObjId < 3:
731                Obj.SetValue("%.5f"%(controls[6+ObjId]))
732            else:
733                Obj.SetValue("%.3f"%(controls[6+ObjId]))
734        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
735        volVal.SetValue("%.3f"%(controls[12]))
736       
737    def OnHklShow(event):
738        hklShow.SetValue(False)
739        PatternId = self.PatternId
740        PickId = self.PickId   
741        limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Limits'))[1]
742        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
743        cell = controls[6:12]
744        A = G2lat.cell2A(cell)
745        ibrav = bravaisSymb.index(controls[5])
746        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
747        inst = dict(zip(inst[3],inst[1]))
748        if 'Lam' in inst:
749            wave = inst['Lam']
750        else:
751            wave = inst['Lam1']
752        dmin = wave/(2.0*sind(limits[1]/2.0))
753        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
754        for hkl in self.HKL:
755            hkl.append(2.0*asind(wave/(2.*hkl[3])))             
756        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
757            G2plt.PlotPowderLines(self)
758        else:
759            G2plt.PlotPatterns(self)
760       
761       
762    def RefineCell(event):
763        def cellPrint(ibrav,A):
764            cell = G2lat.A2cell(A)
765            Vol = G2lat.calc_V(A)
766            if ibrav in [0,1,2]:
767                print "%s%10.6f" % ('a =',cell[0])
768            elif ibrav in [3,4,5,6]:
769                print "%s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],' c =',cell[2],' volume =',Vol)
770            elif ibrav in [7,8,9,10]:
771                print "%s%10.6f %s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],' volume =',Vol)
772            elif ibrav in [11,12]:
773                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)
774            else:
775                print "%s%10.6f %s%10.6f %s%10.6f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2])
776                print "%s%8.3f %s%8.3f %s%8.3f %s%12.3f" % ('alpha =',cell[3],'beta =',cell[4],'gamma =',cell[5],' volume =',Vol)
777             
778        PatternId = self.PatternId
779        PickId = self.PickId   
780        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
781        if not peaks:
782            self.ErrorDialog('No peaks!', 'Nothing to refine!')
783            return       
784        print 'Refine cell'
785        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
786        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
787        cell = controls[6:12]
788        A = G2lat.cell2A(cell)
789        print controls[5]
790        ibrav = bravaisSymb.index(controls[5])
791        dmin = G2indx.getDmin(peaks)-0.005
792        Lhkl,M20,X20,A = G2indx.refinePeaks(peaks,ibrav,A)
793        controls[6:12] = G2lat.A2cell(A)
794        controls[12] = G2lat.calc_V(A)
795        data = [controls,bravais,cells,dmin]
796        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
797        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
798        UpdateUnitCellsGrid(self,data)
799        print "%s%10.3f" % ('refinement M20 = ',M20)
800        print 'unindexed lines = ',X20
801        cellPrint(ibrav,A)
802        for hkl in self.HKL:
803            hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
804        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
805            G2plt.PlotPowderLines(self)
806        else:
807            G2plt.PlotPatterns(self)
808       
809    def IndexPeaks(event):
810        PatternId = self.PatternId   
811#        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
812#        if not peaks:
813#            self.ErrorDialog('No peaks!', 'Nothing to index!')
814#            return
815        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
816        print 'Peak Indexing'
817        try:
818            controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
819            cells = []
820        except ValueError:
821            self.ErrorDialog('Error','Need to set controls in Unit Cell List first')
822            return
823        if True not in bravais:
824            self.ErrorDialog('Error','No Bravais lattices selected')
825            return
826        self.dataFrame.CopyCell.Enable(False)
827        self.dataFrame.RefineCell.Enable(False)
828        OK,dmin,cells = G2indx.DoIndexPeaks(peaks,inst,controls,bravais)
829        if OK:
830            data = [controls,bravais,cells,dmin]
831            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
832            UpdateUnitCellsGrid(self,data)
833            bestCell = cells[0]
834            if bestCell[0] > 10.:
835                self.HKL = G2lat.GenHBravais(dmin,bestCell[2],G2lat.cell2A(bestCell[3:9]))
836                for hkl in self.HKL:
837                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
838                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
839                    G2plt.PlotPowderLines(self)
840                else:
841                    G2plt.PlotPatterns(self)
842            self.dataFrame.CopyCell.Enable(True)
843            self.dataFrame.IndexPeaks.Enable(True)
844            self.dataFrame.MakeNewPhase.Enable(True)
845            UpdateUnitCellsGrid(self,data)
846               
847    def CopyUnitCell(event):
848        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)
849        for Cell in cells:
850            if Cell[-1]:
851                break
852        cell = Cell[2:9]
853        controls[4] = 1
854        controls[5] = bravaisSymb[cell[0]]
855        controls[6:12] = cell[1:8]
856        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
857        self.PatternTree.SetItemPyData(UnitCellsId,[controls,bravais,cells,dmin])
858        UpdateUnitCellsGrid(self,data)
859        self.dataFrame.RefineCell.Enable(True)
860       
861    def MakeNewPhase(event):
862        if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
863            sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
864        else:
865            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
866        PhaseName = ''
867        dlg = wx.TextEntryDialog(None,'Enter a name for this phase','Phase Name Entry','New phase',
868            style=wx.OK)
869        if dlg.ShowModal() == wx.ID_OK:
870            PhaseName = dlg.GetValue()
871        dlg.Destroy()
872        cells = self.PatternTree.GetItemPyData(UnitCellsId)[2]
873        for Cell in cells:
874            if Cell[-1]:
875                break
876        cell = Cell[2:10]       
877        sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
878        E,SGData = G2spc.SpcGroup(spaceGroups[cell[0]])
879        self.PatternTree.SetItemPyData(sub, \
880            {'General':{'Name':'phase name','Type':'nuclear','SGData':SGData,
881            'Cell':[False,]+cell[1:],
882            'Pawley dmin':0.25},'Atoms':[],'Drawing':{},'Histograms':{}})
883        Status.SetStatusText('Change space group if needed')
884           
885    def RefreshUnitCellsGrid(event):
886        cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)[2:]
887        r,c =  event.GetRow(),event.GetCol()
888        if cells:
889            if c == 2:
890                for i in range(len(cells)):
891                    cells[i][-1] = False
892                    UnitCellsTable.SetValue(i,c,False)
893                UnitCellsTable.SetValue(r,c,True)
894                gridDisplay.ForceRefresh()
895                cells[r][-1] = True
896                ibrav = cells[r][2]
897                A = G2lat.cell2A(cells[r][3:9])
898                self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
899                for hkl in self.HKL:
900                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
901                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
902                    G2plt.PlotPowderLines(self)
903                else:
904                    G2plt.PlotPatterns(self)
905       
906    if self.dataDisplay:
907        self.dataFrame.Clear()
908    self.dataFrame.SetMenuBar(self.dataFrame.IndexMenu)
909    if not self.dataFrame.GetStatusBar():
910        Status = self.dataFrame.CreateStatusBar()
911    self.Bind(wx.EVT_MENU, IndexPeaks, id=G2gd.wxID_INDEXPEAKS)
912    self.Bind(wx.EVT_MENU, CopyUnitCell, id=G2gd.wxID_COPYCELL)
913    self.Bind(wx.EVT_MENU, RefineCell, id=G2gd.wxID_REFINECELL)
914    self.Bind(wx.EVT_MENU, MakeNewPhase, id=G2gd.wxID_MAKENEWPHASE)
915   
916    controls,bravais,cells,dmin = data
917    if len(controls) < 13:              #add cell volume if missing
918        controls.append(G2lat.calc_V(G2lat.cell2A(controls[6:12])))
919    self.PatternTree.SetItemPyData(UnitCellsId,data)            #update with volume
920    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
921    bravaisNames = ['Cubic-F','Cubic-I','Cubic-P','Trigonal-R','Trigonal/Hexagonal-P',
922        'Tetragonal-I','Tetragonal-P','Orthorhombic-F','Orthorhombic-I','Orthorhombic-C',
923        'Orthorhombic-P','Monoclinic-C','Monoclinic-P','Triclinic']
924    cellGUIlist = [[[0,1,2],4,zip([" Unit cell: a = "," Vol = "],["%.5f","%.3f"],[True,False],[0,0])],
925    [[3,4,5,6],6,zip([" Unit cell: a = "," c = "," Vol = "],["%.5f","%.5f","%.3f"],[True,True,False],[0,2,0])],
926    [[7,8,9,10],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "],["%.5f","%.5f","%.5f","%.3f"],
927        [True,True,True,False],[0,1,2,0])],
928    [[11,12],10,zip([" Unit cell: a = "," b = "," c = "," beta = "," Vol = "],
929        ["%.5f","%.5f","%.5f","%.3f","%.3f"],[True,True,True,True,False],[0,1,2,4,0])],
930    [[13,],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "," alpha = "," beta = "," gamma = "],
931        ["%.5f","%.5f","%.5f","%.3f","%.3f","%.3f","%.3f"],
932        [True,True,True,False,True,True,True],[0,1,2,0,3,4,5])]]
933   
934    self.dataFrame.SetLabel('Unit Cells List')
935    self.sp = wx.SplitterWindow(self.dataFrame)
936    self.dataDisplay = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
937    self.dataFrame.IndexPeaks.Enable(False)
938    peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Index Peak List'))
939    if peaks:
940        self.dataFrame.IndexPeaks.Enable(True)
941    self.dataFrame.RefineCell.Enable(False)
942    if controls[12] > 1.0:                               #if a "real" volume (i.e. not default)
943        self.dataFrame.RefineCell.Enable(True)   
944    self.dataFrame.CopyCell.Enable(False)
945    self.dataFrame.MakeNewPhase.Enable(False)       
946    if cells:
947        self.bottom = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
948        self.sp.SplitHorizontally(self.dataDisplay,self.bottom,0)
949        self.dataFrame.CopyCell.Enable(True)
950        self.dataFrame.MakeNewPhase.Enable(True)       
951    mainSizer = wx.BoxSizer(wx.VERTICAL)
952    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Indexing controls: '),0,wx.ALIGN_CENTER_VERTICAL)
953    mainSizer.Add((5,5),0)
954    littleSizer = wx.FlexGridSizer(2,5,5,5)
955    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max Nc/Nobs '),0,wx.ALIGN_CENTER_VERTICAL)
956    NcNo = wx.SpinCtrl(self.dataDisplay)
957    NcNo.SetRange(1,6)
958    NcNo.SetValue(controls[2])
959    NcNo.Bind(wx.EVT_SPINCTRL,OnNcNo)
960    littleSizer.Add(NcNo,0,wx.ALIGN_CENTER_VERTICAL)
961    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start Volume '),0,wx.ALIGN_CENTER_VERTICAL)
962    startVol = wx.TextCtrl(self.dataDisplay,value=str(controls[3]),style=wx.TE_PROCESS_ENTER)
963    startVol.Bind(wx.EVT_TEXT_ENTER,OnStartVol)
964    startVol.Bind(wx.EVT_KILL_FOCUS,OnStartVol)
965    littleSizer.Add(startVol,0,wx.ALIGN_CENTER_VERTICAL)
966    mainSizer.Add(littleSizer,0)
967    mainSizer.Add((5,5),0)
968    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Select Bravais Lattices for indexing: '),
969        0,wx.ALIGN_CENTER_VERTICAL)
970    mainSizer.Add((5,5),0)
971    littleSizer = wx.FlexGridSizer(2,7,5,5)
972    bravList = []
973    bravs = zip(bravais,bravaisNames)
974    for brav,bravName in bravs:
975        bravCk = wx.CheckBox(self.dataDisplay,label=bravName)
976        bravList.append(bravCk.GetId())
977        bravCk.SetValue(brav)
978        bravCk.Bind(wx.EVT_CHECKBOX,OnBravais)
979        littleSizer.Add(bravCk,0,wx.ALIGN_CENTER_VERTICAL)
980    mainSizer.Add(littleSizer,0)
981    mainSizer.Add((5,5),0)
982    littleSizer = wx.FlexGridSizer(1,3,5,5)
983    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Zero offset"),0,wx.ALIGN_CENTER_VERTICAL)
984    zero = wx.TextCtrl(self.dataDisplay,value="%.2f"%(controls[1]),style=wx.TE_PROCESS_ENTER)
985    zero.Bind(wx.EVT_TEXT_ENTER,OnZero)
986    zero.Bind(wx.EVT_KILL_FOCUS,OnZero)
987    littleSizer.Add(zero,0,wx.ALIGN_CENTER_VERTICAL)
988    zeroVar = wx.CheckBox(self.dataDisplay,label="Vary? (not implemented)")
989    zeroVar.Bind(wx.EVT_CHECKBOX,OnZeroVar)
990    littleSizer.Add(zeroVar,0,wx.ALIGN_CENTER_VERTICAL)
991    mainSizer.Add(littleSizer,0)
992    mainSizer.Add((5,5),0)
993    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Cell Refinement: '),0,wx.ALIGN_CENTER_VERTICAL)
994    mainSizer.Add((5,5),0)
995    littleSizer = wx.FlexGridSizer(1,3,5,5)
996    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Bravais lattice "),0,wx.ALIGN_CENTER_VERTICAL)
997    bravSel = wx.Choice(self.dataDisplay,choices=bravaisSymb)
998    bravSel.SetSelection(bravaisSymb.index(controls[5]))
999    bravSel.Bind(wx.EVT_CHOICE,OnBravSel)
1000    littleSizer.Add(bravSel,0,wx.ALIGN_CENTER_VERTICAL)
1001    hklShow = wx.CheckBox(self.dataDisplay,label="Show starting hkl positions")
1002    hklShow.Bind(wx.EVT_CHECKBOX,OnHklShow)
1003    littleSizer.Add(hklShow,0,wx.ALIGN_CENTER_VERTICAL)
1004    mainSizer.Add(littleSizer,0)
1005    mainSizer.Add((5,5),0)
1006    ibrav = SetLattice(controls)
1007    for cellGUI in cellGUIlist:
1008        if ibrav in cellGUI[0]:
1009            useGUI = cellGUI
1010    cellList = []
1011    littleSizer = wx.FlexGridSizer(2,useGUI[1],5,5)
1012    for txt,fmt,ifEdit,Id in useGUI[2]:
1013        littleSizer.Add(wx.StaticText(self.dataDisplay,label=txt),0,wx.ALIGN_CENTER_VERTICAL)
1014        if ifEdit:          #a,b,c,etc.
1015            cellVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[6+Id])),style=wx.TE_PROCESS_ENTER)
1016            cellVal.Bind(wx.EVT_TEXT_ENTER,OnCellChange)       
1017            cellVal.Bind(wx.EVT_KILL_FOCUS,OnCellChange)
1018            littleSizer.Add(cellVal,0,wx.ALIGN_CENTER_VERTICAL)
1019            cellList.append(cellVal.GetId())
1020        else:               #volume
1021            volVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[12])),style=wx.TE_READONLY)
1022            volVal.SetBackgroundColour(VERY_LIGHT_GREY)
1023            littleSizer.Add(volVal,0,wx.ALIGN_CENTER_VERTICAL)
1024    mainSizer.Add(littleSizer,0)
1025    mainSizer.Layout()   
1026    self.dataDisplay.SetSizer(mainSizer)
1027    topSize = mainSizer.Fit(self.dataFrame)
1028    self.dataDisplay.SetSize(topSize)
1029    if cells:
1030        if ibrav == 13:
1031            topSize[1] += 230
1032        else:
1033            topSize[1] += 200
1034    self.dataFrame.setSizePosLeft(topSize)
1035   
1036   
1037    if cells:
1038        bottomSize = self.bottom.GetSize()
1039        if ibrav == 13:
1040            bottomSize[1] -= 240
1041        else:
1042            bottomSize[1] -= 210
1043        wx.StaticText(parent=self.bottom,label=' Indexing Result ')
1044        rowLabels = []
1045        colLabels = ['M20','X20','use','Bravais','a','b','c','alpha','beta','gamma','Volume']
1046        Types = [wg.GRID_VALUE_FLOAT+':10,2',wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING,
1047            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',
1048            wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',
1049            wg.GRID_VALUE_FLOAT+':10,2']
1050        numRows = len(cells)
1051        table = []
1052        for cell in cells:
1053            rowLabels.append('')
1054            row = cell[0:2]+[cell[-1]]+[bravaisSymb[cell[2]]]+cell[3:10]
1055            if cell[-1]:
1056                A = G2lat.cell2A(cell[3:9])
1057                self.HKL = G2lat.GenHBravais(dmin,cell[2],A)
1058                for hkl in self.HKL:
1059                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
1060            table.append(row)
1061        UnitCellsTable = G2gd.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1062        gridDisplay = G2gd.GSGrid(self.bottom)
1063        gridDisplay.SetPosition(wx.Point(0,20))               
1064        gridDisplay.SetTable(UnitCellsTable, True)
1065        self.dataFrame.CopyCell.Enable(True)
1066#        gridDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshUnitCellsGrid)
1067        gridDisplay.Bind(wg.EVT_GRID_CELL_LEFT_CLICK,RefreshUnitCellsGrid)
1068        gridDisplay.SetMargins(0,0)
1069        gridDisplay.SetRowLabelSize(0)
1070        gridDisplay.AutoSizeColumns(False)
1071        for r in range(gridDisplay.GetNumberRows()):
1072            for c in range(gridDisplay.GetNumberCols()):
1073                if c == 2:
1074                    gridDisplay.SetReadOnly(r,c,isReadOnly=False)
1075                else:
1076                    gridDisplay.SetReadOnly(r,c,isReadOnly=True)
1077        gridDisplay.SetSize(bottomSize)
1078
1079def UpdatePDFGrid(self,data):
1080    global inst
1081    tth2q = lambda t,w:4.0*math.pi*sind(t/2.0)/w
1082    dataFile = self.PatternTree.GetItemText(self.PatternId)
1083    powName = 'PWDR'+dataFile[4:]
1084    powId = G2gd.GetPatternTreeItemId(self,self.root, powName)
1085    fullLimits,limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Limits'))
1086    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Instrument Parameters'))
1087    inst = dict(zip(inst[3],inst[1]))
1088    if 'Lam' in inst:
1089        keV = 12.397639/inst['Lam']
1090    else:
1091        keV = 12.397639/inst['Lam1']
1092    wave = 12.397639/keV
1093    qLimits = [tth2q(fullLimits[0],wave),tth2q(fullLimits[1],wave)]
1094    data['QScaleLim'][1] = min(qLimits[1],data['QScaleLim'][1])
1095    if data['QScaleLim'][0]:
1096        data['QScaleLim'][0] = max(qLimits[0],data['QScaleLim'][0])
1097    else:                                #initial setting at 90% of max Q
1098        data['QScaleLim'][0] = 0.90*data['QScaleLim'][1]
1099    polariz = inst['Polariz.']
1100    azimuth = inst['Azimuth']
1101    itemDict = {}
1102   
1103    def FillFileSizer(fileSizer,key):
1104        #fileSizer is a FlexGridSizer(3,6)
1105       
1106        def OnSelectFile(event):
1107            Obj = event.GetEventObject()
1108            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1109            if itemKey == 'Name':
1110                value = Obj.GetValue()
1111            Obj.SetValue(fmt%(value))
1112            data[fileKey][itemKey] = value
1113            UpdatePDFGrid(self,data)
1114       
1115        def OnValueChange(event):
1116            Obj = event.GetEventObject()
1117            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1118            try:
1119                value = float(Obj.GetValue())
1120            except ValueError:
1121                value = -1.0
1122            Obj.SetValue(fmt%(value))
1123            data[fileKey][itemKey] = value
1124            auxPlot = ComputePDF(data)
1125            G2plt.PlotISFG(self,newPlot=True)
1126                       
1127        item = data[key]
1128        fileList = np.array(GetFileList('PWDR')).T[1]
1129        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' '+key+' file:'),0,wx.ALIGN_CENTER_VERTICAL)
1130        fileName = wx.ComboBox(self.dataDisplay,value=item['Name'],choices=fileList,
1131            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1132        itemDict[fileName.GetId()] = [key,'Name','%s']
1133        fileName.Bind(wx.EVT_COMBOBOX,OnSelectFile)       
1134        fileSizer.Add(fileName,0,)
1135        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Multiplier:'),0,wx.ALIGN_CENTER_VERTICAL)
1136        mult = wx.TextCtrl(self.dataDisplay,value='%.3f'%(item['Mult']),style=wx.TE_PROCESS_ENTER)
1137        itemDict[mult.GetId()] = [key,'Mult','%.3f']
1138        mult.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1139        mult.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1140        fileSizer.Add(mult,0,)
1141        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Add:'),0,wx.ALIGN_CENTER_VERTICAL)
1142        add = wx.TextCtrl(self.dataDisplay,value='%.0f'%(item['Add']),style=wx.TE_PROCESS_ENTER)
1143        itemDict[add.GetId()] = [key,'Add','%.0f']
1144        add.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1145        add.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1146        fileSizer.Add(add,0,)
1147       
1148    def SumElementVolumes():
1149        sumVol = 0.
1150        ElList = data['ElList']
1151        for El in ElList:
1152            Avol = (4.*math.pi/3.)*ElList[El]['Drad']**3
1153            sumVol += Avol*ElList[El]['FormulaNo']
1154        return sumVol
1155        auxPlot = ComputePDF(data)
1156        G2plt.PlotISFG(self,newPlot=True)       
1157       
1158    def FillElemSizer(elemSizer,ElData):
1159       
1160        def OnFractionChange(event):
1161            try:
1162                value = max(0.0,float(num.GetValue()))
1163            except ValueError:
1164                value = 0.0
1165            num.SetValue('%.3f'%(value))
1166            ElData['FormulaNo'] = value
1167            data['Form Vol'] = max(10.0,SumElementVolumes())
1168            formVol.SetValue('%.2f'%(data['Form Vol']))
1169            UpdatePDFGrid(self,data)
1170            auxPlot = ComputePDF(data)
1171            G2plt.PlotISFG(self,newPlot=True)       
1172       
1173        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1174            label=' Element: '+'%2s'%(ElData['Symbol'])+' * '),0,wx.ALIGN_CENTER_VERTICAL)
1175        num = wx.TextCtrl(self.dataDisplay,value='%.3f'%(ElData['FormulaNo']),style=wx.TE_PROCESS_ENTER)
1176        num.Bind(wx.EVT_TEXT_ENTER,OnFractionChange)       
1177        num.Bind(wx.EVT_KILL_FOCUS,OnFractionChange)
1178        elemSizer.Add(num,0,wx.ALIGN_CENTER_VERTICAL)
1179        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1180            label="f': %.3f"%(ElData['fp'])+' f": %.3f'%(ElData['fpp'])+' mu: %.2f barns'%(ElData['mu']) ),
1181            0,wx.ALIGN_CENTER_VERTICAL)
1182           
1183    def OnGeometry(event):
1184        data['Geometry'] = geometry.GetValue()
1185        UpdatePDFGrid(self,data)
1186        auxPlot = ComputePDF(data)
1187        G2plt.PlotISFG(self,newPlot=True)       
1188       
1189    def OnDetType(event):
1190        data['DetType'] = detType.GetValue()
1191        UpdatePDFGrid(self,data)
1192        auxPlot = ComputePDF(data)
1193        G2plt.PlotISFG(self,newPlot=True)       
1194       
1195    def OnFormVol(event):
1196        try:
1197            value = float(formVol.GetValue())
1198            if value <= 0.0:
1199                raise ValueError
1200        except ValueError:
1201            value = data['Form Vol']
1202        data['Form Vol'] = value
1203        UpdatePDFGrid(self,data)
1204        auxPlot = ComputePDF(data)
1205        G2plt.PlotISFG(self,newPlot=False)       
1206       
1207    def OnDiameter(event):
1208        try:
1209            value = float(diam.GetValue())
1210            if value <= 0.0:
1211                raise ValueError
1212        except ValueError:
1213            value = data['Diam']
1214        data['Diam'] = value
1215        UpdatePDFGrid(self,data)
1216        auxPlot = ComputePDF(data)
1217        G2plt.PlotISFG(self,newPlot=False)
1218       
1219    def OnPolaVal(event):
1220        try:
1221            value = float(polaVal.GetValue())
1222            if not (0.0 <= value <= 1.0):
1223                raise ValueError
1224        except ValueError:
1225            value = inst['Polariz.']
1226        inst['Polariz.'] = value
1227        polaVal.SetValue('%.2f'%(inst['Polariz.']))
1228        UpdatePDFGrid(self,data)
1229        auxPlot = ComputePDF(data)
1230        G2plt.PlotISFG(self,newPlot=False)
1231               
1232    def OnAzimVal(event):
1233        try:
1234            value = float(azimVal.GetValue())
1235            if not (0. <= value <= 360.):
1236                raise ValueError
1237        except ValueError:
1238            value = inst['Azimuth']
1239        inst['Azimuth'] = value
1240        azimVal.SetValue('%.1f'%(inst['Azimuth']))
1241        UpdatePDFGrid(self,data)
1242        auxPlot = ComputePDF(data)
1243        G2plt.PlotISFG(self,newPlot=False)
1244                       
1245    def OnObliqCoeff(event):
1246        try:
1247            value = float(obliqCoeff.GetValue())
1248            if value < 0.0:
1249                raise ValueError
1250            elif value > 1.0:
1251                value = 1.0
1252        except ValueError:
1253            value = data['ObliqCoeff']
1254        data['ObliqCoeff'] = value
1255        obliqCoeff.SetValue('%.3f'%(value))
1256        auxPlot = ComputePDF(data)
1257        G2plt.PlotISFG(self,newPlot=False)
1258       
1259    def OnRulandWdt(event):
1260        try:
1261            value = float(rulandWdt.GetValue())
1262            if value <= 0.001:
1263                raise ValueError
1264            elif value > 1.0:
1265                value = 1.0
1266        except ValueError:
1267            value = data['Ruland']
1268        data['Ruland'] = value
1269        rulandWdt.SetValue('%.3f'%(value))
1270        auxPlot = ComputePDF(data)
1271        G2plt.PlotISFG(self,newPlot=False)
1272       
1273    def OnRulSlider(event):
1274        value = int(rulandSldr.GetValue())/1000.
1275        data['Ruland'] = max(0.001,value)
1276        rulandWdt.SetValue('%.3f'%(data['Ruland']))
1277        auxPlot = ComputePDF(data)
1278        G2plt.PlotISFG(self,newPlot=False)
1279       
1280    def OnLorch(event):
1281        data['Lorch'] = lorch.GetValue()
1282        auxPlot = ComputePDF(data)
1283        G2plt.PlotISFG(self,newPlot=False)       
1284                       
1285    def OnPacking(event):
1286        try:
1287            value = float(pack.GetValue())
1288            if value <= 0.0:
1289                raise ValueError
1290        except ValueError:
1291            value = data['Pack']
1292        data['Pack'] = value
1293        UpdatePDFGrid(self,data)
1294        auxPlot = ComputePDF(data)
1295        G2plt.PlotISFG(self,newPlot=False)       
1296               
1297    def OnSQmin(event):
1298        try:
1299            value = float(SQmin.GetValue())
1300            if value < qLimits[0]:
1301                raise ValueError
1302        except ValueError:
1303            value = max(qLimits[0],data['QScaleLim'][0])
1304        data['QScaleLim'][0] = value
1305        SQmin.SetValue('%.1f'%(value))
1306        auxPlot = ComputePDF(data)
1307        G2plt.PlotISFG(self,newPlot=True)       
1308       
1309    def OnSQmax(event):
1310        try:
1311            value = float(SQmax.GetValue())
1312            if value > qLimits[1]:
1313                raise ValueError
1314        except ValueError:
1315            value = min(qLimits[1],data['QScaleLim'][1])
1316        data['QScaleLim'][1] = value
1317        if value < data['QScaleLim'][0]:
1318            data['QScaleLim'][0] = 0.90*value
1319            SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1320        SQmax.SetValue('%.1f'%(value))
1321        auxPlot = ComputePDF(data)
1322        G2plt.PlotISFG(self,newPlot=True)
1323       
1324    def OnResetQ(event):
1325        resetQ.SetValue(False)
1326        data['QScaleLim'][1] = qLimits[1]
1327        SQmax.SetValue('%.1f'%(data['QScaleLim'][1]))
1328        data['QScaleLim'][0] = 0.9*qLimits[1]
1329        SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1330        auxPlot = ComputePDF(data)
1331        G2plt.PlotISFG(self,newPlot=True)       
1332
1333    def GetFileList(fileType,skip=None):
1334        fileList = [[False,'',0]]
1335        Source = ''
1336        id, cookie = self.PatternTree.GetFirstChild(self.root)
1337        while id:
1338            name = self.PatternTree.GetItemText(id)
1339            if fileType in name:
1340                if id == skip:
1341                    Source = name
1342                else:
1343                    fileList.append([False,name,id])
1344            id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1345        if skip:
1346            return fileList,Source
1347        else:
1348            return fileList
1349       
1350    def OnCopyPDFControls(event):
1351        import copy
1352        TextList,Source = GetFileList('PDF',skip=self.PatternId)
1353        TextList[0] = [False,'All PDF',0]
1354        if len(TextList) == 1:
1355            self.ErrorDialog('Nothing to copy controls to','There must be more than one "PDF" pattern')
1356            return
1357        dlg = self.CopyDialog(self,'Copy PDF controls','Copy controls from '+Source+' to:',TextList)
1358        try:
1359            if dlg.ShowModal() == wx.ID_OK:
1360                result = dlg.GetData()
1361                if result[0][0]:
1362                    result = TextList[1:]
1363                    for item in result: item[0] = True
1364                for i,item in enumerate(result):
1365                    ifcopy,name,id = item
1366                    if ifcopy:
1367                        olddata = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'))
1368                        sample = olddata['Sample']
1369                        olddata.update(data)
1370                        olddata['Sample'] = sample
1371                        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'),olddata)
1372                Status.SetStatusText('PDF controls copied')
1373        finally:
1374            dlg.Destroy()
1375               
1376    def OnSavePDFControls(event):
1377        print 'save PDF controls?'
1378       
1379    def OnLoadPDFControls(event):
1380        print 'Load PDF controls?'
1381       
1382    def OnAddElement(event):
1383        ElList = data['ElList']
1384        PE = G2elem.PickElement(self,oneOnly=True)
1385        if PE.ShowModal() == wx.ID_OK:
1386            El = PE.Elem
1387            if El not in ElList:
1388                ElemSym = El.strip().upper()               
1389                FpMu = G2elem.FPcalc(G2elem.GetXsectionCoeff(ElemSym), keV)
1390                ElData = G2elem.GetFormFactorCoeff(ElemSym)[0]
1391                ElData['FormulaNo'] = 0.0
1392                ElData.update(G2elem.GetAtomInfo(ElemSym))
1393                ElData.update(dict(zip(['fp','fpp','mu'],FpMu)))
1394                ElData.update(G2elem.GetFFC5(El))
1395                data['ElList'][El] = ElData
1396            data['Form Vol'] = max(10.0,SumElementVolumes())
1397        PE.Destroy()
1398        UpdatePDFGrid(self,data)
1399       
1400    def OnDeleteElement(event):
1401        ElList = data['ElList']
1402        choice = ElList.keys()
1403        dlg = G2elem.DeleteElement(self,choice=choice)
1404        if dlg.ShowModal() == wx.ID_OK:
1405            del ElList[dlg.GetDeleteElement()]
1406        dlg.Destroy()
1407        UpdatePDFGrid(self,data)
1408               
1409    def ComputePDF(Data):
1410        xydata = {}
1411        for key in ['Sample','Sample Bkg.','Container','Container Bkg.']:
1412            name = Data[key]['Name']
1413            if name:
1414                xydata[key] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.root,name))
1415                PDFname = name
1416        powName = xydata['Sample'][2]
1417        powId = G2gd.GetPatternTreeItemId(self,self.root,powName)
1418        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId,'Instrument Parameters'))
1419        inst = dict(zip(inst[3],inst[1]))
1420        auxPlot = G2pwd.CalcPDF(Data,inst,xydata)
1421        PDFId = G2gd.GetPatternTreeItemId(self,self.root,'PDF '+powName[4:])
1422        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'I(Q)'+powName[4:]),xydata['IofQ'])
1423        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'S(Q)'+powName[4:]),xydata['SofQ'])
1424        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'F(Q)'+powName[4:]),xydata['FofQ'])
1425        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'G(R)'+powName[4:]),xydata['GofR'])
1426        return auxPlot
1427       
1428    def OnComputePDF(event):
1429        print 'Calculating PDF:'
1430        auxPlot = ComputePDF(data)
1431        print 'Done calculating PDF:'
1432        Status.SetStatusText('PDF computed')
1433        for plot in auxPlot:
1434            G2plt.PlotXY(self,plot[:2],type=plot[2])
1435       
1436        G2plt.PlotISFG(self,newPlot=True,type='I(Q)')
1437        G2plt.PlotISFG(self,newPlot=True,type='S(Q)')
1438        G2plt.PlotISFG(self,newPlot=True,type='F(Q)')
1439        G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1440       
1441    def OnComputeAllPDF(event):
1442        print 'Calculating PDFs:'
1443        if self.PatternTree.GetCount():
1444            id, cookie = self.PatternTree.GetFirstChild(self.root)
1445            while id:
1446                Name = self.PatternTree.GetItemText(id)
1447                if 'PDF' in Name:
1448                    Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id,'PDF Controls'))
1449                    auxPlot = ComputePDF(Data)                   
1450                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1451            Status.SetStatusText('All PDFs computed')
1452            G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1453            print ' Done calculating PDFs:'
1454       
1455    def OnShowTip(self,tip):
1456        print tip   
1457               
1458    if self.dataDisplay:
1459        self.dataFrame.Clear()
1460    self.dataFrame.SetMenuBar(self.dataFrame.PDFMenu)
1461    if not self.dataFrame.GetStatusBar():
1462        Status = self.dataFrame.CreateStatusBar()   
1463    self.dataDisplay = wx.Panel(self.dataFrame)
1464    self.dataFrame.Bind(wx.EVT_MENU, OnCopyPDFControls, id=G2gd.wxID_PDFCOPYCONTROLS)
1465    self.dataFrame.Bind(wx.EVT_MENU, OnSavePDFControls, id=G2gd.wxID_PDFSAVECONTROLS)
1466    self.dataFrame.Bind(wx.EVT_MENU, OnLoadPDFControls, id=G2gd.wxID_PDFLOADCONTROLS)
1467    self.dataFrame.Bind(wx.EVT_MENU, OnAddElement, id=G2gd.wxID_PDFADDELEMENT)
1468    self.dataFrame.Bind(wx.EVT_MENU, OnDeleteElement, id=G2gd.wxID_PDFDELELEMENT)
1469    self.dataFrame.Bind(wx.EVT_MENU, OnComputePDF, id=G2gd.wxID_PDFCOMPUTE)
1470    self.dataFrame.Bind(wx.EVT_MENU, OnComputeAllPDF, id=G2gd.wxID_PDFCOMPUTEALL)
1471    mainSizer = wx.BoxSizer(wx.VERTICAL)
1472    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' PDF data files: '),0,wx.ALIGN_CENTER_VERTICAL)
1473    mainSizer.Add((5,5),0)
1474    str = ' Sample file: PWDR %s   Wavelength, A: %.5f  Energy, keV: %.3f  Polariz.: %.2f '%(dataFile[3:],wave,keV,polariz)
1475    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=str),0,wx.ALIGN_CENTER_VERTICAL)
1476#    dataSizer = wx.BoxSizer(wx.HORIZONTAL)
1477#    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Azimuth'),0,wx.ALIGN_CENTER_VERTICAL)
1478#    azimVal = wx.TextCtrl(self.dataDisplay,value='%.2f'%(inst['Azimuth']))
1479#    azimVal.Bind(wx.EVT_TEXT_ENTER,OnAzimVal)       
1480#    azimVal.Bind(wx.EVT_KILL_FOCUS,OnAzimVal)
1481#    dataSizer.Add(azimVal,0)   
1482#    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Polarization'),0,wx.ALIGN_CENTER_VERTICAL)
1483#    polaVal = wx.TextCtrl(self.dataDisplay,value='%.2f'%(inst['Polariz.']))
1484#    polaVal.Bind(wx.EVT_TEXT_ENTER,OnPolaVal)       
1485#    polaVal.Bind(wx.EVT_KILL_FOCUS,OnPolaVal)
1486#    dataSizer.Add(polaVal,0)   
1487#    mainSizer.Add(dataSizer,0)
1488    mainSizer.Add((5,5),0)
1489    fileSizer = wx.FlexGridSizer(3,6,5,1)
1490    select = ['Sample Bkg.','Container']
1491    if data['Container']['Name']:
1492        select.append('Container Bkg.')
1493    for key in select:
1494        FillFileSizer(fileSizer,key)
1495    mainSizer.Add(fileSizer,0)
1496    mainSizer.Add((5,5),0)
1497    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Sample information: '),0,wx.ALIGN_CENTER_VERTICAL)
1498    mainSizer.Add((5,5),0)   
1499
1500    ElList = data['ElList']
1501    Abs = G2lat.CellAbsorption(ElList,data['Form Vol'])
1502    Trans = G2pwd.Transmission(data['Geometry'],Abs*data['Pack'],data['Diam'])
1503    elemSizer = wx.FlexGridSizer(3,3,5,1)
1504    for El in ElList:
1505        FillElemSizer(elemSizer,ElList[El])
1506    mainSizer.Add(elemSizer,0)
1507    mainSizer.Add((5,5),0)   
1508    midSizer = wx.BoxSizer(wx.HORIZONTAL)
1509    midSizer.Add(wx.StaticText(self.dataDisplay,label=' Formula volume: '),0,wx.ALIGN_CENTER_VERTICAL)
1510    formVol = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Form Vol']))
1511    formVol.Bind(wx.EVT_TEXT_ENTER,OnFormVol)       
1512    formVol.Bind(wx.EVT_KILL_FOCUS,OnFormVol)
1513    midSizer.Add(formVol,0)
1514    midSizer.Add(wx.StaticText(self.dataDisplay,
1515        label=' Theoretical absorption: %.4f cm-1 Sample absorption: %.4f cm-1'%(Abs,Abs*data['Pack'])),
1516        0,wx.ALIGN_CENTER_VERTICAL)
1517    mainSizer.Add(midSizer,0)
1518    mainSizer.Add((5,5),0)   
1519
1520    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1521    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample geometry: '),0,wx.ALIGN_CENTER_VERTICAL)
1522    choice = ['Cylinder','Bragg-Brentano','Tilting flat plate in transmission','Fixed flat plate']
1523    geometry = wx.ComboBox(self.dataDisplay,value=data['Geometry'],choices=choice,
1524            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1525    geometry.Bind(wx.EVT_COMBOBOX, OnGeometry)
1526    geoBox.Add(geometry,0)
1527    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample diameter/thickness, mm: '),0,wx.ALIGN_CENTER_VERTICAL)
1528    diam = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Diam']))
1529    diam.Bind(wx.EVT_TEXT_ENTER,OnDiameter)       
1530    diam.Bind(wx.EVT_KILL_FOCUS,OnDiameter)
1531#    diam.Bind(wx.EVT_SET_FOCUS,OnShowTip(self,'tip')) #this doesn't work - what would????
1532    geoBox.Add(diam,0)
1533    mainSizer.Add(geoBox,0)
1534    mainSizer.Add((5,5),0)   
1535    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1536    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Packing: '),0,wx.ALIGN_CENTER_VERTICAL)
1537    pack = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Pack']))
1538    pack.Bind(wx.EVT_TEXT_ENTER,OnPacking)       
1539    pack.Bind(wx.EVT_KILL_FOCUS,OnPacking)
1540    geoBox.Add(pack,0)
1541    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample transmission: %.3f %%'%(Trans)),0,wx.ALIGN_CENTER_VERTICAL)   
1542    mainSizer.Add(geoBox,0)
1543    mainSizer.Add((5,5),0)   
1544       
1545    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' S(Q)->F(Q)->G(R) controls: '),0,wx.ALIGN_CENTER_VERTICAL)
1546    mainSizer.Add((5,5),0)
1547    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1548    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Detector type: '),0,wx.ALIGN_CENTER_VERTICAL)
1549    choice = ['Image plate','Point detector']
1550    detType = wx.ComboBox(self.dataDisplay,value=data['DetType'],choices=choice,
1551            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1552    detType.Bind(wx.EVT_COMBOBOX, OnDetType)
1553    sqBox.Add(detType,0)
1554    if data['DetType'] == 'Image plate':
1555        sqBox.Add(wx.StaticText(self.dataDisplay,label=' IP transmission coeff.: '),0,wx.ALIGN_CENTER_VERTICAL)
1556        obliqCoeff = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['ObliqCoeff']))
1557        obliqCoeff.Bind(wx.EVT_TEXT_ENTER,OnObliqCoeff)       
1558        obliqCoeff.Bind(wx.EVT_KILL_FOCUS,OnObliqCoeff)
1559        sqBox.Add(obliqCoeff,0)
1560    mainSizer.Add(sqBox,0)
1561       
1562    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1563    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Ruland width: '),0,wx.ALIGN_CENTER_VERTICAL)   
1564    rulandSldr = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
1565        value=int(1000*data['Ruland']))
1566    sqBox.Add(rulandSldr,1,wx.EXPAND)
1567    rulandSldr.Bind(wx.EVT_SLIDER, OnRulSlider)
1568    rulandWdt = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Ruland']))
1569    rulandWdt.Bind(wx.EVT_TEXT_ENTER,OnRulandWdt)       
1570    rulandWdt.Bind(wx.EVT_KILL_FOCUS,OnRulandWdt)
1571    sqBox.Add(rulandWdt,0,wx.ALIGN_CENTER_VERTICAL)   
1572    mainSizer.Add(sqBox,0,wx.ALIGN_LEFT|wx.EXPAND)
1573   
1574    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1575    lorch = wx.CheckBox(parent=self.dataDisplay,label='Lorch damping?')
1576    lorch.SetValue(data['Lorch'])
1577    lorch.Bind(wx.EVT_CHECKBOX, OnLorch)
1578    sqBox.Add(lorch,0,wx.ALIGN_CENTER_VERTICAL)
1579    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Scaling q-range: '),0,wx.ALIGN_CENTER_VERTICAL)
1580    SQmin = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][0]))
1581    SQmin.Bind(wx.EVT_TEXT_ENTER,OnSQmin)       
1582    SQmin.Bind(wx.EVT_KILL_FOCUS,OnSQmin)   
1583    sqBox.Add(SQmin,0)
1584    sqBox.Add(wx.StaticText(self.dataDisplay,label=' to '),0,wx.ALIGN_CENTER_VERTICAL)
1585    SQmax = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][1]))
1586    SQmax.Bind(wx.EVT_TEXT_ENTER,OnSQmax)       
1587    SQmax.Bind(wx.EVT_KILL_FOCUS,OnSQmax)
1588    sqBox.Add(SQmax,0)
1589    resetQ = wx.CheckBox(parent=self.dataDisplay,label='Reset?')
1590    sqBox.Add(resetQ,0)
1591    resetQ.Bind(wx.EVT_CHECKBOX, OnResetQ)
1592   
1593    mainSizer.Add(sqBox,0)
1594
1595    mainSizer.Layout()   
1596    self.dataDisplay.SetSizer(mainSizer)
1597    Size = mainSizer.Fit(self.dataFrame)
1598    self.dataDisplay.SetSize(Size)
1599    self.dataFrame.setSizePosLeft(Size)
1600   
Note: See TracBrowser for help on using the repository browser.