source: trunk/python/asapmath.py@ 317

Last change on this file since 317 was 316, checked in by kil064, 20 years ago

add arg. 'weight' to function average_pol

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.2 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, weight='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 weight: Weighting scheme. 'none' (default), or 'var' (variance
298 weighted)
299 insitu: if False a new scantable is returned.
300 Otherwise, the scaling is done in-situ
301 The default is taken from .asaprc (False)
302 Example:
303 polav = average_pols(myscan)
304 """
305 if mask is None:
306 mask = ()
307 if insitu is None: insitu = rcParams['insitu']
308 if not insitu:
309 from asap._asap import averagepol as _avpol
310 return scantable(_avpol(scan, mask, weight))
311 else:
312 from asap._asap import averagepol_insitu as _avpol
313 _avpol(scan, mask, weight)
314 return
315
316def smooth(scan, kernel="hanning", width=5.0, insitu=None, allaxes=None):
317 """
318 Smooth the spectrum by the specified kernel (conserving flux).
319 Parameters:
320 scan: The input scan
321 kernel: The type of smoothing kernel. Select from
322 'hanning' (default), 'gaussian' and 'boxcar'.
323 The first three characters are sufficient.
324 width: The width of the kernel in pixels. For hanning this is
325 ignored otherwise it defauls to 5 pixels.
326 For 'gaussian' it is the Full Width Half
327 Maximum. For 'boxcar' it is the full width.
328 insitu: if False a new scantable is returned.
329 Otherwise, the scaling is done in-situ
330 The default is taken from .asaprc (False)
331 allaxes: If True (default) apply to all spectra. Otherwise
332 apply only to the selected (beam/pol/if)spectra only
333 The default is taken from .asaprc (True)
334 Example:
335 none
336 """
337 if allaxes is None: allaxes = rcParams['scantable.allaxes']
338 if insitu is None: insitu = rcParams['insitu']
339 if not insitu:
340 from asap._asap import smooth as _smooth
341 return scantable(_smooth(scan,kernel,width,allaxes))
342 else:
343 from asap._asap import smooth_insitu as _smooth
344 _smooth(scan,kernel,width,allaxes)
345 return
346
347def poly_baseline(scan, mask=None, order=0, insitu=None):
348 """
349 Return a scan which has been baselined (all rows) by a polynomial.
350 Parameters:
351 scan: a scantable
352 mask: an optional mask
353 order: the order of the polynomial (default is 0)
354 insitu: if False a new scantable is returned.
355 Otherwise, the scaling is done in-situ
356 The default is taken from .asaprc (False)
357 Example:
358 # return a scan baselined by a third order polynomial,
359 # not using a mask
360 bscan = poly_baseline(scan, order=3)
361 """
362 from asap.asapfitter import fitter
363 if mask is None:
364 from numarray import ones
365 mask = tuple(ones(scan.nchan()))
366 f = fitter()
367 f._verbose(True)
368 f.set_scan(scan, mask)
369 f.set_function(poly=order)
370 sf = f.auto_fit(insitu)
371 return sf
Note: See TracBrowser for help on using the repository browser.