Changeset 48882d1 in sasview for park_integration/AbstractFitEngine.py
- Timestamp:
- Aug 22, 2008 5:51:05 PM (16 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- 3c404d3
- Parents:
- d6513cd
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
park_integration/AbstractFitEngine.py
r985c88b r48882d1 1 1 2 import park,numpy 3 4 class SansParameter(park.Parameter): 5 """ 6 SANS model parameters for use in the PARK fitting service. 7 The parameter attribute value is redirected to the underlying 8 parameter value in the SANS model. 9 """ 10 def __init__(self, name, model): 11 self._model, self._name = model,name 12 self.set(model.getParam(name)) 13 14 def _getvalue(self): return self._model.getParam(self.name) 15 16 def _setvalue(self,value): 17 self._model.setParam(self.name, value) 18 19 value = property(_getvalue,_setvalue) 20 21 def _getrange(self): 22 lo,hi = self._model.details[self.name][1:] 23 if lo is None: lo = -numpy.inf 24 if hi is None: hi = numpy.inf 25 return lo,hi 26 27 def _setrange(self,r): 28 self._model.details[self.name][1:] = r 29 range = property(_getrange,_setrange) 30 31 32 class Model(object): 33 """ 34 PARK wrapper for SANS models. 35 """ 36 def __init__(self, sans_model): 37 self.model = sans_model 38 #print "ParkFitting:sans model",self.model 39 self.sansp = sans_model.getParamList() 40 #print "ParkFitting: sans model parameter list",sansp 41 self.parkp = [SansParameter(p,sans_model) for p in self.sansp] 42 #print "ParkFitting: park model parameter ",self.parkp 43 self.parameterset = park.ParameterSet(sans_model.name,pars=self.parkp) 44 self.pars=[] 45 46 def getParams(self,fitparams): 47 list=[] 48 self.pars=[] 49 self.pars=fitparams 50 for item in fitparams: 51 for element in self.parkp: 52 if element.name ==str(item): 53 list.append(element.value) 54 #print "abstractfitengine: getparams",list 55 return list 56 57 def setParams(self, params): 58 list=[] 59 for item in self.parkp: 60 list.append(item.name) 61 list.sort() 62 for i in range(len(params)): 63 #self.parkp[i].value = params[i] 64 #print "abstractfitengine: set-params",list[i],params[i] 65 66 self.model.setParam(list[i],params[i]) 67 68 def eval(self,x): 69 #print "eval",self.parameterset[0].value,self.parameterset[1].value 70 return self.model.runXY(x) 71 72 73 class Data(object): 74 """ Wrapper class for SANS data """ 75 def __init__(self,x=None,y=None,dy=None,dx=None,sans_data=None): 76 77 if sans_data !=None: 78 self.x= sans_data.x 79 self.y= sans_data.y 80 self.dx= sans_data.dx 81 self.dy= sans_data.dy 82 83 elif (x!=None and y!=None and dy!=None): 84 self.x=x 85 self.y=y 86 self.dx=dx 87 self.dy=dy 88 else: 89 raise ValueError,\ 90 "Data is missing x, y or dy, impossible to compute residuals later on" 91 self.qmin=None 92 self.qmax=None 93 94 def setFitRange(self,mini=None,maxi=None): 95 """ to set the fit range""" 96 self.qmin=mini 97 self.qmax=maxi 98 def getFitRange(self): 99 return self.qmin, self.qmax 100 def residuals(self, fn): 101 """ @param fn: function that return model value 102 @return residuals 103 """ 104 x,y,dy = [numpy.asarray(v) for v in (self.x,self.y,self.dy)] 105 if self.qmin==None and self.qmax==None: 106 fx =[fn(v) for v in x] 107 return (y - fx)/dy 108 else: 109 idx = (x>=self.qmin) & (x <= self.qmax) 110 fx = [fn(item)for item in x[idx ]] 111 return (y[idx] - fx)/dy[idx] 112 113 114 115 def residuals_deriv(self, model, pars=[]): 116 """ 117 @return residuals derivatives . 118 @note: in this case just return empty array 119 """ 120 return [] 121 122 class sansAssembly: 123 def __init__(self,Model=None , Data=None): 124 self.model = Model 125 self.data = Data 126 self.res=[] 127 def chisq(self, params): 128 """ 129 Calculates chi^2 130 @param params: list of parameter values 131 @return: chi^2 132 """ 133 sum = 0 134 for item in self.res: 135 sum += item*item 136 return sum 137 def __call__(self,params): 138 self.model.setParams(params) 139 self.res= self.data.residuals(self.model.eval) 140 return self.res 141 2 142 class FitEngine: 3 143 def __init__(self): … … 8 148 @param listdata: list of data 9 149 10 @return xtemp, ytemp,dytemp: x,y,dy respectively of data all combined 11 if xi,yi,dyi of two or more data are the same the second appearance of xi,yi, 12 dyi is ignored in the concatenation. 150 @return Data: 13 151 14 152 @raise: if listdata is empty will return None … … 22 160 ytemp=[] 23 161 dytemp=[] 162 self.mini=None 163 self.maxi=None 24 164 25 165 for data in listdata: 166 mini,maxi=data.getFitRange() 167 if self.mini==None and self.maxi==None: 168 self.mini=mini 169 self.maxi=maxi 170 else: 171 if mini < self.mini: 172 self.mini=mini 173 if self.maxi < maxi: 174 self.maxi=maxi 175 176 26 177 for i in range(len(data.x)): 27 178 xtemp.append(data.x[i]) … … 31 182 else: 32 183 raise RuntimeError, "Fit._concatenateData: y-errors missing" 33 return xtemp, ytemp,dytemp 34 184 #return xtemp, ytemp,dytemp 185 data= Data(x=xtemp,y=ytemp,dy=dytemp) 186 data.setFitRange(self.mini, self.maxi) 187 return data 35 188 def set_model(self,model,name,Uid,pars=[]): 36 """37 38 Receive a dictionary of parameter and save it Parameter list39 For scipy.fit use.40 Set model in a FitArrange object and add that object in a dictionary41 with key Uid.42 @param model: model on with parameter values are set43 @param name: model name44 @param Uid: unique key corresponding to a fitArrange object with model45 @param pars: dictionary of paramaters name and value46 pars={parameter's name: parameter's value}47 48 """49 print "AbstractFitEngine: fitting parmater",pars50 51 189 if len(pars) >0: 52 self.param eters=[]190 self.paramList = [] 53 191 if model==None: 54 192 raise ValueError, "AbstractFitEngine: Specify parameters to fit" 55 193 else: 56 model.name=name 57 for param_name in pars: 58 value=model.getParam(param_name) 59 if value==None: 60 raise ValueError ,"%s has not value set"%param_name 61 param = Parameter(model,param_name,value) 62 self.parameters.append(param) 63 64 self.paramList.append(param_name) 65 print "AbstractFitEngine: self.paramList2", self.paramList 194 model.name = name 195 self.paramList=pars 66 196 #A fitArrange is already created but contains dList only at Uid 67 197 if self.fitArrangeList.has_key(Uid): … … 69 199 else: 70 200 #no fitArrange object has been create with this Uid 71 fitproblem = FitArrange()201 fitproblem = FitArrange() 72 202 fitproblem.set_model(model) 73 self.fitArrangeList[Uid] =fitproblem203 self.fitArrangeList[Uid] = fitproblem 74 204 else: 75 205 raise ValueError, "park_integration:missing parameters" 76 77 78 def set_data(self,data,Uid): 206 207 def set_data(self,data,Uid,qmin=None,qmax=None): 79 208 """ Receives plottable, creates a list of data to fit,set data 80 209 in a FitArrange object and adds that object in a dictionary … … 83 212 @param Uid: unique key corresponding to a fitArrange object with data 84 213 """ 214 if qmin !=None and qmax !=None: 215 data.setFitRange(mini=qmin,maxi=qmax) 85 216 #A fitArrange is already created but contains model only at Uid 86 217 if self.fitArrangeList.has_key(Uid): … … 90 221 fitproblem= FitArrange() 91 222 fitproblem.add_data(data) 92 self.fitArrangeList[Uid]=fitproblem 93 223 self.fitArrangeList[Uid]=fitproblem 224 94 225 def get_model(self,Uid): 95 226 """ … … 107 238 if self.fitArrangeList.has_key(Uid): 108 239 del self.fitArrangeList[Uid] 109 110 111 112 113 class Parameter: 114 """ 115 Class to handle model parameters 116 """ 117 def __init__(self, model, name, value=None): 118 self.model = model 119 self.name = name 120 if not value==None: 121 self.model.setParam(self.name, value) 122 123 def set(self, value): 124 """ 125 Set the value of the parameter 126 """ 127 self.model.setParam(self.name, value) 128 129 def __call__(self): 130 """ 131 Return the current value of the parameter 132 """ 133 return self.model.getParam(self.name) 240 134 241 135 242 class FitArrange:
Note: See TracChangeset
for help on using the changeset viewer.