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

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 6756712 was 6756712, checked in by Jae Cho <jhjcho@…>, 15 years ago

fixed a bug and changed setparam

  • Property mode set to 100644
File size: 8.5 KB
Line 
1
2from sans.models.BaseComponent import BaseComponent
3import numpy, math
4import copy
5from sans.models.pluginmodel import Model1DPlugin
6from sans.models.DiamCylFunc import  DiamCylFunc
7from sans.models.DiamEllipFunc import  DiamEllipFunc
8class MultiplicationModel(BaseComponent):
9    """
10        Use for S(Q)*P(Q).
11        Perform multplication of two models.
12        Contains the models parameters combined.
13    """
14    def __init__(self, model1, model2 ):
15        BaseComponent.__init__(self)
16
17       
18        ## Setting  model name model description
19        self.description=""
20        if  model1.name != "NoStructure"and  model2.name != "NoStructure":
21             self.name = model1.name +" * "+ model2.name
22             self.description= self.name+"\n"
23             self.description +="see %s description and %s description"%( model1.name,
24                                                                         model2.name )
25        elif  model2.name != "NoStructure":
26            self.name = model2.name
27            self.description= model2.description
28        else :
29            self.name = model1.name
30            self.description= model1.description
31                       
32        #For virial coefficients for only two P(Q) models,"CylinderModel","EllipsoidModel". SphereModel works w/o it.
33        modelDiam = None
34        if model1.__class__.__name__ == "CylinderModel":
35            Model1DPlugin("DiamCylFunc")
36            modelDiam = DiamCylFunc()
37            para1 = 'radius'
38            para2 = 'length'
39           
40        elif model1.__class__.__name__  == "EllipsoidModel":
41            Model1DPlugin("DiamEllipFunc")
42            modelDiam = DiamEllipFunc()
43            para1 = 'radius_a'
44            para2 = 'radius_b'
45           
46        self.modelD = modelDiam
47       
48        if model1.__class__.__name__ == "CylinderModel" \
49            or model1.__class__.__name__  == "EllipsoidModel":
50         
51            self.para1 = para1
52            self.para2 = para2
53
54       
55        self.model1= model1
56        self.model2= model2
57       
58       
59        ## dispersion
60        self._set_dispersion()
61        ## Define parameters
62        self._set_params()
63        ## Parameter details [units, min, max]
64        self._set_details()
65        #list of parameter that can be fitted
66        self._set_fixed_params() 
67        ## parameters with orientation
68        for item in self.model1.orientation_params:
69            self.orientation_params.append(item)
70           
71        for item in self.model2.orientation_params:
72            if not item in self.orientation_params:
73                self.orientation_params.append(item)
74               
75       
76    def _clone(self, obj):
77        """
78            Internal utility function to copy the internal
79            data members to a fresh copy.
80        """
81        obj.params     = copy.deepcopy(self.params)
82        obj.description     = copy.deepcopy(self.description)
83        obj.details    = copy.deepcopy(self.details)
84        obj.dispersion = copy.deepcopy(self.dispersion)
85        obj.model1  = self.model1.clone()
86        obj.model2  = self.model2.clone()
87       
88        return obj
89   
90   
91    def _set_dispersion(self):
92        """
93           combined the two models dispersions
94        """
95        for name , value in self.model1.dispersion.iteritems():
96            self.dispersion[name]= value
97           
98        for name , value in self.model2.dispersion.iteritems():
99            if not name in self.dispersion.keys()and name !='radius':
100                self.dispersion[name]= value
101
102                   
103               
104               
105    def _set_params(self):
106        """
107            Concatenate the parameters of the two models to create
108            this model parameters
109        """
110       
111        for name , value in self.model1.params.iteritems():
112            self.params[name]= value
113           
114            if self.modelD !=None:
115                if name == self.para1 or name == self.para2:
116                    self.modelD.params[name]= value
117                elif name in self.model2.getParamList() and name !='radius':
118                    self.model2.setParam( name, value)
119
120            elif name in self.model2.getParamList():
121                self.model2.setParam(name, value)
122        if self.modelD !=None:
123            self.model2.setParam('radius', self.modelD.run())
124           
125        for name , value in self.model2.params.iteritems():
126            if not name in self.params.keys()and name != 'radius':
127                self.params[name]= value
128           
129    def _set_details(self):
130        """
131            Concatenate details of the two models to create
132            this model details
133        """
134        for name ,detail in self.model1.details.iteritems():
135            self.details[name]= detail
136           
137        for name , detail in self.model2.details.iteritems():
138            if not name in self.details.keys()and name != 'radius':
139                self.details[name]= detail
140               
141    def setParam(self, name, value):
142        """
143            Set the value of a model parameter
144       
145            @param name: name of the parameter
146            @param value: value of the parameter
147        """
148
149        self._setParamHelper( name, value)
150
151        if name in self.model1.getParamList():
152            self.model1.setParam( name, value)
153
154        if name==self.para1 or name == self.para2 and  self.modelD !=None:
155                self.modelD.params[name]= value
156                self.model2.setParam('radius', self.modelD.run())
157        else:
158            if name in self.model2.getParamList():
159                self.model2.setParam( name, value)
160           
161       
162           
163        self._setParamHelper( name, value)
164       
165    def _setParamHelper(self, name, value):
166        """
167            Helper function to setparam
168        """
169        # Look for dispersion parameters
170        toks = name.split('.')
171        if len(toks)==2:
172            for item in self.dispersion.keys():
173                if item.lower()==toks[0].lower():
174                    for par in self.dispersion[item]:
175                        if par.lower() == toks[1].lower():
176                            self.dispersion[item][par] = value
177                            return
178        else:
179            # Look for standard parameter
180            for item in self.params.keys():
181                if item.lower()==name.lower():
182                    self.params[item] = value
183                    return
184           
185        raise ValueError, "Model does not contain parameter %s" % name
186   
187       
188   
189             
190   
191    def _set_fixed_params(self):
192        """
193             fill the self.fixed list with the two models fixed list
194        """
195        for item in self.model1.fixed:
196            self.fixed.append(item)
197           
198        for item in self.model2.fixed:
199            if not item in self.fixed:
200                self.fixed.append(item)
201        self.fixed.sort()
202               
203               
204    def run(self, x = 0.0):
205        """ Evaluate the model
206            @param x: input q-value (float or [float, float] as [r, theta])
207            @return: (DAB value)
208        """
209        #MultiplicationModel(self.model1, self.model2 )     
210           
211        #if self.modelD!=None:
212        #    value = self.modelD.run(x)
213        #    self.model2.setParam( "radius", value)       
214                       
215            #print "self.model2.setParam( radius, value)",value
216        return self.model1.run(x)*self.model2.run(x)
217   
218    def runXY(self, x = 0.0):
219        """ Evaluate the model
220            @param x: input q-value (float or [float, float] as [qx, qy])
221            @return: DAB value
222        """
223        return self.model1.runXY(x)* self.model2.runXY(x)
224   
225    def set_dispersion(self, parameter, dispersion):
226        """
227            Set the dispersion object for a model parameter
228            @param parameter: name of the parameter [string]
229            @dispersion: dispersion object of type DispersionModel
230        """
231        value= None
232        try:
233            if parameter in self.model1.dispersion.keys():
234                value= self.model1.set_dispersion(parameter, dispersion)
235             
236            elif parameter in self.model2.dispersion.keys():
237                value= self.model2.set_dispersion(parameter, dispersion)
238            return value
239        except:
240            raise 
241
242
243   
Note: See TracBrowser for help on using the repository browser.