source: trunk/GSASIIpwdGUI.py @ 342

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

major modifications to get 1st "working" version of Refine
Add GSASIImapvars.py
fix cell refinement in indexing window
single cycle for peak refinement

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