source: trunk/testXNFF.py @ 3508

Last change on this file since 3508 was 3508, checked in by vondreele, 3 years ago

add testXNFF.py to repository

File size: 4.5 KB
Line 
1# -*- coding: utf-8 -*-
2#testXNFF.py
3'''
4*testXNFF: Check x-ray & neutron form factor computation*
5=========================================
6
7Use this to check form factors used in neutron scattering
8
9'''
10
11import sys
12import time
13import wx
14import numpy as np
15import matplotlib as mpl
16import GSASIIpath
17GSASIIpath.SetBinaryPath()
18import GSASIItestplot as plot
19import GSASIIElem as G2el
20import GSASIIElemGUI as G2elG
21import atmdata
22WACV = wx.ALIGN_CENTER_VERTICAL
23
24def create(parent):
25    return testXNFF(parent)
26   
27[wxID_FILEEXIT, wxID_PICKELEM,
28] = [wx.NewId() for _init_coll_File_Items in range(2)]
29
30class testXNFF(wx.Frame):
31    def _init_ctrls(self, parent):
32        wx.Frame.__init__(self, name='testXNFF', parent=parent,
33            size=wx.Size(460, 250),style=wx.DEFAULT_FRAME_STYLE, title='Test Xray & Neutron Form Factors')
34        self.testFFMenu = wx.MenuBar()
35        self.File = wx.Menu(title='')
36        self.File.Append(wxID_PICKELEM,'Pick element','Pick element')
37        self.File.Append(wxID_FILEEXIT,'Exit','Exit from testXNFF')
38        self.Bind(wx.EVT_MENU,self.OnPickElement,id=wxID_PICKELEM)
39        self.Bind(wx.EVT_MENU, self.OnFileExit, id=wxID_FILEEXIT)
40        self.testFFMenu.Append(menu=self.File, title='File')
41        self.SetMenuBar(self.testFFMenu)
42        self.testFFPanel = wx.ScrolledWindow(self)       
43        self.plotNB = plot.PlotNotebook()
44       
45    def __init__(self, parent):
46        self._init_ctrls(parent)
47        self.Bind(wx.EVT_CLOSE, self.ExitMain)
48
49    def ExitMain(self, event):
50        sys.exit()
51       
52    def OnFileExit(self,event):
53        self.Close()
54
55    def OnPickElement(self,Parms):
56
57        PE = G2elG.PickElement(self.testFFPanel,oneOnly=True)
58        if PE.ShowModal() == wx.ID_OK:
59            self.xrayFFs = G2el.GetFormFactorCoeff(PE.Elem)
60            self.Elem = PE.Elem
61            self.atmInfo = G2el.GetAtomInfo(PE.Elem)
62            self.magFFs = G2el.GetMagFormFacCoeff(PE.Elem)
63        PE.Destroy()
64        self.MakePlot()
65
66    def MakePlot(self):
67       
68        def test1():
69            fplot = self.plotNB.add('Neutron scattering lengths').gca()
70            lams = np.linspace(0.3,10.0,1000,True)
71           
72            BLtable = {}
73            El = self.Elem.capitalize()
74            for isotope in self.atmInfo['Isotopes']:
75                if 'Nat' in isotope:
76                    BLtable[isotope] = ['',atmdata.AtmBlens[El+'_']]
77                else:
78                    BLtable[isotope] = ['',atmdata.AtmBlens[El+'_'+isotope]]
79            for isotope in BLtable:
80                if 'BW-LS' in BLtable[isotope][1]:
81                    b0 = np.ones_like(lams)*BLtable[isotope][1]['BW-LS'][0]                   
82                else:
83                    b0 = np.ones_like(lams)*BLtable[isotope][1]['SL'][0]
84                bp,bpp = G2el.BlenResTOF([isotope,],BLtable,lams)
85                fplot.plot(lams,b0,label=isotope+El+' b0')
86                fplot.plot(lams,bp[0],label=isotope+El+" b'")
87                fplot.plot(lams,bpp[0],label=isotope+El+' b"')
88               
89            fplot.legend(loc='best')
90
91        def test2():
92            fplot = self.plotNB.add('X-ray form factors').gca()
93            sq = np.linspace(0,2.,1000,True)
94            for El in self.xrayFFs:
95                F = G2el.ScatFac(El, sq**2)
96                fplot.plot(sq,F,label=El['Symbol'])
97            fplot.legend(loc='best')
98            fplot.set_xlabel('sin-theta/lambda')
99            fplot.set_ylabel('form factor')
100           
101        def test3():
102            fplot = self.plotNB.add('magnetic form factors').gca()
103            sq = np.linspace(0,1.,1000,True)
104            for El in self.magFFs:
105                El['gfac'] = 2.0
106                F = G2el.MagScatFac(El, sq**2)
107                fplot.plot(sq,F,label=El['Symbol'])
108            fplot.legend(loc='best')
109            fplot.set_xlabel('sin-theta/lambda')
110            fplot.set_ylabel('form factor')
111           
112        while self.plotNB.nb.GetPageCount():
113            self.plotNB.nb.DeletePage(0)
114        test1()
115        test2()
116        test3()
117       
118        self.plotNB.Show()
119       
120class testFFmain(wx.App):
121    def OnInit(self):
122        self.main = testXNFF(None)
123        self.main.Show()
124        self.SetTopWindow(self.main)
125        return True
126
127def main():
128    'Starts main application to compute and plot form factors'
129    application = testFFmain(0)
130    application.MainLoop()
131   
132if __name__ == '__main__':
133    GSASIIpath.InvokeDebugOpts()
134    main()
Note: See TracBrowser for help on using the repository browser.