source: trunk/GSASII.py @ 399

Last change on this file since 399 was 399, checked in by vondreele, 12 years ago

Implement sequential refinement
remove print "load" & "save" for each item in Tree
revise application of azimuth offset - azimuths are now all "true" with correction

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