source: trunk/GSASIIpwdGUI.py @ 429

Last change on this file since 429 was 429, checked in by vondreele, 11 years ago

set 'browser' as default help display
fix zero & zero offset to be consistent in peak fitting/indexing/cell refinement

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