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

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 5032d1e2 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
Line 
1
2from sans.models.BaseComponent import BaseComponent
3import numpy, math
4import copy
5from sans.models.pluginmodel import Model1DPlugin
6class MultiplicationModel(BaseComponent):
7    """
8        Use for P(Q)*S(Q); function call maut be in order of P(Q) and then S(Q).
9        Perform multplication of two models.
10        Contains the models parameters combined.
11    """
12    def __init__(self, model1, model2 ):
13        BaseComponent.__init__(self)
14
15       
16        ## Setting  model name model description
17        self.description=""
18        if  model1.name != "NoStructure"and  model2.name != "NoStructure":
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
29                       
30       
31        self.model1= model1
32        self.model2= model2
33       
34       
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() 
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:
49                if item != 'effect_radius':
50                    self.orientation_params.append(item)
51               
52       
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   
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():
76            # S(Q) has only 'radius' for dispersion.
77            if not name in self.dispersion.keys():
78                if name != 'effect_radius':
79                    self.dispersion[name]= value
80
81                   
82               
83               
84    def _set_params(self):
85        """
86            Concatenate the parameters of the two models to create
87            this model parameters
88        """
89        dia_rad = 0
90        for name , value in self.model1.params.iteritems():
91            self.params[name]= value
92           
93        for name , value in self.model2.params.iteritems():
94            if not name in self.params.keys():
95                if name != 'effect_radius': 
96                    self.params[name]= value
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():
107            if not name in self.details.keys()and name != 'effect_radius': #????
108                self.details[name]= detail
109               
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        """
117
118        self._setParamHelper( name, value)
119
120        if name in self.model1.getParamList():
121            self.model1.setParam( name, value)
122
123        if name in self.model2.getParamList():
124            self.model2.setParam( name, value)
125
126        self._setParamHelper( name, value)
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   
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()
162               
163               
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        """
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       
175        return self.model1.run(x)*self.model2.run(x)
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        """
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
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        """
196        value= None
197        try:
198            if parameter in self.model1.dispersion.keys():
199                value= self.model1.set_dispersion(parameter, dispersion)
200            #There is no dispersion for the structure factors(S(Q)).
201            #ToDo: need to decide whether or not the dispersion for S(Q) has to be considered for P*S. 
202            elif parameter in self.model2.dispersion.keys():
203                if item != 'effect_radius':
204                    value= self.model2.set_dispersion(parameter, dispersion)
205            self._set_dispersion()
206            return value
207        except:
208            raise 
209
210
211   
Note: See TracBrowser for help on using the repository browser.