source: trunk/python/asapmath.py@ 307

Last change on this file since 307 was 305, checked in by kil064, 20 years ago

document when cursor reset to 0 on output scan

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.1 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 align(scan, reftime=None, insitu=None):
207 """
208 Return a scan where all rows have been aligned in velocity. The
209 velocity reference frame (e.gh. LSRK), unit and doppler (e.g. OPTICAL)
210 are those set by functions set_unit and 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 align as _align
222 return scantable(_align(scan, reftime))
223 else:
224 from asap._asap import 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.