Ignore:
Timestamp:
Aug 22, 2008 5:51:05 PM (16 years ago)
Author:
Gervaise Alina <gervyh@…>
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
Message:

park fitting with new model and new data

File:
1 edited

Legend:

Unmodified
Added
Removed
  • park_integration/AbstractFitEngine.py

    r985c88b r48882d1  
    11 
     2import park,numpy 
     3 
     4class 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 
     32class 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 
     73class 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     
     122class 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     
    2142class FitEngine: 
    3143    def __init__(self): 
     
    8148            @param listdata: list of data  
    9149             
    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: 
    13151                 
    14152            @raise: if listdata is empty  will return None 
     
    22160            ytemp=[] 
    23161            dytemp=[] 
     162            self.mini=None 
     163            self.maxi=None 
    24164                
    25165            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                     
    26177                for i in range(len(data.x)): 
    27178                    xtemp.append(data.x[i]) 
     
    31182                    else: 
    32183                        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 
    35188    def set_model(self,model,name,Uid,pars=[]): 
    36         """  
    37        
    38             Receive a dictionary of parameter and save it Parameter list 
    39             For scipy.fit use. 
    40             Set model in a FitArrange object and add that object in a dictionary 
    41             with key Uid. 
    42             @param model: model on with parameter values are set 
    43             @param name: model name 
    44             @param Uid: unique key corresponding to a fitArrange object with model 
    45             @param pars: dictionary of paramaters name and value 
    46             pars={parameter's name: parameter's value} 
    47              
    48         """ 
    49         print "AbstractFitEngine:  fitting parmater",pars 
    50         
    51189        if len(pars) >0: 
    52             self.parameters=[] 
     190            self.paramList = [] 
    53191            if model==None: 
    54192                raise ValueError, "AbstractFitEngine: Specify parameters to fit" 
    55193            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 
    66196            #A fitArrange is already created but contains dList only at Uid 
    67197            if self.fitArrangeList.has_key(Uid): 
     
    69199            else: 
    70200            #no fitArrange object has been create with this Uid 
    71                 fitproblem= FitArrange() 
     201                fitproblem = FitArrange() 
    72202                fitproblem.set_model(model) 
    73                 self.fitArrangeList[Uid]=fitproblem 
     203                self.fitArrangeList[Uid] = fitproblem 
    74204        else: 
    75205            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): 
    79208        """ Receives plottable, creates a list of data to fit,set data 
    80209            in a FitArrange object and adds that object in a dictionary  
     
    83212            @param Uid: unique key corresponding to a fitArrange object with data 
    84213            """ 
     214        if qmin !=None and qmax !=None: 
     215            data.setFitRange(mini=qmin,maxi=qmax) 
    85216        #A fitArrange is already created but contains model only at Uid 
    86217        if self.fitArrangeList.has_key(Uid): 
     
    90221            fitproblem= FitArrange() 
    91222            fitproblem.add_data(data) 
    92             self.fitArrangeList[Uid]=fitproblem 
    93              
     223            self.fitArrangeList[Uid]=fitproblem     
     224    
    94225    def get_model(self,Uid): 
    95226        """  
     
    107238        if self.fitArrangeList.has_key(Uid): 
    108239            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 
    134241     
    135242class FitArrange: 
Note: See TracChangeset for help on using the changeset viewer.