Changeset 2755
- Timestamp:
- Mar 20, 2017 9:53:00 AM (6 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASII.py
r2754 r2755 3626 3626 for phase in phases: 3627 3627 peaks = data[phase] 3628 I100 = peaks['RefList'].T[8]*np.array([refl[11] for refl in peaks['RefList']]) 3629 Imax = np.max(I100) 3630 if Imax: 3631 I100 *= 100.0/Imax 3628 3632 file.write("%s %s %s \n" % (name,phase,' Reflection List')) 3629 3633 if 'T' in peaks.get('Type','PXC'): 3630 file.write('%s \n'%(' h k l m d-space TOF wid F**2'))3634 file.write('%s \n'%(' h k l m d-space TOF wid Fo**2 Fc**2 Icorr Prfo Trans ExtP I100')) 3631 3635 else: 3632 file.write('%s \n'%(' h k l m d-space 2-theta wid F**2'))3633 for peak in peaks['RefList']:3636 file.write('%s \n'%(' h k l m d-space 2-theta wid Fo**2 Fc**2 Icorr Prfo Trans ExtP I100')) 3637 for ipk,peak in enumerate(peaks['RefList']): 3634 3638 if 'T' in peaks.get('Type','PXC'): 3635 3639 sig = np.sqrt(peak[6]) 3636 3640 gam = peak[7] 3637 3641 FWHM = G2pwd.getgamFW(gam,sig) 3638 file.write(" %3d %3d %3d %3d %10.5f %10.2f %10.5f %10.3f \n" % \ 3639 (int(peak[0]),int(peak[1]),int(peak[2]),int(peak[3]),peak[4],peak[5],FWHM,peak[8])) 3642 file.write(" %3d %3d %3d %3d%10.5f%10.2f%10.5f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" % \ 3643 (int(peak[0]),int(peak[1]),int(peak[2]),int(peak[3]),peak[4],peak[5],FWHM,peak[8], 3644 peak[9],peak[11],peak[12],peak[13],peak[14],I100[ipk])) 3640 3645 else: 3641 3646 sig = np.sqrt(peak[6]) 3642 3647 gam = peak[7] 3643 3648 FWHM = G2pwd.getgamFW(gam,sig) 3644 file.write(" %3d %3d %3d %3d %10.5f %10.5f %10.5f %10.3f \n" % \ 3645 (int(peak[0]),int(peak[1]),int(peak[2]),int(peak[3]),peak[4],peak[5],FWHM/100.,peak[8])) 3649 file.write(" %3d %3d %3d %3d%10.5f%10.5f%10.5f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" % \ 3650 (int(peak[0]),int(peak[1]),int(peak[2]),int(peak[3]),peak[4],peak[5],FWHM/100., 3651 peak[8],peak[9],peak[11],peak[12],peak[13],peak[14],I100[ipk])) 3646 3652 item2, cookie2 = self.PatternTree.GetNextChild(item, cookie2) 3647 3653 item, cookie = self.PatternTree.GetNextChild(self.root, cookie) -
trunk/GSASIIctrls.py
r2751 r2755 876 876 This shows up on the Mac as a very thin line, no matter what I do 877 877 ''' 878 line = wx.StaticLine(parent, -1,size=(-1,3), style=wx.LI_HORIZONTAL)879 sizer.Add(line, 0, wx.EXPAND|wx.ALIGN_CENTER|wx.ALL, 10)878 line = wx.StaticLine(parent, size=(-1,3), style=wx.LI_HORIZONTAL) 879 sizer.Add(line, 0, wx.EXPAND|wx.ALIGN_CENTER|wx.ALL, 5) 880 880 881 881 ################################################################################ -
trunk/GSASIIgrid.py
r2754 r2755 144 144 [ wxID_MODELCOPY,wxID_MODELFIT,wxID_MODELADD,wxID_ELEMENTADD,wxID_ELEMENTDELETE, 145 145 wxID_ADDSUBSTANCE,wxID_LOADSUBSTANCE,wxID_DELETESUBSTANCE,wxID_COPYSUBSTANCE, 146 wxID_MODELUNDO,wxID_MODELFITALL,wxID_MODELCOPYFLAGS, 147 ] = [wx.NewId() for item in range(1 2)]146 wxID_MODELUNDO,wxID_MODELFITALL,wxID_MODELCOPYFLAGS,wxID_RELOADSUBSTANCES 147 ] = [wx.NewId() for item in range(13)] 148 148 149 149 [ wxID_SELECTPHASE,wxID_PWDHKLPLOT,wxID_PWD3DHKLPLOT,wxID_3DALLHKLPLOT,wxID_MERGEHKL, … … 2149 2149 self.SubstanceEdit.Append(id=wxID_LOADSUBSTANCE, kind=wx.ITEM_NORMAL,text='Load substance', 2150 2150 help='Load substance from file') 2151 self.SubstanceEdit.Append(id=wxID_RELOADSUBSTANCES, kind=wx.ITEM_NORMAL,text='Reload substances', 2152 help='Reload all substances from file') 2151 2153 self.SubstanceEdit.Append(id=wxID_ADDSUBSTANCE, kind=wx.ITEM_NORMAL,text='Add substance', 2152 2154 help='Add new substance to list') … … 2181 2183 self.PostfillDataMenu() 2182 2184 2185 # REFD/ Models 2186 self.REFDModelMenu = wx.MenuBar() 2187 self.PrefillDataMenu(self.REFDModelMenu) 2188 self.REFDModelEdit = wx.Menu(title='') 2189 self.REFDModelMenu.Append(menu=self.REFDModelEdit, title='Models') 2190 self.REFDModelEdit.Append(id=wxID_MODELFIT, kind=wx.ITEM_NORMAL,text='Fit', 2191 help='Fit model parameters to data') 2192 self.REFDUndo = self.REFDModelEdit.Append(id=wxID_MODELUNDO, kind=wx.ITEM_NORMAL,text='Undo', 2193 help='Undo model fit') 2194 self.REFDUndo.Enable(False) 2195 self.REFDModelEdit.Append(id=wxID_MODELFITALL, kind=wx.ITEM_NORMAL,text='Sequential fit', 2196 help='Sequential fit of model parameters to all REFD data') 2197 self.REFDModelEdit.Append(id=wxID_MODELCOPY, kind=wx.ITEM_NORMAL,text='Copy', 2198 help='Copy model parameters to other histograms') 2199 self.REFDModelEdit.Append(id=wxID_MODELCOPYFLAGS, kind=wx.ITEM_NORMAL,text='Copy flags', 2200 help='Copy model refinement flags to other histograms') 2201 self.PostfillDataMenu() 2202 2183 2203 # IMG / Image Controls 2184 2204 self.ImageMenu = wx.MenuBar() -
trunk/GSASIImath.py
r2571 r2755 968 968 if wave > 0 the includes f' contribution 969 969 :returns: float mu: if wave>0 absorption coeff in cm^-1 ; otherwise 0 970 :returns: float fpp: if wave>0 f" in 10^10cm^-2; otherwise 0 970 971 971 972 ''' 972 973 rho = 0 973 974 mu = 0 974 if wave: 975 fpp = 0 976 if wave: 975 977 Xanom = XAnomAbs(Elements,wave) 976 978 for El in Elements: … … 978 980 if wave: 979 981 f0 += Xanom[El][0] 982 fpp += Xanom[El][1]*Elements[El]['Num'] 980 983 mu += Xanom[El][2]*Elements[El]['Num'] 981 984 rho += Elements[El]['Num']*f0 982 return 28.179*rho/vol,0.1*mu/vol 985 return 28.179*rho/vol,0.1*mu/vol,28.179*fpp/vol 986 987 def NCScattDen(Elements,vol,wave=0.): 988 '''Estimate neutron scattering density from molecular formula & volume; 989 ignores valence, but includes anomalous effects 990 991 :param dict Elements: elements in molecular formula; 992 each element must contain 993 Num: number of atoms in formula 994 Z: atomic number 995 :param float vol: molecular volume in A^3 996 :param float wave: optional wavelength in A 997 998 :returns: float rho: scattering density in 10^10cm^-2; 999 if wave > 0 the includes f' contribution 1000 :returns: float mu: if wave>0 absorption coeff in cm^-1 ; otherwise 0 1001 :returns: float fpp: if wave>0 f" in 10^10cm^-2; otherwise 0 1002 1003 ''' 1004 rho = 0 1005 mu = 0 1006 bpp = 0 1007 for El in Elements: 1008 isotope = Elements[El]['Isotope'] 1009 b0 = Elements[El]['Isotopes'][isotope]['SL'][0] 1010 mu += Elements[El]['Isotopes'][isotope].get('SA',0.)*Elements[El]['Num'] 1011 if wave and 'BW-LS' in Elements[El]['Isotopes'][isotope]: 1012 Re,Im,E0,gam,A,E1,B,E2 = Elements[El]['Isotopes'][isotope]['BW-LS'][1:] 1013 Emev = 81.80703/wave**2 1014 T0 = Emev-E0 1015 T1 = Emev-E1 1016 T2 = Emev-E2 1017 D0 = T0**2+gam**2 1018 D1 = T1**2+gam**2 1019 D2 = T2**2+gam**2 1020 b0 += Re*(T0/D0+A*T1/D1+B*T2/D2) 1021 bpp += Im*(1/D0+A/D1+B/D2) 1022 else: 1023 bpp += Elements[El]['Isotopes'][isotope]['SL'][1] 1024 rho += Elements[El]['Num']*b0 1025 if wave: mu *= wave 1026 return 100.*rho/vol,mu/vol,100.*bpp/vol 983 1027 984 1028 def wavekE(wavekE): … … 998 1042 Orbs = G2el.GetXsectionCoeff(El) 999 1043 Xanom[El] = G2el.FPcalc(Orbs, kE) 1000 return Xanom 1044 return Xanom #f',f", mu 1001 1045 1002 1046 ################################################################################ -
trunk/GSASIIpwd.py
r2754 r2755 60 60 npT2q = lambda tth,wave: 2.0*np.pi*npT2stl(tth,wave) #=2pi*d* 61 61 ateln2 = 8.0*math.log(2.0) 62 nxs = np.newaxis 62 63 63 64 ################################################################################ … … 1909 1910 1910 1911 ################################################################################ 1912 # Reflectometry calculations 1913 ################################################################################ 1914 1915 def REFDModelFxn(Profile,ProfDict,Inst,Limits,Substances,data): 1916 1917 Q,Io,wt,Ic,Ib,Ifb = Profile[:6] 1918 Qmin = Limits[1][0] 1919 Qmax = Limits[1][1] 1920 iBeg = np.searchsorted(Q,Qmin) 1921 iFin = np.searchsorted(Q,Qmax)+1 #include last point 1922 Ib[:] = data['FltBack'][0] 1923 Ic[:] = 0 1924 Scale = data['Scale'][0] 1925 Nlayers = len(data['Layers']) 1926 depth = np.zeros(Nlayers) 1927 rho = np.zeros(Nlayers) 1928 irho = np.zeros(Nlayers) 1929 sigma = np.zeros(Nlayers) 1930 for ilayer,layer in enumerate(data['Layers']): 1931 name = layer['Name'] 1932 if 'Thick' in layer: #skips first & last layers 1933 depth[ilayer] = layer['Thick'][0] 1934 if 'Rough' in layer: #skips first layer 1935 sigma[ilayer] = layer['Rough'][0] 1936 rho[ilayer] = Substances[name]['Scatt density']*layer['DenMul'][0] 1937 irho[ilayer] = Substances[name].get('XImag density',0.)*layer['DenMul'][0] 1938 A,B = abeles(0.5*Q[iBeg:iFin],depth,rho,irho,sigma[1:]) #Q --> k, offset roughness for abeles 1939 Ic[iBeg:iFin] = (A**2+B**2)*Scale+Ib[iBeg:iFin] 1940 1941 def abeles(kz, depth, rho, irho=0, sigma=0): 1942 """ 1943 Optical matrix form of the reflectivity calculation. 1944 O.S. Heavens, Optical Properties of Thin Solid Films 1945 1946 Reflectometry as a function of kz for a set of slabs. 1947 1948 :Parameters: 1949 1950 *kz* : float[n] | |1/Ang| 1951 Scattering vector $2\pi\sin(\theta)/\lambda$. This is $\tfrac12 Q_z$. 1952 *depth* : float[m] | |Ang| 1953 thickness of each layer. The thickness of the incident medium 1954 and substrate are ignored. 1955 *rho*, *irho* : float[n,k] | |1e-6/Ang^2| 1956 real and imaginary scattering length density for each layer for each kz 1957 Note: absorption cross section mu = 2 irho/lambda for neutrons 1958 *sigma* : float[m-1] | |Ang| 1959 interfacial roughness. This is the roughness between a layer 1960 and the previous layer. The sigma array should have m-1 entries. 1961 1962 Slabs are ordered with the surface SLD at index 0 and substrate at 1963 index -1, or reversed if kz < 0. 1964 """ 1965 def calc(kz, depth, rho, irho, sigma): 1966 if len(kz) == 0: return kz 1967 1968 # Complex index of refraction is relative to the incident medium. 1969 # We can get the same effect using kz_rel^2 = kz^2 + 4*pi*rho_o 1970 # in place of kz^2, and ignoring rho_o 1971 kz_sq = kz**2 + 4e-6*np.pi*rho[:,0] 1972 k = kz 1973 1974 # According to Heavens, the initial matrix should be [ 1 F; F 1], 1975 # which we do by setting B=I and M0 to [1 F; F 1]. An extra matrix 1976 # multiply versus some coding convenience. 1977 B11 = 1 1978 B22 = 1 1979 B21 = 0 1980 B12 = 0 1981 for i in range(0, len(depth)-1): 1982 k_next = np.sqrt(kz_sq - 4e-6*np.pi*(rho[:,i+1] + 1j*irho[:,i+1])) 1983 F = (k - k_next) / (k + k_next) 1984 F *= np.exp(-2*k*k_next*sigma[i]**2) 1985 #print "==== layer",i 1986 #print "kz:", kz 1987 #print "k:", k 1988 #print "k_next:",k_next 1989 #print "F:",F 1990 #print "rho:",rho[:,i+1] 1991 #print "irho:",irho[:,i+1] 1992 #print "d:",depth[i],"sigma:",sigma[i] 1993 M11 = np.exp(1j*k*depth[i]) if i>0 else 1 1994 M22 = np.exp(-1j*k*depth[i]) if i>0 else 1 1995 M21 = F*M11 1996 M12 = F*M22 1997 C1 = B11*M11 + B21*M12 1998 C2 = B11*M21 + B21*M22 1999 B11 = C1 2000 B21 = C2 2001 C1 = B12*M11 + B22*M12 2002 C2 = B12*M21 + B22*M22 2003 B12 = C1 2004 B22 = C2 2005 k = k_next 2006 2007 r = B12/B11 2008 return np.real(r),np.imag(r) 2009 2010 if np.isscalar(kz): kz = np.asarray([kz], 'd') 2011 2012 m = len(depth) 2013 2014 # Make everything into arrays 2015 depth = np.asarray(depth,'d') 2016 rho = np.asarray(rho,'d') 2017 irho = irho*np.ones_like(rho) if np.isscalar(irho) else np.asarray(irho,'d') 2018 sigma = sigma*np.ones(m-1,'d') if np.isscalar(sigma) else np.asarray(sigma,'d') 2019 2020 # Repeat rho,irho columns as needed 2021 if len(rho.shape) == 1: 2022 rho = rho[None,:] 2023 irho = irho[None,:] 2024 2025 return calc(kz, depth, rho, irho, sigma) 2026 2027 ################################################################################ 1911 2028 # Stacking fault simulation codes 1912 2029 ################################################################################ -
trunk/GSASIIpwdGUI.py
r2754 r2755 45 45 WACV = wx.ALIGN_CENTER_VERTICAL 46 46 GkDelta = unichr(0x0394) 47 Pwr10 = unichr(0x0b9)+unichr(0x 0b0)48 Pwr20 = unichr(0x0b2)+unichr(0x 0b0)47 Pwr10 = unichr(0x0b9)+unichr(0x2070) 48 Pwr20 = unichr(0x0b2)+unichr(0x2070) 49 49 Pwrm1 = unichr(0x207b)+unichr(0x0b9) 50 50 Pwrm2 = unichr(0x207b)+unichr(0x0b2) 51 Pwrm4 = unichr(0x207b)+unichr(0x2074) #really -d but looks like -4 as a superscript 51 Pwrm6 = unichr(0x207b)+unichr(0x2076) 52 Pwrm4 = unichr(0x207b)+unichr(0x2074) 53 Angstr = unichr(0x00c5) 52 54 # trig functions in degrees 53 55 sind = lambda x: math.sin(x*math.pi/180.) … … 213 215 Defined as follows for each layer: 214 216 Name: name of substance 215 Thick: thickness of layer in Angstroms 216 Rough: upper surface roughness for layer 217 Penetration: mixing of layer substance into layer above 217 Thick: thickness of layer in Angstroms (not present for top & bottom layers) 218 Rough: upper surface roughness for layer (not present for toplayer) 219 Penetration: mixing of layer substance into layer above-is this needed? 218 220 DenMul: multiplier for layer scattering density (default = 1.0) 219 221 Top layer defaults to vacuum (or air/any gas); can be substituted for some other substance 220 222 Bottom layer default: infinitely thisck Silicon; can be substituted for some other substance 221 223 ''' 222 return {'Layers':[{'Name':'vacuum','DenMul':[1.0,False],}, 223 {'Name':'vacuum','Thick':[1.e6,False],'Rough':[0.,False],'Penetration':[0.,False],'DenMul':[1.0,False]},], 224 'Zero':'Top','DualFitFile':'','FltBack':[0.0,False],'DualFltBack':[0.0,False], 225 'Scale':[1.0,False],'DualScale':[1.0,False],'Minimizer':'LMLS','Resolution':[0.,'Const dq/q'],'Recomb':0.5,'Toler':0.001} 224 return {'Layers':[{'Name':'vacuum','DenMul':[1.0,False],}, #top layer 225 {'Name':'vacuum','Rough':[0.,False],'Penetration':[0.,False],'DenMul':[1.0,False],}], #bottom layer 226 'Scale':[1.0,False],'FltBack':[0.0,False],'Zero':'Top', #globals 227 'Minimizer':'LMLS','Resolution':[0.,'Const dq/q'],'Recomb':0.5,'Toler':0.001, #minimizer controls 228 'DualFitFiles':['',],'DualFltBacks':[[0.0,False],],'DualScales':[[1.0,False],]} #optional stuff for multidat fits? 226 229 227 230 def SetDefaultSubstances(): 228 231 'Fills in default items for the SASD Substances dictionary' 229 return {'Substances':{'vacuum':{'Elements':{},'Volume':1.0,'Density':0.0,'Scatt density':0.0}}} 232 return {'Substances':{'vacuum':{'Elements':{},'Volume':1.0,'Density':0.0,'Scatt density':0.0,'XImag density':0.0}, 233 'unit scatter':{'Elements':None,'Volume':None,'Density':None,'Scatt density':1.0,'XImag density':0.0}}} 230 234 231 235 def GetFileList(G2frame,fileType): … … 3625 3629 import Substances as substFile 3626 3630 3627 def OnLoadSubstance(event): 3628 names = substFile.Substances.keys() 3629 names.sort() 3630 dlg = wx.SingleChoiceDialog(G2frame, 'Which substance?', 'Select substance', names, wx.CHOICEDLG_STYLE) 3631 try: 3632 if dlg.ShowModal() == wx.ID_OK: 3633 name = names[dlg.GetSelection()] 3634 else: 3635 return 3636 finally: 3637 dlg.Destroy() 3638 data['Substances'][name] = {'Elements':{},'Volume':1.0,'Density':1.0, 3639 'Scatt density':0.0,'XAnom density':0.0,'XAbsorption':0.0} 3631 def LoadSubstance(name): 3632 3640 3633 subst = substFile.Substances[name] 3641 3634 ElList = subst['Elements'].keys() … … 3656 3649 data['Substances'][name]['Density'] = \ 3657 3650 G2mth.Vol2Den(data['Substances'][name]['Elements'],data['Substances'][name]['Volume']) 3658 data['Substances'][name]['Scatt density'] = \ 3659 G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3660 contrst,absorb = G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3661 data['Substances'][name]['XAnom density'] = contrst 3651 if 'X' in Inst['Type'][0]: 3652 data['Substances'][name]['Scatt density'] = \ 3653 G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3654 recontrst,absorb,imcontrst = G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3655 elif 'NC' in Inst['Type'][0]: 3656 isotopes = Info['Isotopes'].keys() 3657 isotopes.sort() 3658 data['Substances'][name]['Elements'][El]['Isotope'] = isotopes[-1] 3659 data['Substances'][name]['Scatt density'] = \ 3660 G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3661 recontrst,absorb,imcontrst = G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3662 data['Substances'][name]['XAnom density'] = recontrst 3662 3663 data['Substances'][name]['XAbsorption'] = absorb 3663 3664 data['Substances'][name]['XImag density'] = imcontrst 3665 3666 def OnReloadSubstances(event): 3667 3668 for name in data['Substances'].keys(): 3669 if name not in ['vacuum','unit scatter']: 3670 if 'X' in Inst['Type'][0]: 3671 data['Substances'][name]['Scatt density'] = \ 3672 G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3673 recontrst,absorb,imcontrst = G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3674 elif 'NC' in Inst['Type'][0]: 3675 data['Substances'][name]['Scatt density'] = \ 3676 G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3677 recontrst,absorb,imcontrst = G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3678 data['Substances'][name]['XAnom density'] = recontrst 3679 data['Substances'][name]['XAbsorption'] = absorb 3680 data['Substances'][name]['XImag density'] = imcontrst 3681 UpdateSubstanceGrid(G2frame,data) 3682 3683 def OnLoadSubstance(event): 3684 3685 names = substFile.Substances.keys() 3686 names.sort() 3687 dlg = wx.SingleChoiceDialog(G2frame, 'Which substance?', 'Select substance', names, wx.CHOICEDLG_STYLE) 3688 try: 3689 if dlg.ShowModal() == wx.ID_OK: 3690 name = names[dlg.GetSelection()] 3691 else: 3692 return 3693 finally: 3694 dlg.Destroy() 3695 3696 data['Substances'][name] = {'Elements':{},'Volume':1.0,'Density':1.0, 3697 'Scatt density':0.0,'Real density':0.0,'XAbsorption':0.0,'XImag density':0.0} 3698 LoadSubstance(name) 3664 3699 UpdateSubstanceGrid(G2frame,data) 3665 3700 … … 3687 3722 ndata = copy.deepcopy(data) 3688 3723 for name in ndata['Substances'].keys(): 3689 contrst,absorb = G2mth.XScattDen(ndata['Substances'][name]['Elements'],ndata['Substances'][name]['Volume'],wave) 3690 ndata['Substances'][name]['XAnom density'] = contrst 3691 ndata['Substances'][name]['XAbsorption'] = absorb 3724 if name not in ['vacuum','unit scatter']: 3725 if 'X' in Inst['Type'][0]: 3726 recontrst,absorb,imcontrst = G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3727 elif 'NC' in Inst['Type'][0]: 3728 recontrst,absorb,imcontrst = G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3729 ndata['Substances'][name]['XAnom density'] = recontrst 3730 ndata['Substances'][name]['XAbsorption'] = absorb 3731 ndata['Substances'][name]['XImag density'] = imcontrst 3692 3732 G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Substances'),ndata) 3693 3733 … … 3699 3739 data['Substances'][Name] = {'Elements':{},'Volume':1.0,'Density':1.0, 3700 3740 'Scatt density':0.0,'XAnom density':0.,'XAbsorption':0.} 3741 AddElement(Name) 3701 3742 dlg.Destroy() 3702 AddElement(Name)3703 3743 UpdateSubstanceGrid(G2frame,data) 3704 3744 … … 3706 3746 TextList = [] 3707 3747 for name in data['Substances']: 3708 if name != 'vacuum':3748 if name not in ['vacuum','unit scatter']: 3709 3749 TextList += [name,] 3710 3750 if not TextList: … … 3724 3764 TextList = [] 3725 3765 for name in data['Substances']: 3726 if name != 'vacuum':3766 if name not in ['vacuum','unit scatter']: 3727 3767 TextList += [name,] 3728 3768 if not TextList: … … 3732 3772 if dlg.ShowModal() == wx.ID_OK: 3733 3773 name = TextList[dlg.GetSelection()] 3774 AddElement(name) 3734 3775 else: 3735 3776 return 3736 3777 finally: 3737 3778 dlg.Destroy() 3738 AddElement(name)3739 3779 UpdateSubstanceGrid(G2frame,data) 3740 3780 … … 3748 3788 Info.update({'Num':1}) 3749 3789 data['Substances'][name]['Elements'][El] = Info 3790 isotopes = Info['Isotopes'].keys() 3791 isotopes.sort() 3792 data['Substances'][name]['Elements'][El]['Isotope'] = isotopes[-1] 3750 3793 data['Substances'][name]['Volume'] = G2mth.El2EstVol(data['Substances'][name]['Elements']) 3751 3794 data['Substances'][name]['Density'] = \ 3752 3795 G2mth.Vol2Den(data['Substances'][name]['Elements'],data['Substances'][name]['Volume']) 3753 data['Substances'][name]['Scatt density'] = \ 3754 G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3755 contrst,absorb = G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3756 data['Substances'][name]['XAnom density'] = contrst 3796 if 'X' in Inst['Type'][0]: 3797 data['Substances'][name]['Scatt density'] = \ 3798 G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3799 recontrst,absorb,imcontrst = G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3800 elif 'NC' in Inst['Type'][0]: 3801 data['Substances'][name]['Scatt density'] = \ 3802 G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3803 recontrst,absorb,imcontrst = G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3804 data['Substances'][name]['XAnom density'] = recontrst 3757 3805 data['Substances'][name]['XAbsorption'] = absorb 3806 data['Substances'][name]['XImag density'] = imcontrst 3758 3807 dlg.Destroy() 3759 3808 … … 3761 3810 TextList = [] 3762 3811 for name in data['Substances']: 3763 if name != 'vacuum':3812 if name not in ['vacuum','unit scatter']: 3764 3813 TextList += [name,] 3765 3814 if not TextList: … … 3782 3831 data['Substances'][name]['Density'] = \ 3783 3832 G2mth.Vol2Den(data['Substances'][name]['Elements'],data['Substances'][name]['Volume']) 3784 data['Substances'][name]['Scatt density'] = \ 3785 G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3786 contrst,absorb = G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3787 data['Substances'][name]['XAnom density'] = contrst 3833 if 'X' in Inst['Type'][0]: 3834 data['Substances'][name]['Scatt density'] = \ 3835 G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3836 recontrst,absorb,imcontrst = G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3837 elif 'NC' in Inst['Type'][0]: 3838 data['Substances'][name]['Scatt density'] = \ 3839 G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3840 recontrst,absorb,imcontrst = G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3841 data['Substances'][name]['XAnom density'] = recontrst 3788 3842 data['Substances'][name]['XAbsorption'] = absorb 3843 data['Substances'][name]['XImag density'] = imcontrst 3789 3844 UpdateSubstanceGrid(G2frame,data) 3790 3845 3791 3846 def SubstSizer(): 3792 3847 3793 def OnValueChange(event): 3794 event.Skip() 3848 def OnNum(invalid,value,tc): 3849 if invalid: return 3850 name,El,keyId = Indx[tc.GetId()] 3851 data['Substances'][name]['Volume'] = G2mth.El2EstVol(data['Substances'][name]['Elements']) 3852 data['Substances'][name]['Density'] = \ 3853 G2mth.Vol2Den(data['Substances'][name]['Elements'],data['Substances'][name]['Volume']) 3854 if 'X' in Inst['Type'][0]: 3855 recontrst,absorb,imcontrst = G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3856 elif 'NC' in Inst['Type'][0]: 3857 recontrst,absorb,imcontrst = G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3858 data['Substances'][name]['XAnom density'] = recontrst 3859 data['Substances'][name]['XAbsorption'] = absorb 3860 data['Substances'][name]['XImag density'] = imcontrst 3861 wx.CallAfter(UpdateSubstanceGrid,G2frame,data) 3862 3863 def OnVolDen(invalid,value,tc): 3864 if invalid: return 3865 name,keyId = Indx[tc.GetId()] 3866 if keyId in 'Volume': 3867 data['Substances'][name]['Density'] = \ 3868 G2mth.Vol2Den(data['Substances'][name]['Elements'],value) 3869 elif keyId in 'Density': 3870 data['Substances'][name]['Volume'] = \ 3871 G2mth.Den2Vol(data['Substances'][name]['Elements'],value) 3872 if 'X' in Inst['Type'][0]: 3873 data['Substances'][name]['Scatt density'] = \ 3874 G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3875 recontrst,absorb,imcontrst = G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3876 elif 'NC' in Inst['Type'][0]: 3877 data['Substances'][name]['Scatt density'] = \ 3878 G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3879 recontrst,absorb,imcontrst = G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3880 data['Substances'][name]['XAnom density'] = recontrst 3881 data['Substances'][name]['XAbsorption'] = absorb 3882 data['Substances'][name]['XImag density'] = imcontrst 3883 wx.CallAfter(UpdateSubstanceGrid,G2frame,data) 3884 3885 def OnIsotope(event): 3795 3886 Obj = event.GetEventObject() 3796 if len(Indx[Obj.GetId()]) == 3: 3797 name,El,keyId = Indx[Obj.GetId()] 3798 try: 3799 value = max(0,float(Obj.GetValue())) 3800 except ValueError: 3801 value = 0 3802 Obj.SetValue('%.2f'%(value)) 3803 data['Substances'][name]['Elements'][El][keyId] = value 3804 data['Substances'][name]['Volume'] = G2mth.El2EstVol(data['Substances'][name]['Elements']) 3805 data['Substances'][name]['Density'] = \ 3806 G2mth.Vol2Den(data['Substances'][name]['Elements'],data['Substances'][name]['Volume']) 3807 else: 3808 name,keyId = Indx[Obj.GetId()] 3809 try: 3810 value = max(0,float(Obj.GetValue())) 3811 except ValueError: 3812 value = 1.0 3813 data['Substances'][name][keyId] = value 3814 if keyId in 'Volume': 3815 data['Substances'][name]['Density'] = \ 3816 G2mth.Vol2Den(data['Substances'][name]['Elements'],value) 3817 elif keyId in 'Density': 3818 data['Substances'][name]['Volume'] = \ 3819 G2mth.Den2Vol(data['Substances'][name]['Elements'],value) 3820 data['Substances'][name]['Scatt density'] = \ 3821 G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])[0] 3822 contrst,absorb = G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3823 data['Substances'][name]['XAnom density'] = contrst 3887 El,name = Indx[Obj.GetId()] 3888 data['Substances'][name]['Elements'][El]['Isotope'] = Obj.GetValue() 3889 recontrst,absorb,imcontrst = G2mth.NCScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave) 3890 data['Substances'][name]['XAnom density'] = recontrst 3824 3891 data['Substances'][name]['XAbsorption'] = absorb 3892 data['Substances'][name]['XImag density'] = imcontrst 3825 3893 wx.CallAfter(UpdateSubstanceGrid,G2frame,data) 3826 3894 … … 3836 3904 substSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Not applicable'), 3837 3905 0,WACV) 3906 elif name == 'unit scatter': 3907 substSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Scattering density,f: %.3f *10%scm%s'%(data['Substances'][name]['Scatt density'],Pwr10,Pwrm2)),0,WACV) 3838 3908 else: 3839 elSizer = wx.FlexGridSizer(0, 6,5,5)3909 elSizer = wx.FlexGridSizer(0,8,5,5) 3840 3910 Substance = data['Substances'][name] 3841 3911 Elems = Substance['Elements'] … … 3843 3913 elSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' '+El+': '), 3844 3914 0,WACV) 3845 # azmthOff = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data,'azmthOff',nDig=(10,2),typeHint=float,OnLeave=OnAzmthOff) 3846 num = wx.TextCtrl(G2frame.dataDisplay,value='%.2f'%(Elems[El]['Num']),style=wx.TE_PROCESS_ENTER)3915 num = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Substances'][name]['Elements'][El],'Num', 3916 nDig=(10,2),typeHint=float,OnLeave=OnNum) 3847 3917 Indx[num.GetId()] = [name,El,'Num'] 3848 num.Bind(wx.EVT_TEXT_ENTER,OnValueChange)3849 num.Bind(wx.EVT_KILL_FOCUS,OnValueChange)3850 3918 elSizer.Add(num,0,WACV) 3919 if 'N' in Inst['Type'][0]: 3920 elSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Isotope: '),0,WACV) 3921 isotopes = Elems[El]['Isotopes'].keys() 3922 isotope = wx.ComboBox(G2frame.dataDisplay,choices=isotopes,value=Elems[El].get('Isotope','Nat. Abund.'), 3923 style=wx.CB_READONLY|wx.CB_DROPDOWN) 3924 Indx[isotope.GetId()] = [El,name] 3925 isotope.Bind(wx.EVT_COMBOBOX,OnIsotope) 3926 elSizer.Add(isotope,0,WACV) 3851 3927 substSizer.Add(elSizer,0) 3852 3928 vdsSizer = wx.FlexGridSizer(0,4,5,5) 3853 3929 vdsSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Volume: '), 3854 3930 0,WACV) 3855 # azmthOff = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data,'azmthOff',nDig=(10,2),typeHint=float,OnLeave=OnAzmthOff) 3856 vol = wx.TextCtrl(G2frame.dataDisplay,value='%.3f'%(Substance['Volume']),style=wx.TE_PROCESS_ENTER) 3931 vol = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Substances'][name],'Volume',nDig=(10,2),typeHint=float,OnLeave=OnVolDen) 3857 3932 Indx[vol.GetId()] = [name,'Volume'] 3858 vol.Bind(wx.EVT_TEXT_ENTER,OnValueChange)3859 vol.Bind(wx.EVT_KILL_FOCUS,OnValueChange)3860 3933 vdsSizer.Add(vol,0,WACV) 3861 3934 vdsSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Density: '), 3862 3935 0,WACV) 3863 # azmthOff = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data,'azmthOff',nDig=(10,2),typeHint=float,OnLeave=OnAzmthOff) 3864 den = wx.TextCtrl(G2frame.dataDisplay,value='%.3f'%(Substance['Density']),style=wx.TE_PROCESS_ENTER) 3936 den = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Substances'][name],'Density',nDig=(10,2),typeHint=float,OnLeave=OnVolDen) 3865 3937 Indx[den.GetId()] = [name,'Density'] 3866 den.Bind(wx.EVT_TEXT_ENTER,OnValueChange)3867 den.Bind(wx.EVT_KILL_FOCUS,OnValueChange)3868 3938 vdsSizer.Add(den,0,WACV) 3869 3939 substSizer.Add(vdsSizer,0) 3870 substSizer.Add(wx.StaticText(G2frame.dataDisplay, 3871 label=' Scattering density : %.2f *10%scm%s'%(Substance['Scatt density'],Pwr10,Pwrm2)), 3872 0,WACV) 3873 substSizer.Add(wx.StaticText(G2frame.dataDisplay, #allow neutrons here into NAnom density & NAbsorption 3874 label=' Anomalous density : %.2f *10%scm%s'%(Substance['XAnom density'],Pwr10,Pwrm2)), 3875 0,WACV) 3876 substSizer.Add(wx.StaticText(G2frame.dataDisplay, 3877 label=' X-ray absorption : %.2f cm%s'%(Substance['XAbsorption'],Pwrm1)), 3878 0,WACV) 3940 denSizer = wx.FlexGridSizer(0,2,0,0) 3941 denSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Scattering density,f'),0,WACV) 3942 denSizer.Add(wx.StaticText(G2frame.dataDisplay,label=': %.3f *10%scm%s'%(Substance['Scatt density'],Pwr10,Pwrm2)),0,WACV) 3943 denSizer.Add(wx.StaticText(G2frame.dataDisplay,label=" Real density,f+f'"),0,WACV) 3944 denSizer.Add(wx.StaticText(G2frame.dataDisplay,label=': %.3f *10%scm%s'%(Substance['XAnom density'],Pwr10,Pwrm2)),0,WACV) 3945 denSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Imaginary density,f"'),0,WACV) 3946 denSizer.Add(wx.StaticText(G2frame.dataDisplay,label=': %.3g *10%scm%s'%(Substance['XImag density'],Pwr10,Pwrm2)),0,WACV) 3947 denSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Absorption'),0,WACV) 3948 denSizer.Add(wx.StaticText(G2frame.dataDisplay,label=': %.3g cm%s'%(Substance['XAbsorption'],Pwrm1)),0,WACV) 3949 substSizer.Add(denSizer) 3879 3950 return substSizer 3880 3951 … … 3889 3960 G2frame.dataFrame.SetLabel('Substances') 3890 3961 G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadSubstance, id=G2gd.wxID_LOADSUBSTANCE) 3962 G2frame.dataFrame.Bind(wx.EVT_MENU, OnReloadSubstances, id=G2gd.wxID_RELOADSUBSTANCES) 3891 3963 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAddSubstance, id=G2gd.wxID_ADDSUBSTANCE) 3892 3964 G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopySubstance, id=G2gd.wxID_COPYSUBSTANCE) … … 4624 4696 '''respond to selection of REFD Models data tree item. 4625 4697 ''' 4698 def OnCopyModel(event): 4699 print 'copy model' 4700 event.Skip() 4701 4702 def OnCopyFlags(event): 4703 print 'copy flags' 4704 event.Skip() 4705 4706 def OnFitModel(event): 4707 4708 print 'fit model' 4709 # SaveState() 4710 G2pwd.REFDModelFxn(Profile,ProfDict,Inst,Limits,Substances,data) 4711 G2plt.PlotPatterns(G2frame,plotType='REFD') 4712 event.Skip() 4713 4714 def OnFitModelAll(event): 4715 print 'fit all model' 4716 event.Skip() 4717 4718 def OnUnDo(event): 4719 DoUnDo() 4720 data = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame, 4721 G2frame.PatternId,'Models')) 4722 G2frame.dataFrame.RefdUndo.Enable(False) 4723 UpdateREFDModelsGrid(G2frame,data) 4724 G2pwd.REFDModelFxn(Profile,ProfDict,Inst,Limits,Substances,data) 4725 4726 def DoUnDo(): 4727 print 'Undo last refinement' 4728 file = open(G2frame.undosasd,'rb') 4729 PatternId = G2frame.PatternId 4730 G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Models'),cPickle.load(file)) 4731 print ' Models recovered' 4732 file.close() 4733 4734 def SaveState(): 4735 G2frame.undorefd = os.path.join(G2frame.dirname,'GSASIIrefd.save') 4736 file = open(G2frame.undorefd,'wb') 4737 PatternId = G2frame.PatternId 4738 for item in ['Models']: 4739 cPickle.dump(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId,item)),file,1) 4740 file.close() 4741 G2frame.dataFrame.RefdUndo.Enable(True) 4626 4742 4627 4743 def ControlSizer(): … … 4666 4782 data['FltBack'][1] = backref.GetValue() 4667 4783 4784 def Recalculate(invalid,value,tc): 4785 if invalid: 4786 return 4787 G2pwd.REFDModelFxn(Profile,ProfDict,Inst,Limits,Substances,data) 4788 G2plt.PlotPatterns(G2frame,plotType='REFD') 4789 4668 4790 overall = wx.BoxSizer(wx.HORIZONTAL) 4669 4791 overall.Add(wx.StaticText(G2frame.dataDisplay,label=' Scale: '),0,WACV) 4670 overall.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Scale'],0,nDig=(10,2),typeHint=float),0,WACV) 4792 overall.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Scale'],0, 4793 nDig=(10,2),typeHint=float,OnLeave=Recalculate),0,WACV) 4671 4794 scaleref = wx.CheckBox(G2frame.dataDisplay,label=' Refine? ') 4672 4795 scaleref.SetValue(data['Scale'][1]) … … 4674 4797 overall.Add(scaleref,0,WACV) 4675 4798 overall.Add(wx.StaticText(G2frame.dataDisplay,label=' Flat bkg.: '),0,WACV) 4676 overall.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['FltBack'],0,nDig=(10,2),typeHint=float),0,WACV) 4799 overall.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['FltBack'],0, 4800 nDig=(10,2,'g'),typeHint=float,OnLeave=Recalculate),0,WACV) 4677 4801 backref = wx.CheckBox(G2frame.dataDisplay,label=' Refine? ') 4678 4802 backref.SetValue(data['FltBack'][1]) … … 4682 4806 4683 4807 def LayerSizer(): 4684 #'Layers':[{'Name':'vacuum','DenMul':[1.0,False],}, 4685 # {'Name':'vacuum','Thick':[1.e6,False],'Rough':[0.,False],'Penetration':[0.,False],'DenMul':[1.0,False]} 4808 #'Penetration':[0.,False]? 4809 4810 def OnSelect(event): 4811 Obj = event.GetEventObject() 4812 item = Indx[Obj.GetId()] 4813 Name = Obj.GetValue() 4814 data['Layers'][item]['Name'] = Name 4815 data['Layers'][item]['Rough'] = [0.,False] 4816 data['Layers'][item]['Thick'] = [1.,False] 4817 G2pwd.REFDModelFxn(Profile,ProfDict,Inst,Limits,Substances,data) 4818 G2plt.PlotPatterns(G2frame,plotType='REFD') 4819 wx.CallAfter(UpdateREFDModelsGrid,G2frame,data) 4820 4821 def OnCheckBox(event): 4822 Obj = event.GetEventObject() 4823 item,parm = Indx[Obj.GetId()] 4824 data['Layers'][item][parm][1] = Obj.GetValue() 4825 4826 def OnInsertLayer(event): 4827 Obj = event.GetEventObject() 4828 ind = Indx[Obj.GetId()] 4829 data['Layers'].insert(ind+1,{'Name':'vacuum','DenMul':[1.0,False],}) 4830 G2pwd.REFDModelFxn(Profile,ProfDict,Inst,Limits,Substances,data) 4831 G2plt.PlotPatterns(G2frame,plotType='REFD') 4832 wx.CallAfter(UpdateREFDModelsGrid,G2frame,data) 4833 4834 def OnDeleteLayer(event): 4835 Obj = event.GetEventObject() 4836 ind = Indx[Obj.GetId()] 4837 del data['Layers'][ind] 4838 G2pwd.REFDModelFxn(Profile,ProfDict,Inst,Limits,Substances,data) 4839 G2plt.PlotPatterns(G2frame,plotType='REFD') 4840 wx.CallAfter(UpdateREFDModelsGrid,G2frame,data) 4841 4842 def Recalculate(invalid,value,tc): 4843 if invalid: 4844 return 4845 G2pwd.REFDModelFxn(Profile,ProfDict,Inst,Limits,Substances,data) 4846 G2plt.PlotPatterns(G2frame,plotType='REFD') 4847 wx.CallAfter(UpdateREFDModelsGrid,G2frame,data) 4848 4686 4849 layerSizer = wx.BoxSizer(wx.VERTICAL) 4687 4688 4850 layerSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Top layer (superphase):'),0,WACV) 4851 toplayer = wx.BoxSizer(wx.HORIZONTAL) 4852 toplayer.Add(wx.StaticText(G2frame.dataDisplay,label=' Substance: '),0,WACV) 4853 topName = data['Layers'][0]['Name'] 4854 topSel = wx.ComboBox(G2frame.dataDisplay,value=topName, 4855 choices=Substances.keys(),style=wx.CB_READONLY|wx.CB_DROPDOWN) 4856 Indx = {topSel.GetId():0} 4857 topSel.Bind(wx.EVT_COMBOBOX,OnSelect) 4858 toplayer.Add(topSel,0,WACV) 4859 if topName != 'vacuum': 4860 toplayer.Add(wx.StaticText(G2frame.dataDisplay,label=' Den. Mult.: '),0,WACV) 4861 toplayer.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Layers'][0]['DenMul'],0, 4862 nDig=(10,4),typeHint=float,OnLeave=Recalculate),0,WACV) 4863 varBox = wx.CheckBox(G2frame.dataDisplay,label='Refine?') 4864 Indx[varBox.GetId()] = [0,'DenMul'] 4865 varBox.SetValue(data['Layers'][0]['DenMul'][1]) 4866 varBox.Bind(wx.EVT_CHECKBOX, OnCheckBox) 4867 toplayer.Add(varBox,0,WACV) 4868 toplayer.Add(wx.StaticText(G2frame.dataDisplay, 4869 label=' Real scat. den.: %.4g'%(data['Layers'][0]['DenMul'][0]*Substances[topName]['Scatt density'])),0,WACV) 4870 if topName != 'unit scatter': 4871 toplayer.Add(wx.StaticText(G2frame.dataDisplay, 4872 label=' Imag scat. den.: %.4g'%(data['Layers'][0]['DenMul'][0]*Substances[topName]['XImag density'])),0,WACV) 4873 else: 4874 toplayer.Add(wx.StaticText(G2frame.dataDisplay,label=', air or gas'),0,WACV) 4875 layerSizer.Add(toplayer) 4876 insert = wx.Button(G2frame.dataDisplay,label='Insert') 4877 Indx[insert.GetId()] = 0 4878 insert.Bind(wx.EVT_BUTTON,OnInsertLayer) 4879 layerSizer.Add(insert) 4880 G2G.HorizontalLine(layerSizer,G2frame.dataDisplay) 4881 4882 for ilay,layer in enumerate(data['Layers'][1:-1]): 4883 layerSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Layer no. %d'%(ilay+1)),0,WACV) 4884 midlayer = wx.BoxSizer(wx.HORIZONTAL) 4885 midlayer.Add(wx.StaticText(G2frame.dataDisplay,label=' Substance: '),0,WACV) 4886 midName = data['Layers'][ilay+1]['Name'] 4887 midSel = wx.ComboBox(G2frame.dataDisplay,value=midName, 4888 choices=Substances.keys(),style=wx.CB_READONLY|wx.CB_DROPDOWN) 4889 Indx[midSel.GetId()] = ilay+1 4890 midSel.Bind(wx.EVT_COMBOBOX,OnSelect) 4891 midlayer.Add(midSel,0,WACV) 4892 if midName != 'vacuum': 4893 midlayer.Add(wx.StaticText(G2frame.dataDisplay,label=' Den. Mult.: '),0,WACV) 4894 midlayer.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Layers'][ilay+1]['DenMul'],0, 4895 nDig=(10,4),typeHint=float,OnLeave=Recalculate),0,WACV) 4896 varBox = wx.CheckBox(G2frame.dataDisplay,label='Refine?') 4897 Indx[varBox.GetId()] = [ilay+1,'DenMul'] 4898 varBox.SetValue(data['Layers'][ilay+1]['DenMul'][1]) 4899 varBox.Bind(wx.EVT_CHECKBOX, OnCheckBox) 4900 midlayer.Add(varBox,0,WACV) 4901 midlayer.Add(wx.StaticText(G2frame.dataDisplay, 4902 label=' Real scat. den.: %.4g'%(data['Layers'][ilay+1]['DenMul'][0]*Substances[midName]['Scatt density'])),0,WACV) 4903 if midName != 'unit scatter': 4904 midlayer.Add(wx.StaticText(G2frame.dataDisplay, 4905 label=' Imag scat. den.: %.4g'%(data['Layers'][ilay+1]['DenMul'][0]*Substances[midName]['XImag density'])),0,WACV) 4906 else: 4907 midlayer.Add(wx.StaticText(G2frame.dataDisplay,label=', air or gas'),0,WACV) 4908 layerSizer.Add(midlayer) 4909 if midName != 'vacuum': 4910 names = {'Rough':'Upper surface Roughness, '+Angstr,'Thick':'Layer Thickness, '+Angstr} 4911 parmsline = wx.BoxSizer(wx.HORIZONTAL) 4912 for parm in ['Rough','Thick']: 4913 parmsline.Add(wx.StaticText(G2frame.dataDisplay,label=' %s: '%(names[parm])),0,WACV) 4914 parmsline.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Layers'][ilay+1][parm],0, 4915 nDig=(10,2),typeHint=float,OnLeave=Recalculate),0,WACV) 4916 varBox = wx.CheckBox(G2frame.dataDisplay,label='Refine?') 4917 Indx[varBox.GetId()] = [ilay+1,parm] 4918 varBox.SetValue(data['Layers'][ilay+1][parm][1]) 4919 varBox.Bind(wx.EVT_CHECKBOX, OnCheckBox) 4920 parmsline.Add(varBox,0,WACV) 4921 4922 layerSizer.Add(parmsline) 4923 newlayer = wx.BoxSizer(wx.HORIZONTAL) 4924 insert = wx.Button(G2frame.dataDisplay,label='Insert') 4925 Indx[insert.GetId()] = ilay+1 4926 insert.Bind(wx.EVT_BUTTON,OnInsertLayer) 4927 newlayer.Add(insert) 4928 delet = wx.Button(G2frame.dataDisplay,label='Delete') 4929 Indx[delet.GetId()] = ilay+1 4930 delet.Bind(wx.EVT_BUTTON,OnDeleteLayer) 4931 newlayer.Add(delet) 4932 layerSizer.Add(newlayer) 4933 G2G.HorizontalLine(layerSizer,G2frame.dataDisplay) 4934 4935 layerSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Bottom layer (substrate):'),0,WACV) 4936 bottomlayer = wx.BoxSizer(wx.HORIZONTAL) 4937 bottomlayer.Add(wx.StaticText(G2frame.dataDisplay,label=' Substance: '),0,WACV) 4938 bottomName = data['Layers'][-1]['Name'] 4939 bottomSel = wx.ComboBox(G2frame.dataDisplay,value=bottomName, 4940 choices=Substances.keys(),style=wx.CB_READONLY|wx.CB_DROPDOWN) 4941 Indx[bottomSel.GetId()] = len(data['Layers'])-1 4942 bottomSel.Bind(wx.EVT_COMBOBOX,OnSelect) 4943 bottomlayer.Add(bottomSel,0,WACV) 4944 if bottomName != 'vacuum': 4945 bottomlayer.Add(wx.StaticText(G2frame.dataDisplay,label=' Den. Mult.: '),0,WACV) 4946 bottomlayer.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Layers'][-1]['DenMul'],0, 4947 nDig=(10,4),typeHint=float,OnLeave=Recalculate),0,WACV) 4948 varBox = wx.CheckBox(G2frame.dataDisplay,label='Refine?') 4949 Indx[varBox.GetId()] = [-1,'DenMul'] 4950 varBox.SetValue(data['Layers'][-1]['DenMul'][1]) 4951 varBox.Bind(wx.EVT_CHECKBOX, OnCheckBox) 4952 bottomlayer.Add(varBox,0,WACV) 4953 bottomlayer.Add(wx.StaticText(G2frame.dataDisplay, 4954 label=' Real scat. den.: %.4g'%(data['Layers'][-1]['DenMul'][0]*Substances[bottomName]['Scatt density'])),0,WACV) 4955 if bottomName != 'unit scatter': 4956 bottomlayer.Add(wx.StaticText(G2frame.dataDisplay, 4957 label=' Imag scat. den.: %.4g'%(data['Layers'][-1]['DenMul'][0]*Substances[bottomName]['XImag density'])),0,WACV) 4958 else: 4959 bottomlayer.Add(wx.StaticText(G2frame.dataDisplay,label=', air or gas'),0,WACV) 4960 layerSizer.Add(bottomlayer) 4961 if bottomName != 'vacuum': 4962 parmsline = wx.BoxSizer(wx.HORIZONTAL) 4963 parmsline.Add(wx.StaticText(G2frame.dataDisplay,label=' Upper surface Roughness, %s: '%(Angstr)),0,WACV) 4964 parmsline.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Layers'][-1]['Rough'],0, 4965 nDig=(10,2),typeHint=float,OnLeave=Recalculate),0,WACV) 4966 varBox = wx.CheckBox(G2frame.dataDisplay,label='Refine?') 4967 Indx[varBox.GetId()] = [-1,'Rough'] 4968 varBox.SetValue(data['Layers'][-1]['Rough'][1]) 4969 varBox.Bind(wx.EVT_CHECKBOX, OnCheckBox) 4970 parmsline.Add(varBox,0,WACV) 4971 layerSizer.Add(parmsline) 4689 4972 return layerSizer 4690 4691 4973 4692 Sample = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Sample Parameters')) 4974 Substances = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Substances'))['Substances'] 4975 ProfDict,Profile,Name = G2frame.PatternTree.GetItemPyData(G2frame.PatternId)[:3] 4693 4976 Limits = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Limits')) 4694 4977 Inst = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Instrument Parameters')) 4695 Substances = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Substances'))4696 ProfDict,Profile,Name = G2frame.PatternTree.GetItemPyData(G2frame.PatternId)[:3]4697 4978 if G2frame.dataDisplay: 4698 4979 G2frame.dataFrame.DestroyChildren() # is this a ScrolledWindow? If so, bad! 4699 G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame. ModelMenu)4980 G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.REFDModelMenu) 4700 4981 if not G2frame.dataFrame.GetStatusBar(): 4701 4982 G2frame.dataFrame.CreateStatusBar() 4702 4983 G2frame.dataFrame.SetLabel('Modelling') 4703 4984 G2frame.dataDisplay = wxscroll.ScrolledPanel(G2frame.dataFrame) 4985 G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyModel, id=G2gd.wxID_MODELCOPY) 4986 G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyFlags, id=G2gd.wxID_MODELCOPYFLAGS) 4987 G2frame.dataFrame.Bind(wx.EVT_MENU, OnFitModel, id=G2gd.wxID_MODELFIT) 4988 G2frame.dataFrame.Bind(wx.EVT_MENU, OnFitModelAll, id=G2gd.wxID_MODELFITALL) 4989 G2frame.dataFrame.Bind(wx.EVT_MENU, OnUnDo, id=G2gd.wxID_MODELUNDO) 4704 4990 mainSizer = wx.BoxSizer(wx.VERTICAL) 4705 4991 … … 4711 4997 mainSizer.Add(OverallSizer()) 4712 4998 G2G.HorizontalLine(mainSizer,G2frame.dataDisplay) 4713 mainSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Layers:'),0,WACV) 4999 G2G.HorizontalLine(mainSizer,G2frame.dataDisplay) 5000 mainSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Layers: scatt. densities are 10%scm%s = 10%s%s%s'%(Pwr10,Pwrm2,Pwrm6,Angstr,Pwrm2)),0,WACV) 4714 5001 mainSizer.Add(LayerSizer()) 4715 5002 mainSizer.Layout() -
trunk/GSASIIsasd.py
r2546 r2755 14 14 ########### SVN repository information ################### 15 15 import os 16 import sys17 16 import math 18 import time19 17 20 18 import numpy as np 21 import scipy as sp22 import numpy.linalg as nl23 from numpy.fft import ifft, fft, fftshift24 19 import scipy.special as scsp 25 import scipy.interpolate as si26 import scipy.stats as st27 20 import scipy.optimize as so 28 21 #import pdb … … 30 23 import GSASIIpath 31 24 GSASIIpath.SetVersionNumber("$Revision$") 32 import GSASIIlattice as G2lat33 import GSASIIspc as G2spc34 import GSASIIElem as G2elem35 import GSASIIgrid as G2gd36 import GSASIIIO as G2IO37 import GSASIImath as G2mth38 25 import GSASIIpwd as G2pwd 39 26
Note: See TracChangeset
for help on using the changeset viewer.