Changeset 1309 for trunk/GSASIIpwdGUI.py


Ignore:
Timestamp:
Apr 30, 2014 2:05:57 PM (9 years ago)
Author:
vondreele
Message:

Implement structure factors for non-dilute small angle systems

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIpwdGUI.py

    r1300 r1309  
    26852685            data['Particle']['Levels'].append({
    26862686                'Controls':{'FormFact':'Sphere','DistType':'LogNormal','Material':material,
    2687                     'FFargs':{},'NumPoints':50,'Cutoff':0.01,
     2687                    'FFargs':{},'SFargs':{},'NumPoints':50,'Cutoff':0.01,
    26882688                    'SlitSmear':[0.0,False],'StrFact':'Dilute'},    #last 2 not used - future?
    26892689                'LogNormal':{'Volume':[0.05,False],'Mean':[1000.,False],'StdDev':[0.5,False],'MinSize':[10.,False],},
     
    29992999            'Unified tube':{'Length':[100.,False],'Thickness':[10.,False]},}
    30003000               
     3001        StructureFactors = {'Dilute':{},'Hard sphere':{'VolFr':[0.1,False],'Dist':[100.,False]},
     3002            'Sticky hard sphere':{'VolFr':[0.1,False],'Dist':[100.,False],'epis':[0.05,False],'Sticky':[0.2,False]},
     3003            'Square well':{'VolFr':[0.1,False],'Dist':[100.,False],'Depth':[0.1,False],'Width':[1.,False]},
     3004            'InterPrecipitate':{'VolFr':[0.1,False],'Dist':[100.,False]},}
     3005               
    30013006        ffDistChoices =  ['Sphere','Spheroid','Cylinder','Cylinder diam',
    30023007            'Cylinder AR','Unified sphere','Unified rod','Unified rod AR',
    30033008            'Unified disk','Unified tube',]
    30043009               
    3005         ffMonoChoices = ['Sphere','Spheroid','Cylinder','Cylinder AR',
    3006             ]
     3010        ffMonoChoices = ['Sphere','Spheroid','Cylinder','Cylinder AR',]
     3011       
     3012        sfChoices = ['Dilute','Hard sphere','Sticky hard sphere','Square well','InterPrecipitate',]
     3013           
     3014        slMult = 1000.
    30073015                 
    30083016        def OnValue(event):
    30093017            Obj = event.GetEventObject()
    3010             item,key,id,sldrObj = Indx[Obj.GetId()]
     3018            item,key,sldrObj = Indx[Obj.GetId()]
    30113019            try:
    30123020                value = float(Obj.GetValue())
     
    30143022                    raise ValueError
    30153023            except ValueError:
    3016                 value = item[key][id]
    3017             item[key][id] = value
     3024                value = item[key][0]
     3025            item[key][0] = value
    30183026            Obj.SetValue('%.3g'%(value))
    3019             if key == 'P':
    3020                 sldrObj.SetValue(1000.*value)
     3027            if key in ['P','epis','Sticky','Depth','Width','VolFr','Dist']:
     3028                sldrObj.SetValue(slMult*value)
    30213029            else:
    3022                 sldrObj.SetRange(1000.*(np.log10(value)-2),1000.*(np.log10(value)+2))
    3023                 sldrObj.SetValue(1000.*np.log10(value))
     3030                logv = np.log10(value)
     3031                valMinMax = [logv-1,logv+1]
     3032                sldrObj.SetRange(slMult*valMinMax[0],slMult*valMinMax[1])
     3033                sldrObj.SetValue(slMult*logv)
    30243034            G2sasd.ModelFxn(Profile,ProfDict,Limits,Substances,Sample,data)
    30253035            RefreshPlots()
     
    30323042                if 'FormFact' in key :
    30333043                    item['FFargs'] = FormFactors[Obj.GetValue()]
     3044                elif 'StrFact' in key:
     3045                    item['SFargs'] = StructureFactors[Obj.GetValue()]
    30343046                wx.CallAfter(UpdateModelsGrid,G2frame,data)
    30353047                G2sasd.ModelFxn(Profile,ProfDict,Limits,Substances,Sample,data)
     
    30463058        def OnParmSlider(event):
    30473059            Obj = event.GetEventObject()
    3048             item,key,id,pvObj = Indx[Obj.GetId()]
     3060            item,key,pvObj = Indx[Obj.GetId()]
    30493061            slide = Obj.GetValue()
    3050             if key == 'P':
    3051                 value = float(slide/1000.)
     3062            if key in ['P','epis','Sticky','Depth','Width','VolFr','Dist']:
     3063                value = float(slide/slMult)
    30523064            else:
    3053                 value = 10.**float(slide/1000.)
    3054             item[key][id] = value
    3055             pvObj.SetValue('%.3g'%(item[key][id]))
     3065                value = 10.**float(slide/slMult)
     3066            item[key][0] = value
     3067            pvObj.SetValue('%.3g'%(item[key][0]))
    30563068            G2sasd.ModelFxn(Profile,ProfDict,Limits,Substances,Sample,data)
    30573069            RefreshPlots()
    3058            
    3059         def OnCenterSlider(event):
    3060             Obj = event.GetEventObject()
    3061             Obj.SetValue(False)
    3062             sldrObj,value = Indx[Obj.GetId()]
    3063             sldrObj.SetRange(1000*(value-1),1000*(value+1))
    3064             sldrObj.SetValue(1000*value)
    30653070           
    30663071        def SizeSizer():
     
    30723077            Indx[distChoice.GetId()] = [level['Controls'],'DistType']
    30733078            distChoice.Bind(wx.EVT_COMBOBOX,OnSelect)
    3074             sizeSizer.Add(distChoice,0,WACV)
     3079            sizeSizer.Add(distChoice,0,WACV)    #put structure factor choices here
    30753080            if level['Controls']['DistType'] not in ['Bragg','Unified','Porod',]:
    30763081                sizeSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Form Factor: '),0,WACV)
    3077                 if 'Mono' not in level['Controls']['DistType']:
    3078                     ffChoice = wx.ComboBox(G2frame.dataDisplay,value=level['Controls']['FormFact'],choices=ffDistChoices,
     3082                if 'Mono' in level['Controls']['DistType']:
     3083                    ffChoice = wx.ComboBox(G2frame.dataDisplay,value=level['Controls']['FormFact'],choices=ffMonoChoices,
    30793084                        style=wx.CB_READONLY|wx.CB_DROPDOWN)
    30803085                else:
    3081                     ffChoice = wx.ComboBox(G2frame.dataDisplay,value=level['Controls']['FormFact'],choices=ffMonoChoices,
     3086                    ffChoice = wx.ComboBox(G2frame.dataDisplay,value=level['Controls']['FormFact'],choices=ffDistChoices,
    30823087                        style=wx.CB_READONLY|wx.CB_DROPDOWN)
    30833088                Indx[ffChoice.GetId()] = [level['Controls'],'FormFact']
    30843089                ffChoice.Bind(wx.EVT_COMBOBOX,OnSelect)
    30853090                sizeSizer.Add(ffChoice,0,WACV)
     3091               
    30863092                sizeSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Material: '),0,WACV)
    30873093                matSel = wx.ComboBox(G2frame.dataDisplay,value=level['Controls']['Material'],
     
    30943100                sizeSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Resonant X-ray contrast: '),0,WACV)
    30953101                sizeSizer.Add(wx.StaticText(G2frame.dataDisplay,label='  %.2f 10%scm%s'%(contrast,Pwr20,Pwrm4)),0,WACV)
    3096                 sizeSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Num. radii: '),0,WACV)
    3097                 radii = ['25','50','75','100','200']
    3098                 nRadii = wx.ComboBox(G2frame.dataDisplay,value=str(level['Controls']['NumPoints']),choices=radii,
    3099                     style=wx.CB_READONLY|wx.CB_DROPDOWN)
    3100                 Indx[nRadii.GetId()] = [level['Controls'],'NumPoints']
    3101                 nRadii.Bind(wx.EVT_COMBOBOX,OnSelect)
    3102                 sizeSizer.Add(nRadii,0,WACV)
    3103                 sizeSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' R dist. cutoff: '),0,WACV)
    3104                 rCutoff = G2gd.ValidatedTxtCtrl(G2frame.dataDisplay,level['Controls'],'Cutoff',
    3105                     min=0.001,max=0.1,typeHint=float)
    3106                 sizeSizer.Add(rCutoff,0,WACV)
     3102                if 'Mono' not in level['Controls']['DistType']:
     3103                    sizeSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Num. radii: '),0,WACV)
     3104                    radii = ['25','50','75','100','200']
     3105                    nRadii = wx.ComboBox(G2frame.dataDisplay,value=str(level['Controls']['NumPoints']),choices=radii,
     3106                        style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3107                    Indx[nRadii.GetId()] = [level['Controls'],'NumPoints']
     3108                    nRadii.Bind(wx.EVT_COMBOBOX,OnSelect)
     3109                    sizeSizer.Add(nRadii,0,WACV)
     3110                    sizeSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' R dist. cutoff: '),0,WACV)
     3111                    rCutoff = G2gd.ValidatedTxtCtrl(G2frame.dataDisplay,level['Controls'],'Cutoff',
     3112                        min=0.001,max=0.1,typeHint=float)
     3113                    sizeSizer.Add(rCutoff,0,WACV)
    31073114            elif level['Controls']['DistType']  in ['Unified',]:
    31083115                Parms = level['Unified']
     
    31103117                sizeSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Estimated Dist B: %12.4g'%(Best)),0,WACV)
    31113118            return sizeSizer
     3119           
     3120        def ParmSizer():
     3121            parmSizer = wx.FlexGridSizer(1,3,5,5)
     3122            parmSizer.AddGrowableCol(2,1)
     3123            parmSizer.SetFlexibleDirection(wx.HORIZONTAL)
     3124            Parms = level[level['Controls']['DistType']]
     3125            FFargs = level['Controls']['FFargs']
     3126            SFargs = level['Controls'].get('SFargs',{})
     3127            parmOrder = ['Volume','Radius','Mean','StdDev','MinSize','G','Rg','B','P','Cutoff',
     3128                'PkInt','PkPos','PkSig','PkGam',]
     3129            for parm in parmOrder:
     3130                if parm in Parms:
     3131                    if parm == 'MinSize':
     3132                        parmSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Dist '+parm),0,wx.ALIGN_CENTER)
     3133                    else:
     3134                        parmVar = wx.CheckBox(G2frame.dataDisplay,label='Refine? Dist '+parm)
     3135                        parmVar.SetValue(Parms[parm][1])
     3136                        parmVar.Bind(wx.EVT_CHECKBOX, OnSelect)
     3137                        parmSizer.Add(parmVar,0,WACV)
     3138                        Indx[parmVar.GetId()] = [Parms[parm],1]
     3139                    parmValue = wx.TextCtrl(G2frame.dataDisplay,value='%.3g'%(Parms[parm][0]),
     3140                        style=wx.TE_PROCESS_ENTER)
     3141                    parmValue.Bind(wx.EVT_TEXT_ENTER,OnValue)       
     3142                    parmValue.Bind(wx.EVT_KILL_FOCUS,OnValue)
     3143                    parmSizer.Add(parmValue,0,WACV)
     3144                    if parm == 'P':
     3145                        value = Parms[parm][0]
     3146                        valMinMax = [0.1,4.2]
     3147                    else:
     3148                        value = np.log10(Parms[parm][0])
     3149                        valMinMax = [value-1,value+1]
     3150                    parmSldr = wx.Slider(G2frame.dataDisplay,minValue=slMult*valMinMax[0],
     3151                        maxValue=slMult*valMinMax[1],value=slMult*value)
     3152                    Indx[parmValue.GetId()] = [Parms,parm,parmSldr]
     3153                    Indx[parmSldr.GetId()] = [Parms,parm,parmValue]
     3154                    parmSldr.Bind(wx.EVT_SLIDER,OnParmSlider)
     3155                    parmSizer.Add(parmSldr,1,wx.EXPAND)
     3156            if level['Controls']['DistType'] not in ['Bragg']:
     3157                parmOrder = ['Aspect ratio','Length','Diameter','Thickness','VolFr','Dist','epis','Sticky','Depth','Width']
     3158                fTypes = ['FF ','SF ']
     3159                for iarg,Args in enumerate([FFargs,SFargs]):
     3160                    for parm in parmOrder:
     3161                        if parm in Args:
     3162                            parmVar = wx.CheckBox(G2frame.dataDisplay,label='Refine? '+fTypes[iarg]+parm)
     3163                            parmVar.SetValue(Args[parm][1])
     3164                            Indx[parmVar.GetId()] = [Args[parm],1]
     3165                            parmVar.Bind(wx.EVT_CHECKBOX, OnSelect)
     3166                            parmSizer.Add(parmVar,0,WACV)
     3167                            parmValue = wx.TextCtrl(G2frame.dataDisplay,value='%.3g'%(Args[parm][0]),
     3168                                style=wx.TE_PROCESS_ENTER)
     3169                            parmValue.Bind(wx.EVT_TEXT_ENTER,OnValue)       
     3170                            parmValue.Bind(wx.EVT_KILL_FOCUS,OnValue)
     3171                            parmSizer.Add(parmValue,0,WACV)
     3172                            value = Args[parm][0]
     3173                            if parm == 'epis':
     3174                                valMinMax = [0,.1]
     3175                            elif parm in ['Sticky','Width',]:
     3176                                valMinMax = [0,1.]
     3177                            elif parm == 'Depth':
     3178                                valMinMax = [-2.,2.]
     3179                            elif parm == 'Dist':
     3180                                valMinMax = [100.,1000.]
     3181                            elif parm == 'VolFr':
     3182                                valMinMax = [1.e-4,1.]
     3183                            else:
     3184                                value = np.log10(Args[parm][0])
     3185                                valMinMax = [value-1,value+1]
     3186                            parmSldr = wx.Slider(G2frame.dataDisplay,minValue=slMult*valMinMax[0],
     3187                                maxValue=slMult*valMinMax[1],value=slMult*value)
     3188                            Indx[parmVar.GetId()] = [Args[parm],1]
     3189                            Indx[parmValue.GetId()] = [Args,parm,parmSldr]
     3190                            Indx[parmSldr.GetId()] = [Args,parm,parmValue]
     3191                            parmSldr.Bind(wx.EVT_SLIDER,OnParmSlider)
     3192                            parmSizer.Add(parmSldr,1,wx.EXPAND)
     3193            return parmSizer               
    31123194           
    31133195        Indx = {}
     
    31423224            partSizer.Add(topLevel,0)
    31433225            partSizer.Add(SizeSizer())
    3144            
    3145             lvlSizer = wx.BoxSizer(wx.HORIZONTAL)
    3146             parmSizer = wx.FlexGridSizer(1,4,5,5)
    3147             parmSizer.AddGrowableCol(2,1)
    3148             parmSizer.SetFlexibleDirection(wx.HORIZONTAL)
    3149             Parms = level[level['Controls']['DistType']]
    3150             FFargs = level['Controls']['FFargs']
    3151             parmOrder = ['Volume','Radius','Mean','StdDev','MinSize','G','Rg','B','P','Cutoff',
    3152                 'PkInt','PkPos','PkSig','PkGam',]
    3153             for parm in parmOrder:
    3154                 if parm in Parms:
    3155                     if parm == 'MinSize':
    3156                         parmSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Dist '+parm),0,wx.ALIGN_CENTER)
    3157                     else:
    3158                         parmVar = wx.CheckBox(G2frame.dataDisplay,label='Refine? Dist '+parm)
    3159                         parmVar.SetValue(Parms[parm][1])
    3160                         parmVar.Bind(wx.EVT_CHECKBOX, OnSelect)
    3161                         parmSizer.Add(parmVar,0,WACV)
    3162                         Indx[parmVar.GetId()] = [Parms[parm],1]
    3163                     parmValue = wx.TextCtrl(G2frame.dataDisplay,value='%.3g'%(Parms[parm][0]),
    3164                         style=wx.TE_PROCESS_ENTER)
    3165                     parmValue.Bind(wx.EVT_TEXT_ENTER,OnValue)       
    3166                     parmValue.Bind(wx.EVT_KILL_FOCUS,OnValue)
    3167                     parmSizer.Add(parmValue,0,WACV)
    3168                     if parm == 'P':
    3169                         value = Parms[parm][0]
    3170                         valMinMax = [0.1,4.2]
    3171                     else:
    3172                         value = np.log10(Parms[parm][0])
    3173                         valMinMax = [value-1,value+1]
    3174                     parmSldr = wx.Slider(G2frame.dataDisplay,minValue=1000.*valMinMax[0],
    3175                         maxValue=1000.*valMinMax[1],value=1000.*value)
    3176                     Indx[parmValue.GetId()] = [Parms,parm,0,parmSldr]
    3177                     Indx[parmSldr.GetId()] = [Parms,parm,0,parmValue]
    3178                     parmSldr.Bind(wx.EVT_SLIDER,OnParmSlider)
    3179                     parmSizer.Add(parmSldr,1,wx.EXPAND)
    3180                     if parm == 'P':
    3181                         parmSizer.Add((5,5),)
    3182                     else:
    3183                         center = wx.CheckBox(G2frame.dataDisplay,label='Center? ')
    3184                         Indx[center.GetId()] = [parmSldr,value]
    3185                         center.Bind(wx.EVT_CHECKBOX,OnCenterSlider)
    3186                         parmSizer.Add(center,0,WACV)
    3187             if level['Controls']['DistType'] not in ['Bragg']:
    3188                 for parm in list(FFargs):
    3189                     parmVar = wx.CheckBox(G2frame.dataDisplay,label='Refine? FF '+parm)
    3190                     parmVar.SetValue(FFargs[parm][1])
    3191                     Indx[parmVar.GetId()] = [FFargs[parm],1]
    3192                     parmVar.Bind(wx.EVT_CHECKBOX, OnSelect)
    3193                     parmSizer.Add(parmVar,0,WACV)
    3194                     parmValue = wx.TextCtrl(G2frame.dataDisplay,value='%.3g'%(FFargs[parm][0]),
    3195                         style=wx.TE_PROCESS_ENTER)
    3196                     parmValue.Bind(wx.EVT_TEXT_ENTER,OnValue)       
    3197                     parmValue.Bind(wx.EVT_KILL_FOCUS,OnValue)
    3198                     parmSizer.Add(parmValue,0,WACV)
    3199                     value = np.log10(FFargs[parm][0])
    3200                     valMinMax = [value-1,value+1]
    3201                     parmSldr = wx.Slider(G2frame.dataDisplay,minValue=1000.*valMinMax[0],
    3202                         maxValue=1000.*valMinMax[1],value=1000.*value)
    3203                     Indx[parmVar.GetId()] = [FFargs[parm],1]
    3204                     Indx[parmValue.GetId()] = [FFargs[parm],0,parmSldr]
    3205                     Indx[parmSldr.GetId()] = [FFargs,parm,0,parmValue]
    3206                     parmSldr.Bind(wx.EVT_SLIDER,OnParmSlider)
    3207                     parmSizer.Add(parmSldr,1,wx.EXPAND)
    3208                     center = wx.CheckBox(G2frame.dataDisplay,label='Center? ')
    3209                     Indx[center.GetId()] = [parmSldr,value]
    3210                     center.Bind(wx.EVT_CHECKBOX,OnCenterSlider)
    3211                     parmSizer.Add(center,0,WACV)
    3212             lvlSizer.Add(parmSizer,1,wx.EXPAND)
    3213             partSizer.Add(lvlSizer,1,wx.EXPAND)
     3226            if level['Controls']['DistType'] not in ['Bragg','Unified','Porod',]:
     3227                topLevel.Add(wx.StaticText(G2frame.dataDisplay,label=' Structure factor: '),0,WACV)
     3228                strfctr = wx.ComboBox(G2frame.dataDisplay,value=level['Controls']['StrFact'],
     3229                    choices=sfChoices,style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3230                Indx[strfctr.GetId()] = [level['Controls'],'StrFact']
     3231                strfctr.Bind(wx.EVT_COMBOBOX,OnSelect)
     3232                topLevel.Add(strfctr,0,WACV)
     3233            partSizer.Add(ParmSizer(),1,wx.EXPAND)
    32143234        return partSizer
    32153235       
     
    33193339    G2frame.dataDisplay.SetSize(Size)
    33203340    G2frame.dataFrame.setSizePosLeft(Size)   
    3321        
    33223341   
    33233342################################################################################
Note: See TracChangeset for help on using the changeset viewer.