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

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 24415e9 was 24415e9, checked in by Gervaise Alina <gervyh@…>, 15 years ago

set initial value for model multplication parameters

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