source: trunk/python/asapmath.py @ 313

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

replace velocity alignment bvy fredquemncy alignment function

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.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, area, eta=1.0, 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.
133    Parameters:
134        scan:        a scantable
135        area:        the illuminated area of the telescope (m**2)
136        eta:         The efficiency of the telescope (default 1.0)       
137        insitu:      if False a new scantable is returned.
138                     Otherwise, the scaling is done in-situ
139                     The default is taken from .asaprc (False)
140        allaxes:         if True apply to all spectra. Otherwise
141                     apply only to the selected (beam/pol/if)spectra only
142                     The default is taken from .asaprc (True)
143    """
144    if allaxes is None: allaxes = rcParams['scantable.allaxes']
145    if insitu is None: insitu = rcParams['insitu']
146    if not insitu:
147        from asap._asap import convertflux as _convert
148        return scantable(_convert(scan, area, eta, allaxes))
149    else:
150        from asap._asap import convertflux_insitu as _convert
151        _convert(scan, area, eta, allaxes)
152        return
153
154def gain_el(scan, poly=None, filename="", method="linear", insitu=None, allaxes=None):
155    """
156    Return a scan after applying a gain-elevation correction. The correction
157    can be made via either a polynomial or a table-based interpolation
158    (and extrapolation if necessary).
159    You specify polynomial coefficients, an ascii table or neither.
160    If you specify neither, then a polynomial correction will be made
161    with built in coefficients known for certain telescopes (an error will
162    occur if the instrument is not known).
163    Parameters:
164        scan:        a scantable
165        poly:        Polynomial coefficients (default None) to compute a
166                     gain-elevation correction as a function of
167                     elevation (in degrees).
168        filename:    The name of an ascii file holding correction factors.
169                     The first row of the ascii file must give the column
170                     names and these MUST include columns
171                     "ELEVATION" (degrees) and "FACTOR" (multiply data by this)
172                     somewhere.
173                     The second row must give the data type of the column. Use
174                     'R' for Real and 'I' for Integer.  An example file
175                     would be:
176
177                     TIME ELEVATION FACTOR
178                     R R R
179                     0.1 0 1.5
180                     0.2 20 1.4
181                     0.3 40 1.3
182                     0.4 60 1.2
183                     0.5 80 1.1
184                     0.6 90 1.0
185        method:      Interpolation method when correcting from a table. Values
186                     are  "nearest", "linear" (default), "cubic" and "spline"
187        insitu:      if False a new scantable is returned.
188                     Otherwise, the scaling is done in-situ
189                     The default is taken from .asaprc (False)
190        allaxes:         if True apply to all spectra. Otherwise
191                     apply only to the selected (beam/pol/if) spectra only
192                     The default is taken from .asaprc (True)
193    """
194    if allaxes is None: allaxes = rcParams['scantable.allaxes']
195    if poly is None:
196       poly = ()
197    if insitu is None: insitu = rcParams['insitu']
198    if not insitu:
199        from asap._asap import gainel as _gainEl
200        return scantable(_gainEl(scan, poly, filename, method, allaxes))
201    else:
202        from asap._asap import gainel_insitu as _gainEl
203        _gainEl(scan, poly, filename, method, allaxes)
204        return
205       
206def freq_align(scan, reftime=None, insitu=None):
207    """
208        Return a scan where all rows have been aligned in frequency. The
209        alignment frequency frame (e.g. LSRK) is that set by function
210        set_freqframe. 
211        scan:        a scantable
212        reftime:     reference time to align at. By default, the time of
213                     the first row of data is used. 
214        insitu:      if False a new scantable is returned.
215                     Otherwise, the scaling is done in-situ
216                     The default is taken from .asaprc (False)
217    """
218    if reftime is None: reftime = ''
219    if insitu is None: insitu = rcParams['insitu']
220    if not insitu:
221        from asap._asap import freq_align as _align
222        return scantable(_align(scan, reftime))
223    else:
224        from asap._asap import freq_align_insitu as _align
225        _align(scan, reftime)
226        return
227       
228def opacity(scan, tau, insitu=None, allaxes=None):
229    """
230    Return a scan after applying an opacity correction.
231    Parameters:
232        scan:        a scantable
233        tau:         Opacity from which the correction factor is exp(tau*ZD)
234                     where ZD is the zenith-distance
235        insitu:      if False a new scantable is returned.
236                     Otherwise, the scaling is done in-situ
237                     The default is taken from .asaprc (False)
238        allaxes:     if True apply to all spectra. Otherwise
239                     apply only to the selected (beam/pol/if)spectra only
240                     The default is taken from .asaprc (True)
241    """
242    if allaxes is None: allaxes = rcParams['scantable.allaxes']
243    if insitu is None: insitu = rcParams['insitu']
244    if not insitu:
245        from asap._asap import opacity as _opacity
246        return scantable(_opacity(scan, tau, allaxes))
247    else:
248        from asap._asap import opacity_insitu as _opacity
249        _opacity(scan, tau, allaxes)
250        return
251       
252def bin(scan, width=5, insitu=None):
253    """
254    Return a scan where all spectra have been binned up
255        width:       The bin width (default=5) in pixels
256        insitu:      if False a new scantable is returned.
257                     Otherwise, the scaling is done in-situ
258                     The default is taken from .asaprc (False)
259    """
260    if insitu is None: insitu = rcParams['insitu']
261    if not insitu:
262        from asap._asap import bin as _bin
263        return scantable(_bin(scan, width))
264    else:
265        from asap._asap import bin_insitu as _bin
266        _bin(scan, width)
267        return
268
269def resample(scan, width=5, method='cubic', insitu=None):
270    """
271    Return a scan where all spectra have been binned up
272        width:       The bin width (default=5) in pixels
273        method:      Interpolation method when correcting from a table. Values
274                     are  "nearest", "linear", "cubic" (default) and "spline"
275        insitu:      if False a new scantable is returned.
276                     Otherwise, the scaling is done in-situ
277                     The default is taken from .asaprc (False)
278    """
279    if insitu is None: insitu = rcParams['insitu']
280    if not insitu:
281        from asap._asap import resample as _resample
282        return scantable(_resample(scan, method, width))
283    else:
284        from asap._asap import resample_insitu as _resample
285        _resample(scan, method, width)
286        return
287
288def average_pol(scan, mask=None, insitu=None):
289    """
290    Average the Polarisations together.
291    The polarisation cursor of the output scan is set to 0
292    Parameters:
293        scan:        The scantable
294        mask:        An optional mask defining the region, where the
295                     averaging will be applied. The output will have all
296                     specified points masked.
297        insitu:      if False a new scantable is returned.
298                     Otherwise, the scaling is done in-situ
299                     The default is taken from .asaprc (False)
300    Example:
301        polav = average_pols(myscan)
302    """
303    if mask is None:
304        mask = ()
305    if insitu is None: insitu = rcParams['insitu']
306    if not insitu:
307        from asap._asap import averagepol as _avpol
308        return scantable(_avpol(scan, mask))
309    else:
310        from asap._asap import averagepol_insitu as _avpol
311        _avpol(scan, mask)
312        return
313   
314def smooth(scan, kernel="hanning", width=5.0, insitu=None, allaxes=None):
315    """
316    Smooth the spectrum by the specified kernel (conserving flux).
317    Parameters:
318        scan:       The input scan
319        kernel:     The type of smoothing kernel. Select from
320                    'hanning' (default), 'gaussian' and 'boxcar'.
321                    The first three characters are sufficient.
322        width:      The width of the kernel in pixels. For hanning this is
323                    ignored otherwise it defauls to 5 pixels.
324                    For 'gaussian' it is the Full Width Half
325                    Maximum. For 'boxcar' it is the full width.
326        insitu:     if False a new scantable is returned.
327                    Otherwise, the scaling is done in-situ
328                    The default is taken from .asaprc (False)
329        allaxes:    If True (default) apply to all spectra. Otherwise
330                    apply only to the selected (beam/pol/if)spectra only
331                    The default is taken from .asaprc (True)
332    Example:
333         none
334    """
335    if allaxes is None: allaxes = rcParams['scantable.allaxes']
336    if insitu is None: insitu = rcParams['insitu']
337    if not insitu:
338        from asap._asap import smooth as _smooth
339        return scantable(_smooth(scan,kernel,width,allaxes))
340    else:
341        from asap._asap import smooth_insitu as _smooth
342        _smooth(scan,kernel,width,allaxes)
343        return
344   
345def poly_baseline(scan, mask=None, order=0, insitu=None):
346    """
347    Return a scan which has been baselined (all rows) by a polynomial.
348    Parameters:
349        scan:    a scantable
350        mask:    an optional mask
351        order:   the order of the polynomial (default is 0)
352        insitu:      if False a new scantable is returned.
353                     Otherwise, the scaling is done in-situ
354                     The default is taken from .asaprc (False)
355    Example:
356        # return a scan baselined by a third order polynomial,
357        # not using a mask
358        bscan = poly_baseline(scan, order=3)
359    """
360    from asap.asapfitter import fitter
361    if mask is None:
362        from numarray import ones
363        mask = tuple(ones(scan.nchan()))
364    f = fitter()
365    f._verbose(True)
366    f.set_scan(scan, mask)
367    f.set_function(poly=order)   
368    sf = f.auto_fit(insitu)
369    return sf
Note: See TracBrowser for help on using the repository browser.