Changeset 2703 for trunk/src/STCalTsys.cpp
- Timestamp:
- 12/19/12 19:19:53 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/STCalTsys.cpp
r2696 r2703 5 5 // 6 6 // 7 // Author: Takeshi Nakazato 7 // Author: Takeshi Nakazato <takeshi.nakazato@nao.ac.jp> (C) 2012 8 8 // 9 9 // Copyright: See COPYING file that comes with this distribution 10 10 // 11 11 // 12 #include <casa/Exceptions/Error.h>13 #include <tables/Tables/TableDesc.h>14 #include <tables/Tables/SetupNewTab.h>15 #include <tables/Tables/ArrColDesc.h>16 #include <tables/Tables/ScaColDesc.h>17 #include <tables/Tables/TableRecord.h>18 #include <measures/TableMeasures/TableMeasDesc.h>19 #include <measures/TableMeasures/TableMeasRefDesc.h>20 #include <measures/TableMeasures/TableMeasValueDesc.h>21 12 22 #include "Scantable.h" 13 #include <vector> 14 #include "STSelector.h" 23 15 #include "STCalTsys.h" 16 #include "RowAccumulator.h" 17 #include "STIdxIter.h" 18 #include "STDefs.h" 19 #include <atnf/PKSIO/SrcType.h> 24 20 21 #include <casa/Arrays/ArrayMath.h> 25 22 23 using namespace std; 26 24 using namespace casa; 27 25 28 26 namespace asap { 29 30 const String STCalTsys::name_ = "APPLY_TSYS"; 31 32 STCalTsys::STCalTsys(const Scantable& parent) 33 : STApplyTable(parent, name_) 27 STCalTsys::STCalTsys(CountedPtr<Scantable> &s, vector<int> &iflist) 28 : STCalibration(s), 29 iflist_(iflist) 34 30 { 35 setup();31 applytable_ = new STCalTsysTable(*s); 36 32 } 37 33 38 STCalTsys::~STCalTsys()34 void STCalTsys::calibrate() 39 35 { 36 STSelector selOrg = scantable_->getSelection(); 37 STSelector sel; 38 sel.setIFs(iflist_); 39 scantable_->setSelection(sel); 40 41 fillCalTable(); 42 43 scantable_->setSelection(selOrg); 40 44 } 41 45 42 void STCalTsys:: setup()46 void STCalTsys::fillCalTable() 43 47 { 44 table_.addColumn(ArrayColumnDesc<Float>("TSYS")); 45 table_.addColumn(ScalarColumnDesc<Float>("ELEVATION")); 48 RowAccumulator acc(W_TINT); 49 50 vector<string> cols(3); 51 cols[0] = "IFNO"; 52 cols[1] = "POLNO"; 53 cols[2] = "BEAMNO"; 54 STIdxIterAcc iter(scantable_, cols); 46 55 47 table_.rwKeywordSet().define("ApplyType", "TSYS"); 56 ROScalarColumn<Double> *tcol = new ROScalarColumn<Double>(scantable_->table(), "TIME"); 57 Vector<Double> timeSec = tcol->getColumn() * 86400.0; 58 tcol->attach(scantable_->table(), "INTERVAL"); 59 Vector<Double> intervalSec = tcol->getColumn(); 60 delete tcol; 61 ROScalarColumn<Float> *ecol = new ROScalarColumn<Float>(scantable_->table(), "ELEVATION"); 62 Vector<Float> elevation = ecol->getColumn(); 63 delete ecol; 48 64 49 attachOptionalColumns(); 65 ROArrayColumn<Float> specCol(scantable_->table(), "TSYS"); 66 ROArrayColumn<uChar> flagCol(scantable_->table(), "FLAGTRA"); 67 68 // dummy Tsys: the following process doesn't need Tsys but RowAccumulator 69 // requires to set it with spectral data 70 Vector<Float> tsys(1, 1.0); 71 72 Double timeCen = 0.0; 73 Float elCen = 0.0; 74 uInt count = 0; 75 76 while(!iter.pastEnd()) { 77 Vector<uInt> rows = iter.getRows(SHARE); 78 Vector<uInt> current = iter.current(); 79 uInt len = rows.nelements(); 80 if (len == 0) { 81 iter.next(); 82 continue; 83 } 84 85 uInt nchan = scantable_->nchan(scantable_->getIF(rows[0])); 86 Vector<uChar> flag(nchan); 87 Vector<Bool> bflag(nchan); 88 Vector<Float> spec(nchan); 89 90 Vector<Double> timeSep(len); 91 for (uInt i = 0; i < len-1; i++) { 92 timeSep[i] = timeSec[rows[i+1]] - timeSec[rows[i]] ; 93 } 94 Double tMedian = median(timeSep(IPosition(1,0), IPosition(1,len-2))); 95 timeSep[len-1] = tMedian * 10000.0 ; // any large value 96 97 uInt irow ; 98 uInt jrow ; 99 for (uInt i = 0; i < len; i++) { 100 irow = rows[i]; 101 jrow = (i < len-1) ? rows[i+1] : rows[i]; 102 // accumulate data 103 flagCol.get(irow, flag); 104 convertArray(bflag, flag); 105 specCol.get(irow, spec); 106 if ( !allEQ(bflag,True) ) 107 acc.add( spec, !bflag, tsys, intervalSec[irow], timeSec[irow] ) ; 108 timeCen += timeSec[irow]; 109 elCen += elevation[irow]; 110 count++; 111 112 // check time gap 113 double gap = 2.0 * timeSep[i] / (intervalSec[jrow] + intervalSec[irow]); 114 if ( gap > 5.0 ) { 115 if ( acc.state() ) { 116 acc.replaceNaN() ; 117 // const Vector<Bool> &msk = acc.getMask(); 118 // convertArray(flag, !msk); 119 // for (uInt k = 0; k < nchan; ++k) { 120 // uChar userFlag = 1 << 7; 121 // if (msk[k]==True) userFlag = 0 << 7; 122 // flag(k) = userFlag; 123 // } 124 timeCen /= (Double)count * 86400.0; // sec->day 125 elCen /= (Float)count; 126 STCalTsysTable *p = dynamic_cast<STCalTsysTable *>(&(*applytable_)); 127 p->appenddata(0, 0, current[2], current[0], current[1], 128 timeCen, elCen, acc.getSpectrum()); 129 } 130 acc.reset() ; 131 timeCen = 0.0; 132 elCen = 0.0; 133 count = 0; 134 } 135 } 136 137 iter.next() ; 138 } 50 139 } 51 140 52 void STCalTsys::attachOptionalColumns()53 {54 tsysCol_.attach(table_, "TSYS");55 elCol_.attach(table_,"ELEVATION");56 57 141 } 58 59 void STCalTsys::setdata(uInt irow, uInt scanno, uInt cycleno,60 uInt beamno, uInt ifno, uInt polno,61 Double time, Float elevation, Vector<Float> tsys)62 {63 if (irow >= (uInt)nrow()) {64 throw AipsError("row index out of range");65 }66 67 if (!sel_.empty()) {68 os_.origin(LogOrigin("STCalTsys","setdata",WHERE));69 os_ << LogIO::WARN << "Data selection is effective. Specified row index may be wrong." << LogIO::POST;70 }71 72 setbasedata(irow, scanno, cycleno, beamno, ifno, polno, time);73 elCol_.put(irow, elevation);74 tsysCol_.put(irow, tsys);75 }76 77 void STCalTsys::appenddata(uInt scanno, uInt cycleno,78 uInt beamno, uInt ifno, uInt polno,79 Double time, Float elevation, Vector<Float> tsys)80 {81 uInt irow = nrow();82 table_.addRow(1, True);83 setdata(irow, scanno, cycleno, beamno, ifno, polno, time, elevation, tsys);84 }85 }
Note: See TracChangeset
for help on using the changeset viewer.