source: trunk/GSASIIpwdGUI.py @ 395

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

Add goniometer omega, chi & phi to sample data
put SH texture in General
fix phase delete to remove it from reflection lists as well
continue development of constraints/restraints GUI
fixes to texture computations, GUI & least squares refinement

  • Property svn:keywords set to Date Author Revision URL Id
File size: 81.6 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-10-20 14:25:32 +0000 (Thu, 20 Oct 2011) $
4# $Author: vondreele $
5# $Revision: 395 $
6# $URL: trunk/GSASIIpwdGUI.py $
7# $Id: GSASIIpwdGUI.py 395 2011-10-20 14:25:32Z 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    if not 'Omega' in data:
612        data.update({'Omega':0.0,'Chi':0.0,'Phi':0.0})
613#patch end
614   
615    parms = [['Gonio. radius',' Goniometer radius(mm): ','%.2f',]]
616    if data['Type'] == 'Debye-Scherrer':
617        parms += [['DisplaceX',' Sample X displacement(\xb5m): ','%.2f',],
618            ['DisplaceY',' Sample Y displacement(\xb5m): ','%.2f',],
619            ['Absorption',' Sample absorption(\xb5r): ','%.4f',],]
620    elif data['Type'] == 'Bragg-Brentano':
621        parms += [['Shift',' Sample displacement(\xb5m): ','%.2f',],
622            ['Transparency',' Sample transparency(1/\xb5eff,cm): ','%.4f'],]
623    parms.append(['Omega','Goniometer omega:','%.2f'])
624    parms.append(['Chi','Goniometer chi:','%.2f'])
625    parms.append(['Phi','Goniometer phi:','%.2f'])
626    parms.append(['Temperature',' Sample temperature(K): ','%.2f'])
627    parms.append(['Pressure',' Sample pressure(MPa): ','%.3f'])
628    parms.append(['Humidity',' Sample humidity(%): ','%.1f'])
629    parms.append(['Voltage',' Sample voltage(V): ','%.3f'])
630    parms.append(['Force',' Applied load(MN): ','%.3f'])
631    objList = {}
632
633    def OnScaleRef(event):
634        Obj = event.GetEventObject()
635        data['Scale'][1] = Obj.GetValue()
636       
637    def OnScaleVal(event):
638        Obj = event.GetEventObject()
639        try:
640            scale = float(Obj.GetValue())
641            if scale > 0:
642                data['Scale'][0] = scale
643        except ValueError:
644            pass
645        Obj.SetValue("%.4f"%(data['Scale'][0]))          #reset in case of error
646       
647    def OnHistoType(event):
648        Obj = event.GetEventObject()
649        data['Type'] = Obj.GetValue()
650        if data['Type'] == 'Bragg-Brentano' and 'Shift' not in data:    #set up defaults for new type(s)
651            data['Shift'] = [0.0,False]
652            data['Transparency'] = [0.0,False]
653        self.dataDisplay.Destroy()
654        UpdateSampleGrid(self,data)
655       
656    def OnParmRef(event):
657        Obj = event.GetEventObject()
658        parm = objList[Obj.GetId()]
659        data[parm][1] = Obj.GetValue()
660       
661    def OnParmVal(event):
662        Obj = event.GetEventObject()
663        parm = objList[Obj.GetId()]
664        try:
665            if 'list' in str(type(data[parm[0]])): 
666                data[parm[0]][0] = float(Obj.GetValue())
667            else:
668                data[parm[0]] = float(Obj.GetValue())
669        except ValueError:
670            pass
671        if 'list' in str(type(data[parm[0]])): 
672            Obj.SetValue(parm[2]%(data[parm[0]][0]))          #reset in case of error
673        else:
674            Obj.SetValue(parm[2]%(data[parm[0]]))          #reset in case of error
675               
676    mainSizer = wx.BoxSizer(wx.VERTICAL)
677    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Sample parameters: '),0,wx.ALIGN_CENTER_VERTICAL)
678    mainSizer.Add((5,5),0)
679    parmSizer = wx.FlexGridSizer(9,2,5,0)
680    scaleRef = wx.CheckBox(self.dataDisplay,label=' Histogram scale factor: ')
681    scaleRef.SetValue(data['Scale'][1])
682    scaleRef.Bind(wx.EVT_CHECKBOX, OnScaleRef)
683    parmSizer.Add(scaleRef,0,wx.ALIGN_CENTER_VERTICAL)
684    scaleVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,
685        '%.4f'%(data['Scale'][0]),style=wx.TE_PROCESS_ENTER)
686    scaleVal.Bind(wx.EVT_TEXT_ENTER,OnScaleVal)
687    scaleVal.Bind(wx.EVT_KILL_FOCUS,OnScaleVal)
688    parmSizer.Add(scaleVal,0,wx.ALIGN_CENTER_VERTICAL)
689    typeSizer = wx.BoxSizer(wx.HORIZONTAL)
690    choices = ['Debye-Scherrer','Bragg-Brentano',]
691    histoType = wx.ComboBox(self.dataDisplay,wx.ID_ANY,value=data['Type'],choices=choices,
692        style=wx.CB_READONLY|wx.CB_DROPDOWN)
693    histoType.Bind(wx.EVT_COMBOBOX, OnHistoType)
694    parmSizer.Add(histoType)
695    parmSizer.Add((5,5),0)
696   
697    for parm in parms:
698        if 'list' in str(type(data[parm[0]])):
699            parmRef = wx.CheckBox(self.dataDisplay,label=parm[1])
700            objList[parmRef.GetId()] = parm[0]
701            parmRef.SetValue(data[parm[0]][1])
702            parmRef.Bind(wx.EVT_CHECKBOX, OnParmRef)
703            parmSizer.Add(parmRef,0,wx.ALIGN_CENTER_VERTICAL)
704            parmVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,
705                parm[2]%(data[parm[0]][0]),style=wx.TE_PROCESS_ENTER)
706        else:
707            parmSizer.Add(wx.StaticText(self.dataDisplay,label=parm[1]),
708                0,wx.ALIGN_CENTER_VERTICAL)
709            parmVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,
710                parm[2]%(data[parm[0]]),style=wx.TE_PROCESS_ENTER)       
711        objList[parmVal.GetId()] = parm
712        parmVal.Bind(wx.EVT_TEXT_ENTER,OnParmVal)
713        parmVal.Bind(wx.EVT_KILL_FOCUS,OnParmVal)
714        parmSizer.Add(parmVal,1,wx.EXPAND)
715    mainSizer.Add(parmSizer)
716    mainSizer.Add((0,5),0)   
717   
718    mainSizer.Layout()   
719    self.dataDisplay.SetSizer(mainSizer)
720    Size = mainSizer.Fit(self.dataFrame)
721    self.dataDisplay.SetSize(Size)
722    self.dataFrame.setSizePosLeft(Size)
723               
724def UpdateIndexPeaksGrid(self, data):
725    IndexId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Index Peak List')
726   
727    def RefreshIndexPeaksGrid(event):
728        r,c =  event.GetRow(),event.GetCol()
729        data = self.IndexPeaksTable.GetData()
730        if c == 2:
731            if data[r][c]:
732                data[r][c] = False
733            else:
734                data[r][c] = True
735            self.IndexPeaksTable.SetData(data)
736            self.PatternTree.SetItemPyData(IndexId,data)
737            self.dataDisplay.ForceRefresh()
738           
739    def OnReload(event):
740        data = []
741        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List'))
742        for peak in peaks:
743            dsp = inst[1]/(2.0*sind(peak[0]/2.0))
744            data.append([peak[0],peak[2],True,False,0,0,0,dsp,0.0])
745        self.PatternTree.SetItemPyData(IndexId,data)
746        UpdateIndexPeaksGrid(self,data)
747       
748    def KeyEditPickGrid(event):
749        colList = self.dataDisplay.GetSelectedCols()
750        rowList = self.dataDisplay.GetSelectedRows()
751        data = self.PatternTree.GetItemPyData(IndexId)
752        if event.GetKeyCode() == wx.WXK_RETURN:
753            event.Skip(True)
754        elif event.GetKeyCode() == wx.WXK_CONTROL:
755            event.Skip(True)
756        elif event.GetKeyCode() == wx.WXK_SHIFT:
757            event.Skip(True)
758        elif colList:
759            self.dataDisplay.ClearSelection()
760            key = event.GetKeyCode()
761            for col in colList:
762                if self.IndexPeaksTable.GetColLabelValue(col) in ['use','refine']:
763                    if key == 89: #'Y'
764                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=True
765                    elif key == 78:  #'N'
766                        for row in range(self.IndexPeaksTable.GetNumberRows()): data[row][col]=False
767           
768    if self.dataDisplay:
769        self.dataFrame.Clear()
770    if not self.dataFrame.GetStatusBar():
771        Status = self.dataFrame.CreateStatusBar()
772    if 'PWD' in self.PatternTree.GetItemText(self.PatternId):
773        self.dataFrame.SetMenuBar(self.dataFrame.IndPeaksMenu)
774        self.Bind(wx.EVT_MENU, OnReload, id=G2gd.wxID_INDXRELOAD)
775    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
776    self.dataFrame.IndexPeaks.Enable(False)
777    self.IndexPeaksTable = []
778    if data:
779        self.dataFrame.IndexPeaks.Enable(True)
780        cells = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List'))
781        if cells:
782            cellist = cells[2]
783            dmin = cells[3]
784            self.HKL = []
785            for i,cell in enumerate(cellist):
786                if cell[-1]:
787                    ibrav = cell[2]
788                    A = G2lat.cell2A(cell[3:9])
789                    self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
790                    G2indx.IndexPeaks(data,self.HKL)
791                    for hkl in self.HKL:
792                        hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
793    rowLabels = []
794    for i in range(len(data)): rowLabels.append(str(i+1))
795    colLabels = ['position','intensity','use','indexed','h','k','l','d-obs','d-calc']
796    Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_FLOAT+':10,1',wg.GRID_VALUE_BOOL,
797        wg.GRID_VALUE_BOOL,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,wg.GRID_VALUE_LONG,
798        wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5']
799    self.PatternTree.SetItemPyData(IndexId,data)
800    self.IndexPeaksTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
801    self.dataFrame.SetLabel('Index Peak List')
802    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)               
803    self.dataDisplay.SetTable(self.IndexPeaksTable, True)
804    for r in range(self.dataDisplay.GetNumberRows()):
805        for c in range(self.dataDisplay.GetNumberCols()):
806            if c == 2:
807                self.dataDisplay.SetReadOnly(r,c,isReadOnly=False)
808            else:
809                self.dataDisplay.SetReadOnly(r,c,isReadOnly=True)
810    self.dataDisplay.Bind(wg.EVT_GRID_CELL_LEFT_CLICK, RefreshIndexPeaksGrid)
811    self.dataDisplay.Bind(wx.EVT_KEY_DOWN, KeyEditPickGrid)                 
812    self.dataDisplay.SetMargins(0,0)
813    self.dataDisplay.AutoSizeColumns(False)
814    self.dataFrame.setSizePosLeft([490,300])
815 
816def UpdateUnitCellsGrid(self, data):
817    UnitCellsId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Unit Cells List')
818    bravaisSymb = ['Fm3m','Im3m','Pm3m','R3-H','P6/mmm','I4/mmm',
819        'P4/mmm','Fmmm','Immm','Cmmm','Pmmm','C2/m','P2/m','P1']
820    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',
821        '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']
822       
823    def SetLattice(controls):
824        ibrav = bravaisSymb.index(controls[5])
825        if ibrav in [0,1,2]:
826            controls[7] = controls[8] = controls[6]
827            controls[9] = controls[10] = controls[11] = 90.
828        elif ibrav in [3,4,5,6]:
829            controls[7] = controls[6]
830            controls[9] = controls[10] = controls[11] = 90.
831            if ibrav in [3,4]:
832                controls[11] = 120.
833        elif ibrav in [7,8,9,10]:
834            controls[9] = controls[10] = controls[11] = 90.
835        elif ibrav in [11,12]:
836            controls[9] = controls[11] = 90.  # b unique
837        if len(controls) < 13: controls.append(0)
838        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
839        return ibrav
840       
841    def OnNcNo(event):
842        controls[2] = NcNo.GetValue()
843       
844    def OnStartVol(event):
845        try:
846            stVol = int(float(startVol.GetValue()))
847            if stVol < 25:
848                raise ValueError
849        except ValueError:
850            stVol = 25
851        controls[3] = stVol
852        startVol.SetValue("%d"%(stVol))
853       
854    def OnBravais(event):
855        Obj = event.GetEventObject()
856        bravais[bravList.index(Obj.GetId())] = Obj.GetValue()
857       
858    def OnZero(event):
859        try:
860            Zero = min(0.1,max(-0.1,float(zero.GetValue())))
861        except ValueError:
862            Zero = 0.0
863        controls[1] = Zero
864        zero.SetValue("%.4f"%(Zero))
865       
866    def OnZeroVar(event):
867        controls[0] = zeroVar.GetValue()
868       
869    def OnBravSel(event):
870        controls[5] = bravSel.GetString(bravSel.GetSelection())       
871        UpdateUnitCellsGrid(self,data)
872       
873    def OnCellChange(event):
874        ibrav = bravaisSymb.index(controls[5])
875        Obj = event.GetEventObject()
876        ObjId = cellList.index(Obj.GetId())
877        try:
878            value = max(1.0,float(Obj.GetValue()))
879        except ValueError:
880            if ObjId < 3:               #bad cell edge - reset
881                value = controls[6+ObjId]
882            else:                       #bad angle
883                value = 90.
884        if ibrav in [0,1,2]:
885            controls[6] = controls[7] = controls[8] = value
886            controls[9] = controls[10] = controls[11] = 90.0
887            Obj.SetValue("%.5f"%(controls[6]))
888        elif ibrav in [3,4,5,6]:
889            if ObjId == 0:
890                controls[6] = controls[7] = value
891                Obj.SetValue("%.5f"%(controls[6]))
892            else:
893                controls[8] = value
894                Obj.SetValue("%.5f"%(controls[8]))
895            controls[9] = controls[10] = controls[11] = 90.0
896            if ibrav in [3,4]:
897                controls[11] = 120.
898        elif ibrav in [7,8,9,10]:
899            controls[6+ObjId] = value
900            Obj.SetValue("%.5f"%(controls[6+ObjId]))
901            controls[9] = controls[10] = controls[11] = 90.0
902        elif ibrav in [11,12]:
903            controls[9] = controls[11] = 90.0
904            if ObjId != 3:
905                controls[6+ObjId] = value
906                Obj.SetValue("%.5f"%(controls[6+ObjId]))
907            else:
908                controls[10] = value
909                Obj.SetValue("%.3f"%(controls[10]))
910        else:
911            controls[6+ObjId] = value
912            if ObjId < 3:
913                Obj.SetValue("%.5f"%(controls[6+ObjId]))
914            else:
915                Obj.SetValue("%.3f"%(controls[6+ObjId]))
916        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
917        volVal.SetValue("%.3f"%(controls[12]))
918       
919    def OnHklShow(event):
920        hklShow.SetValue(False)
921        PatternId = self.PatternId
922        PickId = self.PickId   
923        limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Limits'))[1]
924        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
925        cell = controls[6:12]
926        A = G2lat.cell2A(cell)
927        ibrav = bravaisSymb.index(controls[5])
928        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
929        inst = dict(zip(inst[3],inst[1]))
930        if 'Lam' in inst:
931            wave = inst['Lam']
932        else:
933            wave = inst['Lam1']
934        dmin = wave/(2.0*sind(limits[1]/2.0))
935        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
936        for hkl in self.HKL:
937            hkl.append(2.0*asind(wave/(2.*hkl[3]))+controls[1])             
938        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
939            G2plt.PlotPowderLines(self)
940        else:
941            G2plt.PlotPatterns(self)
942       
943    def CopyUnitCell(event):
944        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)
945        for Cell in cells:
946            if Cell[-1]:
947                break
948        cell = Cell[2:9]
949        controls[4] = 1
950        controls[5] = bravaisSymb[cell[0]]
951        controls[6:12] = cell[1:8]
952        controls[12] = G2lat.calc_V(G2lat.cell2A(controls[6:12]))
953        self.PatternTree.SetItemPyData(UnitCellsId,[controls,bravais,cells,dmin])
954        UpdateUnitCellsGrid(self,data)
955       
956        self.dataFrame.RefineCell.Enable(True)
957               
958    def RefineCell(event):
959        def cellPrint(ibrav,A):
960            cell = G2lat.A2cell(A)
961            Vol = G2lat.calc_V(A)
962            if ibrav in [0,1,2]:
963                print "%s%10.6f" % ('a =',cell[0])
964            elif ibrav in [3,4,5,6]:
965                print "%s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],' c =',cell[2],' volume =',Vol)
966            elif ibrav in [7,8,9,10]:
967                print "%s%10.6f %s%10.6f %s%10.6f %s%12.3f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2],' volume =',Vol)
968            elif ibrav in [11,12]:
969                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)
970            else:
971                print "%s%10.6f %s%10.6f %s%10.6f" % ('a =',cell[0],'b =',cell[1],'c =',cell[2])
972                print "%s%8.3f %s%8.3f %s%8.3f %s%12.3f" % ('alpha =',cell[3],'beta =',cell[4],'gamma =',cell[5],' volume =',Vol)
973             
974        PatternId = self.PatternId
975        PickId = self.PickId   
976        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
977        if not peaks:
978            self.ErrorDialog('No peaks!', 'Nothing to refine!')
979            return       
980        print 'Refine cell'
981        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
982        controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
983        cell = controls[6:12]
984        A = G2lat.cell2A(cell)
985        ibrav = bravaisSymb.index(controls[5])
986        dmin = G2indx.getDmin(peaks)-0.005
987        self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
988        G2indx.IndexPeaks(peaks,self.HKL)
989        if controls[0]:
990            Lhkl,M20,X20,Aref,Zero = G2indx.refinePeaksZ(peaks,inst[1],ibrav,A,controls[1])           
991            controls[1] = Zero
992        else:
993            Lhkl,M20,X20,Aref = G2indx.refinePeaks(peaks,ibrav,A)
994        controls[6:12] = G2lat.A2cell(Aref)
995        controls[12] = G2lat.calc_V(Aref)
996        data = [controls,bravais,cells,dmin]
997        cells = self.PatternTree.GetItemPyData(UnitCellsId)[2]
998        for cell in cells:
999            cell[-1] = False
1000        cells.insert(0,[M20,X20,ibrav]+controls[6:13]+[True,])
1001        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
1002        self.HKL = G2lat.GenHBravais(dmin,ibrav,Aref)
1003        UpdateUnitCellsGrid(self,data)
1004        print "%s%10.3f" % ('refinement M20 = ',M20)
1005        print 'unindexed lines = ',X20
1006        cellPrint(ibrav,Aref)
1007        for hkl in self.HKL:
1008            hkl.append(2.0*asind(inst[1]/(2.*hkl[3]))+controls[1])             
1009        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1010            G2plt.PlotPowderLines(self)
1011        else:
1012            G2plt.PlotPatterns(self)
1013       
1014    def IndexPeaks(event):
1015        PatternId = self.PatternId   
1016#        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
1017#        if not peaks:
1018#            self.ErrorDialog('No peaks!', 'Nothing to index!')
1019#            return
1020        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[1]
1021        print 'Peak Indexing'
1022        try:
1023            controls,bravais,cells,dmin = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'))
1024            cells = []
1025        except ValueError:
1026            self.ErrorDialog('Error','Need to set controls in Unit Cell List first')
1027            return
1028        if True not in bravais:
1029            self.ErrorDialog('Error','No Bravais lattices selected')
1030            return
1031        self.dataFrame.CopyCell.Enable(False)
1032        self.dataFrame.RefineCell.Enable(False)
1033        OK,dmin,cells = G2indx.DoIndexPeaks(peaks,inst,controls,bravais)
1034        if OK:
1035            data = [controls,bravais,cells,dmin]
1036            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
1037            UpdateUnitCellsGrid(self,data)
1038            bestCell = cells[0]
1039            if bestCell[0] > 10.:
1040                self.HKL = G2lat.GenHBravais(dmin,bestCell[2],G2lat.cell2A(bestCell[3:9]))
1041                for hkl in self.HKL:
1042                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))             
1043                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1044                    G2plt.PlotPowderLines(self)
1045                else:
1046                    G2plt.PlotPatterns(self)
1047            self.dataFrame.CopyCell.Enable(True)
1048            self.dataFrame.IndexPeaks.Enable(True)
1049            self.dataFrame.MakeNewPhase.Enable(True)
1050            UpdateUnitCellsGrid(self,data)
1051               
1052    def RefreshUnitCellsGrid(event):
1053        cells,dmin = self.PatternTree.GetItemPyData(UnitCellsId)[2:]
1054        r,c =  event.GetRow(),event.GetCol()
1055        if cells:
1056            if c == 2:
1057                for i in range(len(cells)):
1058                    cells[i][-1] = False
1059                    UnitCellsTable.SetValue(i,c,False)
1060                UnitCellsTable.SetValue(r,c,True)
1061                gridDisplay.ForceRefresh()
1062                cells[r][-1] = True
1063                ibrav = cells[r][2]
1064                A = G2lat.cell2A(cells[r][3:9])
1065                self.HKL = G2lat.GenHBravais(dmin,ibrav,A)
1066                for hkl in self.HKL:
1067                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
1068                if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1069                    G2plt.PlotPowderLines(self)
1070                else:
1071                    G2plt.PlotPatterns(self)
1072       
1073    def MakeNewPhase(event):
1074        if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
1075            sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
1076        else:
1077            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
1078        PhaseName = ''
1079        dlg = wx.TextEntryDialog(None,'Enter a name for this phase','Phase Name Entry','New phase',
1080            style=wx.OK)
1081        try:
1082            if dlg.ShowModal() == wx.ID_OK:
1083                PhaseName = dlg.GetValue()
1084                cells = self.PatternTree.GetItemPyData(UnitCellsId)[2]
1085                for Cell in cells:
1086                    if Cell[-1]:
1087                        break
1088                cell = Cell[2:10]       
1089                sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
1090                E,SGData = G2spc.SpcGroup(spaceGroups[cell[0]])
1091                self.PatternTree.SetItemPyData(sub, \
1092                    {'General':{'Name':PhaseName,'Type':'nuclear','SGData':SGData,
1093                    'Cell':[False,]+cell[1:],
1094                    'Pawley dmin':1.00},'Atoms':[],'Drawing':{},'Histograms':{}})
1095                Status.SetStatusText('Change space group if needed')
1096        finally:
1097            dlg.Destroy()
1098           
1099    if self.dataDisplay:
1100        self.dataFrame.Clear()
1101    self.dataFrame.SetMenuBar(self.dataFrame.IndexMenu)
1102    if not self.dataFrame.GetStatusBar():
1103        Status = self.dataFrame.CreateStatusBar()
1104    self.Bind(wx.EVT_MENU, IndexPeaks, id=G2gd.wxID_INDEXPEAKS)
1105    self.Bind(wx.EVT_MENU, CopyUnitCell, id=G2gd.wxID_COPYCELL)
1106    self.Bind(wx.EVT_MENU, RefineCell, id=G2gd.wxID_REFINECELL)
1107    self.Bind(wx.EVT_MENU, MakeNewPhase, id=G2gd.wxID_MAKENEWPHASE)
1108   
1109    controls,bravais,cells,dmin = data
1110    if len(controls) < 13:              #add cell volume if missing
1111        controls.append(G2lat.calc_V(G2lat.cell2A(controls[6:12])))
1112    self.PatternTree.SetItemPyData(UnitCellsId,data)            #update with volume
1113    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Instrument Parameters'))[1]
1114    bravaisNames = ['Cubic-F','Cubic-I','Cubic-P','Trigonal-R','Trigonal/Hexagonal-P',
1115        'Tetragonal-I','Tetragonal-P','Orthorhombic-F','Orthorhombic-I','Orthorhombic-C',
1116        'Orthorhombic-P','Monoclinic-C','Monoclinic-P','Triclinic']
1117    cellGUIlist = [[[0,1,2],4,zip([" Unit cell: a = "," Vol = "],["%.5f","%.3f"],[True,False],[0,0])],
1118    [[3,4,5,6],6,zip([" Unit cell: a = "," c = "," Vol = "],["%.5f","%.5f","%.3f"],[True,True,False],[0,2,0])],
1119    [[7,8,9,10],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "],["%.5f","%.5f","%.5f","%.3f"],
1120        [True,True,True,False],[0,1,2,0])],
1121    [[11,12],10,zip([" Unit cell: a = "," b = "," c = "," beta = "," Vol = "],
1122        ["%.5f","%.5f","%.5f","%.3f","%.3f"],[True,True,True,True,False],[0,1,2,4,0])],
1123    [[13,],8,zip([" Unit cell: a = "," b = "," c = "," Vol = "," alpha = "," beta = "," gamma = "],
1124        ["%.5f","%.5f","%.5f","%.3f","%.3f","%.3f","%.3f"],
1125        [True,True,True,False,True,True,True],[0,1,2,0,3,4,5])]]
1126   
1127    self.dataFrame.SetLabel('Unit Cells List')
1128    self.sp = wx.SplitterWindow(self.dataFrame)
1129    self.dataDisplay = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
1130    self.dataFrame.IndexPeaks.Enable(False)
1131    peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.PatternId, 'Index Peak List'))
1132    if peaks:
1133        self.dataFrame.IndexPeaks.Enable(True)
1134    self.dataFrame.RefineCell.Enable(False)
1135    if controls[12] > 1.0:                               #if a "real" volume (i.e. not default)
1136        self.dataFrame.RefineCell.Enable(True)   
1137    self.dataFrame.CopyCell.Enable(False)
1138    self.dataFrame.MakeNewPhase.Enable(False)       
1139    if cells:
1140        self.bottom = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
1141        self.sp.SplitHorizontally(self.dataDisplay,self.bottom,0)
1142        self.dataFrame.CopyCell.Enable(True)
1143        self.dataFrame.MakeNewPhase.Enable(True)       
1144    mainSizer = wx.BoxSizer(wx.VERTICAL)
1145    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Indexing controls: '),0,wx.ALIGN_CENTER_VERTICAL)
1146    mainSizer.Add((5,5),0)
1147    littleSizer = wx.FlexGridSizer(2,5,5,5)
1148    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max Nc/Nobs '),0,wx.ALIGN_CENTER_VERTICAL)
1149    NcNo = wx.SpinCtrl(self.dataDisplay)
1150    NcNo.SetRange(1,6)
1151    NcNo.SetValue(controls[2])
1152    NcNo.Bind(wx.EVT_SPINCTRL,OnNcNo)
1153    littleSizer.Add(NcNo,0,wx.ALIGN_CENTER_VERTICAL)
1154    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start Volume '),0,wx.ALIGN_CENTER_VERTICAL)
1155    startVol = wx.TextCtrl(self.dataDisplay,value=str('%d'%(controls[3])),style=wx.TE_PROCESS_ENTER)
1156    startVol.Bind(wx.EVT_TEXT_ENTER,OnStartVol)
1157    startVol.Bind(wx.EVT_KILL_FOCUS,OnStartVol)
1158    littleSizer.Add(startVol,0,wx.ALIGN_CENTER_VERTICAL)
1159    mainSizer.Add(littleSizer,0)
1160    mainSizer.Add((5,5),0)
1161    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Select Bravais Lattices for indexing: '),
1162        0,wx.ALIGN_CENTER_VERTICAL)
1163    mainSizer.Add((5,5),0)
1164    littleSizer = wx.FlexGridSizer(2,7,5,5)
1165    bravList = []
1166    bravs = zip(bravais,bravaisNames)
1167    for brav,bravName in bravs:
1168        bravCk = wx.CheckBox(self.dataDisplay,label=bravName)
1169        bravList.append(bravCk.GetId())
1170        bravCk.SetValue(brav)
1171        bravCk.Bind(wx.EVT_CHECKBOX,OnBravais)
1172        littleSizer.Add(bravCk,0,wx.ALIGN_CENTER_VERTICAL)
1173    mainSizer.Add(littleSizer,0)
1174    mainSizer.Add((5,5),0)
1175   
1176    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Cell Refinement: '),0,wx.ALIGN_CENTER_VERTICAL)
1177    mainSizer.Add((5,5),0)
1178    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
1179    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Bravais lattice "),0,wx.ALIGN_CENTER_VERTICAL)
1180    bravSel = wx.Choice(self.dataDisplay,choices=bravaisSymb)
1181    bravSel.SetSelection(bravaisSymb.index(controls[5]))
1182    bravSel.Bind(wx.EVT_CHOICE,OnBravSel)
1183    littleSizer.Add(bravSel,0,wx.ALIGN_CENTER_VERTICAL)
1184    littleSizer.Add(wx.StaticText(self.dataDisplay,label=" Zero offset"),0,wx.ALIGN_CENTER_VERTICAL)
1185    zero = wx.TextCtrl(self.dataDisplay,value="%.4f"%(controls[1]),style=wx.TE_PROCESS_ENTER)
1186    zero.Bind(wx.EVT_TEXT_ENTER,OnZero)
1187    zero.Bind(wx.EVT_KILL_FOCUS,OnZero)
1188    littleSizer.Add(zero,0,wx.ALIGN_CENTER_VERTICAL)
1189    zeroVar = wx.CheckBox(self.dataDisplay,label="Refine?")
1190    zeroVar.SetValue(controls[0])
1191    zeroVar.Bind(wx.EVT_CHECKBOX,OnZeroVar)
1192    littleSizer.Add(zeroVar,0,wx.ALIGN_CENTER_VERTICAL)
1193    hklShow = wx.CheckBox(self.dataDisplay,label="  Show hkl positions")
1194    hklShow.Bind(wx.EVT_CHECKBOX,OnHklShow)
1195    littleSizer.Add(hklShow,0,wx.ALIGN_CENTER_VERTICAL)
1196    mainSizer.Add(littleSizer,0)
1197   
1198    mainSizer.Add((5,5),0)
1199    ibrav = SetLattice(controls)
1200    for cellGUI in cellGUIlist:
1201        if ibrav in cellGUI[0]:
1202            useGUI = cellGUI
1203    cellList = []
1204    littleSizer = wx.FlexGridSizer(2,useGUI[1],5,5)
1205    for txt,fmt,ifEdit,Id in useGUI[2]:
1206        littleSizer.Add(wx.StaticText(self.dataDisplay,label=txt),0,wx.ALIGN_CENTER_VERTICAL)
1207        if ifEdit:          #a,b,c,etc.
1208            cellVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[6+Id])),style=wx.TE_PROCESS_ENTER)
1209            cellVal.Bind(wx.EVT_TEXT_ENTER,OnCellChange)       
1210            cellVal.Bind(wx.EVT_KILL_FOCUS,OnCellChange)
1211            littleSizer.Add(cellVal,0,wx.ALIGN_CENTER_VERTICAL)
1212            cellList.append(cellVal.GetId())
1213        else:               #volume
1214            volVal = wx.TextCtrl(self.dataDisplay,value=(fmt%(controls[12])),style=wx.TE_READONLY)
1215            volVal.SetBackgroundColour(VERY_LIGHT_GREY)
1216            littleSizer.Add(volVal,0,wx.ALIGN_CENTER_VERTICAL)
1217    mainSizer.Add(littleSizer,0)
1218       
1219    mainSizer.Layout()   
1220    self.dataDisplay.SetSizer(mainSizer)
1221    topSize = mainSizer.Fit(self.dataFrame)
1222    self.dataDisplay.SetSize(topSize)
1223    if cells:
1224        if ibrav == 13:
1225            topSize[1] += 230
1226        else:
1227            topSize[1] += 200
1228    self.dataFrame.setSizePosLeft(topSize)
1229   
1230   
1231    if cells:
1232        bottomSize = self.bottom.GetSize()
1233        if ibrav == 13:
1234            bottomSize[1] -= 240
1235        else:
1236            bottomSize[1] -= 210
1237        wx.StaticText(parent=self.bottom,label=' Indexing Result ')
1238        rowLabels = []
1239        colLabels = ['M20','X20','use','Bravais','a','b','c','alpha','beta','gamma','Volume']
1240        Types = [wg.GRID_VALUE_FLOAT+':10,2',wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_BOOL,wg.GRID_VALUE_STRING,]+ \
1241            3*[wg.GRID_VALUE_FLOAT+':10,5',]+3*[wg.GRID_VALUE_FLOAT+':10,3',]+ \
1242            [wg.GRID_VALUE_FLOAT+':10,2']
1243        numRows = len(cells)
1244        table = []
1245        for cell in cells:
1246            rowLabels.append('')
1247            row = cell[0:2]+[cell[-1]]+[bravaisSymb[cell[2]]]+cell[3:10]
1248            if cell[-1]:
1249                A = G2lat.cell2A(cell[3:9])
1250                self.HKL = G2lat.GenHBravais(dmin,cell[2],A)
1251                for hkl in self.HKL:
1252                    hkl.append(2.0*asind(inst[1]/(2.*hkl[3])))
1253            table.append(row)
1254        UnitCellsTable = G2gd.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1255        gridDisplay = G2gd.GSGrid(self.bottom)
1256        gridDisplay.SetPosition(wx.Point(0,20))               
1257        gridDisplay.SetTable(UnitCellsTable, True)
1258        self.dataFrame.CopyCell.Enable(True)
1259        gridDisplay.Bind(wg.EVT_GRID_CELL_LEFT_CLICK,RefreshUnitCellsGrid)
1260        gridDisplay.SetMargins(0,0)
1261        gridDisplay.SetRowLabelSize(0)
1262        gridDisplay.AutoSizeColumns(False)
1263        for r in range(gridDisplay.GetNumberRows()):
1264            for c in range(gridDisplay.GetNumberCols()):
1265                if c == 2:
1266                    gridDisplay.SetReadOnly(r,c,isReadOnly=False)
1267                else:
1268                    gridDisplay.SetReadOnly(r,c,isReadOnly=True)
1269        gridDisplay.SetSize(bottomSize)
1270
1271def UpdateReflectionGrid(self,data):
1272    if not data:
1273        print 'No phases, no reflections'
1274        return
1275    phases = data.keys()
1276   
1277    def OnSelectPhase(event):
1278        dlg = wx.SingleChoiceDialog(self,'Select','Phase',phases)
1279        try:
1280            if dlg.ShowModal() == wx.ID_OK:
1281                sel = dlg.GetSelection()
1282                self.RefList = phases[sel]
1283                UpdateReflectionGrid(self,data)
1284        finally:
1285            dlg.Destroy()
1286        G2plt.PlotPatterns(self)
1287       
1288       
1289    if self.dataDisplay:
1290        self.dataFrame.Clear()
1291    self.dataFrame.SetMenuBar(self.dataFrame.ReflMenu)
1292    if not self.dataFrame.GetStatusBar():
1293        Status = self.dataFrame.CreateStatusBar()   
1294    self.Bind(wx.EVT_MENU, OnSelectPhase, id=G2gd.wxID_SELECTPHASE)
1295    self.dataFrame.SelectPhase.Enable(False)
1296    if len(data) > 1:
1297        self.dataFrame.SelectPhase.Enable(True)
1298    rowLabels = []
1299    refList = [refl[:11] for refl in data[self.RefList]]
1300    for i in range(len(refList)): rowLabels.append(str(i))
1301    colLabels = ['H','K','L','mul','d','pos','sig','gam','Fosq','Fcsq','phase',]
1302    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',]
1303    self.PeakTable = G2gd.Table(refList,rowLabels=rowLabels,colLabels=colLabels,types=Types)
1304    self.dataFrame.SetLabel('Reflection List for '+self.RefList)
1305    self.dataDisplay = G2gd.GSGrid(parent=self.dataFrame)
1306    self.dataDisplay.SetTable(self.PeakTable, True)
1307    self.dataDisplay.EnableEditing(False)
1308    self.dataDisplay.SetMargins(0,0)
1309    self.dataDisplay.AutoSizeColumns(False)
1310    self.dataFrame.setSizePosLeft([555,350])
1311
1312def UpdatePDFGrid(self,data):
1313    global inst
1314    tth2q = lambda t,w:4.0*math.pi*sind(t/2.0)/w
1315    dataFile = self.PatternTree.GetItemText(self.PatternId)
1316    powName = 'PWDR'+dataFile[4:]
1317    powId = G2gd.GetPatternTreeItemId(self,self.root, powName)
1318    fullLimits,limits = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Limits'))
1319    inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId, 'Instrument Parameters'))
1320    inst = dict(zip(inst[3],inst[1]))
1321    if 'Lam' in inst:
1322        keV = 12.397639/inst['Lam']
1323    else:
1324        keV = 12.397639/inst['Lam1']
1325    wave = 12.397639/keV
1326    qLimits = [tth2q(fullLimits[0],wave),tth2q(fullLimits[1],wave)]
1327    data['QScaleLim'][1] = min(qLimits[1],data['QScaleLim'][1])
1328    if data['QScaleLim'][0]:
1329        data['QScaleLim'][0] = max(qLimits[0],data['QScaleLim'][0])
1330    else:                                #initial setting at 90% of max Q
1331        data['QScaleLim'][0] = 0.90*data['QScaleLim'][1]
1332    polariz = inst['Polariz.']
1333    azimuth = inst['Azimuth']
1334    itemDict = {}
1335   
1336    def FillFileSizer(fileSizer,key):
1337        #fileSizer is a FlexGridSizer(3,6)
1338       
1339        def OnSelectFile(event):
1340            Obj = event.GetEventObject()
1341            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1342            if itemKey == 'Name':
1343                value = Obj.GetValue()
1344            Obj.SetValue(fmt%(value))
1345            data[fileKey][itemKey] = value
1346            UpdatePDFGrid(self,data)
1347       
1348        def OnValueChange(event):
1349            Obj = event.GetEventObject()
1350            fileKey,itemKey,fmt = itemDict[Obj.GetId()]
1351            try:
1352                value = float(Obj.GetValue())
1353            except ValueError:
1354                value = -1.0
1355            Obj.SetValue(fmt%(value))
1356            data[fileKey][itemKey] = value
1357            auxPlot = ComputePDF(data)
1358            G2plt.PlotISFG(self,newPlot=True)
1359                       
1360        item = data[key]
1361        fileList = np.array(GetFileList('PWDR')).T[1]
1362        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' '+key+' file:'),0,wx.ALIGN_CENTER_VERTICAL)
1363        fileName = wx.ComboBox(self.dataDisplay,value=item['Name'],choices=fileList,
1364            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1365        itemDict[fileName.GetId()] = [key,'Name','%s']
1366        fileName.Bind(wx.EVT_COMBOBOX,OnSelectFile)       
1367        fileSizer.Add(fileName,0,)
1368        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Multiplier:'),0,wx.ALIGN_CENTER_VERTICAL)
1369        mult = wx.TextCtrl(self.dataDisplay,value='%.3f'%(item['Mult']),style=wx.TE_PROCESS_ENTER)
1370        itemDict[mult.GetId()] = [key,'Mult','%.3f']
1371        mult.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1372        mult.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1373        fileSizer.Add(mult,0,)
1374        fileSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Add:'),0,wx.ALIGN_CENTER_VERTICAL)
1375        add = wx.TextCtrl(self.dataDisplay,value='%.0f'%(item['Add']),style=wx.TE_PROCESS_ENTER)
1376        itemDict[add.GetId()] = [key,'Add','%.0f']
1377        add.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
1378        add.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
1379        fileSizer.Add(add,0,)
1380       
1381    def SumElementVolumes():
1382        sumVol = 0.
1383        ElList = data['ElList']
1384        for El in ElList:
1385            Avol = (4.*math.pi/3.)*ElList[El]['Drad']**3
1386            sumVol += Avol*ElList[El]['FormulaNo']
1387        return sumVol
1388        auxPlot = ComputePDF(data)
1389        G2plt.PlotISFG(self,newPlot=True)       
1390       
1391    def FillElemSizer(elemSizer,ElData):
1392       
1393        def OnFractionChange(event):
1394            try:
1395                value = max(0.0,float(num.GetValue()))
1396            except ValueError:
1397                value = 0.0
1398            num.SetValue('%.3f'%(value))
1399            ElData['FormulaNo'] = value
1400            data['Form Vol'] = max(10.0,SumElementVolumes())
1401            formVol.SetValue('%.2f'%(data['Form Vol']))
1402            UpdatePDFGrid(self,data)
1403            auxPlot = ComputePDF(data)
1404            G2plt.PlotISFG(self,newPlot=True)       
1405       
1406        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1407            label=' Element: '+'%2s'%(ElData['Symbol'])+' * '),0,wx.ALIGN_CENTER_VERTICAL)
1408        num = wx.TextCtrl(self.dataDisplay,value='%.3f'%(ElData['FormulaNo']),style=wx.TE_PROCESS_ENTER)
1409        num.Bind(wx.EVT_TEXT_ENTER,OnFractionChange)       
1410        num.Bind(wx.EVT_KILL_FOCUS,OnFractionChange)
1411        elemSizer.Add(num,0,wx.ALIGN_CENTER_VERTICAL)
1412        elemSizer.Add(wx.StaticText(parent=self.dataDisplay,
1413            label="f': %.3f"%(ElData['fp'])+' f": %.3f'%(ElData['fpp'])+' mu: %.2f barns'%(ElData['mu']) ),
1414            0,wx.ALIGN_CENTER_VERTICAL)
1415           
1416    def OnGeometry(event):
1417        data['Geometry'] = geometry.GetValue()
1418        UpdatePDFGrid(self,data)
1419        auxPlot = ComputePDF(data)
1420        G2plt.PlotISFG(self,newPlot=True)       
1421       
1422    def OnDetType(event):
1423        data['DetType'] = detType.GetValue()
1424        UpdatePDFGrid(self,data)
1425        auxPlot = ComputePDF(data)
1426        G2plt.PlotISFG(self,newPlot=True)       
1427       
1428    def OnFormVol(event):
1429        try:
1430            value = float(formVol.GetValue())
1431            if value <= 0.0:
1432                raise ValueError
1433        except ValueError:
1434            value = data['Form Vol']
1435        data['Form Vol'] = value
1436        UpdatePDFGrid(self,data)
1437        auxPlot = ComputePDF(data)
1438        G2plt.PlotISFG(self,newPlot=False)       
1439       
1440    def OnDiameter(event):
1441        try:
1442            value = float(diam.GetValue())
1443            if value <= 0.0:
1444                raise ValueError
1445        except ValueError:
1446            value = data['Diam']
1447        data['Diam'] = value
1448        UpdatePDFGrid(self,data)
1449        auxPlot = ComputePDF(data)
1450        G2plt.PlotISFG(self,newPlot=False)
1451       
1452    def OnPolaVal(event):
1453        try:
1454            value = float(polaVal.GetValue())
1455            if not (0.0 <= value <= 1.0):
1456                raise ValueError
1457        except ValueError:
1458            value = inst['Polariz.']
1459        inst['Polariz.'] = value
1460        polaVal.SetValue('%.2f'%(inst['Polariz.']))
1461        UpdatePDFGrid(self,data)
1462        auxPlot = ComputePDF(data)
1463        G2plt.PlotISFG(self,newPlot=False)
1464               
1465    def OnAzimVal(event):
1466        try:
1467            value = float(azimVal.GetValue())
1468            if not (0. <= value <= 360.):
1469                raise ValueError
1470        except ValueError:
1471            value = inst['Azimuth']
1472        inst['Azimuth'] = value
1473        azimVal.SetValue('%.1f'%(inst['Azimuth']))
1474        UpdatePDFGrid(self,data)
1475        auxPlot = ComputePDF(data)
1476        G2plt.PlotISFG(self,newPlot=False)
1477                       
1478    def OnObliqCoeff(event):
1479        try:
1480            value = float(obliqCoeff.GetValue())
1481            if value < 0.0:
1482                raise ValueError
1483            elif value > 1.0:
1484                value = 1.0
1485        except ValueError:
1486            value = data['ObliqCoeff']
1487        data['ObliqCoeff'] = value
1488        obliqCoeff.SetValue('%.3f'%(value))
1489        auxPlot = ComputePDF(data)
1490        G2plt.PlotISFG(self,newPlot=False)
1491       
1492    def OnRulandWdt(event):
1493        try:
1494            value = float(rulandWdt.GetValue())
1495            if value <= 0.001:
1496                raise ValueError
1497            elif value > 1.0:
1498                value = 1.0
1499        except ValueError:
1500            value = data['Ruland']
1501        data['Ruland'] = value
1502        rulandWdt.SetValue('%.3f'%(value))
1503        auxPlot = ComputePDF(data)
1504        G2plt.PlotISFG(self,newPlot=False)
1505       
1506    def OnRulSlider(event):
1507        value = int(rulandSldr.GetValue())/1000.
1508        data['Ruland'] = max(0.001,value)
1509        rulandWdt.SetValue('%.3f'%(data['Ruland']))
1510        auxPlot = ComputePDF(data)
1511        G2plt.PlotISFG(self,newPlot=False)
1512       
1513    def OnLorch(event):
1514        data['Lorch'] = lorch.GetValue()
1515        auxPlot = ComputePDF(data)
1516        G2plt.PlotISFG(self,newPlot=False)       
1517                       
1518    def OnPacking(event):
1519        try:
1520            value = float(pack.GetValue())
1521            if value <= 0.0:
1522                raise ValueError
1523        except ValueError:
1524            value = data['Pack']
1525        data['Pack'] = value
1526        UpdatePDFGrid(self,data)
1527        auxPlot = ComputePDF(data)
1528        G2plt.PlotISFG(self,newPlot=False)       
1529               
1530    def OnSQmin(event):
1531        try:
1532            value = float(SQmin.GetValue())
1533            if value < qLimits[0]:
1534                raise ValueError
1535        except ValueError:
1536            value = max(qLimits[0],data['QScaleLim'][0])
1537        data['QScaleLim'][0] = value
1538        SQmin.SetValue('%.1f'%(value))
1539        auxPlot = ComputePDF(data)
1540        G2plt.PlotISFG(self,newPlot=True)       
1541       
1542    def OnSQmax(event):
1543        try:
1544            value = float(SQmax.GetValue())
1545            if value > qLimits[1]:
1546                raise ValueError
1547        except ValueError:
1548            value = min(qLimits[1],data['QScaleLim'][1])
1549        data['QScaleLim'][1] = value
1550        if value < data['QScaleLim'][0]:
1551            data['QScaleLim'][0] = 0.90*value
1552            SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1553        SQmax.SetValue('%.1f'%(value))
1554        auxPlot = ComputePDF(data)
1555        G2plt.PlotISFG(self,newPlot=True)
1556       
1557    def OnResetQ(event):
1558        resetQ.SetValue(False)
1559        data['QScaleLim'][1] = qLimits[1]
1560        SQmax.SetValue('%.1f'%(data['QScaleLim'][1]))
1561        data['QScaleLim'][0] = 0.9*qLimits[1]
1562        SQmin.SetValue('%.1f'%(data['QScaleLim'][0]))
1563        auxPlot = ComputePDF(data)
1564        G2plt.PlotISFG(self,newPlot=True)       
1565
1566    def GetFileList(fileType,skip=None):
1567        fileList = [[False,'',0]]
1568        Source = ''
1569        id, cookie = self.PatternTree.GetFirstChild(self.root)
1570        while id:
1571            name = self.PatternTree.GetItemText(id)
1572            if fileType in name:
1573                if id == skip:
1574                    Source = name
1575                else:
1576                    fileList.append([False,name,id])
1577            id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1578        if skip:
1579            return fileList,Source
1580        else:
1581            return fileList
1582       
1583    def OnCopyPDFControls(event):
1584        import copy
1585        TextList,Source = GetFileList('PDF',skip=self.PatternId)
1586        TextList[0] = [False,'All PDF',0]
1587        if len(TextList) == 1:
1588            self.ErrorDialog('Nothing to copy controls to','There must be more than one "PDF" pattern')
1589            return
1590        dlg = self.CopyDialog(self,'Copy PDF controls','Copy controls from '+Source+' to:',TextList)
1591        try:
1592            if dlg.ShowModal() == wx.ID_OK:
1593                result = dlg.GetData()
1594                if result[0][0]:
1595                    result = TextList[1:]
1596                    for item in result: item[0] = True
1597                for i,item in enumerate(result):
1598                    ifcopy,name,id = item
1599                    if ifcopy:
1600                        olddata = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'))
1601                        sample = olddata['Sample']
1602                        olddata.update(data)
1603                        olddata['Sample'] = sample
1604                        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'PDF Controls'),olddata)
1605                Status.SetStatusText('PDF controls copied')
1606        finally:
1607            dlg.Destroy()
1608               
1609    def OnSavePDFControls(event):
1610        print 'save PDF controls?'
1611       
1612    def OnLoadPDFControls(event):
1613        print 'Load PDF controls?'
1614       
1615    def OnAddElement(event):
1616        ElList = data['ElList']
1617        PE = G2elem.PickElement(self,oneOnly=True)
1618        if PE.ShowModal() == wx.ID_OK:
1619            El = PE.Elem
1620            if El not in ElList:
1621                ElemSym = El.strip().upper()               
1622                FpMu = G2elem.FPcalc(G2elem.GetXsectionCoeff(ElemSym), keV)
1623                ElData = G2elem.GetFormFactorCoeff(ElemSym)[0]
1624                ElData['FormulaNo'] = 0.0
1625                ElData.update(G2elem.GetAtomInfo(ElemSym))
1626                ElData.update(dict(zip(['fp','fpp','mu'],FpMu)))
1627                ElData.update(G2elem.GetFFC5(El))
1628                data['ElList'][El] = ElData
1629            data['Form Vol'] = max(10.0,SumElementVolumes())
1630        PE.Destroy()
1631        UpdatePDFGrid(self,data)
1632       
1633    def OnDeleteElement(event):
1634        ElList = data['ElList']
1635        choice = ElList.keys()
1636        dlg = G2elem.DeleteElement(self,choice=choice)
1637        if dlg.ShowModal() == wx.ID_OK:
1638            del ElList[dlg.GetDeleteElement()]
1639        dlg.Destroy()
1640        UpdatePDFGrid(self,data)
1641               
1642    def ComputePDF(Data):
1643        xydata = {}
1644        for key in ['Sample','Sample Bkg.','Container','Container Bkg.']:
1645            name = Data[key]['Name']
1646            if name:
1647                xydata[key] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,self.root,name))
1648                PDFname = name
1649        powName = xydata['Sample'][2]
1650        powId = G2gd.GetPatternTreeItemId(self,self.root,powName)
1651        inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,powId,'Instrument Parameters'))
1652        inst = dict(zip(inst[3],inst[1]))
1653        auxPlot = G2pwd.CalcPDF(Data,inst,xydata)
1654        PDFId = G2gd.GetPatternTreeItemId(self,self.root,'PDF '+powName[4:])
1655        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'I(Q)'+powName[4:]),xydata['IofQ'])
1656        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'S(Q)'+powName[4:]),xydata['SofQ'])
1657        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'F(Q)'+powName[4:]),xydata['FofQ'])
1658        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PDFId,'G(R)'+powName[4:]),xydata['GofR'])
1659        return auxPlot
1660       
1661    def OnComputePDF(event):
1662        print 'Calculating PDF:'
1663        auxPlot = ComputePDF(data)
1664        print 'Done calculating PDF:'
1665        Status.SetStatusText('PDF computed')
1666        for plot in auxPlot:
1667            G2plt.PlotXY(self,plot[:2],type=plot[2])
1668       
1669        G2plt.PlotISFG(self,newPlot=True,type='I(Q)')
1670        G2plt.PlotISFG(self,newPlot=True,type='S(Q)')
1671        G2plt.PlotISFG(self,newPlot=True,type='F(Q)')
1672        G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1673       
1674    def OnComputeAllPDF(event):
1675        print 'Calculating PDFs:'
1676        if self.PatternTree.GetCount():
1677            id, cookie = self.PatternTree.GetFirstChild(self.root)
1678            while id:
1679                Name = self.PatternTree.GetItemText(id)
1680                if 'PDF' in Name:
1681                    Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id,'PDF Controls'))
1682                    auxPlot = ComputePDF(Data)                   
1683                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1684            Status.SetStatusText('All PDFs computed')
1685            G2plt.PlotISFG(self,newPlot=True,type='G(R)')
1686            print ' Done calculating PDFs:'
1687       
1688    def OnShowTip(self,tip):
1689        print tip   
1690               
1691    if self.dataDisplay:
1692        self.dataFrame.Clear()
1693    self.dataFrame.SetMenuBar(self.dataFrame.PDFMenu)
1694    if not self.dataFrame.GetStatusBar():
1695        Status = self.dataFrame.CreateStatusBar()   
1696    self.dataDisplay = wx.Panel(self.dataFrame)
1697    self.dataFrame.Bind(wx.EVT_MENU, OnCopyPDFControls, id=G2gd.wxID_PDFCOPYCONTROLS)
1698    self.dataFrame.Bind(wx.EVT_MENU, OnSavePDFControls, id=G2gd.wxID_PDFSAVECONTROLS)
1699    self.dataFrame.Bind(wx.EVT_MENU, OnLoadPDFControls, id=G2gd.wxID_PDFLOADCONTROLS)
1700    self.dataFrame.Bind(wx.EVT_MENU, OnAddElement, id=G2gd.wxID_PDFADDELEMENT)
1701    self.dataFrame.Bind(wx.EVT_MENU, OnDeleteElement, id=G2gd.wxID_PDFDELELEMENT)
1702    self.dataFrame.Bind(wx.EVT_MENU, OnComputePDF, id=G2gd.wxID_PDFCOMPUTE)
1703    self.dataFrame.Bind(wx.EVT_MENU, OnComputeAllPDF, id=G2gd.wxID_PDFCOMPUTEALL)
1704    mainSizer = wx.BoxSizer(wx.VERTICAL)
1705    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' PDF data files: '),0,wx.ALIGN_CENTER_VERTICAL)
1706    mainSizer.Add((5,5),0)
1707    str = ' Sample file: PWDR %s   Wavelength, A: %.5f  Energy, keV: %.3f  Polariz.: %.2f '%(dataFile[3:],wave,keV,polariz)
1708    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=str),0,wx.ALIGN_CENTER_VERTICAL)
1709#    dataSizer = wx.BoxSizer(wx.HORIZONTAL)
1710#    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Azimuth'),0,wx.ALIGN_CENTER_VERTICAL)
1711#    azimVal = wx.TextCtrl(self.dataDisplay,value='%.2f'%(inst['Azimuth']))
1712#    azimVal.Bind(wx.EVT_TEXT_ENTER,OnAzimVal)       
1713#    azimVal.Bind(wx.EVT_KILL_FOCUS,OnAzimVal)
1714#    dataSizer.Add(azimVal,0)   
1715#    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label='Polarization'),0,wx.ALIGN_CENTER_VERTICAL)
1716#    polaVal = wx.TextCtrl(self.dataDisplay,value='%.2f'%(inst['Polariz.']))
1717#    polaVal.Bind(wx.EVT_TEXT_ENTER,OnPolaVal)       
1718#    polaVal.Bind(wx.EVT_KILL_FOCUS,OnPolaVal)
1719#    dataSizer.Add(polaVal,0)   
1720#    mainSizer.Add(dataSizer,0)
1721    mainSizer.Add((5,5),0)
1722    fileSizer = wx.FlexGridSizer(3,6,5,1)
1723    select = ['Sample Bkg.','Container']
1724    if data['Container']['Name']:
1725        select.append('Container Bkg.')
1726    for key in select:
1727        FillFileSizer(fileSizer,key)
1728    mainSizer.Add(fileSizer,0)
1729    mainSizer.Add((5,5),0)
1730    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Sample information: '),0,wx.ALIGN_CENTER_VERTICAL)
1731    mainSizer.Add((5,5),0)   
1732
1733    ElList = data['ElList']
1734    Abs = G2lat.CellAbsorption(ElList,data['Form Vol'])
1735    Trans = G2pwd.Transmission(data['Geometry'],Abs*data['Pack'],data['Diam'])
1736    elemSizer = wx.FlexGridSizer(3,3,5,1)
1737    for El in ElList:
1738        FillElemSizer(elemSizer,ElList[El])
1739    mainSizer.Add(elemSizer,0)
1740    mainSizer.Add((5,5),0)   
1741    midSizer = wx.BoxSizer(wx.HORIZONTAL)
1742    midSizer.Add(wx.StaticText(self.dataDisplay,label=' Formula volume: '),0,wx.ALIGN_CENTER_VERTICAL)
1743    formVol = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Form Vol']))
1744    formVol.Bind(wx.EVT_TEXT_ENTER,OnFormVol)       
1745    formVol.Bind(wx.EVT_KILL_FOCUS,OnFormVol)
1746    midSizer.Add(formVol,0)
1747    midSizer.Add(wx.StaticText(self.dataDisplay,
1748        label=' Theoretical absorption: %.4f cm-1 Sample absorption: %.4f cm-1'%(Abs,Abs*data['Pack'])),
1749        0,wx.ALIGN_CENTER_VERTICAL)
1750    mainSizer.Add(midSizer,0)
1751    mainSizer.Add((5,5),0)   
1752
1753    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1754    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample geometry: '),0,wx.ALIGN_CENTER_VERTICAL)
1755    choice = ['Cylinder','Bragg-Brentano','Tilting flat plate in transmission','Fixed flat plate']
1756    geometry = wx.ComboBox(self.dataDisplay,value=data['Geometry'],choices=choice,
1757            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1758    geometry.Bind(wx.EVT_COMBOBOX, OnGeometry)
1759    geoBox.Add(geometry,0)
1760    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample diameter/thickness, mm: '),0,wx.ALIGN_CENTER_VERTICAL)
1761    diam = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Diam']))
1762    diam.Bind(wx.EVT_TEXT_ENTER,OnDiameter)       
1763    diam.Bind(wx.EVT_KILL_FOCUS,OnDiameter)
1764#    diam.Bind(wx.EVT_SET_FOCUS,OnShowTip(self,'tip')) #this doesn't work - what would????
1765    geoBox.Add(diam,0)
1766    mainSizer.Add(geoBox,0)
1767    mainSizer.Add((5,5),0)   
1768    geoBox = wx.BoxSizer(wx.HORIZONTAL)
1769    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Packing: '),0,wx.ALIGN_CENTER_VERTICAL)
1770    pack = wx.TextCtrl(self.dataDisplay,value='%.2f'%(data['Pack']))
1771    pack.Bind(wx.EVT_TEXT_ENTER,OnPacking)       
1772    pack.Bind(wx.EVT_KILL_FOCUS,OnPacking)
1773    geoBox.Add(pack,0)
1774    geoBox.Add(wx.StaticText(self.dataDisplay,label=' Sample transmission: %.3f %%'%(Trans)),0,wx.ALIGN_CENTER_VERTICAL)   
1775    mainSizer.Add(geoBox,0)
1776    mainSizer.Add((5,5),0)   
1777       
1778    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' S(Q)->F(Q)->G(R) controls: '),0,wx.ALIGN_CENTER_VERTICAL)
1779    mainSizer.Add((5,5),0)
1780    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1781    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Detector type: '),0,wx.ALIGN_CENTER_VERTICAL)
1782    choice = ['Image plate','Point detector']
1783    detType = wx.ComboBox(self.dataDisplay,value=data['DetType'],choices=choice,
1784            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1785    detType.Bind(wx.EVT_COMBOBOX, OnDetType)
1786    sqBox.Add(detType,0)
1787    if data['DetType'] == 'Image plate':
1788        sqBox.Add(wx.StaticText(self.dataDisplay,label=' IP transmission coeff.: '),0,wx.ALIGN_CENTER_VERTICAL)
1789        obliqCoeff = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['ObliqCoeff']))
1790        obliqCoeff.Bind(wx.EVT_TEXT_ENTER,OnObliqCoeff)       
1791        obliqCoeff.Bind(wx.EVT_KILL_FOCUS,OnObliqCoeff)
1792        sqBox.Add(obliqCoeff,0)
1793    mainSizer.Add(sqBox,0)
1794       
1795    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1796    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Ruland width: '),0,wx.ALIGN_CENTER_VERTICAL)   
1797    rulandSldr = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
1798        value=int(1000*data['Ruland']))
1799    sqBox.Add(rulandSldr,1,wx.EXPAND)
1800    rulandSldr.Bind(wx.EVT_SLIDER, OnRulSlider)
1801    rulandWdt = wx.TextCtrl(self.dataDisplay,value='%.3f'%(data['Ruland']))
1802    rulandWdt.Bind(wx.EVT_TEXT_ENTER,OnRulandWdt)       
1803    rulandWdt.Bind(wx.EVT_KILL_FOCUS,OnRulandWdt)
1804    sqBox.Add(rulandWdt,0,wx.ALIGN_CENTER_VERTICAL)   
1805    mainSizer.Add(sqBox,0,wx.ALIGN_LEFT|wx.EXPAND)
1806   
1807    sqBox = wx.BoxSizer(wx.HORIZONTAL)
1808    lorch = wx.CheckBox(parent=self.dataDisplay,label='Lorch damping?')
1809    lorch.SetValue(data['Lorch'])
1810    lorch.Bind(wx.EVT_CHECKBOX, OnLorch)
1811    sqBox.Add(lorch,0,wx.ALIGN_CENTER_VERTICAL)
1812    sqBox.Add(wx.StaticText(self.dataDisplay,label=' Scaling q-range: '),0,wx.ALIGN_CENTER_VERTICAL)
1813    SQmin = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][0]))
1814    SQmin.Bind(wx.EVT_TEXT_ENTER,OnSQmin)       
1815    SQmin.Bind(wx.EVT_KILL_FOCUS,OnSQmin)   
1816    sqBox.Add(SQmin,0)
1817    sqBox.Add(wx.StaticText(self.dataDisplay,label=' to '),0,wx.ALIGN_CENTER_VERTICAL)
1818    SQmax = wx.TextCtrl(self.dataDisplay,value='%.1f'%(data['QScaleLim'][1]))
1819    SQmax.Bind(wx.EVT_TEXT_ENTER,OnSQmax)       
1820    SQmax.Bind(wx.EVT_KILL_FOCUS,OnSQmax)
1821    sqBox.Add(SQmax,0)
1822    resetQ = wx.CheckBox(parent=self.dataDisplay,label='Reset?')
1823    sqBox.Add(resetQ,0)
1824    resetQ.Bind(wx.EVT_CHECKBOX, OnResetQ)
1825   
1826    mainSizer.Add(sqBox,0)
1827
1828    mainSizer.Layout()   
1829    self.dataDisplay.SetSizer(mainSizer)
1830    Size = mainSizer.Fit(self.dataFrame)
1831    self.dataDisplay.SetSize(Size)
1832    self.dataFrame.setSizePosLeft(Size)
1833   
Note: See TracBrowser for help on using the repository browser.