- Timestamp:
- 09/08/11 20:03:01 (13 years ago)
- Location:
- trunk/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/Scantable.cpp
r2286 r2290 996 996 ostringstream oss; 997 997 oss.flags(std::ios_base::left); 998 String tmp; 999 // Project 1000 table_.keywordSet().get("Project", tmp); 1001 oss << setw(15) << "Project:" << tmp << endl; 1002 // Observation date 1003 oss << setw(15) << "Obs Date:" << getTime(-1,true) << endl; 1004 // Observer 1005 oss << setw(15) << "Observer:" 1006 << table_.keywordSet().asString("Observer") << endl; 1007 // Antenna Name 1008 table_.keywordSet().get("AntennaName", tmp); 1009 oss << setw(15) << "Antenna Name:" << tmp << endl; 1010 // Obs type 1011 table_.keywordSet().get("Obstype", tmp); 1012 // Records (nrow) 1013 oss << setw(15) << "Data Records:" << table_.nrow() << " rows" << endl; 1014 oss << setw(15) << "Obs. Type:" << tmp << endl; 1015 // Beams, IFs, Polarizations, and Channels 1016 oss << setw(15) << "Beams:" << setw(4) << nbeam() << endl 1017 << setw(15) << "IFs:" << setw(4) << nif() << endl 1018 << setw(15) << "Polarisations:" << setw(4) << npol() 1019 << "(" << getPolType() << ")" << endl 1020 << setw(15) << "Channels:" << nchan() << endl; 1021 // Flux unit 1022 table_.keywordSet().get("FluxUnit", tmp); 1023 oss << setw(15) << "Flux Unit:" << tmp << endl; 1024 // Abscissa Unit 1025 oss << setw(15) << "Abscissa:" << getAbcissaLabel(0) << endl; 1026 // Selection 1027 oss << selector_.print() << endl; 1028 1029 return String(oss); 1030 } 1031 1032 void Scantable::summary( const std::string& filename ) 1033 { 1034 ostringstream oss; 1035 ofstream ofs; 1036 LogIO ols(LogOrigin("Scantable", "summary", WHERE)); 1037 1038 if (filename != "") 1039 ofs.open( filename.c_str(), ios::out ); 1040 1041 oss << endl; 1042 oss << asap::SEPERATOR << endl; 1043 oss << " Scan Table Summary" << endl; 1044 oss << asap::SEPERATOR << endl; 1045 1046 // Format header info 1047 oss << headerSummary(); 1048 oss << endl; 1049 1050 if (table_.nrow() <= 0){ 1051 oss << asap::SEPERATOR << endl; 1052 oss << "The MAIN table is empty: there are no data!!!" << endl; 1053 oss << asap::SEPERATOR << endl; 1054 1055 ols << String(oss) << LogIO::POST; 1056 if (ofs) { 1057 ofs << String(oss) << flush; 1058 ofs.close(); 1059 } 1060 return; 1061 } 1062 1063 1064 1065 // main table 1066 String dirtype = "Position (" 1067 + getDirectionRefString() 1068 + ")"; 1069 oss.flags(std::ios_base::left); 1070 oss << setw(5) << "Scan" 1071 << setw(15) << "Source" 1072 << setw(35) << "Time range" 1073 << setw(2) << "" << setw(7) << "Int[s]" 1074 << setw(7) << "Record" 1075 << setw(8) << "SrcType" 1076 << setw(8) << "FreqIDs" 1077 << setw(7) << "MolIDs" << endl; 1078 oss << setw(7)<< "" << setw(6) << "Beam" 1079 << setw(23) << dirtype << endl; 1080 1081 oss << asap::SEPERATOR << endl; 1082 1083 // Flush summary and clear up the string 1084 ols << String(oss) << LogIO::POST; 1085 if (ofs) ofs << String(oss) << flush; 1086 oss.str(""); 1087 oss.clear(); 1088 1089 1090 // Get Freq_ID map 1091 ROScalarColumn<uInt> ftabIds(frequencies().table(), "ID"); 1092 Int nfid = ftabIds.nrow(); 1093 if (nfid <= 0){ 1094 oss << "FREQUENCIES subtable is empty: there are no data!!!" << endl; 1095 oss << asap::SEPERATOR << endl; 1096 1097 ols << String(oss) << LogIO::POST; 1098 if (ofs) { 1099 ofs << String(oss) << flush; 1100 ofs.close(); 1101 } 1102 return; 1103 } 1104 // Storages of overall IFNO, POLNO, and nchan per FREQ_ID 1105 // the orders are identical to ID in FREQ subtable 1106 Block< Vector<uInt> > ifNos(nfid), polNos(nfid); 1107 Vector<Int> fIdchans(nfid,-1); 1108 map<uInt, Int> fidMap; // (FREQ_ID, row # in FREQ subtable) pair 1109 for (Int i=0; i < nfid; i++){ 1110 // fidMap[freqId] returns row number in FREQ subtable 1111 fidMap.insert(pair<uInt, Int>(ftabIds(i),i)); 1112 ifNos[i] = Vector<uInt>(); 1113 polNos[i] = Vector<uInt>(); 1114 } 1115 1116 TableIterator iter(table_, "SCANNO"); 1117 1118 // Vars for keeping track of time, freqids, molIds in a SCANNO 1119 Vector<uInt> freqids; 1120 Vector<uInt> molids; 1121 Vector<uInt> beamids(1,0); 1122 Vector<MDirection> beamDirs; 1123 Vector<Int> stypeids(1,0); 1124 Vector<String> stypestrs; 1125 Int nfreq(1); 1126 Int nmol(1); 1127 uInt nbeam(1); 1128 uInt nstype(1); 1129 1130 Double btime(0.0), etime(0.0); 1131 Double meanIntTim(0.0); 1132 1133 uInt currFreqId(0), ftabRow(0); 1134 Int iflen(0), pollen(0); 1135 1136 while (!iter.pastEnd()) { 1137 Table subt = iter.table(); 1138 uInt snrow = subt.nrow(); 1139 ROTableRow row(subt); 1140 const TableRecord& rec = row.get(0); 1141 1142 // relevant columns 1143 ROScalarColumn<Double> mjdCol(subt,"TIME"); 1144 ROScalarColumn<Double> intervalCol(subt,"INTERVAL"); 1145 MDirection::ROScalarColumn dirCol(subt,"DIRECTION"); 1146 1147 ScalarColumn<uInt> freqIdCol(subt,"FREQ_ID"); 1148 ScalarColumn<uInt> molIdCol(subt,"MOLECULE_ID"); 1149 ROScalarColumn<uInt> beamCol(subt,"BEAMNO"); 1150 ROScalarColumn<Int> stypeCol(subt,"SRCTYPE"); 1151 1152 ROScalarColumn<uInt> ifNoCol(subt,"IFNO"); 1153 ROScalarColumn<uInt> polNoCol(subt,"POLNO"); 1154 1155 1156 // Times 1157 meanIntTim = sum(intervalCol.getColumn()) / (double) snrow; 1158 minMax(btime, etime, mjdCol.getColumn()); 1159 etime += meanIntTim/C::day; 1160 1161 // MOLECULE_ID and FREQ_ID 1162 molids = getNumbers(molIdCol); 1163 molids.shape(nmol); 1164 1165 freqids = getNumbers(freqIdCol); 1166 freqids.shape(nfreq); 1167 1168 // Add first beamid, and srcNames 1169 beamids.resize(1,False); 1170 beamDirs.resize(1,False); 1171 beamids(0)=beamCol(0); 1172 beamDirs(0)=dirCol(0); 1173 nbeam = 1; 1174 1175 stypeids.resize(1,False); 1176 stypeids(0)=stypeCol(0); 1177 nstype = 1; 1178 1179 // Global listings of nchan/IFNO/POLNO per FREQ_ID 1180 currFreqId=freqIdCol(0); 1181 ftabRow = fidMap[currFreqId]; 1182 // Assumes an identical number of channels per FREQ_ID 1183 if (fIdchans(ftabRow) < 0 ) { 1184 RORecordFieldPtr< Array<Float> > spec(rec, "SPECTRA"); 1185 fIdchans(ftabRow)=(*spec).shape()(0); 1186 } 1187 // Should keep ifNos and polNos form the previous SCANNO 1188 if ( !anyEQ(ifNos[ftabRow],ifNoCol(0)) ) { 1189 ifNos[ftabRow].shape(iflen); 1190 iflen++; 1191 ifNos[ftabRow].resize(iflen,True); 1192 ifNos[ftabRow](iflen-1) = ifNoCol(0); 1193 } 1194 if ( !anyEQ(polNos[ftabRow],polNoCol(0)) ) { 1195 polNos[ftabRow].shape(pollen); 1196 pollen++; 1197 polNos[ftabRow].resize(pollen,True); 1198 polNos[ftabRow](pollen-1) = polNoCol(0); 1199 } 1200 1201 for (uInt i=1; i < snrow; i++){ 1202 // Need to list BEAMNO and DIRECTION in the same order 1203 if ( !anyEQ(beamids,beamCol(i)) ) { 1204 nbeam++; 1205 beamids.resize(nbeam,True); 1206 beamids(nbeam-1)=beamCol(i); 1207 beamDirs.resize(nbeam,True); 1208 beamDirs(nbeam-1)=dirCol(i); 1209 } 1210 1211 // SRCTYPE is Int (getNumber takes only uInt) 1212 if ( !anyEQ(stypeids,stypeCol(i)) ) { 1213 nstype++; 1214 stypeids.resize(nstype,True); 1215 stypeids(nstype-1)=stypeCol(i); 1216 } 1217 1218 // Global listings of nchan/IFNO/POLNO per FREQ_ID 1219 currFreqId=freqIdCol(i); 1220 ftabRow = fidMap[currFreqId]; 1221 if (fIdchans(ftabRow) < 0 ) { 1222 const TableRecord& rec = row.get(i); 1223 RORecordFieldPtr< Array<Float> > spec(rec, "SPECTRA"); 1224 fIdchans(ftabRow) = (*spec).shape()(0); 1225 } 1226 if ( !anyEQ(ifNos[ftabRow],ifNoCol(i)) ) { 1227 ifNos[ftabRow].shape(iflen); 1228 iflen++; 1229 ifNos[ftabRow].resize(iflen,True); 1230 ifNos[ftabRow](iflen-1) = ifNoCol(i); 1231 } 1232 if ( !anyEQ(polNos[ftabRow],polNoCol(i)) ) { 1233 polNos[ftabRow].shape(pollen); 1234 pollen++; 1235 polNos[ftabRow].resize(pollen,True); 1236 polNos[ftabRow](pollen-1) = polNoCol(i); 1237 } 1238 } // end of row iteration 1239 1240 stypestrs.resize(nstype,False); 1241 for (uInt j=0; j < nstype; j++) 1242 stypestrs(j) = SrcType::getName(stypeids(j)); 1243 1244 // Format Scan summary 1245 oss << setw(4) << std::right << rec.asuInt("SCANNO") 1246 << std::left << setw(1) << "" 1247 << setw(15) << rec.asString("SRCNAME") 1248 << setw(21) << MVTime(btime).string(MVTime::YMD,7) 1249 << setw(3) << " - " << MVTime(etime).string(MVTime::TIME,7) 1250 << setw(3) << "" << setw(6) << meanIntTim << setw(1) << "" 1251 << std::right << setw(5) << snrow << setw(2) << "" 1252 << std::left << stypestrs << setw(1) << "" 1253 << freqids << setw(1) << "" 1254 << molids << endl; 1255 // Format Beam summary 1256 for (uInt j=0; j < nbeam; j++) { 1257 oss << setw(7) << "" << setw(6) << beamids(j) << setw(1) << "" 1258 << formatDirection(beamDirs(j)) << endl; 1259 } 1260 // Flush summary every scan and clear up the string 1261 ols << String(oss) << LogIO::POST; 1262 if (ofs) ofs << String(oss) << flush; 1263 oss.str(""); 1264 oss.clear(); 1265 1266 ++iter; 1267 } // end of scan iteration 1268 oss << asap::SEPERATOR << endl; 1269 1270 // List FRECUENCIES Table (using STFrequencies.print may be slow) 1271 oss << "FREQUENCIES: " << nfreq << endl; 1272 oss << std::right << setw(5) << "ID" << setw(2) << "" 1273 << std::left << setw(5) << "IFNO" << setw(2) << "" 1274 << setw(8) << "Frame" 1275 << setw(16) << "RefVal" 1276 << setw(7) << "RefPix" 1277 << setw(15) << "Increment" 1278 << setw(9) << "Channels" 1279 << setw(6) << "POLNOs" << endl; 1280 Int tmplen; 1281 for (Int i=0; i < nfid; i++){ 1282 // List row=i of FREQUENCIES subtable 1283 ifNos[i].shape(tmplen); 1284 if (tmplen == 1) { 1285 oss << std::right << setw(5) << ftabIds(i) << setw(2) << "" 1286 << setw(3) << ifNos[i](0) << setw(1) << "" 1287 << std::left << setw(46) << frequencies().print(ftabIds(i)) 1288 << setw(2) << "" 1289 << std::right << setw(8) << fIdchans[i] << setw(2) << "" 1290 << std::left << polNos[i] << endl; 1291 } else if (tmplen > 0 ) { 1292 // You shouldn't come here 1293 oss << std::left 1294 << "Multiple IFNOs in FREQ_ID = " << ftabIds(i) 1295 << " !!!" << endl; 1296 } 1297 } 1298 oss << asap::SEPERATOR << endl; 1299 1300 // List MOLECULES Table (currently lists all rows) 1301 oss << "MOLECULES: " << endl; 1302 if (molecules().nrow() <= 0) { 1303 oss << " MOLECULES subtable is empty: there are no data" << endl; 1304 } else { 1305 ROTableRow row(molecules().table()); 1306 oss << std::right << setw(5) << "ID" 1307 << std::left << setw(3) << "" 1308 << setw(18) << "RestFreq" 1309 << setw(15) << "Name" << endl; 1310 for (Int i=0; i < molecules().nrow(); i++){ 1311 const TableRecord& rec=row.get(i); 1312 oss << std::right << setw(5) << rec.asuInt("ID") 1313 << std::left << setw(3) << "" 1314 << rec.asArrayDouble("RESTFREQUENCY") << setw(1) << "" 1315 << rec.asArrayString("NAME") << endl; 1316 } 1317 } 1318 oss << asap::SEPERATOR << endl; 1319 ols << String(oss) << LogIO::POST; 1320 if (ofs) { 1321 ofs << String(oss) << flush; 1322 ofs.close(); 1323 } 1324 // return String(oss); 1325 } 1326 1327 1328 std::string Scantable::oldheaderSummary() 1329 { 1330 // Format header info 1331 // STHeader sdh; 1332 // sdh = getHeader(); 1333 // sdh.print(); 1334 ostringstream oss; 1335 oss.flags(std::ios_base::left); 998 1336 oss << setw(15) << "Beams:" << setw(4) << nbeam() << endl 999 1337 << setw(15) << "IFs:" << setw(4) << nif() << endl … … 1013 1351 table_.keywordSet().get("FluxUnit", tmp); 1014 1352 oss << setw(15) << "Flux Unit:" << tmp << endl; 1015 //Vector<Double> vec(moleculeTable_.getRestFrequencies());1016 1353 int nid = moleculeTable_.nrow(); 1017 1354 Bool firstline = True; … … 1041 1378 1042 1379 //std::string Scantable::summary( const std::string& filename ) 1043 void Scantable:: summary( const std::string& filename )1380 void Scantable::oldsummary( const std::string& filename ) 1044 1381 { 1045 1382 ostringstream oss; … … 1056 1393 1057 1394 // Format header info 1058 oss << headerSummary();1395 oss << oldheaderSummary(); 1059 1396 oss << endl; 1060 1397 … … 1081 1418 oss.clear(); 1082 1419 1083 // TableIterator iter(table_, "SCANNO");1084 // while (!iter.pastEnd()) {1085 // Table subt = iter.table();1086 // ROTableRow row(subt);1087 // MEpoch::ROScalarColumn timeCol(subt,"TIME");1088 // const TableRecord& rec = row.get(0);1089 // oss << setw(4) << std::right << rec.asuInt("SCANNO")1090 // << std::left << setw(1) << ""1091 // << setw(15) << rec.asString("SRCNAME")1092 // << setw(10) << formatTime(timeCol(0), false);1093 // // count the cycles in the scan1094 // TableIterator cyciter(subt, "CYCLENO");1095 // int nint = 0;1096 // while (!cyciter.pastEnd()) {1097 // ++nint;1098 // ++cyciter;1099 // }1100 // oss << setw(3) << std::right << nint << setw(3) << " x " << std::left1101 // << setw(11) << formatSec(rec.asFloat("INTERVAL")) << setw(1) << ""1102 // << setw(15) << SrcType::getName(rec.asInt("SRCTYPE")) << endl;1103 1104 // TableIterator biter(subt, "BEAMNO");1105 // while (!biter.pastEnd()) {1106 // Table bsubt = biter.table();1107 // ROTableRow brow(bsubt);1108 // const TableRecord& brec = brow.get(0);1109 // uInt row0 = bsubt.rowNumbers(table_)[0];1110 // oss << setw(5) << "" << setw(4) << std::right << brec.asuInt("BEAMNO")<< std::left;1111 // oss << setw(4) << "" << formatDirection(getDirection(row0)) << endl;1112 // TableIterator iiter(bsubt, "IFNO");1113 // while (!iiter.pastEnd()) {1114 // Table isubt = iiter.table();1115 // ROTableRow irow(isubt);1116 // const TableRecord& irec = irow.get(0);1117 // oss << setw(9) << "";1118 // oss << setw(3) << std::right << irec.asuInt("IFNO") << std::left1119 // << setw(1) << "" << frequencies().print(irec.asuInt("FREQ_ID"))1120 // << setw(3) << "" << nchan(irec.asuInt("IFNO"))1121 // << endl;1122 1123 // ++iiter;1124 // }1125 // ++biter;1126 // }1127 // ++iter;1128 // }1129 1420 TableIterator iter(table_, "SCANNO"); 1130 1421 while (!iter.pastEnd()) { … … 1182 1473 ols << String(oss) << LogIO::POST; 1183 1474 if (ofs) { 1184 //ofs << String(oss) << flush;1475 ofs << String(oss) << flush; 1185 1476 ofs.close(); 1186 1477 } -
trunk/src/Scantable.h
r2286 r2290 375 375 376 376 std::string headerSummary(); 377 void summary(const std::string& filename=""); 378 std::string oldheaderSummary(); 377 379 // std::string summary(); 378 void summary(const std::string& filename=""); 380 void oldsummary(const std::string& filename=""); 381 379 382 //std::string getTime(int whichrow=-1, bool showdate=true) const; 380 383 std::string getTime(int whichrow=-1, bool showdate=true, casa::uInt prec=0) const; -
trunk/src/ScantableWrapper.h
r2286 r2290 221 221 // } 222 222 void summary(const std::string& filename="") { 223 return table_->summary(filename); 223 //std::string summary(const std::string& filename="") const { 224 table_->summary(filename); 224 225 } 225 226
Note:
See TracChangeset
for help on using the changeset viewer.