source: trunk/GSASII.py @ 239

Last change on this file since 239 was 239, checked in by vondreele, 11 years ago

add 'any image file' to image file menu
add calibration skip & dmin to image data dictionary
fix to ellipse fitting
fix Pilatus reading - OK for 100K, not sure for 2M
now a image sizexy - 2 items for x & y sizes

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