source: trunk/GSASII.py @ 65

Last change on this file since 65 was 65, checked in by vondreel, 14 years ago

remove all path setup code & replace with a simple import of GSASIIpath.

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