source: trunk/GSASII.py @ 453

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

refactor GSASIIgrid
new Hessian based least squares
new GSASIImath.py
work on focus issues

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