Index: sansmodels/src/sans/models/BaseComponent.py
===================================================================
--- sansmodels/src/sans/models/BaseComponent.py	(revision 19ef1e5ae68790327a2e013ccbd3a5f5f032c443)
+++ sansmodels/src/sans/models/BaseComponent.py	(revision c9636f7de6fe28781d52b93f5c1323e695a97e27)
@@ -31,5 +31,5 @@
         #of the given model, exception or possible use
         self.description=''
-        #list of parameter that cannot be fitted
+        #list of parameter that can be fitted
         self.fixed= []
            
@@ -41,5 +41,9 @@
    
     def is_fittable(self, par_name):
-        return par_name.lower() not in self.fixed
+        """
+            Check if a given parameter is fittable or not
+            @param par_name: the parameter name to check 
+        """
+        return par_name.lower() in self.fixed
         #For the future
         #return self.params[str(par_name)].is_fittable()
Index: sansmodels/src/sans/models/MultiplicationModel.py
===================================================================
--- sansmodels/src/sans/models/MultiplicationModel.py	(revision c9636f7de6fe28781d52b93f5c1323e695a97e27)
+++ sansmodels/src/sans/models/MultiplicationModel.py	(revision c9636f7de6fe28781d52b93f5c1323e695a97e27)
@@ -0,0 +1,113 @@
+
+from sans.models.BaseComponent import BaseComponent
+import numpy, math
+
+class MultiplicationModel(BaseComponent):
+    """
+        Use for S(Q)*P(Q).
+        Perform multplication of two models.
+        Contains the models parameters combined.
+    """
+    def __init__(self, model1, model2 ):
+        BaseComponent.__init__(self)
+
+        
+        ## Name of the model
+        self.name = model1.name +" * "+ model2.name
+        ## model description
+        self.description= model1.name +" * "+ model2.name
+        self.description +="see %s description and %s description"%(model1.name,
+                                                                     model2.name)
+        self.model1= model1
+        self.model2= model2
+        ## dispersion
+        self.dispersion = {}
+        self._set_dispersion()
+        ## Define parameters
+        self.params = {}
+        self._set_params()
+        ## Parameter details [units, min, max]
+        self.details = {}
+        self._set_details()
+        #list of parameter that can be fitted
+        self.fixed= []  
+        self._set_fixed_params()  
+        
+          
+    def _set_dispersion(self):
+        """
+           combined the two models dispersions
+        """
+        for name , value in self.model1.dispersion.iteritems():
+            self.dispersion[name]= value
+            
+        for name , value in self.model2.dispersion.iteritems():
+            if not name in self.dispersion.keys():
+                self.dispersion[name]= value
+                
+                
+    def _set_params(self):
+        """
+            Concatenate the parameters of the two models to create
+            this model parameters 
+        """
+        for name , value in self.model1.params.iteritems():
+            self.params[name]= value
+            
+        for name , value in self.model2.params.iteritems():
+            if not name in self.params.keys():
+                self.params[name]= value
+            
+    def _set_details(self):
+        """
+            Concatenate details of the two models to create
+            this model details 
+        """
+        for name ,detail in self.model1.details.iteritems():
+            self.details[name]= detail
+            
+        for name , detail in self.model2.details.iteritems():
+            if not name in self.details.keys():
+                self.details[name]= detail
+                
+    def _set_fixed_params(self):
+        """
+             fill the self.fixed list with the two models fixed list
+        """
+        for item in self.model1.fixed:
+            self.fixed.append(item)
+            
+        for item in self.model2.fixed:
+            if not item in self.fixed:
+                self.fixed.append(item)
+        self.fixed.sort()
+                
+                
+    def run(self, x = 0.0):
+        """ Evaluate the model
+            @param x: input q-value (float or [float, float] as [r, theta])
+            @return: (DAB value)
+        """
+        return self.model1.run(x)* self.model2.run(x)
+   
+    def runXY(self, x = 0.0):
+        """ Evaluate the model
+            @param x: input q-value (float or [float, float] as [qx, qy])
+            @return: DAB value
+        """
+        return self.model1.runXY(x)* self.model2.runXY(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
+        """
+        if parameter in self.model1.getParamList():
+            return self.model1.set_dispersion(parameter, dispersion)
+        else:
+            return self.model2.set_dispersion(parameter, dispersion)
+
+
+
+    
Index: sansmodels/src/sans/models/test/utest_modelmultiplication.py
===================================================================
--- sansmodels/src/sans/models/test/utest_modelmultiplication.py	(revision c9636f7de6fe28781d52b93f5c1323e695a97e27)
+++ sansmodels/src/sans/models/test/utest_modelmultiplication.py	(revision c9636f7de6fe28781d52b93f5c1323e695a97e27)
@@ -0,0 +1,74 @@
+"""
+    Unit tests for specific models
+    @author: Gervaise Alina / UTK
+"""
+
+import unittest, numpy,math
+
+from sans.models.MultiplicationModel import MultiplicationModel
+from sans.models.SphereModel import SphereModel
+from sans.models.SquareWellStructure import SquareWellStructure
+      
+class TestDisperser(unittest.TestCase):
+    """ Unit tests for sphere model * SquareWellStructure"""
+    model1= SphereModel()
+    model2= SquareWellStructure()
+    model3= MultiplicationModel(model1, model2)
+    details={}
+    details['scale'] = ['', None, None]
+    details['radius'] = ['A', None, None]
+    details['contrast'] = ['A-2', None, None]
+    details['background'] = ['cm-1', None, None]
+    details['volfraction'] = ['', None, None]
+    details['welldepth'] = ['kT', None, None]
+    details['wellwidth'] = ['', None, None]
+    
+    ## fittable parameters
+    fixed=[]
+    fixed=['radius.width']
+    def testMultiplicationModel(self):
+        """ Test Multiplication  sphere with SquareWellStructure"""
+        ## test details dictionary
+        self.assertEqual(self.model3.details, self.details)
+        
+        ## test parameters list
+        list3= self.model3.getParamList()
+        for item in self.model1.getParamList():
+            self.assert_(item in list3)
+        for item in self.model2.getParamList():
+            self.assert_(item in list3)
+            
+        ## test set value for parameters and get paramaters
+        self.model3.setParam("scale", 15)
+        self.assertEqual(self.model3.getParam("scale"), 15)
+        self.model3.setParam("radius", 20)
+        self.assertEqual(self.model3.getParam("radius"), 20)
+        self.model3.setParam("radius.width", 15)
+        self.assertEqual(self.model3.getParam("radius.width"), 15)
+        
+        ## Dispersity 
+        list3= self.model3.getDispParamList()
+        self.assertEqual(list3, ['radius.npts', 'radius.nsigmas', 'radius.width'])
+        
+        from sans.models.dispersion_models import ArrayDispersion
+        disp_th = ArrayDispersion()
+        
+        values_th = numpy.zeros(100)
+        weights   = numpy.zeros(100)
+        for i in range(100):
+            values_th[i]=(math.pi/99.0*i)
+            weights[i]=(1.0)
+    
+        disp_th.set_weights(values_th, weights)
+        
+        self.model3.set_dispersion('radius', disp_th)
+        
+        val_1d = self.model3.run(math.sqrt(0.0002))
+        val_2d = self.model3.runXY([0.01,0.01]) 
+        
+        self.assertTrue(math.fabs(val_1d-val_2d)/val_1d < 0.02)
+        model4= self.model3.clone()
+        self.assertEqual(model4.getParam("radius"), 20)
+        
+if __name__ == '__main__':
+    unittest.main()
