source: trunk/python/asapmath.py@ 362

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

change interface to convert_flux

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.8 KB
RevLine 
[101]1from scantable import scantable
[258]2from asap import rcParams
[101]3
[143]4def average_time(*args, **kwargs):
[101]5 """
[113]6 Return the (time) average of a scan or list of scans. [in channels only]
[305]7 The cursor of the output scan is set to 0
[113]8 Parameters:
9 one scan or comma separated scans
[143]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'
[113]15 Example:
16 # return a time averaged scan from scana and scanb
17 # without using a mask
[129]18 scanav = average_time(scana,scanb)
[113]19 # return the (time) averaged scan, i.e. the average of
20 # all correlator cycles
21 scanav = average_time(scan)
[143]22
[101]23 """
[143]24 scanAv = False
25 if kwargs.has_key('scanav'):
26 scanAv = kwargs.get('scanav')
[258]27
[143]28 weight = 'none'
29 if kwargs.has_key('weight'):
30 weight = kwargs.get('weight')
[258]31
[143]32 mask = ()
33 if kwargs.has_key('mask'):
34 mask = kwargs.get('mask')
[258]35
[143]36 lst = tuple(args)
37 from asap._asap import average as _av
[113]38 for s in lst:
[101]39 if not isinstance(s,scantable):
40 print "Please give a list of scantables"
41 return
[143]42 return scantable(_av(lst, mask, scanAv, weight))
[101]43
[245]44def quotient(source, reference, preserve=True):
[101]45 """
[246]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.
[305]49 The cursor of the output scan is set to 0
[101]50 Parameters:
51 source: the 'on' scan
52 reference: the 'off' scan
[245]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
[101]57 """
58 from asap._asap import quotient as _quot
[245]59 return scantable(_quot(source, reference, preserve))
[101]60
[296]61def simple_math(left, right, op='add', tsys=True):
[242]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
[305]66 The cursor of the output scan is set to 0
[242]67 Parameters:
68 left: the 'left' scan
69 right: the 'right' scan
70 op: the operation: 'add' (default), 'sub', 'mul', 'div'
[296]71 tsys: if True (default) then apply the operation to Tsys
72 as well as the data
[242]73 """
[258]74 if not isinstance(left,scantable) and not isinstance(right,scantable):
75 print "Please provide two scantables as input"
76 return
[242]77 from asap._asap import b_operate as _bop
[296]78 return scantable(_bop(left, right, op, tsys))
[242]79
[296]80def scale(scan, factor, insitu=None, allaxes=None, tsys=True):
[101]81 """
82 Return a scan where all spectra are scaled by the give 'factor'
83 Parameters:
84 scan: a scantable
[113]85 factor: the scaling factor
[258]86 insitu: if False a new scantable is returned.
[150]87 Otherwise, the scaling is done in-situ
[258]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)
[296]92 tsys: if True (default) then apply the operation to Tsys
93 as well as the data
[101]94 """
[258]95 if allaxes is None: allaxes = rcParams['scantable.allaxes']
96 if insitu is None: insitu = rcParams['insitu']
[141]97 if not insitu:
98 from asap._asap import scale as _scale
[296]99 return scantable(_scale(scan, factor, allaxes, tsys))
[141]100 else:
101 from asap._asap import scale_insitu as _scale
[296]102 _scale(scan, factor, allaxes, tsys)
[141]103 return
104
[101]105
[258]106def add(scan, offset, insitu=None, allaxes=None):
[113]107 """
[150]108 Return a scan where all spectra have the offset added
[113]109 Parameters:
110 scan: a scantable
[150]111 offset: the offset
[258]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
[150]116 apply only to the selected (beam/pol/if)spectra only
[258]117 The default is taken from .asaprc (True)
[113]118 """
[258]119 if allaxes is None: allaxes = rcParams['scantable.allaxes']
120 if insitu is None: insitu = rcParams['insitu']
[150]121 if not insitu:
122 from asap._asap import add as _add
[258]123 return scantable(_add(scan, offset, allaxes))
[150]124 else:
125 from asap._asap import add_insitu as _add
[258]126 _add(scan, offset, allaxes)
[150]127 return
128
[359]129def convert_flux(scan, jyperk=None, eta=None, d=None, insitu=None, allaxes=None):
[224]130 """
131 Return a scan where all spectra are converted to either Jansky or Kelvin
[359]132 depending upon the flux units of the scan table. By default the
133 function tries to look the values up internally. If it can't find
134 them (or if you want to over-ride), you must specify EITHER jyperk
135 OR eta (and D which it will try to look up also if you don't
136 set it). jyperk takes precedence if you set both.
[224]137 Parameters:
138 scan: a scantable
[359]139 jyperk: the Jy / K conversion factor
140 eta: the aperture efficiency
141 d: the geomtric diameter (metres)
[258]142 insitu: if False a new scantable is returned.
143 Otherwise, the scaling is done in-situ
144 The default is taken from .asaprc (False)
145 allaxes: if True apply to all spectra. Otherwise
[224]146 apply only to the selected (beam/pol/if)spectra only
[258]147 The default is taken from .asaprc (True)
[224]148 """
[258]149 if allaxes is None: allaxes = rcParams['scantable.allaxes']
150 if insitu is None: insitu = rcParams['insitu']
[359]151 if jyperk is None: jyperk = -1.0
152 if d is None: d = -1.0
153 if eta is None: eta = -1.0
[224]154 if not insitu:
155 from asap._asap import convertflux as _convert
[359]156 return scantable(_convert(scan, d, eta, jyperk, allaxes))
[224]157 else:
158 from asap._asap import convertflux_insitu as _convert
[359]159 _convert(scan, d, eta, jyperk, allaxes)
[224]160 return
[229]161
[258]162def gain_el(scan, poly=None, filename="", method="linear", insitu=None, allaxes=None):
[229]163 """
[242]164 Return a scan after applying a gain-elevation correction. The correction
165 can be made via either a polynomial or a table-based interpolation
166 (and extrapolation if necessary).
167 You specify polynomial coefficients, an ascii table or neither.
168 If you specify neither, then a polynomial correction will be made
169 with built in coefficients known for certain telescopes (an error will
170 occur if the instrument is not known).
[229]171 Parameters:
172 scan: a scantable
[258]173 poly: Polynomial coefficients (default None) to compute a
174 gain-elevation correction as a function of
175 elevation (in degrees).
[242]176 filename: The name of an ascii file holding correction factors.
177 The first row of the ascii file must give the column
178 names and these MUST include columns
[258]179 "ELEVATION" (degrees) and "FACTOR" (multiply data by this)
180 somewhere.
181 The second row must give the data type of the column. Use
182 'R' for Real and 'I' for Integer. An example file
183 would be:
[229]184
[242]185 TIME ELEVATION FACTOR
186 R R R
187 0.1 0 1.5
188 0.2 20 1.4
189 0.3 40 1.3
190 0.4 60 1.2
191 0.5 80 1.1
192 0.6 90 1.0
193 method: Interpolation method when correcting from a table. Values
194 are "nearest", "linear" (default), "cubic" and "spline"
[258]195 insitu: if False a new scantable is returned.
196 Otherwise, the scaling is done in-situ
197 The default is taken from .asaprc (False)
198 allaxes: if True apply to all spectra. Otherwise
199 apply only to the selected (beam/pol/if) spectra only
200 The default is taken from .asaprc (True)
[229]201 """
[258]202 if allaxes is None: allaxes = rcParams['scantable.allaxes']
[242]203 if poly is None:
204 poly = ()
[258]205 if insitu is None: insitu = rcParams['insitu']
[229]206 if not insitu:
207 from asap._asap import gainel as _gainEl
[258]208 return scantable(_gainEl(scan, poly, filename, method, allaxes))
[229]209 else:
210 from asap._asap import gainel_insitu as _gainEl
[258]211 _gainEl(scan, poly, filename, method, allaxes)
[229]212 return
[224]213
[319]214def freq_align(scan, reftime=None, method='cubic', insitu=None):
[269]215 """
[313]216 Return a scan where all rows have been aligned in frequency. The
217 alignment frequency frame (e.g. LSRK) is that set by function
218 set_freqframe.
[269]219 scan: a scantable
[273]220 reftime: reference time to align at. By default, the time of
221 the first row of data is used.
[319]222 method: Interpolation method for regridding the spectra. Choose
223 from "nearest", "linear", "cubic" (default) and "spline"
[269]224 insitu: if False a new scantable is returned.
225 Otherwise, the scaling is done in-situ
226 The default is taken from .asaprc (False)
227 """
[273]228 if reftime is None: reftime = ''
[269]229 if insitu is None: insitu = rcParams['insitu']
230 if not insitu:
[313]231 from asap._asap import freq_align as _align
[319]232 return scantable(_align(scan, reftime, method))
[269]233 else:
[313]234 from asap._asap import freq_align_insitu as _align
[319]235 _align(scan, reftime, method)
[269]236 return
237
[258]238def opacity(scan, tau, insitu=None, allaxes=None):
[242]239 """
240 Return a scan after applying an opacity correction.
241 Parameters:
242 scan: a scantable
243 tau: Opacity from which the correction factor is exp(tau*ZD)
244 where ZD is the zenith-distance
[258]245 insitu: if False a new scantable is returned.
246 Otherwise, the scaling is done in-situ
247 The default is taken from .asaprc (False)
248 allaxes: if True apply to all spectra. Otherwise
[242]249 apply only to the selected (beam/pol/if)spectra only
[258]250 The default is taken from .asaprc (True)
[242]251 """
[258]252 if allaxes is None: allaxes = rcParams['scantable.allaxes']
253 if insitu is None: insitu = rcParams['insitu']
[242]254 if not insitu:
255 from asap._asap import opacity as _opacity
[258]256 return scantable(_opacity(scan, tau, allaxes))
[242]257 else:
258 from asap._asap import opacity_insitu as _opacity
[258]259 _opacity(scan, tau, allaxes)
[242]260 return
261
[258]262def bin(scan, width=5, insitu=None):
[101]263 """
[167]264 Return a scan where all spectra have been binned up
[172]265 width: The bin width (default=5) in pixels
[258]266 insitu: if False a new scantable is returned.
267 Otherwise, the scaling is done in-situ
268 The default is taken from .asaprc (False)
[101]269 """
[258]270 if insitu is None: insitu = rcParams['insitu']
[167]271 if not insitu:
272 from asap._asap import bin as _bin
273 return scantable(_bin(scan, width))
274 else:
275 from asap._asap import bin_insitu as _bin
276 _bin(scan, width)
277 return
[113]278
[301]279def resample(scan, width=5, method='cubic', insitu=None):
280 """
281 Return a scan where all spectra have been binned up
282 width: The bin width (default=5) in pixels
283 method: Interpolation method when correcting from a table. Values
284 are "nearest", "linear", "cubic" (default) and "spline"
285 insitu: if False a new scantable is returned.
286 Otherwise, the scaling is done in-situ
287 The default is taken from .asaprc (False)
288 """
289 if insitu is None: insitu = rcParams['insitu']
290 if not insitu:
291 from asap._asap import resample as _resample
292 return scantable(_resample(scan, method, width))
293 else:
294 from asap._asap import resample_insitu as _resample
295 _resample(scan, method, width)
296 return
297
[316]298def average_pol(scan, mask=None, weight='none', insitu=None):
[113]299 """
300 Average the Polarisations together.
[305]301 The polarisation cursor of the output scan is set to 0
[113]302 Parameters:
[172]303 scan: The scantable
304 mask: An optional mask defining the region, where the
305 averaging will be applied. The output will have all
306 specified points masked.
[316]307 weight: Weighting scheme. 'none' (default), or 'var' (variance
308 weighted)
[258]309 insitu: if False a new scantable is returned.
310 Otherwise, the scaling is done in-situ
311 The default is taken from .asaprc (False)
[113]312 Example:
313 polav = average_pols(myscan)
314 """
315 if mask is None:
[166]316 mask = ()
[258]317 if insitu is None: insitu = rcParams['insitu']
[166]318 if not insitu:
319 from asap._asap import averagepol as _avpol
[316]320 return scantable(_avpol(scan, mask, weight))
[166]321 else:
322 from asap._asap import averagepol_insitu as _avpol
[316]323 _avpol(scan, mask, weight)
[166]324 return
[113]325
[258]326def smooth(scan, kernel="hanning", width=5.0, insitu=None, allaxes=None):
[113]327 """
[180]328 Smooth the spectrum by the specified kernel (conserving flux).
[113]329 Parameters:
[172]330 scan: The input scan
[180]331 kernel: The type of smoothing kernel. Select from
332 'hanning' (default), 'gaussian' and 'boxcar'.
333 The first three characters are sufficient.
334 width: The width of the kernel in pixels. For hanning this is
335 ignored otherwise it defauls to 5 pixels.
336 For 'gaussian' it is the Full Width Half
337 Maximum. For 'boxcar' it is the full width.
[258]338 insitu: if False a new scantable is returned.
[172]339 Otherwise, the scaling is done in-situ
[258]340 The default is taken from .asaprc (False)
341 allaxes: If True (default) apply to all spectra. Otherwise
[180]342 apply only to the selected (beam/pol/if)spectra only
[258]343 The default is taken from .asaprc (True)
[113]344 Example:
345 none
346 """
[258]347 if allaxes is None: allaxes = rcParams['scantable.allaxes']
348 if insitu is None: insitu = rcParams['insitu']
[172]349 if not insitu:
[180]350 from asap._asap import smooth as _smooth
[258]351 return scantable(_smooth(scan,kernel,width,allaxes))
[172]352 else:
[180]353 from asap._asap import smooth_insitu as _smooth
[258]354 _smooth(scan,kernel,width,allaxes)
[172]355 return
[113]356
[258]357def poly_baseline(scan, mask=None, order=0, insitu=None):
[113]358 """
[160]359 Return a scan which has been baselined (all rows) by a polynomial.
[113]360 Parameters:
361 scan: a scantable
362 mask: an optional mask
363 order: the order of the polynomial (default is 0)
[258]364 insitu: if False a new scantable is returned.
365 Otherwise, the scaling is done in-situ
366 The default is taken from .asaprc (False)
[113]367 Example:
368 # return a scan baselined by a third order polynomial,
369 # not using a mask
370 bscan = poly_baseline(scan, order=3)
371 """
372 from asap.asapfitter import fitter
373 if mask is None:
374 from numarray import ones
375 mask = tuple(ones(scan.nchan()))
376 f = fitter()
377 f._verbose(True)
378 f.set_scan(scan, mask)
379 f.set_function(poly=order)
[258]380 sf = f.auto_fit(insitu)
[113]381 return sf
Note: See TracBrowser for help on using the repository browser.