Line data Source code
1 : //# CTSummary.cc: Helper class for listing a NewCalTable
2 : //# Copyright (C) 2017
3 : //# Associated Universities, Inc. Washington DC, USA.
4 : //#
5 : //# This library is free software; you can redistribute it and/or modify it
6 : //# under the terms of the GNU Library General Public License as published by
7 : //# the Free Software Foundation; either version 2 of the License, or (at your
8 : //# option) any later version.
9 : //#
10 : //# This library is distributed in the hope that it will be useful, but WITHOUT
11 : //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 : //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13 : //# License for more details.
14 : //#
15 : //# You should have received a copy of the GNU Library General Public License
16 : //# along with this library; if not, write to the Free Software Foundation,
17 : //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
18 : //#
19 : //# Correspondence concerning AIPS++ should be addressed as follows:
20 : //# Internet email: aips2-request@nrao.edu.
21 : //# Postal address: AIPS++ Project Office
22 : //# National Radio Astronomy Observatory
23 : //# 520 Edgemont Road
24 : //# Charlottesville, VA 22903-2475 USA
25 : //#
26 : //#
27 :
28 : #include <synthesis/CalTables/CTSummary.h>
29 : #include <synthesis/CalTables/NewCalTable.h>
30 : #include <synthesis/CalTables/CTMainColumns.h>
31 : #include <synthesis/CalTables/CTColumns.h>
32 : #include <synthesis/CalTables/CTIter.h>
33 :
34 : #include <casacore/casa/Quanta/QVector.h>
35 : #include <casacore/measures/Measures/MeasTable.h>
36 : #include <casacore/casa/iomanip.h>
37 : #include <casacore/casa/iostream.h>
38 :
39 : using namespace casacore;
40 : namespace casa { //# NAMESPACE CASA - BEGIN
41 :
42 : //
43 : // Constructor assigns pointer. If NCT goes out of scope you
44 : // will get rubbish. Also sets string to separate subtable output.
45 : //
46 0 : CTSummary::CTSummary (const NewCalTable& nct)
47 : : pNCT(&nct),
48 : dashlin1(replicate("-",80)),
49 0 : dashlin2(replicate("=",80))
50 0 : {}
51 :
52 0 : CTSummary::CTSummary (const NewCalTable* nct)
53 : : pNCT(nct),
54 : dashlin1(replicate("-",80)),
55 0 : dashlin2(replicate("=",80))
56 0 : {}
57 :
58 0 : CTSummary::~CTSummary ()
59 0 : { }
60 :
61 :
62 : //
63 : // Retrieve number of rows
64 : //
65 0 : Int CTSummary::nrow () const
66 : {
67 0 : return pNCT->nrow();
68 : }
69 :
70 :
71 : //
72 : // Get ms name
73 : //
74 0 : String CTSummary::name () const
75 : {
76 0 : return pNCT->tableName();
77 : }
78 :
79 :
80 : //
81 : // Reassign pointer.
82 : //
83 0 : Bool CTSummary::setNCT (const NewCalTable& nct)
84 : {
85 : const NewCalTable* pTemp;
86 0 : pTemp = &nct;
87 0 : if (pTemp == 0) {
88 0 : return False;
89 : } else {
90 0 : pNCT = pTemp;
91 0 : return True;
92 : }
93 : }
94 :
95 :
96 : //
97 : // List information about a ct to the logger
98 : //
99 0 : void CTSummary::list (LogIO& os, Bool verbose) const
100 : {
101 : // List a title for the Summary
102 0 : listTitle (os);
103 : // List the main table and subtables in a useful order and format
104 0 : listWhere(os, verbose);
105 0 : os << dashlin1 << endl;
106 0 : listWhat(os, verbose);
107 0 : os << dashlin1 << endl;
108 0 : listHow(os, verbose);
109 0 : os << dashlin1 << endl;
110 : // Post it
111 0 : os.post();
112 0 : }
113 :
114 : //
115 : // List a title for the Summary
116 : //
117 0 : void CTSummary::listTitle (LogIO& os) const
118 : {
119 0 : os << LogIO::NORMAL;
120 : // Type of cal table
121 0 : casacore::String type("unknown");
122 0 : os << dashlin2 << endl << "Cal Table Name: " << this->name();
123 0 : if (pNCT->keywordSet().isDefined("VisCal")) {
124 0 : type = pNCT->keywordSet().asString("VisCal");
125 : // List the CT name and type as the title of the Summary
126 0 : os << " Cal Type: " << type;
127 : }
128 0 : os << endl << dashlin2 << endl;
129 0 : }
130 :
131 :
132 : //
133 : // Convenient table groupings
134 : //
135 0 : void CTSummary::listWhere (LogIO& os, Bool verbose) const
136 : {
137 0 : listObservation (os,verbose);
138 0 : }
139 :
140 0 : void CTSummary::listWhat (LogIO& os, Bool verbose) const
141 : {
142 0 : listMain(os, verbose);
143 0 : os << dashlin1 << endl;
144 0 : listField(os, verbose);
145 0 : }
146 :
147 0 : void CTSummary::listHow (LogIO& os, Bool verbose) const
148 : {
149 0 : listSpectralWindow(os, verbose);
150 0 : os << dashlin1 << endl;
151 0 : listAntenna(os, verbose);
152 0 : }
153 :
154 : //
155 : // SUBTABLES
156 : //
157 0 : void CTSummary::listMain (LogIO& os, Bool verbose) const
158 : {
159 0 : if (nrow()<=0) {
160 0 : os << "The MAIN table is empty: there are no data!!!" << endl << LogIO::POST;
161 0 : return;
162 : }
163 : // to get columns from main and subtables
164 0 : ROCTMainColumns ctmain(*pNCT);
165 0 : ROCTColumns ctsub(*pNCT);
166 :
167 : // Time:
168 0 : casacore::Vector<casacore::Double> times = ctmain.time().getColumn();
169 0 : casacore::Double startTime = times(0);
170 0 : casacore::Double stopTime = times(times.size()-1);
171 0 : casacore::Double exposTime = stopTime - startTime;
172 0 : MVTime startMVT(startTime/86400.0), stopMVT(stopTime/86400.0);
173 0 : casacore::String timeref = ctmain.time().keywordSet().subRecord("MEASINFO").asString("Ref");
174 : // Output info
175 : os << " Data records: " << nrow() << " Total elapsed time = "
176 : << exposTime << " seconds" << endl
177 : << " Observed from "
178 0 : << MVTime(startTime/C::day).string(MVTime::DMY,7) //startMVT.string()
179 : << " to "
180 0 : << MVTime(stopTime/C::day).string(MVTime::DMY,7) // stopMVT.string()
181 : << " (" << timeref << ")"
182 0 : << endl << endl;
183 0 : os << LogIO::POST;
184 :
185 0 : if (verbose) {
186 : // Field names:
187 0 : casacore::Vector<casacore::String> fieldnames = ctsub.field().name().getColumn();
188 : // Spw Ids
189 0 : casacore::Vector<casacore::Int> specwindids(ctmain.spwId().getColumn());
190 :
191 : // Field widths for printing:
192 0 : casacore::Int width_lead(2),
193 0 : width_scan(4),
194 0 : width_btime(22),
195 0 : width_etime(10),
196 0 : width_fieldId(5),
197 0 : width_fieldname(20),
198 0 : width_nrow(10);
199 :
200 : // Set up iteration over OBSID
201 0 : casacore::Block<casacore::String> icols(3);
202 0 : icols[0] = "OBSERVATION_ID";
203 0 : icols[1] = "SCAN_NUMBER";
204 0 : icols[2] = "FIELD_ID";
205 0 : ROCTIter* iter = new ROCTIter(*pNCT, icols);
206 0 : iter->reset();
207 0 : casacore::Int obsid(-2); // print obsid when changes
208 0 : casacore::Double lastday(0.0); // print date when changes
209 0 : while (!iter->pastEnd()) {
210 0 : casacore::Int thisobs = iter->thisObs();
211 0 : if (thisobs != obsid) {
212 0 : obsid = thisobs;
213 0 : lastday = 0.0; // force printing date
214 0 : os << endl << " ObservationID = " << thisobs << endl;
215 0 : os << LogIO::POST;
216 : // print header for output columns
217 0 : casacore::String datetime = " Date Timerange ( ";
218 : // variable-len timeref string
219 0 : datetime.replace(25,timeref.length(),timeref);
220 0 : datetime.replace(25+timeref.length(),1,")");
221 0 : os << datetime;
222 0 : os << "Scan FldId FieldName nRows ";
223 0 : os << "SpwIds Avg Intervals" << endl;
224 0 : os << LogIO::POST;
225 : }
226 0 : os.output().precision(3);
227 : // get values for this iteration
228 0 : casacore::Vector<casacore::Double> times = iter->time();
229 0 : casacore::Double btime = times(0);
230 0 : casacore::Double etime = times(times.size()-1);
231 0 : casacore::Double day = floor(MVTime(btime/C::day).day());
232 0 : casacore::Int scan = iter->thisScan();
233 0 : casacore::Int fieldid = iter->thisField();
234 0 : casacore::String fieldname;
235 0 : if (fieldid >= 0)
236 0 : fieldname = fieldnames(fieldid);
237 0 : casacore::Int nrow = iter->nrow();
238 0 : std::vector<casacore::Int> spws = iter->spw().tovector();
239 0 : std::set<casacore::Int> spwset = std::set<casacore::Int>(spws.begin(), spws.end());
240 0 : std::vector<casacore::Double> intervals = iter->interval().tovector();
241 0 : std::set<casacore::Double> intervalset = std::set<casacore::Double>(intervals.begin(), intervals.end());
242 : // print line
243 0 : os.output().setf(ios::right, ios::adjustfield);
244 0 : os.output().width(width_lead); os << " ";
245 : // Timerange beginning time
246 0 : os.output().width(width_btime);
247 0 : if (day!=lastday) { // print date
248 0 : os << MVTime(btime/C::day).string(MVTime::DMY,7);
249 : } else { // omit date
250 0 : os << MVTime(btime/C::day).string(MVTime::TIME,7);
251 : }
252 0 : os.output().width(3); os << " - ";
253 : // Timerange end time
254 0 : os.output().width(width_etime);
255 0 : os << MVTime(etime/C::day).string(MVTime::TIME,7);
256 : // Scan
257 0 : os.output().width(width_lead); os << " ";
258 0 : os.output().setf(ios::right, ios::adjustfield);
259 0 : os.output().width(width_scan);
260 0 : os << scan;
261 : // FldId
262 0 : os.output().width(width_lead); os << " ";
263 0 : os.output().setf(ios::right, ios::adjustfield);
264 0 : os.output().width(width_fieldId);
265 0 : os << fieldid << " ";
266 : // FieldName
267 0 : os.output().setf(ios::left, ios::adjustfield);
268 0 : if (fieldname.length()>20)
269 0 : fieldname.replace(19,1,'*');
270 0 : os.output().width(width_fieldname);
271 0 : os << fieldname.at(0,20);
272 : // nRows
273 0 : os.output().width(width_nrow);
274 0 : os.output().setf(ios::left, ios::adjustfield);
275 0 : os << nrow;
276 : // SpwIds
277 0 : os.output().width(width_lead); os << " ";
278 0 : os << spwset; // set includes "[ ]"
279 : // Avg Intervals
280 0 : os.output().width(width_lead); os << " ";
281 0 : os << intervalset;
282 0 : os << endl;
283 0 : os << LogIO::POST;
284 :
285 : // next lastday is this day
286 0 : lastday = day;
287 0 : iter->next();
288 : } // while
289 0 : os << "(nRows = Total number of rows per scan) " << endl;
290 0 : os << LogIO::POST;
291 : }
292 0 : clearFormatFlags(os);
293 : }
294 :
295 0 : void CTSummary::listAntenna (LogIO& os, Bool verbose) const
296 : {
297 : // Is antenna table present?
298 0 : ROCTColumns ctc(*pNCT);
299 0 : const ROCTAntennaColumns& ctAC(ctc.antenna());
300 0 : if (ctAC.nrow()<=0) {
301 0 : os << "The ANTENNA table is empty" << endl;
302 : } else {
303 : // Determine antennas present in the main table
304 0 : ROCTMainColumns ctmain(*pNCT);
305 0 : std::vector<casacore::Int> ant1col = ctmain.antenna1().getColumn().tovector();
306 0 : std::set<casacore::Int> antIds = std::set<casacore::Int>(ant1col.begin(), ant1col.end());
307 0 : std::vector<casacore::Int> ant2col = ctmain.antenna2().getColumn().tovector();
308 0 : std::set<casacore::Int> ant2ids = std::set<casacore::Int>(ant2col.begin(), ant2col.end());
309 0 : for (std::set<Int>::const_iterator iter=ant2ids.begin(); iter!= ant2ids.end(); ++iter) {
310 0 : antIds.insert(*iter);
311 : }
312 0 : antIds.erase(-1); // remove invalid antenna id
313 0 : uInt nAnt = antIds.size();
314 0 : casacore::Vector<casacore::String> names = ctAC.name().getColumn();
315 0 : casacore::Vector<casacore::String> stations = ctAC.station().getColumn();
316 0 : if (verbose) {
317 : // Detailed antenna list
318 0 : casacore::String indent(" ");
319 0 : casacore::uInt indwidth(5),
320 0 : namewidth(6),
321 0 : statwidth(10),
322 0 : diamwidth(5),
323 0 : latwidth(13),
324 0 : longwidth(14),
325 0 : offsetwidth(14),
326 0 : positionwidth(17);
327 0 : casacore::Int diamprec(1);
328 :
329 : // Position and diameter values for each antenna
330 0 : casacore::ROScalarMeasColumn<casacore::MPosition> antPos = ctAC.positionMeas();
331 0 : Bool posIsITRF = (antPos(0).getRef().getType() == MPosition::ITRF);
332 0 : casacore::ROScalarQuantColumn<casacore::Double> diameters = ctAC.dishDiameterQuant();
333 : // Get observatory position info for antenna offsets
334 : // *not read from antenna table OFFSET column!*
335 0 : casacore::MPosition obsPos;
336 0 : casacore::String telname;
337 0 : bool doOffset = getObservatoryPosition(obsPos, telname);
338 0 : casacore::Double rObs = 0.0, longObs = 0.0, latObs = 0.0;
339 0 : if (!doOffset) {
340 0 : os << "Warning: Telescope name '" << telname << "' is not recognized by CASA. Cannot compute offsets." << endl << endl;
341 : } else {
342 0 : casacore::Vector<casacore::Double> obsXYZ = obsPos.get("m").getValue();
343 0 : casacore::Double xo(obsXYZ[0]), yo(obsXYZ[1]), zo(obsXYZ[2]);
344 0 : rObs = sqrt(xo*xo + yo*yo + zo*zo);
345 0 : casacore::Vector<casacore::Double> obsLongLat = obsPos.getAngle("rad").getValue();
346 0 : longObs = obsLongLat[0];
347 0 : latObs = obsLongLat[1];
348 : }
349 :
350 0 : os.output().setf(ios::fixed, ios::floatfield);
351 0 : os.output().setf(ios::left, ios::adjustfield);
352 : // Write the title:
353 0 : casacore::String title("Antennas: "+String::toString(nAnt)+":");
354 0 : os << title << endl;
355 : // Write the column headings:
356 0 : os << indent;
357 0 : os.output().width(indwidth); os << "ID";
358 0 : os.output().width(namewidth); os << "Name";
359 0 : os.output().width(statwidth); os << "Station";
360 0 : os.output().width(diamwidth+4); os << "Diam.";
361 0 : os.output().width(longwidth); os << "Long.";
362 0 : os.output().width(latwidth); os << "Lat.";
363 0 : if (doOffset) {
364 0 : os.output().width(3 * offsetwidth);
365 0 : os << " Offset from array center (m)";
366 : }
367 0 : os.output().width(3 * positionwidth);
368 0 : os << " ITRF Geocentric coordinates (m)";
369 0 : os << endl << indent;
370 0 : os.output().width(indwidth + namewidth + statwidth + diamwidth + 4 + longwidth + latwidth);
371 0 : os << " ";
372 0 : os.output().setf(ios::right, ios::adjustfield);
373 0 : if (doOffset) {
374 0 : os.output().width(offsetwidth); os << "East";
375 0 : os.output().width(offsetwidth); os << "North";
376 0 : os.output().width(offsetwidth); os << "Elevation";
377 : }
378 0 : os.output().width(positionwidth); os << "x";
379 0 : os.output().width(positionwidth); os << "y";
380 0 : os.output().width(positionwidth); os << "z";
381 0 : os << endl;
382 : // Iterator through antennas and log info for each
383 0 : const static Unit diamUnit("m");
384 0 : std::set<Int>::const_iterator iter = antIds.begin();
385 0 : std::set<Int>::const_iterator end = antIds.end();
386 0 : for (; iter!=end; ++iter) {
387 0 : Int antId = *iter;
388 : // diameter
389 0 : const Quantity& diam = diameters(antId);
390 : // xyz
391 0 : casacore::Vector<casacore::Double> xyz = antPos(antId).get("m").getValue();
392 0 : casacore::Double x = xyz(0);
393 0 : casacore::Double y = xyz(1);
394 0 : casacore::Double z = xyz(2);
395 0 : casacore::Double rAnt = sqrt(x*x + y*y + z*z);
396 : // offsets
397 0 : const MPosition& mLongLat = antPos(antId);
398 0 : casacore::Vector<casacore::Double> antOffset;
399 0 : if (doOffset) {
400 0 : casacore::Vector<casacore::Double> longLatRad = mLongLat.getAngle("rad").getValue();
401 0 : casacore::Double longAnt = longLatRad(0);
402 0 : casacore::Double latAnt = longLatRad(1);
403 0 : casacore::Vector<casacore::Double> offset(3);
404 0 : offset[0] = (longAnt - longObs) * rObs * cos(latObs);
405 0 : offset[1] = (latAnt - latObs) * rObs;
406 0 : offset[2] = rAnt - rObs;
407 0 : casacore::QVD qoffset(offset, "m");
408 0 : antOffset = qoffset.getValue("m");
409 : }
410 : // lat/long
411 0 : MVAngle mvLong = mLongLat.getAngle().getValue()(0);
412 0 : MVAngle mvLat = mLongLat.getAngle().getValue()(1);
413 0 : if (!posIsITRF) {
414 0 : MeasConvert<MPosition> toItrf(antPos(antId), MPosition::ITRF);
415 0 : antPos(antId) = toItrf(antPos(antId));
416 : }
417 : // write the row
418 0 : os.output().setf(ios::left, ios::adjustfield);
419 0 : os << indent;
420 : // ID, Name, Station
421 0 : os.output().width(indwidth); os << antId;
422 0 : os.output().width(namewidth); os << names(antId);
423 0 : os.output().width(statwidth); os << stations(antId);
424 : // Diam.
425 0 : os.output().precision(diamprec);
426 0 : os.output().width(diamwidth);
427 0 : os << diam.getValue(diamUnit) << "m ";
428 : // Long. and Lat.
429 0 : os.output().width(longwidth);
430 0 : os << mvLong.string(MVAngle::ANGLE,7);
431 0 : os.output().width(latwidth);
432 0 : os << mvLat.string(MVAngle::DIG2,7);
433 0 : if (doOffset) {
434 : // Offset from array center (m) (East, North, Elevation)
435 0 : os.output().setf(ios::right, ios::adjustfield);
436 0 : os.output().precision(4);
437 0 : os.output().width(offsetwidth); os << antOffset(0);
438 0 : os.output().width(offsetwidth); os << antOffset(1);
439 0 : os.output().width(offsetwidth); os << antOffset(2);
440 : }
441 : // ITRF Geocentric coordinates (m) (x, y, z)
442 0 : os.output().precision(6);
443 0 : os.output().width(positionwidth); os << x;
444 0 : os.output().width(positionwidth); os << y;
445 0 : os.output().width(positionwidth); os << z;
446 0 : os << endl;
447 : }
448 : } else {
449 : // Horizontal list of the stations names:
450 0 : os << "Antennas: " << nAnt << " ('name'@'station') " << endl;
451 0 : casacore::String line, leader;
452 : // track last id of previous line for leader
453 0 : casacore::Int lastIdInLine = *antIds.begin() - 1;
454 0 : std::set<casacore::Int>::const_iterator iter = antIds.begin();
455 0 : std::set<casacore::Int>::const_iterator end = antIds.end();
456 0 : casacore::Int maxAnt = *std::max_element(antIds.begin(), antIds.end());
457 0 : for (; iter!=end; ++iter) {
458 0 : Int antId = *iter;
459 : // Build the line
460 0 : line = line + "'" + names(antId) + "'" + "@";
461 0 : line = line + "'" + stations(antId) + "'";
462 : // Add comma if not at the end
463 0 : if (antId != maxAnt) line = line + ", ";
464 0 : if (line.length() > 55 || antId == maxAnt) {
465 : // This line is finished, dump it after the line leader
466 0 : leader = String::toString(lastIdInLine+1) + "-" + String::toString(antId) +": ";
467 0 : os << " ID=";
468 0 : os.output().setf(ios::right, ios::adjustfield);
469 0 : os.output().width(8); os << leader;
470 0 : os << line << endl;
471 0 : line = "";
472 0 : lastIdInLine = antId;
473 : }
474 : }
475 : }
476 : }
477 0 : os << LogIO::POST;
478 0 : clearFormatFlags(os);
479 0 : }
480 :
481 0 : bool CTSummary::getObservatoryPosition(casacore::MPosition& obspos,
482 : casacore::String& name) const {
483 : // Returns observatory position in ITRF
484 : // get telescope name
485 : bool obsposOk;
486 0 : ROCTColumns ctc(*pNCT);
487 0 : const ROCTObservationColumns& ctOC(ctc.observation());
488 0 : name = ctOC.telescopeName().getColumn()(0);
489 0 : obsposOk = MeasTable::Observatory(obspos, name);
490 0 : if (obsposOk && (obspos.getRef().getType() != MPosition::ITRF)) {
491 0 : MeasConvert<MPosition> toItrf(obspos, MPosition::ITRF);
492 0 : obspos = toItrf(obspos);
493 : }
494 0 : return obsposOk;
495 : }
496 :
497 0 : void CTSummary::listField (LogIO& os, Bool verbose) const
498 : {
499 : // Is field table present?
500 0 : ROCTColumns ctc(*pNCT);
501 0 : const ROCTFieldColumns& ctFC(ctc.field());
502 0 : if (ctFC.nrow() <= 0) {
503 0 : os << "The FIELD table is empty" << endl;
504 : } else {
505 : // only list fields in main table
506 0 : ROCTMainColumns ctmain(*pNCT);
507 0 : std::vector<casacore::Int> fieldcol = ctmain.fieldId().getColumn().tovector();
508 0 : std::set<casacore::Int> fieldIds = std::set<casacore::Int>(fieldcol.begin(), fieldcol.end());
509 0 : os << "Fields: " << fieldIds.size() << endl;
510 0 : casacore::Int widthLead(2),
511 0 : widthField(6),
512 0 : widthCode(5),
513 0 : widthName(20),
514 0 : widthRA(16),
515 0 : widthDec(16),
516 0 : widthType(8),
517 0 : widthSrc(6);
518 :
519 : if (verbose) {} // null, always same output
520 :
521 : // Line is ID Code Name Name RA Dec Type
522 0 : os.output().setf(ios::left, ios::adjustfield);
523 0 : os.output().width(widthLead); os << " ";
524 0 : os.output().width(widthField); os << "FldId";
525 0 : os.output().width(widthCode); os << "Code";
526 0 : os.output().width(widthName); os << "Name";
527 0 : os.output().width(widthRA); os << "RA";
528 0 : os.output().width(widthDec); os << " Decl";
529 0 : os.output().width(widthType); os << "Epoch";
530 0 : os.output().width(widthSrc); os << "SrcId";
531 0 : os << endl;
532 : // get column values
533 0 : casacore::Vector<casacore::String> fieldNames = ctFC.name().getColumn();
534 0 : casacore::Vector<casacore::String> codes = ctFC.code().getColumn();
535 0 : casacore::ROArrayMeasColumn<casacore::MDirection> phaseDirs = ctFC.phaseDirMeasCol();
536 0 : casacore::Vector<casacore::Int> sourceIds = ctFC.sourceId().getColumn();
537 : // loop through fields
538 0 : std::set<Int>::const_iterator fiter = fieldIds.begin();
539 0 : std::set<Int>::const_iterator fend = fieldIds.end();
540 0 : static const MEpoch ezero(Quantity(0, "s"));
541 : //vector<Int> sourceIDs = _msmd->getFieldTableSourceIDs();
542 0 : for (; fiter!=fend; ++fiter) {
543 0 : Int fieldId = *fiter;
544 0 : if (fieldId >=0) {
545 0 : casacore::MDirection mRaDec = phaseDirs(fieldId)(IPosition(1,0));
546 0 : MVAngle mvRa = mRaDec.getAngle().getValue()(0);
547 0 : MVAngle mvDec = mRaDec.getAngle().getValue()(1);
548 0 : String name = fieldNames(fieldId);
549 0 : if (name.length()>20)
550 0 : name.replace(19,1,"*");
551 0 : os.output().setf(ios::left, ios::adjustfield);
552 0 : os.output().width(widthLead); os << " ";
553 0 : os.output().width(widthField); os << fieldId;
554 0 : os.output().width(widthCode); os << codes(fieldId);
555 0 : os.output().width(widthName); os << name.at(0,20);
556 0 : os.output().width(widthRA); os << mvRa(0.0).string(MVAngle::TIME,12);
557 0 : os.output().width(widthDec); os << mvDec.string(MVAngle::DIG2,11);
558 0 : os.output().width(widthType);
559 0 : os << MDirection::showType(mRaDec.getRefPtr()->getType());
560 0 : os.output().width(widthSrc); os << sourceIds[fieldId];
561 0 : os << endl;
562 : } else {
563 0 : os.output().setf(ios::left, ios::adjustfield);
564 0 : os.output().width(widthLead); os << " ";
565 0 : os.output().width(widthField); os << fieldId;
566 0 : os << endl;
567 : }
568 : }
569 : }
570 0 : os << endl << LogIO::POST;
571 0 : clearFormatFlags(os);
572 0 : }
573 :
574 0 : void CTSummary::listObservation (LogIO& os, Bool verbose) const
575 : {
576 0 : ROCTColumns ctc(*pNCT);
577 0 : const ROCTObservationColumns& ctOC(ctc.observation());
578 0 : if (ctOC.nrow() <= 0) {
579 0 : os << "The OBSERVATION table is empty" << endl;
580 : } else {
581 0 : os << " Observer: " << ctOC.observer()(0) << " "
582 0 : << " Project: " << ctOC.project()(0) << " " << endl;
583 0 : os << " Observation: " << ctOC.telescopeName()(0) << endl << endl;
584 0 : if (verbose) {
585 : // only list obsids in main table
586 0 : ROCTMainColumns ctmain(*pNCT);
587 0 : std::vector<casacore::Int> obsidcol = ctmain.obsId().getColumn().tovector();
588 0 : std::set<casacore::Int> obsIds = std::set<casacore::Int>(obsidcol.begin(), obsidcol.end());
589 : // for timeranges
590 0 : casacore::IPosition first(1,0);
591 0 : casacore::IPosition second(1,1);
592 0 : casacore::String timeref = ctOC.timeRange().keywordSet().subRecord("MEASINFO").asString("Ref");
593 : // time range (Date) format is e.g. 00:00:46.0-01:43:50.2
594 0 : casacore::Int widthTel(10), widthDate(36), widthObs(20), widthProj(15);
595 : // column headings
596 0 : os.output().setf(ios::left, ios::adjustfield);
597 0 : os.output().width(widthTel); os << "Telescope";
598 0 : casacore::String timeHeader = "Timerange (" + timeref + ")";
599 0 : os.output().width(widthDate); os << timeHeader;
600 0 : os.output().width(widthObs); os << "Observer";
601 0 : os.output().width(widthProj); os << "Project";
602 0 : os << endl;
603 : // get columns
604 0 : casacore::Vector<casacore::String> telname = ctOC.telescopeName().getColumn();
605 0 : casacore::Array<casacore::Double> timerange = ctOC.timeRange().getColumn();
606 0 : casacore::Vector<casacore::String> observer = ctOC.observer().getColumn();
607 0 : casacore::Vector<casacore::String> project = ctOC.project().getColumn();
608 : // print each obsid row
609 0 : std::set<casacore::Int>::const_iterator iter = obsIds.begin();
610 0 : std::set<casacore::Int>::const_iterator end = obsIds.end();
611 0 : for (; iter!=end; ++iter) {
612 0 : casacore::Int obsid = *iter;
613 0 : if (obsid >= 0) {
614 0 : os.output().setf(ios::left, ios::adjustfield);
615 0 : os.output().width(widthTel); os << telname(obsid);
616 0 : casacore::Double start = timerange(IPosition(2, 0, obsid));
617 0 : casacore::Double end = timerange(IPosition(2, 1, obsid));
618 0 : casacore::String range = MVTime(start/C::day).string(MVTime::YMD,7) + " - "
619 0 : + MVTime(end/C::day).string(MVTime::TIME,7);
620 0 : os.output().width(widthDate); os << range;
621 0 : os.output().width(widthObs); os << observer(obsid);
622 0 : os.output().width(widthProj); os << project(obsid);
623 0 : os << endl;
624 : }
625 : }
626 : }
627 : }
628 0 : os << LogIO::POST;
629 0 : clearFormatFlags(os);
630 0 : }
631 :
632 :
633 0 : String formatTime(const Double time) {
634 0 : MVTime mvtime(Quantity(time, "s"));
635 0 : Time t=mvtime.getTime();
636 0 : ostringstream os;
637 0 : os << t;
638 0 : return os.str();
639 : }
640 :
641 0 : void CTSummary::listHistory (LogIO& os) const
642 : {
643 : // Create a history object
644 0 : ROCTHistoryColumns ctHist(pNCT->history());
645 :
646 0 : if (ctHist.nrow()<=0) {
647 0 : os << "The HISTORY table is empty" << endl;
648 : }
649 : else {
650 0 : uInt nmessages = ctHist.time().nrow();
651 0 : os << "History table entries: " << nmessages << endl << LogIO::POST;
652 0 : const ScalarColumn<Double> &theTimes((ctHist.time()));
653 0 : const ScalarColumn<String> &messOrigin((ctHist.origin()));
654 0 : const ScalarColumn<String> &messString((ctHist.message()));
655 0 : const ScalarColumn<String> &messPriority((ctHist.priority()));
656 0 : for (uInt i=0 ; i < nmessages; i++) {
657 0 : Quantity tmpq(theTimes(i), "s");
658 0 : MVTime mvtime(tmpq);
659 0 : Time messTime(mvtime.getTime());
660 0 : LogMessage::Priority itsPriority(LogMessage::NORMAL);
661 0 : if(messPriority(i) == "DEBUGGING"){
662 0 : itsPriority = LogMessage::DEBUGGING;
663 0 : } else if(messPriority(i) == "DEBUG2"){
664 0 : itsPriority = LogMessage::DEBUG2;
665 0 : } else if(messPriority(i) == "DEBUG1"){
666 0 : itsPriority = LogMessage::DEBUG1;
667 0 : } else if(messPriority(i) == "NORMAL5" ||
668 0 : messPriority(i) == "INFO5"){
669 0 : itsPriority = LogMessage::NORMAL5;
670 0 : } else if(messPriority(i) == "NORMAL4" ||
671 0 : messPriority(i) == "INFO4"){
672 0 : itsPriority = LogMessage::NORMAL4;
673 0 : } else if(messPriority(i) == "NORMAL3" ||
674 0 : messPriority(i) == "INFO3"){
675 0 : itsPriority = LogMessage::NORMAL3;
676 0 : } else if(messPriority(i) == "NORMAL2" ||
677 0 : messPriority(i) == "INFO2"){
678 0 : itsPriority = LogMessage::NORMAL2;
679 0 : } else if(messPriority(i) == "NORMAL1" ||
680 0 : messPriority(i) == "INFO1"){
681 0 : itsPriority = LogMessage::NORMAL1;
682 0 : } else if(messPriority(i) == "NORMAL" ||
683 0 : messPriority(i) == "INFO"){
684 0 : itsPriority = LogMessage::NORMAL;
685 0 : } else if(messPriority(i) == "WARN"){
686 0 : itsPriority = LogMessage::WARN;
687 0 : } else if(messPriority(i) == "SEVERE"){
688 0 : itsPriority = LogMessage::SEVERE;
689 : }
690 0 : LogOrigin orhist(messOrigin(i));
691 0 : LogMessage histMessage(messString(i), orhist.taskName("listHistory"), itsPriority);
692 0 : histMessage.messageTime(messTime);
693 0 : os.post(histMessage);
694 : }
695 0 : os << LogIO::POST;
696 : }
697 0 : }
698 :
699 0 : void CTSummary::listSpectralWindow (LogIO& os, Bool verbose) const
700 : {
701 0 : ROCTColumns ctc(*pNCT);
702 0 : const ROCTSpWindowColumns& ctSW(ctc.spectralWindow());
703 :
704 : if (verbose) {} //null; always the same output
705 :
706 0 : if (ctSW.refFrequency().nrow()<=0) {
707 0 : os << "The SPECTRAL_WINDOW table is empty" << endl;
708 : } else {
709 0 : casacore::uInt nrow = ctSW.refFrequency().nrow();
710 0 : os << "Spectral Windows: " << nrow << endl;
711 : // Header: SpwId Ref.Freq #Chans Resolution TotalBW
712 0 : casacore::Int widthLead(2), widthId(7), widthFreq(18), widthNumChan(8);
713 0 : os.output().setf(ios::left, ios::adjustfield);
714 0 : os.output().width(widthLead); os << " ";
715 0 : os.output().width(widthId); os << "SpwId";
716 0 : os.output().width(widthFreq); os << "Ref.Freq (MHz)";
717 0 : os.output().width(widthNumChan); os << "#Chans";
718 0 : os.output().width(widthFreq); os << "Resolution (kHz)";
719 0 : os.output().width(widthFreq); os << "TotalBW (kHz)";
720 0 : os << endl;
721 :
722 : // For each row of the SpWin subtable, write the info
723 0 : for (uInt row=0; row<nrow; row++) {
724 0 : os.output().setf(ios::left, ios::adjustfield);
725 0 : os.output().width(widthLead); os << " ";
726 0 : os.output().width(widthId); os << row;
727 0 : os.output().width(widthFreq);
728 0 : os << ctSW.refFrequency()(row) / 1.0e6;
729 0 : os.output().width(widthNumChan);
730 0 : os << ctSW.numChan()(row);
731 0 : os.output().width(widthFreq);
732 0 : os << ctSW.resolution()(row)(IPosition(1,0))/1000.0;
733 0 : os.output().width(widthFreq);
734 0 : os << ctSW.totalBandwidth()(row)/1000.0;
735 0 : os << endl;
736 : }
737 : }
738 0 : os << LogIO::POST;
739 0 : clearFormatFlags(os);
740 0 : }
741 :
742 0 : void CTSummary::listTables (LogIO& os, Bool verbose) const
743 : {
744 : // Get nrows for each table (=-1 if table absent)
745 0 : casacore::Vector<casacore::Int> tableRows(6);
746 0 : tableRows(0) = nrow();
747 0 : tableRows(1) = pNCT->observation().nrow();
748 0 : tableRows(2) = pNCT->antenna().nrow();
749 0 : tableRows(3) = pNCT->field().nrow();
750 0 : tableRows(4) = pNCT->spectralWindow().nrow();
751 0 : tableRows(5) = pNCT->history().nrow();
752 :
753 0 : casacore::Vector<casacore::String> tableStrings(6);
754 0 : tableStrings(0) = "MAIN";
755 0 : tableStrings(1) = "OBSERVATION";
756 0 : tableStrings(2) = "ANTENNA";
757 0 : tableStrings(3) = "FIELD";
758 0 : tableStrings(4) = "SPECTRAL_WINDOW";
759 0 : tableStrings(5) = "HISTORY";
760 :
761 : // Just to make things read better
762 0 : casacore::Vector<casacore::String> rowStrings(6);
763 0 : rowStrings = " rows";
764 0 : for (uInt i=0; i<6; i++) {
765 0 : if (tableRows(i)==1) rowStrings(i) = " row";
766 : // if table exists, but empty:
767 0 : if (tableRows(i)==0) rowStrings(i) = " <empty>";
768 : // if table absent:
769 0 : if (tableRows(i)==-1) rowStrings(i) = "<absent>";
770 : }
771 :
772 0 : if (verbose) {
773 0 : os << " Tables" << endl;
774 0 : for (uInt i=0; i<6; i++) {
775 0 : os.output().setf(ios::left, ios::adjustfield);
776 0 : os.output().width(3); os << " ";
777 0 : os.output().width(20); os << tableStrings(i);
778 0 : os.output().setf(ios::right, ios::adjustfield);
779 0 : os.output().width(8); os << tableRows(i);
780 0 : os.output().setf(ios::left, ios::adjustfield);
781 0 : os.output().width(10); os << rowStrings(i);
782 0 : os << endl;
783 : }
784 : } else {
785 0 : os << " Tables (rows): (-1 = table absent)" << endl;
786 0 : for (uInt i=0; i<6; i++) {
787 0 : casacore::String tableinfo = tableStrings(i) + " (" +
788 0 : casacore::String::toString(tableRows(i)) + ")";
789 0 : os.output().setf(ios::left, ios::adjustfield);
790 0 : casacore::Int infowidth = 15;
791 0 : if (i==1 || i==4) infowidth = 25;
792 0 : os.output().width(infowidth);
793 0 : os << tableinfo;
794 0 : if ((i+1) % 3==0) os << endl;
795 : }
796 : }
797 0 : os << LogIO::POST;
798 0 : clearFormatFlags(os);
799 0 : }
800 :
801 : //
802 : // Clear all the formatting flags
803 : //
804 0 : void CTSummary::clearFormatFlags(LogIO& os) const
805 : {
806 0 : os.output().unsetf(ios::left);
807 0 : os.output().unsetf(ios::right);
808 0 : os.output().unsetf(ios::internal);
809 :
810 0 : os.output().unsetf(ios::dec);
811 0 : os.output().unsetf(ios::oct);
812 0 : os.output().unsetf(ios::hex);
813 :
814 0 : os.output().unsetf(ios::showbase | ios::showpos | ios::uppercase | ios::showpoint);
815 :
816 0 : os.output().unsetf(ios::scientific);
817 0 : os.output().unsetf(ios::fixed);
818 0 : }
819 :
820 : } //# NAMESPACE CASA - END
821 :
|