source: trunk/GSASIIpwdGUI.py @ 367

Last change on this file since 367 was 367, checked in by vondreele, 12 years ago

make Factor lower limit 0.00001

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