LCOV - code coverage report
Current view: top level - synthesis/CalTables - CTSummary.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 574 0.0 %
Date: 2024-12-11 20:54:31 Functions: 0 21 0.0 %

          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: casa-feedback@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           0 : : pNCT(&nct), 
      48           0 :   dashlin1(replicate("-",80)),
      49           0 :   dashlin2(replicate("=",80))
      50           0 : {}
      51             : 
      52           0 : CTSummary::CTSummary (const NewCalTable* nct)
      53           0 : : pNCT(nct), 
      54           0 :   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           0 :             }
     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           0 :         } // while
     289           0 :         os << "(nRows = Total number of rows per scan) " << endl;
     290           0 :         os << LogIO::POST;
     291           0 :     }
     292           0 :     clearFormatFlags(os);
     293           0 : }
     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           0 :             }
     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           0 :               }
     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           0 :               }
     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           0 :             }
     448           0 :         } 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           0 :         }
     476           0 :     }
     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           0 :     }
     494           0 :     return obsposOk;
     495           0 : }
     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           0 :             } 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           0 :     }
     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           0 :           }
     625             :         }
     626           0 :       }
     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           0 : }
     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           0 :         }
     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           0 :         }
     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             : 

Generated by: LCOV version 1.16