Source code for sas.models.dispersion_models
################################################################################
#This software was developed by the University of Tennessee as part of the
#Distributed Data Analysis of Neutron Scattering Experiments (DANSE)
#project funded by the US National Science Foundation.
#
#If you use DANSE applications to do scientific research that leads to
#publication, we ask that you acknowledge the use of the software with the
#following sentence:
#
#"This work benefited from DANSE software developed under NSF award DMR-0520547."
#
#copyright 2008, University of Tennessee
################################################################################
"""
Class definitions for python dispersion model for
model parameters. These classes are bridges to the C++
dispersion object.
The ArrayDispersion class takes in numpy arrays only.
Usage:
These classes can be used to set the dispersion model of a SAS model
parameter:
cyl = CylinderModel()
cyl.set_dispersion('radius', GaussianDispersion())
After the dispersion model is set, you can access it's
parameter through the dispersion dictionary:
cyl.dispersion['radius']['width'] = 5.0
:TODO: For backward compatibility, the model parameters are still kept in
a dictionary. The next iteration of refactoring work should involve moving
away from value-based parameters to object-based parameter. We want to
store parameters as objects so that we can unify the 'params' and 'dispersion'
dictionaries into a single dictionary of parameter objects that hold the
complete information about the parameter (units, limits, dispersion model, etc...).
"""
import sas_extension.c_models as c_models
class DispersionModel:
[docs] """
Python bridge class for a basic dispersion model
class with a constant parameter value distribution
"""
def __init__(self):
self.cdisp = c_models.new_dispersion_model()
def set_weights(self, values, weights):
[docs] """
Set the weights of an array dispersion
"""
message = "set_weights is not available for DispersionModel.\n"
message += " Solution: Use an ArrayDispersion object"
raise "RuntimeError", message
class GaussianDispersion(DispersionModel):
[docs] """
Python bridge class for a dispersion model based
on a Gaussian distribution.
"""
def __init__(self):
self.cdisp = c_models.new_gaussian_model()
def set_weights(self, values, weights):
[docs] """
Set the weights of an array dispersion
"""
message = "set_weights is not available for GaussianDispersion.\n"
message += " Solution: Use an ArrayDispersion object"
raise "RuntimeError", message
class RectangleDispersion(DispersionModel):
[docs] """
Python bridge class for a dispersion model based
on a Gaussian distribution.
"""
def __init__(self):
self.cdisp = c_models.new_rectangle_model()
def set_weights(self, values, weights):
[docs] """
Set the weights of an array dispersion
"""
message = "set_weights is not available for GaussianDispersion.\n"
message += " Solution: Use an ArrayDispersion object"
raise "RuntimeError", message
class SchulzDispersion(DispersionModel):
[docs] """
Python bridge class for a dispersion model based
on a Schulz distribution.
"""
def __init__(self):
"""
"""
self.cdisp = c_models.new_schulz_model()
def set_weights(self, values, weights):
[docs] """
Set the weights of an array dispersion
"""
message = "set_weights is not available for SchulzDispersion.\n"
message += " Solution: Use an ArrayDispersion object"
raise "RuntimeError", message
class LogNormalDispersion(DispersionModel):
[docs] """
Python bridge class for a dispersion model based
on a Log Normal distribution.
"""
def __init__(self):
self.cdisp = c_models.new_lognormal_model()
def set_weights(self, values, weights):
[docs] """
Set the weights of an array dispersion
"""
message = "set_weights is not available for LogNormalDispersion.\n"
message += " Solution: Use an ArrayDispersion object"
raise "RuntimeError", message
class ArrayDispersion(DispersionModel):
[docs] """
Python bridge class for a dispersion model based on arrays.
The user has to set a weight distribution that
will be used in the averaging the model parameter
it is applied to.
"""
def __init__(self):
self.cdisp = c_models.new_array_model()
def set_weights(self, values, weights):
[docs] """
Set the weights of an array dispersion
Only accept numpy arrays.
:param values: numpy array of values
:param weights: numpy array of weights for each value entry
"""
if len(values) != len(weights):
raise ValueError, "ArrayDispersion.set_weights: \
given arrays are of different lengths"
c_models.set_dispersion_weights(self.cdisp, values, weights)
models = {"gaussian":GaussianDispersion, "rectangula":RectangleDispersion,
"array":ArrayDispersion, "schulz":SchulzDispersion,
"lognormal":LogNormalDispersion}