source: trunk/GSASIIpwdGUI.py @ 405

Last change on this file since 405 was 405, checked in by vondreele, 10 years ago

finish refactor of DData

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