source: trunk/GSASIIpwdGUI.py @ 400

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

new default for Vcov contour plot - RdYlGn?
faster cleanup on changing/reloading projects
cleanup data delete
implement sample parameter copy
improve Vcov plotting routine
implement plot of vcov from seq refinements

  • Property svn:keywords set to Date Author Revision URL Id
File size: 83.8 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-10-27 15:26:50 +0000 (Thu, 27 Oct 2011) $
4# $Author: vondreele $
5# $Revision: 400 $
6# $URL: trunk/GSASIIpwdGUI.py $
7# $Id: GSASIIpwdGUI.py 400 2011-10-27 15:26:50Z 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        hklShow.SetValue(False)
970        PatternId = self.PatternId
971        PickId = self.PickId   
972        limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Limits'))[1]
973        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
974        cell = controls[6:12]
975        A = G2lat.cell2A(cell)
976        ibrav = bravaisSymb.index(controls[5])
977        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
978        inst = dict(zip(inst[3],inst[1]))
979        if 'Lam' in inst:
980            wave = inst['Lam']
981        else:
982            wave = inst['Lam1']
983        dmin = wave/(2.0*sind(limits[1]/2.0))
984        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
985        for hkl in self.HKL:
986            hkl.append(2.0*asind(wave/(2.*hkl[3]))+controls[1])             
987        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
988            G2plt.PlotPowderLines(self)
989        else:
990            G2plt.PlotPatterns(self)
991       
992    def CopyUnitCell(event):
993        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)
994        for Cell in cells:
995            if Cell[-1]:
996                break
997        cell = Cell[2:9]
998        controls[4] = 1
999        controls[5] = bravaisSymb[cell[0]]
1000        controls[6:12] = cell[1:8]
1001        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
1002        self.PatternTree.SetItemPyData(UnitCellsId,[controls,bravais,cells,dmin])
1003        UpdateUnitCellsGrid(self,data)
1004       
1005        self.dataFrame.RefineCell.Enable(True)
1006               
1007    def RefineCell(event):
1008        def cellPrint(ibrav,A):
1009            cell = G2lat.A2cell(A)
1010            Vol = G2lat.calc_V(A)
1011            if ibrav in [0,1,2]:
1012                print "%s%10.6f" % ('a =',cell[0])
1013            elif ibrav in [3,4,5,6]:
1014                print "%s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],' c =',cell[2],' volume =',Vol)
1015            elif ibrav in [7,8,9,10]:
1016                print "%s%10.6f %s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],' volume =',Vol)
1017            elif ibrav in [11,12]:
1018                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)
1019            else:
1020                print "%s%10.6f %s%10.6f %s%10.6f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2])
1021                print "%s%8.3f %s%8.3f %s%8.3f %s%12.3f" % ('alpha =',cell[3],'beta =',cell[4],'gamma =',cell[5],' volume =',Vol)
1022             
1023        PatternId = self.PatternId
1024        PickId = self.PickId   
1025        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
1026        if not peaks:
1027            self.ErrorDialog('No peaks!', 'Nothing to refine!')
1028            return       
1029        print 'Refine cell'
1030        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
1031        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
1032        cell = controls[6:12]
1033        A = G2lat.cell2A(cell)
1034        ibrav = bravaisSymb.index(controls[5])
1035        dmin = G2indx.getDmin(peaks)-0.005
1036        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
1037        G2indx.IndexPeaks(peaks,self.HKL)
1038        if controls[0]:
1039            Lhkl,M20,X20,Aref,Zero = G2indx.refinePeaksZ(peaks,inst[1],ibrav,A,controls[1])           
1040            controls[1] = Zero
1041        else:
1042            Lhkl,M20,X20,Aref = G2indx.refinePeaks(peaks,ibrav,A)
1043        controls[6:12] = G2lat.A2cell(Aref)
1044        controls[12] = G2lat.calc_V(Aref)
1045        data = [controls,bravais,cells,dmin]
1046        cells = self.PatternTree.GetItemPyData(UnitCellsId)[2]
1047        for cell in cells:
1048            cell[-1] = False
1049        cells.insert(0,[M20,X20,ibrav]+controls[6:13]+[True,])
1050        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
1051        self.HKL = G2lat.GenHBravais(dmin,ibrav,Aref)
1052        UpdateUnitCellsGrid(self,data)
1053        print "%s%10.3f" % ('refinement M20 = ',M20)
1054        print 'unindexed lines = ',X20
1055        cellPrint(ibrav,Aref)
1056        for hkl in self.HKL:
1057            hkl.append(2.0*asind(inst[1]/(2.*hkl[3]))+controls[1])             
1058        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1059            G2plt.PlotPowderLines(self)
1060        else:
1061            G2plt.PlotPatterns(self)
1062       
1063    def IndexPeaks(event):
1064        PatternId = self.PatternId   
1065#        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
1066#        if not peaks:
1067#            self.ErrorDialog('No peaks!', 'Nothing to index!')
1068#            return
1069        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
1070        print 'Peak Indexing'
1071        try:
1072            controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
1073            cells = []
1074        except ValueError:
1075            self.ErrorDialog('Error','Need to set controls in Unit Cell List first')
1076            return
1077        if True not in bravais:
1078            self.ErrorDialog('Error','No Bravais lattices selected')
1079            return
1080        self.dataFrame.CopyCell.Enable(False)
1081        self.dataFrame.RefineCell.Enable(False)
1082        OK,dmin,cells = G2indx.DoIndexPeaks(peaks,inst,controls,bravais)
1083        if OK:
1084            data = [controls,bravais,cells,dmin]
1085            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
1086            UpdateUnitCellsGrid(self,data)
1087            bestCell = cells[0]
1088            if bestCell[0] > 10.:
1089                self.HKL = G2lat.GenHBravais(dmin,bestCell[2],G2lat.cell2A(bestCell[3:9]))
1090                for hkl in self.HKL:
1091                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
1092                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1093                    G2plt.PlotPowderLines(self)
1094                else:
1095                    G2plt.PlotPatterns(self)
1096            self.dataFrame.CopyCell.Enable(True)
1097            self.dataFrame.IndexPeaks.Enable(True)
1098            self.dataFrame.MakeNewPhase.Enable(True)
1099            UpdateUnitCellsGrid(self,data)
1100               
1101    def RefreshUnitCellsGrid(event):
1102        cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)[2:]
1103        r,c =  event.GetRow(),event.GetCol()
1104        if cells:
1105            if c == 2:
1106                for i in range(len(cells)):
1107                    cells[i][-1] = False
1108                    UnitCellsTable.SetValue(i,c,False)
1109                UnitCellsTable.SetValue(r,c,True)
1110                gridDisplay.ForceRefresh()
1111                cells[r][-1] = True
1112                ibrav = cells[r][2]
1113                A = G2lat.cell2A(cells[r][3:9])
1114                self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
1115                for hkl in self.HKL:
1116                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
1117                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1118                    G2plt.PlotPowderLines(self)
1119                else:
1120                    G2plt.PlotPatterns(self)
1121       
1122    def MakeNewPhase(event):
1123        if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
1124            sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
1125        else:
1126            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
1127        PhaseName = ''
1128        dlg = wx.TextEntryDialog(None,'Enter a name for this phase','Phase Name Entry','New phase',
1129            style=wx.OK)
1130        try:
1131            if dlg.ShowModal() == wx.ID_OK:
1132                PhaseName = dlg.GetValue()
1133                cells = self.PatternTree.GetItemPyData(UnitCellsId)[2]
1134                for Cell in cells:
1135                    if Cell[-1]:
1136                        break
1137                cell = Cell[2:10]       
1138                sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
1139                E,SGData = G2spc.SpcGroup(spaceGroups[cell[0]])
1140                self.PatternTree.SetItemPyData(sub, \
1141                    {'General':{'Name':PhaseName,'Type':'nuclear','SGData':SGData,
1142                    'Cell':[False,]+cell[1:],
1143                    'Pawley dmin':1.00},'Atoms':[],'Drawing':{},'Histograms':{}})
1144                Status.SetStatusText('Change space group if needed')
1145        finally:
1146            dlg.Destroy()
1147           
1148    if self.dataDisplay:
1149        self.dataFrame.Clear()
1150    self.dataFrame.SetMenuBar(self.dataFrame.IndexMenu)
1151    if not self.dataFrame.GetStatusBar():
1152        Status = self.dataFrame.CreateStatusBar()
1153    self.Bind(wx.EVT_MENU, IndexPeaks, id=G2gd.wxID_INDEXPEAKS)
1154    self.Bind(wx.EVT_MENU, CopyUnitCell, id=G2gd.wxID_COPYCELL)
1155    self.Bind(wx.EVT_MENU, RefineCell, id=G2gd.wxID_REFINECELL)
1156    self.Bind(wx.EVT_MENU, MakeNewPhase, id=G2gd.wxID_MAKENEWPHASE)
1157   
1158    controls,bravais,cells,dmin = data
1159    if len(controls) < 13:              #add cell volume if missing
1160        controls.append(G2lat.calc_V(G2lat.cell2A(controls[6:12])))
1161    self.PatternTree.SetItemPyData(UnitCellsId,data)            #update with volume
1162    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
1163    bravaisNames = ['Cubic-F','Cubic-I','Cubic-P','Trigonal-R','Trigonal/Hexagonal-P',
1164        'Tetragonal-I','Tetragonal-P','Orthorhombic-F','Orthorhombic-I','Orthorhombic-C',
1165        'Orthorhombic-P','Monoclinic-C','Monoclinic-P','Triclinic']
1166    cellGUIlist = [[[0,1,2],4,zip([" Unit cell: a = "," Vol = "],["%.5f","%.3f"],[True,False],[0,0])],
1167    [[3,4,5,6],6,zip([" Unit cell: a = "," c = "," Vol = "],["%.5f","%.5f","%.3f"],[True,True,False],[0,2,0])],
1168    [[7,8,9,10],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "],["%.5f","%.5f","%.5f","%.3f"],
1169        [True,True,True,False],[0,1,2,0])],
1170    [[11,12],10,zip([" Unit cell: a = "," b = "," c = "," beta = "," Vol = "],
1171        ["%.5f","%.5f","%.5f","%.3f","%.3f"],[True,True,True,True,False],[0,1,2,4,0])],
1172    [[13,],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "," alpha = "," beta = "," gamma = "],
1173        ["%.5f","%.5f","%.5f","%.3f","%.3f","%.3f","%.3f"],
1174        [True,True,True,False,True,True,True],[0,1,2,0,3,4,5])]]
1175   
1176    self.dataFrame.SetLabel('Unit Cells List')
1177    self.sp = wx.SplitterWindow(self.dataFrame)
1178    self.dataDisplay = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
1179    self.dataFrame.IndexPeaks.Enable(False)
1180    peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Index Peak List'))
1181    if peaks:
1182        self.dataFrame.IndexPeaks.Enable(True)
1183    self.dataFrame.RefineCell.Enable(False)
1184    if controls[12] > 1.0:                               #if a "real" volume (i.e. not default)
1185        self.dataFrame.RefineCell.Enable(True)   
1186    self.dataFrame.CopyCell.Enable(False)
1187    self.dataFrame.MakeNewPhase.Enable(False)       
1188    if cells:
1189        self.bottom = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
1190        self.sp.SplitHorizontally(self.dataDisplay,self.bottom,0)
1191        self.dataFrame.CopyCell.Enable(True)
1192        self.dataFrame.MakeNewPhase.Enable(True)       
1193    mainSizer = wx.BoxSizer(wx.VERTICAL)
1194    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Indexing controls: '),0,wx.ALIGN_CENTER_VERTICAL)
1195    mainSizer.Add((5,5),0)
1196    littleSizer = wx.FlexGridSizer(2,5,5,5)
1197    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max Nc/Nobs '),0,wx.ALIGN_CENTER_VERTICAL)
1198    NcNo = wx.SpinCtrl(self.dataDisplay)
1199    NcNo.SetRange(1,6)
1200    NcNo.SetValue(controls[2])
1201    NcNo.Bind(wx.EVT_SPINCTRL,OnNcNo)
1202    littleSizer.Add(NcNo,0,wx.ALIGN_CENTER_VERTICAL)
1203    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start Volume '),0,wx.ALIGN_CENTER_VERTICAL)
1204    startVol = wx.TextCtrl(self.dataDisplay,value=str('%d'%(controls[3])),style=wx.TE_PROCESS_ENTER)
1205    startVol.Bind(wx.EVT_TEXT_ENTER,OnStartVol)
1206    startVol.Bind(wx.EVT_KILL_FOCUS,OnStartVol)
1207    littleSizer.Add(startVol,0,wx.ALIGN_CENTER_VERTICAL)
1208    mainSizer.Add(littleSizer,0)
1209    mainSizer.Add((5,5),0)
1210    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Select Bravais Lattices for indexing: '),
1211        0,wx.ALIGN_CENTER_VERTICAL)
1212    mainSizer.Add((5,5),0)
1213    littleSizer = wx.FlexGridSizer(2,7,5,5)
1214    bravList = []
1215    bravs = zip(bravais,bravaisNames)
1216    for brav,bravName in bravs:
1217        bravCk = wx.CheckBox(self.dataDisplay,label=bravName)
1218        bravList.append(bravCk.GetId())
1219        bravCk.SetValue(brav)
1220        bravCk.Bind(wx.EVT_CHECKBOX,OnBravais)
1221        littleSizer.Add(bravCk,0,wx.ALIGN_CENTER_VERTICAL)
1222    mainSizer.Add(littleSizer,0)
1223    mainSizer.Add((5,5),0)
1224   
1225    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Cell Refinement: '),0,wx.ALIGN_CENTER_VERTICAL)
1226    mainSizer.Add((5,5),0)
1227    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
1228    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Bravais lattice "),0,wx.ALIGN_CENTER_VERTICAL)
1229    bravSel = wx.Choice(self.dataDisplay,choices=bravaisSymb)
1230    bravSel.SetSelection(bravaisSymb.index(controls[5]))
1231    bravSel.Bind(wx.EVT_CHOICE,OnBravSel)
1232    littleSizer.Add(bravSel,0,wx.ALIGN_CENTER_VERTICAL)
1233    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Zero offset"),0,wx.ALIGN_CENTER_VERTICAL)
1234    zero = wx.TextCtrl(self.dataDisplay,value="%.4f"%(controls[1]),style=wx.TE_PROCESS_ENTER)
1235    zero.Bind(wx.EVT_TEXT_ENTER,OnZero)
1236    zero.Bind(wx.EVT_KILL_FOCUS,OnZero)
1237    littleSizer.Add(zero,0,wx.ALIGN_CENTER_VERTICAL)
1238    zeroVar = wx.CheckBox(self.dataDisplay,label="Refine?")
1239    zeroVar.SetValue(controls[0])
1240    zeroVar.Bind(wx.EVT_CHECKBOX,OnZeroVar)
1241    littleSizer.Add(zeroVar,0,wx.ALIGN_CENTER_VERTICAL)
1242    hklShow = wx.CheckBox(self.dataDisplay,label="  Show hkl positions")
1243    hklShow.Bind(wx.EVT_CHECKBOX,OnHklShow)
1244    littleSizer.Add(hklShow,0,wx.ALIGN_CENTER_VERTICAL)
1245    mainSizer.Add(littleSizer,0)
1246   
1247    mainSizer.Add((5,5),0)
1248    ibrav = SetLattice(controls)
1249    for cellGUI in cellGUIlist:
1250        if ibrav in cellGUI[0]:
1251            useGUI = cellGUI
1252    cellList = []
1253    littleSizer = wx.FlexGridSizer(2,useGUI[1],5,5)
1254    for txt,fmt,ifEdit,Id in useGUI[2]:
1255        littleSizer.Add(wx.StaticText(self.dataDisplay,label=txt),0,wx.ALIGN_CENTER_VERTICAL)
1256        if ifEdit:          #a,b,c,etc.
1257            cellVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[6+Id])),style=wx.TE_PROCESS_ENTER)
1258            cellVal.Bind(wx.EVT_TEXT_ENTER,OnCellChange)       
1259            cellVal.Bind(wx.EVT_KILL_FOCUS,OnCellChange)
1260            littleSizer.Add(cellVal,0,wx.ALIGN_CENTER_VERTICAL)
1261            cellList.append(cellVal.GetId())
1262        else:               #volume
1263            volVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[12])),style=wx.TE_READONLY)
1264            volVal.SetBackgroundColour(VERY_LIGHT_GREY)
1265            littleSizer.Add(volVal,0,wx.ALIGN_CENTER_VERTICAL)
1266    mainSizer.Add(littleSizer,0)
1267       
1268    mainSizer.Layout()   
1269    self.dataDisplay.SetSizer(mainSizer)
1270    topSize = mainSizer.Fit(self.dataFrame)
1271    self.dataDisplay.SetSize(topSize)
1272    if cells:
1273        if ibrav == 13:
1274            topSize[1] += 230
1275        else:
1276            topSize[1] += 200
1277    self.dataFrame.setSizePosLeft(topSize)
1278   
1279   
1280    if cells:
1281        bottomSize = self.bottom.GetSize()
1282        if ibrav == 13:
1283            bottomSize[1] -= 240
1284        else:
1285            bottomSize[1] -= 210
1286        wx.StaticText(parent=self.bottom,label=' Indexing Result ')
1287        rowLabels = []
1288        colLabels = ['M20','X20','use','Bravais','a','b','c','alpha','beta','gamma','Volume']
1289        Types = [wg.GRID_VALUE_FLOAT+':10,2',wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING,]+ \
1290            3*[wg.GRID_VALUE_FLOAT+':10,5',]+3*[wg.GRID_VALUE_FLOAT+':10,3',]+ \
1291            [wg.GRID_VALUE_FLOAT+':10,2']
1292        numRows = len(cells)
1293        table = []
1294        for cell in cells:
1295            rowLabels.append('')
1296            row = cell[0:2]+[cell[-1]]+[bravaisSymb[cell[2]]]+cell[3:10]
1297            if cell[-1]:
1298                A = G2lat.cell2A(cell[3:9])
1299                self.HKL = G2lat.GenHBravais(dmin,cell[2],A)
1300                for hkl in self.HKL:
1301                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
1302            table.append(row)
1303        UnitCellsTable = G2gd.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1304        gridDisplay = G2gd.GSGrid(self.bottom)
1305        gridDisplay.SetPosition(wx.Point(0,20))               
1306        gridDisplay.SetTable(UnitCellsTable, True)
1307        self.dataFrame.CopyCell.Enable(True)
1308        gridDisplay.Bind(wg.EVT_GRID_CELL_LEFT_CLICK,RefreshUnitCellsGrid)
1309        gridDisplay.SetMargins(0,0)
1310        gridDisplay.SetRowLabelSize(0)
1311        gridDisplay.AutoSizeColumns(False)
1312        for r in range(gridDisplay.GetNumberRows()):
1313            for c in range(gridDisplay.GetNumberCols()):
1314                if c == 2:
1315                    gridDisplay.SetReadOnly(r,c,isReadOnly=False)
1316                else:
1317                    gridDisplay.SetReadOnly(r,c,isReadOnly=True)
1318        gridDisplay.SetSize(bottomSize)
1319
1320def UpdateReflectionGrid(self,data):
1321    if not data:
1322        print 'No phases, no reflections'
1323        return
1324    phases = data.keys()
1325   
1326    def OnSelectPhase(event):
1327        dlg = wx.SingleChoiceDialog(self,'Select','Phase',phases)
1328        try:
1329            if dlg.ShowModal() == wx.ID_OK:
1330                sel = dlg.GetSelection()
1331                self.RefList = phases[sel]
1332                UpdateReflectionGrid(self,data)
1333        finally:
1334            dlg.Destroy()
1335        G2plt.PlotPatterns(self)
1336       
1337       
1338    if self.dataDisplay:
1339        self.dataFrame.Clear()
1340    self.dataFrame.SetMenuBar(self.dataFrame.ReflMenu)
1341    if not self.dataFrame.GetStatusBar():
1342        Status = self.dataFrame.CreateStatusBar()   
1343    self.Bind(wx.EVT_MENU, OnSelectPhase, id=G2gd.wxID_SELECTPHASE)
1344    self.dataFrame.SelectPhase.Enable(False)
1345    if len(data) > 1:
1346        self.dataFrame.SelectPhase.Enable(True)
1347    rowLabels = []
1348    refList = [refl[:11] for refl in data[self.RefList]]
1349    for i in range(len(refList)): rowLabels.append(str(i))
1350    colLabels = ['H','K','L','mul','d','pos','sig','gam','Fosq','Fcsq','phase',]
1351    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',]
1352    self.PeakTable = G2gd.Table(refList,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1353    self.dataFrame.SetLabel('Reflection List for '+self.RefList)
1354    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)
1355    self.dataDisplay.SetTable(self.PeakTable, True)
1356    self.dataDisplay.EnableEditing(False)
1357    self.dataDisplay.SetMargins(0,0)
1358    self.dataDisplay.AutoSizeColumns(False)
1359    self.dataFrame.setSizePosLeft([555,350])
1360
1361def UpdatePDFGrid(self,data):
1362    global inst
1363    tth2q = lambda t,w:4.0*math.pi*sind(t/2.0)/w
1364    dataFile = self.PatternTree.GetItemText(self.PatternId)
1365    powName = 'PWDR'+dataFile[4:]
1366    powId = G2gd.GetPatternTreeItemId(self,self.root, powName)
1367    fullLimits,limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Limits'))
1368    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Instrument Parameters'))
1369    inst = dict(zip(inst[3],inst[1]))
1370    if 'Lam' in inst:
1371        keV = 12.397639/inst['Lam']
1372    else:
1373        keV = 12.397639/inst['Lam1']
1374    wave = 12.397639/keV
1375    qLimits = [tth2q(fullLimits[0],wave),tth2q(fullLimits[1],wave)]
1376    data['QScaleLim'][1] = min(qLimits[1],data['QScaleLim'][1])
1377    if data['QScaleLim'][0]:
1378        data['QScaleLim'][0] = max(qLimits[0],data['QScaleLim'][0])
1379    else:                                #initial setting at 90% of max Q
1380        data['QScaleLim'][0] = 0.90*data['QScaleLim'][1]
1381    polariz = inst['Polariz.']
1382    azimuth = inst['Azimuth']
1383    itemDict = {}
1384   
1385    def FillFileSizer(fileSizer,key):
1386        #fileSizer is a FlexGridSizer(3,6)
1387       
1388        def OnSelectFile(event):
1389            Obj = event.GetEventObject()
1390            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1391            if itemKey == 'Name':
1392                value = Obj.GetValue()
1393            Obj.SetValue(fmt%(value))
1394            data[fileKey][itemKey] = value
1395            UpdatePDFGrid(self,data)
1396       
1397        def OnValueChange(event):
1398            Obj = event.GetEventObject()
1399            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1400            try:
1401                value = float(Obj.GetValue())
1402            except ValueError:
1403                value = -1.0
1404            Obj.SetValue(fmt%(value))
1405            data[fileKey][itemKey] = value
1406            auxPlot = ComputePDF(data)
1407            G2plt.PlotISFG(self,newPlot=True)
1408                       
1409        item = data[key]
1410        fileList = np.array(GetFileList('PWDR')).T[1]
1411        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' '+key+' file:'),0,wx.ALIGN_CENTER_VERTICAL)
1412        fileName = wx.ComboBox(self.dataDisplay,value=item['Name'],choices=fileList,
1413            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1414        itemDict[fileName.GetId()] = [key,'Name','%s']
1415        fileName.Bind(wx.EVT_COMBOBOX,OnSelectFile)       
1416        fileSizer.Add(fileName,0,)
1417        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Multiplier:'),0,wx.ALIGN_CENTER_VERTICAL)
1418        mult = wx.TextCtrl(self.dataDisplay,value='%.3f'%(item['Mult']),style=wx.TE_PROCESS_ENTER)
1419        itemDict[mult.GetId()] = [key,'Mult','%.3f']
1420        mult.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1421        mult.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1422        fileSizer.Add(mult,0,)
1423        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Add:'),0,wx.ALIGN_CENTER_VERTICAL)
1424        add = wx.TextCtrl(self.dataDisplay,value='%.0f'%(item['Add']),style=wx.TE_PROCESS_ENTER)
1425        itemDict[add.GetId()] = [key,'Add','%.0f']
1426        add.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1427        add.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1428        fileSizer.Add(add,0,)
1429       
1430    def SumElementVolumes():
1431        sumVol = 0.
1432        ElList = data['ElList']
1433        for El in ElList:
1434            Avol = (4.*math.pi/3.)*ElList[El]['Drad']**3
1435            sumVol += Avol*ElList[El]['FormulaNo']
1436        return sumVol
1437        auxPlot = ComputePDF(data)
1438        G2plt.PlotISFG(self,newPlot=True)       
1439       
1440    def FillElemSizer(elemSizer,ElData):
1441       
1442        def OnFractionChange(event):
1443            try:
1444                value = max(0.0,float(num.GetValue()))
1445            except ValueError:
1446                value = 0.0
1447            num.SetValue('%.3f'%(value))
1448            ElData['FormulaNo'] = value
1449            data['Form Vol'] = max(10.0,SumElementVolumes())
1450            formVol.SetValue('%.2f'%(data['Form Vol']))
1451            UpdatePDFGrid(self,data)
1452            auxPlot = ComputePDF(data)
1453            G2plt.PlotISFG(self,newPlot=True)       
1454       
1455        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1456            label=' Element: '+'%2s'%(ElData['Symbol'])+' * '),0,wx.ALIGN_CENTER_VERTICAL)
1457        num = wx.TextCtrl(self.dataDisplay,value='%.3f'%(ElData['FormulaNo']),style=wx.TE_PROCESS_ENTER)
1458        num.Bind(wx.EVT_TEXT_ENTER,OnFractionChange)       
1459        num.Bind(wx.EVT_KILL_FOCUS,OnFractionChange)
1460        elemSizer.Add(num,0,wx.ALIGN_CENTER_VERTICAL)
1461        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1462            label="f': %.3f"%(ElData['fp'])+' f": %.3f'%(ElData['fpp'])+' mu: %.2f barns'%(ElData['mu']) ),
1463            0,wx.ALIGN_CENTER_VERTICAL)
1464           
1465    def OnGeometry(event):
1466        data['Geometry'] = geometry.GetValue()
1467        UpdatePDFGrid(self,data)
1468        auxPlot = ComputePDF(data)
1469        G2plt.PlotISFG(self,newPlot=True)       
1470       
1471    def OnDetType(event):
1472        data['DetType'] = detType.GetValue()
1473        UpdatePDFGrid(self,data)
1474        auxPlot = ComputePDF(data)
1475        G2plt.PlotISFG(self,newPlot=True)       
1476       
1477    def OnFormVol(event):
1478        try:
1479            value = float(formVol.GetValue())
1480            if value <= 0.0:
1481                raise ValueError
1482        except ValueError:
1483            value = data['Form Vol']
1484        data['Form Vol'] = value
1485        UpdatePDFGrid(self,data)
1486        auxPlot = ComputePDF(data)
1487        G2plt.PlotISFG(self,newPlot=False)       
1488       
1489    def OnDiameter(event):
1490        try:
1491            value = float(diam.GetValue())
1492            if value <= 0.0:
1493                raise ValueError
1494        except ValueError:
1495            value = data['Diam']
1496        data['Diam'] = value
1497        UpdatePDFGrid(self,data)
1498        auxPlot = ComputePDF(data)
1499        G2plt.PlotISFG(self,newPlot=False)
1500       
1501    def OnPolaVal(event):
1502        try:
1503            value = float(polaVal.GetValue())
1504            if not (0.0 <= value <= 1.0):
1505                raise ValueError
1506        except ValueError:
1507            value = inst['Polariz.']
1508        inst['Polariz.'] = value
1509        polaVal.SetValue('%.2f'%(inst['Polariz.']))
1510        UpdatePDFGrid(self,data)
1511        auxPlot = ComputePDF(data)
1512        G2plt.PlotISFG(self,newPlot=False)
1513               
1514    def OnAzimVal(event):
1515        try:
1516            value = float(azimVal.GetValue())
1517            if not (0. <= value <= 360.):
1518                raise ValueError
1519        except ValueError:
1520            value = inst['Azimuth']
1521        inst['Azimuth'] = value
1522        azimVal.SetValue('%.1f'%(inst['Azimuth']))
1523        UpdatePDFGrid(self,data)
1524        auxPlot = ComputePDF(data)
1525        G2plt.PlotISFG(self,newPlot=False)
1526                       
1527    def OnObliqCoeff(event):
1528        try:
1529            value = float(obliqCoeff.GetValue())
1530            if value < 0.0:
1531                raise ValueError
1532            elif value > 1.0:
1533                value = 1.0
1534        except ValueError:
1535            value = data['ObliqCoeff']
1536        data['ObliqCoeff'] = value
1537        obliqCoeff.SetValue('%.3f'%(value))
1538        auxPlot = ComputePDF(data)
1539        G2plt.PlotISFG(self,newPlot=False)
1540       
1541    def OnRulandWdt(event):
1542        try:
1543            value = float(rulandWdt.GetValue())
1544            if value <= 0.001:
1545                raise ValueError
1546            elif value > 1.0:
1547                value = 1.0
1548        except ValueError:
1549            value = data['Ruland']
1550        data['Ruland'] = value
1551        rulandWdt.SetValue('%.3f'%(value))
1552        auxPlot = ComputePDF(data)
1553        G2plt.PlotISFG(self,newPlot=False)
1554       
1555    def OnRulSlider(event):
1556        value = int(rulandSldr.GetValue())/1000.
1557        data['Ruland'] = max(0.001,value)
1558        rulandWdt.SetValue('%.3f'%(data['Ruland']))
1559        auxPlot = ComputePDF(data)
1560        G2plt.PlotISFG(self,newPlot=False)
1561       
1562    def OnLorch(event):
1563        data['Lorch'] = lorch.GetValue()
1564        auxPlot = ComputePDF(data)
1565        G2plt.PlotISFG(self,newPlot=False)       
1566                       
1567    def OnPacking(event):
1568        try:
1569            value = float(pack.GetValue())
1570            if value <= 0.0:
1571                raise ValueError
1572        except ValueError:
1573            value = data['Pack']
1574        data['Pack'] = value
1575        UpdatePDFGrid(self,data)
1576        auxPlot = ComputePDF(data)
1577        G2plt.PlotISFG(self,newPlot=False)       
1578               
1579    def OnSQmin(event):
1580        try:
1581            value = float(SQmin.GetValue())
1582            if value < qLimits[0]:
1583                raise ValueError
1584        except ValueError:
1585            value = max(qLimits[0],data['QScaleLim'][0])
1586        data['QScaleLim'][0] = value
1587        SQmin.SetValue('%.1f'%(value))
1588        auxPlot = ComputePDF(data)
1589        G2plt.PlotISFG(self,newPlot=True)       
1590       
1591    def OnSQmax(event):
1592        try:
1593            value = float(SQmax.GetValue())
1594            if value > qLimits[1]:
1595                raise ValueError
1596        except ValueError:
1597            value = min(qLimits[1],data['QScaleLim'][1])
1598        data['QScaleLim'][1] = value
1599        if value < data['QScaleLim'][0]:
1600            data['QScaleLim'][0] = 0.90*value
1601            SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1602        SQmax.SetValue('%.1f'%(value))
1603        auxPlot = ComputePDF(data)
1604        G2plt.PlotISFG(self,newPlot=True)
1605       
1606    def OnResetQ(event):
1607        resetQ.SetValue(False)
1608        data['QScaleLim'][1] = qLimits[1]
1609        SQmax.SetValue('%.1f'%(data['QScaleLim'][1]))
1610        data['QScaleLim'][0] = 0.9*qLimits[1]
1611        SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1612        auxPlot = ComputePDF(data)
1613        G2plt.PlotISFG(self,newPlot=True)       
1614
1615    def GetFileList(fileType,skip=None):
1616        fileList = [[False,'',0]]
1617        Source = ''
1618        id, cookie = self.PatternTree.GetFirstChild(self.root)
1619        while id:
1620            name = self.PatternTree.GetItemText(id)
1621            if fileType in name:
1622                if id == skip:
1623                    Source = name
1624                else:
1625                    fileList.append([False,name,id])
1626            id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1627        if skip:
1628            return fileList,Source
1629        else:
1630            return fileList
1631       
1632    def OnCopyPDFControls(event):
1633        import copy
1634        TextList,Source = GetFileList('PDF',skip=self.PatternId)
1635        TextList[0] = [False,'All PDF',0]
1636        if len(TextList) == 1:
1637            self.ErrorDialog('Nothing to copy controls to','There must be more than one "PDF" pattern')
1638            return
1639        dlg = self.CopyDialog(self,'Copy PDF controls','Copy controls from '+Source+' to:',TextList)
1640        try:
1641            if dlg.ShowModal() == wx.ID_OK:
1642                result = dlg.GetData()
1643                if result[0][0]:
1644                    result = TextList[1:]
1645                    for item in result: item[0] = True
1646                for i,item in enumerate(result):
1647                    ifcopy,name,id = item
1648                    if ifcopy:
1649                        olddata = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'))
1650                        sample = olddata['Sample']
1651                        olddata.update(data)
1652                        olddata['Sample'] = sample
1653                        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'),olddata)
1654                Status.SetStatusText('PDF controls copied')
1655        finally:
1656            dlg.Destroy()
1657               
1658    def OnSavePDFControls(event):
1659        print 'save PDF controls?'
1660       
1661    def OnLoadPDFControls(event):
1662        print 'Load PDF controls?'
1663       
1664    def OnAddElement(event):
1665        ElList = data['ElList']
1666        PE = G2elem.PickElement(self,oneOnly=True)
1667        if PE.ShowModal() == wx.ID_OK:
1668            El = PE.Elem
1669            if El not in ElList:
1670                ElemSym = El.strip().upper()               
1671                FpMu = G2elem.FPcalc(G2elem.GetXsectionCoeff(ElemSym), keV)
1672                ElData = G2elem.GetFormFactorCoeff(ElemSym)[0]
1673                ElData['FormulaNo'] = 0.0
1674                ElData.update(G2elem.GetAtomInfo(ElemSym))
1675                ElData.update(dict(zip(['fp','fpp','mu'],FpMu)))
1676                ElData.update(G2elem.GetFFC5(El))
1677                data['ElList'][El] = ElData
1678            data['Form Vol'] = max(10.0,SumElementVolumes())
1679        PE.Destroy()
1680        UpdatePDFGrid(self,data)
1681       
1682    def OnDeleteElement(event):
1683        ElList = data['ElList']
1684        choice = ElList.keys()
1685        dlg = G2elem.DeleteElement(self,choice=choice)
1686        if dlg.ShowModal() == wx.ID_OK:
1687            del ElList[dlg.GetDeleteElement()]
1688        dlg.Destroy()
1689        UpdatePDFGrid(self,data)
1690               
1691    def ComputePDF(Data):
1692        xydata = {}
1693        for key in ['Sample','Sample Bkg.','Container','Container Bkg.']:
1694            name = Data[key]['Name']
1695            if name:
1696                xydata[key] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.root,name))
1697                PDFname = name
1698        powName = xydata['Sample'][2]
1699        powId = G2gd.GetPatternTreeItemId(self,self.root,powName)
1700        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId,'Instrument Parameters'))
1701        inst = dict(zip(inst[3],inst[1]))
1702        auxPlot = G2pwd.CalcPDF(Data,inst,xydata)
1703        PDFId = G2gd.GetPatternTreeItemId(self,self.root,'PDF '+powName[4:])
1704        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'I(Q)'+powName[4:]),xydata['IofQ'])
1705        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'S(Q)'+powName[4:]),xydata['SofQ'])
1706        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'F(Q)'+powName[4:]),xydata['FofQ'])
1707        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'G(R)'+powName[4:]),xydata['GofR'])
1708        return auxPlot
1709       
1710    def OnComputePDF(event):
1711        print 'Calculating PDF:'
1712        auxPlot = ComputePDF(data)
1713        print 'Done calculating PDF:'
1714        Status.SetStatusText('PDF computed')
1715        for plot in auxPlot:
1716            G2plt.PlotXY(self,plot[:2],type=plot[2])
1717       
1718        G2plt.PlotISFG(self,newPlot=True,type='I(Q)')
1719        G2plt.PlotISFG(self,newPlot=True,type='S(Q)')
1720        G2plt.PlotISFG(self,newPlot=True,type='F(Q)')
1721        G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1722       
1723    def OnComputeAllPDF(event):
1724        print 'Calculating PDFs:'
1725        if self.PatternTree.GetCount():
1726            id, cookie = self.PatternTree.GetFirstChild(self.root)
1727            while id:
1728                Name = self.PatternTree.GetItemText(id)
1729                if 'PDF' in Name:
1730                    Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id,'PDF Controls'))
1731                    auxPlot = ComputePDF(Data)                   
1732                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1733            Status.SetStatusText('All PDFs computed')
1734            G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1735            print ' Done calculating PDFs:'
1736       
1737    def OnShowTip(self,tip):
1738        print tip   
1739               
1740    if self.dataDisplay:
1741        self.dataFrame.Clear()
1742    self.dataFrame.SetMenuBar(self.dataFrame.PDFMenu)
1743    if not self.dataFrame.GetStatusBar():
1744        Status = self.dataFrame.CreateStatusBar()   
1745    self.dataDisplay = wx.Panel(self.dataFrame)
1746    self.dataFrame.Bind(wx.EVT_MENU, OnCopyPDFControls, id=G2gd.wxID_PDFCOPYCONTROLS)
1747    self.dataFrame.Bind(wx.EVT_MENU, OnSavePDFControls, id=G2gd.wxID_PDFSAVECONTROLS)
1748    self.dataFrame.Bind(wx.EVT_MENU, OnLoadPDFControls, id=G2gd.wxID_PDFLOADCONTROLS)
1749    self.dataFrame.Bind(wx.EVT_MENU, OnAddElement, id=G2gd.wxID_PDFADDELEMENT)
1750    self.dataFrame.Bind(wx.EVT_MENU, OnDeleteElement, id=G2gd.wxID_PDFDELELEMENT)
1751    self.dataFrame.Bind(wx.EVT_MENU, OnComputePDF, id=G2gd.wxID_PDFCOMPUTE)
1752    self.dataFrame.Bind(wx.EVT_MENU, OnComputeAllPDF, id=G2gd.wxID_PDFCOMPUTEALL)
1753    mainSizer = wx.BoxSizer(wx.VERTICAL)
1754    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' PDF data files: '),0,wx.ALIGN_CENTER_VERTICAL)
1755    mainSizer.Add((5,5),0)
1756    str = ' Sample file: PWDR %s   Wavelength, A: %.5f  Energy, keV: %.3f  Polariz.: %.2f '%(dataFile[3:],wave,keV,polariz)
1757    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=str),0,wx.ALIGN_CENTER_VERTICAL)
1758#    dataSizer = wx.BoxSizer(wx.HORIZONTAL)
1759#    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Azimuth'),0,wx.ALIGN_CENTER_VERTICAL)
1760#    azimVal = wx.TextCtrl(self.dataDisplay,value='%.2f'%(inst['Azimuth']))
1761#    azimVal.Bind(wx.EVT_TEXT_ENTER,OnAzimVal)       
1762#    azimVal.Bind(wx.EVT_KILL_FOCUS,OnAzimVal)
1763#    dataSizer.Add(azimVal,0)   
1764#    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Polarization'),0,wx.ALIGN_CENTER_VERTICAL)
1765#    polaVal = wx.TextCtrl(self.dataDisplay,value='%.2f'%(inst['Polariz.']))
1766#    polaVal.Bind(wx.EVT_TEXT_ENTER,OnPolaVal)       
1767#    polaVal.Bind(wx.EVT_KILL_FOCUS,OnPolaVal)
1768#    dataSizer.Add(polaVal,0)   
1769#    mainSizer.Add(dataSizer,0)
1770    mainSizer.Add((5,5),0)
1771    fileSizer = wx.FlexGridSizer(3,6,5,1)
1772    select = ['Sample Bkg.','Container']
1773    if data['Container']['Name']:
1774        select.append('Container Bkg.')
1775    for key in select:
1776        FillFileSizer(fileSizer,key)
1777    mainSizer.Add(fileSizer,0)
1778    mainSizer.Add((5,5),0)
1779    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Sample information: '),0,wx.ALIGN_CENTER_VERTICAL)
1780    mainSizer.Add((5,5),0)   
1781
1782    ElList = data['ElList']
1783    Abs = G2lat.CellAbsorption(ElList,data['Form Vol'])
1784    Trans = G2pwd.Transmission(data['Geometry'],Abs*data['Pack'],data['Diam'])
1785    elemSizer = wx.FlexGridSizer(3,3,5,1)
1786    for El in ElList:
1787        FillElemSizer(elemSizer,ElList[El])
1788    mainSizer.Add(elemSizer,0)
1789    mainSizer.Add((5,5),0)   
1790    midSizer = wx.BoxSizer(wx.HORIZONTAL)
1791    midSizer.Add(wx.StaticText(self.dataDisplay,label=' Formula volume: '),0,wx.ALIGN_CENTER_VERTICAL)
1792    formVol = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Form Vol']))
1793    formVol.Bind(wx.EVT_TEXT_ENTER,OnFormVol)       
1794    formVol.Bind(wx.EVT_KILL_FOCUS,OnFormVol)
1795    midSizer.Add(formVol,0)
1796    midSizer.Add(wx.StaticText(self.dataDisplay,
1797        label=' Theoretical absorption: %.4f cm-1 Sample absorption: %.4f cm-1'%(Abs,Abs*data['Pack'])),
1798        0,wx.ALIGN_CENTER_VERTICAL)
1799    mainSizer.Add(midSizer,0)
1800    mainSizer.Add((5,5),0)   
1801
1802    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1803    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample geometry: '),0,wx.ALIGN_CENTER_VERTICAL)
1804    choice = ['Cylinder','Bragg-Brentano','Tilting flat plate in transmission','Fixed flat plate']
1805    geometry = wx.ComboBox(self.dataDisplay,value=data['Geometry'],choices=choice,
1806            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1807    geometry.Bind(wx.EVT_COMBOBOX, OnGeometry)
1808    geoBox.Add(geometry,0)
1809    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample diameter/thickness, mm: '),0,wx.ALIGN_CENTER_VERTICAL)
1810    diam = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Diam']))
1811    diam.Bind(wx.EVT_TEXT_ENTER,OnDiameter)       
1812    diam.Bind(wx.EVT_KILL_FOCUS,OnDiameter)
1813#    diam.Bind(wx.EVT_SET_FOCUS,OnShowTip(self,'tip')) #this doesn't work - what would????
1814    geoBox.Add(diam,0)
1815    mainSizer.Add(geoBox,0)
1816    mainSizer.Add((5,5),0)   
1817    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1818    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Packing: '),0,wx.ALIGN_CENTER_VERTICAL)
1819    pack = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Pack']))
1820    pack.Bind(wx.EVT_TEXT_ENTER,OnPacking)       
1821    pack.Bind(wx.EVT_KILL_FOCUS,OnPacking)
1822    geoBox.Add(pack,0)
1823    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample transmission: %.3f %%'%(Trans)),0,wx.ALIGN_CENTER_VERTICAL)   
1824    mainSizer.Add(geoBox,0)
1825    mainSizer.Add((5,5),0)   
1826       
1827    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' S(Q)->F(Q)->G(R) controls: '),0,wx.ALIGN_CENTER_VERTICAL)
1828    mainSizer.Add((5,5),0)
1829    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1830    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Detector type: '),0,wx.ALIGN_CENTER_VERTICAL)
1831    choice = ['Image plate','Point detector']
1832    detType = wx.ComboBox(self.dataDisplay,value=data['DetType'],choices=choice,
1833            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1834    detType.Bind(wx.EVT_COMBOBOX, OnDetType)
1835    sqBox.Add(detType,0)
1836    if data['DetType'] == 'Image plate':
1837        sqBox.Add(wx.StaticText(self.dataDisplay,label=' IP transmission coeff.: '),0,wx.ALIGN_CENTER_VERTICAL)
1838        obliqCoeff = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['ObliqCoeff']))
1839        obliqCoeff.Bind(wx.EVT_TEXT_ENTER,OnObliqCoeff)       
1840        obliqCoeff.Bind(wx.EVT_KILL_FOCUS,OnObliqCoeff)
1841        sqBox.Add(obliqCoeff,0)
1842    mainSizer.Add(sqBox,0)
1843       
1844    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1845    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Ruland width: '),0,wx.ALIGN_CENTER_VERTICAL)   
1846    rulandSldr = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
1847        value=int(1000*data['Ruland']))
1848    sqBox.Add(rulandSldr,1,wx.EXPAND)
1849    rulandSldr.Bind(wx.EVT_SLIDER, OnRulSlider)
1850    rulandWdt = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Ruland']))
1851    rulandWdt.Bind(wx.EVT_TEXT_ENTER,OnRulandWdt)       
1852    rulandWdt.Bind(wx.EVT_KILL_FOCUS,OnRulandWdt)
1853    sqBox.Add(rulandWdt,0,wx.ALIGN_CENTER_VERTICAL)   
1854    mainSizer.Add(sqBox,0,wx.ALIGN_LEFT|wx.EXPAND)
1855   
1856    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1857    lorch = wx.CheckBox(parent=self.dataDisplay,label='Lorch damping?')
1858    lorch.SetValue(data['Lorch'])
1859    lorch.Bind(wx.EVT_CHECKBOX, OnLorch)
1860    sqBox.Add(lorch,0,wx.ALIGN_CENTER_VERTICAL)
1861    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Scaling q-range: '),0,wx.ALIGN_CENTER_VERTICAL)
1862    SQmin = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][0]))
1863    SQmin.Bind(wx.EVT_TEXT_ENTER,OnSQmin)       
1864    SQmin.Bind(wx.EVT_KILL_FOCUS,OnSQmin)   
1865    sqBox.Add(SQmin,0)
1866    sqBox.Add(wx.StaticText(self.dataDisplay,label=' to '),0,wx.ALIGN_CENTER_VERTICAL)
1867    SQmax = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][1]))
1868    SQmax.Bind(wx.EVT_TEXT_ENTER,OnSQmax)       
1869    SQmax.Bind(wx.EVT_KILL_FOCUS,OnSQmax)
1870    sqBox.Add(SQmax,0)
1871    resetQ = wx.CheckBox(parent=self.dataDisplay,label='Reset?')
1872    sqBox.Add(resetQ,0)
1873    resetQ.Bind(wx.EVT_CHECKBOX, OnResetQ)
1874   
1875    mainSizer.Add(sqBox,0)
1876
1877    mainSizer.Layout()   
1878    self.dataDisplay.SetSizer(mainSizer)
1879    Size = mainSizer.Fit(self.dataFrame)
1880    self.dataDisplay.SetSize(Size)
1881    self.dataFrame.setSizePosLeft(Size)
1882   
Note: See TracBrowser for help on using the repository browser.