Changeset 48882d1 in sasview for park_integration/ParkFitting.py


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/ParkFitting.py

    ree5b04c r48882d1  
    66import time 
    77import numpy 
    8  
    98import park 
    109from park import fit,fitresult 
    1110from park import assembly 
    1211from park.fitmc import FitSimplex, FitMC 
    13  
    1412from sans.guitools.plottables import Data1D 
    1513from Loader import Load 
    16 from AbstractFitEngine import FitEngine, Parameter, FitArrange 
    17 class SansParameter(park.Parameter): 
    18     """ 
    19         SANS model parameters for use in the PARK fitting service. 
    20         The parameter attribute value is redirected to the underlying 
    21         parameter value in the SANS model. 
    22     """ 
    23     def __init__(self, name, model): 
    24          self._model, self._name = model,name 
    25          self.set(model.getParam(name)) 
    26           
    27     def _getvalue(self): return self._model.getParam(self.name) 
    28      
    29     def _setvalue(self,value):  
    30         self._model.setParam(self.name, value) 
    31          
    32     value = property(_getvalue,_setvalue) 
    33      
    34     def _getrange(self): 
    35         lo,hi = self._model.details[self.name][1:] 
    36         if lo is None: lo = -numpy.inf 
    37         if hi is None: hi = numpy.inf 
    38         return lo,hi 
    39      
    40     def _setrange(self,r): 
    41         self._model.details[self.name][1:] = r 
    42     range = property(_getrange,_setrange) 
     14from AbstractFitEngine import FitEngine,FitArrange,Model 
    4315 
    44  
    45 class Model(object): 
    46     """ 
    47         PARK wrapper for SANS models. 
    48     """ 
    49     def __init__(self, sans_model): 
    50         self.model = sans_model 
    51         #print "ParkFitting:sans model",self.model 
    52         sansp = sans_model.getParamList() 
    53         #print "ParkFitting: sans model parameter list",sansp 
    54         parkp = [SansParameter(p,sans_model) for p in sansp] 
    55         #print "ParkFitting: park model parameter ",parkp 
    56         self.parameterset = park.ParameterSet(sans_model.name,pars=parkp) 
    57          
    58     def eval(self,x): 
    59         #print "eval",self.parameterset[0].value,self.parameterset[1].value 
    60         #print "model run ",self.model.run(x) 
    61         return self.model.run(x) 
    62      
    63 class Data(object): 
    64     """ Wrapper class  for SANS data """ 
    65     def __init__(self,x=None,y=None,dy=None,dx=None,sans_data=None): 
    66         if not sans_data==None: 
    67             self.x= sans_data.x 
    68             self.y= sans_data.y 
    69             self.dx= sans_data.dx 
    70             self.dy= sans_data.dy 
    71         else: 
    72             if x!=None and y!=None and dy!=None: 
    73                 self.x=x 
    74                 self.y=y 
    75                 self.dx=dx 
    76                 self.dy=dy 
    77             else: 
    78                 raise ValueError,\ 
    79                 "Data is missing x, y or dy, impossible to compute residuals later on" 
    80         self.qmin=None 
    81         self.qmax=None 
    82         
    83     def setFitRange(self,mini=None,maxi=None): 
    84         """ to set the fit range""" 
    85         self.qmin=mini 
    86         self.qmax=maxi 
    87          
    88     def residuals(self, fn): 
    89         """ @param fn: function that return model value 
    90             @return residuals 
    91         """ 
    92         x,y,dy = [numpy.asarray(v) for v in (self.x,self.y,self.dy)] 
    93         if self.qmin==None and self.qmax==None:  
    94             self.fx = fn(x) 
    95             return (y - fn(x))/dy 
    96          
    97         else: 
    98             self.fx = fn(x[idx]) 
    99             idx = x>=self.qmin & x <= self.qmax 
    100             return (y[idx] - fn(x[idx]))/dy[idx] 
    101              
    102           
    103     def residuals_deriv(self, model, pars=[]): 
    104         """  
    105             @return residuals derivatives . 
    106             @note: in this case just return empty array 
    107         """ 
    108         return [] 
    109  
    110              
    11116class ParkFit(FitEngine): 
    11217    """  
     
    15459        i=0 
    15560        for k,value in self.fitArrangeList.iteritems(): 
    156             sansmodel=value.get_model() 
     61            #sansmodel=value.get_model() 
    15762            #wrap sans model 
    158             parkmodel = Model(sansmodel) 
     63            #parkmodel = Model(sansmodel) 
     64            parkmodel = value.get_model() 
    15965            #print "ParkFitting: createproblem: just create a model",parkmodel.parameterset 
    16066            for p in parkmodel.parameterset: 
     
    16268                #if p.isfixed(): 
    16369                #print 'parameters',p.name 
    164                 #print "self.paramList",self.paramList 
     70                print "parkfitting: self.paramList",self.paramList 
    16571                if p.isfixed() and p._getname()in self.paramList: 
    16672                    p.set([-numpy.inf,numpy.inf]) 
    16773            i+=1     
    16874            Ldata=value.get_data() 
    169             x,y,dy=self._concatenateData(Ldata) 
    170             #wrap sansdata 
    171             parkdata=Data(x,y,dy,None) 
     75            parkdata=self._concatenateData(Ldata) 
     76             
    17277            couple=(parkmodel,parkdata) 
    17378            #print "Parkfitting: fitness",couple    
     
    204109        localfit.ftol = 1e-8 
    205110        fitter = FitMC(localfit=localfit) 
    206          
     111        print "ParkFitting: result1" 
    207112        result = fit.fit(self.problem, 
    208113                     fitter=fitter, 
     
    212117            #for p in result.parameters: 
    213118            #    print "fit in park fitting", p.name, p.value,p.stderr 
    214             return result.fitness,result.pvec,result.cov,result 
     119            #return result.fitness,result.pvec,result.cov,result 
     120            return result 
    215121        else: 
    216122            raise ValueError, "SVD did not converge" 
Note: See TracChangeset for help on using the changeset viewer.