source: trunk/GSASII.py @ 50

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

fix graphics zoom, redraw, home issues
now OK for powder, single crystal, image & transformed image plots

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