Changeset c52f66f in sasview for sansmodels/src


Ignore:
Timestamp:
Mar 29, 2010 5:47:59 PM (15 years ago)
Author:
Jae Cho <jhjcho@…>
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
6546e4b
Parents:
277fad8
Message:

improved the P*S function wrt user interface and updated the unit test due to the changes.

Location:
sansmodels/src/sans/models
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • sansmodels/src/sans/models/MultiplicationModel.py

    rfe9c19b4 rc52f66f  
    77    """ 
    88        Use for P(Q)*S(Q); function call must be in the order of P(Q) and then S(Q): 
    9         The model parameters are combined from both models, P(Q) and S(Q), except 'effective_radius' of S(Q) 
    10         which will be calculated from P(Q) via calculate_ER(). 
     9        The model parameters are combined from both models, P(Q) and S(Q), except 1) 'effect_radius' of S(Q) 
     10        which will be calculated from P(Q) via calculate_ER(),  
     11        and 2) 'scale' in P model which is synchronized w/ volfraction in S  
     12        then P*S is multiplied by a new param, 'scale_factor'. 
    1113        The polydispersion is applicable only to P(Q), not to S(Q). 
    1214        Note: P(Q) refers to 'form factor' model while S(Q) does to 'structure factor'. 
     
    2426        self.description= self.name+"\n" 
    2527        self.fill_description(p_model, s_model) 
    26                          
     28 
     29        ## Define parameters 
     30        self.params = {} 
     31 
     32        ## Parameter details [units, min, max] 
     33        self.details = {} 
     34                      
    2735        ##models  
    2836        self.p_model= p_model 
     
    3442        ## Define parameters 
    3543        self._set_params() 
     44        ## New parameter:Scaling factor 
     45        self.params['scale_factor'] = 1 
     46         
    3647        ## Parameter details [units, min, max] 
    3748        self._set_details() 
     49        self.details['scale_factor'] = ['',     None, None] 
     50         
    3851        #list of parameter that can be fitted 
    3952        self._set_fixed_params()   
     
    7891 
    7992        for name , value in self.p_model.params.iteritems(): 
    80             self.params[name]= value 
     93            if not name in self.params.keys() and name != 'scale': 
     94                self.params[name]= value 
    8195             
    8296        for name , value in self.s_model.params.iteritems(): 
     
    8498            if not name in self.params.keys() and name != 'effect_radius': 
    8599                self.params[name]= value 
     100                 
     101        # Set "scale and effec_radius to P and S model as initializing 
     102        # since run P*S comes from P and S separately. 
     103        self._set_scale_factor() 
     104        self._set_effect_radius()        
    86105             
    87106    def _set_details(self): 
     
    91110        """ 
    92111        for name ,detail in self.p_model.details.iteritems(): 
    93             self.details[name]= detail 
     112            if name != 'scale': 
     113                self.details[name]= detail 
    94114             
    95115        for name , detail in self.s_model.details.iteritems(): 
    96             if not name in self.details.keys(): 
     116            if not name in self.details.keys() or name != 'effect_radius': 
    97117                self.details[name]= detail 
     118     
     119    def _set_scale_factor(self): 
     120        """ 
     121            Set scale=volfraction to P model 
     122        """ 
     123        value = self.params['volfraction'] 
     124        if value != None:  
     125            self.p_model.setParam( 'scale', value) 
     126             
     127             
     128    def _set_effect_radius(self): 
     129        """ 
     130            Set effective radius to S(Q) model 
     131        """ 
     132        effective_radius = self.p_model.calculate_ER() 
     133        #Reset the effective_radius of s_model just before the run 
     134        if effective_radius != None and effective_radius != NotImplemented: 
     135            self.s_model.setParam('effect_radius',effective_radius) 
    98136                 
    99137    def setParam(self, name, value): 
     
    104142            @param value: value of the parameter 
    105143        """ 
    106  
     144        # set param to P*S model 
    107145        self._setParamHelper( name, value) 
    108  
    109         if name in self.p_model.getParamList(): 
     146         
     147        ## setParam to p model  
     148        # set 'scale' in P(Q) equal to volfraction  
     149        if name == 'volfraction': 
     150            self._set_scale_factor() 
     151        elif name in self.p_model.getParamList(): 
    110152            self.p_model.setParam( name, value) 
    111  
     153         
     154        ## setParam to s model  
     155        # This is a little bit abundant: Todo: find better way          
     156        self._set_effect_radius() 
    112157        if name in self.s_model.getParamList(): 
    113158            self.s_model.setParam( name, value) 
    114  
    115         self._setParamHelper( name, value) 
     159             
     160 
     161        #self._setParamHelper( name, value) 
    116162         
    117163    def _setParamHelper(self, name, value): 
     
    153199            @return: (DAB value) 
    154200        """ 
    155  
    156         effective_radius = self.p_model.calculate_ER() 
    157         #Reset the effective_radius of s_model just before the run 
    158         if effective_radius != None and effective_radius != NotImplemented: 
    159             self.s_model.setParam('effect_radius',effective_radius)                        
    160         return self.p_model.run(x)*self.s_model.run(x) 
     201        # set effective radius and scaling factor before run 
     202        self._set_effect_radius() 
     203        self._set_scale_factor() 
     204        return self.params['scale_factor']*self.p_model.run(x)*self.s_model.run(x) 
    161205 
    162206    def runXY(self, x = 0.0): 
     
    164208            @param x: input q-value (float or [float, float] as [qx, qy]) 
    165209            @return: DAB value 
    166         """ 
    167          
    168         effective_radius = self.p_model.calculate_ER() 
    169         #Reset the effective_radius of s_model just before the run 
    170         if effective_radius != None and effective_radius != NotImplemented: 
    171             self.s_model.setParam('effect_radius',effective_radius)           
    172         return self.p_model.runXY(x)* self.s_model.runXY(x) 
     210        """   
     211        # set effective radius and scaling factor before run 
     212        self._set_effect_radius() 
     213        self._set_scale_factor() 
     214        return self.params['scale_factor']*self.p_model.runXY(x)* self.s_model.runXY(x) 
    173215 
    174216    def set_dispersion(self, parameter, dispersion): 
  • sansmodels/src/sans/models/test/utest_modelmultiplication.py

    rc1e865a rc52f66f  
    4747 
    4848        for item in self.model.getParamList(): 
    49             self.assert_(item in list3) 
     49            if not 'scale' in item:  
     50                self.assert_(item in list3) 
    5051        for item in self.model2.getParamList(): 
    5152            #model3 parameters should not include effect_radius* 
     
    5455             
    5556        ## test set value for parameters and get paramaters 
    56         self.model3.setParam("scale", 15) 
    57         self.assertEqual(self.model3.getParam("scale"), 15) 
     57        self.model3.setParam("scale_factor", 15) 
     58        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
    5859        self.model3.setParam("radius", 20) 
    5960        self.assertEqual(self.model3.getParam("radius"), 20) 
    6061        self.model3.setParam("radius.width", 15) 
    6162        self.assertEqual(self.model3.getParam("radius.width"), 15) 
     63        self.model3.setParam("scale_factor", 15) 
     64        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
     65        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale")) 
    6266         
    6367        ## Dispersity  
     
    126130 
    127131        for item in self.model.getParamList(): 
    128             self.assert_(item in list3) 
     132            if not 'scale' in item:  
     133                self.assert_(item in list3) 
    129134        for item in self.model2.getParamList(): 
    130135            #model3 parameters should not include effect_radius* 
     
    133138             
    134139        ## test set value for parameters and get paramaters 
    135         self.model3.setParam("scale", 15) 
    136         self.assertEqual(self.model3.getParam("scale"), 15) 
     140        self.model3.setParam("scale_factor", 15) 
     141        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
    137142        self.model3.setParam("radius", 20) 
    138143        self.assertEqual(self.model3.getParam("radius"), 20) 
    139144        self.model3.setParam("radius.width", 15) 
    140145        self.assertEqual(self.model3.getParam("radius.width"), 15) 
     146        self.model3.setParam("scale_factor", 15) 
     147        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
     148        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale")) 
    141149         
    142150        ## Dispersity  
     
    204212 
    205213        for item in self.model.getParamList(): 
    206             self.assert_(item in list3) 
     214            if not 'scale' in item:  
     215                self.assert_(item in list3) 
    207216        for item in self.model2.getParamList(): 
    208217            #model3 parameters should not include effect_radius* 
     
    211220             
    212221        ## test set value for parameters and get paramaters 
    213         self.model3.setParam("scale", 15) 
    214         self.assertEqual(self.model3.getParam("scale"), 15) 
     222        self.model3.setParam("scale_factor", 15) 
     223        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
    215224        self.model3.setParam("radius", 20) 
    216225        self.assertEqual(self.model3.getParam("radius"), 20) 
    217226        self.model3.setParam("radius.width", 15) 
    218227        self.assertEqual(self.model3.getParam("radius.width"), 15) 
     228        self.model3.setParam("scale_factor", 15) 
     229        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
     230        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale")) 
    219231         
    220232        ## Dispersity  
     
    283295 
    284296        for item in self.model.getParamList(): 
    285             self.assert_(item in list3) 
     297            if not 'scale' in item:  
     298                self.assert_(item in list3) 
    286299        for item in self.model2.getParamList(): 
    287300            #model3 parameters should not include effect_radius* 
     
    290303             
    291304        ## test set value for parameters and get paramaters 
    292         self.model3.setParam("scale", 15) 
    293         self.assertEqual(self.model3.getParam("scale"), 15) 
     305        self.model3.setParam("scale_factor", 15) 
     306        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
    294307        self.model3.setParam("radius", 20) 
    295308        self.assertEqual(self.model3.getParam("radius"), 20) 
    296309        self.model3.setParam("radius.width", 15) 
    297310        self.assertEqual(self.model3.getParam("radius.width"), 15) 
     311        self.model3.setParam("scale_factor", 15) 
     312        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
     313        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale")) 
    298314         
    299315        ## Dispersity  
     
    365381 
    366382        for item in self.model.getParamList(): 
    367             self.assert_(item in list3) 
     383            if not 'scale' in item:  
     384                self.assert_(item in list3) 
    368385        for item in self.model2.getParamList(): 
    369386            #model3 parameters should not include effect_radius* 
     
    372389             
    373390        ## test set value for parameters and get paramaters 
    374         self.model3.setParam("scale", 15) 
    375         self.assertEqual(self.model3.getParam("scale"), 15) 
     391        self.model3.setParam("scale_factor", 15) 
     392        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
    376393        self.model3.setParam("radius", 20) 
    377394        self.assertEqual(self.model3.getParam("radius"), 20) 
    378395        self.model3.setParam("radius.width", 15) 
    379396        self.assertEqual(self.model3.getParam("radius.width"), 15) 
     397        self.model3.setParam("scale_factor", 15) 
     398        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
     399        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale")) 
    380400         
    381401        ## Dispersity  
     
    443463 
    444464        for item in self.model.getParamList(): 
    445             self.assert_(item in list3) 
     465            #model3 parameters should not include scale* 
     466            if not 'scale' in item:  
     467                self.assert_(item in list3) 
    446468        for item in self.model2.getParamList(): 
    447469            #model3 parameters should not include effect_radius* 
     
    450472             
    451473        ## test set value for parameters and get paramaters 
    452         self.model3.setParam("scale", 15) 
    453         self.assertEqual(self.model3.getParam("scale"), 15) 
     474        #self.model3.setParam("scale", 15) 
     475        #self.assertEqual(self.model3.getParam("scale"), 15) 
     476        self.model3.setParam("scale_factor", 0.1) 
     477        self.assertEqual(self.model3.getParam("scale_factor"), 0.1) 
    454478        self.model3.setParam("radius", 20) 
    455479        self.assertEqual(self.model3.getParam("radius"), 20) 
    456480        self.model3.setParam("radius.width", 15) 
    457481        self.assertEqual(self.model3.getParam("radius.width"), 15) 
     482        self.model3.setParam("scale_factor", 15) 
     483        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
     484        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale")) 
    458485         
    459486        ## Dispersity  
     
    521548 
    522549        for item in self.model.getParamList(): 
    523             self.assert_(item in list3) 
     550            if not 'scale' in item:  
     551                self.assert_(item in list3) 
    524552        for item in self.model2.getParamList(): 
    525553            #model3 parameters should not include effect_radius* 
     
    528556             
    529557        ## test set value for parameters and get paramaters 
    530         self.model3.setParam("scale", 15) 
    531         self.assertEqual(self.model3.getParam("scale"), 15) 
     558        self.model3.setParam("scale_factor", 15) 
     559        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
    532560        self.model3.setParam("radius", 20) 
    533561        self.assertEqual(self.model3.getParam("radius"), 20) 
    534562        self.model3.setParam("radius.width", 15) 
    535563        self.assertEqual(self.model3.getParam("radius.width"), 15) 
     564        self.model3.setParam("scale_factor", 15) 
     565        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
     566        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale")) 
    536567         
    537568        ## Dispersity  
     
    599630 
    600631        for item in self.model.getParamList(): 
    601             self.assert_(item in list3) 
     632            if not 'scale' in item:   
     633                self.assert_(item in list3) 
    602634        for item in self.model2.getParamList(): 
    603635            #model3 parameters should not include effect_radius* 
     
    606638             
    607639        ## test set value for parameters and get paramaters 
    608         self.model3.setParam("scale", 15) 
    609         self.assertEqual(self.model3.getParam("scale"), 15) 
     640        #self.model3.setParam("scale", 15) 
     641        #self.assertEqual(self.model3.getParam("scale"), 15) 
     642        self.model3.setParam("scale_factor", 15) 
     643        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
    610644        self.model3.setParam("radius", 20) 
    611645        self.assertEqual(self.model3.getParam("radius"), 20) 
    612646        self.model3.setParam("radius.width", 15) 
    613647        self.assertEqual(self.model3.getParam("radius.width"), 15) 
     648        self.model3.setParam("scale_factor", 15) 
     649        self.assertEqual(self.model3.getParam("scale_factor"), 15) 
     650        self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale")) 
    614651         
    615652        ## Dispersity  
Note: See TracChangeset for help on using the changeset viewer.