source: trunk/GSASIIpwdGUI.py @ 85

Last change on this file since 85 was 85, checked in by vondreel, 12 years ago

threshold masks operational
add index peak list load/reload menu & remove delete key method
plotting of threshold masks
remove "U" in image open command; implement reading of MAR CCD tif images

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