source: trunk/python/asapmath.py@ 358

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

function 'freq_align' now takes interpolation method string

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.4 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
[258]129def convert_flux(scan, area, eta=1.0, insitu=None, allaxes=None):
[224]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)
[258]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
[224]141 apply only to the selected (beam/pol/if)spectra only
[258]142 The default is taken from .asaprc (True)
[224]143 """
[258]144 if allaxes is None: allaxes = rcParams['scantable.allaxes']
145 if insitu is None: insitu = rcParams['insitu']
[224]146 if not insitu:
147 from asap._asap import convertflux as _convert
[258]148 return scantable(_convert(scan, area, eta, allaxes))
[224]149 else:
150 from asap._asap import convertflux_insitu as _convert
[258]151 _convert(scan, area, eta, allaxes)
[224]152 return
[229]153
[258]154def gain_el(scan, poly=None, filename="", method="linear", insitu=None, allaxes=None):
[229]155 """
[242]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).
[229]163 Parameters:
164 scan: a scantable
[258]165 poly: Polynomial coefficients (default None) to compute a
166 gain-elevation correction as a function of
167 elevation (in degrees).
[242]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
[258]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:
[229]176
[242]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"
[258]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)
[229]193 """
[258]194 if allaxes is None: allaxes = rcParams['scantable.allaxes']
[242]195 if poly is None:
196 poly = ()
[258]197 if insitu is None: insitu = rcParams['insitu']
[229]198 if not insitu:
199 from asap._asap import gainel as _gainEl
[258]200 return scantable(_gainEl(scan, poly, filename, method, allaxes))
[229]201 else:
202 from asap._asap import gainel_insitu as _gainEl
[258]203 _gainEl(scan, poly, filename, method, allaxes)
[229]204 return
[224]205
[319]206def freq_align(scan, reftime=None, method='cubic', insitu=None):
[269]207 """
[313]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.
[269]211 scan: a scantable
[273]212 reftime: reference time to align at. By default, the time of
213 the first row of data is used.
[319]214 method: Interpolation method for regridding the spectra. Choose
215 from "nearest", "linear", "cubic" (default) and "spline"
[269]216 insitu: if False a new scantable is returned.
217 Otherwise, the scaling is done in-situ
218 The default is taken from .asaprc (False)
219 """
[273]220 if reftime is None: reftime = ''
[269]221 if insitu is None: insitu = rcParams['insitu']
222 if not insitu:
[313]223 from asap._asap import freq_align as _align
[319]224 return scantable(_align(scan, reftime, method))
[269]225 else:
[313]226 from asap._asap import freq_align_insitu as _align
[319]227 _align(scan, reftime, method)
[269]228 return
229
[258]230def opacity(scan, tau, insitu=None, allaxes=None):
[242]231 """
232 Return a scan after applying an opacity correction.
233 Parameters:
234 scan: a scantable
235 tau: Opacity from which the correction factor is exp(tau*ZD)
236 where ZD is the zenith-distance
[258]237 insitu: if False a new scantable is returned.
238 Otherwise, the scaling is done in-situ
239 The default is taken from .asaprc (False)
240 allaxes: if True apply to all spectra. Otherwise
[242]241 apply only to the selected (beam/pol/if)spectra only
[258]242 The default is taken from .asaprc (True)
[242]243 """
[258]244 if allaxes is None: allaxes = rcParams['scantable.allaxes']
245 if insitu is None: insitu = rcParams['insitu']
[242]246 if not insitu:
247 from asap._asap import opacity as _opacity
[258]248 return scantable(_opacity(scan, tau, allaxes))
[242]249 else:
250 from asap._asap import opacity_insitu as _opacity
[258]251 _opacity(scan, tau, allaxes)
[242]252 return
253
[258]254def bin(scan, width=5, insitu=None):
[101]255 """
[167]256 Return a scan where all spectra have been binned up
[172]257 width: The bin width (default=5) in pixels
[258]258 insitu: if False a new scantable is returned.
259 Otherwise, the scaling is done in-situ
260 The default is taken from .asaprc (False)
[101]261 """
[258]262 if insitu is None: insitu = rcParams['insitu']
[167]263 if not insitu:
264 from asap._asap import bin as _bin
265 return scantable(_bin(scan, width))
266 else:
267 from asap._asap import bin_insitu as _bin
268 _bin(scan, width)
269 return
[113]270
[301]271def resample(scan, width=5, method='cubic', insitu=None):
272 """
273 Return a scan where all spectra have been binned up
274 width: The bin width (default=5) in pixels
275 method: Interpolation method when correcting from a table. Values
276 are "nearest", "linear", "cubic" (default) and "spline"
277 insitu: if False a new scantable is returned.
278 Otherwise, the scaling is done in-situ
279 The default is taken from .asaprc (False)
280 """
281 if insitu is None: insitu = rcParams['insitu']
282 if not insitu:
283 from asap._asap import resample as _resample
284 return scantable(_resample(scan, method, width))
285 else:
286 from asap._asap import resample_insitu as _resample
287 _resample(scan, method, width)
288 return
289
[316]290def average_pol(scan, mask=None, weight='none', insitu=None):
[113]291 """
292 Average the Polarisations together.
[305]293 The polarisation cursor of the output scan is set to 0
[113]294 Parameters:
[172]295 scan: The scantable
296 mask: An optional mask defining the region, where the
297 averaging will be applied. The output will have all
298 specified points masked.
[316]299 weight: Weighting scheme. 'none' (default), or 'var' (variance
300 weighted)
[258]301 insitu: if False a new scantable is returned.
302 Otherwise, the scaling is done in-situ
303 The default is taken from .asaprc (False)
[113]304 Example:
305 polav = average_pols(myscan)
306 """
307 if mask is None:
[166]308 mask = ()
[258]309 if insitu is None: insitu = rcParams['insitu']
[166]310 if not insitu:
311 from asap._asap import averagepol as _avpol
[316]312 return scantable(_avpol(scan, mask, weight))
[166]313 else:
314 from asap._asap import averagepol_insitu as _avpol
[316]315 _avpol(scan, mask, weight)
[166]316 return
[113]317
[258]318def smooth(scan, kernel="hanning", width=5.0, insitu=None, allaxes=None):
[113]319 """
[180]320 Smooth the spectrum by the specified kernel (conserving flux).
[113]321 Parameters:
[172]322 scan: The input scan
[180]323 kernel: The type of smoothing kernel. Select from
324 'hanning' (default), 'gaussian' and 'boxcar'.
325 The first three characters are sufficient.
326 width: The width of the kernel in pixels. For hanning this is
327 ignored otherwise it defauls to 5 pixels.
328 For 'gaussian' it is the Full Width Half
329 Maximum. For 'boxcar' it is the full width.
[258]330 insitu: if False a new scantable is returned.
[172]331 Otherwise, the scaling is done in-situ
[258]332 The default is taken from .asaprc (False)
333 allaxes: If True (default) apply to all spectra. Otherwise
[180]334 apply only to the selected (beam/pol/if)spectra only
[258]335 The default is taken from .asaprc (True)
[113]336 Example:
337 none
338 """
[258]339 if allaxes is None: allaxes = rcParams['scantable.allaxes']
340 if insitu is None: insitu = rcParams['insitu']
[172]341 if not insitu:
[180]342 from asap._asap import smooth as _smooth
[258]343 return scantable(_smooth(scan,kernel,width,allaxes))
[172]344 else:
[180]345 from asap._asap import smooth_insitu as _smooth
[258]346 _smooth(scan,kernel,width,allaxes)
[172]347 return
[113]348
[258]349def poly_baseline(scan, mask=None, order=0, insitu=None):
[113]350 """
[160]351 Return a scan which has been baselined (all rows) by a polynomial.
[113]352 Parameters:
353 scan: a scantable
354 mask: an optional mask
355 order: the order of the polynomial (default is 0)
[258]356 insitu: if False a new scantable is returned.
357 Otherwise, the scaling is done in-situ
358 The default is taken from .asaprc (False)
[113]359 Example:
360 # return a scan baselined by a third order polynomial,
361 # not using a mask
362 bscan = poly_baseline(scan, order=3)
363 """
364 from asap.asapfitter import fitter
365 if mask is None:
366 from numarray import ones
367 mask = tuple(ones(scan.nchan()))
368 f = fitter()
369 f._verbose(True)
370 f.set_scan(scan, mask)
371 f.set_function(poly=order)
[258]372 sf = f.auto_fit(insitu)
[113]373 return sf
Note: See TracBrowser for help on using the repository browser.