Ignore:
Timestamp:
07/29/10 19:13:46 (14 years ago)
Author:
Kana Sugimoto
Message:

New Development: Yes

JIRA Issue: No (test merging alma branch)

Ready for Test: Yes

Interface Changes: Yes

What Interface Changed:

Test Programs:

Put in Release Notes: No

Module(s):

Description:


Location:
branches/mergetest
Files:
4 deleted
25 edited
22 copied

Legend:

Unmodified
Added
Removed
  • branches/mergetest

  • branches/mergetest/external/atnf/PKSIO/FITSreader.cc

    r1720 r1779  
    5555        const int getSpectra,
    5656        const int getXPol,
     57        const int getFeedPos,
     58        const int getPointing,
    5759        const int coordSys)
    5860{
     
    8587  cGetSpectra = getSpectra && cHaveSpectra;
    8688  cGetXPol    = getXPol    && cGetXPol;
     89  cGetFeedPos = getFeedPos;
    8790  cCoordSys   = coordSys;
     91
    8892
    8993  return maxNChan;
  • branches/mergetest/external/atnf/PKSIO/FITSreader.h

    r1720 r1779  
    4141
    4242#include <atnf/PKSIO/MBrecord.h>
    43 #include <atnf/PKSIO/PKSmsg.h>
    4443
    4544using namespace std;
     45
    4646
    4747// <summary>
     
    4949// </summary>
    5050
    51 class FITSreader : public PKSmsg
     51//class FITSreader
     52class FITSreader
    5253{
    5354  public:
     
    106107        const int refChan[],
    107108        const int getSpectra = 1,
    108         const int getXPol  = 0,
     109        const int getXPol = 0,
     110        const int getFeedPos = 0,
     111        const int getPointing = 0,
    109112        const int coordSys = 0);
     113
    110114
    111115    // Find the range in time and position of the data selected.
     
    119123    // Read the next data record.
    120124    virtual int read(
     125//        PKSMBrecord &record) = 0;
    121126        MBrecord &record) = 0;
    122127
     
    125130
    126131  protected:
    127     int  *cBeams, *cEndChan, cCoordSys, cGetSpectra, cGetXPol, cHaveBase,
    128          cHaveSpectra, *cHaveXPol, *cIFs, cNBeam, *cNChan, cNIF, *cNPol,
    129          *cRefChan, *cStartChan;
     132    int  *cBeams, *cEndChan, cGetFeedPos, cCoordSys, cGetSpectra, cGetXPol,
     133           cHaveBase, cHaveSpectra, *cHaveXPol, *cIFs, cNBeam, *cNChan, cNIF,
     134           *cNPol, *cRefChan, *cStartChan;
    130135
    131136    // For use in constructing messages.
    132137    char cMsg[256];
     138
    133139};
    134140
  • branches/mergetest/external/atnf/PKSIO/MBFITSreader.cc

    r1720 r1779  
    4141#include <atnf/PKSIO/MBrecord.h>
    4242
     43#include <casa/Logging/LogIO.h>
     44
    4345#include <casa/math.h>
    4446#include <casa/iostream.h>
     
    5759const double HALFPI = PI / 2.0;
    5860const double R2D = 180.0 / PI;
     61
     62// Class name
     63const string className = "MBFITSreader" ;
    5964
    6065//------------------------------------------------- MBFITSreader::MBFITSreader
     
    99104
    100105  // Tell RPFITSIN not to report errors directly.
    101   iostat_.errlun = -1;
    102 
    103   // By default, messages are written to stderr.
    104   initMsg();
     106  //iostat_.errlun = -1;
    105107}
    106108
     
    131133        int  &extraSysCal)
    132134{
    133   // Clear the message stack.
    134   clearMsg();
     135  const string methodName = "open()" ;
     136  LogIO os( LogOrigin( className, methodName, WHERE ) ) ;
    135137
    136138  if (cMBopen) {
     
    143145  int jstat = -3;
    144146  if (rpfitsin(jstat)) {
    145     sprintf(cMsg, "ERROR: Failed to open MBFITS file\n       %s", rpname);
    146     logMsg(cMsg);
     147    sprintf(cMsg, "Failed to open MBFITS file\n%s", rpname);
     148    os << LogIO::SEVERE << cMsg << LogIO::POST ;
    147149    return 1;
    148150  }
     
    161163  jstat = -1;
    162164  if (rpfitsin(jstat)) {
    163     sprintf(cMsg, "ERROR: Failed to read MBFITS header in file\n"
    164                   "       %s", rpname);
    165     logMsg(cMsg);
     165    sprintf(cMsg, "Failed to read MBFITS header in file\n"
     166                  "%s", rpname);
     167    os << LogIO::SEVERE << cMsg << LogIO::POST ;
    166168    close();
    167169    return 1;
     
    173175  // Non-ATNF data may not store the position in (u,v,w).
    174176  if (strncmp(names_.sta, "tid", 3) == 0) {
    175     sprintf(cMsg, "WARNING: Found Tidbinbilla data");
     177    sprintf(cMsg, "Found Tidbinbilla data");
    176178    cSUpos = 1;
    177179  } else if (strncmp(names_.sta, "HOB", 3) == 0) {
    178     sprintf(cMsg, "WARNING: Found Hobart data");
     180    sprintf(cMsg, "Found Hobart data");
    179181    cSUpos = 1;
    180182  } else if (strncmp(names_.sta, "CED", 3) == 0) {
    181     sprintf(cMsg, "WARNING: Found Ceduna data");
     183    sprintf(cMsg, "Found Ceduna data");
    182184    cSUpos = 1;
    183185  } else {
     
    187189  if (cSUpos) {
    188190    strcat(cMsg, ", using telescope position\n         from SU table.");
    189     logMsg(cMsg);
     191    os << LogIO::WARN << cMsg << LogIO::POST ;
    190192    cInterp = 0;
    191193  }
     
    207209
    208210  if (cNBeam <= 0) {
    209     logMsg("ERROR: Couldn't determine number of beams.");
     211    os << LogIO::SEVERE << "Couldn't determine number of beams." << LogIO::POST ;
    210212    close();
    211213    return 1;
     
    232234
    233235      sprintf(cMsg,
    234         "WARNING: RPFITSIN returned beam number %2d for AN table\n"
    235         "         entry %2d with name '%.8s'", beamNo, iBeam+1, sta);
     236        "RPFITSIN returned beam number %2d for AN table\n"
     237        "entry %2d with name '%.8s'", beamNo, iBeam+1, sta);
    236238
    237239      char text[8];
     
    245247      }
    246248
    247       logMsg(cMsg);
     249      os << LogIO::WARN << cMsg << LogIO::POST ;
    248250    }
    249251
     
    339341  // Read the first syscal record.
    340342  if (rpget(1, cEOS)) {
    341     logMsg("ERROR: Failed to read first syscal record.");
     343    os << LogIO::SEVERE << "Failed to read first syscal record." << LogIO::POST ;
    342344    close();
    343345    return 1;
     
    374376        double &bandwidth)
    375377{
     378  const string methodName = "getHeader()" ;
     379  LogIO os( LogOrigin( className, methodName, WHERE ) ) ;
     380
    376381  if (!cMBopen) {
    377     logMsg("ERROR: An MBFITS file has not been opened.");
     382    os << LogIO::SEVERE << "An MBFITS file has not been opened." << LogIO::POST ;
    378383    return 1;
    379384  }
     
    511516        MBrecord &MBrec)
    512517{
     518  const string methodName = "read()" ;
     519  LogIO os( LogOrigin( className, methodName, WHERE ) ) ;
     520
    513521  int beamNo = -1;
    514522  int haveData, pCode = 0, status;
     
    517525
    518526  if (!cMBopen) {
    519     logMsg("ERROR: An MBFITS file has not been opened.");
     527    os << LogIO::SEVERE << "An MBFITS file has not been opened." << LogIO::POST ;
    520528    return 1;
    521529  }
     
    562570
    563571#ifdef PKSIO_DEBUG
    564         fprintf(stderr, "\nEnd-of-file detected, flushing last cycle.\n");
     572        os << LogIO::DEBUGGING << "\nEnd-of-file detected, flushing last cycle.\n" << LogIO::POST ;
    565573#endif
    566574
     
    646654
    647655          if (cNBin > 1 && cNBeamSel > 1) {
    648             logMsg("ERROR: Cannot handle binning mode for multiple beams.\n"
    649                    "       Select a single beam for input.");
     656            os << LogIO::SEVERE << "Cannot handle binning mode for multiple beams.\nSelect a single beam for input." << LogIO::POST ;
    650657            close();
    651658            return 1;
     
    717724          // the start of the next.
    718725#ifdef PKSIO_DEBUG
    719           fprintf(stderr, "Change-of-day on cUTC: %.1f -> %.1f\n",
    720             cPrevUTC, cUTC);
     726          char buf[256] ;
     727          sprintf(buf, "Change-of-day on cUTC: %.1f -> %.1f\n", cPrevUTC, cUTC);
     728          os << LogIO::DEBUGGING << buf << LogIO::POST ;
    721729#endif
    722730          // Can't change the recorded value of cUTC directly (without also
     
    724732          // an offset to be applied when comparing integration timestamps.
    725733          cod = 86400.0;
    726         }
     734
     735        }
    727736
    728737        if ((cUTC+cod) < cPrevUTC - 1.0) {
     
    738747            // All other data should be fully time ordered.
    739748            sprintf(cMsg,
    740               "WARNING: Cycle %d:%03d-%03d, UTC went backwards from\n"
    741               "         %.1f to %.1f!  Incrementing day number,\n"
    742               "         positions may be unreliable.", cScanNo, cCycleNo,
     749              "Cycle %d:%03d-%03d, UTC went backwards from\n"
     750              "%.1f to %.1f!  Incrementing day number,\n"
     751              "positions may be unreliable.", cScanNo, cCycleNo,
    743752              cCycleNo+1, cPrevUTC, cUTC);
    744             logMsg(cMsg);
     753            //logMsg(cMsg);
     754            os << LogIO::WARN << cMsg << LogIO::POST ;
    745755            cUTC += 86400.0;
    746756          }
     
    782792        }
    783793
    784         fprintf(stderr, "\n In:%4d%4d%3d%3d  %.3f %c %.3f (%+.3fs) - "
     794        sprintf(buf, "\n In:%4d%4d%3d%3d  %.3f %c %.3f (%+.3fs) - "
    785795          "%sflushing\n", cScanNo, cCycleNo, beamNo, cIFno, cUTC, rel, cW, dt,
    786796          cFlushing ? "" : "not ");
     797        os << LogIO::DEBUGGING << buf << LogIO::POST ;
    787798        if (cEOS) {
    788           fprintf(stderr, "Start of new scan, flushing previous scan.\n");
     799          sprintf(buf, "Start of new scan, flushing previous scan.\n");
     800          os << LogIO::DEBUGGING << buf << LogIO::POST ;
    789801        }
    790802#endif
     
    884896
    885897#ifdef PKSIO_DEBUG
    886       fprintf(stderr, "This (%d) ra, dec, UTC: %9.4f %9.4f %10.3f %9.4f\n",
     898      sprintf(buf, "This (%d) ra, dec, UTC: %9.4f %9.4f %10.3f %9.4f\n",
    887899        iMBuff->cycleNo, thisRA*R2D, thisDec*R2D, thisUTC, thisPA*R2D);
     900      os << LogIO::DEBUGGING << buf << LogIO::POST ;
    888901#endif
    889902
     
    921934
    922935#ifdef PKSIO_DEBUG
    923           fprintf(stderr, "Next (%d) ra, dec, UTC: %9.4f %9.4f %10.3f "
     936          sprintf(buf, "Next (%d) ra, dec, UTC: %9.4f %9.4f %10.3f "
    924937            "(0.000s)\n", cCycleNo, cU*R2D, cV*R2D, cW);
     938          os << LogIO::DEBUGGING << buf << LogIO::POST ;
    925939#endif
    926940
     
    937951
    938952#ifdef PKSIO_DEBUG
    939           fprintf(stderr, "Next (%d) ra, dec, UTC: %9.4f %9.4f %10.3f "
     953          sprintf(buf, "Next (%d) ra, dec, UTC: %9.4f %9.4f %10.3f "
    940954            "(%+.3fs)\n", cCycleNo, nextRA*R2D, nextDec*R2D, nextUTC,
    941955            utcDiff(nextUTC, thisUTC));
     956          os << LogIO::DEBUGGING << buf << LogIO::POST ;
    942957#endif
    943958
     
    10891104#ifdef PKSIO_DEBUG
    10901105      double avRate = sqrt(cAvRate[0]*cAvRate[0] + cAvRate[1]*cAvRate[1]);
    1091       fprintf(stderr, "RA, Dec, Av & PA rates: %8.4f %8.4f %8.4f %8.4f "
     1106      sprintf(buf, "RA, Dec, Av & PA rates: %8.4f %8.4f %8.4f %8.4f "
    10921107        "pCode %d\n", raRate*R2D, decRate*R2D, avRate*R2D, paRate*R2D, pCode);
     1108      os << LogIO::DEBUGGING << buf << LogIO::POST ;
    10931109#endif
    10941110
     
    11131129
    11141130#ifdef PKSIO_DEBUG
    1115         fprintf(stderr, "Intp (%d) ra, dec, UTC: %9.4f %9.4f %10.3f (pCode, "
     1131        sprintf(buf, "Intp (%d) ra, dec, UTC: %9.4f %9.4f %10.3f (pCode, "
    11161132          "age: %d %.1fs)\n", iMBuff->cycleNo, cBuffer[jbuff].ra*R2D,
    11171133          cBuffer[jbuff].dec*R2D, cBuffer[jbuff].utc, iMBuff->pCode,
    11181134          iMBuff->rateAge);
     1135        os << LogIO::DEBUGGING << buf << LogIO::POST ;
    11191136#endif
    11201137      }
     
    11301147
    11311148#ifdef PKSIO_DEBUG
    1132       fprintf(stderr, "Out:%4d%4d%3d%3d\n", MBrec.scanNo, MBrec.cycleNo,
     1149      sprintf(buf, "Out:%4d%4d%3d%3d\n", MBrec.scanNo, MBrec.cycleNo,
    11331150        MBrec.beamNo, MBrec.IFno[0]);
     1151      os << LogIO::DEBUGGING << buf << LogIO::POST ;
    11341152#endif
    11351153
     
    11721190        // Sanity check on the number of IFs in the new scan.
    11731191        if (if_.n_if != cNIF) {
    1174           sprintf(cMsg, "WARNING: Scan %d has %d IFs instead of %d, "
     1192          sprintf(cMsg, "Scan %d has %d IFs instead of %d, "
    11751193            "continuing.", cScanNo, if_.n_if, cNIF);
    1176           logMsg(cMsg);
     1194          os << LogIO::WARN << cMsg << LogIO::POST ;
    11771195        }
    11781196      }
     
    11861204
    11871205#ifdef PKSIO_DEBUG
    1188       fprintf(stderr, "Buf:%4d%4d%3d%3d\n", cScanNo, cCycleNo, beamNo, cIFno);
     1206      sprintf(buf, "Buf:%4d%4d%3d%3d\n", cScanNo, cCycleNo, beamNo, cIFno);
     1207      os << LogIO::DEBUGGING << buf << LogIO::POST ;
    11891208#endif
    11901209
     
    12651284        // Integration cycle written to the output file twice (the only known
    12661285        // example is 1999-05-22_1914_000-031805_03v.hpf).
    1267         sprintf(cMsg, "WARNING: Integration cycle %d:%d, beam %2d, \n"
    1268                       "         IF %d was duplicated.", cScanNo, cCycleNo-1,
     1286        sprintf(cMsg, "Integration cycle %d:%d, beam %2d, \n"
     1287                      "IF %d was duplicated.", cScanNo, cCycleNo-1,
    12691288                      beamNo, cIFno);
    1270         logMsg(cMsg);
     1289        os << LogIO::WARN << cMsg << LogIO::POST ;
    12711290      }
    12721291      iMBuff->nChan[iIFSel] = nChan;
     
    14541473int MBFITSreader::rpget(int syscalonly, int &EOS)
    14551474{
     1475  const string methodName = "rpget()" ;
     1476  LogIO os( LogOrigin( className, methodName, WHERE ) ) ;
     1477
    14561478  EOS = 0;
    14571479
     
    14691491      // Read failed; retry.
    14701492      numErr++;
    1471       logMsg("WARNING: RPFITS read failed - retrying.");
     1493      os << LogIO::WARN << "RPFITS read failed - retrying." << LogIO::POST ;
    14721494      jstat = 0;
    14731495      break;
     
    15251547    default:
    15261548      // Shouldn't reach here.
    1527       sprintf(cMsg, "WARNING: Unrecognized RPFITSIN return code: %d "
     1549      sprintf(cMsg, "Unrecognized RPFITSIN return code: %d "
    15281550                    "(retrying).", jstat);
    1529       logMsg(cMsg);
     1551      os << LogIO::WARN << cMsg << LogIO::POST ;
    15301552      jstat = 0;
    15311553      break;
     
    15331555  }
    15341556
    1535   logMsg("ERROR: RPFITS read failed too many times.");
     1557  os << LogIO::SEVERE << "RPFITS read failed too many times." << LogIO::POST ;
    15361558  return 2;
    15371559}
     
    15491571
    15501572  // Handle messages from RPFITSIN.
     1573/**
    15511574  if (names_.errmsg[0] != ' ') {
    15521575    int i;
     
    15591582    logMsg(cMsg);
    15601583  }
    1561 
     1584**/
    15621585  return jstat;
    15631586}
  • branches/mergetest/external/atnf/PKSIO/MBrecord.cc

    r1720 r1779  
    322322  refBeam = other.refBeam;
    323323
     324  polNo = other.polNo ;
     325  srcVelocity = other.srcVelocity ;
     326
    324327  return *this;
    325328}
     
    436439  refBeam = other.refBeam;
    437440
     441  polNo = other.polNo ;
     442  srcVelocity = other.srcVelocity ;
     443
    438444  return 0;
    439445}
  • branches/mergetest/external/atnf/PKSIO/MBrecord.h

    r1720 r1779  
    166166    short  refBeam;             // Reference beam, in beam-switching (MX)
    167167                                // mode (added 1999/03/17).
     168    int polNo ;                 // polarization ID
     169    float srcVelocity ;         // source velocity w.r.t. reference frame
    168170
    169171  private:
  • branches/mergetest/external/atnf/PKSIO/PKSFITSreader.cc

    r1720 r1779  
    3434//#---------------------------------------------------------------------------
    3535
    36 #include <atnf/PKSIO/PKSmsg.h>
    3736#include <atnf/PKSIO/MBFITSreader.h>
    3837#include <atnf/PKSIO/SDFITSreader.h>
     
    4443#include <casa/BasicMath/Math.h>
    4544#include <casa/Quanta/MVTime.h>
     45#include <casa/Logging/LogIO.h>
    4646
    4747//----------------------------------------------- PKSFITSreader::PKSFITSreader
     
    6161    cReader = new MBFITSreader(retry, interpolate ? 1 : 0);
    6262  }
    63 
    64   // By default, messages are written to stderr.
    65   initMsg();
    6663}
    6764
     
    7673}
    7774
    78 //------------------------------------------------------ PKSFITSreader::setMsg
    79 
    80 // Set message disposition.  If fd is non-zero messages will be written
    81 // to that file descriptor, else stored for retrieval by getMsg().
    82 
    83 Int PKSFITSreader::setMsg(FILE *fd)
    84 {
    85   PKSmsg::setMsg(fd);
    86   cReader->setMsg(fd);
    87 
    88   return 0;
    89 }
    90 
    9175//-------------------------------------------------------- PKSFITSreader::open
    9276
     
    9579Int PKSFITSreader::open(
    9680        const String fitsName,
     81        const String antenna,
    9782        Vector<Bool> &beams,
    9883        Vector<Bool> &IFs,
     
    10388        Bool   &haveSpectra)
    10489{
    105   clearMsg();
    106 
    10790  int    extraSysCal, haveBase_, *haveXPol_, haveSpectra_, nBeam, *nChan_,
    10891         nIF, *nPol_, status;
     
    11093                         nChan_, nPol_, haveXPol_, haveBase_, haveSpectra_,
    11194                         extraSysCal);
    112   logMsg(cReader->getMsg());
    113   cReader->clearMsg();
     95  //logMsg(cReader->getMsg());
     96  //cReader->clearMsg();
    11497  if (status) {
    11598    return status;
     
    178161                              obsType_, bunit_, equinox_, radecsys,
    179162                              dopplerFrame_, datobs, utc, refFreq, bandwidth);
    180   logMsg(cReader->getMsg());
    181   cReader->clearMsg();
     163  //logMsg(cReader->getMsg());
     164  //cReader->clearMsg();
    182165  if (status) {
    183166    return 1;
     
    218201  Int status = cReader->getFreqInfo(nIF, startfreq, endfreq);
    219202
    220   logMsg(cReader->getMsg());
    221   cReader->clearMsg();
     203  //logMsg(cReader->getMsg());
     204  //cReader->clearMsg();
    222205  if (!status) {
    223206    startFreq.takeStorage(IPosition(1,nIF), startfreq, TAKE_OVER);
     
    240223        const Bool getSpectra,
    241224        const Bool getXPol,
     225        const Bool getFeedPos,
     226        const Bool getPointing,
    242227        const Int  coordSys)
    243228{
     
    307292  cGetSpectra = getSpectra;
    308293  cGetXPol    = getXPol;
     294  cGetFeedPos = getFeedPos;
     295  cGetPointing = getPointing;
    309296  cCoordSys   = coordSys;
    310297
    311298  uInt maxNChan = cReader->select(start, end, ref, cGetSpectra, cGetXPol,
    312                                   cCoordSys);
    313   logMsg(cReader->getMsg());
    314   cReader->clearMsg();
     299                                  cGetFeedPos, cGetPointing, cCoordSys);
     300  //logMsg(cReader->getMsg());
     301  //cReader->clearMsg();
    315302
    316303  delete [] end;
     
    336323
    337324  Int status = cReader->findRange(nRow, nSel, dateSpan, utcSpan, posns);
    338   logMsg(cReader->getMsg());
    339   cReader->clearMsg();
     325  //logMsg(cReader->getMsg());
     326  //cReader->clearMsg();
    340327
    341328  if (!status) {
     
    361348{
    362349  Int status = cReader->read(cMBrec);
    363   logMsg(cReader->getMsg());
    364   cReader->clearMsg();
     350  //logMsg(cReader->getMsg());
     351  //cReader->clearMsg();
    365352
    366353  if (status) {
     
    378365  pksrec.scanNo  = cMBrec.scanNo;
    379366  pksrec.cycleNo = cMBrec.cycleNo;
     367  pksrec.polNo = cMBrec.polNo ;
    380368
    381369  // Extract MJD.
    382370  Int day, month, year;
    383   sscanf(cMBrec.datobs, "%4d-%2d-%2d", &year, &month, &day);
    384   pksrec.mjd = MVTime(year, month, Double(day)).day() + cMBrec.utc/86400.0;
     371  if ( strstr( cMBrec.datobs, "T" ) == NULL ) {
     372    sscanf(cMBrec.datobs, "%4d-%2d-%2d", &year, &month, &day);
     373    pksrec.mjd = MVTime(year, month, Double(day)).day() + cMBrec.utc/86400.0;
     374  }
     375  else {
     376    Double dd, hour, min, sec ;
     377    sscanf( cMBrec.datobs, "%4d-%2d-%2lfT%lf:%lf:%lf", &year, &month, &dd, &hour, &min, &sec ) ;
     378    dd = dd + ( hour * 3600.0 + min * 60.0 + sec ) / 86400.0 ;
     379    pksrec.mjd = MVTime(year, month, dd).day() ;
     380  }
    385381
    386382  pksrec.interval  = cMBrec.exposure;
     
    388384  pksrec.fieldName = trim(cMBrec.srcName);
    389385  pksrec.srcName   = pksrec.fieldName;
     386
     387  int namelen = pksrec.srcName.length() ;
     388  if ( namelen > 4 ) {
     389    String srcsub = pksrec.srcName.substr( namelen-4, 4 ) ;
     390    if ( srcsub.find( "_psc" ) != string::npos ) {
     391      pksrec.fieldName = pksrec.srcName.substr( 0, namelen-4 ) ;
     392      pksrec.srcName = pksrec.fieldName + "_ps_calon" ;
     393    }
     394    else if ( srcsub.find( "_pso" ) != string::npos ) {
     395      pksrec.fieldName = pksrec.srcName.substr( 0, namelen-4 ) ;
     396      pksrec.srcName = pksrec.fieldName + "_ps" ;
     397    }
     398    else if ( srcsub.find( "_prc" ) != string::npos ) {
     399      pksrec.fieldName = pksrec.srcName.substr( 0, namelen-4 ) ;
     400      pksrec.srcName = pksrec.fieldName + "_psr_calon" ;
     401    }
     402    else if ( srcsub.find( "_pro" ) != string::npos ) {
     403      pksrec.fieldName = pksrec.srcName.substr( 0, namelen-4 ) ;
     404      pksrec.srcName = pksrec.fieldName + "_psr" ;
     405    }
     406    else if ( srcsub.find( "_fsc" ) != string::npos ) {
     407      pksrec.fieldName = pksrec.srcName.substr( 0, namelen-4 ) ;
     408      pksrec.srcName = pksrec.fieldName + "_fs_calon" ;
     409    }
     410    else if ( srcsub.find( "_fso" ) != string::npos ) {
     411      pksrec.fieldName = pksrec.srcName.substr( 0, namelen-4 ) ;
     412      pksrec.srcName = pksrec.fieldName + "_fs" ;
     413    }
     414    else if ( srcsub.find( "_frc" ) != string::npos ) {
     415      pksrec.fieldName = pksrec.srcName.substr( 0, namelen-4 ) ;
     416      pksrec.srcName = pksrec.fieldName + "_fsr_calon" ;
     417    }
     418    else if ( srcsub.find( "_fro" ) != string::npos ) {
     419      pksrec.fieldName = pksrec.srcName.substr( 0, namelen-4 ) ;
     420      pksrec.srcName = pksrec.fieldName + "_fsr" ;
     421    }
     422    else if ( srcsub.find( "_nsc" ) != string::npos || srcsub.find( "_nrc" ) != string::npos ) {
     423      pksrec.fieldName = pksrec.srcName.substr( 0, namelen-4 ) ;
     424      pksrec.srcName = pksrec.fieldName + "_nod_calon" ;
     425    }
     426    else if ( srcsub.find( "_nso" ) != string::npos || srcsub.find( "_nro" ) != string::npos ) {
     427      pksrec.fieldName = pksrec.srcName.substr( 0, namelen-4 ) ;
     428      pksrec.srcName = pksrec.fieldName + "_nod" ;
     429    }
     430  }
    390431
    391432  pksrec.srcDir.resize(2);
     
    396437  pksrec.srcPM(0)  = 0.0;
    397438  pksrec.srcPM(1)  = 0.0;
    398   pksrec.srcVel    = 0.0;
     439  pksrec.srcVel    = cMBrec.srcVelocity;
    399440  pksrec.obsType   = trim(cMBrec.obsType);
    400441
     
    404445  pksrec.bandwidth = chanWidth * nChan;
    405446  pksrec.freqInc   = cMBrec.fqDelt[0];
    406   pksrec.restFreq  = cMBrec.restFreq;
     447  pksrec.restFreq.resize(1) ;
     448  pksrec.restFreq(0)  = cMBrec.restFreq;
    407449
    408450  pksrec.tcal.resize(nPol);
     
    498540{
    499541  cReader->close();
    500   logMsg(cReader->getMsg());
    501   cReader->clearMsg();
     542  //logMsg(cReader->getMsg());
     543  //cReader->clearMsg();
    502544}
    503545
  • branches/mergetest/external/atnf/PKSIO/PKSFITSreader.h

    r1720 r1779  
    7070    virtual ~PKSFITSreader();
    7171
    72     // Set message disposition.
    73     virtual Int setMsg(
    74         FILE *fd = 0x0);
    75 
    7672    // Open the FITS file for reading.
    7773    virtual Int open(
    7874        const String fitsName,
     75        const String antenna,
    7976        Vector<Bool> &beams,
    8077        Vector<Bool> &IFs,
     
    114111        const Bool getSpectra = True,
    115112        const Bool getXPol    = False,
     113        const Bool getFeedPos = False,
     114        const Bool getPointing = False,
    116115        const Int  coordSys   = 0);
    117116
  • branches/mergetest/external/atnf/PKSIO/PKSMS2reader.cc

    r1720 r1779  
    3434//#---------------------------------------------------------------------------
    3535
    36 #include <atnf/pks/pks_maths.h>
    37 #include <atnf/PKSIO/PKSmsg.h>
    38 #include <atnf/PKSIO/PKSrecord.h>
    39 #include <atnf/PKSIO/PKSMS2reader.h>
    40 
     36// AIPS++ includes.
    4137#include <casa/stdio.h>
    4238#include <casa/Arrays/ArrayMath.h>
     
    4440#include <ms/MeasurementSets/MSColumns.h>
    4541#include <tables/Tables.h>
     42#include <casa/Quanta/MVTime.h>
     43#include <casa/Quanta/MVAngle.h>
     44#include <casa/BasicMath/Math.h>
     45#include <casa/Logging/LogIO.h>
     46#include <casa/Utilities/Sort.h>
     47#include <measures/Measures/MeasConvert.h>
     48#include <measures/Measures/MEpoch.h>
     49#include <measures/Measures/MeasRef.h>
     50
     51
     52// Parkes includes.
     53#include <atnf/pks/pks_maths.h>
     54#include <atnf/PKSIO/PKSrecord.h>
     55#include <atnf/PKSIO/PKSMS2reader.h>
     56
    4657
    4758//------------------------------------------------- PKSMS2reader::PKSMS2reader
     
    5263{
    5364  cMSopen = False;
    54 
    55   // By default, messages are written to stderr.
    56   initMsg();
    5765}
    5866
     
    7078Int PKSMS2reader::open(
    7179        const String msName,
     80        const String antenna,
    7281        Vector<Bool> &beams,
    7382        Vector<Bool> &IFs,
     
    8897
    8998  cPKSMS  = MeasurementSet(msName);
     99
     100  // data selection by antenna
     101  if ( antenna.length() == 0 ) {
     102    cAntId.resize( 1 ) ;
     103    cAntId[0] = 0 ;
     104  }
     105  else {
     106    setupAntennaList( antenna ) ;
     107    if ( cAntId.size() > 1 ) {
     108      LogIO os( LogOrigin( "PKSMS2reader", "open()", WHERE ) ) ;
     109      os << LogIO::WARN << "PKSMS2reader is not ready for multiple antenna selection. Use first antenna id " << cAntId[0] << "."<< LogIO::POST ;
     110      Int tmp = cAntId[0] ;
     111      cAntId.resize( 1 ) ;
     112      cAntId[0] = tmp ;
     113    }
     114    stringstream ss ;
     115    ss << "SELECT FROM $1 WHERE ANTENNA1 == ANTENNA2 && ANTENNA1 IN [" ;
     116    for ( uInt i = 0 ; i < cAntId.size() ; i++ ) {
     117      ss << cAntId[i] ;
     118      if ( i == cAntId.size()-1 ) {
     119        ss << "]" ;
     120      }
     121      else {
     122        ss << "," ;
     123      }
     124    }
     125    string taql = ss.str() ;
     126    //cerr << "taql = " << taql << endl ;
     127    cPKSMS = MeasurementSet( tableCommand( taql, cPKSMS ) ) ;
     128  }
     129
     130  // taql access to the syscal table
     131  cHaveSysCal = False;
     132  if (cHaveSysCal=Table::isReadable(cPKSMS.sysCalTableName())) {
     133    cSysCalTab = Table(cPKSMS.sysCalTableName());
     134  }
     135
     136  // Lock the table for read access.
     137  cPKSMS.lock(False);
     138
    90139  cIdx    = 0;
     140  lastmjd = 0.0;
    91141  cNRow   = cPKSMS.nrow();
    92142  cMSopen = True;
    93 
    94   // Lock the table for read access.
    95   cPKSMS.lock(False);
    96143
    97144  // Main MS table and subtable column access.
     
    107154  ROMSSysCalColumns       sysCalCols(cPKSMS.sysCal());
    108155  ROMSWeatherColumns      weatherCols(cPKSMS.weather());
     156  ROMSAntennaColumns      antennaCols(cPKSMS.antenna());
    109157
    110158  // Column accessors for required columns.
     
    115163  cFieldIdCol.reference(msCols.fieldId());
    116164  cFieldNameCol.reference(fieldCols.name());
     165  cFieldDelayDirCol.reference(fieldCols.delayDir());
    117166
    118167  cSrcIdCol.reference(fieldCols.sourceId());
     168  cSrcId2Col.reference(sourceCols.sourceId());
    119169  cSrcNameCol.reference(sourceCols.name());
    120170  cSrcDirCol.reference(sourceCols.direction());
     
    124174  cStateIdCol.reference(msCols.stateId());
    125175  cObsModeCol.reference(stateCols.obsMode());
     176  cCalCol.reference(stateCols.cal());
     177  cSigStateCol.reference(stateCols.sig());
     178  cRefStateCol.reference(stateCols.ref());
    126179
    127180  cDataDescIdCol.reference(msCols.dataDescId());
     181  cSpWinIdCol.reference(dataDescCols.spectralWindowId());
    128182  cChanFreqCol.reference(spWinCols.chanFreq());
     183  cTotBWCol.reference(spWinCols.totalBandwidth());
    129184
    130185  cWeatherTimeCol.reference(weatherCols.time());
     
    135190  cBeamNoCol.reference(msCols.feed1());
    136191  cPointingCol.reference(pointingCols.direction());
     192  cPointingTimeCol.reference(pointingCols.time());
    137193  cSigmaCol.reference(msCols.sigma());
    138194  cNumReceptorCol.reference(feedCols.numReceptors());
    139195
    140196  // Optional columns.
     197  cHaveTsys = False;
     198  cHaveTcal = False;
    141199  if ((cHaveSrcVel = cPKSMS.source().tableDesc().isColumn("SYSVEL"))) {
    142200    cSrcVelCol.attach(cPKSMS.source(), "SYSVEL");
    143201  }
    144202
    145   if ((cHaveTsys = cPKSMS.sysCal().tableDesc().isColumn("TSYS"))) {
     203  if (cHaveSysCal && (cHaveTsys = cPKSMS.sysCal().tableDesc().isColumn("TSYS"))) {
    146204    cTsysCol.attach(cPKSMS.sysCal(), "TSYS");
     205  }
     206 
     207  if (cHaveSysCal && (cHaveTcal = cPKSMS.sysCal().tableDesc().isColumn("TCAL"))) {
     208    cTcalCol.attach(cPKSMS.sysCal(), "TCAL");
    147209  }
    148210
     
    158220  // Spectral data should always be present.
    159221  haveSpectra = True;
    160   cFloatDataCol.reference(msCols.floatData());
     222  cHaveDataCol = False;
     223  cHaveCorrectedDataCol = False;
     224  ROMSObservationColumns observationCols(cPKSMS.observation());
     225  //String telName = observationCols.telescopeName()(0);
     226  cTelName = observationCols.telescopeName()(0);
     227  //cATF = cTelName.contains("ATF");
     228  //cOSF = cTelName.contains("OSF");
     229  //cALMA = cTelName.contains("ALMA");
     230  cALMA = cTelName.contains("ATF")||cTelName.contains("OSF")||
     231           cTelName.contains("ALMA");
     232
     233  if (cHaveDataCol = cPKSMS.isColumn(MSMainEnums::DATA)) {
     234    if (cALMA) {
     235      //try to read a single baseline interferometeric data
     236      //and treat it as single dish data
     237      //maybe extended for ALMA commissioning later
     238      cDataCol.reference(msCols.data());
     239      if (cHaveCorrectedDataCol = cPKSMS.isColumn(MSMainEnums::CORRECTED_DATA)) {
     240        //cerr<<"Do have CORRECTED_DATA column"<<endl;
     241        cCorrectedDataCol.reference(msCols.correctedData());
     242      }
     243    }
     244  }
     245  else {
     246    cFloatDataCol.reference(msCols.floatData());
     247  }
    161248  cFlagCol.reference(msCols.flag());
    162 
    163   if ((cGetXPol = cPKSMS.isColumn(MSMainEnums::DATA))) {
     249  cFlagRowCol.reference(msCols.flagRow());
     250
     251  if (cGetXPol = (cPKSMS.isColumn(MSMainEnums::DATA) && (!cALMA))) {
    164252    if ((cHaveXCalFctr = cPKSMS.tableDesc().isColumn("XCALFCTR"))) {
    165253      cXCalFctrCol.attach(cPKSMS, "XCALFCTR");
     
    181269
    182270  // Number of IFs.
    183   uInt nIF = dataDescCols.nrow();
     271  //uInt nIF = dataDescCols.nrow();
     272  uInt nIF =spWinCols.nrow();
     273  Vector<Int> spWinIds = cSpWinIdCol.getColumn() ;
    184274  IFs.resize(nIF);
    185275  IFs = True;
     276  for ( Int ispw = 0 ; ispw < nIF ; ispw++ ) {
     277    if ( allNE( ispw, spWinIds ) ) {
     278      IFs(ispw) = False ;
     279    }
     280  }
    186281
    187282  // Number of polarizations and channels in each IF.
    188   ROScalarColumn<Int> spWinIdCol(dataDescCols.spectralWindowId());
    189283  ROScalarColumn<Int> numChanCol(spWinCols.numChan());
    190284
     
    195289  nPol.resize(nIF);
    196290  for (uInt iIF = 0; iIF < nIF; iIF++) {
    197     nChan(iIF) = numChanCol(spWinIdCol(iIF));
    198     nPol(iIF)  = numPolCol(polIdCol(iIF));
     291    if ( IFs(iIF) ) {
     292      nChan(iIF) = numChanCol(cSpWinIdCol(iIF)) ;
     293      nPol(iIF) = numPolCol(polIdCol(iIF)) ;
     294    }
     295    else {
     296      nChan(iIF) = 0 ;
     297      nPol(iIF) = 0 ;
     298    }
    199299  }
    200300
     
    203303  haveXPol = False;
    204304
    205   if (cGetXPol) {
     305  if (cGetXPol && !(cALMA)) {
    206306    for (Int irow = 0; irow < cNRow; irow++) {
    207307      if (cDataCol.isDefined(irow)) {
     
    252352        String &antName,
    253353        Vector<Double> &antPosition,
     354        // before merge...
     355        //String &obsMode,
    254356        String &obsType,
    255357        String &bunit,
     
    258360        Double &mjd,
    259361        Double &refFreq,
    260         Double &bandwidth)
     362        Double &bandwidth) 
    261363{
    262364  if (!cMSopen) {
     
    271373  // Antenna name and ITRF coordinates.
    272374  ROMSAntennaColumns antennaCols(cPKSMS.antenna());
    273   antName = antennaCols.name()(0);
    274   antPosition = antennaCols.position()(0);
     375  //antName = antennaCols.name()(0);
     376  antName = antennaCols.name()(cAntId[0]);
     377  if (cALMA) {
     378     antName = cTelName + "-" + antName;
     379  }
     380  //antPosition = antennaCols.position()(0);
     381  antPosition = antennaCols.position()(cAntId[0]);
    275382
    276383  // Observation type.
     
    282389  }
    283390
    284   // Brightness units.
    285   bunit = cPKSMS.unit(MSMainEnums::FLOAT_DATA);
    286 
     391  bunit = "";
     392  if (cHaveDataCol) {
     393    const TableRecord& keywordSet2
     394       = cDataCol.columnDesc().keywordSet();
     395    if(keywordSet2.isDefined("UNIT")) {
     396      bunit = keywordSet2.asString("UNIT");
     397    }
     398  } else {
     399    const TableRecord& keywordSet
     400       = cFloatDataCol.columnDesc().keywordSet();
     401    if(keywordSet.isDefined("UNIT")) {
     402      bunit = keywordSet.asString("UNIT");
     403    }
     404  }
     405
     406/***
     407  const TableRecord& keywordSet
     408       = cFloatDataCol.columnDesc().keywordSet();
     409  if(keywordSet.isDefined("UNIT")) {
     410    fluxunit = keywordSet.asString("UNIT");
     411  }
     412***/
    287413  // Coordinate equinox.
    288414  ROMSPointingColumns pointingCols(cPKSMS.pointing());
    289415  String dirref = pointingCols.direction().keywordSet().asRecord("MEASINFO").
    290416                    asString("Ref");
     417  cDirRef = dirref;
     418  if (dirref =="AZELGEO" || dirref == "AZEL") {
     419     dirref = "J2000";
     420  }
    291421  sscanf(dirref.chars()+1, "%f", &equinox);
    292422
     
    357487        const Bool getSpectra,
    358488        const Bool getXPol,
     489        const Bool getFeedPos,
     490        const Bool getPointing,
    359491        const Int  coordSys)
    360492{
     
    436568  cGetXPol = cGetXPol && getXPol;
    437569
     570  // Get feed positions?  (Not available.)
     571  cGetFeedPos = False;
     572
     573  // Get Pointing data (for MS)
     574  cGetPointing = getPointing;
     575
    438576  // Coordinate system?  (Only equatorial available.)
    439577  cCoordSys = 0;
     
    490628// Read the next data record.
    491629
     630/**
     631Int PKSMS2reader::read(
     632        Int             &scanNo,
     633        Int             &cycleNo,
     634        Double          &mjd,
     635        Double          &interval,
     636        String          &fieldName,
     637        String          &srcName,
     638        Vector<Double>  &srcDir,
     639        Vector<Double>  &srcPM,
     640        Double          &srcVel,
     641        String          &obsMode,
     642        Int             &IFno,
     643        Double          &refFreq,
     644        Double          &bandwidth,
     645        Double          &freqInc,
     646        Vector<Double>  &restFreq,
     647        Vector<Float>   &tcal,
     648        String          &tcalTime,
     649        Float           &azimuth,
     650        Float           &elevation,
     651        Float           &parAngle,
     652        Float           &focusAxi,
     653        Float           &focusTan,
     654        Float           &focusRot,
     655        Float           &temperature,
     656        Float           &pressure,
     657        Float           &humidity,
     658        Float           &windSpeed,
     659        Float           &windAz,
     660        Int             &refBeam,
     661        Int             &beamNo,
     662        Vector<Double>  &direction,
     663        Vector<Double>  &scanRate,
     664        Vector<Float>   &tsys,
     665        Vector<Float>   &sigma,
     666        Vector<Float>   &calFctr,
     667        Matrix<Float>   &baseLin,
     668        Matrix<Float>   &baseSub,
     669        Matrix<Float>   &spectra,
     670        Matrix<uChar>   &flagged,
     671        uInt            &flagrow,
     672        Complex         &xCalFctr,
     673        Vector<Complex> &xPol)
     674**/
    492675Int PKSMS2reader::read(PKSrecord &pksrec)
    493676{
     677  LogIO os( LogOrigin( "PKSMS2reader", "read()", WHERE ) ) ;
     678
    494679  if (!cMSopen) {
    495680    return 1;
     
    504689  Int ibeam;
    505690  Int iIF;
     691  Int iDataDesc;
     692
    506693  while (True) {
    507694    ibeam = cBeamNoCol(cIdx);
    508     iIF   = cDataDescIdCol(cIdx);
     695    iDataDesc   = cDataDescIdCol(cIdx);
     696    iIF   =cSpWinIdCol(iDataDesc);
    509697    if (cBeams(ibeam) && cIFs(iIF)) {
    510698      break;
     
    516704    }
    517705  }
    518 
    519706  // Renumerate scan no. Here still is 1-based
    520   pksrec.scanNo = cScanNoCol(cIdx) - cScanNoCol(0) + 1;
     707  //scanNo = cScanNoCol(cIdx) - cScanNoCol(0) + 1;
     708  //scanNo = cScanNoCol(cIdx);
     709  pksrec.scanNo = cScanNoCol(cIdx);
    521710
    522711  if (pksrec.scanNo != cScanNo) {
     
    542731
    543732  Int srcId = cSrcIdCol(fieldId);
    544   pksrec.srcName = cSrcNameCol(srcId);
     733  //For source with multiple spectral window setting, this is not
     734  // correct. Source name of srcId may not be at 'srcId'th row of SrcNameCol
     735  //srcName = cSrcNameCol(srcId);
     736  for (uInt irow = 0; irow < cSrcId2Col.nrow(); irow++) {
     737    if (cSrcId2Col(irow) == srcId) {
     738      //srcName = cSrcNameCol(irow);
     739      pksrec.srcName = cSrcNameCol(irow);
     740    }
     741  }
     742
    545743  pksrec.srcDir  = cSrcDirCol(srcId);
    546744  pksrec.srcPM   = cSrcPMCol(srcId);
    547745
    548746  // Systemic velocity.
    549   if (!cHaveSrcVel) {
     747  if (!cHaveSrcVel || cALMA) {
    550748    pksrec.srcVel = 0.0f;
    551749  } else {
     
    553751  }
    554752
     753  ROMSAntennaColumns antennaCols(cPKSMS.antenna());
     754  //String telescope = antennaCols.name()(0);
     755  String telescope = antennaCols.name()(cAntId[0]);
     756  Bool cGBT = telescope.contains("GBT");
     757  //Bool cPM = telescope.contains("PM"); // ACA TP antenna
     758  //Bool cDV = telescope.contains("DV"); // VERTEX
     759  //Bool cCM = telescope.contains("CM"); // ACA 7m antenna
     760  //Bool cALMA = cPM || cDV || cCM ;
    555761  // Observation type.
    556   Int stateId = cStateIdCol(cIdx);
    557   pksrec.obsType = cObsModeCol(stateId);
     762  // check if State Table exist
     763  //Bool cHaveStateTab=Table::isReadable(cPKSMS.stateTableName());
     764  Int stateId = 0;
     765  Int StateNRow = 0;
     766  StateNRow=cObsModeCol.nrow();
     767  if (Table::isReadable(cPKSMS.stateTableName())) {
     768        pksrec.obsType = " ";
     769    if (StateNRow > 0) {
     770      stateId = cStateIdCol(cIdx);
     771      if (stateId == -1) {
     772        //pksrec.obsType = " ";
     773      } else {
     774        pksrec.obsType = cObsModeCol(stateId);
     775        Bool sigState =cSigStateCol(stateId);
     776        Bool refState =cRefStateCol(stateId);
     777        //DEBUG
     778        //cerr <<"stateid="<<stateId<<" obsmode="<<pksrec.obsType<<endl;
     779        if (cGBT) {
     780          // split the obsType string and append a proper label
     781          // (these are GBT specific)
     782          int epos = pksrec.obsType.find_first_of(':');
     783          int nextpos = pksrec.obsType.find_first_of(':',epos+1);
     784          string obsMode1 = pksrec.obsType.substr(0,epos);
     785          string obsMode2 = pksrec.obsType.substr(epos+1,nextpos-epos-1);
     786     
     787          //cerr <<"obsMode2= "<<obsMode2<<endl;
     788          if (!pksrec.srcName.contains("_ps")
     789              &&!pksrec.srcName.contains("_psr")
     790              &&!pksrec.srcName.contains("_nod")
     791              &&!pksrec.srcName.contains("_fs")
     792              &&!pksrec.srcName.contains("_fsr")) {
     793            // if Nod mode observation , append '_nod'
     794            if (obsMode1 == "Nod") {
     795              //pksrec.srcName.append("_nod");
     796              pksrec.srcType = SrcType::NOD ;
     797            } else if (obsMode1 == "OffOn") {
     798            // for GBT position switch observations (OffOn or OnOff)
     799              //if (obsMode2 == "PSWITCHON") pksrec.srcName.append("_ps");
     800              //if (obsMode2 == "PSWITCHOFF") pksrec.srcName.append("_psr");
     801              if (obsMode2 == "PSWITCHON") pksrec.srcType = SrcType::PSON ;
     802              if (obsMode2 == "PSWITCHOFF") pksrec.srcType = SrcType::PSOFF ;
     803            } else {
     804              if (obsMode2 == "FSWITCH") {
     805              // for GBT frequency switch mode
     806                //if (sigState) pksrec.srcName.append("_fs");
     807                //if (refState) pksrec.srcName.append("_fsr");
     808                if (sigState) pksrec.srcType = SrcType::FSON ;
     809                if (refState) pksrec.srcType = SrcType::FSOFF ;
     810              }
     811            }
     812          }
     813        }
     814        else if (cALMA) {
     815          // ALMA tag
     816          // split the obsType string and append a proper label
     817          string substr[1] ;
     818          int numSubstr = split( pksrec.obsType, substr, 1, "," );
     819          String obsType = String( substr[0] );
     820          int epos = obsType.find_first_of('.');
     821          int nextpos = obsType.find_first_of('.',epos+1);
     822          string obsMode1 = obsType.substr(0,epos);
     823          string obsMode2 = obsType.substr(epos+1,nextpos-epos-1);
     824     
     825          //cerr <<"obsMode2= "<<obsMode2<<endl;
     826          // Current OBS_MODE format:
     827          //
     828          //     ON: OBSERVE_TARGET.ON_SOURCE
     829          //    OFF: OBSERVE_TARGET.OFF_SOURCE
     830          //
     831          if (obsMode1 == "OBSERVE_TARGET") {
     832            //if (obsMode2 == "ON_SOURCE") pksrec.srcName.append("_pson");
     833            //if (obsMode2 == "OFF_SOURCE") pksrec.srcName.append("_psoff");
     834            if (obsMode2 == "ON_SOURCE") pksrec.srcType = SrcType::PSON ;
     835            if (obsMode2 == "OFF_SOURCE") pksrec.srcType = SrcType::PSOFF ;
     836          }
     837        }
     838      }
     839    }
     840  }
     841  // CAL state
     842  // this should be apply just for GBT data?
     843  Double Cal;
     844  if (stateId==-1 || StateNRow==0) {
     845    Cal = 0;
     846  } else {
     847    Cal = cCalCol(stateId);
     848  }
     849  if (cGBT) {
     850    if (Cal > 0 && !pksrec.srcName.contains("_calon")) {
     851      //pksrec.srcName.append("_calon");
     852      if ( pksrec.srcType == SrcType::NOD )
     853        pksrec.srcType = SrcType::NODCAL ;
     854      else if ( pksrec.srcType == SrcType::PSON )
     855        pksrec.srcType = SrcType::PONCAL ;
     856      else if ( pksrec.srcType == SrcType::PSOFF )
     857        pksrec.srcType = SrcType::POFFCAL ;
     858      else if ( pksrec.srcType == SrcType::FSON )
     859        pksrec.srcType = SrcType::FONCAL ;
     860      else if ( pksrec.srcType == SrcType::FSOFF )
     861        pksrec.srcType = SrcType::FOFFCAL ;
     862      else
     863        pksrec.srcName.append("_calon");
     864    }
     865  }
    558866
    559867  pksrec.IFno = iIF + 1;
    560868  Int nChan = abs(cEndChan(iIF) - cStartChan(iIF)) + 1;
    561 
     869 
    562870  // Minimal handling on continuum data.
    563871  Vector<Double> chanFreq = cChanFreqCol(iIF);
     872  pksrec.nchan = nChan;
    564873  if (nChan == 1) {
    565     cout << "The input is continuum data. "<< endl;
    566     pksrec.freqInc  = chanFreq(0);
     874    //pksrec.freqInc  = chanFreq(0);
     875    pksrec.freqInc  = cTotBWCol(iIF);
    567876    pksrec.refFreq  = chanFreq(0);
    568     pksrec.restFreq = 0.0f;
     877    pksrec.restFreq.resize(1);
     878    pksrec.restFreq[0] = 0.0f;
    569879  } else {
     880 
    570881    if (cStartChan(iIF) <= cEndChan(iIF)) {
    571882      pksrec.freqInc = chanFreq(1) - chanFreq(0);
     
    575886
    576887    pksrec.refFreq  = chanFreq(cRefChan(iIF)-1);
    577     pksrec.restFreq = cSrcRestFrqCol(srcId)(IPosition(1,0));
    578   }
    579   pksrec.bandwidth = abs(pksrec.freqInc * nChan);
     888
     889    Bool HaveSrcRestFreq= cSrcRestFrqCol.isDefined(srcId);
     890    if (HaveSrcRestFreq) {
     891      //restFreq = cSrcRestFrqCol(srcId)(IPosition(1,0));
     892      //restFreq = cSrcRestFrqCol(srcId);
     893      pksrec.restFreq = cSrcRestFrqCol(srcId);
     894    } else {
     895      pksrec.restFreq.resize(1);
     896      pksrec.restFreq[0] = 0.0f;
     897    }
     898  }
     899  //pksrec.bandwidth = abs(pksrec.freqInc * nChan);
     900  pksrec.bandwidth = abs(cTotBWCol(0));
    580901
    581902  pksrec.tcal.resize(cNPol(iIF));
    582903  pksrec.tcal      = 0.0f;
    583904  pksrec.tcalTime  = "";
    584   pksrec.azimuth   = 0.0f;
    585   pksrec.elevation = 0.0f;
     905//  pksrec.azimuth   = 0.0f;
     906//  pksrec.elevation = 0.0f;
    586907  pksrec.parAngle  = 0.0f;
    587908
     
    591912
    592913  // Find the appropriate entry in the WEATHER subtable.
    593   Vector<Double> wTimes = cWeatherTimeCol.getColumn();
    594   Int weatherIdx;
    595   for (weatherIdx = wTimes.nelements()-1; weatherIdx >= 0; weatherIdx--) {
    596     if (cWeatherTimeCol(weatherIdx) <= time) {
    597       break;
    598     }
    599   }
    600 
    601   if (weatherIdx < 0) {
     914  //Bool cHaveStateTab=Table::isReadable(cPKSMS.stateTableName());
     915  Bool cHaveWeatherTab = Table::isReadable(cPKSMS.weatherTableName());
     916  Int weatherIdx=-1;
     917  if (cHaveWeatherTab) {
     918    Vector<Double> wTimes = cWeatherTimeCol.getColumn();
     919    for (weatherIdx = wTimes.nelements()-1; weatherIdx >= 0; weatherIdx--) {
     920      if (cWeatherTimeCol(weatherIdx) <= time) {
     921        break;
     922      }
     923    }
     924  }
     925
     926  if (weatherIdx < 0 || !cHaveWeatherTab) {
    602927    // No appropriate WEATHER entry.
    603928    pksrec.temperature = 0.0f;
     
    616941  pksrec.beamNo  = ibeam + 1;
    617942
    618   Matrix<Double> pointingDir = cPointingCol(fieldId);
    619   pksrec.direction = pointingDir.column(0);
     943  //pointing/azel
     944  MVPosition mvpos(antennaCols.position()(cAntId[0]));
     945  MPosition mp(mvpos);
     946  Quantum<Double> qt(time,"s");
     947  MVEpoch mvt(qt);
     948  MEpoch me(mvt);
     949  MeasFrame frame(mp, me);
     950  MDirection md;
    620951  pksrec.pCode = 0;
    621952  pksrec.rateAge = 0.0f;
    622   uInt ncols = pointingDir.ncolumn();
    623   if (ncols == 1) {
    624     pksrec.scanRate = 0.0f;
    625   } else {
    626     pksrec.scanRate(0) = pointingDir.column(1)(0);
    627     pksrec.scanRate(1) = pointingDir.column(1)(1);
    628   }
    629953  pksrec.paRate = 0.0f;
     954  if (cGetPointing) {
     955    //cerr << "get pointing data ...." << endl;
     956    ROScalarColumn<Int> pAntIdCol ;
     957    ROScalarColumn<Double> psTimeCol ;
     958    Table ptTable = cPKSMS.pointing() ;
     959    MSPointing selPtTab( ptTable( ptTable.col("ANTENNA_ID") == cAntId[0] ) ) ;
     960    pAntIdCol.attach( selPtTab, "ANTENNA_ID" ) ;
     961    Vector<Int> antIds = pAntIdCol.getColumn() ;
     962    psTimeCol.attach( selPtTab, "TIME" ) ;
     963    Vector<Double> pTimes = psTimeCol.getColumn();
     964    Bool doInterp = False ;
     965    Int PtIdx=-1;
     966    for (PtIdx = pTimes.nelements()-1; PtIdx >= 0; PtIdx--) {
     967      if ( pTimes[PtIdx] == time ) {
     968        break ;
     969      }
     970      else if ( pTimes[PtIdx] < time ) {
     971        if ( PtIdx != pTimes.nelements()-1 ) {
     972          doInterp = True ;
     973        }
     974        break ;
     975      }
     976    }
     977    if ( PtIdx == -1 ) {
     978      PtIdx = 0 ;
     979    }
     980    //cerr << "got index=" << PtIdx << endl;
     981    Matrix<Double> pointingDir = cPointingCol(PtIdx);
     982    ROMSPointingColumns PtCols( selPtTab ) ;
     983    Vector<Double> pointingDirVec ;
     984    if ( doInterp ) {
     985      Double dt1 = time - pTimes[PtIdx] ;
     986      Double dt2 = pTimes[PtIdx+1] - time ;
     987      Vector<Double> dirVec1 = pointingDir.column(0) ;
     988      Matrix<Double> pointingDir2 = cPointingCol(PtIdx+1) ;
     989      Vector<Double> dirVec2 = pointingDir2.column(0) ;
     990      pointingDirVec = (dt1*dirVec2+dt2*dirVec1)/(dt1+dt2) ;
     991      Vector<MDirection> vmd1(1) ;
     992      Vector<MDirection> vmd2(1) ;
     993      PtCols.directionMeasCol().get(PtIdx,vmd1) ;
     994      Vector<Double> angle1 = vmd1(0).getAngle().getValue("rad") ;
     995      PtCols.directionMeasCol().get(PtIdx+1,vmd2) ;
     996      Vector<Double> angle2 = vmd2(0).getAngle().getValue("rad") ;
     997      Vector<Double> angle = (dt1*angle2+dt2*angle1)/(dt1+dt2) ;
     998      Quantum< Vector<Double> > qangle( angle, "rad" ) ;
     999      String typeStr = vmd1(0).getRefString() ;
     1000      //cerr << "vmd1.getRefString()=" << typeStr << endl ;
     1001      MDirection::Types mdType ;
     1002      MDirection::getType( mdType, typeStr ) ;
     1003      //cerr << "mdType=" << mdType << endl ;
     1004      md = MDirection( qangle, mdType ) ;
     1005      //cerr << "md=" << md.getAngle().getValue("rad") << endl ;
     1006    }
     1007    else {
     1008      pointingDirVec = pointingDir.column(0) ;
     1009      Vector<MDirection> vmd(1);
     1010      PtCols.directionMeasCol().get(PtIdx,vmd);
     1011      md = vmd[0];
     1012    }
     1013    // put J2000 coordinates in "direction"
     1014    if (cDirRef =="J2000") {
     1015      pksrec.direction = pointingDirVec ;
     1016    }
     1017    else {
     1018      pksrec.direction =
     1019        MDirection::Convert(md, MDirection::Ref(MDirection::J2000,
     1020                                                frame)
     1021                            )().getAngle("rad").getValue();
     1022     
     1023    }
     1024    uInt ncols = pointingDir.ncolumn();
     1025    pksrec.scanRate.resize(2);
     1026    if (ncols == 1) {
     1027      pksrec.scanRate = 0.0f;
     1028    } else {
     1029      pksrec.scanRate(0) = pointingDir.column(1)(0);
     1030      pksrec.scanRate(1) = pointingDir.column(1)(1);
     1031    }
     1032  }
     1033  else {
     1034  // Get direction from FIELD table
     1035  // here, assume direction to be the field direction not pointing
     1036    Matrix<Double> delayDir = cFieldDelayDirCol(fieldId);
     1037    pksrec.direction = delayDir.column(0);
     1038    uInt ncols = delayDir.ncolumn();
     1039    pksrec.scanRate.resize(2);
     1040    if (ncols == 1) {
     1041      pksrec.scanRate = 0.0f;
     1042    } else {
     1043      pksrec.scanRate(0)  = delayDir.column(1)(0);
     1044      pksrec.scanRate(1)  = delayDir.column(1)(1);
     1045    }
     1046  }
     1047  // caluculate azimuth and elevation
     1048  // first, get the reference frame
     1049 /**
     1050  MVPosition mvpos(antennaCols.position()(0));
     1051  MPosition mp(mvpos);
     1052  Quantum<Double> qt(time,"s");
     1053  MVEpoch mvt(qt);
     1054  MEpoch me(mvt);
     1055  MeasFrame frame(mp, me);
     1056  **/
     1057  //
     1058  ROMSFieldColumns fldCols(cPKSMS.field());
     1059  Vector<MDirection> vmd(1);
     1060  //MDirection md;
     1061  fldCols.delayDirMeasCol().get(fieldId,vmd);
     1062  md = vmd[0];
     1063  //Vector<Double> dircheck = md.getAngle("rad").getValue();
     1064  //cerr<<"dircheck="<<dircheck<<endl;
     1065
     1066  Vector<Double> azel =
     1067        MDirection::Convert(md, MDirection::Ref(MDirection::AZEL,
     1068                                                frame)
     1069                            )().getAngle("rad").getValue();
     1070  //cerr<<"azel="<<azel<<endl;
     1071  pksrec.azimuth = azel[0];
     1072  pksrec.elevation = azel[1];
    6301073
    6311074  // Get Tsys assuming that entries in the SYSCAL table match the main table.
     
    6461089  cSigmaCol.get(cIdx, pksrec.sigma, True);
    6471090
     1091  //get Tcal if available
     1092  if (cHaveTcal) {
     1093    Int nTcalColRow = cTcalCol.nrow();
     1094    uInt nBeam = cBeams.nelements();
     1095    uInt nIF = cIFs.nelements();
     1096    uInt nrws = nBeam * nIF;
     1097    if (nTcalColRow > 0) { 
     1098    // find tcal match with the data with the data time stamp
     1099      Double mjds = pksrec.mjd*(24*3600);
     1100      Double dtcalTime;
     1101      if ( pksrec.mjd > lastmjd || cIdx==0 ) {
     1102        //Table tmptab = cSysCalTab(near(cSysCalTab.col("TIME"),mjds));
     1103        tmptab = cSysCalTab(near(cSysCalTab.col("TIME"),mjds), nrws);
     1104        //DEBUG
     1105        //if (cIdx == 0) {
     1106        //  cerr<<"inital table retrieved"<<endl;
     1107        //}
     1108       
     1109      }
     1110
     1111      if (nBeam == 1) {
     1112        tmptab2 = tmptab( tmptab.col("SPECTRAL_WINDOW_ID") == iIF, 1);
     1113      } else {
     1114        tmptab2 = tmptab( tmptab.col("SPECTRAL_WINDOW_ID") == iIF &&
     1115                              tmptab.col("FEED_ID") == ibeam , 1);
     1116      }
     1117      //cerr<<"first subtab rows="<<tmptab.nrow()<<endl;
     1118      int syscalrow = tmptab2.nrow();
     1119      ROArrayColumn<Float> tcalCol(tmptab2, "TCAL");
     1120      ROScalarColumn<Double> tcalTimeCol(tmptab2, "TIME");
     1121      if (syscalrow==0) {
     1122        os << LogIO::NORMAL
     1123           <<"Cannot find any matching Tcal at/near the data timestamp."
     1124           << " Set Tcal=0.0" << LogIO::POST ;
     1125      } else {
     1126        tcalCol.get(0, pksrec.tcal);
     1127        tcalTimeCol.get(0,dtcalTime);
     1128        pksrec.tcalTime = MVTime(dtcalTime/(24*3600)).string(MVTime::YMD);
     1129        //DEBUG
     1130        //cerr<<"cIdx:"<<cIdx<<" tcal="<<tcal<<" tcalTime="<<tcalTime<<endl;
     1131        tmptab.markForDelete();
     1132        tmptab2.markForDelete();
     1133      }
     1134    }
     1135    lastmjd = pksrec.mjd;
     1136  }
     1137
    6481138  // Calibration factors (if available).
    6491139  pksrec.calFctr.resize(cNPol(iIF));
     
    6721162    Matrix<Float> tmpData;
    6731163    Matrix<Bool>  tmpFlag;
    674     cFloatDataCol.getSlice(cIdx, cDataSel(iIF), tmpData, True);
     1164    if (cHaveDataCol) {
     1165      Matrix<Complex> tmpCmplxData;
     1166      Matrix<Float> tmpReData;
     1167      Matrix<Float> tmpImData;
     1168      //cerr<<"reading spectra..."<<endl;
     1169      //# TODO - should have a flag to user to select DATA or CORRECTED_DATA
     1170      //# currently just automatically determined, --- read CORRECTED one
     1171      //# if the column exist.
     1172      if (cHaveCorrectedDataCol) {
     1173        cCorrectedDataCol.getSlice(cIdx, cDataSel(iIF), tmpCmplxData, True);
     1174      } else {
     1175        cDataCol.getSlice(cIdx, cDataSel(iIF), tmpCmplxData, True);
     1176      }
     1177      tmpReData = real(tmpCmplxData);
     1178      tmpImData = imag(tmpCmplxData);
     1179      tmpData = sqrt(tmpReData*tmpReData + tmpImData*tmpImData);
     1180    } else {
     1181      cFloatDataCol.getSlice(cIdx, cDataSel(iIF), tmpData, True);
     1182    }
    6751183    cFlagCol.getSlice(cIdx, cDataSel(iIF), tmpFlag, True);
    6761184
     
    6981206      }
    6991207    }
     1208
     1209    // Row-based flagging info. (True:1, False:0)
     1210    pksrec.flagrow = (cFlagRowCol(cIdx) ? 1 : 0);
    7001211  }
    7011212
    7021213  // Get cross-polarization data.
    7031214  if (cGetXPol) {
     1215    //cerr<<"cGetXPol="<<cGetXPol<<endl;
     1216    //cerr<<"cHaveXCalFctr="<<cHaveXCalFctr<<endl;
     1217
    7041218    if (cHaveXCalFctr) {
    7051219      cXCalFctrCol.get(cIdx, pksrec.xCalFctr);
     
    7081222    }
    7091223
    710     cDataCol.get(cIdx, pksrec.xPol, True);
    711 
    712     if (cEndChan(iIF) < cStartChan(iIF)) {
    713       Complex ctmp;
     1224    if(!cALMA) {
     1225      cDataCol.get(cIdx, pksrec.xPol, True);
     1226
     1227      if (cEndChan(iIF) < cStartChan(iIF)) {
     1228        Complex ctmp;
     1229        Int jchan = nChan - 1;
     1230        for (Int ichan = 0; ichan < nChan/2; ichan++, jchan--) {
     1231          ctmp = pksrec.xPol(ichan);
     1232          pksrec.xPol(ichan) = pksrec.xPol(jchan);
     1233          pksrec.xPol(jchan) = ctmp;
     1234        }
     1235      }
     1236    }
     1237  }
     1238  /**
     1239  cerr<<"scanNo="<<scanNo<<endl;
     1240  cerr<<"cycleNo="<<cycleNo<<endl;
     1241  cerr<<"mjd="<<mjd<<endl;
     1242  cerr<<"interval="<<interval<<endl;
     1243  cerr<<"fieldName="<<fieldName<<endl;
     1244  cerr<<"srcNmae="<<srcName<<endl;
     1245  cerr<<"srcDir="<<srcDir<<endl;
     1246  cerr<<"srcPM="<<srcPM<<endl;
     1247  cerr<<"srcVel="<<srcVel<<endl;
     1248  cerr<<"obsMode="<<obsMode<<endl;
     1249  cerr<<"IFno="<<IFno<<endl;
     1250  cerr<<"refFreq="<<refFreq<<endl;
     1251  cerr<<"tcal="<<tcal<<endl;
     1252  cerr<<"direction="<<direction<<endl;
     1253  cerr<<"scanRate="<<scanRate<<endl;
     1254  cerr<<"tsys="<<tsys<<endl;
     1255  cerr<<"sigma="<<sigma<<endl;
     1256  cerr<<"calFctr="<<calFctr<<endl;
     1257  cerr<<"baseLin="<<baseLin<<endl;
     1258  cerr<<"baseSub="<<baseSub<<endl;
     1259  cerr<<"spectra="<<spectra.shape()<<endl;
     1260  cerr<<"flagged="<<flagged.shape()<<endl;
     1261  cerr<<"xCalFctr="<<xCalFctr<<endl;
     1262  cerr<<"xPol="<<xPol<<endl;
     1263  **/
     1264  cIdx++;
     1265
     1266  return 0;
     1267}
     1268
     1269//--------------------------------------------------------- PKSMS2reader::read
     1270
     1271// Read the next data record, just the basics.
     1272
     1273Int PKSMS2reader::read(
     1274        Int           &IFno,
     1275        Vector<Float> &tsys,
     1276        Vector<Float> &calFctr,
     1277        Matrix<Float> &baseLin,
     1278        Matrix<Float> &baseSub,
     1279        Matrix<Float> &spectra,
     1280        Matrix<uChar> &flagged)
     1281{
     1282  if (!cMSopen) {
     1283    return 1;
     1284  }
     1285
     1286  // Check for EOF.
     1287  if (cIdx >= cNRow) {
     1288    return -1;
     1289  }
     1290
     1291  // Find the next selected beam and IF.
     1292  Int ibeam;
     1293  Int iIF;
     1294  Int iDataDesc;
     1295  while (True) {
     1296    ibeam = cBeamNoCol(cIdx);
     1297    //iIF   = cDataDescIdCol(cIdx);
     1298    iDataDesc   = cDataDescIdCol(cIdx);
     1299    iIF   = cSpWinIdCol(iDataDesc);
     1300    if (cBeams(ibeam) && cIFs(iIF)) {
     1301      break;
     1302    }
     1303
     1304    // Check for EOF.
     1305    if (++cIdx >= cNRow) {
     1306      return -1;
     1307    }
     1308  }
     1309
     1310  IFno = iIF + 1;
     1311  // Get Tsys assuming that entries in the SYSCAL table match the main table.
     1312  cTsysCol.get(cIdx, tsys, True);
     1313
     1314  // Calibration factors (if available).
     1315  if (cHaveCalFctr) {
     1316    cCalFctrCol.get(cIdx, calFctr, True);
     1317  } else {
     1318    calFctr.resize(cNPol(iIF));
     1319    calFctr = 0.0f;
     1320  }
     1321
     1322  // Baseline parameters (if available).
     1323  if (cHaveBaseLin) {
     1324    baseLin.resize(2,cNPol(iIF));
     1325    cBaseLinCol.get(cIdx, baseLin);
     1326
     1327    baseSub.resize(24,cNPol(iIF));
     1328    cBaseSubCol.get(cIdx, baseSub);
     1329
     1330  } else {
     1331    baseLin.resize(0,0);
     1332    baseSub.resize(0,0);
     1333  }
     1334
     1335  if (cGetSpectra) {
     1336    // Get spectral data.
     1337    Matrix<Float> tmpData;
     1338    Matrix<Bool>  tmpFlag;
     1339    if (cHaveDataCol) {
     1340      Matrix<Complex> tmpCmplxData;
     1341      cDataCol.getSlice(cIdx, cDataSel(iIF), tmpCmplxData, True);
     1342      tmpData = real(tmpCmplxData);
     1343    } else {
     1344      cFloatDataCol.getSlice(cIdx, cDataSel(iIF), tmpData, True);
     1345    }
     1346    cFlagCol.getSlice(cIdx, cDataSel(iIF), tmpFlag, True);
     1347
     1348    // Transpose spectra.
     1349    Int nChan = tmpData.ncolumn();
     1350    Int nPol  = tmpData.nrow();
     1351    spectra.resize(nChan, nPol);
     1352    flagged.resize(nChan, nPol);
     1353    if (cEndChan(iIF) >= cStartChan(iIF)) {
     1354      // Simple transposition.
     1355      for (Int ipol = 0; ipol < nPol; ipol++) {
     1356        for (Int ichan = 0; ichan < nChan; ichan++) {
     1357          spectra(ichan,ipol) = tmpData(ipol,ichan);
     1358          flagged(ichan,ipol) = tmpFlag(ipol,ichan);
     1359        }
     1360      }
     1361
     1362    } else {
     1363      // Transpose with inversion.
    7141364      Int jchan = nChan - 1;
    715       for (Int ichan = 0; ichan < nChan/2; ichan++, jchan--) {
    716         ctmp = pksrec.xPol(ichan);
    717         pksrec.xPol(ichan) = pksrec.xPol(jchan);
    718         pksrec.xPol(jchan) = ctmp;
     1365      for (Int ipol = 0; ipol < nPol; ipol++) {
     1366        for (Int ichan = 0; ichan < nChan; ichan++, jchan--) {
     1367          spectra(ichan,ipol) = tmpData(ipol,jchan);
     1368          flagged(ichan,ipol) = tmpFlag(ipol,jchan);
     1369        }
    7191370      }
    7201371    }
     
    7351386  cMSopen = False;
    7361387}
     1388
     1389//-------------------------------------------------------- PKSMS2reader::splitAntenanSelectionString
     1390
     1391// split antenna selection string
     1392// delimiter is ','
     1393
     1394Vector<String> PKSMS2reader::splitAntennaSelectionString( const String s )
     1395{
     1396  Char delim = ',' ;
     1397  Int n = s.freq( delim ) + 1 ;
     1398  Vector<String> antlist ;
     1399  string sl[n] ;
     1400  Int numSubstr = split( s, sl, n, "," );
     1401  antlist.resize( numSubstr ) ;
     1402  for ( Int i = 0 ; i < numSubstr ; i++ ) {
     1403    antlist[i] = String( sl[i] ) ;
     1404    antlist[i].trim() ;
     1405  }
     1406  //cerr << "antlist = " << antlist << endl ;
     1407  return antlist ;
     1408}
     1409
     1410//-------------------------------------------------------- PKSMS2reader::setupAntennaList
     1411
     1412// Fill cAntenna and cAntId
     1413
     1414void PKSMS2reader::setupAntennaList( const String s )
     1415{
     1416  LogIO os( LogOrigin( "PKSMS2reader", "setupAntennaList()", WHERE ) ) ;
     1417  //cerr << "antenna specification: " << s << endl ;
     1418  ROMSAntennaColumns antennaCols(cPKSMS.antenna());
     1419  ROScalarColumn<String> antNames = antennaCols.name();
     1420  Int nrow = antNames.nrow() ;
     1421  Vector<String> antlist = splitAntennaSelectionString( s ) ;
     1422  Int len = antlist.size() ;
     1423  Vector<Int> AntId( len ) ;
     1424  Regex re( "[0-9]+" ) ;
     1425  for ( Int i = 0 ; i < len ; i++ ) {
     1426    if ( antlist[i].matches( re ) ) {
     1427      AntId[i] = atoi( antlist[i].c_str() ) ;
     1428      if ( AntId[i] >= nrow ) {
     1429        os << LogIO::SEVERE << "Antenna index out of range: " << AntId[i] << LogIO::EXCEPTION ;
     1430      }
     1431    }
     1432    else {
     1433      AntId[i] = -1 ;
     1434      for ( uInt j = 0 ; j < antNames.nrow() ; j++ ) {
     1435        if ( antlist[i] == antNames(j) ) {
     1436          AntId[i] = j ;
     1437          break ;
     1438        }
     1439      }
     1440      if ( AntId[i] == -1 ) {
     1441        os << LogIO::SEVERE << "Specified antenna name not found: " << antlist[i] << LogIO::EXCEPTION ;
     1442      }
     1443    }
     1444  }
     1445  //cerr << "AntId = " << AntId << endl ;
     1446  vector<Int> uniqId ;
     1447  uniqId.push_back( AntId(0) ) ;
     1448  for ( uInt i = 1 ; i < AntId.size() ; i++ ) {
     1449    if ( count(uniqId.begin(),uniqId.end(),AntId[i]) == 0 ) {
     1450      uniqId.push_back( AntId[i] ) ;
     1451    }
     1452  }
     1453  Vector<Int> newAntId( uniqId ) ;
     1454  cAntId.assign( newAntId ) ;
     1455  //cerr << "cAntId = " << cAntId << endl ;
     1456}
  • branches/mergetest/external/atnf/PKSIO/PKSMS2reader.h

    r1720 r1779  
    6868    virtual Int open(
    6969        const String msName,
     70        const String antenna,
    7071        Vector<Bool> &beams,
    7172        Vector<Bool> &IFs,
     
    8586        String &bunit,
    8687        Float  &equinox,
     88        //String &freqRef,
    8789        String &dopplerFrame,
    8890        Double &mjd,
     
    105107        const Bool getSpectra = True,
    106108        const Bool getXPol    = False,
     109        const Bool getFeedPos = False,
     110        const Bool getPointing = False,
    107111        const Int  coordSys   = 0);
     112
    108113
    109114    // Find the range of the data selected in time and position.
     
    115120
    116121    // Read the next data record.
     122/**
     123    virtual Int read(
     124        Int             &scanNo,
     125        Int             &cycleNo,
     126        Double          &mjd,
     127        Double          &interval,
     128        String          &fieldName,
     129        String          &srcName,
     130        Vector<Double>  &srcDir,
     131        Vector<Double>  &srcPM,
     132        Double          &srcVel,
     133        String          &obsMode,
     134        Int             &IFno,
     135        Double          &refFreq,
     136        Double          &bandwidth,
     137        Double          &freqInc,
     138        Vector<Double>  &restFreq,
     139        Vector<Float>   &tcal,
     140        String          &tcalTime,
     141        Float           &azimuth,
     142        Float           &elevation,
     143        Float           &parAngle,
     144        Float           &focusAxi,
     145        Float           &focusTan,
     146        Float           &focusRot,
     147        Float           &temperature,
     148        Float           &pressure,
     149        Float           &humidity,
     150        Float           &windSpeed,
     151        Float           &windAz,
     152        Int             &refBeam,
     153        Int             &beamNo,
     154        Vector<Double>  &direction,
     155        Vector<Double>  &scanRate,
     156        Vector<Float>   &tsys,
     157        Vector<Float>   &sigma,
     158        Vector<Float>   &calFctr,
     159        Matrix<Float>   &baseLin,
     160        Matrix<Float>   &baseSub,
     161        Matrix<Float>   &spectra,
     162        Matrix<uChar>   &flagged,
     163        Complex         &xCalFctr,
     164        Vector<Complex> &xPol);
     165**/
    117166    virtual Int read(PKSrecord &pksrec);
     167
     168
     169    // Read the next data record, just the basics.
     170    virtual Int read(
     171        Int           &IFno,
     172        Vector<Float> &tsys,
     173        Vector<Float> &calFctr,
     174        Matrix<Float> &baseLin,
     175        Matrix<Float> &baseSub,
     176        Matrix<Float> &spectra,
     177        Matrix<uChar> &flagged);
    118178
    119179    // Close the MS.
     
    121181
    122182  private:
     183    Vector<String> splitAntennaSelectionString( const String s );
     184    void setupAntennaList( const String s ) ;
     185
    123186    Bool   cHaveBaseLin, cHaveCalFctr, cHaveSrcVel, cHaveTsys, cHaveXCalFctr,
    124            cMSopen;
     187           cMSopen, cHaveTcal, cHaveDataCol, cALMA, cHaveSysCal, cHaveCorrectedDataCol;
    125188    Int    cCycleNo, cIdx, cNRow, cScanNo;
    126     Double cTime;
     189    Double cTime, lastmjd;
    127190    Vector<Int>    cEndChan, cRefChan, cStartChan;
    128191    Vector<Bool>   cBeams, cIFs;
    129192    Vector<Slicer> cDataSel;
     193    String         cDirRef, cTelName;
    130194    MeasurementSet cPKSMS;
     195    Table          cSysCalTab, tmptab, tmptab2;
     196
     197    //Vector<String> cAntenna;
     198    Vector<Int> cAntId;
    131199
    132200    ROScalarColumn<Int>     cScanNoCol;
     
    135203    ROScalarColumn<Int>     cFieldIdCol;
    136204    ROScalarColumn<String>  cFieldNameCol;
     205    ROArrayColumn<Double>   cFieldDelayDirCol;
    137206    ROScalarColumn<Int>     cSrcIdCol;
     207    ROScalarColumn<Int>     cSrcId2Col;
    138208    ROScalarColumn<String>  cSrcNameCol;
    139209    ROArrayColumn<Double>   cSrcDirCol;
     
    141211    ROArrayColumn<Double>   cSrcVelCol;
    142212    ROScalarColumn<Int>     cStateIdCol;
     213    ROScalarColumn<Double>  cCalCol;   
    143214    ROScalarColumn<String>  cObsModeCol;
    144215    ROArrayColumn<Double>   cSrcRestFrqCol;
    145216    ROScalarColumn<Int>     cDataDescIdCol;
     217    ROScalarColumn<Int>     cSpWinIdCol;
    146218    ROArrayColumn<Double>   cChanFreqCol;
     219    ROScalarColumn<Double>   cTotBWCol;
    147220    ROScalarColumn<Double>  cWeatherTimeCol;
    148221    ROScalarColumn<Float>   cTemperatureCol;
    149222    ROScalarColumn<Float>   cPressureCol;
    150223    ROScalarColumn<Float>   cHumidityCol;
     224    ROArrayColumn<Float>    cTcalCol;
    151225    ROScalarColumn<Int>     cBeamNoCol;
    152226    ROArrayColumn<Double>   cPointingCol;
     227    ROScalarColumn<Double>  cPointingTimeCol;
    153228    ROArrayColumn<Float>    cTsysCol;
    154229    ROArrayColumn<Float>    cSigmaCol;
     
    158233    ROArrayColumn<Float>    cFloatDataCol;
    159234    ROArrayColumn<Bool>     cFlagCol;
     235    ROScalarColumn<Bool>    cFlagRowCol;
    160236    ROScalarColumn<Complex> cXCalFctrCol;
    161237    ROArrayColumn<Complex>  cDataCol;
     238    ROArrayColumn<Complex>  cCorrectedDataCol;
    162239    ROScalarColumn<Int>     cNumReceptorCol;
     240    ROScalarColumn<Bool>    cSigStateCol;
     241    ROScalarColumn<Bool>    cRefStateCol;
     242   
    163243};
    164244
  • branches/mergetest/external/atnf/PKSIO/PKSMS2writer.cc

    r1720 r1779  
    4242#include <casa/BasicSL/Constants.h>
    4343#include <casa/Quanta/QC.h>
     44#include <casa/Logging/LogIO.h>
    4445#include <measures/Measures/Stokes.h>
    4546#include <tables/Tables/ArrColDesc.h>
     
    5253#include <tables/Tables/TiledShapeStMan.h>
    5354
     55// Class name
     56const string className = "PKSMS2writer" ;
     57
    5458//------------------------------------------------- PKSMS2writer::PKSMS2writer
    5559
     
    5963{
    6064  cPKSMS = 0x0;
    61 
    62   // By default, messages are written to stderr.
    63   initMsg();
    6465}
    6566
     
    9293        const Bool   haveBase)
    9394{
     95  const string methodName = "create()" ;
     96  LogIO os( LogOrigin( className, methodName, WHERE ) ) ;
     97
    9498  if (cPKSMS) {
    95     logMsg("ERROR: Output MS already open, close it first.");
     99    os << LogIO::SEVERE << "Output MS already open, close it first." << LogIO::POST ;
    96100    return 1;
    97101  }
    98 
    99   // Clear the message stack.
    100   clearMsg();
    101102
    102103  // Open a MS table.
     
    108109
    109110  Int maxNPol = max(cNPol);
    110 
    111 
     111  cGBT = cAPEX = cSMT = cALMA = cATF = False;
     112
     113  String telName = antName;
     114  // check if it is GBT data
     115  if (antName.contains("GBT")) {
     116    cGBT = True;
     117  }
     118  else if (antName.contains("APEX")) {
     119    cAPEX = True;
     120  }
     121  else if (antName.contains("HHT") || antName.contains("SMT")) {
     122    cSMT = True;
     123  }
     124  else if (antName.contains("ALMA")) {
     125    cALMA = True;
     126  }
     127  else if (antName.contains("ATF")) {
     128    cATF = True;
     129    telName="ATF";
     130  }
     131 
    112132  // Add the non-standard CALFCTR column.
    113133  pksDesc.addColumn(ArrayColumnDesc<Float>("CALFCTR", "Calibration factors",
     
    116136  // Add the optional FLOAT_DATA column.
    117137  MS::addColumnToDesc(pksDesc, MS::FLOAT_DATA, 2);
     138  //pksDesc.rwColumnDesc(MS::columnName(MS::FLOAT_DATA)).rwKeywordSet().
     139  //              define("UNIT", String("Jy"));
    118140  pksDesc.rwColumnDesc(MS::columnName(MS::FLOAT_DATA)).rwKeywordSet().
    119141                define("UNIT", bunit);
     
    136158
    137159    MS::addColumnToDesc(pksDesc, MS::DATA, 2);
     160    //pksDesc.rwColumnDesc(MS::columnName(MS::DATA)).rwKeywordSet().
     161    //            define("UNIT", "Jy");
    138162    pksDesc.rwColumnDesc(MS::columnName(MS::DATA)).rwKeywordSet().
    139163                define("UNIT", bunit);
     
    152176  newtab.bindAll(incrStMan, True);
    153177
    154   // Use TiledShapeStMan for the FLOAT_DATA hypercube with tile size 16 kiB.
    155   TiledShapeStMan tiledStMan("TiledData", IPosition(3,1,128,32));
     178  // Use TiledShapeStMan for the FLOAT_DATA hypercube with tile size 1 MB.
     179  TiledShapeStMan tiledStMan("TiledData", IPosition(3,1,128,2048));
    156180  newtab.bindColumn(MS::columnName(MS::FLOAT_DATA), tiledStMan);
    157181
     
    367391  } else if (dopplerFrame == "SOURCE") {
    368392    MFrequency::getType(cDopplerFrame, "REST");
     393  } else if (dopplerFrame == "LSRK") {
     394    MFrequency::getType(cDopplerFrame, "LSRK");
    369395  }
    370396
     
    374400  addDopplerEntry();
    375401  addFeedEntry();
    376   addObservationEntry(observer, project);
     402  //addObservationEntry(observer, project);
     403  addObservationEntry(observer, project, telName);
    377404  addProcessorEntry();
    378405
     
    384411// Write the next data record.
    385412
     413/**
     414Int PKSMS2writer::write(
     415        const Int             scanNo,
     416        const Int             cycleNo,
     417        const Double          mjd,
     418        const Double          interval,
     419        const String          fieldName,
     420        const String          srcName,
     421        const Vector<Double>  srcDir,
     422        const Vector<Double>  srcPM,
     423        const Double          srcVel,
     424        const String          obsMode,
     425        const Int             IFno,
     426        const Double          refFreq,
     427        const Double          bandwidth,
     428        const Double          freqInc,
     429        //const Double          restFreq,
     430        const Vector<Double>  restFreq,
     431        const Vector<Float>   tcal,
     432        const String          tcalTime,
     433        const Float           azimuth,
     434        const Float           elevation,
     435        const Float           parAngle,
     436        const Float           focusAxi,
     437        const Float           focusTan,
     438        const Float           focusRot,
     439        const Float           temperature,
     440        const Float           pressure,
     441        const Float           humidity,
     442        const Float           windSpeed,
     443        const Float           windAz,
     444        const Int             refBeam,
     445        const Int             beamNo,
     446        const Vector<Double>  direction,
     447        const Vector<Double>  scanRate,
     448        const Vector<Float>   tsys,
     449        const Vector<Float>   sigma,
     450        const Vector<Float>   calFctr,
     451        const Matrix<Float>   baseLin,
     452        const Matrix<Float>   baseSub,
     453        const Matrix<Float>   &spectra,
     454        const Matrix<uChar>   &flagged,
     455        const uInt            flagrow,
     456        const Complex         xCalFctr,
     457        const Vector<Complex> &xPol)
     458**/
    386459Int PKSMS2writer::write(
    387460        const PKSrecord &pksrec)
     
    415488    pksrec.restFreq, pksrec.srcVel);
    416489
    417   // Find or add the obsType to the STATE subtable.
     490  // Find or add the obsMode to the STATE subtable.
    418491  Int stateId = addStateEntry(pksrec.obsType);
    419492
    420493  // FIELD subtable.
    421   Vector<Double> scanRate(2);
    422   scanRate(0) = pksrec.scanRate(0);
    423   scanRate(1) = pksrec.scanRate(1);
     494  //Vector<Double> scanRate(2);
     495  //scanRate(0) = pksrec.scanRate(0);
     496  //scanRate(1) = pksrec.scanRate(1);
    424497  Int fieldId = addFieldEntry(pksrec.fieldName, time, pksrec.direction,
    425     scanRate, srcId);
     498    pksrec.scanRate, srcId);
    426499
    427500  // POINTING subtable.
    428501  addPointingEntry(time, pksrec.interval, pksrec.fieldName, pksrec.direction,
    429     scanRate);
     502    pksrec.scanRate);
    430503
    431504  // SYSCAL subtable.
    432505  addSysCalEntry(pksrec.beamNo, iIF, time, pksrec.interval, pksrec.tcal,
    433     pksrec.tsys);
     506    pksrec.tsys, nPol);
    434507
    435508  // Handle weather information.
     
    508581  cMSCols->sigma().put(irow, pksrec.sigma);
    509582
    510   Vector<Float> weight(1, 1.0f);
     583  //Vector<Float> weight(1, 1.0f);
     584  Vector<Float> weight(nPol, 1.0f);
    511585  cMSCols->weight().put(irow, weight);
     586  //imaging weight
     587  //Vector<Float> imagingWeight(nChan);
     588  //cMSCols->imagingWeight().put(irow, imagingWeight);
    512589
    513590  // Flag information.
    514591  Cube<Bool> flags(nPol, nChan, 1, False);
    515   cMSCols->flag().put(irow, flags.xyPlane(0));
     592  //cMSCols->flag().put(irow, flags.xyPlane(0));
    516593  cMSCols->flagCategory().put(irow, flags);
    517   cMSCols->flagRow().put(irow, False);
     594  // Row-based flagging info. (True:>0, False:0)
     595  cMSCols->flagRow().put(irow, (pksrec.flagrow > 0));
     596
    518597
    519598  return 0;
     
    571650  cSysCal          = MSSysCal();
    572651  cWeather         = MSWeather();
    573 
    574652  // Release the main table.
    575   delete cPKSMS;
    576   cPKSMS = 0x0;
     653  delete cPKSMS; 
     654  cPKSMS=0x0;
    577655}
    578656
     
    589667  Int n = cAntenna.nrow() - 1;
    590668
     669  // do specific things for GBT
    591670  // Data.
     671  // plus some more telescopes
    592672  cAntennaCols->name().put(n, antName);
    593   cAntennaCols->station().put(n, "ATNF_PARKES");
     673  //cAntennaCols->station().put(n, "ATNF_PARKES");
     674  if (cGBT) {
     675    cAntennaCols->station().put(n, "GREENBANK");
     676    cAntennaCols->dishDiameter().put(n, 110.0);
     677  }
     678  else if (cAPEX) {
     679    cAntennaCols->station().put(n, "CHAJNANTOR");
     680    cAntennaCols->dishDiameter().put(n, 12.0);
     681  }
     682  else if (cALMA) {
     683    // this needs to be changed in future...
     684    cAntennaCols->station().put(n, "CHAJNANTOR");
     685    cAntennaCols->dishDiameter().put(n, 12.0);
     686  }
     687  else if (cATF) {
     688    //pad name for the antenna is static...
     689    String stname="unknown";
     690    if (antName.contains("DV")) {
     691       stname="PAD001";
     692    }
     693    if (antName.contains("DA")) {
     694       stname="PAD002";
     695    }
     696    cAntennaCols->station().put(n, stname);
     697    cAntennaCols->dishDiameter().put(n, 12.0);
     698  }
     699  else if (cSMT) {
     700    cAntennaCols->station().put(n, "MT_GRAHAM");
     701    cAntennaCols->dishDiameter().put(n, 10.0);
     702  }
     703  else {
     704    cAntennaCols->station().put(n, "ATNF_PARKES");
     705    cAntennaCols->dishDiameter().put(n, 64.0);
     706  }
    594707  cAntennaCols->type().put(n, "GROUND-BASED");
    595708  cAntennaCols->mount().put(n, "ALT-AZ");
     
    597710  Vector<Double> antOffset(3, 0.0);
    598711  cAntennaCols->offset().put(n, antOffset);
    599   cAntennaCols->dishDiameter().put(n, 64.0);
    600 
     712  //cAntennaCols->dishDiameter().put(n, 64.0);
     713  //if (cGBT) {
     714  //  cAntennaCols->dishDiameter().put(n, 110.0);
     715  //}
     716  //else {
     717  //  cAntennaCols->dishDiameter().put(n, 64.0);
     718  //}
    601719  // Flags.
    602720  cAntennaCols->flagRow().put(n, False);
     
    711829        const Int srcId)
    712830{
     831
     832  ROScalarColumn<String> fldn(cField, "NAME");
     833  ROScalarColumn<Int> sourceid(cField, "SOURCE_ID");
     834  Int n;
     835  Int nFld = cField.nrow();
     836  for (n = 0; n < nFld; n++) {
     837    if (fldn(n) == fieldName && sourceid(n) == srcId) {
     838      break;
     839    }
     840  }
     841
    713842  // Extend the FIELD subtable.
    714   cField.addRow();
    715   Int n = cField.nrow() - 1;
    716 
    717   // Data.
    718   cFieldCols->name().put(n, fieldName);
    719   cFieldCols->code().put(n, "DRIFT");
    720   cFieldCols->time().put(n, time);
    721 
    722   Matrix<Double> track(2, 2);
    723   track.column(0) = direction;
    724   track.column(1) = scanRate;
    725   cFieldCols->numPoly().put(n, 1);
    726   cFieldCols->delayDir().put(n, track);
    727   cFieldCols->phaseDir().put(n, track);
    728   cFieldCols->referenceDir().put(n, track);
    729   cFieldCols->sourceId().put(n, srcId);
    730 
    731   // Flags.
    732   cFieldCols->flagRow().put(n, False);
     843  if (n == nFld) {
     844    cField.addRow();
     845    //Int n = cField.nrow() - 1;
     846
     847    // Data.
     848    cFieldCols->name().put(n, fieldName);
     849    if (cGBT) {
     850      cFieldCols->code().put(n, " ");
     851    }
     852    else {
     853      cFieldCols->code().put(n, "DRIFT");
     854    }
     855    cFieldCols->time().put(n, time);
     856
     857    //Matrix<Double> track(2, 2);
     858    Matrix<Double> track(2, 1);
     859    track.column(0) = direction;
     860    //track.column(1) = scanRate;
     861    cFieldCols->numPoly().put(n, 1);
     862    cFieldCols->delayDir().put(n, track);
     863    cFieldCols->phaseDir().put(n, track);
     864    cFieldCols->referenceDir().put(n, track);
     865    cFieldCols->sourceId().put(n, srcId);
     866
     867    // Flags.
     868    cFieldCols->flagRow().put(n, False);
     869  }
    733870
    734871  return n;
     
    741878Int PKSMS2writer::addObservationEntry(
    742879        const String observer,
    743         const String project)
     880        const String project,
     881        const String antName)
    744882{
    745883  // Extend the OBSERVATION subtable.
     
    748886
    749887  // Data.
    750   cObservationCols->telescopeName().put(n, "Parkes");
     888  //cObservationCols->telescopeName().put(n, "Parkes");
     889  cObservationCols->telescopeName().put(n, antName);
    751890  Vector<Double> timerange(2, 0.0);
    752891  cObservationCols->timeRange().put(n, timerange);
     
    754893  Vector<String> log(1, "none");
    755894  cObservationCols->log().put(n, log);
    756   cObservationCols->scheduleType().put(n, "ATNF");
     895  //cObservationCols->scheduleType().put(n, "ATNF");
     896  cObservationCols->scheduleType().put(n, "");
    757897  Vector<String> schedule(1, "Not available");
    758898  cObservationCols->schedule().put(n, schedule);
     
    767907
    768908//--------------------------------------------- PKSMS2writer::addPointingEntry
     909
     910// Modified to fill pointing data if the direction is the pointing direction.
     911// So the following comment is no longer true.
    769912
    770913// Add an entry to the POINTING subtable.  This compulsory subtable simply
     
    778921        const Vector<Double> scanRate)
    779922{
    780   // Extend the POINTING subtable.
    781   cPointing.addRow();
    782   Int n = cPointing.nrow() - 1;
    783 
    784   // Keys.
    785   cPointingCols->antennaId().put(n, 0);
    786   cPointingCols->time().put(n, time);
    787   cPointingCols->interval().put(n, interval);
    788 
    789   // Data.
    790   cPointingCols->name().put(n, fieldName);
    791   cPointingCols->numPoly().put(n, 1);
    792   cPointingCols->timeOrigin().put(n, time);
    793 
    794   Matrix<Double> track(2, 2);
    795   track.column(0) = direction;
    796   track.column(1) = scanRate;
    797   cPointingCols->direction().put(n, track);
    798   cPointingCols->target().put(n, track);
    799   cPointingCols->tracking().put(n, True);
    800 
     923
     924  ROScalarColumn<Double> tms(cPointing, "TIME");
     925  Int n;
     926  Int ntm = cPointing.nrow();
     927  for (n = 0; n < ntm; n++) {
     928    if (tms(n) == time) {
     929      break;
     930    }
     931  }
     932
     933  if (n == ntm) {
     934    // Extend the POINTING subtable.
     935    cPointing.addRow();
     936    //Int n = cPointing.nrow() - 1;
     937
     938    // Keys.
     939    cPointingCols->antennaId().put(n, 0);
     940    cPointingCols->time().put(n, time);
     941    cPointingCols->interval().put(n, interval);
     942
     943    // Data.
     944    cPointingCols->name().put(n, fieldName);
     945    cPointingCols->numPoly().put(n, 1);
     946    cPointingCols->timeOrigin().put(n, time);
     947
     948    //Matrix<Double> track(2, 2);
     949    Matrix<Double> track(2, 1);
     950    track.column(0) = direction;
     951    //track.column(1) = scanRate;
     952    cPointingCols->direction().put(n, track);
     953    cPointingCols->target().put(n, track);
     954    cPointingCols->tracking().put(n, True);
     955  }
    801956  return n;
    802957}
     
    821976  // Data.
    822977  Vector<Int> corrType(2);
     978  if (nPol == 1) {
     979  corrType.resize(1);
     980  corrType(0) = Stokes::XX;
     981  }
     982  else {
     983  //Vector<Int> corrType(2);
    823984  corrType(0) = Stokes::XX;
    824985  corrType(1) = Stokes::YY;
     986  }
    825987  cPolarizationCols->corrType().put(n, corrType);
    826988
    827989  Matrix<Int> corrProduct(2,2,1);
     990  if (nPol == 1) {
     991    corrProduct.resize(2,1,1);
     992    corrProduct(1,0) = 0;
     993  }
    828994  if (nPol == 2) {
    829995    corrProduct(1,0) = 0;
     
    8691035        const Vector<Double> direction,
    8701036        const Vector<Double> properMotion,
    871         const Double restFreq,
     1037        //const Double restFreq,
     1038        const Vector<Double> restFreq,
    8721039        const Double radialVelocity)
    8731040{
     
    9031070//  cSourceCols->position().put(n, position);
    9041071    cSourceCols->properMotion().put(n, properMotion);
    905     Vector<Double> restFrequency(1, restFreq);
    906     cSourceCols->restFrequency().put(n, restFrequency);
     1072//  Vector<Double> restFrequency(1, restFreq);
     1073//  cSourceCols->restFrequency().put(n, restFrequency);
     1074    cSourceCols->restFrequency().put(n, restFreq);
    9071075    Vector<Double> sysvel(1, radialVelocity);
    9081076    cSourceCols->sysvel().put(n, sysvel);
     
    9331101
    9341102  // Data.
    935   cSpWindowCols->name().put(n, "L-band");
     1103  //cSpWindowCols->name().put(n, "L-band");
     1104  cSpWindowCols->name().put(n, " ");
    9361105  cSpWindowCols->refFrequency().put(n, refFreq);
    9371106
     
    10151184        const Double interval,
    10161185        const Vector<Float> tcal,
    1017         const Vector<Float> tsys)
    1018 {
     1186        const Vector<Float> tsys,
     1187        const Int nPol)
     1188{
     1189  LogIO os(LogOrigin("PKSMS2writer", "addSysCalEntry()", WHERE));
     1190
    10191191  // Extend the SYSCAL subtable.
    10201192  cSysCal.addRow();
    10211193  Int n = cSysCal.nrow() - 1;
    10221194
     1195  //check fo consistency with n pol
     1196  //here assume size of Tcal vector = npol
     1197  Vector<Float> inTcal(nPol,0);
     1198  Int ndim = tcal.shape()(0);
     1199  Vector<Float> tmpTcal = tcal;
     1200  if (nPol != ndim) {
     1201    os << LogIO::WARN
     1202       << "Found "<< ndim <<" Tcal value(s) for the data with "<<nPol<<" polarization(s)"
     1203       << "(expecting one Tcal per pol)."<<endl
     1204       << "First "<< nPol << " Tcal value(s) will be filled." << LogIO::POST;
     1205    tmpTcal.resize(nPol, True);
     1206    inTcal = tmpTcal;
     1207  }
    10231208  // Keys.
    10241209  cSysCalCols->antennaId().put(n, 0);
     
    10291214
    10301215  // Data.
    1031   cSysCalCols->tcal().put(n, tcal);
     1216  //cSysCalCols->tcal().put(n, tcal);
     1217  cSysCalCols->tcal().put(n, inTcal);
    10321218  cSysCalCols->tsys().put(n, tsys);
    10331219
  • branches/mergetest/external/atnf/PKSIO/PKSMS2writer.h

    r1720 r1779  
    7878
    7979    // Write the next data record.
     80/**
     81    virtual Int write(
     82        const Int             scanNo,
     83        const Int             cycleNo,
     84        const Double          mjd,
     85        const Double          interval,
     86        const String          fieldName,
     87        const String          srcName,
     88        const Vector<Double>  srcDir,
     89        const Vector<Double>  srcPM,
     90        const Double          srcVel,
     91        const String          obsMode,
     92        const Int             IFno,
     93        const Double          refFreq,
     94        const Double          bandwidth,
     95        const Double          freqInc,
     96        //const Double          restFreq,
     97        const Vector<Double>  restFreq,
     98        const Vector<Float>   tcal,
     99        const String          tcalTime,
     100        const Float           azimuth,
     101        const Float           elevation,
     102        const Float           parAngle,
     103        const Float           focusAxi,
     104        const Float           focusTan,
     105        const Float           focusRot,
     106        const Float           temperature,
     107        const Float           pressure,
     108        const Float           humidity,
     109        const Float           windSpeed,
     110        const Float           windAz,
     111        const Int             refBeam,
     112        const Int             beamNo,
     113        const Vector<Double>  direction,
     114        const Vector<Double>  scanRate,
     115        const Vector<Float>   tsys,
     116        const Vector<Float>   sigma,
     117        const Vector<Float>   calFctr,
     118        const Matrix<Float>   baseLin,
     119        const Matrix<Float>   baseSub,
     120        const Matrix<Float>   &spectra,
     121        const Matrix<uChar>   &flagged,
     122        const uInt            flagrow,
     123        const Complex         xCalFctr,
     124        const Vector<Complex> &xPol);
     125**/
    80126    virtual Int write(
    81127        const PKSrecord &pksrec);
     
    131177    ScalarColumn<Complex> *cXCalFctrCol;
    132178
     179    // for handling parameters specific to GBT and other telescopes
     180    Bool cGBT, cSMT, cAPEX, cALMA, cATF;
    133181
    134182    // Add an entry to the ANTENNA subtable.
     
    164212    Int addObservationEntry(
    165213        const String observer,
    166         const String project);
     214        const String project,
     215        const String antName);
    167216
    168217    // Add an entry to the POINTING subtable.
     
    187236        const Vector<Double> direction,
    188237        const Vector<Double> properMotion,
    189         const Double restFreq,
     238        //const Double restFreq,
     239        const Vector<Double> restFreq,
    190240        const Double radialVelocity);
    191241
     
    209259        const Double interval,
    210260        const Vector<Float> Tcal,
    211         const Vector<Float> Tsys);
     261        const Vector<Float> Tsys,
     262        const Int nPol);
    212263
    213264    // Add an entry to the WEATHER subtable.
  • branches/mergetest/external/atnf/PKSIO/PKSSDwriter.cc

    r1735 r1779  
    3535#include <atnf/PKSIO/PKSSDwriter.h>
    3636
     37#include <casa/Logging/LogIO.h>
     38
    3739#include <casa/stdio.h>
    3840#include <casa/Quanta/MVTime.h>
     
    4143#include <cstring>
    4244
     45// Class name
     46const string className = "PKSSDwriter" ;
     47
    4348//--------------------------------------------------- PKSSDwriter::PKSSDwriter
    4449
     
    4752PKSSDwriter::PKSSDwriter()
    4853{
    49   // By default, messages are written to stderr.
    50   initMsg();
    5154}
    5255
     
    5861{
    5962  close();
    60 }
    61 
    62 //-------------------------------------------------------- PKSSDwriter::setMsg
    63 
    64 // Set message disposition.  If fd is non-zero messages will be written
    65 // to that file descriptor, else stored for retrieval by getMsg().
    66 
    67 Int PKSSDwriter::setMsg(FILE *fd)
    68 {
    69   PKSmsg::setMsg(fd);
    70   cSDwriter.setMsg(fd);
    71 
    72   return 0;
    7363}
    7464
     
    9282        const Bool   haveBase)
    9383{
    94   // Clear the message stack.
    95   clearMsg();
     84  const string methodName = "create()" ;
     85  LogIO os( LogOrigin( className, methodName, WHERE ) ) ;
    9686
    9787  double antPos[3];
     
    10292  cNIF = nChan.nelements();
    10393  if (nPol.nelements() != cNIF || haveXPol.nelements() != cNIF) {
    104     cerr << "PKSSDwriter::create: "
    105          << "Inconsistent number of IFs for nChan, nPol, and/or haveXPol."
    106          << endl;
     94    os << LogIO::SEVERE << "Inconsistent number of IFs for nChan, nPol, and/or haveXPol." << LogIO::POST ;
    10795    return 1;
    10896  }
     
    131119        (int *)cNPol.getStorage(deleteIt),
    132120        (int *)cHaveXPol.getStorage(deleteIt), (int)cHaveBase, 1);
    133   logMsg(cSDwriter.getMsg());
    134   cSDwriter.clearMsg();
     121  //logMsg(cSDwriter.getMsg());
     122  //cSDwriter.clearMsg();
    135123  if (status) {
    136124    cSDwriter.deleteFile();
     
    148136        const PKSrecord &pksrec)
    149137{
     138  const string methodName = "write()" ;
     139  LogIO os( LogOrigin( className, methodName, WHERE ) ) ;
     140
    150141  // Do basic checks.
    151142  Int IFno = pksrec.IFno;
    152143  uInt iIF = IFno - 1;
    153144  if (IFno < 1 || Int(cNIF) < IFno) {
    154     cerr << "PKSDwriter::write: "
    155          << "Invalid IF number " << IFno
    156          << " (maximum " << cNIF << ")." << endl;
     145    os << LogIO::SEVERE
     146       << "Invalid IF number " << IFno
     147       << " (maximum " << cNIF << ")." << LogIO::POST ;
    157148    return 1;
    158149  }
     
    160151  uInt nChan = pksrec.spectra.nrow();
    161152  if (nChan != cNChan(iIF)) {
    162     cerr << "PKSDwriter::write: "
    163          << "Wrong number of channels for IF " << IFno << "," << endl
    164          << "                   "
     153    os << LogIO::SEVERE << "Wrong number of channels for IF " << IFno << "," << endl
    165154         << "got " << nChan << " should be " << cNChan(iIF) << "." << endl;
     155    os << LogIO::POST ;
    166156    return 1;
    167157  }
     
    169159  uInt nPol = pksrec.spectra.ncolumn();
    170160  if (nPol != cNPol(iIF)) {
    171     cerr << "PKSDwriter::write: "
    172          << "Wrong number of polarizations for IF " << IFno << "," << endl
    173          << "                   "
    174          << "got " << nPol << " should be " << cNPol(iIF) << "." << endl;
     161    os << LogIO::SEVERE << "Wrong number of polarizations for IF " << IFno << "," << endl
     162       << "got " << nPol << " should be " << cNPol(iIF) << "." << endl;
     163    os << LogIO::POST ;
    175164    return 1;
    176165  }
    177166
    178   // Extract calendar information from mjd.
     167  // Extract calendar information frrom mjd.
    179168  MVTime time(pksrec.mjd);
    180169  Int year  = time.year();
     
    196185  mbrec.srcRA    = pksrec.srcDir(0);
    197186  mbrec.srcDec   = pksrec.srcDir(1);
    198 
    199   mbrec.restFreq = pksrec.restFreq;
    200 
     187  if (pksrec.restFreq.shape()==0) {
     188     mbrec.restFreq = 0;
     189  }
     190  else {
     191     mbrec.restFreq = pksrec.restFreq(0);
     192  }
    201193  strncpy(mbrec.obsType, (char *)pksrec.obsType.chars(), 16);
    202194
     
    291283
    292284  Int status = cSDwriter.write(mbrec);
    293   logMsg(cSDwriter.getMsg());
    294   cSDwriter.clearMsg();
     285  //logMsg(cSDwriter.getMsg());
     286  //cSDwriter.clearMsg();
    295287  if (status) {
    296288    status = 1;
     
    325317{
    326318  cSDwriter.close();
    327   logMsg(cSDwriter.getMsg());
    328   cSDwriter.clearMsg();
    329 }
     319  //logMsg(cSDwriter.getMsg());
     320  //cSDwriter.clearMsg();
     321}
  • branches/mergetest/external/atnf/PKSIO/PKSSDwriter.h

    r1720 r1779  
    6262    virtual ~PKSSDwriter();
    6363
    64     // Set message disposition.
    65     virtual Int setMsg(
    66         FILE *fd = 0x0);
    67 
    6864    // Create the SDFITS file and write static data.
    6965    virtual Int create(
  • branches/mergetest/external/atnf/PKSIO/PKSreader.cc

    r1720 r1779  
    8585        reader = new PKSFITSreader("SDFITS");
    8686
    87       } else {
    88         // Assume it's MBFITS.
    89         format = "MBFITS";
    90         reader = new PKSFITSreader("MBFITS", retry, interpolate);
    91       }
     87       } else {
     88         // Assume it's MBFITS.
     89         format = "MBFITS";
     90         reader = new PKSFITSreader("MBFITS", retry, interpolate);
     91       }
    9292    }
    9393
     
    106106    format = "UNRECOGNIZED INPUT FORMAT";
    107107  }
    108 
    109108  return reader;
    110109}
     
    113112
    114113// Search a list of directories for a Parkes Multibeam dataset and return an
    115 // appropriate PKSreader for it.
    116114
    117115PKSreader* getPKSreader(
     
    145143PKSreader* getPKSreader(
    146144        const String name,
     145        const String antenna,
    147146        const Int retry,
    148147        const Int interpolate,
     
    160159  // Try to open it.
    161160  if (reader) {
    162     if (reader->open(name, beams, IFs, nChan, nPol, haveXPol, haveBase,
    163                      haveSpectra)) {
     161    if (reader->open(name, antenna, beams, IFs, nChan, nPol, haveXPol,
     162                     haveBase, haveSpectra)) {
    164163      format += " OPEN ERROR";
    165164      delete reader;
     
    173172//--------------------------------------------------------------- getPKSreader
    174173
    175 // Search a list of directories for a Parkes Multibeam dataset and open an
     174// Search a list of directories for a Parkes Multibeam dataset and return an
    176175// appropriate PKSreader for it.
    177 
    178 PKSreader* getPKSreader(
    179         const String name,
     176PKSreader* getPKSreader(
     177        const String name,
     178        const String antenna,
    180179        const Vector<String> directories,
    181180        const Int retry,
     
    196195  // Try to open it.
    197196  if (reader) {
    198     if (reader->open(name, beams, IFs, nChan, nPol, haveXPol, haveBase,
    199                      haveSpectra)) {
     197    if (reader->open(name, antenna, beams, IFs, nChan, nPol, haveXPol,
     198                     haveBase, haveSpectra)) {
    200199      format += " OPEN ERROR";
    201200      delete reader;
  • branches/mergetest/external/atnf/PKSIO/PKSreader.h

    r1720 r1779  
    3737#define ATNF_PKSREADER_H
    3838
    39 #include <atnf/PKSIO/PKSmsg.h>
    4039#include <atnf/PKSIO/PKSrecord.h>
     40#include <atnf/PKSIO/SrcType.h>
    4141
    4242#include <casa/aips.h>
    4343#include <casa/Arrays/Matrix.h>
    4444#include <casa/Arrays/Vector.h>
     45#include <casa/BasicSL/Complex.h>
    4546#include <casa/BasicSL/String.h>
    4647
     
    7071class PKSreader* getPKSreader(
    7172        const String name,
     73        const String antenna,
    7274        const Int retry,
    7375        const Int interpolate,
     
    8486class PKSreader* getPKSreader(
    8587        const String name,
     88        const String antenna,
    8689        const Vector<String> directories,
    8790        const Int retry,
     
    97100        Bool   &haveSpectra);
    98101
    99 class PKSreader : public PKSmsg
     102
     103class PKSreader
    100104{
    101105  public:
     
    106110    virtual Int open(
    107111        const String inName,
     112        const String antenna,
    108113        Vector<Bool> &beams,
    109114        Vector<Bool> &IFs,
     
    148153        const Bool getSpectra = True,
    149154        const Bool getXPol    = False,
     155        const Bool getFeedPos = False,
     156        const Bool getPointing = False,
    150157        const Int  coordSys   = 0) = 0;
     158
    151159
    152160    // Find the range of the data selected in time and position.
     
    157165        Matrix<Double> &positions) = 0;
    158166
    159     // Read the next data record.
     167    // Read the next data record.
     168/**
     169    virtual Int read(
     170        Int             &scanNo,
     171        Int             &cycleNo,
     172        Double          &mjd,
     173        Double          &interval,
     174        String          &fieldName,
     175        String          &srcName,
     176        Vector<Double>  &srcDir,
     177        Vector<Double>  &srcPM,
     178        Double          &srcVel,
     179        String          &obsType,
     180        Int             &IFno,
     181        Double          &refFreq,
     182        Double          &bandwidth,
     183        Double          &freqInc,
     184        Vector<Double>  &restFreq,
     185        Vector<Float>   &tcal,
     186        String          &tcalTime,
     187        Float           &azimuth,
     188        Float           &elevation,
     189        Float           &parAngle,
     190        Float           &focusAxi,
     191        Float           &focusTan,
     192        Float           &focusRot,
     193        Float           &temperature,
     194        Float           &pressure,
     195        Float           &humidity,
     196        Float           &windSpeed,
     197        Float           &windAz,
     198        Int             &refBeam,
     199        Int             &beamNo,
     200        Vector<Double>  &direction,
     201        Vector<Double>  &scanRate,
     202        Vector<Float>   &tsys,
     203        Vector<Float>   &sigma,
     204        Vector<Float>   &calFctr,
     205        Matrix<Float>   &baseLin,
     206        Matrix<Float>   &baseSub,
     207        Matrix<Float>   &spectra,
     208        Matrix<uChar>   &flagged,
     209        Complex         &xCalFctr,
     210        Vector<Complex> &xPol) = 0;
     211**/
     212/**
     213    // Read the next data record, just the basics.
     214    virtual Int read(
     215        Int           &IFno,
     216        Vector<Float> &tsys,
     217        Vector<Float> &calFctr,
     218        Matrix<Float> &baseLin,
     219        Matrix<Float> &baseSub,
     220        Matrix<Float> &spectra,
     221        Matrix<uChar> &flagged) = 0;
     222**/
    160223    virtual Int read(PKSrecord &pksrec) = 0;
    161224
     
    164227
    165228  protected:
    166     Bool  cGetSpectra, cGetXPol;
     229    Bool   cGetFeedPos, cGetSpectra, cGetXPol, cGetPointing;
    167230    Int   cCoordSys;
    168231
  • branches/mergetest/external/atnf/PKSIO/PKSrecord.h

    r1720 r1779  
    6767    Double          bandwidth;
    6868    Double          freqInc;
    69     Double          restFreq;
     69    Int             nchan;
     70    Vector<Double>  restFreq;
    7071    Vector<Float>   tcal;
    7172    String          tcalTime;
     
    8687    Int             pCode;
    8788    Float           rateAge;
    88     Vector<Float>   scanRate;
     89    Vector<Double>  scanRate;
    8990    Float           paRate;
    9091    Vector<Float>   tsys;
     
    9596    Matrix<Float>   spectra;
    9697    Matrix<uChar>   flagged;
     98    uInt            flagrow;
    9799    Complex         xCalFctr;
    98100    Vector<Complex> xPol;
     101    Int             polNo ;
     102    Int             srcType ;
    99103};
    100104
  • branches/mergetest/external/atnf/PKSIO/PKSwriter.h

    r1720 r1779  
    3535#define ATNF_PKSWRITER_H
    3636
    37 #include <atnf/PKSIO/PKSmsg.h>
    3837#include <atnf/PKSIO/PKSrecord.h>
    3938
     
    5049// </summary>
    5150
    52 class PKSwriter : public PKSmsg
     51class PKSwriter
    5352{
    5453  public:
  • branches/mergetest/external/atnf/PKSIO/SDFITSreader.cc

    r1737 r1779  
    3838
    3939#include <atnf/pks/pks_maths.h>
    40 #include <atnf/PKSIO/PKSmsg.h>
    4140#include <atnf/PKSIO/MBrecord.h>
    4241#include <atnf/PKSIO/SDFITSreader.h>
    4342
     43#include <casa/Logging/LogIO.h>
     44#include <casa/Quanta/MVTime.h>
    4445#include <casa/math.h>
    4546#include <casa/stdio.h>
     
    6768const double D2R = PI / 180.0;
    6869
     70// Class name
     71const string className = "SDFITSreader" ;
     72
    6973//---------------------------------------------------- SDFITSreader::(statics)
    7074
     
    97101  cEndChan   = 0x0;
    98102  cRefChan   = 0x0;
    99 
    100   // By default, messages are written to stderr.
    101   initMsg();
     103  cPols      = 0x0;
    102104}
    103105
     
    128130        int    &extraSysCal)
    129131{
    130   // Clear the message stack.
    131   clearMsg();
     132  const string methodName = "open()" ;
    132133
    133134  if (cSDptr) {
     
    139140  if (fits_open_file(&cSDptr, sdName, READONLY, &cStatus)) {
    140141    sprintf(cMsg, "ERROR: Failed to open SDFITS file\n       %s", sdName);
    141     logMsg(cMsg);
     142    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, cMsg);
    142143    return 1;
    143144  }
     
    162163
    163164      } else {
    164         logMsg("ERROR: Failed to locate SDFITS binary table.");
     165        log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "Failed to locate SDFITS binary table.");
    165166        close();
    166167        return 1;
     
    201202    cNAxes = 5;
    202203    if (readDim(DATA, 1, &cNAxes, cNAxis)) {
    203       logMsg();
     204      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    204205      close();
    205206      return 1;
     
    220221    if (cNAxes < 4) {
    221222      // Need at least four axes (for now).
    222       logMsg("ERROR: DATA array contains fewer than four axes.");
     223      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "DATA array contains fewer than four axes.");
    223224      close();
    224225      return 1;
    225226    } else if (cNAxes > 5) {
    226227      // We support up to five axes.
    227       logMsg("ERROR: DATA array contains more than five axes.");
     228      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "DATA array contains more than five axes.");
    228229      close();
    229230      return 1;
     
    236237    findData(DATAXED, "DATAXED", TSTRING);
    237238    if (cData[DATAXED].colnum < 0) {
    238       logMsg("ERROR: DATA array column absent from binary table.");
     239      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "DATA array column absent from binary table.");
    239240      close();
    240241      return 1;
     
    266267
    267268  if (cStatus) {
    268     logMsg();
     269    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    269270    close();
    270271    return 1;
     
    280281  char *timeCRPIX = 0;
    281282  char *beamCRVAL = 0;
     283  char *polCRVAL = 0;
    282284
    283285  cFreqAxis   = -1;
     
    297299    } else if (strncmp(ctype[iaxis], "STOKES", 6) == 0) {
    298300      cStokesAxis = iaxis;
     301      polCRVAL = CRVAL[iaxis];
    299302
    300303    } else if (strncmp(ctype[iaxis], "RA", 2) == 0) {
     
    318321        sprintf(cMsg, "DATA array contains a TIME axis of length %ld.",
    319322          cNAxisTime);
    320         logMsg(cMsg);
     323        //logMsg(cMsg);
     324        log(LogOrigin( className, methodName, WHERE ), LogIO::NORMAL, cMsg);
    321325      }
    322326
     
    337341  }
    338342
     343
    339344  // Check that required axes are present.
    340345  if (cFreqAxis < 0 || cStokesAxis < 0 || cRaAxis < 0 || cDecAxis < 0) {
    341     logMsg("ERROR: Could not find required DATA array axes.");
     346    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "Could not find required DATA array axes.");
    342347    close();
    343348    return 1;
     
    403408  findData(WINDDIRE, "WINDDIRE", TFLOAT);       // Shared.
    404409
     410  findData(STOKES,    polCRVAL,  TINT);
     411  findData(SIG,       "SIG",     TSTRING);
     412  findData(CAL,       "CAL",     TSTRING);
     413
     414  findData(RVSYS,     "RVSYS",   TDOUBLE);
     415  findData(VFRAME,    "VFRAME",  TDOUBLE);
     416  findData(VELDEF,    "VELDEF",  TSTRING);
     417
    405418  if (cStatus) {
    406     logMsg();
     419    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    407420    close();
    408421    return 1;
     
    433446  cCycleNo = 0;
    434447  cLastUTC = 0.0;
     448  for ( int i = 0 ; i < 4 ; i++ ) {
     449    cGLastUTC[i] = 0.0 ;
     450    cGLastScan[i] = -1 ;
     451    cGCycleNo[i] = 0 ;
     452  }
    435453
    436454  // Beam number, 1-relative by default.
     
    536554  fits_get_num_rows(cSDptr, &cNRow, &cStatus);
    537555  if (!cNRow) {
    538     logMsg("ERROR: Table contains no entries.");
     556    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "Table contains no entries.");
    539557    close();
    540558    return 1;
     
    550568                      &beamNul, beamCol, &anynul, &cStatus)) {
    551569      delete [] beamCol;
    552       logMsg();
     570      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    553571      close();
    554572      return 1;
     
    565583      if (beamCol[irow] < cBeam_1rel) {
    566584        delete [] beamCol;
    567         logMsg("ERROR: SDFITS file contains invalid beam number.");
     585        log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "SDFITS file contains invalid beam number.");
    568586        close();
    569587        return 1;
     
    606624                      &IFNul, IFCol, &anynul, &cStatus)) {
    607625      delete [] IFCol;
    608       logMsg();
     626      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    609627      close();
    610628      return 1;
     
    621639      if (IFCol[irow] < cIF_1rel) {
    622640        delete [] IFCol;
    623         logMsg("ERROR: SDFITS file contains invalid IF number.");
     641        log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "SDFITS file contains invalid IF number.");
    624642        close();
    625643        return 1;
     
    653671            // Variable dimension array.
    654672            if (readDim(DATA, irow+1, &cNAxes, cNAxis)) {
    655               logMsg();
     673              log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    656674              close();
    657675              return 1;
     
    681699
    682700          if (readDim(XPOLDATA, irow+1, &nAxis, nAxes)) {
    683             logMsg();
     701            log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE );
    684702            close();
    685703            return 1;
     
    719737    cNPol[0] = cNIF;
    720738    cNIF = 1;
     739  }
     740
     741  // For GBT data that stores spectra for each polarization in separate rows
     742  if ( cData[STOKES].colnum > 0 ) {
     743    int *stokesCol = new int[cNRow];
     744    int stokesNul = 1;
     745    int   anynul;
     746    if (fits_read_col(cSDptr, TINT, cData[STOKES].colnum, 1, 1, cNRow,
     747                      &stokesNul, stokesCol, &anynul, &cStatus)) {
     748      delete [] stokesCol;
     749      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
     750      close();
     751      return 1;
     752    }
     753
     754    vector<int> pols ;
     755    pols.push_back( stokesCol[0] ) ;
     756    for ( int i = 0 ; i < cNRow ; i++ ) {
     757      bool pmatch = false ;
     758      for ( uint j = 0 ; j < pols.size() ; j++ ) {
     759        if ( stokesCol[i] == pols[j] ) {
     760          pmatch = true ;
     761          break ;
     762        }
     763      }
     764      if ( !pmatch ) {
     765        pols.push_back( stokesCol[i] ) ;
     766      }
     767    }
     768
     769    cPols = new int[pols.size()] ;
     770    for ( uint i = 0 ; i < pols.size() ; i++ ) {
     771      cPols[i] = pols[i] ;
     772    }
     773
     774    for ( int i = 0 ; i < cNIF ; i++ ) {
     775      cNPol[i] = pols.size() ;
     776    }
     777
     778    delete [] stokesCol ;
    721779  }
    722780
     
    806864        double &bandwidth)
    807865{
     866  const string methodName = "getHeader()" ;
     867 
    808868  // Has the file been opened?
    809869  if (!cSDptr) {
     
    879939
    880940    // Look for VELFRAME, written by earlier versions of Livedata.
     941    //
     942    // Added few more codes currently (as of 2009 Oct) used in the GBT
     943    // SDFITS (based io_sdfits_define.pro of GBTIDL). - TT
    881944    if (readParm("VELFRAME", TSTRING, dopplerFrame)) {  // Additional.
    882945      // No, try digging it out of the CTYPE card (AIPS convention).
     
    890953          // LSR unqualified usually means LSR (kinematic).
    891954          strcpy(dopplerFrame, "LSRK");
     955        } else if (strcmp(dopplerFrame, "LSD") == 0) {
     956          // LSR as a dynamical defintion
     957          strcpy(dopplerFrame, "LSRD");
    892958        } else if (strcmp(dopplerFrame, "HEL") == 0) {
    893959          // Almost certainly barycentric.
    894960          strcpy(dopplerFrame, "BARYCENT");
     961        } else if (strcmp(dopplerFrame, "BAR") == 0) {
     962          // barycentric.
     963          strcpy(dopplerFrame, "BARYCENT");
     964        } else if (strcmp(dopplerFrame, "OBS") == 0) {
     965          // observed or topocentric.
     966          strcpy(dopplerFrame, "TOPO");
     967        } else if (strcmp(dopplerFrame, "GEO") == 0) {
     968          // geocentric
     969          strcpy(dopplerFrame, "GEO");
     970        } else if (strcmp(dopplerFrame, "GAL") == 0) {
     971          // galactic
     972          strcpy(dopplerFrame, "GAL");
     973        } else if (strcmp(dopplerFrame, "LGR") == 0) {
     974          // Local group
     975          strcpy(dopplerFrame, "LGROUP");
     976        } else if (strcmp(dopplerFrame, "CMB") == 0) {
     977          // Cosimic Microwave Backgroup
     978          strcpy(dopplerFrame, "CMB");
    895979        }
    896980      } else {
     
    898982      }
    899983    }
    900 
    901984    // Translate to FITS standard names.
    902985    if (strncmp(dopplerFrame, "TOP", 3) == 0) {
     
    908991    } else if (strncmp(dopplerFrame, "BARY", 4) == 0) {
    909992      strcpy(dopplerFrame, "BARYCENT");
    910     }
    911   }
    912 
     993    } else if (strncmp(dopplerFrame, "GAL", 3) == 0) {
     994      strcpy(dopplerFrame, "GALACTOC");
     995    } else if (strncmp(dopplerFrame, "LGROUP", 6) == 0) {
     996      strcpy(dopplerFrame, "LOCALGRP");
     997    } else if (strncmp(dopplerFrame, "CMB", 3) == 0) {
     998      strcpy(dopplerFrame, "CMBDIPOL");
     999    }
     1000  }
     1001 
    9131002  if (cStatus) {
    914     logMsg();
     1003    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    9151004    return 1;
    9161005  }
     
    9221011
    9231012  if (cStatus) {
    924     logMsg();
     1013    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    9251014    return 1;
    9261015  }
     
    9381027        double* &endFreq)
    9391028{
     1029  const string methodName = "getFreqInfo()" ;
     1030
    9401031  float  fqRefPix;
    9411032  double fqDelt, fqRefVal;
     
    9521043                      &IFNul, IFCol, &anynul, &cStatus)) {
    9531044      delete [] IFCol;
    954       logMsg();
     1045      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    9551046      close();
    9561047      return 1;
     
    10151106        double* &positions)
    10161107{
     1108  const string methodName = "findRange()" ;
     1109
    10171110  // Has the file been opened?
    10181111  if (!cSDptr) {
     
    10361129      delete [] beamCol;
    10371130      delete [] sel;
    1038       logMsg();
     1131      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    10391132      return 1;
    10401133    }
     
    10561149      delete [] IFCol;
    10571150      delete [] sel;
    1058       logMsg();
     1151      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    10591152      return 1;
    10601153    }
     
    10881181    if (cData[AZIMUTH].colnum  < 0 ||
    10891182        cData[ELEVATIO].colnum < 0) {
    1090       logMsg("WARNING: Azimuth/elevation information absent.");
     1183      log(LogOrigin( className, methodName, WHERE ), LogIO::WARN, "Azimuth/elevation information absent.");
    10911184      cStatus = -1;
    10921185
     
    11151208        cData[FOCUSROT].colnum < 0 ||
    11161209        cData[ELEVATIO].colnum < 0) {
    1117       logMsg("WARNING: ZPA/elevation information absent.");
     1210      log(LogOrigin( className, methodName, WHERE ), LogIO::WARN, "ZPA/elevation information absent.");
    11181211      cStatus = -1;
    11191212
     
    11911284          cData[PARANGLE].colnum < 0 ||
    11921285          cData[FOCUSROT].colnum < 0) {
    1193         logMsg("WARNING: Insufficient information to compute feed-plane\n"
    1194                "         coordinates.");
     1286        log( LogOrigin( className, methodName, WHERE ), LogIO::WARN,
     1287             "Insufficient information to compute feed-plane\n"
     1288             "         coordinates.");
    11951289        cStatus = -1;
    11961290
     
    12411335    nSel = 0;
    12421336    delete [] positions;
    1243     logMsg();
     1337    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    12441338    cStatus = 0;
    12451339    return 1;
     
    12571351        MBrecord &mbrec)
    12581352{
     1353  const string methodName = "read()" ;
     1354
    12591355  // Has the file been opened?
    12601356  if (!cSDptr) {
    12611357    return 1;
    12621358  }
    1263 
    12641359  // Find the next selected beam and IF.
    12651360  short iBeam = 0, iIF = 0;
     1361  int iPol = -1 ;
    12661362  while (1) {
    12671363    if (++cTimeIdx > cNAxisTime) {
     
    13211417              sprintf(cMsg, "ALFA cal factors for beam %d: %.3e, %.3e",
    13221418                iBeam+1, sALFAcal[iBeam][0], sALFAcal[iBeam][1]);
    1323               logMsg(cMsg);
     1419              log(LogOrigin( className, methodName, WHERE ), LogIO::NORMAL, cMsg);
     1420              //logMsg(cMsg);
    13241421            }
    13251422          }
    13261423        }
    13271424
     1425        // for GBT SDFITS
     1426        if (cData[STOKES].colnum > 0 ) {
     1427          readData(STOKES, cRow, &iPol ) ;
     1428          for ( int i = 0 ; i < cNPol[iIF] ; i++ ) {
     1429            if ( cPols[i] == iPol ) {
     1430              iPol = i ;
     1431              break ;
     1432            }
     1433          }
     1434        }
    13281435        break;
    13291436      }
     
    13701477  }
    13711478
     1479  if ( iPol != -1 ) {
     1480    if ( mbrec.scanNo != cGLastScan[iPol] ) {
     1481      cGLastScan[iPol] = mbrec.scanNo ;
     1482      cGCycleNo[iPol] = 0 ;
     1483      mbrec.cycleNo = ++cGCycleNo[iPol] ;
     1484    }
     1485    else {
     1486      mbrec.cycleNo = ++cGCycleNo[iPol] ;
     1487    }
     1488  }
     1489
    13721490  readData(EXPOSURE, cRow, &mbrec.exposure);
    13731491
    13741492  // Source identification.
    13751493  readData(OBJECT, cRow, mbrec.srcName);
     1494
     1495  if ( iPol != -1 ) {
     1496    char obsmode[32] ;
     1497    readData( OBSMODE, cRow, obsmode ) ;
     1498    char sig[1] ;
     1499    char cal[1] ;
     1500    readData( SIG, cRow, sig ) ;
     1501    readData( CAL, cRow, cal ) ;
     1502    if ( strstr( obsmode, "PSWITCH" ) != NULL ) {
     1503      // position switch
     1504      strcat( mbrec.srcName, "_p" ) ;
     1505      if ( strstr( obsmode, "PSWITCHON" ) != NULL ) {
     1506        strcat( mbrec.srcName, "s" ) ;
     1507      }
     1508      else if ( strstr( obsmode, "PSWITCHOFF" ) != NULL ) {
     1509        strcat( mbrec.srcName, "r" ) ;
     1510      }
     1511    }
     1512    else if ( strstr( obsmode, "Nod" ) != NULL ) {
     1513      // nod
     1514      strcat( mbrec.srcName, "_n" ) ;
     1515      if ( sig[0] == 'T' ) {
     1516        strcat( mbrec.srcName, "s" ) ;
     1517      }
     1518      else {
     1519        strcat( mbrec.srcName, "r" ) ;
     1520      }
     1521    }
     1522    else if ( strstr( obsmode, "FSWITCH" ) != NULL ) {
     1523      // frequency switch
     1524      strcat( mbrec.srcName, "_f" ) ;
     1525      if ( sig[0] == 'T' ) {
     1526        strcat( mbrec.srcName, "s" ) ;
     1527      }
     1528      else {
     1529        strcat( mbrec.srcName, "r" ) ;
     1530      }
     1531    }
     1532    if ( cal[0] == 'T' ) {
     1533      strcat( mbrec.srcName, "c" ) ;
     1534    }
     1535    else {
     1536      strcat( mbrec.srcName, "o" ) ;
     1537    }
     1538  }
    13761539
    13771540  readData(OBJ_RA,  cRow, &mbrec.srcRA);
     
    14211584  int nPol = cNPol[iIF];
    14221585
     1586  if ( cData[STOKES].colnum > 0 )
     1587    nPol = 1 ;
     1588
    14231589  if (cGetSpectra || cGetXPol) {
    14241590    int nxpol = cGetXPol ? 2*nChan : 0;
     
    14301596  mbrec.nChan[0] = nChan;
    14311597  mbrec.nPol[0]  = nPol;
     1598  mbrec.polNo = iPol ;
    14321599
    14331600  readData(FqRefPix, cRow, mbrec.fqRefPix);
     
    14481615
    14491616  if (cStatus) {
    1450     logMsg();
     1617    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    14511618    return 1;
    14521619  }
     
    14851652
    14861653  if (cStatus) {
    1487     logMsg();
     1654    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    14881655    return 1;
    14891656  }
     
    15351702
    15361703        if ((status = readDim(DATA, cRow, &naxes, cNAxis))) {
    1537           logMsg();
     1704          log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    15381705
    15391706        } else if ((status = (naxes != cNAxes))) {
    1540           logMsg("ERROR: DATA array dimensions changed.");
     1707          log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "DATA array dimensions changed.");
    15411708        }
    15421709
     
    15521719          blc, trc, inc, 0, mbrec.spectra[0] + iPol*nChan, &anynul,
    15531720          &cStatus)) {
    1554         logMsg();
     1721        log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    15551722        delete [] blc;
    15561723        delete [] trc;
     
    16131780            cNAxis, blc, trc, inc, 0, mbrec.flagged[0] + iPol*nChan, &anynul,
    16141781            &cStatus)) {
    1615           logMsg();
     1782          log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    16161783          delete [] blc;
    16171784          delete [] trc;
     
    16641831    if (fits_read_subset_flt(cSDptr, cData[XPOLDATA].colnum, nAxis, nAxes,
    16651832        blc, trc, inc, 0, mbrec.xpol[0], &anynul, &cStatus)) {
    1666       logMsg();
     1833      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    16671834      delete [] blc;
    16681835      delete [] trc;
     
    16951862
    16961863  if (cStatus) {
    1697     logMsg();
     1864    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    16981865    return 1;
    16991866  }
     
    17291896  mbrec.windAz    *= D2R;
    17301897
     1898  // For GBT data, source velocity can be evaluated
     1899  if ( cData[RVSYS].colnum > 0 && cData[VFRAME].colnum > 0 ) {
     1900    float vframe;
     1901    readData(VFRAME, cRow, &vframe);
     1902    float rvsys;
     1903    readData(RVSYS,  cRow, &rvsys);
     1904    //mbrec.srcVelocity = rvsys - vframe ;
     1905    mbrec.srcVelocity = rvsys ;
     1906  }
     1907
    17311908  if (cStatus) {
    1732     logMsg();
     1909    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    17331910    return 1;
    17341911  }
     
    17561933}
    17571934
    1758 //------------------------------------------------------- SDFITSreader::logMsg
     1935//------------------------------------------------------- SDFITSreader::log
    17591936
    17601937// Log a message.  If the current CFITSIO status value is non-zero, also log
    17611938// the corresponding error message and the CFITSIO message stack.
    17621939
    1763 void SDFITSreader::logMsg(const char *msg)
     1940void SDFITSreader::log(LogOrigin origin, LogIO::Command cmd, const char *msg)
    17641941{
    1765   FITSreader::logMsg(msg);
     1942  LogIO os( origin ) ;
     1943
     1944  os << msg << endl ;
    17661945
    17671946  if (cStatus > 0) {
    17681947    fits_get_errstatus(cStatus, cMsg);
    1769     FITSreader::logMsg(cMsg);
     1948    os << cMsg << endl ;
    17701949
    17711950    while (fits_read_errmsg(cMsg)) {
    1772       FITSreader::logMsg(cMsg);
    1773     }
    1774   }
     1951      os << cMsg << endl ;
     1952    }
     1953  }
     1954  os << LogIO::POST ;
    17751955}
    17761956
     
    21072287  if (cData[TIME].colnum >= 0) {
    21082288    readData(TIME, iRow, &utc);
     2289  } else if (cGBT) {
     2290    Int yy, mm ;
     2291    Double dd, hour, min, sec ;
     2292    sscanf( datobs, "%d-%d-%lfT%lf:%lf:%lf", &yy, &mm, &dd, &hour, &min, &sec ) ;
     2293    dd = dd + ( hour * 3600.0 + min * 60.0 + sec ) / 86400.0 ;
     2294    MVTime mvt( yy, mm, dd ) ;
     2295    dd = mvt.day() ;
     2296    utc = fmod( dd, 1.0 ) * 86400.0 ;
    21092297  } else if (cNAxisTime > 1) {
    21102298    double timeDelt, timeRefPix, timeRefVal;
     
    21532341        short iPol)
    21542342{
     2343  const string methodName = "alfaCal()" ;
     2344
    21552345  int  calOn;
    21562346  char chars[32];
     
    22052395  if (fits_read_subset_flt(cSDptr, cData[DATA].colnum, cNAxes, cNAxis,
    22062396      blc, trc, inc, 0, spectrum, &anynul, &cStatus)) {
    2207     logMsg();
     2397    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE);
    22082398    delete [] blc;
    22092399    delete [] trc;
  • branches/mergetest/external/atnf/PKSIO/SDFITSreader.h

    r1720 r1779  
    4343#include <atnf/PKSIO/MBrecord.h>
    4444
     45#include <casa/Logging/LogIO.h>
     46
    4547#include <fitsio.h>
    4648
    4749using namespace std;
     50using namespace casa;
    4851
    4952// <summary>
     
    121124    int  cBeam_1rel, cIF_1rel;
    122125
     126    // for GBT
     127    int *cPols ;
     128
    123129    enum {SCAN, CYCLE, DATE_OBS, TIME, EXPOSURE, OBJECT, OBJ_RA, OBJ_DEC,
    124130          RESTFRQ, OBSMODE, BEAM, IF, FqRefVal, FqDelt, FqRefPix, RA, DEC,
     
    126132          BASELIN, BASESUB, DATA, FLAGGED, DATAXED, XPOLDATA, REFBEAM, TCAL,
    127133          TCALTIME, AZIMUTH, ELEVATIO, PARANGLE, FOCUSAXI, FOCUSTAN, FOCUSROT,
    128           TAMBIENT, PRESSURE, HUMIDITY, WINDSPEE, WINDDIRE, NDATA};
     134          TAMBIENT, PRESSURE, HUMIDITY, WINDSPEE, WINDDIRE, STOKES, SIG, CAL,
     135          VFRAME, RVSYS, VELDEF, NDATA};
    129136
    130137    // Message handling.
    131     virtual void logMsg(const char *msg = 0x0);
     138    void log(LogOrigin origin, LogIO::Command cmd, const char *msg = 0x0);
    132139
    133140    void findData(int iData, char *name, int type);
     
    153160    // These are for GBT data.
    154161    int   cGBT, cFirstScanNo;
     162    double cGLastUTC[4] ;
     163    int cGLastScan[4] ;
     164    int cGCycleNo[4] ;
    155165};
    156166
  • branches/mergetest/external/atnf/PKSIO/SDFITSwriter.cc

    r1736 r1779  
    3535
    3636#include <atnf/PKSIO/MBrecord.h>
    37 #include <atnf/PKSIO/PKSmsg.h>
    3837#include <atnf/PKSIO/SDFITSwriter.h>
     38
     39#include <casa/Logging/LogIO.h>
    3940
    4041#include <casa/iostream.h>
     
    5152// Factor to convert radians to degrees.
    5253const double R2D = 180.0 / PI;
     54
     55// Class name
     56const string className = "SDFITSwriter" ;
    5357
    5458//------------------------------------------------- SDFITSwriter::SDFITSwriter
     
    5862  // Default constructor.
    5963  cSDptr = 0x0;
    60 
    61   // By default, messages are written to stderr.
    62   initMsg();
    6364}
    6465
     
    9192        int    extraSysCal)
    9293{
     94  const string methodName = "create()" ;
     95
    9396  if (cSDptr) {
    94     logMsg("ERROR: Output file already open, close it first.");
     97    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "Output file already open, close it first.");
    9598    return 1;
    9699  }
    97 
    98   // Clear the message stack.
    99   clearMsg();
    100100
    101101  // Prepend an '!' to the output name to force it to be overwritten.
     
    107107  cStatus = 0;
    108108  if (fits_create_file(&cSDptr, sdname, &cStatus)) {
    109     sprintf(cMsg, "ERROR: Failed to create SDFITS file\n       %s", sdName);
    110     logMsg(cMsg);
     109    sprintf(cMsg, "Failed to create SDFITS file\n       %s", sdName);
     110    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, cMsg);
    111111    return cStatus;
    112112  }
     
    156156  // Write required primary header keywords.
    157157  if (fits_write_imghdr(cSDptr, 8, 0, 0, &cStatus)) {
    158     logMsg("ERROR: Failed to write required primary header keywords.");
     158    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "Failed to write required primary header keywords.");
    159159    return cStatus;
    160160  }
     
    188188
    189189  if (cStatus) {
    190     logMsg("ERROR: Failed in writing primary header.");
     190    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "Failed in writing primary header.");
    191191    return cStatus;
    192192  }
     
    198198  if (fits_create_tbl(cSDptr, BINARY_TBL, nrow, ncol, NULL, NULL, NULL,
    199199      "SINGLE DISH", &cStatus)) {
    200     logMsg("ERROR: Failed to create a binary table extension.");
     200    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "Failed to create a binary table extension.");
    201201    return 1;
    202202  }
     
    548548
    549549  if (cStatus) {
    550     logMsg("ERROR: Failed in writing binary table header.");
     550    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "Failed in writing binary table header.");
    551551  }
    552552
     
    560560int SDFITSwriter::write(MBrecord &mbrec)
    561561{
     562  const string methodName = "write()" ;
     563  LogIO os( LogOrigin( className, methodName, WHERE ) ) ;
     564
    562565  char *cptr;
    563566
     
    565568  int IFno = mbrec.IFno[0];
    566569  if (IFno < 1 || cNIF < IFno) {
    567     cerr << "SDFITSwriter::write: "
    568          << "Invalid IF number " << IFno
    569          << " (maximum " << cNIF << ")." << endl;
     570    os << LogIO::WARN
     571       << "SDFITSwriter::write: "
     572       << "Invalid IF number " << IFno
     573       << " (maximum " << cNIF << ")." << LogIO::POST ;
    570574    return 1;
    571575  }
     
    574578  int nChan = cNChan[iIF];
    575579  if (mbrec.nChan[0] != nChan) {
    576     cerr << "SDFITSriter::write: "
    577          << "Wrong number of channels for IF " << IFno << "," << endl
    578          << "                    "
    579          << "got " << nChan << " should be " << mbrec.nChan[0] << "." << endl;
     580    os << LogIO::WARN
     581       << "SDFITSriter::write: "
     582       << "Wrong number of channels for IF " << IFno << "," << endl
     583       << "                    "
     584       << "got " << nChan << " should be " << mbrec.nChan[0] << "." << endl;
     585    os << LogIO::POST ;
    580586    return 1;
    581587  }
     
    583589  int nPol = cNPol[iIF];
    584590  if (mbrec.nPol[0] != nPol) {
    585     cerr << "SDFITSriter::write: "
    586          << "Wrong number of polarizations for IF " << IFno << "," << endl
    587          << "                    "
    588          << "got " << nPol << " should be " << mbrec.nPol[0] << "." << endl;
     591    os << LogIO::WARN
     592       << "SDFITSriter::write: "
     593       << "Wrong number of polarizations for IF " << IFno << "," << endl
     594       << "                    "
     595       << "got " << nPol << " should be " << mbrec.nPol[0] << "." << endl;
     596    os << LogIO::POST ;
    589597    return 1;
    590598  }
     
    768776
    769777  if (cStatus) {
    770     logMsg("ERROR: Failed in writing binary table entry.");
     778    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "Failed in writing binary table entry.");
    771779  }
    772780
     
    782790
    783791{
     792  const string methodName = "history()" ;
     793
    784794  if (!cSDptr) {
    785795    return 1;
     
    787797
    788798  if (fits_write_history(cSDptr, text, &cStatus)) {
    789     logMsg("ERROR: Failed in writing HISTORY records.");
     799    log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "Failed in writing HISTORY records.");
    790800  }
    791801
     
    799809void SDFITSwriter::close()
    800810{
     811  const string methodName = "close()" ;
     812
    801813  if (cSDptr) {
    802814    cStatus = 0;
    803815    if (fits_close_file(cSDptr, &cStatus)) {
    804       logMsg("ERROR: Failed to close file.");
     816      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "Failed to close file.");
    805817    }
    806818
     
    815827void SDFITSwriter::deleteFile()
    816828{
     829  const string methodName = "deleteFile()" ;
     830
    817831  if (cSDptr) {
    818832    cStatus = 0;
    819833    if (fits_delete_file(cSDptr, &cStatus)) {
    820       logMsg("ERROR: Failed to close and delete file.");
     834      log(LogOrigin( className, methodName, WHERE ), LogIO::SEVERE, "Failed to close and delete file.");
    821835    }
    822836
     
    825839}
    826840
    827 //------------------------------------------------------- SDFITSwriter::logMsg
     841//------------------------------------------------------- SDFITSwriter::log
    828842
    829843// Log a message.  If the current CFITSIO status value is non-zero, also log
    830844// the corresponding error message and dump the CFITSIO message stack.
    831845
    832 void SDFITSwriter::logMsg(const char *msg)
     846void SDFITSwriter::log(LogOrigin origin, LogIO::Command cmd, const char *msg)
    833847{
    834   PKSmsg::logMsg(msg);
     848  LogIO os( origin ) ;
     849
     850  os << cmd << msg << endl ;
    835851
    836852  if (cStatus) {
    837853    fits_get_errstatus(cStatus, cMsg);
    838     PKSmsg::logMsg(cMsg);
     854    os << cMsg << endl ;
    839855
    840856    while (fits_read_errmsg(cMsg)) {
    841       PKSmsg::logMsg(cMsg);
    842     }
    843   }
     857      os << cMsg << endl ;
     858    }
     859  }
     860
     861  os << LogIO::POST ;
    844862}
  • branches/mergetest/external/atnf/PKSIO/SDFITSwriter.h

    r1720 r1779  
    3838
    3939#include <atnf/PKSIO/MBrecord.h>
    40 #include <atnf/PKSIO/PKSmsg.h>
     40#include <casa/Logging/LogIO.h>
    4141
    4242#include <fitsio.h>
    4343
    4444using namespace std;
     45using namespace casa;
    4546
    4647// <summary>
     
    4849// </summary>
    4950
    50 class SDFITSwriter : public PKSmsg
     51class SDFITSwriter
    5152{
    5253  public:
     
    9596    // Message handling.
    9697    char cMsg[256];
    97     virtual void logMsg(const char *msg = 0x0);
     98    void log(LogOrigin origin, LogIO::Command cmd, const char *msg = 0x0);
    9899};
    99100
  • branches/mergetest/external/atnf/PKSIO/makefile

    r1452 r1779  
    1 # $Id: makefile,v 19.0 2003-07-16 03:34:05 aips2adm Exp $
     1# $Id$
    22
    33XLIBLIST := CFITSIO RPFITS
     
    55# Use the generic AIPS++ class implementation makefile.
    66#------------------------------------------------------
    7 include $(word 1, $(AIPSPATH))/code/install/makefile.imp
     7include $(word 1, $(CASAPATH))/code/install/makefile.imp
  • branches/mergetest/external/atnf/pks/makefile

    r1452 r1779  
    1 # $Id: makefile,v 19.0 2003-07-16 03:33:47 aips2adm Exp $
     1# $Id$
    22
    33# Use the generic AIPS++ class implementation makefile.
    44#------------------------------------------------------
    5 include $(word 1, $(AIPSPATH))/code/install/makefile.imp
     5include $(word 1, $(CASAPATH))/code/install/makefile.imp
  • branches/mergetest/external/atnf/pks/pks_maths.cc

    r1720 r1779  
    321321
    322322  // Azimuth and elevation (rad).
    323   az = atan2(-cos(dec)*sin(ha),
    324             sin(dec)*cos(lat) - cos(dec)*sin(lat)*cos(ha));
     323  az = atan2(cos(dec)*sin(ha),
     324             cos(dec)*sin(lat)*cos(ha) - sin(dec)*cos(lat));
     325  if (az < 0.0) az += C::_2pi;
    325326  el = asin(sin(dec)*sin(lat) + cos(dec)*cos(lat)*cos(ha));
    326327
    327   if (az < 0.0) az += C::_2pi;
    328328}
    329329
Note: See TracChangeset for help on using the changeset viewer.