source: sasview/sansmodels/src/sans/models/MultiplicationModel.py @ 42ae1d9

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 42ae1d9 was 59930f3, checked in by Jae Cho <jhjcho@…>, 15 years ago

fixed name mistakes in previous commit

  • Property mode set to 100644
File size: 7.5 KB
RevLine 
[c9636f7]1
2from sans.models.BaseComponent import BaseComponent
3import numpy, math
[a68efd1]4import copy
[3740b11]5from sans.models.pluginmodel import Model1DPlugin
[c9636f7]6class MultiplicationModel(BaseComponent):
7    """
[8077fc4]8        Use for P(Q)*S(Q); function call maut be in order of P(Q) and then S(Q).
[c9636f7]9        Perform multplication of two models.
10        Contains the models parameters combined.
11    """
12    def __init__(self, model1, model2 ):
13        BaseComponent.__init__(self)
14
[996fd35]15       
[8cfdd5e]16        ## Setting  model name model description
[996fd35]17        self.description=""
[5eb9154]18        if  model1.name != "NoStructure"and  model2.name != "NoStructure":
[996fd35]19             self.name = model1.name +" * "+ model2.name
20             self.description= self.name+"\n"
21             self.description +="see %s description and %s description"%( model1.name,
22                                                                         model2.name )
23        elif  model2.name != "NoStructure":
24            self.name = model2.name
25            self.description= model2.description
26        else :
27            self.name = model1.name
28            self.description= model1.description
[3740b11]29                       
[5eb9154]30       
[c9636f7]31        self.model1= model1
32        self.model2= model2
[5eb9154]33       
34       
[c9636f7]35        ## dispersion
36        self._set_dispersion()
37        ## Define parameters
38        self._set_params()
39        ## Parameter details [units, min, max]
40        self._set_details()
41        #list of parameter that can be fitted
42        self._set_fixed_params() 
[5fc8e22]43        ## parameters with orientation
44        for item in self.model1.orientation_params:
45            self.orientation_params.append(item)
46           
47        for item in self.model2.orientation_params:
48            if not item in self.orientation_params:
[5eb9154]49                if item != 'effect_radius':
50                    self.orientation_params.append(item)
[5fc8e22]51               
[5eb9154]52       
[a68efd1]53    def _clone(self, obj):
54        """
55            Internal utility function to copy the internal
56            data members to a fresh copy.
57        """
58        obj.params     = copy.deepcopy(self.params)
59        obj.description     = copy.deepcopy(self.description)
60        obj.details    = copy.deepcopy(self.details)
61        obj.dispersion = copy.deepcopy(self.dispersion)
62        obj.model1  = self.model1.clone()
63        obj.model2  = self.model2.clone()
64       
65        return obj
66   
67   
[c9636f7]68    def _set_dispersion(self):
69        """
70           combined the two models dispersions
71        """
72        for name , value in self.model1.dispersion.iteritems():
73            self.dispersion[name]= value
74           
75        for name , value in self.model2.dispersion.iteritems():
[8077fc4]76            # S(Q) has only 'radius' for dispersion.
[5eb9154]77            if not name in self.dispersion.keys():
[59930f3]78                if name != 'effect_radius':
[5eb9154]79                    self.dispersion[name]= value
[3740b11]80
[5eb9154]81                   
82               
[c9636f7]83               
84    def _set_params(self):
85        """
86            Concatenate the parameters of the two models to create
87            this model parameters
88        """
[ab62adb]89        dia_rad = 0
[c9636f7]90        for name , value in self.model1.params.iteritems():
91            self.params[name]= value
[3740b11]92           
[c9636f7]93        for name , value in self.model2.params.iteritems():
[5eb9154]94            if not name in self.params.keys():
[59930f3]95                if name != 'effect_radius': 
[5eb9154]96                    self.params[name]= value
[c9636f7]97           
98    def _set_details(self):
99        """
100            Concatenate details of the two models to create
101            this model details
102        """
103        for name ,detail in self.model1.details.iteritems():
104            self.details[name]= detail
105           
106        for name , detail in self.model2.details.iteritems():
[5eb9154]107            if not name in self.details.keys()and name != 'effect_radius': #????
[c9636f7]108                self.details[name]= detail
109               
[8cfdd5e]110    def setParam(self, name, value):
111        """
112            Set the value of a model parameter
113       
114            @param name: name of the parameter
115            @param value: value of the parameter
116        """
[3740b11]117
118        self._setParamHelper( name, value)
119
[8cfdd5e]120        if name in self.model1.getParamList():
121            self.model1.setParam( name, value)
[ab62adb]122
[5eb9154]123        if name in self.model2.getParamList():
124            self.model2.setParam( name, value)
125
[24415e9]126        self._setParamHelper( name, value)
[8cfdd5e]127       
128    def _setParamHelper(self, name, value):
129        """
130            Helper function to setparam
131        """
132        # Look for dispersion parameters
133        toks = name.split('.')
134        if len(toks)==2:
135            for item in self.dispersion.keys():
136                if item.lower()==toks[0].lower():
137                    for par in self.dispersion[item]:
138                        if par.lower() == toks[1].lower():
139                            self.dispersion[item][par] = value
140                            return
141        else:
142            # Look for standard parameter
143            for item in self.params.keys():
144                if item.lower()==name.lower():
145                    self.params[item] = value
146                    return
147           
148        raise ValueError, "Model does not contain parameter %s" % name
149             
150   
[c9636f7]151    def _set_fixed_params(self):
152        """
153             fill the self.fixed list with the two models fixed list
154        """
155        for item in self.model1.fixed:
156            self.fixed.append(item)
157           
158        for item in self.model2.fixed:
159            if not item in self.fixed:
160                self.fixed.append(item)
161        self.fixed.sort()
[5eb9154]162               
163               
[c9636f7]164    def run(self, x = 0.0):
165        """ Evaluate the model
166            @param x: input q-value (float or [float, float] as [r, theta])
167            @return: (DAB value)
168        """
[5eb9154]169        #Reset radius of model2 just before the run
170        effective_radius = None   
171        effective_radius = self.model1.calculate_ER()
172        if effective_radius !=None:         
173            self.model2.setParam( 'effect_radius',effective_radius)
174       
[3740b11]175        return self.model1.run(x)*self.model2.run(x)
[c9636f7]176   
177    def runXY(self, x = 0.0):
178        """ Evaluate the model
179            @param x: input q-value (float or [float, float] as [qx, qy])
180            @return: DAB value
181        """
[5eb9154]182        #Reset radius of model2 just before the run
183        effective_radius = None   
184        effective_radius = self.model1.calculate_ER()
185        if effective_radius !=None:         
186            self.model2.setParam( 'effect_radius',effective_radius)
187
[c9636f7]188        return self.model1.runXY(x)* self.model2.runXY(x)
189   
190    def set_dispersion(self, parameter, dispersion):
191        """
192            Set the dispersion object for a model parameter
193            @param parameter: name of the parameter [string]
194            @dispersion: dispersion object of type DispersionModel
195        """
[db39b2a]196        value= None
197        try:
[c3e4a7fa]198            if parameter in self.model1.dispersion.keys():
[db39b2a]199                value= self.model1.set_dispersion(parameter, dispersion)
[5eb9154]200            #There is no dispersion for the structure factors(S(Q)).
[8077fc4]201            #ToDo: need to decide whether or not the dispersion for S(Q) has to be considered for P*S. 
[5eb9154]202            elif parameter in self.model2.dispersion.keys():
203                if item != 'effect_radius':
204                    value= self.model2.set_dispersion(parameter, dispersion)
[8077fc4]205            self._set_dispersion()
[db39b2a]206            return value
207        except:
208            raise 
[c9636f7]209
210
211   
Note: See TracBrowser for help on using the repository browser.