Index: sansmodels/src/sans/models/MultiplicationModel.py
===================================================================
--- sansmodels/src/sans/models/MultiplicationModel.py	(revision fe9c19b40dbe89e6d4c6ac8339eb8e3b843f7ab5)
+++ sansmodels/src/sans/models/MultiplicationModel.py	(revision c52f66f31ac56768461f6de337f16537426fd3c0)
@@ -7,6 +7,8 @@
     """
         Use for P(Q)*S(Q); function call must be in the order of P(Q) and then S(Q):
-        The model parameters are combined from both models, P(Q) and S(Q), except 'effective_radius' of S(Q)
-        which will be calculated from P(Q) via calculate_ER().
+        The model parameters are combined from both models, P(Q) and S(Q), except 1) 'effect_radius' of S(Q)
+        which will be calculated from P(Q) via calculate_ER(), 
+        and 2) 'scale' in P model which is synchronized w/ volfraction in S 
+        then P*S is multiplied by a new param, 'scale_factor'.
         The polydispersion is applicable only to P(Q), not to S(Q).
         Note: P(Q) refers to 'form factor' model while S(Q) does to 'structure factor'.
@@ -24,5 +26,11 @@
         self.description= self.name+"\n"
         self.fill_description(p_model, s_model)
-                        
+
+        ## Define parameters
+        self.params = {}
+
+        ## Parameter details [units, min, max]
+        self.details = {}
+                     
         ##models 
         self.p_model= p_model
@@ -34,6 +42,11 @@
         ## Define parameters
         self._set_params()
+        ## New parameter:Scaling factor
+        self.params['scale_factor'] = 1
+        
         ## Parameter details [units, min, max]
         self._set_details()
+        self.details['scale_factor'] = ['',     None, None]
+        
         #list of parameter that can be fitted
         self._set_fixed_params()  
@@ -78,5 +91,6 @@
 
         for name , value in self.p_model.params.iteritems():
-            self.params[name]= value
+            if not name in self.params.keys() and name != 'scale':
+                self.params[name]= value
             
         for name , value in self.s_model.params.iteritems():
@@ -84,4 +98,9 @@
             if not name in self.params.keys() and name != 'effect_radius':
                 self.params[name]= value
+                
+        # Set "scale and effec_radius to P and S model as initializing
+        # since run P*S comes from P and S separately.
+        self._set_scale_factor()
+        self._set_effect_radius()       
             
     def _set_details(self):
@@ -91,9 +110,28 @@
         """
         for name ,detail in self.p_model.details.iteritems():
-            self.details[name]= detail
+            if name != 'scale':
+                self.details[name]= detail
             
         for name , detail in self.s_model.details.iteritems():
-            if not name in self.details.keys():
+            if not name in self.details.keys() or name != 'effect_radius':
                 self.details[name]= detail
+    
+    def _set_scale_factor(self):
+        """
+            Set scale=volfraction to P model
+        """
+        value = self.params['volfraction']
+        if value != None: 
+            self.p_model.setParam( 'scale', value)
+            
+            
+    def _set_effect_radius(self):
+        """
+            Set effective radius to S(Q) model
+        """
+        effective_radius = self.p_model.calculate_ER()
+        #Reset the effective_radius of s_model just before the run
+        if effective_radius != None and effective_radius != NotImplemented:
+            self.s_model.setParam('effect_radius',effective_radius)
                 
     def setParam(self, name, value):
@@ -104,14 +142,22 @@
             @param value: value of the parameter
         """
-
+        # set param to P*S model
         self._setParamHelper( name, value)
-
-        if name in self.p_model.getParamList():
+        
+        ## setParam to p model 
+        # set 'scale' in P(Q) equal to volfraction 
+        if name == 'volfraction':
+            self._set_scale_factor()
+        elif name in self.p_model.getParamList():
             self.p_model.setParam( name, value)
-
+        
+        ## setParam to s model 
+        # This is a little bit abundant: Todo: find better way         
+        self._set_effect_radius()
         if name in self.s_model.getParamList():
             self.s_model.setParam( name, value)
-
-        self._setParamHelper( name, value)
+            
+
+        #self._setParamHelper( name, value)
         
     def _setParamHelper(self, name, value):
@@ -153,10 +199,8 @@
             @return: (DAB value)
         """
-
-        effective_radius = self.p_model.calculate_ER()
-        #Reset the effective_radius of s_model just before the run
-        if effective_radius != None and effective_radius != NotImplemented:
-            self.s_model.setParam('effect_radius',effective_radius)                       
-        return self.p_model.run(x)*self.s_model.run(x)
+        # set effective radius and scaling factor before run
+        self._set_effect_radius()
+        self._set_scale_factor()
+        return self.params['scale_factor']*self.p_model.run(x)*self.s_model.run(x)
 
     def runXY(self, x = 0.0):
@@ -164,11 +208,9 @@
             @param x: input q-value (float or [float, float] as [qx, qy])
             @return: DAB value
-        """
-        
-        effective_radius = self.p_model.calculate_ER()
-        #Reset the effective_radius of s_model just before the run
-        if effective_radius != None and effective_radius != NotImplemented:
-            self.s_model.setParam('effect_radius',effective_radius)          
-        return self.p_model.runXY(x)* self.s_model.runXY(x)
+        """  
+        # set effective radius and scaling factor before run
+        self._set_effect_radius()
+        self._set_scale_factor()
+        return self.params['scale_factor']*self.p_model.runXY(x)* self.s_model.runXY(x)
 
     def set_dispersion(self, parameter, dispersion):
Index: sansmodels/src/sans/models/test/utest_modelmultiplication.py
===================================================================
--- sansmodels/src/sans/models/test/utest_modelmultiplication.py	(revision c1e865ac18560cedf7ced1a814746a2d84fba9db)
+++ sansmodels/src/sans/models/test/utest_modelmultiplication.py	(revision c52f66f31ac56768461f6de337f16537426fd3c0)
@@ -47,5 +47,6 @@
 
         for item in self.model.getParamList():
-            self.assert_(item in list3)
+            if not 'scale' in item: 
+                self.assert_(item in list3)
         for item in self.model2.getParamList():
             #model3 parameters should not include effect_radius*
@@ -54,10 +55,13 @@
             
         ## test set value for parameters and get paramaters
-        self.model3.setParam("scale", 15)
-        self.assertEqual(self.model3.getParam("scale"), 15)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 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)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 15)
+        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale"))
         
         ## Dispersity 
@@ -126,5 +130,6 @@
 
         for item in self.model.getParamList():
-            self.assert_(item in list3)
+            if not 'scale' in item: 
+                self.assert_(item in list3)
         for item in self.model2.getParamList():
             #model3 parameters should not include effect_radius*
@@ -133,10 +138,13 @@
             
         ## test set value for parameters and get paramaters
-        self.model3.setParam("scale", 15)
-        self.assertEqual(self.model3.getParam("scale"), 15)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 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)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 15)
+        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale"))
         
         ## Dispersity 
@@ -204,5 +212,6 @@
 
         for item in self.model.getParamList():
-            self.assert_(item in list3)
+            if not 'scale' in item: 
+                self.assert_(item in list3)
         for item in self.model2.getParamList():
             #model3 parameters should not include effect_radius*
@@ -211,10 +220,13 @@
             
         ## test set value for parameters and get paramaters
-        self.model3.setParam("scale", 15)
-        self.assertEqual(self.model3.getParam("scale"), 15)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 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)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 15)
+        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale"))
         
         ## Dispersity 
@@ -283,5 +295,6 @@
 
         for item in self.model.getParamList():
-            self.assert_(item in list3)
+            if not 'scale' in item: 
+                self.assert_(item in list3)
         for item in self.model2.getParamList():
             #model3 parameters should not include effect_radius*
@@ -290,10 +303,13 @@
             
         ## test set value for parameters and get paramaters
-        self.model3.setParam("scale", 15)
-        self.assertEqual(self.model3.getParam("scale"), 15)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 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)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 15)
+        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale"))
         
         ## Dispersity 
@@ -365,5 +381,6 @@
 
         for item in self.model.getParamList():
-            self.assert_(item in list3)
+            if not 'scale' in item: 
+                self.assert_(item in list3)
         for item in self.model2.getParamList():
             #model3 parameters should not include effect_radius*
@@ -372,10 +389,13 @@
             
         ## test set value for parameters and get paramaters
-        self.model3.setParam("scale", 15)
-        self.assertEqual(self.model3.getParam("scale"), 15)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 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)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 15)
+        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale"))
         
         ## Dispersity 
@@ -443,5 +463,7 @@
 
         for item in self.model.getParamList():
-            self.assert_(item in list3)
+            #model3 parameters should not include scale*
+            if not 'scale' in item: 
+                self.assert_(item in list3)
         for item in self.model2.getParamList():
             #model3 parameters should not include effect_radius*
@@ -450,10 +472,15 @@
             
         ## test set value for parameters and get paramaters
-        self.model3.setParam("scale", 15)
-        self.assertEqual(self.model3.getParam("scale"), 15)
+        #self.model3.setParam("scale", 15)
+        #self.assertEqual(self.model3.getParam("scale"), 15)
+        self.model3.setParam("scale_factor", 0.1)
+        self.assertEqual(self.model3.getParam("scale_factor"), 0.1)
         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)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 15)
+        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale"))
         
         ## Dispersity 
@@ -521,5 +548,6 @@
 
         for item in self.model.getParamList():
-            self.assert_(item in list3)
+            if not 'scale' in item: 
+                self.assert_(item in list3)
         for item in self.model2.getParamList():
             #model3 parameters should not include effect_radius*
@@ -528,10 +556,13 @@
             
         ## test set value for parameters and get paramaters
-        self.model3.setParam("scale", 15)
-        self.assertEqual(self.model3.getParam("scale"), 15)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 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)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 15)
+        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale"))
         
         ## Dispersity 
@@ -599,5 +630,6 @@
 
         for item in self.model.getParamList():
-            self.assert_(item in list3)
+            if not 'scale' in item:  
+                self.assert_(item in list3)
         for item in self.model2.getParamList():
             #model3 parameters should not include effect_radius*
@@ -606,10 +638,15 @@
             
         ## test set value for parameters and get paramaters
-        self.model3.setParam("scale", 15)
-        self.assertEqual(self.model3.getParam("scale"), 15)
+        #self.model3.setParam("scale", 15)
+        #self.assertEqual(self.model3.getParam("scale"), 15)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 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)
+        self.model3.setParam("scale_factor", 15)
+        self.assertEqual(self.model3.getParam("scale_factor"), 15)
+        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale"))
         
         ## Dispersity 
