source: trunk/GSASII.py @ 426

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

allow repositioning of reflection markers (up or down)

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