source: trunk/python/asapmath.py @ 411

Last change on this file since 411 was 411, checked in by mar637, 19 years ago

Added handling of environment variables throughout.

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