source: trunk/GSASIIpwdGUI.py @ 390

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

Add tooltip to covariance plot
clean up LS output formats
Add Fobs extraction & R-value calculations

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