source: trunk/python/asapmath.py @ 229

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

add gain-elevation correction functionality

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.6 KB
Line 
1from scantable import scantable
2
3def average_time(*args, **kwargs):
4    """
5    Return the (time) average of a scan or list of scans. [in channels only]
6    Parameters:
7        one scan or comma separated  scans
8        mask:     an optional mask (only used for 'var' and 'tsys' weighting)
9        scanav:   False (default) averages all scans together,
10                  True averages each scan separately
11        weight:   Weighting scheme. 'none' (default), 'var' (variance
12                  weighted), 'tsys'
13    Example:
14        # return a time averaged scan from scana and scanb
15        # without using a mask
16        scanav = average_time(scana,scanb)
17        # return the (time) averaged scan, i.e. the average of
18        # all correlator cycles
19        scanav = average_time(scan)
20
21    """
22    scanAv = False
23    if kwargs.has_key('scanav'):
24       scanAv = kwargs.get('scanav')
25#
26    weight = 'none'
27    if kwargs.has_key('weight'):
28       weight = kwargs.get('weight')
29#
30    mask = ()
31    if kwargs.has_key('mask'):
32        mask = kwargs.get('mask')
33#
34    lst = tuple(args)
35    from asap._asap import average as _av
36    for s in lst:
37        if not isinstance(s,scantable):
38            print "Please give a list of scantables"
39            return
40    return scantable(_av(lst, mask, scanAv, weight))
41
42def quotient(source, reference):
43    """
44    Return the quotient of a 'source' scan and a 'reference' scan
45    Parameters:
46        source:        the 'on' scan
47        reference:     the 'off' scan
48    """
49    from asap._asap import quotient as _quot
50    return scantable(_quot(source, reference))
51
52def scale(scan, factor, insitu=False, all=True):
53    """
54    Return a scan where all spectra are scaled by the give 'factor'
55    Parameters:
56        scan:        a scantable
57        factor:      the scaling factor
58        insitu:      if False (default) a new scantable is returned.
59                     Otherwise, the scaling is done in-situ
60        all:         if True (default) apply to all spectra. Otherwise
61                     apply only to the selected (beam/pol/if)spectra only
62    """
63    if not insitu:
64        from asap._asap import scale as _scale
65        return scantable(_scale(scan, factor, all))
66    else:
67        from asap._asap import scale_insitu as _scale
68        _scale(scan, factor, all)
69        return
70       
71
72def add(scan, offset, insitu=False, all=True):
73    """
74    Return a scan where all spectra have the offset added
75    Parameters:
76        scan:        a scantable
77        offset:      the offset
78        insitu:      if False (default) a new scantable is returned.
79                     Otherwise, the addition is done in-situ
80        all:         if True (default) apply to all spectra. Otherwise
81                     apply only to the selected (beam/pol/if)spectra only
82    """
83    if not insitu:
84        from asap._asap import add as _add
85        return scantable(_add(scan, offset, all))
86    else:
87        from asap._asap import add_insitu as _add
88        _add(scan, offset, all)
89        return
90       
91def convert_flux(scan, area, eta=1.0, insitu=False, all=True):
92    """
93    Return a scan where all spectra are converted to either Jansky or Kelvin
94        depending upon the flux units of the scan table.
95    Parameters:
96        scan:        a scantable
97        area:        the illuminated area of the telescope (m**2)
98        eta:         The efficiency of the telescope (default 1.0)       
99        insitu:      if False (default) a new scantable is returned.
100                     Otherwise, the conversion is done in-situ
101        all:         if True (default) apply to all spectra. Otherwise
102                     apply only to the selected (beam/pol/if)spectra only
103    """
104    if not insitu:
105        from asap._asap import convertflux as _convert
106        return scantable(_convert(scan, area, eta, all))
107    else:
108        from asap._asap import convertflux_insitu as _convert
109        _convert(scan, area, eta, all)
110        return
111
112def gain_el(scan, filename="gainel.txt", method="linear", insitu=False, all=True):
113    """
114    Return a scan after applying a gain-elevation correction via interpolation
115      (and extrapolation if necessary) from values in an ascii file.
116    Parameters:
117        scan:        a scantable
118        filename:    The name of the ASCII file holding the data.  The first row
119                     must give the column names.  These MUST include columns
120                     "ELEVATION" (degrees) and "FACTOR" (multiply data by this) somewhere. 
121                     The second row must give the data type of the column. Use 'R' for
122                     Real and 'I' for Integer.  An example file would be:
123
124                     ELEVATION FACTOR
125                     R R
126                     0 1.5
127                     20 1.4
128                     40 1.3
129                     60 1.2
130                     80 1.1
131                     90 1.0
132        method:      Interpolation method. "nearest", "linear" (default),
133                     "cubic" and "spline"
134        insitu:      if False (default) a new scantable is returned.
135                     Otherwise, the conversion is done in-situ
136        all:         if True (default) apply to all spectra. Otherwise
137                     apply only to the selected (beam/pol/if)spectra only
138    """
139    if not insitu:
140        from asap._asap import gainel as _gainEl
141        return scantable(_gainEl(scan, filename, method, all))
142    else:
143        from asap._asap import gainel_insitu as _gainEl
144        _gainEl(scan, filename, method, all)
145        return
146       
147def bin(scan, width=5, insitu=False):
148    """
149    Return a scan where all spectra have been binned up
150        width:       The bin width (default=5) in pixels
151        insitu:      if False (default) a new scantable is returned.
152                     Otherwise, the addition is done in-situ
153    """
154    if not insitu:
155        from asap._asap import bin as _bin
156        return scantable(_bin(scan, width))
157    else:
158        from asap._asap import bin_insitu as _bin
159        _bin(scan, width)
160        return
161
162def average_pol(scan, mask=None, insitu=False):
163    """
164    Average the Polarisations together.
165    Parameters:
166        scan:        The scantable
167        mask:        An optional mask defining the region, where the
168                     averaging will be applied. The output will have all
169                     specified points masked.
170        insitu:      If False (default) a new scantable is returned.
171                     Otherwise, the averaging is done in-situ
172    Example:
173        polav = average_pols(myscan)
174    """
175    if mask is None:
176        mask = ()
177    if not insitu:
178        from asap._asap import averagepol as _avpol
179        return scantable(_avpol(scan, mask))
180    else:
181        from asap._asap import averagepol_insitu as _avpol
182        _avpol(scan, mask)
183        return
184   
185def smooth(scan, kernel="hanning", width=5.0, insitu=False, all=True):
186    """
187    Smooth the spectrum by the specified kernel (conserving flux).
188    Parameters:
189        scan:       The input scan
190        kernel:     The type of smoothing kernel. Select from
191                    'hanning' (default), 'gaussian' and 'boxcar'.
192                    The first three characters are sufficient.
193        width:      The width of the kernel in pixels. For hanning this is
194                    ignored otherwise it defauls to 5 pixels.
195                    For 'gaussian' it is the Full Width Half
196                    Maximum. For 'boxcar' it is the full width.
197        insitu:     If False (default) a new scantable is returned.
198                    Otherwise, the scaling is done in-situ
199        all:        If True (default) apply to all spectra. Otherwise
200                    apply only to the selected (beam/pol/if)spectra only
201    Example:
202         none
203    """
204    if not insitu:
205        from asap._asap import smooth as _smooth
206        return scantable(_smooth(scan,kernel,width,all))
207    else:
208        from asap._asap import smooth_insitu as _smooth
209        _smooth(scan,kernel,width,all)
210        return
211   
212def poly_baseline(scan, mask=None, order=0):
213    """
214    Return a scan which has been baselined (all rows) by a polynomial.
215    Parameters:
216        scan:    a scantable
217        mask:    an optional mask
218        order:   the order of the polynomial (default is 0)
219    Example:
220        # return a scan baselined by a third order polynomial,
221        # not using a mask
222        bscan = poly_baseline(scan, order=3)
223    """
224    from asap.asapfitter import fitter
225    if mask is None:
226        from numarray import ones
227        mask = tuple(ones(scan.nchan()))
228    f = fitter()
229    f._verbose(True)
230    f.set_scan(scan, mask)
231    f.set_function(poly=order)   
232    sf = f.auto_fit()
233    return sf
Note: See TracBrowser for help on using the repository browser.