source: trunk/GSASII.py @ 468

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

changed self to G2frame everywhere in all "sub" files that use it
fixed creation of 'bak' files
now force save of a new gpx file before 1st peak fit so
GSAS.save is put in a sensible directory

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