source: branches/hpc33/src/STMath.h@ 2552

Last change on this file since 2552 was 2551, checked in by Takeshi Nakazato, 13 years ago

New Development: No

JIRA Issue: Yes CAS-4195

Ready for Test: Yes

Interface Changes: No

What Interface Changed: Please list interface changes

Test Programs: List test programs

Put in Release Notes: Yes/No

Module(s): Module Names change impacts.

Description: Describe your changes here...

Load whole (averaged) off spectra on memory instead to get one spectrum
when it is needed since those are not so heavy. It might reduce number of
call of ArrayColumn::get().

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.2 KB
RevLine 
[805]1//
2// C++ Interface: STMath
3//
4// Description:
5//
6//
7// Author: Malte Marquarding <asap@atnf.csiro.au>, (C) 2006
8//
9// Copyright: See COPYING file that comes with this distribution
10//
11//
12#ifndef ASAPSTMATH_H
13#define ASAPSTMATH_H
[2]14
[2177]15#include <map>
[38]16#include <string>
[805]17
[130]18#include <casa/aips.h>
[2177]19#include <casa/Arrays/Vector.h>
20#include <casa/BasicSL/String.h>
[81]21#include <casa/Utilities/CountedPtr.h>
[2177]22
[805]23#include <scimath/Mathematics/InterpolateArray1D.h>
[294]24
[2177]25#include "Logger.h"
[805]26#include "Scantable.h"
[834]27#include "STDefs.h"
[896]28#include "STPol.h"
[2]29
[83]30namespace asap {
[2]31
[805]32/**
[1106]33 * Mathmatical operations on Scantable objects
34 * @author Malte Marquarding
[805]35*/
[890]36class STMath : private Logger {
[716]37public:
[1106]38 // typedef for long method name
[805]39 typedef casa::InterpolateArray1D<casa::Double,
40 casa::Float>::InterpolationMethod imethod;
[299]41
[1106]42 // typedef for std::map
[805]43 typedef std::map<std::string, imethod> imap;
[177]44
[1106]45/**
46 * whether to operate on the given Scantable or return a new one
47 * @param insitu the toggle for this behaviour
48 */
[1353]49 explicit STMath(bool insitu=true);
[221]50
[995]51 virtual ~STMath();
[227]52
[805]53 /**
[1295]54 * get the currnt @attr inistu_ state
[805]55 */
56 bool insitu() const { return insitu_;};
[1143]57
[1106]58 /**
59 * set the currnt @attr inistu state
60 * @param b the new state
61 */
[805]62 void setInsitu(bool b) { insitu_ = b; };
[262]63
[1106]64
[1140]65 /**
66 * average a vector of Scantables
67 * @param in the vector of Scantables to average
[1295]68 * @param mask an optional mask to apply on specific weights
[1140]69 * @param weight weighting scheme
70 * @param avmode the mode ov averaging. Per "SCAN" or "ALL".
71 * @return a casa::CountedPtr<Scantable> which either holds a new Scantable
72 * or returns the imput pointer.
73 */
[805]74 casa::CountedPtr<Scantable>
75 average( const std::vector<casa::CountedPtr<Scantable> >& in,
[858]76 const std::vector<bool>& mask = std::vector<bool>(),
77 const std::string& weight = "NONE",
[977]78 const std::string& avmode = "SCAN");
[1066]79
[1140]80 /**
81 * median average a vector of Scantables. See also STMath::average
82 * @param in the Scantable to average
83 * @param mode the averaging mode. Currently only "MEDIAN"
84 * @param avmode the mode ov averaging. Per "SCAN" or "ALL".
85 * @return a casa::CountedPtr<Scantable> which either holds a new Scantable
86 * or returns the imput pointer.
87 */
[1069]88 casa::CountedPtr<Scantable>
89 averageChannel( const casa::CountedPtr<Scantable> & in,
[1078]90 const std::string& mode = "MEDIAN",
91 const std::string& avmode = "SCAN");
[1069]92
[1140]93 /**
[1145]94 * Average polarisations together. really only useful if only linears are
95 * available.
[1140]96 * @param in the input Scantable
97 * @param mask an optional mask if weight allows one
98 * @param weight weighting scheme
[1143]99 * @return
[1140]100 */
[940]101 casa::CountedPtr< Scantable >
102 averagePolarisations( const casa::CountedPtr< Scantable > & in,
[1140]103 const std::vector<bool>& mask,
104 const std::string& weight );
[234]105
[1145]106 /**
107 * Average beams together.
108 * @param in the input Scantable
109 * @param mask an optional mask if weight allows one
110 * @param weight weighting scheme
111 * @return
112 */
113 casa::CountedPtr< Scantable >
114 averageBeams( const casa::CountedPtr< Scantable > & in,
115 const std::vector<bool>& mask,
116 const std::string& weight );
117
[805]118 casa::CountedPtr<Scantable>
119 unaryOperate( const casa::CountedPtr<Scantable>& in, float val,
120 const std::string& mode, bool tsys=false );
[169]121
[1819]122 // array operation
[1308]123 casa::CountedPtr<Scantable>
[1819]124 arrayOperate( const casa::CountedPtr<Scantable>& in,
125 const std::vector<float> val,
126 const std::string& mode,
127 const std::string& opmode="channel",
128 bool tsys=false );
129
130 // channel operation
131 casa::CountedPtr<Scantable>
132 arrayOperateChannel( const casa::CountedPtr<Scantable>& in,
133 const std::vector<float> val,
134 const std::string& mode, bool tsys=false );
135
136 // row operation
137 casa::CountedPtr<Scantable>
138 arrayOperateRow( const casa::CountedPtr<Scantable>& in,
139 const std::vector<float> val,
140 const std::string& mode, bool tsys=false );
141
142 // 2d array operation
143 casa::CountedPtr<Scantable>
144 array2dOperate( const casa::CountedPtr<Scantable>& in,
145 const std::vector< std::vector<float> > val,
146 const std::string& mode, bool tsys=false );
147
148 casa::CountedPtr<Scantable>
[1570]149 binaryOperate( const casa::CountedPtr<Scantable>& left,
150 const casa::CountedPtr<Scantable>& right,
[1308]151 const std::string& mode);
152
[1066]153 casa::CountedPtr<Scantable> autoQuotient(const casa::CountedPtr<Scantable>& in,
154 const std::string& mode = "NEAREST",
155 bool preserve = true);
156
157 casa::CountedPtr<Scantable> quotient( const casa::CountedPtr<Scantable>& on,
158 const casa::CountedPtr<Scantable>& off,
[805]159 bool preserve = true );
[169]160
[1391]161 /**
162 * Calibrate total power scans (translated from GBTIDL)
[1819]163 * @param calon uncalibrated Scantable with CAL noise signal
[1391]164 * @param caloff uncalibrated Scantable with no CAL signal
165 * @param tcal optional scalar Tcal, CAL temperature (K)
[1819]166 * @return casa::CountedPtr<Scantable> which holds a calibrated Scantable
[1391]167 * (spectrum - average of the two CAL on and off spectra;
168 * tsys - mean Tsys = <caloff>*Tcal/<calon-caloff> + Tcal/2)
[1819]169 */
[1391]170 casa::CountedPtr<Scantable> dototalpower( const casa::CountedPtr<Scantable>& calon,
171 const casa::CountedPtr<Scantable>& caloff,
172 casa::Float tcal=1.0 );
173
174 /**
175 * Combine signal and reference scans (translated from GBTIDL)
176 * @param sig Scantable which contains signal scans
177 * @param ref Scantable which contains reference scans
178 * @param smoothref optional Boxcar smooth width of the reference scans
179 * default: no smoothing (=1)
[1819]180 * @param tsysv optional scalar Tsys value at the zenith, required to
181 * set tau, as well
[1391]182 * @param tau optional scalar Tau value
183 * @return casa::CountedPtr<Scantable> which holds combined scans
184 * (spectrum = (sig-ref)/ref * Tsys )
185 */
186 casa::CountedPtr<Scantable> dosigref( const casa::CountedPtr<Scantable>& sig,
187 const casa::CountedPtr<Scantable>& ref,
188 int smoothref=1,
189 casa::Float tsysv=0.0,
190 casa::Float tau=0.0 );
191
[1819]192 /**
[1391]193 * Calibrate GBT Nod scan pairs (translated from GBTIDL)
194 * @param s Scantable which contains Nod scans
195 * @param scans Vector of scan numbers
196 * @param smoothref optional Boxcar smooth width of the reference scans
197 * @param tsysv optional scalar Tsys value at the zenith, required to
198 * set tau, as well
[1819]199 * @param tau optional scalar Tau value
[1391]200 * @param tcal optional scalar Tcal, CAL temperature (K)
201 * @return casa::CountedPtr<Scantable> which holds calibrated scans
202 */
203 casa::CountedPtr<Scantable> donod( const casa::CountedPtr<Scantable>& s,
204 const std::vector<int>& scans,
205 int smoothref=1,
206 casa::Float tsysv=0.0,
207 casa::Float tau=0.0,
208 casa::Float tcal=0.0 );
209
210 /**
211 * Calibrate frequency switched scans (translated from GBTIDL)
212 * @param s Scantable which contains frequency switched scans
213 * @param scans Vector of scan numbers
214 * @param smoothref optional Boxcar smooth width of the reference scans
215 * @param tsysv optional scalar Tsys value at the zenith, required to
216 * set tau, as well
217 * @param tau optional scalar Tau value
218 * @param tcal optional scalar Tcal, CAL temperature (K)
219 * @return casa::CountedPtr<Scantable> which holds calibrated scans
220 */
221 casa::CountedPtr<Scantable> dofs( const casa::CountedPtr<Scantable>& s,
222 const std::vector<int>& scans,
223 int smoothref=1,
224 casa::Float tsysv=0.0,
225 casa::Float tau=0.0,
226 casa::Float tcal=0.0 );
227
[1819]228 /**
229 * Calibrate data with Chopper-Wheel like calibration method
230 * which adopts position switching by antenna motion,
231 * wobbler (nutator) switching and On-The-Fly observation.
232 *
233 * The method is applicable to APEX, and other telescopes other than GBT.
234 *
235 * @param a Scantable which contains ON and OFF scans
236 * @param a string that indicates calibration mode
237 * @param a string that indicates antenna name
238 **/
239 casa::CountedPtr<Scantable> cwcal( const casa::CountedPtr<Scantable>& s,
240 const casa::String calmode,
241 const casa::String antname );
[1391]242
[1819]243 /**
244 * Calibrate frequency switched scans with Chopper-Wheel like
245 * calibration method.
246 *
247 * The method is applicable to APEX, and other telescopes other than GBT.
248 *
249 * @param a Scantable which contains ON and OFF scans
250 * @param a string that indicates antenna name
251 **/
252 casa::CountedPtr<Scantable> cwcalfs( const casa::CountedPtr<Scantable>& s,
253 const casa::String antname );
254
255
256 /**
257 * Folding frequency-switch data
258 * @param sig
259 * @param ref
260 * @param choffset
261 **/
262 casa::CountedPtr<Scantable> dofold( const casa::CountedPtr<Scantable> &sig,
263 const casa::CountedPtr<Scantable> &ref,
264 casa::Double choffset,
[1937]265 casa::Double choffset2 = 0.0 );
[1819]266
267 /**
268 * ALMA calibration
269 **/
270 casa::CountedPtr<Scantable> almacal( const casa::CountedPtr<Scantable>& s,
271 const casa::String calmode ) ;
272 casa::CountedPtr<Scantable> almacalfs( const casa::CountedPtr<Scantable>& s ) ;
273
[805]274 casa::CountedPtr<Scantable>
275 freqSwitch( const casa::CountedPtr<Scantable>& in );
[716]276
[805]277 std::vector<float> statistic(const casa::CountedPtr<Scantable>& in,
278 const std::vector<bool>& mask,
279 const std::string& which);
[457]280
[1907]281 std::vector<float> statisticRow(const casa::CountedPtr<Scantable>& in,
282 const std::vector<bool>& mask,
283 const std::string& which,
284 int row);
285
[1819]286 std::vector< int > minMaxChan(const casa::CountedPtr<Scantable>& in,
287 const std::vector<bool>& mask,
288 const std::string& which);
289
[805]290 casa::CountedPtr<Scantable> bin( const casa::CountedPtr<Scantable>& in,
291 int width=5);
292 casa::CountedPtr<Scantable>
293 resample(const casa::CountedPtr<Scantable>& in,
294 const std::string& method, float width);
[457]295
[805]296 casa::CountedPtr<Scantable>
297 smooth(const casa::CountedPtr<Scantable>& in, const std::string& kernel,
[1570]298 float width, int order=2);
[169]299
[805]300 casa::CountedPtr<Scantable>
301 gainElevation(const casa::CountedPtr<Scantable>& in,
[867]302 const std::vector<float>& coeff,
[805]303 const std::string& fileName,
[995]304 const std::string& method);
[805]305 casa::CountedPtr<Scantable>
306 convertFlux(const casa::CountedPtr<Scantable>& in, float d,
307 float etaap, float jyperk);
[152]308
[805]309 casa::CountedPtr<Scantable> opacity(const casa::CountedPtr<Scantable>& in,
[1689]310 const std::vector<float>& tau);
[144]311
[841]312 casa::CountedPtr<Scantable>
313 merge(const std::vector<casa::CountedPtr<Scantable> >& in);
314
[896]315 casa::CountedPtr<Scantable>
316 invertPhase( const casa::CountedPtr<Scantable>& in);
[912]317
[896]318 casa::CountedPtr<Scantable>
319 rotateXYPhase( const casa::CountedPtr<Scantable>& in, float phase);
[912]320
[896]321 casa::CountedPtr<Scantable>
322 rotateLinPolPhase( const casa::CountedPtr<Scantable>& in, float phase);
323
324 casa::CountedPtr<Scantable>
325 swapPolarisations(const casa::CountedPtr<Scantable>& in);
326
[917]327 casa::CountedPtr<Scantable>
328 frequencyAlign( const casa::CountedPtr<Scantable>& in,
[927]329 const std::string& refTime = "",
330 const std::string& method = "cubic" );
[917]331
[992]332 casa::CountedPtr<Scantable>
333 convertPolarisation( const casa::CountedPtr<Scantable>& in,
334 const std::string& newtype);
[1143]335
[1140]336 casa::CountedPtr<Scantable>
[1143]337 mxExtract( const casa::CountedPtr<Scantable>& in,
338 const std::string& srctype = "on");
[992]339
[1192]340 /**
341 * "hard" flag the data, this flags everything selected in setSelection()
342 * @param frequency the frequency to remove
343 * @param width the number of lags to flag left to the side of the frequency
344 */
345 casa::CountedPtr<Scantable>
[1570]346 lagFlag( const casa::CountedPtr<Scantable>& in, double start,
347 double end, const std::string& mode="frequency");
[1192]348
[2177]349 std::vector<float>
350 fft( const casa::CountedPtr<Scantable>& in,
351 const std::vector<int>& whichrow,
352 bool getRealImag=false );
353
[1819]354 // test for average spectra with different channel/resolution
355 casa::CountedPtr<Scantable>
356 new_average( const std::vector<casa::CountedPtr<Scantable> >& in,
357 const bool& compel,
358 const std::vector<bool>& mask = std::vector<bool>(),
359 const std::string& weight = "NONE",
360 const std::string& avmode = "SCAN" )
361 throw (casa::AipsError) ;
362
[805]363private:
[896]364 casa::CountedPtr<Scantable> applyToPol( const casa::CountedPtr<Scantable>& in,
365 STPol::polOperation fptr,
366 casa::Float phase);
367
[805]368 static imethod stringToIMethod(const std::string& in);
369 static WeightType stringToWeight(const std::string& in);
[146]370
[805]371 void scaleByVector(casa::Table& in,
372 const casa::Vector<casa::Float>& factor,
373 bool dotsys);
[152]374
[805]375 void scaleFromAsciiTable(casa::Table& in, const std::string& filename,
376 const std::string& method,
377 const casa::Vector<casa::Float>& xout,
378 bool dotsys);
[162]379
[805]380 void scaleFromTable(casa::Table& in, const casa::Table& table,
381 const std::string& method,
382 const casa::Vector<casa::Float>& xout, bool dotsys);
[227]383
[805]384 void convertBrightnessUnits(casa::CountedPtr<Scantable>& in,
385 bool tokelvin, float cfac);
[227]386
[1570]387 casa::CountedPtr< Scantable >
[1374]388 smoothOther( const casa::CountedPtr< Scantable >& in,
389 const std::string& kernel,
[1570]390 float width, int order=2 );
[1374]391
[805]392 casa::CountedPtr< Scantable >
393 getScantable(const casa::CountedPtr< Scantable >& in, bool droprows);
[230]394
[805]395 casa::MaskedArray<casa::Float>
396 maskedArray( const casa::Vector<casa::Float>& s,
397 const casa::Vector<casa::uChar>& f );
[1819]398 casa::MaskedArray<casa::Double>
399 maskedArray( const casa::Vector<casa::Double>& s,
400 const casa::Vector<casa::uChar>& f );
[805]401 casa::Vector<casa::uChar>
402 flagsFromMA(const casa::MaskedArray<casa::Float>& ma);
[230]403
[1819]404 vector<float> getSpectrumFromTime( string reftime, casa::CountedPtr<Scantable>& s, string mode = "before" ) ;
[2546]405 casa::Vector<casa::Float> getSpectrumFromTime( double reftime, casa::Vector<casa::Double> &v, const casa::CountedPtr<Scantable>& s, string mode = "before" ) ;
[2551]406 casa::Vector<casa::Float> getSpectrumFromTime( double reftime, const casa::Vector<casa::Double> &v, const casa::Matrix<casa::Float>& sp, string mode = "before" ) ;
[2546]407 void getSpectrumFromTime2( casa::Vector<casa::Float> &sp, double reftime, casa::Vector<casa::Double> &v, const casa::CountedPtr<Scantable>& s, string mode = "before" ) ;
[1819]408 vector<float> getTcalFromTime( string reftime, casa::CountedPtr<Scantable>& s, string mode="before" ) ;
409 vector<float> getTsysFromTime( string reftime, casa::CountedPtr<Scantable>& s, string mode="before" ) ;
410 vector<int> getRowIdFromTime( string reftime, casa::CountedPtr<Scantable>& s ) ;
[2551]411 vector<int> getRowIdFromTime( double reftime, const casa::Vector<casa::Double>& t ) ;
[1819]412
413 // Chopper-Wheel type calibration
414 vector<float> getCalibratedSpectra( casa::CountedPtr<Scantable>& on,
415 casa::CountedPtr<Scantable>& off,
416 casa::CountedPtr<Scantable>& sky,
417 casa::CountedPtr<Scantable>& hot,
418 casa::CountedPtr<Scantable>& cold,
419 int index,
420 string antname ) ;
421 // Tsys * (ON-OFF)/OFF
422 vector<float> getCalibratedSpectra( casa::CountedPtr<Scantable>& on,
423 casa::CountedPtr<Scantable>& off,
424 int index ) ;
[2544]425 void calibrateALMA( casa::CountedPtr<Scantable>& out,
426 const casa::CountedPtr<Scantable>& on,
427 const casa::CountedPtr<Scantable>& off,
428 casa::Vector<casa::uInt>& rows ) ;
[1819]429 vector<float> getFSCalibratedSpectra( casa::CountedPtr<Scantable>& sig,
430 casa::CountedPtr<Scantable>& ref,
431 casa::CountedPtr<Scantable>& sky,
432 casa::CountedPtr<Scantable>& hot,
433 casa::CountedPtr<Scantable>& cold,
434 int index ) ;
435 vector<float> getFSCalibratedSpectra( casa::CountedPtr<Scantable>& sig,
436 casa::CountedPtr<Scantable>& ref,
437 vector< casa::CountedPtr<Scantable> >& sky,
438 vector< casa::CountedPtr<Scantable> >& hot,
439 vector< casa::CountedPtr<Scantable> >& cold,
440 int index ) ;
441 double getMJD( string strtime ) ;
[2543]442 void copyRows( casa::Table &out,
443 const casa::Table &in,
444 casa::uInt startout,
445 casa::uInt startin,
446 casa::uInt nrow,
447 casa::Bool copySpectra=true,
448 casa::Bool copyFlagtra=true,
449 casa::Bool copyTsys=true ) ;
[1819]450
[805]451 bool insitu_;
452};
[234]453
[805]454}
[165]455#endif
Note: See TracBrowser for help on using the repository browser.