Source code for sas.models.TwoPowerLawModel

#!/usr/bin/env python
""" 
Provide I(q) = A*pow(qval,-1.0*m1) for q<=qc
    =scale*pow(qval,-1.0*m2) for q>qc
TwoPowerLaw function as a BaseComponent model
"""

from sas.models.BaseComponent import BaseComponent
from numpy import power
import math

[docs]class TwoPowerLawModel(BaseComponent): """ Class that evaluates a TwoPowerLawModel. I(q) = coef_A*pow(qval,-1.0*power1) for q<=qc =C*pow(qval,-1.0*power2) for q>qc where C=coef_A*pow(qc,-1.0*power1)/pow(qc,-1.0*power2). List of default parameters: * coef_A = coefficient * power1 = (-) Power @ low Q * power2 = (-) Power @ high Q * qc = crossover Q-value * background = incoherent background """ def __init__(self): """ Initialization """ # Initialize BaseComponent first, then sphere BaseComponent.__init__(self) ## Name of the model self.name = "TwoPowerLaw" self.description="""I(q) = coef_A*pow(qval,-1.0*power1) for q<=qc =C*pow(qval,-1.0*power2) for q>qc where C=coef_A*pow(qc,-1.0*power1)/pow(qc,-1.0*power2). List of default parameters: coef_A = coefficient power1 = (-) Power @ low Q power2 = (-) Power @ high Q qc = crossover Q-value background = incoherent background """ ## Define parameters self.params = {} self.params['coef_A'] = 1.0 self.params['power1'] = 1.0 self.params['power2'] = 4.0 self.params['qc'] = 0.04 self.params['background'] = 0.0 ## Parameter details [units, min, max] self.details = {} self.details['coef_A'] = ['', None, None] self.details['power1'] = ['', None, None] self.details['power2'] = ['', None, None] self.details['qc'] = ['1/A', None, None] self.details['background'] = ['[1/cm]', None, None] #list of parameter that cannot be fitted self.fixed= [] def _twopowerlaw(self, x): """ Model definition """ qc= self.params['qc'] if(x<=qc): inten = self.params['coef_A']*power(x,-1.0*self.params['power1']) else: scale = self.params['coef_A']*power(qc,-1.0*self.params['power1']) \ / power(qc,-1.0*self.params['power2']) inten = scale*power(x,-1.0*self.params['power2']) 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: (guinier value) """ if x.__class__.__name__ == 'list': return self._twopowerlaw(x[0]) elif x.__class__.__name__ == 'tuple': raise ValueError, "Tuples are not allowed as input to BaseComponent models" else: return self._twopowerlaw(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 = math.sqrt(x[0]**2 + x[1]**2) return self._twopowerlaw(q) elif x.__class__.__name__ == 'tuple': raise ValueError, "Tuples are not allowed as input to BaseComponent models" else: return self._twopowerlaw(x)