Changeset 2755 for trunk/GSASIIpwdGUI.py


Ignore:
Timestamp:
Mar 20, 2017 9:53:00 AM (6 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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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()   
Note: See TracChangeset for help on using the changeset viewer.