Source code for sas.models.TwoLorentzianModel
#!/usr/bin/env python
"""
TwoLorentzianModel function as a BaseComponent model
"""
from sas.models.BaseComponent import BaseComponent
from numpy import power
import math
[docs]class TwoLorentzianModel(BaseComponent):
"""
Class that evaluates a TwoLorentzianModel.
I(q) = II(q) = scale_1/(1.0 + pow((q*length_1),exponent_1))
+ scale_2/(1.0 + pow((q*length_2),exponent_2) )+ background
"""
def __init__(self):
""" Initialization """
# Initialize BaseComponent first, then sphere
BaseComponent.__init__(self)
## Name of the model
self.name = "TwoLorentzian"
self.description = """I(q) = scale_1/(1.0 + pow((q*length_1),exponent_1))
+ scale_2/(1.0 + pow((q*length_2),exponent_2) )+ background
List of default parameters:
scale_1 = Lorentzian term scaling #1
length_1 = Lorentzian screening length #1 [A]
exponent_1 = Lorentzian exponent #1
scale_2 = Lorentzian term scaling #2
length_2 = Lorentzian screening length #2 [A]
exponent_2 = Lorentzian exponent #2
background = Incoherent background
"""
## Define parameters
self.params = {}
self.params['scale_1'] = 10.0
self.params['length_1'] = 100.0
self.params['exponent_1'] = 3.0
self.params['scale_2'] = 1.0
self.params['length_2'] = 10.0
self.params['exponent_2'] = 2.0
self.params['background'] = 0.1
## Parameter details [units, min, max]
self.details = {}
self.details['scale_1'] = ['', None, None]
self.details['length_1'] = ['A', None, None]
self.details['exponent_1'] = ['', None, None]
self.details['scale_2'] = ['', None, None]
self.details['length_2'] = ['A', None, None]
self.details['exponent_2'] = ['', None, None]
self.details['background'] = ['[1/cm]', None, None]
#list of parameter that cannot be fitted
self.fixed = []
def _twolorentzian(self, x):
"""
Model definition
"""
inten = self.params['scale_1']/(1.0 + \
power((x*self.params['length_1']),self.params['exponent_1']))
inten += self.params['scale_2']/(1.0 + \
power((x*self.params['length_2']),self.params['exponent_2']))
inten += self.params['background']
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: (scattering value)
"""
if x.__class__.__name__ == 'list':
return self._twolorentzian(x[0])
elif x.__class__.__name__ == 'tuple':
raise ValueError, "Tuples are not allowed as input to BaseComponent models"
else:
return self._twolorentzian(x)
[docs] def runXY(self, x = 0.0):
"""
Evaluate the model
param x: input q-value (float or [float, float] as [qx, qy])
return: scattering value
"""
if x.__class__.__name__ == 'list':
q = math.sqrt(x[0]**2 + x[1]**2)
return self._twolorentzian(q)
elif x.__class__.__name__ == 'tuple':
raise ValueError, "Tuples are not allowed as input to BaseComponent models"
else:
return self._twolorentzian(x)