Index: sansmodels/src/sans/models/MultiplicationModel.py
===================================================================
--- sansmodels/src/sans/models/MultiplicationModel.py	(revision 8b677ec179ed4330f2cd7aa10775e6423875e7ad)
+++ sansmodels/src/sans/models/MultiplicationModel.py	(revision 1affe6428c00b7595341313f851a2277f11ea93e)
@@ -6,28 +6,26 @@
 class MultiplicationModel(BaseComponent):
     """
-        Use for P(Q)*S(Q); function call must be in order of P(Q) and then S(Q).
-        Perform multiplication of two models.
-        Contains the models parameters combined.
+        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 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'.
     """
-    def __init__(self, model1, model2 ):
+    def __init__(self, p_model, s_model ):
         BaseComponent.__init__(self)
-
-       
+        """
+            @param p_model: form factor, P(Q)
+            @param s_model: structure factor, S(Q)
+        """
+
         ## Setting  model name model description
         self.description=""
-        if  model1.name != "NoStructure" and  model2.name != "NoStructure":
-             self.name = model1.name +" * "+ model2.name
-             self.description= self.name+"\n"
-             self.fill_description(model1, model2)
-        elif  model2.name != "NoStructure":
-            self.name = model2.name
-            self.description= model2.description
-        else :
-            self.name = model1.name
-            self.description= model1.description
+        self.name = p_model.name +" * "+ s_model.name
+        self.description= self.name+"\n"
+        self.fill_description(p_model, s_model)
                         
-        
-        self.model1= model1
-        self.model2= model2
+        ##models 
+        self.p_model= p_model
+        self.s_model= s_model
         
        
@@ -41,8 +39,8 @@
         self._set_fixed_params()  
         ## parameters with orientation
-        for item in self.model1.orientation_params:
+        for item in self.p_model.orientation_params:
             self.orientation_params.append(item)
             
-        for item in self.model2.orientation_params:
+        for item in self.s_model.orientation_params:
             if not item in self.orientation_params:
                 self.orientation_params.append(item)
@@ -58,6 +56,6 @@
         obj.details    = copy.deepcopy(self.details)
         obj.dispersion = copy.deepcopy(self.dispersion)
-        obj.model1  = self.model1.clone()
-        obj.model2  = self.model2.clone()
+        obj.p_model  = self.p_model.clone()
+        obj.s_model  = self.s_model.clone()
         
         return obj
@@ -67,18 +65,10 @@
         """
            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():
-            ## All S(Q) has only 'effect_radius' for dispersion which 
-            #    will not be allowed for now.
-            if not name in self.dispersion.keys():
-                if name != 'effect_radius':
-                    self.dispersion[name]= value
-
-                    
-                
-                
+           Polydispersion should not be applied to s_model
+        """
+        ##set dispersion only from p_model 
+        for name , value in self.p_model.dispersion.iteritems():
+            self.dispersion[name]= value                           
+
     def _set_params(self):
         """
@@ -86,13 +76,12 @@
             this model parameters 
         """
-        dia_rad = 0
-        for name , value in self.model1.params.iteritems():
+
+        for name , value in self.p_model.params.iteritems():
             self.params[name]= value
             
-        for name , value in self.model2.params.iteritems():
-            if not name in self.params.keys():
-                #effect_radius is not treated as a parameter anymore.
-                if name != 'effect_radius': 
-                    self.params[name]= value
+        for name , value in self.s_model.params.iteritems():
+            #Remove the effect_radius from the (P*S) model parameters.
+            if not name in self.params.keys() and name != 'effect_radius':
+                self.params[name]= value
             
     def _set_details(self):
@@ -101,11 +90,10 @@
             this model details 
         """
-        for name ,detail in self.model1.details.iteritems():
+        for name ,detail in self.p_model.details.iteritems():
             self.details[name]= detail
             
-        for name , detail in self.model2.details.iteritems():
-            if not name in self.details.keys(): 
-                if name != 'effect_radius': 
-                    self.details[name]= detail
+        for name , detail in self.s_model.details.iteritems():
+            if not name in self.details.keys():
+                self.details[name]= detail
                 
     def setParam(self, name, value):
@@ -119,9 +107,9 @@
         self._setParamHelper( name, value)
 
-        if name in self.model1.getParamList():
-            self.model1.setParam( name, value)
-
-        if name in self.model2.getParamList():
-            self.model2.setParam( name, value)
+        if name in self.p_model.getParamList():
+            self.p_model.setParam( name, value)
+
+        if name in self.s_model.getParamList():
+            self.s_model.setParam( name, value)
 
         self._setParamHelper( name, value)
@@ -152,12 +140,8 @@
     def _set_fixed_params(self):
         """
-             fill the self.fixed list with the two models fixed list
-        """
-        for item in self.model1.fixed:
+             fill the self.fixed list with the p_model fixed list
+        """
+        for item in self.p_model.fixed:
             self.fixed.append(item)
-        #S(Q) should not have fixed items for P*S for now.
-        #for item in self.model2.fixed:
-        #    if not item in self.fixed:
-        #        self.fixed.append(item)
 
         self.fixed.sort()
@@ -169,12 +153,11 @@
             @return: (DAB value)
         """
-        #Reset radius of model2 just before the run
-        effective_radius = None   
-        effective_radius = self.model1.calculate_ER()
-        if effective_radius !=None:         
-            self.model2.setParam( 'effect_radius',effective_radius)
-        
-        return self.model1.run(x)*self.model2.run(x)
-   
+
+        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)
+
     def runXY(self, x = 0.0):
         """ Evaluate the model
@@ -183,12 +166,10 @@
         """
         
-        #Reset radius of model2 just before the run
-        effective_radius = None    
-        effective_radius = self.model1.calculate_ER()
-        if effective_radius !=None:         
-            self.model2.setParam( 'effect_radius',effective_radius)
-
-        return self.model1.runXY(x)* self.model2.runXY(x)
-    
+        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)
+
     def set_dispersion(self, parameter, dispersion):
         """
@@ -199,11 +180,6 @@
         value= None
         try:
-            if parameter in self.model1.dispersion.keys():
-                value= self.model1.set_dispersion(parameter, dispersion)
-            #There is no dispersion for the structure factors(S(Q)). 
-            #ToDo: need to decide whether or not the dispersion for S(Q) has to be considered for P*S.  
-            #elif parameter in self.model2.dispersion.keys():
-            #    if item != 'effect_radius':
-            #        value= self.model2.set_dispersion(parameter, dispersion)
+            if parameter in self.p_model.dispersion.keys():
+                value= self.p_model.set_dispersion(parameter, dispersion)
             self._set_dispersion()
             return value
@@ -211,15 +187,15 @@
             raise 
 
-    def fill_description(self, model1, model2):
+    def fill_description(self, p_model, s_model):
         """
             Fill the description for P(Q)*S(Q)
         """
         description = ""
-        description += "Note:1) The effect_radius (effective radius) of %s \n"% (model2.name)
+        description += "Note:1) The effect_radius (effective radius) of %s \n"% (s_model.name)
         description +="             is automatically calculated from size parameters (radius...).\n"
         description += "         2) For non-spherical shape, this approximation is valid \n"
-        description += "            only for highly dilute systems. Thus, use it at your own risk.\n"
-        description +="See %s description and %s description \n"%( model1.name,model2.name )
-        description += "        for details."
+        description += "            only for limited systems. Thus, use it at your own risk.\n"
+        description +="See %s description and %s description \n"%( p_model.name, s_model.name )
+        description += "        for details of individual models."
         self.description += description
     
