source: trunk/GSASII.py @ 400

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

new default for Vcov contour plot - RdYlGn?
faster cleanup on changing/reloading projects
cleanup data delete
implement sample parameter copy
improve Vcov plotting routine
implement plot of vcov from seq refinements

  • Property svn:keywords set to Date Author Revision URL Id
File size: 77.0 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#GSASII
4########### SVN repository information ###################
5# $Date: 2011-10-27 15:26:50 +0000 (Thu, 27 Oct 2011) $
6# $Author: vondreele $
7# $Revision: 400 $
8# $URL: trunk/GSASII.py $
9# $Id: GSASII.py 400 2011-10-27 15:26:50Z vondreele $
10########### SVN repository information ###################
11
12import os
13import os.path as ospath
14import sys
15import math
16import cPickle
17import time
18import copy
19import numpy as np
20import scipy as sp
21import wx
22import matplotlib as mpl
23
24# load the GSAS routines
25import GSASIIpath
26import GSASIIIO as G2IO
27import GSASIIgrid as G2gd
28import GSASIIplot as G2plt
29import GSASIIpwdGUI as G2pdG
30import GSASIIspc as G2spc
31import GSASIIstruct as G2str
32import GSASIImapvars as G2mv
33import GSASIIsolve as G2sol
34import OpenGL as ogl
35
36# print versions
37print "Available python module versions for GSASII:"
38print "python:     ",sys.version[:5]
39print "wxpython:   ",wx.__version__
40print "matplotlib: ",mpl.__version__
41print "numpy:      ",np.__version__
42print "scipy:      ",sp.__version__
43print "OpenGL:     ",ogl.__version__
44try:
45    import mkl
46    print "Max threads ",mkl.get_max_threads()
47except:
48    print "MKL module not present"
49__version__ = '0.1.5'
50
51# useful degree trig functions
52sind = lambda x: math.sin(x*math.pi/180.)
53cosd = lambda x: math.cos(x*math.pi/180.)
54tand = lambda x: math.tan(x*math.pi/180.)
55asind = lambda x: 180.*math.asin(x)/math.pi
56acosd = lambda x: 180.*math.acos(x)/math.pi
57atan2d = lambda x,y: 180.*math.atan2(y,x)/math.pi
58
59def create(parent):
60    return GSASII(parent)
61
62[wxID_PATTERNTREE, 
63] = [wx.NewId() for _init_ctrls in range(1)]
64
65[wxID_FILECLOSE, wxID_FILEEXIT, wxID_FILEOPEN,  wxID_FILESAVE, wxID_FILESAVEAS, 
66wxID_REFINE, wxID_SOLVE, wxID_MAKEPDFS, wxID_VIEWLSPARMS, wxID_SEQREFINE,
67] = [wx.NewId() for _init_coll_File_Items in range(10)]
68
69[wxID_PWDRREAD,wxID_SNGLREAD,wxID_ADDPHASE,wxID_DELETEPHASE,
70 wxID_DATADELETE,wxID_READPEAKS,wxID_PWDSUM,wxID_IMGREAD,
71 wxID_IMSUM, wxID_DATARENAME,
72] = [wx.NewId() for _init_coll_Data_Items in range(10)]
73
74[wxID_IMPORT, wxID_IMPORTPATTERN, wxID_IMPORTHKL, wxID_IMPORTPHASE,
75wxID_IMPORTCIF, wxID_IMPORTPDB, 
76] = [wx.NewId() for _init_coll_Import_Items in range(6)]
77
78[wxID_EXPORT, wxID_EXPORTPATTERN, wxID_EXPORTHKL, wxID_EXPORTPHASE,
79wxID_EXPORTCIF, wxID_EXPORTPEAKLIST, wxID_EXPORTPDF,
80] = [wx.NewId() for _init_coll_Export_Items in range(7)]
81
82[wxID_HELPABOUT, wxID_HELPHELP, 
83] = [wx.NewId() for _init_coll_Help_Items in range(2)]
84
85class GSASII(wx.Frame):
86   
87    def _init_coll_GSASIIMenu_Menus(self, parent):
88        parent.Append(menu=self.File, title='File')
89        parent.Append(menu=self.Data, title='Data')
90        parent.Append(menu=self.Calculate, title='Calculate')
91        parent.Append(menu=self.Import, title='Import')
92        parent.Append(menu=self.Export, title='Export')
93        parent.Append(menu=self.Help, title='Help')
94
95    def _init_coll_File_Items(self, parent):
96        parent.Append(help='Open a gsasii project file (*.gpx)', id=wxID_FILEOPEN,
97             kind=wx.ITEM_NORMAL,text='Open project...')
98        parent.Append(help='Save project to old file', id=wxID_FILESAVE, 
99            kind=wx.ITEM_NORMAL,text='Save project')
100        parent.Append(help='Save project to new file', id=wxID_FILESAVEAS, 
101            kind=wx.ITEM_NORMAL,text='Save As...')
102        parent.Append(help='Close project, saving is optional', id=wxID_FILECLOSE, 
103            kind=wx.ITEM_NORMAL,text='Close project')
104        parent.Append(help='Exit from gsasii', id=wxID_FILEEXIT, kind=wx.ITEM_NORMAL,
105            text='Exit')
106        self.Bind(wx.EVT_MENU, self.OnFileOpen, id=wxID_FILEOPEN)
107        self.Bind(wx.EVT_MENU, self.OnFileSave, id=wxID_FILESAVE)
108        self.Bind(wx.EVT_MENU, self.OnFileSaveas, id=wxID_FILESAVEAS)
109        self.Bind(wx.EVT_MENU, self.OnFileClose, id=wxID_FILECLOSE)
110        self.Bind(wx.EVT_MENU, self.OnFileExit, id=wxID_FILEEXIT)
111       
112    def _init_coll_Data_Items(self,parent):
113        parent.Append(help='', id=wxID_PWDRREAD, kind=wx.ITEM_NORMAL,
114            text='Read powder data...')
115        parent.Append(help='',id=wxID_IMGREAD, kind=wx.ITEM_NORMAL,
116            text='Read image data...')
117        parent.Append(help='',id=wxID_READPEAKS, kind=wx.ITEM_NORMAL,
118            text='Read Powder Pattern Peaks...')
119        parent.Append(help='', id=wxID_SNGLREAD, kind=wx.ITEM_NORMAL,
120            text='Read single crystal data...')
121        parent.Append(help='', id=wxID_PWDSUM, kind=wx.ITEM_NORMAL,
122            text='Sum powder data')
123        parent.Append(help='',id=wxID_IMSUM, kind=wx.ITEM_NORMAL,
124            text='Sum image data')
125        parent.Append(help='', id=wxID_ADDPHASE, kind=wx.ITEM_NORMAL,
126            text='Add phase')
127        parent.Append(help='', id=wxID_DELETEPHASE, kind=wx.ITEM_NORMAL,
128            text='Delete phase')
129        parent.Append(help='', id=wxID_DATARENAME, kind=wx.ITEM_NORMAL,
130            text='Rename data') 
131        parent.Append(help='', id=wxID_DATADELETE, kind=wx.ITEM_NORMAL,
132            text='Delete data')
133        self.Bind(wx.EVT_MENU, self.OnPwdrRead, id=wxID_PWDRREAD)
134        self.Bind(wx.EVT_MENU, self.OnPwdrSum, id=wxID_PWDSUM)
135        self.Bind(wx.EVT_MENU, self.OnReadPowderPeaks, id=wxID_READPEAKS)
136        self.Bind(wx.EVT_MENU, self.OnImageRead, id=wxID_IMGREAD)
137        self.Bind(wx.EVT_MENU, self.OnImageSum, id=wxID_IMSUM)
138        self.Bind(wx.EVT_MENU, self.OnSnglRead, id=wxID_SNGLREAD)
139        self.Bind(wx.EVT_MENU, self.OnAddPhase, id=wxID_ADDPHASE)
140        self.Bind(wx.EVT_MENU, self.OnDeletePhase, id=wxID_DELETEPHASE)
141        self.Bind(wx.EVT_MENU, self.OnRenameData, id=wxID_DATARENAME)
142        self.Bind(wx.EVT_MENU, self.OnDataDelete, id=wxID_DATADELETE)
143               
144    def _init_coll_Calculate_Items(self,parent):
145        self.MakePDF = parent.Append(help='Make new PDFs from selected powder patterns', 
146            id=wxID_MAKEPDFS, kind=wx.ITEM_NORMAL,text='Make new PDFs')
147        self.Bind(wx.EVT_MENU, self.OnMakePDFs, id=wxID_MAKEPDFS)
148        self.ViewLSParms = parent.Append(help='View least squares parameters', 
149            id=wxID_VIEWLSPARMS, kind=wx.ITEM_NORMAL,text='View LS parms')
150        self.Bind(wx.EVT_MENU, self.OnViewLSParms, id=wxID_VIEWLSPARMS)
151        self.Refine = parent.Append(help='', id=wxID_REFINE, kind=wx.ITEM_NORMAL,
152            text='Refine')
153        self.Refine.Enable(False)
154        self.Bind(wx.EVT_MENU, self.OnRefine, id=wxID_REFINE)
155        self.SeqRefine = parent.Append(help='', id=wxID_SEQREFINE, kind=wx.ITEM_NORMAL,
156            text='Sequental refine')
157        self.SeqRefine.Enable(False)
158        self.Bind(wx.EVT_MENU, self.OnSeqRefine, id=wxID_SEQREFINE)
159        self.Solve = parent.Append(help='', id=wxID_SOLVE, kind=wx.ITEM_NORMAL,
160            text='Solve')
161        self.Solve.Enable(False)
162        self.Bind(wx.EVT_MENU, self.OnSolve, id=wxID_SOLVE)
163       
164    def _init_coll_Import_Items(self,parent):
165        self.ImportPhase = parent.Append(help='Import phase data from GSAS EXP file',
166            id=wxID_IMPORTPHASE, kind=wx.ITEM_NORMAL,text='Import GSAS EXP Phase...')
167        self.ImportPDB = parent.Append(help='Import phase data from PDB file',
168            id=wxID_IMPORTPDB, kind=wx.ITEM_NORMAL,text='Import PDB Phase...')
169        self.ImportCIF = parent.Append(help='Import phase data from cif file',id=wxID_IMPORTCIF, kind=wx.ITEM_NORMAL,
170            text='Import CIF Phase...')
171        self.ImportPattern = parent.Append(help='',id=wxID_IMPORTPATTERN, kind=wx.ITEM_NORMAL,
172            text='Import Powder Pattern...')
173        self.ImportHKL = parent.Append(help='',id=wxID_IMPORTHKL, kind=wx.ITEM_NORMAL,
174            text='Import HKLs...')
175        self.Bind(wx.EVT_MENU, self.OnImportPhase, id=wxID_IMPORTPHASE)
176        self.Bind(wx.EVT_MENU, self.OnImportPDB, id=wxID_IMPORTPDB)
177        self.Bind(wx.EVT_MENU, self.OnImportCIF, id=wxID_IMPORTCIF)
178        self.Bind(wx.EVT_MENU, self.OnImportPattern, id=wxID_IMPORTPATTERN)
179        self.Bind(wx.EVT_MENU, self.OnImportHKL, id=wxID_IMPORTHKL)
180
181    def _init_coll_Export_Items(self,parent):
182        self.ExportPattern = parent.Append(help='Select PWDR item to enable',id=wxID_EXPORTPATTERN, kind=wx.ITEM_NORMAL,
183            text='Export Powder Patterns...')
184        self.ExportPeakList = parent.Append(help='',id=wxID_EXPORTPEAKLIST, kind=wx.ITEM_NORMAL,
185            text='Export All Peak Lists...')
186        self.ExportHKL = parent.Append(help='',id=wxID_EXPORTHKL, kind=wx.ITEM_NORMAL,
187            text='Export HKLs...')
188        self.ExportPDF = parent.Append(help='Select PDF item to enable',id=wxID_EXPORTPDF, kind=wx.ITEM_NORMAL,
189            text='Export PDF...')
190        self.ExportPhase = parent.Append(help='',id=wxID_EXPORTPHASE, kind=wx.ITEM_NORMAL,
191            text='Export Phase...')
192        self.ExportCIF = parent.Append(help='',id=wxID_EXPORTCIF, kind=wx.ITEM_NORMAL,
193            text='Export CIF...')
194        self.ExportPattern.Enable(False)
195        self.ExportPeakList.Enable(True)
196        self.ExportHKL.Enable(False)
197        self.ExportPDF.Enable(False)
198        self.ExportPhase.Enable(False)
199        self.ExportCIF.Enable(False)
200        self.Bind(wx.EVT_MENU, self.OnExportPatterns, id=wxID_EXPORTPATTERN)
201        self.Bind(wx.EVT_MENU, self.OnExportPeakList, id=wxID_EXPORTPEAKLIST)
202        self.Bind(wx.EVT_MENU, self.OnExportHKL, id=wxID_EXPORTHKL)
203        self.Bind(wx.EVT_MENU, self.OnExportPDF, id=wxID_EXPORTPDF)
204        self.Bind(wx.EVT_MENU, self.OnExportPhase, id=wxID_EXPORTPHASE)
205        self.Bind(wx.EVT_MENU, self.OnExportCIF, id=wxID_EXPORTCIF)
206               
207    def _init_coll_Help_Items(self, parent):
208        parent.Append(help='', id=wxID_HELPHELP, kind=wx.ITEM_NORMAL,
209            text='Help')
210        parent.Append(help='', id=wxID_HELPABOUT, kind=wx.ITEM_NORMAL,
211            text='About')
212        self.Bind(wx.EVT_MENU, self.OnHelpHelp, id=wxID_HELPHELP)
213        self.Bind(wx.EVT_MENU, self.OnHelpAbout, id=wxID_HELPABOUT)
214
215    def _init_utils(self):
216        self.GSASIIMenu = wx.MenuBar()
217        self.File = wx.Menu(title='')
218        self.Data = wx.Menu(title='')       
219        self.Calculate = wx.Menu(title='')       
220        self.Import = wx.Menu(title='')       
221        self.Export = wx.Menu(title='')       
222        self.Help = wx.Menu(title='')
223
224        self._init_coll_GSASIIMenu_Menus(self.GSASIIMenu)
225        self._init_coll_File_Items(self.File)
226        self._init_coll_Data_Items(self.Data)
227        self._init_coll_Calculate_Items(self.Calculate)
228        self._init_coll_Import_Items(self.Import)
229        self._init_coll_Export_Items(self.Export)
230        self._init_coll_Help_Items(self.Help)
231       
232    def _init_ctrls(self, parent):
233        wx.Frame.__init__(self, name='GSASII', parent=parent,
234            size=wx.Size(300, 250),style=wx.DEFAULT_FRAME_STYLE, title='GSAS-II data tree')
235        clientSize = wx.ClientDisplayRect()
236        Size = self.GetSize()
237        xPos = clientSize[2]-Size[0]
238        self.SetPosition(wx.Point(xPos,clientSize[1]))
239        self._init_utils()
240        self.SetMenuBar(self.GSASIIMenu)
241        self.Bind(wx.EVT_SIZE, self.OnSize)
242        self.CreateStatusBar()
243        self.mainPanel = wx.Panel(self,-1)
244       
245        self.PatternTree = wx.TreeCtrl(id=wxID_PATTERNTREE,
246            parent=self.mainPanel, pos=wx.Point(0, 0),style=wx.TR_DEFAULT_STYLE )
247        self.PatternTree.Bind(wx.EVT_TREE_SEL_CHANGED,
248            self.OnPatternTreeSelChanged, id=wxID_PATTERNTREE)
249        self.PatternTree.Bind(wx.EVT_TREE_ITEM_COLLAPSED,
250            self.OnPatternTreeItemCollapsed, id=wxID_PATTERNTREE)
251        self.PatternTree.Bind(wx.EVT_TREE_ITEM_EXPANDED,
252            self.OnPatternTreeItemExpanded, id=wxID_PATTERNTREE)
253        self.PatternTree.Bind(wx.EVT_TREE_DELETE_ITEM,
254            self.OnPatternTreeItemDelete, id=wxID_PATTERNTREE)
255        self.root = self.PatternTree.AddRoot('Loaded Data: ')
256       
257        plotFrame = wx.Frame(None,-1,'GSASII Plots',size=wx.Size(700,600), \
258            style=wx.DEFAULT_FRAME_STYLE ^ wx.CLOSE_BOX)
259        self.G2plotNB = G2plt.G2PlotNoteBook(plotFrame)
260        plotFrame.Show()
261       
262        self.dataDisplay = None
263       
264    def __init__(self, parent):
265        self._init_ctrls(parent)
266        self.Bind(wx.EVT_CLOSE, self.ExitMain)
267        # various defaults
268        self.GSASprojectfile = ''
269        self.dirname = ''
270        self.undofile = ''
271        self.TreeItemDelete = False
272        self.Offset = [0.0,0.0]
273        self.Weight = False
274        self.IparmName = ''
275        self.IfPlot = False
276        self.PatternId = 0
277        self.PickId = 0
278        self.PeakTable = []
279        self.LimitsTable = []
280        self.HKL = []
281        self.Lines = []
282        self.itemPicked = None
283        self.dataFrame = None
284        self.Interpolate = 'nearest'
285        self.ContourColor = 'Paired'
286        self.VcovColor = 'RdYlGn'
287        self.Projection = 'equal area'
288        self.logPlot = False
289        self.qPlot = False
290        self.Contour = False
291        self.Legend = False
292        self.SinglePlot = False
293        self.plotView = 0
294        self.Image = 0
295        self.oldImagefile = ''
296        self.Integrate = 0
297        self.Pwdr = False
298        self.imageDefault = {}
299        self.Sngl = 0
300        self.ifGetRing = False
301        self.setPoly = False
302        arg = sys.argv
303        if len(arg) > 1:
304            self.GSASprojectfile = arg[1]
305            self.dirname = ospath.dirname(arg[1])
306            G2IO.ProjFileOpen(self)
307            self.PatternTree.Expand(self.root)
308            self.Refine.Enable(True)
309            self.SeqRefine.Enable(True)
310            self.Solve.Enable(True)
311
312    def OnSize(self,event):
313        w,h = self.GetClientSizeTuple()
314        self.mainPanel.SetSize(wx.Size(w,h))
315        self.PatternTree.SetSize(wx.Size(w,h))
316                       
317    def OnPatternTreeSelChanged(self, event):
318        if self.TreeItemDelete:
319            self.TreeItemDelete = False
320        else:
321            pltNum = self.G2plotNB.nb.GetSelection()
322            if pltNum >= 0:                         #to avoid the startup with no plot!
323                pltPage = self.G2plotNB.nb.GetPage(pltNum)
324                pltPlot = pltPage.figure
325            item = event.GetItem()
326            G2gd.MovePatternTreeToGrid(self,item)
327       
328    def OnPatternTreeItemCollapsed(self, event):
329        event.Skip()
330
331    def OnPatternTreeItemExpanded(self, event):
332        event.Skip()
333       
334    def OnPatternTreeItemDelete(self, event):
335        self.TreeItemDelete = True
336
337    def OnPatternTreeItemActivated(self, event):
338        event.Skip()
339               
340    def OnPwdrRead(self, event):
341        self.CheckNotebook()
342        dlg = wx.FileDialog(self, 'Choose files', '.', '', 
343            'GSAS fxye files (*.fxye)|*.fxye|GSAS fxy files (*.fxy)|*.fxy|Topas xye files (*.xye)|*.xye|All files (*.*)|*.*', 
344            wx.OPEN | wx.MULTIPLE)
345        if self.dirname: dlg.SetDirectory(self.dirname)
346        try:
347            if dlg.ShowModal() == wx.ID_OK:
348                filenames = dlg.GetPaths()
349                filenames.sort()
350                self.dirname = dlg.GetDirectory()
351                for filename in filenames:
352                    Data,Iparm,Comments,Temperature = G2IO.SelectPowderData(self, filename)              #Data: list of tuples (filename,Pos,Bank)
353                    if not Data:                                                    #if Data rejected by user - go to next one
354                        continue
355                    DataType = Iparm['INS   HTYPE ']                                #expect only 4 char string
356                    DataType = DataType.strip()[0:3]                                #just 1st 3 chars
357                    wx.BeginBusyCursor()
358                    Sample = G2pdG.GetDefaultSample()
359                    try:
360                        for Item in Data:
361                            vals = Item[2].split()          #split up the BANK record
362                            Id = self.PatternTree.AppendItem(parent=self.root,text='PWDR '+ospath.basename(Item[0])+': '+vals[0]+vals[1])
363                            data = G2IO.GetPowderData(filename,Item[1],Item[2],DataType)
364                            self.PatternTree.SetItemPyData(Id,[Item,data])
365                            '''
366                            Each tree item data is a list with:
367                            Item: the (filename,Pos,Bank) tuple
368                            data: (x,y,w,yc,yb,yd) list  of np.arrays from GetPowderData
369                            '''
370                           
371                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)                           
372                            Tmin = min(data[0])
373                            Tmax = max(data[0])
374                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Limits'),[(Tmin,Tmax),[Tmin,Tmax]])
375                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Background'),[['chebyschev',1,3,1.0,0.0,0.0]])
376       
377                            data = [DataType,]
378                            if 'C' in DataType:
379                                s = Iparm['INS  1 ICONS']
380                                v = (G2IO.sfloat(s[:10]),G2IO.sfloat(s[10:20]),G2IO.sfloat(s[20:30]),G2IO.sfloat(s[55:65]),G2IO.sfloat(s[40:50])) #get lam1, lam2, zero, pola & ratio
381                                if not v[1]:
382                                    names = ['Type','Lam','Zero','Polariz.','U','V','W','X','Y','SH/L','Azimuth'] 
383                                    v = (v[0],v[2],v[4])
384                                    codes = [0,0,0,0]
385                                else:
386                                    names = ['Type','Lam1','Lam2','Zero','I(L2)/I(L1)','Polariz.','U','V','W','X','Y','SH/L','Azimuth']
387                                    codes = [0,0,0,0,0,0]
388                                data.extend(v)
389                                v1 = Iparm['INS  1PRCF1 '].split()                                                 
390                                v = Iparm['INS  1PRCF11'].split()
391                                data.extend([float(v[0]),float(v[1]),float(v[2])])                  #get GU, GV & GW - always here
392                                try:
393                                    azm = float(Iparm['INS  1DETAZM'])
394                                except KeyError:                                                #not in this Iparm file
395                                    azm = 0.0
396                                v = Iparm['INS  1PRCF12'].split()
397                                if v1[0] == 3:
398                                    data.extend([float(v[0]),float(v[1]),float(v[2])+float(v[3],azm)])  #get LX, LY, S+H/L & azimuth
399                                else:
400                                    data.extend([0.0,0.0,0.002,azm])                                      #OK defaults if fxn #3 not 1st in iprm file
401                                codes.extend([0,0,0,0,0,0,0])
402                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Instrument Parameters'),[tuple(data),data,codes,names])
403                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Sample Parameters'),Sample)
404                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Peak List'),[])
405                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Index Peak List'),[])
406                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Unit Cells List'),[])
407                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Reflection Lists'),{})             
408                            self.PatternId = G2gd.GetPatternTreeItemId(self,Id,'Limits')
409                    finally:
410                        wx.EndBusyCursor()
411                self.PatternTree.Expand(Id)
412                self.PatternTree.SelectItem(Id)
413   
414        finally:
415            dlg.Destroy()
416       
417    def OnReadPowderPeaks(self,event):
418        Cuka = 1.54052
419        self.CheckNotebook()
420        dlg = wx.FileDialog(self, 'Choose file with peak list', '.', '', 
421            'peak files (*.txt)|*.txt|All files (*.*)|*.*',wx.OPEN)
422        if self.dirname:
423            dlg.SetDirectory(self.dirname)
424        try:
425            if dlg.ShowModal() == wx.ID_OK:
426                self.HKL = []
427                self.powderfile = dlg.GetPath()
428                self.dirname = dlg.GetDirectory()
429                comments,peaks = G2IO.GetPowderPeaks(self.powderfile)
430                Id = self.PatternTree.AppendItem(parent=self.root,text='PKS '+ospath.basename(self.powderfile))
431                data = ['PKS',Cuka,0.0]
432                names = ['Type','Lam','Zero'] 
433                codes = [0,0]
434                self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Instrument Parameters'),[tuple(data),data,codes,names])
435                self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),comments)
436                self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Index Peak List'),peaks)
437                self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Unit Cells List'),[])             
438                self.PatternTree.Expand(Id)
439                self.PatternTree.SelectItem(Id)
440        finally:
441            dlg.Destroy()
442           
443    def OnImageRead(self,event):
444        self.CheckNotebook()
445        dlg = wx.FileDialog(self, 'Choose image files', '.', '',\
446        'Any image file (*.tif;*.tiff;*.mar*;*.avg;*.sum;*.img;*.G2img)\
447        |*.tif;*.tiff;*.mar*;*.avg;*.sum;*.img;*.G2img|\
448        Any detector tif (*.tif;*.tiff)|*.tif;*.tiff|\
449        MAR file (*.mar*)|*.mar*|\
450        GE Image (*.avg;*.sum)|*.avg;*.sum|\
451        ADSC Image (*.img)|*.img|\
452        GSAS-II Image (*.G2img)|*.G2img|\
453        All files (*.*)|*.*',
454        wx.OPEN | wx.MULTIPLE)
455        if self.dirname:
456            dlg.SetDirectory(self.dirname)
457        try:
458            if dlg.ShowModal() == wx.ID_OK:
459                self.dirname = dlg.GetDirectory()
460                imagefiles = dlg.GetPaths()
461                imagefiles.sort()
462                for imagefile in imagefiles:
463                    Comments,Data,Npix,Image = G2IO.GetImageData(self,imagefile)
464                    if Comments:
465                        Id = self.PatternTree.AppendItem(parent=self.root,text='IMG '+ospath.basename(imagefile))
466                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)
467                        Imax = np.amax(Image)
468                        Imin = max(0.0,np.amin(Image))          #force positive
469                        if self.imageDefault:
470                            Data = copy.copy(self.imageDefault)
471                            Data['showLines'] = True
472                            Data['ring'] = []
473                            Data['rings'] = []
474                            Data['cutoff'] = 10
475                            Data['pixLimit'] = 20
476                            Data['edgemin'] = 100000000
477                            Data['calibdmin'] = 0.5
478                            Data['calibskip'] = 0
479                            Data['ellipses'] = []
480                            Data['calibrant'] = ''
481                        else:
482                            Data['type'] = 'PWDR'
483                            Data['color'] = 'binary'
484                            Data['tilt'] = 0.0
485                            Data['rotation'] = 0.0
486                            Data['showLines'] = False
487                            Data['ring'] = []
488                            Data['rings'] = []
489                            Data['cutoff'] = 10
490                            Data['pixLimit'] = 20
491                            Data['calibdmin'] = 0.5
492                            Data['calibskip'] = 0
493                            Data['edgemin'] = 100000000
494                            Data['ellipses'] = []
495                            Data['calibrant'] = ''
496                            Data['IOtth'] = [2.0,5.0]
497                            Data['LRazimuth'] = [-135,-45]
498                            Data['azmthOff'] = 0.0
499                            Data['outChannels'] = 2500
500                            Data['outAzimuths'] = 1
501                            Data['fullIntegrate'] = False
502                            Data['setRings'] = False
503                        Data['setDefault'] = False
504                        Data['range'] = [(Imin,Imax),[Imin,Imax]]
505                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Image Controls'),Data)
506                        Masks = {'Points':[],'Rings':[],'Arcs':[],'Polygons':[],'Thresholds':[(Imin,Imax),[Imin,Imax]]}
507                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Masks'),Masks)
508                        self.PatternTree.SetItemPyData(Id,[Npix,imagefile])
509                        self.PickId = Id
510                        self.Image = Id
511                self.PatternTree.SelectItem(G2gd.GetPatternTreeItemId(self,Id,'Image Controls'))             #show last one
512        finally:
513            dlg.Destroy()
514       
515    def OnSnglRead(self,event):
516        self.CheckNotebook()
517        dlg = wx.FileDialog(self, 'Choose file', '.', '', 
518            'hkl files (*.hkl)|*.hkl|All files (*.*)|*.*', 
519            wx.OPEN)
520        if self.dirname: dlg.SetDirectory(self.dirname)
521        try:
522            if dlg.ShowModal() == wx.ID_OK:
523                filename = dlg.GetPath()
524                self.dirname = dlg.GetDirectory()
525                wx.BeginBusyCursor()
526                try:
527                    Data = {}
528                    names = ['Type','Lam']
529                    HKLref,HKLmin,HKLmax,FoMax,ifFc = G2IO.GetHKLData(filename)
530                    Id = self.PatternTree.AppendItem(parent=self.root,text='HKLF '+ospath.basename(filename))
531                    self.PatternTree.SetItemPyData(Id,HKLref)
532                    Sub = self.PatternTree.AppendItem(Id,text='Instrument Parameters')
533                    data = ['SXC',1.5428,]
534                    self.PatternTree.SetItemPyData(Sub,[tuple(data),data,names])
535                    Data['Type'] = 'Fosq'
536                    Data['ifFc'] = ifFc
537                    Data['HKLmax'] = HKLmax
538                    Data['HKLmin'] = HKLmin
539                    Data['FoMax'] = FoMax
540                    Data['Zone'] = '001'
541                    Data['Layer'] = 0
542                    Data['Scale'] = 1.0
543                    Data['log-lin'] = 'lin'                   
544                    self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='HKL Plot Controls'),Data)
545                    self.PatternTree.SelectItem(Id)
546                    self.PatternTree.Expand(Id)
547                    self.Sngl = Id
548                finally:
549                    wx.EndBusyCursor()   
550        finally:
551            dlg.Destroy()
552           
553    def CheckNotebook(self):
554        if not G2gd.GetPatternTreeItemId(self,self.root,'Notebook'):
555            sub = self.PatternTree.AppendItem(parent=self.root,text='Notebook')
556            self.PatternTree.SetItemPyData(sub,[''])
557        if not G2gd.GetPatternTreeItemId(self,self.root,'Controls'):
558            sub = self.PatternTree.AppendItem(parent=self.root,text='Controls')
559            self.PatternTree.SetItemPyData(sub,{})
560        if not G2gd.GetPatternTreeItemId(self,self.root,'Covariance'):
561            sub = self.PatternTree.AppendItem(parent=self.root,text='Covariance')
562            self.PatternTree.SetItemPyData(sub,{})
563        if not G2gd.GetPatternTreeItemId(self,self.root,'Constraints'):
564            sub = self.PatternTree.AppendItem(parent=self.root,text='Constraints')
565            self.PatternTree.SetItemPyData(sub,{})
566        if not G2gd.GetPatternTreeItemId(self,self.root,'Restraints'):
567            sub = self.PatternTree.AppendItem(parent=self.root,text='Restraints')
568            self.PatternTree.SetItemPyData(sub,{})
569           
570               
571    class CopyDialog(wx.Dialog):
572        def __init__(self,parent,title,text,data):
573            wx.Dialog.__init__(self,parent,-1,title, 
574                pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
575            self.data = data
576            panel = wx.Panel(self)
577            mainSizer = wx.BoxSizer(wx.VERTICAL)
578            topLabl = wx.StaticText(panel,-1,text)
579            mainSizer.Add((10,10),1)
580            mainSizer.Add(topLabl,0,wx.ALIGN_CENTER_VERTICAL|wx.LEFT,10)
581            mainSizer.Add((10,10),1)
582            ncols = len(data)/40+1
583            dataGridSizer = wx.FlexGridSizer(rows=len(data),cols=ncols,hgap=2,vgap=2)
584            for id,item in enumerate(self.data):
585                ckbox = wx.CheckBox(panel,id,item[1])
586                ckbox.Bind(wx.EVT_CHECKBOX,self.OnCopyChange)                   
587                dataGridSizer.Add(ckbox,0,wx.LEFT,10)
588            mainSizer.Add(dataGridSizer,0,wx.EXPAND)
589            OkBtn = wx.Button(panel,-1,"Ok")
590            OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
591            cancelBtn = wx.Button(panel,-1,"Cancel")
592            cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
593            btnSizer = wx.BoxSizer(wx.HORIZONTAL)
594            btnSizer.Add((20,20),1)
595            btnSizer.Add(OkBtn)
596            btnSizer.Add((20,20),1)
597            btnSizer.Add(cancelBtn)
598            btnSizer.Add((20,20),1)
599           
600            mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
601            panel.SetSizer(mainSizer)
602            panel.Fit()
603            self.Fit()
604       
605        def OnCopyChange(self,event):
606            id = event.GetId()
607            self.data[id][0] = self.FindWindowById(id).GetValue()       
608           
609        def OnOk(self,event):
610            parent = self.GetParent()
611            parent.Raise()
612            self.EndModal(wx.ID_OK)             
613            self.Destroy()
614           
615        def OnCancel(self,event):
616            parent = self.GetParent()
617            parent.Raise()
618            self.EndModal(wx.ID_CANCEL)             
619            self.Destroy()
620           
621        def GetData(self):
622            return self.data
623       
624    class SumDialog(wx.Dialog):
625        def __init__(self,parent,title,text,dataType,data):
626            wx.Dialog.__init__(self,parent,-1,title, 
627                pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
628            self.data = data
629            panel = wx.Panel(self)
630            mainSizer = wx.BoxSizer(wx.VERTICAL)
631            topLabl = wx.StaticText(panel,-1,text)
632            mainSizer.Add((10,10),1)
633            mainSizer.Add(topLabl,0,wx.ALIGN_CENTER_VERTICAL|wx.LEFT,10)
634            mainSizer.Add((10,10),1)
635            dataGridSizer = wx.FlexGridSizer(rows=len(data),cols=2,hgap=2,vgap=2)
636            for id,item in enumerate(self.data[:-1]):
637                name = wx.TextCtrl(panel,-1,item[1],size=wx.Size(200,20))
638                name.SetEditable(False)
639                scale = wx.TextCtrl(panel,id,str(item[0]),style=wx.TE_PROCESS_ENTER)
640                scale.Bind(wx.EVT_TEXT_ENTER,self.OnScaleChange)
641                scale.Bind(wx.EVT_KILL_FOCUS,self.OnScaleChange)
642                dataGridSizer.Add(scale,0,wx.LEFT,10)
643                dataGridSizer.Add(name,0,wx.RIGHT,10)
644            dataGridSizer.Add(wx.StaticText(panel,-1,'Sum result name: '+dataType),0, \
645                wx.LEFT|wx.TOP|wx.ALIGN_CENTER_VERTICAL,10)
646            self.name = wx.TextCtrl(panel,-1,self.data[-1],size=wx.Size(200,20),style=wx.TE_PROCESS_ENTER)
647            self.name.Bind(wx.EVT_TEXT_ENTER,self.OnNameChange)
648            self.name.Bind(wx.EVT_KILL_FOCUS,self.OnNameChange)
649            dataGridSizer.Add(self.name,0,wx.RIGHT|wx.TOP,10)
650            mainSizer.Add(dataGridSizer,0,wx.EXPAND)
651            OkBtn = wx.Button(panel,-1,"Ok")
652            OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
653            cancelBtn = wx.Button(panel,-1,"Cancel")
654            cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
655            btnSizer = wx.BoxSizer(wx.HORIZONTAL)
656            btnSizer.Add((20,20),1)
657            btnSizer.Add(OkBtn)
658            btnSizer.Add((20,20),1)
659            btnSizer.Add(cancelBtn)
660            btnSizer.Add((20,20),1)
661           
662            mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
663            panel.SetSizer(mainSizer)
664            panel.Fit()
665            self.Fit()
666           
667        def OnNameChange(self,event):
668            self.data[-1] = self.name.GetValue() 
669           
670        def OnScaleChange(self,event):
671            id = event.GetId()
672            value = self.FindWindowById(id).GetValue()
673            try:
674                self.data[id][0] = float(value)
675                self.FindWindowById(id).SetValue('%.3f'%(self.data[id][0]))
676            except ValueError:
677                if value and '-' not in value[0]:
678                    print 'bad input - numbers only'
679                    self.FindWindowById(id).SetValue('0.0')
680           
681        def OnOk(self,event):
682            parent = self.GetParent()
683            parent.Raise()
684            self.EndModal(wx.ID_OK)             
685            self.Destroy()
686           
687        def OnCancel(self,event):
688            parent = self.GetParent()
689            parent.Raise()
690            self.EndModal(wx.ID_CANCEL)             
691            self.Destroy()
692           
693        def GetData(self):
694            return self.data
695           
696    def OnPwdrSum(self,event):
697        TextList = []
698        DataList = []
699        SumList = []
700        Names = []
701        Inst = []
702        SumItemList = []
703        Comments = ['Sum equals: \n']
704        if self.PatternTree.GetCount():
705            item, cookie = self.PatternTree.GetFirstChild(self.root)
706            while item:
707                name = self.PatternTree.GetItemText(item)
708                Names.append(name)
709                if 'PWDR' in name:
710                    TextList.append([0.0,name])
711                    DataList.append(self.PatternTree.GetItemPyData(item)[1])    # (x,y,w,yc,yb,yd)
712                    if not Inst:
713                        Inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,item, 'Instrument Parameters'))
714                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
715            if len(TextList) < 2:
716                self.ErrorDialog('Not enough data to sum','There must be more than one "PWDR" pattern')
717                return
718            TextList.append('default_sum_name')               
719            dlg = self.SumDialog(self,'Sum data','Enter scale for each pattern in summation','PWDR',TextList)
720            try:
721                if dlg.ShowModal() == wx.ID_OK:
722                    lenX = 0
723                    Xminmax = [0,0]
724                    Xsum = []
725                    Ysum = []
726                    Vsum = []
727                    result = dlg.GetData()
728                    for i,item in enumerate(result[:-1]):
729                        scale,name = item
730                        data = DataList[i]
731                        if scale:
732                            Comments.append("%10.3f %s" % (scale,' * '+name))
733                            x,y,w,yc,yb,yd = data
734                            v = 1./w
735                            if lenX:
736                                if lenX != len(x):
737                                    self.ErrorDialog('Data length error','Data to be summed must have same number of points'+ \
738                                        '\nExpected:'+str(lenX)+ \
739                                        '\nFound:   '+str(len(x))+'\nfor '+name)
740                                    return
741                            else:
742                                lenX = len(x)
743                            if Xminmax[1]:
744                                if Xminmax != [x[0],x[-1]]:
745                                    self.ErrorDialog('Data range error','Data to be summed must span same range'+ \
746                                        '\nExpected:'+str(Xminmax[0])+' '+str(Xminmax[1])+ \
747                                        '\nFound:   '+str(x[0])+' '+str(x[-1])+'\nfor '+name)
748                                    return
749                                else:
750                                    for j,yi in enumerate(y):
751                                         Ysum[j] += scale*yi
752                                         Vsum[j] += abs(scale)*v[j]
753                            else:
754                                Xminmax = [x[0],x[-1]]
755                                YCsum = YBsum = YDsum = [0.0 for i in range(lenX)]
756                                for j,yi in enumerate(y):
757                                    Xsum.append(x[j])
758                                    Ysum.append(scale*yi)
759                                    Vsum.append(abs(scale*v[j]))
760                    Wsum = 1./np.array(Vsum)
761                    outname = 'PWDR '+result[-1]
762                    Id = 0
763                    if outname in Names:
764                        dlg2 = wx.MessageDialog(self,'Overwrite data?','Duplicate data name',wx.OK|wx.CANCEL)
765                        try:
766                            if dlg2.ShowModal() == wx.ID_OK:
767                                Id = G2gd.GetPatternTreeItemId(self,self.root,name)
768                                self.PatternTree.Delete(Id)
769                        finally:
770                            dlg2.Destroy()
771                    Id = self.PatternTree.AppendItem(parent=self.root,text=outname)
772                    if Id:
773                        Sample = G2pdG.SetDefaultSample()
774                        self.PatternTree.SetItemPyData(Id,[[''],[Xsum,Ysum,Wsum,YCsum,YBsum,YDsum]])
775                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)                   
776                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Limits'),[tuple(Xminmax),Xminmax])
777                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Background'),[['chebyschev',1,3,1.0,0.0,0.0]])
778                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Instrument Parameters'),Inst)
779                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Sample Parameters'),Sample)
780                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Peak List'),[])
781                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Index Peak List'),[])
782                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Unit Cells List'),[])             
783                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Reflection Lists'),{})             
784                        self.PatternTree.SelectItem(Id)
785                        self.PatternTree.Expand(Id)
786                   
787            finally:
788                dlg.Destroy()
789
790    def OnImageSum(self,event):
791        TextList = []
792        DataList = []
793        SumList = []
794        Names = []
795        Inst = []
796        SumItemList = []
797        Comments = ['Sum equals: \n']
798        if self.PatternTree.GetCount():
799            item, cookie = self.PatternTree.GetFirstChild(self.root)
800            while item:
801                name = self.PatternTree.GetItemText(item)
802                Names.append(name)
803                if 'IMG' in name:
804                    TextList.append([0.0,name])
805                    DataList.append(self.PatternTree.GetItemPyData(item))        #Size,Image
806                    Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,item,'Image Controls'))
807                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
808            if len(TextList) < 2:
809                self.ErrorDialog('Not enough data to sum','There must be more than one "IMG" pattern')
810                return
811            TextList.append('default_sum_name')               
812            dlg = self.SumDialog(self,'Sum data','Enter scale for each image in summation','IMG',TextList)
813            try:
814                if dlg.ShowModal() == wx.ID_OK:
815                    imSize = 0
816                    result = dlg.GetData()
817                    First = True
818                    Found = False
819                    for i,item in enumerate(result[:-1]):
820                        scale,name = item
821                        data = DataList[i]
822                        if scale:
823                            Found = True                               
824                            Comments.append("%10.3f %s" % (scale,' * '+name))
825                            Npix,imagefile = data
826                            image = G2IO.GetImageData(self,imagefile,imageOnly=True)
827                            if First:
828                                newImage = np.zeros_like(image)
829                                First = False
830                            if imSize:
831                                if imSize != Npix:
832                                    self.ErrorDialog('Image size error','Images to be summed must be same size'+ \
833                                        '\nExpected:'+str(imSize)+ \
834                                        '\nFound:   '+str(Npix)+'\nfor '+name)
835                                    return
836                                newImage = newImage+scale*image
837                            else:
838                                imSize = Npix
839                                newImage = newImage+scale*image
840                            del(image)
841                    if not Found:
842                        self.ErrorDialog('Image sum error','No nonzero image multipliers found')
843                        return
844                       
845                    newImage = np.asfarray(newImage,dtype=np.float32)                       
846                    outname = 'IMG '+result[-1]
847                    Id = 0
848                    if outname in Names:
849                        dlg2 = wx.MessageDialog(self,'Overwrite data?','Duplicate data name',wx.OK|wx.CANCEL)
850                        try:
851                            if dlg2.ShowModal() == wx.ID_OK:
852                                Id = G2gd.GetPatternTreeItemId(self,self.root,name)
853                        finally:
854                            dlg2.Destroy()
855                    else:
856                        Id = self.PatternTree.AppendItem(parent=self.root,text=outname)
857                    if Id:
858                        dlg = wx.FileDialog(self, 'Choose sum image filename', '.', '', 
859                            'G2img files (*.G2img)|*.G2img', 
860                            wx.SAVE|wx.FD_OVERWRITE_PROMPT)
861                        if self.dirname: dlg.SetDirectory(self.dirname)
862                        if dlg.ShowModal() == wx.ID_OK:
863                            self.dirname = dlg.GetDirectory()
864                            newimagefile = dlg.GetPath()
865                            G2IO.PutG2Image(newimagefile,Comments,Data,Npix,newImage)
866                            Imax = np.amax(newImage)
867                            Imin = np.amin(newImage)
868                            newImage = []
869                            self.PatternTree.SetItemPyData(Id,[imSize,newimagefile])
870                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)
871                        del(newImage)
872                        if self.imageDefault:
873                            Data = copy.copy(self.imageDefault)
874                        Data['showLines'] = True
875                        Data['ring'] = []
876                        Data['rings'] = []
877                        Data['cutoff'] = 10
878                        Data['pixLimit'] = 20
879                        Data['ellipses'] = []
880                        Data['calibrant'] = ''
881                        Data['range'] = [(Imin,Imax),[Imin,Imax]]
882                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Image Controls'),Data)                                           
883                        Masks = {'Points':[],'Rings':[],'Arcs':[],'Polygons':[],'Thresholds':[(Imin,Imax),[Imin,Imax]]}
884                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Masks'),Masks)
885                        self.PatternTree.SelectItem(Id)
886                        self.PatternTree.Expand(Id)
887                        self.PickId = G2gd.GetPatternTreeItemId(self,self.root,outname)
888                        self.Image = self.PickId
889            finally:
890                dlg.Destroy()
891                     
892    def OnAddPhase(self,event):
893        if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
894            sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
895        else:
896            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
897        PhaseName = ''
898        dlg = wx.TextEntryDialog(None,'Enter a name for this phase','Phase Name Entry','New phase',
899            style=wx.OK)
900        if dlg.ShowModal() == wx.ID_OK:
901            PhaseName = dlg.GetValue()
902        dlg.Destroy()
903        sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
904        E,SGData = G2spc.SpcGroup('P 1')
905        self.PatternTree.SetItemPyData(sub, {
906            'General':{
907                'Name':PhaseName,
908                'Type':'nuclear',
909                'SGData':SGData,
910                'Cell':[False,10.,10.,10.,90.,90.,90,1000.],
911                'Pawley dmin':1.0,
912                'SH Texture':{
913                    'Order':0,
914                    'Model':'cylindrical',
915                    'Sample omega':[False,0.0],
916                    'Sample chi':[False,0.0],
917                    'Sample phi':[False,0.0],
918                    'SH Coeff':[False,{}],
919                    'SHShow':False,
920                    'PFhkl':[0,0,1],
921                    'PFxyz':[0,0,1],
922                    'PlotType':'Pole figure'}},
923            'Atoms':[],
924            'Drawing':{},
925            'Histograms':{},
926            'Pawley ref':[],
927            'Models':{},
928            })
929       
930    def OnDeletePhase(self,event):
931        #Hmm, also need to delete this phase from Reflection Lists for each PWDR histogram
932        if self.dataFrame:
933            self.dataFrame.Clear() 
934        TextList = []
935        DelList = []
936        DelItemList = []
937        if G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
938            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
939        else:
940            return
941        if sub:
942            item, cookie = self.PatternTree.GetFirstChild(sub)
943            while item:
944                TextList.append(self.PatternTree.GetItemText(item))
945                item, cookie = self.PatternTree.GetNextChild(sub, cookie)               
946            dlg = wx.MultiChoiceDialog(self, 'Which phase to delete?', 'Delete phase', TextList, wx.CHOICEDLG_STYLE)
947            try:
948                if dlg.ShowModal() == wx.ID_OK:
949                    result = dlg.GetSelections()
950                    for i in result: DelList.append([i,TextList[i]])
951                    item, cookie = self.PatternTree.GetFirstChild(sub)
952                    i = 0
953                    while item:
954                        if [i,self.PatternTree.GetItemText(item)] in DelList: DelItemList.append(item)
955                        item, cookie = self.PatternTree.GetNextChild(sub, cookie)
956                        i += 1
957                    for item in DelItemList:
958                        name = self.PatternTree.GetItemText(item)
959                        self.PatternTree.Delete(item)
960                        self.G2plotNB.Delete(name)
961                    item, cookie = self.PatternTree.GetFirstChild(self.root)
962                    while item:
963                        name = self.PatternTree.GetItemText(item)
964                        if 'PWDR' in name:
965                            Id = G2gd.GetPatternTreeItemId(self,item, 'Reflection Lists')
966                            refList = self.PatternTree.GetItemPyData(Id)
967                            for i,item in DelList:
968                                del(refList[item])
969                            self.PatternTree.SetItemPyData(Id,refList)
970                        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
971            finally:
972                dlg.Destroy()
973               
974    def OnRenameData(self,event):
975        name = self.PatternTree.GetItemText(self.PickId)     
976        if 'PWDR' in name or 'HKLF' in name or 'IMG' in name:
977            dataType = name[:name.index(' ')+1]                 #includes the ' '
978            dlg = wx.TextEntryDialog(self,'Data name: '+dataType,'Change data name',
979                defaultValue=name[name.index(' ')+1:])
980            try:
981                if dlg.ShowModal() == wx.ID_OK:
982                    self.PatternTree.SetItemText(self.PickId,dataType+dlg.GetValue())
983            finally:
984                dlg.Destroy()
985       
986    def GetFileList(self,fileType,skip=None):        #potentially useful?
987        fileList = []
988        Source = ''
989        id, cookie = self.PatternTree.GetFirstChild(self.root)
990        while id:
991            name = self.PatternTree.GetItemText(id)
992            if fileType in name:
993                if id == skip:
994                    Source = name
995                else:
996                    fileList.append([False,name,id])
997            id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
998        if skip:
999            return fileList,Source
1000        else:
1001            return fileList
1002           
1003    def OnDataDelete(self, event):
1004        TextList = ['All Data']
1005        DelList = []
1006        DelItemList = []
1007        ifPWDR = False
1008        ifIMG = False
1009        ifHKLF = False
1010        ifPDF = False
1011        if self.PatternTree.GetCount():
1012            item, cookie = self.PatternTree.GetFirstChild(self.root)
1013            while item:
1014                name = self.PatternTree.GetItemText(item)
1015                if name not in ['Notebook','Controls','Covariance','Constraints','Restraints','Phases']:
1016                    if 'PWDR' in name: ifPWDR = True
1017                    if 'IMG' in name: ifIMG = True
1018                    if 'HKLF' in name: ifHKLF = True
1019                    if 'PDF' in name: ifPDF = True
1020                    TextList.append(name)
1021                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1022            if ifPWDR: TextList.insert(1,'All PWDR')
1023            if ifIMG: TextList.insert(1,'All IMG')
1024            if ifHKLF: TextList.insert(1,'All HKLF')
1025            if ifPDF: TextList.insert(1,'All PDF')               
1026            dlg = wx.MultiChoiceDialog(self, 'Which data to delete?', 'Delete data', TextList, wx.CHOICEDLG_STYLE)
1027            try:
1028                if dlg.ShowModal() == wx.ID_OK:
1029                    result = dlg.GetSelections()
1030                    for i in result: DelList.append(TextList[i])
1031                    if 'All Data' in DelList:
1032                        DelList = [item for item in TextList if item[:3] != 'All']
1033                    elif 'All PWDR' in DelList:
1034                        DelList = [item for item in TextList if item[:4] == 'PWDR']
1035                    elif 'All IMG' in DelList:
1036                        DelList = [item for item in TextList if item[:3] == 'IMG']
1037                    elif 'All HKLF' in DelList:
1038                        DelList = [item for item in TextList if item[:4] == 'HKLF']
1039                    elif 'All PDF' in DelList:
1040                        DelList = [item for item in TextList if item[:3] == 'PDF']
1041                    item, cookie = self.PatternTree.GetFirstChild(self.root)
1042                    while item:
1043                        if self.PatternTree.GetItemText(item) in DelList: DelItemList.append(item)
1044                        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1045                    for item in DelItemList:
1046                        self.PatternTree.Delete(item)
1047                    G2plt.PlotPatterns(self,True)                        #so plot gets updated
1048            finally:
1049                dlg.Destroy()
1050
1051    def OnFileOpen(self, event):
1052        result = ''
1053        Id = 0
1054        if self.PatternTree.GetChildrenCount(self.root,False):
1055            if self.dataFrame:
1056                self.dataFrame.Clear() 
1057            dlg = wx.MessageDialog(self, 'Overwrite?','Project exists!',  wx.OK | wx.CANCEL)
1058            try:
1059                result = dlg.ShowModal()
1060                if result == wx.ID_OK:
1061                    self.PatternTree.DeleteChildren(self.root)
1062                    self.GSASprojectfile = ''
1063#                    self.PatternTree.DeleteChildren(self.root)
1064                    if self.HKL: self.HKL = []
1065                    if self.G2plotNB.plotList:
1066                        self.G2plotNB.clear()
1067            finally:
1068                dlg.Destroy()
1069        if result != wx.ID_CANCEL:   
1070            if self.dataDisplay: self.dataDisplay.Destroy()
1071            dlg = wx.FileDialog(self, 'Choose GSAS-II project file', '.', '', 
1072                'GSAS-II project file (*.gpx)|*.gpx',wx.OPEN)
1073            if self.dirname: dlg.SetDirectory(self.dirname)
1074            try:
1075                if dlg.ShowModal() == wx.ID_OK:
1076                    self.GSASprojectfile = dlg.GetPath()
1077                    self.dirname = dlg.GetDirectory()
1078                    G2IO.ProjFileOpen(self)
1079                    self.PatternTree.SetItemText(self.root,'Loaded Data: '+self.GSASprojectfile)
1080                    self.PatternTree.Expand(self.root)
1081                    self.HKL = []
1082                    item, cookie = self.PatternTree.GetFirstChild(self.root)
1083                    while item and not Id:
1084                        name = self.PatternTree.GetItemText(item)
1085                        if name[:4] in ['PWDR','HKLF','IMG ','PDF ']:
1086                            Id = item
1087                        elif name == 'Controls':
1088                            data = self.PatternTree.GetItemPyData(item)
1089                            if data:
1090                                self.Refine.Enable(True)
1091                                self.SeqRefine.Enable(True)
1092                                self.Solve.Enable(True)         #not right but something needed here
1093                        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)               
1094                    if Id:
1095                        self.PatternTree.SelectItem(Id)
1096                    self.CheckNotebook()
1097            finally:
1098                dlg.Destroy()
1099
1100
1101    def OnFileClose(self, event):
1102        if self.dataFrame:
1103            self.dataFrame.Clear()
1104            self.dataFrame.SetLabel('GSAS-II data display') 
1105        dlg = wx.MessageDialog(self, 'Save current project?', ' ', wx.YES | wx.NO | wx.CANCEL)
1106        try:
1107            result = dlg.ShowModal()
1108            if result == wx.ID_OK:
1109                self.OnFileSaveMenu(event)
1110            if result != wx.ID_CANCEL:
1111                self.GSASprojectfile = ''
1112                self.PatternTree.SetItemText(self.root,'Loaded Data: ')
1113                self.PatternTree.DeleteChildren(self.root)
1114                if self.HKL: self.HKL = []
1115                if self.G2plotNB.plotList:
1116                    self.G2plotNB.clear()
1117        finally:
1118            dlg.Destroy()
1119
1120    def OnFileSave(self, event):
1121        if self.GSASprojectfile: 
1122            self.PatternTree.SetItemText(self.root,'Loaded Data: '+self.GSASprojectfile)
1123            G2IO.ProjFileSave(self)
1124        else:
1125            self.OnFileSaveas(event)
1126
1127    def OnFileSaveas(self, event):
1128        dlg = wx.FileDialog(self, 'Choose GSAS-II project file name', '.', '', 
1129            'GSAS-II project file (*.gpx)|*.gpx',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
1130        if self.dirname:
1131            dlg.SetDirectory(self.dirname)
1132        try:
1133            if dlg.ShowModal() == wx.ID_OK:
1134                self.GSASprojectfile = dlg.GetPath()
1135                self.PatternTree.SetItemText(self.root,'Loaded Data: '+self.GSASprojectfile)
1136                G2IO.ProjFileSave(self)
1137                self.dirname = dlg.GetDirectory()
1138        finally:
1139            dlg.Destroy()
1140
1141    def ExitMain(self, event):
1142        if self.undofile:
1143            os.remove(self.undofile)
1144        sys.exit()
1145       
1146    def OnFileExit(self, event):
1147        if self.dataFrame:
1148            self.dataFrame.Clear() 
1149            self.dataFrame.Destroy()
1150        self.Close()
1151       
1152    def OnImportPattern(self,event):
1153        dlg = wx.FileDialog(self, 'Choose nonGSAS powder file', '.', '', 
1154            '(*.*)|*.*',wx.OPEN)
1155        if self.dirname:
1156            dlg.SetDirectory(self.dirname)
1157        try:
1158            if dlg.ShowModal() == wx.ID_OK:
1159                self.powderfile = dlg.GetPath()
1160                self.dirname = dlg.GetDirectory()
1161        finally:
1162            dlg.Destroy()
1163           
1164    def OnImportHKL(self,event):
1165        dlg = wx.FileDialog(self, 'Choose structure factor file', '.', '', 
1166            '(*.*)|*.*',wx.OPEN)
1167        if self.dirname:
1168            dlg.SetDirectory(self.dirname)
1169        try:
1170            if dlg.ShowModal() == wx.ID_OK:
1171                self.HKLfile = dlg.GetPath()
1172                self.dirname = dlg.GetDirectory()
1173        finally:
1174            dlg.Destroy()
1175       
1176    def OnImportPhase(self,event):
1177        dlg = wx.FileDialog(self, 'Choose GSAS EXP file', '.', '', 
1178            'EXP file (*.EXP)|*.EXP',wx.OPEN)
1179        if self.dirname:
1180            dlg.SetDirectory(self.dirname)
1181        try:
1182            Phase = {}
1183            if dlg.ShowModal() == wx.ID_OK:
1184                EXPfile = dlg.GetPath()
1185                self.dirname = dlg.GetDirectory()
1186                Phase = G2IO.ReadEXPPhase(self,EXPfile)
1187        finally:
1188            dlg.Destroy()
1189        if Phase:
1190            PhaseName = Phase['General']['Name']
1191            if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
1192                sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
1193            else:
1194                sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
1195            sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
1196            self.PatternTree.SetItemPyData(sub,Phase)
1197           
1198    def OnImportPDB(self,event):
1199        dlg = wx.FileDialog(self, 'Choose PDB file', '.', '', 
1200            'PDB file (*.pdb,*.ent)|*.pdb;*.ent|All files (*.*)|*.*',wx.OPEN)
1201        if self.dirname:
1202            dlg.SetDirectory(self.dirname)
1203        try:
1204            if dlg.ShowModal() == wx.ID_OK:
1205                PDBfile = dlg.GetPath()
1206                self.dirname = dlg.GetDirectory()
1207                Phase = G2IO.ReadPDBPhase(PDBfile)
1208        finally:
1209            dlg.Destroy()
1210        if Phase:
1211            PhaseName = Phase['General']['Name']
1212            if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
1213                sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
1214            else:
1215                sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
1216            sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
1217            self.PatternTree.SetItemPyData(sub,Phase)       
1218       
1219    def OnImportCIF(self,event):
1220        dlg = wx.FileDialog(self, 'Choose CIF file', '.', '', 
1221            'CIF file (*.cif)|*.cif',wx.OPEN)
1222        if self.dirname:
1223            dlg.SetDirectory(self.dirname)
1224        try:
1225            if dlg.ShowModal() == wx.ID_OK:
1226                CIFfile = dlg.GetPath()
1227                self.dirname = dlg.GetDirectory()
1228                Phase = G2IO.ReadCIFPhase(CIFfile)
1229        finally:
1230            dlg.Destroy()
1231        if Phase:
1232            PhaseName = Phase['General']['Name']
1233            if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
1234                sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
1235            else:
1236                sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
1237            sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
1238            self.PatternTree.SetItemPyData(sub,Phase)       
1239       
1240    def OnExportPatterns(self,event):
1241        names = ['All']
1242        exports = []
1243        item, cookie = self.PatternTree.GetFirstChild(self.root)
1244        while item:
1245            name = self.PatternTree.GetItemText(item)
1246            if 'PWDR' in name:
1247                names.append(name)
1248            item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1249        if names:
1250            dlg = wx.MultiChoiceDialog(self,'Select','Powder patterns to export',names)
1251            if dlg.ShowModal() == wx.ID_OK:
1252                sel = dlg.GetSelections()
1253                if sel[0] == 0:
1254                    exports = names[1:]
1255                else:
1256                    for x in sel:
1257                        exports.append(names[x])
1258            dlg.Destroy()
1259        if exports:
1260            dlg = wx.FileDialog(self, 'Choose output powder file name', '.', '', 
1261                'GSAS fxye file (*.fxye)|*.fxye|xye file (*.xye)|*.xye',
1262                wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
1263            if self.dirname:
1264                dlg.SetDirectory(self.dirname)
1265            try:
1266                if dlg.ShowModal() == wx.ID_OK:
1267                    powderfile = dlg.GetPath()
1268                    if 'fxye' in powderfile:
1269                        G2IO.powderFxyeSave(self,exports,powderfile)
1270                    else:       #just xye
1271                        G2IO.powderXyeSave(self,exports,powderfile)
1272                    self.dirname = dlg.GetDirectory()
1273            finally:
1274                dlg.Destroy()
1275       
1276    def OnExportPeakList(self,event):
1277        dlg = wx.FileDialog(self, 'Choose output peak list file name', '.', '', 
1278            '(*.*)|*.*',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
1279        if self.dirname:
1280            dlg.SetDirectory(self.dirname)
1281        try:
1282            if dlg.ShowModal() == wx.ID_OK:
1283                self.peaklistfile = dlg.GetPath()
1284                file = open(self.peaklistfile,'w')               
1285                item, cookie = self.PatternTree.GetFirstChild(self.root)
1286                while item:
1287                    name = self.PatternTree.GetItemText(item)
1288                    if 'PWDR' in name:
1289                        item2, cookie2 = self.PatternTree.GetFirstChild(item)
1290                        while item2:
1291                            name2 = self.PatternTree.GetItemText(item2)
1292                            if name2 == 'Peak List':
1293                                peaks = self.PatternTree.GetItemPyData(item2)
1294                                file.write("%s \n" % (name+' Peak List'))               
1295                                for peak in peaks:
1296                                    file.write("%10.4f %12.2f %10.3f %10.3f \n" % \
1297                                        (peak[0],peak[2],peak[4],peak[6]))
1298                            item2, cookie2 = self.PatternTree.GetNextChild(item, cookie2)                           
1299                    item, cookie = self.PatternTree.GetNextChild(self.root, cookie)                           
1300                file.close()
1301                self.dirname = dlg.GetDirectory()
1302        finally:
1303            dlg.Destroy()
1304       
1305    def OnExportHKL(self,event):
1306        event.Skip()
1307       
1308    def OnExportPDF(self,event):
1309        #need S(Q) and G(R) to be saved here - probably best from selection?
1310        names = ['All']
1311        exports = []
1312        item, cookie = self.PatternTree.GetFirstChild(self.root)
1313        while item:
1314            name = self.PatternTree.GetItemText(item)
1315            if 'PDF' in name:
1316                names.append(name)
1317            item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1318        if names:
1319            dlg = wx.MultiChoiceDialog(self,'Select','PDF patterns to export',names)
1320            if dlg.ShowModal() == wx.ID_OK:
1321                sel = dlg.GetSelections()
1322                if sel[0] == 0:
1323                    exports = names[1:]
1324                else:
1325                    for x in sel:
1326                        exports.append(names[x])
1327            dlg.Destroy()
1328        if exports:
1329            G2IO.PDFSave(self,exports)
1330       
1331    def OnExportPhase(self,event):
1332        event.Skip()
1333       
1334    def OnExportCIF(self,event):
1335        event.Skip()
1336
1337    def OnMakePDFs(self,event):
1338        tth2q = lambda t,w:4.0*math.pi*sind(t/2.0)/w
1339        TextList = ['All PWDR']
1340        PDFlist = []
1341        Names = []
1342        if self.PatternTree.GetCount():
1343            id, cookie = self.PatternTree.GetFirstChild(self.root)
1344            while id:
1345                name = self.PatternTree.GetItemText(id)
1346                Names.append(name)
1347                if 'PWDR' in name:
1348                    TextList.append(name)
1349                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1350            if len(TextList) == 1:
1351                self.ErrorDialog('Nothing to make PDFs for','There must be at least one "PWDR" pattern')
1352                return
1353            dlg = wx.MultiChoiceDialog(self,'Make PDF controls','Make PDF controls for:',TextList, wx.CHOICEDLG_STYLE)
1354            try:
1355                if dlg.ShowModal() == wx.ID_OK:
1356                    result = dlg.GetSelections()
1357                    for i in result: PDFlist.append(TextList[i])
1358                    if 0 in result:
1359                        PDFlist = [item for item in TextList if item[:4] == 'PWDR']                       
1360                    for item in PDFlist:
1361                        PWDRname = item[4:]
1362                        Id = self.PatternTree.AppendItem(parent=self.root,text='PDF '+PWDRname)
1363                        Data = {
1364                            'Sample':{'Name':item,'Mult':1.0,'Add':0.0},
1365                            'Sample Bkg.':{'Name':'','Mult':-1.0,'Add':0.0},
1366                            'Container':{'Name':'','Mult':-1.0,'Add':0.0},
1367                            'Container Bkg.':{'Name':'','Mult':-1.0,'Add':0.0},'ElList':{},
1368                            'Geometry':'Cylinder','Diam':1.0,'Pack':0.50,'Form Vol':10.0,
1369                            'DetType':'Image plate','ObliqCoeff':0.2,'Ruland':0.025,'QScaleLim':[0,100],
1370                            'Lorch':True,}
1371                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='PDF Controls'),Data)
1372                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='I(Q)'+PWDRname),[])       
1373                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='S(Q)'+PWDRname),[])       
1374                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='F(Q)'+PWDRname),[])       
1375                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='G(R)'+PWDRname),[])       
1376                self.ExportPDF.Enable(True)
1377            finally:
1378                dlg.Destroy()
1379               
1380    def GetPWDRdatafromTree(self,PWDRname):
1381        ''' Returns powder data from GSASII tree
1382        input:
1383            PWDRname = powder histogram name as obtained from GetHistogramNames
1384        return:
1385            PWDRdata = powder data dictionary with:
1386                Data - powder data arrays, Limits, Instrument Parameters, Sample Parameters           
1387        '''
1388        PWDRdata = {}
1389        PWDRdata['Data'] = self.PatternTree.GetItemPyData(PWDRname)[1]          #powder data arrays
1390        PWDRdata['Limits'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PWDRname,'Limits'))
1391        PWDRdata['Background'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PWDRname,'Background'))
1392        PWDRdata['Instrument Parameters'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PWDRname,'Instrument Parameters'))
1393        PWDRdata['Sample Parameters'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PWDRname,'Sample Parameters'))
1394        PWDRdata['Reflection Lists'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PWDRname,'Reflection Lists'))
1395        return PWDRdata
1396
1397    def GetHKLFdatafromTree(self,HKLFname):
1398        ''' Returns single crystal data from GSASII tree
1399        input:
1400            HKLFname = single crystal histogram name as obtained from GetHistogramNames
1401        return:
1402            HKLFdata = single crystal data list of reflections: for each reflection:
1403                HKLF = [np.array([h,k,l]),FoSq,sigFoSq,FcSq,Fcp,Fcpp,phase]
1404        '''
1405        HKLFdata = []
1406        while True:
1407            data = self.PatternTree.GetItemPyData(HKLFname)
1408            datum = data[0]
1409            if datum[0] == HKLFname:
1410                HKLFdata = datum[1:][0]
1411        return HKLFdata
1412                   
1413    def GetUsedHistogramsAndPhasesfromTree(self):
1414        ''' Returns all histograms that are found in any phase
1415        and any phase that uses a histogram
1416        return:
1417            Histograms = dictionary of histograms as {name:data,...}
1418            Phases = dictionary of phases that use histograms
1419        '''
1420        phaseData = {}
1421        if G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
1422            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
1423        else:
1424            print 'no phases to be refined'
1425            return
1426        if sub:
1427            item, cookie = self.PatternTree.GetFirstChild(sub)
1428            while item:
1429                phaseData[self.PatternTree.GetItemText(item)] =  self.PatternTree.GetItemPyData(item)               
1430                item, cookie = self.PatternTree.GetNextChild(sub, cookie)               
1431        Histograms = {}
1432        Phases = {}
1433        pId = 0
1434        hId = 0
1435        for phase in phaseData:
1436            Phase = phaseData[phase]
1437            if Phase['Histograms']:
1438                if phase not in Phases:
1439                    Phase['pId'] = pId
1440                    pId += 1
1441                    Phases[phase] = Phase
1442                for hist in Phase['Histograms']:
1443                    if hist not in Histograms:
1444                        item = G2gd.GetPatternTreeItemId(self,self.root,hist)
1445                        if 'PWDR' in hist[:4]: 
1446                            Histograms[hist] = self.GetPWDRdatafromTree(item)
1447                        elif 'HKLF' in hist[:4]:
1448                            Histograms[hist] = self.GetHKLFdatafromTree(item)
1449                        #future restraint, etc. histograms here           
1450                        Histograms[hist]['hId'] = hId
1451                        hId += 1
1452        return Histograms,Phases
1453       
1454    class ViewParmDialog(wx.Dialog):
1455        def __init__(self,parent,title,parmDict):
1456            wx.Dialog.__init__(self,parent,-1,title,size=(260,430),
1457                pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
1458            panel = wx.Panel(self,size=(260,430))
1459            parmNames = parmDict.keys()
1460            parmNames.sort()
1461            parmText = ' p:h:Parameter       refine?              value\n'
1462            for name in parmNames:
1463                parmData = parmDict[name]
1464                try:
1465                    parmText += ' %s \t%12.4g \n'%(name.ljust(19)+'\t'+parmData[1],parmData[0])
1466                except TypeError:
1467                    pass
1468            parmTable = wx.TextCtrl(panel,-1,parmText,
1469                style=wx.TE_MULTILINE|wx.TE_READONLY,size=(250,400))
1470            mainSizer = wx.BoxSizer(wx.VERTICAL)
1471            mainSizer.Add(parmTable)
1472            panel.SetSizer(mainSizer)
1473               
1474           
1475    def OnViewLSParms(self,event):
1476        parmDict = {}
1477        Histograms,Phases = self.GetUsedHistogramsAndPhasesfromTree()
1478        Natoms,phaseVary,phaseDict,pawleyLookup,FFtable = G2str.GetPhaseData(Phases,Print=False)       
1479        hapVary,hapDict,controlDict = G2str.GetHistogramPhaseData(Phases,Histograms,Print=False)
1480        histVary,histDict,controlDict = G2str.GetHistogramData(Histograms,Print=False)
1481        varyList = phaseVary+hapVary+histVary
1482        parmDict.update(phaseDict)
1483        parmDict.update(hapDict)
1484        parmDict.update(histDict)
1485        for parm in parmDict:
1486            if parm.split(':')[-1] in ['Azimuth','Gonio. radius','Lam1','Lam2','Omega','Chi','Phi']:
1487                parmDict[parm] = [parmDict[parm],' ']
1488            elif parm.split(':')[-2] in ['Ax','Ay','Az','SHmodel','SHord']:
1489                parmDict[parm] = [parmDict[parm],' ']
1490            elif parm in varyList:
1491                parmDict[parm] = [parmDict[parm],'True']
1492            else:
1493                parmDict[parm] = [parmDict[parm],'False']
1494        dlg = self.ViewParmDialog(self,'Parameters for least squares',parmDict)
1495        try:
1496            if dlg.ShowModal() == wx.ID_OK:
1497                print 'do something with changes?? - No!'
1498        finally:
1499            dlg.Destroy()
1500       
1501    def OnRefine(self,event):
1502        self.OnFileSave(event)
1503        #works - but it'd be better if it could restore plots
1504        dlg = wx.ProgressDialog('Residual','Powder profile Rwp =',101.0, 
1505            style = wx.PD_ELAPSED_TIME|wx.PD_AUTO_HIDE|wx.PD_CAN_ABORT)
1506        screenSize = wx.ClientDisplayRect()
1507        Size = dlg.GetSize()
1508        dlg.SetPosition(wx.Point(screenSize[2]-Size[0]-305,screenSize[1]+5))
1509        try:
1510            G2str.Refine(self.GSASprojectfile,dlg)
1511        finally:
1512            dlg.Destroy()       
1513        dlg = wx.MessageDialog(self,'Load new result?','Refinement results',wx.OK|wx.CANCEL)
1514        try:
1515            if dlg.ShowModal() == wx.ID_OK:
1516                Id = 0
1517                self.PatternTree.DeleteChildren(self.root)
1518                if self.HKL: self.HKL = []
1519                if self.G2plotNB.plotList:
1520                    self.G2plotNB.clear()
1521                G2IO.ProjFileOpen(self)
1522                item, cookie = self.PatternTree.GetFirstChild(self.root)
1523                while item and not Id:
1524                    name = self.PatternTree.GetItemText(item)
1525                    if name[:4] in ['PWDR','HKLF']:
1526                        Id = item
1527                    item, cookie = self.PatternTree.GetNextChild(self.root, cookie)               
1528                if Id:
1529                    self.PatternTree.SelectItem(Id)
1530        finally:
1531            dlg.Destroy()
1532
1533    def OnSeqRefine(self,event):
1534        self.OnFileSave(event)
1535        Id = G2gd.GetPatternTreeItemId(self,self.root,'Sequental results')
1536        print Id
1537        if not Id:
1538            Id = self.PatternTree.AppendItem(self.root,text='Sequental results')
1539            print Id
1540            self.PatternTree.SetItemPyData(Id,{})           
1541        dlg = wx.ProgressDialog('Residual for histogram 0','Powder profile Rwp =',101.0, 
1542            style = wx.PD_ELAPSED_TIME|wx.PD_AUTO_HIDE|wx.PD_CAN_ABORT)
1543        screenSize = wx.ClientDisplayRect()
1544        Size = dlg.GetSize()
1545        dlg.SetPosition(wx.Point(screenSize[2]-Size[0]-305,screenSize[1]+5))
1546        try:
1547            G2str.SeqRefine(self.GSASprojectfile,dlg)
1548        finally:
1549            dlg.Destroy()       
1550        dlg = wx.MessageDialog(self,'Load new result?','Refinement results',wx.OK|wx.CANCEL)
1551        try:
1552            if dlg.ShowModal() == wx.ID_OK:
1553                Id = 0
1554                self.PatternTree.DeleteChildren(self.root)
1555                if self.HKL: self.HKL = []
1556                if self.G2plotNB.plotList:
1557                    self.G2plotNB.clear()
1558                G2IO.ProjFileOpen(self)
1559                item, cookie = self.PatternTree.GetFirstChild(self.root)
1560                while item and not Id:
1561                    name = self.PatternTree.GetItemText(item)
1562                    if name[:4] in ['PWDR','HKLF']:
1563                        Id = item
1564                    item, cookie = self.PatternTree.GetNextChild(self.root, cookie)               
1565                if Id:
1566                    self.PatternTree.SelectItem(Id)
1567        finally:
1568            dlg.Destroy()
1569       
1570    def OnSolve(self,event):
1571        #works - but it'd be better if it could restore plots
1572        G2sol.Solve(self.GSASprojectfile)
1573        dlg = wx.MessageDialog(self,'Load new result?','Structure solution results',wx.OK|wx.CANCEL)
1574        try:
1575            if dlg.ShowModal() == wx.ID_OK:
1576                self.PatternTree.DeleteChildren(self.root)
1577                if self.HKL: self.HKL = []
1578                if self.G2plotNB.plotList:
1579                    self.G2plotNB.clear()
1580                G2IO.ProjFileOpen(self)
1581        finally:
1582            dlg.Destroy()
1583       
1584    def ErrorDialog(self,title,message):
1585        dlg = wx.MessageDialog(self, message, title,  wx.OK)
1586        try:
1587            result = dlg.ShowModal()
1588        finally:
1589            dlg.Destroy()
1590
1591    def OnHelpHelp(self, event):
1592        event.Skip()
1593       
1594    def OnHelpAbout(self, event):
1595        info = wx.AboutDialogInfo()
1596        info.Name = 'GSAS-II'
1597        info.Version = __version__
1598        info.Copyright = '''
1599Robert B. Von Dreele
1600Argonne National Laboratory(C)
1601This product includes software developed
1602by the UChicago Argonne, LLC, as
1603Operator of Argonne National Laboratory.         '''
1604        info.Description = '''
1605General Structure Analysis System - II
1606        '''
1607        wx.AboutBox(info)
1608       
1609class GSASIImain(wx.App):
1610    def OnInit(self):
1611        self.main = GSASII(None)
1612        self.main.Show()
1613        self.SetTopWindow(self.main)
1614        return True
1615
1616def main():
1617    application = GSASIImain(0)
1618    application.MainLoop()
1619
1620if __name__ == '__main__':
1621    main()
Note: See TracBrowser for help on using the repository browser.