source: trunk/GSASII.py @ 384

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

add constraint & restraint items to tree - now empty
fix noncentro calcs & special position position refinements

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