source: trunk/GSASIIgrid.py @ 11

Last change on this file since 11 was 11, checked in by vondreel, 12 years ago
File size: 66.1 KB
Line 
1#GSASII - data display routines
2import wx
3import wx.grid as wg
4import matplotlib as mpl
5import math
6import time
7import GSASIIcomp as G2cmp
8import GSASIIspc as G2spc
9import GSASIIElem as G2elem
10
11# trig functions in degrees
12sind = lambda x: math.sin(x*math.pi/180.)
13tand = lambda x: math.tan(x*math.pi/180.)
14cosd = lambda x: math.cos(x*math.pi/180.)
15asind = lambda x: 180.*math.asin(x)/math.pi
16       
17[ wxID_ATOMSEDITADD, wxID_ATOMSEDITINSERT, 
18] = [wx.NewId() for _init_coll_Atom_Items in range(2)]
19
20[ wxID_IMCALIBRATE, wxID_IMINTEGRATE, 
21] = [wx.NewId() for _init_coll_IMAGE_Items in range(2)]
22
23class DataFrame(wx.Frame):
24    def _init_coll_BlankMenu(self,parent):
25        parent.Append(menu=self.Blank,title='')
26       
27    def _init_coll_AtomsMenu(self,parent):
28        parent.Append(menu=self.AtomEdit, title='Add atom')
29                   
30    def _init_coll_ImageMenu(self,parent):
31        parent.Append(menu=self.ImageEdit, title='Image Operations')
32       
33    def _init_coll_Atom_Items(self,parent):
34        self.Add = parent.Append(help='',id=wxID_ATOMSEDITADD, kind=wx.ITEM_NORMAL,text='Append empty atom')
35        self.Add = parent.Append(id=wxID_ATOMSEDITINSERT, kind=wx.ITEM_NORMAL,text='Insert empty atom',
36            help='Double left click on atom row to Insert before')
37           
38    def _init_coll_Image_Items(self,parent):
39        self.Add = parent.Append(help='',id=wxID_IMCALIBRATE, kind=wx.ITEM_NORMAL,text='Calibrate')
40        self.Add = parent.Append(id=wxID_IMINTEGRATE, kind=wx.ITEM_NORMAL,text='Integrate',
41            help='')
42           
43       
44    def _init_utils(self):
45        self.BlankMenu = wx.MenuBar()
46       
47        self.AtomsMenu = wx.MenuBar()
48        self.ImageMenu = wx.MenuBar()
49        self.AtomEdit = wx.Menu(title='')
50        self.ImageEdit = wx.Menu(title='')
51        self._init_coll_AtomsMenu(self.AtomsMenu)
52        self._init_coll_Atom_Items(self.AtomEdit)
53        self._init_coll_ImageMenu(self.ImageMenu)
54        self._init_coll_Image_Items(self.ImageEdit)
55       
56    def _init_ctrls(self, parent,name=None,size=None,pos=None):
57        wx.Frame.__init__(self,parent=parent,style=wx.DEFAULT_FRAME_STYLE ^ wx.CLOSE_BOX,
58            size=size,pos=pos,title='GSAS-II data display')
59        self._init_utils()
60        if name:
61            self.SetLabel(name)
62        self.Show()
63       
64    def __init__(self,parent,data=None,name=None, size=None,pos=None):
65        self._init_ctrls(parent,name,size,pos)
66        self.data = data
67        self.screenSize = wx.DisplaySize()
68        Size = self.GetSize()
69        xPos = self.screenSize[0]-Size[0]
70        self.SetPosition(wx.Point(xPos,250))
71        self.dirname = ''
72        self.AtomGrid = []
73        self.selectedRow = 0
74       
75    def setSizePosLeft(self,xWidth,yWidth):
76        screenSize = wx.DisplaySize()
77        self.SetSize(wx.Size(xWidth,yWidth))
78        self.SetPosition(wx.Point(screenSize[0]-xWidth,250))
79       
80    def Clear(self):
81        self.ClearBackground()
82        self.DestroyChildren()
83                   
84class GSGrid(wg.Grid):
85    def __init__(self, parent, name=''):
86        wg.Grid.__init__(self,parent,-1,name=name)                   
87        self.SetSize(parent.GetClientSize())
88           
89    def Clear(self):
90        wg.Grid.ClearGrid(self)
91       
92    def SetCellStyle(self,r,c,color="white",readonly=True):
93        self.SetCellBackgroundColour(r,c,color)
94        self.SetReadOnly(r,c,isReadOnly=readonly)
95       
96class GSNoteBook(wx.Notebook):
97    def __init__(self, parent, name='',size = None):
98        wx.Notebook.__init__(self, parent, -1, name=name, style= wx.BK_TOP)
99        if size: self.SetSize(size)
100                                                     
101    def Clear(self):       
102        GSNoteBook.DeleteAllPages(self)
103       
104class Table(wg.PyGridTableBase):
105    def __init__(self, data=[], rowLabels=None, colLabels=None, types = None):
106        wg.PyGridTableBase.__init__(self)
107        self.colLabels = colLabels
108        self.rowLabels = rowLabels
109        self.dataTypes = types
110        self.data = data
111       
112    def AppendRows(self, numRows=1):
113        self.data.append([])
114        return True
115       
116    def CanGetValueAs(self, row, col, typeName):
117        if self.dataTypes:
118            colType = self.dataTypes[col].split(':')[0]
119            if typeName == colType:
120                return True
121            else:
122                return False
123        else:
124            return False
125
126    def CanSetValueAs(self, row, col, typeName):
127        return self.CanGetValueAs(row, col, typeName)
128
129    def DeleteRow(self,pos):
130        data = self.GetData()
131        self.SetData([])
132        new = []
133        for irow,row in enumerate(data):
134            if irow <> pos:
135                new.append(row)
136        self.SetData(new)
137       
138    def GetColLabelValue(self, col):
139        if self.colLabels:
140            return self.colLabels[col]
141           
142    def GetData(self):
143        data = []
144        for row in range(self.GetNumberRows()):
145            data.append(self.GetRowValues(row))
146        return data
147       
148    def GetNumberCols(self):
149        try:
150            return len(self.colLabels)
151        except TypeError:
152            return None
153       
154    def GetNumberRows(self):
155        return len(self.data)
156       
157    def GetRowLabelValue(self, row):
158        if self.rowLabels:
159            return self.rowLabels[row]
160       
161    def GetRowValues(self, row):
162        data = []
163        for col in range(self.GetNumberCols()):
164            data.append(self.GetValue(row, col))
165        return data
166       
167    def GetTypeName(self, row, col):
168        try:
169            return self.dataTypes[col]
170        except TypeError:
171            return None
172
173    def GetValue(self, row, col):
174        try:
175            return self.data[row][col]
176        except IndexError:
177            return None
178           
179    def InsertRows(self, pos, rows):
180        for row in range(rows):
181            self.data.insert(pos,[])
182            pos += 1
183       
184    def IsEmptyCell(self,row,col):
185        try:
186            return not self.data[row][col]
187        except IndexError:
188            return True
189       
190    def OnKeyPress(self, event):
191        dellist = self.GetSelectedRows()
192        if event.GetKeyCode() == wx.WXK_DELETE and dellist:
193            grid = self.GetView()
194            for i in dellist: grid.DeleteRow(i)
195               
196    def SetColLabelValue(self, col, label):
197        numcols = self.GetNumberCols()
198        if col > numcols-1:
199            self.colLabels.append(label)
200        else:
201            self.colLabels[col]=label
202       
203    def SetData(self,data):
204        for row in range(len(data)):
205            self.SetRowValues(row,data[row])
206               
207    def SetRowLabelValue(self, row, label):
208        self.rowLabels[row]=label
209           
210    def SetRowValues(self,row,data):
211        self.data[row] = data
212           
213    def SetValue(self, row, col, value):
214        def innerSetValue(row, col, value):
215            try:
216                self.data[row][col] = value
217            except TypeError:
218                return
219            except IndexError:
220                print row,col,value
221                # add a new row
222                if row > self.GetNumberRows():
223                    self.data.append([''] * self.GetNumberCols())
224                elif col > self.GetNumberCols():
225                    for row in range(self.GetNumberRows):
226                        self.data[row].append('')
227                print self.data
228                self.data[row][col] = value
229        innerSetValue(row, col, value)
230       
231       
232def UpdateNotebook(self,data):       
233    if data:
234        self.dataFrame.SetLabel('Notebook')
235        self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
236            style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
237        for line in data:
238            self.dataDisplay.AppendText(line+"\n")
239            self.dataDisplay.AppendText('Notebook entry @ '+time.ctime()+"\n")
240           
241def UpdateControls(self,data):
242    if data:
243        self.dataFrame.SetLabel('Controls')
244       
245     
246def UpdateComments(self,data):                   
247    if data:
248        self.dataFrame.SetLabel('Comments')
249        self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
250            style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
251        for line in data:
252            self.dataDisplay.AppendText(line+"\n")
253     
254def UpdatePeakGrid(self, data):
255    if self.dataDisplay:
256        self.dataDisplay.Destroy()
257   
258    def RefreshPeakGrid(event):
259        event.StopPropagation()
260        data = self.PeakTable.GetData()
261        T = []
262        for peak in data:T.append(peak[0])
263        D = dict(zip(T,data))
264        T.sort()
265        X = []
266        for key in T: X.append(D[key])
267        data = X       
268        self.PlotPatterns()
269       
270    def setBackgroundColors():
271       for r in range(self.dataDisplay.GetNumberRows()):
272           for c in range(self.dataDisplay.GetNumberCols()):
273               if self.dataDisplay.GetColLabelValue(c) in ['position','intensity','sigma','gamma','SH/L']:
274                   if float(self.dataDisplay.GetCellValue(r,c)) < 0.:
275                       self.dataDisplay.SetCellBackgroundColour(r,c,wx.RED)
276                   else:
277                       self.dataDisplay.SetCellBackgroundColour(r,c,wx.WHITE)
278                           
279    def KeyEditPeakGrid(event):
280        rowList = self.dataDisplay.GetSelectedRows()
281        colList = self.dataDisplay.GetSelectedCols()
282        selectList = self.dataDisplay.GetSelectedCells()
283        data = self.PatternTree.GetItemPyData(self.PickId)
284        if event.GetKeyCode() == wx.WXK_RETURN:
285            event.Skip(True)
286        elif event.GetKeyCode() == wx.WXK_CONTROL:
287            event.Skip(True)
288        elif event.GetKeyCode() == wx.WXK_SHIFT:
289            event.Skip(True)
290        elif rowList:
291            self.dataDisplay.ClearSelection()
292            if event.GetKeyCode() == wx.WXK_DELETE:
293                self.dataDisplay.ClearGrid()
294                rowList.reverse()
295                nDel = 0
296                for row in rowList:
297                    self.PeakTable.DeleteRow(row)
298                    nDel += 1
299                if nDel:
300                    msg = wg.GridTableMessage(self.PeakTable, 
301                        wg.GRIDTABLE_NOTIFY_ROWS_DELETED,0,nDel)
302                    self.dataDisplay.ProcessTableMessage(msg)
303                data = self.PeakTable.GetData()
304                self.PatternTree.SetItemPyData(self.PickId,data[:-nDel])
305                self.dataDisplay.ForceRefresh()
306                setBackgroundColors()                         
307        elif colList:
308            self.dataDisplay.ClearSelection()
309            key = event.GetKeyCode()
310            for col in colList:
311                if self.PeakTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
312                    if key == 89: #'Y'
313                        for row in range(self.PeakTable.GetNumberRows()): data[row][col]=True
314                    elif key == 78:  #'N'
315                        for row in range(self.PeakTable.GetNumberRows()): data[row][col]=False
316        elif selectList:
317            self.dataDisplay.ClearSelection()
318            key = event.GetKeyCode()
319            for row,col in selectList:
320                if self.PeakTable.GetTypeName(row,col) == wg.GRID_VALUE_BOOL:
321                    if key == 89: #'Y'
322                        data[row][col]=True
323                    elif key == 78:  #'N'
324                        data[row][col]=False
325        self.PlotPatterns()
326           
327    self.dataFrame.setSizePosLeft(650,350)
328    self.PickTable = []
329    rowLabels = []
330    for i in range(len(data)): rowLabels.append(str(i+1))
331    colLabels = ['position','refine','intensity','refine','sigma','refine','gamma','refine','SH/L','refine']
332    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_BOOL,
333        wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
334        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL,
335        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL,
336        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL]
337    T = []
338    for peak in data:T.append(peak[0])
339    D = dict(zip(T,data))
340    T.sort()
341    X = []
342    for key in T: X.append(D[key])
343    data = X       
344    self.PatternTree.SetItemPyData(self.PickId,data)
345    self.PeakTable = Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
346    self.dataFrame.SetLabel('Peak List')
347    self.dataDisplay = GSGrid(parent=self.dataFrame)
348    self.dataDisplay.SetTable(self.PeakTable, True)
349    setBackgroundColors()                         
350    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshPeakGrid)
351    self.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPeakGrid)                 
352    self.dataDisplay.SetMargins(0,0)
353    self.dataDisplay.AutoSizeColumns(False)
354       
355def UpdateBackgroundGrid(self,data):
356    BackId = GetPatternTreeItemId(self,self.PatternId, 'Background')
357   
358    def RefreshBackgroundGrid(event):
359        data = self.BackTable.GetData()
360        M = len(data[0])
361        N = data[0][2]+3
362        item = data[0]
363        if N > M:       #add terms
364            for i in range(M,N): 
365                item.append(0.0)
366                self.BackTable.SetColLabelValue(i,str(i-2))
367            data = [item]
368            msg = wg.GridTableMessage(self.BackTable, 
369                wg.GRIDTABLE_NOTIFY_COLS_APPENDED,0,N-M)
370            self.dataDisplay.ProcessTableMessage(msg)                         
371        elif N < M:     #delete terms
372            new = []
373            for i in range(N):
374                new.append(item[i])
375            data = [new]
376            msg = wg.GridTableMessage(self.BackTable, 
377                wg.GRIDTABLE_NOTIFY_COLS_DELETED,0,M-N)
378            self.dataDisplay.ProcessTableMessage(msg)                         
379        self.PatternTree.SetItemPyData(BackId,data)
380                 
381    self.dataFrame.setSizePosLeft(700,150)
382    maxTerm = 7
383    self.BackTable = []
384    N = len(data[0])
385    M = data[0][2]
386    colLabels = ['function','refine','Nterms']
387    rowLabels=['background']
388    for i in range(M): colLabels.append(str(i+1))
389    Types = [wg.GRID_VALUE_CHOICE+':chebyschev,another,more',
390        wg.GRID_VALUE_BOOL,
391        wg.GRID_VALUE_NUMBER+':1,'+str(maxTerm)]
392    for i in range(maxTerm):
393        Types.append(wg.GRID_VALUE_FLOAT+':10,3')
394    self.BackTable = Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
395    self.dataFrame.SetLabel('Background')
396    self.dataDisplay = GSGrid(parent=self.dataFrame)
397    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshBackgroundGrid)               
398    self.dataDisplay.SetTable(self.BackTable, True)
399    self.dataDisplay.SetMargins(0,0)
400    self.dataDisplay.AutoSizeColumns(False)
401       
402def UpdateLimitsGrid(self, data):
403    if self.dataDisplay:
404        self.dataDisplay.Destroy()
405    self.dataFrame.setSizePosLeft(250,150)
406    LimitId = GetPatternTreeItemId(self,self.PatternId, 'Limits')
407    def RefreshLimitsGrid(event):
408        data = self.LimitsTable.GetData()
409        old = data[0]
410        new = data[1]
411        new[0] = max(old[0],new[0])
412        new[1] = max(new[0],min(old[1],new[1]))
413        data = [old,new]
414        self.PlotPatterns()
415       
416    self.LimitsTable = []
417    colLabels = ['Tmin','Tmax']
418    rowLabels = ['original','changed']
419    Types = [wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3']
420    self.LimitsTable = Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
421    self.dataFrame.SetLabel('Limits')
422    self.dataDisplay = GSGrid(parent=self.dataFrame)               
423    self.dataDisplay.SetTable(self.LimitsTable, True)
424    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshLimitsGrid)               
425    self.dataDisplay.SetMargins(0,0)
426    self.dataDisplay.AutoSizeColumns(False)
427   
428def UpdateInstrumentGrid(self, data):
429    if self.dataDisplay:
430        self.dataDisplay.Destroy()
431    Ka2 = False
432    Xwid = 720
433    if len(data[0]) == 12: 
434        Ka2 = True
435        Xwid = 800       
436    self.dataFrame.setSizePosLeft(Xwid,150)
437    InstId = GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters')
438    def RefreshInstrumentGrid(event):
439        if event.GetRow() == 1:
440            peaks = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
441            ins = data[1]
442            if 'P' in ins[0]:                                       #update powder peak parameters
443                for peak in peaks:
444                    if Ka2:
445                        peak[4] = ins[6]*tand(peak[0]/2.0)**2+ins[7]*tand(peak[0]/2.0)+ins[8]
446                        peak[6] = ins[9]/cosd(peak[0]/2.0)+ins[10]*tand(peak[0]/2.0)
447                        peak[8] = ins[11]
448                    else:
449                        peak[4] = ins[4]*tand(peak[0]/2.0)**2+ins[5]*tand(peak[0]/2.0)+ins[6]
450                        peak[6] = ins[7]/cosd(peak[0]/2.0)+ins[8]*tand(peak[0]/2.0)
451                        peak[8] = ins[9]
452       
453    self.InstrumentTable = []
454    if 'P' in data[1][0]:
455        if Ka2:
456            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
457                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #zero, ratio, pola
458                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #u,v,w
459                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,5']
460        else:
461            Types = [wg.GRID_VALUE_CHOICE+":PXC,PNC,PNT",wg.GRID_VALUE_FLOAT+':10,6',               #type & lam-1
462                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #zero, pola
463                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3', #u,v,w
464                wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,5']
465        colLabels = data[3]
466        rowLabels = ['original','changed','refine']
467        self.InstrumentTable = Table(data[:-1],rowLabels=rowLabels,colLabels=colLabels,types=Types)
468        self.dataFrame.SetLabel('Instrument Parameters')
469        self.dataDisplay = GSGrid(parent=self.dataFrame)               
470        self.dataDisplay.SetTable(self.InstrumentTable, True)
471        self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshInstrumentGrid)               
472        self.dataDisplay.SetMargins(0,0)
473        self.dataDisplay.AutoSizeColumns(False)
474        beg = 4
475        if Ka2: beg = 6
476        for i in range(len(data[2])):
477            if i < beg:
478                self.dataDisplay.SetCellRenderer(2,i,wg.GridCellStringRenderer())
479                self.dataDisplay.SetCellValue(2,i,'')
480                self.dataDisplay.SetReadOnly(2,i,isReadOnly=True)
481            else:
482                self.dataDisplay.SetCellRenderer(2,i,wg.GridCellBoolRenderer())
483                self.dataDisplay.SetCellEditor(2,i,wg.GridCellBoolEditor())
484    else:
485        Types = [wg.GRID_VALUE_CHOICE+":SXC,SNC,SNT",wg.GRID_VALUE_FLOAT+':10,6']
486        colLabels = data[2]
487        rowLabels = ['original','changed']
488        self.InstrumentTable = Table(data[:-1],rowLabels=rowLabels,colLabels=colLabels,types=Types)
489        self.dataFrame.SetLabel('Instrument Parameters')
490        self.dataDisplay = GSGrid(parent=self.dataFrame)               
491        self.dataDisplay.SetTable(self.InstrumentTable, True)
492        self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshInstrumentGrid)               
493        self.dataDisplay.SetMargins(0,0)
494        self.dataDisplay.AutoSizeColumns(False)
495               
496def UpdateIndexPeaksGrid(self, data):
497    IndexId = GetPatternTreeItemId(self,self.PatternId, 'Index Peak List')
498   
499    def RefreshIndexPeaksGrid(event):
500        data = self.IndexPeaksTable.GetData()
501        self.PatternTree.SetItemPyData(IndexId,data)
502       
503    def KeyEditPickGrid(event):
504        colList = self.dataDisplay.GetSelectedCols()
505        rowList = self.dataDisplay.GetSelectedRows()
506        data = self.PatternTree.GetItemPyData(IndexId)
507        if event.GetKeyCode() == wx.WXK_RETURN:
508            event.Skip(True)
509        elif event.GetKeyCode() == wx.WXK_CONTROL:
510            event.Skip(True)
511        elif event.GetKeyCode() == wx.WXK_SHIFT:
512            event.Skip(True)
513        elif event.GetKeyCode() == wx.WXK_DELETE:
514            dlg = wx.MessageDialog(self, 'Delete Index Peak List?', ' ', wx.YES | wx.NO)
515            try:
516                result = dlg.ShowModal()
517                if result == wx.ID_YES:
518                    oldlen = len(data)
519                    data = []
520                    self.PatternTree.SetItemPyData(IndexId,data)
521                    self.dataDisplay.Clear() 
522                    self.dataDisplay.Destroy()
523                    self.IndexPeaksTable = []
524            finally:
525                dlg.Destroy()
526        elif colList:
527            self.dataDisplay.ClearSelection()
528            key = event.GetKeyCode()
529            for col in colList:
530                if self.IndexPeaksTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
531                    if key == 89: #'Y'
532                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=True
533                    elif key == 78:  #'N'
534                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=False
535           
536    if self.dataDisplay:
537        self.dataDisplay.Destroy()
538    self.dataFrame.setSizePosLeft(500,300)
539    inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
540    self.IndexPeaksTable = []
541    if not data:
542        peaks = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
543        for peak in peaks:
544            dsp = inst[1]/(2.0*sind(peak[0]/2.0))
545            data.append([peak[0],peak[2],True,False,0,0,0,dsp,0.0])
546    else:
547        cells = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List'))
548        if cells:
549            cellist = cells[2]
550            dmin = cells[3]
551            self.HKL = []
552            for i,cell in enumerate(cellist):
553                if cell[-1]:
554                    ibrav = cell[2]
555                    A = G2cmp.cell2A(cell[3:9])
556                    self.HKL = G2cmp.GenHBravais(dmin,ibrav,A)
557                    G2cmp.IndexPeaks(data,self.HKL)
558                    for hkl in self.HKL:
559                        hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
560    rowLabels = []
561    for i in range(len(data)): rowLabels.append(str(i+1))
562    colLabels = ['position','intensity','use','indexed','h','k','l','d-obs','d-calc']
563    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
564        wg.GRID_VALUE_BOOL,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,
565        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5']
566    self.PatternTree.SetItemPyData(IndexId,data)
567    self.IndexPeaksTable = Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
568    self.dataFrame.SetLabel('Index Peak List')
569    self.dataDisplay = GSGrid(parent=self.dataFrame)               
570    self.dataDisplay.SetTable(self.IndexPeaksTable, True)
571    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshIndexPeaksGrid)
572    self.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPickGrid)                 
573    self.dataDisplay.SetMargins(0,0)
574    self.dataDisplay.AutoSizeColumns(False)
575
576def UpdateUnitCellsGrid(self, data):
577    UnitCellsId = GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List')
578    bravaisSymb = ['Fm3m','Im3m','Pm3m','R3-H','P6/mmm','I4/mmm',
579        'P4/mmm','Fmmm','Immm','Cmmm','Pmmm','C2/m','P2/m','P1']
580    def CopyUnitCell(event):
581        if event.GetCol() == 6:
582            row = event.GetRow()
583            controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)
584            cell = cells[row][2:9]
585            controls[4] = 1
586            controls[5] = bravaisSymb[cell[0]]
587            controls[6:12] = cell[1:8]
588            controls[12] = G2cmp.calc_V(G2cmp.cell2A(controls[6:12]))
589            for i in range(4,13):
590                self.UnitCellsTable.SetValue(i,1,controls[i])
591            self.PatternTree.SetItemPyData(UnitCellsId,[controls,bravais,cells,dmin])
592            self.dataDisplay.ForceRefresh()
593            self.RefineCell.Enable(True)
594    def RefreshUnitCellsGrid(event):
595        cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)[2:]
596        r,c =  event.GetRow(),event.GetCol()
597        if cells:
598            if c == 6:
599                for i in range(min(self.UnitCellsTable.GetNumberRows(),len(cells))):
600                    cells[i][-1] = False
601                    self.UnitCellsTable.SetValue(i,c,0)
602                self.UnitCellsTable.SetValue(r,c,1)
603                cells[r][-1] = True
604                ibrav = cells[r][2]
605                A = G2cmp.cell2A(cells[r][3:9])
606                self.HKL = G2cmp.GenHBravais(dmin,ibrav,A)
607                for hkl in self.HKL:
608                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
609                self.PlotPatterns()             
610        controls = []
611        bravais = [0,0,0,0,0,0,0, 0,0,0,0,0,0,0]
612        table = self.UnitCellsTable.GetData()
613        for i,row in enumerate(table):
614            if i in [0,4]:
615                if row[1]:
616                    controls.append(1)
617                else:
618                    controls.append(0)
619            elif i in [1,3]:
620                controls.append(float(row[1]))
621            elif i in [2]:
622                controls.append(int(row[1]))
623            elif i in [5]:
624                controls.append(row[1])
625            elif i in [6,7,8,9,10,11]:
626                if controls[5] in bravaisSymb[:3]:              #cubic
627                    if i in [6]:
628                        controls.append(float(row[1]))
629                        controls.append(float(row[1]))
630                        controls.append(float(row[1]))
631                        controls.append(90.)
632                        controls.append(90.)
633                        controls.append(90.)
634                elif controls[5] in bravaisSymb[3:7]:           #hexagonal & tetragonal
635                    if i in [6]:
636                        controls.append(float(row[1]))
637                        controls.append(float(row[1]))
638                    elif i in [8]:
639                        controls.append(float(row[1]))
640                        controls.append(90.)
641                        controls.append(90.)
642                        if controls[5] in bravaisSymb[3:5]:     #hexagonal
643                            controls.append(120.)
644                        else:                                   #tetragonal
645                            controls.append(90.)
646                elif controls[5] in bravaisSymb[7:13]:          #orthorhombic & monoclinic
647                    if i in [6,7,8]:
648                        controls.append(float(row[1]))
649                    if i in [9,10,11]:
650                        if controls[5] in bravaisSymb[7:11]:
651                            controls.append(90.)
652                            controls.append(90.)
653                            controls.append(90.)
654                            break
655                        else:
656                            if i in [9,11]:
657                                controls.append(90.)
658                            else:
659                                controls.append(float(row[1]))
660                else:                                           #triclinic
661                    controls.append(float(row[1]))
662        controls.append(G2cmp.calc_V(G2cmp.cell2A(controls[6:12])))        #volume       
663        for i,row in enumerate(table):
664            if i < 14:
665                bravais[i] = int(row[2])
666            else:
667                break
668        if controls[4]:
669            for i in range(6,13):
670                self.UnitCellsTable.SetValue(i,1,controls[i])
671        self.dataDisplay.ForceRefresh()
672        if controls[4] and not False in controls[6:12]:
673            self.RefineCell.Enable(True)
674        else:
675            self.RefineCell.Enable(False)
676        data = [controls,bravais,cells,dmin]                   
677        self.PatternTree.SetItemPyData(UnitCellsId,data)
678       
679    if self.dataDisplay:
680        self.dataDisplay.Destroy()
681    self.UnitCellsTable = []
682    controls,bravais,cells,dmin = data
683    if cells:
684        self.dataFrame.setSizePosLeft(900,320)
685    else:
686        self.dataFrame.setSizePosLeft(280,320)
687    if len(controls) < 13:
688        controls.append(G2cmp.calc_V(G2cmp.cell2A(controls[6:12])))
689    self.PatternTree.SetItemPyData(UnitCellsId,data)
690    inst = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
691    if cells:
692        colLabels = ['controls','value','try','Bravais cells',
693            'M20','X20','use','Bravais','a','b','c','alpha','beta','gamma','Volume']
694        Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_FLOAT+":10,1",
695            wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING,wg.GRID_VALUE_FLOAT+':10,2',
696            wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING,
697            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',
698            wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_FLOAT+':10,3',
699            wg.GRID_VALUE_FLOAT+':10,2']
700    else:
701        colLabels = ['controls','value','try','Bravais cells']
702        Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,
703            wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING]
704    controlNames = ['Vary zero?','Max zero error','Max Nc/Nobs','Start volume','refine cell?',
705        'bravais','a=','b=','c=','alpha=','beta=','gamma=','Volume=']
706    bravaisNames = ['Cubic-F','Cubic-I','Cubic-P','Trigonal-R','Trigonal/Hexagonal-P',
707        'Tetragonal-I','Tetragonal-P','Orthorhombic-F','Orthorhombic-I','Orthorhombic-C',
708        'Orthorhombic-P','Monoclinic-C','Monoclinic-P','Triclinic']
709    rowLabels = []
710    table = []
711    numRows = max(len(bravais),len(cells))
712    for i in range(numRows):
713        rowLabels.append('')
714        if i < 13:
715            row = [controlNames[i],controls[i],bravais[i],bravaisSymb[i]]
716        elif i < 14:
717            row = ['','',bravais[i],bravaisSymb[i]]
718        else:
719            row = ['','','','']
720        if cells:
721            if i < len(cells):
722                cell = cells[i]
723                row += cell[0:2]+[cell[-1]]+[bravaisSymb[cell[2]]]+cell[3:10]
724                if cell[-1]:
725                    A = G2cmp.cell2A(cell[3:9])
726                    self.HKL = G2cmp.GenHBravais(dmin,cell[2],A)
727                    for hkl in self.HKL:
728                        hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
729            else:
730                row += 14*['',]
731        table.append(row)
732    self.UnitCellsTable = Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
733    self.dataFrame.SetLabel('Unit Cells List')
734    self.dataDisplay = GSGrid(parent=self.dataFrame)               
735    self.dataDisplay.SetTable(self.UnitCellsTable, True)
736    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshUnitCellsGrid)
737    self.dataDisplay.Bind(wg.EVT_GRID_CELL_RIGHT_DCLICK, CopyUnitCell)
738    if cells:
739        self.dataDisplay.GetGridWindow().SetToolTipString('Right d-click "use" box to copy cell to controls')
740    self.dataDisplay.SetMargins(0,0)
741    self.dataDisplay.SetRowLabelSize(0)
742    self.dataDisplay.SetCellRenderer(0,1,wg.GridCellBoolRenderer())
743    self.dataDisplay.SetCellEditor(0,1,wg.GridCellBoolEditor())
744    self.dataDisplay.SetCellRenderer(1,1,wg.GridCellFloatRenderer(5,2))
745    self.dataDisplay.SetCellEditor(1,1,wg.GridCellFloatEditor(5,0))
746    self.dataDisplay.SetCellRenderer(2,1,wg.GridCellNumberRenderer())
747    self.dataDisplay.SetCellEditor(2,1,wg.GridCellNumberEditor(1,10))
748    self.dataDisplay.SetCellRenderer(3,1,wg.GridCellFloatRenderer(5,0))
749    self.dataDisplay.SetCellEditor(3,1,wg.GridCellFloatEditor(5,2))
750    self.dataDisplay.SetCellRenderer(4,1,wg.GridCellBoolRenderer())
751    self.dataDisplay.SetCellEditor(4,1,wg.GridCellBoolEditor())
752    self.dataDisplay.SetCellRenderer(5,1,wg.GridCellStringRenderer())
753    self.dataDisplay.SetCellEditor(5,1,wg.GridCellChoiceEditor(bravaisSymb,False))
754    for i in range(6,9):
755        self.dataDisplay.SetCellRenderer(i,1,wg.GridCellFloatRenderer(10,5))
756        self.dataDisplay.SetCellEditor(i,1,wg.GridCellFloatEditor(10,5))
757    for i in range(9,13):
758        self.dataDisplay.SetCellRenderer(i,1,wg.GridCellFloatRenderer(10,3))
759        self.dataDisplay.SetCellEditor(i,1,wg.GridCellFloatEditor(10,3))
760    for i in range(14):
761        self.dataDisplay.SetReadOnly(i,0,isReadOnly=True)
762        self.dataDisplay.SetReadOnly(i,3,isReadOnly=True)
763    if cells:
764        for r in range(max(len(cells),14)):
765            if r > 12:
766                self.dataDisplay.SetCellRenderer(r,0,wg.GridCellStringRenderer())                   
767                self.dataDisplay.SetCellRenderer(r,1,wg.GridCellStringRenderer())
768            if r > 13:
769                self.dataDisplay.SetCellRenderer(r,2,wg.GridCellStringRenderer())
770            for c in range(4,15):
771                if r >= len(cells):
772                    self.dataDisplay.SetCellRenderer(r,c,wg.GridCellStringRenderer())
773                if c != 6:
774                    self.dataDisplay.SetReadOnly(r,c,isReadOnly=True)
775    self.dataDisplay.AutoSizeColumns(False)
776    if controls[4] and not False in controls[6:12]:
777        self.RefineCell.Enable(True)
778    else:
779        self.RefineCell.Enable(False)
780       
781def UpdateImageControls(self,data):
782   
783    def OnNewColorBar(event):
784        data['color'] = colSel.GetValue()
785        self.PlotImage()
786       
787    def OnNewCalibrant(event):
788        data['calibrant'] = calSel.GetValue()
789       
790    def OnMaxSlider(event):
791        imax = max(data['range'][1][0],int(maxSel.GetValue()))
792        maxSel.SetValue(imax)
793        data['range'][1][1] = imax
794        self.PlotImage()
795       
796    def OnMinSlider(event):
797        imin = min(data['range'][1][1],int(minSel.GetValue()))
798        minSel.SetValue(imin)
799        data['range'][1][0] = imin
800        self.PlotImage()
801       
802    def OnNumOutChans(event):
803        try:
804            numChans = int(outChan.GetValue())
805            data['outChannels'] = numChans
806        except ValueError:
807            pass
808        outChan.SetValue(str(data['outChannels']))       
809       
810    def OnWavelength(event):
811        try:
812            wave = float(waveSel.GetValue())
813            data['wavelength'] = wave
814        except ValueError:
815            pass
816        waveSel.SetValue("%6.5f" % (data['wavelength']))       
817       
818    def OnDistance(event):
819        try:
820            dist = float(distSel.GetValue())
821            data['distance'] = dist
822        except ValueError:
823            pass
824        distSel.SetValue("%8.3f"%(data['distance']))
825       
826    def OnImRefine(event):
827        ImageCalibRef[0] = centRef.GetValue()
828        ImageCalibRef[1] = waveRef.GetValue()
829        ImageCalibRef[2] = distRef.GetValue()
830        ImageCalibRef[3] = tiltRef.GetValue()
831        ImageCalibRef[4] = rotRef.GetValue()
832               
833    def OnShowLines(event):
834        if data['showLines']:
835            data['showLines'] = False
836        else:
837            data['showLines'] = True
838        showLines.SetValue(data['showLines'])
839        self.PlotImage()
840       
841    def OnSetDefault(event):
842        import copy
843        if data['setDefault']:
844            self.imageDefault = {}
845            data['setDefault'] = False
846        else:
847            self.imageDefault = copy.copy(data)
848            data['setDefault'] = True
849        setDefault.SetValue(data['setDefault'])
850       
851   
852    def OnCalibrate(event):
853        G2cmp.ImageCalibrate(data,self.ImageZ,self.PlotImage())
854       
855    def OnIntegrate(event):
856        print 'image integrate'
857                             
858    colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
859    import ImageCalibrants as calFile
860    calList = [m for m in calFile.Calibrants.keys()]
861    if self.dataDisplay:
862        self.dataDisplay.Destroy()
863    self.dataFrame.SetMenuBar(self.dataFrame.ImageMenu)
864    Status = self.dataFrame.CreateStatusBar()
865    Status.SetStatusText("On Image: key 'c' to mark center or 'r' on inner ring for calibration")
866    self.dataFrame.Bind(wx.EVT_MENU, OnCalibrate, id=wxID_IMCALIBRATE)
867    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=wxID_IMINTEGRATE)       
868    self.dataDisplay = wx.Panel(self.dataFrame)
869    mainSizer = wx.BoxSizer(wx.VERTICAL)
870    mainSizer.Add((5,10),0)
871   
872    maxSizer = wx.FlexGridSizer(2,2,0,5)
873    maxSizer.AddGrowableCol(1,1)
874    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max intensity'),0,
875        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
876    maxSel = wx.Slider(parent=self.dataDisplay,maxValue=data['range'][0][1],minValue=data['range'][0][0],
877        style=wx.SL_HORIZONTAL,value=data['range'][1][1])
878    maxSizer.Add(maxSel,1,wx.EXPAND|wx.RIGHT)
879    maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)   
880    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min intensity'),0,
881        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
882    minSel = wx.Slider(parent=self.dataDisplay,maxValue=data['range'][0][1],minValue=data['range'][0][0],
883        style=wx.SL_HORIZONTAL,value=data['range'][1][0])
884    maxSizer.Add(minSel,1,wx.EXPAND|wx.RIGHT)
885    minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
886    mainSizer.Add(maxSizer,1,wx.EXPAND|wx.RIGHT)
887   
888    comboSizer = wx.FlexGridSizer(2,4,5,5)
889    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Color bar '),0,
890        wx.ALIGN_CENTER_VERTICAL)
891    colSel = wx.ComboBox(parent=self.dataDisplay,value=data['color'],choices=colorList,
892        style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
893    colSel.Bind(wx.EVT_COMBOBOX, OnNewColorBar)
894    comboSizer.Add(colSel,0,wx.ALIGN_CENTER_VERTICAL)
895   
896    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibrant '),0,
897        wx.ALIGN_CENTER_VERTICAL)
898    calSel = wx.ComboBox(parent=self.dataDisplay,value=data['calibrant'],choices=calList,
899        style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
900    calSel.Bind(wx.EVT_COMBOBOX, OnNewCalibrant)
901    comboSizer.Add(calSel,0,wx.ALIGN_CENTER_VERTICAL)
902    mainSizer.Add(comboSizer,0,wx.ALIGN_CENTER_HORIZONTAL)
903    mainSizer.Add((5,5),0)
904         
905    dataSizer = wx.FlexGridSizer(6,5,5,5)
906    dataSizer.Add((5,0),0)
907    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibration coefficients'),0,
908        wx.ALIGN_CENTER_VERTICAL)   
909    dataSizer.Add((5,0),0)
910    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Integration coefficients'),0,
911        wx.ALIGN_CENTER_VERTICAL)   
912    dataSizer.Add((5,0),0)
913   
914    ImageCalibRef = data['refine']
915    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Beam center X,Y'),0,
916        wx.ALIGN_CENTER_VERTICAL)
917    cent = data['center']
918    self.centText = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f,%8.3f" % (cent[0],cent[1])))
919    dataSizer.Add(self.centText,0,wx.ALIGN_CENTER_VERTICAL)
920    centRef = wx.CheckBox(parent=self.dataDisplay,label='refine?')
921    centRef.Bind(wx.EVT_CHECKBOX, OnImRefine)
922    centRef.SetValue(ImageCalibRef[0])
923    dataSizer.Add(centRef,0,wx.ALIGN_CENTER_VERTICAL)
924   
925    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Inner/Outer radii'),0,
926        wx.ALIGN_CENTER_VERTICAL)
927    IOradii = data['IOradii']
928    self.IOradText = wx.TextCtrl(parent=self.dataDisplay,
929        value=("%8.3f,%8.3f" % (IOradii[0],IOradii[1])),style=wx.TE_READONLY)
930    dataSizer.Add(self.IOradText,0,wx.ALIGN_CENTER_VERTICAL)
931       
932    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Wavelength'),0,
933        wx.ALIGN_CENTER_VERTICAL)
934    waveSel = wx.TextCtrl(parent=self.dataDisplay,value=("%6.5f" % (data['wavelength'])),
935        style=wx.TE_PROCESS_ENTER)
936    waveSel.Bind(wx.EVT_TEXT_ENTER,OnWavelength)
937    dataSizer.Add(waveSel,0,wx.ALIGN_CENTER_VERTICAL)
938    waveRef = wx.CheckBox(parent=self.dataDisplay,label='refine?')
939    waveRef.Bind(wx.EVT_CHECKBOX, OnImRefine)
940    waveRef.SetValue(ImageCalibRef[1])
941    dataSizer.Add(waveRef,0,wx.ALIGN_CENTER_VERTICAL)
942         
943    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start/End azimuth'),0,
944        wx.ALIGN_CENTER_VERTICAL)
945    LRazim = data['LRazimuth']
946    self.LRazim = wx.TextCtrl(parent=self.dataDisplay,
947        value=("%6d,%6d" % (LRazim[0],LRazim[1])),style=wx.TE_READONLY)
948    dataSizer.Add(self.LRazim,0,wx.ALIGN_CENTER_VERTICAL)
949       
950    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Distance'),0,
951        wx.ALIGN_CENTER_VERTICAL)
952    distSel = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f"%(data['distance'])),style=wx.TE_PROCESS_ENTER)
953    distSel.Bind(wx.EVT_TEXT_ENTER,OnDistance)
954    dataSizer.Add(distSel,0,wx.ALIGN_CENTER_VERTICAL)
955    distRef = wx.CheckBox(parent=self.dataDisplay,label='refine?')
956    distRef.Bind(wx.EVT_CHECKBOX, OnImRefine)
957    distRef.SetValue(ImageCalibRef[2])
958    dataSizer.Add(distRef,0,wx.ALIGN_CENTER_VERTICAL)
959
960    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' No. bins'),0,
961        wx.ALIGN_CENTER_VERTICAL)
962    outChan = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)
963    outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)
964    dataSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)
965
966    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt angle'),0,
967        wx.ALIGN_CENTER_VERTICAL)
968    self.tiltSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['tilt'])),style=wx.TE_READONLY)
969    dataSizer.Add(self.tiltSel,0,wx.ALIGN_CENTER_VERTICAL)
970    tiltRef = wx.CheckBox(parent=self.dataDisplay,label='refine?')
971    tiltRef.Bind(wx.EVT_CHECKBOX, OnImRefine)
972    tiltRef.SetValue(ImageCalibRef[3])
973    dataSizer.Add(tiltRef,0,wx.ALIGN_CENTER_VERTICAL)
974    showLines = wx.CheckBox(parent=self.dataDisplay,label='Show integration limits?')
975    dataSizer.Add(showLines,0)
976    showLines.Bind(wx.EVT_CHECKBOX, OnShowLines)
977    showLines.SetValue(data['showLines'])
978    dataSizer.Add((5,5),0)
979   
980    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt rotation'),0,
981        wx.ALIGN_CENTER_VERTICAL)
982    self.rotSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['rotation'])),style=wx.TE_READONLY)
983    dataSizer.Add(self.rotSel,0,wx.ALIGN_CENTER_VERTICAL)
984    rotRef = wx.CheckBox(parent=self.dataDisplay,label='refine?')
985    rotRef.Bind(wx.EVT_CHECKBOX, OnImRefine)
986    rotRef.SetValue(ImageCalibRef[4])
987    dataSizer.Add(rotRef,0,)
988    setDefault = wx.CheckBox(parent=self.dataDisplay,label='Use as default for all images?')
989    dataSizer.Add(setDefault,0)
990    setDefault.Bind(wx.EVT_CHECKBOX, OnSetDefault)
991    showLines.SetValue(data['setDefault'])
992    dataSizer.Add((5,5),0)
993       
994    mainSizer.Add(dataSizer,0)
995   
996    mainSizer.Layout()   
997    self.dataDisplay.SetSizer(mainSizer)
998    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
999    self.dataFrame.setSizePosLeft(600,310)
1000   
1001def UpdatePhaseData(self,item,data,oldPage):
1002    import GSASIIElem as G2el
1003    Atoms = []
1004    self.SelectedRow = 0
1005   
1006    def BookResize(event):
1007        w,h = self.GetSize()
1008        self.dataDisplay.SetSize(wx.Size(w,h))
1009       
1010    def FillGeneralGrid():
1011        def SetLatticeParametersStyle(SGData,table):
1012            if SGData['SGLaue'] in ['m3','m3m']:
1013                table[4][2] = table[4][3] = table[4][1]
1014                General.SetCellStyle(4,2,"light grey",True)
1015                General.SetCellStyle(4,3,"light grey",True)
1016                table[4][4] = table[4][5] = table[4][6] = 90.
1017                General.SetCellStyle(4,4,"light grey",True)
1018                General.SetCellStyle(4,5,"light grey",True)
1019                General.SetCellStyle(4,6,"light grey",True)
1020            elif SGData['SGLaue'] in ['3R','3mR']:
1021                table[4][2] = table[4][3] = table[4][1]
1022                General.SetCellStyle(4,2,"light grey",True)
1023                General.SetCellStyle(4,3,"light grey",True)
1024                table[4][5] = table[4][6] = table[4][4]
1025                General.SetCellStyle(4,5,"light grey",True)
1026                General.SetCellStyle(4,6,"light grey",True)
1027            elif SGData['SGLaue'] in ['3','3m1','31m','6/m','6/mmm']:
1028                table[4][2] = table[4][1]
1029                General.SetCellStyle(4,2,"light grey",True)
1030                table[4][4] = table[4][5] = 90.
1031                table[4][6] = 120.
1032                General.SetCellStyle(4,4,"light grey",True)
1033                General.SetCellStyle(4,5,"light grey",True)
1034                General.SetCellStyle(4,6,"light grey",True)
1035            elif SGData['SGLaue'] in ['4/m','4/mmm']:
1036                table[4][2] = table[4][1]
1037                General.SetCellStyle(4,2,"light grey",True)
1038                table[4][4] = table[4][5] = table[4][6] = 90.
1039                General.SetCellStyle(4,4,"light grey",True)
1040                General.SetCellStyle(4,5,"light grey",True)
1041                General.SetCellStyle(4,6,"light grey",True)
1042            elif SGData['SGLaue'] in ['mmm']:
1043                table[4][4] = table[4][5] = table[4][6] = 90.
1044                General.SetCellStyle(4,4,"light grey",True)
1045                General.SetCellStyle(4,5,"light grey",True)
1046                General.SetCellStyle(4,6,"light grey",True)
1047            elif SGData['SGLaue'] in ['2/m']:
1048                if SGData['SGUniq'] == 'a':
1049                    table[4][5]= table[4][6] = 90.
1050                    General.SetCellStyle(4,5,"light grey",True)
1051                    General.SetCellStyle(4,6,"light grey",True)
1052                if SGData['SGUniq'] == 'b':
1053                    table[4][4]= table[4][6] = 90.
1054                    General.SetCellStyle(4,4,"light grey",True)
1055                    General.SetCellStyle(4,6,"light grey",True)
1056                if SGData['SGUniq'] == 'c':
1057                    table[4][4]= table[4][5] = 90.
1058                    General.SetCellStyle(4,4,"light grey",True)
1059                    General.SetCellStyle(4,5,"light grey",True)
1060           
1061        def RefreshGeneralGrid(event):
1062               
1063            r,c =  event.GetRow(),event.GetCol()
1064            generalData[0] = table[0][0]
1065            self.PatternTree.SetItemText(item,generalData[0])
1066            generalData[1] = table[1][0]
1067            SpcGp = table[2][0]
1068            SGErr,SGData = G2spc.SpcGroup(SpcGp)
1069            if r == 2 and c == 0:
1070                if SGErr:
1071                    text = [G2spc.SGErrors(SGErr)+'\nSpace Group set to previous']
1072                    table[2][0] = generalData[2]['SpGrp']
1073                    msg = 'Space Group Error'
1074                    Style = wx.ICON_EXCLAMATION
1075                else:
1076                    text = G2spc.SGPrint(SGData)
1077                    generalData[2] = SGData
1078                    msg = 'Space Group Information'
1079                    Style = wx.ICON_INFORMATION
1080                Text = ''
1081                for line in text:
1082                    Text += line+'\n'
1083                wx.MessageBox(Text,caption=msg,style=Style)
1084            General.SetCellValue(4,0,str(generalData[3][0]))
1085            for c in range(1,7):
1086                General.SetCellStyle(4,c,"white",False)
1087                generalData[3][c] = float(General.GetCellValue(4,c))
1088            generalData[3][7] = G2cmp.calc_V(G2cmp.cell2A(generalData[3][1:7]))
1089            SetLatticeParametersStyle(SGData,table)
1090            generalData[4][1] = float(General.GetCellValue(5,1))
1091            print 'did general refresh'
1092            General.ForceRefresh()
1093                       
1094        rowLabels = ['Phase name','Phase type','Space group',
1095            'Lattice ',' parameters','Scale factor','Elements','No. per cell','Atom weight','','Bond radii','Angle radii']
1096        generalData = data['General']
1097        atomData = data['Atoms']
1098        AtomTypes = []
1099        NoAtoms = {}
1100        BondRadii = []
1101        AngleRadii = []
1102        AtomMass = []
1103        colType = 1
1104        colSS = 7
1105        self.dataFrame.setSizePosLeft(600,350)
1106        if generalData[1] =='macromolecular':
1107            colType = 4
1108            colSS = 10
1109        for atom in atomData:
1110            if AtomTypes.count(atom[colType]):
1111                NoAtoms[atom[colType]] += atom[colSS-1]*atom[colSS+1]
1112            else:
1113                Info = G2el.GetAtomInfo(atom[colType])
1114                AtomTypes.append(Info['Symbol'])
1115                BondRadii.append(Info['Drad'])
1116                AngleRadii.append(Info['Arad'])
1117                AtomMass.append(Info['Mass'])
1118                NoAtoms[atom[colType]] = atom[colSS-1]*atom[colSS+1]
1119        generalData[5:9] = [AtomTypes,NoAtoms,AtomMass,BondRadii,AngleRadii]
1120        colLabels = []
1121        colLabels += ['' for i in range(max(8,len(generalData[5])))]
1122        table = []
1123        table.append([generalData[0],'','','','','','','',''])      #phase name
1124        table.append([generalData[1],'','','','','','','',''])      #phase type
1125        E,SGData = G2spc.SpcGroup(generalData[2]['SpGrp'])
1126        table.append([SGData['SpGrp'],'','','','','','','',''])     #space group symbol
1127        table.append(['refine','a    ','b    ','c    ','alpha ','beta ','gamma','volume  '])
1128        table.append(generalData[3])                      #lattice parameters
1129        table.append([generalData[4][0],generalData[4][1],'','','','','',''])   #scale factor
1130        table.append(generalData[5]+['' for i in range(max(8,len(generalData[5])))]) #element list
1131        line = []
1132        mass = 0.
1133        for i,elem in enumerate(generalData[5]):
1134            mass += generalData[6][elem]*generalData[7][i]
1135            line.append(generalData[6][elem])
1136        Volume = generalData[3][7]
1137        table.append(line+['' for i in range(max(8,len(generalData[5])))]) #No. per cell
1138        table.append(generalData[7]+['' for i in range(max(8,len(generalData[5])))])  #At. wt.
1139        if generalData[1] == 'macromolecular' and mass > 0.0:
1140            table.append(['density',mass/(0.6022137*Volume),'Matthews coeff.',Volume/mass,'','','','',''])           
1141        else:
1142            table.append(['density',mass/(0.6022137*Volume),'','','','','','',''])
1143        table.append(generalData[8]+['' for i in range(max(8,len(generalData[5])))])
1144        table.append(generalData[9]+['' for i in range(max(8,len(generalData[5])))])
1145        Types = [wg.GRID_VALUE_STRING for i in range(max(8,len(generalData[5])))]
1146        generalTable = Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1147        General.SetTable(generalTable, True)
1148        General.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshGeneralGrid)
1149        General.SetMargins(0,0)
1150        General.SetColSize(0,100)
1151        General.SetColLabelSize(0)
1152        for c in range(max(8,len(generalData[5]))):
1153            if c > 0:
1154                General.SetReadOnly(0,c,isReadOnly=True)
1155                General.SetReadOnly(1,c,isReadOnly=True)
1156                General.SetReadOnly(2,c,isReadOnly=True)
1157            General.SetReadOnly(3,c,isReadOnly=True)                         #unit cell labels
1158            General.SetCellAlignment(3,c,wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
1159            if c < 4:
1160                General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,5))
1161                General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,5))
1162                General.SetReadOnly(9,c,isReadOnly=True)
1163            else:
1164                General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,3))
1165                General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,3))
1166            for r in range(6,12):
1167                General.SetReadOnly(r,c,isReadOnly=True)
1168        General.SetReadOnly(4,7,isReadOnly=True)                            #cell volume - no edit
1169        General.SetCellEditor(1,0,wg.GridCellChoiceEditor(['nuclear','modulated',   #phase type
1170            'magnetic','macromolecular','Pawley'],False))                           #- change only if no atoms
1171        if line:                                                    #no.of atoms not zero!
1172            General.SetReadOnly(1,0,isReadOnly=True)                #can't change phase type
1173        General.SetCellRenderer(4,0,wg.GridCellBoolRenderer())              #lattice parameters           
1174        General.SetCellEditor(4,0,wg.GridCellBoolEditor())
1175        SetLatticeParametersStyle(SGData,table)
1176        General.SetCellRenderer(5,1,wg.GridCellFloatRenderer(10,4))         #scale factor
1177        General.SetCellEditor(5,1,wg.GridCellFloatEditor(10,4))
1178        General.SetCellRenderer(5,0,wg.GridCellBoolRenderer())           
1179        General.SetCellEditor(5,0,wg.GridCellBoolEditor())
1180        General.SetCellRenderer(9,1,wg.GridCellFloatRenderer(8,3))
1181        General.SetCellRenderer(9,3,wg.GridCellFloatRenderer(8,3))
1182   
1183    def FillAtomsGrid():
1184       
1185        def RefreshAtomGrid(event):
1186            r,c =  event.GetRow(),event.GetCol()
1187            if r < 0:                          #on col label!
1188                sel = -1
1189                if Atoms.GetColLabelValue(c) == 'refine':
1190                    choice = ['F - site fraction','X - coordinates','U - thermal parameters']
1191                    dlg = wx.MultiChoiceDialog(self,'Select','Refinement controls',choice)
1192                    if dlg.ShowModal() == wx.ID_OK:
1193                        sel = dlg.GetSelections()
1194                        parms = ''
1195                        for x in sel:
1196                            parms += choice[x][0]                           
1197                elif Atoms.GetColLabelValue(c) == 'I/A':
1198                    choice = ['Isotropic','Anisotropic']
1199                    dlg = wx.SingleChoiceDialog(self,'Select','Thermal Motion',choice)
1200                    if dlg.ShowModal() == wx.ID_OK:
1201                        sel = dlg.GetSelection()
1202                        parms = choice[sel][0]
1203                if sel >= 0:
1204                    for r in range(Atoms.GetNumberRows()):
1205                        Atoms.SetCellValue(r,c,parms)
1206            elif c < 0:                    #picked atom row
1207                self.SelectedRow = r
1208            elif Atoms.GetColLabelValue(c) in ['x','y','z']:
1209                colLabel = Atoms.GetColLabelValue(c)
1210                if colLabel == 'x':
1211                    XYZ = [atomData[r][c],atomData[r][c+1],atomData[r][c+2]]
1212                elif colLabel == 'y':
1213                    XYZ = [atomData[r][c-1],atomData[r][c],atomData[r][c+1]]
1214                elif colLabel == 'z':
1215                    XYZ = [atomData[r][c-2],atomData[r][c-1],atomData[r][c]]
1216                if None in XYZ:
1217                    XYZ = [0,0,0]
1218                SScol = colLabels.index('site sym')
1219                Mulcol = colLabels.index('mult')
1220                E,SGData = G2spc.SpcGroup(generalData[2]['SpGrp'])
1221                Sytsym,Mult = G2spc.SytSym(XYZ,SGData)
1222                atomData[r][SScol] = Sytsym
1223                atomData[r][Mulcol] = Mult
1224                Atoms.ForceRefresh()
1225                   
1226        def AtomTypeSelect(event):
1227            r,c =  event.GetRow(),event.GetCol()
1228            if Atoms.GetColLabelValue(c) == 'Type':
1229                PE = G2elem.PickElement(self)
1230                if PE.ShowModal() == wx.ID_OK:
1231                    atomData[r][c] = PE.Elem.strip()
1232                PE.Destroy()
1233                Atoms.ForceRefresh()
1234            else:
1235                event.Skip()
1236       
1237        generalData = data['General']
1238        atomData = data['Atoms']
1239        Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,wg.GRID_VALUE_CHOICE+": ,X,XU,U,F,FX,FXU,FU",
1240            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',
1241            wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_STRING,wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_CHOICE+":I,A",
1242            wg.GRID_VALUE_FLOAT+':10,4',
1243            wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',
1244            wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4']
1245        colLabels = ['Name','Type','refine','x','y','z','frac','site sym','mult','I/A','Uiso','U11','U22','U33','U12','U13','U23']
1246        if generalData[1] == 'magnetic':
1247            colLabels += ['Mx','My','Mz']
1248            Types[2] = wg.GRID_VALUE_CHOICE+": ,X,XU,U,M,MX,MXU,MU,F,FX,FXU,FU,FM,FMX,FMU,"
1249            Types += [
1250                wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,4']
1251        elif generalData[1] == 'macromolecular':
1252            colLabels = ['res no','residue','chain'] + colLabels
1253            Types = [wg.GRID_VALUE_NUMBER,
1254                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",
1255                wg.GRID_VALUE_STRING] + Types       
1256        table = []
1257        rowLabels = []
1258        for i,atom in enumerate(atomData):
1259            table.append(atom)
1260            rowLabels.append(str(i+1))
1261        atomTable = Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1262        Atoms.SetTable(atomTable, True)
1263        Atoms.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshAtomGrid)
1264        Atoms.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, RefreshAtomGrid)
1265        Atoms.Bind(wg.EVT_GRID_SELECT_CELL, AtomTypeSelect)
1266        Atoms.SetMargins(0,0)
1267        Atoms.AutoSizeColumns(True)
1268        colType = colLabels.index('Type')
1269        colSS = colLabels.index('site sym')
1270        colIA = colLabels.index('I/A')
1271        for row in range(Atoms.GetNumberRows()):
1272            Atoms.SetReadOnly(row,colSS,True)                         #site sym
1273            Atoms.SetReadOnly(row,colSS+1,True)                       #Mult
1274            if Atoms.GetCellValue(row,colIA) == 'I':
1275                for i in range(2,8):
1276                    Atoms.SetCellRenderer(row,colIA+i,wg.GridCellStringRenderer())
1277                    Atoms.SetReadOnly(row,colIA+i,isReadOnly=True)
1278                    Atoms.SetCellValue(row,colIA+i,'')
1279            elif Atoms.GetCellValue(row,colIA) == 'A':
1280                Atoms.SetCellRenderer(row,colIA+1,wg.GridCellStringRenderer())
1281                Atoms.SetReadOnly(row,colIA+1,isReadOnly=True)
1282                Atoms.SetCellValue(row,colIA+1,'')
1283       
1284    def AtomAdd(event):
1285        atomData = data['Atoms']
1286        generalData = data['General']
1287        Ncol = Atoms.GetNumberCols()
1288        if generalData[1] == 'macromolecular':
1289            atomData.append([0,'UNK','','UNK','UNK','',0,0,0,0,'',0,'I',0.10,0,0,0,0,0,0])
1290        elif generalData[1] == 'nuclear':
1291            atomData.append(['UNK','UNK','',0,0,0,0,'',0,'I',0.01,0,0,0,0,0,0])
1292        event.StopPropagation()
1293        FillAtomsGrid()
1294           
1295    def AtomInsert(event):
1296        atomData = data['Atoms']
1297        generalData = data['General']
1298        Ncol = Atoms.GetNumberCols()
1299        if generalData[1][0] == 'macromolecular':
1300            atomData.append([0,'UNK','','UNK','UNK','',0,0,0,0,'',0,'I',0.10,0,0,0,0,0,0])
1301        elif generalData[1][0] == 'nuclear':
1302            atomData.append(['UNK','UNK','',0,0,0,0,'',0,'I',0.01,0,0,0,0,0,0])
1303        event.StopPropagation()
1304        FillAtomsGrid()
1305       
1306
1307    def UpdateDrawing():
1308        print 'Drawing'
1309       
1310    def FillPawleyReflectionsGrid():
1311       
1312        print 'Pawley reflections'
1313       
1314    def OnPageChanged(event):
1315        page = event.GetSelection()
1316        text = self.dataDisplay.GetPageText(page)
1317        if text == 'Atoms':
1318            self.dataFrame.SetMenuBar(self.dataFrame.AtomsMenu)
1319            self.dataFrame.Bind(wx.EVT_MENU, AtomAdd, id=wxID_ATOMSEDITADD)
1320            self.dataFrame.Bind(wx.EVT_MENU, AtomInsert, id=wxID_ATOMSEDITINSERT)
1321            FillAtomsGrid()           
1322        else:
1323            self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1324        event.Skip()
1325       
1326    if self.dataDisplay:
1327        self.dataDisplay.Destroy()                   
1328    PhaseName = self.PatternTree.GetItemText(item)
1329    self.dataFrame.SetLabel('Phase Data for '+PhaseName)
1330    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
1331   
1332    General = GSGrid(parent=self.dataDisplay)
1333    FillGeneralGrid()
1334    self.dataDisplay.AddPage(General,'General')
1335     
1336    GeneralData = data['General']
1337    if GeneralData[3] == 'Pawley':
1338        PawleyRefl = GSGrid(parent=self.dataDisplay)
1339        self.dataDisplay.AddPage(PawleyRefl,'Pawley reflections')
1340        FillPawleyReflectionsGrid()
1341    else:
1342        Atoms = GSGrid(parent=self.dataDisplay)
1343        FillAtomsGrid()
1344        self.dataDisplay.AddPage(Atoms,'Atoms')
1345
1346    Drawing = wx.Window(parent=self.dataDisplay)
1347    self.dataDisplay.AddPage(Drawing,'Drawing')
1348   
1349    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
1350    self.dataDisplay.SetSelection(oldPage)
1351   
1352                         
1353def GetPatternTreeItemId(self, parentId, itemText):
1354    item, cookie = self.PatternTree.GetFirstChild(parentId)
1355    while item:
1356        if self.PatternTree.GetItemText(item) == itemText:
1357            return item
1358        item, cookie = self.PatternTree.GetNextChild(parentId, cookie)
1359    return 0               
1360
1361def MovePatternTreeToGrid(self,item):
1362   
1363    oldPage = 0
1364    if self.dataFrame:
1365        if self.dataFrame.GetLabel() == 'Comments':
1366            data = [self.dataDisplay.GetValue()]
1367            self.dataDisplay.Clear() 
1368            Id = GetPatternTreeItemId(self,self.root, 'Comments')
1369            if Id: self.PatternTree.SetItemPyData(Id,data)
1370        if self.dataFrame.GetLabel() == 'Notebook':
1371            data = [self.dataDisplay.GetValue()]
1372            self.dataDisplay.Clear() 
1373            Id = GetPatternTreeItemId(self,self.root, 'Notebook')
1374            if Id: self.PatternTree.SetItemPyData(Id,data)
1375        if 'Phase Data for' in self.dataFrame.GetLabel():
1376            if self.dataDisplay: 
1377                oldPage = self.dataDisplay.GetSelection()
1378        self.dataFrame.Clear()
1379        self.dataFrame.SetLabel('')
1380    else:
1381       self.dataFrame = DataFrame(parent=self.mainPanel)
1382           
1383    self.PickId = 0
1384    self.PatternId = 0
1385    self.PeakFit.Enable(False)
1386    self.AutoPeakFit.Enable(False)
1387    self.IndexPeaks.Enable(False)
1388    self.RefineCell.Enable(False)
1389    parentID = self.root
1390    if item != self.root:
1391        parentID = self.PatternTree.GetItemParent(item)
1392    if self.PatternTree.GetItemParent(item) == self.root:
1393        self.PatternId = item
1394        self.ExportPattern.Enable(True)
1395        self.PickId = item
1396        if self.PatternTree.GetItemText(item) == 'Notebook':
1397            self.PatternId = 0
1398            self.ExportPattern.Enable(False)
1399            data = self.PatternTree.GetItemPyData(item)
1400            UpdateNotebook(self,data)
1401        elif self.PatternTree.GetItemText(item) == 'Controls':
1402            self.PatternId = 0
1403            self.ExportPattern.Enable(False)
1404            data = self.PatternTree.GetItemPyData(item)
1405            UpdateControls(self,data)
1406        elif 'IMG' in self.PatternTree.GetItemText(item):
1407            self.Image = item
1408            self.Img = 0
1409            self.PlotImage()
1410        elif 'PWDR' in self.PatternTree.GetItemText(item):
1411            self.PlotPatterns()
1412           
1413    elif self.PatternTree.GetItemText(parentID) == 'Phases':
1414        self.PickId = item
1415        data = self.PatternTree.GetItemPyData(item)
1416        UpdatePhaseData(self,item,data,oldPage)
1417    elif self.PatternTree.GetItemText(item) == 'Comments':
1418        self.PatternId = self.PatternTree.GetItemParent(item)
1419        self.PickId = item
1420        data = self.PatternTree.GetItemPyData(item)
1421        UpdateComments(self,data)
1422    elif self.PatternTree.GetItemText(item) == 'Image Controls':
1423        self.dataFrame.SetTitle('Image Controls')
1424        self.PickId = item
1425        data = self.PatternTree.GetItemPyData(item)
1426        UpdateImageControls(self,data)       
1427    elif self.PatternTree.GetItemText(item) == 'Peak List':
1428        self.PatternId = self.PatternTree.GetItemParent(item)
1429        self.PeakFit.Enable(True)
1430        self.ExportPeakList.Enable(True)
1431        self.AutoPeakFit.Enable(True)
1432        self.PickId = item
1433        data = self.PatternTree.GetItemPyData(item)
1434        UpdatePeakGrid(self,data)
1435        self.PlotPatterns()
1436    elif self.PatternTree.GetItemText(item) == 'Background':
1437        self.PatternId = self.PatternTree.GetItemParent(item)
1438        self.PickId = item
1439        data = self.PatternTree.GetItemPyData(item)
1440        UpdateBackgroundGrid(self,data)
1441        self.PlotPatterns()
1442    elif self.PatternTree.GetItemText(item) == 'Limits':
1443        self.PatternId = self.PatternTree.GetItemParent(item)
1444        self.PickId = item
1445        data = self.PatternTree.GetItemPyData(item)
1446        UpdateLimitsGrid(self,data)
1447        self.PlotPatterns()
1448    elif self.PatternTree.GetItemText(item) == 'Instrument Parameters':
1449        self.PatternId = self.PatternTree.GetItemParent(item)
1450        self.PickId = item
1451        data = self.PatternTree.GetItemPyData(item)
1452        UpdateInstrumentGrid(self,data)
1453        self.PlotPeakWidths()
1454    elif self.PatternTree.GetItemText(item) == 'Index Peak List':
1455        self.PatternId = self.PatternTree.GetItemParent(item)
1456        self.ExportPeakList.Enable(True)
1457        self.PickId = item
1458        data = self.PatternTree.GetItemPyData(item)
1459        UpdateIndexPeaksGrid(self,data)
1460        self.NewPlot = True
1461        self.PlotPatterns()
1462    elif self.PatternTree.GetItemText(item) == 'Unit Cells List':
1463        self.PatternId = self.PatternTree.GetItemParent(item)
1464        self.IndexPeaks.Enable(True)
1465        self.PickId = item
1466        data = self.PatternTree.GetItemPyData(item)
1467        if not data:
1468            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
1469            data.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0])      #Bravais lattice flags
1470            data.append([])                                 #empty cell list
1471            data.append([])                                 #empty dmin
1472            self.PatternTree.SetItemPyData(item,data)                             
1473        UpdateUnitCellsGrid(self,data)
1474        self.NewPlot = True
1475        self.PlotPatterns()
Note: See TracBrowser for help on using the repository browser.