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

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

fix a bug in 1d fit

  • Property mode set to 100644
File size: 8.6 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        if self.modelD !=None:
154            if name==self.para1 or name == self.para2:
155                    self.modelD.params[name]= value
156                    self.model2.setParam('radius', self.modelD.run())
157            elif name in self.model2.getParamList():
158                        self.model2.setParam( name, value)       
159        else:
160            if name in self.model2.getParamList():
161                self.model2.setParam( name, value)
162           
163       
164           
165        self._setParamHelper( name, value)
166       
167    def _setParamHelper(self, name, value):
168        """
169            Helper function to setparam
170        """
171        # Look for dispersion parameters
172        toks = name.split('.')
173        if len(toks)==2:
174            for item in self.dispersion.keys():
175                if item.lower()==toks[0].lower():
176                    for par in self.dispersion[item]:
177                        if par.lower() == toks[1].lower():
178                            self.dispersion[item][par] = value
179                            return
180        else:
181            # Look for standard parameter
182            for item in self.params.keys():
183                if item.lower()==name.lower():
184                    self.params[item] = value
185                    return
186           
187        raise ValueError, "Model does not contain parameter %s" % name
188   
189       
190   
191             
192   
193    def _set_fixed_params(self):
194        """
195             fill the self.fixed list with the two models fixed list
196        """
197        for item in self.model1.fixed:
198            self.fixed.append(item)
199           
200        for item in self.model2.fixed:
201            if not item in self.fixed:
202                self.fixed.append(item)
203        self.fixed.sort()
204               
205               
206    def run(self, x = 0.0):
207        """ Evaluate the model
208            @param x: input q-value (float or [float, float] as [r, theta])
209            @return: (DAB value)
210        """
211        #MultiplicationModel(self.model1, self.model2 )     
212           
213        #if self.modelD!=None:
214        #    value = self.modelD.run(x)
215        #    self.model2.setParam( "radius", value)       
216                       
217            #print "self.model2.setParam( radius, value)",value
218        return self.model1.run(x)*self.model2.run(x)
219   
220    def runXY(self, x = 0.0):
221        """ Evaluate the model
222            @param x: input q-value (float or [float, float] as [qx, qy])
223            @return: DAB value
224        """
225        return self.model1.runXY(x)* self.model2.runXY(x)
226   
227    def set_dispersion(self, parameter, dispersion):
228        """
229            Set the dispersion object for a model parameter
230            @param parameter: name of the parameter [string]
231            @dispersion: dispersion object of type DispersionModel
232        """
233        value= None
234        try:
235            if parameter in self.model1.dispersion.keys():
236                value= self.model1.set_dispersion(parameter, dispersion)
237             
238            elif parameter in self.model2.dispersion.keys():
239                value= self.model2.set_dispersion(parameter, dispersion)
240            return value
241        except:
242            raise 
243
244
245   
Note: See TracBrowser for help on using the repository browser.