Changeset 370 for trunk/python


Ignore:
Timestamp:
02/06/05 19:46:16 (19 years ago)
Author:
vor010
Message:

LineFinder?: help is improved. Initial code for
automatic baseline fitter is written (not debugged yet)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/python/asaplinefind.py

    r369 r370  
    44    """
    55    The class for automated spectral line search in ASAP.
     6
     7    Example:
     8       fl=linefinder()
     9       fl.set_scan(sc,edge=(50,))
     10       fl.set_options(threshold=3)
     11       nlines=fl.find_lines()
     12       if nlines!=0:
     13          print "Found ",nlines," spectral lines"
     14          print fl.get_ranges(False)
     15       else:
     16          print "No lines found!"
     17       sc2=poly_baseline(sc,fl.get_mask(),7)
     18   
     19    The algorithm involves a simple threshold criterion. The line is
     20    considered to be detected if a specified number of consequtive
     21    channels (default is 3) is brighter (with respect to the current baseline
     22    estimate) than the threshold times the noise level. This criterion is
     23    applied in the iterative procedure updating baseline estimate and trying
     24    reduced spectral resolutions to detect broad lines as well. The off-line
     25    noise level is determined at each iteration as an average of 80% of the
     26    lowest variances across the spectrum (i.e. histogram equalization is
     27    used to avoid missing weak lines if strong ones are present). For
     28    bad baseline shapes it is reccommended to increase the threshold and
     29    possibly switch the averaging option off (see set_options) to
     30    detect strong lines only, fit a high order baseline and repeat the line
     31    search.
     32
    633    """
    734
     
    6188            self.finder.setscan(scan,mask,edge)
    6289        return
    63     def find_lines(self):
     90    def find_lines(self,nRow=0):
    6491        """
    6592        Search for spectral lines in the scan assigned in set_scan.
     93        Current Beam/IF/Pol is used, Row is specified by parameter
    6694        A number of lines found will be returned
    6795        """
    68         return self.finder.findlines()
     96        return self.finder.findlines(nRow)
    6997    def get_mask(self,invert=False):
    7098        """
     
    89117                        if False, the range will be expressed in channels
    90118        """
    91         return self.finder.getlineranges(defunits)
     119        if (defunits):
     120            return self.finder.getlineranges()
     121        else:
     122            return self.finder.getlinerangesinchannels()
     123
     124def auto_poly_baseline(scan, mask=None, edge=(0,0), order=0,
     125    threshold=3,insitu=None):
     126    """
     127    Return a scan which has been baselined (all rows) by a polynomial.
     128    Spectral lines are detected first using linefinder and masked out
     129    to avoid them affecting the baseline solution.
     130
     131    Parameters:
     132        scan:    a scantable
     133        mask:       an optional mask retreived from scantable
     134        edge:       an optional number of channel to drop at
     135                    the edge of spectrum. If only one value is
     136                    specified, the same number will be dropped from
     137                    both sides of the spectrum. Default is to keep
     138                    all channels
     139        order:      the order of the polynomial (default is 0)
     140        threshold:  the threshold used by line finder. It is better to
     141                    keep it large as only strong lines affect the
     142                    baseline solution.
     143        insitu:     if False a new scantable is returned.
     144                    Otherwise, the scaling is done in-situ
     145                    The default is taken from .asaprc (False)
     146
     147    Example:
     148        sc2=auto_poly_baseline(sc,order=7)
     149    """
     150    from asap.asapfitter import fitter
     151    from asap import scantable
     152
     153    # setup fitter
     154
     155    f = fitter()
     156    f._verbose(True)
     157    f.set_function(poly=order)
     158
     159    # setup line finder
     160
     161    fl=linefinder()
     162    fl.set_options(threshold=threshold)
     163
     164    if not insitu:
     165        workscan=scan.copy()
     166    else:
     167        workscan=scan
     168
     169    vb=workscan._vb
     170    # remember the verbose parameter and selection
     171    workscan._vb=False
     172    sel=workscan.get_cursor()
     173    rows=range(workscan.nrow())
     174    for i in range(workscan.nbeam()):
     175        workscan.setbeam(i)
     176        for j in range(workscan.nif()):
     177            workscan.setif(j)
     178            for k in range(workscan.npol()):
     179                scan.setpol(k)
     180                if f._vb:
     181                   print "Processing:"
     182                   print 'Beam[%d], IF[%d], Pol[%d]' % (i,j,k)
     183                for iRow in rows:
     184                   fl.set_scan(workscan,mask,edge)
     185                   fl.find_lines(iRow)
     186                   f.set_scan(workscan, fl.get_mask())
     187                   f.x=workscan._getabcissa(iRow)
     188                   f.y=workscan._getspectrum(iRow)
     189                   f.data=None
     190                   f.fit()
     191                   workscan._setspectrum(f.getresidual(),iRow)
     192    workscan.set_cursor(sel[0],sel[1],sel[2])
     193    workscan._vb = vb
     194    if not insitu:
     195       return scan
Note: See TracChangeset for help on using the changeset viewer.