Changeset 2763


Ignore:
Timestamp:
Mar 29, 2017 1:57:33 PM (5 years ago)
Author:
vondreele
Message:

add plotting of reflectometry model scattering profiles
add magnetic scatterin component to refl. models (neutrons)
refactor model GUI
allow rescaling of REFD & PWDR profiles via Scale in Sample Parms
cange int element nos. to float ones in Substances

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIgrid.py

    r2762 r2763  
    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,wxID_RELOADSUBSTANCES
    147 ] = [wx.NewId() for item in range(13)]
     146    wxID_MODELUNDO,wxID_MODELFITALL,wxID_MODELCOPYFLAGS,wxID_RELOADSUBSTANCES,
     147    wxID_MODELPLOT,
     148] = [wx.NewId() for item in range(14)]
    148149
    149150[ wxID_SELECTPHASE,wxID_PWDHKLPLOT,wxID_PWD3DHKLPLOT,wxID_3DALLHKLPLOT,wxID_MERGEHKL,
     
    21972198        self.REFDModelEdit.Append(id=wxID_MODELCOPY, kind=wx.ITEM_NORMAL,text='Copy',
    21982199            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')
     2200        self.REFDModelEdit.Append(id=wxID_MODELPLOT, kind=wx.ITEM_NORMAL,text='Plot',
     2201            help='Plot model SDL for selected histograms')
    22012202        self.PostfillDataMenu()
    22022203
  • trunk/GSASIIpwd.py

    r2761 r2763  
    2828import scipy.stats as st
    2929import scipy.optimize as so
     30import scipy.special as sp
    3031
    3132import GSASIIpath
     
    19311932            name = layer['Name']
    19321933            cid = str(ilay)+';'
    1933             for parm in ['Thick','Rough','DenMul']:
     1934            for parm in ['Thick','Rough','DenMul','Mag SLD']:
    19341935                parmDict[cid+parm] = layer.get(parm,[0.,False])[0]
    19351936                if layer.get(parm,[0.,False])[1]:
     
    19591960            line2 = ' Scattering density: Real %.5g'%(Substances[name]['Scatt density']*parmDict[cid+'DenMul'])
    19601961            line2 += ' Imag %.5g'%(Substances[name].get('XImag density',0.)**parmDict[cid+'DenMul'])
    1961             for parm in ['Thick','Rough','DenMul']:
     1962            for parm in ['Thick','Rough','DenMul','Mag SLD']:
    19621963                if parm in layer:
    19631964                    layer[parm][0] = parmDict[cid+parm]
     
    19911992            sigma[ilay] = parmDict[cid+'Rough']
    19921993            rho[ilay] = parmDict[cid+'rho']*parmDict[cid+'DenMul']
     1994            if cid+'Mag SLD' in parmDict:
     1995                rho[ilay] += parmDict[cid+'Mag SLD']
    19931996            irho[ilay] = parmDict[cid+'irho']*parmDict[cid+'DenMul']
    19941997            A,B = abeles(0.5*Q,depth,rho,irho,sigma[1:])     #Q --> k, offset roughness for abeles
     
    20032006    Ifin = np.searchsorted(Q,Qmax)+1    #include last point
    20042007    Ic[:] = 0
    2005     Bounds = {'Scale':[data['Scale'][0]*.85,data['Scale'][0]/.85],'FltBack':[None,None],'DenMul':[0.,None],'Thick':[1.,None],'Rough':[0.,None]}
     2008    Bounds = {'Scale':[data['Scale'][0]*.85,data['Scale'][0]/.85],'FltBack':[None,None],
     2009              'DenMul':[0.,None],'Thick':[1.,None],'Rough':[0.,None],'Mag SLD':[-10.,10.]}
    20062010    parmDict,varyList,values,bounds = GetModelParms()
    20072011    Msg = 'Failed to converge'
     
    20562060            indx = Negs.nonzero()
    20572061            name = varyList[indx[0][0]]
    2058             if name != 'FltBack':
     2062            if name != 'FltBack' and 'Mag SLD' not in name:
    20592063                Msg += ' negative coefficient for '+name+'!'
    20602064                raise ValueError
     
    20742078        print Msg
    20752079        return False,0,0,0,0,0,0,Msg
     2080       
     2081def makeSLDprofile(data,Substances):
     2082   
     2083    sq2 = np.sqrt(2.)
     2084    Nlayers = len(data['Layers'])
     2085    interfaces = np.zeros(Nlayers)
     2086    rho = np.zeros(Nlayers)
     2087    irho = np.zeros(Nlayers)
     2088    sigma = np.zeros(Nlayers)
     2089    thick = 0.
     2090    for ilayer,layer in enumerate(data['Layers']):
     2091        name = layer['Name']
     2092        if 'Thick' in layer:    #skips first & last layers
     2093            thick += layer['Thick'][0]
     2094            interfaces[ilayer] = layer['Thick'][0]+interfaces[ilayer-1]
     2095        if 'Rough' in layer:    #skips first layer
     2096            sigma[ilayer] = max(0.001,layer['Rough'][0])
     2097        rho[ilayer] = Substances[name]['Scatt density']*layer['DenMul'][0]
     2098        if 'Mag SLD' in layer:
     2099            rho[ilayer] += layer['Mag SLD'][0]
     2100        irho[ilayer] = Substances[name].get('XImag density',0.)*layer['DenMul'][0]
     2101    x = np.linspace(-0.15*thick,1.15*thick,1000,endpoint=True)
     2102    xr = np.flipud(x)
     2103    interfaces[-1] = x[-1]
     2104    y = np.ones_like(x)*rho[0]
     2105    iBeg = 0
     2106    for ilayer in range(Nlayers-1):
     2107        delt = rho[ilayer+1]-rho[ilayer]
     2108        iPos = np.searchsorted(x,interfaces[ilayer])
     2109        y[iBeg:] += (delt/2.)*sp.erfc((interfaces[ilayer]-x[iBeg:])/(sq2*sigma[ilayer+1]))
     2110        iBeg = iPos
     2111    return x,xr,y   
    20762112
    20772113def REFDModelFxn(Profile,Inst,Limits,Substances,data):
     
    20972133            sigma[ilayer] = layer['Rough'][0]
    20982134        rho[ilayer] = Substances[name]['Scatt density']*layer['DenMul'][0]
     2135        if 'Mag SLD' in layer:
     2136            rho[ilayer] += layer['Mag SLD'][0]
    20992137        irho[ilayer] = Substances[name].get('XImag density',0.)*layer['DenMul'][0]
    21002138        A,B = abeles(0.5*Q[iBeg:iFin],depth,rho,irho,sigma[1:])     #Q --> k, offset roughness for abeles
  • trunk/GSASIIpwdGUI.py

    r2762 r2763  
    19811981        insDef = dict(zip(instkeys,[data[key][0] for key in instkeys]))
    19821982        insRef = {}
     1983    elif 'R' in data['Type'][0]:                               #low angle data
     1984        insVal = dict(zip(instkeys,[data[key][1] for key in instkeys]))
     1985        insDef = dict(zip(instkeys,[data[key][0] for key in instkeys]))
     1986        insRef = {}
    19831987    RefObj = {}
    19841988    waves = {'CuKa':[1.54051,1.54433],'TiKa':[2.74841,2.75207],'CrKa':[2.28962,2.29351],
     
    20172021        #G2frame.Bind(wx.EVT_MENU,OnWaveChange,id=G2gd.wxID_CHANGEWAVETYPE)       
    20182022        G2frame.Bind(wx.EVT_MENU,OnCopy1Val,id=G2gd.wxID_INST1VAL)
    2019     elif 'L' in insVal['Type']:                   #SASD data menu commands
     2023    elif 'L' in insVal['Type'] or 'R' in insVal['Type']:                   #SASD data menu commands
    20202024        G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.SASDInstMenu)
    20212025        if not G2frame.dataFrame.GetStatusBar():
     
    21562160   
    21572161    def OnSetScale(event):
     2162        if histName[:4] in ['REFD','PWDR']:
     2163            Scale = data['Scale'][0]
     2164            dlg = wx.MessageDialog(G2frame,'Rescale data by %.2f?'%(Scale),'Rescale data',wx.OK|wx.CANCEL)
     2165            try:
     2166                if dlg.ShowModal() == wx.ID_OK:
     2167                    pId = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,histName)
     2168                    y,w = G2frame.PatternTree.GetItemPyData(pId)[1][1:3]
     2169                    y *= Scale
     2170                    w /= Scale**2
     2171                    data['Scale'][0] = 1.0
     2172            finally:
     2173                dlg.Destroy()
     2174            G2plt.PlotPatterns(G2frame,plotType='SASD',newPlot=True)
     2175            UpdateSampleGrid(G2frame,data)
     2176            return
     2177        #SASD rescaliing               
    21582178        histList = []
    21592179        item, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
     
    23522372    G2frame.Bind(wx.EVT_MENU, OnCopy1Val, id=G2gd.wxID_SAMPLE1VAL)
    23532373    G2frame.Bind(wx.EVT_MENU, OnAllSampleLoad, id=G2gd.wxID_ALLSAMPLELOAD)
    2354     if 'SASD' in histName:
     2374    if histName[:4] in ['SASD','REFD','PWDR']:
    23552375        G2frame.dataFrame.SetScale.Enable(True)
    23562376    if not G2frame.dataFrame.GetStatusBar():
     
    37863806                El = El.strip().capitalize()
    37873807                Info = G2elem.GetAtomInfo(El)
    3788                 Info.update({'Num':1})
     3808                Info.update({'Num':1.})
    37893809                data['Substances'][name]['Elements'][El] = Info
    37903810                isotopes = Info['Isotopes'].keys()
     
    39143934                        0,WACV)
    39153935                    num = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Substances'][name]['Elements'][El],'Num',
    3916                         nDig=(10,2),typeHint=float,OnLeave=OnNum)
     3936                        nDig=(10,2,'f'),typeHint=float,OnLeave=OnNum)
    39173937                    Indx[num.GetId()] = [name,El,'Num']
    39183938                    elSizer.Add(num,0,WACV)
     
    46974717    '''
    46984718    def OnCopyModel(event):
    4699         print 'copy model'
    4700         event.Skip()
    4701        
    4702     def OnCopyFlags(event):
    4703         print 'copy flags'
    4704         event.Skip()
     4719        hst = G2frame.PatternTree.GetItemText(G2frame.PatternId)
     4720        histList = GetHistsLikeSelected(G2frame)
     4721        if not histList:
     4722            G2frame.ErrorDialog('No match','No histograms match '+hst,G2frame.dataFrame)
     4723            return
     4724        copyList = []
     4725        dlg = G2G.G2MultiChoiceDialog(G2frame.dataFrame,'Copy reflectivity models from\n'+str(hst[5:])+' to...',
     4726            'Copy parameters', histList)
     4727        try:
     4728            if dlg.ShowModal() == wx.ID_OK:
     4729                for i in dlg.GetSelections():
     4730                    copyList.append(histList[i])
     4731        finally:
     4732            dlg.Destroy()
     4733        for item in copyList:
     4734            Id = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,item)
     4735            G2frame.PatternTree.SetItemPyData(
     4736                G2gd.GetPatternTreeItemId(G2frame,Id,'Models'),copy.copy(data))
    47054737       
    47064738    def OnFitModel(event):
     
    47084740        SaveState()
    47094741        G2pwd.REFDRefine(Profile,ProfDict,Inst,Limits,Substances,data)
     4742        x,xr,y = G2pwd.makeSLDprofile(data,Substances)
     4743        ModelPlot(data,x,xr,y)
    47104744        G2plt.PlotPatterns(G2frame,plotType='REFD')
    47114745        wx.CallLater(100,UpdateREFDModelsGrid,G2frame,data)
     4746       
     4747    def OnModelPlot(event):
     4748        hst = G2frame.PatternTree.GetItemText(G2frame.PatternId)
     4749        histList = [hst,]
     4750        histList += GetHistsLikeSelected(G2frame)
     4751        if not histList:
     4752            G2frame.ErrorDialog('No match','No histograms match '+hst,G2frame.dataFrame)
     4753            return
     4754        plotList = []
     4755        od = {'label_1':'Zero at substrate','value_1':False}
     4756        dlg = G2G.G2MultiChoiceDialog(G2frame.dataFrame,'Plot reflectivity models for:',
     4757            'Plot SLD models', histList,extraOpts=od)
     4758        try:
     4759            if dlg.ShowModal() == wx.ID_OK:
     4760                for i in dlg.GetSelections():
     4761                    plotList.append(histList[i])
     4762        finally:
     4763            dlg.Destroy()
     4764        XY = []
     4765        for item in plotList:
     4766            mId = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,item)
     4767            model = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,mId,'Models'))
     4768            Substances = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,mId,'Substances'))['Substances']       
     4769            x,xr,y = G2pwd.makeSLDprofile(model,Substances)
     4770            if od['value_1']:
     4771                XY.append([xr,y])
     4772                disLabel = r'$Distance\ from\ substrate,\ \AA$'
     4773            else:
     4774                XY.append([x,y])
     4775                disLabel = r'$Distance\ from\ top\ surface,\ \AA$'
     4776        G2plt.PlotXY(G2frame,XY,labelX=disLabel,labelY=r'$SLD,\ 10^{10}cm^{-2}$',newPlot=True,   
     4777                      Title='Scattering length density',lines=True,names=[])
    47124778       
    47134779    def OnFitModelAll(event):
    47144780        print 'fit all model'
    47154781        event.Skip()
     4782       
     4783    def ModelPlot(data,x,xr,y):
     4784        if data['Zero']:
     4785            XY = [[x,y],]
     4786            disLabel = r'$Distance\ from\ top\ surface,\ \AA$'
     4787        else:
     4788            XY = [[xr,y],]
     4789            disLabel = r'$Distance\ from\ substrate,\ \AA$'
     4790        G2plt.PlotXY(G2frame,XY,labelX=disLabel,labelY=r'$SLD,\ 10^{10}cm^{-2}$',newPlot=False,
     4791            Title='Scattering length density',lines=True,names=[])
    47164792       
    47174793    def OnUnDo(event):
     
    47214797        G2frame.dataFrame.REFDUndo.Enable(False)
    47224798        G2pwd.REFDModelFxn(Profile,Inst,Limits,Substances,data)
     4799        x,xr,y = G2pwd.makeSLDprofile(data,Substances)
     4800        ModelPlot(data,x,xr,y)
    47234801        G2plt.PlotPatterns(G2frame,plotType='REFD')
    47244802        wx.CallLater(100,UpdateREFDModelsGrid,G2frame,data)
     
    47864864           
    47874865            G2pwd.REFDModelFxn(Profile,Inst,Limits,Substances,data)
     4866            x,xr,y = G2pwd.makeSLDprofile(data,Substances)
     4867            ModelPlot(data,x,xr,y)
    47884868            G2plt.PlotPatterns(G2frame,plotType='REFD')
    47894869
     
    48154895            data['Layers'][item]['Rough'] = [0.,False]
    48164896            data['Layers'][item]['Thick'] = [1.,False]
     4897            if 'N' in Inst['Type'][0]:
     4898                data['Layers'][item]['Mag SLD'] = [0.,False]
    48174899            G2pwd.REFDModelFxn(Profile,Inst,Limits,Substances,data)
    48184900            G2plt.PlotPatterns(G2frame,plotType='REFD')
     
    48444926                return
    48454927            G2pwd.REFDModelFxn(Profile,Inst,Limits,Substances,data)
     4928            x,xr,y = G2pwd.makeSLDprofile(data,Substances)
     4929            ModelPlot(data,x,xr,y)
    48464930            G2plt.PlotPatterns(G2frame,plotType='REFD')
    48474931            wx.CallLater(100,UpdateREFDModelsGrid,G2frame,data)
    4848                        
     4932
     4933        Indx = {}                       
    48494934        layerSizer = wx.BoxSizer(wx.VERTICAL)
    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)
     4935       
     4936        for ilay,layer in enumerate(data['Layers']):
     4937            if not ilay:
     4938                layerSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Top layer (superphase):'),0,WACV)
     4939            elif ilay < len(data['Layers'])-1:
     4940                layerSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Layer no. %d'%(ilay)),0,WACV)
     4941            else:
     4942                layerSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Bottom layer (substrate):'),0,WACV)
    48844943            midlayer = wx.BoxSizer(wx.HORIZONTAL)
    48854944            midlayer.Add(wx.StaticText(G2frame.dataDisplay,label=' Substance: '),0,WACV)
    4886             midName = data['Layers'][ilay+1]['Name']
     4945            midName = data['Layers'][ilay]['Name']
    48874946            midSel = wx.ComboBox(G2frame.dataDisplay,value=midName,
    48884947                choices=Substances.keys(),style=wx.CB_READONLY|wx.CB_DROPDOWN)
    4889             Indx[midSel.GetId()] = ilay+1
     4948            Indx[midSel.GetId()] = ilay
    48904949            midSel.Bind(wx.EVT_COMBOBOX,OnSelect)
    48914950            midlayer.Add(midSel,0,WACV)
    48924951            if midName != 'vacuum':
    48934952                midlayer.Add(wx.StaticText(G2frame.dataDisplay,label=' Den. Mult.: '),0,WACV)
    4894                 midlayer.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Layers'][ilay+1]['DenMul'],0,
     4953                midlayer.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Layers'][ilay]['DenMul'],0,
    48954954                    nDig=(10,4),typeHint=float,OnLeave=Recalculate),0,WACV)
    48964955                varBox = wx.CheckBox(G2frame.dataDisplay,label='Refine?')
    4897                 Indx[varBox.GetId()] = [ilay+1,'DenMul']
    4898                 varBox.SetValue(data['Layers'][ilay+1]['DenMul'][1])
     4956                Indx[varBox.GetId()] = [ilay,'DenMul']
     4957                varBox.SetValue(data['Layers'][ilay]['DenMul'][1])
    48994958                varBox.Bind(wx.EVT_CHECKBOX, OnCheckBox)
    49004959                midlayer.Add(varBox,0,WACV)
     4960                realScatt = data['Layers'][ilay]['DenMul'][0]*Substances[midName]['Scatt density']
    49014961                midlayer.Add(wx.StaticText(G2frame.dataDisplay,
    4902                     label=' Real scat. den.: %.4g'%(data['Layers'][ilay+1]['DenMul'][0]*Substances[midName]['Scatt density'])),0,WACV)
     4962                    label=' Real scat. den.: %.4g'%(realScatt)),0,WACV)
    49034963                if midName != 'unit scatter':
    49044964                    midlayer.Add(wx.StaticText(G2frame.dataDisplay,
    4905                         label=' Imag scat. den.: %.4g'%(data['Layers'][ilay+1]['DenMul'][0]*Substances[midName]['XImag density'])),0,WACV)
     4965                        label=' Imag scat. den.: %.4g'%(data['Layers'][ilay]['DenMul'][0]*Substances[midName]['XImag density'])),0,WACV)
    49064966            else:
    49074967                midlayer.Add(wx.StaticText(G2frame.dataDisplay,label=', air or gas'),0,WACV)
    49084968            layerSizer.Add(midlayer)
    49094969            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)
     4970                if 'N' in Inst['Type'][0] and midName not in ['vacuum','unit scatter']:
     4971                    magLayer = wx.BoxSizer(wx.HORIZONTAL)
     4972                    magLayer.Add(wx.StaticText(G2frame.dataDisplay,label=' Magnetic SLD: '),0,WACV)
     4973                    magLayer.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Layers'][ilay]['Mag SLD'],0,
     4974                        nDig=(10,4),typeHint=float,OnLeave=Recalculate),0,WACV)
    49164975                    varBox = wx.CheckBox(G2frame.dataDisplay,label='Refine?')
    4917                     Indx[varBox.GetId()] = [ilay+1,parm]
    4918                     varBox.SetValue(data['Layers'][ilay+1][parm][1])
     4976                    Indx[varBox.GetId()] = [ilay,'Mag SLD']
     4977                    varBox.SetValue(data['Layers'][ilay]['Mag SLD'][1])
    49194978                    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)       
     4979                    magLayer.Add(varBox,0,WACV)
     4980                    magLayer.Add(wx.StaticText(G2frame.dataDisplay,
     4981                        label=' Real+mag scat. den.: %.4g'%(realScatt+data['Layers'][ilay]['Mag SLD'][0])),0,WACV)
     4982                    layerSizer.Add(magLayer)
     4983                if ilay:
     4984                    names = {'Rough':'Upper surface Roughness, '+Angstr,'Thick':'Layer Thickness, '+Angstr}
     4985                    parmsline = wx.BoxSizer(wx.HORIZONTAL)
     4986                    parms= ['Rough','Thick']
     4987                    if ilay == len(data['Layers'])-1:
     4988                        parms = ['Rough',]
     4989                    for parm in parms:
     4990                        parmsline.Add(wx.StaticText(G2frame.dataDisplay,label=' %s: '%(names[parm])),0,WACV)
     4991                        parmsline.Add(G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['Layers'][ilay][parm],0,
     4992                            nDig=(10,2),typeHint=float,OnLeave=Recalculate),0,WACV)
     4993                        varBox = wx.CheckBox(G2frame.dataDisplay,label='Refine?')
     4994                        Indx[varBox.GetId()] = [ilay,parm]
     4995                        varBox.SetValue(data['Layers'][ilay][parm][1])
     4996                        varBox.Bind(wx.EVT_CHECKBOX, OnCheckBox)
     4997                        parmsline.Add(varBox,0,WACV)
     4998                    layerSizer.Add(parmsline)
     4999            if ilay < len(data['Layers'])-1:
     5000                newlayer = wx.BoxSizer(wx.HORIZONTAL)
     5001                insert = wx.Button(G2frame.dataDisplay,label='Insert')
     5002                Indx[insert.GetId()] = ilay
     5003                insert.Bind(wx.EVT_BUTTON,OnInsertLayer)
     5004                newlayer.Add(insert)
     5005                delet = wx.Button(G2frame.dataDisplay,label='Delete')
     5006                Indx[delet.GetId()] = ilay
     5007                delet.Bind(wx.EVT_BUTTON,OnDeleteLayer)
     5008                newlayer.Add(delet)
     5009                layerSizer.Add(newlayer)
     5010                G2G.HorizontalLine(layerSizer,G2frame.dataDisplay)   
     5011       
    49725012        return layerSizer
    49735013   
     
    49755015    ProfDict,Profile,Name = G2frame.PatternTree.GetItemPyData(G2frame.PatternId)[:3]
    49765016    Limits = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Limits'))
    4977     Inst = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Instrument Parameters'))
     5017    Inst = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Instrument Parameters'))[0]
    49785018    if G2frame.dataDisplay:
    49795019        G2frame.dataFrame.DestroyChildren()   # is this a ScrolledWindow? If so, bad!
     
    49845024    G2frame.dataDisplay = wxscroll.ScrolledPanel(G2frame.dataFrame)
    49855025    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyModel, id=G2gd.wxID_MODELCOPY)
    4986     G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyFlags, id=G2gd.wxID_MODELCOPYFLAGS)
     5026    G2frame.dataFrame.Bind(wx.EVT_MENU, OnModelPlot, id=G2gd.wxID_MODELPLOT)
    49875027    G2frame.dataFrame.Bind(wx.EVT_MENU, OnFitModel, id=G2gd.wxID_MODELFIT)
    49885028    G2frame.dataFrame.Bind(wx.EVT_MENU, OnFitModelAll, id=G2gd.wxID_MODELFITALL)
  • trunk/Substances.py

    r2761 r2763  
    88Each entry in ''Substances'' consists of::
    99
    10      'key':{'Elements':{element:{'Num':number in formula},...},'Density':value, 'Volume':,value}
     10     'key':{'Elements':{element:{'Num':float number in formula},...},'Density':value, 'Volume':,value}
    1111
    1212Density & Volume are optional, if one missing it is calculated from the other; if both
     
    1616"""
    1717Substances = {
    18 'Alumina':{'Elements':{'Al':{'Num':2},'O':{'Num':3}},'Density':3.986,},
    19 'Water':{'Elements':{'O':{'Num':1},'H':{'Num':2}},'Density':1.0},
    20 'Silicon':{'Elements':{'Si':{'Num':8}},'Volume':160.209},
    21 'a-Quartz':{'Elements':{'Si':{'Num':3},'O':{'Num':6}},'Volume':113.057},
    22 'Ethanol':{'Elements':{'C':{'Num':2},'O':{'Num':1},'H':{'Num':6}},},
    23 'Polyethylene':{'Elements':{'C':{'Num':1},'H':{'Num':2}},'Density':0.93,},
    24 'Polystyrene':{'Elements':{'C':{'Num':1},'H':{'Num':1}},'Density':1.060,},
    25 'Teflon':{'Elements':{'C':{'Num':1},'F':{'Num':2}},'Density':2.25,},
    26 'Mylar':{'Elements':{'C':{'Num':5},'H':{'Num':4},'O':{'Num':2}},'Density':1.38,},
    27 'Iron':{'Elements':{'Fe':{'Num':4}},'Density':7.87,},
    28 'FeO-wustite':{'Elements':{'Fe':{'Num':4},'O':{'Num':4}},'Volume':79.285},
    29 'Fe2O3-hematite':{'Elements':{'Fe':{'Num':12},'O':{'Num':18}},'Volume':301.689},
    30 'Fe3O4-magnetite':{'Elements':{'Fe':{'Num':24},'O':{'Num':32}},'Volume':591.921},
    31 'Zirconium':{'Elements':{'Zr':{'Num':2}},'Density':6.51,},
    32 'Carbon':{'Elements':{'C':{'Num':1}},'Density':2.27,},
    33 'Titanium':{'Elements':{'Ti':{'Num':1}},'Density':4.51,},
    34 'TiO2-rutile':{'Elements':{'Ti':{'Num':2},'O':{'Num':4}},'Volume':62.452},
    35 'Chromium':{'Elements':{'Cr':{'Num':1}},'Density':7.19,},
    36 'Nickel':{'Elements':{'Ni':{'Num':4}},'Density':8.90,},
    37 'Copper':{'Elements':{'Cu':{'Num':4}},'Density':8.96,},
    38 'Hydroxyapatite':{'Elements':{'Ca':{'Num':5},'P':{'Num':3},'O':{'Num':13},'H':{'Num':1}},'Density':3.986,},
    39 'Cr2O3':{'Elements':{'Cr':{'Num':2},'O':{'Num':3}},'Density':5.206,},
    40 'ZrO2':{'Elements':{'Zr':{'Num':1},'O':{'Num':3}},'Density':6.134,},
    41 'Y(0.16)Zr(0.84)O2':{'Elements':{'Y':{'Num':0.16},'Zr':{'Num':0.84},'O':{'Num':2}},'Density':6.01,},
     18'Alumina':{'Elements':{'Al':{'Num':2.},'O':{'Num':3.}},'Density':3.986,},
     19'Water':{'Elements':{'O':{'Num':1.},'H':{'Num':2.}},'Density':1.0},
     20'Silicon':{'Elements':{'Si':{'Num':8.}},'Volume':160.209},
     21'a-Quartz':{'Elements':{'Si':{'Num':3.},'O':{'Num':6.}},'Volume':113.057},
     22'Ethanol':{'Elements':{'C':{'Num':2.},'O':{'Num':1},'H':{'Num':6.}},},
     23'Polyethylene':{'Elements':{'C':{'Num':1.},'H':{'Num':2.}},'Density':0.93,},
     24'Polystyrene':{'Elements':{'C':{'Num':1.},'H':{'Num':1.}},'Density':1.060,},
     25'Teflon':{'Elements':{'C':{'Num':1.},'F':{'Num':2.}},'Density':2.25,},
     26'Mylar':{'Elements':{'C':{'Num':5.},'H':{'Num':4.},'O':{'Num':2.}},'Density':1.38,},
     27'Iron':{'Elements':{'Fe':{'Num':4.}},'Density':7.87,},
     28'FeO-wustite':{'Elements':{'Fe':{'Num':4.},'O':{'Num':4.}},'Volume':79.285},
     29'Fe2O3-hematite':{'Elements':{'Fe':{'Num':12.},'O':{'Num':18.}},'Volume':301.689},
     30'Fe3O4-magnetite':{'Elements':{'Fe':{'Num':24.},'O':{'Num':32.}},'Volume':591.921},
     31'Zirconium':{'Elements':{'Zr':{'Num':2.}},'Density':6.51,},
     32'Carbon':{'Elements':{'C':{'Num':1.}},'Density':2.27,},
     33'Titanium':{'Elements':{'Ti':{'Num':1.}},'Density':4.51,},
     34'TiO2-rutile':{'Elements':{'Ti':{'Num':2.},'O':{'Num':4.}},'Volume':62.452},
     35'Chromium':{'Elements':{'Cr':{'Num':1.}},'Density':7.19,},
     36'Nickel':{'Elements':{'Ni':{'Num':4.}},'Density':8.90,},
     37'Copper':{'Elements':{'Cu':{'Num':4.}},'Density':8.96,},
     38'Hydroxyapatite':{'Elements':{'Ca':{'Num':5.},'P':{'Num':3.},'O':{'Num':13.},'H':{'Num':1.}},'Density':3.986,},
     39'Cr2O3':{'Elements':{'Cr':{'Num':2.},'O':{'Num':3.}},'Density':5.206,},
     40'ZrO2':{'Elements':{'Zr':{'Num':1.},'O':{'Num':3,}},'Density':6.134,},
     41'Y(0.16)Zr(0.84)O2':{'Elements':{'Y':{'Num':0.16},'Zr':{'Num':0.84},'O':{'Num':2.}},'Density':6.01,},
    4242}
    4343# they should not be duplicated in the UserSubstances.py file:
Note: See TracChangeset for help on using the changeset viewer.