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
RevLine 
[2720]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//
[2722]12#include <assert.h>
[2720]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>
[2756]24#include <casa/Utilities/Assert.h>
[2720]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"
[2733]36#include "Interpolator1D.h"
[2720]37#include "NearestInterpolator1D.h"
[2727]38#include "BufferedLinearInterpolator1D.h"
39#include "PolynomialInterpolator1D.h"
40#include "CubicSplineInterpolator1D.h"
[2720]41#include <atnf/PKSIO/SrcType.h>
42
43
44using namespace casa;
45using namespace std;
46
[2963]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
[2720]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;
[2742]86 iTime_ = STCalEnum::DefaultInterpolation;
87 iFreq_ = STCalEnum::DefaultInterpolation;
[2720]88}
89
[2735]90void STApplyCal::reset()
91{
[2742]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;
[2735]116}
117
118void STApplyCal::completeReset()
119{
120 reset();
121 target_ = 0;
122}
123
[2720]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{
[2735]137 os_.origin(LogOrigin("STApplyCal","push",WHERE));
[2720]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
[2735]155void STApplyCal::setTimeInterpolation(STCalEnum::InterpolationType itype, Int order)
[2720]156{
[2735]157 iTime_ = itype;
[2720]158 order_ = order;
159}
160
[2735]161void STApplyCal::setFrequencyInterpolation(STCalEnum::InterpolationType itype, Int order)
162{
163 iFreq_ = itype;
164 order_ = order;
165}
166
[2720]167void STApplyCal::setTsysTransfer(uInt from, Vector<uInt> to)
168{
[2735]169 os_.origin(LogOrigin("STApplyCal","setTsysTransfer",WHERE));
[2720]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
[2742]186void STApplyCal::apply(Bool insitu, Bool filltsys)
[2720]187{
[2735]188 os_.origin(LogOrigin("STApplyCal","apply",WHERE));
[2750]189
[2756]190 //assert(!target_.null());
191 assert_<AipsError>(!target_.null(),"You have to set target scantable first.");
[2750]192
[2720]193 // calibrator
194 if (caltype_ == STCalEnum::CalPSAlma)
195 calibrator_ = new PSAlmaCalibrator();
196
197 // interpolator
[2727]198 initInterpolator();
[2720]199
200 // select data
201 sel_.reset();
[2806]202 sel_ = target_->getSelection();
[2720]203 if (caltype_ == STCalEnum::CalPSAlma ||
204 caltype_ == STCalEnum::CalPS) {
205 sel_.setTypes(vector<int>(1,(int)SrcType::PSON));
206 }
207 target_->setSelection(sel_);
208
[2735]209 //os_ << "sel_.print()=" << sel_.print() << LogIO::POST;
[2720]210
211 // working data
[2750]212 if (insitu) {
213 os_.origin(LogOrigin("STApplyCal","apply",WHERE));
214 os_ << "Overwrite input scantable" << LogIO::POST;
[2720]215 work_ = target_;
[2750]216 }
217 else {
218 os_.origin(LogOrigin("STApplyCal","apply",WHERE));
219 os_ << "Create output scantable from input" << LogIO::POST;
[2720]220 work_ = new Scantable(*target_, false);
[2750]221 }
[2720]222
[2735]223 //os_ << "work_->nrow()=" << work_->nrow() << LogIO::POST;
[2720]224
225 // list of apply tables for sky calibration
[2928]226 Vector<uInt> skycalList(skytable_.size());
[2720]227 uInt numSkyCal = 0;
[2735]228
[2720]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 }
[2928]237 skycalList.resize(numSkyCal, True);
[2720]238
239
240 vector<string> cols( 3 ) ;
241 cols[0] = "BEAMNO" ;
242 cols[1] = "POLNO" ;
243 cols[2] = "IFNO" ;
[2916]244 CountedPtr<STIdxIter2> iter = new STIdxIter2(work_, cols) ;
[2925]245 double start = mathutil::gettimeofday_sec();
246 os_ << LogIO::DEBUGGING << "start iterative doapply: " << start << LogIO::POST;
[2720]247 while (!iter->pastEnd()) {
[2916]248 Record ids = iter->currentValue();
[2720]249 Vector<uInt> rows = iter->getRows(SHARE);
250 if (rows.nelements() > 0)
[2916]251 doapply(ids.asuInt("BEAMNO"), ids.asuInt("IFNO"), ids.asuInt("POLNO"), rows, skycalList, filltsys);
[2720]252 iter->next();
253 }
[2925]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;
[2720]257
258 target_->unsetSelection();
259}
260
261void STApplyCal::doapply(uInt beamno, uInt ifno, uInt polno,
262 Vector<uInt> &rows,
[2742]263 Vector<uInt> &skylist,
264 Bool filltsys)
[2720]265{
[2735]266 os_.origin(LogOrigin("STApplyCal","doapply",WHERE));
[2720]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 }
[2806]286
287 // Skip IFNO without sky data
288 if (nrowSky == 0)
289 return;
290
[2720]291 uInt nchanTsys = 0;
292 Vector<Double> ftsys;
293 uInt tsysifno = getIFForTsys(ifno);
[2758]294 os_ << "tsysifno=" << (Int)tsysifno << LogIO::POST;
[2720]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);
[2848]310 uInt nrowThisTsys = tsystable_[i]->nrow();
311 nrowTsys += nrowThisTsys;
[2963]312 if (nrowThisTsys > 0 && nchanTsys == 0) {
[2848]313 nchanTsys = tsystable_[i]->nchan(tsysifno);
314 ftsys = tsystable_[i]->getBaseFrequency(0);
315 }
[2720]316 }
[2848]317 interpolatorF_->setX(ftsys.data(), nchanTsys);
[2720]318 }
319
320 uInt nchanSp = skytable_[skylist[0]]->nchan(ifno);
[2928]321 uInt nrowSkySorted = nrowSky;
322 Vector<Double> timeSkySorted;
323 Matrix<Float> spoffSorted;
[2960]324 Matrix<uChar> flagoffSorted;
[2928]325 {
326 Vector<Double> timeSky(nrowSky);
327 Matrix<Float> spoff(nrowSky, nchanSp);
[2960]328 Matrix<uChar> flagoff(nrowSky, nchanSp);
[2928]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();
[2960]334 Matrix<uChar> fl = p->getFlagtra();
[2928]335 for (uInt j = 0; j < t.nelements(); j++) {
336 timeSky[nrowSky] = t[j];
337 spoff.row(nrowSky) = sp.column(j);
[2960]338 flagoff.row(nrowSky) = fl.column(j);
[2928]339 nrowSky++;
340 }
[2720]341 }
[2928]342
[2963]343 Vector<uInt> skyIdx = indexSort(timeSky);
[2928]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);
[2960]357 flagoffSorted.takeStorage(IPosition(2, nrowSkySorted, nchanSp),
358 new uChar[nrowSkySorted * nchanSp],
359 TAKE_OVER);
[2928]360 for (uInt i = 0 ; i < nrowSky; i++) {
361 spoffSorted.row(i) = spoff.row(skyIdx[i]);
[2960]362 flagoffSorted.row(i) = flagoff.row(skyIdx[i]);
[2928]363 }
[2720]364 }
365
[2928]366 uInt nrowTsysSorted = nrowTsys;
367 Matrix<Float> tsysSorted;
[2960]368 Matrix<uChar> flagtsysSorted;
[2733]369 Vector<Double> timeTsysSorted;
[2720]370 if (doTsys) {
[2758]371 //os_ << "doTsys" << LogIO::POST;
[2928]372 Vector<Double> timeTsys(nrowTsys);
373 Matrix<Float> tsys(nrowTsys, nchanTsys);
[2960]374 Matrix<uChar> flagtsys(nrowTsys, nchanTsys);
[2928]375 tsysSorted.takeStorage(IPosition(2, nrowTsys, nchanTsys),
376 new Float[nrowTsys * nchanTsys],
377 TAKE_OVER);
[2720]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();
[2960]383 Matrix<uChar> fl = p->getFlagtra();
[2720]384 for (uInt j = 0; j < t.nelements(); j++) {
385 timeTsys[nrowTsys] = t[j];
[2925]386 tsys.row(nrowTsys) = ts.column(j);
[2960]387 flagtsys.row(nrowTsys) = fl.column(j);
[2720]388 nrowTsys++;
389 }
390 }
[2963]391 Vector<uInt> tsysIdx = indexSort(timeTsys);
[2928]392 nrowTsysSorted = tsysIdx.nelements();
[2720]393
[2928]394 timeTsysSorted.takeStorage(IPosition(1, nrowTsysSorted),
395 new Double[nrowTsysSorted],
396 TAKE_OVER);
[2960]397 flagtsysSorted.takeStorage(IPosition(2, nrowTsysSorted, nchanTsys),
398 new uChar[nrowTsysSorted * nchanTsys],
399 TAKE_OVER);
[2928]400 for (uInt i = 0 ; i < nrowTsysSorted; i++) {
[2733]401 timeTsysSorted[i] = timeTsys[tsysIdx[i]];
[2720]402 }
[2928]403 interpolatorT_->setX(timeTsysSorted.data(), nrowTsysSorted);
404
405 for (uInt i = 0; i < nrowTsys; ++i) {
406 tsysSorted.row(i) = tsys.row(tsysIdx[i]);
[2960]407 flagtsysSorted.row(i) = flagtsys.row(tsysIdx[i]);
[2928]408 }
[2720]409 }
410
411 Table tab = work_->table();
412 ArrayColumn<Float> spCol(tab, "SPECTRA");
[2960]413 ArrayColumn<uChar> flCol(tab, "FLAGTRA");
[2735]414 ArrayColumn<Float> tsysCol(tab, "TSYS");
[2720]415 ScalarColumn<Double> timeCol(tab, "TIME");
[2960]416 //Vector<Float> on;
[2925]417
418 // Array for scaling factor (aka Tsys)
[2928]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);
[2963]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);
[2925]433
[2720]434 for (uInt i = 0; i < rows.nelements(); i++) {
[2758]435 //os_ << "start i = " << i << " (row = " << rows[i] << ")" << LogIO::POST;
[2720]436 uInt irow = rows[i];
437
438 // target spectral data
[2960]439 Vector<Float> on = spCol(irow);
440 Vector<uChar> flag = flCol(irow);
[2862]441 //os_ << "on=" << on[0] << LogIO::POST;
[2720]442 calibrator_->setSource(on);
443
444 // interpolation
[2733]445 Double t0 = timeCol(irow);
[2963]446 Double *xwork_p = xwork.data();
447 Float *ywork_p = ywork.data();
[2720]448 for (uInt ichan = 0; ichan < nchanSp; ichan++) {
[2960]449 Float *tmpY = &(spoffSorted.data()[ichan * nrowSkySorted]);
[2963]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
[2960]469 flag[ichan] = 1 << 7; // user flag
470 }
[2963]471 //interpolatorS_->setY(tmpY, nrowSkySorted);
[2720]472 iOff[ichan] = interpolatorS_->interpolate(t0);
473 }
[2862]474 //os_ << "iOff=" << iOff[0] << LogIO::POST;
[2720]475 calibrator_->setReference(iOff);
476
477 if (doTsys) {
478 // Tsys correction
[2963]479 // interpolation on time axis
[2928]480 Float *yt = iTsysT.data();
[2963]481 uChar *fwork_p = fwork.data();
[2720]482 for (uInt ichan = 0; ichan < nchanTsys; ichan++) {
[2928]483 Float *tmpY = &(tsysSorted.data()[ichan * nrowTsysSorted]);
[2963]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 }
[2720]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]);
[2963]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);
[2720]522 for (uInt ichan = 0; ichan < nchanSp; ichan++) {
[2733]523 iTsys[ichan] = interpolatorF_->interpolate(fsp[ichan]);
[2720]524 }
525 }
526 }
527 else {
[2759]528 Vector<Float> tsysInRow = tsysCol(irow);
529 if (tsysInRow.nelements() == 1) {
530 iTsys = tsysInRow[0];
531 }
532 else {
[2862]533 for (uInt ichan = 0; ichan < tsysInRow.nelements(); ++ichan)
[2759]534 iTsys[ichan] = tsysInRow[ichan];
535 }
[2720]536 }
[2862]537 //os_ << "iTsys=" << iTsys[0] << LogIO::POST;
[2720]538 calibrator_->setScaler(iTsys);
539
540 // do calibration
541 calibrator_->calibrate();
542
543 // update table
[2862]544 //os_ << "calibrated=" << calibrator_->getCalibrated()[0] << LogIO::POST;
[2720]545 spCol.put(irow, calibrator_->getCalibrated());
[2960]546 flCol.put(irow, flag);
[2742]547 if (filltsys)
548 tsysCol.put(irow, iTsys);
[2720]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;
[2735]570 os_ << "from=" << i->first << ": tolist=" << tolist << LogIO::POST;
[2720]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{
[2756]581 //assert(!work_.null());
582 assert_<AipsError>(!work_.null(),"You have to execute apply method first.");
[2720]583
584 work_->setSelection(sel_);
585 work_->makePersistent(name);
586 work_->unsetSelection();
587}
588
589Vector<Double> STApplyCal::getBaseFrequency(uInt whichrow)
590{
[2756]591 //assert(whichrow <= (uInt)work_->nrow());
592 assert_<AipsError>(whichrow <= (uInt)work_->nrow(),"row index out of range.");
[2720]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
[2727]606void STApplyCal::initInterpolator()
607{
[2735]608 os_.origin(LogOrigin("STApplyCal","initInterpolator",WHERE));
[2727]609 int order = (order_ > 0) ? order_ : 1;
[2735]610 switch (iTime_) {
[2727]611 case STCalEnum::NearestInterpolation:
612 {
613 os_ << "use NearestInterpolator in time axis" << LogIO::POST;
[2733]614 interpolatorS_ = new NearestInterpolator1D<Double, Float>();
615 interpolatorT_ = new NearestInterpolator1D<Double, Float>();
[2727]616 break;
617 }
618 case STCalEnum::LinearInterpolation:
619 {
620 os_ << "use BufferedLinearInterpolator in time axis" << LogIO::POST;
[2733]621 interpolatorS_ = new BufferedLinearInterpolator1D<Double, Float>();
622 interpolatorT_ = new BufferedLinearInterpolator1D<Double, Float>();
[2727]623 break;
624 }
625 case STCalEnum::CubicSplineInterpolation:
626 {
627 os_ << "use CubicSplineInterpolator in time axis" << LogIO::POST;
[2733]628 interpolatorS_ = new CubicSplineInterpolator1D<Double, Float>();
629 interpolatorT_ = new CubicSplineInterpolator1D<Double, Float>();
[2727]630 break;
631 }
632 case STCalEnum::PolynomialInterpolation:
633 {
634 os_ << "use PolynomialInterpolator in time axis" << LogIO::POST;
635 if (order == 0) {
[2733]636 interpolatorS_ = new NearestInterpolator1D<Double, Float>();
637 interpolatorT_ = new NearestInterpolator1D<Double, Float>();
[2727]638 }
639 else {
[2733]640 interpolatorS_ = new PolynomialInterpolator1D<Double, Float>();
641 interpolatorT_ = new PolynomialInterpolator1D<Double, Float>();
[2727]642 interpolatorS_->setOrder(order);
643 interpolatorT_->setOrder(order);
644 }
645 break;
646 }
647 default:
648 {
649 os_ << "use BufferedLinearInterpolator in time axis" << LogIO::POST;
[2733]650 interpolatorS_ = new BufferedLinearInterpolator1D<Double, Float>();
651 interpolatorT_ = new BufferedLinearInterpolator1D<Double, Float>();
[2727]652 break;
653 }
654 }
655
[2735]656 switch (iFreq_) {
[2727]657 case STCalEnum::NearestInterpolation:
658 {
659 os_ << "use NearestInterpolator in frequency axis" << LogIO::POST;
[2733]660 interpolatorF_ = new NearestInterpolator1D<Double, Float>();
[2727]661 break;
662 }
663 case STCalEnum::LinearInterpolation:
664 {
665 os_ << "use BufferedLinearInterpolator in frequency axis" << LogIO::POST;
[2733]666 interpolatorF_ = new BufferedLinearInterpolator1D<Double, Float>();
[2727]667 break;
668 }
669 case STCalEnum::CubicSplineInterpolation:
670 {
671 os_ << "use CubicSplineInterpolator in frequency axis" << LogIO::POST;
[2733]672 interpolatorF_ = new CubicSplineInterpolator1D<Double, Float>();
[2727]673 break;
674 }
675 case STCalEnum::PolynomialInterpolation:
676 {
677 os_ << "use PolynomialInterpolator in frequency axis" << LogIO::POST;
678 if (order == 0) {
[2733]679 interpolatorF_ = new NearestInterpolator1D<Double, Float>();
[2727]680 }
681 else {
[2733]682 interpolatorF_ = new PolynomialInterpolator1D<Double, Float>();
[2727]683 interpolatorF_->setOrder(order);
684 }
685 break;
686 }
687 default:
688 {
689 os_ << "use LinearInterpolator in frequency axis" << LogIO::POST;
[2733]690 interpolatorF_ = new BufferedLinearInterpolator1D<Double, Float>();
[2727]691 break;
692 }
693 }
[2720]694}
[2963]695
[2727]696}
Note: See TracBrowser for help on using the repository browser.