source: trunk/GSASIIpwdGUI.py @ 397

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

collect default settings for Sample in one routine
add recalibrate routine for images
azimuths from image integration are now the center angle of each azimuth bin
put in 1/2 pixel offset in image calibration/integration calcs

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