source: trunk/testDeriv.py @ 905

Last change on this file since 905 was 905, checked in by vondreele, 10 years ago

new MAR CCD reader
testDeriv.py is new - old testGSASIIstruct.py deleted
fixes to SC derivatives - refine on F now OK; extinction messed up, RB still a problem

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 GSASIIstruct as G2st
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 structTestdata.dat', id=wxID_FILEOPEN,
37             kind=wx.ITEM_NORMAL,text='Open structTestdata 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 scanCCD', 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 structTestdata.dat file', '.', 'structTestdata.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.0001,1e-8) 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        self.testDerivPanel.SetSize(Size)
129
130    def OnMakePlots(self,event):
131       
132        def test1():
133            fplot = self.plotNB.add('function test').gca()
134            M = G2st.errRefine(self.values,self.HistoPhases,
135                self.parmDict,self.varylist,self.calcControls,
136                self.pawleyLookup,None)
137            fplot.plot(M,'r',label='M')
138            fplot.legend(loc='best')
139           
140        def test2(name,delt):
141            hplot = self.plotNB.add('derivatives test for '+name).gca()
142            dMdV = G2st.dervRefine(self.values,self.HistoPhases,self.parmDict,
143                self.varylist,self.calcControls,self.pawleyLookup,None)
144            hplot.plot(dMdV[self.varylist.index(name)],'b',label='analytic deriv')
145            if name in self.varylist:
146                self.values[self.varylist.index(name)] -= delt
147                M0 = G2st.errRefine(self.values,self.HistoPhases,self.parmDict,
148                    self.varylist,self.calcControls,self.pawleyLookup,None)
149                self.values[self.varylist.index(name)] += 2.*delt
150                M1 = G2st.errRefine(self.values,self.HistoPhases,self.parmDict,
151                    self.varylist,self.calcControls,self.pawleyLookup,None)
152                self.values[self.varylist.index(name)] -= delt   
153                Mn = (M1-M0)/(2.*delt)
154                hplot.plot(Mn,'r+',label='numeric deriv')
155                hplot.plot(dMdV[self.varylist.index(name)]-Mn,'g',label='diff')
156            hplot.legend(loc='best')
157           
158        while self.plotNB.nb.GetPageCount():
159            self.plotNB.nb.DeletePage(0)
160        test1()
161        for use,name,delt in zip(self.use,self.varylist,self.delt):
162            if use:
163                test2(name,delt)
164       
165        self.plotNB.Show()
166       
167class testDerivmain(wx.App):
168    def OnInit(self):
169        self.main = testDeriv(None)
170        self.main.Show()
171        self.SetTopWindow(self.main)
172        return True
173
174def main():
175    application = testDerivmain(0)
176    application.MainLoop()
177   
178if __name__ == '__main__':
179    main()
Note: See TracBrowser for help on using the repository browser.