source: trunk/GSASII.py @ 404

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

put error bars on seq refinement plots
add cubic elastic strain coeff
make sure results are saved from seq refinements

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