Changeset 46d50ca in sasview for Invariant


Ignore:
Timestamp:
Jan 9, 2010 3:41:56 PM (14 years ago)
Author:
Mathieu Doucet <doucetm@…>
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:
9e37661
Parents:
b345c45
Message:

invariant: started cleaning up [not done]

Location:
Invariant
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • Invariant/invariant.py

    r4d270706 r46d50ca  
    77import numpy 
    88 
    9 from sans.guiframe.dataFitting import Data1D as LoaderData1D 
     9from DataLoader.data_info import Data1D as LoaderData1D 
    1010from DataLoader.qsmearing import smear_selection 
    1111 
     
    6666        """ 
    6767        self.data  = data 
    68         x_len = len(self.data.x) -1 
    69         #fitting range  
    70         self.qmin =  self.data.x[0]     
    71         if self.qmin == 0: 
    72             self.qmin = Q_MINIMUM  
    73      
    74         self.qmax = self.data.x[x_len] 
    75         #Unsmeared q range 
    76         self._qmin_unsmeared = 0 
    77         self._qmax_unsmeared = self.data.x[x_len] 
    78          
    79         #bin for smear data 
    80         self._first_unsmeared_bin = 0 
    81         self._last_unsmeared_bin  = x_len 
    82          
    83         # Identify the bin range for the unsmeared and smeared spaces 
    84         self.idx = (self.data.x >= self.qmin) & (self.data.x <= self.qmax) 
    85         self.idx_unsmeared = (self.data.x >= self._qmin_unsmeared) \ 
    86                             & (self.data.x <= self._qmax_unsmeared) 
    87    
     68         
     69        # Set qmin as the lowest non-zero value 
     70        self.qmin = Q_MINIMUM 
     71        for q_value in self.data.x: 
     72            if q_value>0:  
     73                self.qmin = q_value 
     74                break 
     75        self.qmax = max(self.data.x) 
     76        
    8877        #get the smear object of data 
    8978        self.smearer = smear_selection( self.data ) 
     79        # Set the q-range information to allow smearing 
     80        self.set_fit_range() 
    9081       
    9182    def set_fit_range(self ,qmin=None, qmax=None): 
     
    10192        self._qmax_unsmeared = self.qmax     
    10293         
    103         self._first_unsmeared_bin = 0 
    104         self._last_unsmeared_bin  = len(self.data.x)-1 
    105          
    106         if self.smearer!=None: 
     94        if self.smearer is not None: 
    10795            self._first_unsmeared_bin, self._last_unsmeared_bin = self.smearer.get_bin_range(self.qmin, self.qmax) 
    10896            self._qmin_unsmeared = self.data.x[self._first_unsmeared_bin] 
     
    119107           @param power = a fixed, otherwise None 
    120108        """ 
    121         power = power 
    122109        fx = numpy.zeros(len(self.data.x)) 
    123         one = numpy.ones(len(self.data.x)) 
    124  
    125         #define dy^2 
    126         try: 
    127             sigma = self.data.dy[self.idx_unsmeared ] 
    128         except: 
    129             print "The dy data for Invariant calculation should be prepared before get to FitFunctor.fit()..." 
    130             sigma = one[self.idx_unsmeared ] 
    131         sigma2 = sigma * sigma 
     110 
     111        # Uncertainty 
     112        if type(self.data.y)==numpy.ndarray and len(self.data.y)==len(self.data.x): 
     113            sigma = self.data.y 
     114        else: 
     115            sigma = numpy.ones(len(self.data.x)) 
    132116 
    133117        # Compute theory data f(x) 
    134         fx = self.data.y[self.idx_unsmeared ]/sigma 
     118        fx[self.idx_unsmeared] = self.data.y[self.idx_unsmeared]/sigma[self.idx_unsmeared] 
    135119        ## Smear theory data 
    136120        if self.smearer is not None: 
     
    139123        ##power is given only for function = power_law     
    140124        if power != None: 
     125            sigma2 = sigma * sigma 
    141126            a = -(power) 
    142             b = (numpy.sum(fx/sigma) - a*numpy.sum(self.data.x[self.idx]/sigma2))/numpy.sum(numpy.ones(len(sigma2))/sigma2) 
     127            b = (numpy.sum(fx[self.idx]/sigma[self.idx]) - a*numpy.sum(self.data.x[self.idx]/sigma2[self.idx]))/numpy.sum(numpy.ones(len(sigma2[self.idx]))/sigma2[self.idx]) 
    143128            return a, b 
    144129        else: 
    145             A = numpy.vstack([ self.data.x[self.idx]/sigma, 
    146                                numpy.ones(len(self.data.x[self.idx]))/sigma]).T 
     130            A = numpy.vstack([ self.data.x[self.idx]/sigma[self.idx], 
     131                               numpy.ones(len(self.data.x[self.idx]))/sigma[self.idx]]).T 
    147132            
    148             a, b = numpy.linalg.lstsq(A, fx)[0] 
     133            a, b = numpy.linalg.lstsq(A, fx[self.idx])[0] 
    149134            return a, b 
    150135 
     
    165150            Initialize variables 
    166151            @param data: data must be of type DataLoader.Data1D 
    167             @param contrast: contrast value of type float 
    168             @param pConst: Porod Constant of type float 
     152            @param background: Background value. The data will be corrected before processing 
     153            @param scale: Scaling factor for I(q). The data will be corrected before processing 
    169154        """ 
    170155        # Background and scale should be private data member if the only way to 
     
    202187            #Process only data that inherited from DataLoader.Data_info.Data1D 
    203188            raise ValueError,"Data must be of type DataLoader.Data1D" 
    204         new_data = self._scale * data - self._background 
    205         try: 
    206             #All data should pass here. 
    207             new_data.dy = data.dy 
    208             new_data.dxl = data.dxl 
    209             new_data.dxw = data.dxw         
    210         except: 
    211             #in case... 
    212             new_data.dy = numpy.ones(len(data.x)) 
    213             new_data.dxl = numpy.zeros(len(data.x)) 
    214             new_data.dxw = numpy.zeros(len(data.x))        
     189             
     190        new_data = (self._scale * data) - self._background 
     191         
     192        # Copy data that is not copied by the operations 
     193        #TODO: fix this in DataLoader 
     194        new_data.dxl = data.dxl 
     195        new_data.dxw = data.dxw         
    215196 
    216197        return new_data 
     
    410391            note: if data doesn't contain dy assume dy= math.sqrt(data.y) 
    411392        """ 
    412         if data is None: 
    413             data = self.data 
    414              
    415393        if len(data.x) <= 1 or len(data.y) <= 1 or \ 
    416394            len(self.data.x) != len(self.data.y): 
     
    548526        qmin = self._data.x[0] 
    549527        qmax = self._data.x[self._low_extrapolation_npts - 1] 
    550         try: 
    551             # fit the data with a model to get the appropriate parameters 
    552             a, b = self._fit(function=self._low_extrapolation_function, 
    553                               qmin=qmin, 
    554                               qmax=qmax, 
    555                               power=self._low_extrapolation_power) 
    556         except: 
    557             #raise 
    558             return None 
     528         
     529        # Extrapolate the low-Q data 
     530        #TODO: this fit fails. Fix it. 
     531        a, b = self._fit(function=self._low_extrapolation_function, 
     532                          qmin=qmin, 
     533                          qmax=qmax, 
     534                          power=self._low_extrapolation_power) 
    559535         
    560536        #q_start point 
  • Invariant/test/utest_use_cases.py

    rb345c45 r46d50ca  
    9696    def test_wrong_data(self): 
    9797        """ test receiving Data1D not of type loader""" 
    98         # That just doesn;t make sense 
    99          
    100         wrong_data= Data1D() 
    101         invariant.InvariantCalculator(wrong_data) 
    102          
    103         try: 
    104             self.assertRaises(ValueError,invariant.InvariantCalculator(wrong_data)) 
    105         except ValueError, msg: 
    106             print "test pass "+ str(msg) 
    107         else: raise ValueError, "fail to raise exception when expected" 
    108      
    109         print "test" 
    110         self.assertRaises(ValueError,invariant.InvariantCalculator, wrong_data ) 
     98 
     99 
     100        self.assertRaises(ValueError,invariant.InvariantCalculator, Data1D()) 
    111101         
    112102    def test_use_case_1(self): 
Note: See TracChangeset for help on using the changeset viewer.