source: trunk/GSASIIgrid.py @ 406

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

implement background subtraction during image integration
implement copy for instrument parms & background
continue constraint GUI development
make sure proper updates in refinement/seq refinement

  • Property svn:keywords set to Date Author Revision URL Id
File size: 58.1 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-11-02 18:11:04 +0000 (Wed, 02 Nov 2011) $
4# $Author: vondreele $
5# $Revision: 406 $
6# $URL: trunk/GSASIIgrid.py $
7# $Id: GSASIIgrid.py 406 2011-11-02 18:11:04Z vondreele $
8########### SVN repository information ###################
9import wx
10import wx.grid as wg
11import time
12import cPickle
13import numpy as np
14import GSASIIpath
15import GSASIIplot as G2plt
16import GSASIIpwdGUI as G2pdG
17import GSASIIimgGUI as G2imG
18import GSASIIphsGUI as G2phG
19import GSASIIstruct as G2str
20import GSASIImapvars as G2mv
21
22[ wxID_ATOMSEDITADD, wxID_ATOMSEDITINSERT, wxID_ATOMSEDITDELETE, wxID_ATOMSREFINE, 
23    wxID_ATOMSMODIFY, wxID_ATOMSTRANSFORM, wxID_ATOMSTESTADD, wxID_ATONTESTINSERT,
24    wxID_RELOADDRAWATOMS,
25] = [wx.NewId() for _init_coll_Atom_Items in range(9)]
26
27[ wxID_PWDRADD, wxID_HKLFADD, wxID_DATADELETE,
28] = [wx.NewId() for _init_coll_Data_Items in range(3)]
29
30[ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWATOMCOLOR, wxID_DRAWATOMRESETCOLOR, 
31    wxID_DRAWVIEWPOINT, wxID_DRAWTRANSFORM, wxID_DRAWDELETE, wxID_DRAWFILLCELL, 
32    wxID_DRAWADDEQUIV, wxID_DRAWFILLCOORD,
33] = [wx.NewId() for _init_coll_DrawAtom_Items in range(10)]
34
35[ wxID_IMCALIBRATE,wxID_IMRECALIBRATE,wxID_IMINTEGRATE, wxID_IMCLEARCALIB, 
36    wxID_IMCOPYCONTROLS, wxID_INTEGRATEALL, wxID_IMSAVECONTROLS, wxID_IMLOADCONTROLS,
37] = [wx.NewId() for _init_coll_IMAGE_Items in range(8)]
38
39[ wxID_MASKCOPY, wxID_MASKSAVE, wxID_MASKLOAD,
40] = [wx.NewId() for _init_coll_MASK_Items in range(3)]
41
42[ wxID_PAWLEYLOAD, wxID_PAWLEYIMPORT, wxID_PAWLEYDELETE, wxID_PAWLEYESTIMATE,
43] = [wx.NewId() for _init_coll_PAWLEY_Items in range(4)]
44
45[ wxID_INSTPRMRESET,wxID_CHANGEWAVETYPE,wxID_INSTCOPY,
46] = [wx.NewId() for _init_coll_INST_Items in range(3)]
47
48[ wxID_INDXRELOAD,
49] = [wx.NewId() for _init_coll_IndPeaks_Items in range(1)]
50
51[ wxID_UNDO,wxID_LSQPEAKFIT,wxID_LSQONECYCLE,wxID_RESETSIGGAM,wxID_CLEARPEAKS,
52] = [wx.NewId() for _init_coll_PEAK_Items in range(5)]
53
54[  wxID_INDEXPEAKS, wxID_REFINECELL, wxID_COPYCELL, wxID_MAKENEWPHASE,
55] = [wx.NewId() for _init_coll_INDEX_Items in range(4)]
56
57[ wxID_BACKCOPY,
58] = [wx.NewId() for _init_coll_Back_Items in range(1)]
59
60[ wxID_SAMPLECOPY,
61] = [wx.NewId() for _init_coll_Sample_Items in range(1)]
62
63[ wxID_CONSTRAINTADD,
64] = [wx.NewId() for _init_coll_Constraint_Items in range(1)]
65
66[ wxID_RESTRAINTADD,
67] = [wx.NewId() for _init_coll_Restraint_Items in range(1)]
68
69[ wxID_SELECTPHASE,
70] = [wx.NewId() for _init_coll_Refl_Items in range(1)]
71
72[ wxID_CLEARTEXTURE,
73] = [wx.NewId() for _init_coll_Texture_Items in range(1)]
74
75[ wxID_PDFCOPYCONTROLS, wxID_PDFSAVECONTROLS, wxID_PDFLOADCONTROLS, 
76    wxID_PDFCOMPUTE, wxID_PDFCOMPUTEALL, wxID_PDFADDELEMENT, wxID_PDFDELELEMENT,
77] = [wx.NewId() for _init_coll_PDF_Items in range(7)]
78
79VERY_LIGHT_GREY = wx.Colour(235,235,235)
80
81class DataFrame(wx.Frame):
82    def _init_coll_BlankMenu(self,parent):
83        parent.Append(menu=self.Blank,title='')
84       
85    def _init_coll_AtomsMenu(self,parent):
86        parent.Append(menu=self.AtomEdit, title='Edit')
87       
88    def _init_coll_ConstraintMenu(self,parent):
89        parent.Append(menu=self.ConstraintEdit, title='Edit')
90       
91    def _init_coll_RestraintMenu(self,parent):
92        parent.Append(menu=self.RestraintEdit, title='Edit')
93       
94    def _init_coll_DataMenu(self,parent):
95        parent.Append(menu=self.DataEdit, title='Edit')
96       
97    def _init_coll_DrawAtomsMenu(self,parent):
98        parent.Append(menu=self.DrawAtomEdit, title='Edit')
99
100    def _init_coll_PawleyMenu(self,parent):
101        parent.Append(menu=self.PawleyEdit,title='Operations')
102     
103    def _init_coll_IndPeaksMenu(self,parent):
104        parent.Append(menu=self.IndPeaksEdit,title='Operations')
105                   
106    def _init_coll_ImageMenu(self,parent):
107        parent.Append(menu=self.ImageEdit, title='Operations')
108       
109    def _init_coll_BackMenu(self,parent):
110        parent.Append(menu=self.BackEdit, title='File')
111       
112    def _init_coll_InstMenu(self,parent):
113        parent.Append(menu=self.InstEdit, title='Operations')
114       
115    def _init_coll_MaskMenu(self,parent):
116        parent.Append(menu=self.MaskEdit, title='Operations')
117       
118    def _init_coll_SampleMenu(self,parent):
119        parent.Append(menu=self.SampleEdit, title='File')
120       
121    def _init_coll_PeakMenu(self,parent):
122        parent.Append(menu=self.PeakEdit, title='Peak Fitting')
123
124    def _init_coll_IndexMenu(self,parent):
125        parent.Append(menu=self.IndexEdit, title='Cell Index/Refine')
126       
127    def _init_coll_ReflMenu(self,parent):
128        parent.Append(menu=self.ReflEdit, title='Reflection List')
129
130    def _init_coll_TextureMenu(self,parent):
131        parent.Append(menu=self.TextureEdit, title='Texture')
132
133    def _init_coll_PDFMenu(self,parent):
134        parent.Append(menu=self.PDFEdit, title='PDF Controls')
135
136    def _init_coll_Atom_Items(self,parent):
137        parent.Append(id=wxID_ATOMSEDITADD, kind=wx.ITEM_NORMAL,text='Append atom',
138            help='Inserted as an H atom')
139        parent.Append(id=wxID_ATOMSTESTADD, kind=wx.ITEM_NORMAL,text='Append test point',
140            help='Inserted as an H atom')
141        parent.Append(id=wxID_ATOMSEDITINSERT, kind=wx.ITEM_NORMAL,text='Insert atom',
142            help='Select atom row to insert before; inserted as an H atom')
143        parent.Append(id=wxID_ATONTESTINSERT, kind=wx.ITEM_NORMAL,text='Insert test point',
144            help='Select atom row to insert before; inserted as an H atom')
145        parent.Append(id=wxID_ATOMSEDITDELETE, kind=wx.ITEM_NORMAL,text='Delete atom',
146            help='Select atoms to delete first')
147        parent.Append(id=wxID_ATOMSREFINE, kind=wx.ITEM_NORMAL,text='Set atom refinement flags',
148            help='Select atoms to refine first')
149        parent.Append(id=wxID_ATOMSMODIFY, kind=wx.ITEM_NORMAL,text='Modify atom parameters',
150            help='Select atoms to modify first')
151        parent.Append(id=wxID_ATOMSTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
152            help='Select atoms to transform first')
153        parent.Append(id=wxID_RELOADDRAWATOMS, kind=wx.ITEM_NORMAL,text='Reload draw atoms',
154            help='Reload atom drawing list')
155           
156    def _init_coll_Constraint_Items(self,parent):
157        parent.Append(id=wxID_CONSTRAINTADD, kind=wx.ITEM_NORMAL,text='Add constraint',
158            help='constraint dummy menu item')
159       
160    def _init_coll_Restraint_Items(self,parent):
161        parent.Append(id=wxID_RESTRAINTADD, kind=wx.ITEM_NORMAL,text='Add restraint',
162            help='restraint dummy menu item')
163                   
164    def _init_coll_Sample_Items(self,parent):
165        parent.Append(id=wxID_SAMPLECOPY, kind=wx.ITEM_NORMAL,text='Copy',
166            help='Copy refinable sample parameters to other histograms')
167                   
168    def _init_coll_Back_Items(self,parent):
169        parent.Append(id=wxID_BACKCOPY, kind=wx.ITEM_NORMAL,text='Copy',
170            help='Copy background parameters to other histograms')
171                   
172    def _init_coll_Data_Items(self,parent):
173        parent.Append(id=wxID_PWDRADD, kind=wx.ITEM_NORMAL,text='Add powder histograms',
174            help='Select new powder histograms to be used for this phase')
175        parent.Append(id=wxID_HKLFADD, kind=wx.ITEM_NORMAL,text='Add single crystal histograms',
176            help='Select new single crystal histograms to be used for this phase')
177        parent.Append(id=wxID_DATADELETE, kind=wx.ITEM_NORMAL,text='Delete histograms',
178            help='Delete histograms from use for this phase')
179
180    def _init_coll_Texture_Items(self,parent):
181        self.ClearPeaks = parent.Append(id=wxID_CLEARTEXTURE, kind=wx.ITEM_NORMAL,text='Clear texture', 
182            help='Clear the texture coefficients' )
183           
184    def _init_coll_DrawAtom_Items(self,parent):
185        parent.Append(id=wxID_DRAWATOMSTYLE, kind=wx.ITEM_NORMAL,text='Atom style',
186            help='Select atoms first')
187        parent.Append(id=wxID_DRAWATOMLABEL, kind=wx.ITEM_NORMAL,text='Atom label',
188            help='Select atoms first')
189        parent.Append(id=wxID_DRAWATOMCOLOR, kind=wx.ITEM_NORMAL,text='Atom color',
190            help='Select atoms first')
191        parent.Append(id=wxID_DRAWATOMRESETCOLOR, kind=wx.ITEM_NORMAL,text='Reset atom colors',
192            help='Resets all atom colors to defaults')
193        parent.Append(id=wxID_DRAWVIEWPOINT, kind=wx.ITEM_NORMAL,text='View point',
194            help='View point is 1st atom selected')
195        parent.Append(id=wxID_DRAWADDEQUIV, kind=wx.ITEM_NORMAL,text='Add atoms',
196            help='Add symmetry & cell equivalents to drawing set from selected atoms')
197        parent.Append(id=wxID_DRAWTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
198            help='Transform selected atoms by symmetry & cell translations')
199        parent.Append(id=wxID_DRAWFILLCOORD, kind=wx.ITEM_NORMAL,text='Fill CN-sphere',
200            help='Fill coordination sphere for selected atoms')           
201        parent.Append(id=wxID_DRAWFILLCELL, kind=wx.ITEM_NORMAL,text='Fill unit cell',
202            help='Fill unit cell with selected atoms')
203        parent.Append(id=wxID_DRAWDELETE, kind=wx.ITEM_NORMAL,text='Delete atoms',
204            help='Delete atoms from drawing set')
205
206    def _init_coll_Pawley_Items(self,parent):
207        parent.Append(id=wxID_PAWLEYLOAD, kind=wx.ITEM_NORMAL,text='Pawley create',
208            help='Initialize Pawley reflection list')
209#        parent.Append(id=wxID_PAWLEYIMPORT, kind=wx.ITEM_NORMAL,text='Pawley import',
210#            help='Import Pawley reflection list')
211        parent.Append(id=wxID_PAWLEYESTIMATE, kind=wx.ITEM_NORMAL,text='Pawley estimate',
212            help='Estimate initial Pawley intensities')
213        parent.Append(id=wxID_PAWLEYDELETE, kind=wx.ITEM_NORMAL,text='Pawley delete',
214            help='Delete Pawley reflection list')
215
216    def _init_coll_IndPeaks_Items(self,parent):
217        parent.Append(help='Load/Reload index peaks from peak list',id=wxID_INDXRELOAD, 
218            kind=wx.ITEM_NORMAL,text='Load/Reload')
219           
220    def _init_coll_Refl_Items(self,parent):
221        self.SelectPhase = parent.Append(help='Select phase for reflection list',id=wxID_SELECTPHASE, 
222            kind=wx.ITEM_NORMAL,text='Select phase')
223           
224    def _init_coll_Image_Items(self,parent):
225        parent.Append(help='Calibrate detector by fitting to calibrant lines', 
226            id=wxID_IMCALIBRATE, kind=wx.ITEM_NORMAL,text='Calibrate')
227        parent.Append(help='Recalibrate detector by fitting to calibrant lines', 
228            id=wxID_IMRECALIBRATE, kind=wx.ITEM_NORMAL,text='Realibrate')
229        parent.Append(help='Clear calibration data points and rings',id=wxID_IMCLEARCALIB, 
230            kind=wx.ITEM_NORMAL,text='Clear calibration')
231        parent.Append(help='Integrate selected image',id=wxID_IMINTEGRATE, 
232            kind=wx.ITEM_NORMAL,text='Integrate')
233        parent.Append(help='Integrate all images selected from list',id=wxID_INTEGRATEALL,
234            kind=wx.ITEM_NORMAL,text='Integrate all')
235        parent.Append(help='Copy image controls to other images', 
236            id=wxID_IMCOPYCONTROLS, kind=wx.ITEM_NORMAL,text='Copy Controls')
237        parent.Append(help='Save image controls to file', 
238            id=wxID_IMSAVECONTROLS, kind=wx.ITEM_NORMAL,text='Save Controls')
239        parent.Append(help='Load image controls from file', 
240            id=wxID_IMLOADCONTROLS, kind=wx.ITEM_NORMAL,text='Load Controls')
241
242                   
243    def _init_coll_Mask_Items(self,parent):
244        parent.Append(help='Copy mask to other images', 
245            id=wxID_MASKCOPY, kind=wx.ITEM_NORMAL,text='Copy mask')
246        parent.Append(help='Save mask to file', 
247            id=wxID_MASKSAVE, kind=wx.ITEM_NORMAL,text='Save mask')
248        parent.Append(help='Load mask from file', 
249            id=wxID_MASKLOAD, kind=wx.ITEM_NORMAL,text='Load mask')
250
251    def _init_coll_Inst_Items(self,parent):
252        parent.Append(help='Reset instrument profile parameters to default', 
253            id=wxID_INSTPRMRESET, kind=wx.ITEM_NORMAL,text='Reset profile')
254        parent.Append(help='Copy instrument profile parameters to other histograms', 
255            id=wxID_INSTCOPY, kind=wx.ITEM_NORMAL,text='Copy')       
256        parent.Append(help='Change radiation type (Ka12 - synch)', 
257            id=wxID_CHANGEWAVETYPE, kind=wx.ITEM_NORMAL,text='Change radiation')
258
259    def _init_coll_Peak_Items(self,parent):
260        self.UnDo = parent.Append(help='Undo last least squares refinement', 
261            id=wxID_UNDO, kind=wx.ITEM_NORMAL,text='UnDo')
262        self.PeakFit = parent.Append(id=wxID_LSQPEAKFIT, kind=wx.ITEM_NORMAL,text='LSQ PeakFit', 
263            help='Peak fitting via least-squares' )
264        self.PFOneCycle = parent.Append(id=wxID_LSQONECYCLE, kind=wx.ITEM_NORMAL,text='LSQ one cycle', 
265            help='One cycle of Peak fitting via least-squares' )
266        self.ResetSigGam = parent.Append(id=wxID_RESETSIGGAM, kind=wx.ITEM_NORMAL, 
267            text='Reset sig and gam',help='Reset sigma and gamma to global fit' )
268        self.ClearPeaks = parent.Append(id=wxID_CLEARPEAKS, kind=wx.ITEM_NORMAL,text='Clear peaks', 
269            help='Clear the peak list' )
270           
271    def _init_coll_Index_Items(self,parent):
272        self.IndexPeaks = parent.Append(help='', id=wxID_INDEXPEAKS, kind=wx.ITEM_NORMAL,
273            text='Index Cell')
274        self.CopyCell = parent.Append( id=wxID_COPYCELL, kind=wx.ITEM_NORMAL,text='Copy Cell', 
275            help='Copy selected unit cell from indexing to cell refinement fields')
276        self.RefineCell = parent.Append( id=wxID_REFINECELL, kind=wx.ITEM_NORMAL, 
277            text='Refine Cell',help='Refine unit cell parameters from indexed peaks')
278        self.MakeNewPhase = parent.Append( id=wxID_MAKENEWPHASE, kind=wx.ITEM_NORMAL,
279            text='Make new phase',help='Make new phase from selected unit cell')
280           
281    def _init_coll_PDF_Items(self,parent):
282        parent.Append(help='Add element to sample composition',id=wxID_PDFADDELEMENT, kind=wx.ITEM_NORMAL,
283            text='Add element')
284        parent.Append(help='Delete element from sample composition',id=wxID_PDFDELELEMENT, kind=wx.ITEM_NORMAL,
285            text='Delete element')
286        parent.Append(help='Copy PDF controls', id=wxID_PDFCOPYCONTROLS, kind=wx.ITEM_NORMAL,
287            text='Copy controls')
288#        parent.Append(help='Load PDF controls from file',id=wxID_PDFLOADCONTROLS, kind=wx.ITEM_NORMAL,
289#            text='Load Controls')
290#        parent.Append(help='Save PDF controls to file', id=wxID_PDFSAVECONTROLS, kind=wx.ITEM_NORMAL,
291#            text='Save controls')
292        self.PDFCompute = parent.Append(help='Compute PDF', id=wxID_PDFCOMPUTE, kind=wx.ITEM_NORMAL,
293            text='Compute PDF')
294        self.PDFCompute = parent.Append(help='Compute all PDFs', id=wxID_PDFCOMPUTEALL, kind=wx.ITEM_NORMAL,
295            text='Compute all PDFs')
296       
297
298    def _init_utils(self):
299        self.BlankMenu = wx.MenuBar()
300       
301        self.AtomsMenu = wx.MenuBar()
302        self.ConstraintMenu = wx.MenuBar()
303        self.RestraintMenu = wx.MenuBar()
304        self.DataMenu = wx.MenuBar()
305        self.TextureMenu = wx.MenuBar()
306        self.DrawAtomsMenu = wx.MenuBar()
307        self.PawleyMenu = wx.MenuBar()
308        self.ImageMenu = wx.MenuBar()
309        self.MaskMenu = wx.MenuBar()
310        self.BackMenu = wx.MenuBar()
311        self.InstMenu = wx.MenuBar()
312        self.SampleMenu = wx.MenuBar()
313        self.PeakMenu = wx.MenuBar()
314        self.IndPeaksMenu = wx.MenuBar()
315        self.IndexMenu = wx.MenuBar()
316        self.ReflMenu = wx.MenuBar()
317        self.PDFMenu = wx.MenuBar()
318        self.AtomEdit = wx.Menu(title='')
319        self.ConstraintEdit = wx.Menu(title='')
320        self.RestraintEdit = wx.Menu(title='')
321        self.DataEdit = wx.Menu(title='')
322        self.TextureEdit = wx.Menu(title='')
323        self.DrawAtomEdit = wx.Menu(title='')
324        self.PawleyEdit = wx.Menu(title='')
325        self.ImageEdit = wx.Menu(title='')
326        self.MaskEdit = wx.Menu(title='')
327        self.BackEdit = wx.Menu(title='')
328        self.InstEdit = wx.Menu(title='')
329        self.SampleEdit = wx.Menu(title='')
330        self.PeakEdit = wx.Menu(title='')
331        self.IndPeaksEdit = wx.Menu(title='')
332        self.IndexEdit = wx.Menu(title='')
333        self.ReflEdit = wx.Menu(title='')
334        self.PDFEdit = wx.Menu(title='')
335        self._init_coll_AtomsMenu(self.AtomsMenu)
336        self._init_coll_Atom_Items(self.AtomEdit)
337        self._init_coll_ConstraintMenu(self.ConstraintMenu)
338        self._init_coll_Constraint_Items(self.ConstraintEdit)
339        self._init_coll_RestraintMenu(self.RestraintMenu)
340        self._init_coll_Restraint_Items(self.RestraintEdit)
341        self._init_coll_DataMenu(self.DataMenu)
342        self._init_coll_Data_Items(self.DataEdit)
343        self._init_coll_TextureMenu(self.TextureMenu)
344        self._init_coll_Texture_Items(self.TextureEdit)
345        self._init_coll_DrawAtomsMenu(self.DrawAtomsMenu)
346        self._init_coll_DrawAtom_Items(self.DrawAtomEdit)
347        self._init_coll_PawleyMenu(self.PawleyMenu)
348        self._init_coll_Pawley_Items(self.PawleyEdit)
349        self._init_coll_ImageMenu(self.ImageMenu)
350        self._init_coll_Image_Items(self.ImageEdit)
351        self._init_coll_MaskMenu(self.MaskMenu)
352        self._init_coll_Mask_Items(self.MaskEdit)
353        self._init_coll_BackMenu(self.BackMenu)
354        self._init_coll_Back_Items(self.BackEdit)
355        self._init_coll_InstMenu(self.InstMenu)
356        self._init_coll_Inst_Items(self.InstEdit)
357        self._init_coll_SampleMenu(self.SampleMenu)
358        self._init_coll_Sample_Items(self.SampleEdit)
359        self._init_coll_PeakMenu(self.PeakMenu)
360        self._init_coll_Peak_Items(self.PeakEdit)
361        self._init_coll_IndPeaksMenu(self.IndPeaksMenu)
362        self._init_coll_IndPeaks_Items(self.IndPeaksEdit)
363        self._init_coll_IndexMenu(self.IndexMenu)
364        self._init_coll_Index_Items(self.IndexEdit)
365        self._init_coll_ReflMenu(self.ReflMenu)
366        self._init_coll_Refl_Items(self.ReflEdit)
367        self._init_coll_PDFMenu(self.PDFMenu)
368        self._init_coll_PDF_Items(self.PDFEdit)
369        self.UnDo.Enable(False)
370        self.PeakFit.Enable(False)
371        self.PFOneCycle.Enable(False)
372        self.IndexPeaks.Enable(False)
373        self.CopyCell.Enable(False)
374        self.RefineCell.Enable(False)
375        self.MakeNewPhase.Enable(False)
376       
377    def _init_ctrls(self, parent,name=None,size=None,pos=None):
378        wx.Frame.__init__(self,parent=parent,style=wx.DEFAULT_FRAME_STYLE ^ wx.CLOSE_BOX,
379            size=size,pos=pos,title='GSAS-II data display')
380        self._init_utils()
381        if name:
382            self.SetLabel(name)
383        self.Show()
384       
385    def __init__(self,parent,data=None,name=None, size=None,pos=None):
386        self._init_ctrls(parent,name,size,pos)
387        self.data = data
388        clientSize = wx.ClientDisplayRect()
389        Size = self.GetSize()
390        xPos = clientSize[2]-Size[0]
391        self.SetPosition(wx.Point(xPos,clientSize[1]+250))
392        self.dirname = ''
393        self.AtomGrid = []
394        self.selectedRow = 0
395       
396    def setSizePosLeft(self,Width):
397        clientSize = wx.ClientDisplayRect()
398        Width[1] = min(Width[1],clientSize[2]-300)
399        Width[0] = max(Width[0],300)
400        self.SetSize(Width)
401        self.SetPosition(wx.Point(clientSize[2]-Width[0],clientSize[1]+250))
402       
403    def Clear(self):
404        self.ClearBackground()
405        self.DestroyChildren()
406                   
407class GSNoteBook(wx.Notebook):
408    def __init__(self, parent, name='',size = None):
409        wx.Notebook.__init__(self, parent, -1, name=name, style= wx.BK_TOP)
410        if size: self.SetSize(size)
411                                                     
412    def Clear(self):       
413        GSNoteBook.DeleteAllPages(self)
414       
415    def FindPage(self,name):
416        numPage = self.GetPageCount()
417        for page in range(numPage):
418            if self.GetPageText(page) == name:
419                return page
420       
421class GSGrid(wg.Grid):
422    def __init__(self, parent, name=''):
423        wg.Grid.__init__(self,parent,-1,name=name)                   
424        self.SetSize(parent.GetClientSize())
425           
426    def Clear(self):
427        wg.Grid.ClearGrid(self)
428       
429    def SetCellStyle(self,r,c,color="white",readonly=True):
430        self.SetCellBackgroundColour(r,c,color)
431        self.SetReadOnly(r,c,isReadOnly=readonly)
432       
433    def GetSelection(self):
434        #this is to satisfy structure drawing stuff in G2plt when focus changes
435        return None
436                       
437class Table(wg.PyGridTableBase):
438    def __init__(self, data=[], rowLabels=None, colLabels=None, types = None):
439        wg.PyGridTableBase.__init__(self)
440        self.colLabels = colLabels
441        self.rowLabels = rowLabels
442        self.dataTypes = types
443        self.data = data
444       
445    def AppendRows(self, numRows=1):
446        self.data.append([])
447        return True
448       
449    def CanGetValueAs(self, row, col, typeName):
450        if self.dataTypes:
451            colType = self.dataTypes[col].split(':')[0]
452            if typeName == colType:
453                return True
454            else:
455                return False
456        else:
457            return False
458
459    def CanSetValueAs(self, row, col, typeName):
460        return self.CanGetValueAs(row, col, typeName)
461
462    def DeleteRow(self,pos):
463        data = self.GetData()
464        self.SetData([])
465        new = []
466        for irow,row in enumerate(data):
467            if irow <> pos:
468                new.append(row)
469        self.SetData(new)
470       
471    def GetColLabelValue(self, col):
472        if self.colLabels:
473            return self.colLabels[col]
474           
475    def GetData(self):
476        data = []
477        for row in range(self.GetNumberRows()):
478            data.append(self.GetRowValues(row))
479        return data
480       
481    def GetNumberCols(self):
482        try:
483            return len(self.colLabels)
484        except TypeError:
485            return None
486       
487    def GetNumberRows(self):
488        return len(self.data)
489       
490    def GetRowLabelValue(self, row):
491        if self.rowLabels:
492            return self.rowLabels[row]
493       
494    def GetColValues(self, col):
495        data = []
496        for row in range(self.GetNumberRows()):
497            data.append(self.GetValue(row, col))
498        return data
499       
500    def GetRowValues(self, row):
501        data = []
502        for col in range(self.GetNumberCols()):
503            data.append(self.GetValue(row, col))
504        return data
505       
506    def GetTypeName(self, row, col):
507        try:
508            return self.dataTypes[col]
509        except TypeError:
510            return None
511
512    def GetValue(self, row, col):
513        try:
514            return self.data[row][col]
515        except IndexError:
516            return None
517           
518    def InsertRows(self, pos, rows):
519        for row in range(rows):
520            self.data.insert(pos,[])
521            pos += 1
522       
523    def IsEmptyCell(self,row,col):
524        try:
525            return not self.data[row][col]
526        except IndexError:
527            return True
528       
529    def OnKeyPress(self, event):
530        dellist = self.GetSelectedRows()
531        if event.GetKeyCode() == wx.WXK_DELETE and dellist:
532            grid = self.GetView()
533            for i in dellist: grid.DeleteRow(i)
534               
535    def SetColLabelValue(self, col, label):
536        numcols = self.GetNumberCols()
537        if col > numcols-1:
538            self.colLabels.append(label)
539        else:
540            self.colLabels[col]=label
541       
542    def SetData(self,data):
543        for row in range(len(data)):
544            self.SetRowValues(row,data[row])
545               
546    def SetRowLabelValue(self, row, label):
547        self.rowLabels[row]=label
548           
549    def SetRowValues(self,row,data):
550        self.data[row] = data
551           
552    def SetValue(self, row, col, value):
553        def innerSetValue(row, col, value):
554            try:
555                self.data[row][col] = value
556            except TypeError:
557                return
558            except IndexError:
559                print row,col,value
560                # add a new row
561                if row > self.GetNumberRows():
562                    self.data.append([''] * self.GetNumberCols())
563                elif col > self.GetNumberCols():
564                    for row in range(self.GetNumberRows):
565                        self.data[row].append('')
566                print self.data
567                self.data[row][col] = value
568        innerSetValue(row, col, value)
569               
570def UpdateNotebook(self,data):       
571    if data:
572        self.dataFrame.SetLabel('Notebook')
573        self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
574            style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
575        for line in data:
576            self.dataDisplay.AppendText(line+"\n")
577            self.dataDisplay.AppendText('Notebook entry @ '+time.ctime()+"\n")
578           
579def UpdateControls(self,data):
580    #patch
581    if 'deriv type' not in data:
582        data = {}
583        data['deriv type'] = 'analytical'
584        data['min dM/M'] = 0.0001
585        data['shift factor'] = 1.
586    if 'shift factor' not in data:
587        data['shift factor'] = 1.       
588    #end patch
589    '''
590    #Fourier controls
591    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
592    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
593    #distance/angle controls
594    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
595    '''
596       
597    def SetStatusLine(text):
598        Status.SetStatusText(text)                                     
599       
600    def OnConvergence(event):
601        try:
602            value = max(1.e-9,min(1.0,float(Cnvrg.GetValue())))
603        except ValueError:
604            value = 0.0001
605        data['min dM/M'] = value
606        Cnvrg.SetValue('%.2g'%(value))
607       
608    def OnDerivType(event):
609        data['deriv type'] = derivSel.GetValue()
610        derivSel.SetValue(data['deriv type'])
611       
612    def OnFactor(event):
613        try:
614            value = min(max(float(Factr.GetValue()),0.00001),100.)
615        except ValueError:
616            value = 1.0
617        data['shift factor'] = value
618        Factr.SetValue('%.5f'%(value))
619       
620    def OnSelectData(event):
621        choices = ['All',]+GetPatternTreeDataNames(self,['PWDR',])
622        sel = []
623        if 'Seq Data' in data:
624            for item in data['Seq Data']:
625                sel.append(choices.index(item))
626        names = []
627        dlg = wx.MultiChoiceDialog(self,'Select data:','Sequential refinement',choices)
628        dlg.SetSelections(sel)
629        if dlg.ShowModal() == wx.ID_OK:
630            sel = dlg.GetSelections()
631            for i in sel: names.append(choices[i])
632            if 'All' in names:
633                names = choices[1:]
634               
635        dlg.Destroy()
636        data['Seq Data'] = names
637        reverseSel.Enable(True)
638       
639    def OnReverse(event):
640        data['Reverse Seq'] = reverseSel.GetValue()
641       
642    if self.dataDisplay:
643        self.dataDisplay.Destroy()
644    if not self.dataFrame.GetStatusBar():
645        Status = self.dataFrame.CreateStatusBar()
646    SetStatusLine('')
647    self.dataFrame.SetLabel('Controls')
648    self.dataDisplay = wx.Panel(self.dataFrame)
649    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
650    mainSizer = wx.BoxSizer(wx.VERTICAL)
651    mainSizer.Add((5,5),0)
652    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
653    LSSizer = wx.FlexGridSizer(cols=6,vgap=5,hgap=5)
654    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement derivatives: '),0,wx.ALIGN_CENTER_VERTICAL)
655    Choice=['analytic','numeric']
656    derivSel = wx.ComboBox(parent=self.dataDisplay,value=data['deriv type'],choices=Choice,
657        style=wx.CB_READONLY|wx.CB_DROPDOWN)
658    derivSel.SetValue(data['deriv type'])
659    derivSel.Bind(wx.EVT_COMBOBOX, OnDerivType)   
660    LSSizer.Add(derivSel,0,wx.ALIGN_CENTER_VERTICAL)
661    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Min delta-M/M: '),0,wx.ALIGN_CENTER_VERTICAL)
662    Cnvrg = wx.TextCtrl(self.dataDisplay,-1,value='%.2g'%(data['min dM/M']),style=wx.TE_PROCESS_ENTER)
663    Cnvrg.Bind(wx.EVT_TEXT_ENTER,OnConvergence)
664    Cnvrg.Bind(wx.EVT_KILL_FOCUS,OnConvergence)
665    LSSizer.Add(Cnvrg,0,wx.ALIGN_CENTER_VERTICAL)
666    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Initial shift factor: '),0,wx.ALIGN_CENTER_VERTICAL)
667    Factr = wx.TextCtrl(self.dataDisplay,-1,value='%.5f'%(data['shift factor']),style=wx.TE_PROCESS_ENTER)
668    Factr.Bind(wx.EVT_TEXT_ENTER,OnFactor)
669    Factr.Bind(wx.EVT_KILL_FOCUS,OnFactor)
670    LSSizer.Add(Factr,0,wx.ALIGN_CENTER_VERTICAL)
671    mainSizer.Add(LSSizer)
672    mainSizer.Add((5,5),0)
673   
674    SeqSizer = wx.BoxSizer(wx.HORIZONTAL)
675    SeqSizer.Add(wx.StaticText(self.dataDisplay,label=' Sequential Refinement Powder Data: '),0,wx.ALIGN_CENTER_VERTICAL)
676    selSeqData = wx.Button(self.dataDisplay,-1,label=' Select data')
677    selSeqData.Bind(wx.EVT_BUTTON,OnSelectData)
678    SeqSizer.Add(selSeqData,0,wx.ALIGN_CENTER_VERTICAL)
679    SeqSizer.Add((5,0),0)
680    reverseSel = wx.CheckBox(self.dataDisplay,-1,label=' Reverse order?')
681    reverseSel.Bind(wx.EVT_CHECKBOX,OnReverse)
682    if 'Seq Data' not in data:
683        reverseSel.Enable(False)
684    if 'Reverse Seq' in data:
685        reverseSel.SetValue(data['Reverse Seq'])
686    SeqSizer.Add(reverseSel,0,wx.ALIGN_CENTER_VERTICAL)
687   
688   
689    mainSizer.Add(SeqSizer)
690    mainSizer.Add((5,5),0)
691       
692    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Density Map Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
693
694    mainSizer.Add((5,5),0)
695    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Distance/angle Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
696       
697    mainSizer.Layout()   
698    self.dataDisplay.SetSizer(mainSizer)
699    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
700    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
701     
702def UpdateComments(self,data):                   
703    self.dataFrame.SetLabel('Comments')
704    self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
705        style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
706    for line in data:
707        if line[-1] == '\n':
708            self.dataDisplay.AppendText(line)
709        else:
710            self.dataDisplay.AppendText(line+'\n')
711           
712def UpdateSeqResults(self,data):
713    if not data:
714        print 'No sequential refinement results'
715        return
716    histNames = data['histNames']
717   
718    def GetSigData(parm):
719        sigData = []
720        for name in histNames:
721            sigList = data[name]['sig']
722            sigData.append(sigList[parm])
723        return sigData
724   
725    def Select(event):
726        cols = self.dataDisplay.GetSelectedCols()
727        rows = self.dataDisplay.GetSelectedRows()
728        if cols:
729            plotData = []
730            plotSig = []
731            plotNames = []
732            for col in cols:
733                plotData.append(self.SeqTable.GetColValues(col))
734                plotSig.append(GetSigData(col))
735                plotNames.append(self.SeqTable.GetColLabelValue(col))
736            plotData = np.array(plotData)
737            G2plt.PlotSeq(self,plotData,plotSig,plotNames)
738        elif rows:
739            name = histNames[rows[0]]
740            G2plt.PlotCovariance(self,Data=data[name])
741               
742    if self.dataDisplay:
743        self.dataDisplay.Destroy()
744    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
745    self.dataFrame.SetLabel('Sequental refinement results')
746    self.dataFrame.CreateStatusBar()
747    colLabels = data['varyList']
748    Types = len(data['varyList'])*[wg.GRID_VALUE_FLOAT,]
749    seqList = [list(data[name]['variables']) for name in histNames]
750    self.SeqTable = Table(seqList,colLabels=colLabels,rowLabels=histNames,types=Types)
751    self.dataDisplay = GSGrid(parent=self.dataFrame)
752    self.dataDisplay.SetTable(self.SeqTable, True)
753    self.dataDisplay.EnableEditing(False)
754    self.dataDisplay.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, Select)
755    self.dataDisplay.SetRowLabelSize(8*len(histNames[0]))       #pretty arbitrary 8
756    self.dataDisplay.SetMargins(0,0)
757    self.dataDisplay.AutoSizeColumns(True)
758    self.dataFrame.setSizePosLeft([700,350])
759               
760def UpdateConstraints(self,data):
761    if not data:
762        data.update({'Hist':[],'HAP':[],'Phase':[]})       #empty dict - fill it
763    Histograms,Phases = self.GetUsedHistogramsAndPhasesfromTree()
764    Natoms,phaseVary,phaseDict,pawleyLookup,FFtable = G2str.GetPhaseData(Phases,Print=False)       
765    hapVary,hapDict,controlDict = G2str.GetHistogramPhaseData(Phases,Histograms,Print=False)
766    histVary,histDict,controlDict = G2str.GetHistogramData(Histograms,Print=False)
767    Indx = {}
768    self.Page = 0
769   
770    def FindEquivVarb(name,nameList):
771        outList = []
772        for item in nameList:
773            key = item.split(':')[2]
774            if key in name and item != name:
775                outList.append(item)
776        return outList
777       
778    def SelectVarbs(FrstVarb,varList,legend):
779        #future -  add 'all:all:name', '0:all:name', etc. to the varList
780        dlg = wx.MultiChoiceDialog(self,'Select more variables:'+legend,FrstVarb+' and:',varList)
781        varbs = [FrstVarb,]
782        if dlg.ShowModal() == wx.ID_OK:
783            sel = dlg.GetSelections()
784            for x in sel:
785                varbs.append(varList[x])
786        dlg.Destroy()
787        if len(varbs) > 1:
788            return map(list,zip([1.0 for i in range(len(varbs))],varbs))
789        else:
790            return [[0.0,FrstVarb],]        #setup for "fix" of variable
791   
792    def OnAddConstraint(event):
793        constr = []
794        plegend = '\n In p::name'
795        hlegend = '\n In :h:name'
796        phlegend = '\n In p:h:name'
797        for phase in Phases:
798            plegend += '\n p:: = '+str(Phases[phase]['pId'])+':: for '+phase
799            for histogram in Phases[phase]['Histograms']:
800                phlegend += '\n p:h: = '+str(Phases[phase]['pId'])+':'+str(Histograms[histogram]['hId'])+': for '+phase+' in '+histogram
801        for histogram in Histograms:
802            hlegend += '\n :h: = :'+str(Histograms[histogram]['hId'])+': for '+histogram
803        page = self.Page
804        if 'Histogram ' in self.dataDisplay.GetPageText(page):
805            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+hlegend,'Histogram variables:',histVary)
806            if dlg.ShowModal() == wx.ID_OK:
807                sel = dlg.GetSelection()
808                FrstVarb = histVary[sel]
809                moreVarb = FindEquivVarb(FrstVarb,histVary)
810                constr = SelectVarbs(FrstVarb,moreVarb,hlegend)
811                constr += [0.0,True]        #constant & refine flag
812                data['Hist'].append(constr)
813            dlg.Destroy()
814            UpdateHistConstr()
815        elif '/Phase' in self.dataDisplay.GetPageText(page):
816            legend = 'Select 1st variable: \n '
817            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+phlegend,'HAP variables:',hapVary)
818            if dlg.ShowModal() == wx.ID_OK:
819                sel = dlg.GetSelection()
820                FrstVarb = hapVary[sel]
821                moreVarb = FindEquivVarb(FrstVarb,hapVary)
822                constr = SelectVarbs(FrstVarb,moreVarb,phlegend)
823                constr += [0.0,True]        #constant & refine flag
824                data['HAP'].append(constr)
825            dlg.Destroy()
826            UpdateHAPConstr()
827        elif 'Phase' in self.dataDisplay.GetPageText(page):
828            #maybe get atom name in phaseVary items?
829            for phase in Phases:
830                Phase = Phases[phase]
831                Atoms = Phase['Atoms']
832            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+plegend,'Phase variables:',phaseVary)
833            if dlg.ShowModal() == wx.ID_OK:
834                sel = dlg.GetSelection()
835                FrstVarb = phaseVary[sel]
836                moreVarb = FindEquivVarb(FrstVarb,phaseVary)
837                constr = SelectVarbs(FrstVarb,moreVarb,plegend+'\nIf none selected then '+FrstVarb+' is held fixed')
838                constr += [0.0,True]        #constant & refine flag
839                data['Phase'].append(constr)
840            dlg.Destroy()
841            UpdatePhaseConstr()
842           
843    def ConstSizer(name,pageDisplay):
844        constSizer = wx.FlexGridSizer(1,4,0,0)
845        for Id,item in enumerate(data[name]):
846            if len(item) < 4:
847                constSizer.Add((5,0),0)
848                eqString = ' FIXED   '+item[0][1]
849                constSizer.Add((5,0),0)
850            else:
851                constEdit = wx.Button(pageDisplay,-1,'Edit',style=wx.BU_EXACTFIT)
852                constEdit.Bind(wx.EVT_BUTTON,OnConstEdit)
853                Indx[constEdit.GetId()] = [Id,name]
854                constSizer.Add(constEdit)           
855                constRef = wx.CheckBox(pageDisplay,-1,label=' Refine?')
856                constRef.SetValue(item[-1])
857                constRef.Bind(wx.EVT_CHECKBOX,OnConstRef)
858                Indx[constRef.GetId()] = item
859                constSizer.Add(constRef,0,wx.ALIGN_CENTER_VERTICAL)
860                eqString = ''
861                for term in item[:-2]:
862                    eqString += '%+.3f*%s '%(term[0],term[1])
863                eqString += ' = %.3f'%(item[-2])
864            constSizer.Add(wx.StaticText(pageDisplay,-1,eqString),0,wx.ALIGN_CENTER_VERTICAL)
865            constDel = wx.Button(pageDisplay,-1,'Delete',style=wx.BU_EXACTFIT)
866            constDel.Bind(wx.EVT_BUTTON,OnConstDel)
867            Indx[constDel.GetId()] = [Id,name]
868            constSizer.Add(constDel)
869        return constSizer
870               
871    def OnConstRef(event):
872        Obj = event.GetEventObject()
873        Indx[Obj.GetId()][-1] = Obj.GetValue()
874       
875    def OnConstDel(event):
876        Obj = event.GetEventObject()
877        Id,name = Indx[Obj.GetId()]
878        del(data[name][Id])
879        OnPageChanged(event)       
880       
881    def OnConstEdit(event):
882        Obj = event.GetEventObject()
883        Id,name = Indx[Obj.GetId()]
884        const = data[name][Id][-2]
885        items = data[name][Id][:-2]+[[const,'= constant'],[]]
886        print items
887        dlg = self.SumDialog(self,'Constraint','Enter value for each term in constraint','',items)
888        try:
889            if dlg.ShowModal() == wx.ID_OK:
890                result = dlg.GetData()
891                print result
892                data[name][Id][:-2] = result[:-1]
893                data[name][Id][-2] = result[-2][0]
894        finally:
895            dlg.Destroy()           
896        OnPageChanged(event)       
897             
898   
899    def UpdateHAPConstr():
900        HAPConstr.DestroyChildren()
901        pageDisplay = wx.Panel(HAPConstr)
902        mainSizer = wx.BoxSizer(wx.VERTICAL)
903        mainSizer.Add((5,5),0)
904        mainSizer.Add(ConstSizer('HAP',pageDisplay))
905        pageDisplay.SetSizer(mainSizer)
906        Size = mainSizer.Fit(self.dataFrame)
907        Size[1] += 26                           #compensate for status bar
908        pageDisplay.SetSize(Size)
909        self.dataFrame.setSizePosLeft(Size)
910       
911    def UpdateHistConstr():
912        HistConstr.DestroyChildren()
913        pageDisplay = wx.Panel(HistConstr)
914        mainSizer = wx.BoxSizer(wx.VERTICAL)
915        mainSizer.Add((5,5),0)       
916        mainSizer.Add(ConstSizer('Hist',pageDisplay))
917        pageDisplay.SetSizer(mainSizer)
918        Size = mainSizer.Fit(self.dataFrame)
919        Size[1] += 26                           #compensate for status bar
920        pageDisplay.SetSize(Size)
921        self.dataFrame.setSizePosLeft(Size)
922       
923    def UpdatePhaseConstr():
924        PhaseConstr.DestroyChildren()
925        pageDisplay = wx.Panel(PhaseConstr)
926        mainSizer = wx.BoxSizer(wx.VERTICAL)
927        mainSizer.Add((5,5),0)       
928        mainSizer.Add(ConstSizer('Phase',pageDisplay))
929        pageDisplay.SetSizer(mainSizer)
930        Size = mainSizer.Fit(self.dataFrame)
931        Size[1] += 26                           #compensate for status bar
932        pageDisplay.SetSize(Size)
933        self.dataFrame.setSizePosLeft(Size)
934   
935    def OnPageChanged(event):
936        page = event.GetSelection()
937        self.Page = page
938        text = self.dataDisplay.GetPageText(page)
939        if text == 'Histogram/Phase constraints':
940            UpdateHAPConstr()
941        elif text == 'Histogram constraints':
942            UpdateHistConstr()
943        elif text == 'Phase constraints':
944            UpdatePhaseConstr()
945
946    if self.dataDisplay:
947        self.dataDisplay.Destroy()
948    self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
949    self.dataFrame.SetLabel('Constraints')
950    self.dataFrame.CreateStatusBar()
951    self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
952    self.dataFrame.Bind(wx.EVT_MENU, OnAddConstraint, id=wxID_CONSTRAINTADD)
953    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
954   
955    PhaseConstr = wx.ScrolledWindow(self.dataDisplay)
956    self.dataDisplay.AddPage(PhaseConstr,'Phase constraints')
957    HAPConstr = wx.ScrolledWindow(self.dataDisplay)
958    self.dataDisplay.AddPage(HAPConstr,'Histogram/Phase constraints')
959    HistConstr = wx.ScrolledWindow(self.dataDisplay)
960    self.dataDisplay.AddPage(HistConstr,'Histogram constraints')
961    UpdatePhaseConstr()
962
963    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
964   
965   
966def UpdateRestraints(self,data):
967
968    def OnAddRestraint(event):
969        page = self.dataDisplay.GetSelection()
970        print self.dataDisplay.GetPageText(page)
971
972    def UpdateAtomRestr():
973        AtomRestr.DestroyChildren()
974        dataDisplay = wx.Panel(AtomRestr)
975        mainSizer = wx.BoxSizer(wx.VERTICAL)
976        mainSizer.Add((5,5),0)
977        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Atom restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
978        mainSizer.Add((5,5),0)
979
980
981        dataDisplay.SetSizer(mainSizer)
982        Size = mainSizer.Fit(self.dataFrame)
983        Size[1] += 26                           #compensate for status bar
984        dataDisplay.SetSize(Size)
985        self.dataFrame.setSizePosLeft(Size)
986       
987    def UpdatePhaseRestr():
988        PhaseRestr.DestroyChildren()
989        dataDisplay = wx.Panel(PhaseRestr)
990        mainSizer = wx.BoxSizer(wx.VERTICAL)
991        mainSizer.Add((5,5),0)
992        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Phase restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
993        mainSizer.Add((5,5),0)
994
995
996        dataDisplay.SetSizer(mainSizer)
997        Size = mainSizer.Fit(self.dataFrame)
998        Size[1] += 26                           #compensate for status bar
999        dataDisplay.SetSize(Size)
1000        self.dataFrame.setSizePosLeft(Size)
1001   
1002    def OnPageChanged(event):
1003        page = event.GetSelection()
1004        text = self.dataDisplay.GetPageText(page)
1005        if text == 'Atom restraints':
1006            self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
1007            UpdateAtomRestr()
1008        elif text == 'Phase restraints':
1009            UpdatePhaseRestr()
1010            self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
1011        event.Skip()
1012
1013    if self.dataDisplay:
1014        self.dataDisplay.Destroy()
1015    self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
1016    self.dataFrame.SetLabel('restraints')
1017    self.dataFrame.CreateStatusBar()
1018    self.dataFrame.Bind(wx.EVT_MENU, OnAddRestraint, id=wxID_RESTRAINTADD)
1019    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
1020   
1021    PhaseRestr = wx.ScrolledWindow(self.dataDisplay)
1022    self.dataDisplay.AddPage(PhaseRestr,'Phase restraints')
1023    AtomRestr = wx.ScrolledWindow(self.dataDisplay)
1024    self.dataDisplay.AddPage(AtomRestr,'Atom restraints')
1025    UpdatePhaseRestr()
1026#    AtomRestrData = data['AtomRestr']
1027
1028    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)       
1029             
1030def UpdateHKLControls(self,data):
1031   
1032    def OnScaleSlider(event):
1033        scale = int(scaleSel.GetValue())/1000.
1034        scaleSel.SetValue(int(scale*1000.))
1035        data['Scale'] = scale*10.
1036        G2plt.PlotSngl(self)
1037       
1038    def OnLayerSlider(event):
1039        layer = layerSel.GetValue()
1040        data['Layer'] = layer
1041        G2plt.PlotSngl(self)
1042       
1043    def OnSelZone(event):
1044        data['Zone'] = zoneSel.GetValue()
1045        G2plt.PlotSngl(self,newPlot=True)
1046       
1047    def OnSelType(event):
1048        data['Type'] = typeSel.GetValue()
1049        G2plt.PlotSngl(self)
1050       
1051    def SetStatusLine():
1052        Status.SetStatusText("look at me!!!")
1053                                     
1054    if self.dataDisplay:
1055        self.dataDisplay.Destroy()
1056    if not self.dataFrame.GetStatusBar():
1057        Status = self.dataFrame.CreateStatusBar()
1058    SetStatusLine()
1059    zones = ['100','010','001']
1060    HKLmax = data['HKLmax']
1061    HKLmin = data['HKLmin']
1062    if data['ifFc']:
1063        typeChoices = ['Fosq','Fo','|DFsq|/sig','|DFsq|>sig','|DFsq|>3sig']
1064    else:
1065        typeChoices = ['Fosq','Fo']
1066    self.dataDisplay = wx.Panel(self.dataFrame)
1067    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1068    mainSizer = wx.BoxSizer(wx.VERTICAL)
1069    mainSizer.Add((5,10),0)
1070   
1071    scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
1072    scaleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Scale'),0,
1073        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1074    scaleSel = wx.Slider(parent=self.dataDisplay,maxValue=1000,minValue=100,
1075        style=wx.SL_HORIZONTAL,value=int(data['Scale']*100))
1076    scaleSizer.Add(scaleSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
1077    scaleSel.SetLineSize(100)
1078    scaleSel.SetPageSize(900)
1079    scaleSel.Bind(wx.EVT_SLIDER, OnScaleSlider)
1080    mainSizer.Add(scaleSizer,1,wx.EXPAND|wx.RIGHT)
1081   
1082    zoneSizer = wx.BoxSizer(wx.HORIZONTAL)
1083    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Zone  '),0,
1084        wx.ALIGN_CENTER_VERTICAL)
1085    zoneSel = wx.ComboBox(parent=self.dataDisplay,value=data['Zone'],choices=['100','010','001'],
1086        style=wx.CB_READONLY|wx.CB_DROPDOWN)
1087    zoneSel.Bind(wx.EVT_COMBOBOX, OnSelZone)
1088    zoneSizer.Add(zoneSel,0,wx.ALIGN_CENTER_VERTICAL)
1089    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Plot type  '),0,
1090        wx.ALIGN_CENTER_VERTICAL)       
1091    typeSel = wx.ComboBox(parent=self.dataDisplay,value=data['Type'],choices=typeChoices,
1092        style=wx.CB_READONLY|wx.CB_DROPDOWN)
1093    typeSel.Bind(wx.EVT_COMBOBOX, OnSelType)
1094    zoneSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
1095    zoneSizer.Add((10,0),0)   
1096    mainSizer.Add(zoneSizer,1,wx.EXPAND|wx.RIGHT)
1097       
1098    izone = zones.index(data['Zone'])
1099    layerSizer = wx.BoxSizer(wx.HORIZONTAL)
1100    layerSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Layer'),0,
1101        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
1102    layerSel = wx.Slider(parent=self.dataDisplay,maxValue=HKLmax[izone],minValue=HKLmin[izone],
1103        style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS,value=0)
1104    layerSel.SetLineSize(1)
1105    layerSel.SetLineSize(5)
1106    layerSel.Bind(wx.EVT_SLIDER, OnLayerSlider)   
1107    layerSizer.Add(layerSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
1108    layerSizer.Add((10,0),0)   
1109    mainSizer.Add(layerSizer,1,wx.EXPAND|wx.RIGHT)
1110
1111       
1112    mainSizer.Layout()   
1113    self.dataDisplay.SetSizer(mainSizer)
1114    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
1115    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
1116
1117def GetPatternTreeDataNames(self,dataTypes):
1118    names = []
1119    item, cookie = self.PatternTree.GetFirstChild(self.root)       
1120    while item:
1121        name = self.PatternTree.GetItemText(item)
1122        if name[:4] in dataTypes:
1123            names.append(name)
1124        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1125    return names
1126                         
1127def GetPatternTreeItemId(self, parentId, itemText):
1128    item, cookie = self.PatternTree.GetFirstChild(parentId)
1129    while item:
1130        if self.PatternTree.GetItemText(item) == itemText:
1131            return item
1132        item, cookie = self.PatternTree.GetNextChild(parentId, cookie)
1133    return 0               
1134
1135def MovePatternTreeToGrid(self,item):
1136   
1137#    print self.PatternTree.GetItemText(item)
1138   
1139    oldPage = 0
1140    if self.dataFrame:
1141        self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
1142        if self.dataFrame.GetLabel() == 'Comments':
1143            data = [self.dataDisplay.GetValue()]
1144            self.dataDisplay.Clear() 
1145            Id = GetPatternTreeItemId(self,self.root, 'Comments')
1146            if Id: self.PatternTree.SetItemPyData(Id,data)
1147        if self.dataFrame.GetLabel() == 'Notebook':
1148            data = [self.dataDisplay.GetValue()]
1149            self.dataDisplay.Clear() 
1150            Id = GetPatternTreeItemId(self,self.root, 'Notebook')
1151            if Id: self.PatternTree.SetItemPyData(Id,data)
1152        if 'Phase Data for' in self.dataFrame.GetLabel():
1153            if self.dataDisplay: 
1154                oldPage = self.dataDisplay.GetSelection()
1155        self.dataFrame.Clear()
1156        self.dataFrame.SetLabel('')
1157    else:
1158        self.dataFrame = DataFrame(parent=self.mainPanel)
1159
1160    self.dataFrame.Raise()           
1161    self.PickId = 0
1162    parentID = self.root
1163    self.ExportPattern.Enable(False)
1164    if item != self.root:
1165        parentID = self.PatternTree.GetItemParent(item)
1166    if self.PatternTree.GetItemParent(item) == self.root:
1167        self.PatternId = item
1168        self.PickId = item
1169        if self.PatternTree.GetItemText(item) == 'Notebook':
1170            self.PatternId = 0
1171            self.ExportPattern.Enable(False)
1172            data = self.PatternTree.GetItemPyData(item)
1173            UpdateNotebook(self,data)
1174        elif self.PatternTree.GetItemText(item) == 'Controls':
1175            self.PatternId = 0
1176            self.ExportPattern.Enable(False)
1177            data = self.PatternTree.GetItemPyData(item)
1178            if not data:           #fill in defaults
1179                data = {
1180                    #least squares controls
1181                    'deriv type':'analytic','min dM/M':0.0001,'shift factor':1.0,
1182                    #Fourier controls
1183                    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
1184                    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
1185                    #distance/angle controls
1186                    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
1187                self.PatternTree.SetItemPyData(item,data)                             
1188            self.Refine.Enable(True)
1189            self.SeqRefine.Enable(True)
1190            UpdateControls(self,data)
1191        elif self.PatternTree.GetItemText(item) == 'Sequental results':
1192            data = self.PatternTree.GetItemPyData(item)
1193            UpdateSeqResults(self,data)           
1194        elif self.PatternTree.GetItemText(item) == 'Covariance':
1195            data = self.PatternTree.GetItemPyData(item)
1196            G2plt.PlotCovariance(self)
1197        elif self.PatternTree.GetItemText(item) == 'Constraints':
1198            data = self.PatternTree.GetItemPyData(item)
1199            UpdateConstraints(self,data)
1200        elif self.PatternTree.GetItemText(item) == 'Restraints':
1201            data = self.PatternTree.GetItemPyData(item)
1202            UpdateRestraints(self,data)
1203        elif 'IMG' in self.PatternTree.GetItemText(item):
1204            self.Image = item
1205            G2plt.PlotImage(self,newPlot=True)
1206        elif 'PKS' in self.PatternTree.GetItemText(item):
1207            G2plt.PlotPowderLines(self)
1208        elif 'PWDR' in self.PatternTree.GetItemText(item):
1209            self.ExportPattern.Enable(True)
1210            G2plt.PlotPatterns(self,newPlot=True)
1211        elif 'HKLF' in self.PatternTree.GetItemText(item):
1212            self.Sngl = item
1213            G2plt.PlotSngl(self,newPlot=True)
1214        elif 'PDF' in self.PatternTree.GetItemText(item):
1215            self.PatternId = item
1216            self.ExportPDF.Enable(True)
1217            G2plt.PlotISFG(self,type='S(Q)')
1218           
1219    elif 'I(Q)' in self.PatternTree.GetItemText(item):
1220        self.PickId = item
1221        self.PatternId = self.PatternTree.GetItemParent(item)
1222        G2plt.PlotISFG(self,type='I(Q)',newPlot=True)
1223    elif 'S(Q)' in self.PatternTree.GetItemText(item):
1224        self.PickId = item
1225        self.PatternId = self.PatternTree.GetItemParent(item)
1226        G2plt.PlotISFG(self,type='S(Q)',newPlot=True)
1227    elif 'F(Q)' in self.PatternTree.GetItemText(item):
1228        self.PickId = item
1229        self.PatternId = self.PatternTree.GetItemParent(item)
1230        G2plt.PlotISFG(self,type='F(Q)',newPlot=True)
1231    elif 'G(R)' in self.PatternTree.GetItemText(item):
1232        self.PickId = item
1233        self.PatternId = self.PatternTree.GetItemParent(item)
1234        G2plt.PlotISFG(self,type='G(R)',newPlot=True)           
1235    elif self.PatternTree.GetItemText(parentID) == 'Phases':
1236        self.PickId = item
1237        data = self.PatternTree.GetItemPyData(item)           
1238        G2phG.UpdatePhaseData(self,item,data,oldPage)
1239    elif self.PatternTree.GetItemText(item) == 'Comments':
1240        self.PatternId = self.PatternTree.GetItemParent(item)
1241        self.PickId = item
1242        data = self.PatternTree.GetItemPyData(item)
1243        UpdateComments(self,data)
1244    elif self.PatternTree.GetItemText(item) == 'Image Controls':
1245        self.dataFrame.SetTitle('Image Controls')
1246        self.PickId = item
1247        self.Image = self.PatternTree.GetItemParent(item)
1248        masks = self.PatternTree.GetItemPyData(
1249            GetPatternTreeItemId(self,self.Image, 'Masks'))
1250        data = self.PatternTree.GetItemPyData(item)
1251        G2imG.UpdateImageControls(self,data,masks)
1252        G2plt.PlotImage(self)
1253    elif self.PatternTree.GetItemText(item) == 'Masks':
1254        self.dataFrame.SetTitle('Masks')
1255        self.PickId = item
1256        self.Image = self.PatternTree.GetItemParent(item)
1257        data = self.PatternTree.GetItemPyData(item)
1258        G2imG.UpdateMasks(self,data)
1259        G2plt.PlotImage(self)
1260    elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
1261        self.PickId = item
1262        self.Sngl = self.PatternTree.GetItemParent(item)
1263        data = self.PatternTree.GetItemPyData(item)
1264        UpdateHKLControls(self,data)
1265        G2plt.PlotSngl(self)
1266    elif self.PatternTree.GetItemText(item) == 'PDF Controls':
1267        self.PatternId = self.PatternTree.GetItemParent(item)
1268        self.ExportPDF.Enable(True)
1269        self.PickId = item
1270        data = self.PatternTree.GetItemPyData(item)
1271        G2pdG.UpdatePDFGrid(self,data)
1272        G2plt.PlotISFG(self,type='I(Q)')
1273        G2plt.PlotISFG(self,type='S(Q)')
1274        G2plt.PlotISFG(self,type='F(Q)')
1275        G2plt.PlotISFG(self,type='G(R)')
1276    elif self.PatternTree.GetItemText(item) == 'Peak List':
1277        self.PatternId = self.PatternTree.GetItemParent(item)
1278        self.ExportPeakList.Enable(True)
1279        self.PickId = item
1280        data = self.PatternTree.GetItemPyData(item)
1281        G2pdG.UpdatePeakGrid(self,data)
1282        G2plt.PlotPatterns(self)
1283    elif self.PatternTree.GetItemText(item) == 'Background':
1284        self.PatternId = self.PatternTree.GetItemParent(item)
1285        self.PickId = item
1286        data = self.PatternTree.GetItemPyData(item)
1287        G2pdG.UpdateBackgroundGrid(self,data)
1288        G2plt.PlotPatterns(self)
1289    elif self.PatternTree.GetItemText(item) == 'Limits':
1290        self.PatternId = self.PatternTree.GetItemParent(item)
1291        self.PickId = item
1292        data = self.PatternTree.GetItemPyData(item)
1293        G2pdG.UpdateLimitsGrid(self,data)
1294        G2plt.PlotPatterns(self)
1295    elif self.PatternTree.GetItemText(item) == 'Instrument Parameters':
1296        self.PatternId = self.PatternTree.GetItemParent(item)
1297        self.PickId = item
1298        data = self.PatternTree.GetItemPyData(item)
1299        G2pdG.UpdateInstrumentGrid(self,data)
1300        G2plt.PlotPeakWidths(self)
1301    elif self.PatternTree.GetItemText(item) == 'Sample Parameters':
1302        self.PatternId = self.PatternTree.GetItemParent(item)
1303        self.PickId = item
1304        data = self.PatternTree.GetItemPyData(item)
1305
1306        if 'Temperature' not in data:           #temp fix for old gpx files
1307            data = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],'DisplaceX':[0.0,False],
1308                'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,
1309                'Force':0.0,'Gonio. radius':200.0}
1310            self.PatternTree.SetItemPyData(item,data)
1311   
1312        G2pdG.UpdateSampleGrid(self,data)
1313        G2plt.PlotPatterns(self)
1314    elif self.PatternTree.GetItemText(item) == 'Index Peak List':
1315        self.PatternId = self.PatternTree.GetItemParent(item)
1316        self.ExportPeakList.Enable(True)
1317        self.PickId = item
1318        data = self.PatternTree.GetItemPyData(item)
1319        G2pdG.UpdateIndexPeaksGrid(self,data)
1320        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1321            G2plt.PlotPowderLines(self)
1322        else:
1323            G2plt.PlotPatterns(self)
1324    elif self.PatternTree.GetItemText(item) == 'Unit Cells List':
1325        self.PatternId = self.PatternTree.GetItemParent(item)
1326        self.PickId = item
1327        data = self.PatternTree.GetItemPyData(item)
1328        if not data:
1329            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
1330            data.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0])      #Bravais lattice flags
1331            data.append([])                                 #empty cell list
1332            data.append([])                                 #empty dmin
1333            self.PatternTree.SetItemPyData(item,data)                             
1334        G2pdG.UpdateUnitCellsGrid(self,data)
1335        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
1336            G2plt.PlotPowderLines(self)
1337        else:
1338            G2plt.PlotPatterns(self)
1339    elif self.PatternTree.GetItemText(item) == 'Reflection Lists':
1340        self.PatternId = self.PatternTree.GetItemParent(item)
1341        self.PickId = item
1342        data = self.PatternTree.GetItemPyData(item)
1343        self.RefList = ''
1344        if len(data):
1345            self.RefList = data.keys()[0]
1346        G2pdG.UpdateReflectionGrid(self,data)
1347        G2plt.PlotPatterns(self)
1348     
Note: See TracBrowser for help on using the repository browser.