source: trunk/GSASIIpwdGUI.py @ 406

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

implement background subtraction during image integration
implement copy for instrument parms & background
continue constraint GUI development
make sure proper updates in refinement/seq refinement

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