source: trunk/GSASII.py @ 122

Last change on this file since 122 was 122, checked in by vondreel, 12 years ago

implement .gpx file name on GSASII command line
fixes for integrate all

File size: 54.9 KB
Line 
1#GSASII
2
3import os.path as ospath
4import sys
5import math
6import cPickle
7import time
8import copy
9import numpy as np
10import wx
11import matplotlib as mpl
12
13# load the GSAS routines
14import GSASIIpath
15import GSASIIIO as G2IO
16import GSASIIgrid as G2gd
17import GSASIIplot as G2plt
18import GSASIIpwdGUI as G2pdG
19
20# print versions
21print "Available python module versions for GSASII:"
22print "python:     ",sys.version[:5]
23print "wxpython:   ",wx.__version__
24print "matplotlib: ",mpl.__version__
25print "numpy:      ",np.__version__
26
27__version__ = '0.1.3'
28
29# useful degree trig functions
30sind = lambda x: math.sin(x*math.pi/180.)
31cosd = lambda x: math.cos(x*math.pi/180.)
32tand = lambda x: math.tan(x*math.pi/180.)
33asind = lambda x: 180.*math.asin(x)/math.pi
34acosd = lambda x: 180.*math.acos(x)/math.pi
35atan2d = lambda x,y: 180.*math.atan2(y,x)/math.pi
36
37def create(parent):
38    return GSASII(parent)
39
40[wxID_GSASII, wxID_GSASIIPATTERNTREE, wxID_GSASIIDATA, wxID_GSASIIPICKGRID,
41] = [wx.NewId() for _init_ctrls in range(4)]
42
43[wxID_GSASIIFILECLOSE, wxID_GSASIIFILEEXIT, wxID_GSASIIFILEOPEN, 
44 wxID_GSASIIFILESAVE, wxID_GSASIIFILESAVEAS, wxID_GSASIIUNDO, 
45] = [wx.NewId() for _init_coll_File_Items in range(6)]
46
47[wxID_GSASIIPWDRREAD,wxID_GSASIISNGLREAD,wxID_GSASIIADDPHASE,wxID_GSASIIDELETEPHASE,
48 wxID_GSASIIDATADELETE,wxID_GSASIIREADPEAKS,wxID_GSASIIPWDSUM,wxID_GSASIIIMGREAD,
49 wxID_GSASIIIMSUM,
50] = [wx.NewId() for _init_coll_Data_Items in range(9)]
51
52[wxID_GSASIIIMPORT, wxID_GSASIIIMPORTPATTERN, wxID_GSASIIIMPORTHKL, wxID_GSASIIIMPORTPHASE,
53wxID_GSASIIIMPORTCIF, wxID_GSASIIIMPORTPDB, 
54] = [wx.NewId() for _init_coll_Import_Items in range(6)]
55
56[wxID_GSAIIEXPORT, wxID_GSASIIEXPORTPATTERN, wxID_GSASIIEXPORTHKL, wxID_GSASIIEXPORTPHASE,
57wxID_GSASIIEXPORTCIF, wxID_GSASIIEXPORTPEAKLIST
58] = [wx.NewId() for _init_coll_Export_Items in range(6)]
59
60[wxID_GSASIIHELPABOUT, wxID_GSASIIHELPHELP, 
61] = [wx.NewId() for _init_coll_Help_Items in range(2)]
62
63class GSASII(wx.Frame):
64   
65    def _init_coll_GSASIIMenu_Menus(self, parent):
66        parent.Append(menu=self.File, title='File')
67        parent.Append(menu=self.Data, title='Data')
68        parent.Append(menu=self.Calculate, title='Calculate')
69        parent.Append(menu=self.Import, title='Import')
70        parent.Append(menu=self.Export, title='Export')
71        parent.Append(menu=self.Help, title='Help')
72
73    def _init_coll_File_Items(self, parent):
74        parent.Append(help='Open a gsasii project file (*.gpx)', id=wxID_GSASIIFILEOPEN,
75             kind=wx.ITEM_NORMAL,text='Open project...')
76        parent.Append(help='SAve project to old file', id=wxID_GSASIIFILESAVE, 
77            kind=wx.ITEM_NORMAL,text='Save project')
78        parent.Append(help='Save project to new file', id=wxID_GSASIIFILESAVEAS, 
79            kind=wx.ITEM_NORMAL,text='Save As...')
80        parent.Append(help='Close project, saving is optional', id=wxID_GSASIIFILECLOSE, 
81            kind=wx.ITEM_NORMAL,text='Close project')
82        parent.Append(help='Exit from gsasii', id=wxID_GSASIIFILEEXIT, kind=wx.ITEM_NORMAL,
83            text='Exit')
84        self.Bind(wx.EVT_MENU, self.OnFileOpenMenu, id=wxID_GSASIIFILEOPEN)
85        self.Bind(wx.EVT_MENU, self.OnFileSaveMenu, id=wxID_GSASIIFILESAVE)
86        self.Bind(wx.EVT_MENU, self.OnFileSaveasMenu, id=wxID_GSASIIFILESAVEAS)
87        self.Bind(wx.EVT_MENU, self.OnFileCloseMenu, id=wxID_GSASIIFILECLOSE)
88        self.Bind(wx.EVT_MENU, self.OnFileExitMenu, id=wxID_GSASIIFILEEXIT)
89       
90    def _init_coll_Data_Items(self,parent):
91        parent.Append(help='', id=wxID_GSASIIPWDRREAD, kind=wx.ITEM_NORMAL,
92            text='Read powder data...')
93        parent.Append(help='',id=wxID_GSASIIIMGREAD, kind=wx.ITEM_NORMAL,
94            text='Read image data...')
95        parent.Append(help='',id=wxID_GSASIIREADPEAKS, kind=wx.ITEM_NORMAL,
96            text='Read Powder Pattern Peaks...')
97        parent.Append(help='', id=wxID_GSASIISNGLREAD, kind=wx.ITEM_NORMAL,
98            text='Read single crystal data...')
99        parent.Append(help='', id=wxID_GSASIIPWDSUM, kind=wx.ITEM_NORMAL,
100            text='Sum powder data')
101        parent.Append(help='',id=wxID_GSASIIIMSUM, kind=wx.ITEM_NORMAL,
102            text='Sum image data')
103        parent.Append(help='', id=wxID_GSASIIADDPHASE, kind=wx.ITEM_NORMAL,
104            text='Add phase')
105        parent.Append(help='', id=wxID_GSASIIDELETEPHASE, kind=wx.ITEM_NORMAL,
106            text='Delete phase')
107        parent.Append(help='', id=wxID_GSASIIDATADELETE, kind=wx.ITEM_NORMAL,
108            text='Delete data')
109        self.Bind(wx.EVT_MENU, self.OnPwdrReadMenu, id=wxID_GSASIIPWDRREAD)
110        self.Bind(wx.EVT_MENU, self.OnPwdrSumMenu, id=wxID_GSASIIPWDSUM)
111        self.Bind(wx.EVT_MENU, self.OnReadPowderPeaks, id=wxID_GSASIIREADPEAKS)
112        self.Bind(wx.EVT_MENU, self.OnImageRead, id=wxID_GSASIIIMGREAD)
113        self.Bind(wx.EVT_MENU, self.OnImageSum, id=wxID_GSASIIIMSUM)
114        self.Bind(wx.EVT_MENU, self.OnSnglReadMenu, id=wxID_GSASIISNGLREAD)
115        self.Bind(wx.EVT_MENU, self.OnAddPhase, id=wxID_GSASIIADDPHASE)
116        self.Bind(wx.EVT_MENU, self.OnDeletePhase, id=wxID_GSASIIDELETEPHASE)
117        self.Bind(wx.EVT_MENU, self.OnDataDeleteMenu, id=wxID_GSASIIDATADELETE)
118               
119    def _init_coll_Calculate_Items(self,parent):
120        self.UnDo = parent.Append(help='', id=wxID_GSASIIUNDO, kind=wx.ITEM_NORMAL,
121            text='UnDo')
122        self.UnDo.Enable(False)
123        self.Bind(wx.EVT_MENU, self.OnUnDo, id=wxID_GSASIIUNDO)
124       
125    def _init_coll_Import_Items(self,parent):
126        self.ImportPhase = parent.Append(help='Import phase data from GSAS EXP file',
127            id=wxID_GSASIIIMPORTPHASE, kind=wx.ITEM_NORMAL,text='Import GSAS EXP Phase...')
128        self.ImportPDB = parent.Append(help='Import phase data from PDB file',
129            id=wxID_GSASIIIMPORTPDB, kind=wx.ITEM_NORMAL,text='Import PDB Phase...')
130        self.ImportPattern = parent.Append(help='',id=wxID_GSASIIIMPORTPATTERN, kind=wx.ITEM_NORMAL,
131            text='Import Powder Pattern...')
132        self.ImportHKL = parent.Append(help='',id=wxID_GSASIIIMPORTHKL, kind=wx.ITEM_NORMAL,
133            text='Import HKLs...')
134        self.ImportCIF = parent.Append(help='',id=wxID_GSASIIIMPORTCIF, kind=wx.ITEM_NORMAL,
135            text='Import CIF...')
136        self.Bind(wx.EVT_MENU, self.OnImportPhase, id=wxID_GSASIIIMPORTPHASE)
137        self.Bind(wx.EVT_MENU, self.OnImportPDB, id=wxID_GSASIIIMPORTPDB)
138        self.Bind(wx.EVT_MENU, self.OnImportPattern, id=wxID_GSASIIIMPORTPATTERN)
139        self.Bind(wx.EVT_MENU, self.OnImportHKL, id=wxID_GSASIIIMPORTHKL)
140        self.Bind(wx.EVT_MENU, self.OnImportCIF, id=wxID_GSASIIIMPORTCIF)
141
142    def _init_coll_Export_Items(self,parent):
143        self.ExportPattern = parent.Append(help='Select PWDR item to enable',id=wxID_GSASIIEXPORTPATTERN, kind=wx.ITEM_NORMAL,
144            text='Export Powder Pattern...')
145        self.ExportPeakList = parent.Append(help='',id=wxID_GSASIIEXPORTPEAKLIST, kind=wx.ITEM_NORMAL,
146            text='Export All Peak Lists...')
147        self.ExportHKL = parent.Append(help='',id=wxID_GSASIIEXPORTHKL, kind=wx.ITEM_NORMAL,
148            text='Export HKLs...')
149        self.ExportPhase = parent.Append(help='',id=wxID_GSASIIEXPORTPHASE, kind=wx.ITEM_NORMAL,
150            text='Export Phase...')
151        self.ExportCIF = parent.Append(help='',id=wxID_GSASIIEXPORTCIF, kind=wx.ITEM_NORMAL,
152            text='Export CIF...')
153        self.ExportPattern.Enable(False)
154        self.ExportPeakList.Enable(True)
155        self.ExportHKL.Enable(False)
156        self.ExportPhase.Enable(False)
157        self.ExportCIF.Enable(False)
158        self.Bind(wx.EVT_MENU, self.OnExportPattern, id=wxID_GSASIIEXPORTPATTERN)
159        self.Bind(wx.EVT_MENU, self.OnExportPeakList, id=wxID_GSASIIEXPORTPEAKLIST)
160        self.Bind(wx.EVT_MENU, self.OnExportHKL, id=wxID_GSASIIEXPORTHKL)
161        self.Bind(wx.EVT_MENU, self.OnExportPhase, id=wxID_GSASIIEXPORTPHASE)
162        self.Bind(wx.EVT_MENU, self.OnExportCIF, id=wxID_GSASIIEXPORTCIF)
163               
164    def _init_coll_Help_Items(self, parent):
165        parent.Append(help='', id=wxID_GSASIIHELPHELP, kind=wx.ITEM_NORMAL,
166            text='Help')
167        parent.Append(help='', id=wxID_GSASIIHELPABOUT, kind=wx.ITEM_NORMAL,
168            text='About')
169        self.Bind(wx.EVT_MENU, self.OnHelpHelpMenu, id=wxID_GSASIIHELPHELP)
170        self.Bind(wx.EVT_MENU, self.OnHelpAboutMenu, id=wxID_GSASIIHELPABOUT)
171
172    def _init_utils(self):
173        self.GSASIIMenu = wx.MenuBar()
174        self.File = wx.Menu(title='')
175        self.Data = wx.Menu(title='')       
176        self.Calculate = wx.Menu(title='')       
177        self.Import = wx.Menu(title='')       
178        self.Export = wx.Menu(title='')       
179        self.Help = wx.Menu(title='')
180
181        self._init_coll_GSASIIMenu_Menus(self.GSASIIMenu)
182        self._init_coll_File_Items(self.File)
183        self._init_coll_Data_Items(self.Data)
184        self._init_coll_Calculate_Items(self.Calculate)
185        self._init_coll_Import_Items(self.Import)
186        self._init_coll_Export_Items(self.Export)
187        self._init_coll_Help_Items(self.Help)
188       
189    def _init_ctrls(self, parent):
190        wx.Frame.__init__(self, id=wxID_GSASII, name='GSASII', parent=parent,
191            size=wx.Size(300, 250),style=wx.DEFAULT_FRAME_STYLE, title='GSAS-II')
192        screenSize = wx.DisplaySize()
193        Size = self.GetSize()
194        xPos = screenSize[0]-Size[0]
195        self.SetPosition(wx.Point(xPos,0))
196        self._init_utils()
197        self.SetMenuBar(self.GSASIIMenu)
198        self.Bind(wx.EVT_SIZE, self.OnSize)
199        self.CreateStatusBar()
200        self.mainPanel = wx.Panel(self,-1)
201       
202        self.PatternTree = wx.TreeCtrl(id=wxID_GSASIIPATTERNTREE,
203            parent=self.mainPanel, pos=wx.Point(0, 0),style=wx.TR_DEFAULT_STYLE )
204        self.PatternTree.Bind(wx.EVT_TREE_SEL_CHANGED,
205            self.OnPatternTreeSelChanged, id=wxID_GSASIIPATTERNTREE)
206        self.PatternTree.Bind(wx.EVT_TREE_ITEM_COLLAPSED,
207            self.OnPatternTreeItemCollapsed, id=wxID_GSASIIPATTERNTREE)
208        self.PatternTree.Bind(wx.EVT_TREE_ITEM_EXPANDED,
209            self.OnPatternTreeItemExpanded, id=wxID_GSASIIPATTERNTREE)
210        self.root = self.PatternTree.AddRoot("Loaded Data")
211       
212        plotFrame = wx.Frame(None,-1,'GSASII Plots',size=wx.Size(700,600), \
213            style=wx.DEFAULT_FRAME_STYLE ^ wx.CLOSE_BOX)
214        self.G2plotNB = G2plt.G2PlotNoteBook(plotFrame)
215        plotFrame.Show()
216       
217        self.dataDisplay = None
218       
219    def __init__(self, parent):
220        self._init_ctrls(parent)
221        self.Bind(wx.EVT_CLOSE, self.ExitMain)
222        self.GSASprojectfile = ''
223        self.dirname = ''
224        self.Offset = 0.0
225        self.Weight = False
226        self.IparmName = ''
227        self.IfPlot = False
228        self.PatternId = 0
229        self.PickId = 0
230        self.PeakTable = []
231        self.LimitsTable = []
232        self.HKL = []
233        self.Lines = []
234        self.itemPicked = None
235        self.dataFrame = None
236        self.Contour = False
237        self.SinglePlot = False
238        self.plotView = 0
239        self.Image = 0
240        self.oldImagefile = ''
241        self.Integrate = 0
242        self.Pwdr = False
243        self.imageDefault = {}
244        self.Sngl = 0
245        self.ifGetRing = False
246        self.setPoly = False
247        arg = sys.argv
248        if len(arg) > 1:
249            self.GSASprojectfile = arg[1]
250            self.dirname = ospath.dirname(arg[1])
251            G2IO.ProjFileOpen(self)
252            self.PatternTree.Expand(self.root)
253
254    def OnSize(self,event):
255        w,h = self.GetClientSizeTuple()
256        self.mainPanel.SetSize(wx.Size(w,h))
257        self.PatternTree.SetSize(wx.Size(w,h))
258                       
259    def OnPatternTreeSelChanged(self, event):
260        pltNum = self.G2plotNB.nb.GetSelection()
261        if pltNum >= 0:                         #to avoid the startup with no plot!
262            pltPage = self.G2plotNB.nb.GetPage(pltNum)
263            pltPlot = pltPage.figure.gca()
264        item = event.GetItem()
265        G2gd.MovePatternTreeToGrid(self,item)
266       
267    def OnPatternTreeItemCollapsed(self, event):
268        event.Skip()
269
270    def OnPatternTreeItemExpanded(self, event):
271        self.PatternTree.ScrollTo(self.PatternTree.GetLastChild(event.GetItem()))
272       
273    def OnPatternTreeDeleteItem(self, event):
274        event.Skip()
275
276    def OnPatternTreeItemActivated(self, event):
277        event.Skip()
278       
279    def OnPwdrReadMenu(self, event):
280        self.CheckNotebook()
281        dlg = wx.FileDialog(self, 'Choose files', '.', '', 
282            'GSAS fxye files (*.fxye)|*.fxye|GSAS fxy files (*.fxy)|*.fxy|All files (*.*)|*.*', 
283            wx.OPEN | wx.MULTIPLE)
284        if self.dirname: dlg.SetDirectory(self.dirname)
285        try:
286            if dlg.ShowModal() == wx.ID_OK:
287                filenames = dlg.GetPaths()
288                filenames.sort()
289                self.dirname = dlg.GetDirectory()
290                for filename in filenames:
291                    Data,Iparm,Comments = G2IO.SelectPowderData(self, filename)              #Data: list of tuples (filename,Pos,Bank)
292                    if not Data:                                                    #if Data rejected by user - go to next one
293                        continue
294                    DataType = Iparm['INS   HTYPE ']                                #expect only 4 char string
295                    DataType = DataType.strip()[0:3]                                #just 1st 3 chars
296                    wx.BeginBusyCursor()
297                    try:
298                        for Item in Data:
299                            vals = Item[2].split()          #split up the BANK record
300                            Id = self.PatternTree.AppendItem(parent=self.root,text='PWDR '+ospath.basename(Item[0])+': '+vals[0]+vals[1])
301                            data = G2IO.GetPowderData(filename,Item[1],Item[2],DataType)
302                            self.PatternTree.SetItemPyData(Id,[Item,data])
303                            '''
304                            Each tree item data is a list with:
305                            Item: the (filename,Pos,Bank) tuple
306                            data: (x,y,w,yc,yb,yd) list  of np.arrays from GetPowderData
307                            '''
308                           
309                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)                           
310                            Tmin = min(data[0])
311                            Tmax = max(data[0])
312                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Limits'),[(Tmin,Tmax),[Tmin,Tmax]])
313                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Background'),[['chebyschev',1,3,1.0,0.0,0.0]])
314       
315                            data = [DataType,]
316                            if 'C' in DataType:
317                                s = Iparm['INS  1 ICONS']
318                                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
319                                if not v[1]:
320                                    names = ['Type','Lam','Zero','Polariz.','U','V','W','X','Y','SH/L','Azimuth'] 
321                                    v = (v[0],v[2],v[4])
322                                    codes = [0,0,0,0]
323                                else:
324                                    names = ['Type','Lam1','Lam2','Zero','I(L2)/I(L1)','Polariz.','U','V','W','X','Y','SH/L','Azimuth']
325                                    codes = [0,0,0,0,0,0]
326                                data.extend(v)
327                                v1 = Iparm['INS  1PRCF1 '].split()                                                 
328                                v = Iparm['INS  1PRCF11'].split()
329                                data.extend([float(v[0]),float(v[1]),float(v[2])])                  #get GU, GV & GW - always here
330                                v = Iparm['INS  1PRCF12'].split()
331                                if v1[0] == 3:
332                                    data.extend([float(v[0]),float(v[1]),float(v[2])+float(v[3],0.0)])  #get LX, LY, S+H/L & azimuth
333                                else:
334                                    data.extend([0.0,0.0,0.002,0.0])                                      #OK defaults if fxn #3 not 1st in iprm file
335                                codes.extend([0,0,0,0,0,0,0])
336                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Instrument Parameters'),[tuple(data),data,codes,names])
337                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Peak List'),[])
338                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Index Peak List'),[])
339                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Unit Cells List'),[])             
340                            self.PatternId = G2gd.GetPatternTreeItemId(self,Id,'Limits')
341                    finally:
342                        wx.EndBusyCursor()
343                self.PatternTree.Expand(Id)
344                self.PatternTree.SelectItem(Id)
345   
346        finally:
347            dlg.Destroy()
348       
349    def OnReadPowderPeaks(self,event):
350        Cuka = 1.54052
351        self.CheckNotebook()
352        dlg = wx.FileDialog(self, 'Choose file with peak list', '.', '', 
353            'peak files (*.txt)|*.txt|All files (*.*)|*.*',wx.OPEN)
354        if self.dirname:
355            dlg.SetDirectory(self.dirname)
356        try:
357            if dlg.ShowModal() == wx.ID_OK:
358                self.HKL = []
359                self.powderfile = dlg.GetPath()
360                self.dirname = dlg.GetDirectory()
361                comments,peaks = G2IO.GetPowderPeaks(self.powderfile)
362                Id = self.PatternTree.AppendItem(parent=self.root,text='PKS '+ospath.basename(self.powderfile))
363                data = ['PKS',Cuka,0.0]
364                names = ['Type','Lam','Zero'] 
365                codes = [0,0]
366                self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Instrument Parameters'),[tuple(data),data,codes,names])
367                self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),comments)
368                self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Index Peak List'),peaks)
369                self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Unit Cells List'),[])             
370                self.PatternTree.Expand(Id)
371                self.PatternTree.SelectItem(Id)
372        finally:
373            dlg.Destroy()
374           
375    def OnImageRead(self,event):
376        self.CheckNotebook()
377        dlg = wx.FileDialog(self, 'Choose image files', '.', '',\
378        'MAR345 (*.mar3450;*.mar2300)|*.mar3450;*.mar2300|ADSC Image (*.img)\
379        |*.img|Detector tif (*.tif;*.tiff)|*.tif;*.tiff|GE Image sum (*.sum)\
380        |*.sum|GE Image avg (*.avg)|*.avg|All files (*.*)|*.*',wx.OPEN | wx.MULTIPLE)
381        if self.dirname:
382            dlg.SetDirectory(self.dirname)
383        try:
384            if dlg.ShowModal() == wx.ID_OK:
385                self.dirname = dlg.GetDirectory()
386                imagefiles = dlg.GetPaths()
387                imagefiles.sort()
388                for imagefile in imagefiles:
389                    Comments,Data,Size,Image = G2IO.GetImageData(imagefile)
390                    if Comments:
391                        Id = self.PatternTree.AppendItem(parent=self.root,text='IMG '+ospath.basename(imagefile))
392                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)
393                        Imax = np.amax(Image)
394                        Imin = np.amin(Image)
395                        if self.imageDefault:
396                            Data = copy.copy(self.imageDefault)
397                            Data['showLines'] = True
398                            Data['ring'] = []
399                            Data['rings'] = []
400                            Data['cutoff'] = 10
401                            Data['pixLimit'] = 20
402                            Data['ellipses'] = []
403                            Data['calibrant'] = ''
404                        else:
405                            Data['color'] = 'binary'
406                            Data['tilt'] = 0.0
407                            Data['rotation'] = 0.0
408                            Data['showLines'] = False
409                            Data['ring'] = []
410                            Data['rings'] = []
411                            Data['cutoff'] = 10
412                            Data['pixLimit'] = 20
413                            Data['ellipses'] = []
414                            Data['calibrant'] = ''
415                            Data['IOtth'] = [2.0,5.0]
416                            Data['LRazimuth'] = [-135,-45]
417                            Data['outChannels'] = 2500
418                            Data['outAzimuths'] = 1
419                            Data['fullIntegrate'] = False
420                            Data['setRings'] = False
421                        Data['setDefault'] = False
422                        Data['range'] = [(Imin,Imax),[Imin,Imax]]
423                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Image Controls'),Data)
424                        Masks = {'Points':[],'Rings':[],'Arcs':[],'Polygons':[],'Thresholds':[(Imin,Imax),[Imin,Imax]]}
425                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Masks'),Masks)
426                        self.PatternTree.SetItemPyData(Id,[Size,imagefile])
427                        self.PickId = Id
428                        self.Image = Id
429                self.PatternTree.SelectItem(Id)             #show last one
430                self.PatternTree.Expand(Id)
431        finally:
432            dlg.Destroy()
433       
434    def OnSnglReadMenu(self,event):
435        self.CheckNotebook()
436        dlg = wx.FileDialog(self, 'Choose file', '.', '', 
437            'hkl files (*.hkl)|*.hkl|All files (*.*)|*.*', 
438            wx.OPEN)
439        if self.dirname: dlg.SetDirectory(self.dirname)
440        try:
441            if dlg.ShowModal() == wx.ID_OK:
442                filename = dlg.GetPath()
443                self.dirname = dlg.GetDirectory()
444                wx.BeginBusyCursor()
445                try:
446                    Data = {}
447                    names = ['Type','Lam']
448                    HKLref,HKLmin,HKLmax,FoMax,ifFc = G2IO.GetHKLData(filename)
449                    Id = self.PatternTree.AppendItem(parent=self.root,text='SXTL '+ospath.basename(filename))
450                    self.PatternTree.SetItemPyData(Id,HKLref)
451                    Sub = self.PatternTree.AppendItem(Id,text='Instrument Parameters')
452                    data = ['SXC',1.5428,]
453                    self.PatternTree.SetItemPyData(Sub,[tuple(data),data,names])
454                    Data['Type'] = 'Fosq'
455                    Data['ifFc'] = ifFc
456                    Data['HKLmax'] = HKLmax
457                    Data['HKLmin'] = HKLmin
458                    Data['FoMax'] = FoMax
459                    Data['Zone'] = '001'
460                    Data['Layer'] = 0
461                    Data['Scale'] = 1.0
462                    Data['log-lin'] = 'lin'                   
463                    self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='HKL Plot Controls'),Data)
464                    self.PatternTree.SelectItem(Id)
465                    self.PatternTree.Expand(Id)
466                    self.Sngl = Id
467                finally:
468                    wx.EndBusyCursor()   
469        finally:
470            dlg.Destroy()
471           
472    def CheckNotebook(self):
473        if not G2gd.GetPatternTreeItemId(self,self.root,'Notebook'):
474            sub = self.PatternTree.AppendItem(parent=self.root,text='Notebook')
475            self.PatternTree.SetItemPyData(sub,[''])
476            sub = self.PatternTree.AppendItem(parent=self.root,text='Controls')
477            self.PatternTree.SetItemPyData(sub,[0])
478               
479    class CopyDialog(wx.Dialog):
480        def __init__(self,parent,title,text,data):
481            wx.Dialog.__init__(self,parent,-1,title, 
482                pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
483            self.data = data
484            panel = wx.Panel(self)
485            mainSizer = wx.BoxSizer(wx.VERTICAL)
486            topLabl = wx.StaticText(panel,-1,text)
487            mainSizer.Add((10,10),1)
488            mainSizer.Add(topLabl,0,wx.ALIGN_CENTER_VERTICAL|wx.LEFT,10)
489            mainSizer.Add((10,10),1)
490            dataGridSizer = wx.FlexGridSizer(rows=len(data),cols=1,hgap=2,vgap=2)
491            for id,item in enumerate(self.data):
492                ckbox = wx.CheckBox(panel,id,item[1])
493                ckbox.Bind(wx.EVT_CHECKBOX,self.OnCopyChange)                   
494                dataGridSizer.Add(ckbox,0,wx.LEFT,10)
495            mainSizer.Add(dataGridSizer,0,wx.EXPAND)
496            OkBtn = wx.Button(panel,-1,"Ok")
497            OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
498            cancelBtn = wx.Button(panel,-1,"Cancel")
499            cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
500            btnSizer = wx.BoxSizer(wx.HORIZONTAL)
501            btnSizer.Add((20,20),1)
502            btnSizer.Add(OkBtn)
503            btnSizer.Add((20,20),1)
504            btnSizer.Add(cancelBtn)
505            btnSizer.Add((20,20),1)
506           
507            mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
508            panel.SetSizer(mainSizer)
509            panel.Fit()
510            self.Fit()
511       
512        def OnCopyChange(self,event):
513            id = event.GetId()
514            self.data[id][0] = self.FindWindowById(id).GetValue()       
515           
516        def OnOk(self,event):
517            parent = self.GetParent()
518            parent.Raise()
519            self.SetReturnCode(wx.ID_OK)
520            self.MakeModal(False)             
521            self.Destroy()
522           
523        def OnCancel(self,event):
524            parent = self.GetParent()
525            parent.Raise()
526            self.SetReturnCode(wx.ID_CANCEL)
527            self.MakeModal(False)             
528            self.Destroy()
529           
530        def GetData(self):
531                return self.data
532       
533    class SumDialog(wx.Dialog):
534        def __init__(self,parent,title,text,type,data):
535            wx.Dialog.__init__(self,parent,-1,title, 
536                pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
537            self.data = data
538            panel = wx.Panel(self)
539            mainSizer = wx.BoxSizer(wx.VERTICAL)
540            topLabl = wx.StaticText(panel,-1,text)
541            mainSizer.Add((10,10),1)
542            mainSizer.Add(topLabl,0,wx.ALIGN_CENTER_VERTICAL|wx.LEFT,10)
543            mainSizer.Add((10,10),1)
544            dataGridSizer = wx.FlexGridSizer(rows=len(data),cols=2,hgap=2,vgap=2)
545            for id,item in enumerate(self.data[:-1]):
546                name = wx.TextCtrl(panel,-1,item[1],size=wx.Size(200,20))
547                name.SetEditable(False)
548                scale = wx.TextCtrl(panel,id,str(item[0]),style=wx.TE_PROCESS_ENTER)
549                scale.Bind(wx.EVT_TEXT,self.OnScaleChange)                   
550                dataGridSizer.Add(scale,0,wx.LEFT,10)
551                dataGridSizer.Add(name,0,wx.RIGHT,10)
552            dataGridSizer.Add(wx.StaticText(panel,-1,'Sum result name: '+type),0, \
553                wx.LEFT|wx.TOP|wx.ALIGN_CENTER_VERTICAL,10)
554            self.name = wx.TextCtrl(panel,-1,self.data[-1],size=wx.Size(200,20),style=wx.TE_PROCESS_ENTER)
555            self.name.Bind(wx.EVT_TEXT,self.OnNameChange)
556            dataGridSizer.Add(self.name,0,wx.RIGHT|wx.TOP,10)
557            mainSizer.Add(dataGridSizer,0,wx.EXPAND)
558            OkBtn = wx.Button(panel,-1,"Ok")
559            OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
560            cancelBtn = wx.Button(panel,-1,"Cancel")
561            cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
562            btnSizer = wx.BoxSizer(wx.HORIZONTAL)
563            btnSizer.Add((20,20),1)
564            btnSizer.Add(OkBtn)
565            btnSizer.Add((20,20),1)
566            btnSizer.Add(cancelBtn)
567            btnSizer.Add((20,20),1)
568           
569            mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
570            panel.SetSizer(mainSizer)
571            panel.Fit()
572            self.Fit()
573           
574        def OnNameChange(self,event):
575            self.data[-1] = self.name.GetValue() 
576           
577        def OnScaleChange(self,event):
578            id = event.GetId()
579            value = self.FindWindowById(id).GetValue()
580            try:
581                self.data[id][0] = float(value)
582                self.FindWindowById(id).SetValue('%.3f'%(self.data[id][0]))
583            except ValueError:
584                if value and '-' not in value[0]:
585                    print 'bad input - numbers only'
586                    self.FindWindowById(id).SetValue('0.0')
587           
588        def OnOk(self,event):
589            parent = self.GetParent()
590            parent.Raise()
591            self.SetReturnCode(wx.ID_OK)
592            self.MakeModal(False)             
593            self.Destroy()
594           
595        def OnCancel(self,event):
596            parent = self.GetParent()
597            parent.Raise()
598            self.SetReturnCode(wx.ID_CANCEL)
599            self.MakeModal(False)             
600            self.Destroy()
601           
602        def GetData(self):
603                return self.data
604           
605    def OnPwdrSumMenu(self,event):
606        TextList = []
607        DataList = []
608        SumList = []
609        Names = []
610        Inst = []
611        SumItemList = []
612        Comments = ['Sum equals: \n']
613        if self.PatternTree.GetCount():
614            item, cookie = self.PatternTree.GetFirstChild(self.root)
615            while item:
616                name = self.PatternTree.GetItemText(item)
617                Names.append(name)
618                if 'PWDR' in name:
619                    TextList.append([0.0,name])
620                    DataList.append(self.PatternTree.GetItemPyData(item)[1])    # (x,y,w,yc,yb,yd)
621                    if not Inst:
622                        Inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,item, 'Instrument Parameters'))
623                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
624            if len(TextList) < 2:
625                self.ErrorDialog('Not enough data to sum','There must be more than one "PWDR" pattern')
626                return
627            TextList.append('default_sum_name')               
628            dlg = self.SumDialog(self,'Sum data','Enter scale for each pattern in summation','PWDR',TextList)
629            try:
630                if dlg.ShowModal() == wx.ID_OK:
631                    lenX = 0
632                    Xminmax = [0,0]
633                    Xsum = []
634                    Ysum = []
635                    Wsum = []
636                    result = dlg.GetData()
637                    for i,item in enumerate(result[:-1]):
638                        scale,name = item
639                        data = DataList[i]
640                        if scale:
641                            Comments.append("%10.3f %s" % (scale,' * '+name))
642                            x,y,w,yc,yb,yd = data
643                            if lenX:
644                                if lenX != len(x):
645                                    self.ErrorDialog('Data length error','Data to be summed must have same number of points'+ \
646                                        '\nExpected:'+str(lenX)+ \
647                                        '\nFound:   '+str(len(x))+'\nfor '+name)
648                                    return
649                            else:
650                                lenX = len(x)
651                            if Xminmax[1]:
652                                if Xminmax != [x[0],x[-1]]:
653                                    self.ErrorDialog('Data range error','Data to be summed must span same range'+ \
654                                        '\nExpected:'+str(Xminmax[0])+' '+str(Xminmax[1])+ \
655                                        '\nFound:   '+str(x[0])+' '+str(x[-1])+'\nfor '+name)
656                                    return
657                                else:
658                                    for j,yi in enumerate(y):
659                                         Ysum[j] += scale*yi
660                            else:
661                                Xminmax = [x[0],x[-1]]
662                                YCsum = YBsum = YDsum = [0.0 for i in range(lenX)]
663                                for j,yi in enumerate(y):
664                                    Xsum.append(x[j])
665                                    Ysum.append(scale*yi)
666                                    Wsum.append(w[j])
667                    outname = 'PWDR '+result[-1]
668                    Id = 0
669                    if outname in Names:
670                        dlg2 = wx.MessageDialog(self,'Overwrite data?','Duplicate data name',wx.OK|wx.CANCEL)
671                        try:
672                            if dlg2.ShowModal() == wx.ID_OK:
673                                Id = G2gd.GetPatternTreeItemId(self,self.root,name)
674                        finally:
675                            dlg2.Destroy()
676                    else:
677                        Id = self.PatternTree.AppendItem(parent=self.root,text=outname)
678                    if Id:
679                        self.PatternTree.SetItemPyData(Id,[[''],[Xsum,Ysum,Wsum,YCsum,YBsum,YDsum]])
680                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)                   
681                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Limits'),[tuple(Xminmax),Xminmax])
682                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Background'),[['chebyschev',1,3,1.0,0.0,0.0]])
683                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Instrument Parameters'),Inst)
684                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Peak List'),[])
685                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Index Peak List'),[])
686                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Unit Cells List'),[])             
687                        self.PatternTree.SelectItem(Id)
688                        self.PatternTree.Expand(Id)
689                   
690            finally:
691                dlg.Destroy()
692
693    def OnImageSum(self,event):
694        TextList = []
695        DataList = []
696        SumList = []
697        Names = []
698        Inst = []
699        SumItemList = []
700        Comments = ['Sum equals: \n']
701        if self.PatternTree.GetCount():
702            item, cookie = self.PatternTree.GetFirstChild(self.root)
703            while item:
704                name = self.PatternTree.GetItemText(item)
705                Names.append(name)
706                if 'IMG' in name:
707                    TextList.append([0.0,name])
708                    DataList.append(self.PatternTree.GetItemPyData(item))        #Size,Image
709                    Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,item,'Image Controls'))
710                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
711            if len(TextList) < 2:
712                self.ErrorDialog('Not enough data to sum','There must be more than one "IMG" pattern')
713                return
714            TextList.append('default_sum_name')               
715            dlg = self.SumDialog(self,'Sum data','Enter scale for each image in summation','IMG',TextList)
716            try:
717                if dlg.ShowModal() == wx.ID_OK:
718                    imSize = 0
719                    result = dlg.GetData()
720                    First = True
721                    Found = False
722                    for i,item in enumerate(result[:-1]):
723                        scale,name = item
724                        data = DataList[i]
725                        if scale:
726                            Found = True                               
727                            Comments.append("%10.3f %s" % (scale,' * '+name))
728                            size,imagefile = data
729                            image = G2IO.GetImageData(imagefile,imageOnly=True)
730                            if First:
731                                newImage = np.zeros_like(image)
732                                First = False
733                            if imSize:
734                                if imSize != size:
735                                    self.ErrorDialog('Image size error','Images to be summed must be same size'+ \
736                                        '\nExpected:'+str(imSize)+ \
737                                        '\nFound:   '+str(size)+'\nfor '+name)
738                                    return
739                                newImage = newImage+scale*image
740                            else:
741                                imSize = size
742                                newImage = newImage+scale*image
743                            del(image)
744                    if not Found:
745                        self.ErrorDialog('Image sum error','No nonzero image multipliers found')
746                        return
747                       
748                    newImage = np.asfarray(newImage,dtype=np.float32)                       
749                    outname = 'IMG '+result[-1]
750                    Id = 0
751                    if outname in Names:
752                        dlg2 = wx.MessageDialog(self,'Overwrite data?','Duplicate data name',wx.OK|wx.CANCEL)
753                        try:
754                            if dlg2.ShowModal() == wx.ID_OK:
755                                Id = G2gd.GetPatternTreeItemId(self,self.root,name)
756                        finally:
757                            dlg2.Destroy()
758                    else:
759                        Id = self.PatternTree.AppendItem(parent=self.root,text=outname)
760                    if Id:
761                        dlg = wx.FileDialog(self, 'Choose sum image filename', '.', '', 
762                            'G2img files (*.G2img)|*.G2img', 
763                            wx.SAVE|wx.FD_OVERWRITE_PROMPT)
764                        if self.dirname: dlg.SetDirectory(self.dirname)
765                        if dlg.ShowModal() == wx.ID_OK:
766                            self.dirname = dlg.GetDirectory()
767                            newimagefile = dlg.GetPath()
768                            G2IO.PutG2Image(newimagefile,newImage)
769                            Imax = np.amax(newImage)
770                            Imin = np.amin(newImage)
771                            newImage = []
772                            self.PatternTree.SetItemPyData(Id,[imSize,newimagefile])
773                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)
774                        del(newImage)
775                        if self.imageDefault:
776                            Data = copy.copy(self.imageDefault)
777                        Data['showLines'] = True
778                        Data['ring'] = []
779                        Data['rings'] = []
780                        Data['cutoff'] = 10
781                        Data['pixLimit'] = 20
782                        Data['ellipses'] = []
783                        Data['calibrant'] = ''
784                        Data['range'] = [(Imin,Imax),[Imin,Imax]]
785                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Image Controls'),Data)                                           
786                        Masks = {'Points':[],'Rings':[],'Arcs':[],'Polygons':[],'Thresholds':[(Imin,Imax),[Imin,Imax]]}
787                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Masks'),Masks)
788                        self.PatternTree.SelectItem(Id)
789                        self.PatternTree.Expand(Id)
790                        self.PickId = G2gd.GetPatternTreeItemId(self,self.root,outname)
791                        self.Image = self.PickId
792            finally:
793                dlg.Destroy()
794                     
795    def OnAddPhase(self,event):
796        if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
797            sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
798        else:
799            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
800        PhaseName = ''
801        dlg = wx.TextEntryDialog(None,'Enter a name for this phase','Phase Name Entry','New phase',
802            style=wx.OK)
803        if dlg.ShowModal() == wx.ID_OK:
804            PhaseName = dlg.GetValue()
805        dlg.Destroy()
806        sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
807        SGData = {'SpGrp':'P 1'}
808        self.PatternTree.SetItemPyData(sub, \
809            {'General':[PhaseName,'nuclear',SGData,[False,10.,10.,10.,90.,90.,90,1000.],
810            [False,1.0],[],{},[],[],[]],'Atoms':[]})
811       
812    def OnDeletePhase(self,event):
813        if self.dataFrame:
814            self.dataFrame.Clear() 
815        TextList = []
816        DelList = []
817        DelItemList = []
818        if G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
819            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
820        else:
821            return
822        if sub:
823            item, cookie = self.PatternTree.GetFirstChild(sub)
824            while item:
825                TextList.append(self.PatternTree.GetItemText(item))
826                item, cookie = self.PatternTree.GetNextChild(sub, cookie)               
827            dlg = wx.MultiChoiceDialog(self, 'Which phase to delete?', 'Delete phase', TextList, wx.CHOICEDLG_STYLE)
828            try:
829                if dlg.ShowModal() == wx.ID_OK:
830                    result = dlg.GetSelections()
831                    for i in result: DelList.append([i,TextList[i]])
832                    item, cookie = self.PatternTree.GetFirstChild(sub)
833                    i = 0
834                    while item:
835                        if [i,self.PatternTree.GetItemText(item)] in DelList: DelItemList.append(item)
836                        item, cookie = self.PatternTree.GetNextChild(sub, cookie)
837                        i += 1
838                    for item in DelItemList:
839                        self.PatternTree.Delete(item)
840            finally:
841                dlg.Destroy()       
842       
843    def OnDataDeleteMenu(self, event):
844        TextList = []
845        DelList = []
846        DelItemList = []
847        if self.PatternTree.GetCount():
848            item, cookie = self.PatternTree.GetFirstChild(self.root)
849            while item:
850                name = self.PatternTree.GetItemText(item)
851                if 'PWDR' in name or 'SXTL' in name or 'IMG' in name:
852                    TextList.append(name)
853                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)               
854            dlg = wx.MultiChoiceDialog(self, 'Which data to delete?', 'Delete data', TextList, wx.CHOICEDLG_STYLE)
855            try:
856                if dlg.ShowModal() == wx.ID_OK:
857                    result = dlg.GetSelections()
858                    for i in result: DelList.append(TextList[i])
859                    item, cookie = self.PatternTree.GetFirstChild(self.root)
860                    while item:
861                        if self.PatternTree.GetItemText(item) in DelList: DelItemList.append(item)
862                        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
863                    for item in DelItemList:
864                        self.PatternTree.Delete(item)
865                    G2plt.PlotPatterns(self,True)                        #so plot gets updated
866            finally:
867                dlg.Destroy()
868
869    def OnFileOpenMenu(self, event):
870        result = ''
871        Id = 0
872        if self.PatternTree.GetChildrenCount(self.root,False):
873            if self.dataFrame:
874                self.dataFrame.Clear() 
875            dlg = wx.MessageDialog(self, 'Overwrite?','Project exists!',  wx.OK | wx.CANCEL)
876            try:
877                result = dlg.ShowModal()
878                if result == wx.ID_OK:
879                    self.PatternTree.DeleteChildren(self.root)
880                    print 'children deleted'
881            finally:
882                dlg.Destroy()
883        if result != wx.ID_CANCEL:   
884            if self.dataDisplay: self.dataDisplay.Destroy()
885            dlg = wx.FileDialog(self, 'Choose GSAS-II project file', '.', '', 
886                'GSAS-II project file (*.gpx)|*.gpx',wx.OPEN)
887            if self.dirname: dlg.SetDirectory(self.dirname)
888            try:
889                if dlg.ShowModal() == wx.ID_OK:
890                    self.GSASprojectfile = dlg.GetPath()
891                    self.dirname = dlg.GetDirectory()
892                    G2IO.ProjFileOpen(self)
893                    self.PatternTree.Expand(self.root)
894                    self.HKL = []
895                    item, cookie = self.PatternTree.GetFirstChild(self.root)
896                    while item and not Id:
897                        name = self.PatternTree.GetItemText(item)
898                        if 'PWDR' in name or 'SXTL' in name or 'IMG' in name:
899                            Id = item
900                        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)               
901                    if Id:
902                        self.PatternTree.SelectItem(Id)
903            finally:
904                dlg.Destroy()
905
906    def OnFileCloseMenu(self, event):
907        if self.dataFrame:
908            self.dataFrame.Clear()
909            self.dataFrame.SetLabel('GSAS-II data display') 
910        dlg = wx.MessageDialog(self, 'Save current project?', ' ', wx.YES | wx.NO | wx.CANCEL)
911        try:
912            result = dlg.ShowModal()
913            if result == wx.ID_OK:
914                self.OnFileSaveMenu(event)
915            if result != wx.ID_CANCEL:
916                self.GSASprojectfile = ''
917                self.PatternTree.DeleteChildren(self.root)
918                if self.HKL: self.HKL = []
919        finally:
920            dlg.Destroy()
921
922    def OnFileSaveMenu(self, event):
923        if self.GSASprojectfile: 
924            G2IO.ProjFileSave(self)
925        else:
926            self.OnFileSaveasMenu(event)
927
928    def OnFileSaveasMenu(self, event):
929        dlg = wx.FileDialog(self, 'Choose GSAS-II project file name', '.', '', 
930            'GSAS-II project file (*.gpx)|*.gpx',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
931        if self.dirname:
932            dlg.SetDirectory(self.dirname)
933        try:
934            if dlg.ShowModal() == wx.ID_OK:
935                self.GSASprojectfile = dlg.GetPath()
936                G2IO.ProjFileSave(self)
937                self.dirname = dlg.GetDirectory()
938        finally:
939            dlg.Destroy()
940
941    def ExitMain(self, event):
942        sys.exit()
943       
944    def OnFileExitMenu(self, event):
945        if self.dataFrame:
946            self.dataFrame.Clear() 
947            self.dataFrame.Destroy()
948        self.Close()
949       
950    def OnImportPattern(self,event):
951            dlg = wx.FileDialog(self, 'Choose nonGSAS powder file', '.', '', 
952                '(*.*)|*.*',wx.OPEN)
953            if self.dirname:
954                dlg.SetDirectory(self.dirname)
955            try:
956                if dlg.ShowModal() == wx.ID_OK:
957                    self.powderfile = dlg.GetPath()
958                    self.dirname = dlg.GetDirectory()
959            finally:
960                dlg.Destroy()
961               
962    def OnImportHKL(self,event):
963            dlg = wx.FileDialog(self, 'Choose structure factor file', '.', '', 
964                '(*.*)|*.*',wx.OPEN)
965            if self.dirname:
966                dlg.SetDirectory(self.dirname)
967            try:
968                if dlg.ShowModal() == wx.ID_OK:
969                    self.HKLfile = dlg.GetPath()
970                    self.dirname = dlg.GetDirectory()
971            finally:
972                dlg.Destroy()
973       
974    def OnImportPhase(self,event):
975            dlg = wx.FileDialog(self, 'Choose GSAS EXP file', '.', '', 
976                'EXP file (*.EXP)|*.EXP',wx.OPEN)
977            if self.dirname:
978                dlg.SetDirectory(self.dirname)
979            try:
980                Phase = {}
981                if dlg.ShowModal() == wx.ID_OK:
982                    EXPfile = dlg.GetPath()
983                    self.dirname = dlg.GetDirectory()
984                    Phase = G2IO.ReadEXPPhase(EXPfile)
985            finally:
986                dlg.Destroy()
987            if Phase:
988                PhaseName = Phase['General'][0]
989                if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
990                    sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
991                else:
992                    sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
993                sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
994                self.PatternTree.SetItemPyData(sub,Phase)
995               
996    def OnImportPDB(self,event):
997            dlg = wx.FileDialog(self, 'Choose PDB file', '.', '', 
998                'PDB file (*.pdb,*.ent)|*.pdb;*.ent|All files (*.*)|*.*',wx.OPEN)
999            if self.dirname:
1000                dlg.SetDirectory(self.dirname)
1001            try:
1002                if dlg.ShowModal() == wx.ID_OK:
1003                    PDBfile = dlg.GetPath()
1004                    self.dirname = dlg.GetDirectory()
1005                    Phase = G2IO.ReadPDBPhase(PDBfile)
1006            finally:
1007                dlg.Destroy()
1008            if Phase:
1009                PhaseName = Phase['General'][0]
1010                if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
1011                    sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
1012                else:
1013                    sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
1014                sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
1015                self.PatternTree.SetItemPyData(sub,Phase)       
1016       
1017    def OnImportCIF(self,event):
1018            dlg = wx.FileDialog(self, 'Choose CIF file', '.', '', 
1019                'CIF file (*.cif)|*.cif',wx.OPEN)
1020            if self.dirname:
1021                dlg.SetDirectory(self.dirname)
1022            try:
1023                if dlg.ShowModal() == wx.ID_OK:
1024                    self.CIFfile = dlg.GetPath()
1025                    self.dirname = dlg.GetDirectory()
1026            finally:
1027                dlg.Destroy()
1028       
1029    def OnExportPattern(self,event):
1030        dlg = wx.FileDialog(self, 'Choose output powder file name', '.', '', 
1031            'GSAS fxye file (*.fxye)|*.fxye|xye file (*.xye)|*.xye',
1032            wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
1033        if self.dirname:
1034            dlg.SetDirectory(self.dirname)
1035        try:
1036            if dlg.ShowModal() == wx.ID_OK:
1037                powderfile = dlg.GetPath()
1038                if 'fxye' in powderfile:
1039                    G2IO.powderFxyeSave(self,powderfile)
1040                else:       #just xye
1041                    G2IO.powderXyeSave(self,powderfile)
1042                self.dirname = dlg.GetDirectory()
1043        finally:
1044            dlg.Destroy()
1045       
1046    def OnExportPeakList(self,event):
1047        dlg = wx.FileDialog(self, 'Choose output peak list file name', '.', '', 
1048            '(*.*)|*.*',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
1049        if self.dirname:
1050            dlg.SetDirectory(self.dirname)
1051        try:
1052            if dlg.ShowModal() == wx.ID_OK:
1053                self.peaklistfile = dlg.GetPath()
1054                file = open(self.peaklistfile,'w')               
1055                item, cookie = self.PatternTree.GetFirstChild(self.root)
1056                while item:
1057                    name = self.PatternTree.GetItemText(item)
1058                    if 'PWDR' in name:
1059                        item2, cookie2 = self.PatternTree.GetFirstChild(item)
1060                        while item2:
1061                            name2 = self.PatternTree.GetItemText(item2)
1062                            if name2 == 'Peak List':
1063                                peaks = self.PatternTree.GetItemPyData(item2)
1064                                file.write("%s \n" % (name+' Peak List'))               
1065                                for peak in peaks:
1066                                    file.write("%10.4f %12.2f %10.3f %10.3f \n" % \
1067                                        (peak[0],peak[2],peak[4],peak[6]))
1068                            item2, cookie2 = self.PatternTree.GetNextChild(item, cookie2)                           
1069                    item, cookie = self.PatternTree.GetNextChild(self.root, cookie)                           
1070                file.close()
1071                self.dirname = dlg.GetDirectory()
1072        finally:
1073            dlg.Destroy()
1074       
1075    def OnExportHKL(self,event):
1076        event.Skip()
1077       
1078    def OnExportPhase(self,event):
1079        event.Skip()
1080       
1081    def OnExportCIF(self,event):
1082        event.Skip()
1083       
1084    def OnUnDo(self,event):
1085        self.DoUnDo()
1086        self.UnDo.Enable(False)
1087       
1088    def DoUnDo(self):
1089        print 'Undo last refinement'
1090        file = open('GSASII.save','rb')
1091        PatternId = self.PatternId
1092        for item in ['Background','Instrument Parameters','Peak List']:
1093            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item),cPickle.load(file))
1094            if self.dataDisplay.GetName() == item:
1095                if item == 'Background':
1096                    G2pdG.UpdateBackgroundGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
1097                elif item == 'Instrument Parameters':
1098                    G2pdG.UpdateInstrumentGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
1099                elif item == 'Peak List':
1100                    G2pdG.UpdatePeakGrid(self,self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, item)))
1101            print item,' recovered'
1102        file.close()
1103       
1104    def SaveState(self):
1105        file = open('GSASII.save','wb')
1106        PatternId = self.PatternId
1107        for item in ['Background','Instrument Parameters','Peak List']:
1108            cPickle.dump(self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId,item)),file,1)
1109        file.close()
1110        self.UnDo.Enable(True)
1111               
1112    def ErrorDialog(self,title,message):
1113        dlg = wx.MessageDialog(self, message, title,  wx.OK)
1114        try:
1115            result = dlg.ShowModal()
1116        finally:
1117            dlg.Destroy()
1118
1119    def OnHelpHelpMenu(self, event):
1120        event.Skip()
1121       
1122    def OnHelpAboutMenu(self, event):
1123        info = wx.AboutDialogInfo()
1124        info.Name = 'GSAS-II'
1125        info.Version = __version__
1126        info.Copyright = '''
1127Robert B. Von Dreele
1128Argonne National Laboratory(C)
1129This product includes software developed
1130by the UChicago Argonne, LLC, as
1131Operator of Argonne National Laboratory.         '''
1132        info.Description = '''
1133General Structure Analysis System - II
1134        '''
1135        wx.AboutBox(info)
1136       
1137class GSASIImain(wx.App):
1138    def OnInit(self):
1139        self.main = GSASII(None)
1140        self.main.Show()
1141        self.SetTopWindow(self.main)
1142        return True
1143
1144def main():
1145    application = GSASIImain(0)
1146    application.MainLoop()
1147
1148if __name__ == '__main__':
1149    main()
Note: See TracBrowser for help on using the repository browser.