source: trunk/GSASII.py @ 467

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

more on file directories
fix for image controls & mask save
modify image controls data

  • Property svn:keywords set to Date Author Revision URL Id
File size: 76.7 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#GSASII
4########### SVN repository information ###################
5# $Date: 2012-02-01 22:03:51 +0000 (Wed, 01 Feb 2012) $
6# $Author: vondreele $
7# $Revision: 467 $
8# $URL: trunk/GSASII.py $
9# $Id: GSASII.py 467 2012-02-01 22:03:51Z 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        if self.dirname:
1142            dlg.SetDirectory(self.dirname)
1143        try:
1144            if dlg.ShowModal() == wx.ID_OK:
1145                self.GSASprojectfile = dlg.GetPath()
1146                self.PatternTree.SetItemText(self.root,'Loaded Data: '+self.GSASprojectfile)
1147                G2IO.ProjFileSave(self)
1148                self.dirname = dlg.GetDirectory()
1149        finally:
1150            dlg.Destroy()
1151
1152    def ExitMain(self, event):
1153        if self.undofile:
1154            os.remove(self.undofile)
1155        sys.exit()
1156       
1157    def OnFileExit(self, event):
1158        if self.dataFrame:
1159            self.dataFrame.Clear() 
1160            self.dataFrame.Destroy()
1161        self.Close()
1162       
1163    def OnImportPattern(self,event):
1164        dlg = wx.FileDialog(self, 'Choose nonGSAS powder file', '.', '', 
1165            '(*.*)|*.*',wx.OPEN|wx.CHANGE_DIR)
1166        try:
1167            if dlg.ShowModal() == wx.ID_OK:
1168                self.powderfile = dlg.GetPath()
1169        finally:
1170            dlg.Destroy()
1171           
1172    def OnImportHKL(self,event):
1173        dlg = wx.FileDialog(self, 'Choose structure factor file', '.', '', 
1174            '(*.*)|*.*',wx.OPEN|wx.CHANGE_DIR)
1175        try:
1176            if dlg.ShowModal() == wx.ID_OK:
1177                self.HKLfile = dlg.GetPath()
1178        finally:
1179            dlg.Destroy()
1180       
1181    def OnImportPhase(self,event):
1182        dlg = wx.FileDialog(self, 'Choose GSAS EXP file', '.', '', 
1183            'EXP file (*.EXP)|*.EXP',wx.OPEN|wx.CHANGE_DIR)
1184        try:
1185            Phase = {}
1186            if dlg.ShowModal() == wx.ID_OK:
1187                EXPfile = dlg.GetPath()
1188                Phase = G2IO.ReadEXPPhase(self,EXPfile)
1189        finally:
1190            dlg.Destroy()
1191        if Phase:
1192            PhaseName = Phase['General']['Name']
1193            if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
1194                sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
1195            else:
1196                sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
1197            sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
1198            self.PatternTree.SetItemPyData(sub,Phase)
1199           
1200    def OnImportPDB(self,event):
1201        dlg = wx.FileDialog(self, 'Choose PDB file', '.', '', 
1202            'PDB file (*.pdb,*.ent)|*.pdb;*.ent|All files (*.*)|*.*',wx.OPEN|wx.CHANGE_DIR)
1203        try:
1204            if dlg.ShowModal() == wx.ID_OK:
1205                PDBfile = dlg.GetPath()
1206                Phase = G2IO.ReadPDBPhase(PDBfile)
1207        finally:
1208            dlg.Destroy()
1209        if Phase:
1210            PhaseName = Phase['General']['Name']
1211            if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
1212                sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
1213            else:
1214                sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
1215            sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
1216            self.PatternTree.SetItemPyData(sub,Phase)       
1217       
1218    def OnImportCIF(self,event):
1219        dlg = wx.FileDialog(self, 'Choose CIF file', '.', '', 
1220            'CIF file (*.cif)|*.cif',wx.OPEN|wx.CHANGE_DIR)
1221        try:
1222            if dlg.ShowModal() == wx.ID_OK:
1223                CIFfile = dlg.GetPath()
1224                Phase = G2IO.ReadCIFPhase(CIFfile)
1225        finally:
1226            dlg.Destroy()
1227        if Phase:
1228            PhaseName = Phase['General']['Name']
1229            if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
1230                sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
1231            else:
1232                sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
1233            sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
1234            self.PatternTree.SetItemPyData(sub,Phase)       
1235       
1236    def OnExportPatterns(self,event):
1237        names = ['All']
1238        exports = []
1239        item, cookie = self.PatternTree.GetFirstChild(self.root)
1240        while item:
1241            name = self.PatternTree.GetItemText(item)
1242            if 'PWDR' in name:
1243                names.append(name)
1244            item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1245        if names:
1246            dlg = wx.MultiChoiceDialog(self,'Select','Powder patterns to export',names)
1247            if dlg.ShowModal() == wx.ID_OK:
1248                sel = dlg.GetSelections()
1249                if sel[0] == 0:
1250                    exports = names[1:]
1251                else:
1252                    for x in sel:
1253                        exports.append(names[x])
1254            dlg.Destroy()
1255        if exports:
1256            dlg = wx.FileDialog(self, 'Choose output powder file name', '.', '', 
1257                'GSAS fxye file (*.fxye)|*.fxye|xye file (*.xye)|*.xye',
1258                wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT|wx.CHANGE_DIR)
1259            try:
1260                if dlg.ShowModal() == wx.ID_OK:
1261                    powderfile = dlg.GetPath()
1262                    if 'fxye' in powderfile:
1263                        G2IO.powderFxyeSave(self,exports,powderfile)
1264                    else:       #just xye
1265                        G2IO.powderXyeSave(self,exports,powderfile)
1266            finally:
1267                dlg.Destroy()
1268       
1269    def OnExportPeakList(self,event):
1270        dlg = wx.FileDialog(self, 'Choose output peak list file name', '.', '', 
1271            '(*.*)|*.*',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT|wx.CHANGE_DIR)
1272        try:
1273            if dlg.ShowModal() == wx.ID_OK:
1274                self.peaklistfile = dlg.GetPath()
1275                file = open(self.peaklistfile,'w')               
1276                item, cookie = self.PatternTree.GetFirstChild(self.root)
1277                while item:
1278                    name = self.PatternTree.GetItemText(item)
1279                    if 'PWDR' in name:
1280                        item2, cookie2 = self.PatternTree.GetFirstChild(item)
1281                        while item2:
1282                            name2 = self.PatternTree.GetItemText(item2)
1283                            if name2 == 'Peak List':
1284                                peaks = self.PatternTree.GetItemPyData(item2)
1285                                file.write("%s \n" % (name+' Peak List'))               
1286                                for peak in peaks:
1287                                    file.write("%10.4f %12.2f %10.3f %10.3f \n" % \
1288                                        (peak[0],peak[2],peak[4],peak[6]))
1289                            item2, cookie2 = self.PatternTree.GetNextChild(item, cookie2)                           
1290                    item, cookie = self.PatternTree.GetNextChild(self.root, cookie)                           
1291                file.close()
1292        finally:
1293            dlg.Destroy()
1294       
1295    def OnExportHKL(self,event):
1296        event.Skip()
1297       
1298    def OnExportPDF(self,event):
1299        #need S(Q) and G(R) to be saved here - probably best from selection?
1300        names = ['All']
1301        exports = []
1302        item, cookie = self.PatternTree.GetFirstChild(self.root)
1303        while item:
1304            name = self.PatternTree.GetItemText(item)
1305            if 'PDF' in name:
1306                names.append(name)
1307            item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1308        if names:
1309            dlg = wx.MultiChoiceDialog(self,'Select','PDF patterns to export',names)
1310            if dlg.ShowModal() == wx.ID_OK:
1311                sel = dlg.GetSelections()
1312                if sel[0] == 0:
1313                    exports = names[1:]
1314                else:
1315                    for x in sel:
1316                        exports.append(names[x])
1317            dlg.Destroy()
1318        if exports:
1319            G2IO.PDFSave(self,exports)
1320       
1321    def OnExportPhase(self,event):
1322        event.Skip()
1323       
1324    def OnExportCIF(self,event):
1325        event.Skip()
1326
1327    def OnMakePDFs(self,event):
1328        tth2q = lambda t,w:4.0*math.pi*sind(t/2.0)/w
1329        TextList = ['All PWDR']
1330        PDFlist = []
1331        Names = []
1332        if self.PatternTree.GetCount():
1333            id, cookie = self.PatternTree.GetFirstChild(self.root)
1334            while id:
1335                name = self.PatternTree.GetItemText(id)
1336                Names.append(name)
1337                if 'PWDR' in name:
1338                    TextList.append(name)
1339                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
1340            if len(TextList) == 1:
1341                self.ErrorDialog('Nothing to make PDFs for','There must be at least one "PWDR" pattern')
1342                return
1343            dlg = wx.MultiChoiceDialog(self,'Make PDF controls','Make PDF controls for:',TextList, wx.CHOICEDLG_STYLE)
1344            try:
1345                if dlg.ShowModal() == wx.ID_OK:
1346                    result = dlg.GetSelections()
1347                    for i in result: PDFlist.append(TextList[i])
1348                    if 0 in result:
1349                        PDFlist = [item for item in TextList if item[:4] == 'PWDR']                       
1350                    for item in PDFlist:
1351                        PWDRname = item[4:]
1352                        Id = self.PatternTree.AppendItem(parent=self.root,text='PDF '+PWDRname)
1353                        Data = {
1354                            'Sample':{'Name':item,'Mult':1.0,'Add':0.0},
1355                            'Sample Bkg.':{'Name':'','Mult':-1.0,'Add':0.0},
1356                            'Container':{'Name':'','Mult':-1.0,'Add':0.0},
1357                            'Container Bkg.':{'Name':'','Mult':-1.0,'Add':0.0},'ElList':{},
1358                            'Geometry':'Cylinder','Diam':1.0,'Pack':0.50,'Form Vol':10.0,
1359                            'DetType':'Image plate','ObliqCoeff':0.2,'Ruland':0.025,'QScaleLim':[0,100],
1360                            'Lorch':True,}
1361                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='PDF Controls'),Data)
1362                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='I(Q)'+PWDRname),[])       
1363                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='S(Q)'+PWDRname),[])       
1364                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='F(Q)'+PWDRname),[])       
1365                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='G(R)'+PWDRname),[])       
1366                self.ExportPDF.Enable(True)
1367            finally:
1368                dlg.Destroy()
1369               
1370    def GetPWDRdatafromTree(self,PWDRname):
1371        ''' Returns powder data from GSASII tree
1372        input:
1373            PWDRname = powder histogram name as obtained from GetHistogramNames
1374        return:
1375            PWDRdata = powder data dictionary with:
1376                Data - powder data arrays, Limits, Instrument Parameters, Sample Parameters           
1377        '''
1378        PWDRdata = {}
1379        PWDRdata['Data'] = self.PatternTree.GetItemPyData(PWDRname)[1]          #powder data arrays
1380        PWDRdata['Limits'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PWDRname,'Limits'))
1381        PWDRdata['Background'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PWDRname,'Background'))
1382        PWDRdata['Instrument Parameters'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PWDRname,'Instrument Parameters'))
1383        PWDRdata['Sample Parameters'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PWDRname,'Sample Parameters'))
1384        PWDRdata['Reflection Lists'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PWDRname,'Reflection Lists'))
1385        return PWDRdata
1386
1387    def GetHKLFdatafromTree(self,HKLFname):
1388        ''' Returns single crystal data from GSASII tree
1389        input:
1390            HKLFname = single crystal histogram name as obtained from GetHistogramNames
1391        return:
1392            HKLFdata = single crystal data list of reflections: for each reflection:
1393                HKLF = [np.array([h,k,l]),FoSq,sigFoSq,FcSq,Fcp,Fcpp,phase]
1394        '''
1395        HKLFdata = []
1396        while True:
1397            data = self.PatternTree.GetItemPyData(HKLFname)
1398            datum = data[0]
1399            if datum[0] == HKLFname:
1400                HKLFdata = datum[1:][0]
1401        return HKLFdata
1402                   
1403    def GetUsedHistogramsAndPhasesfromTree(self):
1404        ''' Returns all histograms that are found in any phase
1405        and any phase that uses a histogram
1406        return:
1407            Histograms = dictionary of histograms as {name:data,...}
1408            Phases = dictionary of phases that use histograms
1409        '''
1410        phaseData = {}
1411        if G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
1412            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
1413        else:
1414            print 'no phases to be refined'
1415            return
1416        if sub:
1417            item, cookie = self.PatternTree.GetFirstChild(sub)
1418            while item:
1419                phaseData[self.PatternTree.GetItemText(item)] =  self.PatternTree.GetItemPyData(item)               
1420                item, cookie = self.PatternTree.GetNextChild(sub, cookie)               
1421        Histograms = {}
1422        Phases = {}
1423        pId = 0
1424        hId = 0
1425        for phase in phaseData:
1426            Phase = phaseData[phase]
1427            if Phase['Histograms']:
1428                if phase not in Phases:
1429                    Phase['pId'] = pId
1430                    pId += 1
1431                    Phases[phase] = Phase
1432                for hist in Phase['Histograms']:
1433                    if hist not in Histograms:
1434                        item = G2gd.GetPatternTreeItemId(self,self.root,hist)
1435                        if 'PWDR' in hist[:4]: 
1436                            Histograms[hist] = self.GetPWDRdatafromTree(item)
1437                        elif 'HKLF' in hist[:4]:
1438                            Histograms[hist] = self.GetHKLFdatafromTree(item)
1439                        #future restraint, etc. histograms here           
1440                        Histograms[hist]['hId'] = hId
1441                        hId += 1
1442        return Histograms,Phases
1443       
1444    class ViewParmDialog(wx.Dialog):
1445        def __init__(self,parent,title,parmDict):
1446            wx.Dialog.__init__(self,parent,-1,title,size=(260,430),
1447                pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
1448            panel = wx.Panel(self,size=(260,430))
1449            parmNames = parmDict.keys()
1450            parmNames.sort()
1451            parmText = ' p:h:Parameter       refine?              value\n'
1452            for name in parmNames:
1453                parmData = parmDict[name]
1454                try:
1455                    parmText += ' %s \t%12.4g \n'%(name.ljust(19)+'\t'+parmData[1],parmData[0])
1456                except TypeError:
1457                    pass
1458            parmTable = wx.TextCtrl(panel,-1,parmText,
1459                style=wx.TE_MULTILINE|wx.TE_READONLY,size=(250,400))
1460            mainSizer = wx.BoxSizer(wx.VERTICAL)
1461            mainSizer.Add(parmTable)
1462            panel.SetSizer(mainSizer)
1463                           
1464    def OnViewLSParms(self,event):
1465        parmDict = {}
1466        Histograms,Phases = self.GetUsedHistogramsAndPhasesfromTree()
1467        Natoms,phaseVary,phaseDict,pawleyLookup,FFtable,BLtable = G2str.GetPhaseData(Phases,Print=False)       
1468        hapVary,hapDict,controlDict = G2str.GetHistogramPhaseData(Phases,Histograms,Print=False)
1469        histVary,histDict,controlDict = G2str.GetHistogramData(Histograms,Print=False)
1470        varyList = phaseVary+hapVary+histVary
1471        parmDict.update(phaseDict)
1472        parmDict.update(hapDict)
1473        parmDict.update(histDict)
1474        for parm in parmDict:
1475            if parm.split(':')[-1] in ['Azimuth','Gonio. radius','Lam1','Lam2','Omega','Chi','Phi']:
1476                parmDict[parm] = [parmDict[parm],' ']
1477            elif parm.split(':')[-2] in ['Ax','Ay','Az','SHmodel','SHord']:
1478                parmDict[parm] = [parmDict[parm],' ']
1479            elif parm in varyList:
1480                parmDict[parm] = [parmDict[parm],'True']
1481            else:
1482                parmDict[parm] = [parmDict[parm],'False']
1483        dlg = self.ViewParmDialog(self,'Parameters for least squares',parmDict)
1484        try:
1485            if dlg.ShowModal() == wx.ID_OK:
1486                print 'do something with changes?? - No!'
1487        finally:
1488            dlg.Destroy()
1489       
1490    def OnRefine(self,event):
1491        self.OnFileSave(event)
1492        #works - but it'd be better if it could restore plots
1493        dlg = wx.ProgressDialog('Residual','Powder profile Rwp =',101.0, 
1494            style = wx.PD_ELAPSED_TIME|wx.PD_AUTO_HIDE|wx.PD_CAN_ABORT)
1495        screenSize = wx.ClientDisplayRect()
1496        Size = dlg.GetSize()
1497        Size = (int(Size[0]*1.2),Size[1]) # increase size a bit along x
1498        dlg.SetPosition(wx.Point(screenSize[2]-Size[0]-305,screenSize[1]+5))
1499        dlg.SetSize(Size)
1500        Rwp = 100.00
1501        try:
1502            Rwp = G2str.Refine(self.GSASprojectfile,dlg)
1503        finally:
1504            dlg.Destroy()       
1505        dlg = wx.MessageDialog(self,'Load new result?','Refinement results, Rwp =%.3f'%(Rwp),wx.OK|wx.CANCEL)
1506        try:
1507            if dlg.ShowModal() == wx.ID_OK:
1508                Id = 0
1509                self.PatternTree.DeleteChildren(self.root)
1510                if self.HKL: self.HKL = []
1511                if self.G2plotNB.plotList:
1512                    self.G2plotNB.clear()
1513                G2IO.ProjFileOpen(self)
1514                item, cookie = self.PatternTree.GetFirstChild(self.root)
1515                while item and not Id:
1516                    name = self.PatternTree.GetItemText(item)
1517                    if name[:4] in ['PWDR','HKLF']:
1518                        Id = item
1519                    item, cookie = self.PatternTree.GetNextChild(self.root, cookie)               
1520                if Id:
1521                    self.PatternTree.SelectItem(Id)
1522        finally:
1523            dlg.Destroy()
1524
1525    def OnSeqRefine(self,event):
1526        Id = G2gd.GetPatternTreeItemId(self,self.root,'Sequental results')
1527        if not Id:
1528            Id = self.PatternTree.AppendItem(self.root,text='Sequental results')
1529            self.PatternTree.SetItemPyData(Id,{})           
1530        self.OnFileSave(event)
1531        dlg = wx.ProgressDialog('Residual for histogram 0','Powder profile Rwp =',101.0, 
1532            style = wx.PD_ELAPSED_TIME|wx.PD_AUTO_HIDE|wx.PD_CAN_ABORT)
1533        screenSize = wx.ClientDisplayRect()
1534        Size = dlg.GetSize()
1535        Size = (int(Size[0]*1.2),Size[1]) # increase size a bit along x
1536        dlg.SetPosition(wx.Point(screenSize[2]-Size[0]-305,screenSize[1]+5))
1537        dlg.SetSize(Size)
1538        try:
1539            G2str.SeqRefine(self.GSASprojectfile,dlg)
1540        finally:
1541            dlg.Destroy()       
1542        dlg = wx.MessageDialog(self,'Load new result?','Refinement results',wx.OK|wx.CANCEL)
1543        try:
1544            if dlg.ShowModal() == wx.ID_OK:
1545                Id = 0
1546                self.PatternTree.DeleteChildren(self.root)
1547                if self.HKL: self.HKL = []
1548                if self.G2plotNB.plotList:
1549                    self.G2plotNB.clear()
1550                G2IO.ProjFileOpen(self)
1551                item, cookie = self.PatternTree.GetFirstChild(self.root)
1552                while item and not Id:
1553                    name = self.PatternTree.GetItemText(item)
1554                    if name[:4] in ['PWDR','HKLF']:
1555                        Id = item
1556                    item, cookie = self.PatternTree.GetNextChild(self.root, cookie)               
1557                if Id:
1558                    self.PatternTree.SelectItem(Id)
1559        finally:
1560            dlg.Destroy()
1561       
1562    def OnSolve(self,event):
1563        #works - but it'd be better if it could restore plots
1564        G2sol.Solve(self.GSASprojectfile)
1565        dlg = wx.MessageDialog(self,'Load new result?','Structure solution results',wx.OK|wx.CANCEL)
1566        try:
1567            if dlg.ShowModal() == wx.ID_OK:
1568                self.PatternTree.DeleteChildren(self.root)
1569                if self.HKL: self.HKL = []
1570                if self.G2plotNB.plotList:
1571                    self.G2plotNB.clear()
1572                G2IO.ProjFileOpen(self)
1573        finally:
1574            dlg.Destroy()
1575       
1576    def ErrorDialog(self,title,message):
1577        dlg = wx.MessageDialog(self, message, title,  wx.OK)
1578        try:
1579            result = dlg.ShowModal()
1580        finally:
1581            dlg.Destroy()
1582
1583class GSASIImain(wx.App):
1584    def OnInit(self):
1585        self.main = GSASII(None)
1586        self.main.Show()
1587        self.SetTopWindow(self.main)
1588        return True
1589
1590def main():
1591    application = GSASIImain(0)
1592    if wxInspector: wxeye.InspectionTool().Show()
1593
1594    #application.main.OnRefine(None)
1595    application.MainLoop()
1596   
1597if __name__ == '__main__':
1598    main()
Note: See TracBrowser for help on using the repository browser.