source: trunk/GSASIIpwdGUI.py @ 250

Last change on this file since 250 was 250, checked in by vondreele, 11 years ago

GSASIIgrid.py - improve Comments listing
GSASII.py - add qPlot option
GSASIIpwdGUI.py - remove a couple of prints
GSASIIplot.py - add q & log(Y) plotting

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