source: trunk/GSASIIpwdGUI.py @ 440

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

fix the mustrain ve microstrain title problem = GSASII.py
take wx,CallAfter? back out of most places - caused problems
get aniso size/mustrain ellipsoid around the right way to match ellipsoid model - exchanged sin & cos.

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