source: trunk/python/asapmath.py@ 245

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

add arg. 'preserve' to quotient. also document algorithm

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.8 KB
RevLine 
[101]1from scantable import scantable
2
[143]3def average_time(*args, **kwargs):
[101]4 """
[113]5 Return the (time) average of a scan or list of scans. [in channels only]
6 Parameters:
7 one scan or comma separated scans
[143]8 mask: an optional mask (only used for 'var' and 'tsys' weighting)
9 scanav: False (default) averages all scans together,
10 True averages each scan separately
11 weight: Weighting scheme. 'none' (default), 'var' (variance
12 weighted), 'tsys'
[113]13 Example:
14 # return a time averaged scan from scana and scanb
15 # without using a mask
[129]16 scanav = average_time(scana,scanb)
[113]17 # return the (time) averaged scan, i.e. the average of
18 # all correlator cycles
19 scanav = average_time(scan)
[143]20
[101]21 """
[143]22 scanAv = False
23 if kwargs.has_key('scanav'):
24 scanAv = kwargs.get('scanav')
25#
26 weight = 'none'
27 if kwargs.has_key('weight'):
28 weight = kwargs.get('weight')
29#
30 mask = ()
31 if kwargs.has_key('mask'):
32 mask = kwargs.get('mask')
33#
34 lst = tuple(args)
35 from asap._asap import average as _av
[113]36 for s in lst:
[101]37 if not isinstance(s,scantable):
38 print "Please give a list of scantables"
39 return
[143]40 return scantable(_av(lst, mask, scanAv, weight))
[101]41
[245]42def quotient(source, reference, preserve=True):
[101]43 """
[245]44 Return the quotient of a 'source' (signal) scan and a 'reference' scan
[101]45 Parameters:
46 source: the 'on' scan
47 reference: the 'off' scan
[245]48 preserve: you can preserve (default) the continuum or
49 remove it. The equations used are
50 preserve - Output = Tref * (sig/ref) - Tref
51 remove - Output = Tref * (sig/ref) - Tsig
[101]52 """
53 from asap._asap import quotient as _quot
[245]54 return scantable(_quot(source, reference, preserve))
[101]55
[242]56def b_operate(left, right, op='add'):
57 """
58 Apply simple mathematical binary operations to two
59 scan tables, returning the result in a new scan table.
60 The operation is applied to both the correlations and the TSys data
61 Parameters:
62 left: the 'left' scan
63 right: the 'right' scan
64 op: the operation: 'add' (default), 'sub', 'mul', 'div'
65 """
66 from asap._asap import b_operate as _bop
67 return scantable(_bop(left, right, op))
68
[150]69def scale(scan, factor, insitu=False, all=True):
[101]70 """
71 Return a scan where all spectra are scaled by the give 'factor'
72 Parameters:
73 scan: a scantable
[113]74 factor: the scaling factor
[150]75 insitu: if False (default) a new scantable is returned.
76 Otherwise, the scaling is done in-situ
77 all: if True (default) apply to all spectra. Otherwise
78 apply only to the selected (beam/pol/if)spectra only
[101]79 """
[141]80 if not insitu:
81 from asap._asap import scale as _scale
[150]82 return scantable(_scale(scan, factor, all))
[141]83 else:
84 from asap._asap import scale_insitu as _scale
[150]85 _scale(scan, factor, all)
[141]86 return
87
[101]88
[150]89def add(scan, offset, insitu=False, all=True):
[113]90 """
[150]91 Return a scan where all spectra have the offset added
[113]92 Parameters:
93 scan: a scantable
[150]94 offset: the offset
95 insitu: if False (default) a new scantable is returned.
96 Otherwise, the addition is done in-situ
97 all: if True (default) apply to all spectra. Otherwise
98 apply only to the selected (beam/pol/if)spectra only
[113]99 """
[150]100 if not insitu:
101 from asap._asap import add as _add
102 return scantable(_add(scan, offset, all))
103 else:
104 from asap._asap import add_insitu as _add
105 _add(scan, offset, all)
106 return
107
[225]108def convert_flux(scan, area, eta=1.0, insitu=False, all=True):
[224]109 """
110 Return a scan where all spectra are converted to either Jansky or Kelvin
111 depending upon the flux units of the scan table.
112 Parameters:
113 scan: a scantable
114 area: the illuminated area of the telescope (m**2)
115 eta: The efficiency of the telescope (default 1.0)
116 insitu: if False (default) a new scantable is returned.
117 Otherwise, the conversion is done in-situ
118 all: if True (default) apply to all spectra. Otherwise
119 apply only to the selected (beam/pol/if)spectra only
120 """
121 if not insitu:
122 from asap._asap import convertflux as _convert
123 return scantable(_convert(scan, area, eta, all))
124 else:
125 from asap._asap import convertflux_insitu as _convert
126 _convert(scan, area, eta, all)
127 return
[229]128
[242]129def gain_el(scan, poly=None, filename="", method="linear", insitu=False, all=True):
[229]130 """
[242]131 Return a scan after applying a gain-elevation correction. The correction
132 can be made via either a polynomial or a table-based interpolation
133 (and extrapolation if necessary).
134 You specify polynomial coefficients, an ascii table or neither.
135 If you specify neither, then a polynomial correction will be made
136 with built in coefficients known for certain telescopes (an error will
137 occur if the instrument is not known).
[229]138 Parameters:
139 scan: a scantable
[242]140 poly: Polynomial coefficients (default None) to compute a gain-elevation
141 correction as a function of elevation (in degrees).
142 filename: The name of an ascii file holding correction factors.
143 The first row of the ascii file must give the column
144 names and these MUST include columns
145 "ELEVATION" (degrees) and "FACTOR" (multiply data by this) somewhere.
[229]146 The second row must give the data type of the column. Use 'R' for
147 Real and 'I' for Integer. An example file would be:
148
[242]149 TIME ELEVATION FACTOR
150 R R R
151 0.1 0 1.5
152 0.2 20 1.4
153 0.3 40 1.3
154 0.4 60 1.2
155 0.5 80 1.1
156 0.6 90 1.0
157 method: Interpolation method when correcting from a table. Values
158 are "nearest", "linear" (default), "cubic" and "spline"
[229]159 insitu: if False (default) a new scantable is returned.
160 Otherwise, the conversion is done in-situ
161 all: if True (default) apply to all spectra. Otherwise
162 apply only to the selected (beam/pol/if)spectra only
163 """
[242]164 if poly is None:
165 poly = ()
[229]166 if not insitu:
167 from asap._asap import gainel as _gainEl
[242]168 return scantable(_gainEl(scan, poly, filename, method, all))
[229]169 else:
170 from asap._asap import gainel_insitu as _gainEl
[242]171 _gainEl(scan, poly, filename, method, all)
[229]172 return
[224]173
[242]174def opacity(scan, tau, insitu=False, all=True):
175 """
176 Return a scan after applying an opacity correction.
177 Parameters:
178 scan: a scantable
179 tau: Opacity from which the correction factor is exp(tau*ZD)
180 where ZD is the zenith-distance
181 insitu: if False (default) a new scantable is returned.
182 Otherwise, the conversion is done in-situ
183 all: if True (default) apply to all spectra. Otherwise
184 apply only to the selected (beam/pol/if)spectra only
185 """
186 if not insitu:
187 from asap._asap import opacity as _opacity
188 return scantable(_opacity(scan, tau, all))
189 else:
190 from asap._asap import opacity_insitu as _opacity
191 _opacity(scan, tau, all)
192 return
193
[167]194def bin(scan, width=5, insitu=False):
[101]195 """
[167]196 Return a scan where all spectra have been binned up
[172]197 width: The bin width (default=5) in pixels
[167]198 insitu: if False (default) a new scantable is returned.
199 Otherwise, the addition is done in-situ
[101]200 """
[167]201 if not insitu:
202 from asap._asap import bin as _bin
203 return scantable(_bin(scan, width))
204 else:
205 from asap._asap import bin_insitu as _bin
206 _bin(scan, width)
207 return
[113]208
[166]209def average_pol(scan, mask=None, insitu=False):
[113]210 """
211 Average the Polarisations together.
212 Parameters:
[172]213 scan: The scantable
214 mask: An optional mask defining the region, where the
215 averaging will be applied. The output will have all
216 specified points masked.
217 insitu: If False (default) a new scantable is returned.
[166]218 Otherwise, the averaging is done in-situ
[113]219 Example:
220 polav = average_pols(myscan)
221 """
222 if mask is None:
[166]223 mask = ()
224 if not insitu:
225 from asap._asap import averagepol as _avpol
226 return scantable(_avpol(scan, mask))
227 else:
228 from asap._asap import averagepol_insitu as _avpol
229 _avpol(scan, mask)
230 return
[113]231
[180]232def smooth(scan, kernel="hanning", width=5.0, insitu=False, all=True):
[113]233 """
[180]234 Smooth the spectrum by the specified kernel (conserving flux).
[113]235 Parameters:
[172]236 scan: The input scan
[180]237 kernel: The type of smoothing kernel. Select from
238 'hanning' (default), 'gaussian' and 'boxcar'.
239 The first three characters are sufficient.
240 width: The width of the kernel in pixels. For hanning this is
241 ignored otherwise it defauls to 5 pixels.
242 For 'gaussian' it is the Full Width Half
243 Maximum. For 'boxcar' it is the full width.
[172]244 insitu: If False (default) a new scantable is returned.
245 Otherwise, the scaling is done in-situ
[180]246 all: If True (default) apply to all spectra. Otherwise
247 apply only to the selected (beam/pol/if)spectra only
[113]248 Example:
249 none
250 """
[172]251 if not insitu:
[180]252 from asap._asap import smooth as _smooth
253 return scantable(_smooth(scan,kernel,width,all))
[172]254 else:
[180]255 from asap._asap import smooth_insitu as _smooth
256 _smooth(scan,kernel,width,all)
[172]257 return
[113]258
259def poly_baseline(scan, mask=None, order=0):
260 """
[160]261 Return a scan which has been baselined (all rows) by a polynomial.
[113]262 Parameters:
263 scan: a scantable
264 mask: an optional mask
265 order: the order of the polynomial (default is 0)
266 Example:
267 # return a scan baselined by a third order polynomial,
268 # not using a mask
269 bscan = poly_baseline(scan, order=3)
270 """
271 from asap.asapfitter import fitter
272 if mask is None:
273 from numarray import ones
274 mask = tuple(ones(scan.nchan()))
275 f = fitter()
276 f._verbose(True)
277 f.set_scan(scan, mask)
278 f.set_function(poly=order)
279 sf = f.auto_fit()
280 return sf
Note: See TracBrowser for help on using the repository browser.