source: trunk/GSASIIpwdGUI.py @ 94

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

move all fortran to fsource
add gray for readonly textctrl
do polygon insert, show in imageGUI and make mask
fix to ReadPDBphase to use correct crystal to cartesian transformation matrix

File size: 39.2 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   
235    def RefreshBackgroundGrid(event):
236        data = self.BackTable.GetData()
237        M = len(data[0])
238        N = data[0][2]+3
239        item = data[0]
240        if N > M:       #add terms
241            for i in range(M,N): 
242                item.append(0.0)
243                self.BackTable.SetColLabelValue(i,str(i-2))
244            data = [item]
245            msg = wg.GridTableMessage(self.BackTable, 
246                wg.GRIDTABLE_NOTIFY_COLS_APPENDED,0,N-M)
247            self.dataDisplay.ProcessTableMessage(msg)                         
248        elif N < M:     #delete terms
249            new = []
250            for i in range(N):
251                new.append(item[i])
252            data = [new]
253            msg = wg.GridTableMessage(self.BackTable, 
254                wg.GRIDTABLE_NOTIFY_COLS_DELETED,0,M-N)
255            self.dataDisplay.ProcessTableMessage(msg)                         
256        self.PatternTree.SetItemPyData(BackId,data)
257        UpdateBackgroundGrid(self,data)
258                 
259    maxTerm = 9
260    self.BackTable = []
261    N = len(data[0])
262    M = data[0][2]
263    colLabels = ['function','refine','Nterms']
264    rowLabels=['background']
265    for i in range(M): colLabels.append(str(i+1))
266    Types = [wg.GRID_VALUE_CHOICE+':chebyschev,another,more',
267        wg.GRID_VALUE_BOOL,
268        wg.GRID_VALUE_NUMBER+':1,'+str(maxTerm)]
269    for i in range(maxTerm):
270        Types.append(wg.GRID_VALUE_FLOAT+':10,3')
271    self.BackTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
272    self.dataFrame.SetLabel('Background')
273    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
274    gridPanel = wx.Panel(self.dataFrame)
275    self.dataDisplay = G2gd.GSGrid(gridPanel)               
276    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshBackgroundGrid)               
277    self.dataDisplay.SetTable(self.BackTable, True)
278    self.dataDisplay.SetMargins(0,0)
279    self.dataDisplay.AutoSizeColumns(False)
280    mainSizer = wx.BoxSizer(wx.VERTICAL)
281    mainSizer.Add(self.dataDisplay,0)
282    mainSizer.Layout()   
283    self.dataDisplay.SetSizer(mainSizer)
284    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
285       
286def UpdateLimitsGrid(self, data):
287    if self.dataDisplay:
288        self.dataFrame.Clear()
289    LimitId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Limits')
290    def RefreshLimitsGrid(event):
291        data = self.LimitsTable.GetData()
292        old = data[0]
293        new = data[1]
294        new[0] = max(old[0],new[0])
295        new[1] = max(new[0],min(old[1],new[1]))
296        data = [old,new]
297        G2plt.PlotPatterns(self)
298       
299    self.LimitsTable = []
300    colLabels = ['Tmin','Tmax']
301    rowLabels = ['original','changed']
302    Types = [wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3']
303    self.LimitsTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
304    self.dataFrame.SetLabel('Limits')
305    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
306    gridPanel = wx.Panel(self.dataFrame)
307    self.dataDisplay = G2gd.GSGrid(gridPanel)               
308    self.dataDisplay.SetTable(self.LimitsTable, True)
309    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshLimitsGrid)               
310    self.dataDisplay.SetMargins(0,0)
311    self.dataDisplay.AutoSizeColumns(False)
312    mainSizer = wx.BoxSizer(wx.VERTICAL)
313    mainSizer.Add(self.dataDisplay,0)
314    mainSizer.Layout()   
315    self.dataDisplay.SetSizer(mainSizer)
316    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
317   
318def UpdateInstrumentGrid(self, data):
319    if self.dataDisplay:
320        self.dataFrame.Clear()
321    Ka2 = False
322    if len(data[0]) == 13: 
323        Ka2 = True
324    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
325    InstId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters')
326   
327    def RefreshInstrumentGrid(event,doAnyway=False):
328        if doAnyway or event.GetRow() == 1:
329            peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
330            ins = data[1]
331            if 'P' in ins[0]:                                       #update powder peak parameters
332                for peak in peaks:
333                    if Ka2:
334                        peak[4] = ins[6]*tand(peak[0]/2.0)**2+ins[7]*tand(peak[0]/2.0)+ins[8]
335                        peak[6] = ins[9]/cosd(peak[0]/2.0)+ins[10]*tand(peak[0]/2.0)
336                    else:
337                        peak[4] = ins[4]*tand(peak[0]/2.0)**2+ins[5]*tand(peak[0]/2.0)+ins[6]
338                        peak[6] = ins[7]/cosd(peak[0]/2.0)+ins[8]*tand(peak[0]/2.0)
339                       
340    def OnReset(event):
341        if Ka2:
342            data[1][6:12] = data[0][6:12]
343        else:
344            data[1][4:10] = data[0][4:10]
345        RefreshInstrumentGrid(event,doAnyway=True)          #to get peaks updated
346        UpdateInstrumentGrid(self, data)
347       
348    self.InstrumentTable = []
349    if 'P' in data[1][0]:                   #powder data
350        self.dataFrame.SetMenuBar(self.dataFrame.InstMenu)
351        if not self.dataFrame.GetStatusBar():
352            Status = self.dataFrame.CreateStatusBar()
353        self.Bind(wx.EVT_MENU, OnReset, id=G2gd.wxID_INSTPRMRESET)
354        if Ka2:
355            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
356                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #zero, ratio, pola
357                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #u,v,w
358                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,2']
359        else:
360            Types = [wg.GRID_VALUE_CHOICE+":PXC,PNC,PNT",wg.GRID_VALUE_FLOAT+':10,6',               #type & lam-1
361                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #zero, pola
362                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #u,v,w
363                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,2']
364        colLabels = data[3]
365        rowLabels = ['default','changed','refine']
366        self.InstrumentTable = G2gd.Table(data[:-1],rowLabels=rowLabels,colLabels=colLabels,types=Types)
367        self.dataFrame.SetLabel('Instrument Parameters')
368        gridPanel = wx.Panel(self.dataFrame)
369        self.dataDisplay = G2gd.GSGrid(gridPanel)               
370        self.dataDisplay.SetTable(self.InstrumentTable, True)
371        self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshInstrumentGrid)               
372        self.dataDisplay.SetMargins(0,0)
373        self.dataDisplay.AutoSizeColumns(False)
374        print len(Types)
375        beg = 4
376        if Ka2: beg = 6
377        for i in range(len(data[2])):
378            if i < beg or i == beg+6:
379                self.dataDisplay.SetCellRenderer(2,i,wg.GridCellStringRenderer())
380                self.dataDisplay.SetCellValue(2,i,'')
381                self.dataDisplay.SetReadOnly(2,i,isReadOnly=True)
382            else:
383                self.dataDisplay.SetCellRenderer(2,i,wg.GridCellBoolRenderer())
384                self.dataDisplay.SetCellEditor(2,i,wg.GridCellBoolEditor())
385    else:                       #single crystal data
386        Types = [wg.GRID_VALUE_CHOICE+":SXC,SNC,SNT",wg.GRID_VALUE_FLOAT+':10,6']
387        colLabels = data[2]
388        rowLabels = ['original','changed']
389        self.InstrumentTable = Table(data[:-1],rowLabels=rowLabels,colLabels=colLabels,types=Types)
390        self.dataFrame.SetLabel('Instrument Parameters')
391        gridPanel = wx.Panel(self.dataFrame)
392        self.dataDisplay = G2gd.GSGrid(gridPanel)               
393        self.dataDisplay.SetTable(self.InstrumentTable, True)
394        self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshInstrumentGrid)               
395        self.dataDisplay.SetMargins(0,0)
396        self.dataDisplay.AutoSizeColumns(False)
397    mainSizer = wx.BoxSizer(wx.VERTICAL)
398    mainSizer.Add(self.dataDisplay,0)
399    mainSizer.Layout()   
400    self.dataDisplay.SetSizer(mainSizer)
401    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
402               
403def UpdateIndexPeaksGrid(self, data):
404    IndexId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Index Peak List')
405   
406    def RefreshIndexPeaksGrid(event):
407        data = self.IndexPeaksTable.GetData()
408        self.PatternTree.SetItemPyData(IndexId,data)
409       
410    def OnReload(event):
411        data = []
412        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
413        for peak in peaks:
414            dsp = inst[1]/(2.0*sind(peak[0]/2.0))
415            data.append([peak[0],peak[2],True,False,0,0,0,dsp,0.0])
416        self.PatternTree.SetItemPyData(IndexId,data)
417        UpdateIndexPeaksGrid(self,data)
418       
419    def KeyEditPickGrid(event):
420        colList = self.dataDisplay.GetSelectedCols()
421        rowList = self.dataDisplay.GetSelectedRows()
422        data = self.PatternTree.GetItemPyData(IndexId)
423        if event.GetKeyCode() == wx.WXK_RETURN:
424            event.Skip(True)
425        elif event.GetKeyCode() == wx.WXK_CONTROL:
426            event.Skip(True)
427        elif event.GetKeyCode() == wx.WXK_SHIFT:
428            event.Skip(True)
429        elif colList:
430            self.dataDisplay.ClearSelection()
431            key = event.GetKeyCode()
432            for col in colList:
433                if self.IndexPeaksTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
434                    if key == 89: #'Y'
435                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=True
436                    elif key == 78:  #'N'
437                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=False
438           
439    if self.dataDisplay:
440        self.dataFrame.Clear()
441    self.dataFrame.SetMenuBar(self.dataFrame.IndPeaksMenu)
442    if not self.dataFrame.GetStatusBar():
443        Status = self.dataFrame.CreateStatusBar()
444    self.Bind(wx.EVT_MENU, OnReload, id=G2gd.wxID_INDXRELOAD)
445    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
446    self.IndexPeaksTable = []
447    if data:
448        cells = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List'))
449        if cells:
450            cellist = cells[2]
451            dmin = cells[3]
452            self.HKL = []
453            for i,cell in enumerate(cellist):
454                if cell[-1]:
455                    ibrav = cell[2]
456                    A = G2lat.cell2A(cell[3:9])
457                    self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
458                    G2indx.IndexPeaks(data,self.HKL)
459                    for hkl in self.HKL:
460                        hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
461    rowLabels = []
462    for i in range(len(data)): rowLabels.append(str(i+1))
463    colLabels = ['position','intensity','use','indexed','h','k','l','d-obs','d-calc']
464    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
465        wg.GRID_VALUE_BOOL,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,
466        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5']
467    self.PatternTree.SetItemPyData(IndexId,data)
468    self.IndexPeaksTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
469    self.dataFrame.SetLabel('Index Peak List')
470    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)               
471    self.dataDisplay.SetTable(self.IndexPeaksTable, True)
472    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshIndexPeaksGrid)
473    self.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPickGrid)                 
474    self.dataDisplay.SetMargins(0,0)
475    self.dataDisplay.AutoSizeColumns(False)
476    self.dataFrame.setSizePosLeft([490,300])
477 
478def UpdateUnitCellsGrid(self, data):
479    UnitCellsId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List')
480    bravaisSymb = ['Fm3m','Im3m','Pm3m','R3-H','P6/mmm','I4/mmm',
481        'P4/mmm','Fmmm','Immm','Cmmm','Pmmm','C2/m','P2/m','P1']
482       
483    def SetLattice(controls):
484        ibrav = bravaisSymb.index(controls[5])
485        if ibrav in [0,1,2]:
486            controls[7] = controls[8] = controls[6]
487            controls[9] = controls[10] = controls[11] = 90.
488        elif ibrav in [3,4,5,6]:
489            controls[7] = controls[6]
490            controls[9] = controls[10] = controls[11] = 90.
491            if ibrav in [3,4]:
492                controls[11] = 120.
493        elif ibrav in [7,8,9,10]:
494            controls[9] = controls[10] = controls[11] = 90.
495        elif ibrav in [11,12]:
496            controls[9] = controls[11] = 90.  # b unique
497        if len(controls) < 13: controls.append(0)
498        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
499        return ibrav
500       
501    def OnNcNo(event):
502        controls[2] = NcNo.GetValue()
503       
504    def OnStartVol(event):
505        try:
506            stVol = int(startVol.GetValue())
507        except ValueError:
508            stVol = 25
509        controls[3] = stVol
510       
511    def OnBravais(event):
512        Obj = event.GetEventObject()
513        bravais[bravList.index(Obj.GetId())] = Obj.GetValue()
514       
515    def OnZero(event):
516        try:
517            Zero = min(0.1,max(-0.1,float(zero.GetValue())))
518        except ValueError:
519            Zero = 0.0
520        controls[1] = Zero
521        zero.SetValue("%.2f"%(Zero))
522       
523    def OnZeroVar(event):
524        controls[0] = zeroVar.GetValue()
525       
526    def OnBravSel(event):
527        controls[5] = bravSel.GetString(bravSel.GetSelection())       
528        UpdateUnitCellsGrid(self,data)
529       
530    def OnCellChange(event):
531        ibrav = bravaisSymb.index(controls[5])
532        Obj = event.GetEventObject()
533        ObjId = cellList.index(Obj.GetId())
534        try:
535            value = max(1.0,float(Obj.GetValue()))
536        except ValueError:
537            if ObjId < 3:               #bad cell edge - reset
538                value = controls[6+ObjId]
539            else:                       #bad angle
540                value = 90.
541        if ibrav in [0,1,2]:
542            controls[6] = controls[7] = controls[8] = value
543            controls[9] = controls[10] = controls[11] = 90.0
544            Obj.SetValue("%.5f"%(controls[6]))
545        elif ibrav in [3,4,5,6]:
546            if ObjId == 0:
547                controls[6] = controls[7] = value
548                Obj.SetValue("%.5f"%(controls[6]))
549            else:
550                controls[8] = value
551                Obj.SetValue("%.5f"%(controls[8]))
552            controls[9] = controls[10] = controls[11] = 90.0
553            if ibrav in [3,4]:
554                controls[11] = 120.
555        elif ibrav in [7,8,9,10]:
556            controls[6+ObjId] = value
557            Obj.SetValue("%.5f"%(controls[6+ObjId]))
558            controls[9] = controls[10] = controls[11] = 90.0
559        elif ibrav in [11,12]:
560            controls[9] = controls[11] = 90.0
561            if ObjId != 3:
562                controls[6+ObjId] = value
563                Obj.SetValue("%.5f"%(controls[6+ObjId]))
564            else:
565                controls[10] = value
566                Obj.SetValue("%.3f"%(controls[6+ObjId]))
567        else:
568            controls[6+ObjId] = value
569            if ObjId < 3:
570                Obj.SetValue("%.5f"%(controls[6+ObjId]))
571            else:
572                Obj.SetValue("%.3f"%(controls[6+ObjId]))
573        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
574        volVal.SetValue("%.3f"%(controls[12]))
575       
576    def OnRefineCell(event):
577        def cellPrint(ibrav,A):
578            cell = G2lat.A2cell(A)
579            Vol = G2lat.calc_V(A)
580            if ibrav in [0,1,2]:
581                print "%s%10.6f" % ('a =',cell[0])
582            elif ibrav in [3,4,5,6]:
583                print "%s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],' c =',cell[2],' volume =',Vol)
584            elif ibrav in [7,8,9,10]:
585                print "%s%10.6f %s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],' volume =',Vol)
586            elif ibrav in [11,12]:
587                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)
588            else:
589                print "%s%10.6f %s%10.6f %s%10.6f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2])
590                print "%s%8.3f %s%8.3f %s%8.3f %s%12.3f" % ('alpha =',cell[3],'beta =',cell[4],'gamma =',cell[5],' volume =',Vol)
591             
592        PatternId = self.PatternId
593        PickId = self.PickId   
594        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
595        if not peaks:
596            self.ErrorDialog('No peaks!', 'Nothing to refine!')
597            return       
598        print 'Refine cell'
599        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
600        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
601        cell = controls[6:12]
602        A = G2lat.cell2A(cell)
603        print controls[5]
604        ibrav = bravaisSymb.index(controls[5])
605        dmin = G2indx.getDmin(peaks)-0.005
606        Lhkl,M20,X20 = G2indx.refinePeaks(peaks,ibrav,A)
607        controls[6:12] = G2lat.A2cell(A)
608        controls[12] = G2lat.calc_V(A)
609        data = [controls,bravais,cells,dmin]
610        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
611        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
612        UpdateUnitCellsGrid(self,data)
613        print "%s%10.3f" % ('refinement M20 = ',M20)
614        print 'unindexed lines = ',X20
615        cellPrint(ibrav,A)
616        for hkl in self.HKL:
617            hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
618        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
619            G2plt.PlotPowderLines(self)
620        else:
621            G2plt.PlotPatterns(self)
622       
623    def OnIndexPeaks(event):
624        PatternId = self.PatternId   
625        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
626        if not peaks:
627            self.ErrorDialog('No peaks!', 'Nothing to index!')
628            return
629        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
630        print 'Peak Indexing'
631        try:
632            controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
633            cells = []
634        except ValueError:
635            self.ErrorDialog('Error','Need to set controls in Unit Cell List first')
636            return
637        if True not in bravais:
638            self.ErrorDialog('Error','No Bravais lattices selected')
639            return
640        self.dataFrame.IndexPeaks.Enable(False)
641        self.dataFrame.CopyCell.Enable(False)
642        OK,dmin,cells = G2indx.DoIndexPeaks(peaks,inst,controls,bravais)
643        if OK:
644            data = [controls,bravais,cells,dmin]
645            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
646            UpdateUnitCellsGrid(self,data)
647            bestCell = cells[0]
648            if bestCell[0] > 10.:
649                self.HKL = G2lat.GenHBravais(dmin,bestCell[2],G2lat.cell2A(bestCell[3:9]))
650                for hkl in self.HKL:
651                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
652                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
653                    G2plt.PlotPowderLines(self)
654                else:
655                    G2plt.PlotPatterns(self)
656        self.dataFrame.CopyCell.Enable(True)
657        self.dataFrame.IndexPeaks.Enable(True)
658        UpdateUnitCellsGrid(self,data)
659               
660    def CopyUnitCell(event):
661        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)
662        for Cell in cells:
663            if Cell[-1]:
664                break
665        cell = Cell[2:9]
666        controls[4] = 1
667        controls[5] = bravaisSymb[cell[0]]
668        controls[6:12] = cell[1:8]
669        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
670        self.PatternTree.SetItemPyData(UnitCellsId,[controls,bravais,cells,dmin])
671        UpdateUnitCellsGrid(self,data)
672        self.dataFrame.RefineCell.Enable(True)
673           
674    def RefreshUnitCellsGrid(event):
675        cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)[2:]
676        r,c =  event.GetRow(),event.GetCol()
677        if cells:
678            if c == 2:
679                for i in range(len(cells)):
680                    cells[i][-1] = False
681                    UnitCellsTable.SetValue(i,c,False)
682                UnitCellsTable.SetValue(r,c,True)
683                cells[r][-1] = True
684                ibrav = cells[r][2]
685                A = G2lat.cell2A(cells[r][3:9])
686                self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
687                for hkl in self.HKL:
688                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
689                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
690                    G2plt.PlotPowderLines(self)
691                else:
692                    G2plt.PlotPatterns(self)
693       
694    if self.dataDisplay:
695        self.dataFrame.Clear()
696    self.dataFrame.SetMenuBar(self.dataFrame.IndexMenu)
697    if not self.dataFrame.GetStatusBar():
698        Status = self.dataFrame.CreateStatusBar()
699    self.Bind(wx.EVT_MENU, OnIndexPeaks, id=G2gd.wxID_INDEXPEAKS)
700    self.Bind(wx.EVT_MENU, CopyUnitCell, id=G2gd.wxID_COPYCELL)
701    self.Bind(wx.EVT_MENU, OnRefineCell, id=G2gd.wxID_REFINECELL)
702   
703    controls,bravais,cells,dmin = data
704    if len(controls) < 13:              #add cell volume if missing
705        controls.append(G2lat.calc_V(G2lat.cell2A(controls[6:12])))
706    self.PatternTree.SetItemPyData(UnitCellsId,data)            #update with volume
707    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
708    bravaisNames = ['Cubic-F','Cubic-I','Cubic-P','Trigonal-R','Trigonal/Hexagonal-P',
709        'Tetragonal-I','Tetragonal-P','Orthorhombic-F','Orthorhombic-I','Orthorhombic-C',
710        'Orthorhombic-P','Monoclinic-C','Monoclinic-P','Triclinic']
711    cellGUIlist = [[[0,1,2],4,zip([" Unit cell: a = "," Vol = "],["%.5f","%.3f"],[True,False],[0,0])],
712    [[3,4,5,6],6,zip([" Unit cell: a = "," c = "," Vol = "],["%.5f","%.5f","%.3f"],[True,True,False],[0,2,0])],
713    [[7,8,9,10],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "],["%.5f","%.5f","%.5f","%.3f"],
714        [True,True,True,False],[0,1,2,0])],
715    [[11,12],10,zip([" Unit cell: a = "," b = "," c = "," beta = "," Vol = "],
716        ["%.5f","%.5f","%.5f","%.3f","%.3f"],[True,True,True,True,False],[0,1,2,4,0])],
717    [[13,],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "," alpha = "," beta = "," gamma = "],
718        ["%.5f","%.5f","%.5f","%.3f","%.3f","%.3f","%.3f"],
719        [True,True,True,False,True,True,True],[0,1,2,0,3,4,5])]]
720   
721    self.dataFrame.SetLabel('Unit Cells List')
722    self.sp = wx.SplitterWindow(self.dataFrame)
723    self.dataDisplay = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
724    if cells:
725        self.bottom = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
726        self.sp.SplitHorizontally(self.dataDisplay,self.bottom,0)
727    mainSizer = wx.BoxSizer(wx.VERTICAL)
728    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Indexing controls: '),0,wx.ALIGN_CENTER_VERTICAL)
729    mainSizer.Add((5,5),0)
730    littleSizer = wx.FlexGridSizer(2,5,5,5)
731    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max Nc/Nobs '),0,wx.ALIGN_CENTER_VERTICAL)
732    NcNo = wx.SpinCtrl(self.dataDisplay)
733    NcNo.SetRange(1,6)
734    NcNo.SetValue(controls[2])
735    NcNo.Bind(wx.EVT_SPINCTRL,OnNcNo)
736    littleSizer.Add(NcNo,0,wx.ALIGN_CENTER_VERTICAL)
737    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start Volume '),0,wx.ALIGN_CENTER_VERTICAL)
738    startVol = wx.TextCtrl(self.dataDisplay,value=str(controls[3]),style=wx.TE_PROCESS_ENTER)
739    startVol.Bind(wx.EVT_TEXT_ENTER,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    littleSizer.Add(zero,0,wx.ALIGN_CENTER_VERTICAL)
762    zeroVar = wx.CheckBox(self.dataDisplay,label="Vary? (not implemented)")
763    zero.SetValue("%.2f"%(controls[1]))
764    zeroVar.Bind(wx.EVT_CHECKBOX,OnZeroVar)
765    littleSizer.Add(zeroVar,0,wx.ALIGN_CENTER_VERTICAL)
766    mainSizer.Add(littleSizer,0)
767    mainSizer.Add((5,5),0)
768    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Cell Refinement: '),0,wx.ALIGN_CENTER_VERTICAL)
769    mainSizer.Add((5,5),0)
770    littleSizer = wx.FlexGridSizer(1,2,5,5)
771    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Bravais lattice"),0,wx.ALIGN_CENTER_VERTICAL)
772    bravSel = wx.Choice(self.dataDisplay,choices=bravaisSymb)
773    bravSel.SetSelection(bravaisSymb.index(controls[5]))
774    bravSel.Bind(wx.EVT_CHOICE,OnBravSel)
775    littleSizer.Add(bravSel,0,wx.ALIGN_CENTER_VERTICAL)
776    mainSizer.Add(littleSizer,0)
777    mainSizer.Add((5,5),0)
778    ibrav = SetLattice(controls)
779    for cellGUI in cellGUIlist:
780        if ibrav in cellGUI[0]:
781            useGUI = cellGUI
782    cellList = []
783    littleSizer = wx.FlexGridSizer(2,useGUI[1],5,5)
784    for txt,fmt,ifEdit,Id in useGUI[2]:
785        littleSizer.Add(wx.StaticText(self.dataDisplay,label=txt),0,wx.ALIGN_CENTER_VERTICAL)
786        if ifEdit:          #a,b,c,etc.
787            cellVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[6+Id])),style=wx.TE_PROCESS_ENTER)
788            cellVal.Bind(wx.EVT_TEXT_ENTER,OnCellChange)       
789            littleSizer.Add(cellVal,0,wx.ALIGN_CENTER_VERTICAL)
790            cellList.append(cellVal.GetId())
791        else:               #volume
792            volVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[12])),style=wx.TE_READONLY)
793            volVal.SetBackgroundColour(VERY_LIGHT_GREY)
794            littleSizer.Add(volVal,0,wx.ALIGN_CENTER_VERTICAL)
795    mainSizer.Add(littleSizer,0)
796    mainSizer.Layout()   
797    self.dataDisplay.SetSizer(mainSizer)
798    topSize = mainSizer.Fit(self.dataFrame)
799    self.dataDisplay.SetSize(topSize)
800    if cells:
801        if ibrav == 13:
802            topSize[1] += 230
803        else:
804            topSize[1] += 200
805    self.dataFrame.setSizePosLeft(topSize)
806   
807   
808    if cells:
809        bottomSize = self.bottom.GetSize()
810        if ibrav == 13:
811            bottomSize[1] -= 240
812        else:
813            bottomSize[1] -= 210
814        wx.StaticText(parent=self.bottom,label=' Indexing Result ')
815        rowLabels = []
816        colLabels = ['M20','X20','use','Bravais','a','b','c','alpha','beta','gamma','Volume']
817        Types = [wg.GRID_VALUE_FLOAT+':10,2',wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING,
818            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',
819            wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',
820            wg.GRID_VALUE_FLOAT+':10,2']
821        numRows = len(cells)
822        table = []
823        for cell in cells:
824            rowLabels.append('')
825            row = cell[0:2]+[cell[-1]]+[bravaisSymb[cell[2]]]+cell[3:10]
826            if cell[-1]:
827                A = G2lat.cell2A(cell[3:9])
828                self.HKL = G2lat.GenHBravais(dmin,cell[2],A)
829                for hkl in self.HKL:
830                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
831            table.append(row)
832        UnitCellsTable = G2gd.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
833        gridDisplay = G2gd.GSGrid(self.bottom)
834        gridDisplay.SetPosition(wx.Point(0,20))               
835        gridDisplay.SetTable(UnitCellsTable, True)
836        self.dataFrame.CopyCell.Enable(True)
837        gridDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshUnitCellsGrid)
838        gridDisplay.SetMargins(0,0)
839        gridDisplay.SetRowLabelSize(0)
840        gridDisplay.AutoSizeColumns(False)
841        for r in range(gridDisplay.GetNumberRows()):
842            for c in range(gridDisplay.GetNumberCols()):
843                if c == 2:
844                    gridDisplay.SetReadOnly(r,c,isReadOnly=False)
845                else:
846                    gridDisplay.SetReadOnly(r,c,isReadOnly=True)
847        gridDisplay.SetSize(bottomSize)
Note: See TracBrowser for help on using the repository browser.