source: trunk/GSASIIgrid.py @ 48

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

finished ellipse fitting
finished integration range display

File size: 84.6 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            self.Lazim.SetEditable(True)           
1167            self.Razim.SetEditable(True)           
1168        else:
1169            data['fullIntegrate'] = True
1170            self.Lazim.SetEditable(False)           
1171            self.Razim.SetEditable(False)           
1172        G2plt.PlotImage(self)
1173       
1174    def OnSetDefault(event):
1175        import copy
1176        if data['setDefault']:
1177            self.imageDefault = {}
1178            data['setDefault'] = False
1179        else:
1180            self.imageDefault = copy.copy(data)
1181            data['setDefault'] = True
1182           
1183    def OnIOtth(event):
1184        Ltth = float(self.InnerTth.GetValue())
1185        Utth = float(self.OuterTth.GetValue())
1186        if Ltth > Utth:
1187            G2cmp.SwapXY(Ltth,Utth)
1188        data['IOtth'] = [Ltth,Utth]
1189        self.InnerTth.SetValue("%8.2f" % (Ltth))
1190        self.OuterTth.SetValue("%8.2f" % (Utth))
1191        G2plt.PlotImage(self)
1192       
1193    def OnLRazim(event):
1194        Lazm = int(self.Lazim.GetValue())
1195        Razm = int(self.Razim.GetValue())
1196#        if Lazm > Razm:
1197#            G2cmp.SwapXY(Lazm,Razm)
1198        data['LRazimuth'] = [Lazm,Razm]
1199        G2plt.PlotImage(self)
1200           
1201    def OnSetRings(event):
1202        if data['setRings']:
1203            data['setRings'] = False
1204        else:
1205            data['setRings'] = True
1206        setRings.SetValue(data['setRings'])
1207        G2plt.PlotImage(self)
1208           
1209    def OnClearCalib(event):
1210        data['ring'] = []
1211        data['rings'] = []
1212        data['ellipses'] = []
1213        G2plt.PlotImage(self)
1214           
1215    def OnCalibrate(event):       
1216        data['setRings'] = False
1217        setRings.SetValue(data['setRings'])
1218        msg = \
1219        '''Select > 4 points on inner ring of image pattern.
1220        Click right mouse button to select point.
1221          Use left mouse button to delete point.
1222                 Press OK when done'''
1223        dlg = wx.MessageDialog(self,msg,'Pick inner ring',wx.OK)
1224        self.ifGetRing = True
1225        dlg.ShowModal()
1226        self.ifGetRing = False
1227       
1228        if G2cmp.ImageCalibrate(self,data):
1229            Status.SetStatusText('Calibration successful')
1230            cent = data['center']
1231            centText.SetValue(("%8.3f,%8.3f" % (cent[0],cent[1])))
1232            distSel.SetValue("%8.3f"%(data['distance']))
1233            tiltSel.SetValue("%9.3f"%(data['tilt']))           
1234            rotSel.SetValue("%9.3f"%(data['rotation']))
1235        else:
1236            Status.SetStatusText('Calibration failed')
1237                   
1238    def OnIntegrate(event):
1239        print 'image integrate'
1240       
1241    colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
1242    calList = [m for m in calFile.Calibrants.keys()]
1243    if self.dataDisplay:
1244        self.dataDisplay.Destroy()
1245    self.dataFrame.SetMenuBar(self.dataFrame.ImageMenu)
1246    Status = self.dataFrame.CreateStatusBar()
1247    self.dataFrame.Bind(wx.EVT_MENU, OnCalibrate, id=wxID_IMCALIBRATE)
1248    self.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=wxID_IMCLEARCALIB)   
1249    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=wxID_IMINTEGRATE)       
1250    self.dataDisplay = wx.Panel(self.dataFrame)
1251    mainSizer = wx.BoxSizer(wx.VERTICAL)
1252    mainSizer.Add((5,10),0)
1253   
1254    maxSizer = wx.FlexGridSizer(2,2,0,5)
1255    maxSizer.AddGrowableCol(1,1)
1256    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max intensity'),0,
1257        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1258    maxSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
1259        value=int(100*data['range'][1][1]/(data['range'][0][1]-data['range'][0][0])))
1260    maxSizer.Add(maxSel,1,wx.EXPAND|wx.RIGHT)
1261    maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)   
1262    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min intensity'),0,
1263        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1264    minSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
1265        value=int(100*data['range'][1][0]/(data['range'][1][1]-data['range'][0][0])))
1266    maxSizer.Add(minSel,1,wx.EXPAND|wx.RIGHT)
1267    minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
1268    mainSizer.Add(maxSizer,1,wx.EXPAND|wx.RIGHT)
1269   
1270    comboSizer = wx.BoxSizer(wx.HORIZONTAL)
1271    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Color bar '),0,
1272        wx.ALIGN_CENTER_VERTICAL)
1273    colSel = wx.ComboBox(parent=self.dataDisplay,value=data['color'],choices=colorList,
1274        style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
1275    colSel.Bind(wx.EVT_COMBOBOX, OnNewColorBar)
1276    comboSizer.Add(colSel,0,wx.ALIGN_CENTER_VERTICAL)
1277   
1278    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibrant '),0,
1279        wx.ALIGN_CENTER_VERTICAL)
1280    calSel = wx.ComboBox(parent=self.dataDisplay,value=data['calibrant'],choices=calList,
1281        style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
1282    calSel.Bind(wx.EVT_COMBOBOX, OnNewCalibrant)
1283    comboSizer.Add(calSel,0,wx.ALIGN_CENTER_VERTICAL)
1284    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Pixel search range '),0,
1285        wx.ALIGN_CENTER_VERTICAL)
1286    pixLimit = wx.ComboBox(parent=self.dataDisplay,value=str(data['pixLimit']),choices=['5','10','15','20'],
1287        style=wx.CB_READONLY|wx.CB_DROPDOWN)
1288    pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)
1289    comboSizer.Add(pixLimit,0,wx.ALIGN_CENTER_VERTICAL)
1290    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min ring I/Ib '),0,
1291        wx.ALIGN_CENTER_VERTICAL)
1292    cutOff = wx.TextCtrl(parent=self.dataDisplay,value=("%.1f" % (data['cutoff'])),
1293        style=wx.TE_PROCESS_ENTER)
1294    cutOff.Bind(wx.EVT_TEXT_ENTER,OnCutOff)
1295    comboSizer.Add(cutOff,0,wx.ALIGN_CENTER_VERTICAL)
1296
1297    mainSizer.Add(comboSizer,0,wx.ALIGN_CENTER_HORIZONTAL)
1298    mainSizer.Add((5,5),0)
1299         
1300    dataSizer = wx.FlexGridSizer(6,4,5,5)
1301    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibration coefficients'),0,
1302        wx.ALIGN_CENTER_VERTICAL)   
1303    dataSizer.Add((5,0),0)
1304    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Integration coefficients'),0,
1305        wx.ALIGN_CENTER_VERTICAL)   
1306    dataSizer.Add((5,0),0)
1307   
1308    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Beam center X,Y'),0,
1309        wx.ALIGN_CENTER_VERTICAL)
1310    cent = data['center']
1311    centText = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f,%8.3f" % (cent[0],cent[1])),style=wx.TE_READONLY)
1312    dataSizer.Add(centText,0,wx.ALIGN_CENTER_VERTICAL)
1313   
1314    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Inner/Outer 2-theta'),0,
1315        wx.ALIGN_CENTER_VERTICAL)
1316    if 'IOtth' not in data:                 #temporary fix
1317        del data['IOradii']
1318        data['IOtth'] = [2.0,5.0]
1319    IOtth = data['IOtth']
1320    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
1321    self.InnerTth = wx.TextCtrl(parent=self.dataDisplay,
1322        value=("%8.2f" % (IOtth[0])),style=wx.TE_PROCESS_ENTER)
1323    self.InnerTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
1324    littleSizer.Add(self.InnerTth,0,wx.ALIGN_CENTER_VERTICAL)
1325    self.OuterTth = wx.TextCtrl(parent=self.dataDisplay,
1326        value=("%8.2f" % (IOtth[1])),style=wx.TE_PROCESS_ENTER)
1327    self.OuterTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
1328    littleSizer.Add(self.OuterTth,0,wx.ALIGN_CENTER_VERTICAL)
1329    dataSizer.Add(littleSizer,0,)
1330       
1331    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Wavelength'),0,
1332        wx.ALIGN_CENTER_VERTICAL)
1333    waveSel = wx.TextCtrl(parent=self.dataDisplay,value=("%6.5f" % (data['wavelength'])),
1334        style=wx.TE_PROCESS_ENTER)
1335    waveSel.Bind(wx.EVT_TEXT_ENTER,OnWavelength)
1336    dataSizer.Add(waveSel,0,wx.ALIGN_CENTER_VERTICAL)
1337         
1338    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start/End azimuth'),0,
1339        wx.ALIGN_CENTER_VERTICAL)
1340    LRazim = data['LRazimuth']
1341    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
1342    self.Lazim = wx.TextCtrl(parent=self.dataDisplay,
1343        value=("%6d" % (LRazim[0])),style=wx.TE_PROCESS_ENTER)
1344    self.Lazim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
1345    littleSizer.Add(self.Lazim,0,wx.ALIGN_CENTER_VERTICAL)
1346    self.Razim = wx.TextCtrl(parent=self.dataDisplay,
1347        value=("%6d" % (LRazim[1])),style=wx.TE_PROCESS_ENTER)
1348    self.Razim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
1349    littleSizer.Add(self.Razim,0,wx.ALIGN_CENTER_VERTICAL)
1350    dataSizer.Add(littleSizer,0,)
1351       
1352    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Distance'),0,
1353        wx.ALIGN_CENTER_VERTICAL)
1354    distSel = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f"%(data['distance'])),style=wx.TE_READONLY)
1355    dataSizer.Add(distSel,0,wx.ALIGN_CENTER_VERTICAL)
1356
1357    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' No. bins'),0,
1358        wx.ALIGN_CENTER_VERTICAL)
1359    outChan = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)
1360    outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)
1361    dataSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)
1362
1363    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt angle'),0,
1364        wx.ALIGN_CENTER_VERTICAL)
1365    tiltSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['tilt'])),style=wx.TE_READONLY)
1366    dataSizer.Add(tiltSel,0,wx.ALIGN_CENTER_VERTICAL)
1367    showLines = wx.CheckBox(parent=self.dataDisplay,label='Show integration limits?')
1368    dataSizer.Add(showLines,0)
1369    showLines.Bind(wx.EVT_CHECKBOX, OnShowLines)
1370    showLines.SetValue(data['showLines'])
1371    fullIntegrate = wx.CheckBox(parent=self.dataDisplay,label='Do full integration?')
1372    dataSizer.Add(fullIntegrate,0)
1373    fullIntegrate.Bind(wx.EVT_CHECKBOX, OnFullIntegrate)
1374    fullIntegrate.SetValue(data['fullIntegrate'])
1375   
1376    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt rotation'),0,
1377        wx.ALIGN_CENTER_VERTICAL)
1378    rotSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['rotation'])),style=wx.TE_READONLY)
1379    dataSizer.Add(rotSel,0,wx.ALIGN_CENTER_VERTICAL)
1380    setDefault = wx.CheckBox(parent=self.dataDisplay,label='Use as default for all images?')
1381    dataSizer.Add(setDefault,0)
1382    setDefault.Bind(wx.EVT_CHECKBOX, OnSetDefault)
1383    setDefault.SetValue(data['setDefault'])
1384    setRings = wx.CheckBox(parent=self.dataDisplay,label='Show ring picks?')
1385    dataSizer.Add(setRings,0)
1386    setRings.Bind(wx.EVT_CHECKBOX, OnSetRings)
1387    setRings.SetValue(data['setRings'])
1388       
1389    mainSizer.Add(dataSizer,0)
1390   
1391    mainSizer.Layout()   
1392    self.dataDisplay.SetSizer(mainSizer)
1393    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
1394    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
1395   
1396def UpdatePhaseData(self,item,data,oldPage):
1397    import GSASIIElem as G2el
1398    Atoms = []
1399    self.SelectedRow = 0
1400   
1401    def BookResize(event):
1402        w,h = self.GetSize()
1403        self.dataDisplay.SetSize(wx.Size(w,h))
1404       
1405    def FillGeneralGrid():
1406        def SetLatticeParametersStyle(SGData,table):
1407            if SGData['SGLaue'] in ['m3','m3m']:
1408                table[4][2] = table[4][3] = table[4][1]
1409                General.SetCellStyle(4,2,"light grey",True)
1410                General.SetCellStyle(4,3,"light grey",True)
1411                table[4][4] = table[4][5] = table[4][6] = 90.
1412                General.SetCellStyle(4,4,"light grey",True)
1413                General.SetCellStyle(4,5,"light grey",True)
1414                General.SetCellStyle(4,6,"light grey",True)
1415            elif SGData['SGLaue'] in ['3R','3mR']:
1416                table[4][2] = table[4][3] = table[4][1]
1417                General.SetCellStyle(4,2,"light grey",True)
1418                General.SetCellStyle(4,3,"light grey",True)
1419                table[4][5] = table[4][6] = table[4][4]
1420                General.SetCellStyle(4,5,"light grey",True)
1421                General.SetCellStyle(4,6,"light grey",True)
1422            elif SGData['SGLaue'] in ['3','3m1','31m','6/m','6/mmm']:
1423                table[4][2] = table[4][1]
1424                General.SetCellStyle(4,2,"light grey",True)
1425                table[4][4] = table[4][5] = 90.
1426                table[4][6] = 120.
1427                General.SetCellStyle(4,4,"light grey",True)
1428                General.SetCellStyle(4,5,"light grey",True)
1429                General.SetCellStyle(4,6,"light grey",True)
1430            elif SGData['SGLaue'] in ['4/m','4/mmm']:
1431                table[4][2] = table[4][1]
1432                General.SetCellStyle(4,2,"light grey",True)
1433                table[4][4] = table[4][5] = table[4][6] = 90.
1434                General.SetCellStyle(4,4,"light grey",True)
1435                General.SetCellStyle(4,5,"light grey",True)
1436                General.SetCellStyle(4,6,"light grey",True)
1437            elif SGData['SGLaue'] in ['mmm']:
1438                table[4][4] = table[4][5] = table[4][6] = 90.
1439                General.SetCellStyle(4,4,"light grey",True)
1440                General.SetCellStyle(4,5,"light grey",True)
1441                General.SetCellStyle(4,6,"light grey",True)
1442            elif SGData['SGLaue'] in ['2/m']:
1443                if SGData['SGUniq'] == 'a':
1444                    table[4][5]= table[4][6] = 90.
1445                    General.SetCellStyle(4,5,"light grey",True)
1446                    General.SetCellStyle(4,6,"light grey",True)
1447                if SGData['SGUniq'] == 'b':
1448                    table[4][4]= table[4][6] = 90.
1449                    General.SetCellStyle(4,4,"light grey",True)
1450                    General.SetCellStyle(4,6,"light grey",True)
1451                if SGData['SGUniq'] == 'c':
1452                    table[4][4]= table[4][5] = 90.
1453                    General.SetCellStyle(4,4,"light grey",True)
1454                    General.SetCellStyle(4,5,"light grey",True)
1455           
1456        def RefreshGeneralGrid(event):
1457               
1458            r,c =  event.GetRow(),event.GetCol()
1459            generalData[0] = table[0][0]
1460            self.PatternTree.SetItemText(item,generalData[0])
1461            generalData[1] = table[1][0]
1462            SpcGp = table[2][0]
1463            SGErr,SGData = G2spc.SpcGroup(SpcGp)
1464            if r == 2 and c == 0:
1465                if SGErr:
1466                    text = [G2spc.SGErrors(SGErr)+'\nSpace Group set to previous']
1467                    table[2][0] = generalData[2]['SpGrp']
1468                    msg = 'Space Group Error'
1469                    Style = wx.ICON_EXCLAMATION
1470                else:
1471                    text = G2spc.SGPrint(SGData)
1472                    generalData[2] = SGData
1473                    msg = 'Space Group Information'
1474                    Style = wx.ICON_INFORMATION
1475                Text = ''
1476                for line in text:
1477                    Text += line+'\n'
1478                wx.MessageBox(Text,caption=msg,style=Style)
1479            General.SetCellValue(4,0,str(generalData[3][0]))
1480            for c in range(1,7):
1481                General.SetCellStyle(4,c,"white",False)
1482                generalData[3][c] = float(General.GetCellValue(4,c))
1483            generalData[3][7] = G2cmp.calc_V(G2cmp.cell2A(generalData[3][1:7]))
1484            SetLatticeParametersStyle(SGData,table)
1485            generalData[4][1] = float(General.GetCellValue(5,1))
1486            General.ForceRefresh()
1487                       
1488        rowLabels = ['Phase name','Phase type','Space group',
1489            'Lattice ',' parameters','Scale factor','Elements','No. per cell','Atom weight','','Bond radii','Angle radii']
1490        generalData = data['General']
1491        atomData = data['Atoms']
1492        AtomTypes = []
1493        NoAtoms = {}
1494        BondRadii = []
1495        AngleRadii = []
1496        AtomMass = []
1497        colType = 1
1498        colSS = 7
1499        self.dataFrame.setSizePosLeft([600,350])
1500        if generalData[1] =='macromolecular':
1501            colType = 4
1502            colSS = 10
1503        for atom in atomData:
1504            if AtomTypes.count(atom[colType]):
1505                NoAtoms[atom[colType]] += atom[colSS-1]*atom[colSS+1]
1506            else:
1507                Info = G2el.GetAtomInfo(atom[colType])
1508                AtomTypes.append(Info['Symbol'])
1509                BondRadii.append(Info['Drad'])
1510                AngleRadii.append(Info['Arad'])
1511                AtomMass.append(Info['Mass'])
1512                NoAtoms[atom[colType]] = atom[colSS-1]*atom[colSS+1]
1513        generalData[5:9] = [AtomTypes,NoAtoms,AtomMass,BondRadii,AngleRadii]
1514        colLabels = []
1515        colLabels += ['' for i in range(max(8,len(generalData[5])))]
1516        table = []
1517        table.append([generalData[0],'','','','','','','',''])      #phase name
1518        table.append([generalData[1],'','','','','','','',''])      #phase type
1519        E,SGData = G2spc.SpcGroup(generalData[2]['SpGrp'])
1520        table.append([SGData['SpGrp'],'','','','','','','',''])     #space group symbol
1521        table.append(['refine','a    ','b    ','c    ','alpha ','beta ','gamma','volume  '])
1522        table.append(generalData[3])                      #lattice parameters
1523        table.append([generalData[4][0],generalData[4][1],'','','','','',''])   #scale factor
1524        table.append(generalData[5]+['' for i in range(max(8,len(generalData[5])))]) #element list
1525        line = []
1526        mass = 0.
1527        for i,elem in enumerate(generalData[5]):
1528            mass += generalData[6][elem]*generalData[7][i]
1529            line.append(generalData[6][elem])
1530        Volume = generalData[3][7]
1531        table.append(line+['' for i in range(max(8,len(generalData[5])))]) #No. per cell
1532        table.append(generalData[7]+['' for i in range(max(8,len(generalData[5])))])  #At. wt.
1533        if generalData[1] == 'macromolecular' and mass > 0.0:
1534            table.append(['density',mass/(0.6022137*Volume),'Matthews coeff.',Volume/mass,'','','','',''])           
1535        else:
1536            table.append(['density',mass/(0.6022137*Volume),'','','','','','',''])
1537        table.append(generalData[8]+['' for i in range(max(8,len(generalData[5])))])
1538        table.append(generalData[9]+['' for i in range(max(8,len(generalData[5])))])
1539        Types = [wg.GRID_VALUE_STRING for i in range(max(8,len(generalData[5])))]
1540        generalTable = Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1541        General.SetTable(generalTable, True)
1542        General.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshGeneralGrid)
1543        General.SetMargins(0,0)
1544        General.SetColSize(0,100)
1545        General.SetColLabelSize(0)
1546        for c in range(max(8,len(generalData[5]))):
1547            if c > 0:
1548                General.SetReadOnly(0,c,isReadOnly=True)
1549                General.SetReadOnly(1,c,isReadOnly=True)
1550                General.SetReadOnly(2,c,isReadOnly=True)
1551            General.SetReadOnly(3,c,isReadOnly=True)                         #unit cell labels
1552            General.SetCellAlignment(3,c,wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
1553            if c < 4:
1554                General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,5))
1555                General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,5))
1556                General.SetReadOnly(9,c,isReadOnly=True)
1557            else:
1558                General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,3))
1559                General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,3))
1560            for r in range(6,12):
1561                General.SetReadOnly(r,c,isReadOnly=True)
1562        General.SetReadOnly(4,7,isReadOnly=True)                            #cell volume - no edit
1563        General.SetCellEditor(1,0,wg.GridCellChoiceEditor(['nuclear','modulated',   #phase type
1564            'magnetic','macromolecular','Pawley'],False))                           #- change only if no atoms
1565        if line:                                                    #no.of atoms not zero!
1566            General.SetReadOnly(1,0,isReadOnly=True)                #can't change phase type
1567        General.SetCellRenderer(4,0,wg.GridCellBoolRenderer())              #lattice parameters           
1568        General.SetCellEditor(4,0,wg.GridCellBoolEditor())
1569        SetLatticeParametersStyle(SGData,table)
1570        General.SetCellRenderer(5,1,wg.GridCellFloatRenderer(10,4))         #scale factor
1571        General.SetCellEditor(5,1,wg.GridCellFloatEditor(10,4))
1572        General.SetCellRenderer(5,0,wg.GridCellBoolRenderer())           
1573        General.SetCellEditor(5,0,wg.GridCellBoolEditor())
1574        General.SetCellRenderer(9,1,wg.GridCellFloatRenderer(8,3))
1575        General.SetCellRenderer(9,3,wg.GridCellFloatRenderer(8,3))
1576   
1577    def FillAtomsGrid():
1578       
1579        def RefreshAtomGrid(event):
1580            r,c =  event.GetRow(),event.GetCol()
1581            if r < 0:                          #on col label!
1582                sel = -1
1583                if Atoms.GetColLabelValue(c) == 'refine':
1584                    choice = ['F - site fraction','X - coordinates','U - thermal parameters']
1585                    dlg = wx.MultiChoiceDialog(self,'Select','Refinement controls',choice)
1586                    if dlg.ShowModal() == wx.ID_OK:
1587                        sel = dlg.GetSelections()
1588                        parms = ''
1589                        for x in sel:
1590                            parms += choice[x][0]                           
1591                elif Atoms.GetColLabelValue(c) == 'I/A':
1592                    choice = ['Isotropic','Anisotropic']
1593                    dlg = wx.SingleChoiceDialog(self,'Select','Thermal Motion',choice)
1594                    if dlg.ShowModal() == wx.ID_OK:
1595                        sel = dlg.GetSelection()
1596                        parms = choice[sel][0]
1597                if sel >= 0:
1598                    for r in range(Atoms.GetNumberRows()):
1599                        Atoms.SetCellValue(r,c,parms)
1600            elif c < 0:                    #picked atom row
1601                self.SelectedRow = r
1602            elif Atoms.GetColLabelValue(c) in ['x','y','z']:
1603                colLabel = Atoms.GetColLabelValue(c)
1604                if colLabel == 'x':
1605                    XYZ = [atomData[r][c],atomData[r][c+1],atomData[r][c+2]]
1606                elif colLabel == 'y':
1607                    XYZ = [atomData[r][c-1],atomData[r][c],atomData[r][c+1]]
1608                elif colLabel == 'z':
1609                    XYZ = [atomData[r][c-2],atomData[r][c-1],atomData[r][c]]
1610                if None in XYZ:
1611                    XYZ = [0,0,0]
1612                SScol = colLabels.index('site sym')
1613                Mulcol = colLabels.index('mult')
1614                E,SGData = G2spc.SpcGroup(generalData[2]['SpGrp'])
1615                Sytsym,Mult = G2spc.SytSym(XYZ,SGData)
1616                atomData[r][SScol] = Sytsym
1617                atomData[r][Mulcol] = Mult
1618                Atoms.ForceRefresh()
1619                   
1620        def AtomTypeSelect(event):
1621            r,c =  event.GetRow(),event.GetCol()
1622            if Atoms.GetColLabelValue(c) == 'Type':
1623                PE = G2elem.PickElement(self)
1624                if PE.ShowModal() == wx.ID_OK:
1625                    atomData[r][c] = PE.Elem.strip()
1626                PE.Destroy()
1627                Atoms.ForceRefresh()
1628            else:
1629                event.Skip()
1630       
1631        generalData = data['General']
1632        atomData = data['Atoms']
1633        Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,wg.GRID_VALUE_CHOICE+": ,X,XU,U,F,FX,FXU,FU",
1634            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',
1635            wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_STRING,wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_CHOICE+":I,A",
1636            wg.GRID_VALUE_FLOAT+':10,4',
1637            wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',
1638            wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4']
1639        colLabels = ['Name','Type','refine','x','y','z','frac','site sym','mult','I/A','Uiso','U11','U22','U33','U12','U13','U23']
1640        if generalData[1] == 'magnetic':
1641            colLabels += ['Mx','My','Mz']
1642            Types[2] = wg.GRID_VALUE_CHOICE+": ,X,XU,U,M,MX,MXU,MU,F,FX,FXU,FU,FM,FMX,FMU,"
1643            Types += [
1644                wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4']
1645        elif generalData[1] == 'macromolecular':
1646            colLabels = ['res no','residue','chain'] + colLabels
1647            Types = [wg.GRID_VALUE_NUMBER,
1648                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",
1649                wg.GRID_VALUE_STRING] + Types       
1650        table = []
1651        rowLabels = []
1652        for i,atom in enumerate(atomData):
1653            table.append(atom)
1654            rowLabels.append(str(i+1))
1655        atomTable = Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1656        Atoms.SetTable(atomTable, True)
1657        Atoms.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshAtomGrid)
1658        Atoms.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, RefreshAtomGrid)
1659        Atoms.Bind(wg.EVT_GRID_SELECT_CELL, AtomTypeSelect)
1660        Atoms.SetMargins(0,0)
1661        Atoms.AutoSizeColumns(True)
1662        colType = colLabels.index('Type')
1663        colSS = colLabels.index('site sym')
1664        colIA = colLabels.index('I/A')
1665        for row in range(Atoms.GetNumberRows()):
1666            Atoms.SetReadOnly(row,colSS,True)                         #site sym
1667            Atoms.SetReadOnly(row,colSS+1,True)                       #Mult
1668            if Atoms.GetCellValue(row,colIA) == 'I':
1669                for i in range(2,8):
1670                    Atoms.SetCellRenderer(row,colIA+i,wg.GridCellStringRenderer())
1671                    Atoms.SetReadOnly(row,colIA+i,isReadOnly=True)
1672                    Atoms.SetCellValue(row,colIA+i,'')
1673            elif Atoms.GetCellValue(row,colIA) == 'A':
1674                Atoms.SetCellRenderer(row,colIA+1,wg.GridCellStringRenderer())
1675                Atoms.SetReadOnly(row,colIA+1,isReadOnly=True)
1676                Atoms.SetCellValue(row,colIA+1,'')
1677       
1678    def AtomAdd(event):
1679        atomData = data['Atoms']
1680        generalData = data['General']
1681        Ncol = Atoms.GetNumberCols()
1682        if generalData[1] == 'macromolecular':
1683            atomData.append([0,'UNK','','UNK','UNK','',0,0,0,0,'',0,'I',0.10,0,0,0,0,0,0])
1684        elif generalData[1] == 'nuclear':
1685            atomData.append(['UNK','UNK','',0,0,0,0,'',0,'I',0.01,0,0,0,0,0,0])
1686        event.StopPropagation()
1687        FillAtomsGrid()
1688           
1689    def AtomInsert(event):
1690        atomData = data['Atoms']
1691        generalData = data['General']
1692        Ncol = Atoms.GetNumberCols()
1693        if generalData[1][0] == 'macromolecular':
1694            atomData.append([0,'UNK','','UNK','UNK','',0,0,0,0,'',0,'I',0.10,0,0,0,0,0,0])
1695        elif generalData[1][0] == 'nuclear':
1696            atomData.append(['UNK','UNK','',0,0,0,0,'',0,'I',0.01,0,0,0,0,0,0])
1697        event.StopPropagation()
1698        FillAtomsGrid()
1699       
1700    def UpdateDrawing():
1701        print 'Drawing'
1702       
1703    def FillPawleyReflectionsGrid():
1704       
1705        print 'Pawley reflections'
1706       
1707    def OnPageChanged(event):
1708        page = event.GetSelection()
1709        text = self.dataDisplay.GetPageText(page)
1710        if text == 'Atoms':
1711            self.dataFrame.SetMenuBar(self.dataFrame.AtomsMenu)
1712            self.dataFrame.Bind(wx.EVT_MENU, AtomAdd, id=wxID_ATOMSEDITADD)
1713            self.dataFrame.Bind(wx.EVT_MENU, AtomInsert, id=wxID_ATOMSEDITINSERT)
1714            FillAtomsGrid()           
1715        else:
1716            self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1717        event.Skip()
1718       
1719    if self.dataDisplay:
1720        self.dataDisplay.Destroy()                   
1721    PhaseName = self.PatternTree.GetItemText(item)
1722    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1723    self.dataFrame.SetLabel('Phase Data for '+PhaseName)
1724    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
1725   
1726    General = GSGrid(parent=self.dataDisplay)
1727    FillGeneralGrid()
1728    self.dataDisplay.AddPage(General,'General')
1729     
1730    GeneralData = data['General']
1731    if GeneralData[3] == 'Pawley':
1732        PawleyRefl = GSGrid(parent=self.dataDisplay)
1733        self.dataDisplay.AddPage(PawleyRefl,'Pawley reflections')
1734        FillPawleyReflectionsGrid()
1735    else:
1736        Atoms = GSGrid(parent=self.dataDisplay)
1737        FillAtomsGrid()
1738        self.dataDisplay.AddPage(Atoms,'Atoms')
1739
1740    Drawing = wx.Window(parent=self.dataDisplay)
1741    self.dataDisplay.AddPage(Drawing,'Drawing')
1742   
1743    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
1744    self.dataDisplay.SetSelection(oldPage)
1745   
1746                         
1747def GetPatternTreeItemId(self, parentId, itemText):
1748    item, cookie = self.PatternTree.GetFirstChild(parentId)
1749    while item:
1750        if self.PatternTree.GetItemText(item) == itemText:
1751            return item
1752        item, cookie = self.PatternTree.GetNextChild(parentId, cookie)
1753    return 0               
1754
1755def MovePatternTreeToGrid(self,item):
1756   
1757    oldPage = 0
1758    if self.dataFrame:
1759        self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1760        if self.dataFrame.GetLabel() == 'Comments':
1761            data = [self.dataDisplay.GetValue()]
1762            self.dataDisplay.Clear() 
1763            Id = GetPatternTreeItemId(self,self.root, 'Comments')
1764            if Id: self.PatternTree.SetItemPyData(Id,data)
1765        if self.dataFrame.GetLabel() == 'Notebook':
1766            data = [self.dataDisplay.GetValue()]
1767            self.dataDisplay.Clear() 
1768            Id = GetPatternTreeItemId(self,self.root, 'Notebook')
1769            if Id: self.PatternTree.SetItemPyData(Id,data)
1770        if 'Phase Data for' in self.dataFrame.GetLabel():
1771            if self.dataDisplay: 
1772                oldPage = self.dataDisplay.GetSelection()
1773        self.dataFrame.Clear()
1774        self.dataFrame.SetLabel('')
1775    else:
1776       self.dataFrame = DataFrame(parent=self.mainPanel)
1777
1778    self.dataFrame.Raise()           
1779    self.PickId = 0
1780    self.PatternId = 0
1781    parentID = self.root
1782    if item != self.root:
1783        parentID = self.PatternTree.GetItemParent(item)
1784    if self.PatternTree.GetItemParent(item) == self.root:
1785        self.PatternId = item
1786        self.ExportPattern.Enable(True)
1787        self.PickId = item
1788        if self.PatternTree.GetItemText(item) == 'Notebook':
1789            self.PatternId = 0
1790            self.ExportPattern.Enable(False)
1791            data = self.PatternTree.GetItemPyData(item)
1792            UpdateNotebook(self,data)
1793        elif self.PatternTree.GetItemText(item) == 'Controls':
1794            self.PatternId = 0
1795            self.ExportPattern.Enable(False)
1796            data = self.PatternTree.GetItemPyData(item)
1797            UpdateControls(self,data)
1798        elif 'IMG' in self.PatternTree.GetItemText(item):
1799            self.Image = item
1800            self.Img = 0
1801            G2plt.PlotImage(self)
1802        elif 'PKS' in self.PatternTree.GetItemText(item):
1803            G2plt.PlotPowderLines(self)
1804        elif 'PWDR' in self.PatternTree.GetItemText(item):
1805            G2plt.PlotPatterns(self)
1806        elif 'SXTL' in self.PatternTree.GetItemText(item):
1807            self.Sngl = item
1808            G2plt.PlotSngl(self)
1809           
1810    elif self.PatternTree.GetItemText(parentID) == 'Phases':
1811        self.PickId = item
1812        data = self.PatternTree.GetItemPyData(item)
1813        UpdatePhaseData(self,item,data,oldPage)
1814    elif self.PatternTree.GetItemText(item) == 'Comments':
1815        self.PatternId = self.PatternTree.GetItemParent(item)
1816        self.PickId = item
1817        data = self.PatternTree.GetItemPyData(item)
1818        UpdateComments(self,data)
1819    elif self.PatternTree.GetItemText(item) == 'Image Controls':
1820        self.dataFrame.SetTitle('Image Controls')
1821        self.PickId = item
1822        self.Image = self.PatternTree.GetItemParent(item)
1823        data = self.PatternTree.GetItemPyData(item)
1824        UpdateImageControls(self,data)
1825        G2plt.PlotImage(self)
1826    elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
1827        self.PickId = item
1828        self.Sngl = self.PatternTree.GetItemParent(item)
1829        data = self.PatternTree.GetItemPyData(item)
1830        UpdateHKLControls(self,data)
1831        G2plt.PlotSngl(self)               
1832    elif self.PatternTree.GetItemText(item) == 'Peak List':
1833        self.PatternId = self.PatternTree.GetItemParent(item)
1834        self.ExportPeakList.Enable(True)
1835        self.PickId = item
1836        data = self.PatternTree.GetItemPyData(item)
1837        UpdatePeakGrid(self,data)
1838        G2plt.PlotPatterns(self)
1839    elif self.PatternTree.GetItemText(item) == 'Background':
1840        self.PatternId = self.PatternTree.GetItemParent(item)
1841        self.PickId = item
1842        data = self.PatternTree.GetItemPyData(item)
1843        UpdateBackgroundGrid(self,data)
1844        G2plt.PlotPatterns(self)
1845    elif self.PatternTree.GetItemText(item) == 'Limits':
1846        self.PatternId = self.PatternTree.GetItemParent(item)
1847        self.PickId = item
1848        data = self.PatternTree.GetItemPyData(item)
1849        UpdateLimitsGrid(self,data)
1850        G2plt.PlotPatterns(self)
1851    elif self.PatternTree.GetItemText(item) == 'Instrument Parameters':
1852        self.PatternId = self.PatternTree.GetItemParent(item)
1853        self.PickId = item
1854        data = self.PatternTree.GetItemPyData(item)
1855        UpdateInstrumentGrid(self,data)
1856        G2plt.PlotPeakWidths(self)
1857    elif self.PatternTree.GetItemText(item) == 'Index Peak List':
1858        self.PatternId = self.PatternTree.GetItemParent(item)
1859        self.ExportPeakList.Enable(True)
1860        self.PickId = item
1861        data = self.PatternTree.GetItemPyData(item)
1862        UpdateIndexPeaksGrid(self,data)
1863        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1864            G2plt.PlotPowderLines(self)
1865        else:
1866            G2plt.PlotPatterns(self)
1867    elif self.PatternTree.GetItemText(item) == 'Unit Cells List':
1868        self.PatternId = self.PatternTree.GetItemParent(item)
1869        self.PickId = item
1870        data = self.PatternTree.GetItemPyData(item)
1871        if not data:
1872            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
1873            data.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0])      #Bravais lattice flags
1874            data.append([])                                 #empty cell list
1875            data.append([])                                 #empty dmin
1876            self.PatternTree.SetItemPyData(item,data)                             
1877        UpdateUnitCellsGrid(self,data)
1878        self.dataFrame.RefineCell.Enable(True)
1879        self.dataFrame.IndexPeaks.Enable(True)
1880        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1881            G2plt.PlotPowderLines(self)
1882        else:
1883            G2plt.PlotPatterns(self)
Note: See TracBrowser for help on using the repository browser.