source: trunk/python/asapmath.py@ 1014

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

Removed align option from average in c++ as it is buggy.
python is now applying it.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.1 KB
Line 
1from scantable import scantable
2from asap import rcParams
3from asap import print_log
4
5def 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 align: align the spectra in velocity before averaging. It takes
19 the time of the first spectrum in the first scantable
20 as reference time.
21 Example:
22 # return a time averaged scan from scana and scanb
23 # without using a mask
24 scanav = average_time(scana,scanb)
25 # return the (time) averaged scan, i.e. the average of
26 # all correlator cycles
27 scanav = average_time(scan, scanav=True)
28 """
29 scanav = False
30 if kwargs.has_key('scanav'):
31 scanav = kwargs.get('scanav')
32 weight = 'tint'
33 if kwargs.has_key('weight'):
34 weight = kwargs.get('weight')
35 mask = ()
36 if kwargs.has_key('mask'):
37 mask = kwargs.get('mask')
38 align = False
39 if kwargs.has_key('align'):
40 align = kwargs.get('align')
41 varlist = vars()
42 if isinstance(args[0],list):
43 lst = args[0]
44 elif isinstance(args[0],tuple):
45 lst = list(args[0])
46 else:
47 lst = list(args)
48
49 del varlist["kwargs"]
50 varlist["args"] = "%d scantables" % len(lst)
51 # need special formatting here for history...
52
53 from asap._asap import stmath
54 stm = stmath()
55 for s in lst:
56 if not isinstance(s,scantable):
57 msg = "Please give a list of scantables"
58 if rcParams['verbose']:
59 print msg
60 return
61 else:
62 raise TypeError(msg)
63 if scanav: scanav = "SCAN"
64 else: scanav = "NONE"
65 alignedlst = []
66 if align:
67 refepoch = lst[0].get_time(0)
68 for scan in lst:
69 alignedlst.append(scan.freq_align(refepoch,insitu=False))
70 else:
71 aligendlst = lst
72 s = scantable(stm._average(alignedlst, mask, weight, scanav))
73 s._add_history("average_time",varlist)
74 print_log()
75 return s
76
77# def quotient(source, reference, preserve=True):
78# """
79# Return the quotient of a 'source' (signal) scan and a 'reference' scan.
80# The reference can have just one row, even if the signal has many. Otherwise
81# they must have the same number of rows.
82# The cursor of the output scan is set to 0
83# Parameters:
84# source: the 'on' scan
85# reference: the 'off' scan
86# preserve: you can preserve (default) the continuum or
87# remove it. The equations used are
88# preserve: Output = Toff * (on/off) - Toff
89# remove: Output = Toff * (on/off) - Ton
90# """
91# varlist = vars()
92# from asap._asap import quotient as _quot
93# s = scantable(_quot(source, reference, preserve))
94# s._add_history("quotient",varlist)
95# print_log()
96# return s
97
98def simple_math(left, right, op='add', tsys=True):
99 """
100 Apply simple mathematical binary operations to two
101 scan tables, returning the result in a new scan table.
102 The operation is applied to both the correlations and the TSys data
103 The cursor of the output scan is set to 0
104 Parameters:
105 left: the 'left' scan
106 right: the 'right' scan
107 op: the operation: 'add' (default), 'sub', 'mul', 'div'
108 tsys: if True (default) then apply the operation to Tsys
109 as well as the data
110 """
111 varlist = vars()
112 print "Not yet available in asap"
113 return
114 if not isinstance(left,scantable) and not isinstance(right,scantable):
115 msg = "Please provide two scantables as input"
116 if rcParams['verbose']:
117 print msg
118 return
119 else:
120 raise TypeError(msg)
121 s = scantable(stm._bop(left, right, op, tsys))
122 s._add_history("simple_math", varlist)
123 print_log()
124 return s
125
126def merge(*args):
127 """
128 """
129 varlist = vars()
130 if isinstance(args[0],list):
131 lst = tuple(args[0])
132 elif isinstance(args[0],tuple):
133 lst = args[0]
134 else:
135 lst = tuple(args)
136 varlist["args"] = "%d scantables" % len(lst)
137 # need special formatting her for history...
138 from asap._asap import stmath
139 stm = stmath()
140 for s in lst:
141 if not isinstance(s,scantable):
142 msg = "Please give a list of scantables"
143 if rcParams['verbose']:
144 print msg
145 return
146 else:
147 raise TypeError(msg)
148 s = scantable(stm._merge(lst))
149 s._add_history("merge", varlist)
150 print_log()
151 return s
Note: See TracBrowser for help on using the repository browser.