source: trunk/src/STApplyCal.cpp@ 2963

Last change on this file since 2963 was 2963, checked in by Takeshi Nakazato, 11 years ago

New Development: No

JIRA Issue: Yes CAS-6585, CAS-6571

Ready for Test: Yes

Interface Changes: Yes/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...

STApplyCal is updated so that it takes into account channel flag information
when data is interpolated in time and in frequency.


File size: 19.9 KB
Line 
1//
2// C++ Implementation: STApplyCal
3//
4// Description:
5//
6//
7// Author: Takeshi Nakazato <takeshi.nakazato@nao.ac.jp> (C) 2012
8//
9// Copyright: See COPYING file that comes with this distribution
10//
11//
12#include <assert.h>
13
14#include <casa/Arrays/Array.h>
15#include <casa/Arrays/Vector.h>
16#include <casa/Arrays/Matrix.h>
17#include <casa/Arrays/ArrayIO.h>
18#include <casa/Arrays/ArrayMath.h>
19#include <casa/BasicSL/String.h>
20#include <casa/Logging/LogIO.h>
21#include <casa/Exceptions/Error.h>
22#include <casa/Utilities/CountedPtr.h>
23#include <casa/Utilities/Sort.h>
24#include <casa/Utilities/Assert.h>
25#include <tables/Tables/Table.h>
26
27#include "Scantable.h"
28#include "STApplyCal.h"
29#include "STApplyTable.h"
30#include "STCalTsysTable.h"
31#include "STCalSkyTable.h"
32#include "STCalEnum.h"
33#include "STIdxIter.h"
34#include "Calibrator.h"
35#include "PSAlmaCalibrator.h"
36#include "Interpolator1D.h"
37#include "NearestInterpolator1D.h"
38#include "BufferedLinearInterpolator1D.h"
39#include "PolynomialInterpolator1D.h"
40#include "CubicSplineInterpolator1D.h"
41#include <atnf/PKSIO/SrcType.h>
42
43
44using namespace casa;
45using namespace std;
46
47namespace {
48// utility functions
49Vector<uInt> indexSort(Vector<Double> &t)
50{
51 Sort sort;
52 sort.sortKey(&t[0], TpDouble, 0, Sort::Ascending);
53 Vector<uInt> idx;
54 sort.sort(idx, t.nelements(), Sort::QuickSort|Sort::NoDuplicates);
55 return idx;
56}
57
58void getSortedData(const Vector<Double> key, const Vector<Float> data,
59 const Vector<uChar> flag,
60 Vector<Double> sortedKey, Vector<Float> sortedData,
61 Vector<uChar> sortedFlag)
62{
63}
64}
65
66namespace asap {
67STApplyCal::STApplyCal()
68{
69 init();
70}
71
72STApplyCal::STApplyCal(CountedPtr<Scantable> target)
73 : target_(target)
74{
75 init();
76}
77
78STApplyCal::~STApplyCal()
79{
80}
81
82void STApplyCal::init()
83{
84 caltype_ = STCalEnum::NoType;
85 doTsys_ = False;
86 iTime_ = STCalEnum::DefaultInterpolation;
87 iFreq_ = STCalEnum::DefaultInterpolation;
88}
89
90void STApplyCal::reset()
91{
92 // call init
93 init();
94
95 // clear apply tables
96 // do not delete object here
97 skytable_.resize(0);
98 tsystable_.resize(0);
99
100 // clear mapping for Tsys transfer
101 spwmap_.clear();
102
103 // reset selector
104 sel_.reset();
105
106 // delete interpolators
107 interpolatorT_ = 0;
108 interpolatorS_ = 0;
109 interpolatorF_ = 0;
110
111 // clear working scantable
112 work_ = 0;
113
114 // clear calibrator
115 calibrator_ = 0;
116}
117
118void STApplyCal::completeReset()
119{
120 reset();
121 target_ = 0;
122}
123
124void STApplyCal::setTarget(CountedPtr<Scantable> target)
125{
126 target_ = target;
127}
128
129void STApplyCal::setTarget(const String &name)
130{
131 // always create PlainTable
132 target_ = new Scantable(name, Table::Plain);
133}
134
135void STApplyCal::push(STCalSkyTable *table)
136{
137 os_.origin(LogOrigin("STApplyCal","push",WHERE));
138 skytable_.push_back(table);
139 STCalEnum::CalType caltype = STApplyTable::getCalType(table);
140 os_ << "caltype=" << caltype << LogIO::POST;
141 if (caltype_ == STCalEnum::NoType ||
142 caltype_ == STCalEnum::DefaultType ||
143 caltype_ == STCalEnum::CalTsys) {
144 caltype_ = caltype;
145 }
146 os_ << "caltype_=" << caltype_ << LogIO::POST;
147}
148
149void STApplyCal::push(STCalTsysTable *table)
150{
151 tsystable_.push_back(table);
152 doTsys_ = True;
153}
154
155void STApplyCal::setTimeInterpolation(STCalEnum::InterpolationType itype, Int order)
156{
157 iTime_ = itype;
158 order_ = order;
159}
160
161void STApplyCal::setFrequencyInterpolation(STCalEnum::InterpolationType itype, Int order)
162{
163 iFreq_ = itype;
164 order_ = order;
165}
166
167void STApplyCal::setTsysTransfer(uInt from, Vector<uInt> to)
168{
169 os_.origin(LogOrigin("STApplyCal","setTsysTransfer",WHERE));
170 os_ << "from=" << from << ", to=" << to << LogIO::POST;
171 map<uInt, Vector<uInt> >::iterator i = spwmap_.find(from);
172 if (i == spwmap_.end()) {
173 spwmap_.insert(pair<uInt, Vector<uInt> >(from, to));
174 }
175 else {
176 Vector<uInt> toNew = i->second;
177 spwmap_.erase(i);
178 uInt k = toNew.nelements();
179 toNew.resize(k+to.nelements(), True);
180 for (uInt i = 0; i < to.nelements(); i++)
181 toNew[i+k] = to[i];
182 spwmap_.insert(pair<uInt, Vector<uInt> >(from, toNew));
183 }
184}
185
186void STApplyCal::apply(Bool insitu, Bool filltsys)
187{
188 os_.origin(LogOrigin("STApplyCal","apply",WHERE));
189
190 //assert(!target_.null());
191 assert_<AipsError>(!target_.null(),"You have to set target scantable first.");
192
193 // calibrator
194 if (caltype_ == STCalEnum::CalPSAlma)
195 calibrator_ = new PSAlmaCalibrator();
196
197 // interpolator
198 initInterpolator();
199
200 // select data
201 sel_.reset();
202 sel_ = target_->getSelection();
203 if (caltype_ == STCalEnum::CalPSAlma ||
204 caltype_ == STCalEnum::CalPS) {
205 sel_.setTypes(vector<int>(1,(int)SrcType::PSON));
206 }
207 target_->setSelection(sel_);
208
209 //os_ << "sel_.print()=" << sel_.print() << LogIO::POST;
210
211 // working data
212 if (insitu) {
213 os_.origin(LogOrigin("STApplyCal","apply",WHERE));
214 os_ << "Overwrite input scantable" << LogIO::POST;
215 work_ = target_;
216 }
217 else {
218 os_.origin(LogOrigin("STApplyCal","apply",WHERE));
219 os_ << "Create output scantable from input" << LogIO::POST;
220 work_ = new Scantable(*target_, false);
221 }
222
223 //os_ << "work_->nrow()=" << work_->nrow() << LogIO::POST;
224
225 // list of apply tables for sky calibration
226 Vector<uInt> skycalList(skytable_.size());
227 uInt numSkyCal = 0;
228
229 // list of apply tables for Tsys calibration
230 for (uInt i = 0 ; i < skytable_.size(); i++) {
231 STCalEnum::CalType caltype = STApplyTable::getCalType(skytable_[i]);
232 if (caltype == caltype_) {
233 skycalList[numSkyCal] = i;
234 numSkyCal++;
235 }
236 }
237 skycalList.resize(numSkyCal, True);
238
239
240 vector<string> cols( 3 ) ;
241 cols[0] = "BEAMNO" ;
242 cols[1] = "POLNO" ;
243 cols[2] = "IFNO" ;
244 CountedPtr<STIdxIter2> iter = new STIdxIter2(work_, cols) ;
245 double start = mathutil::gettimeofday_sec();
246 os_ << LogIO::DEBUGGING << "start iterative doapply: " << start << LogIO::POST;
247 while (!iter->pastEnd()) {
248 Record ids = iter->currentValue();
249 Vector<uInt> rows = iter->getRows(SHARE);
250 if (rows.nelements() > 0)
251 doapply(ids.asuInt("BEAMNO"), ids.asuInt("IFNO"), ids.asuInt("POLNO"), rows, skycalList, filltsys);
252 iter->next();
253 }
254 double end = mathutil::gettimeofday_sec();
255 os_ << LogIO::DEBUGGING << "end iterative doapply: " << end << LogIO::POST;
256 os_ << LogIO::DEBUGGING << "elapsed time for doapply: " << end - start << " sec" << LogIO::POST;
257
258 target_->unsetSelection();
259}
260
261void STApplyCal::doapply(uInt beamno, uInt ifno, uInt polno,
262 Vector<uInt> &rows,
263 Vector<uInt> &skylist,
264 Bool filltsys)
265{
266 os_.origin(LogOrigin("STApplyCal","doapply",WHERE));
267 Bool doTsys = doTsys_;
268
269 STSelector sel;
270 vector<int> id(1);
271 id[0] = beamno;
272 sel.setBeams(id);
273 id[0] = ifno;
274 sel.setIFs(id);
275 id[0] = polno;
276 sel.setPolarizations(id);
277
278 // apply selection to apply tables
279 uInt nrowSky = 0;
280 uInt nrowTsys = 0;
281 for (uInt i = 0; i < skylist.nelements(); i++) {
282 skytable_[skylist[i]]->setSelection(sel);
283 nrowSky += skytable_[skylist[i]]->nrow();
284 os_ << "nrowSky=" << nrowSky << LogIO::POST;
285 }
286
287 // Skip IFNO without sky data
288 if (nrowSky == 0)
289 return;
290
291 uInt nchanTsys = 0;
292 Vector<Double> ftsys;
293 uInt tsysifno = getIFForTsys(ifno);
294 os_ << "tsysifno=" << (Int)tsysifno << LogIO::POST;
295 if (tsystable_.size() == 0) {
296 os_.origin(LogOrigin("STApplyTable", "doapply", WHERE));
297 os_ << "No Tsys tables are given. Skip Tsys calibratoin." << LogIO::POST;
298 doTsys = False;
299 }
300 else if (tsysifno == (uInt)-1) {
301 os_.origin(LogOrigin("STApplyTable", "doapply", WHERE));
302 os_ << "No corresponding Tsys for IFNO " << ifno << ". Skip Tsys calibration" << LogIO::POST;
303 doTsys = False;
304 }
305 else {
306 id[0] = (int)tsysifno;
307 sel.setIFs(id);
308 for (uInt i = 0; i < tsystable_.size() ; i++) {
309 tsystable_[i]->setSelection(sel);
310 uInt nrowThisTsys = tsystable_[i]->nrow();
311 nrowTsys += nrowThisTsys;
312 if (nrowThisTsys > 0 && nchanTsys == 0) {
313 nchanTsys = tsystable_[i]->nchan(tsysifno);
314 ftsys = tsystable_[i]->getBaseFrequency(0);
315 }
316 }
317 interpolatorF_->setX(ftsys.data(), nchanTsys);
318 }
319
320 uInt nchanSp = skytable_[skylist[0]]->nchan(ifno);
321 uInt nrowSkySorted = nrowSky;
322 Vector<Double> timeSkySorted;
323 Matrix<Float> spoffSorted;
324 Matrix<uChar> flagoffSorted;
325 {
326 Vector<Double> timeSky(nrowSky);
327 Matrix<Float> spoff(nrowSky, nchanSp);
328 Matrix<uChar> flagoff(nrowSky, nchanSp);
329 nrowSky = 0;
330 for (uInt i = 0 ; i < skylist.nelements(); i++) {
331 STCalSkyTable *p = skytable_[skylist[i]];
332 Vector<Double> t = p->getTime();
333 Matrix<Float> sp = p->getSpectra();
334 Matrix<uChar> fl = p->getFlagtra();
335 for (uInt j = 0; j < t.nelements(); j++) {
336 timeSky[nrowSky] = t[j];
337 spoff.row(nrowSky) = sp.column(j);
338 flagoff.row(nrowSky) = fl.column(j);
339 nrowSky++;
340 }
341 }
342
343 Vector<uInt> skyIdx = indexSort(timeSky);
344 nrowSkySorted = skyIdx.nelements();
345
346 timeSkySorted.takeStorage(IPosition(1, nrowSkySorted),
347 new Double[nrowSkySorted],
348 TAKE_OVER);
349 for (uInt i = 0 ; i < nrowSkySorted; i++) {
350 timeSkySorted[i] = timeSky[skyIdx[i]];
351 }
352 interpolatorS_->setX(timeSkySorted.data(), nrowSkySorted);
353
354 spoffSorted.takeStorage(IPosition(2, nrowSky, nchanSp),
355 new Float[nrowSky * nchanSp],
356 TAKE_OVER);
357 flagoffSorted.takeStorage(IPosition(2, nrowSkySorted, nchanSp),
358 new uChar[nrowSkySorted * nchanSp],
359 TAKE_OVER);
360 for (uInt i = 0 ; i < nrowSky; i++) {
361 spoffSorted.row(i) = spoff.row(skyIdx[i]);
362 flagoffSorted.row(i) = flagoff.row(skyIdx[i]);
363 }
364 }
365
366 uInt nrowTsysSorted = nrowTsys;
367 Matrix<Float> tsysSorted;
368 Matrix<uChar> flagtsysSorted;
369 Vector<Double> timeTsysSorted;
370 if (doTsys) {
371 //os_ << "doTsys" << LogIO::POST;
372 Vector<Double> timeTsys(nrowTsys);
373 Matrix<Float> tsys(nrowTsys, nchanTsys);
374 Matrix<uChar> flagtsys(nrowTsys, nchanTsys);
375 tsysSorted.takeStorage(IPosition(2, nrowTsys, nchanTsys),
376 new Float[nrowTsys * nchanTsys],
377 TAKE_OVER);
378 nrowTsys = 0;
379 for (uInt i = 0 ; i < tsystable_.size(); i++) {
380 STCalTsysTable *p = tsystable_[i];
381 Vector<Double> t = p->getTime();
382 Matrix<Float> ts = p->getTsys();
383 Matrix<uChar> fl = p->getFlagtra();
384 for (uInt j = 0; j < t.nelements(); j++) {
385 timeTsys[nrowTsys] = t[j];
386 tsys.row(nrowTsys) = ts.column(j);
387 flagtsys.row(nrowTsys) = fl.column(j);
388 nrowTsys++;
389 }
390 }
391 Vector<uInt> tsysIdx = indexSort(timeTsys);
392 nrowTsysSorted = tsysIdx.nelements();
393
394 timeTsysSorted.takeStorage(IPosition(1, nrowTsysSorted),
395 new Double[nrowTsysSorted],
396 TAKE_OVER);
397 flagtsysSorted.takeStorage(IPosition(2, nrowTsysSorted, nchanTsys),
398 new uChar[nrowTsysSorted * nchanTsys],
399 TAKE_OVER);
400 for (uInt i = 0 ; i < nrowTsysSorted; i++) {
401 timeTsysSorted[i] = timeTsys[tsysIdx[i]];
402 }
403 interpolatorT_->setX(timeTsysSorted.data(), nrowTsysSorted);
404
405 for (uInt i = 0; i < nrowTsys; ++i) {
406 tsysSorted.row(i) = tsys.row(tsysIdx[i]);
407 flagtsysSorted.row(i) = flagtsys.row(tsysIdx[i]);
408 }
409 }
410
411 Table tab = work_->table();
412 ArrayColumn<Float> spCol(tab, "SPECTRA");
413 ArrayColumn<uChar> flCol(tab, "FLAGTRA");
414 ArrayColumn<Float> tsysCol(tab, "TSYS");
415 ScalarColumn<Double> timeCol(tab, "TIME");
416 //Vector<Float> on;
417
418 // Array for scaling factor (aka Tsys)
419 Vector<Float> iTsys(IPosition(1, nchanSp), new Float[nchanSp], TAKE_OVER);
420 // Array for Tsys interpolation
421 // This is empty array and is never referenced if doTsys == false
422 // (i.e. nchanTsys == 0)
423 Vector<Float> iTsysT(IPosition(1, nchanTsys), new Float[nchanTsys], TAKE_OVER);
424
425 // Array for interpolated off spectrum
426 Vector<Float> iOff(IPosition(1, nchanSp), new Float[nchanSp], TAKE_OVER);
427
428 // working array for interpolation with flags
429 uInt arraySize = max(max(nrowTsysSorted, nchanTsys), nrowSkySorted);
430 Vector<Double> xwork(IPosition(1, arraySize), new Double[arraySize], TAKE_OVER);
431 Vector<Float> ywork(IPosition(1, arraySize), new Float[arraySize], TAKE_OVER);
432 Vector<uChar> fwork(IPosition(1, nchanTsys), new uChar[nchanTsys], TAKE_OVER);
433
434 for (uInt i = 0; i < rows.nelements(); i++) {
435 //os_ << "start i = " << i << " (row = " << rows[i] << ")" << LogIO::POST;
436 uInt irow = rows[i];
437
438 // target spectral data
439 Vector<Float> on = spCol(irow);
440 Vector<uChar> flag = flCol(irow);
441 //os_ << "on=" << on[0] << LogIO::POST;
442 calibrator_->setSource(on);
443
444 // interpolation
445 Double t0 = timeCol(irow);
446 Double *xwork_p = xwork.data();
447 Float *ywork_p = ywork.data();
448 for (uInt ichan = 0; ichan < nchanSp; ichan++) {
449 Float *tmpY = &(spoffSorted.data()[ichan * nrowSkySorted]);
450 uChar *tmpF = &(flagoffSorted.data()[ichan * nrowSkySorted]);
451 uInt wnrow = 0;
452 for (uInt ir = 0; ir < nrowSkySorted; ++ir) {
453 if (tmpF[ir] == 0) {
454 xwork_p[wnrow] = timeSkySorted.data()[ir];
455 ywork_p[wnrow] = tmpY[ir];
456 wnrow++;
457 }
458 }
459 //if (allNE(flagoffSorted.column(ichan), (uChar)0)) {
460 if (wnrow > 0) {
461 // any valid reference data
462 interpolatorS_->setData(xwork_p, ywork_p, wnrow);
463 }
464 else {
465 // no valid reference data
466 // interpolate data regardless of flag
467 interpolatorS_->setData(timeSkySorted.data(), tmpY, nrowSkySorted);
468 // flag this channel for calibrated data
469 flag[ichan] = 1 << 7; // user flag
470 }
471 //interpolatorS_->setY(tmpY, nrowSkySorted);
472 iOff[ichan] = interpolatorS_->interpolate(t0);
473 }
474 //os_ << "iOff=" << iOff[0] << LogIO::POST;
475 calibrator_->setReference(iOff);
476
477 if (doTsys) {
478 // Tsys correction
479 // interpolation on time axis
480 Float *yt = iTsysT.data();
481 uChar *fwork_p = fwork.data();
482 for (uInt ichan = 0; ichan < nchanTsys; ichan++) {
483 Float *tmpY = &(tsysSorted.data()[ichan * nrowTsysSorted]);
484 uChar *tmpF = &(flagtsysSorted.data()[ichan * nrowTsysSorted]);
485 uInt wnrow = 0;
486 for (uInt ir = 0; ir < nrowTsysSorted; ++ir) {
487 if (tmpF[ir] == 0) {
488 xwork_p[wnrow] = timeTsysSorted.data()[ir];
489 ywork_p[wnrow] = tmpY[ir];
490 wnrow++;
491 }
492 }
493 if (wnrow > 0) {
494 // any valid value exists
495 //interpolatorT_->setY(tmpY, nrowTsysSorted);
496 interpolatorT_->setData(xwork_p, ywork_p, wnrow);
497 iTsysT[ichan] = interpolatorT_->interpolate(t0);
498 fwork_p[ichan] = 0;
499 }
500 else {
501 // no valid data
502 fwork_p[ichan] = 1 << 7; // user flag
503 }
504 }
505 if (nchanSp == 1) {
506 // take average
507 iTsys[0] = mean(iTsysT);
508 }
509 else {
510 // interpolation on frequency axis
511 Vector<Double> fsp = getBaseFrequency(rows[i]);
512 uInt wnchan = 0;
513 for (uInt ichan = 0; ichan < nchanTsys; ++ichan) {
514 if (fwork_p[ichan] == 0) {
515 xwork_p[wnchan] = ftsys.data()[ichan];
516 ywork_p[wnchan] = yt[ichan];
517 ++wnchan;
518 }
519 }
520 //interpolatorF_->setY(yt, nchanTsys);
521 interpolatorF_->setData(xwork_p, ywork_p, wnchan);
522 for (uInt ichan = 0; ichan < nchanSp; ichan++) {
523 iTsys[ichan] = interpolatorF_->interpolate(fsp[ichan]);
524 }
525 }
526 }
527 else {
528 Vector<Float> tsysInRow = tsysCol(irow);
529 if (tsysInRow.nelements() == 1) {
530 iTsys = tsysInRow[0];
531 }
532 else {
533 for (uInt ichan = 0; ichan < tsysInRow.nelements(); ++ichan)
534 iTsys[ichan] = tsysInRow[ichan];
535 }
536 }
537 //os_ << "iTsys=" << iTsys[0] << LogIO::POST;
538 calibrator_->setScaler(iTsys);
539
540 // do calibration
541 calibrator_->calibrate();
542
543 // update table
544 //os_ << "calibrated=" << calibrator_->getCalibrated()[0] << LogIO::POST;
545 spCol.put(irow, calibrator_->getCalibrated());
546 flCol.put(irow, flag);
547 if (filltsys)
548 tsysCol.put(irow, iTsys);
549 }
550
551
552 // reset selection on apply tables
553 for (uInt i = 0; i < skylist.nelements(); i++)
554 skytable_[i]->unsetSelection();
555 for (uInt i = 0; i < tsystable_.size(); i++)
556 tsystable_[i]->unsetSelection();
557
558
559 // reset interpolator
560 interpolatorS_->reset();
561 interpolatorF_->reset();
562 interpolatorT_->reset();
563}
564
565uInt STApplyCal::getIFForTsys(uInt to)
566{
567 for (map<casa::uInt, Vector<uInt> >::iterator i = spwmap_.begin();
568 i != spwmap_.end(); i++) {
569 Vector<uInt> tolist = i->second;
570 os_ << "from=" << i->first << ": tolist=" << tolist << LogIO::POST;
571 for (uInt j = 0; j < tolist.nelements(); j++) {
572 if (tolist[j] == to)
573 return i->first;
574 }
575 }
576 return (uInt)-1;
577}
578
579void STApplyCal::save(const String &name)
580{
581 //assert(!work_.null());
582 assert_<AipsError>(!work_.null(),"You have to execute apply method first.");
583
584 work_->setSelection(sel_);
585 work_->makePersistent(name);
586 work_->unsetSelection();
587}
588
589Vector<Double> STApplyCal::getBaseFrequency(uInt whichrow)
590{
591 //assert(whichrow <= (uInt)work_->nrow());
592 assert_<AipsError>(whichrow <= (uInt)work_->nrow(),"row index out of range.");
593 ROTableColumn col(work_->table(), "IFNO");
594 uInt ifno = col.asuInt(whichrow);
595 col.attach(work_->table(), "FREQ_ID");
596 uInt freqid = col.asuInt(whichrow);
597 uInt nc = work_->nchan(ifno);
598 STFrequencies ftab = work_->frequencies();
599 Double rp, rf, inc;
600 ftab.getEntry(rp, rf, inc, freqid);
601 Vector<Double> r(nc);
602 indgen(r, rf-rp*inc, inc);
603 return r;
604}
605
606void STApplyCal::initInterpolator()
607{
608 os_.origin(LogOrigin("STApplyCal","initInterpolator",WHERE));
609 int order = (order_ > 0) ? order_ : 1;
610 switch (iTime_) {
611 case STCalEnum::NearestInterpolation:
612 {
613 os_ << "use NearestInterpolator in time axis" << LogIO::POST;
614 interpolatorS_ = new NearestInterpolator1D<Double, Float>();
615 interpolatorT_ = new NearestInterpolator1D<Double, Float>();
616 break;
617 }
618 case STCalEnum::LinearInterpolation:
619 {
620 os_ << "use BufferedLinearInterpolator in time axis" << LogIO::POST;
621 interpolatorS_ = new BufferedLinearInterpolator1D<Double, Float>();
622 interpolatorT_ = new BufferedLinearInterpolator1D<Double, Float>();
623 break;
624 }
625 case STCalEnum::CubicSplineInterpolation:
626 {
627 os_ << "use CubicSplineInterpolator in time axis" << LogIO::POST;
628 interpolatorS_ = new CubicSplineInterpolator1D<Double, Float>();
629 interpolatorT_ = new CubicSplineInterpolator1D<Double, Float>();
630 break;
631 }
632 case STCalEnum::PolynomialInterpolation:
633 {
634 os_ << "use PolynomialInterpolator in time axis" << LogIO::POST;
635 if (order == 0) {
636 interpolatorS_ = new NearestInterpolator1D<Double, Float>();
637 interpolatorT_ = new NearestInterpolator1D<Double, Float>();
638 }
639 else {
640 interpolatorS_ = new PolynomialInterpolator1D<Double, Float>();
641 interpolatorT_ = new PolynomialInterpolator1D<Double, Float>();
642 interpolatorS_->setOrder(order);
643 interpolatorT_->setOrder(order);
644 }
645 break;
646 }
647 default:
648 {
649 os_ << "use BufferedLinearInterpolator in time axis" << LogIO::POST;
650 interpolatorS_ = new BufferedLinearInterpolator1D<Double, Float>();
651 interpolatorT_ = new BufferedLinearInterpolator1D<Double, Float>();
652 break;
653 }
654 }
655
656 switch (iFreq_) {
657 case STCalEnum::NearestInterpolation:
658 {
659 os_ << "use NearestInterpolator in frequency axis" << LogIO::POST;
660 interpolatorF_ = new NearestInterpolator1D<Double, Float>();
661 break;
662 }
663 case STCalEnum::LinearInterpolation:
664 {
665 os_ << "use BufferedLinearInterpolator in frequency axis" << LogIO::POST;
666 interpolatorF_ = new BufferedLinearInterpolator1D<Double, Float>();
667 break;
668 }
669 case STCalEnum::CubicSplineInterpolation:
670 {
671 os_ << "use CubicSplineInterpolator in frequency axis" << LogIO::POST;
672 interpolatorF_ = new CubicSplineInterpolator1D<Double, Float>();
673 break;
674 }
675 case STCalEnum::PolynomialInterpolation:
676 {
677 os_ << "use PolynomialInterpolator in frequency axis" << LogIO::POST;
678 if (order == 0) {
679 interpolatorF_ = new NearestInterpolator1D<Double, Float>();
680 }
681 else {
682 interpolatorF_ = new PolynomialInterpolator1D<Double, Float>();
683 interpolatorF_->setOrder(order);
684 }
685 break;
686 }
687 default:
688 {
689 os_ << "use LinearInterpolator in frequency axis" << LogIO::POST;
690 interpolatorF_ = new BufferedLinearInterpolator1D<Double, Float>();
691 break;
692 }
693 }
694}
695
696}
Note: See TracBrowser for help on using the repository browser.