Changeset 5859862 in sasview for DataLoader/qsmearing.py


Ignore:
Timestamp:
Sep 20, 2009 5:41:40 PM (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:
a65ffcb
Parents:
a1100c07
Message:

dataloader: fixed problem with uneven binning. Added utility method to get first and last bins in unsmeared q.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • DataLoader/qsmearing.py

    ra3f8d58 r5859862  
    1212import numpy 
    1313import math 
     14import logging, sys 
    1415import scipy.special 
    1516 
     
    99100         
    100101    def _compute_matrix(self): return NotImplemented 
     102 
     103    def get_bin_range(self, q_min=None, q_max=None): 
     104        """ 
     105            @param q_min: minimum q-value to smear 
     106            @param q_max: maximum q-value to smear  
     107        """ 
     108        if q_min == None: 
     109            q_min = self.min 
     110         
     111        if q_max == None: 
     112            q_max = self.max 
     113         
     114        _qmin_unsmeared, _qmax_unsmeared = self.get_unsmeared_range(q_min, q_max) 
     115         
     116        _first_bin = None 
     117        _last_bin  = None 
     118 
     119        step = (self.max-self.min)/(self.nbins-1.0) 
     120        for i in range(self.nbins): 
     121            q_i = smearer.get_q(self._smearer, i) 
     122            if (q_i >= _qmin_unsmeared) and (q_i <= _qmax_unsmeared): 
     123                # Identify first and last bin 
     124                if _first_bin is None: 
     125                    _first_bin = i 
     126                else: 
     127                    _last_bin  = i 
     128                
     129        return _first_bin, _last_bin 
    101130 
    102131    def __call__(self, iq_in, first_bin=0, last_bin=None): 
     
    161190            This method HAS to be called before smearing 
    162191        """ 
    163         self._smearer = smearer.new_slit_smearer(self.width, self.height, self.min, self.max, self.nbins) 
     192        #self._smearer = smearer.new_slit_smearer(self.width, self.height, self.min, self.max, self.nbins) 
     193        self._smearer = smearer.new_slit_smearer_with_q(self.width, self.height, self.qvalues) 
    164194        self._init_complete = True 
    165195 
     196    def get_unsmeared_range(self, q_min, q_max): 
     197        """ 
     198            Determine the range needed in unsmeared-Q to cover 
     199            the smeared Q range 
     200        """ 
     201        # Range used for input to smearing 
     202        _qmin_unsmeared = q_min 
     203        _qmax_unsmeared = q_max  
     204        try: 
     205            _qmin_unsmeared = self.min 
     206            _qmax_unsmeared = self.max 
     207        except: 
     208            logging.error("_SlitSmearer.get_bin_range: %s" % sys.exc_value) 
     209        return _qmin_unsmeared, _qmax_unsmeared 
    166210 
    167211class SlitSmearer(_SlitSmearer): 
     
    199243        self.nbins = len(data1D.x) 
    200244        ## Minimum Q  
    201         self.min = data1D.x[0] 
     245        self.min = min(data1D.x) 
    202246        ## Maximum 
    203         self.max = data1D.x[len(data1D.x)-1]         
    204  
    205         #print "nbin,npts",self.nbins,self.npts 
     247        self.max = max(data1D.x) 
     248        ## Q-values 
     249        self.qvalues = data1D.x 
     250         
    206251 
    207252class _QSmearer(_BaseSmearer): 
     
    236281            This method HAS to be called before smearing 
    237282        """ 
    238         self._smearer = smearer.new_q_smearer(numpy.asarray(self.width), self.min, self.max, self.nbins) 
     283        #self._smearer = smearer.new_q_smearer(numpy.asarray(self.width), self.min, self.max, self.nbins) 
     284        self._smearer = smearer.new_q_smearer_with_q(numpy.asarray(self.width), self.qvalues) 
    239285        self._init_complete = True 
     286         
     287    def get_unsmeared_range(self, q_min, q_max): 
     288        """ 
     289            Determine the range needed in unsmeared-Q to cover 
     290            the smeared Q range 
     291            Take 3 sigmas as the offset between smeared and unsmeared space 
     292        """ 
     293        # Range used for input to smearing 
     294        _qmin_unsmeared = q_min 
     295        _qmax_unsmeared = q_max  
     296        try: 
     297            offset = 3.0*max(self.width) 
     298            _qmin_unsmeared = max([self.min, q_min-offset]) 
     299            _qmax_unsmeared = min([self.max, q_max+offset]) 
     300        except: 
     301            logging.error("_QSmearer.get_bin_range: %s" % sys.exc_value) 
     302        return _qmin_unsmeared, _qmax_unsmeared 
     303         
     304         
    240305         
    241306class QSmearer(_QSmearer): 
     
    260325        self.nbins = len(data1D.x) 
    261326        ## Minimum Q  
    262         self.min = data1D.x[0] 
     327        self.min = min(data1D.x) 
    263328        ## Maximum 
    264         self.max = data1D.x[len(data1D.x)-1]         
     329        self.max = max(data1D.x) 
     330        ## Q-values 
     331        self.qvalues = data1D.x 
    265332 
    266333 
Note: See TracChangeset for help on using the changeset viewer.