source: trunk/GSASIIpwdGUI.py @ 353

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

modify psvfcj.for to use sh/l only
add derivative routine to pypowder.for
GSASIIgrid.py - new LS controls for derivative type
GSASIIlattice.py - work on docs as per P Jemian
GSASIIpwd.py - major mods to use FCJpsvoight fortran code & derivatives
GSASIIpwdGUI.py - mod to use LS controls

  • 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-08-24 21:07:29 +0000 (Wed, 24 Aug 2011) $
4# $Author: vondreele $
5# $Revision: 353 $
6# $URL: trunk/GSASIIpwdGUI.py $
7# $Id: GSASIIpwdGUI.py 353 2011-08-24 21:07:29Z 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+1))
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.SetMargins(0,0)
1281    self.dataDisplay.AutoSizeColumns(False)
1282    self.dataFrame.setSizePosLeft([555,350])
1283
1284def UpdatePDFGrid(self,data):
1285    global inst
1286    tth2q = lambda t,w:4.0*math.pi*sind(t/2.0)/w
1287    dataFile = self.PatternTree.GetItemText(self.PatternId)
1288    powName = 'PWDR'+dataFile[4:]
1289    powId = G2gd.GetPatternTreeItemId(self,self.root, powName)
1290    fullLimits,limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Limits'))
1291    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Instrument Parameters'))
1292    inst = dict(zip(inst[3],inst[1]))
1293    if 'Lam' in inst:
1294        keV = 12.397639/inst['Lam']
1295    else:
1296        keV = 12.397639/inst['Lam1']
1297    wave = 12.397639/keV
1298    qLimits = [tth2q(fullLimits[0],wave),tth2q(fullLimits[1],wave)]
1299    data['QScaleLim'][1] = min(qLimits[1],data['QScaleLim'][1])
1300    if data['QScaleLim'][0]:
1301        data['QScaleLim'][0] = max(qLimits[0],data['QScaleLim'][0])
1302    else:                                #initial setting at 90% of max Q
1303        data['QScaleLim'][0] = 0.90*data['QScaleLim'][1]
1304    polariz = inst['Polariz.']
1305    azimuth = inst['Azimuth']
1306    itemDict = {}
1307   
1308    def FillFileSizer(fileSizer,key):
1309        #fileSizer is a FlexGridSizer(3,6)
1310       
1311        def OnSelectFile(event):
1312            Obj = event.GetEventObject()
1313            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1314            if itemKey == 'Name':
1315                value = Obj.GetValue()
1316            Obj.SetValue(fmt%(value))
1317            data[fileKey][itemKey] = value
1318            UpdatePDFGrid(self,data)
1319       
1320        def OnValueChange(event):
1321            Obj = event.GetEventObject()
1322            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1323            try:
1324                value = float(Obj.GetValue())
1325            except ValueError:
1326                value = -1.0
1327            Obj.SetValue(fmt%(value))
1328            data[fileKey][itemKey] = value
1329            auxPlot = ComputePDF(data)
1330            G2plt.PlotISFG(self,newPlot=True)
1331                       
1332        item = data[key]
1333        fileList = np.array(GetFileList('PWDR')).T[1]
1334        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' '+key+' file:'),0,wx.ALIGN_CENTER_VERTICAL)
1335        fileName = wx.ComboBox(self.dataDisplay,value=item['Name'],choices=fileList,
1336            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1337        itemDict[fileName.GetId()] = [key,'Name','%s']
1338        fileName.Bind(wx.EVT_COMBOBOX,OnSelectFile)       
1339        fileSizer.Add(fileName,0,)
1340        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Multiplier:'),0,wx.ALIGN_CENTER_VERTICAL)
1341        mult = wx.TextCtrl(self.dataDisplay,value='%.3f'%(item['Mult']),style=wx.TE_PROCESS_ENTER)
1342        itemDict[mult.GetId()] = [key,'Mult','%.3f']
1343        mult.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1344        mult.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1345        fileSizer.Add(mult,0,)
1346        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Add:'),0,wx.ALIGN_CENTER_VERTICAL)
1347        add = wx.TextCtrl(self.dataDisplay,value='%.0f'%(item['Add']),style=wx.TE_PROCESS_ENTER)
1348        itemDict[add.GetId()] = [key,'Add','%.0f']
1349        add.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1350        add.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1351        fileSizer.Add(add,0,)
1352       
1353    def SumElementVolumes():
1354        sumVol = 0.
1355        ElList = data['ElList']
1356        for El in ElList:
1357            Avol = (4.*math.pi/3.)*ElList[El]['Drad']**3
1358            sumVol += Avol*ElList[El]['FormulaNo']
1359        return sumVol
1360        auxPlot = ComputePDF(data)
1361        G2plt.PlotISFG(self,newPlot=True)       
1362       
1363    def FillElemSizer(elemSizer,ElData):
1364       
1365        def OnFractionChange(event):
1366            try:
1367                value = max(0.0,float(num.GetValue()))
1368            except ValueError:
1369                value = 0.0
1370            num.SetValue('%.3f'%(value))
1371            ElData['FormulaNo'] = value
1372            data['Form Vol'] = max(10.0,SumElementVolumes())
1373            formVol.SetValue('%.2f'%(data['Form Vol']))
1374            UpdatePDFGrid(self,data)
1375            auxPlot = ComputePDF(data)
1376            G2plt.PlotISFG(self,newPlot=True)       
1377       
1378        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1379            label=' Element: '+'%2s'%(ElData['Symbol'])+' * '),0,wx.ALIGN_CENTER_VERTICAL)
1380        num = wx.TextCtrl(self.dataDisplay,value='%.3f'%(ElData['FormulaNo']),style=wx.TE_PROCESS_ENTER)
1381        num.Bind(wx.EVT_TEXT_ENTER,OnFractionChange)       
1382        num.Bind(wx.EVT_KILL_FOCUS,OnFractionChange)
1383        elemSizer.Add(num,0,wx.ALIGN_CENTER_VERTICAL)
1384        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1385            label="f': %.3f"%(ElData['fp'])+' f": %.3f'%(ElData['fpp'])+' mu: %.2f barns'%(ElData['mu']) ),
1386            0,wx.ALIGN_CENTER_VERTICAL)
1387           
1388    def OnGeometry(event):
1389        data['Geometry'] = geometry.GetValue()
1390        UpdatePDFGrid(self,data)
1391        auxPlot = ComputePDF(data)
1392        G2plt.PlotISFG(self,newPlot=True)       
1393       
1394    def OnDetType(event):
1395        data['DetType'] = detType.GetValue()
1396        UpdatePDFGrid(self,data)
1397        auxPlot = ComputePDF(data)
1398        G2plt.PlotISFG(self,newPlot=True)       
1399       
1400    def OnFormVol(event):
1401        try:
1402            value = float(formVol.GetValue())
1403            if value <= 0.0:
1404                raise ValueError
1405        except ValueError:
1406            value = data['Form Vol']
1407        data['Form Vol'] = value
1408        UpdatePDFGrid(self,data)
1409        auxPlot = ComputePDF(data)
1410        G2plt.PlotISFG(self,newPlot=False)       
1411       
1412    def OnDiameter(event):
1413        try:
1414            value = float(diam.GetValue())
1415            if value <= 0.0:
1416                raise ValueError
1417        except ValueError:
1418            value = data['Diam']
1419        data['Diam'] = value
1420        UpdatePDFGrid(self,data)
1421        auxPlot = ComputePDF(data)
1422        G2plt.PlotISFG(self,newPlot=False)
1423       
1424    def OnPolaVal(event):
1425        try:
1426            value = float(polaVal.GetValue())
1427            if not (0.0 <= value <= 1.0):
1428                raise ValueError
1429        except ValueError:
1430            value = inst['Polariz.']
1431        inst['Polariz.'] = value
1432        polaVal.SetValue('%.2f'%(inst['Polariz.']))
1433        UpdatePDFGrid(self,data)
1434        auxPlot = ComputePDF(data)
1435        G2plt.PlotISFG(self,newPlot=False)
1436               
1437    def OnAzimVal(event):
1438        try:
1439            value = float(azimVal.GetValue())
1440            if not (0. <= value <= 360.):
1441                raise ValueError
1442        except ValueError:
1443            value = inst['Azimuth']
1444        inst['Azimuth'] = value
1445        azimVal.SetValue('%.1f'%(inst['Azimuth']))
1446        UpdatePDFGrid(self,data)
1447        auxPlot = ComputePDF(data)
1448        G2plt.PlotISFG(self,newPlot=False)
1449                       
1450    def OnObliqCoeff(event):
1451        try:
1452            value = float(obliqCoeff.GetValue())
1453            if value < 0.0:
1454                raise ValueError
1455            elif value > 1.0:
1456                value = 1.0
1457        except ValueError:
1458            value = data['ObliqCoeff']
1459        data['ObliqCoeff'] = value
1460        obliqCoeff.SetValue('%.3f'%(value))
1461        auxPlot = ComputePDF(data)
1462        G2plt.PlotISFG(self,newPlot=False)
1463       
1464    def OnRulandWdt(event):
1465        try:
1466            value = float(rulandWdt.GetValue())
1467            if value <= 0.001:
1468                raise ValueError
1469            elif value > 1.0:
1470                value = 1.0
1471        except ValueError:
1472            value = data['Ruland']
1473        data['Ruland'] = value
1474        rulandWdt.SetValue('%.3f'%(value))
1475        auxPlot = ComputePDF(data)
1476        G2plt.PlotISFG(self,newPlot=False)
1477       
1478    def OnRulSlider(event):
1479        value = int(rulandSldr.GetValue())/1000.
1480        data['Ruland'] = max(0.001,value)
1481        rulandWdt.SetValue('%.3f'%(data['Ruland']))
1482        auxPlot = ComputePDF(data)
1483        G2plt.PlotISFG(self,newPlot=False)
1484       
1485    def OnLorch(event):
1486        data['Lorch'] = lorch.GetValue()
1487        auxPlot = ComputePDF(data)
1488        G2plt.PlotISFG(self,newPlot=False)       
1489                       
1490    def OnPacking(event):
1491        try:
1492            value = float(pack.GetValue())
1493            if value <= 0.0:
1494                raise ValueError
1495        except ValueError:
1496            value = data['Pack']
1497        data['Pack'] = value
1498        UpdatePDFGrid(self,data)
1499        auxPlot = ComputePDF(data)
1500        G2plt.PlotISFG(self,newPlot=False)       
1501               
1502    def OnSQmin(event):
1503        try:
1504            value = float(SQmin.GetValue())
1505            if value < qLimits[0]:
1506                raise ValueError
1507        except ValueError:
1508            value = max(qLimits[0],data['QScaleLim'][0])
1509        data['QScaleLim'][0] = value
1510        SQmin.SetValue('%.1f'%(value))
1511        auxPlot = ComputePDF(data)
1512        G2plt.PlotISFG(self,newPlot=True)       
1513       
1514    def OnSQmax(event):
1515        try:
1516            value = float(SQmax.GetValue())
1517            if value > qLimits[1]:
1518                raise ValueError
1519        except ValueError:
1520            value = min(qLimits[1],data['QScaleLim'][1])
1521        data['QScaleLim'][1] = value
1522        if value < data['QScaleLim'][0]:
1523            data['QScaleLim'][0] = 0.90*value
1524            SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1525        SQmax.SetValue('%.1f'%(value))
1526        auxPlot = ComputePDF(data)
1527        G2plt.PlotISFG(self,newPlot=True)
1528       
1529    def OnResetQ(event):
1530        resetQ.SetValue(False)
1531        data['QScaleLim'][1] = qLimits[1]
1532        SQmax.SetValue('%.1f'%(data['QScaleLim'][1]))
1533        data['QScaleLim'][0] = 0.9*qLimits[1]
1534        SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1535        auxPlot = ComputePDF(data)
1536        G2plt.PlotISFG(self,newPlot=True)       
1537
1538    def GetFileList(fileType,skip=None):
1539        fileList = [[False,'',0]]
1540        Source = ''
1541        id, cookie = self.PatternTree.GetFirstChild(self.root)
1542        while id:
1543            name = self.PatternTree.GetItemText(id)
1544            if fileType in name:
1545                if id == skip:
1546                    Source = name
1547                else:
1548                    fileList.append([False,name,id])
1549            id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1550        if skip:
1551            return fileList,Source
1552        else:
1553            return fileList
1554       
1555    def OnCopyPDFControls(event):
1556        import copy
1557        TextList,Source = GetFileList('PDF',skip=self.PatternId)
1558        TextList[0] = [False,'All PDF',0]
1559        if len(TextList) == 1:
1560            self.ErrorDialog('Nothing to copy controls to','There must be more than one "PDF" pattern')
1561            return
1562        dlg = self.CopyDialog(self,'Copy PDF controls','Copy controls from '+Source+' to:',TextList)
1563        try:
1564            if dlg.ShowModal() == wx.ID_OK:
1565                result = dlg.GetData()
1566                if result[0][0]:
1567                    result = TextList[1:]
1568                    for item in result: item[0] = True
1569                for i,item in enumerate(result):
1570                    ifcopy,name,id = item
1571                    if ifcopy:
1572                        olddata = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'))
1573                        sample = olddata['Sample']
1574                        olddata.update(data)
1575                        olddata['Sample'] = sample
1576                        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'),olddata)
1577                Status.SetStatusText('PDF controls copied')
1578        finally:
1579            dlg.Destroy()
1580               
1581    def OnSavePDFControls(event):
1582        print 'save PDF controls?'
1583       
1584    def OnLoadPDFControls(event):
1585        print 'Load PDF controls?'
1586       
1587    def OnAddElement(event):
1588        ElList = data['ElList']
1589        PE = G2elem.PickElement(self,oneOnly=True)
1590        if PE.ShowModal() == wx.ID_OK:
1591            El = PE.Elem
1592            if El not in ElList:
1593                ElemSym = El.strip().upper()               
1594                FpMu = G2elem.FPcalc(G2elem.GetXsectionCoeff(ElemSym), keV)
1595                ElData = G2elem.GetFormFactorCoeff(ElemSym)[0]
1596                ElData['FormulaNo'] = 0.0
1597                ElData.update(G2elem.GetAtomInfo(ElemSym))
1598                ElData.update(dict(zip(['fp','fpp','mu'],FpMu)))
1599                ElData.update(G2elem.GetFFC5(El))
1600                data['ElList'][El] = ElData
1601            data['Form Vol'] = max(10.0,SumElementVolumes())
1602        PE.Destroy()
1603        UpdatePDFGrid(self,data)
1604       
1605    def OnDeleteElement(event):
1606        ElList = data['ElList']
1607        choice = ElList.keys()
1608        dlg = G2elem.DeleteElement(self,choice=choice)
1609        if dlg.ShowModal() == wx.ID_OK:
1610            del ElList[dlg.GetDeleteElement()]
1611        dlg.Destroy()
1612        UpdatePDFGrid(self,data)
1613               
1614    def ComputePDF(Data):
1615        xydata = {}
1616        for key in ['Sample','Sample Bkg.','Container','Container Bkg.']:
1617            name = Data[key]['Name']
1618            if name:
1619                xydata[key] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.root,name))
1620                PDFname = name
1621        powName = xydata['Sample'][2]
1622        powId = G2gd.GetPatternTreeItemId(self,self.root,powName)
1623        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId,'Instrument Parameters'))
1624        inst = dict(zip(inst[3],inst[1]))
1625        auxPlot = G2pwd.CalcPDF(Data,inst,xydata)
1626        PDFId = G2gd.GetPatternTreeItemId(self,self.root,'PDF '+powName[4:])
1627        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'I(Q)'+powName[4:]),xydata['IofQ'])
1628        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'S(Q)'+powName[4:]),xydata['SofQ'])
1629        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'F(Q)'+powName[4:]),xydata['FofQ'])
1630        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'G(R)'+powName[4:]),xydata['GofR'])
1631        return auxPlot
1632       
1633    def OnComputePDF(event):
1634        print 'Calculating PDF:'
1635        auxPlot = ComputePDF(data)
1636        print 'Done calculating PDF:'
1637        Status.SetStatusText('PDF computed')
1638        for plot in auxPlot:
1639            G2plt.PlotXY(self,plot[:2],type=plot[2])
1640       
1641        G2plt.PlotISFG(self,newPlot=True,type='I(Q)')
1642        G2plt.PlotISFG(self,newPlot=True,type='S(Q)')
1643        G2plt.PlotISFG(self,newPlot=True,type='F(Q)')
1644        G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1645       
1646    def OnComputeAllPDF(event):
1647        print 'Calculating PDFs:'
1648        if self.PatternTree.GetCount():
1649            id, cookie = self.PatternTree.GetFirstChild(self.root)
1650            while id:
1651                Name = self.PatternTree.GetItemText(id)
1652                if 'PDF' in Name:
1653                    Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id,'PDF Controls'))
1654                    auxPlot = ComputePDF(Data)                   
1655                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1656            Status.SetStatusText('All PDFs computed')
1657            G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1658            print ' Done calculating PDFs:'
1659       
1660    def OnShowTip(self,tip):
1661        print tip   
1662               
1663    if self.dataDisplay:
1664        self.dataFrame.Clear()
1665    self.dataFrame.SetMenuBar(self.dataFrame.PDFMenu)
1666    if not self.dataFrame.GetStatusBar():
1667        Status = self.dataFrame.CreateStatusBar()   
1668    self.dataDisplay = wx.Panel(self.dataFrame)
1669    self.dataFrame.Bind(wx.EVT_MENU, OnCopyPDFControls, id=G2gd.wxID_PDFCOPYCONTROLS)
1670    self.dataFrame.Bind(wx.EVT_MENU, OnSavePDFControls, id=G2gd.wxID_PDFSAVECONTROLS)
1671    self.dataFrame.Bind(wx.EVT_MENU, OnLoadPDFControls, id=G2gd.wxID_PDFLOADCONTROLS)
1672    self.dataFrame.Bind(wx.EVT_MENU, OnAddElement, id=G2gd.wxID_PDFADDELEMENT)
1673    self.dataFrame.Bind(wx.EVT_MENU, OnDeleteElement, id=G2gd.wxID_PDFDELELEMENT)
1674    self.dataFrame.Bind(wx.EVT_MENU, OnComputePDF, id=G2gd.wxID_PDFCOMPUTE)
1675    self.dataFrame.Bind(wx.EVT_MENU, OnComputeAllPDF, id=G2gd.wxID_PDFCOMPUTEALL)
1676    mainSizer = wx.BoxSizer(wx.VERTICAL)
1677    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' PDF data files: '),0,wx.ALIGN_CENTER_VERTICAL)
1678    mainSizer.Add((5,5),0)
1679    str = ' Sample file: PWDR %s   Wavelength, A: %.5f  Energy, keV: %.3f  Polariz.: %.2f '%(dataFile[3:],wave,keV,polariz)
1680    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=str),0,wx.ALIGN_CENTER_VERTICAL)
1681#    dataSizer = wx.BoxSizer(wx.HORIZONTAL)
1682#    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Azimuth'),0,wx.ALIGN_CENTER_VERTICAL)
1683#    azimVal = wx.TextCtrl(self.dataDisplay,value='%.2f'%(inst['Azimuth']))
1684#    azimVal.Bind(wx.EVT_TEXT_ENTER,OnAzimVal)       
1685#    azimVal.Bind(wx.EVT_KILL_FOCUS,OnAzimVal)
1686#    dataSizer.Add(azimVal,0)   
1687#    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Polarization'),0,wx.ALIGN_CENTER_VERTICAL)
1688#    polaVal = wx.TextCtrl(self.dataDisplay,value='%.2f'%(inst['Polariz.']))
1689#    polaVal.Bind(wx.EVT_TEXT_ENTER,OnPolaVal)       
1690#    polaVal.Bind(wx.EVT_KILL_FOCUS,OnPolaVal)
1691#    dataSizer.Add(polaVal,0)   
1692#    mainSizer.Add(dataSizer,0)
1693    mainSizer.Add((5,5),0)
1694    fileSizer = wx.FlexGridSizer(3,6,5,1)
1695    select = ['Sample Bkg.','Container']
1696    if data['Container']['Name']:
1697        select.append('Container Bkg.')
1698    for key in select:
1699        FillFileSizer(fileSizer,key)
1700    mainSizer.Add(fileSizer,0)
1701    mainSizer.Add((5,5),0)
1702    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Sample information: '),0,wx.ALIGN_CENTER_VERTICAL)
1703    mainSizer.Add((5,5),0)   
1704
1705    ElList = data['ElList']
1706    Abs = G2lat.CellAbsorption(ElList,data['Form Vol'])
1707    Trans = G2pwd.Transmission(data['Geometry'],Abs*data['Pack'],data['Diam'])
1708    elemSizer = wx.FlexGridSizer(3,3,5,1)
1709    for El in ElList:
1710        FillElemSizer(elemSizer,ElList[El])
1711    mainSizer.Add(elemSizer,0)
1712    mainSizer.Add((5,5),0)   
1713    midSizer = wx.BoxSizer(wx.HORIZONTAL)
1714    midSizer.Add(wx.StaticText(self.dataDisplay,label=' Formula volume: '),0,wx.ALIGN_CENTER_VERTICAL)
1715    formVol = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Form Vol']))
1716    formVol.Bind(wx.EVT_TEXT_ENTER,OnFormVol)       
1717    formVol.Bind(wx.EVT_KILL_FOCUS,OnFormVol)
1718    midSizer.Add(formVol,0)
1719    midSizer.Add(wx.StaticText(self.dataDisplay,
1720        label=' Theoretical absorption: %.4f cm-1 Sample absorption: %.4f cm-1'%(Abs,Abs*data['Pack'])),
1721        0,wx.ALIGN_CENTER_VERTICAL)
1722    mainSizer.Add(midSizer,0)
1723    mainSizer.Add((5,5),0)   
1724
1725    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1726    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample geometry: '),0,wx.ALIGN_CENTER_VERTICAL)
1727    choice = ['Cylinder','Bragg-Brentano','Tilting flat plate in transmission','Fixed flat plate']
1728    geometry = wx.ComboBox(self.dataDisplay,value=data['Geometry'],choices=choice,
1729            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1730    geometry.Bind(wx.EVT_COMBOBOX, OnGeometry)
1731    geoBox.Add(geometry,0)
1732    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample diameter/thickness, mm: '),0,wx.ALIGN_CENTER_VERTICAL)
1733    diam = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Diam']))
1734    diam.Bind(wx.EVT_TEXT_ENTER,OnDiameter)       
1735    diam.Bind(wx.EVT_KILL_FOCUS,OnDiameter)
1736#    diam.Bind(wx.EVT_SET_FOCUS,OnShowTip(self,'tip')) #this doesn't work - what would????
1737    geoBox.Add(diam,0)
1738    mainSizer.Add(geoBox,0)
1739    mainSizer.Add((5,5),0)   
1740    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1741    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Packing: '),0,wx.ALIGN_CENTER_VERTICAL)
1742    pack = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Pack']))
1743    pack.Bind(wx.EVT_TEXT_ENTER,OnPacking)       
1744    pack.Bind(wx.EVT_KILL_FOCUS,OnPacking)
1745    geoBox.Add(pack,0)
1746    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample transmission: %.3f %%'%(Trans)),0,wx.ALIGN_CENTER_VERTICAL)   
1747    mainSizer.Add(geoBox,0)
1748    mainSizer.Add((5,5),0)   
1749       
1750    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' S(Q)->F(Q)->G(R) controls: '),0,wx.ALIGN_CENTER_VERTICAL)
1751    mainSizer.Add((5,5),0)
1752    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1753    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Detector type: '),0,wx.ALIGN_CENTER_VERTICAL)
1754    choice = ['Image plate','Point detector']
1755    detType = wx.ComboBox(self.dataDisplay,value=data['DetType'],choices=choice,
1756            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1757    detType.Bind(wx.EVT_COMBOBOX, OnDetType)
1758    sqBox.Add(detType,0)
1759    if data['DetType'] == 'Image plate':
1760        sqBox.Add(wx.StaticText(self.dataDisplay,label=' IP transmission coeff.: '),0,wx.ALIGN_CENTER_VERTICAL)
1761        obliqCoeff = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['ObliqCoeff']))
1762        obliqCoeff.Bind(wx.EVT_TEXT_ENTER,OnObliqCoeff)       
1763        obliqCoeff.Bind(wx.EVT_KILL_FOCUS,OnObliqCoeff)
1764        sqBox.Add(obliqCoeff,0)
1765    mainSizer.Add(sqBox,0)
1766       
1767    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1768    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Ruland width: '),0,wx.ALIGN_CENTER_VERTICAL)   
1769    rulandSldr = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
1770        value=int(1000*data['Ruland']))
1771    sqBox.Add(rulandSldr,1,wx.EXPAND)
1772    rulandSldr.Bind(wx.EVT_SLIDER, OnRulSlider)
1773    rulandWdt = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Ruland']))
1774    rulandWdt.Bind(wx.EVT_TEXT_ENTER,OnRulandWdt)       
1775    rulandWdt.Bind(wx.EVT_KILL_FOCUS,OnRulandWdt)
1776    sqBox.Add(rulandWdt,0,wx.ALIGN_CENTER_VERTICAL)   
1777    mainSizer.Add(sqBox,0,wx.ALIGN_LEFT|wx.EXPAND)
1778   
1779    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1780    lorch = wx.CheckBox(parent=self.dataDisplay,label='Lorch damping?')
1781    lorch.SetValue(data['Lorch'])
1782    lorch.Bind(wx.EVT_CHECKBOX, OnLorch)
1783    sqBox.Add(lorch,0,wx.ALIGN_CENTER_VERTICAL)
1784    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Scaling q-range: '),0,wx.ALIGN_CENTER_VERTICAL)
1785    SQmin = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][0]))
1786    SQmin.Bind(wx.EVT_TEXT_ENTER,OnSQmin)       
1787    SQmin.Bind(wx.EVT_KILL_FOCUS,OnSQmin)   
1788    sqBox.Add(SQmin,0)
1789    sqBox.Add(wx.StaticText(self.dataDisplay,label=' to '),0,wx.ALIGN_CENTER_VERTICAL)
1790    SQmax = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][1]))
1791    SQmax.Bind(wx.EVT_TEXT_ENTER,OnSQmax)       
1792    SQmax.Bind(wx.EVT_KILL_FOCUS,OnSQmax)
1793    sqBox.Add(SQmax,0)
1794    resetQ = wx.CheckBox(parent=self.dataDisplay,label='Reset?')
1795    sqBox.Add(resetQ,0)
1796    resetQ.Bind(wx.EVT_CHECKBOX, OnResetQ)
1797   
1798    mainSizer.Add(sqBox,0)
1799
1800    mainSizer.Layout()   
1801    self.dataDisplay.SetSizer(mainSizer)
1802    Size = mainSizer.Fit(self.dataFrame)
1803    self.dataDisplay.SetSize(Size)
1804    self.dataFrame.setSizePosLeft(Size)
1805   
Note: See TracBrowser for help on using the repository browser.