source: trunk/testDeriv.py @ 1077

Last change on this file since 1077 was 1077, checked in by toby, 9 years ago

cleanup plot & svn bugs; set missing keywords; CIF export done; update docs

  • Property svn:keywords set to Date Author Revision URL Id
File size: 6.9 KB
Line 
1#testGSASIIstruct.py
2
3import os
4import os.path as ospath
5import sys
6import time
7import cPickle
8import wx
9import numpy as np
10import matplotlib as mpl
11import GSASIIpath
12import GSASIIstrMath as G2stMth
13import GSASIItestplot as plot
14import pytexture as ptx
15ptx.pyqlmninit()            #initialize fortran arrays for spherical harmonics
16
17def create(parent):
18    return testDeriv(parent)
19   
20[wxID_FILEEXIT, wxID_FILEOPEN, wxID_MAKEPLOTS,
21] = [wx.NewId() for _init_coll_File_Items in range(3)]
22
23def FileDlgFixExt(dlg,file):            #this is needed to fix a problem in linux wx.FileDialog
24    ext = dlg.GetWildcard().split('|')[2*dlg.GetFilterIndex()+1].strip('*')
25    if ext not in file:
26        file += ext
27    return file
28   
29class testDeriv(wx.Frame):
30
31    def _init_ctrls(self, parent):
32        wx.Frame.__init__(self, name='testDeriv', parent=parent,
33            size=wx.Size(460, 250),style=wx.DEFAULT_FRAME_STYLE, title='Test Derivatives')
34        self.testDerivMenu = wx.MenuBar()
35        self.File = wx.Menu(title='')
36        self.File.Append(help='Open testDeriv.dat', id=wxID_FILEOPEN,
37             kind=wx.ITEM_NORMAL,text='Open testDeriv.dat file')
38        self.File.Append(help='Make derivative plots',id=wxID_MAKEPLOTS,
39            kind=wx.ITEM_NORMAL,text='Make plots')
40        self.File.Append(help='Exit from testDeriv', id=wxID_FILEEXIT, kind=wx.ITEM_NORMAL,
41            text='Exit')
42        self.Bind(wx.EVT_MENU, self.OnTestRead, id=wxID_FILEOPEN)
43        self.Bind(wx.EVT_MENU,self.OnMakePlots,id=wxID_MAKEPLOTS)
44        self.Bind(wx.EVT_MENU, self.OnFileExit, id=wxID_FILEEXIT)
45        self.testDerivMenu.Append(menu=self.File, title='File')
46        self.SetMenuBar(self.testDerivMenu)
47        self.testDerivPanel = wx.ScrolledWindow(self)       
48        self.plotNB = plot.PlotNotebook()
49       
50    def __init__(self, parent):
51        self._init_ctrls(parent)
52        self.Bind(wx.EVT_CLOSE, self.ExitMain)   
53        self.dirname = ''
54        self.testfile = []
55        self.dataFrame = None
56
57    def ExitMain(self, event):
58        sys.exit()
59       
60    def OnFileExit(self,event):
61        if self.dataFrame:
62            self.dataFrame.Clear() 
63            self.dataFrame.Destroy()
64        self.Close()
65
66    def OnTestRead(self,event):
67        dlg = wx.FileDialog(self, 'Open testDeriv.dat file', '.', 'testDeriv.dat')
68        if self.dirname:
69            dlg.SetDirectory(self.dirname)
70        try:
71            if dlg.ShowModal() == wx.ID_OK:
72                self.dirname = dlg.GetDirectory()
73                testFile = dlg.GetPath()
74                file = open(testFile,'rb')
75                self.values = cPickle.load(file)
76                self.HistoPhases = cPickle.load(file)
77                self.parmDict = cPickle.load(file)
78                self.varylist = cPickle.load(file)
79                self.calcControls = cPickle.load(file)
80                self.pawleyLookup = cPickle.load(file)
81                self.use = [False for i in range(len(self.varylist))]
82                self.delt = [max(abs(self.parmDict[name])*0.001,1e-6) for name in self.varylist]
83                file.close()
84                self.UpdateControls(event)
85        finally:
86            dlg.Destroy()
87           
88    def UpdateControls(self,event):
89       
90        def OnItemCk(event):
91            Obj = event.GetEventObject()
92            item = ObjInd[Obj.GetId()]
93            self.use[item] = Obj.GetValue()
94           
95        def OnDelValue(event):
96            Obj = event.GetEventObject()
97            item = ObjInd[Obj.GetId()]
98            try:
99                value = float(Obj.GetValue())
100            except ValueError:
101                value = self.delt[item]
102            self.delt[item] = value
103            Obj.SetValue('%g'%(value))
104       
105        self.testDerivPanel.DestroyChildren()
106        ObjInd = {}
107        varylist = self.varylist
108        use = self.use
109        delt = self.delt
110        mainSizer = wx.FlexGridSizer(1,8,5,5)
111        for id,[ck,name,d] in enumerate(zip(use,varylist,delt)):
112            useVal = wx.CheckBox(self.testDerivPanel,label=name)
113            useVal.SetValue(ck)
114            ObjInd[useVal.GetId()] = id
115            useVal.Bind(wx.EVT_CHECKBOX, OnItemCk)
116            mainSizer.Add(useVal,0)
117            delVal = wx.TextCtrl(self.testDerivPanel,wx.ID_ANY,'%g'%(d),style=wx.TE_PROCESS_ENTER)
118            ObjInd[delVal.GetId()] = id
119            delVal.Bind(wx.EVT_TEXT_ENTER,OnDelValue)
120            delVal.Bind(wx.EVT_KILL_FOCUS,OnDelValue)
121            mainSizer.Add(delVal,0)
122        mainSizer.Layout()
123        self.testDerivPanel.SetSizer(mainSizer)   
124        Size = mainSizer.Fit(self.testDerivPanel)
125        Size[0] += 40
126        Size[1] = max(Size[1],290) + 35
127        self.testDerivPanel.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
128        print Size
129        self.testDerivPanel.SetSize(Size)
130
131    def OnMakePlots(self,event):
132       
133        def test1():
134            fplot = self.plotNB.add('function test').gca()
135            M = G2stMth.errRefine(self.values,self.HistoPhases,
136                self.parmDict,self.varylist,self.calcControls,
137                self.pawleyLookup,None)
138            fplot.plot(M,'r',label='M')
139            fplot.legend(loc='best')
140           
141        def test2(name,delt):
142            hplot = self.plotNB.add('derivatives test for '+name).gca()
143            dMdV = G2stMth.dervRefine(self.values,self.HistoPhases,self.parmDict,
144                self.varylist,self.calcControls,self.pawleyLookup,None)
145            hplot.plot(dMdV[self.varylist.index(name)],'b',label='analytic deriv')
146            if name in self.varylist:
147                self.values[self.varylist.index(name)] -= delt
148                M0 = G2stMth.errRefine(self.values,self.HistoPhases,self.parmDict,
149                    self.varylist,self.calcControls,self.pawleyLookup,None)
150                self.values[self.varylist.index(name)] += 2.*delt
151                M1 = G2stMth.errRefine(self.values,self.HistoPhases,self.parmDict,
152                    self.varylist,self.calcControls,self.pawleyLookup,None)
153                self.values[self.varylist.index(name)] -= delt   
154                Mn = (M1-M0)/(2.*delt)
155                hplot.plot(Mn,'r+',label='numeric deriv')
156                hplot.plot(dMdV[self.varylist.index(name)]-Mn,'g',label='diff')
157            hplot.legend(loc='best')
158           
159        while self.plotNB.nb.GetPageCount():
160            self.plotNB.nb.DeletePage(0)
161        test1()
162        for use,name,delt in zip(self.use,self.varylist,self.delt):
163            if use:
164                test2(name,delt)
165       
166        self.plotNB.Show()
167       
168class testDerivmain(wx.App):
169    def OnInit(self):
170        self.main = testDeriv(None)
171        self.main.Show()
172        self.SetTopWindow(self.main)
173        return True
174
175def main():
176    application = testDerivmain(0)
177    application.MainLoop()
178   
179if __name__ == '__main__':
180    main()
Note: See TracBrowser for help on using the repository browser.