Index: sansmodels/src/sans/models/OblateModel.py
===================================================================
--- sansmodels/src/sans/models/OblateModel.py	(revision 975ec8e8211549489759b5a5ffe3b60607de065b)
+++ 	(revision )
@@ -1,130 +1,0 @@
-#!/usr/bin/env python
-"""
-	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
-"""
-
-""" Provide functionality for a C extension model
-
-	WARNING: THIS FILE WAS GENERATED BY WRAPPERGENERATOR.PY
- 	         DO NOT MODIFY THIS FILE, MODIFY ..\c_extensions\oblate.h
- 	         AND RE-RUN THE GENERATOR SCRIPT
-
-"""
-
-from sans.models.BaseComponent import BaseComponent
-from sans_extension.c_models import COblateModel
-import copy    
-    
-class OblateModel(COblateModel, BaseComponent):
-    """ Class that evaluates a OblateModel model. 
-    	This file was auto-generated from ..\c_extensions\oblate.h.
-    	Refer to that file and the structure it contains
-    	for details of the model.
-    	List of default parameters:
-         scale           = 1.0 
-         major_core      = 200.0 [A]
-         minor_core      = 20.0 [A]
-         major_shell     = 250.0 [A]
-         minor_shell     = 30.0 [A]
-         contrast        = 1e-006 [1/A²]
-         sld_solvent     = 6.3e-006 [1/A²]
-         background      = 0.001 [1/cm]
-         axis_theta      = 1.0 [rad]
-         axis_phi        = 1.0 [rad]
-
-    """
-        
-    def __init__(self):
-        """ Initialization """
-        
-        # Initialize BaseComponent first, then sphere
-        BaseComponent.__init__(self)
-        COblateModel.__init__(self)
-        
-        ## Name of the model
-        self.name = "OblateModel"
-        ## Model description
-        self.description ="""[OblateCoreShellModel] Calculates the form factor for an oblate
-		ellipsoid particle with a core_shell structure.
-		The form factor is averaged over all possible
-		orientations of the ellipsoid such that P(q)
-		= scale*<f^2>/Vol + bkg, where f is the
-		single particle scattering amplitude.
-		[Parameters]:
-		major_core = radius of major_core,
-		minor_core = radius of minor_core,
-		major_shell = radius of major_shell,
-		minor_shell = radius of minor_shell,
-		contrast = SLD_core - SLD_shell
-		sld_solvent = SLD_solvent
-		background = Incoherent bkg
-		scale =scale
-		Note:It is the users' responsibility to ensure
-		that shell radii are larger than core radii."""
-       
-		## Parameter details [units, min, max]
-        self.details = {}
-        self.details['scale'] = ['', None, None]
-        self.details['major_core'] = ['[A]', None, None]
-        self.details['minor_core'] = ['[A]', None, None]
-        self.details['major_shell'] = ['[A]', None, None]
-        self.details['minor_shell'] = ['[A]', None, None]
-        self.details['contrast'] = ['[1/A²]', None, None]
-        self.details['sld_solvent'] = ['[1/A²]', None, None]
-        self.details['background'] = ['[1/cm]', None, None]
-        self.details['axis_theta'] = ['[rad]', None, None]
-        self.details['axis_phi'] = ['[rad]', None, None]
-
-		## fittable parameters
-        self.fixed=['major_core.width', 'minor_core.width', 'major_shell.width', 'minor_shell.width']
-        
-        ## parameters with orientation
-        self.orientation_params =['axis_phi', 'axis_theta', 'axis_phi.width', 'axis_theta.width']
-   
-    def clone(self):
-        """ Return a identical copy of self """
-        return self._clone(OblateModel())   
-   
-    def run(self, x = 0.0):
-        """ Evaluate the model
-            @param x: input q, or [q,phi]
-            @return: scattering function P(q)
-        """
-        
-        return COblateModel.run(self, x)
-   
-    def runXY(self, x = 0.0):
-        """ Evaluate the model in cartesian coordinates
-            @param x: input q, or [qx, qy]
-            @return: scattering function P(q)
-        """
-        
-        return COblateModel.runXY(self, x)
-        
-    def evalDistribition(self, x = []):
-        """ Evaluate the model in cartesian coordinates
-            @param x: input q[], or [qx[], qy[]]
-            @return: scattering function P(q[])
-        """
-        return COblateModel.evalDistribition(self, x)
-        
-    def set_dispersion(self, parameter, dispersion):
-        """
-            Set the dispersion object for a model parameter
-            @param parameter: name of the parameter [string]
-            @dispersion: dispersion object of type DispersionModel
-        """
-        return COblateModel.set_dispersion(self, parameter, dispersion.cdisp)
-        
-   
-# End of file
Index: sansmodels/src/sans/models/ProlateModel.py
===================================================================
--- sansmodels/src/sans/models/ProlateModel.py	(revision 9bd69098b443a3cbda08a1efa070cd1e2ead30ce)
+++ 	(revision )
@@ -1,126 +1,0 @@
-#!/usr/bin/env python
-"""
-	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
-"""
-
-""" Provide functionality for a C extension model
-
-	WARNING: THIS FILE WAS GENERATED BY WRAPPERGENERATOR.PY
- 	         DO NOT MODIFY THIS FILE, MODIFY ..\c_extensions\prolate.h
- 	         AND RE-RUN THE GENERATOR SCRIPT
-
-"""
-
-from sans.models.BaseComponent import BaseComponent
-from sans_extension.c_models import CProlateModel
-import copy    
-    
-class ProlateModel(CProlateModel, BaseComponent):
-    """ Class that evaluates a ProlateModel model. 
-    	This file was auto-generated from ..\c_extensions\prolate.h.
-    	Refer to that file and the structure it contains
-    	for details of the model.
-    	List of default parameters:
-         scale           = 1.0 
-         major_core      = 100.0 [A]
-         minor_core      = 50.0 [A]
-         major_shell     = 110.0 [A]
-         minor_shell     = 60.0 [A]
-         contrast        = 1e-006 [1/A²]
-         sld_solvent     = 6.3e-006 [1/A²]
-         background      = 0.001 [1/cm]
-
-    """
-        
-    def __init__(self):
-        """ Initialization """
-        
-        # Initialize BaseComponent first, then sphere
-        BaseComponent.__init__(self)
-        CProlateModel.__init__(self)
-        
-        ## Name of the model
-        self.name = "ProlateModel"
-        ## Model description
-        self.description ="""[ProlateCoreShellModel] Calculates the form factor for a prolate
-		ellipsoid particle with a core_shell structure.
-		The form factor is averaged over all possible
-		orientations of the ellipsoid such that P(q)
-		= scale*<f^2>/Vol + bkg, where f is the
-		single particle scattering amplitude.
-		[Parameters]:
-		major_core = radius of major_core,
-		minor_core = radius of minor_core,
-		major_shell = radius of major_shell,
-		minor_shell = radius of minor_shell,
-		contrast = SLD_core - SLD_shell
-		sld_solvent = SLD_solvent
-		background = Incoherent bkg
-		scale = scale
-		Note:It is the users' responsibility to ensure
-		that shell radii are larger than core radii."""
-       
-		## Parameter details [units, min, max]
-        self.details = {}
-        self.details['scale'] = ['', None, None]
-        self.details['major_core'] = ['[A]', None, None]
-        self.details['minor_core'] = ['[A]', None, None]
-        self.details['major_shell'] = ['[A]', None, None]
-        self.details['minor_shell'] = ['[A]', None, None]
-        self.details['contrast'] = ['[1/A²]', None, None]
-        self.details['sld_solvent'] = ['[1/A²]', None, None]
-        self.details['background'] = ['[1/cm]', None, None]
-
-		## fittable parameters
-        self.fixed=['major_core.width', 'minor_core.width', 'major_shell.width', 'minor_shell.width']
-        
-        ## parameters with orientation
-        self.orientation_params =[]
-   
-    def clone(self):
-        """ Return a identical copy of self """
-        return self._clone(ProlateModel())   
-   
-    def run(self, x = 0.0):
-        """ Evaluate the model
-            @param x: input q, or [q,phi]
-            @return: scattering function P(q)
-        """
-        
-        return CProlateModel.run(self, x)
-   
-    def runXY(self, x = 0.0):
-        """ Evaluate the model in cartesian coordinates
-            @param x: input q, or [qx, qy]
-            @return: scattering function P(q)
-        """
-        
-        return CProlateModel.runXY(self, x)
-        
-    def evalDistribition(self, x = []):
-        """ Evaluate the model in cartesian coordinates
-            @param x: input q[], or [qx[], qy[]]
-            @return: scattering function P(q[])
-        """
-        return CProlateModel.evalDistribition(self, x)
-        
-    def set_dispersion(self, parameter, dispersion):
-        """
-            Set the dispersion object for a model parameter
-            @param parameter: name of the parameter [string]
-            @dispersion: dispersion object of type DispersionModel
-        """
-        return CProlateModel.set_dispersion(self, parameter, dispersion.cdisp)
-        
-   
-# End of file
Index: sansmodels/src/sans/models/c_extensions/COblateModel.c
===================================================================
--- sansmodels/src/sans/models/c_extensions/COblateModel.c	(revision e0a8a3ccbb7fa14ab3d063bb6214bb4828593f76)
+++ 	(revision )
@@ -1,311 +1,0 @@
-/** COblateModel
- *
- * C extension 
- *
- * WARNING: THIS FILE WAS GENERATED BY WRAPPERGENERATOR.PY
- *          DO NOT MODIFY THIS FILE, MODIFY oblate.h
- *          AND RE-RUN THE GENERATOR SCRIPT
- *
- * @author   M.Doucet / UTK
- */
- 
-#include <Python.h>
-#include "structmember.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <time.h>
-
-#include "oblate.h"
-
-/// Error object for raised exceptions
-static PyObject * COblateModelError = NULL;
-
-
-// Class definition
-typedef struct {
-    PyObject_HEAD
-    /// Parameters
-    PyObject * params;
-    /// Log for unit testing
-    PyObject * log;
-    /// Model parameters
-	OblateParameters model_pars;
-} COblateModel;
-
-
-static void
-COblateModel_dealloc(COblateModel* self)
-{
-    self->ob_type->tp_free((PyObject*)self);
-    
-
-}
-
-static PyObject *
-COblateModel_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
-    COblateModel *self;
-    
-    self = (COblateModel *)type->tp_alloc(type, 0);
-   
-    return (PyObject *)self;
-}
-
-static int
-COblateModel_init(COblateModel *self, PyObject *args, PyObject *kwds)
-{
-    if (self != NULL) {
-    	
-    	// Create parameters
-        self->params = PyDict_New();
-        
-        // Initialize parameter dictionary
-        PyDict_SetItemString(self->params,"major_core",Py_BuildValue("d",200.000000));
-        PyDict_SetItemString(self->params,"scale",Py_BuildValue("d",1.000000));
-        PyDict_SetItemString(self->params,"minor_core",Py_BuildValue("d",20.000000));
-        PyDict_SetItemString(self->params,"axis_theta",Py_BuildValue("d",1.000000));
-        PyDict_SetItemString(self->params,"sld_solvent",Py_BuildValue("d",0.000006));
-        PyDict_SetItemString(self->params,"axis_phi",Py_BuildValue("d",1.000000));
-        PyDict_SetItemString(self->params,"background",Py_BuildValue("d",0.001000));
-        PyDict_SetItemString(self->params,"major_shell",Py_BuildValue("d",250.000000));
-        PyDict_SetItemString(self->params,"contrast",Py_BuildValue("d",0.000001));
-        PyDict_SetItemString(self->params,"minor_shell",Py_BuildValue("d",30.000000));
-
-         
-        // Create empty log
-        self->log = PyDict_New();
-        
-        
-
-    }
-    return 0;
-}
-
-static PyMemberDef COblateModel_members[] = {
-    {"params", T_OBJECT, offsetof(COblateModel, params), 0,
-     "Parameters"},
-    {"log", T_OBJECT, offsetof(COblateModel, log), 0,
-     "Log"},
-    {NULL}  /* Sentinel */
-};
-
-/** Read double from PyObject
-    @param p PyObject
-    @return double
-*/
-double COblateModel_readDouble(PyObject *p) {
-    if (PyFloat_Check(p)==1) {
-        return (double)(((PyFloatObject *)(p))->ob_fval);
-    } else if (PyInt_Check(p)==1) {
-        return (double)(((PyIntObject *)(p))->ob_ival);
-    } else if (PyLong_Check(p)==1) {
-        return (double)PyLong_AsLong(p);
-    } else {
-        return 0.0;
-    }
-}
-
-
-/**
- * Function to call to evaluate model
- * @param args: input q or [q,phi]
- * @return: function value
- */
-static PyObject * run(COblateModel *self, PyObject *args) {
-	double q_value, phi_value;
-	PyObject* pars;
-	int npars;
-	
-	// Get parameters
-	
-	// Reader parameter dictionary
-    self->model_pars.major_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_core") );
-    self->model_pars.scale = PyFloat_AsDouble( PyDict_GetItemString(self->params, "scale") );
-    self->model_pars.minor_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_core") );
-    self->model_pars.axis_theta = PyFloat_AsDouble( PyDict_GetItemString(self->params, "axis_theta") );
-    self->model_pars.sld_solvent = PyFloat_AsDouble( PyDict_GetItemString(self->params, "sld_solvent") );
-    self->model_pars.axis_phi = PyFloat_AsDouble( PyDict_GetItemString(self->params, "axis_phi") );
-    self->model_pars.background = PyFloat_AsDouble( PyDict_GetItemString(self->params, "background") );
-    self->model_pars.major_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_shell") );
-    self->model_pars.contrast = PyFloat_AsDouble( PyDict_GetItemString(self->params, "contrast") );
-    self->model_pars.minor_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_shell") );
-
-	
-	// Get input and determine whether we have to supply a 1D or 2D return value.
-	if ( !PyArg_ParseTuple(args,"O",&pars) ) {
-	    PyErr_SetString(COblateModelError, 
-	    	"COblateModel.run expects a q value.");
-		return NULL;
-	}
-	  
-	// Check params
-	if( PyList_Check(pars)==1) {
-		
-		// Length of list should be 2 for I(q,phi)
-	    npars = PyList_GET_SIZE(pars); 
-	    if(npars!=2) {
-	    	PyErr_SetString(COblateModelError, 
-	    		"COblateModel.run expects a double or a list of dimension 2.");
-	    	return NULL;
-	    }
-	    // We have a vector q, get the q and phi values at which
-	    // to evaluate I(q,phi)
-	    q_value = COblateModel_readDouble(PyList_GET_ITEM(pars,0));
-	    phi_value = COblateModel_readDouble(PyList_GET_ITEM(pars,1));
-	    // Skip zero
-	    if (q_value==0) {
-	    	return Py_BuildValue("d",0.0);
-	    }
-		return Py_BuildValue("d",oblate_analytical_2D(&(self->model_pars),q_value,phi_value));
-
-	} else {
-
-		// We have a scalar q, we will evaluate I(q)
-		q_value = COblateModel_readDouble(pars);		
-		
-		return Py_BuildValue("d",oblate_analytical_1D(&(self->model_pars),q_value));
-	}	
-}
-
-/**
- * Function to call to evaluate model in cartesian coordinates
- * @param args: input q or [qx, qy]]
- * @return: function value
- */
-static PyObject * runXY(COblateModel *self, PyObject *args) {
-	double qx_value, qy_value;
-	PyObject* pars;
-	int npars;
-	
-	// Get parameters
-	
-	// Reader parameter dictionary
-    self->model_pars.major_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_core") );
-    self->model_pars.scale = PyFloat_AsDouble( PyDict_GetItemString(self->params, "scale") );
-    self->model_pars.minor_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_core") );
-    self->model_pars.axis_theta = PyFloat_AsDouble( PyDict_GetItemString(self->params, "axis_theta") );
-    self->model_pars.sld_solvent = PyFloat_AsDouble( PyDict_GetItemString(self->params, "sld_solvent") );
-    self->model_pars.axis_phi = PyFloat_AsDouble( PyDict_GetItemString(self->params, "axis_phi") );
-    self->model_pars.background = PyFloat_AsDouble( PyDict_GetItemString(self->params, "background") );
-    self->model_pars.major_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_shell") );
-    self->model_pars.contrast = PyFloat_AsDouble( PyDict_GetItemString(self->params, "contrast") );
-    self->model_pars.minor_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_shell") );
-
-	
-	// Get input and determine whether we have to supply a 1D or 2D return value.
-	if ( !PyArg_ParseTuple(args,"O",&pars) ) {
-	    PyErr_SetString(COblateModelError, 
-	    	"COblateModel.run expects a q value.");
-		return NULL;
-	}
-	  
-	// Check params
-	if( PyList_Check(pars)==1) {
-		
-		// Length of list should be 2 for I(qx, qy))
-	    npars = PyList_GET_SIZE(pars); 
-	    if(npars!=2) {
-	    	PyErr_SetString(COblateModelError, 
-	    		"COblateModel.run expects a double or a list of dimension 2.");
-	    	return NULL;
-	    }
-	    // We have a vector q, get the qx and qy values at which
-	    // to evaluate I(qx,qy)
-	    qx_value = COblateModel_readDouble(PyList_GET_ITEM(pars,0));
-	    qy_value = COblateModel_readDouble(PyList_GET_ITEM(pars,1));
-		return Py_BuildValue("d",oblate_analytical_2DXY(&(self->model_pars),qx_value,qy_value));
-
-	} else {
-
-		// We have a scalar q, we will evaluate I(q)
-		qx_value = COblateModel_readDouble(pars);		
-		
-		return Py_BuildValue("d",oblate_analytical_1D(&(self->model_pars),qx_value));
-	}	
-}
-
-static PyObject * reset(COblateModel *self, PyObject *args) {
-    
-
-    return Py_BuildValue("d",0.0);
-}
-
-
-static PyMethodDef COblateModel_methods[] = {
-    {"run",      (PyCFunction)run     , METH_VARARGS,
-      "Evaluate the model at a given Q or Q, phi"},
-    {"runXY",      (PyCFunction)runXY     , METH_VARARGS,
-      "Evaluate the model at a given Q or Qx, Qy"},
-    {"reset",    (PyCFunction)reset   , METH_VARARGS,
-      "Reset pair correlation"},
-    //{"numerical_1D",      (PyCFunction)numerical_1D     , METH_VARARGS,
-    //  "Evaluate the 1D model at a given Q"},
-   {NULL}
-};
-
-static PyTypeObject COblateModelType = {
-    PyObject_HEAD_INIT(NULL)
-    0,                         /*ob_size*/
-    "COblateModel",             /*tp_name*/
-    sizeof(COblateModel),             /*tp_basicsize*/
-    0,                         /*tp_itemsize*/
-    (destructor)COblateModel_dealloc, /*tp_dealloc*/
-    0,                         /*tp_print*/
-    0,                         /*tp_getattr*/
-    0,                         /*tp_setattr*/
-    0,                         /*tp_compare*/
-    0,                         /*tp_repr*/
-    0,                         /*tp_as_number*/
-    0,                         /*tp_as_sequence*/
-    0,                         /*tp_as_mapping*/
-    0,                         /*tp_hash */
-    0,                         /*tp_call*/
-    0,                         /*tp_str*/
-    0,                         /*tp_getattro*/
-    0,                         /*tp_setattro*/
-    0,                         /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
-    "COblateModel objects",           /* tp_doc */
-    0,		               /* tp_traverse */
-    0,		               /* tp_clear */
-    0,		               /* tp_richcompare */
-    0,		               /* tp_weaklistoffset */
-    0,		               /* tp_iter */
-    0,		               /* tp_iternext */
-    COblateModel_methods,             /* tp_methods */
-    COblateModel_members,             /* tp_members */
-    0,                         /* tp_getset */
-    0,                         /* tp_base */
-    0,                         /* tp_dict */
-    0,                         /* tp_descr_get */
-    0,                         /* tp_descr_set */
-    0,                         /* tp_dictoffset */
-    (initproc)COblateModel_init,      /* tp_init */
-    0,                         /* tp_alloc */
-    COblateModel_new,                 /* tp_new */
-};
-
-
-static PyMethodDef module_methods[] = {
-    {NULL} 
-};
-
-/**
- * Function used to add the model class to a module
- * @param module: module to add the class to
- */ 
-void addCOblateModel(PyObject *module) {
-	PyObject *d;
-	
-    if (PyType_Ready(&COblateModelType) < 0)
-        return;
-
-    Py_INCREF(&COblateModelType);
-    PyModule_AddObject(module, "COblateModel", (PyObject *)&COblateModelType);
-    
-    d = PyModule_GetDict(module);
-    COblateModelError = PyErr_NewException("COblateModel.error", NULL, NULL);
-    PyDict_SetItemString(d, "COblateModelError", COblateModelError);
-}
-
Index: sansmodels/src/sans/models/c_extensions/CProlateModel.c
===================================================================
--- sansmodels/src/sans/models/c_extensions/CProlateModel.c	(revision e0a8a3ccbb7fa14ab3d063bb6214bb4828593f76)
+++ 	(revision )
@@ -1,305 +1,0 @@
-/** CProlateModel
- *
- * C extension 
- *
- * WARNING: THIS FILE WAS GENERATED BY WRAPPERGENERATOR.PY
- *          DO NOT MODIFY THIS FILE, MODIFY prolate.h
- *          AND RE-RUN THE GENERATOR SCRIPT
- *
- * @author   M.Doucet / UTK
- */
- 
-#include <Python.h>
-#include "structmember.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <time.h>
-
-#include "prolate.h"
-
-/// Error object for raised exceptions
-static PyObject * CProlateModelError = NULL;
-
-
-// Class definition
-typedef struct {
-    PyObject_HEAD
-    /// Parameters
-    PyObject * params;
-    /// Log for unit testing
-    PyObject * log;
-    /// Model parameters
-	ProlateParameters model_pars;
-} CProlateModel;
-
-
-static void
-CProlateModel_dealloc(CProlateModel* self)
-{
-    self->ob_type->tp_free((PyObject*)self);
-    
-
-}
-
-static PyObject *
-CProlateModel_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
-    CProlateModel *self;
-    
-    self = (CProlateModel *)type->tp_alloc(type, 0);
-   
-    return (PyObject *)self;
-}
-
-static int
-CProlateModel_init(CProlateModel *self, PyObject *args, PyObject *kwds)
-{
-    if (self != NULL) {
-    	
-    	// Create parameters
-        self->params = PyDict_New();
-        
-        // Initialize parameter dictionary
-        PyDict_SetItemString(self->params,"major_core",Py_BuildValue("d",100.000000));
-        PyDict_SetItemString(self->params,"scale",Py_BuildValue("d",1.000000));
-        PyDict_SetItemString(self->params,"minor_core",Py_BuildValue("d",50.000000));
-        PyDict_SetItemString(self->params,"sld_solvent",Py_BuildValue("d",0.000006));
-        PyDict_SetItemString(self->params,"background",Py_BuildValue("d",0.001000));
-        PyDict_SetItemString(self->params,"major_shell",Py_BuildValue("d",110.000000));
-        PyDict_SetItemString(self->params,"contrast",Py_BuildValue("d",0.000001));
-        PyDict_SetItemString(self->params,"minor_shell",Py_BuildValue("d",60.000000));
-
-         
-        // Create empty log
-        self->log = PyDict_New();
-        
-        
-
-    }
-    return 0;
-}
-
-static PyMemberDef CProlateModel_members[] = {
-    {"params", T_OBJECT, offsetof(CProlateModel, params), 0,
-     "Parameters"},
-    {"log", T_OBJECT, offsetof(CProlateModel, log), 0,
-     "Log"},
-    {NULL}  /* Sentinel */
-};
-
-/** Read double from PyObject
-    @param p PyObject
-    @return double
-*/
-double CProlateModel_readDouble(PyObject *p) {
-    if (PyFloat_Check(p)==1) {
-        return (double)(((PyFloatObject *)(p))->ob_fval);
-    } else if (PyInt_Check(p)==1) {
-        return (double)(((PyIntObject *)(p))->ob_ival);
-    } else if (PyLong_Check(p)==1) {
-        return (double)PyLong_AsLong(p);
-    } else {
-        return 0.0;
-    }
-}
-
-
-/**
- * Function to call to evaluate model
- * @param args: input q or [q,phi]
- * @return: function value
- */
-static PyObject * run(CProlateModel *self, PyObject *args) {
-	double q_value, phi_value;
-	PyObject* pars;
-	int npars;
-	
-	// Get parameters
-	
-	// Reader parameter dictionary
-    self->model_pars.major_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_core") );
-    self->model_pars.scale = PyFloat_AsDouble( PyDict_GetItemString(self->params, "scale") );
-    self->model_pars.minor_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_core") );
-    self->model_pars.sld_solvent = PyFloat_AsDouble( PyDict_GetItemString(self->params, "sld_solvent") );
-    self->model_pars.background = PyFloat_AsDouble( PyDict_GetItemString(self->params, "background") );
-    self->model_pars.major_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_shell") );
-    self->model_pars.contrast = PyFloat_AsDouble( PyDict_GetItemString(self->params, "contrast") );
-    self->model_pars.minor_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_shell") );
-
-	
-	// Get input and determine whether we have to supply a 1D or 2D return value.
-	if ( !PyArg_ParseTuple(args,"O",&pars) ) {
-	    PyErr_SetString(CProlateModelError, 
-	    	"CProlateModel.run expects a q value.");
-		return NULL;
-	}
-	  
-	// Check params
-	if( PyList_Check(pars)==1) {
-		
-		// Length of list should be 2 for I(q,phi)
-	    npars = PyList_GET_SIZE(pars); 
-	    if(npars!=2) {
-	    	PyErr_SetString(CProlateModelError, 
-	    		"CProlateModel.run expects a double or a list of dimension 2.");
-	    	return NULL;
-	    }
-	    // We have a vector q, get the q and phi values at which
-	    // to evaluate I(q,phi)
-	    q_value = CProlateModel_readDouble(PyList_GET_ITEM(pars,0));
-	    phi_value = CProlateModel_readDouble(PyList_GET_ITEM(pars,1));
-	    // Skip zero
-	    if (q_value==0) {
-	    	return Py_BuildValue("d",0.0);
-	    }
-		return Py_BuildValue("d",prolate_analytical_2D(&(self->model_pars),q_value,phi_value));
-
-	} else {
-
-		// We have a scalar q, we will evaluate I(q)
-		q_value = CProlateModel_readDouble(pars);		
-		
-		return Py_BuildValue("d",prolate_analytical_1D(&(self->model_pars),q_value));
-	}	
-}
-
-/**
- * Function to call to evaluate model in cartesian coordinates
- * @param args: input q or [qx, qy]]
- * @return: function value
- */
-static PyObject * runXY(CProlateModel *self, PyObject *args) {
-	double qx_value, qy_value;
-	PyObject* pars;
-	int npars;
-	
-	// Get parameters
-	
-	// Reader parameter dictionary
-    self->model_pars.major_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_core") );
-    self->model_pars.scale = PyFloat_AsDouble( PyDict_GetItemString(self->params, "scale") );
-    self->model_pars.minor_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_core") );
-    self->model_pars.sld_solvent = PyFloat_AsDouble( PyDict_GetItemString(self->params, "sld_solvent") );
-    self->model_pars.background = PyFloat_AsDouble( PyDict_GetItemString(self->params, "background") );
-    self->model_pars.major_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_shell") );
-    self->model_pars.contrast = PyFloat_AsDouble( PyDict_GetItemString(self->params, "contrast") );
-    self->model_pars.minor_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_shell") );
-
-	
-	// Get input and determine whether we have to supply a 1D or 2D return value.
-	if ( !PyArg_ParseTuple(args,"O",&pars) ) {
-	    PyErr_SetString(CProlateModelError, 
-	    	"CProlateModel.run expects a q value.");
-		return NULL;
-	}
-	  
-	// Check params
-	if( PyList_Check(pars)==1) {
-		
-		// Length of list should be 2 for I(qx, qy))
-	    npars = PyList_GET_SIZE(pars); 
-	    if(npars!=2) {
-	    	PyErr_SetString(CProlateModelError, 
-	    		"CProlateModel.run expects a double or a list of dimension 2.");
-	    	return NULL;
-	    }
-	    // We have a vector q, get the qx and qy values at which
-	    // to evaluate I(qx,qy)
-	    qx_value = CProlateModel_readDouble(PyList_GET_ITEM(pars,0));
-	    qy_value = CProlateModel_readDouble(PyList_GET_ITEM(pars,1));
-		return Py_BuildValue("d",prolate_analytical_2DXY(&(self->model_pars),qx_value,qy_value));
-
-	} else {
-
-		// We have a scalar q, we will evaluate I(q)
-		qx_value = CProlateModel_readDouble(pars);		
-		
-		return Py_BuildValue("d",prolate_analytical_1D(&(self->model_pars),qx_value));
-	}	
-}
-
-static PyObject * reset(CProlateModel *self, PyObject *args) {
-    
-
-    return Py_BuildValue("d",0.0);
-}
-
-
-static PyMethodDef CProlateModel_methods[] = {
-    {"run",      (PyCFunction)run     , METH_VARARGS,
-      "Evaluate the model at a given Q or Q, phi"},
-    {"runXY",      (PyCFunction)runXY     , METH_VARARGS,
-      "Evaluate the model at a given Q or Qx, Qy"},
-    {"reset",    (PyCFunction)reset   , METH_VARARGS,
-      "Reset pair correlation"},
-    //{"numerical_1D",      (PyCFunction)numerical_1D     , METH_VARARGS,
-    //  "Evaluate the 1D model at a given Q"},
-   {NULL}
-};
-
-static PyTypeObject CProlateModelType = {
-    PyObject_HEAD_INIT(NULL)
-    0,                         /*ob_size*/
-    "CProlateModel",             /*tp_name*/
-    sizeof(CProlateModel),             /*tp_basicsize*/
-    0,                         /*tp_itemsize*/
-    (destructor)CProlateModel_dealloc, /*tp_dealloc*/
-    0,                         /*tp_print*/
-    0,                         /*tp_getattr*/
-    0,                         /*tp_setattr*/
-    0,                         /*tp_compare*/
-    0,                         /*tp_repr*/
-    0,                         /*tp_as_number*/
-    0,                         /*tp_as_sequence*/
-    0,                         /*tp_as_mapping*/
-    0,                         /*tp_hash */
-    0,                         /*tp_call*/
-    0,                         /*tp_str*/
-    0,                         /*tp_getattro*/
-    0,                         /*tp_setattro*/
-    0,                         /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
-    "CProlateModel objects",           /* tp_doc */
-    0,		               /* tp_traverse */
-    0,		               /* tp_clear */
-    0,		               /* tp_richcompare */
-    0,		               /* tp_weaklistoffset */
-    0,		               /* tp_iter */
-    0,		               /* tp_iternext */
-    CProlateModel_methods,             /* tp_methods */
-    CProlateModel_members,             /* tp_members */
-    0,                         /* tp_getset */
-    0,                         /* tp_base */
-    0,                         /* tp_dict */
-    0,                         /* tp_descr_get */
-    0,                         /* tp_descr_set */
-    0,                         /* tp_dictoffset */
-    (initproc)CProlateModel_init,      /* tp_init */
-    0,                         /* tp_alloc */
-    CProlateModel_new,                 /* tp_new */
-};
-
-
-static PyMethodDef module_methods[] = {
-    {NULL} 
-};
-
-/**
- * Function used to add the model class to a module
- * @param module: module to add the class to
- */ 
-void addCProlateModel(PyObject *module) {
-	PyObject *d;
-	
-    if (PyType_Ready(&CProlateModelType) < 0)
-        return;
-
-    Py_INCREF(&CProlateModelType);
-    PyModule_AddObject(module, "CProlateModel", (PyObject *)&CProlateModelType);
-    
-    d = PyModule_GetDict(module);
-    CProlateModelError = PyErr_NewException("CProlateModel.error", NULL, NULL);
-    PyDict_SetItemString(d, "CProlateModelError", CProlateModelError);
-}
-
Index: sansmodels/src/sans/models/c_models/COblateModel.cpp
===================================================================
--- sansmodels/src/sans/models/c_models/COblateModel.cpp	(revision 870f131f9d526f28fcaa1de9825b193ca97877e6)
+++ 	(revision )
@@ -1,576 +1,0 @@
-/**
-	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
- */
-
-/** COblateModel
- *
- * C extension 
- *
- * WARNING: THIS FILE WAS GENERATED BY WRAPPERGENERATOR.PY
- *          DO NOT MODIFY THIS FILE, MODIFY oblate.h
- *          AND RE-RUN THE GENERATOR SCRIPT
- *
- */
-#define NO_IMPORT_ARRAY
-#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API_sans
- 
-extern "C" {
-#include <Python.h>
-#include <arrayobject.h>
-#include "structmember.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <time.h>
-#include "oblate.h"
-}
-
-#include "models.hh"
-#include "dispersion_visitor.hh"
-
-/// Error object for raised exceptions
-static PyObject * COblateModelError = NULL;
-
-
-// Class definition
-typedef struct {
-    PyObject_HEAD
-    /// Parameters
-    PyObject * params;
-    /// Dispersion parameters
-    PyObject * dispersion;
-    /// Underlying model object
-    OblateModel * model;
-    /// Log for unit testing
-    PyObject * log;
-} COblateModel;
-
-
-static void
-COblateModel_dealloc(COblateModel* self)
-{
-    self->ob_type->tp_free((PyObject*)self);
-    
-
-}
-
-static PyObject *
-COblateModel_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
-    COblateModel *self;
-    
-    self = (COblateModel *)type->tp_alloc(type, 0);
-   
-    return (PyObject *)self;
-}
-
-static int
-COblateModel_init(COblateModel *self, PyObject *args, PyObject *kwds)
-{
-    if (self != NULL) {
-    	
-    	// Create parameters
-        self->params = PyDict_New();
-        self->dispersion = PyDict_New();
-        self->model = new OblateModel();
-        
-        // Initialize parameter dictionary
-        PyDict_SetItemString(self->params,"major_core",Py_BuildValue("d",200.000000));
-        PyDict_SetItemString(self->params,"scale",Py_BuildValue("d",1.000000));
-        PyDict_SetItemString(self->params,"minor_core",Py_BuildValue("d",20.000000));
-        PyDict_SetItemString(self->params,"axis_theta",Py_BuildValue("d",1.000000));
-        PyDict_SetItemString(self->params,"sld_solvent",Py_BuildValue("d",0.000006));
-        PyDict_SetItemString(self->params,"axis_phi",Py_BuildValue("d",1.000000));
-        PyDict_SetItemString(self->params,"background",Py_BuildValue("d",0.001000));
-        PyDict_SetItemString(self->params,"major_shell",Py_BuildValue("d",250.000000));
-        PyDict_SetItemString(self->params,"contrast",Py_BuildValue("d",0.000001));
-        PyDict_SetItemString(self->params,"minor_shell",Py_BuildValue("d",30.000000));
-        // Initialize dispersion / averaging parameter dict
-        DispersionVisitor* visitor = new DispersionVisitor();
-        PyObject * disp_dict;
-        disp_dict = PyDict_New();
-        self->model->major_core.dispersion->accept_as_source(visitor, self->model->major_core.dispersion, disp_dict);
-        PyDict_SetItemString(self->dispersion, "major_core", disp_dict);
-        disp_dict = PyDict_New();
-        self->model->minor_core.dispersion->accept_as_source(visitor, self->model->minor_core.dispersion, disp_dict);
-        PyDict_SetItemString(self->dispersion, "minor_core", disp_dict);
-        disp_dict = PyDict_New();
-        self->model->major_shell.dispersion->accept_as_source(visitor, self->model->major_shell.dispersion, disp_dict);
-        PyDict_SetItemString(self->dispersion, "major_shell", disp_dict);
-        disp_dict = PyDict_New();
-        self->model->minor_shell.dispersion->accept_as_source(visitor, self->model->minor_shell.dispersion, disp_dict);
-        PyDict_SetItemString(self->dispersion, "minor_shell", disp_dict);
-
-
-         
-        // Create empty log
-        self->log = PyDict_New();
-        
-        
-
-    }
-    return 0;
-}
-
-static PyMemberDef COblateModel_members[] = {
-    {"params", T_OBJECT, offsetof(COblateModel, params), 0,
-     "Parameters"},
-	{"dispersion", T_OBJECT, offsetof(COblateModel, dispersion), 0,
-	  "Dispersion parameters"},     
-    {"log", T_OBJECT, offsetof(COblateModel, log), 0,
-     "Log"},
-    {NULL}  /* Sentinel */
-};
-
-/** Read double from PyObject
-    @param p PyObject
-    @return double
-*/
-double COblateModel_readDouble(PyObject *p) {
-    if (PyFloat_Check(p)==1) {
-        return (double)(((PyFloatObject *)(p))->ob_fval);
-    } else if (PyInt_Check(p)==1) {
-        return (double)(((PyIntObject *)(p))->ob_ival);
-    } else if (PyLong_Check(p)==1) {
-        return (double)PyLong_AsLong(p);
-    } else {
-        return 0.0;
-    }
-}
-/**
- * Function to call to evaluate model
- * @param args: input numpy array q[] 
- * @return: numpy array object 
- */
- 
-static PyObject *evaluateOneDim(OblateModel* model, PyArrayObject *q){
-    PyArrayObject *result;
-   
-    // Check validity of array q , q must be of dimension 1, an array of double
-    if (q->nd != 1 || q->descr->type_num != PyArray_DOUBLE)
-    {
-        //const char * message= "Invalid array: q->nd=%d,type_num=%d\n",q->nd,q->descr->type_num;
-        //PyErr_SetString(PyExc_ValueError , message);
-        return NULL;
-    }
-    result = (PyArrayObject *)PyArray_FromDims(q->nd, (int *)(q->dimensions), 
-										  PyArray_DOUBLE);
-	if (result == NULL) {
-        const char * message= "Could not create result ";
-        PyErr_SetString(PyExc_RuntimeError , message);
-		return NULL;
-	}
-	 for (int i = 0; i < q->dimensions[0]; i++){
-      double q_value  = *(double *)(q->data + i*q->strides[0]);
-      double *result_value = (double *)(result->data + i*result->strides[0]);
-      *result_value =(*model)(q_value);
-	}
-    return PyArray_Return(result); 
- }
-
- /**
- * Function to call to evaluate model
- * @param args: input numpy array  [x[],y[]]
- * @return: numpy array object 
- */
- static PyObject * evaluateTwoDimXY( OblateModel* model, 
-                              PyArrayObject *x, PyArrayObject *y)
- {
-    PyArrayObject *result;
-    int i,j, x_len, y_len, dims[2];
-    //check validity of input vectors
-    if (x->nd != 2 || x->descr->type_num != PyArray_DOUBLE
-        || y->nd != 2 || y->descr->type_num != PyArray_DOUBLE
-        || y->dimensions[1] != x->dimensions[0]){
-        const char * message= "evaluateTwoDimXY  expect 2 numpy arrays";
-        PyErr_SetString(PyExc_ValueError , message); 
-        return NULL;
-    }
-   
-	if (PyArray_Check(x) && PyArray_Check(y)) {
-		
-	    x_len = dims[1]= x->dimensions[0];
-        y_len = dims[0]= y->dimensions[1];
-	    
-	    // Make a new double matrix of same dims
-        result=(PyArrayObject *) PyArray_FromDims(2,dims,NPY_DOUBLE);
-        if (result == NULL){
-	    const char * message= "Could not create result ";
-        PyErr_SetString(PyExc_RuntimeError , message);
-	    return NULL;
-	    }
-       
-        /* Do the calculation. */
-        for ( j=0; j< y_len; j++) {
-            for ( i=0; i< x_len; i++) {
-                double x_value = *(double *)(x->data + i*x->strides[0]);
-      		    double y_value = *(double *)(y->data + j*y->strides[1]);
-      			double *result_value = (double *)(result->data +
-      			      j*result->strides[0] + i*result->strides[1]);
-      			*result_value = (*model)(x_value, y_value);
-            }           
-        }
-        return PyArray_Return(result); 
-        
-        }else{
-		    PyErr_SetString(COblateModelError, 
-                   "COblateModel.evaluateTwoDimXY couldn't run.");
-	        return NULL;
-		}      	
-}
-/**
- *  evalDistribution function evaluate a model function with input vector
- *  @param args: input q as vector or [qx, qy] where qx, qy are vectors
- *
- */ 
-static PyObject * evalDistribution(COblateModel *self, PyObject *args){
-	PyObject *qx, *qy;
-	PyArrayObject * pars;
-	int npars ,mpars;
-	
-	// Get parameters
-	
-	    // Reader parameter dictionary
-    self->model->major_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_core") );
-    self->model->scale = PyFloat_AsDouble( PyDict_GetItemString(self->params, "scale") );
-    self->model->minor_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_core") );
-    self->model->axis_theta = PyFloat_AsDouble( PyDict_GetItemString(self->params, "axis_theta") );
-    self->model->sld_solvent = PyFloat_AsDouble( PyDict_GetItemString(self->params, "sld_solvent") );
-    self->model->axis_phi = PyFloat_AsDouble( PyDict_GetItemString(self->params, "axis_phi") );
-    self->model->background = PyFloat_AsDouble( PyDict_GetItemString(self->params, "background") );
-    self->model->major_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_shell") );
-    self->model->contrast = PyFloat_AsDouble( PyDict_GetItemString(self->params, "contrast") );
-    self->model->minor_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_shell") );
-    // Read in dispersion parameters
-    PyObject* disp_dict;
-    DispersionVisitor* visitor = new DispersionVisitor();
-    disp_dict = PyDict_GetItemString(self->dispersion, "major_core");
-    self->model->major_core.dispersion->accept_as_destination(visitor, self->model->major_core.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "minor_core");
-    self->model->minor_core.dispersion->accept_as_destination(visitor, self->model->minor_core.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "major_shell");
-    self->model->major_shell.dispersion->accept_as_destination(visitor, self->model->major_shell.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "minor_shell");
-    self->model->minor_shell.dispersion->accept_as_destination(visitor, self->model->minor_shell.dispersion, disp_dict);
-
-	
-	// Get input and determine whether we have to supply a 1D or 2D return value.
-	if ( !PyArg_ParseTuple(args,"O",&pars) ) {
-	    PyErr_SetString(COblateModelError, 
-	    	"COblateModel.evalDistribution expects a q value.");
-		return NULL;
-	}
-    // Check params
-	
-    if(PyArray_Check(pars)==1) {
-		
-	    // Length of list should 1 or 2
-	    npars = pars->nd; 
-	    if(npars==1) {
-	        // input is a numpy array
-	        if (PyArray_Check(pars)) {
-		        return evaluateOneDim(self->model, (PyArrayObject*)pars); 
-		    }
-		}else{
-		    PyErr_SetString(COblateModelError, 
-                   "COblateModel.evalDistribution expect numpy array of one dimension.");
-	        return NULL;
-		}
-    }else if( PyList_Check(pars)==1) {
-    	// Length of list should be 2 for I(qx,qy)
-	    mpars = PyList_GET_SIZE(pars); 
-	    if(mpars!=2) {
-	    	PyErr_SetString(COblateModelError, 
-	    		"COblateModel.evalDistribution expects a list of dimension 2.");
-	    	return NULL;
-	    }
-	     qx = PyList_GET_ITEM(pars,0);
-	     qy = PyList_GET_ITEM(pars,1);
-	     if (PyArray_Check(qx) && PyArray_Check(qy)) {
-	         return evaluateTwoDimXY(self->model, (PyArrayObject*)qx,
-		           (PyArrayObject*)qy);
-		 }else{
-		    PyErr_SetString(COblateModelError, 
-                   "COblateModel.evalDistribution expect 2 numpy arrays in list.");
-	        return NULL;
-	     }
-	}
-	PyErr_SetString(COblateModelError, 
-                   "COblateModel.evalDistribution couln't be run.");
-	return NULL;
-	
-}
-
-/**
- * Function to call to evaluate model
- * @param args: input q or [q,phi]
- * @return: function value
- */
-static PyObject * run(COblateModel *self, PyObject *args) {
-	double q_value, phi_value;
-	PyObject* pars;
-	int npars;
-	
-	// Get parameters
-	
-	    // Reader parameter dictionary
-    self->model->major_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_core") );
-    self->model->scale = PyFloat_AsDouble( PyDict_GetItemString(self->params, "scale") );
-    self->model->minor_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_core") );
-    self->model->axis_theta = PyFloat_AsDouble( PyDict_GetItemString(self->params, "axis_theta") );
-    self->model->sld_solvent = PyFloat_AsDouble( PyDict_GetItemString(self->params, "sld_solvent") );
-    self->model->axis_phi = PyFloat_AsDouble( PyDict_GetItemString(self->params, "axis_phi") );
-    self->model->background = PyFloat_AsDouble( PyDict_GetItemString(self->params, "background") );
-    self->model->major_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_shell") );
-    self->model->contrast = PyFloat_AsDouble( PyDict_GetItemString(self->params, "contrast") );
-    self->model->minor_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_shell") );
-    // Read in dispersion parameters
-    PyObject* disp_dict;
-    DispersionVisitor* visitor = new DispersionVisitor();
-    disp_dict = PyDict_GetItemString(self->dispersion, "major_core");
-    self->model->major_core.dispersion->accept_as_destination(visitor, self->model->major_core.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "minor_core");
-    self->model->minor_core.dispersion->accept_as_destination(visitor, self->model->minor_core.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "major_shell");
-    self->model->major_shell.dispersion->accept_as_destination(visitor, self->model->major_shell.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "minor_shell");
-    self->model->minor_shell.dispersion->accept_as_destination(visitor, self->model->minor_shell.dispersion, disp_dict);
-
-	
-	// Get input and determine whether we have to supply a 1D or 2D return value.
-	if ( !PyArg_ParseTuple(args,"O",&pars) ) {
-	    PyErr_SetString(COblateModelError, 
-	    	"COblateModel.run expects a q value.");
-		return NULL;
-	}
-	  
-	// Check params
-	if( PyList_Check(pars)==1) {
-		
-		// Length of list should be 2 for I(q,phi)
-	    npars = PyList_GET_SIZE(pars); 
-	    if(npars!=2) {
-	    	PyErr_SetString(COblateModelError, 
-	    		"COblateModel.run expects a double or a list of dimension 2.");
-	    	return NULL;
-	    }
-	    // We have a vector q, get the q and phi values at which
-	    // to evaluate I(q,phi)
-	    q_value = COblateModel_readDouble(PyList_GET_ITEM(pars,0));
-	    phi_value = COblateModel_readDouble(PyList_GET_ITEM(pars,1));
-	    // Skip zero
-	    if (q_value==0) {
-	    	return Py_BuildValue("d",0.0);
-	    }
-		return Py_BuildValue("d",(*(self->model)).evaluate_rphi(q_value,phi_value));
-
-	} else {
-
-		// We have a scalar q, we will evaluate I(q)
-		q_value = COblateModel_readDouble(pars);		
-		
-		return Py_BuildValue("d",(*(self->model))(q_value));
-	}	
-}
-
-/**
- * Function to call to evaluate model in cartesian coordinates
- * @param args: input q or [qx, qy]]
- * @return: function value
- */
-static PyObject * runXY(COblateModel *self, PyObject *args) {
-	double qx_value, qy_value;
-	PyObject* pars;
-	int npars;
-	
-	// Get parameters
-	
-	    // Reader parameter dictionary
-    self->model->major_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_core") );
-    self->model->scale = PyFloat_AsDouble( PyDict_GetItemString(self->params, "scale") );
-    self->model->minor_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_core") );
-    self->model->axis_theta = PyFloat_AsDouble( PyDict_GetItemString(self->params, "axis_theta") );
-    self->model->sld_solvent = PyFloat_AsDouble( PyDict_GetItemString(self->params, "sld_solvent") );
-    self->model->axis_phi = PyFloat_AsDouble( PyDict_GetItemString(self->params, "axis_phi") );
-    self->model->background = PyFloat_AsDouble( PyDict_GetItemString(self->params, "background") );
-    self->model->major_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_shell") );
-    self->model->contrast = PyFloat_AsDouble( PyDict_GetItemString(self->params, "contrast") );
-    self->model->minor_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_shell") );
-    // Read in dispersion parameters
-    PyObject* disp_dict;
-    DispersionVisitor* visitor = new DispersionVisitor();
-    disp_dict = PyDict_GetItemString(self->dispersion, "major_core");
-    self->model->major_core.dispersion->accept_as_destination(visitor, self->model->major_core.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "minor_core");
-    self->model->minor_core.dispersion->accept_as_destination(visitor, self->model->minor_core.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "major_shell");
-    self->model->major_shell.dispersion->accept_as_destination(visitor, self->model->major_shell.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "minor_shell");
-    self->model->minor_shell.dispersion->accept_as_destination(visitor, self->model->minor_shell.dispersion, disp_dict);
-
-	
-	// Get input and determine whether we have to supply a 1D or 2D return value.
-	if ( !PyArg_ParseTuple(args,"O",&pars) ) {
-	    PyErr_SetString(COblateModelError, 
-	    	"COblateModel.run expects a q value.");
-		return NULL;
-	}
-	  
-	// Check params
-	if( PyList_Check(pars)==1) {
-		
-		// Length of list should be 2 for I(qx, qy))
-	    npars = PyList_GET_SIZE(pars); 
-	    if(npars!=2) {
-	    	PyErr_SetString(COblateModelError, 
-	    		"COblateModel.run expects a double or a list of dimension 2.");
-	    	return NULL;
-	    }
-	    // We have a vector q, get the qx and qy values at which
-	    // to evaluate I(qx,qy)
-	    qx_value = COblateModel_readDouble(PyList_GET_ITEM(pars,0));
-	    qy_value = COblateModel_readDouble(PyList_GET_ITEM(pars,1));
-	    return Py_BuildValue("d",(*(self->model))(qx_value,qy_value));
-
-	} else {
-
-		// We have a scalar q, we will evaluate I(q)
-		qx_value = COblateModel_readDouble(pars);		
-		
-		return Py_BuildValue("d",(*(self->model))(qx_value));
-	}	
-}
-
-static PyObject * reset(COblateModel *self, PyObject *args) {
-    
-
-    return Py_BuildValue("d",0.0);
-}
-
-static PyObject * set_dispersion(COblateModel *self, PyObject *args) {
-	PyObject * disp;
-	const char * par_name;
-
-	if ( !PyArg_ParseTuple(args,"sO", &par_name, &disp) ) {
-	    PyErr_SetString(COblateModelError,
-	    	"COblateModel.set_dispersion expects a DispersionModel object.");
-		return NULL;
-	}
-	void *temp = PyCObject_AsVoidPtr(disp);
-	DispersionModel * dispersion = static_cast<DispersionModel *>(temp);
-
-
-	// Ugliness necessary to go from python to C
-	    // TODO: refactor this
-    if (!strcmp(par_name, "major_core")) {
-        self->model->major_core.dispersion = dispersion;
-    } else    if (!strcmp(par_name, "minor_core")) {
-        self->model->minor_core.dispersion = dispersion;
-    } else    if (!strcmp(par_name, "major_shell")) {
-        self->model->major_shell.dispersion = dispersion;
-    } else    if (!strcmp(par_name, "minor_shell")) {
-        self->model->minor_shell.dispersion = dispersion;
-    } else {
-	    PyErr_SetString(COblateModelError,
-	    	"COblateModel.set_dispersion expects a valid parameter name.");
-		return NULL;
-	}
-
-	DispersionVisitor* visitor = new DispersionVisitor();
-	PyObject * disp_dict = PyDict_New();
-	dispersion->accept_as_source(visitor, dispersion, disp_dict);
-	PyDict_SetItemString(self->dispersion, par_name, disp_dict);
-    return Py_BuildValue("i",1);
-}
-
-
-static PyMethodDef COblateModel_methods[] = {
-    {"run",      (PyCFunction)run     , METH_VARARGS,
-      "Evaluate the model at a given Q or Q, phi"},
-    {"runXY",      (PyCFunction)runXY     , METH_VARARGS,
-      "Evaluate the model at a given Q or Qx, Qy"},
-      
-    {"evalDistribution",  (PyCFunction)evalDistribution , METH_VARARGS,
-      "Evaluate the model at a given Q or Qx, Qy vector "},
-    {"reset",    (PyCFunction)reset   , METH_VARARGS,
-      "Reset pair correlation"},
-    {"set_dispersion",      (PyCFunction)set_dispersion     , METH_VARARGS,
-      "Set the dispersion model for a given parameter"},
-   {NULL}
-};
-
-static PyTypeObject COblateModelType = {
-    PyObject_HEAD_INIT(NULL)
-    0,                         /*ob_size*/
-    "COblateModel",             /*tp_name*/
-    sizeof(COblateModel),             /*tp_basicsize*/
-    0,                         /*tp_itemsize*/
-    (destructor)COblateModel_dealloc, /*tp_dealloc*/
-    0,                         /*tp_print*/
-    0,                         /*tp_getattr*/
-    0,                         /*tp_setattr*/
-    0,                         /*tp_compare*/
-    0,                         /*tp_repr*/
-    0,                         /*tp_as_number*/
-    0,                         /*tp_as_sequence*/
-    0,                         /*tp_as_mapping*/
-    0,                         /*tp_hash */
-    0,                         /*tp_call*/
-    0,                         /*tp_str*/
-    0,                         /*tp_getattro*/
-    0,                         /*tp_setattro*/
-    0,                         /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
-    "COblateModel objects",           /* tp_doc */
-    0,		               /* tp_traverse */
-    0,		               /* tp_clear */
-    0,		               /* tp_richcompare */
-    0,		               /* tp_weaklistoffset */
-    0,		               /* tp_iter */
-    0,		               /* tp_iternext */
-    COblateModel_methods,             /* tp_methods */
-    COblateModel_members,             /* tp_members */
-    0,                         /* tp_getset */
-    0,                         /* tp_base */
-    0,                         /* tp_dict */
-    0,                         /* tp_descr_get */
-    0,                         /* tp_descr_set */
-    0,                         /* tp_dictoffset */
-    (initproc)COblateModel_init,      /* tp_init */
-    0,                         /* tp_alloc */
-    COblateModel_new,                 /* tp_new */
-};
-
-
-//static PyMethodDef module_methods[] = {
-//    {NULL} 
-//};
-
-/**
- * Function used to add the model class to a module
- * @param module: module to add the class to
- */ 
-void addCOblateModel(PyObject *module) {
-	PyObject *d;
-	
-    if (PyType_Ready(&COblateModelType) < 0)
-        return;
-
-    Py_INCREF(&COblateModelType);
-    PyModule_AddObject(module, "COblateModel", (PyObject *)&COblateModelType);
-    
-    d = PyModule_GetDict(module);
-    COblateModelError = PyErr_NewException("COblateModel.error", NULL, NULL);
-    PyDict_SetItemString(d, "COblateModelError", COblateModelError);
-}
-
Index: sansmodels/src/sans/models/c_models/CProlateModel.cpp
===================================================================
--- sansmodels/src/sans/models/c_models/CProlateModel.cpp	(revision 870f131f9d526f28fcaa1de9825b193ca97877e6)
+++ 	(revision )
@@ -1,568 +1,0 @@
-/**
-	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
- */
-
-/** CProlateModel
- *
- * C extension 
- *
- * WARNING: THIS FILE WAS GENERATED BY WRAPPERGENERATOR.PY
- *          DO NOT MODIFY THIS FILE, MODIFY prolate.h
- *          AND RE-RUN THE GENERATOR SCRIPT
- *
- */
-#define NO_IMPORT_ARRAY
-#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API_sans
- 
-extern "C" {
-#include <Python.h>
-#include <arrayobject.h>
-#include "structmember.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <time.h>
-#include "prolate.h"
-}
-
-#include "models.hh"
-#include "dispersion_visitor.hh"
-
-/// Error object for raised exceptions
-static PyObject * CProlateModelError = NULL;
-
-
-// Class definition
-typedef struct {
-    PyObject_HEAD
-    /// Parameters
-    PyObject * params;
-    /// Dispersion parameters
-    PyObject * dispersion;
-    /// Underlying model object
-    ProlateModel * model;
-    /// Log for unit testing
-    PyObject * log;
-} CProlateModel;
-
-
-static void
-CProlateModel_dealloc(CProlateModel* self)
-{
-    self->ob_type->tp_free((PyObject*)self);
-    
-
-}
-
-static PyObject *
-CProlateModel_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
-    CProlateModel *self;
-    
-    self = (CProlateModel *)type->tp_alloc(type, 0);
-   
-    return (PyObject *)self;
-}
-
-static int
-CProlateModel_init(CProlateModel *self, PyObject *args, PyObject *kwds)
-{
-    if (self != NULL) {
-    	
-    	// Create parameters
-        self->params = PyDict_New();
-        self->dispersion = PyDict_New();
-        self->model = new ProlateModel();
-        
-        // Initialize parameter dictionary
-        PyDict_SetItemString(self->params,"major_core",Py_BuildValue("d",100.000000));
-        PyDict_SetItemString(self->params,"scale",Py_BuildValue("d",1.000000));
-        PyDict_SetItemString(self->params,"minor_core",Py_BuildValue("d",50.000000));
-        PyDict_SetItemString(self->params,"sld_solvent",Py_BuildValue("d",0.000006));
-        PyDict_SetItemString(self->params,"background",Py_BuildValue("d",0.001000));
-        PyDict_SetItemString(self->params,"major_shell",Py_BuildValue("d",110.000000));
-        PyDict_SetItemString(self->params,"contrast",Py_BuildValue("d",0.000001));
-        PyDict_SetItemString(self->params,"minor_shell",Py_BuildValue("d",60.000000));
-        // Initialize dispersion / averaging parameter dict
-        DispersionVisitor* visitor = new DispersionVisitor();
-        PyObject * disp_dict;
-        disp_dict = PyDict_New();
-        self->model->major_core.dispersion->accept_as_source(visitor, self->model->major_core.dispersion, disp_dict);
-        PyDict_SetItemString(self->dispersion, "major_core", disp_dict);
-        disp_dict = PyDict_New();
-        self->model->minor_core.dispersion->accept_as_source(visitor, self->model->minor_core.dispersion, disp_dict);
-        PyDict_SetItemString(self->dispersion, "minor_core", disp_dict);
-        disp_dict = PyDict_New();
-        self->model->major_shell.dispersion->accept_as_source(visitor, self->model->major_shell.dispersion, disp_dict);
-        PyDict_SetItemString(self->dispersion, "major_shell", disp_dict);
-        disp_dict = PyDict_New();
-        self->model->minor_shell.dispersion->accept_as_source(visitor, self->model->minor_shell.dispersion, disp_dict);
-        PyDict_SetItemString(self->dispersion, "minor_shell", disp_dict);
-
-
-         
-        // Create empty log
-        self->log = PyDict_New();
-        
-        
-
-    }
-    return 0;
-}
-
-static PyMemberDef CProlateModel_members[] = {
-    {"params", T_OBJECT, offsetof(CProlateModel, params), 0,
-     "Parameters"},
-	{"dispersion", T_OBJECT, offsetof(CProlateModel, dispersion), 0,
-	  "Dispersion parameters"},     
-    {"log", T_OBJECT, offsetof(CProlateModel, log), 0,
-     "Log"},
-    {NULL}  /* Sentinel */
-};
-
-/** Read double from PyObject
-    @param p PyObject
-    @return double
-*/
-double CProlateModel_readDouble(PyObject *p) {
-    if (PyFloat_Check(p)==1) {
-        return (double)(((PyFloatObject *)(p))->ob_fval);
-    } else if (PyInt_Check(p)==1) {
-        return (double)(((PyIntObject *)(p))->ob_ival);
-    } else if (PyLong_Check(p)==1) {
-        return (double)PyLong_AsLong(p);
-    } else {
-        return 0.0;
-    }
-}
-/**
- * Function to call to evaluate model
- * @param args: input numpy array q[] 
- * @return: numpy array object 
- */
- 
-static PyObject *evaluateOneDim(ProlateModel* model, PyArrayObject *q){
-    PyArrayObject *result;
-   
-    // Check validity of array q , q must be of dimension 1, an array of double
-    if (q->nd != 1 || q->descr->type_num != PyArray_DOUBLE)
-    {
-        //const char * message= "Invalid array: q->nd=%d,type_num=%d\n",q->nd,q->descr->type_num;
-        //PyErr_SetString(PyExc_ValueError , message);
-        return NULL;
-    }
-    result = (PyArrayObject *)PyArray_FromDims(q->nd, (int *)(q->dimensions), 
-										  PyArray_DOUBLE);
-	if (result == NULL) {
-        const char * message= "Could not create result ";
-        PyErr_SetString(PyExc_RuntimeError , message);
-		return NULL;
-	}
-	 for (int i = 0; i < q->dimensions[0]; i++){
-      double q_value  = *(double *)(q->data + i*q->strides[0]);
-      double *result_value = (double *)(result->data + i*result->strides[0]);
-      *result_value =(*model)(q_value);
-	}
-    return PyArray_Return(result); 
- }
-
- /**
- * Function to call to evaluate model
- * @param args: input numpy array  [x[],y[]]
- * @return: numpy array object 
- */
- static PyObject * evaluateTwoDimXY( ProlateModel* model, 
-                              PyArrayObject *x, PyArrayObject *y)
- {
-    PyArrayObject *result;
-    int i,j, x_len, y_len, dims[2];
-    //check validity of input vectors
-    if (x->nd != 2 || x->descr->type_num != PyArray_DOUBLE
-        || y->nd != 2 || y->descr->type_num != PyArray_DOUBLE
-        || y->dimensions[1] != x->dimensions[0]){
-        const char * message= "evaluateTwoDimXY  expect 2 numpy arrays";
-        PyErr_SetString(PyExc_ValueError , message); 
-        return NULL;
-    }
-   
-	if (PyArray_Check(x) && PyArray_Check(y)) {
-		
-	    x_len = dims[1]= x->dimensions[0];
-        y_len = dims[0]= y->dimensions[1];
-	    
-	    // Make a new double matrix of same dims
-        result=(PyArrayObject *) PyArray_FromDims(2,dims,NPY_DOUBLE);
-        if (result == NULL){
-	    const char * message= "Could not create result ";
-        PyErr_SetString(PyExc_RuntimeError , message);
-	    return NULL;
-	    }
-       
-        /* Do the calculation. */
-        for ( j=0; j< y_len; j++) {
-            for ( i=0; i< x_len; i++) {
-                double x_value = *(double *)(x->data + i*x->strides[0]);
-      		    double y_value = *(double *)(y->data + j*y->strides[1]);
-      			double *result_value = (double *)(result->data +
-      			      j*result->strides[0] + i*result->strides[1]);
-      			*result_value = (*model)(x_value, y_value);
-            }           
-        }
-        return PyArray_Return(result); 
-        
-        }else{
-		    PyErr_SetString(CProlateModelError, 
-                   "CProlateModel.evaluateTwoDimXY couldn't run.");
-	        return NULL;
-		}      	
-}
-/**
- *  evalDistribution function evaluate a model function with input vector
- *  @param args: input q as vector or [qx, qy] where qx, qy are vectors
- *
- */ 
-static PyObject * evalDistribution(CProlateModel *self, PyObject *args){
-	PyObject *qx, *qy;
-	PyArrayObject * pars;
-	int npars ,mpars;
-	
-	// Get parameters
-	
-	    // Reader parameter dictionary
-    self->model->major_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_core") );
-    self->model->scale = PyFloat_AsDouble( PyDict_GetItemString(self->params, "scale") );
-    self->model->minor_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_core") );
-    self->model->sld_solvent = PyFloat_AsDouble( PyDict_GetItemString(self->params, "sld_solvent") );
-    self->model->background = PyFloat_AsDouble( PyDict_GetItemString(self->params, "background") );
-    self->model->major_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_shell") );
-    self->model->contrast = PyFloat_AsDouble( PyDict_GetItemString(self->params, "contrast") );
-    self->model->minor_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_shell") );
-    // Read in dispersion parameters
-    PyObject* disp_dict;
-    DispersionVisitor* visitor = new DispersionVisitor();
-    disp_dict = PyDict_GetItemString(self->dispersion, "major_core");
-    self->model->major_core.dispersion->accept_as_destination(visitor, self->model->major_core.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "minor_core");
-    self->model->minor_core.dispersion->accept_as_destination(visitor, self->model->minor_core.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "major_shell");
-    self->model->major_shell.dispersion->accept_as_destination(visitor, self->model->major_shell.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "minor_shell");
-    self->model->minor_shell.dispersion->accept_as_destination(visitor, self->model->minor_shell.dispersion, disp_dict);
-
-	
-	// Get input and determine whether we have to supply a 1D or 2D return value.
-	if ( !PyArg_ParseTuple(args,"O",&pars) ) {
-	    PyErr_SetString(CProlateModelError, 
-	    	"CProlateModel.evalDistribution expects a q value.");
-		return NULL;
-	}
-    // Check params
-	
-    if(PyArray_Check(pars)==1) {
-		
-	    // Length of list should 1 or 2
-	    npars = pars->nd; 
-	    if(npars==1) {
-	        // input is a numpy array
-	        if (PyArray_Check(pars)) {
-		        return evaluateOneDim(self->model, (PyArrayObject*)pars); 
-		    }
-		}else{
-		    PyErr_SetString(CProlateModelError, 
-                   "CProlateModel.evalDistribution expect numpy array of one dimension.");
-	        return NULL;
-		}
-    }else if( PyList_Check(pars)==1) {
-    	// Length of list should be 2 for I(qx,qy)
-	    mpars = PyList_GET_SIZE(pars); 
-	    if(mpars!=2) {
-	    	PyErr_SetString(CProlateModelError, 
-	    		"CProlateModel.evalDistribution expects a list of dimension 2.");
-	    	return NULL;
-	    }
-	     qx = PyList_GET_ITEM(pars,0);
-	     qy = PyList_GET_ITEM(pars,1);
-	     if (PyArray_Check(qx) && PyArray_Check(qy)) {
-	         return evaluateTwoDimXY(self->model, (PyArrayObject*)qx,
-		           (PyArrayObject*)qy);
-		 }else{
-		    PyErr_SetString(CProlateModelError, 
-                   "CProlateModel.evalDistribution expect 2 numpy arrays in list.");
-	        return NULL;
-	     }
-	}
-	PyErr_SetString(CProlateModelError, 
-                   "CProlateModel.evalDistribution couln't be run.");
-	return NULL;
-	
-}
-
-/**
- * Function to call to evaluate model
- * @param args: input q or [q,phi]
- * @return: function value
- */
-static PyObject * run(CProlateModel *self, PyObject *args) {
-	double q_value, phi_value;
-	PyObject* pars;
-	int npars;
-	
-	// Get parameters
-	
-	    // Reader parameter dictionary
-    self->model->major_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_core") );
-    self->model->scale = PyFloat_AsDouble( PyDict_GetItemString(self->params, "scale") );
-    self->model->minor_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_core") );
-    self->model->sld_solvent = PyFloat_AsDouble( PyDict_GetItemString(self->params, "sld_solvent") );
-    self->model->background = PyFloat_AsDouble( PyDict_GetItemString(self->params, "background") );
-    self->model->major_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_shell") );
-    self->model->contrast = PyFloat_AsDouble( PyDict_GetItemString(self->params, "contrast") );
-    self->model->minor_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_shell") );
-    // Read in dispersion parameters
-    PyObject* disp_dict;
-    DispersionVisitor* visitor = new DispersionVisitor();
-    disp_dict = PyDict_GetItemString(self->dispersion, "major_core");
-    self->model->major_core.dispersion->accept_as_destination(visitor, self->model->major_core.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "minor_core");
-    self->model->minor_core.dispersion->accept_as_destination(visitor, self->model->minor_core.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "major_shell");
-    self->model->major_shell.dispersion->accept_as_destination(visitor, self->model->major_shell.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "minor_shell");
-    self->model->minor_shell.dispersion->accept_as_destination(visitor, self->model->minor_shell.dispersion, disp_dict);
-
-	
-	// Get input and determine whether we have to supply a 1D or 2D return value.
-	if ( !PyArg_ParseTuple(args,"O",&pars) ) {
-	    PyErr_SetString(CProlateModelError, 
-	    	"CProlateModel.run expects a q value.");
-		return NULL;
-	}
-	  
-	// Check params
-	if( PyList_Check(pars)==1) {
-		
-		// Length of list should be 2 for I(q,phi)
-	    npars = PyList_GET_SIZE(pars); 
-	    if(npars!=2) {
-	    	PyErr_SetString(CProlateModelError, 
-	    		"CProlateModel.run expects a double or a list of dimension 2.");
-	    	return NULL;
-	    }
-	    // We have a vector q, get the q and phi values at which
-	    // to evaluate I(q,phi)
-	    q_value = CProlateModel_readDouble(PyList_GET_ITEM(pars,0));
-	    phi_value = CProlateModel_readDouble(PyList_GET_ITEM(pars,1));
-	    // Skip zero
-	    if (q_value==0) {
-	    	return Py_BuildValue("d",0.0);
-	    }
-		return Py_BuildValue("d",(*(self->model)).evaluate_rphi(q_value,phi_value));
-
-	} else {
-
-		// We have a scalar q, we will evaluate I(q)
-		q_value = CProlateModel_readDouble(pars);		
-		
-		return Py_BuildValue("d",(*(self->model))(q_value));
-	}	
-}
-
-/**
- * Function to call to evaluate model in cartesian coordinates
- * @param args: input q or [qx, qy]]
- * @return: function value
- */
-static PyObject * runXY(CProlateModel *self, PyObject *args) {
-	double qx_value, qy_value;
-	PyObject* pars;
-	int npars;
-	
-	// Get parameters
-	
-	    // Reader parameter dictionary
-    self->model->major_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_core") );
-    self->model->scale = PyFloat_AsDouble( PyDict_GetItemString(self->params, "scale") );
-    self->model->minor_core = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_core") );
-    self->model->sld_solvent = PyFloat_AsDouble( PyDict_GetItemString(self->params, "sld_solvent") );
-    self->model->background = PyFloat_AsDouble( PyDict_GetItemString(self->params, "background") );
-    self->model->major_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "major_shell") );
-    self->model->contrast = PyFloat_AsDouble( PyDict_GetItemString(self->params, "contrast") );
-    self->model->minor_shell = PyFloat_AsDouble( PyDict_GetItemString(self->params, "minor_shell") );
-    // Read in dispersion parameters
-    PyObject* disp_dict;
-    DispersionVisitor* visitor = new DispersionVisitor();
-    disp_dict = PyDict_GetItemString(self->dispersion, "major_core");
-    self->model->major_core.dispersion->accept_as_destination(visitor, self->model->major_core.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "minor_core");
-    self->model->minor_core.dispersion->accept_as_destination(visitor, self->model->minor_core.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "major_shell");
-    self->model->major_shell.dispersion->accept_as_destination(visitor, self->model->major_shell.dispersion, disp_dict);
-    disp_dict = PyDict_GetItemString(self->dispersion, "minor_shell");
-    self->model->minor_shell.dispersion->accept_as_destination(visitor, self->model->minor_shell.dispersion, disp_dict);
-
-	
-	// Get input and determine whether we have to supply a 1D or 2D return value.
-	if ( !PyArg_ParseTuple(args,"O",&pars) ) {
-	    PyErr_SetString(CProlateModelError, 
-	    	"CProlateModel.run expects a q value.");
-		return NULL;
-	}
-	  
-	// Check params
-	if( PyList_Check(pars)==1) {
-		
-		// Length of list should be 2 for I(qx, qy))
-	    npars = PyList_GET_SIZE(pars); 
-	    if(npars!=2) {
-	    	PyErr_SetString(CProlateModelError, 
-	    		"CProlateModel.run expects a double or a list of dimension 2.");
-	    	return NULL;
-	    }
-	    // We have a vector q, get the qx and qy values at which
-	    // to evaluate I(qx,qy)
-	    qx_value = CProlateModel_readDouble(PyList_GET_ITEM(pars,0));
-	    qy_value = CProlateModel_readDouble(PyList_GET_ITEM(pars,1));
-	    return Py_BuildValue("d",(*(self->model))(qx_value,qy_value));
-
-	} else {
-
-		// We have a scalar q, we will evaluate I(q)
-		qx_value = CProlateModel_readDouble(pars);		
-		
-		return Py_BuildValue("d",(*(self->model))(qx_value));
-	}	
-}
-
-static PyObject * reset(CProlateModel *self, PyObject *args) {
-    
-
-    return Py_BuildValue("d",0.0);
-}
-
-static PyObject * set_dispersion(CProlateModel *self, PyObject *args) {
-	PyObject * disp;
-	const char * par_name;
-
-	if ( !PyArg_ParseTuple(args,"sO", &par_name, &disp) ) {
-	    PyErr_SetString(CProlateModelError,
-	    	"CProlateModel.set_dispersion expects a DispersionModel object.");
-		return NULL;
-	}
-	void *temp = PyCObject_AsVoidPtr(disp);
-	DispersionModel * dispersion = static_cast<DispersionModel *>(temp);
-
-
-	// Ugliness necessary to go from python to C
-	    // TODO: refactor this
-    if (!strcmp(par_name, "major_core")) {
-        self->model->major_core.dispersion = dispersion;
-    } else    if (!strcmp(par_name, "minor_core")) {
-        self->model->minor_core.dispersion = dispersion;
-    } else    if (!strcmp(par_name, "major_shell")) {
-        self->model->major_shell.dispersion = dispersion;
-    } else    if (!strcmp(par_name, "minor_shell")) {
-        self->model->minor_shell.dispersion = dispersion;
-    } else {
-	    PyErr_SetString(CProlateModelError,
-	    	"CProlateModel.set_dispersion expects a valid parameter name.");
-		return NULL;
-	}
-
-	DispersionVisitor* visitor = new DispersionVisitor();
-	PyObject * disp_dict = PyDict_New();
-	dispersion->accept_as_source(visitor, dispersion, disp_dict);
-	PyDict_SetItemString(self->dispersion, par_name, disp_dict);
-    return Py_BuildValue("i",1);
-}
-
-
-static PyMethodDef CProlateModel_methods[] = {
-    {"run",      (PyCFunction)run     , METH_VARARGS,
-      "Evaluate the model at a given Q or Q, phi"},
-    {"runXY",      (PyCFunction)runXY     , METH_VARARGS,
-      "Evaluate the model at a given Q or Qx, Qy"},
-      
-    {"evalDistribution",  (PyCFunction)evalDistribution , METH_VARARGS,
-      "Evaluate the model at a given Q or Qx, Qy vector "},
-    {"reset",    (PyCFunction)reset   , METH_VARARGS,
-      "Reset pair correlation"},
-    {"set_dispersion",      (PyCFunction)set_dispersion     , METH_VARARGS,
-      "Set the dispersion model for a given parameter"},
-   {NULL}
-};
-
-static PyTypeObject CProlateModelType = {
-    PyObject_HEAD_INIT(NULL)
-    0,                         /*ob_size*/
-    "CProlateModel",             /*tp_name*/
-    sizeof(CProlateModel),             /*tp_basicsize*/
-    0,                         /*tp_itemsize*/
-    (destructor)CProlateModel_dealloc, /*tp_dealloc*/
-    0,                         /*tp_print*/
-    0,                         /*tp_getattr*/
-    0,                         /*tp_setattr*/
-    0,                         /*tp_compare*/
-    0,                         /*tp_repr*/
-    0,                         /*tp_as_number*/
-    0,                         /*tp_as_sequence*/
-    0,                         /*tp_as_mapping*/
-    0,                         /*tp_hash */
-    0,                         /*tp_call*/
-    0,                         /*tp_str*/
-    0,                         /*tp_getattro*/
-    0,                         /*tp_setattro*/
-    0,                         /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
-    "CProlateModel objects",           /* tp_doc */
-    0,		               /* tp_traverse */
-    0,		               /* tp_clear */
-    0,		               /* tp_richcompare */
-    0,		               /* tp_weaklistoffset */
-    0,		               /* tp_iter */
-    0,		               /* tp_iternext */
-    CProlateModel_methods,             /* tp_methods */
-    CProlateModel_members,             /* tp_members */
-    0,                         /* tp_getset */
-    0,                         /* tp_base */
-    0,                         /* tp_dict */
-    0,                         /* tp_descr_get */
-    0,                         /* tp_descr_set */
-    0,                         /* tp_dictoffset */
-    (initproc)CProlateModel_init,      /* tp_init */
-    0,                         /* tp_alloc */
-    CProlateModel_new,                 /* tp_new */
-};
-
-
-//static PyMethodDef module_methods[] = {
-//    {NULL} 
-//};
-
-/**
- * Function used to add the model class to a module
- * @param module: module to add the class to
- */ 
-void addCProlateModel(PyObject *module) {
-	PyObject *d;
-	
-    if (PyType_Ready(&CProlateModelType) < 0)
-        return;
-
-    Py_INCREF(&CProlateModelType);
-    PyModule_AddObject(module, "CProlateModel", (PyObject *)&CProlateModelType);
-    
-    d = PyModule_GetDict(module);
-    CProlateModelError = PyErr_NewException("CProlateModel.error", NULL, NULL);
-    PyDict_SetItemString(d, "CProlateModelError", CProlateModelError);
-}
-
Index: sansmodels/src/sans/models/c_models/oblate.cpp
===================================================================
--- sansmodels/src/sans/models/c_models/oblate.cpp	(revision 975ec8e8211549489759b5a5ffe3b60607de065b)
+++ 	(revision )
@@ -1,235 +1,0 @@
-/**
-	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
- */
-
-/**
- * Scattering model classes
- * The classes use the IGOR library found in
- *   sansmodels/src/libigor
- *
- *	TODO: refactor so that we pull in the old sansmodels.c_extensions
- */
-
-#include <math.h>
-#include "models.hh"
-#include "parameters.hh"
-#include <stdio.h>
-using namespace std;
-
-extern "C" {
-	#include "libCylinder.h"
-	#include "oblate.h"
-}
-
-OblateModel :: OblateModel() {
-	scale      = Parameter(1.0);
-	major_core     = Parameter(200.0, true);
-	major_core.set_min(0.0);
-	minor_core     = Parameter(20.0, true);
-	minor_core.set_min(0.0);
-	major_shell   = Parameter(250.0, true);
-	major_shell.set_min(0.0);
-	minor_shell    = Parameter(30.0, true);
-	minor_shell.set_min(0.0);
-	contrast   = Parameter(1e-6);
-	sld_solvent = Parameter(6.3e-6);
-	background = Parameter(0.0);
-}
-
-/**
- * Function to evaluate 1D scattering function
- * The NIST IGOR library is used for the actual calculation.
- * @param q: q-value
- * @return: function value
- */
-double OblateModel :: operator()(double q) {
-	double dp[8];
-
-	// Fill parameter array for IGOR library
-	// Add the background after averaging
-	dp[0] = scale();
-	dp[1] = major_core();
-	dp[2] = minor_core();
-	dp[3] = major_shell();
-	dp[4] = minor_shell();
-	dp[5] = contrast();
-	dp[6] = sld_solvent();
-	dp[7] = 0.0;
-
-	// Get the dispersion points for the major core
-	vector<WeightPoint> weights_major_core;
-	major_core.get_weights(weights_major_core);
-
-	// Get the dispersion points for the minor core
-	vector<WeightPoint> weights_minor_core;
-	minor_core.get_weights(weights_minor_core);
-
-	// Get the dispersion points for the major shell
-	vector<WeightPoint> weights_major_shell;
-	major_shell.get_weights(weights_major_shell);
-
-	// Get the dispersion points for the minor_shell
-	vector<WeightPoint> weights_minor_shell;
-	minor_shell.get_weights(weights_minor_shell);
-
-
-	// Perform the computation, with all weight points
-	double sum = 0.0;
-	double norm = 0.0;
-
-	// Loop over major core weight points
-	for(int i=0; i<(int)weights_major_core.size(); i++) {
-		dp[1] = weights_major_core[i].value;
-
-		// Loop over minor core weight points
-		for(int j=0; j<(int)weights_minor_core.size(); j++) {
-			dp[2] = weights_minor_core[j].value;
-
-			// Loop over major shell weight points
-			for(int k=0; k<(int)weights_major_shell.size(); k++) {
-				dp[3] = weights_major_shell[k].value;
-
-				// Loop over minor shell weight points
-				for(int l=0; l<(int)weights_minor_shell.size(); l++) {
-					dp[4] = weights_minor_shell[l].value;
-
-					sum += weights_major_core[i].weight* weights_minor_core[j].weight * weights_major_shell[k].weight
-						* weights_minor_shell[l].weight * OblateForm(dp, q);
-					norm += weights_major_core[i].weight* weights_minor_core[j].weight * weights_major_shell[k].weight
-							* weights_minor_shell[l].weight;
-				}
-			}
-		}
-	}
-	return sum/norm + background();
-}
-
-/**
- * Function to evaluate 2D scattering function
- * @param q_x: value of Q along x
- * @param q_y: value of Q along y
- * @return: function value
- */
-/*
-double OblateModel :: operator()(double qx, double qy) {
-	double q = sqrt(qx*qx + qy*qy);
-
-	return (*this).operator()(q);
-}
-*/
-
-/**
- * Function to evaluate 2D scattering function
- * @param pars: parameters of the oblate
- * @param q: q-value
- * @param phi: angle phi
- * @return: function value
- */
-double OblateModel :: evaluate_rphi(double q, double phi) {
-	return (*this).operator()(q);
-}
-
-
-double OblateModel :: operator()(double qx, double qy) {
-	OblateParameters dp;
-	// Fill parameter array
-	dp.scale      = scale();
-	dp.major_core = major_core();
-	dp.minor_core = minor_core();
-	dp.major_shell = major_shell();
-	dp.minor_shell = minor_shell();
-	dp.contrast = contrast();
-	dp.sld_solvent = sld_solvent();
-	dp.background = background();
-	dp.axis_theta = axis_theta();
-	dp.axis_phi = axis_phi();
-
-	// Get the dispersion points for the major core
-	vector<WeightPoint> weights_major_core;
-	major_core.get_weights(weights_major_core);
-
-	// Get the dispersion points for the minor core
-	vector<WeightPoint> weights_minor_core;
-	minor_core.get_weights(weights_minor_core);
-
-	// Get the dispersion points for the major shell
-	vector<WeightPoint> weights_major_shell;
-	major_shell.get_weights(weights_major_shell);
-
-	// Get the dispersion points for the minor shell
-	vector<WeightPoint> weights_minor_shell;
-	minor_shell.get_weights(weights_minor_shell);
-
-
-	// Get angular averaging for theta
-	vector<WeightPoint> weights_theta;
-	axis_theta.get_weights(weights_theta);
-
-	// Get angular averaging for phi
-	vector<WeightPoint> weights_phi;
-	axis_phi.get_weights(weights_phi);
-
-	// Perform the computation, with all weight points
-	double sum = 0.0;
-	double norm = 0.0;
-
-	// Loop over major core weight points
-	for(int i=0; i< (int)weights_major_core.size(); i++) {
-		dp.major_core = weights_major_core[i].value;
-
-		// Loop over minor core weight points
-		for(int j=0; j< (int)weights_minor_core.size(); j++) {
-			dp.minor_core = weights_minor_core[j].value;
-
-			// Loop over major shell weight points
-			for(int k=0; k< (int)weights_major_shell.size(); k++) {
-				dp.major_shell = weights_major_shell[i].value;
-
-				// Loop over minor shell weight points
-				for(int l=0; l< (int)weights_minor_shell.size(); l++) {
-					dp.minor_shell = weights_minor_shell[l].value;
-
-					// Average over theta distribution
-					for(int m=0; m< (int)weights_theta.size(); m++) {
-						dp.axis_theta = weights_theta[m].value;
-
-						// Average over phi distribution
-						for(int n=0; n< (int)weights_phi.size(); n++) {
-							dp.axis_phi = weights_phi[n].value;
-
-							double _ptvalue = weights_major_core[i].weight *weights_minor_core[j].weight
-								* weights_major_shell[k].weight * weights_minor_shell[l].weight
-								* weights_theta[m].weight
-								* weights_phi[n].weight
-								* oblate_analytical_2DXY(&dp, qx, qy);
-							if (weights_theta.size()>1) {
-								_ptvalue *= sin(weights_theta[k].value);
-							}
-							sum += _ptvalue;
-
-							norm += weights_major_core[i].weight *weights_minor_core[j].weight
-								* weights_major_shell[k].weight * weights_minor_shell[l].weight
-								* weights_theta[m].weight * weights_phi[n].weight;
-						}
-					}
-				}
-			}
-		}
-	}
-	// Averaging in theta needs an extra normalization
-	// factor to account for the sin(theta) term in the
-	// integration (see documentation).
-	if (weights_theta.size()>1) norm = norm / asin(1.0);
-	return sum/norm + background();
-}
-
Index: sansmodels/src/sans/models/c_models/prolate.cpp
===================================================================
--- sansmodels/src/sans/models/c_models/prolate.cpp	(revision 8dc0b74600a8db8ce463144695eb91a5449d193c)
+++ 	(revision )
@@ -1,233 +1,0 @@
-/**
-	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
- */
-
-/**
- * Scattering model classes
- * The classes use the IGOR library found in
- *   sansmodels/src/libigor
- *
- *	TODO: refactor so that we pull in the old sansmodels.c_extensions
- */
-
-#include <math.h>
-#include "models.hh"
-#include "parameters.hh"
-#include <stdio.h>
-using namespace std;
-
-extern "C" {
-	#include "libCylinder.h"
-	#include "prolate.h"
-}
-
-ProlateModel :: ProlateModel() {
-	scale      = Parameter(1.0);
-	major_core     = Parameter(100.0, true);
-	major_core.set_min(0.0);
-	minor_core     = Parameter(50.0, true);
-	minor_core.set_min(0.0);
-	major_shell   = Parameter(110.0, true);
-	major_shell.set_min(0.0);
-	minor_shell    = Parameter(60.0, true);
-	minor_shell.set_min(0.0);
-	contrast   = Parameter(1e-6);
-	sld_solvent = Parameter(6.3e-6);
-	background = Parameter(0.0);
-}
-
-/**
- * Function to evaluate 1D scattering function
- * The NIST IGOR library is used for the actual calculation.
- * @param q: q-value
- * @return: function value
- */
-double ProlateModel :: operator()(double q) {
-	double dp[8];
-
-	// Fill parameter array for IGOR library
-	// Add the background after averaging
-	dp[0] = scale();
-	dp[1] = major_core();
-	dp[2] = minor_core();
-	dp[3] = major_shell();
-	dp[4] = minor_shell();
-	dp[5] = contrast();
-	dp[6] = sld_solvent();
-	dp[7] = 0.0;
-
-	// Get the dispersion points for the major core
-	vector<WeightPoint> weights_major_core;
-	major_core.get_weights(weights_major_core);
-
-	// Get the dispersion points for the minor core
-	vector<WeightPoint> weights_minor_core;
-	minor_core.get_weights(weights_minor_core);
-
-	// Get the dispersion points for the major shell
-	vector<WeightPoint> weights_major_shell;
-	major_shell.get_weights(weights_major_shell);
-
-	// Get the dispersion points for the minor_shell
-	vector<WeightPoint> weights_minor_shell;
-	minor_shell.get_weights(weights_minor_shell);
-
-
-	// Perform the computation, with all weight points
-	double sum = 0.0;
-	double norm = 0.0;
-
-	// Loop over major core weight points
-	for(int i=0; i<(int)weights_major_core.size(); i++) {
-		dp[1] = weights_major_core[i].value;
-
-		// Loop over minor core weight points
-		for(int j=0; j<(int)weights_minor_core.size(); j++) {
-			dp[2] = weights_minor_core[j].value;
-
-			// Loop over major shell weight points
-			for(int k=0; k<(int)weights_major_shell.size(); k++) {
-				dp[3] = weights_major_shell[k].value;
-
-				// Loop over minor shell weight points
-				for(int l=0; l<(int)weights_minor_shell.size(); l++) {
-					dp[4] = weights_minor_shell[l].value;
-
-					sum += weights_major_core[i].weight* weights_minor_core[j].weight * weights_major_shell[k].weight
-						* weights_minor_shell[l].weight * ProlateForm(dp, q);
-					norm += weights_major_core[i].weight* weights_minor_core[j].weight * weights_major_shell[k].weight
-							* weights_minor_shell[l].weight;
-				}
-			}
-		}
-	}
-	return sum/norm + background();
-}
-
-/**
- * Function to evaluate 2D scattering function
- * @param q_x: value of Q along x
- * @param q_y: value of Q along y
- * @return: function value
- */
-double ProlateModel :: operator()(double qx, double qy) {
-	double q = sqrt(qx*qx + qy*qy);
-
-	return (*this).operator()(q);
-}
-
-/**
- * Function to evaluate 2D scattering function
- * @param pars: parameters of the prolate
- * @param q: q-value
- * @param phi: angle phi
- * @return: function value
- */
-double ProlateModel :: evaluate_rphi(double q, double phi) {
-	return (*this).operator()(q);
-}
-/*
-double ProlateModel :: operator()(double qx, double qy) {
-	ProlateParameters dp;
-	// Fill parameter array
-	dp.scale      = scale();
-	dp.major_core = major_core();
-	dp.minor_core = minor_core();
-	dp.major_shell = major_shell();
-	dp.minor_shell = minor_shell();
-	dp.contrast = contrast();
-	dp.sld_solvent = sld_solvent();
-	dp.background = background();
-	dp.axis_theta = axis_theta();
-	dp.axis_phi = axis_phi();
-
-	// Get the dispersion points for the major core
-	vector<WeightPoint> weights_major_core;
-	major_core.get_weights(weights_major_core);
-
-	// Get the dispersion points for the minor core
-	vector<WeightPoint> weights_minor_core;
-	minor_core.get_weights(weights_minor_core);
-
-	// Get the dispersion points for the major shell
-	vector<WeightPoint> weights_major_shell;
-	major_shell.get_weights(weights_major_shell);
-
-	// Get the dispersion points for the minor shell
-	vector<WeightPoint> weights_minor_shell;
-	minor_shell.get_weights(weights_minor_shell);
-
-
-	// Get angular averaging for theta
-	vector<WeightPoint> weights_theta;
-	axis_theta.get_weights(weights_theta);
-
-	// Get angular averaging for phi
-	vector<WeightPoint> weights_phi;
-	axis_phi.get_weights(weights_phi);
-
-	// Perform the computation, with all weight points
-	double sum = 0.0;
-	double norm = 0.0;
-
-	// Loop over major core weight points
-	for(int i=0; i< (int)weights_major_core.size(); i++) {
-		dp.major_core = weights_major_core[i].value;
-
-		// Loop over minor core weight points
-		for(int j=0; j< (int)weights_minor_core.size(); j++) {
-			dp.minor_core = weights_minor_core[j].value;
-
-			// Loop over major shell weight points
-			for(int k=0; k< (int)weights_major_shell.size(); k++) {
-				dp.major_shell = weights_major_shell[i].value;
-
-				// Loop over minor shell weight points
-				for(int l=0; l< (int)weights_minor_shell.size(); l++) {
-					dp.minor_shell = weights_minor_shell[l].value;
-
-					// Average over theta distribution
-					for(int m=0; m< (int)weights_theta.size(); m++) {
-						dp.axis_theta = weights_theta[m].value;
-
-						// Average over phi distribution
-						for(int n=0; n< (int)weights_phi.size(); n++) {
-							dp.axis_phi = weights_phi[n].value;
-
-							double _ptvalue = weights_major_core[i].weight *weights_minor_core[j].weight
-								* weights_major_shell[k].weight * weights_minor_shell[l].weight
-								* weights_theta[m].weight
-								* weights_phi[n].weight
-								* prolate_analytical_2DXY(&dp, qx, qy);
-							if (weights_theta.size()>1) {
-								_ptvalue *= sin(weights_theta[k].value);
-							}
-							sum += _ptvalue;
-
-							norm += weights_major_core[i].weight *weights_minor_core[j].weight
-								* weights_major_shell[k].weight * weights_minor_shell[l].weight
-								* weights_theta[m].weight * weights_phi[n].weight;
-						}
-					}
-				}
-			}
-		}
-	}
-	// Averaging in theta needs an extra normalization
-	// factor to account for the sin(theta) term in the
-	// integration (see documentation).
-	if (weights_theta.size()>1) norm = norm / asin(1.0);
-	return sum/norm + background();
-}
-
-*/
