Index: sasmodels/data.py
===================================================================
--- sasmodels/data.py	(revision eafc9fa8b200a3b754e7dafb960c8891361eacef)
+++ sasmodels/data.py	(revision 5c962dff13d0a0a2f6d779be8df775f540958dbc)
@@ -351,6 +351,6 @@
     def wrapper(*args, **kw):
         """
-        Trap and print errors from function %s
-        """%fn.__name__
+        Trap and print errors from function.
+        """
         try:
             return fn(*args, **kw)
Index: sasmodels/list_pars.py
===================================================================
--- sasmodels/list_pars.py	(revision 823e6204f35d6c2bf32f27a3a3c137a369a973cf)
+++ sasmodels/list_pars.py	(revision 5c962dff13d0a0a2f6d779be8df775f540958dbc)
@@ -9,4 +9,6 @@
 addition to just the parameter name.
 """
+from __future__ import print_function
+
 import sys
 
@@ -16,4 +18,9 @@
 
 def find_pars():
+    """
+    Find all parameters in all models.
+
+    Returns the reference table *{parameter: [model, model, ...]}*
+    """
     partable = {}
     for name in sorted(MODELS):
@@ -27,4 +34,10 @@
 
 def list_pars(names_only=True):
+    """
+    Print all parameters in all models.
+
+    If *names_only* then only print the parameter name, not the models it
+    occurs in.
+    """
     partable = find_pars()
     if names_only:
@@ -35,4 +48,7 @@
 
 def main():
+    """
+    Program to list the parameters used across all models.
+    """
     if len(sys.argv) == 2 and sys.argv[1] == '-v':
         verbose = True
Index: sasmodels/model_test.py
===================================================================
--- sasmodels/model_test.py	(revision 823e6204f35d6c2bf32f27a3a3c137a369a973cf)
+++ sasmodels/model_test.py	(revision 5c962dff13d0a0a2f6d779be8df775f540958dbc)
@@ -43,4 +43,5 @@
 Precision defaults to 5 digits (relative).
 """
+from __future__ import print_function
 
 import sys
@@ -55,4 +56,13 @@
 
 def make_suite(loaders, models):
+    """
+    Construct the pyunit test suite.
+
+    *loaders* is the list of kernel drivers to use, which is one of
+    *["dll", "opencl"]*, *["dll"]* or *["opencl"]*.  For python models,
+    the python driver is always used.
+
+    *models* is the list of models to test, or *["all"]* to test all models.
+    """
 
     ModelTestCase = _hide_model_case_from_nosetests()
@@ -111,4 +121,11 @@
 def _hide_model_case_from_nosetests():
     class ModelTestCase(unittest.TestCase):
+        """
+        Test suit for a particular model with a particular kernel driver.
+
+        The test suite runs a simple smoke test to make sure the model
+        functions, then runs the list of tests at the bottom of the model
+        description file.
+        """
         def __init__(self, test_name, definition, test_method_name,
                      platform, dtype):
Index: sasmodels/weights.py
===================================================================
--- sasmodels/weights.py	(revision 823e6204f35d6c2bf32f27a3a3c137a369a973cf)
+++ sasmodels/weights.py	(revision 5c962dff13d0a0a2f6d779be8df775f540958dbc)
@@ -22,4 +22,7 @@
 
     def get_pars(self):
+        """
+        Return the parameters to the disperser as a dictionary.
+        """
         pars = {'type': self.type}
         pars.update(self.__dict__)
@@ -28,4 +31,7 @@
     # pylint: disable=no-self-use
     def set_weights(self, values, weights):
+        """
+        Set the weights on the disperser if it is :class:`ArrayDispersion`.
+        """
         raise RuntimeError("set_weights is only available for ArrayDispersion")
 
@@ -63,4 +69,11 @@
 
 class GaussianDispersion(Dispersion):
+    r"""
+    Gaussian dispersion, with 1-\ $\sigma$ width.
+
+    .. math::
+
+        w = \exp\left(-\tfrac12 (x - c)^2/\sigma^2\right)
+    """
     type = "gaussian"
     default = dict(npts=35, width=0, nsigmas=3)
@@ -72,4 +85,11 @@
 
 class RectangleDispersion(Dispersion):
+    r"""
+    Uniform dispersion, with width $\sqrt{3}\sigma$.
+
+    .. math::
+
+        w = 1
+    """
     type = "rectangle"
     default = dict(npts=35, width=0, nsigmas=1.70325)
@@ -81,13 +101,35 @@
 
 class LogNormalDispersion(Dispersion):
+    r"""
+    log Gaussian dispersion, with 1-\ $\sigma$ width.
+
+    .. math::
+
+        w = \frac{\exp\left(-\tfrac12 (\ln x - c)^2/\sigma^2\right)}{x\sigma}
+    """
     type = "lognormal"
     default = dict(npts=80, width=0, nsigmas=8)
     def _weights(self, center, sigma, lb, ub):
         x = self._linspace(center, sigma, max(lb, 1e-8), max(ub, 1e-8))
-        px = np.exp(-0.5*(np.log(x)-center)**2)/sigma**2/(x*sigma)
+        px = np.exp(-0.5*(np.log(x)-center)**2/sigma**2)/(x*sigma)
         return x, px
 
 
 class SchulzDispersion(Dispersion):
+    r"""
+    Schultz dispersion, with 1-\ $\sigma$ width.
+
+    .. math::
+
+        w = \frac{z^z\,R^{z-1}}{e^{Rz}\,c \Gamma(z)}
+
+    where $c$ is the center of the distribution, $R = x/c$ and $z=(c/\sigma)^2$.
+
+    This is evaluated using logarithms as
+
+    .. math::
+
+        w = \exp\left(z \ln z + (z-1)\ln R - Rz - \ln c - \ln \Gamma(z) \right)
+    """
     type = "schulz"
     default = dict(npts=80, width=0, nsigmas=8)
@@ -102,4 +144,9 @@
 
 class ArrayDispersion(Dispersion):
+    r"""
+    Empirical dispersion curve.
+
+    Use :meth:`set_weights` to set $w = f(x)$.
+    """
     type = "array"
     default = dict(npts=35, width=0, nsigmas=1)
@@ -110,4 +157,7 @@
 
     def set_weights(self, values, weights):
+        """
+        Set the weights for the given x values.
+        """
         self.values = np.ascontiguousarray(values, 'd')
         self.weights = np.ascontiguousarray(weights, 'd')
