source: trunk/GSASIIgrid.py @ 53

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

finish image integration
problems still with motion, picking pts., etc. on patterns

File size: 89.7 KB
Line 
1#GSASII - data display routines
2import wx
3import wx.grid as wg
4import matplotlib as mpl
5import math
6import time
7import cPickle
8import GSASIIcomp as G2cmp
9import GSASIIspc as G2spc
10import GSASIIElem as G2elem
11import GSASIIplot as G2plt
12
13# trig functions in degrees
14sind = lambda x: math.sin(x*math.pi/180.)
15tand = lambda x: math.tan(x*math.pi/180.)
16cosd = lambda x: math.cos(x*math.pi/180.)
17asind = lambda x: 180.*math.asin(x)/math.pi
18       
19[ wxID_ATOMSEDITADD, wxID_ATOMSEDITINSERT, 
20] = [wx.NewId() for _init_coll_Atom_Items in range(2)]
21
22[ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, wxID_SAVEINTG
23] = [wx.NewId() for _init_coll_IMAGE_Items in range(4)]
24
25[ wxID_UNDO,wxID_PEAKFIT,wxID_AUTOPEAKFIT,
26] = [wx.NewId() for _init_coll_PEAK_Items in range(3)]
27
28[  wxID_INDEXPEAKS, wxID_REFINECELL, wxID_COPYCELL,
29] = [wx.NewId() for _init_coll_INDEX_Items in range(3)]
30
31class DataFrame(wx.Frame):
32    def _init_coll_BlankMenu(self,parent):
33        parent.Append(menu=self.Blank,title='')
34       
35    def _init_coll_AtomsMenu(self,parent):
36        parent.Append(menu=self.AtomEdit, title='Add atom')
37                   
38    def _init_coll_ImageMenu(self,parent):
39        parent.Append(menu=self.ImageEdit, title='Image Operations')
40       
41    def _init_coll_PeakMenu(self,parent):
42        parent.Append(menu=self.PeakEdit, title='Peak Fitting')
43
44    def _init_coll_IndexMenu(self,parent):
45        parent.Append(menu=self.IndexEdit, title='Cell Index/Refine')
46       
47    def _init_coll_Atom_Items(self,parent):
48        parent.Append(help='',id=wxID_ATOMSEDITADD, kind=wx.ITEM_NORMAL,text='Append empty atom')
49        parent.Append(id=wxID_ATOMSEDITINSERT, kind=wx.ITEM_NORMAL,text='Insert empty atom',
50            help='Double left click on atom row to Insert before')
51           
52    def _init_coll_Image_Items(self,parent):
53        parent.Append(help='Calibrate detector by fitting to calibrant lines', \
54            id=wxID_IMCALIBRATE, kind=wx.ITEM_NORMAL,text='Calibrate')
55        parent.Append(help='Clear calibration data points and rings',id=wxID_IMCLEARCALIB, \
56            kind=wx.ITEM_NORMAL,text='Clear calibration')
57        parent.Append(help='',id=wxID_IMINTEGRATE, kind=wx.ITEM_NORMAL,text='Integrate')
58        parent.Append(help='Save integration results as a series of 1-D powder patterns', \
59            id=wxID_SAVEINTG, kind=wx.ITEM_NORMAL,text='Save Integration')
60                   
61    def _init_coll_Peak_Items(self,parent):
62        self.UnDo = parent.Append(help='Undo last least squares refinement', \
63            id=wxID_UNDO, kind=wx.ITEM_NORMAL,text='UnDo')
64        self.PeakFit = parent.Append(id=wxID_PEAKFIT, kind=wx.ITEM_NORMAL,text='PeakFit', \
65            help='Do single cycle of peak fitting least-squares refinement' )
66        self.AutoPeakFit = parent.Append(id=wxID_AUTOPEAKFIT, kind=wx.ITEM_NORMAL, \
67            text='AutoPeakFit',help='Do peak fitting least-squares to convergence' )
68           
69    def _init_coll_Index_Items(self,parent):
70        self.IndexPeaks = parent.Append(help='', id=wxID_INDEXPEAKS, kind=wx.ITEM_NORMAL,
71            text='Index Cell')
72        self.CopyCell = parent.Append( id=wxID_COPYCELL, kind=wx.ITEM_NORMAL,text='Copy Cell', \
73            help='Copy selected unit cell from indexing to cell refinement fields')
74        self.RefineCell = parent.Append( id=wxID_REFINECELL, kind=wx.ITEM_NORMAL, \
75            text='Refine Cell',help='Refine unit cell parameters from indexed peaks')
76
77    def _init_utils(self):
78        self.BlankMenu = wx.MenuBar()
79       
80        self.AtomsMenu = wx.MenuBar()
81        self.ImageMenu = wx.MenuBar()
82        self.PeakMenu = wx.MenuBar()
83        self.IndexMenu = wx.MenuBar()
84        self.AtomEdit = wx.Menu(title='')
85        self.ImageEdit = wx.Menu(title='')
86        self.PeakEdit = wx.Menu(title='')
87        self.IndexEdit = wx.Menu(title='')
88        self._init_coll_AtomsMenu(self.AtomsMenu)
89        self._init_coll_Atom_Items(self.AtomEdit)
90        self._init_coll_ImageMenu(self.ImageMenu)
91        self._init_coll_Image_Items(self.ImageEdit)
92        self._init_coll_PeakMenu(self.PeakMenu)
93        self._init_coll_Peak_Items(self.PeakEdit)
94        self._init_coll_IndexMenu(self.IndexMenu)
95        self._init_coll_Index_Items(self.IndexEdit)
96        self.UnDo.Enable(False)
97        self.PeakFit.Enable(False)
98        self.AutoPeakFit.Enable(False)
99        self.IndexPeaks.Enable(False)
100        self.CopyCell.Enable(False)
101        self.RefineCell.Enable(False)
102               
103    def _init_ctrls(self, parent,name=None,size=None,pos=None):
104        wx.Frame.__init__(self,parent=parent,style=wx.DEFAULT_FRAME_STYLE ^ wx.CLOSE_BOX,
105            size=size,pos=pos,title='GSAS-II data display')
106        self._init_utils()
107        if name:
108            self.SetLabel(name)
109        self.Show()
110       
111    def __init__(self,parent,data=None,name=None, size=None,pos=None):
112        self._init_ctrls(parent,name,size,pos)
113        self.data = data
114        self.screenSize = wx.DisplaySize()
115        Size = self.GetSize()
116        xPos = self.screenSize[0]-Size[0]
117        self.SetPosition(wx.Point(xPos,250))
118        self.dirname = ''
119        self.AtomGrid = []
120        self.selectedRow = 0
121       
122    def setSizePosLeft(self,Width):
123        screenSize = wx.DisplaySize()
124        self.SetSize(Width)
125        self.SetPosition(wx.Point(screenSize[0]-Width[0],250))
126       
127    def Clear(self):
128        self.ClearBackground()
129        self.DestroyChildren()
130                   
131class GSGrid(wg.Grid):
132    def __init__(self, parent, name=''):
133        wg.Grid.__init__(self,parent,-1,name=name)                   
134        self.SetSize(parent.GetClientSize())
135           
136    def Clear(self):
137        wg.Grid.ClearGrid(self)
138       
139    def SetCellStyle(self,r,c,color="white",readonly=True):
140        self.SetCellBackgroundColour(r,c,color)
141        self.SetReadOnly(r,c,isReadOnly=readonly)
142       
143class GSNoteBook(wx.Notebook):
144    def __init__(self, parent, name='',size = None):
145        wx.Notebook.__init__(self, parent, -1, name=name, style= wx.BK_TOP)
146        if size: self.SetSize(size)
147                                                     
148    def Clear(self):       
149        GSNoteBook.DeleteAllPages(self)
150       
151class Table(wg.PyGridTableBase):
152    def __init__(self, data=[], rowLabels=None, colLabels=None, types = None):
153        wg.PyGridTableBase.__init__(self)
154        self.colLabels = colLabels
155        self.rowLabels = rowLabels
156        self.dataTypes = types
157        self.data = data
158       
159    def AppendRows(self, numRows=1):
160        self.data.append([])
161        return True
162       
163    def CanGetValueAs(self, row, col, typeName):
164        if self.dataTypes:
165            colType = self.dataTypes[col].split(':')[0]
166            if typeName == colType:
167                return True
168            else:
169                return False
170        else:
171            return False
172
173    def CanSetValueAs(self, row, col, typeName):
174        return self.CanGetValueAs(row, col, typeName)
175
176    def DeleteRow(self,pos):
177        data = self.GetData()
178        self.SetData([])
179        new = []
180        for irow,row in enumerate(data):
181            if irow <> pos:
182                new.append(row)
183        self.SetData(new)
184       
185    def GetColLabelValue(self, col):
186        if self.colLabels:
187            return self.colLabels[col]
188           
189    def GetData(self):
190        data = []
191        for row in range(self.GetNumberRows()):
192            data.append(self.GetRowValues(row))
193        return data
194       
195    def GetNumberCols(self):
196        try:
197            return len(self.colLabels)
198        except TypeError:
199            return None
200       
201    def GetNumberRows(self):
202        return len(self.data)
203       
204    def GetRowLabelValue(self, row):
205        if self.rowLabels:
206            return self.rowLabels[row]
207       
208    def GetRowValues(self, row):
209        data = []
210        for col in range(self.GetNumberCols()):
211            data.append(self.GetValue(row, col))
212        return data
213       
214    def GetTypeName(self, row, col):
215        try:
216            return self.dataTypes[col]
217        except TypeError:
218            return None
219
220    def GetValue(self, row, col):
221        try:
222            return self.data[row][col]
223        except IndexError:
224            return None
225           
226    def InsertRows(self, pos, rows):
227        for row in range(rows):
228            self.data.insert(pos,[])
229            pos += 1
230       
231    def IsEmptyCell(self,row,col):
232        try:
233            return not self.data[row][col]
234        except IndexError:
235            return True
236       
237    def OnKeyPress(self, event):
238        dellist = self.GetSelectedRows()
239        if event.GetKeyCode() == wx.WXK_DELETE and dellist:
240            grid = self.GetView()
241            for i in dellist: grid.DeleteRow(i)
242               
243    def SetColLabelValue(self, col, label):
244        numcols = self.GetNumberCols()
245        if col > numcols-1:
246            self.colLabels.append(label)
247        else:
248            self.colLabels[col]=label
249       
250    def SetData(self,data):
251        for row in range(len(data)):
252            self.SetRowValues(row,data[row])
253               
254    def SetRowLabelValue(self, row, label):
255        self.rowLabels[row]=label
256           
257    def SetRowValues(self,row,data):
258        self.data[row] = data
259           
260    def SetValue(self, row, col, value):
261        def innerSetValue(row, col, value):
262            try:
263                self.data[row][col] = value
264            except TypeError:
265                return
266            except IndexError:
267                print row,col,value
268                # add a new row
269                if row > self.GetNumberRows():
270                    self.data.append([''] * self.GetNumberCols())
271                elif col > self.GetNumberCols():
272                    for row in range(self.GetNumberRows):
273                        self.data[row].append('')
274                print self.data
275                self.data[row][col] = value
276        innerSetValue(row, col, value)
277       
278       
279def UpdateNotebook(self,data):       
280    if data:
281        self.dataFrame.SetLabel('Notebook')
282        self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
283            style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
284        for line in data:
285            self.dataDisplay.AppendText(line+"\n")
286            self.dataDisplay.AppendText('Notebook entry @ '+time.ctime()+"\n")
287           
288def UpdateControls(self,data):
289    if data:
290        self.dataFrame.SetLabel('Controls')
291       
292     
293def UpdateComments(self,data):                   
294    if data:
295        self.dataFrame.SetLabel('Comments')
296        self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
297            style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
298        for line in data:
299            self.dataDisplay.AppendText(line+"\n")
300     
301def UpdatePeakGrid(self, data):
302    if self.dataDisplay:
303        self.dataDisplay.Destroy()
304   
305    def OnUnDo(event):
306        DoUnDo()
307        self.dataFrame.UnDo.Enable(False)
308       
309    def DoUnDo():
310        print 'Undo last refinement'
311        file = open('GSASII.save','rb')
312        PatternId = self.PatternId
313        for item in ['Background','Instrument Parameters','Peak List']:
314            self.PatternTree.SetItemPyData(GetPatternTreeItemId(self,PatternId, item),cPickle.load(file))
315            if self.dataDisplay.GetName() == item:
316                if item == 'Background':
317                    UpdateBackgroundGrid(self,self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, item)))
318                elif item == 'Instrument Parameters':
319                    UpdateInstrumentGrid(self,self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, item)))
320                elif item == 'Peak List':
321                    UpdatePeakGrid(self,self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, item)))
322            print item,' recovered'
323        file.close()
324       
325    def OnPeakFit(event):
326        self.SaveState()
327        print 'Peak Fitting - Do one cycle of peak fitting'
328        PatternId = self.PatternId
329        PickId = self.PickId
330        peaks = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Peak List'))
331        if not peaks:
332            self.ErrorDialog('No peaks!','Nothing to fit!')
333            return
334        background = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Background'))[0]
335        limits = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Limits'))[1]
336        inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
337        data = self.PatternTree.GetItemPyData(PatternId)[1]
338        OK,smin,Rwp,runtime,GoOn = G2cmp.DoPeakFit(peaks,background,limits,inst,data)
339        UpdatePeakGrid(self,peaks)
340        G2plt.PlotPatterns(self)
341        if not OK:
342            print 'Refinement failed'
343            dlg = wx.MessageDialog(self, 'Do you want to reload now?', 'Refinement failed',  wx.YES_NO)
344            try:
345                if dlg.ShowModal() == wx.ID_YES:
346                    DoUnDo()
347                    self.dataFrame.UnDo.Enable(False)
348            finally:
349                dlg.Destroy()
350        else:
351            self.dataFrame.UnDo.Enable(True)
352            print "%s%7.2f%s%12.6g" % ('Rwp = ',Rwp,'%, Smin = ',smin)
353            print "%s%8.3f%s " % ('fitpeak time =',runtime,'s')
354            print 'finished'
355        return
356       
357    def OnAutoPeakFit(event):
358        self.SaveState()
359        print 'AutoPeak Fitting - run until minimized'
360        PatternId = self.PatternId
361        PickId = self.PickId
362        peaks = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Peak List'))
363        if not peaks:
364            self.ErrorDialog('No peaks!','Nothing to fit!')
365            return
366        background = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Background'))[0]
367        limits = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Limits'))[1]
368        inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
369        data = self.PatternTree.GetItemPyData(PatternId)[1]
370        smin = 1.0e15
371        GoOn = True
372        while GoOn:
373            osmin = smin
374            OK,smin,Rwp,runtime,GoOn = G2cmp.DoPeakFit(peaks,background,limits,inst,data)
375            UpdatePeakGrid(self,peaks)
376            if not OK:
377                break
378            G2plt.PlotPatterns(self)
379            print "%s%7.2f%s%12.6g" % ('Rwp = ',Rwp,'%, Smin = ',smin)
380            rat = (osmin-smin)/smin
381            if rat < 1.0e-4: GoOn = False
382        if not OK:
383            print 'Refinement failed'
384            dlg = wx.MessageDialog(self, 'Do you want to reload now?', 'Refinement failed',  wx.YES_NO)
385            try:
386                if dlg.ShowModal() == wx.ID_YES:
387                    DoUnDo()
388                    self.dataFrame.UnDo.Enable(False)
389            finally:
390                dlg.Destroy()
391        else:
392            self.dataFrame.UnDo.Enable(True)
393            print "%s%8.3f%s " % ('fitpeak time =',runtime,'s per cycle')
394            print 'finished'
395        return       
396
397    def RefreshPeakGrid(event):
398        event.StopPropagation()
399        data = self.PeakTable.GetData()
400        T = []
401        for peak in data:T.append(peak[0])
402        D = dict(zip(T,data))
403        T.sort()
404        X = []
405        for key in T: X.append(D[key])
406        data = X       
407        G2plt.PlotPatterns(self)
408       
409    def setBackgroundColors():
410       for r in range(self.dataDisplay.GetNumberRows()):
411           for c in range(self.dataDisplay.GetNumberCols()):
412               if self.dataDisplay.GetColLabelValue(c) in ['position','intensity','sigma','gamma','SH/L']:
413                   if float(self.dataDisplay.GetCellValue(r,c)) < 0.:
414                       self.dataDisplay.SetCellBackgroundColour(r,c,wx.RED)
415                   else:
416                       self.dataDisplay.SetCellBackgroundColour(r,c,wx.WHITE)
417                           
418    def KeyEditPeakGrid(event):
419        rowList = self.dataDisplay.GetSelectedRows()
420        colList = self.dataDisplay.GetSelectedCols()
421        selectList = self.dataDisplay.GetSelectedCells()
422        data = self.PatternTree.GetItemPyData(self.PickId)
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 rowList:
430            self.dataDisplay.ClearSelection()
431            if event.GetKeyCode() == wx.WXK_DELETE:
432                self.dataDisplay.ClearGrid()
433                rowList.reverse()
434                nDel = 0
435                for row in rowList:
436                    self.PeakTable.DeleteRow(row)
437                    nDel += 1
438                if nDel:
439                    msg = wg.GridTableMessage(self.PeakTable, 
440                        wg.GRIDTABLE_NOTIFY_ROWS_DELETED,0,nDel)
441                    self.dataDisplay.ProcessTableMessage(msg)
442                data = self.PeakTable.GetData()
443                self.PatternTree.SetItemPyData(self.PickId,data[:-nDel])
444                self.dataDisplay.ForceRefresh()
445                setBackgroundColors()
446                if not len(self.PatternTree.GetItemPyData(self.PickId)): 
447                    self.dataFrame.PeakFit.Enable(False)
448                    self.dataFrame.AutoPeakFit.Enable(False)
449                       
450        elif colList:
451            self.dataDisplay.ClearSelection()
452            key = event.GetKeyCode()
453            for col in colList:
454                if self.PeakTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
455                    if key == 89: #'Y'
456                        for row in range(self.PeakTable.GetNumberRows()): data[row][col]=True
457                    elif key == 78:  #'N'
458                        for row in range(self.PeakTable.GetNumberRows()): data[row][col]=False
459        elif selectList:
460            self.dataDisplay.ClearSelection()
461            key = event.GetKeyCode()
462            for row,col in selectList:
463                if self.PeakTable.GetTypeName(row,col) == wg.GRID_VALUE_BOOL:
464                    if key == 89: #'Y'
465                        data[row][col]=True
466                    elif key == 78:  #'N'
467                        data[row][col]=False
468        G2plt.PlotPatterns(self)
469           
470    self.dataFrame.SetMenuBar(self.dataFrame.PeakMenu)
471    if not self.dataFrame.GetStatusBar():
472        Status = self.dataFrame.CreateStatusBar()
473    self.Bind(wx.EVT_MENU, OnUnDo, id=wxID_UNDO)
474    self.Bind(wx.EVT_MENU, OnPeakFit, id=wxID_PEAKFIT)
475    self.Bind(wx.EVT_MENU, OnAutoPeakFit, id=wxID_AUTOPEAKFIT)
476    self.dataFrame.PeakFit.Enable(False)
477    self.dataFrame.AutoPeakFit.Enable(False)
478    if data:
479        self.dataFrame.PeakFit.Enable(True)
480        self.dataFrame.AutoPeakFit.Enable(True)
481    self.PickTable = []
482    rowLabels = []
483    for i in range(len(data)): rowLabels.append(str(i+1))
484    colLabels = ['position','refine','intensity','refine','sigma','refine','gamma','refine','SH/L','refine']
485    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_BOOL,
486        wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
487        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL,
488        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL,
489        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL]
490    T = []
491    for peak in data:
492        T.append(peak[0])
493    D = dict(zip(T,data))
494    T.sort()
495    X = []
496    for key in T: X.append(D[key])
497    data = X       
498    self.PatternTree.SetItemPyData(self.PickId,data)
499    self.PeakTable = Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
500    self.dataFrame.SetLabel('Peak List')
501    self.dataDisplay = GSGrid(parent=self.dataFrame)
502    self.dataDisplay.SetTable(self.PeakTable, True)
503    setBackgroundColors()                         
504    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshPeakGrid)
505    self.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPeakGrid)                 
506    self.dataDisplay.SetMargins(0,0)
507    self.dataDisplay.AutoSizeColumns(False)
508    self.dataFrame.setSizePosLeft([650,350])
509       
510def UpdateBackgroundGrid(self,data):
511    BackId = GetPatternTreeItemId(self,self.PatternId, 'Background')
512   
513    def RefreshBackgroundGrid(event):
514        data = self.BackTable.GetData()
515        M = len(data[0])
516        N = data[0][2]+3
517        item = data[0]
518        if N > M:       #add terms
519            for i in range(M,N): 
520                item.append(0.0)
521                self.BackTable.SetColLabelValue(i,str(i-2))
522            data = [item]
523            msg = wg.GridTableMessage(self.BackTable, 
524                wg.GRIDTABLE_NOTIFY_COLS_APPENDED,0,N-M)
525            self.dataDisplay.ProcessTableMessage(msg)                         
526        elif N < M:     #delete terms
527            new = []
528            for i in range(N):
529                new.append(item[i])
530            data = [new]
531            msg = wg.GridTableMessage(self.BackTable, 
532                wg.GRIDTABLE_NOTIFY_COLS_DELETED,0,M-N)
533            self.dataDisplay.ProcessTableMessage(msg)                         
534        self.PatternTree.SetItemPyData(BackId,data)
535                 
536    self.dataFrame.setSizePosLeft([700,150])
537    maxTerm = 7
538    self.BackTable = []
539    N = len(data[0])
540    M = data[0][2]
541    colLabels = ['function','refine','Nterms']
542    rowLabels=['background']
543    for i in range(M): colLabels.append(str(i+1))
544    Types = [wg.GRID_VALUE_CHOICE+':chebyschev,another,more',
545        wg.GRID_VALUE_BOOL,
546        wg.GRID_VALUE_NUMBER+':1,'+str(maxTerm)]
547    for i in range(maxTerm):
548        Types.append(wg.GRID_VALUE_FLOAT+':10,3')
549    self.BackTable = Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
550    self.dataFrame.SetLabel('Background')
551    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
552    self.dataDisplay = GSGrid(parent=self.dataFrame)
553    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshBackgroundGrid)               
554    self.dataDisplay.SetTable(self.BackTable, True)
555    self.dataDisplay.SetMargins(0,0)
556    self.dataDisplay.AutoSizeColumns(False)
557       
558def UpdateLimitsGrid(self, data):
559    if self.dataDisplay:
560        self.dataDisplay.Destroy()
561    self.dataFrame.setSizePosLeft([250,150])
562    LimitId = GetPatternTreeItemId(self,self.PatternId, 'Limits')
563    def RefreshLimitsGrid(event):
564        data = self.LimitsTable.GetData()
565        old = data[0]
566        new = data[1]
567        new[0] = max(old[0],new[0])
568        new[1] = max(new[0],min(old[1],new[1]))
569        data = [old,new]
570        G2plt.PlotPatterns(self)
571       
572    self.LimitsTable = []
573    colLabels = ['Tmin','Tmax']
574    rowLabels = ['original','changed']
575    Types = [wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3']
576    self.LimitsTable = Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
577    self.dataFrame.SetLabel('Limits')
578    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
579    self.dataDisplay = GSGrid(parent=self.dataFrame)               
580    self.dataDisplay.SetTable(self.LimitsTable, True)
581    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshLimitsGrid)               
582    self.dataDisplay.SetMargins(0,0)
583    self.dataDisplay.AutoSizeColumns(False)
584   
585def UpdateInstrumentGrid(self, data):
586    if self.dataDisplay:
587        self.dataDisplay.Destroy()
588    Ka2 = False
589    Xwid = 720
590    if len(data[0]) == 13: 
591        Ka2 = True
592        Xwid = 800       
593    self.dataFrame.setSizePosLeft([Xwid,150])
594    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
595    InstId = GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters')
596    def RefreshInstrumentGrid(event):
597        if event.GetRow() == 1:
598            peaks = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
599            ins = data[1]
600            if 'P' in ins[0]:                                       #update powder peak parameters
601                for peak in peaks:
602                    if Ka2:
603                        peak[4] = ins[6]*tand(peak[0]/2.0)**2+ins[7]*tand(peak[0]/2.0)+ins[8]
604                        peak[6] = ins[9]/cosd(peak[0]/2.0)+ins[10]*tand(peak[0]/2.0)
605                        peak[8] = ins[11]
606                    else:
607                        peak[4] = ins[4]*tand(peak[0]/2.0)**2+ins[5]*tand(peak[0]/2.0)+ins[6]
608                        peak[6] = ins[7]/cosd(peak[0]/2.0)+ins[8]*tand(peak[0]/2.0)
609                        peak[8] = ins[9]
610       
611    self.InstrumentTable = []
612    if 'P' in data[1][0]:                   #powder data
613        if Ka2:
614            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
615                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #zero, ratio, pola
616                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #u,v,w
617                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,2']
618        else:
619            Types = [wg.GRID_VALUE_CHOICE+":PXC,PNC,PNT",wg.GRID_VALUE_FLOAT+':10,6',               #type & lam-1
620                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #zero, pola
621                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #u,v,w
622                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,2']
623        colLabels = data[3]
624        rowLabels = ['original','changed','refine']
625        self.InstrumentTable = Table(data[:-1],rowLabels=rowLabels,colLabels=colLabels,types=Types)
626        self.dataFrame.SetLabel('Instrument Parameters')
627        self.dataDisplay = GSGrid(parent=self.dataFrame)               
628        self.dataDisplay.SetTable(self.InstrumentTable, True)
629        self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshInstrumentGrid)               
630        self.dataDisplay.SetMargins(0,0)
631        self.dataDisplay.AutoSizeColumns(False)
632        beg = 4
633        if Ka2: beg = 6
634        for i in range(len(data[2])):
635            if i < beg or i == beg+6:
636                self.dataDisplay.SetCellRenderer(2,i,wg.GridCellStringRenderer())
637                self.dataDisplay.SetCellValue(2,i,'')
638                self.dataDisplay.SetReadOnly(2,i,isReadOnly=True)
639            else:
640                self.dataDisplay.SetCellRenderer(2,i,wg.GridCellBoolRenderer())
641                self.dataDisplay.SetCellEditor(2,i,wg.GridCellBoolEditor())
642    else:                       #single crystal data
643        Types = [wg.GRID_VALUE_CHOICE+":SXC,SNC,SNT",wg.GRID_VALUE_FLOAT+':10,6']
644        colLabels = data[2]
645        rowLabels = ['original','changed']
646        self.InstrumentTable = Table(data[:-1],rowLabels=rowLabels,colLabels=colLabels,types=Types)
647        self.dataFrame.SetLabel('Instrument Parameters')
648        self.dataDisplay = GSGrid(parent=self.dataFrame)               
649        self.dataDisplay.SetTable(self.InstrumentTable, True)
650        self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshInstrumentGrid)               
651        self.dataDisplay.SetMargins(0,0)
652        self.dataDisplay.AutoSizeColumns(False)
653               
654def UpdateIndexPeaksGrid(self, data):
655    IndexId = GetPatternTreeItemId(self,self.PatternId, 'Index Peak List')
656   
657    def RefreshIndexPeaksGrid(event):
658        data = self.IndexPeaksTable.GetData()
659        self.PatternTree.SetItemPyData(IndexId,data)
660       
661    def KeyEditPickGrid(event):
662        colList = self.dataDisplay.GetSelectedCols()
663        rowList = self.dataDisplay.GetSelectedRows()
664        data = self.PatternTree.GetItemPyData(IndexId)
665        if event.GetKeyCode() == wx.WXK_RETURN:
666            event.Skip(True)
667        elif event.GetKeyCode() == wx.WXK_CONTROL:
668            event.Skip(True)
669        elif event.GetKeyCode() == wx.WXK_SHIFT:
670            event.Skip(True)
671        elif event.GetKeyCode() == wx.WXK_DELETE:
672            dlg = wx.MessageDialog(self, 'Delete Index Peak List?', ' ', wx.YES | wx.NO)
673            try:
674                result = dlg.ShowModal()
675                if result == wx.ID_YES:
676                    oldlen = len(data)
677                    data = []
678                    self.PatternTree.SetItemPyData(IndexId,data)
679                    self.dataDisplay.Clear() 
680                    self.dataDisplay.Destroy()
681                    self.IndexPeaksTable = []
682            finally:
683                dlg.Destroy()
684        elif colList:
685            self.dataDisplay.ClearSelection()
686            key = event.GetKeyCode()
687            for col in colList:
688                if self.IndexPeaksTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
689                    if key == 89: #'Y'
690                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=True
691                    elif key == 78:  #'N'
692                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=False
693           
694    if self.dataDisplay:
695        self.dataDisplay.Destroy()
696    self.dataFrame.setSizePosLeft([500,300])
697    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
698    inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
699    self.IndexPeaksTable = []
700    if not data:
701        peaks = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
702        for peak in peaks:
703            dsp = inst[1]/(2.0*sind(peak[0]/2.0))
704            data.append([peak[0],peak[2],True,False,0,0,0,dsp,0.0])
705    else:
706        cells = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List'))
707        if cells:
708            cellist = cells[2]
709            dmin = cells[3]
710            self.HKL = []
711            for i,cell in enumerate(cellist):
712                if cell[-1]:
713                    ibrav = cell[2]
714                    A = G2cmp.cell2A(cell[3:9])
715                    self.HKL = G2cmp.GenHBravais(dmin,ibrav,A)
716                    G2cmp.IndexPeaks(data,self.HKL)
717                    for hkl in self.HKL:
718                        hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
719    rowLabels = []
720    for i in range(len(data)): rowLabels.append(str(i+1))
721    colLabels = ['position','intensity','use','indexed','h','k','l','d-obs','d-calc']
722    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
723        wg.GRID_VALUE_BOOL,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,
724        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5']
725    self.PatternTree.SetItemPyData(IndexId,data)
726    self.IndexPeaksTable = Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
727    self.dataFrame.SetLabel('Index Peak List')
728    self.dataDisplay = GSGrid(parent=self.dataFrame)               
729    self.dataDisplay.SetTable(self.IndexPeaksTable, True)
730    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshIndexPeaksGrid)
731    self.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPickGrid)                 
732    self.dataDisplay.SetMargins(0,0)
733    self.dataDisplay.AutoSizeColumns(False)
734
735def UpdateUnitCellsGrid(self, data):
736    UnitCellsId = GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List')
737    bravaisSymb = ['Fm3m','Im3m','Pm3m','R3-H','P6/mmm','I4/mmm',
738        'P4/mmm','Fmmm','Immm','Cmmm','Pmmm','C2/m','P2/m','P1']
739       
740    def OnRefineCell(event):
741        def cellPrint(ibrav,A):
742            cell = G2cmp.A2cell(A)
743            Vol = G2cmp.calc_V(A)
744            if ibrav in [0,1,2]:
745                print "%s%10.6f" % ('a =',cell[0])
746            elif ibrav in [3,4,5,6]:
747                print "%s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],' c =',cell[2],' volume =',Vol)
748            elif ibrav in [7,8,9,10]:
749                print "%s%10.6f %s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],' volume =',Vol)
750            elif ibrav in [11,12]:
751                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)
752            else:
753                print "%s%10.6f %s%10.6f %s%10.6f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2])
754                print "%s%8.3f %s%8.3f %s%8.3f %s%12.3f" % ('alpha =',cell[3],'beta =',cell[4],'gamma =',cell[5],' volume =',Vol)
755             
756        bravaisSymb = ['Fm3m','Im3m','Pm3m','R3-H','P6/mmm','I4/mmm',
757            'P4/mmm','Fmmm','Immm','Cmmm','Pmmm','C2/m','P2/m','P1']
758        PatternId = self.PatternId
759        PickId = self.PickId   
760        peaks = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
761        if not peaks:
762            self.ErrorDialog('No peaks!', 'Nothing to refine!')
763            return       
764        print 'Refine cell'
765        inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
766        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
767        cell = controls[6:12]
768        A = G2cmp.cell2A(cell)
769        print controls[5]
770        ibrav = bravaisSymb.index(controls[5])
771        dmin = G2cmp.getDmin(peaks)-0.05
772        Lhkl,M20,X20 = G2cmp.refinePeaks(peaks,ibrav,A)
773        controls[6:12] = G2cmp.A2cell(A)
774        controls[12] = G2cmp.calc_V(A)
775        data = [controls,bravais,cells,dmin]
776        self.PatternTree.SetItemPyData(GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
777        self.HKL = G2cmp.GenHBravais(dmin,ibrav,A)
778        UpdateUnitCellsGrid(self,data)
779        print "%s%10.3f" % ('refinement M20 = ',M20)
780        print 'unindexed lines = ',X20
781        cellPrint(ibrav,A)
782        for hkl in self.HKL:
783            hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
784        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
785            G2plt.PlotPowderLines(self)
786        else:
787            G2plt.PlotPatterns(self)
788       
789    def OnIndexPeaks(event):
790        PatternId = self.PatternId   
791        peaks = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
792        if not peaks:
793            self.ErrorDialog('No peaks!', 'Nothing to index!')
794            return
795        inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
796        print 'Peak Indexing'
797        try:
798            controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
799            cells = []
800        except ValueError:
801            self.ErrorDialog('Error','Need to set controls in Unit Cell List first')
802            return
803        if True not in bravais:
804            self.ErrorDialog('Error','No Bravais lattices selected')
805            return
806        self.dataFrame.IndexPeaks.Enable(False)
807        self.dataFrame.CopyCell.Enable(False)
808        OK,dmin,cells = G2cmp.DoIndexPeaks(peaks,inst,controls,bravais)
809        if OK:
810            data = [controls,bravais,cells,dmin]
811            self.PatternTree.SetItemPyData(GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
812            UpdateUnitCellsGrid(self,data)
813            bestCell = cells[0]
814            if bestCell[0] > 10.:
815                self.HKL = G2cmp.GenHBravais(dmin,bestCell[2],G2cmp.cell2A(bestCell[3:9]))
816                for hkl in self.HKL:
817                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
818                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
819                    G2plt.PlotPowderLines(self)
820                else:
821                    G2plt.PlotPatterns(self)
822        self.dataFrame.CopyCell.Enable(True)
823        self.dataFrame.IndexPeaks.Enable(True)
824               
825    def CopyUnitCell(event):
826        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)
827        for Cell in cells:
828            if Cell[-1]:
829                break
830        cell = Cell[2:9]
831        controls[4] = 1
832        controls[5] = bravaisSymb[cell[0]]
833        controls[6:12] = cell[1:8]
834        controls[12] = G2cmp.calc_V(G2cmp.cell2A(controls[6:12]))
835        for i in range(4,13):
836            self.UnitCellsTable.SetValue(i,1,controls[i])
837        self.PatternTree.SetItemPyData(UnitCellsId,[controls,bravais,cells,dmin])
838        self.dataDisplay.ForceRefresh()
839        self.dataFrame.RefineCell.Enable(True)
840           
841    def RefreshUnitCellsGrid(event):
842        cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)[2:]
843        r,c =  event.GetRow(),event.GetCol()
844        if cells:
845            if c == 6:
846                for i in range(min(self.UnitCellsTable.GetNumberRows(),len(cells))):
847                    cells[i][-1] = False
848                    self.UnitCellsTable.SetValue(i,c,0)
849                self.UnitCellsTable.SetValue(r,c,1)
850                cells[r][-1] = True
851                ibrav = cells[r][2]
852                A = G2cmp.cell2A(cells[r][3:9])
853                self.HKL = G2cmp.GenHBravais(dmin,ibrav,A)
854                for hkl in self.HKL:
855                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
856                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
857                    G2plt.PlotPowderLines(self)
858                else:
859                    G2plt.PlotPatterns(self)
860        controls = []
861        bravais = [0,0,0,0,0,0,0, 0,0,0,0,0,0,0]
862        table = self.UnitCellsTable.GetData()
863        for i,row in enumerate(table):
864            if i in [0,4]:
865                if row[1]:
866                    controls.append(1)
867                else:
868                    controls.append(0)
869            elif i in [1,3]:
870                controls.append(float(row[1]))
871            elif i in [2]:
872                controls.append(int(row[1]))
873            elif i in [5]:
874                controls.append(row[1])
875            elif i in [6,7,8,9,10,11]:
876                if controls[5] in bravaisSymb[:3]:              #cubic
877                    if i in [6]:
878                        controls.append(float(row[1]))
879                        controls.append(float(row[1]))
880                        controls.append(float(row[1]))
881                        controls.append(90.)
882                        controls.append(90.)
883                        controls.append(90.)
884                elif controls[5] in bravaisSymb[3:7]:           #hexagonal & tetragonal
885                    if i in [6]:
886                        controls.append(float(row[1]))
887                        controls.append(float(row[1]))
888                    elif i in [8]:
889                        controls.append(float(row[1]))
890                        controls.append(90.)
891                        controls.append(90.)
892                        if controls[5] in bravaisSymb[3:5]:     #hexagonal
893                            controls.append(120.)
894                        else:                                   #tetragonal
895                            controls.append(90.)
896                elif controls[5] in bravaisSymb[7:13]:          #orthorhombic & monoclinic
897                    if i in [6,7,8]:
898                        controls.append(float(row[1]))
899                    if i in [9,10,11]:
900                        if controls[5] in bravaisSymb[7:11]:
901                            controls.append(90.)
902                            controls.append(90.)
903                            controls.append(90.)
904                            break
905                        else:
906                            if i in [9,11]:
907                                controls.append(90.)
908                            else:
909                                controls.append(float(row[1]))
910                else:                                           #triclinic
911                    controls.append(float(row[1]))
912        controls.append(G2cmp.calc_V(G2cmp.cell2A(controls[6:12])))        #volume       
913        for i,row in enumerate(table):
914            if i < 14:
915                bravais[i] = int(row[2])
916            else:
917                break
918        if controls[4]:
919            for i in range(6,13):
920                self.UnitCellsTable.SetValue(i,1,controls[i])
921        self.dataDisplay.ForceRefresh()
922        if controls[4] and not False in controls[6:12]:
923            self.dataFrame.RefineCell.Enable(True)
924        else:
925            self.dataFrame.RefineCell.Enable(False)
926        data = [controls,bravais,cells,dmin]                   
927        self.PatternTree.SetItemPyData(UnitCellsId,data)
928       
929    if self.dataDisplay:
930        self.dataDisplay.Destroy()
931    self.dataFrame.SetMenuBar(self.dataFrame.IndexMenu)
932    if not self.dataFrame.GetStatusBar():
933        Status = self.dataFrame.CreateStatusBar()
934    self.Bind(wx.EVT_MENU, OnIndexPeaks, id=wxID_INDEXPEAKS)
935    self.Bind(wx.EVT_MENU, CopyUnitCell, id=wxID_COPYCELL)
936    self.Bind(wx.EVT_MENU, OnRefineCell, id=wxID_REFINECELL)
937    self.UnitCellsTable = []
938    controls,bravais,cells,dmin = data
939    if cells:
940        self.dataFrame.setSizePosLeft([900,320])
941    else:
942        self.dataFrame.setSizePosLeft([280,320])
943    if len(controls) < 13:
944        controls.append(G2cmp.calc_V(G2cmp.cell2A(controls[6:12])))
945    self.PatternTree.SetItemPyData(UnitCellsId,data)
946    inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
947    if cells:
948        colLabels = ['controls','value','try','Bravais cells',
949            'M20','X20','use','Bravais','a','b','c','alpha','beta','gamma','Volume']
950        Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_FLOAT+":10,1",
951            wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING,wg.GRID_VALUE_FLOAT+':10,2',
952            wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING,
953            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',
954            wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',
955            wg.GRID_VALUE_FLOAT+':10,2']
956    else:
957        colLabels = ['controls','value','try','Bravais cells']
958        Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,
959            wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING]
960    controlNames = ['Vary zero?','Max zero error','Max Nc/Nobs','Start volume','refine cell?',
961        'bravais','a=','b=','c=','alpha=','beta=','gamma=','Volume=']
962    bravaisNames = ['Cubic-F','Cubic-I','Cubic-P','Trigonal-R','Trigonal/Hexagonal-P',
963        'Tetragonal-I','Tetragonal-P','Orthorhombic-F','Orthorhombic-I','Orthorhombic-C',
964        'Orthorhombic-P','Monoclinic-C','Monoclinic-P','Triclinic']
965    rowLabels = []
966    table = []
967    numRows = max(len(bravais),len(cells))
968    for i in range(numRows):
969        rowLabels.append('')
970        if i < 13:
971            row = [controlNames[i],controls[i],bravais[i],bravaisSymb[i]]
972        elif i < 14:
973            row = ['','',bravais[i],bravaisSymb[i]]
974        else:
975            row = ['','','','']
976        if cells:
977            if i < len(cells):
978                cell = cells[i]
979                row += cell[0:2]+[cell[-1]]+[bravaisSymb[cell[2]]]+cell[3:10]
980                if cell[-1]:
981                    A = G2cmp.cell2A(cell[3:9])
982                    self.HKL = G2cmp.GenHBravais(dmin,cell[2],A)
983                    for hkl in self.HKL:
984                        hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
985            else:
986                row += 14*['',]
987        table.append(row)
988    self.UnitCellsTable = Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
989    self.dataFrame.SetLabel('Unit Cells List')
990    self.dataDisplay = GSGrid(parent=self.dataFrame)               
991    self.dataDisplay.SetTable(self.UnitCellsTable, True)
992    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshUnitCellsGrid)
993    self.dataDisplay.SetMargins(0,0)
994    self.dataDisplay.SetRowLabelSize(0)
995    self.dataDisplay.SetCellRenderer(0,1,wg.GridCellBoolRenderer())
996    self.dataDisplay.SetCellEditor(0,1,wg.GridCellBoolEditor())
997    self.dataDisplay.SetCellRenderer(1,1,wg.GridCellFloatRenderer(5,2))
998    self.dataDisplay.SetCellEditor(1,1,wg.GridCellFloatEditor(5,0))
999    self.dataDisplay.SetCellRenderer(2,1,wg.GridCellNumberRenderer())
1000    self.dataDisplay.SetCellEditor(2,1,wg.GridCellNumberEditor(1,10))
1001    self.dataDisplay.SetCellRenderer(3,1,wg.GridCellFloatRenderer(5,0))
1002    self.dataDisplay.SetCellEditor(3,1,wg.GridCellFloatEditor(5,2))
1003    self.dataDisplay.SetCellRenderer(4,1,wg.GridCellBoolRenderer())
1004    self.dataDisplay.SetCellEditor(4,1,wg.GridCellBoolEditor())
1005    self.dataDisplay.SetCellRenderer(5,1,wg.GridCellStringRenderer())
1006    self.dataDisplay.SetCellEditor(5,1,wg.GridCellChoiceEditor(bravaisSymb,False))
1007    for i in range(6,9):
1008        self.dataDisplay.SetCellRenderer(i,1,wg.GridCellFloatRenderer(10,5))
1009        self.dataDisplay.SetCellEditor(i,1,wg.GridCellFloatEditor(10,5))
1010    for i in range(9,13):
1011        self.dataDisplay.SetCellRenderer(i,1,wg.GridCellFloatRenderer(10,3))
1012        self.dataDisplay.SetCellEditor(i,1,wg.GridCellFloatEditor(10,3))
1013    for i in range(14):
1014        self.dataDisplay.SetReadOnly(i,0,isReadOnly=True)
1015        self.dataDisplay.SetReadOnly(i,3,isReadOnly=True)
1016    if cells:
1017        self.dataFrame.CopyCell.Enable(True)
1018        for r in range(max(len(cells),14)):
1019            if r > 12:
1020                self.dataDisplay.SetCellRenderer(r,0,wg.GridCellStringRenderer())                   
1021                self.dataDisplay.SetCellRenderer(r,1,wg.GridCellStringRenderer())
1022            if r > 13:
1023                self.dataDisplay.SetCellRenderer(r,2,wg.GridCellStringRenderer())
1024            for c in range(4,15):
1025                if r >= len(cells):
1026                    self.dataDisplay.SetCellRenderer(r,c,wg.GridCellStringRenderer())
1027                if c != 6:
1028                    self.dataDisplay.SetReadOnly(r,c,isReadOnly=True)
1029    self.dataDisplay.AutoSizeColumns(False)
1030    if controls[4] and not False in controls[6:12]:
1031        self.dataFrame.RefineCell.Enable(True)
1032    else:
1033        self.dataFrame.RefineCell.Enable(False)
1034       
1035def UpdateHKLControls(self,data):
1036   
1037    def OnScaleSlider(event):
1038        scale = int(scaleSel.GetValue())/1000.
1039        scaleSel.SetValue(int(scale*1000.))
1040        data['Scale'] = scale*10.
1041        G2plt.PlotSngl(self)
1042       
1043    def OnLayerSlider(event):
1044        layer = layerSel.GetValue()
1045        data['Layer'] = layer
1046        G2plt.PlotSngl(self)
1047       
1048    def OnSelZone(event):
1049        data['Zone'] = zoneSel.GetValue()
1050        G2plt.PlotSngl(self,newPlot=True)
1051       
1052    def OnSelType(event):
1053        data['Type'] = typeSel.GetValue()
1054        G2plt.PlotSngl(self)
1055       
1056    def SetStatusLine():
1057        Status.SetStatusText("look at me!!!")
1058                                     
1059    if self.dataDisplay:
1060        self.dataDisplay.Destroy()
1061    if not self.dataFrame.GetStatusBar():
1062        Status = self.dataFrame.CreateStatusBar()
1063    SetStatusLine()
1064    zones = ['100','010','001']
1065    HKLmax = data['HKLmax']
1066    HKLmin = data['HKLmin']
1067    if data['ifFc']:
1068        typeChoices = ['Fosq','Fo','|DFsq|/sig','|DFsq|>sig','|DFsq|>3sig']
1069    else:
1070        typeChoices = ['Fosq','Fo']
1071    self.dataDisplay = wx.Panel(self.dataFrame)
1072    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1073    mainSizer = wx.BoxSizer(wx.VERTICAL)
1074    mainSizer.Add((5,10),0)
1075   
1076    scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
1077    scaleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Scale'),0,
1078        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1079    scaleSel = wx.Slider(parent=self.dataDisplay,maxValue=1000,minValue=100,
1080        style=wx.SL_HORIZONTAL,value=int(data['Scale']*100))
1081    scaleSizer.Add(scaleSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
1082    scaleSel.SetLineSize(100)
1083    scaleSel.SetPageSize(900)
1084    scaleSel.Bind(wx.EVT_SLIDER, OnScaleSlider)
1085    mainSizer.Add(scaleSizer,1,wx.EXPAND|wx.RIGHT)
1086   
1087    zoneSizer = wx.BoxSizer(wx.HORIZONTAL)
1088    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Zone  '),0,
1089        wx.ALIGN_CENTER_VERTICAL)
1090    zoneSel = wx.ComboBox(parent=self.dataDisplay,value=data['Zone'],choices=['100','010','001'],
1091        style=wx.CB_READONLY|wx.CB_DROPDOWN)
1092    zoneSel.Bind(wx.EVT_COMBOBOX, OnSelZone)
1093    zoneSizer.Add(zoneSel,0,wx.ALIGN_CENTER_VERTICAL)
1094    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Plot type  '),0,
1095        wx.ALIGN_CENTER_VERTICAL)       
1096    typeSel = wx.ComboBox(parent=self.dataDisplay,value=data['Type'],choices=typeChoices,
1097        style=wx.CB_READONLY|wx.CB_DROPDOWN)
1098    typeSel.Bind(wx.EVT_COMBOBOX, OnSelType)
1099    zoneSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
1100    zoneSizer.Add((10,0),0)   
1101    mainSizer.Add(zoneSizer,1,wx.EXPAND|wx.RIGHT)
1102       
1103    izone = zones.index(data['Zone'])
1104    layerSizer = wx.BoxSizer(wx.HORIZONTAL)
1105    layerSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Layer'),0,
1106        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1107    layerSel = wx.Slider(parent=self.dataDisplay,maxValue=HKLmax[izone],minValue=HKLmin[izone],
1108        style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS,value=0)
1109    layerSel.SetLineSize(1)
1110    layerSel.SetLineSize(5)
1111    layerSel.Bind(wx.EVT_SLIDER, OnLayerSlider)   
1112    layerSizer.Add(layerSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
1113    layerSizer.Add((10,0),0)   
1114    mainSizer.Add(layerSizer,1,wx.EXPAND|wx.RIGHT)
1115
1116       
1117    mainSizer.Layout()   
1118    self.dataDisplay.SetSizer(mainSizer)
1119    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
1120    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
1121       
1122def UpdateImageControls(self,data):
1123    import ImageCalibrants as calFile
1124   
1125    def OnNewColorBar(event):
1126        data['color'] = colSel.GetValue()
1127        G2plt.PlotExposedImage(self)
1128       
1129    def OnNewCalibrant(event):
1130        data['calibrant'] = calSel.GetValue()
1131       
1132    def OnPixLimit(event):
1133        data['pixLimit'] = int(pixLimit.GetValue())
1134       
1135    def OnMaxSlider(event):
1136        imax = int(maxSel.GetValue())
1137        delt = data['range'][0][1]-data['range'][0][0]
1138        data['range'][1][1] = int((imax/100.)*delt)+data['range'][0][0]
1139        G2plt.PlotExposedImage(self)
1140       
1141    def OnMinSlider(event):
1142        imin = int(minSel.GetValue())
1143        delt = data['range'][1][1]-data['range'][0][0]
1144        data['range'][1][0] = int((imin/100.)*delt)+data['range'][0][0]
1145        G2plt.PlotExposedImage(self)
1146       
1147    def OnNumOutChans(event):
1148        try:
1149            numChans = int(outChan.GetValue())
1150            if numChans < 1:
1151                raise ValueError
1152            data['outChannels'] = numChans
1153        except ValueError:
1154            pass
1155        self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)   
1156        outChan.SetValue(str(data['outChannels']))          #reset in case of error       
1157       
1158    def OnNumOutAzms(event):
1159        try:
1160            numAzms = int(outAzim.GetValue())
1161            if numAzms < 1:
1162                raise ValueError
1163            data['outAzimuths'] = numAzms           
1164        except ValueError:
1165            pass
1166        self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)   
1167        outAzim.SetValue(str(data['outAzimuths']))          #reset in case of error       
1168       
1169    def OnWavelength(event):
1170        try:
1171            wave = float(waveSel.GetValue())
1172            if wave < .01:
1173                raise ValueError
1174            data['wavelength'] = wave
1175        except ValueError:
1176            pass
1177        waveSel.SetValue("%6.5f" % (data['wavelength']))          #reset in case of error         
1178       
1179    def OnCutOff(event):
1180        try:
1181            cutoff = float(cutOff.GetValue())
1182            data['cutoff'] = cutoff
1183        except ValueError:
1184            pass
1185        cutOff.SetValue("%.1f"%(data['cutoff']))          #reset in case of error 
1186       
1187    def OnShowLines(event):
1188        if data['showLines']:
1189            data['showLines'] = False
1190        else:
1191            data['showLines'] = True
1192        G2plt.PlotExposedImage(self)
1193       
1194    def OnFullIntegrate(event):
1195        if data['fullIntegrate']:
1196            data['fullIntegrate'] = False
1197            self.Lazim.SetEditable(True)           
1198            self.Razim.SetEditable(True)           
1199        else:
1200            data['fullIntegrate'] = True
1201            self.Lazim.SetEditable(False)           
1202            self.Razim.SetEditable(False)           
1203        self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)   
1204        G2plt.PlotExposedImage(self)
1205       
1206    def OnSetDefault(event):
1207        import copy
1208        if data['setDefault']:
1209            self.imageDefault = {}
1210            data['setDefault'] = False
1211        else:
1212            self.imageDefault = copy.copy(data)
1213            data['setDefault'] = True
1214           
1215    def OnIOtth(event):
1216        Ltth = float(self.InnerTth.GetValue())
1217        Utth = float(self.OuterTth.GetValue())
1218        if Ltth > Utth:
1219            G2cmp.SwapXY(Ltth,Utth)
1220        data['IOtth'] = [Ltth,Utth]
1221        self.InnerTth.SetValue("%8.2f" % (Ltth))
1222        self.OuterTth.SetValue("%8.2f" % (Utth))
1223        self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)   
1224        G2plt.PlotExposedImage(self)
1225       
1226    def OnLRazim(event):
1227        Lazm = int(self.Lazim.GetValue())
1228        Razm = int(self.Razim.GetValue())
1229        data['LRazimuth'] = [Lazm,Razm]
1230        self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)   
1231        G2plt.PlotExposedImage(self)
1232           
1233    def OnSetRings(event):
1234        if data['setRings']:
1235            data['setRings'] = False
1236        else:
1237            data['setRings'] = True
1238        setRings.SetValue(data['setRings'])
1239        G2plt.PlotExposedImage(self)
1240           
1241    def OnClearCalib(event):
1242        data['ring'] = []
1243        data['rings'] = []
1244        data['ellipses'] = []
1245        self.dataFrame.ImageEdit.Enable(id=wxID_IMCLEARCALIB,enable=False)   
1246        G2plt.PlotImage(self)
1247           
1248    def OnCalibrate(event):       
1249        data['setRings'] = False
1250        setRings.SetValue(data['setRings'])
1251        msg = \
1252        '''Select > 4 points on inner ring of image pattern.
1253        Click right mouse button to select point.
1254          Use left mouse button to delete point.
1255                 Press OK when done'''
1256        dlg = wx.MessageDialog(self,msg,'Pick inner ring',wx.OK)
1257        self.ifGetRing = True
1258        dlg.ShowModal()
1259        self.ifGetRing = False
1260       
1261        if G2cmp.ImageCalibrate(self,data):
1262            Status.SetStatusText('Calibration successful')
1263            cent = data['center']
1264            centText.SetValue(("%8.3f,%8.3f" % (cent[0],cent[1])))
1265            distSel.SetValue("%8.3f"%(data['distance']))
1266            tiltSel.SetValue("%9.3f"%(data['tilt']))           
1267            rotSel.SetValue("%9.3f"%(data['rotation']))
1268            self.dataFrame.ImageEdit.Enable(id=wxID_IMCLEARCALIB,enable=True)   
1269        else:
1270            Status.SetStatusText('Calibration failed')
1271                   
1272    def OnIntegrate(event):
1273        G2cmp.ImageIntegrate(self,data)
1274        self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=True)   
1275       
1276    def OnSaveIntegrate(event):
1277        import numpy as np
1278        print 'save integration'
1279        azms = self.Integrate[1]
1280        X = self.Integrate[2].flatten()[:-1]
1281        Xminmax = [X[0],X[-1]]
1282        N = len(X)
1283        Id = self.PatternTree.GetItemParent(self.PickId)
1284        name = self.PatternTree.GetItemText(Id)
1285        Comments = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,Id, 'Comments'))
1286        name = name.replace('IMG ','PWDR ')
1287        names = ['Type','Lam','Zero','Polariz.','U','V','W','X','Y','SH/L','Azimuth'] 
1288        codes = [0 for i in range(11)]
1289        parms = ['PXC',data['wavelength'],0.0,0.0,1.0,-1.0,0.3,0.0,1.0,0.0,0.0]
1290        Azms = [(azms[i+1]+azms[i])/2. for i in range(len(azms)-1)]
1291        for i,azm in enumerate(Azms):
1292            Id = self.PatternTree.AppendItem(parent=self.root,text=name+"Azm= %.2f"%(azm))
1293            parms[10] = azm
1294            Y = self.Integrate[0][i].flatten()
1295            W = np.sqrt(Y)
1296            self.PatternTree.SetItemPyData(Id,[[''],[np.array(X),np.array(Y),np.array(W),np.zeros(N),np.zeros(N),np.zeros(N)]])
1297            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)                   
1298            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Limits'),[tuple(Xminmax),Xminmax])
1299            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Background'),[['chebyschev',1,3,1.0,0.0,0.0]])
1300            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Instrument Parameters'),[tuple(parms),parms,codes,names])
1301            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Peak List'),[])
1302            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Index Peak List'),[])
1303            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Unit Cells List'),[])             
1304        self.PatternTree.SelectItem(Id)
1305        self.PatternTree.Expand(Id)
1306        self.PatternId = Id
1307           
1308                               
1309    colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
1310    calList = [m for m in calFile.Calibrants.keys()]
1311    if self.dataDisplay:
1312        self.dataDisplay.Destroy()
1313    self.dataFrame.SetMenuBar(self.dataFrame.ImageMenu)
1314    if not self.dataFrame.GetStatusBar():
1315        Status = self.dataFrame.CreateStatusBar()
1316    self.dataFrame.Bind(wx.EVT_MENU, OnCalibrate, id=wxID_IMCALIBRATE)
1317    self.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=wxID_IMCLEARCALIB)
1318    if not data['rings']:
1319        self.dataFrame.ImageEdit.Enable(id=wxID_IMCLEARCALIB,enable=False)   
1320    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=wxID_IMINTEGRATE)
1321    self.dataFrame.Bind(wx.EVT_MENU, OnSaveIntegrate, id=wxID_SAVEINTG)
1322    self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)   
1323    self.dataDisplay = wx.Panel(self.dataFrame)
1324    mainSizer = wx.BoxSizer(wx.VERTICAL)
1325    mainSizer.Add((5,10),0)
1326   
1327    maxSizer = wx.FlexGridSizer(2,2,0,5)
1328    maxSizer.AddGrowableCol(1,1)
1329    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max intensity'),0,
1330        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1331    maxSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
1332        value=int(100*data['range'][1][1]/(data['range'][0][1]-data['range'][0][0])))
1333    maxSizer.Add(maxSel,1,wx.EXPAND|wx.RIGHT)
1334    maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)   
1335    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min intensity'),0,
1336        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1337    minSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
1338        value=int(100*data['range'][1][0]/(data['range'][1][1]-data['range'][0][0])))
1339    maxSizer.Add(minSel,1,wx.EXPAND|wx.RIGHT)
1340    minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
1341    mainSizer.Add(maxSizer,1,wx.EXPAND|wx.RIGHT)
1342   
1343    comboSizer = wx.BoxSizer(wx.HORIZONTAL)
1344    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Color bar '),0,
1345        wx.ALIGN_CENTER_VERTICAL)
1346    colSel = wx.ComboBox(parent=self.dataDisplay,value=data['color'],choices=colorList,
1347        style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
1348    colSel.Bind(wx.EVT_COMBOBOX, OnNewColorBar)
1349    comboSizer.Add(colSel,0,wx.ALIGN_CENTER_VERTICAL)
1350   
1351    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibrant '),0,
1352        wx.ALIGN_CENTER_VERTICAL)
1353    calSel = wx.ComboBox(parent=self.dataDisplay,value=data['calibrant'],choices=calList,
1354        style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
1355    calSel.Bind(wx.EVT_COMBOBOX, OnNewCalibrant)
1356    comboSizer.Add(calSel,0,wx.ALIGN_CENTER_VERTICAL)
1357    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Pixel search range '),0,
1358        wx.ALIGN_CENTER_VERTICAL)
1359    pixLimit = wx.ComboBox(parent=self.dataDisplay,value=str(data['pixLimit']),choices=['1','2','5','10','15','20'],
1360        style=wx.CB_READONLY|wx.CB_DROPDOWN)
1361    pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)
1362    comboSizer.Add(pixLimit,0,wx.ALIGN_CENTER_VERTICAL)
1363    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min ring I/Ib '),0,
1364        wx.ALIGN_CENTER_VERTICAL)
1365    cutOff = wx.TextCtrl(parent=self.dataDisplay,value=("%.1f" % (data['cutoff'])),
1366        style=wx.TE_PROCESS_ENTER)
1367    cutOff.Bind(wx.EVT_TEXT_ENTER,OnCutOff)
1368    comboSizer.Add(cutOff,0,wx.ALIGN_CENTER_VERTICAL)
1369
1370    mainSizer.Add(comboSizer,0,wx.ALIGN_CENTER_HORIZONTAL)
1371    mainSizer.Add((5,5),0)
1372         
1373    dataSizer = wx.FlexGridSizer(6,4,5,5)
1374    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibration coefficients'),0,
1375        wx.ALIGN_CENTER_VERTICAL)   
1376    dataSizer.Add((5,0),0)
1377    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Integration coefficients'),0,
1378        wx.ALIGN_CENTER_VERTICAL)   
1379    dataSizer.Add((5,0),0)
1380   
1381    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Beam center X,Y'),0,
1382        wx.ALIGN_CENTER_VERTICAL)
1383    cent = data['center']
1384    centText = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f,%8.3f" % (cent[0],cent[1])),style=wx.TE_READONLY)
1385    dataSizer.Add(centText,0,wx.ALIGN_CENTER_VERTICAL)
1386   
1387    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Inner/Outer 2-theta'),0,
1388        wx.ALIGN_CENTER_VERTICAL)
1389       
1390    #temporary fixes   
1391    if 'IOtth' not in data:                 
1392        del data['IOradii']
1393        data['IOtth'] = [2.0,5.0]
1394    if 'outAzimuths' not in data:
1395        data['outAzimuths'] = 1       
1396       
1397    IOtth = data['IOtth']
1398    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
1399    self.InnerTth = wx.TextCtrl(parent=self.dataDisplay,
1400        value=("%8.2f" % (IOtth[0])),style=wx.TE_PROCESS_ENTER)
1401    self.InnerTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
1402    littleSizer.Add(self.InnerTth,0,wx.ALIGN_CENTER_VERTICAL)
1403    self.OuterTth = wx.TextCtrl(parent=self.dataDisplay,
1404        value=("%8.2f" % (IOtth[1])),style=wx.TE_PROCESS_ENTER)
1405    self.OuterTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
1406    littleSizer.Add(self.OuterTth,0,wx.ALIGN_CENTER_VERTICAL)
1407    dataSizer.Add(littleSizer,0,)
1408       
1409    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Wavelength'),0,
1410        wx.ALIGN_CENTER_VERTICAL)
1411    waveSel = wx.TextCtrl(parent=self.dataDisplay,value=("%6.5f" % (data['wavelength'])),
1412        style=wx.TE_PROCESS_ENTER)
1413    waveSel.Bind(wx.EVT_TEXT_ENTER,OnWavelength)
1414    dataSizer.Add(waveSel,0,wx.ALIGN_CENTER_VERTICAL)
1415         
1416    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start/End azimuth'),0,
1417        wx.ALIGN_CENTER_VERTICAL)
1418    LRazim = data['LRazimuth']
1419    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
1420    self.Lazim = wx.TextCtrl(parent=self.dataDisplay,
1421        value=("%6d" % (LRazim[0])),style=wx.TE_PROCESS_ENTER)
1422    self.Lazim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
1423    littleSizer.Add(self.Lazim,0,wx.ALIGN_CENTER_VERTICAL)
1424    self.Razim = wx.TextCtrl(parent=self.dataDisplay,
1425        value=("%6d" % (LRazim[1])),style=wx.TE_PROCESS_ENTER)
1426    self.Razim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
1427    littleSizer.Add(self.Razim,0,wx.ALIGN_CENTER_VERTICAL)
1428    dataSizer.Add(littleSizer,0,)
1429       
1430    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Distance'),0,
1431        wx.ALIGN_CENTER_VERTICAL)
1432    distSel = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f"%(data['distance'])),style=wx.TE_READONLY)
1433    dataSizer.Add(distSel,0,wx.ALIGN_CENTER_VERTICAL)
1434
1435    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' No. 2-theta/azimuth bins'),0,
1436        wx.ALIGN_CENTER_VERTICAL)
1437    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
1438    outChan = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)
1439    outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)
1440    littleSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)
1441    outAzim = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outAzimuths']),style=wx.TE_PROCESS_ENTER)
1442    outAzim.Bind(wx.EVT_TEXT_ENTER,OnNumOutAzms)
1443    littleSizer.Add(outAzim,0,wx.ALIGN_CENTER_VERTICAL)
1444    dataSizer.Add(littleSizer,0,)
1445
1446    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt angle'),0,
1447        wx.ALIGN_CENTER_VERTICAL)
1448    tiltSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['tilt'])),style=wx.TE_READONLY)
1449    dataSizer.Add(tiltSel,0,wx.ALIGN_CENTER_VERTICAL)
1450    showLines = wx.CheckBox(parent=self.dataDisplay,label='Show integration limits?')
1451    dataSizer.Add(showLines,0)
1452    showLines.Bind(wx.EVT_CHECKBOX, OnShowLines)
1453    showLines.SetValue(data['showLines'])
1454    fullIntegrate = wx.CheckBox(parent=self.dataDisplay,label='Do full integration?')
1455    dataSizer.Add(fullIntegrate,0)
1456    fullIntegrate.Bind(wx.EVT_CHECKBOX, OnFullIntegrate)
1457    fullIntegrate.SetValue(data['fullIntegrate'])
1458   
1459    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt rotation'),0,
1460        wx.ALIGN_CENTER_VERTICAL)
1461    rotSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['rotation'])),style=wx.TE_READONLY)
1462    dataSizer.Add(rotSel,0,wx.ALIGN_CENTER_VERTICAL)
1463    setDefault = wx.CheckBox(parent=self.dataDisplay,label='Use as default for all images?')
1464    dataSizer.Add(setDefault,0)
1465    setDefault.Bind(wx.EVT_CHECKBOX, OnSetDefault)
1466    setDefault.SetValue(data['setDefault'])
1467    setRings = wx.CheckBox(parent=self.dataDisplay,label='Show ring picks?')
1468    dataSizer.Add(setRings,0)
1469    setRings.Bind(wx.EVT_CHECKBOX, OnSetRings)
1470    setRings.SetValue(data['setRings'])
1471       
1472    mainSizer.Add(dataSizer,0)
1473   
1474    mainSizer.Layout()   
1475    self.dataDisplay.SetSizer(mainSizer)
1476    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
1477    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
1478   
1479def UpdatePhaseData(self,item,data,oldPage):
1480    import GSASIIElem as G2el
1481    Atoms = []
1482    self.SelectedRow = 0
1483   
1484    def BookResize(event):
1485        w,h = self.GetSize()
1486        self.dataDisplay.SetSize(wx.Size(w,h))
1487       
1488    def FillGeneralGrid():
1489        def SetLatticeParametersStyle(SGData,table):
1490            if SGData['SGLaue'] in ['m3','m3m']:
1491                table[4][2] = table[4][3] = table[4][1]
1492                General.SetCellStyle(4,2,"light grey",True)
1493                General.SetCellStyle(4,3,"light grey",True)
1494                table[4][4] = table[4][5] = table[4][6] = 90.
1495                General.SetCellStyle(4,4,"light grey",True)
1496                General.SetCellStyle(4,5,"light grey",True)
1497                General.SetCellStyle(4,6,"light grey",True)
1498            elif SGData['SGLaue'] in ['3R','3mR']:
1499                table[4][2] = table[4][3] = table[4][1]
1500                General.SetCellStyle(4,2,"light grey",True)
1501                General.SetCellStyle(4,3,"light grey",True)
1502                table[4][5] = table[4][6] = table[4][4]
1503                General.SetCellStyle(4,5,"light grey",True)
1504                General.SetCellStyle(4,6,"light grey",True)
1505            elif SGData['SGLaue'] in ['3','3m1','31m','6/m','6/mmm']:
1506                table[4][2] = table[4][1]
1507                General.SetCellStyle(4,2,"light grey",True)
1508                table[4][4] = table[4][5] = 90.
1509                table[4][6] = 120.
1510                General.SetCellStyle(4,4,"light grey",True)
1511                General.SetCellStyle(4,5,"light grey",True)
1512                General.SetCellStyle(4,6,"light grey",True)
1513            elif SGData['SGLaue'] in ['4/m','4/mmm']:
1514                table[4][2] = table[4][1]
1515                General.SetCellStyle(4,2,"light grey",True)
1516                table[4][4] = table[4][5] = table[4][6] = 90.
1517                General.SetCellStyle(4,4,"light grey",True)
1518                General.SetCellStyle(4,5,"light grey",True)
1519                General.SetCellStyle(4,6,"light grey",True)
1520            elif SGData['SGLaue'] in ['mmm']:
1521                table[4][4] = table[4][5] = table[4][6] = 90.
1522                General.SetCellStyle(4,4,"light grey",True)
1523                General.SetCellStyle(4,5,"light grey",True)
1524                General.SetCellStyle(4,6,"light grey",True)
1525            elif SGData['SGLaue'] in ['2/m']:
1526                if SGData['SGUniq'] == 'a':
1527                    table[4][5]= table[4][6] = 90.
1528                    General.SetCellStyle(4,5,"light grey",True)
1529                    General.SetCellStyle(4,6,"light grey",True)
1530                if SGData['SGUniq'] == 'b':
1531                    table[4][4]= table[4][6] = 90.
1532                    General.SetCellStyle(4,4,"light grey",True)
1533                    General.SetCellStyle(4,6,"light grey",True)
1534                if SGData['SGUniq'] == 'c':
1535                    table[4][4]= table[4][5] = 90.
1536                    General.SetCellStyle(4,4,"light grey",True)
1537                    General.SetCellStyle(4,5,"light grey",True)
1538           
1539        def RefreshGeneralGrid(event):
1540               
1541            r,c =  event.GetRow(),event.GetCol()
1542            generalData[0] = table[0][0]
1543            self.PatternTree.SetItemText(item,generalData[0])
1544            generalData[1] = table[1][0]
1545            SpcGp = table[2][0]
1546            SGErr,SGData = G2spc.SpcGroup(SpcGp)
1547            if r == 2 and c == 0:
1548                if SGErr:
1549                    text = [G2spc.SGErrors(SGErr)+'\nSpace Group set to previous']
1550                    table[2][0] = generalData[2]['SpGrp']
1551                    msg = 'Space Group Error'
1552                    Style = wx.ICON_EXCLAMATION
1553                else:
1554                    text = G2spc.SGPrint(SGData)
1555                    generalData[2] = SGData
1556                    msg = 'Space Group Information'
1557                    Style = wx.ICON_INFORMATION
1558                Text = ''
1559                for line in text:
1560                    Text += line+'\n'
1561                wx.MessageBox(Text,caption=msg,style=Style)
1562            General.SetCellValue(4,0,str(generalData[3][0]))
1563            for c in range(1,7):
1564                General.SetCellStyle(4,c,"white",False)
1565                generalData[3][c] = float(General.GetCellValue(4,c))
1566            generalData[3][7] = G2cmp.calc_V(G2cmp.cell2A(generalData[3][1:7]))
1567            SetLatticeParametersStyle(SGData,table)
1568            generalData[4][1] = float(General.GetCellValue(5,1))
1569            General.ForceRefresh()
1570                       
1571        rowLabels = ['Phase name','Phase type','Space group',
1572            'Lattice ',' parameters','Scale factor','Elements','No. per cell','Atom weight','','Bond radii','Angle radii']
1573        generalData = data['General']
1574        atomData = data['Atoms']
1575        AtomTypes = []
1576        NoAtoms = {}
1577        BondRadii = []
1578        AngleRadii = []
1579        AtomMass = []
1580        colType = 1
1581        colSS = 7
1582        self.dataFrame.setSizePosLeft([600,350])
1583        if generalData[1] =='macromolecular':
1584            colType = 4
1585            colSS = 10
1586        for atom in atomData:
1587            if AtomTypes.count(atom[colType]):
1588                NoAtoms[atom[colType]] += atom[colSS-1]*atom[colSS+1]
1589            else:
1590                Info = G2el.GetAtomInfo(atom[colType])
1591                AtomTypes.append(Info['Symbol'])
1592                BondRadii.append(Info['Drad'])
1593                AngleRadii.append(Info['Arad'])
1594                AtomMass.append(Info['Mass'])
1595                NoAtoms[atom[colType]] = atom[colSS-1]*atom[colSS+1]
1596        generalData[5:9] = [AtomTypes,NoAtoms,AtomMass,BondRadii,AngleRadii]
1597        colLabels = []
1598        colLabels += ['' for i in range(max(8,len(generalData[5])))]
1599        table = []
1600        table.append([generalData[0],'','','','','','','',''])      #phase name
1601        table.append([generalData[1],'','','','','','','',''])      #phase type
1602        E,SGData = G2spc.SpcGroup(generalData[2]['SpGrp'])
1603        table.append([SGData['SpGrp'],'','','','','','','',''])     #space group symbol
1604        table.append(['refine','a    ','b    ','c    ','alpha ','beta ','gamma','volume  '])
1605        table.append(generalData[3])                      #lattice parameters
1606        table.append([generalData[4][0],generalData[4][1],'','','','','',''])   #scale factor
1607        table.append(generalData[5]+['' for i in range(max(8,len(generalData[5])))]) #element list
1608        line = []
1609        mass = 0.
1610        for i,elem in enumerate(generalData[5]):
1611            mass += generalData[6][elem]*generalData[7][i]
1612            line.append(generalData[6][elem])
1613        Volume = generalData[3][7]
1614        table.append(line+['' for i in range(max(8,len(generalData[5])))]) #No. per cell
1615        table.append(generalData[7]+['' for i in range(max(8,len(generalData[5])))])  #At. wt.
1616        if generalData[1] == 'macromolecular' and mass > 0.0:
1617            table.append(['density',mass/(0.6022137*Volume),'Matthews coeff.',Volume/mass,'','','','',''])           
1618        else:
1619            table.append(['density',mass/(0.6022137*Volume),'','','','','','',''])
1620        table.append(generalData[8]+['' for i in range(max(8,len(generalData[5])))])
1621        table.append(generalData[9]+['' for i in range(max(8,len(generalData[5])))])
1622        Types = [wg.GRID_VALUE_STRING for i in range(max(8,len(generalData[5])))]
1623        generalTable = Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1624        General.SetTable(generalTable, True)
1625        General.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshGeneralGrid)
1626        General.SetMargins(0,0)
1627        General.SetColSize(0,100)
1628        General.SetColLabelSize(0)
1629        for c in range(max(8,len(generalData[5]))):
1630            if c > 0:
1631                General.SetReadOnly(0,c,isReadOnly=True)
1632                General.SetReadOnly(1,c,isReadOnly=True)
1633                General.SetReadOnly(2,c,isReadOnly=True)
1634            General.SetReadOnly(3,c,isReadOnly=True)                         #unit cell labels
1635            General.SetCellAlignment(3,c,wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
1636            if c < 4:
1637                General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,5))
1638                General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,5))
1639                General.SetReadOnly(9,c,isReadOnly=True)
1640            else:
1641                General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,3))
1642                General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,3))
1643            for r in range(6,12):
1644                General.SetReadOnly(r,c,isReadOnly=True)
1645        General.SetReadOnly(4,7,isReadOnly=True)                            #cell volume - no edit
1646        General.SetCellEditor(1,0,wg.GridCellChoiceEditor(['nuclear','modulated',   #phase type
1647            'magnetic','macromolecular','Pawley'],False))                           #- change only if no atoms
1648        if line:                                                    #no.of atoms not zero!
1649            General.SetReadOnly(1,0,isReadOnly=True)                #can't change phase type
1650        General.SetCellRenderer(4,0,wg.GridCellBoolRenderer())              #lattice parameters           
1651        General.SetCellEditor(4,0,wg.GridCellBoolEditor())
1652        SetLatticeParametersStyle(SGData,table)
1653        General.SetCellRenderer(5,1,wg.GridCellFloatRenderer(10,4))         #scale factor
1654        General.SetCellEditor(5,1,wg.GridCellFloatEditor(10,4))
1655        General.SetCellRenderer(5,0,wg.GridCellBoolRenderer())           
1656        General.SetCellEditor(5,0,wg.GridCellBoolEditor())
1657        General.SetCellRenderer(9,1,wg.GridCellFloatRenderer(8,3))
1658        General.SetCellRenderer(9,3,wg.GridCellFloatRenderer(8,3))
1659   
1660    def FillAtomsGrid():
1661       
1662        def RefreshAtomGrid(event):
1663            r,c =  event.GetRow(),event.GetCol()
1664            if r < 0:                          #on col label!
1665                sel = -1
1666                if Atoms.GetColLabelValue(c) == 'refine':
1667                    choice = ['F - site fraction','X - coordinates','U - thermal parameters']
1668                    dlg = wx.MultiChoiceDialog(self,'Select','Refinement controls',choice)
1669                    if dlg.ShowModal() == wx.ID_OK:
1670                        sel = dlg.GetSelections()
1671                        parms = ''
1672                        for x in sel:
1673                            parms += choice[x][0]                           
1674                elif Atoms.GetColLabelValue(c) == 'I/A':
1675                    choice = ['Isotropic','Anisotropic']
1676                    dlg = wx.SingleChoiceDialog(self,'Select','Thermal Motion',choice)
1677                    if dlg.ShowModal() == wx.ID_OK:
1678                        sel = dlg.GetSelection()
1679                        parms = choice[sel][0]
1680                if sel >= 0:
1681                    for r in range(Atoms.GetNumberRows()):
1682                        Atoms.SetCellValue(r,c,parms)
1683            elif c < 0:                    #picked atom row
1684                self.SelectedRow = r
1685            elif Atoms.GetColLabelValue(c) in ['x','y','z']:
1686                colLabel = Atoms.GetColLabelValue(c)
1687                if colLabel == 'x':
1688                    XYZ = [atomData[r][c],atomData[r][c+1],atomData[r][c+2]]
1689                elif colLabel == 'y':
1690                    XYZ = [atomData[r][c-1],atomData[r][c],atomData[r][c+1]]
1691                elif colLabel == 'z':
1692                    XYZ = [atomData[r][c-2],atomData[r][c-1],atomData[r][c]]
1693                if None in XYZ:
1694                    XYZ = [0,0,0]
1695                SScol = colLabels.index('site sym')
1696                Mulcol = colLabels.index('mult')
1697                E,SGData = G2spc.SpcGroup(generalData[2]['SpGrp'])
1698                Sytsym,Mult = G2spc.SytSym(XYZ,SGData)
1699                atomData[r][SScol] = Sytsym
1700                atomData[r][Mulcol] = Mult
1701                Atoms.ForceRefresh()
1702                   
1703        def AtomTypeSelect(event):
1704            r,c =  event.GetRow(),event.GetCol()
1705            if Atoms.GetColLabelValue(c) == 'Type':
1706                PE = G2elem.PickElement(self)
1707                if PE.ShowModal() == wx.ID_OK:
1708                    atomData[r][c] = PE.Elem.strip()
1709                PE.Destroy()
1710                Atoms.ForceRefresh()
1711            else:
1712                event.Skip()
1713       
1714        generalData = data['General']
1715        atomData = data['Atoms']
1716        Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,wg.GRID_VALUE_CHOICE+": ,X,XU,U,F,FX,FXU,FU",
1717            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',
1718            wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_STRING,wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_CHOICE+":I,A",
1719            wg.GRID_VALUE_FLOAT+':10,4',
1720            wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',
1721            wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4']
1722        colLabels = ['Name','Type','refine','x','y','z','frac','site sym','mult','I/A','Uiso','U11','U22','U33','U12','U13','U23']
1723        if generalData[1] == 'magnetic':
1724            colLabels += ['Mx','My','Mz']
1725            Types[2] = wg.GRID_VALUE_CHOICE+": ,X,XU,U,M,MX,MXU,MU,F,FX,FXU,FU,FM,FMX,FMU,"
1726            Types += [
1727                wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4']
1728        elif generalData[1] == 'macromolecular':
1729            colLabels = ['res no','residue','chain'] + colLabels
1730            Types = [wg.GRID_VALUE_NUMBER,
1731                wg.GRID_VALUE_CHOICE+": ,ALA,ARG,ASN,ASP,CYS,GLN,GLU,GLY,HIS,ILE,LEU,LYS,MET,PHE,PRO,SER,THR,TRP,TYR,VAL,MSE,HOH,UNK",
1732                wg.GRID_VALUE_STRING] + Types       
1733        table = []
1734        rowLabels = []
1735        for i,atom in enumerate(atomData):
1736            table.append(atom)
1737            rowLabels.append(str(i+1))
1738        atomTable = Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1739        Atoms.SetTable(atomTable, True)
1740        Atoms.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshAtomGrid)
1741        Atoms.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, RefreshAtomGrid)
1742        Atoms.Bind(wg.EVT_GRID_SELECT_CELL, AtomTypeSelect)
1743        Atoms.SetMargins(0,0)
1744        Atoms.AutoSizeColumns(True)
1745        colType = colLabels.index('Type')
1746        colSS = colLabels.index('site sym')
1747        colIA = colLabels.index('I/A')
1748        for row in range(Atoms.GetNumberRows()):
1749            Atoms.SetReadOnly(row,colSS,True)                         #site sym
1750            Atoms.SetReadOnly(row,colSS+1,True)                       #Mult
1751            if Atoms.GetCellValue(row,colIA) == 'I':
1752                for i in range(2,8):
1753                    Atoms.SetCellRenderer(row,colIA+i,wg.GridCellStringRenderer())
1754                    Atoms.SetReadOnly(row,colIA+i,isReadOnly=True)
1755                    Atoms.SetCellValue(row,colIA+i,'')
1756            elif Atoms.GetCellValue(row,colIA) == 'A':
1757                Atoms.SetCellRenderer(row,colIA+1,wg.GridCellStringRenderer())
1758                Atoms.SetReadOnly(row,colIA+1,isReadOnly=True)
1759                Atoms.SetCellValue(row,colIA+1,'')
1760       
1761    def AtomAdd(event):
1762        atomData = data['Atoms']
1763        generalData = data['General']
1764        Ncol = Atoms.GetNumberCols()
1765        if generalData[1] == 'macromolecular':
1766            atomData.append([0,'UNK','','UNK','UNK','',0,0,0,0,'',0,'I',0.10,0,0,0,0,0,0])
1767        elif generalData[1] == 'nuclear':
1768            atomData.append(['UNK','UNK','',0,0,0,0,'',0,'I',0.01,0,0,0,0,0,0])
1769        event.StopPropagation()
1770        FillAtomsGrid()
1771           
1772    def AtomInsert(event):
1773        atomData = data['Atoms']
1774        generalData = data['General']
1775        Ncol = Atoms.GetNumberCols()
1776        if generalData[1][0] == 'macromolecular':
1777            atomData.append([0,'UNK','','UNK','UNK','',0,0,0,0,'',0,'I',0.10,0,0,0,0,0,0])
1778        elif generalData[1][0] == 'nuclear':
1779            atomData.append(['UNK','UNK','',0,0,0,0,'',0,'I',0.01,0,0,0,0,0,0])
1780        event.StopPropagation()
1781        FillAtomsGrid()
1782       
1783    def UpdateDrawing():
1784        print 'Drawing'
1785       
1786    def FillPawleyReflectionsGrid():
1787       
1788        print 'Pawley reflections'
1789       
1790    def OnPageChanged(event):
1791        page = event.GetSelection()
1792        text = self.dataDisplay.GetPageText(page)
1793        if text == 'Atoms':
1794            self.dataFrame.SetMenuBar(self.dataFrame.AtomsMenu)
1795            self.dataFrame.Bind(wx.EVT_MENU, AtomAdd, id=wxID_ATOMSEDITADD)
1796            self.dataFrame.Bind(wx.EVT_MENU, AtomInsert, id=wxID_ATOMSEDITINSERT)
1797            FillAtomsGrid()           
1798        else:
1799            self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1800        event.Skip()
1801       
1802    if self.dataDisplay:
1803        self.dataDisplay.Destroy()                   
1804    PhaseName = self.PatternTree.GetItemText(item)
1805    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1806    self.dataFrame.SetLabel('Phase Data for '+PhaseName)
1807    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
1808   
1809    General = GSGrid(parent=self.dataDisplay)
1810    FillGeneralGrid()
1811    self.dataDisplay.AddPage(General,'General')
1812     
1813    GeneralData = data['General']
1814    if GeneralData[3] == 'Pawley':
1815        PawleyRefl = GSGrid(parent=self.dataDisplay)
1816        self.dataDisplay.AddPage(PawleyRefl,'Pawley reflections')
1817        FillPawleyReflectionsGrid()
1818    else:
1819        Atoms = GSGrid(parent=self.dataDisplay)
1820        FillAtomsGrid()
1821        self.dataDisplay.AddPage(Atoms,'Atoms')
1822
1823    Drawing = wx.Window(parent=self.dataDisplay)
1824    self.dataDisplay.AddPage(Drawing,'Drawing')
1825   
1826    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
1827    self.dataDisplay.SetSelection(oldPage)
1828   
1829                         
1830def GetPatternTreeItemId(self, parentId, itemText):
1831    item, cookie = self.PatternTree.GetFirstChild(parentId)
1832    while item:
1833        if self.PatternTree.GetItemText(item) == itemText:
1834            return item
1835        item, cookie = self.PatternTree.GetNextChild(parentId, cookie)
1836    return 0               
1837
1838def MovePatternTreeToGrid(self,item):
1839   
1840    oldPage = 0
1841    if self.dataFrame:
1842        self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1843        if self.dataFrame.GetLabel() == 'Comments':
1844            data = [self.dataDisplay.GetValue()]
1845            self.dataDisplay.Clear() 
1846            Id = GetPatternTreeItemId(self,self.root, 'Comments')
1847            if Id: self.PatternTree.SetItemPyData(Id,data)
1848        if self.dataFrame.GetLabel() == 'Notebook':
1849            data = [self.dataDisplay.GetValue()]
1850            self.dataDisplay.Clear() 
1851            Id = GetPatternTreeItemId(self,self.root, 'Notebook')
1852            if Id: self.PatternTree.SetItemPyData(Id,data)
1853        if 'Phase Data for' in self.dataFrame.GetLabel():
1854            if self.dataDisplay: 
1855                oldPage = self.dataDisplay.GetSelection()
1856        self.dataFrame.Clear()
1857        self.dataFrame.SetLabel('')
1858    else:
1859       self.dataFrame = DataFrame(parent=self.mainPanel)
1860
1861    self.dataFrame.Raise()           
1862    self.PickId = 0
1863    self.PatternId = 0
1864    parentID = self.root
1865    if item != self.root:
1866        parentID = self.PatternTree.GetItemParent(item)
1867    if self.PatternTree.GetItemParent(item) == self.root:
1868        self.PatternId = item
1869        self.ExportPattern.Enable(True)
1870        self.PickId = item
1871        if self.PatternTree.GetItemText(item) == 'Notebook':
1872            self.PatternId = 0
1873            self.ExportPattern.Enable(False)
1874            data = self.PatternTree.GetItemPyData(item)
1875            UpdateNotebook(self,data)
1876        elif self.PatternTree.GetItemText(item) == 'Controls':
1877            self.PatternId = 0
1878            self.ExportPattern.Enable(False)
1879            data = self.PatternTree.GetItemPyData(item)
1880            UpdateControls(self,data)
1881        elif 'IMG' in self.PatternTree.GetItemText(item):
1882            self.Image = item
1883            self.Img = 0
1884            G2plt.PlotImage(self,newPlot=True)
1885        elif 'PKS' in self.PatternTree.GetItemText(item):
1886            G2plt.PlotPowderLines(self)
1887        elif 'PWDR' in self.PatternTree.GetItemText(item):           
1888            G2plt.PlotPatterns(self,newPlot=True)
1889        elif 'SXTL' in self.PatternTree.GetItemText(item):
1890            self.Sngl = item
1891            G2plt.PlotSngl(self,newPlot=True)
1892           
1893    elif self.PatternTree.GetItemText(parentID) == 'Phases':
1894        self.PickId = item
1895        data = self.PatternTree.GetItemPyData(item)
1896        UpdatePhaseData(self,item,data,oldPage)
1897    elif self.PatternTree.GetItemText(item) == 'Comments':
1898        self.PatternId = self.PatternTree.GetItemParent(item)
1899        self.PickId = item
1900        data = self.PatternTree.GetItemPyData(item)
1901        UpdateComments(self,data)
1902    elif self.PatternTree.GetItemText(item) == 'Image Controls':
1903        self.dataFrame.SetTitle('Image Controls')
1904        self.PickId = item
1905        self.Image = self.PatternTree.GetItemParent(item)
1906        data = self.PatternTree.GetItemPyData(item)
1907        UpdateImageControls(self,data)
1908        G2plt.PlotImage(self)
1909    elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
1910        self.PickId = item
1911        self.Sngl = self.PatternTree.GetItemParent(item)
1912        data = self.PatternTree.GetItemPyData(item)
1913        UpdateHKLControls(self,data)
1914        G2plt.PlotSngl(self)               
1915    elif self.PatternTree.GetItemText(item) == 'Peak List':
1916        self.PatternId = self.PatternTree.GetItemParent(item)
1917        self.ExportPeakList.Enable(True)
1918        self.PickId = item
1919        data = self.PatternTree.GetItemPyData(item)
1920        UpdatePeakGrid(self,data)
1921        G2plt.PlotPatterns(self)
1922    elif self.PatternTree.GetItemText(item) == 'Background':
1923        self.PatternId = self.PatternTree.GetItemParent(item)
1924        self.PickId = item
1925        data = self.PatternTree.GetItemPyData(item)
1926        UpdateBackgroundGrid(self,data)
1927        G2plt.PlotPatterns(self)
1928    elif self.PatternTree.GetItemText(item) == 'Limits':
1929        self.PatternId = self.PatternTree.GetItemParent(item)
1930        self.PickId = item
1931        data = self.PatternTree.GetItemPyData(item)
1932        UpdateLimitsGrid(self,data)
1933        G2plt.PlotPatterns(self)
1934    elif self.PatternTree.GetItemText(item) == 'Instrument Parameters':
1935        self.PatternId = self.PatternTree.GetItemParent(item)
1936        self.PickId = item
1937        data = self.PatternTree.GetItemPyData(item)
1938        UpdateInstrumentGrid(self,data)
1939        G2plt.PlotPeakWidths(self)
1940    elif self.PatternTree.GetItemText(item) == 'Index Peak List':
1941        self.PatternId = self.PatternTree.GetItemParent(item)
1942        self.ExportPeakList.Enable(True)
1943        self.PickId = item
1944        data = self.PatternTree.GetItemPyData(item)
1945        UpdateIndexPeaksGrid(self,data)
1946        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1947            G2plt.PlotPowderLines(self)
1948        else:
1949            G2plt.PlotPatterns(self)
1950    elif self.PatternTree.GetItemText(item) == 'Unit Cells List':
1951        self.PatternId = self.PatternTree.GetItemParent(item)
1952        self.PickId = item
1953        data = self.PatternTree.GetItemPyData(item)
1954        if not data:
1955            data.append([0,0.1,4,25.0,0,'P1',1,1,1,90,90,90]) #zero error flag, max zero error, max Nc/No, start volume
1956            data.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0])      #Bravais lattice flags
1957            data.append([])                                 #empty cell list
1958            data.append([])                                 #empty dmin
1959            self.PatternTree.SetItemPyData(item,data)                             
1960        UpdateUnitCellsGrid(self,data)
1961        self.dataFrame.RefineCell.Enable(True)
1962        self.dataFrame.IndexPeaks.Enable(True)
1963        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1964            G2plt.PlotPowderLines(self)
1965        else:
1966            G2plt.PlotPatterns(self)
Note: See TracBrowser for help on using the repository browser.