source: trunk/GSASIIpwdGUI.py @ 428

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

begin something for plotting size & PO figures as well as mustrain
allow sorting of the indexing result by volume
fix weights for "STD" GSAS powder data files

  • Property svn:keywords set to Date Author Revision URL Id
File size: 87.8 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-11-22 21:59:22 +0000 (Tue, 22 Nov 2011) $
4# $Author: vondreele $
5# $Revision: 428 $
6# $URL: trunk/GSASIIpwdGUI.py $
7# $Id: GSASIIpwdGUI.py 428 2011-11-22 21:59:22Z vondreele $
8########### SVN repository information ###################
9import wx
10import wx.grid as wg
11import numpy as np
12import math
13import time
14import copy
15import cPickle
16import GSASIIpath
17import GSASIIpwd as G2pwd
18import GSASIIlattice as G2lat
19import GSASIIspc as G2spc
20import GSASIIindex as G2indx
21import GSASIIplot as G2plt
22import GSASIIgrid as G2gd
23import GSASIIElem as G2elem
24
25VERY_LIGHT_GREY = wx.Colour(235,235,235)
26
27# trig functions in degrees
28sind = lambda x: math.sin(x*math.pi/180.)
29tand = lambda x: math.tan(x*math.pi/180.)
30cosd = lambda x: math.cos(x*math.pi/180.)
31asind = lambda x: 180.*math.asin(x)/math.pi
32   
33def IsHistogramInAnyPhase(self,histoName):
34    phases = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
35    if phases:
36        item, cookie = self.PatternTree.GetFirstChild(phases)
37        while item:
38            data = self.PatternTree.GetItemPyData(item)
39            histoList = data['Histograms'].keys()
40            if histoName in histoList:
41                return True
42            item, cookie = self.PatternTree.GetNextChild(phases, cookie)
43        return False
44    else:
45        return False
46
47def SetDefaultSample():
48    return {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],
49        'DisplaceX':[0.0,False],'DisplaceY':[0.0,False],'Diffuse':[],
50        'Temperature':300.,'Pressure':1.0,'Humidity':0.0,
51        'Voltage':0.0,'Force':0.0,'Gonio. radius':200.0,
52        'Omega':0.0,'Chi':0.0,'Phi':0.0}   
53       
54def UpdatePeakGrid(self, data):
55    if self.dataDisplay:
56        self.dataFrame.Clear()
57   
58    def OnUnDo(event):
59        DoUnDo()
60        self.dataFrame.UnDo.Enable(False)
61       
62    def DoUnDo():
63        print 'Undo last refinement'
64        file = open(self.undofile,'rb')
65        PatternId = self.PatternId
66        for item in ['Background','Instrument Parameters','Peak List']:
67            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item),cPickle.load(file))
68            if self.dataDisplay.GetName() == item:
69                if item == 'Background':
70                    UpdateBackgroundGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
71                elif item == 'Instrument Parameters':
72                    UpdateInstrumentGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
73                elif item == 'Peak List':
74                    UpdatePeakGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
75            print item,' recovered'
76        file.close()
77       
78    def SaveState():
79        self.undofile = self.dirname+'\\GSASII.save'
80        file = open(self.undofile,'wb')
81        PatternId = self.PatternId
82        for item in ['Background','Instrument Parameters','Peak List']:
83            cPickle.dump(self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId,item)),file,1)
84        file.close()
85        self.dataFrame.UnDo.Enable(True)
86       
87    def OnLSQPeakFit(event):
88        OnPeakFit('LSQ')
89       
90    def OnOneCycle(event):
91        OnPeakFit('LSQ',oneCycle=True)
92       
93    def OnClearPeaks(event):
94        dlg = wx.MessageDialog(self,'Delete all peaks?','Clear peak list',wx.OK|wx.CANCEL)
95        try:
96            if dlg.ShowModal() == wx.ID_OK:
97                peaks = []
98        finally:
99            dlg.Destroy()
100        UpdatePeakGrid(self,peaks)
101        G2plt.PlotPatterns(self)
102       
103    def OnPeakFit(FitPgm,oneCycle=False):
104        SaveState()
105        controls = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.root, 'Controls'))
106        if not controls:
107            controls = {'deriv type':'analytic','min dM/M':0.0001,}     #fill in defaults if needed
108        print 'Peak Fitting with '+controls['deriv type']+' derivatives:'
109        PatternId = self.PatternId
110        PickId = self.PickId
111        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List'))
112        if not peaks:
113            self.ErrorDialog('No peaks!','Nothing to fit!')
114            return
115        background = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Background'))[0]
116        limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Limits'))[1]
117        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
118        data = self.PatternTree.GetItemPyData(PatternId)[1]
119        wx.BeginBusyCursor()
120        try:
121            G2pwd.DoPeakFit(FitPgm,peaks,background,limits,inst,data,oneCycle,controls)
122        finally:
123            wx.EndBusyCursor()   
124        UpdatePeakGrid(self,peaks)
125        G2plt.PlotPatterns(self)
126        print 'finished'
127        return
128       
129    def OnResetSigGam(event):
130        PatternId = self.PatternId
131        PickId = self.PickId
132        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List'))
133        if not peaks:
134            self.ErrorDialog('No peaks!','Nothing to do!')
135            return
136        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
137        Inst = dict(zip(inst[3],inst[1]))
138        print len(Inst['Type'])
139        for peak in peaks:
140            if Inst['Type'] in ['PXC','PNC']:
141                peak[4] = Inst['U']*tand(peak[0]/2.0)**2+Inst['V']*tand(peak[0]/2.0)+Inst['W']
142                peak[6] = Inst['X']/cosd(peak[0]/2.0)+Inst['Y']*tand(peak[0]/2.0)
143        UpdatePeakGrid(self,peaks)
144               
145    def RefreshPeakGrid(event):
146        r,c =  event.GetRow(),event.GetCol()
147       
148        event.StopPropagation()
149        data = self.PeakTable.GetData()
150        T = []
151        for peak in data:T.append(peak[0])
152        D = dict(zip(T,data))
153        T.sort()
154        X = []
155        for key in T: X.append(D[key])
156        data = X       
157       
158    def setBackgroundColors():
159       for r in range(self.dataDisplay.GetNumberRows()):
160           for c in range(self.dataDisplay.GetNumberCols()):
161               if self.dataDisplay.GetColLabelValue(c) in ['position','intensity','sigma','gamma']:
162                   if float(self.dataDisplay.GetCellValue(r,c)) < 0.:
163                       self.dataDisplay.SetCellBackgroundColour(r,c,wx.RED)
164                   else:
165                       self.dataDisplay.SetCellBackgroundColour(r,c,wx.WHITE)
166                                                 
167    def KeyEditPeakGrid(event):
168        rowList = self.dataDisplay.GetSelectedRows()
169        colList = self.dataDisplay.GetSelectedCols()
170        selectList = self.dataDisplay.GetSelectedCells()
171        data = self.PatternTree.GetItemPyData(self.PickId)
172        if event.GetKeyCode() == wx.WXK_RETURN:
173            event.Skip(True)
174        elif event.GetKeyCode() == wx.WXK_CONTROL:
175            event.Skip(True)
176        elif event.GetKeyCode() == wx.WXK_SHIFT:
177            event.Skip(True)
178        elif rowList:
179            self.dataDisplay.ClearSelection()
180            if event.GetKeyCode() == wx.WXK_DELETE:
181                self.dataDisplay.ClearGrid()
182                rowList.reverse()
183                nDel = 0
184                for row in rowList:
185                    self.PeakTable.DeleteRow(row)
186                    nDel += 1
187                if nDel:
188                    msg = wg.GridTableMessage(self.PeakTable, 
189                        wg.GRIDTABLE_NOTIFY_ROWS_DELETED,0,nDel)
190                    self.dataDisplay.ProcessTableMessage(msg)
191                data = self.PeakTable.GetData()
192                self.PatternTree.SetItemPyData(self.PickId,data[:-nDel])
193                self.dataDisplay.ForceRefresh()
194                setBackgroundColors()
195                if not len(self.PatternTree.GetItemPyData(self.PickId)): 
196                    self.dataFrame.PeakFit.Enable(False)
197                       
198        elif colList:
199            self.dataDisplay.ClearSelection()
200            key = event.GetKeyCode()
201            for col in colList:
202                if self.PeakTable.GetTypeName(0,col) == wg.GRID_VALUE_BOOL:
203                    if key == 89: #'Y'
204                        for row in range(self.PeakTable.GetNumberRows()): data[row][col]=True
205                    elif key == 78:  #'N'
206                        for row in range(self.PeakTable.GetNumberRows()): data[row][col]=False
207        elif selectList:
208            self.dataDisplay.ClearSelection()
209            key = event.GetKeyCode()
210            for row,col in selectList:
211                if self.PeakTable.GetTypeName(row,col) == wg.GRID_VALUE_BOOL:
212                    if key == 89: #'Y'
213                        data[row][col]=True
214                    elif key == 78:  #'N'
215                        data[row][col]=False
216        G2plt.PlotPatterns(self)
217           
218    self.dataFrame.SetMenuBar(self.dataFrame.PeakMenu)
219    if not self.dataFrame.GetStatusBar():
220        Status = self.dataFrame.CreateStatusBar()
221    self.Bind(wx.EVT_MENU, OnUnDo, id=G2gd.wxID_UNDO)
222    self.Bind(wx.EVT_MENU, OnLSQPeakFit, id=G2gd.wxID_LSQPEAKFIT)
223    self.Bind(wx.EVT_MENU, OnOneCycle, id=G2gd.wxID_LSQONECYCLE)
224    self.Bind(wx.EVT_MENU, OnClearPeaks, id=G2gd.wxID_CLEARPEAKS)
225    self.Bind(wx.EVT_MENU, OnResetSigGam, id=G2gd.wxID_RESETSIGGAM)
226    self.dataFrame.PeakFit.Enable(False)
227    if data:
228        self.dataFrame.PeakFit.Enable(True)
229        self.dataFrame.PFOneCycle.Enable(True)
230    self.PickTable = []
231    rowLabels = []
232    for i in range(len(data)): rowLabels.append(str(i+1))
233    colLabels = ['position','refine','intensity','refine','sigma','refine','gamma','refine']
234    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_BOOL,
235        wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
236        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL,
237        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL]
238    T = []
239    for peak in data:
240        T.append(peak[0])
241    D = dict(zip(T,data))
242    T.sort()
243    X = []
244    for key in T: X.append(D[key])
245    data = X       
246    self.PatternTree.SetItemPyData(self.PickId,data)
247    self.PeakTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
248    self.dataFrame.SetLabel('Peak List')
249    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)
250    self.dataDisplay.SetTable(self.PeakTable, True)
251    setBackgroundColors()                         
252    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshPeakGrid)
253    self.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPeakGrid)
254    self.dataDisplay.SetMargins(0,0)
255    self.dataDisplay.AutoSizeColumns(False)
256    self.dataFrame.setSizePosLeft([535,350])
257       
258def UpdateBackgroundGrid(self,data):
259    ValObj = {}
260   
261    def OnNewType(event):
262        data[0][0] = bakType.GetValue()
263       
264    def OnBakRef(event):
265        data[0][1] = bakRef.GetValue()
266       
267    def OnBakTerms(event):
268        data[0][2] = int(bakTerms.GetValue())
269        M = len(data[0])
270        N = data[0][2]+3
271        item = data[0]
272        if N > M:       #add terms
273            for i in range(M,N): 
274                item.append(0.0)
275        elif N < M:     #delete terms
276            for i in range(N,M):
277                del(item[-1])
278        self.PatternTree.SetItemPyData(BackId,data)
279        UpdateBackgroundGrid(self,data)
280       
281    def OnBakVal(event):
282        Obj = event.GetEventObject()
283        item = ValObj[Obj.GetId()][0]
284        try:
285            value = float(Obj.GetValue())
286        except ValueError:
287            value = data[0][item]
288        data[0][item] = value
289        Obj.SetValue('%10.4f'%(value))
290       
291    def OnBackCopy(event):
292        histList = ['All',]+G2gd.GetPatternTreeDataNames(self,['PWDR',])
293        copyList = []
294        dlg = wx.MultiChoiceDialog(self, 
295            'Copy parameters to which histograms?', 'Copy parameters', 
296            histList, wx.CHOICEDLG_STYLE)
297        try:
298            if dlg.ShowModal() == wx.ID_OK:
299                result = dlg.GetSelections()
300                for i in result: 
301                    copyList.append(histList[i])
302                if 'All' in copyList: 
303                    copyList = histList[1:]
304            for item in copyList:
305                Id = G2gd.GetPatternTreeItemId(self,self.root,item)
306                self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Background'),
307                    copy.copy(data))
308        finally:
309            dlg.Destroy()
310       
311       
312    if self.dataDisplay:
313        self.dataFrame.Clear()
314    self.dataDisplay = wx.Panel(self.dataFrame)
315    self.dataFrame.SetMenuBar(self.dataFrame.BackMenu)
316    self.dataFrame.SetLabel('Background')
317    if not self.dataFrame.GetStatusBar():
318        Status = self.dataFrame.CreateStatusBar()
319    self.Bind(wx.EVT_MENU,OnBackCopy,id=G2gd.wxID_BACKCOPY)
320    BackId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Background')
321    Choices = ['chebyschev','cosine','lin interpolate','inv interpolate','log interpolate']
322    mainSizer = wx.BoxSizer(wx.VERTICAL)
323    topSizer = wx.BoxSizer(wx.HORIZONTAL)
324    topSizer.Add(wx.StaticText(self.dataDisplay,-1,' Background function: '),0,wx.ALIGN_CENTER_VERTICAL)
325    bakType = wx.ComboBox(self.dataDisplay,value=data[0][0],
326            choices=Choices,style=wx.CB_READONLY|wx.CB_DROPDOWN)
327    bakType.Bind(wx.EVT_COMBOBOX, OnNewType)
328    topSizer.Add(bakType)
329    topSizer.Add((5,0),0)
330    bakRef = wx.CheckBox(self.dataDisplay,label=' Refine?')
331    bakRef.SetValue(bool(data[0][1]))
332    bakRef.Bind(wx.EVT_CHECKBOX, OnBakRef)
333    topSizer.Add(bakRef,0,wx.ALIGN_CENTER_VERTICAL)
334    topSizer.Add(wx.StaticText(self.dataDisplay,-1,' No. coeff.: '),0,wx.ALIGN_CENTER_VERTICAL)
335    bakTerms = wx.ComboBox(self.dataDisplay,-1,value=str(data[0][2]),choices=[str(i+1) for i in range(36)],
336        style=wx.CB_READONLY|wx.CB_DROPDOWN)
337    bakTerms.Bind(wx.EVT_COMBOBOX,OnBakTerms)
338    topSizer.Add(bakTerms,0,wx.ALIGN_CENTER_VERTICAL)
339    topSizer.Add((5,0),0)
340    mainSizer.Add(topSizer)
341    mainSizer.Add(wx.StaticText(self.dataDisplay,-1,' Background coefficients:'),0,wx.ALIGN_CENTER_VERTICAL)
342    bakSizer = wx.FlexGridSizer(1,5,5,5)
343    for i,value in enumerate(data[0][3:]):
344        bakVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,'%10.4f'%(value),style=wx.TE_PROCESS_ENTER)
345        bakSizer.Add(bakVal,0,wx.ALIGN_CENTER_VERTICAL)
346        ValObj[bakVal.GetId()] = [i+3]
347        bakVal.Bind(wx.EVT_TEXT_ENTER,OnBakVal)
348        bakVal.Bind(wx.EVT_KILL_FOCUS,OnBakVal)       
349    mainSizer.Add(bakSizer)
350    mainSizer.Layout()   
351    self.dataDisplay.SetSizer(mainSizer)
352    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
353       
354def UpdateLimitsGrid(self, data):
355    if self.dataDisplay:
356        self.dataFrame.Clear()
357       
358    def RefreshLimitsGrid(event):
359        event.StopPropagation()
360        data = self.LimitsTable.GetData()
361        old = data[0]
362        new = data[1]
363        new[0] = max(old[0],new[0])
364        new[1] = max(new[0],min(old[1],new[1]))
365        data = [old,new]
366        G2plt.PlotPatterns(self)
367       
368    def OnLimitCopy(event):
369        histList = ['All',]+G2gd.GetPatternTreeDataNames(self,['PWDR',])
370        copyList = []
371        dlg = wx.MultiChoiceDialog(self, 
372            'Copy limits to which histograms?', 'Copy limits', 
373            histList, wx.CHOICEDLG_STYLE)
374        try:
375            if dlg.ShowModal() == wx.ID_OK:
376                result = dlg.GetSelections()
377                for i in result: 
378                    copyList.append(histList[i])
379                if 'All' in copyList: 
380                    copyList = histList[1:]
381            for item in copyList:
382                Id = G2gd.GetPatternTreeItemId(self,self.root,item)
383                self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Limits'),
384                    copy.copy(data))
385        finally:
386            dlg.Destroy()
387       
388    self.LimitsTable = []
389    colLabels = ['Tmin','Tmax']
390    rowLabels = ['original','changed']
391    Types = 2*[wg.GRID_VALUE_FLOAT+':10,3',]
392    self.LimitsTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
393    self.dataFrame.SetLabel('Limits')
394    self.dataFrame.SetMenuBar(self.dataFrame.LimitMenu)
395    if not self.dataFrame.GetStatusBar():
396        Status = self.dataFrame.CreateStatusBar()
397    self.Bind(wx.EVT_MENU,OnLimitCopy,id=G2gd.wxID_LIMITCOPY)
398    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)
399    self.dataDisplay.SetTable(self.LimitsTable, True)
400    self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshLimitsGrid)               
401    self.dataDisplay.SetMargins(0,0)
402    self.dataDisplay.AutoSizeColumns(False)
403    self.dataFrame.setSizePosLeft([230,160])
404   
405def UpdateInstrumentGrid(self,data):
406    if len(data) > 3:                   #powder data
407        insVal = dict(zip(data[3],data[1]))
408        insDef = dict(zip(data[3],data[0]))
409        insRef = dict(zip(data[3],data[2]))
410        if 'N' in insDef['Type']:
411            del(insDef['Polariz.'])
412            del(insVal['Polariz.'])
413            del(insRef['Polariz.'])
414    else:                               #single crystal data
415        insVal = dict(zip(data[2],data[1]))
416        insDef = dict(zip(data[2],data[0]))
417        insRef = {}
418    ValObj = {}
419    RefObj = {}
420    waves = {'CuKa':[1.54051,1.54433],'TiKa':[2.74841,2.75207],'CrKa':[2.28962,2.29351],
421        'FeKa':[1.93597,1.93991],'CoKa':[1.78892,1.79278],'MoKa':[0.70926,0.713543],
422        'AgKa':[0.559363,0.563775]}
423       
424    def inst2data(inst,ref,data):
425        if len(data) > 3:
426            for i,item in enumerate(data[3]):
427                try:
428                    data[1][i] = inst[item]
429                    data[2][i] = ref[item]
430                except KeyError:
431                    data[1][i] = 0
432                    data[2][i] = 0                   
433        else:
434            for i,item in enumerate(data[2]):
435                data[1][i] = inst[item]           
436        return data
437       
438    def updateData(inst,ref):
439        return inst2data(inst,ref,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,
440            self.PatternId,'Instrument Parameters')))       
441   
442    def RefreshInstrumentGrid(event,doAnyway=False):
443        if doAnyway or event.GetRow() == 1:
444            peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
445            if 'P' in insVal['Type']:                                       #update powder peak parameters
446                for peak in peaks:
447                    peak[4] = insVal['U']*tand(peak[0]/2.0)**2+insVal['V']*tand(peak[0]/2.0)+insVal['W']
448                    peak[6] = insVal['X']/cosd(peak[0]/2.0)+insVal['Y']*tand(peak[0]/2.0)
449                                               
450    def OnReset(event):
451        insVal.update(insDef)
452        data = updateData(insVal,insRef)
453        RefreshInstrumentGrid(event,doAnyway=True)          #to get peaks updated
454        UpdateInstrumentGrid(self,data)
455       
456    def OnInstCopy(event):
457        histList = ['All',]+G2gd.GetPatternTreeDataNames(self,['PWDR',])
458        copyList = []
459        dlg = wx.MultiChoiceDialog(self, 
460            'Copy parameters to which histograms?', 'Copy parameters', 
461            histList, wx.CHOICEDLG_STYLE)
462        try:
463            if dlg.ShowModal() == wx.ID_OK:
464                result = dlg.GetSelections()
465                for i in result: 
466                    copyList.append(histList[i])
467                if 'All' in copyList: 
468                    copyList = histList[1:]
469            for item in copyList:
470                Id = G2gd.GetPatternTreeItemId(self,self.root,item)
471                instData = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Instrument Parameters'))
472                if len(data) == len(instData):                          #don't mix lam & lam1/lam2 parms!
473                    for i,item in enumerate(data[1:]):                  #skip default values in tuple
474                        instData[i+1][:-1] = copy.copy(item[:-1])       #skip azimuth at end
475                else:
476                    print item+' not copied - instrument parameters not commensurate'
477        finally:
478            dlg.Destroy()
479       
480    def OnWaveChange(event):
481        if 'Lam' in insVal:           
482            data[0] = data[0][:1]+tuple(waves['CuKa'])+(.5,)+data[0][2:]
483            data[1] = data[1][:1]+waves['CuKa']+[.5,]+data[1][2:]
484            data[2] = data[2][:1]+[0,0,0,]+data[2][2:]
485            data[3] = data[3][:1]+['Lam1','Lam2','I(L2)/I(L1)',]+data[3][2:]           
486        else:
487            data[0] = data[0][:2]+data[0][4:]
488            data[1] = data[1][:2]+data[1][4:]
489            data[2] = data[2][:2]+data[2][4:]
490            data[3] = data[3][:1]+['Lam',]+data[3][4:]           
491        UpdateInstrumentGrid(self,data)
492               
493    def OnNewType(event):
494        insVal['Type'] = typePick.GetValue()
495        data = updateData(insVal,insRef)
496        UpdateInstrumentGrid(self,data)
497       
498    def OnLamPick(event):
499        lamType = lamPick.GetValue()
500        insVal['Lam1'] = waves[lamType][0]
501        insVal['Lam2'] = waves[lamType][1]
502        data = updateData(insVal,insRef)
503        UpdateInstrumentGrid(self,data)
504                 
505    def OnRatValue(event):
506        try:
507            value = float(ratVal.GetValue())
508            if value < 0:
509                raise ValueError
510        except ValueError:
511            value = insVal['I(L2)/I(L1)']
512        insVal['I(L2)/I(L1)'] = value
513        ratVal.SetValue('%10.4f'%(value))
514        data = updateData(insVal,insRef)
515       
516    def OnRatRef(event):
517        insRef['I(L2)/I(L1)'] = ratRef.GetValue()
518        data = updateData(insVal,insRef)
519       
520    def OnWaveValue(event):
521        try:
522            value = float(waveVal.GetValue())
523            if value < 0:
524                raise ValueError
525        except ValueError:
526            value = insVal['Lam']
527        insVal['Lam'] = value
528        waveVal.SetValue('%10.6f'%(value))
529        data = updateData(insVal,insRef)
530       
531    def OnWaveRef(event):
532        insRef['Lam'] = waveRef.GetValue()
533        data = updateData(insVal,insRef)
534       
535    def OnItemValue(event):
536        Obj = event.GetEventObject()
537        item,fmt = ValObj[Obj.GetId()]
538        try:
539            value = float(Obj.GetValue())
540        except ValueError:
541            value = insVal[item]
542        insVal[item] = value
543        Obj.SetValue(fmt%(value))
544        data = updateData(insVal,insRef)
545       
546    def OnItemRef(event):
547        Obj = event.GetEventObject()
548        item = RefObj[Obj.GetId()]
549        insRef[item] = Obj.GetValue()
550        data = updateData(insVal,insRef)
551               
552    if self.dataDisplay:
553        self.dataFrame.Clear()
554    histoName = self.PatternTree.GetItemPyData(self.PatternId)[-1]
555    ifHisto = IsHistogramInAnyPhase(self,histoName)
556    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
557    self.dataFrame.SetLabel('Instrument Parameters')
558    self.dataDisplay = wx.Panel(self.dataFrame)
559    instSizer = wx.FlexGridSizer(2,6,5,5)
560    instSizer.Add(wx.StaticText(self.dataDisplay,-1,' Histogram Type:'),0,wx.ALIGN_CENTER_VERTICAL)
561    if 'P' in insVal['Type']:                   #powder data
562        self.dataFrame.SetMenuBar(self.dataFrame.InstMenu)
563        if not self.dataFrame.GetStatusBar():
564            Status = self.dataFrame.CreateStatusBar()
565        self.Bind(wx.EVT_MENU,OnReset,id=G2gd.wxID_INSTPRMRESET)
566        self.Bind(wx.EVT_MENU,OnInstCopy,id=G2gd.wxID_INSTCOPY)
567        self.Bind(wx.EVT_MENU,OnWaveChange,id=G2gd.wxID_CHANGEWAVETYPE)       
568        typePick = wx.ComboBox(self.dataDisplay,value=insVal['Type'],
569            choices=['PXC','PNC','PNT'],style=wx.CB_READONLY|wx.CB_DROPDOWN)
570        typePick.Bind(wx.EVT_COMBOBOX, OnNewType)
571        instSizer.Add(typePick,0,wx.ALIGN_CENTER_VERTICAL)
572        if 'C' in insVal['Type']:               #constant wavelength
573            #patch
574            if 'Azimuth' not in insVal:
575                insVal['Azimuth'] = 0.0
576                insDef['Azimuth'] = 0.0
577                insRef['Azimuth'] = False
578            #end of patch
579            instSizer.Add(wx.StaticText(self.dataDisplay,-1,' Azimuth: %7.2f'%(insVal['Azimuth'])),0,wx.ALIGN_CENTER_VERTICAL)
580            if 'Lam1' in insVal:
581                instSizer.Add((5,5),0)
582                instSizer.Add((5,5),0)
583                instSizer.Add((5,5),0)
584                instSizer.Add(wx.StaticText(self.dataDisplay,-1,' Ka1/Ka2:'),
585                        0,wx.ALIGN_CENTER_VERTICAL)
586                instSizer.Add(wx.StaticText(self.dataDisplay,-1,'%8.6f/%8.6f'%(insVal['Lam1'],insVal['Lam2'])),
587                        0,wx.ALIGN_CENTER_VERTICAL)
588                waveSizer = wx.BoxSizer(wx.HORIZONTAL)
589                waveSizer.Add(wx.StaticText(self.dataDisplay,-1,'Select:'),0,wx.ALIGN_CENTER_VERTICAL)
590                choice = ['TiKa','CrKa','FeKa','CoKa','CuKa','MoKa','AgKa']
591                lamPick = wx.ComboBox(self.dataDisplay,value=' ',choices=choice,style=wx.CB_READONLY|wx.CB_DROPDOWN)
592                lamPick.Bind(wx.EVT_COMBOBOX, OnLamPick)
593                waveSizer.Add(lamPick,0)
594                instSizer.Add(waveSizer,0)
595                instSizer.Add(wx.StaticText(self.dataDisplay,-1,' I(L2)/I(L1): (%10.4f)'%(insDef['I(L2)/I(L1)'])),
596                        0,wx.ALIGN_CENTER_VERTICAL)
597                ratVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,'%10.4f'%(insVal['I(L2)/I(L1)']),style=wx.TE_PROCESS_ENTER)
598                ratVal.Bind(wx.EVT_TEXT_ENTER,OnRatValue)
599                ratVal.Bind(wx.EVT_KILL_FOCUS,OnRatValue)
600                instSizer.Add(ratVal,0)
601                ratRef = wx.CheckBox(self.dataDisplay,label=' Refine?')
602                ratRef.SetValue(bool(insRef['I(L2)/I(L1)']))
603                ratRef.Bind(wx.EVT_CHECKBOX, OnRatRef)
604                instSizer.Add(ratRef,0,wx.ALIGN_CENTER_VERTICAL)
605               
606            else:
607                instSizer.Add(wx.StaticText(self.dataDisplay,-1,' Lam: (%10.6f)'%(insDef['Lam'])),
608                    0,wx.ALIGN_CENTER_VERTICAL)
609                waveVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,'%10.6f'%(insVal['Lam']),style=wx.TE_PROCESS_ENTER)
610                waveVal.Bind(wx.EVT_TEXT_ENTER,OnWaveValue)
611                waveVal.Bind(wx.EVT_KILL_FOCUS,OnWaveValue)
612                instSizer.Add(waveVal,0,wx.ALIGN_CENTER_VERTICAL)
613                if ifHisto:
614                    waveRef = wx.CheckBox(self.dataDisplay,label=' Refine?')
615                    waveRef.SetValue(bool(insRef['Lam']))
616                    waveRef.Bind(wx.EVT_CHECKBOX, OnWaveRef)
617                    instSizer.Add(waveRef,0,wx.ALIGN_CENTER_VERTICAL)
618                else:
619                    instSizer.Add((5,5),0)
620            for item in ['Zero','Polariz.']:
621                fmt = '%10.3f'
622                Fmt = ' %s: ('+fmt+')'
623                if item in insDef:
624                    instSizer.Add(wx.StaticText(self.dataDisplay,-1,Fmt%(item,insDef[item])),
625                            0,wx.ALIGN_CENTER_VERTICAL)
626                    itemVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,fmt%(insVal[item]),style=wx.TE_PROCESS_ENTER)
627                    ValObj[itemVal.GetId()] = [item,fmt]
628                    itemVal.Bind(wx.EVT_TEXT_ENTER,OnItemValue)
629                    itemVal.Bind(wx.EVT_KILL_FOCUS,OnItemValue)
630                    instSizer.Add(itemVal,0,wx.ALIGN_CENTER_VERTICAL)
631                    if ifHisto:
632                        itemRef = wx.CheckBox(self.dataDisplay,wx.ID_ANY,label=' Refine?')
633                        itemRef.SetValue(bool(insRef[item]))
634                        RefObj[itemRef.GetId()] = item
635                        itemRef.Bind(wx.EVT_CHECKBOX, OnItemRef)
636                        instSizer.Add(itemRef,0,wx.ALIGN_CENTER_VERTICAL)
637                    else:
638                        instSizer.Add((5,5),0)
639                else:                           #skip Polariz. for neutrons
640                    instSizer.Add((5,5),0)
641                    instSizer.Add((5,5),0)
642                    instSizer.Add((5,5),0)
643            for item in ['U','V','W','X','Y','SH/L']:
644                fmt = '%10.3f'
645                if item == 'SH/L':
646                    fmt = '%10.5f'
647                Fmt = ' %s: ('+fmt+')'
648                instSizer.Add(wx.StaticText(self.dataDisplay,-1,Fmt%(item,insDef[item])),
649                        0,wx.ALIGN_CENTER_VERTICAL)
650                itemVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,fmt%(insVal[item]),style=wx.TE_PROCESS_ENTER)
651                ValObj[itemVal.GetId()] = [item,fmt]
652                itemVal.Bind(wx.EVT_TEXT_ENTER,OnItemValue)
653                itemVal.Bind(wx.EVT_KILL_FOCUS,OnItemValue)
654                instSizer.Add(itemVal,0,wx.ALIGN_CENTER_VERTICAL)
655                itemRef = wx.CheckBox(self.dataDisplay,wx.ID_ANY,label=' Refine?')
656                itemRef.SetValue(bool(insRef[item]))
657                RefObj[itemRef.GetId()] = item
658                itemRef.Bind(wx.EVT_CHECKBOX, OnItemRef)
659                instSizer.Add(itemRef,0,wx.ALIGN_CENTER_VERTICAL)
660        else:                                   #time of flight (neutrons)
661            pass                                #for now
662       
663       
664
665    else:                       #single crystal data
666        typePick = wx.ComboBox(self.dataDisplay,value=insVal['Type'],
667            choices=['SXC','SNC','SNT'],style=wx.CB_READONLY|wx.CB_DROPDOWN)
668        typePick.Bind(wx.EVT_COMBOBOX, OnNewType)
669        instSizer.Add(typePick,0,wx.ALIGN_CENTER_VERTICAL)
670        if 'C' in insVal['Type']:               #constant wavelength
671            instSizer.Add(wx.StaticText(self.dataDisplay,-1,' Lam: %10.6f'%(insDef['Lam'])),
672                    0,wx.ALIGN_CENTER_VERTICAL)
673        else:                                   #time of flight (neutrons)
674            pass                                #for now
675       
676    mainSizer = wx.BoxSizer(wx.VERTICAL)
677    mainSizer.Add(instSizer,0)
678    mainSizer.Layout()   
679    self.dataDisplay.SetSizer(mainSizer)
680    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
681   
682def UpdateSampleGrid(self,data):
683   
684    def OnSampleCopy(event):
685        histName = self.PatternTree.GetItemText(self.PatternId)
686        copyNames = ['Scale',]
687        dataType = data['Type']
688        histType = 'HKLF'
689        if 'PWDR' in histName:          #else HKLF - only Scale
690            histType = 'PWDR'
691            if 'Debye' in dataType:
692                copyNames += ['DisplaceX','DisplaceY','Absorption']
693            else:       #Bragg-Brentano
694                copyNames += ['Shift','Transparency']
695        copyDict = {}
696        for parm in copyNames:
697            copyDict[parm] = data[parm]
698        histList = ['All '+histType,]
699        item, cookie = self.PatternTree.GetFirstChild(self.root)
700        while item:
701            name = self.PatternTree.GetItemText(item)
702            if histType in name and name != histName:
703                histList.append(name)
704            item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
705        if len(histList) == 1:      #nothing to copy to!
706            return
707        copyList = []
708        dlg = wx.MultiChoiceDialog(self, 
709            'Copy parameters to which histograms?', 'Copy parameters', 
710            histList, wx.CHOICEDLG_STYLE)
711        try:
712            if dlg.ShowModal() == wx.ID_OK:
713                result = dlg.GetSelections()
714                for i in result: 
715                    copyList.append(histList[i])
716                if 'All '+histType in copyList: 
717                    copyList = histList[1:]
718            for item in copyList:
719                Id = G2gd.GetPatternTreeItemId(self,self.root,item)
720                sampleData = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Sample Parameters'))
721                sampleData.update(copy.deepcopy(copyDict))
722        finally:
723            dlg.Destroy()
724
725    if self.dataDisplay:
726        self.dataFrame.Clear()
727    self.dataFrame.SetMenuBar(self.dataFrame.SampleMenu)
728    self.dataFrame.SetLabel('Sample Parameters')
729    self.Bind(wx.EVT_MENU, OnSampleCopy, id=G2gd.wxID_SAMPLECOPY)
730    if not self.dataFrame.GetStatusBar():
731        Status = self.dataFrame.CreateStatusBar()   
732    self.dataDisplay = wx.Panel(self.dataFrame)
733
734#patch
735    if not 'Gonio. radius' in data:
736        data['Gonio. radius'] = 200.0
737    if not 'Omega' in data:
738        data.update({'Omega':0.0,'Chi':0.0,'Phi':0.0})
739#patch end
740   
741    parms = [['Gonio. radius',' Goniometer radius(mm): ','%.2f',]]
742    if data['Type'] == 'Debye-Scherrer':
743        parms += [['DisplaceX',u' Sample X displacement(\xb5m): ','%.2f',],
744            ['DisplaceY',u' Sample Y displacement(\xb5m): ','%.2f',],
745            ['Absorption',u' Sample absorption(\xb5r): ','%.4f',],]
746    elif data['Type'] == 'Bragg-Brentano':
747        parms += [['Shift',u' Sample displacement(\xb5m): ','%.2f',],
748            ['Transparency',u' Sample transparency(1/\xb5eff,cm): ','%.4f'],]
749    parms.append(['Omega','Goniometer omega:','%.2f'])
750    parms.append(['Chi','Goniometer chi:','%.2f'])
751    parms.append(['Phi','Goniometer phi:','%.2f'])
752    parms.append(['Temperature',' Sample temperature(K): ','%.2f'])
753    parms.append(['Pressure',' Sample pressure(MPa): ','%.3f'])
754    parms.append(['Humidity',' Sample humidity(%): ','%.1f'])
755    parms.append(['Voltage',' Sample voltage(V): ','%.3f'])
756    parms.append(['Force',' Applied load(MN): ','%.3f'])
757    objList = {}
758
759    def OnScaleRef(event):
760        Obj = event.GetEventObject()
761        data['Scale'][1] = Obj.GetValue()
762       
763    def OnScaleVal(event):
764        Obj = event.GetEventObject()
765        try:
766            scale = float(Obj.GetValue())
767            if scale > 0:
768                data['Scale'][0] = scale
769        except ValueError:
770            pass
771        Obj.SetValue("%.4f"%(data['Scale'][0]))          #reset in case of error
772       
773    def OnHistoType(event):
774        Obj = event.GetEventObject()
775        data['Type'] = Obj.GetValue()
776        if data['Type'] == 'Bragg-Brentano' and 'Shift' not in data:    #set up defaults for new type(s)
777            data['Shift'] = [0.0,False]
778            data['Transparency'] = [0.0,False]
779        self.dataDisplay.Destroy()
780        UpdateSampleGrid(self,data)
781       
782    def OnParmRef(event):
783        Obj = event.GetEventObject()
784        parm = objList[Obj.GetId()]
785        data[parm][1] = Obj.GetValue()
786       
787    def OnParmVal(event):
788        Obj = event.GetEventObject()
789        parm = objList[Obj.GetId()]
790        try:
791            if 'list' in str(type(data[parm[0]])): 
792                data[parm[0]][0] = float(Obj.GetValue())
793            else:
794                data[parm[0]] = float(Obj.GetValue())
795        except ValueError:
796            pass
797        if 'list' in str(type(data[parm[0]])): 
798            Obj.SetValue(parm[2]%(data[parm[0]][0]))          #reset in case of error
799        else:
800            Obj.SetValue(parm[2]%(data[parm[0]]))          #reset in case of error
801               
802    mainSizer = wx.BoxSizer(wx.VERTICAL)
803    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Sample parameters: '),0,wx.ALIGN_CENTER_VERTICAL)
804    mainSizer.Add((5,5),0)
805    parmSizer = wx.FlexGridSizer(9,2,5,0)
806    scaleRef = wx.CheckBox(self.dataDisplay,label=' Histogram scale factor: ')
807    scaleRef.SetValue(data['Scale'][1])
808    scaleRef.Bind(wx.EVT_CHECKBOX, OnScaleRef)
809    parmSizer.Add(scaleRef,0,wx.ALIGN_CENTER_VERTICAL)
810    scaleVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,
811        '%.4f'%(data['Scale'][0]),style=wx.TE_PROCESS_ENTER)
812    scaleVal.Bind(wx.EVT_TEXT_ENTER,OnScaleVal)
813    scaleVal.Bind(wx.EVT_KILL_FOCUS,OnScaleVal)
814    parmSizer.Add(scaleVal,0,wx.ALIGN_CENTER_VERTICAL)
815    typeSizer = wx.BoxSizer(wx.HORIZONTAL)
816    choices = ['Debye-Scherrer','Bragg-Brentano',]
817    histoType = wx.ComboBox(self.dataDisplay,wx.ID_ANY,value=data['Type'],choices=choices,
818        style=wx.CB_READONLY|wx.CB_DROPDOWN)
819    histoType.Bind(wx.EVT_COMBOBOX, OnHistoType)
820    parmSizer.Add(histoType)
821    parmSizer.Add((5,5),0)
822   
823    for parm in parms:
824        if 'list' in str(type(data[parm[0]])):
825            parmRef = wx.CheckBox(self.dataDisplay,label=parm[1])
826            objList[parmRef.GetId()] = parm[0]
827            parmRef.SetValue(data[parm[0]][1])
828            parmRef.Bind(wx.EVT_CHECKBOX, OnParmRef)
829            parmSizer.Add(parmRef,0,wx.ALIGN_CENTER_VERTICAL)
830            parmVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,
831                parm[2]%(data[parm[0]][0]),style=wx.TE_PROCESS_ENTER)
832        else:
833            parmSizer.Add(wx.StaticText(self.dataDisplay,label=parm[1]),
834                0,wx.ALIGN_CENTER_VERTICAL)
835            parmVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,
836                parm[2]%(data[parm[0]]),style=wx.TE_PROCESS_ENTER)       
837        objList[parmVal.GetId()] = parm
838        parmVal.Bind(wx.EVT_TEXT_ENTER,OnParmVal)
839        parmVal.Bind(wx.EVT_KILL_FOCUS,OnParmVal)
840        parmSizer.Add(parmVal,1,wx.EXPAND)
841    mainSizer.Add(parmSizer)
842    mainSizer.Add((0,5),0)   
843   
844    mainSizer.Layout()   
845    self.dataDisplay.SetSizer(mainSizer)
846    Size = mainSizer.Fit(self.dataFrame)
847    self.dataDisplay.SetSize(Size)
848    self.dataFrame.setSizePosLeft(Size)
849               
850def UpdateIndexPeaksGrid(self, data):
851    IndexId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Index Peak List')
852   
853    def RefreshIndexPeaksGrid(event):
854        r,c =  event.GetRow(),event.GetCol()
855        data = self.IndexPeaksTable.GetData()
856        if c == 2:
857            if data[r][c]:
858                data[r][c] = False
859            else:
860                data[r][c] = True
861            self.IndexPeaksTable.SetData(data)
862            self.PatternTree.SetItemPyData(IndexId,data)
863            self.dataDisplay.ForceRefresh()
864           
865    def OnReload(event):
866        data = []
867        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
868        for peak in peaks:
869            dsp = inst[1]/(2.0*sind(peak[0]/2.0))
870            data.append([peak[0],peak[2],True,False,0,0,0,dsp,0.0])
871        self.PatternTree.SetItemPyData(IndexId,data)
872        UpdateIndexPeaksGrid(self,data)
873       
874    def KeyEditPickGrid(event):
875        colList = self.dataDisplay.GetSelectedCols()
876        rowList = self.dataDisplay.GetSelectedRows()
877        data = self.PatternTree.GetItemPyData(IndexId)
878        if event.GetKeyCode() == wx.WXK_RETURN:
879            event.Skip(True)
880        elif event.GetKeyCode() == wx.WXK_CONTROL:
881            event.Skip(True)
882        elif event.GetKeyCode() == wx.WXK_SHIFT:
883            event.Skip(True)
884        elif colList:
885            self.dataDisplay.ClearSelection()
886            key = event.GetKeyCode()
887            for col in colList:
888                if self.IndexPeaksTable.GetColLabelValue(col) in ['use','refine']:
889                    if key == 89: #'Y'
890                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=True
891                    elif key == 78:  #'N'
892                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=False
893           
894    if self.dataDisplay:
895        self.dataFrame.Clear()
896    if not self.dataFrame.GetStatusBar():
897        Status = self.dataFrame.CreateStatusBar()
898    if 'PWD' in self.PatternTree.GetItemText(self.PatternId):
899        self.dataFrame.SetMenuBar(self.dataFrame.IndPeaksMenu)
900        self.Bind(wx.EVT_MENU, OnReload, id=G2gd.wxID_INDXRELOAD)
901    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
902    self.dataFrame.IndexPeaks.Enable(False)
903    self.IndexPeaksTable = []
904    if data:
905        self.dataFrame.IndexPeaks.Enable(True)
906        cells = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List'))
907        if cells:
908            cellist = cells[2]
909            dmin = cells[3]
910            self.HKL = []
911            for i,cell in enumerate(cellist):
912                if cell[-1]:
913                    ibrav = cell[2]
914                    A = G2lat.cell2A(cell[3:9])
915                    self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
916                    G2indx.IndexPeaks(data,self.HKL)
917                    for hkl in self.HKL:
918                        hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
919    rowLabels = []
920    for i in range(len(data)): rowLabels.append(str(i+1))
921    colLabels = ['position','intensity','use','indexed','h','k','l','d-obs','d-calc']
922    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
923        wg.GRID_VALUE_BOOL,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,
924        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5']
925    self.PatternTree.SetItemPyData(IndexId,data)
926    self.IndexPeaksTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
927    self.dataFrame.SetLabel('Index Peak List')
928    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)               
929    self.dataDisplay.SetTable(self.IndexPeaksTable, True)
930    for r in range(self.dataDisplay.GetNumberRows()):
931        for c in range(self.dataDisplay.GetNumberCols()):
932            if c == 2:
933                self.dataDisplay.SetReadOnly(r,c,isReadOnly=False)
934            else:
935                self.dataDisplay.SetReadOnly(r,c,isReadOnly=True)
936    self.dataDisplay.Bind(wg.EVT_GRID_CELL_LEFT_CLICK, RefreshIndexPeaksGrid)
937    self.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPickGrid)                 
938    self.dataDisplay.SetMargins(0,0)
939    self.dataDisplay.AutoSizeColumns(False)
940    self.dataFrame.setSizePosLeft([490,300])
941 
942def UpdateUnitCellsGrid(self, data):
943    UnitCellsId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List')
944    bravaisSymb = ['Fm3m','Im3m','Pm3m','R3-H','P6/mmm','I4/mmm',
945        'P4/mmm','Fmmm','Immm','Cmmm','Pmmm','C2/m','P2/m','P1']
946    spaceGroups = ['F m 3 m','I m 3 m','P m 3 m','R -3 H','P 6/m m m','I 4/m m m',
947        'P 4/m m m','F m m m','I m m m','C m m m','P m m m','C 2/m','P 2/m','P -1']
948       
949    def SetLattice(controls):
950        ibrav = bravaisSymb.index(controls[5])
951        if ibrav in [0,1,2]:
952            controls[7] = controls[8] = controls[6]
953            controls[9] = controls[10] = controls[11] = 90.
954        elif ibrav in [3,4,5,6]:
955            controls[7] = controls[6]
956            controls[9] = controls[10] = controls[11] = 90.
957            if ibrav in [3,4]:
958                controls[11] = 120.
959        elif ibrav in [7,8,9,10]:
960            controls[9] = controls[10] = controls[11] = 90.
961        elif ibrav in [11,12]:
962            controls[9] = controls[11] = 90.  # b unique
963        if len(controls) < 13: controls.append(0)
964        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
965        return ibrav
966       
967    def OnNcNo(event):
968        controls[2] = NcNo.GetValue()
969       
970    def OnStartVol(event):
971        try:
972            stVol = int(float(startVol.GetValue()))
973            if stVol < 25:
974                raise ValueError
975        except ValueError:
976            stVol = 25
977        controls[3] = stVol
978        startVol.SetValue("%d"%(stVol))
979       
980    def OnBravais(event):
981        Obj = event.GetEventObject()
982        bravais[bravList.index(Obj.GetId())] = Obj.GetValue()
983       
984    def OnZero(event):
985        try:
986            Zero = min(0.1,max(-0.1,float(zero.GetValue())))
987        except ValueError:
988            Zero = 0.0
989        controls[1] = Zero
990        zero.SetValue("%.4f"%(Zero))
991       
992    def OnZeroVar(event):
993        controls[0] = zeroVar.GetValue()
994       
995    def OnBravSel(event):
996        controls[5] = bravSel.GetString(bravSel.GetSelection())       
997        UpdateUnitCellsGrid(self,data)
998       
999    def OnCellChange(event):
1000        ibrav = bravaisSymb.index(controls[5])
1001        Obj = event.GetEventObject()
1002        ObjId = cellList.index(Obj.GetId())
1003        try:
1004            value = max(1.0,float(Obj.GetValue()))
1005        except ValueError:
1006            if ObjId < 3:               #bad cell edge - reset
1007                value = controls[6+ObjId]
1008            else:                       #bad angle
1009                value = 90.
1010        if ibrav in [0,1,2]:
1011            controls[6] = controls[7] = controls[8] = value
1012            controls[9] = controls[10] = controls[11] = 90.0
1013            Obj.SetValue("%.5f"%(controls[6]))
1014        elif ibrav in [3,4,5,6]:
1015            if ObjId == 0:
1016                controls[6] = controls[7] = value
1017                Obj.SetValue("%.5f"%(controls[6]))
1018            else:
1019                controls[8] = value
1020                Obj.SetValue("%.5f"%(controls[8]))
1021            controls[9] = controls[10] = controls[11] = 90.0
1022            if ibrav in [3,4]:
1023                controls[11] = 120.
1024        elif ibrav in [7,8,9,10]:
1025            controls[6+ObjId] = value
1026            Obj.SetValue("%.5f"%(controls[6+ObjId]))
1027            controls[9] = controls[10] = controls[11] = 90.0
1028        elif ibrav in [11,12]:
1029            controls[9] = controls[11] = 90.0
1030            if ObjId != 3:
1031                controls[6+ObjId] = value
1032                Obj.SetValue("%.5f"%(controls[6+ObjId]))
1033            else:
1034                controls[10] = value
1035                Obj.SetValue("%.3f"%(controls[10]))
1036        else:
1037            controls[6+ObjId] = value
1038            if ObjId < 3:
1039                Obj.SetValue("%.5f"%(controls[6+ObjId]))
1040            else:
1041                Obj.SetValue("%.3f"%(controls[6+ObjId]))
1042        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
1043        volVal.SetValue("%.3f"%(controls[12]))
1044       
1045    def OnHklShow(event):
1046        PatternId = self.PatternId
1047        PickId = self.PickId   
1048        limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Limits'))[1]
1049        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
1050        cell = controls[6:12]
1051        A = G2lat.cell2A(cell)
1052        ibrav = bravaisSymb.index(controls[5])
1053        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
1054        inst = dict(zip(inst[3],inst[1]))
1055        if 'Lam' in inst:
1056            wave = inst['Lam']
1057        else:
1058            wave = inst['Lam1']
1059        dmin = wave/(2.0*sind(limits[1]/2.0))
1060        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
1061        for hkl in self.HKL:
1062            hkl.append(2.0*asind(wave/(2.*hkl[3]))+controls[1])             
1063        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1064            G2plt.PlotPowderLines(self)
1065        else:
1066            G2plt.PlotPatterns(self)
1067           
1068    def OnSortCells(event):
1069        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)
1070        c =  event.GetCol()
1071        if colLabels[c] == 'M20':
1072            cells = G2indx.sortM20(cells)
1073        elif colLabels[c] == 'Volume':
1074            cells = G2indx.sortVolume(cells)
1075        else:
1076            return
1077        data = [controls,bravais,cells,dmin]
1078        self.PatternTree.SetItemPyData(UnitCellsId,data)
1079        UpdateUnitCellsGrid(self,data)
1080
1081       
1082    def CopyUnitCell(event):
1083        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)
1084        for Cell in cells:
1085            if Cell[-1]:
1086                break
1087        cell = Cell[2:9]
1088        controls[4] = 1
1089        controls[5] = bravaisSymb[cell[0]]
1090        controls[6:12] = cell[1:8]
1091        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
1092        self.PatternTree.SetItemPyData(UnitCellsId,[controls,bravais,cells,dmin])
1093        UpdateUnitCellsGrid(self,data)
1094       
1095        self.dataFrame.RefineCell.Enable(True)
1096               
1097    def RefineCell(event):
1098        def cellPrint(ibrav,A):
1099            cell = G2lat.A2cell(A)
1100            Vol = G2lat.calc_V(A)
1101            if ibrav in [0,1,2]:
1102                print "%s%10.6f" % ('a =',cell[0])
1103            elif ibrav in [3,4,5,6]:
1104                print "%s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],' c =',cell[2],' volume =',Vol)
1105            elif ibrav in [7,8,9,10]:
1106                print "%s%10.6f %s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],' volume =',Vol)
1107            elif ibrav in [11,12]:
1108                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)
1109            else:
1110                print "%s%10.6f %s%10.6f %s%10.6f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2])
1111                print "%s%8.3f %s%8.3f %s%8.3f %s%12.3f" % ('alpha =',cell[3],'beta =',cell[4],'gamma =',cell[5],' volume =',Vol)
1112             
1113        PatternId = self.PatternId
1114        PickId = self.PickId   
1115        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
1116        if not peaks:
1117            self.ErrorDialog('No peaks!', 'Nothing to refine!')
1118            return       
1119        print 'Refine cell'
1120        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
1121        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
1122        cell = controls[6:12]
1123        A = G2lat.cell2A(cell)
1124        ibrav = bravaisSymb.index(controls[5])
1125        dmin = G2indx.getDmin(peaks)-0.005
1126        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
1127        G2indx.IndexPeaks(peaks,self.HKL)
1128        if controls[0]:
1129            Lhkl,M20,X20,Aref,Zero = G2indx.refinePeaksZ(peaks,inst[1],ibrav,A,controls[1])           
1130            controls[1] = Zero
1131        else:
1132            Lhkl,M20,X20,Aref = G2indx.refinePeaks(peaks,ibrav,A)
1133        controls[6:12] = G2lat.A2cell(Aref)
1134        controls[12] = G2lat.calc_V(Aref)
1135        data = [controls,bravais,cells,dmin]
1136        cells = self.PatternTree.GetItemPyData(UnitCellsId)[2]
1137        for cell in cells:
1138            cell[-1] = False
1139        cells.insert(0,[M20,X20,ibrav]+controls[6:13]+[True,])
1140        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
1141        self.HKL = G2lat.GenHBravais(dmin,ibrav,Aref)
1142        UpdateUnitCellsGrid(self,data)
1143        print "%s%10.3f" % ('refinement M20 = ',M20)
1144        print 'unindexed lines = ',X20
1145        cellPrint(ibrav,Aref)
1146        for hkl in self.HKL:
1147            hkl.append(2.0*asind(inst[1]/(2.*hkl[3]))+controls[1])             
1148        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1149            G2plt.PlotPowderLines(self)
1150        else:
1151            G2plt.PlotPatterns(self)
1152       
1153    def IndexPeaks(event):
1154        PatternId = self.PatternId   
1155#        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
1156#        if not peaks:
1157#            self.ErrorDialog('No peaks!', 'Nothing to index!')
1158#            return
1159        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
1160        print 'Peak Indexing'
1161        try:
1162            controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
1163            cells = []
1164        except ValueError:
1165            self.ErrorDialog('Error','Need to set controls in Unit Cell List first')
1166            return
1167        if True not in bravais:
1168            self.ErrorDialog('Error','No Bravais lattices selected')
1169            return
1170        self.dataFrame.CopyCell.Enable(False)
1171        self.dataFrame.RefineCell.Enable(False)
1172        OK,dmin,cells = G2indx.DoIndexPeaks(peaks,inst,controls,bravais)
1173        if OK:
1174            data = [controls,bravais,cells,dmin]
1175            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
1176            UpdateUnitCellsGrid(self,data)
1177            bestCell = cells[0]
1178            if bestCell[0] > 10.:
1179                self.HKL = G2lat.GenHBravais(dmin,bestCell[2],G2lat.cell2A(bestCell[3:9]))
1180                for hkl in self.HKL:
1181                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
1182                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1183                    G2plt.PlotPowderLines(self)
1184                else:
1185                    G2plt.PlotPatterns(self)
1186            self.dataFrame.CopyCell.Enable(True)
1187            self.dataFrame.IndexPeaks.Enable(True)
1188            self.dataFrame.MakeNewPhase.Enable(True)
1189            UpdateUnitCellsGrid(self,data)
1190               
1191    def RefreshUnitCellsGrid(event):
1192        cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)[2:]
1193        r,c =  event.GetRow(),event.GetCol()
1194        if cells:
1195            if c == 2:
1196                for i in range(len(cells)):
1197                    cells[i][-1] = False
1198                    UnitCellsTable.SetValue(i,c,False)
1199                UnitCellsTable.SetValue(r,c,True)
1200                gridDisplay.ForceRefresh()
1201                cells[r][-1] = True
1202                ibrav = cells[r][2]
1203                A = G2lat.cell2A(cells[r][3:9])
1204                self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
1205                for hkl in self.HKL:
1206                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
1207                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1208                    G2plt.PlotPowderLines(self)
1209                else:
1210                    G2plt.PlotPatterns(self)
1211       
1212    def MakeNewPhase(event):
1213        if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
1214            sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
1215        else:
1216            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
1217        PhaseName = ''
1218        dlg = wx.TextEntryDialog(None,'Enter a name for this phase','Phase Name Entry','New phase',
1219            style=wx.OK)
1220        try:
1221            if dlg.ShowModal() == wx.ID_OK:
1222                PhaseName = dlg.GetValue()
1223                cells = self.PatternTree.GetItemPyData(UnitCellsId)[2]
1224                for Cell in cells:
1225                    if Cell[-1]:
1226                        break
1227                cell = Cell[2:10]       
1228                sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
1229                E,SGData = G2spc.SpcGroup(spaceGroups[cell[0]])
1230                self.PatternTree.SetItemPyData(sub, \
1231                    {'General':{'Name':PhaseName,'Type':'nuclear','SGData':SGData,
1232                    'Cell':[False,]+cell[1:],
1233                    'Pawley dmin':1.00},'Atoms':[],'Drawing':{},'Histograms':{}})
1234                Status.SetStatusText('Change space group if needed')
1235        finally:
1236            dlg.Destroy()
1237           
1238    if self.dataDisplay:
1239        self.dataFrame.Clear()
1240    self.dataFrame.SetMenuBar(self.dataFrame.IndexMenu)
1241    if not self.dataFrame.GetStatusBar():
1242        Status = self.dataFrame.CreateStatusBar()
1243    self.Bind(wx.EVT_MENU, IndexPeaks, id=G2gd.wxID_INDEXPEAKS)
1244    self.Bind(wx.EVT_MENU, CopyUnitCell, id=G2gd.wxID_COPYCELL)
1245    self.Bind(wx.EVT_MENU, RefineCell, id=G2gd.wxID_REFINECELL)
1246    self.Bind(wx.EVT_MENU, MakeNewPhase, id=G2gd.wxID_MAKENEWPHASE)
1247   
1248    controls,bravais,cells,dmin = data
1249    if len(controls) < 13:              #add cell volume if missing
1250        controls.append(G2lat.calc_V(G2lat.cell2A(controls[6:12])))
1251    self.PatternTree.SetItemPyData(UnitCellsId,data)            #update with volume
1252    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
1253    bravaisNames = ['Cubic-F','Cubic-I','Cubic-P','Trigonal-R','Trigonal/Hexagonal-P',
1254        'Tetragonal-I','Tetragonal-P','Orthorhombic-F','Orthorhombic-I','Orthorhombic-C',
1255        'Orthorhombic-P','Monoclinic-C','Monoclinic-P','Triclinic']
1256    cellGUIlist = [[[0,1,2],4,zip([" Unit cell: a = "," Vol = "],["%.5f","%.3f"],[True,False],[0,0])],
1257    [[3,4,5,6],6,zip([" Unit cell: a = "," c = "," Vol = "],["%.5f","%.5f","%.3f"],[True,True,False],[0,2,0])],
1258    [[7,8,9,10],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "],["%.5f","%.5f","%.5f","%.3f"],
1259        [True,True,True,False],[0,1,2,0])],
1260    [[11,12],10,zip([" Unit cell: a = "," b = "," c = "," beta = "," Vol = "],
1261        ["%.5f","%.5f","%.5f","%.3f","%.3f"],[True,True,True,True,False],[0,1,2,4,0])],
1262    [[13,],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "," alpha = "," beta = "," gamma = "],
1263        ["%.5f","%.5f","%.5f","%.3f","%.3f","%.3f","%.3f"],
1264        [True,True,True,False,True,True,True],[0,1,2,0,3,4,5])]]
1265   
1266    self.dataFrame.SetLabel('Unit Cells List')
1267    self.sp = wx.SplitterWindow(self.dataFrame)
1268    self.dataDisplay = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
1269    self.dataFrame.IndexPeaks.Enable(False)
1270    peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Index Peak List'))
1271    if peaks:
1272        self.dataFrame.IndexPeaks.Enable(True)
1273    self.dataFrame.RefineCell.Enable(False)
1274    if controls[12] > 1.0:                               #if a "real" volume (i.e. not default)
1275        self.dataFrame.RefineCell.Enable(True)   
1276    self.dataFrame.CopyCell.Enable(False)
1277    self.dataFrame.MakeNewPhase.Enable(False)       
1278    if cells:
1279        self.bottom = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
1280        self.sp.SplitHorizontally(self.dataDisplay,self.bottom,0)
1281        self.dataFrame.CopyCell.Enable(True)
1282        self.dataFrame.MakeNewPhase.Enable(True)       
1283    mainSizer = wx.BoxSizer(wx.VERTICAL)
1284    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Indexing controls: '),0,wx.ALIGN_CENTER_VERTICAL)
1285    mainSizer.Add((5,5),0)
1286    littleSizer = wx.FlexGridSizer(2,5,5,5)
1287    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max Nc/Nobs '),0,wx.ALIGN_CENTER_VERTICAL)
1288    NcNo = wx.SpinCtrl(self.dataDisplay)
1289    NcNo.SetRange(1,6)
1290    NcNo.SetValue(controls[2])
1291    NcNo.Bind(wx.EVT_SPINCTRL,OnNcNo)
1292    littleSizer.Add(NcNo,0,wx.ALIGN_CENTER_VERTICAL)
1293    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start Volume '),0,wx.ALIGN_CENTER_VERTICAL)
1294    startVol = wx.TextCtrl(self.dataDisplay,value=str('%d'%(controls[3])),style=wx.TE_PROCESS_ENTER)
1295    startVol.Bind(wx.EVT_TEXT_ENTER,OnStartVol)
1296    startVol.Bind(wx.EVT_KILL_FOCUS,OnStartVol)
1297    littleSizer.Add(startVol,0,wx.ALIGN_CENTER_VERTICAL)
1298    mainSizer.Add(littleSizer,0)
1299    mainSizer.Add((5,5),0)
1300    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Select Bravais Lattices for indexing: '),
1301        0,wx.ALIGN_CENTER_VERTICAL)
1302    mainSizer.Add((5,5),0)
1303    littleSizer = wx.FlexGridSizer(2,7,5,5)
1304    bravList = []
1305    bravs = zip(bravais,bravaisNames)
1306    for brav,bravName in bravs:
1307        bravCk = wx.CheckBox(self.dataDisplay,label=bravName)
1308        bravList.append(bravCk.GetId())
1309        bravCk.SetValue(brav)
1310        bravCk.Bind(wx.EVT_CHECKBOX,OnBravais)
1311        littleSizer.Add(bravCk,0,wx.ALIGN_CENTER_VERTICAL)
1312    mainSizer.Add(littleSizer,0)
1313    mainSizer.Add((5,5),0)
1314   
1315    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Cell Refinement: '),0,wx.ALIGN_CENTER_VERTICAL)
1316    mainSizer.Add((5,5),0)
1317    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
1318    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Bravais lattice "),0,wx.ALIGN_CENTER_VERTICAL)
1319    bravSel = wx.Choice(self.dataDisplay,choices=bravaisSymb)
1320    bravSel.SetSelection(bravaisSymb.index(controls[5]))
1321    bravSel.Bind(wx.EVT_CHOICE,OnBravSel)
1322    littleSizer.Add(bravSel,0,wx.ALIGN_CENTER_VERTICAL)
1323    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Zero offset"),0,wx.ALIGN_CENTER_VERTICAL)
1324    zero = wx.TextCtrl(self.dataDisplay,value="%.4f"%(controls[1]),style=wx.TE_PROCESS_ENTER)
1325    zero.Bind(wx.EVT_TEXT_ENTER,OnZero)
1326    zero.Bind(wx.EVT_KILL_FOCUS,OnZero)
1327    littleSizer.Add(zero,0,wx.ALIGN_CENTER_VERTICAL)
1328    zeroVar = wx.CheckBox(self.dataDisplay,label="Refine?")
1329    zeroVar.SetValue(controls[0])
1330    zeroVar.Bind(wx.EVT_CHECKBOX,OnZeroVar)
1331    littleSizer.Add(zeroVar,0,wx.ALIGN_CENTER_VERTICAL)
1332    hklShow = wx.Button(self.dataDisplay,label="  Show hkl positions")
1333    hklShow.Bind(wx.EVT_BUTTON,OnHklShow)
1334    littleSizer.Add(hklShow,0,wx.ALIGN_CENTER_VERTICAL)
1335    mainSizer.Add(littleSizer,0)
1336   
1337    mainSizer.Add((5,5),0)
1338    ibrav = SetLattice(controls)
1339    for cellGUI in cellGUIlist:
1340        if ibrav in cellGUI[0]:
1341            useGUI = cellGUI
1342    cellList = []
1343    littleSizer = wx.FlexGridSizer(2,useGUI[1],5,5)
1344    for txt,fmt,ifEdit,Id in useGUI[2]:
1345        littleSizer.Add(wx.StaticText(self.dataDisplay,label=txt),0,wx.ALIGN_CENTER_VERTICAL)
1346        if ifEdit:          #a,b,c,etc.
1347            cellVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[6+Id])),style=wx.TE_PROCESS_ENTER)
1348            cellVal.Bind(wx.EVT_TEXT_ENTER,OnCellChange)       
1349            cellVal.Bind(wx.EVT_KILL_FOCUS,OnCellChange)
1350            littleSizer.Add(cellVal,0,wx.ALIGN_CENTER_VERTICAL)
1351            cellList.append(cellVal.GetId())
1352        else:               #volume
1353            volVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[12])),style=wx.TE_READONLY)
1354            volVal.SetBackgroundColour(VERY_LIGHT_GREY)
1355            littleSizer.Add(volVal,0,wx.ALIGN_CENTER_VERTICAL)
1356    mainSizer.Add(littleSizer,0)
1357       
1358    mainSizer.Layout()   
1359    self.dataDisplay.SetSizer(mainSizer)
1360    topSize = mainSizer.Fit(self.dataFrame)
1361    self.dataDisplay.SetSize(topSize)
1362    if cells:
1363        if ibrav == 13:
1364            topSize[1] += 230
1365        else:
1366            topSize[1] += 200
1367    self.dataFrame.setSizePosLeft(topSize)
1368   
1369   
1370    if cells:
1371        bottomSize = self.bottom.GetSize()
1372        if ibrav == 13:
1373            bottomSize[1] -= 240
1374        else:
1375            bottomSize[1] -= 210
1376        wx.StaticText(parent=self.bottom,label=' Indexing Result ')
1377        rowLabels = []
1378        colLabels = ['M20','X20','use','Bravais','a','b','c','alpha','beta','gamma','Volume']
1379        Types = [wg.GRID_VALUE_FLOAT+':10,2',wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING,]+ \
1380            3*[wg.GRID_VALUE_FLOAT+':10,5',]+3*[wg.GRID_VALUE_FLOAT+':10,3',]+ \
1381            [wg.GRID_VALUE_FLOAT+':10,2']
1382        numRows = len(cells)
1383        table = []
1384        for cell in cells:
1385            rowLabels.append('')
1386            row = cell[0:2]+[cell[-1]]+[bravaisSymb[cell[2]]]+cell[3:10]
1387            if cell[-1]:
1388                A = G2lat.cell2A(cell[3:9])
1389                self.HKL = G2lat.GenHBravais(dmin,cell[2],A)
1390                for hkl in self.HKL:
1391                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
1392            table.append(row)
1393        UnitCellsTable = G2gd.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1394        gridDisplay = G2gd.GSGrid(self.bottom)
1395        gridDisplay.SetPosition(wx.Point(0,20))               
1396        gridDisplay.SetTable(UnitCellsTable, True)
1397        self.dataFrame.CopyCell.Enable(True)
1398        gridDisplay.Bind(wg.EVT_GRID_CELL_LEFT_CLICK,RefreshUnitCellsGrid)
1399        gridDisplay.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK,OnSortCells)
1400        gridDisplay.SetMargins(0,0)
1401        gridDisplay.SetRowLabelSize(0)
1402        gridDisplay.AutoSizeColumns(False)
1403        for r in range(gridDisplay.GetNumberRows()):
1404            for c in range(gridDisplay.GetNumberCols()):
1405                if c == 2:
1406                    gridDisplay.SetReadOnly(r,c,isReadOnly=False)
1407                else:
1408                    gridDisplay.SetReadOnly(r,c,isReadOnly=True)
1409        gridDisplay.SetSize(bottomSize)
1410
1411def UpdateReflectionGrid(self,data):
1412    if not data:
1413        print 'No phases, no reflections'
1414        return
1415    phases = data.keys()
1416   
1417    def OnSelectPhase(event):
1418        dlg = wx.SingleChoiceDialog(self,'Select','Phase',phases)
1419        try:
1420            if dlg.ShowModal() == wx.ID_OK:
1421                sel = dlg.GetSelection()
1422                self.RefList = phases[sel]
1423                UpdateReflectionGrid(self,data)
1424        finally:
1425            dlg.Destroy()
1426        G2plt.PlotPatterns(self)
1427       
1428       
1429    if self.dataDisplay:
1430        self.dataFrame.Clear()
1431    self.dataFrame.SetMenuBar(self.dataFrame.ReflMenu)
1432    if not self.dataFrame.GetStatusBar():
1433        Status = self.dataFrame.CreateStatusBar()   
1434    self.Bind(wx.EVT_MENU, OnSelectPhase, id=G2gd.wxID_SELECTPHASE)
1435    self.dataFrame.SelectPhase.Enable(False)
1436    if len(data) > 1:
1437        self.dataFrame.SelectPhase.Enable(True)
1438    rowLabels = []
1439    refList = [refl[:11] for refl in data[self.RefList]]
1440    for i in range(len(refList)): rowLabels.append(str(i))
1441    colLabels = ['H','K','L','mul','d','pos','sig','gam','Fosq','Fcsq','phase',]
1442    Types = 4*[wg.GRID_VALUE_LONG,]+4*[wg.GRID_VALUE_FLOAT+':10,4',]+2*[wg.GRID_VALUE_FLOAT+':10,2',]+[wg.GRID_VALUE_FLOAT+':10,3',]
1443    self.PeakTable = G2gd.Table(refList,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1444    self.dataFrame.SetLabel('Reflection List for '+self.RefList)
1445    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)
1446    self.dataDisplay.SetTable(self.PeakTable, True)
1447    self.dataDisplay.EnableEditing(False)
1448    self.dataDisplay.SetMargins(0,0)
1449    self.dataDisplay.AutoSizeColumns(False)
1450    self.dataFrame.setSizePosLeft([555,350])
1451
1452def UpdatePDFGrid(self,data):
1453    global inst
1454    tth2q = lambda t,w:4.0*math.pi*sind(t/2.0)/w
1455    dataFile = self.PatternTree.GetItemText(self.PatternId)
1456    powName = 'PWDR'+dataFile[4:]
1457    powId = G2gd.GetPatternTreeItemId(self,self.root, powName)
1458    fullLimits,limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Limits'))
1459    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Instrument Parameters'))
1460    inst = dict(zip(inst[3],inst[1]))
1461    if 'Lam' in inst:
1462        keV = 12.397639/inst['Lam']
1463    else:
1464        keV = 12.397639/inst['Lam1']
1465    wave = 12.397639/keV
1466    qLimits = [tth2q(fullLimits[0],wave),tth2q(fullLimits[1],wave)]
1467    data['QScaleLim'][1] = min(qLimits[1],data['QScaleLim'][1])
1468    if data['QScaleLim'][0]:
1469        data['QScaleLim'][0] = max(qLimits[0],data['QScaleLim'][0])
1470    else:                                #initial setting at 90% of max Q
1471        data['QScaleLim'][0] = 0.90*data['QScaleLim'][1]
1472    polariz = inst['Polariz.']
1473    azimuth = inst['Azimuth']
1474    itemDict = {}
1475   
1476    def FillFileSizer(fileSizer,key):
1477        #fileSizer is a FlexGridSizer(3,6)
1478       
1479        def OnSelectFile(event):
1480            Obj = event.GetEventObject()
1481            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1482            if itemKey == 'Name':
1483                value = Obj.GetValue()
1484            Obj.SetValue(fmt%(value))
1485            data[fileKey][itemKey] = value
1486            UpdatePDFGrid(self,data)
1487       
1488        def OnValueChange(event):
1489            Obj = event.GetEventObject()
1490            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1491            try:
1492                value = float(Obj.GetValue())
1493            except ValueError:
1494                value = -1.0
1495            Obj.SetValue(fmt%(value))
1496            data[fileKey][itemKey] = value
1497            auxPlot = ComputePDF(data)
1498            G2plt.PlotISFG(self,newPlot=True)
1499                       
1500        item = data[key]
1501        fileList = np.array(GetFileList('PWDR')).T[1]
1502        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' '+key+' file:'),0,wx.ALIGN_CENTER_VERTICAL)
1503        fileName = wx.ComboBox(self.dataDisplay,value=item['Name'],choices=fileList,
1504            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1505        itemDict[fileName.GetId()] = [key,'Name','%s']
1506        fileName.Bind(wx.EVT_COMBOBOX,OnSelectFile)       
1507        fileSizer.Add(fileName,0,)
1508        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Multiplier:'),0,wx.ALIGN_CENTER_VERTICAL)
1509        mult = wx.TextCtrl(self.dataDisplay,value='%.3f'%(item['Mult']),style=wx.TE_PROCESS_ENTER)
1510        itemDict[mult.GetId()] = [key,'Mult','%.3f']
1511        mult.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1512        mult.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1513        fileSizer.Add(mult,0,)
1514        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Add:'),0,wx.ALIGN_CENTER_VERTICAL)
1515        add = wx.TextCtrl(self.dataDisplay,value='%.0f'%(item['Add']),style=wx.TE_PROCESS_ENTER)
1516        itemDict[add.GetId()] = [key,'Add','%.0f']
1517        add.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1518        add.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1519        fileSizer.Add(add,0,)
1520       
1521    def SumElementVolumes():
1522        sumVol = 0.
1523        ElList = data['ElList']
1524        for El in ElList:
1525            Avol = (4.*math.pi/3.)*ElList[El]['Drad']**3
1526            sumVol += Avol*ElList[El]['FormulaNo']
1527        return sumVol
1528        auxPlot = ComputePDF(data)
1529        G2plt.PlotISFG(self,newPlot=True)       
1530       
1531    def FillElemSizer(elemSizer,ElData):
1532       
1533        def OnFractionChange(event):
1534            try:
1535                value = max(0.0,float(num.GetValue()))
1536            except ValueError:
1537                value = 0.0
1538            num.SetValue('%.3f'%(value))
1539            ElData['FormulaNo'] = value
1540            data['Form Vol'] = max(10.0,SumElementVolumes())
1541            formVol.SetValue('%.2f'%(data['Form Vol']))
1542            UpdatePDFGrid(self,data)
1543            auxPlot = ComputePDF(data)
1544            G2plt.PlotISFG(self,newPlot=True)       
1545       
1546        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1547            label=' Element: '+'%2s'%(ElData['Symbol'])+' * '),0,wx.ALIGN_CENTER_VERTICAL)
1548        num = wx.TextCtrl(self.dataDisplay,value='%.3f'%(ElData['FormulaNo']),style=wx.TE_PROCESS_ENTER)
1549        num.Bind(wx.EVT_TEXT_ENTER,OnFractionChange)       
1550        num.Bind(wx.EVT_KILL_FOCUS,OnFractionChange)
1551        elemSizer.Add(num,0,wx.ALIGN_CENTER_VERTICAL)
1552        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1553            label="f': %.3f"%(ElData['fp'])+' f": %.3f'%(ElData['fpp'])+' mu: %.2f barns'%(ElData['mu']) ),
1554            0,wx.ALIGN_CENTER_VERTICAL)
1555           
1556    def OnGeometry(event):
1557        data['Geometry'] = geometry.GetValue()
1558        UpdatePDFGrid(self,data)
1559        auxPlot = ComputePDF(data)
1560        G2plt.PlotISFG(self,newPlot=True)       
1561       
1562    def OnDetType(event):
1563        data['DetType'] = detType.GetValue()
1564        UpdatePDFGrid(self,data)
1565        auxPlot = ComputePDF(data)
1566        G2plt.PlotISFG(self,newPlot=True)       
1567       
1568    def OnFormVol(event):
1569        try:
1570            value = float(formVol.GetValue())
1571            if value <= 0.0:
1572                raise ValueError
1573        except ValueError:
1574            value = data['Form Vol']
1575        data['Form Vol'] = value
1576        UpdatePDFGrid(self,data)
1577        auxPlot = ComputePDF(data)
1578        G2plt.PlotISFG(self,newPlot=False)       
1579       
1580    def OnDiameter(event):
1581        try:
1582            value = float(diam.GetValue())
1583            if value <= 0.0:
1584                raise ValueError
1585        except ValueError:
1586            value = data['Diam']
1587        data['Diam'] = value
1588        UpdatePDFGrid(self,data)
1589        auxPlot = ComputePDF(data)
1590        G2plt.PlotISFG(self,newPlot=False)
1591       
1592    def OnPolaVal(event):
1593        try:
1594            value = float(polaVal.GetValue())
1595            if not (0.0 <= value <= 1.0):
1596                raise ValueError
1597        except ValueError:
1598            value = inst['Polariz.']
1599        inst['Polariz.'] = value
1600        polaVal.SetValue('%.2f'%(inst['Polariz.']))
1601        UpdatePDFGrid(self,data)
1602        auxPlot = ComputePDF(data)
1603        G2plt.PlotISFG(self,newPlot=False)
1604               
1605    def OnAzimVal(event):
1606        try:
1607            value = float(azimVal.GetValue())
1608            if not (0. <= value <= 360.):
1609                raise ValueError
1610        except ValueError:
1611            value = inst['Azimuth']
1612        inst['Azimuth'] = value
1613        azimVal.SetValue('%.1f'%(inst['Azimuth']))
1614        UpdatePDFGrid(self,data)
1615        auxPlot = ComputePDF(data)
1616        G2plt.PlotISFG(self,newPlot=False)
1617                       
1618    def OnObliqCoeff(event):
1619        try:
1620            value = float(obliqCoeff.GetValue())
1621            if value < 0.0:
1622                raise ValueError
1623            elif value > 1.0:
1624                value = 1.0
1625        except ValueError:
1626            value = data['ObliqCoeff']
1627        data['ObliqCoeff'] = value
1628        obliqCoeff.SetValue('%.3f'%(value))
1629        auxPlot = ComputePDF(data)
1630        G2plt.PlotISFG(self,newPlot=False)
1631       
1632    def OnRulandWdt(event):
1633        try:
1634            value = float(rulandWdt.GetValue())
1635            if value <= 0.001:
1636                raise ValueError
1637            elif value > 1.0:
1638                value = 1.0
1639        except ValueError:
1640            value = data['Ruland']
1641        data['Ruland'] = value
1642        rulandWdt.SetValue('%.3f'%(value))
1643        auxPlot = ComputePDF(data)
1644        G2plt.PlotISFG(self,newPlot=False)
1645       
1646    def OnRulSlider(event):
1647        value = int(rulandSldr.GetValue())/1000.
1648        data['Ruland'] = max(0.001,value)
1649        rulandWdt.SetValue('%.3f'%(data['Ruland']))
1650        auxPlot = ComputePDF(data)
1651        G2plt.PlotISFG(self,newPlot=False)
1652       
1653    def OnLorch(event):
1654        data['Lorch'] = lorch.GetValue()
1655        auxPlot = ComputePDF(data)
1656        G2plt.PlotISFG(self,newPlot=False)       
1657                       
1658    def OnPacking(event):
1659        try:
1660            value = float(pack.GetValue())
1661            if value <= 0.0:
1662                raise ValueError
1663        except ValueError:
1664            value = data['Pack']
1665        data['Pack'] = value
1666        UpdatePDFGrid(self,data)
1667        auxPlot = ComputePDF(data)
1668        G2plt.PlotISFG(self,newPlot=False)       
1669               
1670    def OnSQmin(event):
1671        try:
1672            value = float(SQmin.GetValue())
1673            if value < qLimits[0]:
1674                raise ValueError
1675        except ValueError:
1676            value = max(qLimits[0],data['QScaleLim'][0])
1677        data['QScaleLim'][0] = value
1678        SQmin.SetValue('%.1f'%(value))
1679        auxPlot = ComputePDF(data)
1680        G2plt.PlotISFG(self,newPlot=True)       
1681       
1682    def OnSQmax(event):
1683        try:
1684            value = float(SQmax.GetValue())
1685            if value > qLimits[1]:
1686                raise ValueError
1687        except ValueError:
1688            value = min(qLimits[1],data['QScaleLim'][1])
1689        data['QScaleLim'][1] = value
1690        if value < data['QScaleLim'][0]:
1691            data['QScaleLim'][0] = 0.90*value
1692            SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1693        SQmax.SetValue('%.1f'%(value))
1694        auxPlot = ComputePDF(data)
1695        G2plt.PlotISFG(self,newPlot=True)
1696       
1697    def OnResetQ(event):
1698        resetQ.SetValue(False)
1699        data['QScaleLim'][1] = qLimits[1]
1700        SQmax.SetValue('%.1f'%(data['QScaleLim'][1]))
1701        data['QScaleLim'][0] = 0.9*qLimits[1]
1702        SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1703        auxPlot = ComputePDF(data)
1704        G2plt.PlotISFG(self,newPlot=True)       
1705
1706    def GetFileList(fileType,skip=None):
1707        fileList = [[False,'',0]]
1708        Source = ''
1709        id, cookie = self.PatternTree.GetFirstChild(self.root)
1710        while id:
1711            name = self.PatternTree.GetItemText(id)
1712            if fileType in name:
1713                if id == skip:
1714                    Source = name
1715                else:
1716                    fileList.append([False,name,id])
1717            id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1718        if skip:
1719            return fileList,Source
1720        else:
1721            return fileList
1722       
1723    def OnCopyPDFControls(event):
1724        import copy
1725        TextList,Source = GetFileList('PDF',skip=self.PatternId)
1726        TextList[0] = [False,'All PDF',0]
1727        if len(TextList) == 1:
1728            self.ErrorDialog('Nothing to copy controls to','There must be more than one "PDF" pattern')
1729            return
1730        dlg = self.CopyDialog(self,'Copy PDF controls','Copy controls from '+Source+' to:',TextList)
1731        try:
1732            if dlg.ShowModal() == wx.ID_OK:
1733                result = dlg.GetData()
1734                if result[0][0]:
1735                    result = TextList[1:]
1736                    for item in result: item[0] = True
1737                for i,item in enumerate(result):
1738                    ifcopy,name,id = item
1739                    if ifcopy:
1740                        olddata = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'))
1741                        sample = olddata['Sample']
1742                        olddata.update(copy.deepcopy(data))
1743                        olddata['Sample'] = sample
1744                        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'),olddata)
1745                Status.SetStatusText('PDF controls copied')
1746        finally:
1747            dlg.Destroy()
1748               
1749    def OnSavePDFControls(event):
1750        print 'save PDF controls?'
1751       
1752    def OnLoadPDFControls(event):
1753        print 'Load PDF controls?'
1754       
1755    def OnAddElement(event):
1756        ElList = data['ElList']
1757        PE = G2elem.PickElement(self,oneOnly=True)
1758        if PE.ShowModal() == wx.ID_OK:
1759            El = PE.Elem
1760            if El not in ElList:
1761                ElemSym = El.strip().upper()               
1762                FpMu = G2elem.FPcalc(G2elem.GetXsectionCoeff(ElemSym), keV)
1763                ElData = G2elem.GetFormFactorCoeff(ElemSym)[0]
1764                ElData['FormulaNo'] = 0.0
1765                ElData.update(G2elem.GetAtomInfo(ElemSym))
1766                ElData.update(dict(zip(['fp','fpp','mu'],FpMu)))
1767                ElData.update(G2elem.GetFFC5(El))
1768                data['ElList'][El] = ElData
1769            data['Form Vol'] = max(10.0,SumElementVolumes())
1770        PE.Destroy()
1771        UpdatePDFGrid(self,data)
1772       
1773    def OnDeleteElement(event):
1774        ElList = data['ElList']
1775        choice = ElList.keys()
1776        dlg = G2elem.DeleteElement(self,choice=choice)
1777        if dlg.ShowModal() == wx.ID_OK:
1778            del ElList[dlg.GetDeleteElement()]
1779        dlg.Destroy()
1780        UpdatePDFGrid(self,data)
1781               
1782    def ComputePDF(Data):
1783        xydata = {}
1784        for key in ['Sample','Sample Bkg.','Container','Container Bkg.']:
1785            name = Data[key]['Name']
1786            if name:
1787                xydata[key] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.root,name))
1788                PDFname = name
1789        powName = xydata['Sample'][2]
1790        powId = G2gd.GetPatternTreeItemId(self,self.root,powName)
1791        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId,'Instrument Parameters'))
1792        inst = dict(zip(inst[3],inst[1]))
1793        auxPlot = G2pwd.CalcPDF(Data,inst,xydata)
1794        PDFId = G2gd.GetPatternTreeItemId(self,self.root,'PDF '+powName[4:])
1795        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'I(Q)'+powName[4:]),xydata['IofQ'])
1796        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'S(Q)'+powName[4:]),xydata['SofQ'])
1797        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'F(Q)'+powName[4:]),xydata['FofQ'])
1798        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'G(R)'+powName[4:]),xydata['GofR'])
1799        return auxPlot
1800       
1801    def OnComputePDF(event):
1802        print 'Calculating PDF:'
1803        auxPlot = ComputePDF(data)
1804        print 'Done calculating PDF:'
1805        Status.SetStatusText('PDF computed')
1806        for plot in auxPlot:
1807            G2plt.PlotXY(self,plot[:2],type=plot[2])
1808       
1809        G2plt.PlotISFG(self,newPlot=True,type='I(Q)')
1810        G2plt.PlotISFG(self,newPlot=True,type='S(Q)')
1811        G2plt.PlotISFG(self,newPlot=True,type='F(Q)')
1812        G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1813       
1814    def OnComputeAllPDF(event):
1815        print 'Calculating PDFs:'
1816        if self.PatternTree.GetCount():
1817            id, cookie = self.PatternTree.GetFirstChild(self.root)
1818            while id:
1819                Name = self.PatternTree.GetItemText(id)
1820                if 'PDF' in Name:
1821                    Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id,'PDF Controls'))
1822                    auxPlot = ComputePDF(Data)                   
1823                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1824            Status.SetStatusText('All PDFs computed')
1825            G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1826            print ' Done calculating PDFs:'
1827       
1828    def OnShowTip(self,tip):
1829        print tip   
1830               
1831    if self.dataDisplay:
1832        self.dataFrame.Clear()
1833    self.dataFrame.SetMenuBar(self.dataFrame.PDFMenu)
1834    if not self.dataFrame.GetStatusBar():
1835        Status = self.dataFrame.CreateStatusBar()   
1836    self.dataDisplay = wx.Panel(self.dataFrame)
1837    self.dataFrame.Bind(wx.EVT_MENU, OnCopyPDFControls, id=G2gd.wxID_PDFCOPYCONTROLS)
1838    self.dataFrame.Bind(wx.EVT_MENU, OnSavePDFControls, id=G2gd.wxID_PDFSAVECONTROLS)
1839    self.dataFrame.Bind(wx.EVT_MENU, OnLoadPDFControls, id=G2gd.wxID_PDFLOADCONTROLS)
1840    self.dataFrame.Bind(wx.EVT_MENU, OnAddElement, id=G2gd.wxID_PDFADDELEMENT)
1841    self.dataFrame.Bind(wx.EVT_MENU, OnDeleteElement, id=G2gd.wxID_PDFDELELEMENT)
1842    self.dataFrame.Bind(wx.EVT_MENU, OnComputePDF, id=G2gd.wxID_PDFCOMPUTE)
1843    self.dataFrame.Bind(wx.EVT_MENU, OnComputeAllPDF, id=G2gd.wxID_PDFCOMPUTEALL)
1844    mainSizer = wx.BoxSizer(wx.VERTICAL)
1845    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' PDF data files: '),0,wx.ALIGN_CENTER_VERTICAL)
1846    mainSizer.Add((5,5),0)
1847    str = ' Sample file: PWDR %s   Wavelength, A: %.5f  Energy, keV: %.3f  Polariz.: %.2f '%(dataFile[3:],wave,keV,polariz)
1848    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=str),0,wx.ALIGN_CENTER_VERTICAL)
1849#    dataSizer = wx.BoxSizer(wx.HORIZONTAL)
1850#    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Azimuth'),0,wx.ALIGN_CENTER_VERTICAL)
1851#    azimVal = wx.TextCtrl(self.dataDisplay,value='%.2f'%(inst['Azimuth']))
1852#    azimVal.Bind(wx.EVT_TEXT_ENTER,OnAzimVal)       
1853#    azimVal.Bind(wx.EVT_KILL_FOCUS,OnAzimVal)
1854#    dataSizer.Add(azimVal,0)   
1855#    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Polarization'),0,wx.ALIGN_CENTER_VERTICAL)
1856#    polaVal = wx.TextCtrl(self.dataDisplay,value='%.2f'%(inst['Polariz.']))
1857#    polaVal.Bind(wx.EVT_TEXT_ENTER,OnPolaVal)       
1858#    polaVal.Bind(wx.EVT_KILL_FOCUS,OnPolaVal)
1859#    dataSizer.Add(polaVal,0)   
1860#    mainSizer.Add(dataSizer,0)
1861    mainSizer.Add((5,5),0)
1862    fileSizer = wx.FlexGridSizer(3,6,5,1)
1863    select = ['Sample Bkg.','Container']
1864    if data['Container']['Name']:
1865        select.append('Container Bkg.')
1866    for key in select:
1867        FillFileSizer(fileSizer,key)
1868    mainSizer.Add(fileSizer,0)
1869    mainSizer.Add((5,5),0)
1870    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Sample information: '),0,wx.ALIGN_CENTER_VERTICAL)
1871    mainSizer.Add((5,5),0)   
1872
1873    ElList = data['ElList']
1874    Abs = G2lat.CellAbsorption(ElList,data['Form Vol'])
1875    Trans = G2pwd.Transmission(data['Geometry'],Abs*data['Pack'],data['Diam'])
1876    elemSizer = wx.FlexGridSizer(3,3,5,1)
1877    for El in ElList:
1878        FillElemSizer(elemSizer,ElList[El])
1879    mainSizer.Add(elemSizer,0)
1880    mainSizer.Add((5,5),0)   
1881    midSizer = wx.BoxSizer(wx.HORIZONTAL)
1882    midSizer.Add(wx.StaticText(self.dataDisplay,label=' Formula volume: '),0,wx.ALIGN_CENTER_VERTICAL)
1883    formVol = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Form Vol']))
1884    formVol.Bind(wx.EVT_TEXT_ENTER,OnFormVol)       
1885    formVol.Bind(wx.EVT_KILL_FOCUS,OnFormVol)
1886    midSizer.Add(formVol,0)
1887    midSizer.Add(wx.StaticText(self.dataDisplay,
1888        label=' Theoretical absorption: %.4f cm-1 Sample absorption: %.4f cm-1'%(Abs,Abs*data['Pack'])),
1889        0,wx.ALIGN_CENTER_VERTICAL)
1890    mainSizer.Add(midSizer,0)
1891    mainSizer.Add((5,5),0)   
1892
1893    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1894    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample geometry: '),0,wx.ALIGN_CENTER_VERTICAL)
1895    choice = ['Cylinder','Bragg-Brentano','Tilting flat plate in transmission','Fixed flat plate']
1896    geometry = wx.ComboBox(self.dataDisplay,value=data['Geometry'],choices=choice,
1897            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1898    geometry.Bind(wx.EVT_COMBOBOX, OnGeometry)
1899    geoBox.Add(geometry,0)
1900    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample diameter/thickness, mm: '),0,wx.ALIGN_CENTER_VERTICAL)
1901    diam = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Diam']))
1902    diam.Bind(wx.EVT_TEXT_ENTER,OnDiameter)       
1903    diam.Bind(wx.EVT_KILL_FOCUS,OnDiameter)
1904#    diam.Bind(wx.EVT_SET_FOCUS,OnShowTip(self,'tip')) #this doesn't work - what would????
1905    geoBox.Add(diam,0)
1906    mainSizer.Add(geoBox,0)
1907    mainSizer.Add((5,5),0)   
1908    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1909    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Packing: '),0,wx.ALIGN_CENTER_VERTICAL)
1910    pack = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Pack']))
1911    pack.Bind(wx.EVT_TEXT_ENTER,OnPacking)       
1912    pack.Bind(wx.EVT_KILL_FOCUS,OnPacking)
1913    geoBox.Add(pack,0)
1914    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample transmission: %.3f %%'%(Trans)),0,wx.ALIGN_CENTER_VERTICAL)   
1915    mainSizer.Add(geoBox,0)
1916    mainSizer.Add((5,5),0)   
1917       
1918    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' S(Q)->F(Q)->G(R) controls: '),0,wx.ALIGN_CENTER_VERTICAL)
1919    mainSizer.Add((5,5),0)
1920    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1921    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Detector type: '),0,wx.ALIGN_CENTER_VERTICAL)
1922    choice = ['Image plate','Point detector']
1923    detType = wx.ComboBox(self.dataDisplay,value=data['DetType'],choices=choice,
1924            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1925    detType.Bind(wx.EVT_COMBOBOX, OnDetType)
1926    sqBox.Add(detType,0)
1927    if data['DetType'] == 'Image plate':
1928        sqBox.Add(wx.StaticText(self.dataDisplay,label=' IP transmission coeff.: '),0,wx.ALIGN_CENTER_VERTICAL)
1929        obliqCoeff = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['ObliqCoeff']))
1930        obliqCoeff.Bind(wx.EVT_TEXT_ENTER,OnObliqCoeff)       
1931        obliqCoeff.Bind(wx.EVT_KILL_FOCUS,OnObliqCoeff)
1932        sqBox.Add(obliqCoeff,0)
1933    mainSizer.Add(sqBox,0)
1934       
1935    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1936    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Ruland width: '),0,wx.ALIGN_CENTER_VERTICAL)   
1937    rulandSldr = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
1938        value=int(1000*data['Ruland']))
1939    sqBox.Add(rulandSldr,1,wx.EXPAND)
1940    rulandSldr.Bind(wx.EVT_SLIDER, OnRulSlider)
1941    rulandWdt = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Ruland']))
1942    rulandWdt.Bind(wx.EVT_TEXT_ENTER,OnRulandWdt)       
1943    rulandWdt.Bind(wx.EVT_KILL_FOCUS,OnRulandWdt)
1944    sqBox.Add(rulandWdt,0,wx.ALIGN_CENTER_VERTICAL)   
1945    mainSizer.Add(sqBox,0,wx.ALIGN_LEFT|wx.EXPAND)
1946   
1947    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1948    lorch = wx.CheckBox(parent=self.dataDisplay,label='Lorch damping?')
1949    lorch.SetValue(data['Lorch'])
1950    lorch.Bind(wx.EVT_CHECKBOX, OnLorch)
1951    sqBox.Add(lorch,0,wx.ALIGN_CENTER_VERTICAL)
1952    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Scaling q-range: '),0,wx.ALIGN_CENTER_VERTICAL)
1953    SQmin = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][0]))
1954    SQmin.Bind(wx.EVT_TEXT_ENTER,OnSQmin)       
1955    SQmin.Bind(wx.EVT_KILL_FOCUS,OnSQmin)   
1956    sqBox.Add(SQmin,0)
1957    sqBox.Add(wx.StaticText(self.dataDisplay,label=' to '),0,wx.ALIGN_CENTER_VERTICAL)
1958    SQmax = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][1]))
1959    SQmax.Bind(wx.EVT_TEXT_ENTER,OnSQmax)       
1960    SQmax.Bind(wx.EVT_KILL_FOCUS,OnSQmax)
1961    sqBox.Add(SQmax,0)
1962    resetQ = wx.CheckBox(parent=self.dataDisplay,label='Reset?')
1963    sqBox.Add(resetQ,0)
1964    resetQ.Bind(wx.EVT_CHECKBOX, OnResetQ)
1965   
1966    mainSizer.Add(sqBox,0)
1967
1968    mainSizer.Layout()   
1969    self.dataDisplay.SetSizer(mainSizer)
1970    Size = mainSizer.Fit(self.dataFrame)
1971    self.dataDisplay.SetSize(Size)
1972    self.dataFrame.setSizePosLeft(Size)
1973   
Note: See TracBrowser for help on using the repository browser.