source: trunk/GSASIIgrid.py @ 43

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

added ellipse fitting & mods for new plot module

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