Changeset 4026380 in sasview for DataLoader/invariant.py


Ignore:
Timestamp:
Nov 14, 2009 10:33:21 AM (15 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:
fd6b789
Parents:
c13b8cc
Message:

dataloader: improved invariant

File:
1 edited

Legend:

Unmodified
Added
Removed
  • DataLoader/invariant.py

    r01fb70b r4026380  
    1414        @note: The data boundaries are assumed as infinite range.  
    1515    """ 
    16     def __init__(self, data,contrast=None, pConst=None): 
     16    def __init__(self, data): 
    1717        """ 
    1818            Initialize variables 
     
    2121            @param pConst: Porod Constant of type float 
    2222        """ 
    23         self.q_star = self.getQstar(data= data) 
    24         self.volume = self._getVolFrac(contrast= contrast) 
    25         self.surface= self._getSurface(pConst= pConst) 
     23        ## Invariant 
     24        self.q_star = self._get_q_star(data= data) 
    2625         
    27     def __call__(self, contrast, pConst): 
    28         """ 
    29             @precondition: self.q_star has already been computed 
    30         """ 
    31         self.volume = self._getVolFrac(contrast= contrast) 
    32         self.surface = self._getSurface(pConst= pConst) 
    33          
    34         return self 
    35          
    36     def getQstar(self, data): 
     26    def _get_q_star(self, data): 
    3727        """ 
    3828            @param data: data of type Data1D 
     
    4232            #Process only data that inherited from DataLoader.Data_info.Data1D 
    4333            raise ValueError,"Data must be of type DataLoader.Data1D" 
    44         if data.dxl == None: 
    45             return self._getQStarUnsmear(data= data) 
     34         
     35        # Check whether we have slit smearing information 
     36        if data.is_slit_smeared(): 
     37            return self._get_qstar_unsmeared(data= data) 
    4638        else: 
    47             return self._getQStarSmear(data= data) 
     39            return self._get_qstar_smeared(data= data) 
    4840     
    4941             
    5042             
    51     def _getQStarUnsmear(self, data): 
     43    def _get_qstar_unsmeared(self, data): 
    5244        """ 
    5345            @param data: data of type Data1D 
     
    8678             
    8779                
    88     def _getQStarSmear(self, data): 
     80    def _get_qstar_smeared(self, data): 
    8981        """ 
    9082            @param data: data of type Data1D 
    91             Compute invariant with smearing info 
     83            Compute invariant with slit smearing info 
    9284            q_star= x0*dxl *y0 *dx0 + x1*dxl *y1 *dx1 + ..+ xn*dxl *yn *dxn  
    9385            where n= infinity 
     
    125117                return sum 
    126118         
    127     def _getVolFrac(self,contrast): 
     119    def get_volume_fraction(self, contrast): 
    128120        """ 
    129121            Compute volume fraction is given by: 
     
    137129                q_star unit  1/A^(3)*1/cm 
    138130                 
    139             the result returned will be 0<= volume <= 1 or None 
     131            the result returned will be 0<= volume <= 1 
    140132             
    141133            @param contrast: contrast value provides by the user of type float 
    142             @return None : if the invariant Calculator does not a computed 
    143             q_star already  stored 
     134            @return: volume fraction 
    144135            @note: volume fraction must have no unit 
    145136        """ 
    146         if contrast ==None: 
    147             #No contrast value is provided for calculation then no calculation 
    148             return  
    149137        if contrast < 0: 
    150138            raise ValueError, "contrast must be greater than zero"   
    151139         
    152140        if self.q_star ==None: 
    153             return   
     141            raise RuntimeError, "Q_star is not defined" 
    154142         
    155143        if self.q_star < 0: 
    156             raise ValueError, "invariant must be greater than zero" 
     144            raise ValueError, "invariant must be greater than zero. Q_star=%g" % self.q_star 
    157145        
    158146        #compute intermediate constant 
     
    161149        discrim= 1 - 4*k 
    162150        if discrim < 0: 
    163             return  
     151            raise RuntimeError, "could not compute the volume fraction: negative discriminant" 
    164152        elif discrim ==0: 
    165153            volume = 1/2 
     
    169157            volume1 = 0.5 *(1 - math.sqrt(discrim)) 
    170158            volume2 = 0.5 *(1 + math.sqrt(discrim)) 
    171             print "volume1",volume1 
    172             print "volume2",volume2 
    173159            
    174160            if 0<= volume1 and volume1 <= 1: 
     
    176162            elif 0<= volume2 and volume2<= 1:  
    177163                return volume2  
    178             return  
     164            raise RuntimeError, "could not compute the volume fraction: inconsistent results" 
    179165     
    180     def _getSurface(self, pConst, volume=None): 
     166    def get_surface(self, contrast, porod_const): 
    181167        """ 
    182168            Compute the surface given by: 
    183169                surface = (2*pi *volume(1- volume)*pConst)/ q_star 
    184             @param volume : volume previously calculated 
    185             @return None: if volume used for computation equal None 
     170                 
     171            @param contrast: contrast value provides by the user of type float 
     172            @param porod_const: Porod constant  
     173            @return: specific surface 
    186174        """ 
    187         #check if the user provides a value for volume 
    188         if volume != None: 
    189             self.volume = float(volume) 
     175        # Compute the volume 
     176        volume = self.get_volume_fraction(contrast) 
    190177         
    191         #return None if volume or q_star is not computed 
    192         if self.q_star ==None or self.volume == None: 
    193             return  
     178        # Check whether we have Q star 
     179        if self.q_star ==None: 
     180            raise RuntimeError, "Q_star is not defined" 
     181         
    194182        if self.q_star ==0: 
    195             raise ZeroDivisionError, "invariant must be greater than zero" 
     183            raise ValueError, "invariant must be greater than zero. Q_star=%g" % self.q_star 
    196184         
    197         return 2*math.pi*self.volume*(1- self.volume)*float(pConst)/self.q_star 
     185        return 2*math.pi*volume*(1-volume)*float(porod_const)/self.q_star 
    198186         
    199187         
Note: See TracChangeset for help on using the changeset viewer.