| 1 | from scantable import scantable
 | 
|---|
| 2 | from asap import rcParams
 | 
|---|
| 3 | from asap import print_log
 | 
|---|
| 4 | 
 | 
|---|
| 5 | def average_time(*args, **kwargs):
 | 
|---|
| 6 |     """
 | 
|---|
| 7 |     Return the (time) average of a scan or list of scans. [in channels only]
 | 
|---|
| 8 |     The cursor of the output scan is set to 0
 | 
|---|
| 9 |     Parameters:
 | 
|---|
| 10 |         one scan or comma separated  scans
 | 
|---|
| 11 |         mask:     an optional mask (only used for 'var' and 'tsys' weighting)
 | 
|---|
| 12 |         scanav:   True averages each scan separately.
 | 
|---|
| 13 |                   False (default) averages all scans together,
 | 
|---|
| 14 |         weight:   Weighting scheme. 'none, 'var' (1/var(spec)
 | 
|---|
| 15 |                   weighted), 'tsys' (1/Tsys**2 weighted), 'tint'
 | 
|---|
| 16 |                   (integration time weighted) or 'tintsys' (Tsys
 | 
|---|
| 17 |                   and tint). The default is 'tint'
 | 
|---|
| 18 |     Example:
 | 
|---|
| 19 |         # return a time averaged scan from scana and scanb
 | 
|---|
| 20 |         # without using a mask
 | 
|---|
| 21 |         scanav = average_time(scana,scanb)
 | 
|---|
| 22 |         # return the (time) averaged scan, i.e. the average of
 | 
|---|
| 23 |         # all correlator cycles
 | 
|---|
| 24 |         scanav = average_time(scan, scanav=True)
 | 
|---|
| 25 |     """
 | 
|---|
| 26 |     scanAv = False
 | 
|---|
| 27 |     if kwargs.has_key('scanav'):
 | 
|---|
| 28 |        scanAv = kwargs.get('scanav')
 | 
|---|
| 29 |     weight = 'tint'
 | 
|---|
| 30 |     if kwargs.has_key('weight'):
 | 
|---|
| 31 |        weight = kwargs.get('weight')
 | 
|---|
| 32 |     mask = ()
 | 
|---|
| 33 |     if kwargs.has_key('mask'):
 | 
|---|
| 34 |         mask = kwargs.get('mask')
 | 
|---|
| 35 |     varlist = vars()
 | 
|---|
| 36 |     if isinstance(args[0],list):
 | 
|---|
| 37 |         lst = tuple(args[0])
 | 
|---|
| 38 |     elif isinstance(args[0],tuple):
 | 
|---|
| 39 |         lst = args[0]
 | 
|---|
| 40 |     else:
 | 
|---|
| 41 |         lst = tuple(args)
 | 
|---|
| 42 | 
 | 
|---|
| 43 |     del varlist["kwargs"]
 | 
|---|
| 44 |     varlist["args"] = "%d scantables" % len(lst)
 | 
|---|
| 45 |     # need special formatting her for history...
 | 
|---|
| 46 | 
 | 
|---|
| 47 |     from asap._asap import average as _av
 | 
|---|
| 48 |     for s in lst:
 | 
|---|
| 49 |         if not isinstance(s,scantable):
 | 
|---|
| 50 |             msg = "Please give a list of scantables"
 | 
|---|
| 51 |             if rcParams['verbose']:
 | 
|---|
| 52 |                 print msg
 | 
|---|
| 53 |                 return
 | 
|---|
| 54 |             else:
 | 
|---|
| 55 |                 raise TypeError(msg)
 | 
|---|
| 56 |     s = scantable(_av(lst, mask, scanAv, weight))
 | 
|---|
| 57 |     s._add_history("average_time",varlist)
 | 
|---|
| 58 |     print_log()
 | 
|---|
| 59 |     return s
 | 
|---|
| 60 | 
 | 
|---|
| 61 | def quotient(source, reference, preserve=True):
 | 
|---|
| 62 |     """
 | 
|---|
| 63 |     Return the quotient of a 'source' (signal) scan and a 'reference' scan.
 | 
|---|
| 64 |     The reference can have just one row, even if the signal has many. Otherwise
 | 
|---|
| 65 |     they must have the same number of rows.
 | 
|---|
| 66 |     The cursor of the output scan is set to 0
 | 
|---|
| 67 |     Parameters:
 | 
|---|
| 68 |         source:        the 'on' scan
 | 
|---|
| 69 |         reference:     the 'off' scan
 | 
|---|
| 70 |         preserve:      you can preserve (default) the continuum or
 | 
|---|
| 71 |                        remove it.  The equations used are
 | 
|---|
| 72 |                        preserve:  Output = Toff * (on/off) - Toff
 | 
|---|
| 73 |                        remove:    Output = Toff * (on/off) - Ton
 | 
|---|
| 74 |     """
 | 
|---|
| 75 |     varlist = vars()
 | 
|---|
| 76 |     from asap._asap import quotient as _quot
 | 
|---|
| 77 |     s = scantable(_quot(source, reference, preserve))
 | 
|---|
| 78 |     s._add_history("quotient",varlist)
 | 
|---|
| 79 |     print_log()
 | 
|---|
| 80 |     return s
 | 
|---|
| 81 | 
 | 
|---|
| 82 | def simple_math(left, right, op='add', tsys=True):
 | 
|---|
| 83 |     """
 | 
|---|
| 84 |     Apply simple mathematical binary operations to two
 | 
|---|
| 85 |     scan tables,  returning the result in a new scan table.
 | 
|---|
| 86 |     The operation is applied to both the correlations and the TSys data
 | 
|---|
| 87 |     The cursor of the output scan is set to 0
 | 
|---|
| 88 |     Parameters:
 | 
|---|
| 89 |         left:          the 'left' scan
 | 
|---|
| 90 |         right:         the 'right' scan
 | 
|---|
| 91 |         op:            the operation: 'add' (default), 'sub', 'mul', 'div'
 | 
|---|
| 92 |         tsys:          if True (default) then apply the operation to Tsys
 | 
|---|
| 93 |                        as well as the data
 | 
|---|
| 94 |     """
 | 
|---|
| 95 |     varlist = vars()
 | 
|---|
| 96 |     if not isinstance(left,scantable) and not isinstance(right,scantable):
 | 
|---|
| 97 |         msg = "Please provide two scantables as input"
 | 
|---|
| 98 |         if rcParams['verbose']:
 | 
|---|
| 99 |             print msg
 | 
|---|
| 100 |             return
 | 
|---|
| 101 |         else:
 | 
|---|
| 102 |             raise TypeError(msg)
 | 
|---|
| 103 |     from asap._asap import b_operate as _bop
 | 
|---|
| 104 |     s = scantable(_bop(left, right, op, tsys))
 | 
|---|
| 105 |     s._add_history("simple_math", varlist)
 | 
|---|
| 106 |     print_log()
 | 
|---|
| 107 |     return s
 | 
|---|