source: trunk/GSASIIgrid.py @ 254

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

removed "Save Integration"
rearranged stuff in the Image Controls window

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