Changeset 2755


Ignore:
Timestamp:
Mar 20, 2017 9:53:00 AM (5 years ago)
Author:
vondreele
Message:

extend Export HKLs for powder data to include most all columns in GSASII.py
narrow HorizontalLine? display
add a ReloadSubstances? option in case user changed wavelength in SASD & REFD substances
Add a default unit scatter to substances - only in new projects
add modeling of REFD patterns for x-rays (not yet tested - no data) & CW neutrons (tested)
modify XScattDen to give clearly fo, f' & f" components
add NCScattDen for CW neutrons - uses wave to generate real/imaginary components
fix printing of scattering density units - now correct symbols
remove unused imports from GSASIIsasd.py

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r2754 r2755  
    36263626                                for phase in phases:
    36273627                                    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
    36283632                                    file.write("%s %s %s \n" % (name,phase,' Reflection List'))
    36293633                                    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'))
    36313635                                    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']):
    36343638                                        if 'T' in peaks.get('Type','PXC'):
    36353639                                            sig = np.sqrt(peak[6])
    36363640                                            gam = peak[7]
    36373641                                            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]))
    36403645                                        else:
    36413646                                            sig = np.sqrt(peak[6])
    36423647                                            gam = peak[7]
    36433648                                            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]))
    36463652                            item2, cookie2 = self.PatternTree.GetNextChild(item, cookie2)                           
    36473653                    item, cookie = self.PatternTree.GetNextChild(self.root, cookie)                           
  • trunk/GSASIIctrls.py

    r2751 r2755  
    876876    This shows up on the Mac as a very thin line, no matter what I do
    877877    '''
    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)
    880880
    881881################################################################################
  • trunk/GSASIIgrid.py

    r2754 r2755  
    144144[ wxID_MODELCOPY,wxID_MODELFIT,wxID_MODELADD,wxID_ELEMENTADD,wxID_ELEMENTDELETE,
    145145    wxID_ADDSUBSTANCE,wxID_LOADSUBSTANCE,wxID_DELETESUBSTANCE,wxID_COPYSUBSTANCE,
    146     wxID_MODELUNDO,wxID_MODELFITALL,wxID_MODELCOPYFLAGS,
    147 ] = [wx.NewId() for item in range(12)]
     146    wxID_MODELUNDO,wxID_MODELFITALL,wxID_MODELCOPYFLAGS,wxID_RELOADSUBSTANCES
     147] = [wx.NewId() for item in range(13)]
    148148
    149149[ wxID_SELECTPHASE,wxID_PWDHKLPLOT,wxID_PWD3DHKLPLOT,wxID_3DALLHKLPLOT,wxID_MERGEHKL,
     
    21492149        self.SubstanceEdit.Append(id=wxID_LOADSUBSTANCE, kind=wx.ITEM_NORMAL,text='Load substance',
    21502150            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')
    21512153        self.SubstanceEdit.Append(id=wxID_ADDSUBSTANCE, kind=wx.ITEM_NORMAL,text='Add substance',
    21522154            help='Add new substance to list')
     
    21812183        self.PostfillDataMenu()
    21822184       
     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
    21832203        # IMG / Image Controls
    21842204        self.ImageMenu = wx.MenuBar()
  • trunk/GSASIImath.py

    r2571 r2755  
    968968        if wave > 0 the includes f' contribution
    969969    :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
    970971   
    971972    '''
    972973    rho = 0
    973974    mu = 0
    974     if wave:
     975    fpp = 0
     976    if wave:
    975977        Xanom = XAnomAbs(Elements,wave)
    976978    for El in Elements:
     
    978980        if wave:
    979981            f0 += Xanom[El][0]
     982            fpp += Xanom[El][1]*Elements[El]['Num']
    980983            mu += Xanom[El][2]*Elements[El]['Num']
    981984        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   
     987def 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
    9831027   
    9841028def wavekE(wavekE):
     
    9981042        Orbs = G2el.GetXsectionCoeff(El)
    9991043        Xanom[El] = G2el.FPcalc(Orbs, kE)
    1000     return Xanom
     1044    return Xanom        #f',f", mu
    10011045   
    10021046################################################################################
  • trunk/GSASIIpwd.py

    r2754 r2755  
    6060npT2q = lambda tth,wave: 2.0*np.pi*npT2stl(tth,wave)    #=2pi*d*
    6161ateln2 = 8.0*math.log(2.0)
     62nxs = np.newaxis
    6263
    6364################################################################################
     
    19091910   
    19101911################################################################################
     1912# Reflectometry calculations
     1913################################################################################
     1914
     1915def 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
     1941def 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################################################################################
    19112028# Stacking fault simulation codes
    19122029################################################################################
  • trunk/GSASIIpwdGUI.py

    r2754 r2755  
    4545WACV = wx.ALIGN_CENTER_VERTICAL
    4646GkDelta = unichr(0x0394)
    47 Pwr10 = unichr(0x0b9)+unichr(0x0b0)
    48 Pwr20 = unichr(0x0b2)+unichr(0x0b0)
     47Pwr10 = unichr(0x0b9)+unichr(0x2070)
     48Pwr20 = unichr(0x0b2)+unichr(0x2070)
    4949Pwrm1 = unichr(0x207b)+unichr(0x0b9)
    5050Pwrm2 = unichr(0x207b)+unichr(0x0b2)
    51 Pwrm4 = unichr(0x207b)+unichr(0x2074)   #really -d but looks like -4 as a superscript
     51Pwrm6 = unichr(0x207b)+unichr(0x2076)
     52Pwrm4 = unichr(0x207b)+unichr(0x2074)
     53Angstr = unichr(0x00c5)   
    5254# trig functions in degrees
    5355sind = lambda x: math.sin(x*math.pi/180.)
     
    213215    Defined as follows for each layer:
    214216        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?
    218220        DenMul: multiplier for layer scattering density (default = 1.0)
    219221    Top layer defaults to vacuum (or air/any gas); can be substituted for some other substance
    220222    Bottom layer default: infinitely thisck Silicon; can be substituted for some other substance
    221223    '''
    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?
    226229       
    227230def SetDefaultSubstances():
    228231    '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}}}
    230234
    231235def GetFileList(G2frame,fileType):
     
    36253629    import Substances as substFile
    36263630   
    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       
    36403633        subst = substFile.Substances[name]
    36413634        ElList = subst['Elements'].keys()
     
    36563649                data['Substances'][name]['Density'] = \
    36573650                    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
    36623663            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)           
    36643699        UpdateSubstanceGrid(G2frame,data)
    36653700       
     
    36873722            ndata = copy.deepcopy(data)
    36883723            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
    36923732            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Substances'),ndata)
    36933733   
     
    36993739            data['Substances'][Name] = {'Elements':{},'Volume':1.0,'Density':1.0,
    37003740                'Scatt density':0.0,'XAnom density':0.,'XAbsorption':0.}
     3741            AddElement(Name)
    37013742        dlg.Destroy()
    3702         AddElement(Name)
    37033743        UpdateSubstanceGrid(G2frame,data)
    37043744       
     
    37063746        TextList = []
    37073747        for name in data['Substances']:
    3708             if name != 'vacuum':
     3748            if name not in ['vacuum','unit scatter']:
    37093749                TextList += [name,]
    37103750        if not TextList:
     
    37243764        TextList = []
    37253765        for name in data['Substances']:
    3726             if name != 'vacuum':
     3766            if name not in ['vacuum','unit scatter']:
    37273767                TextList += [name,]
    37283768        if not TextList:
     
    37323772            if dlg.ShowModal() == wx.ID_OK:
    37333773                name = TextList[dlg.GetSelection()]
     3774                AddElement(name)
    37343775            else:
    37353776                return
    37363777        finally:
    37373778            dlg.Destroy()
    3738         AddElement(name)
    37393779        UpdateSubstanceGrid(G2frame,data)
    37403780       
     
    37483788                Info.update({'Num':1})
    37493789                data['Substances'][name]['Elements'][El] = Info
     3790                isotopes = Info['Isotopes'].keys()
     3791                isotopes.sort()
     3792                data['Substances'][name]['Elements'][El]['Isotope'] = isotopes[-1]
    37503793            data['Substances'][name]['Volume'] = G2mth.El2EstVol(data['Substances'][name]['Elements'])
    37513794            data['Substances'][name]['Density'] = \
    37523795                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
    37573805            data['Substances'][name]['XAbsorption'] = absorb
     3806            data['Substances'][name]['XImag density'] = imcontrst
    37583807        dlg.Destroy()
    37593808       
     
    37613810        TextList = []
    37623811        for name in data['Substances']:
    3763             if name != 'vacuum':
     3812            if name not in ['vacuum','unit scatter']:
    37643813                TextList += [name,]
    37653814        if not TextList:
     
    37823831                data['Substances'][name]['Density'] = \
    37833832                    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
    37883842                data['Substances'][name]['XAbsorption'] = absorb
     3843                data['Substances'][name]['XImag density'] = imcontrst
    37893844        UpdateSubstanceGrid(G2frame,data)
    37903845               
    37913846    def SubstSizer():
    37923847       
    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):
    37953886            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
    38243891            data['Substances'][name]['XAbsorption'] = absorb
     3892            data['Substances'][name]['XImag density'] = imcontrst
    38253893            wx.CallAfter(UpdateSubstanceGrid,G2frame,data)
    38263894       
     
    38363904                substSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label='        Not applicable'),
    38373905                    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)
    38383908            else:   
    3839                 elSizer = wx.FlexGridSizer(0,6,5,5)
     3909                elSizer = wx.FlexGridSizer(0,8,5,5)
    38403910                Substance = data['Substances'][name]
    38413911                Elems = Substance['Elements']
     
    38433913                    elSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' '+El+': '),
    38443914                        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)
    38473917                    Indx[num.GetId()] = [name,El,'Num']
    3848                     num.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
    3849                     num.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
    38503918                    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)
    38513927                substSizer.Add(elSizer,0)
    38523928                vdsSizer = wx.FlexGridSizer(0,4,5,5)
    38533929                vdsSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Volume: '),
    38543930                    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)
    38573932                Indx[vol.GetId()] = [name,'Volume']
    3858                 vol.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
    3859                 vol.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
    38603933                vdsSizer.Add(vol,0,WACV)               
    38613934                vdsSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Density: '),
    38623935                    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)
    38653937                Indx[den.GetId()] = [name,'Density']
    3866                 den.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
    3867                 den.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
    38683938                vdsSizer.Add(den,0,WACV)
    38693939                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)
    38793950        return substSizer
    38803951           
     
    38893960    G2frame.dataFrame.SetLabel('Substances')
    38903961    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadSubstance, id=G2gd.wxID_LOADSUBSTANCE)   
     3962    G2frame.dataFrame.Bind(wx.EVT_MENU, OnReloadSubstances, id=G2gd.wxID_RELOADSUBSTANCES)   
    38913963    G2frame.dataFrame.Bind(wx.EVT_MENU, OnAddSubstance, id=G2gd.wxID_ADDSUBSTANCE)
    38923964    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopySubstance, id=G2gd.wxID_COPYSUBSTANCE)
     
    46244696    '''respond to selection of REFD Models data tree item.
    46254697    '''
     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)
    46264742   
    46274743    def ControlSizer():
     
    46664782            data['FltBack'][1] = backref.GetValue()
    46674783           
     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
    46684790        overall = wx.BoxSizer(wx.HORIZONTAL)
    46694791        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)
    46714794        scaleref = wx.CheckBox(G2frame.dataDisplay,label=' Refine?  ')
    46724795        scaleref.SetValue(data['Scale'][1])
     
    46744797        overall.Add(scaleref,0,WACV)
    46754798        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)
    46774801        backref = wx.CheckBox(G2frame.dataDisplay,label=' Refine?  ')
    46784802        backref.SetValue(data['FltBack'][1])
     
    46824806       
    46834807    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                       
    46864849        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)       
    46894972        return layerSizer
    4690        
    46914973   
    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]
    46934976    Limits = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Limits'))
    46944977    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]
    46974978    if G2frame.dataDisplay:
    46984979        G2frame.dataFrame.DestroyChildren()   # is this a ScrolledWindow? If so, bad!
    4699     G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.ModelMenu)
     4980    G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.REFDModelMenu)
    47004981    if not G2frame.dataFrame.GetStatusBar():
    47014982        G2frame.dataFrame.CreateStatusBar()
    47024983    G2frame.dataFrame.SetLabel('Modelling')
    47034984    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)
    47044990    mainSizer = wx.BoxSizer(wx.VERTICAL)
    47054991   
     
    47114997    mainSizer.Add(OverallSizer())
    47124998    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)
    47145001    mainSizer.Add(LayerSizer())
    47155002    mainSizer.Layout()   
  • trunk/GSASIIsasd.py

    r2546 r2755  
    1414########### SVN repository information ###################
    1515import os
    16 import sys
    1716import math
    18 import time
    1917
    2018import numpy as np
    21 import scipy as sp
    22 import numpy.linalg as nl
    23 from numpy.fft import ifft, fft, fftshift
    2419import scipy.special as scsp
    25 import scipy.interpolate as si
    26 import scipy.stats as st
    2720import scipy.optimize as so
    2821#import pdb
     
    3023import GSASIIpath
    3124GSASIIpath.SetVersionNumber("$Revision$")
    32 import GSASIIlattice as G2lat
    33 import GSASIIspc as G2spc
    34 import GSASIIElem as G2elem
    35 import GSASIIgrid as G2gd
    36 import GSASIIIO as G2IO
    37 import GSASIImath as G2mth
    3825import GSASIIpwd as G2pwd
    3926
Note: See TracChangeset for help on using the changeset viewer.