source: trunk/GSASIIgrid.py @ 335

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

Add delete Pawley list; scratch "leBail" from things
mods to texture display stuff
refactor instrument parameters GUI as sizer based - no grid table
some mods to peak fit output

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