source: trunk/GSASIIpwdGUI.py @ 436

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

remove a stray print from psvfcj.for
add the wx inspector tool (commented out) at top of GSASII.py
use wx.CallAfter? - fixes the crash in UpdateDData & maybe UpdateTexture?
copy command in SampleData? now copies phi,chi & omega

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