source: trunk/GSASIIgrid.py @ 250

Last change on this file since 250 was 250, checked in by vondreele, 12 years ago

GSASIIgrid.py - improve Comments listing
GSASII.py - add qPlot option
GSASIIpwdGUI.py - remove a couple of prints
GSASIIplot.py - add q & log(Y) plotting

  • Property svn:keywords set to Date Author Revision URL Id
File size: 35.0 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-02-22 19:36:58 +0000 (Tue, 22 Feb 2011) $
4# $Author: vondreele $
5# $Revision: 250 $
6# $URL: trunk/GSASIIgrid.py $
7# $Id: GSASIIgrid.py 250 2011-02-22 19:36:58Z vondreele $
8########### SVN repository information ###################
9import wx
10import wx.grid as wg
11import time
12import cPickle
13import GSASIIpath
14import GSASIIplot as G2plt
15import GSASIIpwdGUI as G2pdG
16import GSASIIimgGUI as G2imG
17import GSASIIphsGUI as G2phG
18
19[ wxID_ATOMSEDITADD, wxID_ATOMSEDITINSERT, wxID_ATOMSEDITDELETE, wxID_ATOMSREFINE, 
20    wxID_ATOMSMODIFY, wxID_ATOMSTRANSFORM, wxID_ATOMSTESTADD, wxID_ATONTESTINSERT,
21    wxID_RELOADDRAWATOMS,
22] = [wx.NewId() for _init_coll_Atom_Items in range(9)]
23
24[ wxID_PWDRADD, wxID_HKLFADD, wxID_DATADELETE,
25] = [wx.NewId() for _init_coll_Data_Items in range(3)]
26
27[ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWATOMCOLOR, wxID_DRAWATOMRESETCOLOR, 
28    wxID_DRAWVIEWPOINT, wxID_DRAWTRANSFORM, wxID_DRAWDELETE, wxID_DRAWFILLCELL, 
29    wxID_DRAWADDEQUIV, wxID_DRAWFILLCOORD,
30] = [wx.NewId() for _init_coll_DrawAtom_Items in range(10)]
31
32[ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, wxID_SAVEINTG, 
33    wxID_IMCOPYCONTROLS, wxID_INTEGRATEALL, wxID_IMSAVECONTROLS, wxID_IMLOADCONTROLS,
34] = [wx.NewId() for _init_coll_IMAGE_Items in range(8)]
35
36[ wxID_MASKCOPY,
37] = [wx.NewId() for _init_coll_MASK_Items in range(1)]
38
39[ wxID_PAWLEYLOAD, wxID_PAWLEYIMPORT,
40] = [wx.NewId() for _init_coll_PAWLEY_Items in range(2)]
41
42[ wxID_INSTPRMRESET,
43] = [wx.NewId() for _init_coll_INST_Items in range(1)]
44
45[ wxID_INDXRELOAD,
46] = [wx.NewId() for _init_coll_IndPeaks_Items in range(1)]
47
48[ wxID_UNDO,wxID_PEAKFIT,wxID_AUTOPEAKFIT,
49] = [wx.NewId() for _init_coll_PEAK_Items in range(3)]
50
51[  wxID_INDEXPEAKS, wxID_REFINECELL, wxID_COPYCELL, wxID_MAKENEWPHASE,
52] = [wx.NewId() for _init_coll_INDEX_Items in range(4)]
53
54VERY_LIGHT_GREY = wx.Colour(235,235,235)
55
56class DataFrame(wx.Frame):
57    def _init_coll_BlankMenu(self,parent):
58        parent.Append(menu=self.Blank,title='')
59       
60    def _init_coll_AtomsMenu(self,parent):
61        parent.Append(menu=self.AtomEdit, title='Edit')
62       
63    def _init_coll_DataMenu(self,parent):
64        parent.Append(menu=self.DataEdit, title='Edit')
65       
66    def _init_coll_DrawAtomsMenu(self,parent):
67        parent.Append(menu=self.DrawAtomEdit, title='Edit')
68
69    def _init_coll_PawleyMenu(self,parent):
70        parent.Append(menu=self.PawleyEdit,title='Pawley Reflections Operations')
71     
72    def _init_coll_IndPeaksMenu(self,parent):
73        parent.Append(menu=self.IndPeaksEdit,title='Index Peaks Operations')
74                   
75    def _init_coll_ImageMenu(self,parent):
76        parent.Append(menu=self.ImageEdit, title='Image Operations')
77       
78    def _init_coll_InstMenu(self,parent):
79        parent.Append(menu=self.InstEdit, title='Inst. Parm. Operations')
80       
81    def _init_coll_MaskMenu(self,parent):
82        parent.Append(menu=self.MaskEdit, title='Mask Operations')
83       
84    def _init_coll_PeakMenu(self,parent):
85        parent.Append(menu=self.PeakEdit, title='Peak Fitting')
86
87    def _init_coll_IndexMenu(self,parent):
88        parent.Append(menu=self.IndexEdit, title='Cell Index/Refine')
89       
90    def _init_coll_Atom_Items(self,parent):
91        parent.Append(id=wxID_ATOMSEDITADD, kind=wx.ITEM_NORMAL,text='Append atom',
92            help='Inserted as an H atom')
93        parent.Append(id=wxID_ATOMSTESTADD, kind=wx.ITEM_NORMAL,text='Append test point',
94            help='Inserted as an H atom')
95        parent.Append(id=wxID_ATOMSEDITINSERT, kind=wx.ITEM_NORMAL,text='Insert atom',
96            help='Select atom row to insert before; inserted as an H atom')
97        parent.Append(id=wxID_ATONTESTINSERT, kind=wx.ITEM_NORMAL,text='Insert test point',
98            help='Select atom row to insert before; inserted as an H atom')
99        parent.Append(id=wxID_ATOMSEDITDELETE, kind=wx.ITEM_NORMAL,text='Delete atom',
100            help='Select atoms to delete first')
101        parent.Append(id=wxID_ATOMSREFINE, kind=wx.ITEM_NORMAL,text='Set atom refinement flags',
102            help='Select atoms to refine first')
103        parent.Append(id=wxID_ATOMSMODIFY, kind=wx.ITEM_NORMAL,text='Modify atom parameters',
104            help='Select atoms to modify first')
105        parent.Append(id=wxID_ATOMSTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
106            help='Select atoms to transform first')
107        parent.Append(id=wxID_RELOADDRAWATOMS, kind=wx.ITEM_NORMAL,text='Reload draw atoms',
108            help='Reload atom drawing list')
109           
110    def _init_coll_Data_Items(self,parent):
111        parent.Append(id=wxID_PWDRADD, kind=wx.ITEM_NORMAL,text='Add powder histograms',
112            help='Select new powder histograms to be used for this phase')
113        parent.Append(id=wxID_HKLFADD, kind=wx.ITEM_NORMAL,text='Add single crystal histograms',
114            help='Select new single crystal histograms to be used for this phase')
115        parent.Append(id=wxID_DATADELETE, kind=wx.ITEM_NORMAL,text='Delete histograms',
116            help='Delete histograms from use for this phase')
117           
118    def _init_coll_DrawAtom_Items(self,parent):
119        parent.Append(id=wxID_DRAWATOMSTYLE, kind=wx.ITEM_NORMAL,text='Atom style',
120            help='Select atoms first')
121        parent.Append(id=wxID_DRAWATOMLABEL, kind=wx.ITEM_NORMAL,text='Atom label',
122            help='Select atoms first')
123        parent.Append(id=wxID_DRAWATOMCOLOR, kind=wx.ITEM_NORMAL,text='Atom color',
124            help='Select atoms first')
125        parent.Append(id=wxID_DRAWATOMRESETCOLOR, kind=wx.ITEM_NORMAL,text='Reset atom colors',
126            help='Resets all atom colors to defaults')
127        parent.Append(id=wxID_DRAWVIEWPOINT, kind=wx.ITEM_NORMAL,text='View point',
128            help='View point is 1st atom selected')
129        parent.Append(id=wxID_DRAWADDEQUIV, kind=wx.ITEM_NORMAL,text='Add atoms',
130            help='Add symmetry & cell equivalents to drawing set from selected atoms')
131        parent.Append(id=wxID_DRAWTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
132            help='Transform selected atoms by symmetry & cell translations')
133        parent.Append(id=wxID_DRAWFILLCOORD, kind=wx.ITEM_NORMAL,text='Fill CN-sphere',
134            help='Fill coordination sphere for selected atoms')           
135        parent.Append(id=wxID_DRAWFILLCELL, kind=wx.ITEM_NORMAL,text='Fill unit cell',
136            help='Fill unit cell with selected atoms')
137        parent.Append(id=wxID_DRAWDELETE, kind=wx.ITEM_NORMAL,text='Delete atoms',
138            help='Delete atoms from drawing set')
139
140    def _init_coll_Pawley_Items(self,parent):
141        parent.Append(id=wxID_PAWLEYLOAD, kind=wx.ITEM_NORMAL,text='Pawley create',
142            help='Initialize Pawley reflection list')
143        parent.Append(id=wxID_PAWLEYIMPORT, kind=wx.ITEM_NORMAL,text='Pawley import',
144            help='Import Pawley reflection list')
145
146    def _init_coll_IndPeaks_Items(self,parent):
147        parent.Append(help='Load/Reload index peaks from peak list',id=wxID_INDXRELOAD, 
148            kind=wx.ITEM_NORMAL,text='Load/Reload')
149           
150    def _init_coll_Image_Items(self,parent):
151        parent.Append(help='Calibrate detector by fitting to calibrant lines', 
152            id=wxID_IMCALIBRATE, kind=wx.ITEM_NORMAL,text='Calibrate')
153        parent.Append(help='Clear calibration data points and rings',id=wxID_IMCLEARCALIB, 
154            kind=wx.ITEM_NORMAL,text='Clear calibration')
155        parent.Append(help='Integrate selected image',id=wxID_IMINTEGRATE, 
156            kind=wx.ITEM_NORMAL,text='Integrate')
157        parent.Append(help='Integrate all images selected from list',id=wxID_INTEGRATEALL,
158            kind=wx.ITEM_NORMAL,text='Integrate all')
159        parent.Append(help='Save integration results as a series of 1-D powder patterns', 
160            id=wxID_SAVEINTG, kind=wx.ITEM_NORMAL,text='Save Integration')
161        parent.Append(help='Copy image controls to other images', 
162            id=wxID_IMCOPYCONTROLS, kind=wx.ITEM_NORMAL,text='Copy Controls')
163        parent.Append(help='Save image controls to file', 
164            id=wxID_IMSAVECONTROLS, kind=wx.ITEM_NORMAL,text='Save Controls')
165        parent.Append(help='Load image controls from file', 
166            id=wxID_IMLOADCONTROLS, kind=wx.ITEM_NORMAL,text='Load Controls')
167
168                   
169    def _init_coll_Mask_Items(self,parent):
170        parent.Append(help='Copy mask to other images', 
171            id=wxID_MASKCOPY, kind=wx.ITEM_NORMAL,text='Copy mask')
172
173    def _init_coll_Inst_Items(self,parent):
174        parent.Append(help='Reset instrument profile parameters to default', 
175            id=wxID_INSTPRMRESET, kind=wx.ITEM_NORMAL,text='Reset profile')
176
177    def _init_coll_Peak_Items(self,parent):
178        self.UnDo = parent.Append(help='Undo last least squares refinement', 
179            id=wxID_UNDO, kind=wx.ITEM_NORMAL,text='UnDo')
180        self.PeakFit = parent.Append(id=wxID_PEAKFIT, kind=wx.ITEM_NORMAL,text='PeakFit', 
181            help='Do single cycle of peak fitting least-squares refinement' )
182        self.AutoPeakFit = parent.Append(id=wxID_AUTOPEAKFIT, kind=wx.ITEM_NORMAL, 
183            text='AutoPeakFit',help='Do peak fitting least-squares to convergence' )
184           
185    def _init_coll_Index_Items(self,parent):
186        self.IndexPeaks = parent.Append(help='', id=wxID_INDEXPEAKS, kind=wx.ITEM_NORMAL,
187            text='Index Cell')
188        self.CopyCell = parent.Append( id=wxID_COPYCELL, kind=wx.ITEM_NORMAL,text='Copy Cell', 
189            help='Copy selected unit cell from indexing to cell refinement fields')
190        self.RefineCell = parent.Append( id=wxID_REFINECELL, kind=wx.ITEM_NORMAL, 
191            text='Refine Cell',help='Refine unit cell parameters from indexed peaks')
192        self.MakeNewPhase = parent.Append( id=wxID_MAKENEWPHASE, kind=wx.ITEM_NORMAL,
193            text='Make new phase',help='Make new phase from selected unit cell')
194
195    def _init_utils(self):
196        self.BlankMenu = wx.MenuBar()
197       
198        self.AtomsMenu = wx.MenuBar()
199        self.DataMenu = wx.MenuBar()
200        self.DrawAtomsMenu = wx.MenuBar()
201        self.PawleyMenu = wx.MenuBar()
202        self.ImageMenu = wx.MenuBar()
203        self.MaskMenu = wx.MenuBar()
204        self.InstMenu = wx.MenuBar()
205        self.PeakMenu = wx.MenuBar()
206        self.IndPeaksMenu = wx.MenuBar()
207        self.IndexMenu = wx.MenuBar()
208        self.AtomEdit = wx.Menu(title='')
209        self.DataEdit = wx.Menu(title='')
210        self.DrawAtomEdit = wx.Menu(title='')
211        self.PawleyEdit = wx.Menu(title='')
212        self.ImageEdit = wx.Menu(title='')
213        self.MaskEdit = wx.Menu(title='')
214        self.InstEdit = wx.Menu(title='')
215        self.PeakEdit = wx.Menu(title='')
216        self.IndPeaksEdit = wx.Menu(title='')
217        self.IndexEdit = wx.Menu(title='')
218        self._init_coll_AtomsMenu(self.AtomsMenu)
219        self._init_coll_Atom_Items(self.AtomEdit)
220        self._init_coll_DataMenu(self.DataMenu)
221        self._init_coll_Data_Items(self.DataEdit)
222        self._init_coll_DrawAtomsMenu(self.DrawAtomsMenu)
223        self._init_coll_DrawAtom_Items(self.DrawAtomEdit)
224        self._init_coll_PawleyMenu(self.PawleyMenu)
225        self._init_coll_Pawley_Items(self.PawleyEdit)
226        self._init_coll_ImageMenu(self.ImageMenu)
227        self._init_coll_Image_Items(self.ImageEdit)
228        self._init_coll_MaskMenu(self.MaskMenu)
229        self._init_coll_Mask_Items(self.MaskEdit)
230        self._init_coll_InstMenu(self.InstMenu)
231        self._init_coll_Inst_Items(self.InstEdit)
232        self._init_coll_PeakMenu(self.PeakMenu)
233        self._init_coll_Peak_Items(self.PeakEdit)
234        self._init_coll_IndPeaksMenu(self.IndPeaksMenu)
235        self._init_coll_IndPeaks_Items(self.IndPeaksEdit)
236        self._init_coll_IndexMenu(self.IndexMenu)
237        self._init_coll_Index_Items(self.IndexEdit)
238        self.UnDo.Enable(False)
239        self.PeakFit.Enable(False)
240        self.AutoPeakFit.Enable(False)
241        self.IndexPeaks.Enable(False)
242        self.CopyCell.Enable(False)
243        self.RefineCell.Enable(False)
244        self.MakeNewPhase.Enable(False)
245       
246    def _init_ctrls(self, parent,name=None,size=None,pos=None):
247        wx.Frame.__init__(self,parent=parent,style=wx.DEFAULT_FRAME_STYLE ^ wx.CLOSE_BOX,
248            size=size,pos=pos,title='GSAS-II data display')
249        self._init_utils()
250        if name:
251            self.SetLabel(name)
252        self.Show()
253       
254    def __init__(self,parent,data=None,name=None, size=None,pos=None):
255        self._init_ctrls(parent,name,size,pos)
256        self.data = data
257        clientSize = wx.ClientDisplayRect()
258        Size = self.GetSize()
259        xPos = clientSize[2]-Size[0]
260        self.SetPosition(wx.Point(xPos,clientSize[1]+250))
261        self.dirname = ''
262        self.AtomGrid = []
263        self.selectedRow = 0
264       
265    def setSizePosLeft(self,Width):
266        clientSize = wx.ClientDisplayRect()
267        Width[1] = min(Width[1],clientSize[2]-300)
268        self.SetSize(Width)
269        self.SetPosition(wx.Point(clientSize[2]-Width[0],clientSize[1]+250))
270       
271    def Clear(self):
272        self.ClearBackground()
273        self.DestroyChildren()
274                   
275class GSNoteBook(wx.Notebook):
276    def __init__(self, parent, name='',size = None):
277        wx.Notebook.__init__(self, parent, -1, name=name, style= wx.BK_TOP)
278        if size: self.SetSize(size)
279                                                     
280    def Clear(self):       
281        GSNoteBook.DeleteAllPages(self)
282       
283    def FindPage(self,name):
284        numPage = self.GetPageCount()
285        for page in range(numPage):
286            if self.GetPageText(page) == name:
287                return page
288       
289class GSGrid(wg.Grid):
290    def __init__(self, parent, name=''):
291        wg.Grid.__init__(self,parent,-1,name=name)                   
292        self.SetSize(parent.GetClientSize())
293           
294    def Clear(self):
295        wg.Grid.ClearGrid(self)
296       
297    def SetCellStyle(self,r,c,color="white",readonly=True):
298        self.SetCellBackgroundColour(r,c,color)
299        self.SetReadOnly(r,c,isReadOnly=readonly)
300       
301    def GetSelection(self):
302        #this is to satisfy structure drawing stuff in G2plt when focus changes
303        return None
304                       
305class Table(wg.PyGridTableBase):
306    def __init__(self, data=[], rowLabels=None, colLabels=None, types = None):
307        wg.PyGridTableBase.__init__(self)
308        self.colLabels = colLabels
309        self.rowLabels = rowLabels
310        self.dataTypes = types
311        self.data = data
312       
313    def AppendRows(self, numRows=1):
314        self.data.append([])
315        return True
316       
317    def CanGetValueAs(self, row, col, typeName):
318        if self.dataTypes:
319            colType = self.dataTypes[col].split(':')[0]
320            if typeName == colType:
321                return True
322            else:
323                return False
324        else:
325            return False
326
327    def CanSetValueAs(self, row, col, typeName):
328        return self.CanGetValueAs(row, col, typeName)
329
330    def DeleteRow(self,pos):
331        data = self.GetData()
332        self.SetData([])
333        new = []
334        for irow,row in enumerate(data):
335            if irow <> pos:
336                new.append(row)
337        self.SetData(new)
338       
339    def GetColLabelValue(self, col):
340        if self.colLabels:
341            return self.colLabels[col]
342           
343    def GetData(self):
344        data = []
345        for row in range(self.GetNumberRows()):
346            data.append(self.GetRowValues(row))
347        return data
348       
349    def GetNumberCols(self):
350        try:
351            return len(self.colLabels)
352        except TypeError:
353            return None
354       
355    def GetNumberRows(self):
356        return len(self.data)
357       
358    def GetRowLabelValue(self, row):
359        if self.rowLabels:
360            return self.rowLabels[row]
361       
362    def GetRowValues(self, row):
363        data = []
364        for col in range(self.GetNumberCols()):
365            data.append(self.GetValue(row, col))
366        return data
367       
368    def GetTypeName(self, row, col):
369        try:
370            return self.dataTypes[col]
371        except TypeError:
372            return None
373
374    def GetValue(self, row, col):
375        try:
376            return self.data[row][col]
377        except IndexError:
378            return None
379           
380    def InsertRows(self, pos, rows):
381        for row in range(rows):
382            self.data.insert(pos,[])
383            pos += 1
384       
385    def IsEmptyCell(self,row,col):
386        try:
387            return not self.data[row][col]
388        except IndexError:
389            return True
390       
391    def OnKeyPress(self, event):
392        dellist = self.GetSelectedRows()
393        if event.GetKeyCode() == wx.WXK_DELETE and dellist:
394            grid = self.GetView()
395            for i in dellist: grid.DeleteRow(i)
396               
397    def SetColLabelValue(self, col, label):
398        numcols = self.GetNumberCols()
399        if col > numcols-1:
400            self.colLabels.append(label)
401        else:
402            self.colLabels[col]=label
403       
404    def SetData(self,data):
405        for row in range(len(data)):
406            self.SetRowValues(row,data[row])
407               
408    def SetRowLabelValue(self, row, label):
409        self.rowLabels[row]=label
410           
411    def SetRowValues(self,row,data):
412        self.data[row] = data
413           
414    def SetValue(self, row, col, value):
415        def innerSetValue(row, col, value):
416            try:
417                self.data[row][col] = value
418            except TypeError:
419                return
420            except IndexError:
421                print row,col,value
422                # add a new row
423                if row > self.GetNumberRows():
424                    self.data.append([''] * self.GetNumberCols())
425                elif col > self.GetNumberCols():
426                    for row in range(self.GetNumberRows):
427                        self.data[row].append('')
428                print self.data
429                self.data[row][col] = value
430        innerSetValue(row, col, value)
431       
432def UpdateNotebook(self,data):       
433    if data:
434        self.dataFrame.SetLabel('Notebook')
435        self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
436            style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
437        for line in data:
438            self.dataDisplay.AppendText(line+"\n")
439            self.dataDisplay.AppendText('Notebook entry @ '+time.ctime()+"\n")
440           
441def UpdateControls(self,data):
442    '''
443    #Fourier controls
444    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
445    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
446    #distance/angle controls
447    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
448    '''
449       
450    def SetStatusLine(text):
451        Status.SetStatusText(text)
452                                     
453    def OnNumCycles(event):
454        try:
455            value = max(0,min(200,int(Ncyc.GetValue())))
456        except ValueError:
457            value = 3
458        data['Ncycles'] = value
459        Ncyc.SetValue('%d'%(value))
460       
461    def OnConvergence(event):
462        try:
463            value = max(0.01,min(100.,float(Cnvrg.GetValue())))
464        except ValueError:
465            value = 0.01
466        data['minSumShftESD'] = value
467        Cnvrg.SetValue('%.2f'%(value))
468       
469    def OnAtomShift(event):
470        try:
471            value = max(0.1,min(5.,float(AtShft.GetValue())))
472        except ValueError:
473            value = 2.0
474        data['maxShift'] = value
475        AtShft.SetValue('%.1f'%(value))
476       
477    def OnMarquardt(event):
478        try:
479            value = max(1.0,min(10.0,float(Marq.GetValue())))
480        except ValueError:
481            value = 1.0
482        data['Marquardt'] = value
483        Marq.SetValue('%.2f'%(value))
484       
485    def OnBandWidth(event):
486        try:
487            value = max(0,min(200,int(Band.GetValue())))
488        except ValueError:
489            value = 0
490        data['bandWidth'] = value
491        Band.SetValue('%d'%(value))
492       
493    def OnRestraint(event):
494        data['restraintWeight'] = Restraint.GetValue()
495
496    if self.dataDisplay:
497        self.dataDisplay.Destroy()
498    if not self.dataFrame.GetStatusBar():
499        Status = self.dataFrame.CreateStatusBar()
500    SetStatusLine('')
501    self.dataFrame.SetLabel('Controls')
502    self.dataDisplay = wx.Panel(self.dataFrame)
503    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
504    mainSizer = wx.BoxSizer(wx.VERTICAL)
505    mainSizer.Add((5,5),0)
506    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
507    LSSizer = wx.FlexGridSizer(cols=4,vgap=5,hgap=5)
508    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Max cycles: '),0,wx.ALIGN_CENTER_VERTICAL)
509    Ncyc = wx.TextCtrl(self.dataDisplay,-1,value='%d'%(data['Ncycles']),style=wx.TE_PROCESS_ENTER)
510    Ncyc.Bind(wx.EVT_TEXT_ENTER,OnNumCycles)
511    Ncyc.Bind(wx.EVT_KILL_FOCUS,OnNumCycles)
512    LSSizer.Add(Ncyc,0,wx.ALIGN_CENTER_VERTICAL)
513    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Min sum(shift/esd)^2: '),0,wx.ALIGN_CENTER_VERTICAL)
514    Cnvrg = wx.TextCtrl(self.dataDisplay,-1,value='%.2f'%(data['minSumShftESD']),style=wx.TE_PROCESS_ENTER)
515    Cnvrg.Bind(wx.EVT_TEXT_ENTER,OnConvergence)
516    Cnvrg.Bind(wx.EVT_KILL_FOCUS,OnConvergence)
517    LSSizer.Add(Cnvrg,0,wx.ALIGN_CENTER_VERTICAL)
518    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Max atom shift: '),0,wx.ALIGN_CENTER_VERTICAL)
519    AtShft = wx.TextCtrl(self.dataDisplay,-1,value='%.1f'%(data['maxShift']),style=wx.TE_PROCESS_ENTER)
520    AtShft.Bind(wx.EVT_TEXT_ENTER,OnAtomShift)
521    AtShft.Bind(wx.EVT_KILL_FOCUS,OnAtomShift)
522    LSSizer.Add(AtShft,0,wx.ALIGN_CENTER_VERTICAL)
523    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Marquardt factor: '),0,wx.ALIGN_CENTER_VERTICAL)
524    Marq = wx.TextCtrl(self.dataDisplay,-1,value='%.2f'%(data['Marquardt']),style=wx.TE_PROCESS_ENTER)
525    Marq.Bind(wx.EVT_TEXT_ENTER,OnMarquardt)
526    Marq.Bind(wx.EVT_KILL_FOCUS,OnMarquardt)
527    LSSizer.Add(Marq,0,wx.ALIGN_CENTER_VERTICAL)
528    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Matrix band width: '),0,wx.ALIGN_CENTER_VERTICAL)
529    Band = wx.TextCtrl(self.dataDisplay,-1,value='%d'%(data['bandWidth']),style=wx.TE_PROCESS_ENTER)
530    Band.Bind(wx.EVT_TEXT_ENTER,OnBandWidth)
531    Band.Bind(wx.EVT_KILL_FOCUS,OnBandWidth)
532    LSSizer.Add(Band,0,wx.ALIGN_CENTER_VERTICAL)
533    Restraint = wx.CheckBox(self.dataDisplay,-1,label='Modify restraint weights?')
534    Restraint.Bind(wx.EVT_CHECKBOX, OnRestraint)
535    Restraint.SetValue(data['restraintWeight'])
536    LSSizer.Add(Restraint,0,wx.ALIGN_CENTER_VERTICAL)
537   
538   
539    mainSizer.Add(LSSizer)
540    mainSizer.Add((5,5),0)
541    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Density Map Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
542
543    mainSizer.Add((5,5),0)
544    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Distance/angle Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
545       
546    mainSizer.Layout()   
547    self.dataDisplay.SetSizer(mainSizer)
548    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
549    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
550     
551def UpdateComments(self,data):                   
552    self.dataFrame.SetLabel('Comments')
553    self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
554        style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
555    for line in data:
556        if line[-1] == '\n':
557            self.dataDisplay.AppendText(line)
558        else:
559            self.dataDisplay.AppendText(line+'\n')
560             
561def UpdateHKLControls(self,data):
562   
563    def OnScaleSlider(event):
564        scale = int(scaleSel.GetValue())/1000.
565        scaleSel.SetValue(int(scale*1000.))
566        data['Scale'] = scale*10.
567        G2plt.PlotSngl(self)
568       
569    def OnLayerSlider(event):
570        layer = layerSel.GetValue()
571        data['Layer'] = layer
572        G2plt.PlotSngl(self)
573       
574    def OnSelZone(event):
575        data['Zone'] = zoneSel.GetValue()
576        G2plt.PlotSngl(self,newPlot=True)
577       
578    def OnSelType(event):
579        data['Type'] = typeSel.GetValue()
580        G2plt.PlotSngl(self)
581       
582    def SetStatusLine():
583        Status.SetStatusText("look at me!!!")
584                                     
585    if self.dataDisplay:
586        self.dataDisplay.Destroy()
587    if not self.dataFrame.GetStatusBar():
588        Status = self.dataFrame.CreateStatusBar()
589    SetStatusLine()
590    zones = ['100','010','001']
591    HKLmax = data['HKLmax']
592    HKLmin = data['HKLmin']
593    if data['ifFc']:
594        typeChoices = ['Fosq','Fo','|DFsq|/sig','|DFsq|>sig','|DFsq|>3sig']
595    else:
596        typeChoices = ['Fosq','Fo']
597    self.dataDisplay = wx.Panel(self.dataFrame)
598    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
599    mainSizer = wx.BoxSizer(wx.VERTICAL)
600    mainSizer.Add((5,10),0)
601   
602    scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
603    scaleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Scale'),0,
604        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
605    scaleSel = wx.Slider(parent=self.dataDisplay,maxValue=1000,minValue=100,
606        style=wx.SL_HORIZONTAL,value=int(data['Scale']*100))
607    scaleSizer.Add(scaleSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
608    scaleSel.SetLineSize(100)
609    scaleSel.SetPageSize(900)
610    scaleSel.Bind(wx.EVT_SLIDER, OnScaleSlider)
611    mainSizer.Add(scaleSizer,1,wx.EXPAND|wx.RIGHT)
612   
613    zoneSizer = wx.BoxSizer(wx.HORIZONTAL)
614    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Zone  '),0,
615        wx.ALIGN_CENTER_VERTICAL)
616    zoneSel = wx.ComboBox(parent=self.dataDisplay,value=data['Zone'],choices=['100','010','001'],
617        style=wx.CB_READONLY|wx.CB_DROPDOWN)
618    zoneSel.Bind(wx.EVT_COMBOBOX, OnSelZone)
619    zoneSizer.Add(zoneSel,0,wx.ALIGN_CENTER_VERTICAL)
620    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Plot type  '),0,
621        wx.ALIGN_CENTER_VERTICAL)       
622    typeSel = wx.ComboBox(parent=self.dataDisplay,value=data['Type'],choices=typeChoices,
623        style=wx.CB_READONLY|wx.CB_DROPDOWN)
624    typeSel.Bind(wx.EVT_COMBOBOX, OnSelType)
625    zoneSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
626    zoneSizer.Add((10,0),0)   
627    mainSizer.Add(zoneSizer,1,wx.EXPAND|wx.RIGHT)
628       
629    izone = zones.index(data['Zone'])
630    layerSizer = wx.BoxSizer(wx.HORIZONTAL)
631    layerSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Layer'),0,
632        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
633    layerSel = wx.Slider(parent=self.dataDisplay,maxValue=HKLmax[izone],minValue=HKLmin[izone],
634        style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS,value=0)
635    layerSel.SetLineSize(1)
636    layerSel.SetLineSize(5)
637    layerSel.Bind(wx.EVT_SLIDER, OnLayerSlider)   
638    layerSizer.Add(layerSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
639    layerSizer.Add((10,0),0)   
640    mainSizer.Add(layerSizer,1,wx.EXPAND|wx.RIGHT)
641
642       
643    mainSizer.Layout()   
644    self.dataDisplay.SetSizer(mainSizer)
645    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
646    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
647       
648                         
649def GetPatternTreeItemId(self, parentId, itemText):
650    item, cookie = self.PatternTree.GetFirstChild(parentId)
651    while item:
652        if self.PatternTree.GetItemText(item) == itemText:
653            return item
654        item, cookie = self.PatternTree.GetNextChild(parentId, cookie)
655    return 0               
656
657def MovePatternTreeToGrid(self,item):
658   
659    oldPage = 0
660    if self.dataFrame:
661        self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
662        if self.dataFrame.GetLabel() == 'Comments':
663            data = [self.dataDisplay.GetValue()]
664            self.dataDisplay.Clear() 
665            Id = GetPatternTreeItemId(self,self.root, 'Comments')
666            if Id: self.PatternTree.SetItemPyData(Id,data)
667        if self.dataFrame.GetLabel() == 'Notebook':
668            data = [self.dataDisplay.GetValue()]
669            self.dataDisplay.Clear() 
670            Id = GetPatternTreeItemId(self,self.root, 'Notebook')
671            if Id: self.PatternTree.SetItemPyData(Id,data)
672        if 'Phase Data for' in self.dataFrame.GetLabel():
673            if self.dataDisplay: 
674                oldPage = self.dataDisplay.GetSelection()
675        self.dataFrame.Clear()
676        self.dataFrame.SetLabel('')
677    else:
678       self.dataFrame = DataFrame(parent=self.mainPanel)
679
680    self.dataFrame.Raise()           
681    self.PickId = 0
682    parentID = self.root
683    self.ExportPattern.Enable(False)
684    if item != self.root:
685        parentID = self.PatternTree.GetItemParent(item)
686    if self.PatternTree.GetItemParent(item) == self.root:
687        self.PatternId = item
688        self.PickId = item
689        if self.PatternTree.GetItemText(item) == 'Notebook':
690            self.PatternId = 0
691            self.ExportPattern.Enable(False)
692            data = self.PatternTree.GetItemPyData(item)
693            UpdateNotebook(self,data)
694        elif self.PatternTree.GetItemText(item) == 'Controls':
695            self.PatternId = 0
696            self.ExportPattern.Enable(False)
697            data = self.PatternTree.GetItemPyData(item)
698            if data == [0] or data == {}:           #fill in defaults
699                data = {
700                    #least squares controls
701                    'Ncycles':3,'maxShift':2.0,'bandWidth':0,'Marquardt':1.0,'restraintWeight':False,
702                    'minSumShftESD':0.01,
703                    #Fourier controls
704                    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
705                    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
706                    #distance/angle controls
707                    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
708                self.PatternTree.SetItemPyData(item,data)                             
709            self.Refine.Enable(True)
710            UpdateControls(self,data)
711        elif 'IMG' in self.PatternTree.GetItemText(item):
712            self.Image = item
713            G2plt.PlotImage(self,newPlot=True)
714        elif 'PKS' in self.PatternTree.GetItemText(item):
715            G2plt.PlotPowderLines(self)
716        elif 'PWDR' in self.PatternTree.GetItemText(item):           
717            self.ExportPattern.Enable(True)
718            G2plt.PlotPatterns(self,newPlot=True)
719        elif 'HKLF' in self.PatternTree.GetItemText(item):
720            self.Sngl = item
721            G2plt.PlotSngl(self,newPlot=True)
722           
723    elif self.PatternTree.GetItemText(parentID) == 'Phases':
724        self.PickId = item
725        data = self.PatternTree.GetItemPyData(item)           
726        G2phG.UpdatePhaseData(self,item,data,oldPage)
727    elif self.PatternTree.GetItemText(item) == 'Comments':
728        self.PatternId = self.PatternTree.GetItemParent(item)
729        self.PickId = item
730        data = self.PatternTree.GetItemPyData(item)
731        UpdateComments(self,data)
732    elif self.PatternTree.GetItemText(item) == 'Image Controls':
733        self.dataFrame.SetTitle('Image Controls')
734        self.PickId = item
735        self.Image = self.PatternTree.GetItemParent(item)
736        masks = self.PatternTree.GetItemPyData(
737            GetPatternTreeItemId(self,self.Image, 'Masks'))
738        data = self.PatternTree.GetItemPyData(item)
739        G2imG.UpdateImageControls(self,data,masks)
740        G2plt.PlotImage(self)
741    elif self.PatternTree.GetItemText(item) == 'Masks':
742        self.dataFrame.SetTitle('Masks')
743        self.PickId = item
744        self.Image = self.PatternTree.GetItemParent(item)
745        data = self.PatternTree.GetItemPyData(item)
746        G2imG.UpdateMasks(self,data)
747        G2plt.PlotImage(self)
748    elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
749        self.PickId = item
750        self.Sngl = self.PatternTree.GetItemParent(item)
751        data = self.PatternTree.GetItemPyData(item)
752        UpdateHKLControls(self,data)
753        G2plt.PlotSngl(self)               
754    elif self.PatternTree.GetItemText(item) == 'Peak List':
755        self.PatternId = self.PatternTree.GetItemParent(item)
756        self.ExportPeakList.Enable(True)
757        self.PickId = item
758        data = self.PatternTree.GetItemPyData(item)
759        G2pdG.UpdatePeakGrid(self,data)
760        G2plt.PlotPatterns(self)
761    elif self.PatternTree.GetItemText(item) == 'Background':
762        self.PatternId = self.PatternTree.GetItemParent(item)
763        self.PickId = item
764        data = self.PatternTree.GetItemPyData(item)
765        G2pdG.UpdateBackgroundGrid(self,data)
766        G2plt.PlotPatterns(self)
767    elif self.PatternTree.GetItemText(item) == 'Limits':
768        self.PatternId = self.PatternTree.GetItemParent(item)
769        self.PickId = item
770        data = self.PatternTree.GetItemPyData(item)
771        G2pdG.UpdateLimitsGrid(self,data)
772        G2plt.PlotPatterns(self)
773    elif self.PatternTree.GetItemText(item) == 'Instrument Parameters':
774        self.PatternId = self.PatternTree.GetItemParent(item)
775        self.PickId = item
776        data = self.PatternTree.GetItemPyData(item)
777        G2pdG.UpdateInstrumentGrid(self,data)
778        G2plt.PlotPeakWidths(self)
779    elif self.PatternTree.GetItemText(item) == 'Sample Parameters':
780        self.PatternId = self.PatternTree.GetItemParent(item)
781        self.PickId = item
782        data = self.PatternTree.GetItemPyData(item)
783
784        if 'Temperature' not in data:           #temp fix for old gpx files
785            data = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],'DisplaceX':[0.0,False],
786                'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,'Force':0.0}
787            self.PatternTree.SetItemPyData(item,data)
788   
789        G2pdG.UpdateSampleGrid(self,data)
790        G2plt.PlotPatterns(self)
791    elif self.PatternTree.GetItemText(item) == 'Index Peak List':
792        self.PatternId = self.PatternTree.GetItemParent(item)
793        self.ExportPeakList.Enable(True)
794        self.PickId = item
795        data = self.PatternTree.GetItemPyData(item)
796        G2pdG.UpdateIndexPeaksGrid(self,data)
797        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
798            G2plt.PlotPowderLines(self)
799        else:
800            G2plt.PlotPatterns(self)
801    elif self.PatternTree.GetItemText(item) == 'Unit Cells List':
802        self.PatternId = self.PatternTree.GetItemParent(item)
803        self.PickId = item
804        data = self.PatternTree.GetItemPyData(item)
805        if not data:
806            data.append([0,0.1,4,25.0,0,'P1',1,1,1,90,90,90]) #zero error flag, max zero error, max Nc/No, start volume
807            data.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0])      #Bravais lattice flags
808            data.append([])                                 #empty cell list
809            data.append([])                                 #empty dmin
810            self.PatternTree.SetItemPyData(item,data)                             
811        G2pdG.UpdateUnitCellsGrid(self,data)
812        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
813            G2plt.PlotPowderLines(self)
814        else:
815            G2plt.PlotPatterns(self)
Note: See TracBrowser for help on using the repository browser.