Source code for sas.models.GuinierPorodModel
"""
I(q) = scale/q^s* exp ( - R_g^2 q^2 / (3-s) ) for q<= ql
= scale/q^m*exp((-ql^2*Rg^2)/(3-s))*ql^(m-s) for q>=ql
Guinier function as a BaseComponent model
"""
from sas.models.BaseComponent import BaseComponent
from math import sqrt,exp
[docs]class GuinierPorodModel(BaseComponent):
"""
Class that evaluates a GuinierPorod model.
I(q) = scale/q^s* exp ( - R_g^2 q^2 / (3-s) ) for q<= ql
= scale/q^m*exp((-ql^2*Rg^2)/(3-s))*ql^(m-s) for q>=ql
"""
def __init__(self):
""" Initialization """
# Initialize BaseComponent first, then sphere
BaseComponent.__init__(self)
## Name of the model
self.name = "GuinierPorod"
self.description = """
I(q) = scale/q^s* exp ( - R_g^2 q^2 / (3-s) ) for q<= ql
= scale/q^m*exp((-ql^2*Rg^2)/(3-s))*ql^(m-s) for q>=ql
where ql = sqrt((m-s)(3-s)/2)/Rg.
List of parameters:
scale = Guinier Scale
s = Dimension Variable
Rg = Radius of Gyration [A]
m = Porod Exponent
background = Background [1/cm]"""
## Define parameters
self.params = {}
self.params['scale'] = 1.0
self.params['dim'] = 1.0
self.params['rg'] = 100.0
self.params['m'] = 3.0
self.params['background'] = 0.1
## Parameter details [units, min, max]
self.details = {}
self.details['scale'] = ['', None, None]
self.details['dim'] = ['', None, None]
self.details['rg'] = ['[A]', None, None]
self.details['m'] = ['', None, None]
self.details['background'] = ['[1/cm]', None, None]
#list of parameter that cannot be fitted
self.fixed = []
def _guinier_porod(self, x):
"""
Guinier-Porod Model
"""
# parameters
G = self.params['scale']
s = self.params['dim']
Rg = self.params['rg']
m = self.params['m']
bgd = self.params['background']
n = 3.0 - s
qval = x
# take care of the singular points
if Rg <= 0.0:
return bgd
if (n-3.0+m) <= 0.0:
return bgd
#do the calculation and return the function value
q1 = sqrt((n-3.0+m)*n/2.0)/Rg
if qval < q1:
F = (G/pow(qval,(3.0-n)))*exp((-qval*qval*Rg*Rg)/n)
else:
F = (G/pow(qval, m))*exp(-(n-3.0+m)/2.0)*pow(((n-3.0+m)*n/2.0),
((n-3.0+m)/2.0))/pow(Rg,(n-3.0+m))
inten = F + bgd
return inten
[docs] def run(self, x = 0.0):
""" Evaluate the model
@param x: input q-value (float or [float, float] as [r, theta])
@return: (guinier value)
"""
if x.__class__.__name__ == 'list':
return self._guinier_porod(x[0])
elif x.__class__.__name__ == 'tuple':
raise ValueError, "Tuples are not allowed as input to models"
else:
return self._guinier_porod(x)
[docs] def runXY(self, x = 0.0):
""" Evaluate the model
@param x: input q-value (float or [float, float] as [qx, qy])
@return: guinier value
"""
if x.__class__.__name__ == 'list':
q = sqrt(x[0]**2 + x[1]**2)
return self._guinier_porod(q)
elif x.__class__.__name__ == 'tuple':
raise ValueError, "Tuples are not allowed as input to models"
else:
return self._guinier_porod(x)