source: trunk/GSASII.py @ 427

Last change on this file since 427 was 427, checked in by toby, 11 years ago

implement HTML help

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