source: trunk/GSASIIpwdGUI.py @ 345

Last change on this file since 345 was 345, checked in by vondreele, 14 years ago

put new banner in GSASII.BAT
fix for vertical tilt & offset images
speedup of peak calcs
allow change from lam to lam1 & lam2
Pawley refinement fixes

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