source: trunk/GSASIIpwdGUI.py @ 117

Last change on this file since 117 was 117, checked in by vondreel, 13 years ago

refactor background GUI
implement "KILL_FOCUS" for all TextCtrl?

File size: 39.3 KB
Line 
1#GSASII - data display routines
2import wx
3import wx.grid as wg
4import math
5import time
6import cPickle
7import GSASIIpath
8import GSASIIpeak as G2pk
9import GSASIIlattice as G2lat
10import GSASIIindex as G2indx
11import GSASIIplot as G2plt
12import GSASIIgrid as G2gd
13
14VERY_LIGHT_GREY = wx.Colour(235,235,235)
15
16# trig functions in degrees
17sind = lambda x: math.sin(x*math.pi/180.)
18tand = lambda x: math.tan(x*math.pi/180.)
19cosd = lambda x: math.cos(x*math.pi/180.)
20asind = lambda x: 180.*math.asin(x)/math.pi
21       
22def UpdatePeakGrid(self, data):
23    if self.dataDisplay:
24        self.dataFrame.Clear()
25   
26    def OnUnDo(event):
27        DoUnDo()
28        self.dataFrame.UnDo.Enable(False)
29       
30    def DoUnDo():
31        print 'Undo last refinement'
32        file = open('GSASII.save','rb')
33        PatternId = self.PatternId
34        for item in ['Background','Instrument Parameters','Peak List']:
35            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item),cPickle.load(file))
36            if self.dataDisplay.GetName() == item:
37                if item == 'Background':
38                    UpdateBackgroundGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
39                elif item == 'Instrument Parameters':
40                    UpdateInstrumentGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
41                elif item == 'Peak List':
42                    UpdatePeakGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
43            print item,' recovered'
44        file.close()
45       
46    def OnPeakFit(event):
47        self.SaveState()
48        print 'Peak Fitting - Do one cycle of peak fitting'
49        PatternId = self.PatternId
50        PickId = self.PickId
51        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List'))
52        if not peaks:
53            self.ErrorDialog('No peaks!','Nothing to fit!')
54            return
55        background = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Background'))[0]
56        limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Limits'))[1]
57        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
58        data = self.PatternTree.GetItemPyData(PatternId)[1]
59        OK,smin,Rwp,runtime,GoOn = G2pk.DoPeakFit(peaks,background,limits,inst,data)
60        UpdatePeakGrid(self,peaks)
61        G2plt.PlotPatterns(self)
62        if not OK:
63            print 'Refinement failed'
64            dlg = wx.MessageDialog(self, 'Do you want to reload now?', 'Refinement failed',  wx.YES_NO)
65            try:
66                if dlg.ShowModal() == wx.ID_YES:
67                    DoUnDo()
68                    self.dataFrame.UnDo.Enable(False)
69            finally:
70                dlg.Destroy()
71        else:
72            self.dataFrame.UnDo.Enable(True)
73            print "%s%7.2f%s%12.6g" % ('Rwp = ',Rwp,'%, Smin = ',smin)
74            print "%s%8.3f%s " % ('fitpeak time =',runtime,'s')
75            print 'finished'
76        return
77       
78    def OnAutoPeakFit(event):
79        self.SaveState()
80        print 'AutoPeak Fitting - run until minimized'
81        PatternId = self.PatternId
82        PickId = self.PickId
83        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List'))
84        if not peaks:
85            self.ErrorDialog('No peaks!','Nothing to fit!')
86            return
87        background = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Background'))[0]
88        limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Limits'))[1]
89        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
90        data = self.PatternTree.GetItemPyData(PatternId)[1]
91        smin = 1.0e15
92        GoOn = True
93        while GoOn:
94            osmin = smin
95            OK,smin,Rwp,runtime,GoOn = G2pk.DoPeakFit(peaks,background,limits,inst,data)
96            UpdatePeakGrid(self,peaks)
97            if not OK:
98                break
99            G2plt.PlotPatterns(self)
100            print "%s%7.2f%s%12.6g" % ('Rwp = ',Rwp,'%, Smin = ',smin)
101            rat = (osmin-smin)/smin
102            if rat < 1.0e-4: GoOn = False
103        if not OK:
104            print 'Refinement failed'
105            dlg = wx.MessageDialog(self, 'Do you want to reload now?', 'Refinement failed',  wx.YES_NO)
106            try:
107                if dlg.ShowModal() == wx.ID_YES:
108                    DoUnDo()
109                    self.dataFrame.UnDo.Enable(False)
110            finally:
111                dlg.Destroy()
112        else:
113            self.dataFrame.UnDo.Enable(True)
114            print "%s%8.3f%s " % ('fitpeak time =',runtime,'s per cycle')
115            print 'finished'
116        return       
117
118    def RefreshPeakGrid(event):
119        event.StopPropagation()
120        data = self.PeakTable.GetData()
121        T = []
122        for peak in data:T.append(peak[0])
123        D = dict(zip(T,data))
124        T.sort()
125        X = []
126        for key in T: X.append(D[key])
127        data = X       
128        G2plt.PlotPatterns(self)
129       
130    def setBackgroundColors():
131       for r in range(self.dataDisplay.GetNumberRows()):
132           for c in range(self.dataDisplay.GetNumberCols()):
133               if self.dataDisplay.GetColLabelValue(c) in ['position','intensity','sigma','gamma']:
134                   if float(self.dataDisplay.GetCellValue(r,c)) < 0.:
135                       self.dataDisplay.SetCellBackgroundColour(r,c,wx.RED)
136                   else:
137                       self.dataDisplay.SetCellBackgroundColour(r,c,wx.WHITE)
138                           
139    def KeyEditPeakGrid(event):
140        rowList = self.dataDisplay.GetSelectedRows()
141        colList = self.dataDisplay.GetSelectedCols()
142        selectList = self.dataDisplay.GetSelectedCells()
143        data = self.PatternTree.GetItemPyData(self.PickId)
144        if event.GetKeyCode() == wx.WXK_RETURN:
145            event.Skip(True)
146        elif event.GetKeyCode() == wx.WXK_CONTROL:
147            event.Skip(True)
148        elif event.GetKeyCode() == wx.WXK_SHIFT:
149            event.Skip(True)
150        elif rowList:
151            self.dataDisplay.ClearSelection()
152            if event.GetKeyCode() == wx.WXK_DELETE:
153                self.dataDisplay.ClearGrid()
154                rowList.reverse()
155                nDel = 0
156                for row in rowList:
157                    self.PeakTable.DeleteRow(row)
158                    nDel += 1
159                if nDel:
160                    msg = wg.GridTableMessage(self.PeakTable, 
161                        wg.GRIDTABLE_NOTIFY_ROWS_DELETED,0,nDel)
162                    self.dataDisplay.ProcessTableMessage(msg)
163                data = self.PeakTable.GetData()
164                self.PatternTree.SetItemPyData(self.PickId,data[:-nDel])
165                self.dataDisplay.ForceRefresh()
166                setBackgroundColors()
167                if not len(self.PatternTree.GetItemPyData(self.PickId)): 
168                    self.dataFrame.PeakFit.Enable(False)
169                    self.dataFrame.AutoPeakFit.Enable(False)
170                       
171        elif colList:
172            self.dataDisplay.ClearSelection()
173            key = event.GetKeyCode()
174            for col in colList:
175                if self.PeakTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
176                    if key == 89: #'Y'
177                        for row in range(self.PeakTable.GetNumberRows()): data[row][col]=True
178                    elif key == 78:  #'N'
179                        for row in range(self.PeakTable.GetNumberRows()): data[row][col]=False
180        elif selectList:
181            self.dataDisplay.ClearSelection()
182            key = event.GetKeyCode()
183            for row,col in selectList:
184                if self.PeakTable.GetTypeName(row,col) == wg.GRID_VALUE_BOOL:
185                    if key == 89: #'Y'
186                        data[row][col]=True
187                    elif key == 78:  #'N'
188                        data[row][col]=False
189        G2plt.PlotPatterns(self)
190           
191    self.dataFrame.SetMenuBar(self.dataFrame.PeakMenu)
192    if not self.dataFrame.GetStatusBar():
193        Status = self.dataFrame.CreateStatusBar()
194    self.Bind(wx.EVT_MENU, OnUnDo, id=G2gd.wxID_UNDO)
195    self.Bind(wx.EVT_MENU, OnPeakFit, id=G2gd.wxID_PEAKFIT)
196    self.Bind(wx.EVT_MENU, OnAutoPeakFit, id=G2gd.wxID_AUTOPEAKFIT)
197    self.dataFrame.PeakFit.Enable(False)
198    self.dataFrame.AutoPeakFit.Enable(False)
199    if data:
200        self.dataFrame.PeakFit.Enable(True)
201        self.dataFrame.AutoPeakFit.Enable(True)
202    self.PickTable = []
203    rowLabels = []
204    for i in range(len(data)): rowLabels.append(str(i+1))
205    colLabels = ['position','refine','intensity','refine','sigma','refine','gamma','refine']
206    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_BOOL,
207        wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
208        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL,
209        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL]
210    T = []
211    for peak in data:
212        T.append(peak[0])
213    D = dict(zip(T,data))
214    T.sort()
215    X = []
216    for key in T: X.append(D[key])
217    data = X       
218    self.PatternTree.SetItemPyData(self.PickId,data)
219    self.PeakTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
220    self.dataFrame.SetLabel('Peak List')
221    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)
222    self.dataDisplay.SetTable(self.PeakTable, True)
223    setBackgroundColors()                         
224    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshPeakGrid)
225    self.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPeakGrid)                 
226    self.dataDisplay.SetMargins(0,0)
227    self.dataDisplay.AutoSizeColumns(False)
228    self.dataFrame.setSizePosLeft([535,350])
229       
230def UpdateBackgroundGrid(self,data):
231#    if self.dataDisplay:
232    self.dataFrame.Clear()
233    BackId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Background')
234    maxTerm = 9
235    Types = [wg.GRID_VALUE_CHOICE+':chebyschev,another,more',
236        wg.GRID_VALUE_BOOL,
237        wg.GRID_VALUE_NUMBER+':1,'+str(maxTerm)]
238    for i in range(maxTerm):
239        Types.append(wg.GRID_VALUE_FLOAT+':10,3')
240   
241    def RefreshBackgroundGrid(event):
242        data = self.BackTable.GetData()
243        M = len(data[0])
244        N = data[0][2]+3
245        item = data[0]
246        if N > M:       #add terms
247            for i in range(M,N): 
248                item.append(0.0)
249                self.BackTable.SetColLabelValue(i,str(i-2))
250            data = [item]
251            msg = wg.GridTableMessage(self.BackTable, 
252                wg.GRIDTABLE_NOTIFY_COLS_APPENDED,0,N-M)
253            self.dataDisplay.ProcessTableMessage(msg)                         
254        elif N < M:     #delete terms
255            new = []
256            for i in range(N):
257                new.append(item[i])
258            data = [new]
259            msg = wg.GridTableMessage(self.BackTable, 
260                wg.GRIDTABLE_NOTIFY_COLS_DELETED,0,M-N)
261            self.dataDisplay.ProcessTableMessage(msg)
262        self.PatternTree.SetItemPyData(BackId,data)
263                 
264    self.BackTable = []
265    N = len(data[0])
266    M = data[0][2]
267    colLabels = ['function','refine','Nterms']
268    rowLabels=['background']
269    for i in range(M): colLabels.append(str(i+1))
270    self.BackTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
271    self.dataFrame.SetLabel('Background')
272    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
273    gridPanel = wx.Panel(self.dataFrame)
274    self.dataDisplay = G2gd.GSGrid(gridPanel)               
275    self.dataDisplay.SetTable(self.BackTable, True)
276    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshBackgroundGrid)               
277    self.dataDisplay.SetMargins(0,0)
278    self.dataDisplay.AutoSizeColumns(False)
279    mainSizer = wx.BoxSizer(wx.VERTICAL)
280    mainSizer.Add(self.dataDisplay,0)
281    mainSizer.Layout()   
282    self.dataDisplay.SetSizer(mainSizer)
283    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
284       
285def UpdateLimitsGrid(self, data):
286    if self.dataDisplay:
287        self.dataFrame.Clear()
288    LimitId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Limits')
289    def RefreshLimitsGrid(event):
290        data = self.LimitsTable.GetData()
291        old = data[0]
292        new = data[1]
293        new[0] = max(old[0],new[0])
294        new[1] = max(new[0],min(old[1],new[1]))
295        data = [old,new]
296        G2plt.PlotPatterns(self)
297       
298    self.LimitsTable = []
299    colLabels = ['Tmin','Tmax']
300    rowLabels = ['original','changed']
301    Types = [wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3']
302    self.LimitsTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
303    self.dataFrame.SetLabel('Limits')
304    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
305    gridPanel = wx.Panel(self.dataFrame)
306    self.dataDisplay = G2gd.GSGrid(gridPanel)               
307    self.dataDisplay.SetTable(self.LimitsTable, True)
308    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshLimitsGrid)               
309    self.dataDisplay.SetMargins(0,0)
310    self.dataDisplay.AutoSizeColumns(False)
311    mainSizer = wx.BoxSizer(wx.VERTICAL)
312    mainSizer.Add(self.dataDisplay,0)
313    mainSizer.Layout()   
314    self.dataDisplay.SetSizer(mainSizer)
315    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
316   
317def UpdateInstrumentGrid(self, data):
318    if self.dataDisplay:
319        self.dataFrame.Clear()
320    Ka2 = False
321    if len(data[0]) == 13: 
322        Ka2 = True
323    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
324    InstId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters')
325   
326    def RefreshInstrumentGrid(event,doAnyway=False):
327        if doAnyway or event.GetRow() == 1:
328            peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
329            ins = data[1]
330            if 'P' in ins[0]:                                       #update powder peak parameters
331                for peak in peaks:
332                    if Ka2:
333                        peak[4] = ins[6]*tand(peak[0]/2.0)**2+ins[7]*tand(peak[0]/2.0)+ins[8]
334                        peak[6] = ins[9]/cosd(peak[0]/2.0)+ins[10]*tand(peak[0]/2.0)
335                    else:
336                        peak[4] = ins[4]*tand(peak[0]/2.0)**2+ins[5]*tand(peak[0]/2.0)+ins[6]
337                        peak[6] = ins[7]/cosd(peak[0]/2.0)+ins[8]*tand(peak[0]/2.0)
338                       
339    def OnReset(event):
340        if Ka2:
341            data[1][6:12] = data[0][6:12]
342        else:
343            data[1][4:10] = data[0][4:10]
344        RefreshInstrumentGrid(event,doAnyway=True)          #to get peaks updated
345        UpdateInstrumentGrid(self, data)
346       
347    self.InstrumentTable = []
348    if 'P' in data[1][0]:                   #powder data
349        self.dataFrame.SetMenuBar(self.dataFrame.InstMenu)
350        if not self.dataFrame.GetStatusBar():
351            Status = self.dataFrame.CreateStatusBar()
352        self.Bind(wx.EVT_MENU, OnReset, id=G2gd.wxID_INSTPRMRESET)
353        if Ka2:
354            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
355                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #zero, ratio, pola
356                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #u,v,w
357                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,2']
358        else:
359            Types = [wg.GRID_VALUE_CHOICE+":PXC,PNC,PNT",wg.GRID_VALUE_FLOAT+':10,6',               #type & lam-1
360                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #zero, pola
361                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #u,v,w
362                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,2']
363        colLabels = data[3]
364        rowLabels = ['default','changed','refine']
365        self.InstrumentTable = G2gd.Table(data[:-1],rowLabels=rowLabels,colLabels=colLabels,types=Types)
366        self.dataFrame.SetLabel('Instrument Parameters')
367        gridPanel = wx.Panel(self.dataFrame)
368        self.dataDisplay = G2gd.GSGrid(gridPanel)               
369        self.dataDisplay.SetTable(self.InstrumentTable, True)
370        self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshInstrumentGrid)               
371        self.dataDisplay.SetMargins(0,0)
372        self.dataDisplay.AutoSizeColumns(False)
373        beg = 4
374        if Ka2: beg = 6
375        for i in range(len(data[2])):
376            if i < beg or i == beg+6:
377                self.dataDisplay.SetCellRenderer(2,i,wg.GridCellStringRenderer())
378                self.dataDisplay.SetCellValue(2,i,'')
379                self.dataDisplay.SetReadOnly(2,i,isReadOnly=True)
380            else:
381                self.dataDisplay.SetCellRenderer(2,i,wg.GridCellBoolRenderer())
382                self.dataDisplay.SetCellEditor(2,i,wg.GridCellBoolEditor())
383    else:                       #single crystal data
384        Types = [wg.GRID_VALUE_CHOICE+":SXC,SNC,SNT",wg.GRID_VALUE_FLOAT+':10,6']
385        colLabels = data[2]
386        rowLabels = ['original','changed']
387        self.InstrumentTable = Table(data[:-1],rowLabels=rowLabels,colLabels=colLabels,types=Types)
388        self.dataFrame.SetLabel('Instrument Parameters')
389        gridPanel = wx.Panel(self.dataFrame)
390        self.dataDisplay = G2gd.GSGrid(gridPanel)               
391        self.dataDisplay.SetTable(self.InstrumentTable, True)
392        self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshInstrumentGrid)               
393        self.dataDisplay.SetMargins(0,0)
394        self.dataDisplay.AutoSizeColumns(False)
395    mainSizer = wx.BoxSizer(wx.VERTICAL)
396    mainSizer.Add(self.dataDisplay,0)
397    mainSizer.Layout()   
398    self.dataDisplay.SetSizer(mainSizer)
399    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
400               
401def UpdateIndexPeaksGrid(self, data):
402    IndexId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Index Peak List')
403   
404    def RefreshIndexPeaksGrid(event):
405        data = self.IndexPeaksTable.GetData()
406        self.PatternTree.SetItemPyData(IndexId,data)
407       
408    def OnReload(event):
409        data = []
410        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
411        for peak in peaks:
412            dsp = inst[1]/(2.0*sind(peak[0]/2.0))
413            data.append([peak[0],peak[2],True,False,0,0,0,dsp,0.0])
414        self.PatternTree.SetItemPyData(IndexId,data)
415        UpdateIndexPeaksGrid(self,data)
416       
417    def KeyEditPickGrid(event):
418        colList = self.dataDisplay.GetSelectedCols()
419        rowList = self.dataDisplay.GetSelectedRows()
420        data = self.PatternTree.GetItemPyData(IndexId)
421        if event.GetKeyCode() == wx.WXK_RETURN:
422            event.Skip(True)
423        elif event.GetKeyCode() == wx.WXK_CONTROL:
424            event.Skip(True)
425        elif event.GetKeyCode() == wx.WXK_SHIFT:
426            event.Skip(True)
427        elif colList:
428            self.dataDisplay.ClearSelection()
429            key = event.GetKeyCode()
430            for col in colList:
431                if self.IndexPeaksTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
432                    if key == 89: #'Y'
433                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=True
434                    elif key == 78:  #'N'
435                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=False
436           
437    if self.dataDisplay:
438        self.dataFrame.Clear()
439    self.dataFrame.SetMenuBar(self.dataFrame.IndPeaksMenu)
440    if not self.dataFrame.GetStatusBar():
441        Status = self.dataFrame.CreateStatusBar()
442    self.Bind(wx.EVT_MENU, OnReload, id=G2gd.wxID_INDXRELOAD)
443    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
444    self.IndexPeaksTable = []
445    if data:
446        cells = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List'))
447        if cells:
448            cellist = cells[2]
449            dmin = cells[3]
450            self.HKL = []
451            for i,cell in enumerate(cellist):
452                if cell[-1]:
453                    ibrav = cell[2]
454                    A = G2lat.cell2A(cell[3:9])
455                    self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
456                    G2indx.IndexPeaks(data,self.HKL)
457                    for hkl in self.HKL:
458                        hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
459    rowLabels = []
460    for i in range(len(data)): rowLabels.append(str(i+1))
461    colLabels = ['position','intensity','use','indexed','h','k','l','d-obs','d-calc']
462    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
463        wg.GRID_VALUE_BOOL,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,
464        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5']
465    self.PatternTree.SetItemPyData(IndexId,data)
466    self.IndexPeaksTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
467    self.dataFrame.SetLabel('Index Peak List')
468    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)               
469    self.dataDisplay.SetTable(self.IndexPeaksTable, True)
470    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshIndexPeaksGrid)
471    self.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPickGrid)                 
472    self.dataDisplay.SetMargins(0,0)
473    self.dataDisplay.AutoSizeColumns(False)
474    self.dataFrame.setSizePosLeft([490,300])
475 
476def UpdateUnitCellsGrid(self, data):
477    UnitCellsId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List')
478    bravaisSymb = ['Fm3m','Im3m','Pm3m','R3-H','P6/mmm','I4/mmm',
479        'P4/mmm','Fmmm','Immm','Cmmm','Pmmm','C2/m','P2/m','P1']
480       
481    def SetLattice(controls):
482        ibrav = bravaisSymb.index(controls[5])
483        if ibrav in [0,1,2]:
484            controls[7] = controls[8] = controls[6]
485            controls[9] = controls[10] = controls[11] = 90.
486        elif ibrav in [3,4,5,6]:
487            controls[7] = controls[6]
488            controls[9] = controls[10] = controls[11] = 90.
489            if ibrav in [3,4]:
490                controls[11] = 120.
491        elif ibrav in [7,8,9,10]:
492            controls[9] = controls[10] = controls[11] = 90.
493        elif ibrav in [11,12]:
494            controls[9] = controls[11] = 90.  # b unique
495        if len(controls) < 13: controls.append(0)
496        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
497        return ibrav
498       
499    def OnNcNo(event):
500        controls[2] = NcNo.GetValue()
501       
502    def OnStartVol(event):
503        try:
504            stVol = int(startVol.GetValue())
505        except ValueError:
506            stVol = 25
507        controls[3] = stVol
508        startVol.SetValue("%d"%(stVol))
509       
510    def OnBravais(event):
511        Obj = event.GetEventObject()
512        bravais[bravList.index(Obj.GetId())] = Obj.GetValue()
513       
514    def OnZero(event):
515        try:
516            Zero = min(0.1,max(-0.1,float(zero.GetValue())))
517        except ValueError:
518            Zero = 0.1
519        controls[1] = Zero
520        zero.SetValue("%.2f"%(Zero))
521       
522    def OnZeroVar(event):
523        controls[0] = zeroVar.GetValue()
524       
525    def OnBravSel(event):
526        controls[5] = bravSel.GetString(bravSel.GetSelection())       
527        UpdateUnitCellsGrid(self,data)
528       
529    def OnCellChange(event):
530        ibrav = bravaisSymb.index(controls[5])
531        Obj = event.GetEventObject()
532        ObjId = cellList.index(Obj.GetId())
533        try:
534            value = max(1.0,float(Obj.GetValue()))
535        except ValueError:
536            if ObjId < 3:               #bad cell edge - reset
537                value = controls[6+ObjId]
538            else:                       #bad angle
539                value = 90.
540        if ibrav in [0,1,2]:
541            controls[6] = controls[7] = controls[8] = value
542            controls[9] = controls[10] = controls[11] = 90.0
543            Obj.SetValue("%.5f"%(controls[6]))
544        elif ibrav in [3,4,5,6]:
545            if ObjId == 0:
546                controls[6] = controls[7] = value
547                Obj.SetValue("%.5f"%(controls[6]))
548            else:
549                controls[8] = value
550                Obj.SetValue("%.5f"%(controls[8]))
551            controls[9] = controls[10] = controls[11] = 90.0
552            if ibrav in [3,4]:
553                controls[11] = 120.
554        elif ibrav in [7,8,9,10]:
555            controls[6+ObjId] = value
556            Obj.SetValue("%.5f"%(controls[6+ObjId]))
557            controls[9] = controls[10] = controls[11] = 90.0
558        elif ibrav in [11,12]:
559            controls[9] = controls[11] = 90.0
560            if ObjId != 3:
561                controls[6+ObjId] = value
562                Obj.SetValue("%.5f"%(controls[6+ObjId]))
563            else:
564                controls[10] = value
565                Obj.SetValue("%.3f"%(controls[6+ObjId]))
566        else:
567            controls[6+ObjId] = value
568            if ObjId < 3:
569                Obj.SetValue("%.5f"%(controls[6+ObjId]))
570            else:
571                Obj.SetValue("%.3f"%(controls[6+ObjId]))
572        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
573        volVal.SetValue("%.3f"%(controls[12]))
574       
575    def OnRefineCell(event):
576        def cellPrint(ibrav,A):
577            cell = G2lat.A2cell(A)
578            Vol = G2lat.calc_V(A)
579            if ibrav in [0,1,2]:
580                print "%s%10.6f" % ('a =',cell[0])
581            elif ibrav in [3,4,5,6]:
582                print "%s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],' c =',cell[2],' volume =',Vol)
583            elif ibrav in [7,8,9,10]:
584                print "%s%10.6f %s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],' volume =',Vol)
585            elif ibrav in [11,12]:
586                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)
587            else:
588                print "%s%10.6f %s%10.6f %s%10.6f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2])
589                print "%s%8.3f %s%8.3f %s%8.3f %s%12.3f" % ('alpha =',cell[3],'beta =',cell[4],'gamma =',cell[5],' volume =',Vol)
590             
591        PatternId = self.PatternId
592        PickId = self.PickId   
593        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
594        if not peaks:
595            self.ErrorDialog('No peaks!', 'Nothing to refine!')
596            return       
597        print 'Refine cell'
598        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
599        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
600        cell = controls[6:12]
601        A = G2lat.cell2A(cell)
602        print controls[5]
603        ibrav = bravaisSymb.index(controls[5])
604        dmin = G2indx.getDmin(peaks)-0.005
605        Lhkl,M20,X20 = G2indx.refinePeaks(peaks,ibrav,A)
606        controls[6:12] = G2lat.A2cell(A)
607        controls[12] = G2lat.calc_V(A)
608        data = [controls,bravais,cells,dmin]
609        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
610        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
611        UpdateUnitCellsGrid(self,data)
612        print "%s%10.3f" % ('refinement M20 = ',M20)
613        print 'unindexed lines = ',X20
614        cellPrint(ibrav,A)
615        for hkl in self.HKL:
616            hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
617        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
618            G2plt.PlotPowderLines(self)
619        else:
620            G2plt.PlotPatterns(self)
621       
622    def OnIndexPeaks(event):
623        PatternId = self.PatternId   
624        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
625        if not peaks:
626            self.ErrorDialog('No peaks!', 'Nothing to index!')
627            return
628        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
629        print 'Peak Indexing'
630        try:
631            controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
632            cells = []
633        except ValueError:
634            self.ErrorDialog('Error','Need to set controls in Unit Cell List first')
635            return
636        if True not in bravais:
637            self.ErrorDialog('Error','No Bravais lattices selected')
638            return
639        self.dataFrame.IndexPeaks.Enable(False)
640        self.dataFrame.CopyCell.Enable(False)
641        OK,dmin,cells = G2indx.DoIndexPeaks(peaks,inst,controls,bravais)
642        if OK:
643            data = [controls,bravais,cells,dmin]
644            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
645            UpdateUnitCellsGrid(self,data)
646            bestCell = cells[0]
647            if bestCell[0] > 10.:
648                self.HKL = G2lat.GenHBravais(dmin,bestCell[2],G2lat.cell2A(bestCell[3:9]))
649                for hkl in self.HKL:
650                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
651                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
652                    G2plt.PlotPowderLines(self)
653                else:
654                    G2plt.PlotPatterns(self)
655        self.dataFrame.CopyCell.Enable(True)
656        self.dataFrame.IndexPeaks.Enable(True)
657        UpdateUnitCellsGrid(self,data)
658               
659    def CopyUnitCell(event):
660        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)
661        for Cell in cells:
662            if Cell[-1]:
663                break
664        cell = Cell[2:9]
665        controls[4] = 1
666        controls[5] = bravaisSymb[cell[0]]
667        controls[6:12] = cell[1:8]
668        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
669        self.PatternTree.SetItemPyData(UnitCellsId,[controls,bravais,cells,dmin])
670        UpdateUnitCellsGrid(self,data)
671        self.dataFrame.RefineCell.Enable(True)
672           
673    def RefreshUnitCellsGrid(event):
674        cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)[2:]
675        r,c =  event.GetRow(),event.GetCol()
676        if cells:
677            if c == 2:
678                for i in range(len(cells)):
679                    cells[i][-1] = False
680                    UnitCellsTable.SetValue(i,c,False)
681                UnitCellsTable.SetValue(r,c,True)
682                cells[r][-1] = True
683                ibrav = cells[r][2]
684                A = G2lat.cell2A(cells[r][3:9])
685                self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
686                for hkl in self.HKL:
687                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
688                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
689                    G2plt.PlotPowderLines(self)
690                else:
691                    G2plt.PlotPatterns(self)
692       
693    if self.dataDisplay:
694        self.dataFrame.Clear()
695    self.dataFrame.SetMenuBar(self.dataFrame.IndexMenu)
696    if not self.dataFrame.GetStatusBar():
697        Status = self.dataFrame.CreateStatusBar()
698    self.Bind(wx.EVT_MENU, OnIndexPeaks, id=G2gd.wxID_INDEXPEAKS)
699    self.Bind(wx.EVT_MENU, CopyUnitCell, id=G2gd.wxID_COPYCELL)
700    self.Bind(wx.EVT_MENU, OnRefineCell, id=G2gd.wxID_REFINECELL)
701   
702    controls,bravais,cells,dmin = data
703    if len(controls) < 13:              #add cell volume if missing
704        controls.append(G2lat.calc_V(G2lat.cell2A(controls[6:12])))
705    self.PatternTree.SetItemPyData(UnitCellsId,data)            #update with volume
706    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
707    bravaisNames = ['Cubic-F','Cubic-I','Cubic-P','Trigonal-R','Trigonal/Hexagonal-P',
708        'Tetragonal-I','Tetragonal-P','Orthorhombic-F','Orthorhombic-I','Orthorhombic-C',
709        'Orthorhombic-P','Monoclinic-C','Monoclinic-P','Triclinic']
710    cellGUIlist = [[[0,1,2],4,zip([" Unit cell: a = "," Vol = "],["%.5f","%.3f"],[True,False],[0,0])],
711    [[3,4,5,6],6,zip([" Unit cell: a = "," c = "," Vol = "],["%.5f","%.5f","%.3f"],[True,True,False],[0,2,0])],
712    [[7,8,9,10],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "],["%.5f","%.5f","%.5f","%.3f"],
713        [True,True,True,False],[0,1,2,0])],
714    [[11,12],10,zip([" Unit cell: a = "," b = "," c = "," beta = "," Vol = "],
715        ["%.5f","%.5f","%.5f","%.3f","%.3f"],[True,True,True,True,False],[0,1,2,4,0])],
716    [[13,],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "," alpha = "," beta = "," gamma = "],
717        ["%.5f","%.5f","%.5f","%.3f","%.3f","%.3f","%.3f"],
718        [True,True,True,False,True,True,True],[0,1,2,0,3,4,5])]]
719   
720    self.dataFrame.SetLabel('Unit Cells List')
721    self.sp = wx.SplitterWindow(self.dataFrame)
722    self.dataDisplay = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
723    if cells:
724        self.bottom = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
725        self.sp.SplitHorizontally(self.dataDisplay,self.bottom,0)
726    mainSizer = wx.BoxSizer(wx.VERTICAL)
727    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Indexing controls: '),0,wx.ALIGN_CENTER_VERTICAL)
728    mainSizer.Add((5,5),0)
729    littleSizer = wx.FlexGridSizer(2,5,5,5)
730    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max Nc/Nobs '),0,wx.ALIGN_CENTER_VERTICAL)
731    NcNo = wx.SpinCtrl(self.dataDisplay)
732    NcNo.SetRange(1,6)
733    NcNo.SetValue(controls[2])
734    NcNo.Bind(wx.EVT_SPINCTRL,OnNcNo)
735    littleSizer.Add(NcNo,0,wx.ALIGN_CENTER_VERTICAL)
736    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start Volume '),0,wx.ALIGN_CENTER_VERTICAL)
737    startVol = wx.TextCtrl(self.dataDisplay,value=str(controls[3]),style=wx.TE_PROCESS_ENTER)
738    startVol.Bind(wx.EVT_TEXT_ENTER,OnStartVol)
739    startVol.Bind(wx.EVT_KILL_FOCUS,OnStartVol)
740    littleSizer.Add(startVol,0,wx.ALIGN_CENTER_VERTICAL)
741    mainSizer.Add(littleSizer,0)
742    mainSizer.Add((5,5),0)
743    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Select Bravais Lattices for indexing: '),
744        0,wx.ALIGN_CENTER_VERTICAL)
745    mainSizer.Add((5,5),0)
746    littleSizer = wx.FlexGridSizer(2,7,5,5)
747    bravList = []
748    bravs = zip(bravais,bravaisNames)
749    for brav,bravName in bravs:
750        bravCk = wx.CheckBox(self.dataDisplay,label=bravName)
751        bravList.append(bravCk.GetId())
752        bravCk.SetValue(brav)
753        bravCk.Bind(wx.EVT_CHECKBOX,OnBravais)
754        littleSizer.Add(bravCk,0,wx.ALIGN_CENTER_VERTICAL)
755    mainSizer.Add(littleSizer,0)
756    mainSizer.Add((5,5),0)
757    littleSizer = wx.FlexGridSizer(1,3,5,5)
758    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Zero offset"),0,wx.ALIGN_CENTER_VERTICAL)
759    zero = wx.TextCtrl(self.dataDisplay,value=str(controls[1]),style=wx.TE_PROCESS_ENTER)
760    zero.Bind(wx.EVT_TEXT_ENTER,OnZero)
761    zero.Bind(wx.EVT_KILL_FOCUS,OnZero)
762    littleSizer.Add(zero,0,wx.ALIGN_CENTER_VERTICAL)
763    zeroVar = wx.CheckBox(self.dataDisplay,label="Vary? (not implemented)")
764    zero.SetValue("%.2f"%(controls[1]))
765    zeroVar.Bind(wx.EVT_CHECKBOX,OnZeroVar)
766    littleSizer.Add(zeroVar,0,wx.ALIGN_CENTER_VERTICAL)
767    mainSizer.Add(littleSizer,0)
768    mainSizer.Add((5,5),0)
769    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Cell Refinement: '),0,wx.ALIGN_CENTER_VERTICAL)
770    mainSizer.Add((5,5),0)
771    littleSizer = wx.FlexGridSizer(1,2,5,5)
772    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Bravais lattice"),0,wx.ALIGN_CENTER_VERTICAL)
773    bravSel = wx.Choice(self.dataDisplay,choices=bravaisSymb)
774    bravSel.SetSelection(bravaisSymb.index(controls[5]))
775    bravSel.Bind(wx.EVT_CHOICE,OnBravSel)
776    littleSizer.Add(bravSel,0,wx.ALIGN_CENTER_VERTICAL)
777    mainSizer.Add(littleSizer,0)
778    mainSizer.Add((5,5),0)
779    ibrav = SetLattice(controls)
780    for cellGUI in cellGUIlist:
781        if ibrav in cellGUI[0]:
782            useGUI = cellGUI
783    cellList = []
784    littleSizer = wx.FlexGridSizer(2,useGUI[1],5,5)
785    for txt,fmt,ifEdit,Id in useGUI[2]:
786        littleSizer.Add(wx.StaticText(self.dataDisplay,label=txt),0,wx.ALIGN_CENTER_VERTICAL)
787        if ifEdit:          #a,b,c,etc.
788            cellVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[6+Id])),style=wx.TE_PROCESS_ENTER)
789            cellVal.Bind(wx.EVT_TEXT_ENTER,OnCellChange)       
790            cellVal.Bind(wx.EVT_KILL_FOCUS,OnCellChange)
791            littleSizer.Add(cellVal,0,wx.ALIGN_CENTER_VERTICAL)
792            cellList.append(cellVal.GetId())
793        else:               #volume
794            volVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[12])),style=wx.TE_READONLY)
795            volVal.SetBackgroundColour(VERY_LIGHT_GREY)
796            littleSizer.Add(volVal,0,wx.ALIGN_CENTER_VERTICAL)
797    mainSizer.Add(littleSizer,0)
798    mainSizer.Layout()   
799    self.dataDisplay.SetSizer(mainSizer)
800    topSize = mainSizer.Fit(self.dataFrame)
801    self.dataDisplay.SetSize(topSize)
802    if cells:
803        if ibrav == 13:
804            topSize[1] += 230
805        else:
806            topSize[1] += 200
807    self.dataFrame.setSizePosLeft(topSize)
808   
809   
810    if cells:
811        bottomSize = self.bottom.GetSize()
812        if ibrav == 13:
813            bottomSize[1] -= 240
814        else:
815            bottomSize[1] -= 210
816        wx.StaticText(parent=self.bottom,label=' Indexing Result ')
817        rowLabels = []
818        colLabels = ['M20','X20','use','Bravais','a','b','c','alpha','beta','gamma','Volume']
819        Types = [wg.GRID_VALUE_FLOAT+':10,2',wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING,
820            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',
821            wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',
822            wg.GRID_VALUE_FLOAT+':10,2']
823        numRows = len(cells)
824        table = []
825        for cell in cells:
826            rowLabels.append('')
827            row = cell[0:2]+[cell[-1]]+[bravaisSymb[cell[2]]]+cell[3:10]
828            if cell[-1]:
829                A = G2lat.cell2A(cell[3:9])
830                self.HKL = G2lat.GenHBravais(dmin,cell[2],A)
831                for hkl in self.HKL:
832                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
833            table.append(row)
834        UnitCellsTable = G2gd.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
835        gridDisplay = G2gd.GSGrid(self.bottom)
836        gridDisplay.SetPosition(wx.Point(0,20))               
837        gridDisplay.SetTable(UnitCellsTable, True)
838        self.dataFrame.CopyCell.Enable(True)
839        gridDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshUnitCellsGrid)
840        gridDisplay.SetMargins(0,0)
841        gridDisplay.SetRowLabelSize(0)
842        gridDisplay.AutoSizeColumns(False)
843        for r in range(gridDisplay.GetNumberRows()):
844            for c in range(gridDisplay.GetNumberCols()):
845                if c == 2:
846                    gridDisplay.SetReadOnly(r,c,isReadOnly=False)
847                else:
848                    gridDisplay.SetReadOnly(r,c,isReadOnly=True)
849        gridDisplay.SetSize(bottomSize)
Note: See TracBrowser for help on using the repository browser.