source: trunk/python/asapmath.py @ 294

Last change on this file since 294 was 273, checked in by kil064, 19 years ago

add arg. 'reftime' to function 'align'

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.8 KB
RevLine 
[101]1from scantable import scantable
[258]2from asap import rcParams
[101]3
[143]4def average_time(*args, **kwargs):
[101]5    """
[113]6    Return the (time) average of a scan or list of scans. [in channels only]
7    Parameters:
8        one scan or comma separated  scans
[143]9        mask:     an optional mask (only used for 'var' and 'tsys' weighting)
10        scanav:   False (default) averages all scans together,
11                  True averages each scan separately
12        weight:   Weighting scheme. 'none' (default), 'var' (variance
13                  weighted), 'tsys'
[113]14    Example:
15        # return a time averaged scan from scana and scanb
16        # without using a mask
[129]17        scanav = average_time(scana,scanb)
[113]18        # return the (time) averaged scan, i.e. the average of
19        # all correlator cycles
20        scanav = average_time(scan)
[143]21
[101]22    """
[143]23    scanAv = False
24    if kwargs.has_key('scanav'):
25       scanAv = kwargs.get('scanav')
[258]26
[143]27    weight = 'none'
28    if kwargs.has_key('weight'):
29       weight = kwargs.get('weight')
[258]30
[143]31    mask = ()
32    if kwargs.has_key('mask'):
33        mask = kwargs.get('mask')
[258]34
[143]35    lst = tuple(args)
36    from asap._asap import average as _av
[113]37    for s in lst:
[101]38        if not isinstance(s,scantable):
39            print "Please give a list of scantables"
40            return
[143]41    return scantable(_av(lst, mask, scanAv, weight))
[101]42
[245]43def quotient(source, reference, preserve=True):
[101]44    """
[246]45    Return the quotient of a 'source' (signal) scan and a 'reference' scan.
46    The reference can have just one row, even if the signal has many. Otherwise
47    they must have the same number of rows.
[101]48    Parameters:
49        source:        the 'on' scan
50        reference:     the 'off' scan
[245]51        preserve:      you can preserve (default) the continuum or
52                       remove it.  The equations used are
53                          preserve - Output = Tref * (sig/ref) - Tref
54                          remove   - Output = Tref * (sig/ref) - Tsig
[101]55    """
56    from asap._asap import quotient as _quot
[245]57    return scantable(_quot(source, reference, preserve))
[101]58
[258]59def simple_math(left, right, op='add'):
[242]60    """
61    Apply simple mathematical binary operations to two
62    scan tables,  returning the result in a new scan table.
63    The operation is applied to both the correlations and the TSys data
64    Parameters:
65        left:          the 'left' scan
66        right:         the 'right' scan
67        op:            the operation: 'add' (default), 'sub', 'mul', 'div'
68    """
[258]69    if not isinstance(left,scantable) and not isinstance(right,scantable):
70        print "Please provide two scantables as input"
71        return
[242]72    from asap._asap import b_operate as _bop
73    return scantable(_bop(left, right, op))
74
[258]75def scale(scan, factor, insitu=None, allaxes=None):
[101]76    """
77    Return a scan where all spectra are scaled by the give 'factor'
78    Parameters:
79        scan:        a scantable
[113]80        factor:      the scaling factor
[258]81        insitu:      if False a new scantable is returned.
[150]82                     Otherwise, the scaling is done in-situ
[258]83                     The default is taken from .asaprc (False)
84        allaxes:     if True apply to all spectra. Otherwise
85                     apply only to the selected (beam/pol/if)spectra only.
86                     The default is taken from .asaprc (True)
[101]87    """
[258]88    if allaxes is None: allaxes = rcParams['scantable.allaxes']
89    if insitu is None: insitu = rcParams['insitu']
[141]90    if not insitu:
91        from asap._asap import scale as _scale
[258]92        return scantable(_scale(scan, factor, allaxes))
[141]93    else:
94        from asap._asap import scale_insitu as _scale
[258]95        _scale(scan, factor, allaxes)
[141]96        return
97       
[101]98
[258]99def add(scan, offset, insitu=None, allaxes=None):
[113]100    """
[150]101    Return a scan where all spectra have the offset added
[113]102    Parameters:
103        scan:        a scantable
[150]104        offset:      the offset
[258]105        insitu:      if False a new scantable is returned.
106                     Otherwise, the scaling is done in-situ
107                     The default is taken from .asaprc (False)
108        allaxes:     if True apply to all spectra. Otherwise
[150]109                     apply only to the selected (beam/pol/if)spectra only
[258]110                     The default is taken from .asaprc (True)
[113]111    """
[258]112    if allaxes is None: allaxes = rcParams['scantable.allaxes']
113    if insitu is None: insitu = rcParams['insitu']
[150]114    if not insitu:
115        from asap._asap import add as _add
[258]116        return scantable(_add(scan, offset, allaxes))
[150]117    else:
118        from asap._asap import add_insitu as _add
[258]119        _add(scan, offset, allaxes)
[150]120        return
121       
[258]122def convert_flux(scan, area, eta=1.0, insitu=None, allaxes=None):
[224]123    """
124    Return a scan where all spectra are converted to either Jansky or Kelvin
125        depending upon the flux units of the scan table.
126    Parameters:
127        scan:        a scantable
128        area:        the illuminated area of the telescope (m**2)
129        eta:         The efficiency of the telescope (default 1.0)       
[258]130        insitu:      if False a new scantable is returned.
131                     Otherwise, the scaling is done in-situ
132                     The default is taken from .asaprc (False)
133        allaxes:         if True apply to all spectra. Otherwise
[224]134                     apply only to the selected (beam/pol/if)spectra only
[258]135                     The default is taken from .asaprc (True)
[224]136    """
[258]137    if allaxes is None: allaxes = rcParams['scantable.allaxes']
138    if insitu is None: insitu = rcParams['insitu']
[224]139    if not insitu:
140        from asap._asap import convertflux as _convert
[258]141        return scantable(_convert(scan, area, eta, allaxes))
[224]142    else:
143        from asap._asap import convertflux_insitu as _convert
[258]144        _convert(scan, area, eta, allaxes)
[224]145        return
[229]146
[258]147def gain_el(scan, poly=None, filename="", method="linear", insitu=None, allaxes=None):
[229]148    """
[242]149    Return a scan after applying a gain-elevation correction. The correction
150    can be made via either a polynomial or a table-based interpolation
151    (and extrapolation if necessary).
152    You specify polynomial coefficients, an ascii table or neither.
153    If you specify neither, then a polynomial correction will be made
154    with built in coefficients known for certain telescopes (an error will
155    occur if the instrument is not known).
[229]156    Parameters:
157        scan:        a scantable
[258]158        poly:        Polynomial coefficients (default None) to compute a
159                     gain-elevation correction as a function of
160                     elevation (in degrees).
[242]161        filename:    The name of an ascii file holding correction factors.
162                     The first row of the ascii file must give the column
163                     names and these MUST include columns
[258]164                     "ELEVATION" (degrees) and "FACTOR" (multiply data by this)
165                     somewhere.
166                     The second row must give the data type of the column. Use
167                     'R' for Real and 'I' for Integer.  An example file
168                     would be:
[229]169
[242]170                     TIME ELEVATION FACTOR
171                     R R R
172                     0.1 0 1.5
173                     0.2 20 1.4
174                     0.3 40 1.3
175                     0.4 60 1.2
176                     0.5 80 1.1
177                     0.6 90 1.0
178        method:      Interpolation method when correcting from a table. Values
179                     are  "nearest", "linear" (default), "cubic" and "spline"
[258]180        insitu:      if False a new scantable is returned.
181                     Otherwise, the scaling is done in-situ
182                     The default is taken from .asaprc (False)
183        allaxes:         if True apply to all spectra. Otherwise
184                     apply only to the selected (beam/pol/if) spectra only
185                     The default is taken from .asaprc (True)
[229]186    """
[258]187    if allaxes is None: allaxes = rcParams['scantable.allaxes']
[242]188    if poly is None:
189       poly = ()
[258]190    if insitu is None: insitu = rcParams['insitu']
[229]191    if not insitu:
192        from asap._asap import gainel as _gainEl
[258]193        return scantable(_gainEl(scan, poly, filename, method, allaxes))
[229]194    else:
195        from asap._asap import gainel_insitu as _gainEl
[258]196        _gainEl(scan, poly, filename, method, allaxes)
[229]197        return
[224]198       
[273]199def align(scan, reftime=None, insitu=None):
[269]200    """
[271]201        Return a scan where all rows have been aligned in velocity. The
202        velocity reference frame (e.gh. LSRK), unit and doppler (e.g. OPTICAL)
[273]203        are those set by functions  set_unit and set_freqframe. 
[269]204        scan:        a scantable
[273]205        reftime:     reference time to align at. By default, the time of
206                     the first row of data is used. 
[269]207        insitu:      if False a new scantable is returned.
208                     Otherwise, the scaling is done in-situ
209                     The default is taken from .asaprc (False)
210    """
[273]211    if reftime is None: reftime = ''
[269]212    if insitu is None: insitu = rcParams['insitu']
213    if not insitu:
214        from asap._asap import align as _align
[273]215        return scantable(_align(scan, reftime))
[269]216    else:
217        from asap._asap import align_insitu as _align
[273]218        _align(scan, reftime)
[269]219        return
220       
[258]221def opacity(scan, tau, insitu=None, allaxes=None):
[242]222    """
223    Return a scan after applying an opacity correction.
224    Parameters:
225        scan:        a scantable
226        tau:         Opacity from which the correction factor is exp(tau*ZD)
227                     where ZD is the zenith-distance
[258]228        insitu:      if False a new scantable is returned.
229                     Otherwise, the scaling is done in-situ
230                     The default is taken from .asaprc (False)
231        allaxes:     if True apply to all spectra. Otherwise
[242]232                     apply only to the selected (beam/pol/if)spectra only
[258]233                     The default is taken from .asaprc (True)
[242]234    """
[258]235    if allaxes is None: allaxes = rcParams['scantable.allaxes']
236    if insitu is None: insitu = rcParams['insitu']
[242]237    if not insitu:
238        from asap._asap import opacity as _opacity
[258]239        return scantable(_opacity(scan, tau, allaxes))
[242]240    else:
241        from asap._asap import opacity_insitu as _opacity
[258]242        _opacity(scan, tau, allaxes)
[242]243        return
244       
[258]245def bin(scan, width=5, insitu=None):
[101]246    """
[167]247    Return a scan where all spectra have been binned up
[172]248        width:       The bin width (default=5) in pixels
[258]249        insitu:      if False a new scantable is returned.
250                     Otherwise, the scaling is done in-situ
251                     The default is taken from .asaprc (False)
[101]252    """
[258]253    if insitu is None: insitu = rcParams['insitu']
[167]254    if not insitu:
255        from asap._asap import bin as _bin
256        return scantable(_bin(scan, width))
257    else:
258        from asap._asap import bin_insitu as _bin
259        _bin(scan, width)
260        return
[113]261
[258]262def average_pol(scan, mask=None, insitu=None):
[113]263    """
264    Average the Polarisations together.
265    Parameters:
[172]266        scan:        The scantable
267        mask:        An optional mask defining the region, where the
268                     averaging will be applied. The output will have all
269                     specified points masked.
[258]270        insitu:      if False a new scantable is returned.
271                     Otherwise, the scaling is done in-situ
272                     The default is taken from .asaprc (False)
[113]273    Example:
274        polav = average_pols(myscan)
275    """
276    if mask is None:
[166]277        mask = ()
[258]278    if insitu is None: insitu = rcParams['insitu']
[166]279    if not insitu:
280        from asap._asap import averagepol as _avpol
281        return scantable(_avpol(scan, mask))
282    else:
283        from asap._asap import averagepol_insitu as _avpol
284        _avpol(scan, mask)
285        return
[113]286   
[258]287def smooth(scan, kernel="hanning", width=5.0, insitu=None, allaxes=None):
[113]288    """
[180]289    Smooth the spectrum by the specified kernel (conserving flux).
[113]290    Parameters:
[172]291        scan:       The input scan
[180]292        kernel:     The type of smoothing kernel. Select from
293                    'hanning' (default), 'gaussian' and 'boxcar'.
294                    The first three characters are sufficient.
295        width:      The width of the kernel in pixels. For hanning this is
296                    ignored otherwise it defauls to 5 pixels.
297                    For 'gaussian' it is the Full Width Half
298                    Maximum. For 'boxcar' it is the full width.
[258]299        insitu:     if False a new scantable is returned.
[172]300                    Otherwise, the scaling is done in-situ
[258]301                    The default is taken from .asaprc (False)
302        allaxes:    If True (default) apply to all spectra. Otherwise
[180]303                    apply only to the selected (beam/pol/if)spectra only
[258]304                    The default is taken from .asaprc (True)
[113]305    Example:
306         none
307    """
[258]308    if allaxes is None: allaxes = rcParams['scantable.allaxes']
309    if insitu is None: insitu = rcParams['insitu']
[172]310    if not insitu:
[180]311        from asap._asap import smooth as _smooth
[258]312        return scantable(_smooth(scan,kernel,width,allaxes))
[172]313    else:
[180]314        from asap._asap import smooth_insitu as _smooth
[258]315        _smooth(scan,kernel,width,allaxes)
[172]316        return
[113]317   
[258]318def poly_baseline(scan, mask=None, order=0, insitu=None):
[113]319    """
[160]320    Return a scan which has been baselined (all rows) by a polynomial.
[113]321    Parameters:
322        scan:    a scantable
323        mask:    an optional mask
324        order:   the order of the polynomial (default is 0)
[258]325        insitu:      if False a new scantable is returned.
326                     Otherwise, the scaling is done in-situ
327                     The default is taken from .asaprc (False)
[113]328    Example:
329        # return a scan baselined by a third order polynomial,
330        # not using a mask
331        bscan = poly_baseline(scan, order=3)
332    """
333    from asap.asapfitter import fitter
334    if mask is None:
335        from numarray import ones
336        mask = tuple(ones(scan.nchan()))
337    f = fitter()
338    f._verbose(True)
339    f.set_scan(scan, mask)
340    f.set_function(poly=order)   
[258]341    sf = f.auto_fit(insitu)
[113]342    return sf
Note: See TracBrowser for help on using the repository browser.