source: trunk/GSASIIpwdGUI.py @ 437

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

use wx.CallAfter?() - a few places it didn't work!
possible new 'RefineTexture?' using seqdata started

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