source: trunk/GSASIIpwdGUI.py @ 300

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

remove BGFS option - didn't do anything anyway

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