source: trunk/GSASIIpwdGUI.py @ 391

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

set default atom frac=1 for cif files
store covMatrix not normalized by diagonal
make esds on cell parameters

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