source: trunk/GSASIIgrid.py @ 407

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

constraints round 2

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