source: sasview/sansmodels/src/sans/models/BaseComponent.py @ 7a69683

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 7a69683 was 138c139, checked in by Gervaise Alina <gervyh@…>, 16 years ago

clone _persistency_dict when cloning the model

  • Property mode set to 100644
File size: 5.3 KB
Line 
1#!/usr/bin/env python
2"""
3    Provide base functionality for all model components
4"""
5
6# imports   
7import copy
8#TO DO: that about a way to make the parameter
9#is self return if it is fittable or not 
10
11class BaseComponent:
12    """
13        Basic model component
14       
15        Since version 0.5.0, basic operations are no longer supported.
16    """
17
18    def __init__(self):
19        """ Initialization"""
20       
21        ## Name of the model
22        self.name   = "BaseComponent"
23       
24        ## Parameters to be accessed by client
25        self.params = {}
26        self.details = {}
27        ## Dictionary used to store the dispersity/averaging
28        #  parameters of dispersed/averaged parameters.
29        self.dispersion = {}
30        # string containing information about the model such as the equation
31        #of the given model, exception or possible use
32        self.description=''
33        #list of parameter that can be fitted
34        self.fixed= []
35        ## parameters with orientation
36        self.orientation_params =[]
37        ## store dispersity reference
38        self._persistency_dict = {}
39           
40    def __str__(self):
41        """
42            @return: string representation
43        """
44        return self.name
45   
46    def is_fittable(self, par_name):
47        """
48            Check if a given parameter is fittable or not
49            @param par_name: the parameter name to check
50        """
51        return par_name.lower() in self.fixed
52        #For the future
53        #return self.params[str(par_name)].is_fittable()
54   
55    def run(self, x): return NotImplemented
56    def runXY(self, x): return NotImplemented 
57   
58    def clone(self):
59        """ Returns a new object identical to the current object """
60        obj = copy.deepcopy(self)
61        return self._clone(obj)
62   
63    def _clone(self, obj):
64        """
65            Internal utility function to copy the internal
66            data members to a fresh copy.
67        """
68        obj.params     = copy.deepcopy(self.params)
69        obj.details    = copy.deepcopy(self.details)
70        obj.dispersion = copy.deepcopy(self.dispersion)
71        obj._persistency_dict = copy.deepcopy( self._persistency_dict)
72        return obj
73
74    def setParam(self, name, value):
75        """
76            Set the value of a model parameter
77       
78            @param name: name of the parameter
79            @param value: value of the parameter
80        """
81        # Look for dispersion parameters
82        toks = name.split('.')
83        if len(toks)==2:
84            for item in self.dispersion.keys():
85                if item.lower()==toks[0].lower():
86                    for par in self.dispersion[item]:
87                        if par.lower() == toks[1].lower():
88                            self.dispersion[item][par] = value
89                            return
90        else:
91            # Look for standard parameter
92            for item in self.params.keys():
93                if item.lower()==name.lower():
94                    self.params[item] = value
95                    return
96           
97        raise ValueError, "Model does not contain parameter %s" % name
98       
99    def getParam(self, name):
100        """
101            Set the value of a model parameter
102
103            @param name: name of the parameter
104        """
105        # Look for dispersion parameters
106        toks = name.split('.')
107        if len(toks)==2:
108            for item in self.dispersion.keys():
109                if item.lower()==toks[0].lower():
110                    for par in self.dispersion[item]:
111                        if par.lower() == toks[1].lower():
112                            return self.dispersion[item][par]
113        else:
114            # Look for standard parameter
115            for item in self.params.keys():
116                if item.lower()==name.lower():
117                    return self.params[item]
118           
119        raise ValueError, "Model does not contain parameter %s" % name
120     
121    def getParamList(self):
122        """
123            Return a list of all available parameters for the model
124        """ 
125        list = self.params.keys()
126        # WARNING: Extending the list with the dispersion parameters
127        list.extend(self.getDispParamList())
128        return list
129   
130    def getDispParamList(self):
131        """
132            Return a list of all available parameters for the model
133        """ 
134        list = []
135       
136        for item in self.dispersion.keys():
137            for p in self.dispersion[item].keys():
138                if p not in ['type']:
139                    list.append('%s.%s' % (item.lower(), p.lower()))
140                   
141        return list
142   
143    # Old-style methods that are no longer used
144    def setParamWithToken(self, name, value, token, member): return NotImplemented
145    def getParamWithToken(self, name, token, member): return NotImplemented
146    def getParamListWithToken(self, token, member): return NotImplemented
147    def __add__(self, other): raise ValueError, "Model operation are no longer supported"
148    def __sub__(self, other): raise ValueError, "Model operation are no longer supported"
149    def __mul__(self, other): raise ValueError, "Model operation are no longer supported"
150    def __div__(self, other): raise ValueError, "Model operation are no longer supported"
151       
Note: See TracBrowser for help on using the repository browser.