source: trunk/GSASIIgrid.py @ 265

Last change on this file since 265 was 265, checked in by vondreele, 11 years ago

further progress on implementing pdf calculations
optionally put legends on the pdf plots
attempt implementation of a rotation of the azimuth ranges for multiazimuth integrations -not fully successful

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